コード例 #1
0
        public override void Process()
        {
            var  newHero = m_Room.Players[m_UserId].Heros.Find(h => h.EntityId == m_Request.NewEntityId);
            var  oldHero = m_Room.Players[m_UserId].Heros.Find(h => h.EntityId == m_Request.OldEntityId);
            long now     = DateTime.UtcNow.Ticks;
            int  newHP   = Mathf.Min(Mathf.RoundToInt(newHero.MaxHP * newHero.RecoverHP * ((now - newHero.LastLeaveBattleTime) / TimeSpan.TicksPerSecond)) + newHero.HP, newHero.MaxHP);

            newHero.HP = newHP;
            oldHero.LastLeaveBattleTime = now;
            RCPushEntitySwitchHero pushPacket = new RCPushEntitySwitchHero()
            {
                PlayerId    = m_UserId,
                NewEntityId = m_Request.NewEntityId,
                OldEntityId = m_Request.OldEntityId,
                HP          = newHP,
            };

            byte[] bufferToOthers = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushEntitySwitchHero, ProtoBufUtils.Serialize(pushPacket));
            foreach (var player in m_Room.Players)
            {
                GameSession.Get(player.Key).SendAsync(bufferToOthers, 0, bufferToOthers.Length);
            }
            m_Room.Players[m_UserId].InBattleEntity = m_Request.NewEntityId;
            TraceLog.Write("{0} switch entity from {1} to {2}, now entity {3} is in battle", m_Room.Players[m_UserId].Name, m_Request.OldEntityId, m_Request.NewEntityId, m_Room.Players[m_UserId].InBattleEntity);
            m_Response.Result = true;
        }
コード例 #2
0
        public override void Process()
        {
            StringBuilder sb = new StringBuilder("Perform Impact:");

            sb.Append(m_Room.Players[m_UserId].Name);
            sb.Append(" impacted ");
            foreach (var player in m_Room.Players)
            {
                if (player.Value.InBattleEntity == m_Request.TargetEntityId)
                {
                    sb.Append(player.Value.Name);
                    m_TargetPlayerId = player.Value.PlayerId;
                }
            }
            sb.Append(":\n");
            foreach (var impact in m_Request.HPDamageImpacts)
            {
                m_TargetHero.HP -= impact.DamageHP;
                if (m_OriginHero != null)
                {
                    m_OriginHero.HP += impact.RecoverHP + impact.SkillRecoverHP - impact.CounterHP;
                    sb.AppendFormat("origin({0}) HP:{1}, target({2}) HP:{3} <=HP Damage Impact=> Damage HP:{4}, Recover HP:{5}, SkillRecoverHP:{6}, CounterHP{7}\n", m_OriginHero.EntityId, m_OriginHero.HP, m_TargetHero.EntityId, m_TargetHero.HP, impact.DamageHP, impact.RecoverHP, impact.SkillRecoverHP, impact.CounterHP);
                }
            }

            foreach (var impact in m_Request.HPRecoverImpacts)
            {
                if (m_OriginHero != null)
                {
                    sb.AppendFormat("origin HP:{0}, target HP:{1} <=HP Recover Impact=> Recover HP:{2}\n", m_OriginHero.HP, m_TargetHero.HP, impact.RecoverHP);
                }
                m_TargetHero.HP += impact.RecoverHP;
            }

            foreach (var impact in m_Request.SteadyDamageImpacts)
            {
                if (m_OriginHero != null)
                {
                    sb.AppendFormat("origin HP:{0}, target HP:{1} <=Steady Damage Impact=> Damage Steady:{2}\n", m_OriginHero.HP, m_TargetHero.HP, impact.DamageSteady);
                }
            }
            TraceLog.Write(sb.ToString());
            byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushEntityImpact, ProtoBufUtils.Serialize(ToRCPushEntityImpact(m_Request)));
            foreach (var player in m_Room.Players)
            {
                GameSession.Get(player.Key).SendAsync(buffer, 0, buffer.Length);
            }
            if (m_TargetHero.HP <= 0)
            {
                RCPushEntityDie packet = new RCPushEntityDie();
                packet.DeadEntityId = m_TargetHero.EntityId;
                packet.PlayerId     = m_TargetPlayerId;
                byte[] bytes = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushEntityHeroDie, ProtoBufUtils.Serialize(packet));
                foreach (var player in m_Room.Players)
                {
                    GameSession.Get(player.Key).SendAsync(bytes, 0, bytes.Length);
                }
            }
            m_Response.Result = true;
        }
