From 100fd82b2bf5b9254db5ad13656ed4f148f858b2 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Mon, 28 Jul 2014 02:56:56 +0100 Subject: Core/Networking: Attempt to fix some exceptions Call the non-throwing versions of socket.remote_endpoint in GetRemoteIpAddress and GetRemotePort. Sh*t will still be broken tho --- src/server/shared/Networking/Socket.h | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 9c3ec180b0a..059de140797 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -39,8 +39,33 @@ public: virtual void Start() = 0; - boost::asio::ip::address GetRemoteIpAddress() const { return _socket.remote_endpoint().address(); }; - uint16 GetRemotePort() const { return _socket.remote_endpoint().port(); } + boost::asio::ip::address GetRemoteIpAddress() const + { + boost::system::error_code error; + auto ep = _socket.remote_endpoint(error); + + if (error) + { + TC_LOG_DEBUG("network", "Socket::GetRemoteIpAddress: errored with: %i (%s)", error.value(), error.message().c_str()); + return boost::asio::ip::address(); + } + else + return ep.address(); + } + + uint16 GetRemotePort() const + { + boost::system::error_code error; + auto ep = _socket.remote_endpoint(error); + + if (error) + { + TC_LOG_DEBUG("network", "Socket::GetRemotePort: errored with: %i (%s)", error.value(), error.message().c_str()); + return 0; + } + else + return ep.port(); + } void AsyncReadHeader() { -- cgit v1.2.3 From 440fff54b8c1dbd6ad2ebe64a5b869b31eb76f22 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Mon, 28 Jul 2014 13:26:03 +0100 Subject: Core/Startup: Change an error about "broken zone-data" on guild loading to debug This "error" happens when player is on zone 0 or transport. --- src/server/game/Guilds/Guild.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 57e9a84d611..bace2ec1360 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -677,9 +677,10 @@ bool Guild::Member::LoadFromDB(Field* fields) if (!m_zoneId) { - TC_LOG_ERROR("guild", "Player (GUID: %u) has broken zone-data", GUID_LOPART(m_guid)); + TC_LOG_DEBUG("guild", "Player (GUID: %u) has broken zone-data", GUID_LOPART(m_guid)); m_zoneId = Player::GetZoneIdFromDB(m_guid); } + ResetFlags(); return true; } -- cgit v1.2.3 From 7a888d03bdf7781d283b5f063b9f29fba62e7bd1 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 28 Jul 2014 16:37:42 +0200 Subject: Core/Network: Fixed packets being properly received only by the first player when broadcasted to everyone Closes #12675 --- src/server/game/Server/WorldSocket.cpp | 2 +- src/server/game/Server/WorldSocket.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index ea0bfc234bf..99c2d27ed03 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -153,7 +153,7 @@ void WorldSocket::AsyncWrite(WorldPacket& packet) bool needsWriteStart = _writeQueue.empty(); _authCrypt.EncryptSend(header.header, header.getHeaderLength()); - _writeQueue.emplace(header, std::move(packet)); + _writeQueue.emplace(header, packet); if (needsWriteStart) AsyncWrite(_writeQueue.front()); diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 1fa08c2b5f1..7275da5ff29 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -58,7 +58,7 @@ struct WorldPacketBuffer typedef boost::asio::const_buffer const* const_iterator; - WorldPacketBuffer(ServerPktHeader header, WorldPacket&& packet) : _header(header), _packet(std::move(packet)) + WorldPacketBuffer(ServerPktHeader header, WorldPacket const& packet) : _header(header), _packet(packet) { _buffers[0] = boost::asio::const_buffer(_header.header, _header.getHeaderLength()); if (!_packet.empty()) -- cgit v1.2.3 From 86f3ee99493613700cfa166361336821eaf79793 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 28 Jul 2014 23:32:53 +0200 Subject: Core/Instances: Explicitly unload InstanceSaveMgr before MapManager, fixes invalid memory access at shutdown Closes #12635 --- src/server/game/Groups/Group.cpp | 2 -- src/server/game/Instances/InstanceSaveMgr.cpp | 6 ++++-- src/server/game/Instances/InstanceSaveMgr.h | 2 ++ src/server/worldserver/Main.cpp | 4 +++- 4 files changed, 9 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 2e7633091f3..8068e82f676 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -80,8 +80,6 @@ Group::~Group() delete(r); } - // it is undefined whether objectmgr (which stores the groups) or instancesavemgr - // will be unloaded first so we must be prepared for both cases // this may unload some instance saves for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) for (BoundInstancesMap::iterator itr2 = m_boundInstances[i].begin(); itr2 != m_boundInstances[i].end(); ++itr2) diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index c46d9002604..370d02631ba 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -39,8 +39,10 @@ uint16 InstanceSaveManager::ResetTimeDelay[] = {3600, 900, 300, 60}; InstanceSaveManager::~InstanceSaveManager() { - // it is undefined whether this or objectmgr will be unloaded first - // so we must be prepared for both cases +} + +void InstanceSaveManager::Unload() +{ lock_instLists = true; for (InstanceSaveHashMap::iterator itr = m_instanceSaveById.begin(); itr != m_instanceSaveById.end(); ++itr) { diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h index 0a2af4b73ee..1bab66be1b8 100644 --- a/src/server/game/Instances/InstanceSaveMgr.h +++ b/src/server/game/Instances/InstanceSaveMgr.h @@ -164,6 +164,8 @@ class InstanceSaveManager return &instance; } + void Unload(); + /* resetTime is a global propery of each (raid/heroic) map all instances of that map reset at the same time */ struct InstResetEvent diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 206103608a4..02e6268cd26 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -37,6 +37,7 @@ #include "RealmList.h" #include "World.h" #include "MapManager.h" +#include "InstanceSaveMgr.h" #include "ObjectAccessor.h" #include "ScriptMgr.h" #include "OutdoorPvP/OutdoorPvPMgr.h" @@ -251,6 +252,7 @@ extern int main(int argc, char** argv) // unload battleground templates before different singletons destroyed sBattlegroundMgr->DeleteAllBattlegrounds(); + sInstanceSaveMgr->Unload(); sMapMgr->UnloadAll(); // unload all grids (including locked in memory) sObjectAccessor->UnloadAll(); // unload 'i_player2corpse' storage and remove from world sScriptMgr->Unload(); @@ -537,7 +539,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile { // Silences warning about configService not be used if the OS is not Windows (void)configService; - + options_description all("Allowed options"); all.add_options() ("help,h", "print usage message") -- cgit v1.2.3 From 6a6351d98c23313ca617c8412f4c9e98ac96b139 Mon Sep 17 00:00:00 2001 From: Dr-J Date: Mon, 28 Jul 2014 23:41:17 +0100 Subject: Update razorfen_downs.cpp --- .../Kalimdor/RazorfenDowns/razorfen_downs.cpp | 68 ---------------------- 1 file changed, 68 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index a8df690f726..ef6d7da5116 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -38,73 +38,6 @@ EndContentData */ #include "CellImpl.h" /*### -# npc_henry_stern -####*/ - -enum Spells -{ - SPELL_TEACHING_GOLDTHORN_TEA = 13029, - SPELL_TEACHING_MIGHTY_TROLLS_BLOOD_POTION = 13030 -}; - -enum Gossips -{ - GOSSIP_COOKING_SKILL_HIGH = 1444, - GOSSIP_COOKING_SKILL_LOW = 1501, - GOSSIP_ALCHEMY_SKILL_HIGH = 1442, - GOSSIP_ALCHEMY_SKILL_LOW = 1502 -}; - -class npc_henry_stern : public CreatureScript -{ -public: - npc_henry_stern() : CreatureScript("npc_henry_stern") { } - - struct npc_henry_sternAI : public ScriptedAI - { - npc_henry_sternAI(Creature* creature) : ScriptedAI(creature) { } - - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) override - { - if (action == 0) - { - if (player->GetBaseSkillValue(SKILL_COOKING) >= 175) - { - player->PrepareGossipMenu(me, GOSSIP_COOKING_SKILL_HIGH); - player->SendPreparedGossip(me); - DoCast(player, SPELL_TEACHING_GOLDTHORN_TEA); - } - else - { - player->PrepareGossipMenu(me, GOSSIP_COOKING_SKILL_LOW); - player->SendPreparedGossip(me); - } - } - - if (action == 1) - { - if (player->GetBaseSkillValue(SKILL_ALCHEMY) >= 180) - { - player->PrepareGossipMenu(me, GOSSIP_ALCHEMY_SKILL_HIGH); - player->SendPreparedGossip(me); - DoCast(player, SPELL_TEACHING_MIGHTY_TROLLS_BLOOD_POTION); - } - else - { - player->PrepareGossipMenu(me, GOSSIP_ALCHEMY_SKILL_LOW); - player->SendPreparedGossip(me); - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_henry_sternAI(creature); - } -}; - -/*###### ## npc_belnistrasz for Quest 3525 "Extinguishing the Idol" ######*/ @@ -460,7 +393,6 @@ public: void AddSC_razorfen_downs() { - new npc_henry_stern(); new npc_belnistrasz(); new npc_idol_room_spawner(); new npc_tomb_creature(); -- cgit v1.2.3 From 6418789489e984ec800578c09a3c385b2b0c3b72 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 29 Jul 2014 01:52:28 +0200 Subject: Core/Socket: Fixed expected template evaluated type for AsyncWrite if PacketType is a pointer (Bla* const& is not what we want) --- src/server/shared/Networking/Socket.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 059de140797..d9d03b8bbd9 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -34,6 +34,8 @@ using boost::asio::ip::tcp; template class Socket : public std::enable_shared_from_this { + typedef std::conditional::value, PacketType, PacketType const&>::type WritePacketType; + public: Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)), _headerSize(headerSize) { } @@ -93,7 +95,7 @@ public: } } - void AsyncWrite(PacketType const& data) + void AsyncWrite(WritePacketType data) { boost::asio::async_write(_socket, boost::asio::buffer(data), std::bind(&Socket::WriteHandler, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); -- cgit v1.2.3 From 833195062c310685b479ed16ff4ac5ef5664c021 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 29 Jul 2014 02:00:23 +0200 Subject: Update Socket.h Added missing typename keyword --- src/server/shared/Networking/Socket.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index d9d03b8bbd9..38d88e3592c 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -34,7 +34,7 @@ using boost::asio::ip::tcp; template class Socket : public std::enable_shared_from_this { - typedef std::conditional::value, PacketType, PacketType const&>::type WritePacketType; + typedef typename std::conditional::value, PacketType, PacketType const&>::type WritePacketType; public: Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)), _headerSize(headerSize) { } -- cgit v1.2.3