aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h1
-rw-r--r--src/server/game/Garrison/Garrison.cpp71
-rw-r--r--src/server/game/Garrison/Garrison.h1
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp4
4 files changed, 76 insertions, 1 deletions
diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h
index 5569fcbf353..d0221e3e812 100644
--- a/src/server/game/Entities/Vehicle/VehicleDefines.h
+++ b/src/server/game/Entities/Vehicle/VehicleDefines.h
@@ -129,7 +129,6 @@ public:
/// This method transforms supplied global coordinates into local offsets
virtual void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const = 0;
-protected:
static void CalculatePassengerPosition(float& x, float& y, float& z, float* o, float transX, float transY, float transZ, float transO)
{
float inx = x, iny = y, inz = z;
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();
diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h
index e6e44d5f83a..7123854cbc6 100644
--- a/src/server/game/Garrison/Garrison.h
+++ b/src/server/game/Garrison/Garrison.h
@@ -82,6 +82,7 @@ public:
bool CanActivate() const;
ObjectGuid Guid;
+ std::unordered_set<ObjectGuid> Spawns;
Optional<WorldPackets::Garrison::GarrisonBuildingInfo> PacketInfo;
};
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index bdfd66429cb..fd160532616 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -6678,6 +6678,10 @@ void ObjectMgr::LoadGameObjectTemplate()
case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
break;
+ case GAMEOBJECT_TYPE_GARRISON_BUILDING:
+ if (uint32 transportMap = got.garrisonBuilding.mapID)
+ _transportMaps.insert(transportMap);
+ break;
}
++count;