public GamePoint FindPath(GamePoint fromPos, GamePoint destPos) { int nowX = fromPos.x; int nowY = fromPos.y; GamePoint tmpDestPos = destPos.clone(); //!先直着走后斜着走的策略代码开始******************************************************************** if (Math.Abs(destPos.x - nowX) != Math.Abs(destPos.y - nowY)) {//!还没走到斜45度,那么就选一条常的边走 int minOffset = Math.Min(Math.Abs(destPos.x - fromPos.x), Math.Abs(destPos.y - fromPos.y)); if (destPos.x > fromPos.x) { tmpDestPos.x -= minOffset; } else { tmpDestPos.x += minOffset; } if (destPos.y > fromPos.y) { tmpDestPos.y -= minOffset; } else { tmpDestPos.y += minOffset; } } //!先直着走后斜着走的策略代码结束******************************************************************** int dir = CalDirection(nowX, nowY, tmpDestPos.x, tmpDestPos.y); GamePoint destPoint = CalPointByDirLen(dir, 1); destPoint.x += nowX; destPoint.y += nowY; return(destPoint); }
public void HandleRobotAI(Player player) { long nowtm = Util.GetNowTimeMs(); if (nowtm - player.nLastRobotAITm < 1000) { return; } player.nLastRobotAITm = nowtm; Role targetRole = GetTargetRobot(player); if (targetRole == null)//!没有目标找一个离自己最近的目标 { RoleMgr.Instance().ForeachRole((Role roleOther) => { if (roleOther == player || roleOther.hp == 0 || roleOther is Monster) { return; } if (targetRole != null && Util.Distance(player.x, player.y, targetRole.x, targetRole.y) <= Util.Distance(player.x, player.y, roleOther.x, roleOther.y)) { return; } targetRole = roleOther; player.nCurTarget = targetRole.GetID(); }); } int nDistance = Util.Distance(player.x, player.y, targetRole.x, targetRole.y); if (nDistance <= 1) { Pbmsg.AttackRet monsterAttackMsg = new Pbmsg.AttackRet() { Magicid = 2, Id = player.GetID(), Targetid = targetRole.GetID(), }; FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SAttack, monsterAttackMsg); int hpChaneged = 200; //if (targetRole.hp >= hpChaneged) //{ // targetRole.hp -= hpChaneged; //} //else //{ // targetRole.hp = 0; // targetRole.nLastAttackedTime = Util.GetNowTimeMs(); //} Pbmsg.HPChangedRet retMsg2 = new Pbmsg.HPChangedRet() { Id = targetRole.GetID(), Magicid = 2, ValCur = targetRole.hp, ValChanged = hpChaneged, }; FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SHpChanged, retMsg2); return; } //!追击 int nDir = GameUtil.CalDirection(player.x, player.y, targetRole.x, targetRole.y); GamePoint offsetPos = GameUtil.CalPointByDirLen(nDir, 1); player.x = player.x + offsetPos.x; player.y = player.y + offsetPos.y; Pbmsg.RunRet runRet = new Pbmsg.RunRet() { Id = player.GetID(), X = player.x, Y = player.y, }; FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SRun, runRet); return; }
public void HandleMonsterAI() { long now = Util.GetNowTimeMs(); if (now - this.nLastAITick < 800) { return; } this.nLastAITick = Util.GetNowTimeMs(); RoleMgr.Instance().ForeachRole((Role role) => { //if (gCount++ % 10 == 0) //{ // FFLog.Trace(string.Format("HandleMonsterAI! {0},hp:{1}", gCount, role.hp)); //} if (role.hp <= 0) { if (Util.GetNowTimeMs() - role.nLastAttackedTime < 5000 && gCount++ % 10 != 0) { return; } role.hp = role.maxhp; Pbmsg.EnterMapRet enterMapRet = role.BuildEnterMsg(); FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SEnterMap, enterMapRet); return; } if (!(role is Monster)) { if (role is Player) { Player playerTmp = role as Player; if (playerTmp.bIsRobot) { HandleRobotAI(playerTmp); } } return; } Monster monster = role as Monster; if (monster.nLastAttackedRoleID == 0) { return; } Player player = RoleMgr.Instance().GetPlayerBySessionID(monster.nLastAttackedRoleID); if (player == null || player.hp == 0) { monster.nLastAttackedRoleID = 0; return; } int nDistance = Util.Distance(monster.x, monster.y, player.x, player.y); if (nDistance <= 1) { if (Util.GetNowTimeMs() - monster.nLastAttackTime < 1000) { return; } monster.nLastAttackTime = Util.GetNowTimeMs(); Pbmsg.AttackRet monsterAttackMsg = new Pbmsg.AttackRet() { Id = monster.GetID(), Targetid = player.GetID(), }; FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SAttack, monsterAttackMsg); Random rd = new Random(); Role roleTarget = player; int hpChaneged = rd.Next(1, roleTarget.maxhp / 10); if (roleTarget.hp >= hpChaneged) { roleTarget.hp -= hpChaneged; } else { roleTarget.hp = 0; } roleTarget.nLastAttackedTime = Util.GetNowTimeMs(); Pbmsg.HPChangedRet retMsg3 = new Pbmsg.HPChangedRet() { Id = roleTarget.GetID(), ValCur = roleTarget.hp, ValChanged = hpChaneged, }; FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SHpChanged, retMsg3); } else//!怪物寻路追打角色 { GamePoint nextPos = GameUtil.FindPath(new GamePoint(monster.x, monster.y), new GamePoint(player.x, player.y)); if (RoleMgr.Instance().GetRoleByPos(nextPos.x, nextPos.y) != null) { return; } monster.x = nextPos.x; monster.y = nextPos.y; Pbmsg.RunRet runRet = new Pbmsg.RunRet() { Id = monster.GetID(), X = monster.x, Y = monster.y, }; FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SRun, runRet); } }); }
public void HandleMonsterAI() { foreach (Role role in m_dictRoles.Values) { if (role.hp == 0) { if (Util.GetNowTimeMs() - role.nLastAttackedTime < 5000) { continue; } role.hp = role.maxhp; Pbmsg.EnterMapRet enterMapRet = BuildEnterMsg(role); BroadcastPlayerMsg <Pbmsg.EnterMapRet>(Pbmsg.ServerCmdDef.SEnterMap, enterMapRet); continue; } if (!(role is Monster)) { continue; } Monster monster = role as Monster; if (monster.nLastAttackedRoleID == 0) { continue; } Player player = GetPlayerBySessionID(monster.nLastAttackedRoleID); if (player == null || player.hp == 0) { monster.nLastAttackedRoleID = 0; continue; } int nDistance = Util.Distance(monster.x, monster.y, player.x, player.y); if (nDistance <= 1) { if (Util.GetNowTimeMs() - monster.nLastAttackTime < 1000) { continue; } monster.nLastAttackTime = Util.GetNowTimeMs(); Pbmsg.AttackRet monsterAttackMsg = new Pbmsg.AttackRet() { Id = monster.GetID(), Targetid = player.GetID(), }; BroadcastPlayerMsg <Pbmsg.AttackRet>(Pbmsg.ServerCmdDef.SAttack, monsterAttackMsg); Random rd = new Random(); Role roleTarget = player; int hpChaneged = rd.Next(1, roleTarget.maxhp / 10); if (roleTarget.hp >= hpChaneged) { roleTarget.hp -= hpChaneged; } else { roleTarget.hp = 0; } roleTarget.nLastAttackedTime = Util.GetNowTimeMs(); Pbmsg.HPChangedRet retMsg3 = new Pbmsg.HPChangedRet() { Id = roleTarget.GetID(), ValCur = roleTarget.hp, ValChanged = hpChaneged, }; BroadcastPlayerMsg <Pbmsg.HPChangedRet>(Pbmsg.ServerCmdDef.SHpChanged, retMsg3); } else//!怪物寻路追打角色 { GamePoint nextPos = FindPath(new GamePoint(monster.x, monster.y), new GamePoint(player.x, player.y)); if (GetRoleByPos(nextPos.x, nextPos.y) != null) { continue; } monster.x = nextPos.x; monster.y = nextPos.y; Pbmsg.RunRet runRet = new Pbmsg.RunRet() { Id = monster.GetID(), X = monster.x, Y = monster.y, }; BroadcastPlayerMsg <Pbmsg.RunRet>(Pbmsg.ServerCmdDef.SRun, runRet); } } FFNet.Timerout(800, this.HandleMonsterAI); }