Пример #1
0
    private void OnActorRemoveReply(byte[] bytes)
    {
        ActorRemoveReply input = ActorRemoveReply.Parser.ParseFrom(bytes);

        if (!input.Ret)
        {
            string msg = $"销毁Actor失败!{input.ActorId}";
            GameRoomManager.Instance.Log("MSG: OnActorRemoveReply Error - " + msg);
        }
        else
        {
            PanelRoomMain.Instance.RemoveSelection(input.ActorId); // 如果该单位被选中,要取消选中
            if (input.DieType == 0)
            {                                                      // 自然死亡, 部队解散
                GameRoomManager.Instance.HexmapHelper.DestroyUnit(input.ActorId);
                string msg = $"成功解散部队!{input.ActorId}";
                GameRoomManager.Instance.Log("MSG: OnActorRemoveReply - OK " + msg);
            }
            else if (input.DieType == 1)
            { // 战斗致死, 这时候先不删除该单元,而是要等动画结束以后再删除
                var ab = ActorManager.GetActor(input.ActorId);
                if (ab == null)
                {
                    return;
                }
                ab.StateMachine.TriggerTransition(StateEnum.DIE);
                GameRoomManager.Instance.Log($"MSG: OnActorRemoveReply - OK - {ab.Name}:{ab.ActorId} 被杀死!");
            }
        }
    }
Пример #2
0
    private void OnCityAdd(SocketAsyncEventArgs args, byte[] bytes)
    {
        CityAdd input = CityAdd.Parser.ParseFrom(bytes);

        if (input.RoomId != RoomId)
        {
            return; // 不是自己房间的消息,略过
        }
        // 删除建造城市的开拓者
        {
            bool ret = ActorManager.RemoveActor(input.CreatorId);

            ActorRemoveReply output = new ActorRemoveReply()
            {
                RoomId  = input.RoomId,
                OwnerId = input.OwnerId,
                ActorId = input.CreatorId,
                Ret     = ret,
            };
            BroadcastMsg(ROOM_REPLY.ActorRemoveReply, output.ToByteArray());
        }

        if (input.CellIndex == 0)
        {
            Debug.LogError("OnCityAdd F**k!!! City position is lost!!!");
        }

        bool      isCapiirtal = UrbanManager.CountOfThePlayer(input.OwnerId) == 0; // 第一座城市是都城
        UrbanCity city        = new UrbanCity()
        {
            RoomId    = input.RoomId,
            OwnerId   = input.OwnerId,
            CityId    = input.CityId,
            PosX      = input.PosX,
            PosZ      = input.PosZ,
            CellIndex = input.CellIndex,
            CityName  = input.CityName,
            CitySize  = input.CitySize,
            IsCapital = isCapiirtal,
        };

        UrbanManager.AddCity(city);

        {
            CityAddReply output = new CityAddReply()
            {
                RoomId    = input.RoomId,
                OwnerId   = input.OwnerId,
                CityId    = input.CityId,
                PosX      = input.PosX,
                PosZ      = input.PosZ,
                CellIndex = input.CellIndex,
                CityName  = input.CityName,
                CitySize  = input.CitySize,
                IsCapital = isCapiirtal,
                Ret       = true,
            };
            BroadcastMsg(ROOM_REPLY.CityAddReply, output.ToByteArray());
        }
    }
Пример #3
0
    private void OnActorRemove(SocketAsyncEventArgs args, byte[] bytes)
    {
        ActorRemove input = ActorRemove.Parser.ParseFrom(bytes);

        if (input.RoomId != _roomId)
        {
            return;
        }

        bool ret = ActorManager.RemoveActor(input.ActorId);

        ActorRemoveReply output = new ActorRemoveReply()
        {
            RoomId  = input.RoomId,
            OwnerId = input.OwnerId,
            ActorId = input.ActorId,
            Ret     = ret,
        };

        BroadcastMsg(ROOM_REPLY.ActorRemoveReply, output.ToByteArray());
    }