コード例 #3
0
        public void UpdateWaiting()
        {
            List <int> gaveUpPlayers = new List <int>();

            if (DateTime.UtcNow.Ticks - m_Room.CreateTime > Constants.WaitingConnectTimeLimit * TimeSpan.TicksPerSecond)
            {
                foreach (var player in m_Room.Players)
                {
                    if (player.Value.State != RoomPlayerState.Playing)
                    {
                        gaveUpPlayers.Add(player.Key);
                    }
                }
                if (gaveUpPlayers.Count == m_Room.Players.Count)
                {
                    RoomManager.GetInstance(m_Room.Id).CloseRoom();
                    return;
                }
                else if (gaveUpPlayers.Count > 0)
                {
                    m_Room.StartTime = DateTime.UtcNow.Ticks;
                    foreach (var rp in m_Room.Players)
                    {
                        RCPushRoomReady packet = new RCPushRoomReady()
                        {
                            StartTime = m_Room.StartTime
                        };
                        byte[] buffer = CustomActionDispatcher.GeneratePackageStream(4002, ProtoBufUtils.Serialize(packet));
                        GameSession.Get(rp.Value.PlayerId).SendAsync(buffer, 0, buffer.Length);
                    }
                    RoomManager.GetInstance(m_Room.Id).PlayerGaveUp(gaveUpPlayers[0]);
                    return;
                }
            }

            bool allReady = true;

            foreach (var player in m_Room.Players)
            {
                if (player.Value.State != RoomPlayerState.Playing)
                {
                    allReady = false;
                }
            }
            if (allReady)
            {
                m_Room.StartTime = DateTime.UtcNow.Ticks;
                m_Room.State     = RoomState.Running;
                foreach (var rp in m_Room.Players)
                {
                    RCPushRoomReady packet = new RCPushRoomReady()
                    {
                        StartTime = m_Room.StartTime
                    };
                    byte[] buffer = CustomActionDispatcher.GeneratePackageStream(4002, ProtoBufUtils.Serialize(packet));
                    GameSession.Get(rp.Value.PlayerId).SendAsync(buffer, 0, buffer.Length);
                }
            }
        }
コード例 #4
0
 public override void Process()
 {
     byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushEntityRemoveBuff, ProtoBufUtils.Serialize(ToRCPushEntityRemoveBuff(m_Request)));
     foreach (var player in m_Room.Players)
     {
         GameSession.Get(player.Key).SendAsync(buffer, 0, buffer.Length);
     }
     m_Response.Result = true;
 }
コード例 #5
0
        public override void Process()
        {
            RCGiveUpBattle response = new RCGiveUpBattle();

            byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType, ProtoBufUtils.Serialize(response));
            m_Session.SendAsync(buffer, 0, buffer.Length);
            RoomManager rm = RoomManager.GetInstance(m_Room.Id);

            rm.PlayerGaveUp(m_UserId);
        }
コード例 #6
0
        public override void Process()
        {
            RCPushEntitySkillRushing pushPacket = new RCPushEntitySkillRushing()
            {
                EntityId  = m_Request.EntityId,
                SkillId   = m_Request.SkillId,
                Transform = m_Request.Transform,
                PlayerId  = m_UserId,
            };

            byte[] bufferToOthers = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushEntitySkillRushing, ProtoBufUtils.Serialize(pushPacket));
            TraceLog.Write("{0} is performing rushing skill:{1} at {2},{3},{4}", m_Room.Players[m_UserId].Name, m_Request.SkillId, m_Request.Transform.PositionX, m_Request.Transform.PositionY, m_Request.Transform.Rotation);
            foreach (var player in m_Room.Players)
            {
                GameSession.Get(player.Key).SendAsync(bufferToOthers, 0, bufferToOthers.Length);
            }
            m_Response.Result = true;
        }
