diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Vehicle/VehicleDefines.h | 1 | ||||
-rw-r--r-- | src/server/game/Garrison/Garrison.cpp | 71 | ||||
-rw-r--r-- | src/server/game/Garrison/Garrison.h | 1 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 4 |
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; |