public virtual void Run()
{
if (SelObj.IsDie()) return; //自身实体已死亡
if (SelObj.IsLock()) //自身被锁定
{
if (findlist != null)
findlist.Clear();
return;
}
//攻击的对方被锁定,攻击不了
if (TargetObj != null && TargetObj.IsLock()) return;
//目标已死亡切换目标
if (TargetObj != null && TargetObj.IsDie())
{
SetAttackTarget(null);
}
//目标是幻兽- 并且在休息状态
if(TargetObj != null && TargetObj.type == OBJECTTYPE.EUDEMON &&
(TargetObj as EudemonObject).GetState() != EUDEMONSTATE.BATTLE)
{
SetAttackTarget(null);
}
//空闲状态走路
if (nState == BaseAI.STATE_IDLE && mAiInfo.bIdle_Move)
{
if (System.Environment.TickCount - SelObj.GetLastWalkTime() > SelObj.GetWalkTime() && !SelObj.IsDie())
{
//二分之一的几率不走路
if (IRandom.Random(1, 4) > 2)
{
//增加判断- 优化服务端运行效率- 视野里有玩家才走
bool bWalk = false;
foreach (RefreshObject obj in SelObj.GetVisibleList().Values)
{
if (obj.obj.type == OBJECTTYPE.PLAYER)
{
bWalk = true;
break;
}
}
if (bWalk)
{
byte dir = 0; short x = 0; short y = 0;
if (DIR.Random_Walk(SelObj, ref dir, ref x, ref y))
{
SelObj.Walk(dir, x, y);
}
}
}
}
}
//玩家意外掉线
if (TargetObj != null && TargetObj.type == OBJECTTYPE.PLAYER &&
TargetObj.GetGameSession() == null)
{
SetAttackTarget(null);
}
//主动怪物- 遍历视野范围内的玩家- 找到最近的那一个开始攻击他
ActiveAttackPlay();
//受伤了..反击
if ((TargetObj != null) &&
(nState == BaseAI.INJURED || nState == BaseAI.ATTACK ||
nState == BaseAI.FOLLOW))
{
if (!SelObj.CanPK(TargetObj))
{
SetAttackTarget(null);
return;
}
//目标角色死亡了或者已经不在可视范围内
if (TargetObj.IsDie() || !SelObj.GetPoint().CheckVisualDistance(TargetObj.GetCurrentX(),
TargetObj.GetCurrentY(),mAiInfo.nRange))
{
TargetObj = null;
nState = BaseAI.STATE_IDLE;
if (findlist != null) findlist.Clear();
}
if (TargetObj != null &&
System.Environment.TickCount - mnLastMoveTick > mAiInfo.nMove_Speed &&
mAiInfo.bMove)
{
//与目标差距太大-- 就跟随
if (Math.Abs(TargetObj.GetCurrentX() - SelObj.GetCurrentX()) > mAiInfo.nAttack_Range ||
Math.Abs(TargetObj.GetCurrentY() - SelObj.GetCurrentY()) > mAiInfo.nAttack_Range)
{
if (findlist != null && findlist.Count > 0)
{
MapServer.FindPoint point = findlist[findlist.Count - 1];
findlist.RemoveAt(findlist.Count - 1);
if (point.x == SelObj.GetCurrentX() && point.y == SelObj.GetCurrentY()) return;
byte dir = DIR.GetDirByPos(SelObj.GetCurrentX(), SelObj.GetCurrentY(), point.x, point.y);
// Console.WriteLine("当前怪物坐标:"+SelObj.GetCurrentX().ToString()+"y:"+SelObj.GetCurrentY().ToString() + "目的坐标:"+point.x.ToString() + "y:" + point.y.ToString() + "方向:" + dir.ToString()+"\n");
if (findlist.Count == 0)
{
nState = BaseAI.ATTACK;
// Console.Write("------------------------------------------------------------\n");
}
SelObj.Walk(dir,point.x,point.y);
}else this.FollowTarget();
mnLastMoveTick = System.Environment.TickCount ;
// Console.WriteLine((System.Environment.TickCount - mnLastMoveTick).ToString());
return;
}
}
//攻击目标
if(TargetObj != null &&
System.Environment.TickCount - mnLastAttackTick > mAiInfo.nAttack_Speed)
{
//在攻击范围内
if(Math.Abs(TargetObj.GetCurrentX() - SelObj.GetCurrentX()) <= mAiInfo.nAttack_Range &&
Math.Abs(TargetObj.GetCurrentY() - SelObj.GetCurrentY()) <= mAiInfo.nAttack_Range)
{
NetMsg.MsgMonsterAttackInfo msg = new NetMsg.MsgMonsterAttackInfo();
msg.Create(null, null);
msg.monsterid = SelObj.GetTypeId();
msg.roleid = TargetObj.GetTypeId(); ;
msg.role_x = TargetObj.GetCurrentX();
msg.role_y = TargetObj.GetCurrentY();
msg.injuredvalue = BattleSystem.AdjustDamage(SelObj, TargetObj); ;
byte[] buff = msg.GetBuffer();
//广播
(SelObj as MonsterObject).BrocatBuffer(buff);
//GameStruct.Action act = new GameStruct.Action(GameStruct.Action.ATTACK, buff);
//SelObj.PushAction(act);
//反馈角色被攻击--减血3
NetMsg.MsgAttackInfo info = new NetMsg.MsgAttackInfo();
info.tag = 21;
TargetObj.Injured(SelObj, msg.injuredvalue, info);
mnLastAttackTick = System.Environment.TickCount;
}
}
}
}