diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-06-24 00:03:57 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-06-24 00:03:57 +0200 |
commit | acc45bcf5d657671d9348e95f069ad17e1bb5631 (patch) | |
tree | e76f661fef9f897281b94fa833f50de4f8f717b7 /src/server/game | |
parent | d799e0cee0c522ebe389b042201ff0981baaba39 (diff) |
Core/Garrisons: Implemented a method to delete garrisons
Diffstat (limited to 'src/server/game')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Garrison/Garrison.cpp | 49 | ||||
-rw-r--r-- | src/server/game/Garrison/Garrison.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GarrisonPackets.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GarrisonPackets.h | 11 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
7 files changed, 66 insertions, 32 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 01826da9fd0..0be87aeee6e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4575,21 +4575,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BLUEPRINTS); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BUILDINGS); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_FOLLOWERS); - stmt->setUInt64(0, guid); - trans->Append(stmt); + Garrison::DeleteFromDB(guid, trans); CharacterDatabase.CommitTransaction(trans); @@ -26205,6 +26191,15 @@ void Player::CreateGarrison(uint32 garrSiteId) _garrison = std::move(garrison); } +void Player::DeleteGarrison() +{ + if (_garrison) + { + _garrison->Delete(); + _garrison.reset(); + } +} + void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) { WorldPackets::Movement::MoveSetFlag packet(apply ? SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY : SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5bae50edb68..2c3e7d38c31 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2629,6 +2629,7 @@ class Player : public Unit, public GridObject<Player> void OnCombatExit(); void CreateGarrison(uint32 garrSiteId); + void DeleteGarrison(); Garrison* GetGarrison() { return _garrison.get(); } protected: diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 99db2336566..47cefda447c 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -135,23 +135,9 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue void Garrison::SaveToDB(SQLTransaction trans) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); + DeleteFromDB(_owner->GetGUID().GetCounter(), trans); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BLUEPRINTS); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BUILDINGS); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_FOLLOWERS); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); stmt->setUInt32(1, _siteLevel->ID); stmt->setUInt32(2, _followerActivationsRemainingToday); @@ -210,6 +196,25 @@ void Garrison::SaveToDB(SQLTransaction trans) } } +void Garrison::DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans) +{ + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BLUEPRINTS); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BUILDINGS); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_FOLLOWERS); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); +} + bool Garrison::Create(uint32 garrSiteId) { _siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); @@ -226,6 +231,18 @@ bool Garrison::Create(uint32 garrSiteId) return true; } +void Garrison::Delete() +{ + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + DeleteFromDB(_owner->GetGUID().GetCounter(), trans); + CharacterDatabase.CommitTransaction(trans); + + WorldPackets::Garrison::GarrisonDeleteResult garrisonDelete; + garrisonDelete.Result = GARRISON_SUCCESS; + garrisonDelete.GarrSiteID = _siteLevel->SiteID; + _owner->SendDirectMessage(garrisonDelete.Write()); +} + void Garrison::InitializePlots() { if (std::vector<GarrSiteLevelPlotInstEntry const*> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevel->ID)) diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 041d20d13b0..e6e44d5f83a 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -110,8 +110,10 @@ public: bool LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blueprints, PreparedQueryResult buildings, PreparedQueryResult followers, PreparedQueryResult abilities); void SaveToDB(SQLTransaction trans); + static void DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans); bool Create(uint32 garrSiteId); + void Delete(); void Upgrade(); void Enter() const; diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 1e5055442a0..041655aa4c6 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -25,6 +25,14 @@ WorldPacket const* WorldPackets::Garrison::GarrisonCreateResult::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Garrison::GarrisonDeleteResult::Write() +{ + _worldPacket << uint32(Result); + _worldPacket << uint32(GarrSiteID); + + return &_worldPacket; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonPlotInfo& plotInfo) { data << uint32(plotInfo.GarrPlotInstanceID); diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index 6c39df1e532..a783b1bc1af 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -39,6 +39,17 @@ namespace WorldPackets uint32 Result = 0; }; + class GarrisonDeleteResult final : public ServerPacket + { + public: + GarrisonDeleteResult() : ServerPacket(SMSG_GARRISON_DELETE_RESULT, 4 + 4) { } + + WorldPacket const* Write() override; + + uint32 Result = 0; + uint32 GarrSiteID = 0; + }; + class GetGarrisonInfo final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c44f7b02d66..c9b9bf3a284 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1120,7 +1120,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CREATE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_DELETE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_DELETE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); |