From acfaf2d18266db787b64f705b99ee5e6b240d6e9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 15 Aug 2014 20:01:58 +0200 Subject: Core/Misc: Fixed loading trinity_string --- src/server/game/Globals/ObjectMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 37c2d9108ab..944ad4d4a19 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7757,7 +7757,7 @@ bool ObjectMgr::LoadTrinityStrings(const char* table, int32 min_value, int32 max data.Content.resize(1); ++count; - for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) + for (int8 i = TOTAL_LOCALES - 1; i >= 0; --i) AddLocaleString(fields[i + 1].GetString(), LocaleConstant(i), data.Content); } while (result->NextRow()); -- cgit v1.2.3 From 5c60976046e819f6b2d5d24b589945535ae5042c Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 16 Aug 2014 01:06:30 +0200 Subject: Core/Transports: Delayed adding transport model to next tick after teleporting to fix race conditions happening when teleporting transport happens at the same time as destination map balances its dynamic LoS tree --- src/server/game/Entities/GameObject/GameObject.cpp | 7 ++++++- src/server/game/Entities/Transport/Transport.cpp | 12 ++++++++++-- src/server/game/Entities/Transport/Transport.h | 4 ++++ 3 files changed, 20 insertions(+), 3 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index ee39ed48ad6..c8c0eaefb27 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -143,7 +143,12 @@ void GameObject::AddToWorld() // The state can be changed after GameObject::Create but before GameObject::AddToWorld bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState() == GO_READY : (GetGoState() == GO_STATE_READY || IsTransport()); if (m_model) - GetMap()->InsertGameObjectModel(*m_model); + { + if (Transport* trans = ToTransport()) + trans->SetDelayedAddModelToMap(); + else + GetMap()->InsertGameObjectModel(*m_model); + } EnableCollision(toggledState); WorldObject::AddToWorld(); diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index d907274f8d1..367ccd34cdb 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -35,7 +35,8 @@ Transport::Transport() : GameObject(), _transportInfo(NULL), _isMoving(true), _pendingStop(false), - _triggeredArrivalEvent(false), _triggeredDepartureEvent(false), _passengerTeleportItr(_passengers.begin()) + _triggeredArrivalEvent(false), _triggeredDepartureEvent(false), + _passengerTeleportItr(_passengers.begin()), _delayedAddModel(false) { m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION; } @@ -186,6 +187,14 @@ void Transport::Update(uint32 diff) return; // Update more in new map thread } + // Add model to map after we are fully done with moving maps + if (_delayedAddModel) + { + _delayedAddModel = false; + if (m_model) + GetMap()->InsertGameObjectModel(*m_model); + } + // Set position _positionChangeTimer.Update(diff); if (_positionChangeTimer.Passed()) @@ -625,7 +634,6 @@ bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z, fl } Relocate(x, y, z, o); - UpdateModelPosition(); GetMap()->AddToMap(this); return true; } diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index e644417f1ac..2c924eb33ed 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -95,6 +95,8 @@ class Transport : public GameObject, public TransportBase void EnableMovement(bool enabled); + void SetDelayedAddModelToMap() { _delayedAddModel = true; } + TransportTemplate const* GetTransportTemplate() const { return _transportInfo; } private: @@ -123,6 +125,8 @@ class Transport : public GameObject, public TransportBase PassengerSet _passengers; PassengerSet::iterator _passengerTeleportItr; PassengerSet _staticPassengers; + + bool _delayedAddModel; }; #endif -- cgit v1.2.3 From 7cb72c2aacbb3c2502bd5d25a52a6e96fe2b9cc8 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 16 Aug 2014 01:43:42 +0200 Subject: Core/DBLayer: Fixed an incredibly rare memory leak happening when player started loading from database and never finished --- src/server/shared/Database/QueryHolder.cpp | 8 ++++++++ src/server/shared/Database/QueryHolder.h | 8 +++++--- 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'src/server') diff --git a/src/server/shared/Database/QueryHolder.cpp b/src/server/shared/Database/QueryHolder.cpp index bd938561b50..f0dc3c96e4e 100644 --- a/src/server/shared/Database/QueryHolder.cpp +++ b/src/server/shared/Database/QueryHolder.cpp @@ -166,8 +166,16 @@ void SQLQueryHolder::SetSize(size_t size) m_queries.resize(size); } +SQLQueryHolderTask::~SQLQueryHolderTask() +{ + if (!m_executed) + delete m_holder; +} + bool SQLQueryHolderTask::Execute() { + m_executed = true; + if (!m_holder) return false; diff --git a/src/server/shared/Database/QueryHolder.h b/src/server/shared/Database/QueryHolder.h index 273980c3ac5..39e51b591c5 100644 --- a/src/server/shared/Database/QueryHolder.h +++ b/src/server/shared/Database/QueryHolder.h @@ -47,14 +47,16 @@ class SQLQueryHolderTask : public SQLOperation private: SQLQueryHolder* m_holder; QueryResultHolderPromise m_result; + bool m_executed; public: SQLQueryHolderTask(SQLQueryHolder* holder) - : m_holder(holder) { }; + : m_holder(holder), m_executed(false) { } + + ~SQLQueryHolderTask(); bool Execute() override; QueryResultHolderFuture GetFuture() { return m_result.get_future(); } - }; -#endif \ No newline at end of file +#endif -- cgit v1.2.3 From ae97b50af2d4765322aa8ccb0a2399a5e4c26d7d Mon Sep 17 00:00:00 2001 From: ShinDarth Date: Wed, 13 Aug 2014 22:56:08 +0200 Subject: Core/Battleground: fixed possible mount abuse after leaving BG --- src/server/game/Battlegrounds/Battleground.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/server') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 86236cd0f2b..3a59ffa8cf9 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -844,12 +844,14 @@ void Battleground::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac Player* player = ObjectAccessor::FindPlayer(guid); - // should remove spirit of redemption if (player) { + // should remove spirit of redemption if (player->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) player->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); + player->RemoveAurasByType(SPELL_AURA_MOUNTED); + if (!player->IsAlive()) // resurrect on exit { player->ResurrectPlayer(1.0f); -- cgit v1.2.3