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; }
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; }
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); } } }
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; }
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); }
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; }
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; }
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; }
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); }
public override void WriteResponse(BaseGameResponse response) { CustomActionDispatcher.ResponseOK(response, actionGetter, ProtoBufUtils.Serialize(m_ResponsePacket)); }
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; } }
public virtual void PushResult() { byte[] buffer = CustomActionDispatcher.GeneratePackageStream((int)ActionType.RCRequestResult, ProtoBufUtils.Serialize(m_Response)); GameSession.Get(m_UserId).SendAsync(buffer, 0, buffer.Length); }
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); }