From 90bc6f1e39e27566186a69acab788a330a4a3c13 Mon Sep 17 00:00:00 2001 From: leak Date: Thu, 24 Jul 2014 21:55:37 +0200 Subject: Restore mmaps gen build Closes #12631 --- src/tools/mmaps_generator/MapBuilder.cpp | 12 +++++++----- src/tools/mmaps_generator/MapBuilder.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 01a342249fd..a29502535e6 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -171,14 +171,16 @@ namespace MMAP { while (1) { - uint32 mapId; + uint32* mapId; _queue.WaitAndPop(mapId); if (_cancelationToken) return; - buildMap(mapId); + buildMap(*mapId); + + delete mapId; } } @@ -196,13 +198,13 @@ namespace MMAP for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it) { - uint32 mapID = it->m_mapId; - if (!shouldSkipMap(mapID)) + uint32* mapID = new uint32(it->m_mapId); + if (!shouldSkipMap(*mapID)) { if (threads > 0) _queue.Push(mapID); else - buildMap(mapID); + buildMap(*mapID); } } diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h index 1d688ccfa77..c2168d048b4 100644 --- a/src/tools/mmaps_generator/MapBuilder.h +++ b/src/tools/mmaps_generator/MapBuilder.h @@ -143,7 +143,7 @@ namespace MMAP rcContext* m_rcContext; std::vector _workerThreads; - ProducerConsumerQueue _queue; + ProducerConsumerQueue _queue; std::atomic _cancelationToken; }; } -- cgit v1.2.3 From a309ca972794f7282372b4302d6d0caddef7f745 Mon Sep 17 00:00:00 2001 From: Warpten Date: Fri, 25 Jul 2014 14:47:07 +0200 Subject: Core/Spells: Fixed issues with Death and Decay and similar spells not ticking if players stepping in the AoE are not in LoS with the caster. Not exactly sure if that behavior should *exactly* be as such, but until more informations ... --- src/server/game/Spells/Spell.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 2bf9c0e0395..037242358da 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4793,8 +4793,15 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_NOT_INFRONT; if (m_caster->GetEntry() != WORLD_TRIGGER) // Ignore LOS for gameobjects casts (wrongly cast by a trigger) - if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !m_caster->IsWithinLOSInMap(target)) + { + WorldObject* losTarget = target; + if (IsTriggered() && m_triggeredByAuraSpell) + if (DynamicObject* dynObj = m_caster->GetDynObject(m_triggeredByAuraSpell)) + losTarget = dynObj; + + if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !target->IsWithinLOSInMap(losTarget)) return SPELL_FAILED_LINE_OF_SIGHT; + } } } -- cgit v1.2.3 From 8e385ca6d9ca1f03e2b86885edc2b5d27b6ccddd Mon Sep 17 00:00:00 2001 From: DDuarte Date: Fri, 25 Jul 2014 14:04:12 +0100 Subject: Core/Spells: Fix an issue with previous commit (a309ca97279) --- src/server/game/Spells/Spell.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 037242358da..10339a6ac3a 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4794,9 +4794,9 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetEntry() != WORLD_TRIGGER) // Ignore LOS for gameobjects casts (wrongly cast by a trigger) { - WorldObject* losTarget = target; + WorldObject* losTarget = m_caster; if (IsTriggered() && m_triggeredByAuraSpell) - if (DynamicObject* dynObj = m_caster->GetDynObject(m_triggeredByAuraSpell)) + if (DynamicObject* dynObj = m_caster->GetDynObject(m_triggeredByAuraSpell->Id)) losTarget = dynObj; if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !target->IsWithinLOSInMap(losTarget)) -- cgit v1.2.3 From baf99223505416d9ba011bd5e8485fa68fbf755e Mon Sep 17 00:00:00 2001 From: DDuarte Date: Fri, 25 Jul 2014 14:04:39 +0100 Subject: Tools/mmaps: Fix a possible mem leak and a compile warning --- src/tools/mmaps_generator/MapBuilder.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index a29502535e6..94b5f3607cf 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -171,13 +171,16 @@ namespace MMAP { while (1) { - uint32* mapId; + uint32* mapId = nullptr; _queue.WaitAndPop(mapId); if (_cancelationToken) return; + if (!mapId) // shouldn't happen? + continue; + buildMap(*mapId); delete mapId; @@ -186,7 +189,7 @@ namespace MMAP void MapBuilder::buildAllMaps(int threads) { - for (size_t i = 0; i < threads; ++i) + for (int i = 0; i < threads; ++i) { _workerThreads.push_back(std::thread(&MapBuilder::WorkerThread, this)); } @@ -198,13 +201,13 @@ namespace MMAP for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it) { - uint32* mapID = new uint32(it->m_mapId); - if (!shouldSkipMap(*mapID)) + uint32 mapId = it->m_mapId; + if (!shouldSkipMap(mapId)) { if (threads > 0) - _queue.Push(mapID); + _queue.Push(new uint32(mapId)); else - buildMap(*mapID); + buildMap(mapId); } } -- cgit v1.2.3 From 0b75e387555df6c79f4cc63b4faa715a85fbd051 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Fri, 25 Jul 2014 14:59:34 +0100 Subject: Core/Shared: Change rand32 to return uin32 instead of int32 Fixes a crash that happened when rand32 returned negative values. Also updated some related comments that were outdated since we changed to SFMT. Closes #12638 --- src/server/game/Server/WorldSocket.cpp | 2 +- src/server/game/Warden/WardenWin.cpp | 2 +- src/server/shared/Utilities/Util.cpp | 8 ++++---- src/server/shared/Utilities/Util.h | 25 +++++++++---------------- 4 files changed, 15 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index fa884090bfa..6ef986dbd22 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -31,7 +31,7 @@ using boost::asio::ip::tcp; using boost::asio::streambuf; WorldSocket::WorldSocket(tcp::socket&& socket) - : _socket(std::move(socket)), _authSeed(static_cast(rand32())), _OverSpeedPings(0), _worldSession(nullptr) + : _socket(std::move(socket)), _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr) { } diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp index 5c3a86988db..da6a7dc1929 100644 --- a/src/server/game/Warden/WardenWin.cpp +++ b/src/server/game/Warden/WardenWin.cpp @@ -281,7 +281,7 @@ void WardenWin::RequestData() } case MODULE_CHECK: { - uint32 seed = static_cast(rand32()); + uint32 seed = rand32(); buff << uint32(seed); HmacHash hmac(4, (uint8*)&seed); hmac.UpdateData(wd->Str); diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp index d1799913d41..bf40b8ec352 100644 --- a/src/server/shared/Utilities/Util.cpp +++ b/src/server/shared/Utilities/Util.cpp @@ -63,17 +63,17 @@ float frand(float min, float max) return float(GetRng()->Random() * (max - min) + min); } -int32 rand32() +uint32 rand32() { - return int32(GetRng()->BRandom()); + return GetRng()->BRandom(); } -double rand_norm(void) +double rand_norm() { return GetRng()->Random(); } -double rand_chance(void) +double rand_chance() { return GetRng()->Random() * 100.0; } diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h index c95e0e3cfa3..0680b91e0fe 100644 --- a/src/server/shared/Utilities/Util.h +++ b/src/server/shared/Utilities/Util.h @@ -76,30 +76,23 @@ std::string secsToTimeString(uint64 timeInSecs, bool shortText = false, bool hou uint32 TimeStringToSecs(const std::string& timestring); std::string TimeToTimestampStr(time_t t); -/* Return a random number in the range min..max; (max-min) must be smaller than 32768. */ +/* Return a random number in the range min..max. */ int32 irand(int32 min, int32 max); -/* Return a random number in the range min..max (inclusive). For reliable results, the difference -* between max and min should be less than RAND32_MAX. */ +/* Return a random number in the range min..max (inclusive). */ uint32 urand(uint32 min, uint32 max); -/* Return a random number in the range 0 .. RAND32_MAX. */ -int32 rand32(); +/* Return a random number in the range 0 .. UINT32_MAX. */ +uint32 rand32(); /* Return a random number in the range min..max */ float frand(float min, float max); -/* Return a random double from 0.0 to 1.0 (exclusive). Floats support only 7 valid decimal digits. - * A double supports up to 15 valid decimal digits and is used internally (RAND32_MAX has 10 digits). - * With an FPU, there is usually no difference in performance between float and double. -*/ -double rand_norm(void); - -/* Return a random double from 0.0 to 99.9999999999999. Floats support only 7 valid decimal digits. - * A double supports up to 15 valid decimal digits and is used internally (RAND32_MAX has 10 digits). - * With an FPU, there is usually no difference in performance between float and double. -*/ -double rand_chance(void); +/* Return a random double from 0.0 to 1.0 (exclusive). */ +double rand_norm(); + +/* Return a random double from 0.0 to 100.0 (exclusive). */ +double rand_chance(); /* Return true if a random roll fits in the specified chance (range 0-100). */ inline bool roll_chance_f(float chance) -- cgit v1.2.3 From 63e1cc6276d791e3a3a1c5d085d4752f30a011c8 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Fri, 25 Jul 2014 15:23:40 +0100 Subject: Tools/mmaps: Fix build when building only tools Closes #12631 --- src/tools/mmaps_generator/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt index a2b729ca998..8661c035c8e 100644 --- a/src/tools/mmaps_generator/CMakeLists.txt +++ b/src/tools/mmaps_generator/CMakeLists.txt @@ -48,6 +48,7 @@ target_link_libraries(mmaps_generator Detour ${BZIP2_LIBRARIES} ${ZLIB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} ) -- cgit v1.2.3 From 4f1d247dfba124c628feaa24c603cd5cc24f0349 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Fri, 25 Jul 2014 18:01:27 +0100 Subject: Core/Network: Fix some possible exceptions on socket.close() Ref #12634 --- src/server/authserver/Server/AuthSession.cpp | 16 ++++++++++++---- src/server/authserver/Server/AuthSession.h | 1 + src/server/game/Server/WorldSocket.cpp | 22 +++++++++++++++------- src/server/game/Server/WorldSocket.h | 4 ++-- 4 files changed, 30 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp index 9bd9313059a..cad82a80a07 100644 --- a/src/server/authserver/Server/AuthSession.cpp +++ b/src/server/authserver/Server/AuthSession.cpp @@ -161,7 +161,7 @@ void AuthSession::AsyncReadHeader() } else { - _socket.close(); + CloseSocket(); } }); } @@ -176,7 +176,7 @@ void AuthSession::AsyncReadData(bool (AuthSession::*handler)(), size_t dataSize, { if (!(*this.*handler)()) { - _socket.close(); + CloseSocket(); return; } @@ -184,7 +184,7 @@ void AuthSession::AsyncReadData(bool (AuthSession::*handler)(), size_t dataSize, } else { - _socket.close(); + CloseSocket(); } }); } @@ -195,7 +195,7 @@ void AuthSession::AsyncWrite(std::size_t length) { if (error) { - _socket.close(); + CloseSocket(); } }); } @@ -935,3 +935,11 @@ void AuthSession::SetVSFields(const std::string& rI) OPENSSL_free(v_hex); OPENSSL_free(s_hex); } + +void AuthSession::CloseSocket() +{ + boost::system::error_code socketError; + _socket.close(socketError); + if (socketError) + TC_LOG_DEBUG("server.authserver", "Account '%s' errored when closing socket: %i (%s)", _login.c_str(), socketError.value(), socketError.message()); +} diff --git a/src/server/authserver/Server/AuthSession.h b/src/server/authserver/Server/AuthSession.h index 4ae33f44cb3..6dc9c404857 100644 --- a/src/server/authserver/Server/AuthSession.h +++ b/src/server/authserver/Server/AuthSession.h @@ -58,6 +58,7 @@ private: void AsyncReadData(bool (AuthSession::*handler)(), size_t dataSize, size_t bufferOffset); void AsyncWrite(size_t length); + void CloseSocket(); void SetVSFields(const std::string& rI); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 6ef986dbd22..682ea320365 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -78,8 +78,7 @@ void WorldSocket::AsyncReadHeader() else { // _socket.is_open() till returns true even after calling close() - boost::system::error_code socketError; - _socket.close(socketError); + CloseSocket(); } }); } @@ -155,8 +154,7 @@ void WorldSocket::AsyncReadData(size_t dataSize) else { // _socket.is_open() till returns true even after calling close() - boost::system::error_code socketError; - _socket.close(socketError); + CloseSocket(); } }); } @@ -202,7 +200,7 @@ void WorldSocket::AsyncWrite(std::vector const& data) AsyncWrite(_writeQueue.front()); } else - _socket.close(); + CloseSocket(); }); } @@ -475,7 +473,7 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket) TC_LOG_ERROR("network", "WorldSocket::HandlePing: %s kicked for over-speed pings (address: %s)", _worldSession->GetPlayerInfo().c_str(), GetRemoteIpAddress().c_str()); - _socket.close(); + CloseSocket(); return; } } @@ -494,7 +492,7 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket) TC_LOG_ERROR("network", "WorldSocket::HandlePing: peer sent CMSG_PING, but is not authenticated or got recently kicked, address = %s", GetRemoteIpAddress().c_str()); - _socket.close(); + CloseSocket(); return; } @@ -502,3 +500,13 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket) packet << ping; return AsyncWrite(packet); } + +void WorldSocket::CloseSocket() +{ + boost::system::error_code socketError; + _socket.close(socketError); + if (socketError) + TC_LOG_DEBUG("network", "WorldSocket::CloseSocket: Player '%s' (%s) errored when closing socket: %i (%s)", + _worldSession ? _worldSession->GetPlayerInfo().c_str() : "unknown", GetRemoteIpAddress().c_str(), + socketError.value(), socketError.message()); +} diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 07aae10513f..0f3fc553872 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -55,8 +55,8 @@ public: std::string GetRemoteIpAddress() const { return _socket.remote_endpoint().address().to_string(); }; uint16 GetRemotePort() const { return _socket.remote_endpoint().port(); } - void CloseSocket() { _socket.close(); }; - bool IsOpen() { return _socket.is_open(); }; + void CloseSocket(); + bool IsOpen() const { return _socket.is_open(); } void AsyncWrite(WorldPacket const& packet); -- cgit v1.2.3