コード例 #7
0
        public override void Process()
        {
            RCPushEntityPerformSkillStart response = new RCPushEntityPerformSkillStart()
            {
                EntityId  = m_Request.EntityId,
                Transform = m_Request.Transform,
                SkillId   = m_Request.SkillId,
                PlayerId  = m_UserId,
            };

            byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushEntityPerformSkillStart, ProtoBufUtils.Serialize(response));
            TraceLog.Write("{0}'s Skill:{1} was started at {2},{3},{4}", m_Room.Players[m_UserId].Name, m_Request.SkillId, m_Request.Transform.PositionX, m_Request.Transform.PositionY, m_Request.Transform.Rotation);
            foreach (var player in m_Room.Players)
            {
                GameSession.Get(player.Key).SendAsync(buffer, 0, buffer.Length);
            }
            m_Response.Result = true;
        }
コード例 #8
0
        public override void Process()
        {
            RCPushEntityMove response = new RCPushEntityMove()
            {
                EntityId  = m_Request.EntityId,
                Transform = m_Request.Transform,
                PlayerId  = m_UserId
            };
            var movingPlayer = m_Room.Players[m_UserId];

            movingPlayer.PositionX = m_Request.Transform.PositionX;
            movingPlayer.PositionY = m_Request.Transform.PositionY;
            movingPlayer.Rotation  = m_Request.Transform.Rotation;
            byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushEntityMove, ProtoBufUtils.Serialize(response));
            foreach (var player in m_Room.Players)
            {
                GameSession.Get(player.Key).SendAsync(buffer, 0, buffer.Length);
            }
            m_LastPushTime    = DateTime.UtcNow.Ticks;
            m_Response.Result = true;
        }
コード例 #9
0
        public override bool Verify(Message message)
        {
            m_Request = message.Packet as CRGetRoomInfo;
            m_Session = message.Session;
            if (m_Room.Token != m_Request.Token)
            {
                CustomActionDispatcher.PushError((int)ActionType, message.Session, (int)ErrorType.WrongToken, "Token error");
                return(false);
            }
            bool InRoom = false;

            if (m_Room.Players.ContainsKey(m_Request.PlayerId))
            {
                InRoom = true;
            }
            if (!InRoom)
            {
                CustomActionDispatcher.PushError((int)ActionType, message.Session, (int)ErrorType.WrongUserId, "RoomId or UserId error");
                return(false);
            }
            return(true);
        }
コード例 #10
0
ファイル: Action101.cs プロジェクト: JoeChen999/scut
 public override void WriteResponse(BaseGameResponse response)
 {
     CustomActionDispatcher.ResponseOK(response, actionGetter, ProtoBufUtils.Serialize(m_ResponsePacket));
 }
コード例 #11
0
        public void UpdateFinish()
        {
            if (DateTime.UtcNow.Ticks - m_Room.StartTime > Constants.RoomExpireTime * TimeSpan.TicksPerSecond)
            {
                RWPvpResult result = new RWPvpResult();
                foreach (var player in m_Room.Players)
                {
                    result.PlayerIds.Add(player.Value.PlayerId);
                    result.ServerId.Add(player.Value.ServerId);
                    result.Result.Add((int)player.Value.State);
                    var session = GameSession.Get(player.Key);
                    if (session != null)
                    {
                        session.Close();
                    }
                }
                if (result.PlayerIds.Count > 0)
                {
                    LobbyServerSender.Send("RWPvpResultHandler", result, callback => { });
                }
                RoomManager.GetInstance(m_Room.Id).CloseRoom();
                return;
            }
            RWPvpResult resultPacket = new RWPvpResult();

            foreach (var player in m_Room.Players)
            {
                if (player.Value.State == RoomPlayerState.Winned || player.Value.State == RoomPlayerState.Failed || player.Value.State == RoomPlayerState.Draw)
                {
                    resultPacket.PlayerIds.Add(player.Value.PlayerId);
                    resultPacket.ServerId.Add(player.Value.ServerId);
                    resultPacket.Result.Add((int)player.Value.State);
                    var session = GameSession.Get(player.Value.PlayerId);
                    if (session != null)
                    {
                        RCPushBattleResult packet = new RCPushBattleResult()
                        {
                            Result = (int)player.Value.State,
                            Reason = (int)m_Room.EndReason,
                        };
                        byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCPushBattleResult, ProtoBufUtils.Serialize(packet));
                        session.SendAsync(buffer, 0, buffer.Length);
                    }
                    player.Value.State = RoomPlayerState.Exited;
                }
                else
                {
                    continue;
                }
            }
            if (resultPacket.PlayerIds.Count > 1)
            {
                TraceLog.WriteInfo("Player1:{0},win=>{1}\nPlayer2:{2},win=>{3}", resultPacket.PlayerIds[0], resultPacket.Result[0], resultPacket.PlayerIds[1], resultPacket.Result[1]);
                LobbyServerSender.Send("RWPvpResultHandler", resultPacket, callback => { });
            }

            bool allExited = true;

            foreach (var player in m_Room.Players)
            {
                if (player.Value.State != RoomPlayerState.Exited)
                {
                    allExited = false;
                }
            }
            if (allExited)
            {
                RoomManager.GetInstance(m_Room.Id).CloseRoom();
                return;
            }
        }
