diff options
-rw-r--r-- | sql/updates/world/2015_06_27_00_world.sql | 91 | ||||
-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 |
5 files changed, 167 insertions, 1 deletions
diff --git a/sql/updates/world/2015_06_27_00_world.sql b/sql/updates/world/2015_06_27_00_world.sql new file mode 100644 index 00000000000..b281002c7d6 --- /dev/null +++ b/sql/updates/world/2015_06_27_00_world.sql @@ -0,0 +1,91 @@ +DELETE FROM `gameobject_template` WHERE `entry` IN (231217,233249,236187,236186,231964,236188,236177,236176,233248,236175,236185,230867); +INSERT INTO `gameobject_template` (`entry`,`type`,`displayId`,`name`,`IconName`,`castBarCaption`,`unk1`,`faction`,`flags`,`size`,`Data0`,`Data1`,`Data2`,`Data3`,`Data4`,`Data5`,`Data6`,`Data7`,`Data8`,`Data9`,`Data10`,`Data11`,`Data12`,`Data13`,`Data14`,`Data15`,`Data16`,`Data17`,`Data18`,`Data19`,`Data20`,`Data21`,`Data22`,`Data23`,`Data24`,`Data25`,`Data26`,`Data27`,`Data28`,`Data29`,`Data30`,`Data31`,`Data32`,`unkInt32`,`AIName`,`ScriptName`,`VerifiedBuild`) VALUES +(231217,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,162743,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(233249,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,166877,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(236187,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,172105,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(236186,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,172104,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(231964,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,164610,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(236188,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,172414,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(236177,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,172056,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(236176,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,172043,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(233248,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,163215,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(236175,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,172040,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(236185,10,18018,'Finalize Garrison Plot','architect','Finalizing','',0,0,2,1691,0,0,3000,0,0,0,0,0,0,172083,0,0,0,83562,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,'','',19865), +(230867,5,16265,'Under Construction Cloud','','','',0,32,0.35,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'','',19865); + +UPDATE `creature_template` SET `minlevel`=90,`maxlevel`=90,`faction`=714,`unit_flags`=0x8000 WHERE `entry`=78467; +UPDATE `creature_model_info` SET `BoundingRadius`=0.372,`CombatReach`=1.5 WHERE `DisplayID`=59254; + +SET @PEON := 228; +DELETE FROM `creature` WHERE `guid` BETWEEN @PEON AND @PEON+28; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseId`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`MovementType`) VALUES +(@PEON+00,78467,1353,2,0,-1.037787,0.272035,2.163010,3.930394,7200,0,0), +(@PEON+01,78467,1353,2,0,-2.149102,3.247060,2.163010,2.693754,7200,0,0), +(@PEON+02,78467,1353,2,0,1.758662,8.978440,2.163010,3.050084,7200,0,0), +(@PEON+03,78467,1353,2,0,10.771531,2.919150,2.163010,2.724154,7200,0,0), +(@PEON+04,78467,1353,2,0,10.959270,-2.766289,2.163010,3.920824,7200,0,0), +(@PEON+05,78467,1353,2,0,13.544037,-6.562311,8.610001,5.424888,7200,0,0), +(@PEON+06,78467,1353,2,0,15.100115,-6.952090,11.637009,3.331964,7200,0,0), +(@PEON+07,78467,1353,2,0,2.979650,-9.391919,2.161011,2.745454,7200,0,0), +(@PEON+08,78467,1353,2,0,6.507762,-14.418222,2.163010,4.573184,7200,0,0), +(@PEON+09,78467,1353,2,0,6.980373,21.202633,8.955002,0.177844,7200,0,0), +(@PEON+10,78467,1353,2,0,9.172408,12.214418,2.163010,1.355784,7200,0,0), +(@PEON+11,78467,1354,2,0,-2.376850,-1.938201,1.178009,3.765444,7200,0,0), +(@PEON+12,78467,1354,2,0,-3.979343,-6.312402,7.108002,2.176954,7200,0,0), +(@PEON+13,78467,1354,2,0,-4.827291,4.064543,1.178009,4.593574,7200,0,0), +(@PEON+14,78467,1354,2,0,10.152680,0.077213,1.178009,2.171654,7200,0,0), +(@PEON+15,78467,1354,2,0,14.417463,0.781982,1.178009,2.831924,7200,0,0), +(@PEON+16,78467,1354,2,0,15.252268,-3.258279,1.178009,4.914564,7200,0,0), +(@PEON+17,78467,1354,2,0,3.077893,-9.743636,1.163010,3.424174,7200,0,0), +(@PEON+18,78467,1354,2,0,3.734778,9.195932,7.473999,4.934684,7200,0,0), +(@PEON+19,78467,1354,2,0,5.343877,2.729449,1.178009,2.157304,7200,0,0), +(@PEON+20,78467,1354,2,0,6.048157,-6.359730,1.178009,5.548074,7200,0,0), +(@PEON+21,78467,1354,2,0,6.890800,-10.220474,4.296005,1.145594,7200,0,0), +(@PEON+22,78467,1371,2,0,-3.689185,-1.491618,3.751007,3.119459,7200,0,0), +(@PEON+23,78467,1371,2,0,-5.583674,-3.473835,6.037003,4.445419,7200,0,0), +(@PEON+24,78467,1371,2,0,0.410911,-1.188165,1.052002,3.581499,7200,0,0), +(@PEON+25,78467,1371,2,0,1.241397,5.063163,1.052002,2.175249,7200,0,0), +(@PEON+26,78467,1371,2,0,1.437477,8.185573,1.174004,5.726631,7200,0,0), +(@PEON+27,78467,1371,2,0,2.748763,-6.646344,1.052002,4.194179,7200,0,0), +(@PEON+28,78467,1371,2,0,4.704940,-7.203648,6.174004,0.718819,7200,0,0); + +DELETE FROM `creature_addon` WHERE `guid` IN (@PEON+6,@PEON+12,@PEON+23,@PEON+28); +INSERT INTO `creature_addon` (`guid`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES +(@PEON+06,0,0x1000003,0x1,'55474'), -- Frostwall Peon - Cosmetic - Sleep Zzz +(@PEON+12,0,0x1000003,0x1,'55474'), -- Frostwall Peon - Cosmetic - Sleep Zzz +(@PEON+23,0,0x1000003,0x1,'55474'), -- Frostwall Peon - Cosmetic - Sleep Zzz +(@PEON+28,0,0x8,0x1,''); -- Frostwall Peon + +DELETE FROM `creature_template_addon` WHERE `entry`=78467; +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(78467,0,0x0,0x1,173,''); -- Frostwall Peon + +DELETE FROM `creature_equip_template` WHERE `CreatureID`=78467; +INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES +(78467,1,5956,0,0); -- Frostwall Peon + +SET @CLOUD := 22; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @CLOUD AND @CLOUD+21; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseId`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@CLOUD+00,230867,1353,2,0,-1.602455,-0.805748,2.080002,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+01,230867,1353,2,0,-2.184269,4.333852,3.819000,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+02,230867,1353,2,0,-3.610352,3.829465,3.322998,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+03,230867,1353,2,0,0.507770,9.083573,2.085007,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+04,230867,1353,2,0,1.141878,-8.836224,2.078003,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+05,230867,1353,2,0,2.937370,-8.619312,2.079010,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+06,230867,1353,2,0,7.302363,-16.362539,2.080002,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+07,230867,1353,2,0,8.685335,3.850828,3.316010,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+08,230867,1353,2,0,9.477190,-3.942071,3.108002,0.000001,0,0,0,1,7200,255,1), +(@CLOUD+09,230867,1354,2,0,-2.885510,-3.267375,2.942001,6.195914,0,0,0,1,7200,255,1), +(@CLOUD+10,230867,1354,2,0,-5.703460,-2.703973,2.419006,6.195914,0,0,0,1,7200,255,1), +(@CLOUD+11,230867,1354,2,0,12.723060,2.317318,7.229004,6.195914,0,0,0,1,7200,255,1), +(@CLOUD+12,230867,1354,2,0,13.395262,1.437059,2.212997,6.195914,0,0,0,1,7200,255,1), +(@CLOUD+13,230867,1354,2,0,2.362132,-5.047787,0.326996,6.195914,0,0,0,1,7200,255,1), +(@CLOUD+14,230867,1354,2,0,4.062244,-9.205985,5.154999,6.195914,0,0,0,1,7200,255,1), +(@CLOUD+15,230867,1354,2,0,6.416709,-7.086459,2.380005,6.195914,0,0,0,1,7200,255,1), +(@CLOUD+16,230867,1371,2,0,-0.286411,5.867835,2.477005,0.000000,0,0,0,1,7200,255,1), +(@CLOUD+17,230867,1371,2,0,-0.435432,-1.463116,2.343002,0.000000,0,0,0,1,7200,255,1), +(@CLOUD+18,230867,1371,2,0,-5.173488,-1.854540,4.764000,0.000000,0,0,0,1,7200,255,1), +(@CLOUD+19,230867,1371,2,0,2.071243,8.033276,2.346001,0.000000,0,0,0,1,7200,255,1), +(@CLOUD+20,230867,1371,2,0,2.267101,-7.889375,2.452003,0.000000,0,0,0,1,7200,255,1), +(@CLOUD+21,230867,1371,2,0,5.497054,-5.979848,6.371002,0.000000,0,0,0,1,7200,255,1); 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; |