require( "common" ) MemBlock = {} MiscData = { ChatTick = 10, -- every 10 seconds ChatRate = 500, -- 50% chance to interact InteractSight = 100000, EndureAbstateIndex = "StaSafeProtection", -- used to check if they already have a buff MathAnswerSkillIndex = "AutoEndure10", } ChatData = { [1] = { Str = "You look nice and tough %s.", VarCount = 1, VarPlayer = { [1] = 1, }, VarMathAnswer = nil, OnChat = nil, IsShout = false,}, [2] = { Str = "Would you like a buff %s?", VarCount = 1, VarPlayer = { [1] = 1, }, VarMathAnswer = nil, OnChat = { [1] = "yes" }, IsShout = false,}, [3] = { Str = "Can anyone tell me what %s + %s is?", VarCount = 2, VarPlayer = nil, VarMathAnswer = { [1] = 10, [2] = 50, }, OnChat = nil, IsShout = false,}, [4] = { Str = "Come receive a buff from the best cleric!", VarCount = 0, VarPlayer = nil, VarMathAnswer = nil, OnChat = nil, IsShout = true, }, [5] = { Str = "Shutian asked me to stand guard and reward players with buffs, simply type 'buff me' and I'll do so!", VarCount = 0, VarPlayer = nil, VarMathAnswer = nil, OnChat = nil, IsShout = false }, } ResponseData = { [1] = { Str = "There you go %s!", StrTrigger = "buff please", OnSkillUse = "AutoEndure08", }, [2] = { Str = "You've already got a buff, remove it and I'll give you a better one!", StrTrigger = "buff please", OnSkillUse = nil }, } function AutoEndure00( Handle, MapIndex ) cExecCheck("AutoEndure00") local Var = MemBlock[Handle] if Var == nil then MemBlock[Handle] = {} Var = MemBlock[Handle] Var.Handle = Handle Var.MapIndex = MapIndex Var.StepFunc = "MainLoop" Var.Misc = {} Var.Misc.ChatTick = cCurSec() + MiscData.ChatTick Var.Misc.StringAnswer = nil Var.Misc.MathAnswer = 0 cTriggerRegist( Var.Handle, "Chat", "ChatFilter", MiscData.InteractSight ) end return _G[Var.StepFunc]( Var ) end function MainLoop( Var ) cExecCheck("MainLoop") if Var.Misc.ChatTick <= cCurSec() then if cPermileRate(MiscData.ChatRate) == 1 then --RandomTalk( Var ) cAssertLog( "CALL RANDOMTALK" ) end Var.Misc.ChatTick = cCurSec() + MiscData.ChatTick end return ReturnAI.CPP end function RandomTalk( Var ) cExecCheck("RandomTalk") Var.Misc.StringAnswer = nil Var.Misc.MathAnswer = 0 cExecCheck("RandomTalk:76") local ChatNum = math.random(#ChatData) local ChatInfo = ChatData[ChatNum] local ChatVars = {} -- requires a player handle if ChatInfo.VarPlayer ~= nil then local RandomPlayerList = {} local RandomPlayerListIndex = 1 local PlayerList = { cGetPlayerList( Var.MapIndex ) } for k, v in pairs(PlayerList) do local DistBetween = cDistantSquar( Var.Handle, PlayerList[k] ) if DistBetween <= MiscData.InteractSight then table.insert( RandomPlayerList, RandomPlayerListIndex, PlayerList[k] ) RandomPlayerListIndex = RandomPlayerListIndex + 1 end end -- found nobody if RandomPlayerListIndex == 1 then return end table.insert(ChatVars, ChatInfo.VarPlayer[1], cGetPlayerName(RandomPlayerList[math.random(#RandomPlayerList)]) ) end cExecCheck("RandomTalk:105") -- requires an answer if ChatInfo.VarMathAnswer ~= nil then local RandomNum1 = ChatInfo.VarMathAnswer[1] local RandomNum2 = ChatInfo.VarMathAnswer[2] local RandomAnswer = math.random(RandomNum1, RandomNum2) table.insert(ChatVars, tostring(RandomNum1) ) table.insert(ChatVars, tostring(RandomNum2) ) Var.Misc.MathAnswer = RandomAnswer end -- requires a response if ChatInfo.OnChat ~= nil then Var.Misc.StringAnswer = {} Var.Misc.StringAnswer.PlayerHandle = PlayerHandle Var.Misc.StringAnswer.PlayerResp = ChatInfo.OnChat[1] end if ChatInfo.VarPlayer ~= nil and PlayerHandle == nil then cAssertLog( "AutoEndure00 missing player handle @ RandomTalk" ) return end if ChatInfo.VarCount ~= #ChatVars then cAssertLog( "AutoEndure00 missing vars @ RandomTalk" ) return end ParseRandomTalk( Var, ChatInfo, ChatVars ) end function ParseRandomTalk( Var, ChatInfo, ChatVars ) cExecChec("ParseRandomTalk") if ChatInfo.VarCount == 0 then NPCChat( Var, Var.Handle, string.format( ChatInfo.Str ), ChatInfo.IsShout ) elseif ChatInfo.VarCount == 1 then NPCChat( Var, Var.Handle, string.format( ChatInfo.Str, ChatVars[1] ), ChatInfo.IsShout ) elseif ChatInfo.VarCount == 2 then NPCChat( Var, Var.Handle, string.format( ChatInfo.Str, ChatVars[1], ChatVars[2] ), ChatInfo.IsShout ) end end function NPCChat( Var, NPCHandle, Message, IsShout ) cExecCheck("NPCChat") if IsShout then cNoticeString( Var.MapIndex, Message ) else cNPCChatTest( NPCHandle, Message ) end end function NPCUseSkill( Var, CasterHandle, TargetHandle, SkillIndex ) cExecCheck("UseSkill") return cSkillBlast( CasterHandle, TargetHandle, SkillIndex ) --cNPCSkillUse( CasterHandle, TargetHandle, SkillIndex ) end function NPCApplyBuff( Var, PlyHandle, SkillIndex, SuccessMessage, FailureMessage ) cExecCheck("NPCApplyBuff") local AbStr, AbRemain = cGetAbstate( PlyHandle, MiscData.EndureAbstateIndex ) -- player already buffed if AbStr ~= nil then cNPCChatTest( Var.Handle, FailureMessage ) else if NPCUseSkill( Var, Var.Handle, PlyHandle, SkillIndex ) ~= nil then cNPCChatTest( Var.Handle, SuccessMessage ) end end end function ChatFilter( NPCHandle, PlyHandle, PlyCharNo, Message ) cExecCheck("ChatFilter") local Var = MemBlock[NPCHandle] if Var == nil then cAssertLog( "AutoEndure00 not in MemBlock @ ChatFilter" ) return end local PlayerName = cGetPlayerName(PlyHandle) -- if player types in "buff please" if string.find(string.lower(Message), string.lower(ResponseData[1].StrTrigger)) then NPCApplyBuff( Var, PlyHandle, ResponseData[1].OnSkillUse, string.format(ResponseData[1].Str, PlayerName), ResponseData[2].Str ) end -- if player types in "hi tabatha" or "hello tabatha" if string.find(string.lower(Message), string.lower(ResponseData[3].StrTrigger)) or string.find(string.lower(Message), string.lower(ResponseData[4].StrTrigger)) then NPCChat( Var, NPCHandle, "", false ) end --if Var.Misc.MathAnswer > 0 then -- -- check if math answered -- local PlayerAnswer = tonumber(Message) -- -- if PlayerAnswer and PlayerAnswer == Var.Misc.MathAnswer then -- NPCChat( Var, Var.Handle, PlayerName .. " is correct with the answer " .. PlayerAnswer .. "!", true ) -- NPCApplyBuff( Var, PlyHandle, MiscData.MathAnswerSkillIndex, ResponseData[1].Str, ResponseData[2].Str) -- -- Var.Misc.StringAnswer = nil -- Var.Misc.MathAnswer = 0 -- else -- NPCChat( Var, Var.Handle, "Sorry " .. PlayerName .. ", you're answer isnt correct", false ) -- end --elseif Var.Misc.StringAnswer ~= nil then -- -- check if response required -- if Var.Misc.StringAnswer.PlayerHandle == PlyHandle then -- if string.lower(Message) == string.lower(Var.Misc.StringAnswer.PlayerResp) then -- NPCApplyBuff( Var, PlyHandle, ResponseData[1].OnSkillUse, ResponseData[1].Str, ResponseData[2].Str) -- -- Var.Misc.StringAnswer = nil -- Var.Misc.MathAnswer = 0 -- end -- end --end end