diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-06-22 00:02:02 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-06-22 00:02:43 +0200 |
commit | 812fa65c613ecaa603dafc708df0088f3b50a90e (patch) | |
tree | e64f0c167d338beb2e674f653cb036cc647d1f19 | |
parent | 881ebccdc4a0995732aea2052f85015aebe6f9a2 (diff) |
Core/Garrisons: Implemented activating buildings
-rw-r--r-- | src/server/game/Garrison/Garrison.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Garrison/Garrison.h | 3 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GarrisonPackets.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GarrisonPackets.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 14 |
7 files changed, 56 insertions, 4 deletions
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 749ebb562c5..12c924c1f30 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -133,7 +133,7 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue return true; } -void Garrison::SaveToDB(SQLTransaction& trans) +void Garrison::SaveToDB(SQLTransaction trans) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); @@ -431,6 +431,27 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) _owner->SendDirectMessage(buildingRemoved.Write()); } +void Garrison::ActivateBuilding(uint32 garrPlotInstanceId) +{ + if (Plot* plot = GetPlot(garrPlotInstanceId)) + { + if (plot->BuildingInfo.CanActivate() && plot->BuildingInfo.PacketInfo && !plot->BuildingInfo.PacketInfo->Active) + { + plot->BuildingInfo.PacketInfo->Active = true; + if (Map* map = FindMap()) + { + plot->DeleteGameObject(map); + if (GameObject* go = plot->CreateGameObject(map, GetFaction())) + map->AddToMap(go); + } + + WorldPackets::Garrison::GarrisonBuildingActivated buildingActivated; + buildingActivated.GarrPlotInstanceID = garrPlotInstanceId; + _owner->SendDirectMessage(buildingActivated.Write()); + } + } +} + void Garrison::AddFollower(uint32 garrFollowerId) { WorldPackets::Garrison::GarrisonAddFollowerResult addFollowerResult; diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 71d67a1b6b5..041d20d13b0 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -109,7 +109,7 @@ public: bool LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blueprints, PreparedQueryResult buildings, PreparedQueryResult followers, PreparedQueryResult abilities); - void SaveToDB(SQLTransaction& trans); + void SaveToDB(SQLTransaction trans); bool Create(uint32 garrSiteId); void Upgrade(); @@ -129,6 +129,7 @@ public: void UnlearnBlueprint(uint32 garrBuildingId); void PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId); void CancelBuildingConstruction(uint32 garrPlotInstanceId); + void ActivateBuilding(uint32 garrPlotInstanceId); // Followers void AddFollower(uint32 garrFollowerId); diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 88374e7ce62..1e5055442a0 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -245,3 +245,10 @@ WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Garrison::GarrisonBuildingActivated::Write() +{ + _worldPacket << uint32(GarrPlotInstanceID); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index 1bb04c7ba95..6c39df1e532 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -279,6 +279,16 @@ namespace WorldPackets GarrisonFollower Follower; uint32 Result = 0; }; + + class GarrisonBuildingActivated final : public ServerPacket + { + public: + GarrisonBuildingActivated() : ServerPacket(SMSG_GARRISON_BUILDING_ACTIVATED, 4) { } + + WorldPacket const* Write() override; + + uint32 GarrPlotInstanceID = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index dca44c9a415..386da54ddca 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1113,7 +1113,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_ACTIVATED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_ACTIVATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_LANDMARKS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index ec716a0e03d..77abd3c78c2 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -409,6 +409,7 @@ class Spell void EffectLearnGarrisonBuilding(SpellEffIndex effIndex); void EffectCreateGarrison(SpellEffIndex effIndex); void EffectAddGarrisonFollower(SpellEffIndex effIndex); + void EffectActivateGarrisonBuilding(SpellEffIndex effIndex); typedef std::set<Aura*> UsedSpellMods; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 36e544de3bd..e4bef46b3bb 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -299,7 +299,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //221 SPELL_EFFECT_221 &Spell::EffectNULL, //222 SPELL_EFFECT_CREATE_HEIRLOOM_ITEM &Spell::EffectNULL, //223 SPELL_EFFECT_CHANGE_ITEM_BONUSES - &Spell::EffectNULL, //224 SPELL_EFFECT_ACTIVATE_GARRISON_BUILDING + &Spell::EffectActivateGarrisonBuilding, //224 SPELL_EFFECT_ACTIVATE_GARRISON_BUILDING &Spell::EffectNULL, //225 SPELL_EFFECT_GRANT_BATTLEPET_LEVEL &Spell::EffectNULL, //226 SPELL_EFFECT_226 &Spell::EffectNULL, //227 SPELL_EFFECT_227 @@ -5859,3 +5859,15 @@ void Spell::EffectAddGarrisonFollower(SpellEffIndex effIndex) if (Garrison* garrison = unitTarget->ToPlayer()->GetGarrison()) garrison->AddFollower(GetEffect(effIndex)->MiscValue); } + +void Spell::EffectActivateGarrisonBuilding(SpellEffIndex effIndex) +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + if (Garrison* garrison = unitTarget->ToPlayer()->GetGarrison()) + garrison->ActivateBuilding(GetEffect(effIndex)->MiscValue); +} |