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/server') 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/server') 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 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/server') 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 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/server') 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