コード例 #12
0
 public virtual void PushResult()
 {
     byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCRequestResult, ProtoBufUtils.Serialize(m_Response));
     GameSession.Get(m_UserId).SendAsync(buffer, 0, buffer.Length);
 }
コード例 #13
0
        public override void Process()
        {
            TraceLog.WriteInfo("Start get room info process");
            RCGetRoomInfo response = new RCGetRoomInfo();

            response.RoomInfo = new PBRoomInfo()
            {
                Id        = m_Room.Id,
                StartTime = m_Room.StartTime,
                State     = (int)m_Room.State
            };
            RoomSessionUser user = new RoomSessionUser(m_Request.PlayerId, m_Request.RoomId);

            user.Online(m_Session);

            foreach (var roomPlayer in m_Room.Players)
            {
                PBRoomPlayerInfo rp = new PBRoomPlayerInfo();
                rp.PlayerInfo = new PBPlayerInfo()
                {
                    Id           = roomPlayer.Value.PlayerId,
                    Name         = roomPlayer.Value.Name,
                    Level        = roomPlayer.Value.Level,
                    VipLevel     = roomPlayer.Value.VipLevel,
                    PortraitType = roomPlayer.Value.PortraitType,
                    PositionX    = roomPlayer.Value.PositionX,
                    PositionY    = roomPlayer.Value.PositionY,
                    Rotation     = roomPlayer.Value.Rotation,
                };
                foreach (var hero in roomPlayer.Value.Heros)
                {
                    PBLobbyHeroInfo lh = new PBLobbyHeroInfo()
                    {
                        Type = hero.HeroType,
                    };
                    lh.SkillLevels.AddRange(hero.Skills);

                    PBRoomHeroInfo rh = new PBRoomHeroInfo()
                    {
                        EntityId                 = hero.EntityId,
                        LobbyHeroInfo            = lh,
                        HP                       = hero.HP,
                        MaxHP                    = hero.MaxHP,
                        PhysicalAttack           = hero.PhysicalAttack,
                        PhysicalDefense          = hero.PhysicalDefense,
                        MagicAttack              = hero.MagicAttack,
                        MagicDefense             = hero.MagicDefense,
                        PhysicalAtkHPAbsorbRate  = hero.PhysicalAtkHPAbsorbRate,
                        PhysicalAtkReflectRate   = hero.PhysicalAtkReflectRate,
                        MagicAtkHPAbsorbRate     = hero.MagicAtkHPAbsorbRate,
                        MagicAtkReflectRate      = hero.MagicAtkReflectRate,
                        CriticalHitProb          = hero.CriticalHitProb,
                        CriticalHitRate          = hero.CriticalHitRate,
                        OppPhysicalDfsReduceRate = hero.OppPhysicalDfsReduceRate,
                        OppMagicDfsReduceRate    = hero.OppMagicDfsReduceRate,
                        DamageReductionRate      = hero.DamageReductionRate,
                        AntiCriticalHitProb      = hero.AntiCriticalHitProb,
                        AdditionalDamage         = hero.AdditionalDamage,
                        RecoverHP                = hero.RecoverHP,
                        ReducedSkillCoolDownRate = hero.ReducedSkillCoolDownRate,
                        HeroSwitchCoolDownRate   = hero.ReduceSwitchHeroCoolDownRate,
                        Camp                     = roomPlayer.Value.Camp,
                    };
                    rp.RoomHeroInfo.Add(rh);
                }
                response.RoomInfo.RoomPlayerInfo.Add(rp);
            }
            byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType, ProtoBufUtils.Serialize(response));
            m_Session.SendAsync(buffer, 0, buffer.Length);
        }