lua中实现的定时器

2 篇文章 0 订阅

--dofile("helper_util.lua")

AI_Helper = {}
AI_Helper.Player  = {}
AI_Helper.ValidNum  = 2
AI_Helper.GlobalFlag = 0

math.randomseed(os.time())
math.random()

function AI_Helper:Copy(sPlayer)
 if sPlayer == nil then
  return nil
 end

 local sTbl={}
 for k, v in pairs(sPlayer) do
  if type(v) == "table" then
   sTbl[k] = AI_Helper:Copy(v)
  else
   sTbl[k] = v
  end
 end
 local mt = getmetatable(sPlayer)
 setmetatable(sTbl, mt)
    return sTbl
end

function AI_Helper:Init(idPlayer,idxAI)
end

function AI_Helper:Start(idPlayer,idxAI)
 if AI_Helper.Player[idPlayer] then
  AI_Helper:Stop(idPlayer)
 end
 
 --随机AI
 if idxAI < 0 then
  idxAI = math.random(1,AI_Helper.ValidNum)
 end

 --默认AI
 if AI_Helper.Player[idxAI] == nil then
  idxAI = 0
 end

 --创建玩家AI
 AI_Helper.Player[idPlayer] = AI_Helper:Copy(AI_Helper.Player[idxAI])
 AI_Helper.Player[idPlayer].PlayerId = idPlayer
 
 AI_Helper.Player[idPlayer].OnStart(AI_Helper.Player[idPlayer])
end

function AI_Helper:Reset(idPlayer)
 if AI_Helper.Player[idPlayer] then
  AI_Helper.Player[idPlayer].OnReset(AI_Helper.Player[idPlayer])
 end
end

function AI_Helper:Tick(idPlayer,dwPeriod)
 if AI_Helper.Player[idPlayer] then
  AI_Helper.Player[idPlayer].OnTick(AI_Helper.Player[idPlayer],dwPeriod)
 end
end

function AI_Helper:Stop(idPlayer)
 if AI_Helper.Player[idPlayer] then
  AI_Helper.Player[idPlayer].OnStop(AI_Helper.Player[idPlayer])
  AI_Helper.Player[idPlayer] = nil
 end
end

-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
PlayerState =
{
 STATE_IDLE   = 0, --空闲
 STATE_HEALHP  = 1, --补血
 STATE_HEALMP  = 2, --补蓝
 STATE_PICKLOOT  = 3, --拾取
 STATE_SELMONSTER = 4, --选怪
 STATE_FIGHTING  = 5, --战斗
 STATE_DEAD   = 6, --死亡
 STATE_ACTION  = 7, --动作
 STATE_PATH   = 8, --寻径

 IsTimeLimitState = function(state)
  if state ~= STATE_FIGHTING then
   return true
  end
  return false
 end
}

-------------------------------------------------------------------------------------------------
--默认策略(无操作,打酱油)
-------------------------------------------------------------------------------------------------
AI_Helper.Player[0] =
{
 -------------------------------------------------------------------
 AIIndex    = 0,   --AI索引
 PlayerId   = 0,   --玩家ID
 OptTimer   = nil,   --操作计时
 IsStart    = false,  --是否已经启动
 State    = 0,   --当前状态
 SceneId    = 4,   --场景ID
 IdleTime   = 3000,   --休闲时间
 -------------------------------------------------------------------
 --开始
 OnStart = function(this)
  if this.IsStart == false then
   this.IsStart = true
   this.OptTimer = ECTimer:New() 
   this.OptTimer:SetPeriod(this.IdleTime)
  end
 end,

 --重置
 OnReset = function(this)
  this.OptTimer:Reset()
  this.State = 0
 end,

 --更新
 OnTick = function(this,dwPeriod)
  if this.OptTimer:IsValid() then
   if this.OptTimer:IsEnd() then
    this.OptTimer:Reset()
   else
    this.OptTimer:IncTime(dwPeriod)
   end
  end    
 end,

 --停止
 OnStop = function(this)
  this.OptTimer = nil
  this.State    = 0
  this.IsStart  = false
 end,
}

