aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Garrison/Garrison.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-06-27 15:29:42 +0200
committerShauren <shauren.trinity@gmail.com>2015-06-27 15:29:42 +0200
commitccb55fb90100ad3aac76df85212967e98e205896 (patch)
tree88e1f1aa7fbe8d7a07c3790418805bc2b97702ae /src/server/game/Garrison/Garrison.cpp
parent3d6abdb2ff3b4f672890ce9762fa5eefbcf111c8 (diff)
Core/Garrisons: Implemented building spawns
Diffstat (limited to 'src/server/game/Garrison/Garrison.cpp')
-rw-r--r--src/server/game/Garrison/Garrison.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp
index 47cefda447c..e5aa0aab5cd 100644
--- a/src/server/game/Garrison/Garrison.cpp
+++ b/src/server/game/Garrison/Garrison.cpp
@@ -16,10 +16,12 @@
*/
#include "Garrison.h"
+#include "Creature.h"
#include "GameObject.h"
#include "GarrisonMgr.h"
#include "MapManager.h"
#include "ObjectMgr.h"
+#include "VehicleDefines.h"
Garrison::Garrison(Player* owner) : _owner(owner), _siteLevel(nullptr), _followerActivationsRemainingToday(1)
{
@@ -645,6 +647,40 @@ GarrisonError Garrison::CheckBuildingRemoval(uint32 garrPlotInstanceId) const
return GARRISON_SUCCESS;
}
+template<class T, void(T::*SecondaryRelocate)(float,float,float,float)>
+T* BuildingSpawnHelper(GameObject* building, ObjectGuid::LowType spawnId, Map* map)
+{
+ T* spawn = new T();
+ if (!spawn->LoadFromDB(spawnId, map))
+ {
+ delete spawn;
+ return nullptr;
+ }
+
+ float x = spawn->GetPositionX();
+ float y = spawn->GetPositionY();
+ float z = spawn->GetPositionZ();
+ float o = spawn->GetOrientation();
+ TransportBase::CalculatePassengerPosition(x, y, z, &o, building->GetPositionX(), building->GetPositionY(), building->GetPositionZ(), building->GetOrientation());
+
+ spawn->Relocate(x, y, z, o);
+ (spawn->*SecondaryRelocate)(x, y, z, o);
+
+ if (!spawn->IsPositionValid())
+ {
+ delete spawn;
+ return nullptr;
+ }
+
+ if (!map->AddToMap(spawn))
+ {
+ delete spawn;
+ return nullptr;
+ }
+
+ return spawn;
+}
+
GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex faction)
{
uint32 entry = EmptyGameObjectId;
@@ -697,6 +733,20 @@ GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex fact
}
}
+ if (building->GetGoType() == GAMEOBJECT_TYPE_GARRISON_BUILDING && building->GetGOInfo()->garrisonBuilding.mapID)
+ {
+ for (CellObjectGuidsMap::value_type const& cellGuids : sObjectMgr->GetMapObjectGuids(building->GetGOInfo()->garrisonBuilding.mapID, map->GetSpawnMode()))
+ {
+ for (ObjectGuid::LowType spawnId : cellGuids.second.creatures)
+ if (Creature* spawn = BuildingSpawnHelper<Creature, &Creature::SetHomePosition>(building, spawnId, map))
+ BuildingInfo.Spawns.insert(spawn->GetGUID());
+
+ for (ObjectGuid::LowType spawnId : cellGuids.second.gameobjects)
+ if (GameObject* spawn = BuildingSpawnHelper<GameObject, &GameObject::RelocateStationaryPosition>(building, spawnId, map))
+ BuildingInfo.Spawns.insert(spawn->GetGUID());
+ }
+ }
+
BuildingInfo.Guid = building->GetGUID();
return building;
}
@@ -706,6 +756,27 @@ void Garrison::Plot::DeleteGameObject(Map* map)
if (BuildingInfo.Guid.IsEmpty())
return;
+ for (ObjectGuid const& guid : BuildingInfo.Spawns)
+ {
+ WorldObject* object = nullptr;
+ switch (guid.GetHigh())
+ {
+ case HighGuid::Creature:
+ object = map->GetCreature(guid);
+ break;
+ case HighGuid::GameObject:
+ object = map->GetGameObject(guid);
+ break;
+ default:
+ continue;
+ }
+
+ if (object)
+ object->AddObjectToRemoveList();
+ }
+
+ BuildingInfo.Spawns.clear();
+
if (GameObject* oldBuilding = map->GetGameObject(BuildingInfo.Guid))
oldBuilding->Delete();