diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/authserver/Server/AuthSession.cpp | 16 | ||||
-rw-r--r-- | src/server/authserver/Server/AuthSession.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Warden/WardenWin.cpp | 2 | ||||
-rw-r--r-- | src/server/shared/Utilities/Util.cpp | 8 | ||||
-rw-r--r-- | src/server/shared/Utilities/Util.h | 25 | ||||
-rw-r--r-- | src/tools/mmaps_generator/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/tools/mmaps_generator/MapBuilder.cpp | 19 | ||||
-rw-r--r-- | src/tools/mmaps_generator/MapBuilder.h | 2 |
11 files changed, 67 insertions, 44 deletions
diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp index bcc32887616..7d2948470f7 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(); } }); } @@ -889,3 +889,11 @@ void AuthSession::SetVSFields(const std::string& rI) stmt->setString(2, _login); LoginDatabase.Execute(stmt); } + +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 9790eae69ec..fa83db6b185 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -32,7 +32,7 @@ using boost::asio::ip::tcp; using boost::asio::streambuf; WorldSocket::WorldSocket(tcp::socket&& socket) - : _socket(std::move(socket)), _authSeed(static_cast<uint32>(rand32())), _OverSpeedPings(0), _worldSession(nullptr) + : _socket(std::move(socket)), _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr) { } @@ -83,8 +83,7 @@ void WorldSocket::AsyncReadHeader() else { // _socket.is_open() till returns true even after calling close() - boost::system::error_code socketError; - _socket.close(socketError); + CloseSocket(); } }); } @@ -190,8 +189,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(); } }); } @@ -245,7 +243,7 @@ void WorldSocket::AsyncWrite(std::vector<uint8> const& data) AsyncWrite(_writeQueue.front()); } else - _socket.close(); + CloseSocket(); }); } @@ -554,7 +552,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; } } @@ -573,7 +571,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; } @@ -581,3 +579,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 c0986f88779..085ee98b00d 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); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 411f3c7343e..bf518859b49 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4858,8 +4858,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 = m_caster; + if (IsTriggered() && 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)) return SPELL_FAILED_LINE_OF_SIGHT; + } } } diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp index 9de4ff0958e..1a6127daa89 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<uint32>(rand32()); + uint32 seed = rand32(); buff << uint32(seed); HmacSha1 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 446ee889c90..a5279eae03f 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 2a776715521..c8883773eed 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) 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} ) diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 01a342249fd..94b5f3607cf 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -171,20 +171,25 @@ namespace MMAP { while (1) { - uint32 mapId; + uint32* mapId = nullptr; _queue.WaitAndPop(mapId); if (_cancelationToken) return; - buildMap(mapId); + if (!mapId) // shouldn't happen? + continue; + + buildMap(*mapId); + + delete mapId; } } 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)); } @@ -196,13 +201,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 = it->m_mapId; + if (!shouldSkipMap(mapId)) { if (threads > 0) - _queue.Push(mapID); + _queue.Push(new uint32(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<std::thread> _workerThreads; - ProducerConsumerQueue<uint32> _queue; + ProducerConsumerQueue<uint32*> _queue; std::atomic<bool> _cancelationToken; }; } |