aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-06-24 00:03:57 +0200
committerShauren <shauren.trinity@gmail.com>2015-06-24 00:03:57 +0200
commitacc45bcf5d657671d9348e95f069ad17e1bb5631 (patch)
treee76f661fef9f897281b94fa833f50de4f8f717b7
parentd799e0cee0c522ebe389b042201ff0981baaba39 (diff)
Core/Garrisons: Implemented a method to delete garrisons
-rw-r--r--src/server/game/Entities/Player/Player.cpp25
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Garrison/Garrison.cpp49
-rw-r--r--src/server/game/Garrison/Garrison.h2
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.h11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
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);