Пример #4
0
    /// <summary>
    /// 注意,因为这条消息里有删除Actor的操作,所以不能放在ActorBehaviour里去响应,除非找到更好的方法.Nov.15.2019. Liu Gang.
    /// </summary>
    /// <param name="args"></param>
    /// <param name="bytes"></param>
    private void OnFightStop(SocketAsyncEventArgs args, byte[] bytes)
    {
        FightStop input = FightStop.Parser.ParseFrom(bytes);

        if (input.RoomId != RoomId)
        {
            return; // 不是自己房间的消息,略过
        }
        /////////////////
        // 1-攻击者
        var attacker = ActorManager.GetActor(input.ActorId);

        if (attacker == null)
        {
            FightStopReply output = new FightStopReply()
            {
                RoomId  = input.RoomId,
                OwnerId = input.OwnerId,
                ActorId = input.ActorId,
                Ret     = false,
                ErrMsg  = "Attacker not found!",
            };
            ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray());
            return;
        }

        // 2-防御者
        var defender = ActorManager.GetActor(input.TargetId);

        if (defender == null)
        {
            FightStopReply output = new FightStopReply()
            {
                RoomId  = input.RoomId,
                OwnerId = input.OwnerId,
                ActorId = input.ActorId,
                Ret     = false,
                ErrMsg  = "Defender not found!",
            };
            ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray());
            return;
        }

        // 3-计算弹药基数
        bool isFightAgain = false;

        if (attacker.AmmoBase <= 0)
        { // 3.1-弹药基数不足, 无法攻击
            attacker.AmmoBase = 0;
            FightStopReply output = new FightStopReply()
            {
                RoomId  = input.RoomId,
                OwnerId = input.OwnerId,
                ActorId = input.ActorId,
                Ret     = false,
                ErrMsg  = "弹药基数不足!",
            };
            ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray());
            return;
        }
        else
        {
            attacker.AmmoBase--;
            // 弹药充足, 并且这不是反击的情况下, 允许攻击下一轮
            if (attacker.AmmoBase > 0 && !input.IsCounterAttack)
            {
                isFightAgain = true;
            }
        }

        // 4-战斗计算 - 减法公式
        int damage = (int)Mathf.FloorToInt(attacker.AttackPower - defender.DefencePower);

        if (input.IsCounterAttack) // 如果是反击,则仅计算60%的伤害
        {
            damage = Mathf.FloorToInt(damage * 0.6f);
        }
        if (damage == 0)
        {
            damage = 1;
        }
        defender.Hp = defender.Hp - damage;


        // 5-如果已经死亡
        bool isEnemyDead = false;

        if (defender.Hp <= 0)
        {
            defender.Hp  = 0;
            isEnemyDead  = true;
            isFightAgain = false;
            ServerRoomManager.Instance.Log($"RoomLogic OnFightStop 1 - {attacker.ActorId} killed {defender.ActorId}");
        }

        /////////////////
        {// 10-挨打者的血量, 群发,
            UpdateActorInfoReply output = new UpdateActorInfoReply()
            {
                RoomId   = defender.RoomId,
                OwnerId  = defender.OwnerId,
                ActorId  = defender.ActorId,
                Hp       = defender.Hp,
                AmmoBase = defender.AmmoBase,
                Ret      = true,
            };
            BroadcastMsg(ROOM_REPLY.UpdateActorInfoReply, output.ToByteArray());
        }
        {// 11-攻击者的弹药基数, 群发,
            UpdateActorInfoReply output = new UpdateActorInfoReply()
            {
                RoomId   = attacker.RoomId,
                OwnerId  = attacker.OwnerId,
                ActorId  = attacker.ActorId,
                Hp       = attacker.Hp,
                AmmoBase = attacker.AmmoBase,
                Ret      = true,
            };
            BroadcastMsg(ROOM_REPLY.UpdateActorInfoReply, output.ToByteArray());
        }
        {// 12-飙血, 群发
            SprayBloodReply output = new SprayBloodReply()
            {
                RoomId  = defender.RoomId,
                OwnerId = defender.OwnerId,
                ActorId = defender.ActorId,
                Damage  = damage,
                Ret     = true,
            };
            BroadcastMsg(ROOM_REPLY.SprayBloodReply, output.ToByteArray());
            ServerRoomManager.Instance.Log($"飙血 - {defender.ActorId}");
        }

        /////////////////
        {// 20-本次攻击结束
            FightStopReply output = new FightStopReply()
            {
                RoomId      = input.RoomId,
                OwnerId     = input.OwnerId,
                ActorId     = input.ActorId,
                TargetId    = input.TargetId,
                IsEnemyDead = isEnemyDead,
                FightAgain  = isFightAgain,
                Ret         = true,
            };
            ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray());
        }

        if (isEnemyDead)
        {// 21-挨打者死了, 发送删除单位的消息
            ActorRemoveReply output = new ActorRemoveReply()
            {
                RoomId  = defender.RoomId,
                OwnerId = defender.OwnerId,
                ActorId = defender.ActorId,
                DieType = 1,
                Ret     = true,
            };
            ActorManager.RemoveActor(defender.ActorId);
            BroadcastMsg(ROOM_REPLY.ActorRemoveReply, output.ToByteArray());
            ServerRoomManager.Instance.Log($"RoomLogic OnFightStop 2 - {attacker.ActorId} killed {defender.ActorId}");
        }
    }