public void OnConfirm(int button) { switch ((PanelMessageBox.BUTTON)button) { case PanelMessageBox.BUTTON.YES: { var pi = CommandManager.Instance.CurrentExecuter; if (pi != null) { var city = pi.CurrentCity; CityRemove output = new CityRemove() { RoomId = city.RoomId, OwnerId = city.OwnerId, CityId = city.CityId, }; GameRoomManager.Instance.SendMsg(ROOM.CityRemove, output.ToByteArray()); // 消耗行动点 long roomId = city.RoomId; long ownerId = city.OwnerId; long cityId = city.CityId; int commandId = (int)CommandManager.Instance.RunningCommandId; int actionPointCost = CommandManager.Instance.RunningCommandActionPoint; CmdAttack.TryCommand(roomId, ownerId, cityId, commandId, actionPointCost); } } break; case PanelMessageBox.BUTTON.NO: break; } Stop(); }
public static bool AttackEnemyInRange(ActorBehaviour abMe, long targetId) { ActorBehaviour abEnemy = GameRoomManager.Instance.RoomLogic.ActorManager.GetActor(targetId); if (abEnemy == null) { // 优先找指定的敌人,如果没有找到,则搜索射程以内的敌人(从近到远) abEnemy = abMe.FindEnemyInRange(); } if (abEnemy != null) { if (abMe.IsEnemyInRange(abEnemy)) { if (abMe.CalcDistance(abEnemy) < 18f * abMe.ShootingRange) { // 敌人进入射程,进入攻击状态. 注意:这时候的敌人,可能不是之前要打的敌人 abMe.IsCounterAttack = false; // 这是主动攻击, 不是反击, 记录在自己身上, Stop的时候用 abMe.StateMachine.TriggerTransition(StateEnum.FIGHT, abEnemy.CellIndex, abEnemy.ActorId, abMe.AttackDuration); CmdAttack.TryCommand(); return(true); } } } return(false); }
void OnBtnAttackClicked() { //InputController.Instance.notifyBtnAttackClicked(btnAttack); CmdBase sCmd = new CmdAttack(1); //sCmd.Init(btnAttack); m_sCmdMgr.CmdPush((CmdBase)sCmd); }
public void Run() { var pi = CommandManager.Instance.CurrentExecuter; if (pi == null || !pi.CurrentActor) { string msg = $"没有选中任何部队!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); return; } var avMe = CommandManager.Instance.CurrentExecuter.CurrentActor; if (avMe == null) { return; } var currentCell = avMe.HexUnit.Location; var resType = currentCell.Res.ResType; int resAmount = currentCell.Res.GetAmount(resType); float durationTime = resAmount * 3.0f; if (resAmount <= 0) { string msg = $"本地没有任何资源,请去其他地方采集!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Warning); return; } // 看看行动点够不够 if (!CmdAttack.IsActionPointGranted()) { string msg = "行动点数不够, 本操作无法执行! "; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); Debug.Log("CmdHarvest Run Error - " + msg); return; } { HarvestStart output = new HarvestStart() { RoomId = avMe.RoomId, OwnerId = avMe.OwnerId, ActorId = avMe.ActorId, CellIndex = avMe.CellIndex, ResType = (int)resType, ResRemain = resAmount, DurationTime = durationTime, }; GameRoomManager.Instance.SendMsg(ROOM.HarvestStart, output.ToByteArray()); CmdAttack.SendAiStateHigh(avMe.OwnerId, avMe.ActorId, StateEnum.HARVEST, 0, 0, durationTime, durationTime); // 消耗行动点 CmdAttack.TryCommand(); } }
/// <summary> /// 创建命令 /// </summary> /// <param name="type">命令类型</param> public static ICmd Create(E_CmdType type) { ICmd cmd = null; if (UnusedCmds[type] != null && UnusedCmds[type].Count > 0) { cmd = UnusedCmds[type].Dequeue(); } else { switch (type) { case E_CmdType.Idle: cmd = new CmdIdle(); break; case E_CmdType.Move: cmd = new CmdMove(); break; case E_CmdType.Attack: cmd = new CmdAttack(); break; case E_CmdType.Death: cmd = new CmdDeath(); break; case E_CmdType.WeaponShow: cmd = new CmdWeaponShow(); break; default: Debug.LogError("No Cmd to Create!!! ICmd Type: " + type); break; } } if (cmd != null) { cmd.Reset(); cmd.SetActive(); #if DEBUG UsedCmds.Add(cmd); #endif } return(cmd); }
public void Run() { // 看看行动点够不够 if (!CmdAttack.IsActionPointGranted()) { string msg = "行动点数不够, 本操作无法执行! "; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); Debug.Log("CmdAbandonCity Run Error - " + msg); Stop(); return; } string title = "提示"; string content = "你要废弃这座城市吗?"; UIManager.Instance.MessageBox(title, content, (int)PanelMessageBox.BUTTON.YES | (int)PanelMessageBox.BUTTON.NO, OnConfirm); }
private void OnFightStopReply(byte[] bytes) { FightStopReply input = FightStopReply.Parser.ParseFrom(bytes); if (input.ActorId != ActorId) { return; // 不是自己,略过 } if (!input.Ret) { GameRoomManager.Instance.Log($"ActorBehaviour OnFightStopReply Error - {input.ErrMsg}"); return; } // 每次攻击都要消耗行动点和弹药基数, 所以需要每一轮攻击都判断行动点和弹药基数是否足够 // 如果在战斗中才进行下次进攻的判定, 否则战斗结束 if (input.FightAgain && AmmoBase > 0 && CmdAttack.IsActionPointGranted()) { // 弹药基数足够, 可以再打一轮, 要用 [延迟攻击] 的状态, 时间也要把 [攻击持续时间] & [攻击间隔] 算在一起 StateMachine.TriggerTransition(StateEnum.DELAYFIGHT, 0, input.TargetId, AttackDuration + AttackInterval, AttackDuration + AttackInterval); long roomId = input.RoomId; long ownerId = input.OwnerId; long actorId = input.ActorId; int commandId = (int)CommandManager.CommandID.Attack; int actionPointCost = CommandManager.Instance.Commands[CommandManager.CommandID.Attack].ActionPointCost; CmdAttack.TryCommand(roomId, ownerId, actorId, commandId, actionPointCost); } else if (!input.IsEnemyDead && !IsCounterAttack) { // 我方战斗结束, 如果这时候敌人没死, (我不是处于反击状态), 敌人反击一次 var abTarget = GameRoomManager.Instance.RoomLogic.ActorManager.GetActor(input.TargetId); if (abTarget != null) { abTarget.IsCounterAttack = true; // 这是反击, 不是主动攻击, 记录在自己身上, Stop的时候用 // 反击的时候, 不需要行动点的允许, 直接就可以打 abTarget.IsCounterAttack = true; // 这是反击, 不是主动攻击, 记录在自己身上, Stop的时候用 abTarget.StateMachine.TriggerTransition(StateEnum.FIGHT, 0, input.ActorId, abTarget.AttackDuration); GameRoomManager.Instance.Log("ActorBehaviour OnFightStopReply - 敌人反击"); } } GameRoomManager.Instance.Log($"ActorBehaviour OnFightStopReply - Ammo:{AmmoBase}/{AmmoBaseMax}"); }
public void Run() { var pi = CommandManager.Instance.CurrentExecuter; if (pi == null || !pi.CurrentActor) { string msg = $"没有选中任何部队!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); return; } var avMe = CommandManager.Instance.CurrentExecuter.CurrentActor; if (!avMe) { return; } CmdAttack.SendAiStateHigh(avMe.OwnerId, avMe.ActorId, StateEnum.IDLE); }
public override void Tick() { if (timeSpan < TIME_DELAY) { timeSpan += Time.deltaTime; return; } timeSpan = 0; // 1-恢复[弹药基数AmmoBase] if (Owner.GetLastedTime() >= TIME_SUPPLY) { Owner.RestartTime(); if (_actorBehaviour.AmmoBase < _actorBehaviour.AmmoBaseMax) { _actorBehaviour.AmmoBase++; AmmoSupply output = new AmmoSupply() { RoomId = _actorBehaviour.RoomId, OwnerId = _actorBehaviour.OwnerId, ActorId = _actorBehaviour.ActorId, AmmoBase = _actorBehaviour.AmmoBase, }; GameRoomManager.Instance.SendMsg(ROOM.AmmoSupply, output.ToByteArray()); } } // 2-寻找附近的敌人, 如果有, 且自己弹药满仓, 且自己行动点足够, 且敌人活着, 就干他 // (因为本状态下可以恢复弹药,所以如果只要弹药有1就攻击的话,显得拖拖拉拉) var abEnemy = _actorBehaviour.FindEnemyInRange(); if (abEnemy != null && _actorBehaviour.AmmoBase == _actorBehaviour.AmmoBaseMax && CmdAttack.IsActionPointGranted() && !abEnemy.IsDead) { _actorBehaviour.IsCounterAttack = false; // 这是主动攻击, 不是反击, 记录在自己身上, Stop的时候用 _actorBehaviour.StateMachine.TriggerTransition(StateEnum.FIGHT, 0, abEnemy.ActorId, _actorBehaviour.AttackDuration); } }
private void DoMove(PickInfo piTarget) { // 看看行动点够不够 if (!CmdAttack.IsActionPointGranted()) { string msg = "行动点数不够, 本操作无法执行! "; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); Debug.Log("CmdMarch DoMove Error - " + msg); return; } var pi = CommandManager.Instance.CurrentExecuter; if (pi == null || !pi.CurrentActor) { string msg = $"没有选中任何部队!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); Debug.Log("CmdMarch DoMove Error - " + msg); return; } var avMe = CommandManager.Instance.CurrentExecuter.CurrentActor; if (avMe == null) { return; } HexCell cellTarget = piTarget.CurrentCell; if (!cellTarget) { return; } { var currentCell = avMe.HexUnit.Location; GameRoomManager.Instance.HexmapHelper.hexGrid.FindPath(currentCell, cellTarget, avMe.HexUnit); var hexmapHelper = GameRoomManager.Instance.HexmapHelper; if (!hexmapHelper.hexGrid.HasPath) { return; } // TroopMove output = new TroopMove() // { // RoomId = GameRoomManager.Instance.RoomId, // OwnerId = GameRoomManager.Instance.CurrentPlayer.TokenId, // ActorId = av.ActorId, // PosFromX = av.PosX, // PosFromZ = av.PosZ, // PosToX = cellTarget.coordinates.X, // PosToZ = cellTarget.coordinates.Z, // }; // GameRoomManager.Instance.SendMsg(ROOM.TroopMove, output.ToByteArray()); HexCell newCell = hexmapHelper.hexGrid.GetCell(currentCell.coordinates.X, currentCell.coordinates.Z); HexCell newCell2 = hexmapHelper.hexGrid.GetCell(currentCell.Position); if (newCell.Position != currentCell.Position) { Debug.LogWarning($"OhNo Hexmap!!! - Orgin<{currentCell.coordinates.X},{currentCell.coordinates.Z}> - New<{newCell.coordinates.X},{newCell.coordinates.Z}>"); } if (newCell2.Position != currentCell.Position) { Debug.LogWarning($"OhNo Hexmap 2!!! - Orgin<{currentCell.coordinates.X},{currentCell.coordinates.Z}> - New2<{newCell2.coordinates.X},{newCell2.coordinates.Z}>"); } Debug.Log($"CmdMarch DoMove - From<{avMe.PosX},{avMe.PosZ}> - Dest<{cellTarget.coordinates.X},{cellTarget.coordinates.Z}>"); CmdAttack.SendAiStateHigh(avMe.OwnerId, avMe.ActorId, StateEnum.WALK, cellTarget.Index); } }
private void OnCommandTargetSelected(PickInfo piTarget) { DoMove(piTarget); CmdAttack.TryCommand(); Stop(); }
public void Run() { var pi = CommandManager.Instance.CurrentExecuter; if (pi == null || !pi.CurrentActor) { string msg = $"没有选中任何部队!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); GameRoomManager.Instance.Log("CmdBuildCity Error - " + msg); return; } long creatorId = 0; var av = pi.CurrentActor; if (av != null) { creatorId = av.ActorId; } else { string msg = "没有找到开拓者,无法创建城市!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); GameRoomManager.Instance.Log("CmdBuildCity Error - " + msg); return; } UrbanCity city = GameRoomManager.Instance.RoomLogic.UrbanManager.CreateCityHere(av.HexUnit.Location); if (city == null) { string msg = "这个位置无法创建城市!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); GameRoomManager.Instance.Log("CmdBuildCity Error - " + msg); return; } // 看看行动点够不够 if (!CmdAttack.IsActionPointGranted()) { string msg = "行动点数不够, 本操作无法执行! "; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); Debug.Log("CmdBuildCity Run Error - " + msg); return; } { CityAdd output = new CityAdd() { RoomId = city.RoomId, OwnerId = city.OwnerId, CityId = city.CityId, PosX = city.PosX, PosZ = city.PosZ, CellIndex = city.CellIndex, CityName = city.CityName, CitySize = city.CitySize, CreatorId = creatorId, }; GameRoomManager.Instance.SendMsg(ROOM.CityAdd, output.ToByteArray()); GameRoomManager.Instance.Log("AskBuildCity - 申请创建城市..."); // 消耗行动点 CmdAttack.TryCommand(); } }
private void AI_Running() { if (!GameRoomManager.Instance.IsAiOn) { return; } // 如果本地AI可以控制本单位, 或者是当前玩家自己, 则继续, 否则这里返回 if (!HasAiRights && OwnerId != GameRoomManager.Instance.CurrentPlayer.TokenId) { return; } if (StateMachine.CurrentAiState == StateEnum.IDLE) { float lastedTime = StateMachine.GetLastedTime(); if (lastedTime > _REST_TIME || _first) { // 进入休闲状态超过_REST_TIME秒, 也就是说闲置超过_REST_TIME秒的情况下 _first = false; switch (HighAiState) { case StateEnum.GUARD: StateMachine.TriggerTransition(StateEnum.GUARD); break; case StateEnum.WALKFIGHT: // 敌人死了, 或者我没有弹药了, 而且我已经走到目的地了 var ab = GameRoomManager.Instance.RoomLogic.ActorManager.GetActor(HighAiTargetId); if ((ab == null || ab.IsDead || AmmoBase <= 0) && CellIndex == HighAiTargetCell) { // 结束这个高级AI CmdAttack.SendAiStateHigh(OwnerId, ActorId, StateEnum.IDLE); GameRoomManager.Instance.Log($"ActorBehaviour AI_Running - 结束高级AI:{HighAiState}"); break; } if (AmmoBase <= 0) { // 如果没有弹药了, 则仅仅是走过去 StateMachine.TriggerTransition(StateEnum.WALK, HighAiTargetCell); break; } // 如果可以直接攻击, 则直接攻击, 否则走过去再攻击 if (!ActorWalkFightState.AttackEnemyInRange(this, HighAiTargetId)) { StateMachine.TriggerTransition(StateEnum.WALKFIGHT, HighAiTargetCell, HighAiTargetId); } break; case StateEnum.WALK: // 解决拥堵问题, if (HighAiTargetCell == CellIndex) { // 走到了, 跳出本逻辑 CmdAttack.SendAiStateHigh(OwnerId, ActorId, StateEnum.IDLE); GameRoomManager.Instance.Log($"ActorBehaviour AI_Running - 到达目的地! 结束高级AI:{HighAiState}"); } else { StateMachine.TriggerTransition(StateEnum.WALK, HighAiTargetCell); } break; case StateEnum.HARVEST: HexCell currentCell = HexUnit.Location; HexResource res = currentCell.Res; int amount = res.GetAmount(res.ResType); if (amount == 0) { // 没资源了, 跳出 CmdAttack.SendAiStateHigh(OwnerId, ActorId, StateEnum.IDLE); } else { StateMachine.TriggerTransition(HighAiState, HighAiTargetCell, HighAiTargetId, HighAiDurationTime, HighAiTotalTime); } break; } } } // float range = 100f; // if (StateMachine.CurrentAiState == FSMStateActor.StateEnum.IDLE) // { // float offsetX = Random.Range(-range, range); // float offsetZ = Random.Range(-range, range); // Vector3 newTargetPosition = new Vector3(CurrentPosition.x + offsetX, CurrentPosition.y, CurrentPosition.z + offsetZ); // HexCell newCell = HexUnit.Grid.GetCell(newTargetPosition); // if (newCell != null) // { // if (HexUnit.IsValidDestination(newCell)) // { // SetTarget(newCell.Position); // StateMachine.TriggerTransition(FSMStateActor.StateEnum.WALK); // } // } // } }