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; } } } }
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; } } } }