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); }
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(); } }
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}"); }
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(); } }