From 210a2958ffb09d225bb3b456eac6a67e4f4ca094 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 6 Jul 2017 11:01:31 -0400 Subject: [PATCH] Let ServerPacket Handle the writting of packet data. --- Game/Achievements/AchievementManager.cs | 1 + Game/BattleGrounds/BattleGround.cs | 3 +- Game/Entities/Player/Player.Combat.cs | 5 ++- Game/Entities/Player/Player.cs | 8 ++--- Game/Entities/Player/SceneMgr.cs | 4 +-- Game/Entities/Player/SocialMgr.cs | 4 +-- Game/Entities/Unit/Unit.Fields.cs | 4 +-- Game/Groups/Group.cs | 18 ++++------ Game/Guilds/Guild.cs | 9 ++--- Game/Guilds/GuildFinderManager.cs | 2 +- Game/Handlers/DuelHandler.cs | 5 ++- Game/Maps/Map.cs | 17 ++++------ Game/Network/Packet.cs | 45 +++++++++++++++++-------- Game/Network/WorldSocket.cs | 13 +++---- Game/OutdoorPVP/OutdoorPvP.cs | 3 +- Game/Server/WorldManager.cs | 3 +- Game/Server/WorldSession.cs | 4 +-- Game/Spells/SpellEffects.cs | 5 ++- 18 files changed, 73 insertions(+), 80 deletions(-) diff --git a/Game/Achievements/AchievementManager.cs b/Game/Achievements/AchievementManager.cs index a12e4eae9..dbfab7fda 100644 --- a/Game/Achievements/AchievementManager.cs +++ b/Game/Achievements/AchievementManager.cs @@ -637,6 +637,7 @@ namespace Game.Achievements achievementEarned.EarnerNativeRealm = achievementEarned.EarnerVirtualRealm = Global.WorldMgr.GetVirtualRealmAddress(); achievementEarned.AchievementID = achievement.Id; achievementEarned.Time = Time.UnixTime; + if (!achievement.Flags.HasAnyFlag(AchievementFlags.TrackingFlag)) _owner.SendMessageToSetInRange(achievementEarned, WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay), true); else diff --git a/Game/BattleGrounds/BattleGround.cs b/Game/BattleGrounds/BattleGround.cs index 21fdc5ce9..84314a57a 100644 --- a/Game/BattleGrounds/BattleGround.cs +++ b/Game/BattleGrounds/BattleGround.cs @@ -349,13 +349,12 @@ namespace Game.BattleGrounds timer.Type = TimerType.Pvp; timer.TimeRemaining = countdownMaxForBGType - (GetElapsedTime() / 1000); timer.TotalTime = countdownMaxForBGType; - timer.Write(); foreach (var guid in GetPlayers().Keys) { Player player = Global.ObjAccessor.FindPlayer(guid); if (player) - player.SendPacket(timer, false); + player.SendPacket(timer); } m_CountdownTimer = 0; diff --git a/Game/Entities/Player/Player.Combat.cs b/Game/Entities/Player/Player.Combat.cs index 3cb8fa928..ccdf044d1 100644 --- a/Game/Entities/Player/Player.Combat.cs +++ b/Game/Entities/Player/Player.Combat.cs @@ -376,11 +376,10 @@ namespace Game.Entities DuelComplete duelCompleted = new DuelComplete(); duelCompleted.Started = type != DuelCompleteType.Interrupted; - duelCompleted.Write(); - SendPacket(duelCompleted, false); + SendPacket(duelCompleted); if (duel.opponent.GetSession() != null) - duel.opponent.SendPacket(duelCompleted, false); + duel.opponent.SendPacket(duelCompleted); if (type != DuelCompleteType.Interrupted) { diff --git a/Game/Entities/Player/Player.cs b/Game/Entities/Player/Player.cs index 11b2d0af8..f509ef603 100644 --- a/Game/Entities/Player/Player.cs +++ b/Game/Entities/Player/Player.cs @@ -982,9 +982,9 @@ namespace Game.Entities new PlayerAI GetAI() { return (PlayerAI)i_AI; } //Network - public void SendPacket(ServerPacket data, bool writePacket = true) + public void SendPacket(ServerPacket data) { - Session.SendPacket(data, writePacket); + Session.SendPacket(data); } //Time @@ -5298,6 +5298,8 @@ namespace Game.Entities if (WorldConfig.GetBoolValue(WorldCfg.AlwaysMaxskill)) // Max weapon skill when leveling up UpdateSkillsToMaxSkillsForLevel(); + _ApplyAllLevelScaleItemMods(true); // Moved to above SetFullHealth so player will have full health from Heirlooms + // set current level health and mana/energy to maximum after applying all mods. SetFullHealth(); SetPower(PowerType.Mana, GetMaxPower(PowerType.Mana)); @@ -5306,8 +5308,6 @@ namespace Game.Entities SetPower(PowerType.Rage, GetMaxPower(PowerType.Rage)); SetPower(PowerType.Focus, 0); - _ApplyAllLevelScaleItemMods(true); - // update level to hunter/summon pet Pet pet = GetPet(); if (pet) diff --git a/Game/Entities/Player/SceneMgr.cs b/Game/Entities/Player/SceneMgr.cs index 0873a4c78..a34f503de 100644 --- a/Game/Entities/Player/SceneMgr.cs +++ b/Game/Entities/Player/SceneMgr.cs @@ -64,7 +64,7 @@ namespace Game.Entities playScene.Location = position; playScene.TransportGUID = GetPlayer().GetTransGUID(); - GetPlayer().SendPacket(playScene, true); + GetPlayer().SendPacket(playScene); AddInstanceIdToSceneMap(sceneInstanceID, sceneTemplate); @@ -91,7 +91,7 @@ namespace Game.Entities CancelScene cancelScene = new CancelScene(); cancelScene.SceneInstanceID = sceneInstanceID; - GetPlayer().SendPacket(cancelScene, true); + GetPlayer().SendPacket(cancelScene); } public void OnSceneTrigger(uint sceneInstanceID, string triggerName) diff --git a/Game/Entities/Player/SocialMgr.cs b/Game/Entities/Player/SocialMgr.cs index 44a08c0ca..88c2feb82 100644 --- a/Game/Entities/Player/SocialMgr.cs +++ b/Game/Entities/Player/SocialMgr.cs @@ -94,8 +94,6 @@ namespace Game.Entities if (!player) return; - packet.Write(); - AccountTypes gmSecLevel = (AccountTypes)WorldConfig.GetIntValue(WorldCfg.GmLevelInWhoList); foreach (var pair in _socialMap) { @@ -114,7 +112,7 @@ namespace Game.Entities continue; if (player.IsVisibleGloballyFor(target)) - session.SendPacket(packet, false); + session.SendPacket(packet); } } } diff --git a/Game/Entities/Unit/Unit.Fields.cs b/Game/Entities/Unit/Unit.Fields.cs index 9d3c9885b..b1dfddaac 100644 --- a/Game/Entities/Unit/Unit.Fields.cs +++ b/Game/Entities/Unit/Unit.Fields.cs @@ -562,8 +562,6 @@ namespace Game.Entities i_source = src; i_message = msg; i_distSq = dist; - - i_message.Write(); } bool IsInRangeHelper(WorldObject obj) @@ -636,7 +634,7 @@ namespace Game.Entities if (!player.IsAdvancedCombatLoggingEnabled()) i_message.DisableAdvancedCombatLogging(); - player.SendPacket(i_message, false); + player.SendPacket(i_message); } WorldObject i_source; diff --git a/Game/Groups/Group.cs b/Game/Groups/Group.cs index fb7916463..bf3d70405 100644 --- a/Game/Groups/Group.cs +++ b/Game/Groups/Group.cs @@ -823,7 +823,6 @@ namespace Game.Groups lootRoll.Roll = rollNumber; lootRoll.RollType = rollType; roll.FillPacket(lootRoll.Item); - lootRoll.Write(); foreach (var pair in roll.playerVote) { @@ -832,7 +831,7 @@ namespace Game.Groups continue; if (pair.Value != RollType.NotValid) - p.SendPacket(lootRoll, false); + p.SendPacket(lootRoll); } } @@ -845,7 +844,6 @@ namespace Game.Groups lootRollWon.RollType = rollType; roll.FillPacket(lootRollWon.Item); lootRollWon.MainSpec = true; // offspec rolls not implemented - lootRollWon.Write(); foreach (var pair in roll.playerVote) { @@ -854,7 +852,7 @@ namespace Game.Groups continue; if (pair.Value != RollType.NotValid) - p.SendPacket(lootRollWon, false); + p.SendPacket(lootRollWon); } } @@ -863,7 +861,6 @@ namespace Game.Groups LootAllPassed lootAllPassed = new LootAllPassed(); lootAllPassed.LootObj = roll.getTarget().GetGUID(); roll.FillPacket(lootAllPassed.Item); - lootAllPassed.Write(); foreach (var pair in roll.playerVote) { @@ -872,7 +869,7 @@ namespace Game.Groups continue; if (pair.Value != RollType.NotValid) - player.SendPacket(lootAllPassed, false); + player.SendPacket(lootAllPassed); } } @@ -881,7 +878,6 @@ namespace Game.Groups LootRollsComplete lootRollsComplete = new LootRollsComplete(); lootRollsComplete.LootObj = roll.getTarget().GetGUID(); lootRollsComplete.LootListID = (byte)(roll.itemSlot + 1); - lootRollsComplete.Write(); foreach (var pair in roll.playerVote) { @@ -890,7 +886,7 @@ namespace Game.Groups continue; if (pair.Value != RollType.NotValid) - player.SendPacket(lootRollsComplete, false); + player.SendPacket(lootRollsComplete); } } @@ -1443,13 +1439,12 @@ namespace Game.Groups PartyMemberState packet = new PartyMemberState(); packet.Initialize(player); - packet.Write(); for (GroupReference refe = GetFirstMember(); refe != null; refe = refe.next()) { Player member = refe.GetSource(); if (member && member != player && (!member.IsInMap(player) || !member.IsWithinDist(player, member.GetSightRange(), false))) - member.SendPacket(packet, false); + member.SendPacket(packet); } } @@ -1469,7 +1464,6 @@ namespace Game.Groups public void BroadcastPacket(ServerPacket packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignore = default(ObjectGuid)) { - packet.Write(); for (GroupReference refe = GetFirstMember(); refe != null; refe = refe.next()) { Player player = refe.GetSource(); @@ -1477,7 +1471,7 @@ namespace Game.Groups continue; if (player.GetSession() != null && (group == -1 || refe.getSubGroup() == group)) - player.SendPacket(packet, false); + player.SendPacket(packet); } } diff --git a/Game/Guilds/Guild.cs b/Game/Guilds/Guild.cs index a9718dc3a..bd0791011 100644 --- a/Game/Guilds/Guild.cs +++ b/Game/Guilds/Guild.cs @@ -1402,39 +1402,36 @@ namespace Game.Guilds public void BroadcastPacketToRank(ServerPacket packet, byte rankId) { - packet.Write(); foreach (var member in m_members.Values) { if (member.IsRank(rankId)) { Player player = member.FindPlayer(); if (player != null) - player.SendPacket(packet, false); + player.SendPacket(packet); } } } public void BroadcastPacket(ServerPacket packet) { - packet.Write(); foreach (var member in m_members.Values) { Player player = member.FindPlayer(); if (player != null) - player.SendPacket(packet, false); + player.SendPacket(packet); } } public void BroadcastPacketIfTrackingAchievement(ServerPacket packet, uint criteriaId) { - packet.Write(); foreach (var member in m_members.Values) { if (member.IsTrackingCriteriaId(criteriaId)) { Player player = member.FindPlayer(); if (player) - player.SendPacket(packet, false); + player.SendPacket(packet); } } } diff --git a/Game/Guilds/GuildFinderManager.cs b/Game/Guilds/GuildFinderManager.cs index 93bffadf6..ef58ab83f 100644 --- a/Game/Guilds/GuildFinderManager.cs +++ b/Game/Guilds/GuildFinderManager.cs @@ -342,7 +342,7 @@ namespace Game.Guilds Player player = Global.ObjAccessor.FindPlayer(guild.GetLeaderGUID()); if (player) - player.SendPacket(applicantListChanged, false); + player.SendPacket(applicantListChanged); } void SendMembershipRequestListUpdate(Player player) diff --git a/Game/Handlers/DuelHandler.cs b/Game/Handlers/DuelHandler.cs index 3f4735a93..7b4d5b010 100644 --- a/Game/Handlers/DuelHandler.cs +++ b/Game/Handlers/DuelHandler.cs @@ -74,10 +74,9 @@ namespace Game plTarget.duel.startTimer = now; DuelCountdown packet = new DuelCountdown(3000); - packet.Write(); - player.SendPacket(packet, false); - plTarget.SendPacket(packet, false); + player.SendPacket(packet); + plTarget.SendPacket(packet); } void HandleDuelCancelled() diff --git a/Game/Maps/Map.cs b/Game/Maps/Map.cs index 5cec3134c..3fd4bc2ec 100644 --- a/Game/Maps/Map.cs +++ b/Game/Maps/Map.cs @@ -785,10 +785,10 @@ namespace Game.Maps obj.BuildOutOfRangeUpdateBlock(data); UpdateObject packet; data.BuildPacket(out packet); - packet.Write(); + foreach (var pl in players) if (pl.GetTransport() != obj) - pl.SendPacket(packet, false); + pl.SendPacket(packet); } if (!_transports.Contains(obj)) @@ -2215,9 +2215,8 @@ namespace Game.Maps public void SendToPlayers(ServerPacket data) { - data.Write(); foreach (Player pl in m_activePlayers) - pl.SendPacket(data, false); + pl.SendPacket(data); } public bool ActiveObjectsNearGrid(Grid grid) @@ -2653,11 +2652,10 @@ namespace Game.Maps if (!players.Empty()) { PlayMusic data = new PlayMusic(musicId); - data.Write(); foreach (var player in players) if (player.GetZoneId() == zoneId) - player.SendPacket(data, false); + player.SendPacket(data); } } @@ -2674,10 +2672,10 @@ namespace Game.Maps if (!players.Empty()) { WeatherPkt weather = new WeatherPkt(weatherId, weatherGrade); - weather.Write(); + foreach (var player in players) if (player.GetZoneId() == zoneId) - player.SendPacket(weather, false); + player.SendPacket(weather); } } @@ -2697,11 +2695,10 @@ namespace Game.Maps overrideLight.AreaLightID = _defaultLight; overrideLight.OverrideLightID = lightId; overrideLight.TransitionMilliseconds = fadeInTime; - overrideLight.Write(); foreach (var player in players) if (player.GetZoneId() == zoneId) - player.SendPacket(overrideLight, false); + player.SendPacket(overrideLight); } } diff --git a/Game/Network/Packet.cs b/Game/Network/Packet.cs index 8f81fd93e..6f7df2003 100644 --- a/Game/Network/Packet.cs +++ b/Game/Network/Packet.cs @@ -29,13 +29,13 @@ namespace Game.Network _worldPacket = worldPacket; } + public abstract void Read(); + public void Dispose() { _worldPacket.Dispose(); } - public abstract void Read(); - public ClientOpcodes GetOpcode() { return (ClientOpcodes)_worldPacket.GetOpcode(); } public void LogPacket(WorldSession session) @@ -46,7 +46,7 @@ namespace Game.Network protected WorldPacket _worldPacket; } - public abstract class ServerPacket : IDisposable + public abstract class ServerPacket { public ServerPacket(ServerOpcodes opcode) { @@ -60,15 +60,21 @@ namespace Game.Network _worldPacket = new WorldPacket(opcode); } - public void Dispose() + public void Clear() { - _worldPacket.Dispose(); + _worldPacket.Clear(); + buffer = null; } - public void Clear() { _worldPacket.Clear(); } - public ServerOpcodes GetOpcode() { return (ServerOpcodes)_worldPacket.GetOpcode(); } - public uint GetSize() { return _worldPacket.GetSize(); } - public byte[] GetData() { return _worldPacket.GetData(); } + public ServerOpcodes GetOpcode() + { + return (ServerOpcodes)_worldPacket.GetOpcode(); + } + + public byte[] GetData() + { + return buffer; + } public void LogPacket(WorldSession session) { @@ -77,10 +83,21 @@ namespace Game.Network public abstract void Write(); + public void WritePacketData() + { + if (buffer != null) + return; + + Write(); + + buffer = _worldPacket.GetData(); + _worldPacket.Dispose(); + } + public ConnectionType GetConnection() { return connectionType; } + byte[] buffer; ConnectionType connectionType; - protected WorldPacket _worldPacket; } @@ -88,12 +105,12 @@ namespace Game.Network { public WorldPacket(ServerOpcodes opcode = ServerOpcodes.None) { - Opcode = (uint)opcode; + this.opcode = (uint)opcode; } public WorldPacket(byte[] data, uint opcode) : base(data) { - Opcode = opcode; + this.opcode = opcode; } public ObjectGuid ReadPackedGuid() @@ -201,9 +218,9 @@ namespace Game.Network WriteFloat(o); } - public uint GetOpcode() { return Opcode; } + public uint GetOpcode() { return opcode; } - uint Opcode; + uint opcode; } public class ServerPacketHeader diff --git a/Game/Network/WorldSocket.cs b/Game/Network/WorldSocket.cs index 345fb5076..1631e56eb 100644 --- a/Game/Network/WorldSocket.cs +++ b/Game/Network/WorldSocket.cs @@ -250,21 +250,18 @@ namespace Game.Network return true; } - public void SendPacket(ServerPacket packet, bool writePacket = true) + public void SendPacket(ServerPacket packet) { if (!IsOpen()) return; packet.LogPacket(_worldSession); - if (writePacket) - packet.Write(); - - uint packetSize = packet.GetSize(); - ServerOpcodes opcode = packet.GetOpcode(); + packet.WritePacketData(); var data = packet.GetData(); - packet.Dispose(); + uint packetSize = (uint)data.Length; + ServerOpcodes opcode = packet.GetOpcode(); PacketLog.Write(data, opcode, GetRemoteIpAddress(), GetRemotePort(), _connectType); if (packetSize > 0x400 && worldCrypt.IsInitialized) @@ -602,7 +599,7 @@ namespace Game.Network //else //{ // transfer_aborted when/if we get map node redirection - // SendPacket(*WorldPackets.Auth.ResumeComms().Write()); + // SendPacket(*WorldPackets.Auth.ResumeComms()); //} } diff --git a/Game/OutdoorPVP/OutdoorPvP.cs b/Game/OutdoorPVP/OutdoorPvP.cs index e1904ab3f..ce6eacbfd 100644 --- a/Game/OutdoorPVP/OutdoorPvP.cs +++ b/Game/OutdoorPVP/OutdoorPvP.cs @@ -181,14 +181,13 @@ namespace Game.PvP void BroadcastPacket(ServerPacket packet) { // This is faster than sWorld.SendZoneMessage - packet.Write(); for (int team = 0; team < 2; ++team) { foreach (var guid in m_players[team]) { Player player = Global.ObjAccessor.FindPlayer(guid); if (player) - player.SendPacket(packet, false); + player.SendPacket(packet); } } } diff --git a/Game/Server/WorldManager.cs b/Game/Server/WorldManager.cs index 7d5c1b966..0e66c937e 100644 --- a/Game/Server/WorldManager.cs +++ b/Game/Server/WorldManager.cs @@ -1401,13 +1401,12 @@ namespace Game public bool SendZoneMessage(uint zone, ServerPacket packet, WorldSession self = null, uint team = 0) { bool foundPlayerToSend = false; - packet.Write(); foreach (var session in m_sessions.Values) { if (session != null && session.GetPlayer() && session.GetPlayer().IsInWorld && session.GetPlayer().GetZoneId() == zone && session != self && (team == 0 || (uint)session.GetPlayer().GetTeam() == team)) { - session.SendPacket(packet, false); + session.SendPacket(packet); foundPlayerToSend = true; } } diff --git a/Game/Server/WorldSession.cs b/Game/Server/WorldSession.cs index f19f1adfa..b879eab42 100644 --- a/Game/Server/WorldSession.cs +++ b/Game/Server/WorldSession.cs @@ -373,7 +373,7 @@ namespace Game Log.outError(LogFilter.Network, "Received unexpected opcode {0} Status: {1} Reason: {2} from {3}", (ClientOpcodes)packet.GetOpcode(), status, reason, GetPlayerInfo()); } - public void SendPacket(ServerPacket packet, bool writePacket = true) + public void SendPacket(ServerPacket packet) { if (packet == null) return; @@ -397,7 +397,7 @@ namespace Game return; } - m_Socket[(int)conIdx].SendPacket(packet, writePacket); + m_Socket[(int)conIdx].SendPacket(packet); } public void AddInstanceConnection(WorldSocket sock) { m_Socket[(int)ConnectionType.Instance] = sock; } diff --git a/Game/Spells/SpellEffects.cs b/Game/Spells/SpellEffects.cs index 96917e343..8c93b61c5 100644 --- a/Game/Spells/SpellEffects.cs +++ b/Game/Spells/SpellEffects.cs @@ -3636,10 +3636,9 @@ namespace Game.Spells packet.ArbiterGUID = pGameObj.GetGUID(); packet.RequestedByGUID = caster.GetGUID(); packet.RequestedByWowAccount = caster.GetSession().GetAccountGUID(); - packet.Write(); - caster.SendPacket(packet, false); - target.SendPacket(packet, false); + caster.SendPacket(packet); + target.SendPacket(packet); // create duel-info DuelInfo duel = new DuelInfo();