-------------------------------------------------------------------------------------------------
--观光策略
-------------------------------------------------------------------------------------------------
AI_Helper.Player[1] =
{
 -------------------------------------------------------------------
 AIIndex    = 1,   --AI索引
 PlayerId   = 0,   --玩家ID
 PropTbl    = nil,   --玩家属性表
 OptTimer   = nil,   --操作计时
 IsStart    = false,  --是否已经启动
 State    = 0,   --当前状态
 SearchTime   = 15000,  --寻径时间
 ActionTime   = 4000,   --Pose时间
 IdleTime   = 2000,   --休闲时间
 HpItem    = 3619,   --回血物品
 HpRatio    = 0.4,   --回血阀值
 HpTime    = 2000,   --回血操作时间
 MpItem    = 5217,   --回蓝物品
 MpRatio    = 0.4,   --回蓝阀值
 MpTime    = 2000,   --回蓝操作时间
 SceneId    = 4,   --场景ID(福州城)
 SceneObjPos   = {},   --场景物体位置
 -------------------------------------------------------------------
 DebugRobot = function(this)
  if GameApi.IsHostPlayerDead() then
   GameApi.RunConsoleCmd("d_cmd 2048")
  end
  
  --获取药品
  --GameApi.RunConsoleCmd("d_cmd 2001 3619 200")
  --GameApi.RunConsoleCmd("d_cmd 2001 5217 200")

  --随机寻径时间
  this.SearchTime = this.SearchTime + math.random(this.SearchTime)
  this.ActionTime = this.ActionTime + math.random(this.ActionTime)

  --随机位置
  local sCmd = nil
  while sCmd ==nil do
   local iIdx = math.random(#this.SceneObjPos)
   local bIn  = GameApi.IsPosInPassMap(this.SceneObjPos[iIdx].X,this.SceneObjPos[iIdx].Z)
   if bIn then
    sCmd = string.format("d_cmd 2008 %d %d %d",this.SceneId,this.SceneObjPos[iIdx].X,this.SceneObjPos[iIdx].Z)
   end
  end

  GameApi.RunConsoleCmd(sCmd)
 end,

 --开始
 OnStart = function(this)
  if this.IsStart == false then
   this.IsStart = true
   this.OptTimer = ECTimer:New() 
   this.OptTimer:SetPeriod(this.IdleTime)

   this.InitObjInfo(this)
   this.DebugRobot(this)
  end
 end,

 --重置
 OnReset = function(this)
  this.OptTimer:Reset()
  this.State = 0
 end,

 --更新
 OnTick = function(this,dwPeriod)
  if this.OptTimer:IsValid() then
   if this.OptTimer:IsEnd() then
    this.OptTimer:Reset()
    
    if this.State == PlayerState.STATE_PATH then
     this.StopAutoMove(this)
    elseif this.State == PlayerState.STATE_ACTION then
     this.SearchPath(this)
    elseif this.State == PlayerState.STATE_IDLE then     
     this.PlayAction(this)
    end

   else
    this.OptTimer:IncTime(dwPeriod)
   end
  end  
  
  this.PropTbl = GameApi.GetPlayerFullProp(0)
  this.HealHp(this)
  this.HealMp(this)
 end,

 --停止
 OnStop = function(this)
  this.OptTimer = nil
  this.State    = 0
  this.IsStart  = false
 end,

 --当前场景物体信息
 InitObjInfo = function(this)
  for k,v in pairs(ObjInfo) do
   if v.SID == this.SceneId then
    local iIdx = #this.SceneObjPos + 1
    this.SceneObjPos[iIdx] = {}
    this.SceneObjPos[iIdx].Id = k
    this.SceneObjPos[iIdx].X  = v.x
    this.SceneObjPos[iIdx].Y  = v.y
    this.SceneObjPos[iIdx].Z  = v.z
   end
  end
 end,

 --停止寻径
 StopAutoMove = function(this)
  this.State = PlayerState.STATE_IDLE
  this.OptTimer:Reset()
  this.OptTimer:SetPeriod(this.IdleTime)
  GameApi.StopAutoMove()
 end,

 --自动寻径
 SearchPath = function(this)
  this.State = PlayerState.STATE_PATH
  this.OptTimer:Reset()
  this.OptTimer:SetPeriod(this.SearchTime)

  local bIn  = false
  local iIdx = 0
  while bIn == false do
   iIdx = math.random(#this.SceneObjPos)
   bIn  = GameApi.IsPosInPassMap(this.SceneObjPos[iIdx].X,this.SceneObjPos[iIdx].Z)
  end
  GameApi.AutoSearchPathWithScriptCB(this.SceneObjPos[iIdx].X,this.SceneObjPos[iIdx].Y,this.SceneObjPos[iIdx].Z,this.SceneId)
 end,

 --休闲动作
 PlayAction = function(this) 
  this.State = PlayerState.STATE_ACTION
  this.OptTimer:Reset()
  this.OptTimer:SetPeriod(this.ActionTime)

  local iPose = math.random(12) - 1
  GameApi.PlayEmotePos(iPose)
 end,

 --补血逻辑
 HealHp = function(this) 
  local hp_ratio = this.PropTbl["hp"] / this.PropTbl["maxhp"]
  if hp_ratio <= this.HpRatio then   
   GameApi.UseItemByID(this.HpItem)
  end
 end,

 --补蓝逻辑
 HealMp = function(this)
  local mp_ratio = this.PropTbl["mp1"] / this.PropTbl["maxmp1"]
  if mp_ratio <= this.MpRatio then   
   GameApi.UseItemByID(this.MpItem)
  end
 end,
}

-------------------------------------------------------------------------------------------------
--仙霞岭杀怪策略
-------------------------------------------------------------------------------------------------
AI_Helper.Player[2] =
{
 -------------------------------------------------------------------
 AIIndex    = 2,   --AI索引
 PropTbl    = nil,   --玩家属性表
 PlayerId   = 0,   --玩家ID
 OptTimer   = nil,   --操作计时
 IsStart    = false,  --是否已经启动
 HpItem    = 3619,   --回血物品
 HpRatio    = 0.5,   --回血阀值
 MpItem    = 5217,   --回蓝物品
 MpRatio    = 0.5,   --回蓝阀值
 State    = 0,   --当前状态
 SelTarget   = 0,   --当前选中目标ID
 IdleTime   = 5000,   --休闲时间
 MapId    = 4,   --地图ID
 -------------------------------------------------------------------
 DebugRobot = function(this)
  --原地复活
  if GameApi.IsHostPlayerDead() then
   GameApi.RunConsoleCmd("d_cmd 2048")
  end

  --补血补蓝
  GameApi.UseItemByID(this.HpItem)
  GameApi.UseItemByID(this.MpItem)

  --随机点
  local pos_tbl =
  {
   {X=54, Y=216},
   {X=92, Y=163},
   {X=37, Y=91 },
   {X=67, Y=49 },
   {X=149,Y=42 },
   {X=242,Y=63 },
   {X=203,Y=115},
   {X=179,Y=151},
  }
  local map_offset = {X=-128,Y=-128}

  --随机怪群(仙霞岭)
  AI_Helper.GlobalFlag = AI_Helper.GlobalFlag + 1
  local sCmd = string.format("d_cmd 2008 %d %d %d",this.MapId,pos_tbl[AI_Helper.GlobalFlag].X+map_offset.X,pos_tbl[AI_Helper.GlobalFlag].Y+map_offset.Y)
  if AI_Helper.GlobalFlag >= #pos_tbl then
   AI_Helper.GlobalFlag = 0
  end  

  --随机位置点
  GameApi.RunConsoleCmd(sCmd) 

  --随机怪
  GameApi.FlyToRandMonster(this.MapId)

  --初始休闲
  this.State = PlayerState.STATE_IDLE
  this.OptTimer:Reset()
  this.OptTimer:SetPeriod(this.IdleTime)
 end,

 --开始
 OnStart = function(this)
  if this.IsStart == false then
   this.IsStart = true
   this.OptTimer = ECTimer:New() 
   this.DebugRobot(this)
  end
 end,

 --重置
 OnReset = function(this)
  this.OptTimer:Reset()
  this.State = 0
 end,

 --更新
 OnTick = function(this,dwPeriod)
  if this.OptTimer:IsValid() then
   if this.OptTimer:IsEnd() then
    this.OptTimer:Reset()
   else
    this.OptTimer:IncTime(dwPeriod)
    return
   end
  end

  this.PropTbl   = GameApi.GetPlayerFullProp(0)
  this.SelTarget = this.PropTbl["sel_target"]

  if this.PropTbl["is_dead"] == true then
   this.Revive(this)
   return
  else
   this.HealHp(this)
   this.HealMp(this)
  end

  if this.State == PlayerState.STATE_FIGHTING then
   if this.SelTarget <= 0 or GameApi.IsMonsterValid(this.SelTarget) == false then
    this.State = PlayerState.STATE_IDLE
    this.OptTimer:Reset()
    this.OptTimer:SetPeriod(this.IdleTime)
   else
    if GameApi.IsAttacking() == false then
     GameApi.AutoAttack()
    end   
   end
  else
   this.Fighting(this)   
  end  
 end,

 --停止
 OnStop = function(this)
  this.OptTimer = nil
  this.State    = 0
  this.IsStart  = false
 end,

 --战斗
 Fighting = function(this)
  if this.State == PlayerState.STATE_IDLE then
   if this.SelTarget <= 0 or GameApi.IsMonsterValid(this.SelTarget) == false then
    if this.SelTarget <= 0 then
     local npc_num,npc_tbl = GameApi.GetAttackMeList()
     if npc_num > 0 then
      local idx = math.random(1,npc_num)
      this.SelTarget = GameApi.AutoClickMonster(npc_tbl[idx])
     end
    end

    if this.SelTarget <= 0 then
     local npc_num,npc_tbl = GameApi.GetCanAttackNpcList()
     if npc_num > 0 then
      local idx = math.random(1,npc_num)
      this.SelTarget = GameApi.AutoClickMonster(npc_tbl[idx])
     end
    end
   end

   if this.SelTarget > 0 then
    GameApi.AutoAttack()
    this.State = PlayerState.STATE_FIGHTING
   else
    this.State = PlayerState.STATE_IDLE
    this.OptTimer:Reset()
    this.OptTimer:SetPeriod(this.IdleTime)
   end
  end
 end,

 --补血逻辑
 HealHp = function(this) 
  local hp_ratio = this.PropTbl["hp"] / this.PropTbl["maxhp"]
  if hp_ratio <= this.HpRatio and this.PropTbl["is_dead"] == false then   
   if GameApi.UseItemByID(this.HpItem) == false then
    if GameApi.GetItemNumByID(this.HpItem) <= 0 then
     local sCmd = string.format("d_cmd 2001 %d 100",this.HpItem)
     GameApi.RunConsoleCmd(sCmd)
    else
     LogPrint("AI::HealHp Error.\r\n")
    end
   end
  end
 end,

 --补蓝逻辑
 HealMp = function(this)
  local mp_ratio = this.PropTbl["mp1"] / this.PropTbl["maxmp1"]
  if mp_ratio <= this.MpRatio and this.PropTbl["is_dead"] == false then   
   if GameApi.UseItemByID(this.MpItem) == false then
    if GameApi.GetItemNumByID(this.MpItem) <= 0 then
     local sCmd = string.format("d_cmd 2001 %d 100",this.MpItem)
     GameApi.RunConsoleCmd(sCmd)
    else
     LogPrint("AI::HealMp Error.\r\n")
    end
   end
  end
 end,
 
 --自动复活
 Revive = function(this)
  if this.PropTbl["is_dead"] == true then
   GameApi.RunConsoleCmd("d_cmd 2048")
   
   this.State = PlayerState.STATE_IDLE
   this.OptTimer:Reset()
   this.OptTimer:SetPeriod(this.ReliveTime) 
   
   --补血补蓝
   GameApi.UseItemByID(this.HpItem)
   GameApi.UseItemByID(this.MpItem)

   this.SelTarget = 0
  end
 end
}

-------------------------------------------------------------------------------------------------
--杀怪策略使用技能
-------------------------------------------------------------------------------------------------
AI_Helper.Player[3] =
{
 -------------------------------------------------------------------
 AIIndex    = 3,   --AI索引
 PropTbl    = nil,   --玩家属性表
 PlayerId   = 0,   --玩家ID
 OptTimer   = nil,   --操作计时
 SkillTimer   = nil,   --释放技能计时
 IsStart    = false,  --是否已经启动
 HpItem    = 3619,   --回血物品
 HpRatio    = 0.5,   --回血阀值
 MpItem    = 5217,   --回蓝物品
 MpRatio    = 0.5,   --回蓝阀值
 State    = 0,   --当前状态
 SelTarget   = 0,   --当前选中目标ID
 IdleTime   = 5000,   --休闲时间
 SkillInterval       = 2000,   --技能释放间隔
 MapId    = 4,   --地图ID
 -------------------------------------------------------------------
 DebugRobot = function(this)
  --原地复活
  if GameApi.IsHostPlayerDead() then
   GameApi.RunConsoleCmd("d_cmd 2048")
  end

  --补血补蓝
  GameApi.UseItemByID(this.HpItem)
  GameApi.UseItemByID(this.MpItem)

  --随机点
  local pos_tbl =
  {
   {X=54, Y=216},
   {X=92, Y=163},
   {X=37, Y=91 },
   {X=67, Y=49 },
   {X=149,Y=42 },
   {X=242,Y=63 },
   {X=203,Y=115},
   {X=179,Y=151},
  }
  local map_offset = {X=-128,Y=-128}

  --打开pk模式
  GameApi.SetPKMask(1)
  
  AI_Helper.GlobalFlag = AI_Helper.GlobalFlag + 1
  local sCmd = string.format("d_cmd 2008 %d %d %d",this.MapId,pos_tbl[AI_Helper.GlobalFlag].X+map_offset.X,pos_tbl[AI_Helper.GlobalFlag].Y+map_offset.Y)
  if AI_Helper.GlobalFlag >= #pos_tbl then
   AI_Helper.GlobalFlag = 0
  end  

  --随机位置点
  GameApi.RunConsoleCmd(sCmd) 

  --随机怪
  GameApi.FlyToRandMonster(this.MapId)

  --初始休闲
  this.State = PlayerState.STATE_IDLE
  this.OptTimer:Reset()
  this.SkillTimer:Reset()
  this.OptTimer:SetPeriod(this.IdleTime)
  this.SkillTimer:SetPeriod(this.SkillInterval)
  
 end,

 --开始
 OnStart = function(this)
  if this.IsStart == false then
   this.IsStart = true
   this.OptTimer = ECTimer:New() 
   this.SkillTimer = ECTimer:New()
   this.DebugRobot(this)
  end
 end,

 --重置
 OnReset = function(this)
  this.OptTimer:Reset()
  this.SkillTimer:Reset()
  this.State = 0
 end,

 --更新
 OnTick = function(this,dwPeriod)

  
  if this.SkillTimer:IsValid() then
   
   if this.SkillTimer:IsEnd() then
    this.SkillTimer:Reset()
    this.SkillTimer:SetPeriod(this.SkillInterval)
    if this.State == PlayerState.STATE_FIGHTING then
     GameApi.UseRandomSkill()
     
    end
    
   else
    this.SkillTimer:IncTime(dwPeriod)
   end
  else
   this.SkillTimer:Reset()
   this.SkillTimer:SetPeriod(this.SkillInterval)
  end
  if this.OptTimer:IsValid() then
   if this.OptTimer:IsEnd() then
    this.OptTimer:Reset()
   else
    this.OptTimer:IncTime(dwPeriod)
    return
   end
  end

  this.PropTbl   = GameApi.GetPlayerFullProp(0)
  this.SelTarget = this.PropTbl["sel_target"]

  if this.PropTbl["is_dead"] == true then
   this.Revive(this)
   return
  else
   this.HealHp(this)
   this.HealMp(this)
  end

  if this.State == PlayerState.STATE_FIGHTING then
   if this.SelTarget <= 0 or GameApi.IsMonsterValid(this.SelTarget) == false then
    this.State = PlayerState.STATE_IDLE
    this.OptTimer:Reset()
    this.OptTimer:SetPeriod(this.IdleTime)
   else
    if GameApi.IsAttacking() == false then
     GameApi.AutoAttack()
     
    else
        --GameApi.UseRandomSkill()
    end   
   end
  else
   this.Fighting(this)   
  end  
 end,

 --停止
 OnStop = function(this)
  this.OptTimer = nil
  this.State    = 0
  this.IsStart  = false
 end,

 --战斗
 Fighting = function(this)
  if this.State == PlayerState.STATE_IDLE then
   if this.SelTarget <= 0 or GameApi.IsMonsterValid(this.SelTarget) == false then
    if this.SelTarget <= 0 then
     local npc_num,npc_tbl = GameApi.GetAttackMeList()
     if npc_num > 0 then
      local idx = math.random(1,npc_num)
      this.SelTarget = GameApi.AutoClickMonster(npc_tbl[idx])
     end
    end
    
    if this.SelTarget <= 0 then
     local npc_num,npc_tbl = GameApi.GetCanAttackNpcList()
     if npc_num > 0 then
      local idx = math.random(1,npc_num)
      this.SelTarget = GameApi.AutoClickMonster(npc_tbl[idx])
     end
    end
   end

   if this.SelTarget > 0 then
    GameApi.AutoAttack()
    this.State = PlayerState.STATE_FIGHTING
    
   else
    this.State = PlayerState.STATE_IDLE
    this.OptTimer:Reset()
    this.OptTimer:SetPeriod(this.IdleTime)
   end
  end
 end,


 --补血逻辑
 HealHp = function(this) 
  local hp_ratio = this.PropTbl["hp"] / this.PropTbl["maxhp"]
  if hp_ratio <= this.HpRatio and this.PropTbl["is_dead"] == false then   
   if GameApi.UseItemByID(this.HpItem) == false then
    if GameApi.GetItemNumByID(this.HpItem) <= 0 then
     local sCmd = string.format("d_cmd 2001 %d 100",this.HpItem)
     GameApi.RunConsoleCmd(sCmd)
    else
     LogPrint("AI::HealHp Error.\r\n")
    end
   end
  end
 end,

 --补蓝逻辑
 HealMp = function(this)
  local mp_ratio = this.PropTbl["mp1"] / this.PropTbl["maxmp1"]
  if mp_ratio <= this.MpRatio and this.PropTbl["is_dead"] == false then   
   if GameApi.UseItemByID(this.MpItem) == false then
    if GameApi.GetItemNumByID(this.MpItem) <= 0 then
     local sCmd = string.format("d_cmd 2001 %d 100",this.MpItem)
     GameApi.RunConsoleCmd(sCmd)
    else
     LogPrint("AI::HealMp Error.\r\n")
    end
   end
  end
 end,
 
 --自动复活
 Revive = function(this)
  if this.PropTbl["is_dead"] == true then
   GameApi.RunConsoleCmd("d_cmd 2048")
   
   this.State = PlayerState.STATE_IDLE
   this.OptTimer:Reset()
   this.OptTimer:SetPeriod(this.ReliveTime) 
   
   --补血补蓝
   GameApi.UseItemByID(this.HpItem)
   GameApi.UseItemByID(this.MpItem)

   this.SelTarget = 0
  end
 end
}


-------------------------------------------------------------------------------------------------
--杀怪策略使用技能
-------------------------------------------------------------------------------------------------
AI_Helper.Player[4] =
{
 -------------------------------------------------------------------
 AIIndex    = 3,   --AI索引
 PropTbl    = nil,   --玩家属性表
 PlayerId   = 0,   --玩家ID
 OptTimer   = nil,   --操作计时
 SkillTimer   = nil,   --释放技能计时
 IsStart    = false,  --是否已经启动
 HpItem    = 3619,   --回血物品
 HpRatio    = 0.5,   --回血阀值
 MpItem    = 5217,   --回蓝物品
 MpRatio    = 0.5,   --回蓝阀值
 State    = 0,   --当前状态
 SelTarget   = 0,   --当前选中目标ID
 IdleTime   = 5000,   --休闲时间
 SkillInterval       = 2000,   --技能释放间隔
 MoveInterval        = 30000,   --自动移动时间
 TargetInterval      = 0,      --攻击玩家切换间隔根,据释放技能次数
 MapId    = 4,   --地图ID

 -------------------------------------------------------------------
 DebugRobot = function(this)
  --原地复活
  if GameApi.IsHostPlayerDead() then
   GameApi.RunConsoleCmd("d_cmd 2048")
  end

  --补血补蓝
  GameApi.UseItemByID(this.HpItem)
  GameApi.UseItemByID(this.MpItem)

   --随机点
  local pos_tbl =
  {
   {X=50,Y=-30},
   {X=67,Y=-16},
   {X=-79,Y=-59},
   {X=-52,Y=91},
   {X=29,Y=155},
   {X=156,Y=-3},
   {X=130,Y=-27},
   {X=-91,Y=-2},
   {X=52,Y=-140},
   {X=50,Y=-30},
   {X=-61,Y=-82},
   {X=-59,Y=-30},
   {X=156,Y=-3},
   {X=52,Y=-140},
  }
  local map_offset = {X=1,Y=1}

  --打开pk模式
  GameApi.SetPKMask(1)
  
  AI_Helper.GlobalFlag = AI_Helper.GlobalFlag + 1
  local posIndex = math.random(#pos_tbl)
  --local sCmd = string.format("d_cmd 2008 %d %d %d",this.MapId,pos_tbl[AI_Helper.GlobalFlag].X+map_offset.X,pos_tbl[AI_Helper.GlobalFlag].Y+map_offset.Y)
  local sCmd = string.format("d_cmd 2008 %d %d %d",this.MapId,pos_tbl[posIndex].X+map_offset.X,pos_tbl[posIndex].Y+map_offset.Y)
  if AI_Helper.GlobalFlag >= #pos_tbl then
   AI_Helper.GlobalFlag = 0
  end  

  --随机位置点
  GameApi.RunConsoleCmd(sCmd) 

  --随机怪
  GameApi.FlyToRandMonster(this.MapId)

  --初始休闲
  this.State = PlayerState.STATE_IDLE
  this.OptTimer:Reset()
  this.SkillTimer:Reset()
  this.OptTimer:SetPeriod(this.IdleTime)
  this.SkillTimer:SetPeriod(this.SkillInterval)
  
 end,

 --开始
 OnStart = function(this)
  if this.IsStart == false then
   this.IsStart = true
   this.OptTimer = ECTimer:New() 
   this.SkillTimer = ECTimer:New()
   this.DebugRobot(this)
  end
 end,

 --重置
 OnReset = function(this)
  this.OptTimer:Reset()
  this.SkillTimer:Reset()
  this.State = 0
 end,

 --更新
 OnTick = function(this,dwPeriod)

  
  if this.SkillTimer:IsValid() then
   if this.SkillTimer:IsEnd() then
    this.SkillTimer:Reset()
    this.SkillTimer:SetPeriod(this.SkillInterval)
    if this.State == PlayerState.STATE_FIGHTING then
     GameApi.UseRandomSkill()
     this.TargetInterval = this.TargetInterval+1;
    end
    
   else
    this.SkillTimer:IncTime(dwPeriod)
   end
  else
   this.SkillTimer:Reset()
   this.SkillTimer:SetPeriod(this.SkillInterval)
  end
  if this.OptTimer:IsValid() then
   if this.OptTimer:IsEnd() then
    this.OptTimer:Reset()
   else
    this.OptTimer:IncTime(dwPeriod)
    return
   end
  end

  this.PropTbl   = GameApi.GetPlayerFullProp(0)
  this.SelTarget = this.PropTbl["sel_target"]

  if this.PropTbl["is_dead"] == true then
   this.Revive(this)
   return
  else
   this.HealHp(this)
   this.HealMp(this)
  end

  
  if this.TargetInterval > 3 then
   this.State = PlayerState.STATE_IDLE
   this.OptTimer:Reset()
   this.OptTimer:SetPeriod(this.IdleTime)
   this.TargetInterval = 0
   this.SelTarget = 0
   
   --自动寻径
   local findpos_tbl =
   {
    {X=50,Y=-30},
    {X=67,Y=-16},
    {X=-79,Y=-59},
    {X=-52,Y=91},
    {X=29,Y=155},
    {X=156,Y=-3},
    {X=130,Y=-27},
    {X=-91,Y=-2},
    {X=52,Y=-140},
    {X=50,Y=-30},
    {X=-61,Y=-82},
    {X=-59,Y=-30},
    {X=156,Y=-3},
    {X=52,Y=-140},
   }
   this.OptTimer:SetPeriod(this.MoveInterval)
   local iIdx = math.random(#findpos_tbl)
   local iPose = math.random(12) - 1
   GameApi.PlayEmotePos(iPose)
   --GameApi.AutoSearchPathWithScriptCB(findpos_tbl[iIdx].X,0,findpos_tbl[iIdx].Y,this.MapId)
   local sCmd = string.format("d_cmd 2008 %d %d %d",this.MapId,findpos_tbl[iIdx].X,findpos_tbl[iIdx].Y)
   GameApi.RunConsoleCmd(sCmd) 
   --/
  end
  
  if this.State == PlayerState.STATE_FIGHTING then
   if this.SelTarget <= 0 or GameApi.IsObjectValid(this.SelTarget) == false then
    this.State = PlayerState.STATE_IDLE
    this.OptTimer:Reset()
    this.OptTimer:SetPeriod(this.IdleTime)
   else
    if GameApi.IsAttacking() == false then
     GameApi.AutoAttack()
     
    else
        --GameApi.UseRandomSkill()
    end   
   end
  else
   this.Fighting(this)   
  end  
 end,

 --停止
 OnStop = function(this)
  this.OptTimer = nil
  this.State    = 0
  this.IsStart  = false
 end,

 --战斗
 Fighting = function(this)
  if this.State == PlayerState.STATE_IDLE then
   if this.SelTarget <= 0 or GameApi.IsObjectValid(this.SelTarget) == false then
    if this.SelTarget <= 0 then
     local player_num,player_tbl = GameApi.GetNearPlayerList()
     if player_num > 0 then
      local idx = math.random(1,player_num)
      this.SelTarget = GameApi.AutoClickPlayer(player_tbl[idx])
     end
    end
       
   end

   if this.SelTarget > 0 then
    GameApi.AutoAttack()
    this.State = PlayerState.STATE_FIGHTING
    
   else
    this.State = PlayerState.STATE_IDLE
    this.OptTimer:Reset()
    this.OptTimer:SetPeriod(this.IdleTime)
   end
  end
 end,


 --补血逻辑
 HealHp = function(this) 
  local hp_ratio = this.PropTbl["hp"] / this.PropTbl["maxhp"]
  if hp_ratio <= this.HpRatio and this.PropTbl["is_dead"] == false then   
   if GameApi.UseItemByID(this.HpItem) == false then
    if GameApi.GetItemNumByID(this.HpItem) <= 0 then
     local sCmd = string.format("d_cmd 2001 %d 100",this.HpItem)
     GameApi.RunConsoleCmd(sCmd)
    else
     LogPrint("AI::HealHp Error.\r\n")
    end
   end
  end
 end,

 --补蓝逻辑
 HealMp = function(this)
  local mp_ratio = this.PropTbl["mp1"] / this.PropTbl["maxmp1"]
  if mp_ratio <= this.MpRatio and this.PropTbl["is_dead"] == false then   
   if GameApi.UseItemByID(this.MpItem) == false then
    if GameApi.GetItemNumByID(this.MpItem) <= 0 then
     local sCmd = string.format("d_cmd 2001 %d 100",this.MpItem)
     GameApi.RunConsoleCmd(sCmd)
    else
     LogPrint("AI::HealMp Error.\r\n")
    end
   end
  end
 end,
 
 --自动复活
 Revive = function(this)
  if this.PropTbl["is_dead"] == true then
   GameApi.RunConsoleCmd("d_cmd 2048")
   
   this.State = PlayerState.STATE_IDLE
   this.OptTimer:Reset()
   this.OptTimer:SetPeriod(this.ReliveTime) 
   
   --补血补蓝
   GameApi.UseItemByID(this.HpItem)
   GameApi.UseItemByID(this.MpItem)

   this.SelTarget = 0
  end
 end
}
---------------------------------------------------------------------------------
--计时器
ECTimer =
{
 m_Period = 0,
 m_Time   = 0,
}

function ECTimer:New(obj)
 obj = obj or {}
 setmetatable(obj, self)
 self.__index = self
 obj.m_Period = 0
 obj.m_Time   = 0
 return obj
end

function ECTimer:IsValid()
 if self.m_Time and self.m_Period and self.m_Period > 0 then
  return true
 end
 return false
end

function ECTimer:SetPeriod(period)
 self.m_Period = period
end

function ECTimer:GetPeriod()
 return self.m_Period
end

function ECTimer:SetTime(tm)
 self.m_Time = tm
end

function ECTimer:GetTime()
 return self.m_Time
end

function ECTimer:Reset()
 self.m_Time   = 0
 self.m_Period = 0
end

function ECTimer:IncTime(step)
 if self:IsValid() then
  if self.m_Time < self.m_Period then
   self.m_Time = self.m_Time + step
  end
  return self:IsEnd()
 end
 return false
end

function ECTimer:IsEnd()
 if self:IsValid() then
  if self.m_Time >= self.m_Period then
   return true
  end
 end
 return false
end

function ECTimer:Finish()
 if self:IsValid() then
  self.m_Time = self.m_Period
 end
end

---------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值