aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-06-23 00:05:51 +0200
committerShauren <shauren.trinity@gmail.com>2015-06-23 00:05:51 +0200
commit73384e56d48cd0495c4926f163e435d75660624f (patch)
tree0bf711497a4012c1a10d52c9b93723e5ad64d0e0 /src/server/game
parent812fa65c613ecaa603dafc708df0088f3b50a90e (diff)
Core/Garrisons: Implemented spawning "Finalize Garrison Plot" gameobjects when building under construction is ready
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Garrison/Garrison.cpp35
-rw-r--r--src/server/game/Garrison/GarrisonMgr.cpp99
-rw-r--r--src/server/game/Garrison/GarrisonMgr.h13
3 files changed, 140 insertions, 7 deletions
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp
index 12c924c1f30..99db2336566 100644
--- a/src/server/game/Garrison/Garrison.cpp
+++ b/src/server/game/Garrison/Garrison.cpp
@@ -649,16 +649,39 @@ GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex fact
}
Position const& pos = PacketInfo.PlotPos;
- GameObject* go = new GameObject();
- if (!go->Create(map->GenerateLowGuid<HighGuid::GameObject>(), entry, map, 0, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(),
- 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_ACTIVE))
+ GameObject* building = new GameObject();
+ if (!building->Create(map->GenerateLowGuid<HighGuid::GameObject>(), entry, map, 0, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(),
+ 0.0f, 0.0f, 0.0f, 0.0f, 255, GO_STATE_READY))
{
- delete go;
+ delete building;
return nullptr;
}
- BuildingInfo.Guid = go->GetGUID();
- return go;
+ if (BuildingInfo.CanActivate() && BuildingInfo.PacketInfo && !BuildingInfo.PacketInfo->Active)
+ {
+ if (FinalizeGarrisonPlotGOInfo const* finalizeInfo = sGarrisonMgr.GetPlotFinalizeGOInfo(PacketInfo.GarrPlotInstanceID))
+ {
+ Position const& pos2 = finalizeInfo->FactionInfo[faction].Pos;
+ GameObject* finalizer = new GameObject();
+ if (finalizer->Create(map->GenerateLowGuid<HighGuid::GameObject>(), finalizeInfo->FactionInfo[faction].GameObjectId, map, 0, pos2.GetPositionX(), pos2.GetPositionY(),
+ pos2.GetPositionZ(), pos2.GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 255, GO_STATE_READY))
+ {
+ // set some spell id to make the object delete itself after use
+ finalizer->SetSpellId(finalizer->GetGOInfo()->goober.spell);
+ finalizer->SetRespawnTime(0);
+
+ if (uint16 animKit = finalizeInfo->FactionInfo[faction].AnimKitId)
+ finalizer->SetAIAnimKitId(animKit);
+
+ map->AddToMap(finalizer);
+ }
+ else
+ delete finalizer;
+ }
+ }
+
+ BuildingInfo.Guid = building->GetGUID();
+ return building;
}
void Garrison::Plot::DeleteGameObject(Map* map)
diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp
index f95acef952c..7da1c929c43 100644
--- a/src/server/game/Garrison/GarrisonMgr.cpp
+++ b/src/server/game/Garrison/GarrisonMgr.cpp
@@ -58,6 +58,7 @@ void GarrisonMgr::Initialize()
}
InitializeDbIdSequences();
+ LoadPlotFinalizeGOInfo();
LoadFollowerClassSpecAbilities();
}
@@ -121,6 +122,15 @@ GarrBuildingEntry const* GarrisonMgr::GetPreviousLevelBuilding(uint32 buildingTy
return nullptr;
}
+FinalizeGarrisonPlotGOInfo const* GarrisonMgr::GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const
+{
+ auto itr = _finalizePlotGOInfo.find(garrPlotInstanceID);
+ if (itr != _finalizePlotGOInfo.end())
+ return &itr->second;
+
+ return nullptr;
+}
+
uint64 GarrisonMgr::GenerateFollowerDbId()
{
if (_followerDbIdGenerator >= std::numeric_limits<uint64>::max())
@@ -312,6 +322,92 @@ void GarrisonMgr::InitializeDbIdSequences()
_followerDbIdGenerator = (*result)[0].GetUInt64() + 1;
}
+void GarrisonMgr::LoadPlotFinalizeGOInfo()
+{
+ // 0 1 2 3 4 5 6
+ QueryResult result = WorldDatabase.Query("SELECT garrPlotInstanceId, hordeGameObjectId, hordeX, hordeY, hordeZ, hordeO, hordeAnimKitId, "
+ // 7 8 9 10 11 12
+ "allianceGameObjectId, allianceX, allianceY, allianceZ, allianceO, allianceAnimKitId FROM garrison_plot_finalize_info");
+ if (!result)
+ {
+ TC_LOG_INFO("server.loading", ">> Loaded 0 garrison follower class spec abilities. DB table `garrison_plot_finalize_info` is empty.");
+ return;
+ }
+
+ uint32 msTime = getMSTime();
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 garrPlotInstanceId = fields[0].GetUInt32();
+ uint32 hordeGameObjectId = fields[1].GetUInt32();
+ uint32 allianceGameObjectId = fields[7].GetUInt32();
+ uint16 hordeAnimKitId = fields[6].GetUInt16();
+ uint16 allianceAnimKitId = fields[12].GetUInt16();
+
+ if (!sGarrPlotInstanceStore.LookupEntry(garrPlotInstanceId))
+ {
+ TC_LOG_ERROR("sql.sql", "Non-existing GarrPlotInstance.db2 entry %u was referenced in `garrison_plot_finalize_info`.", garrPlotInstanceId);
+ continue;
+ }
+
+ GameObjectTemplate const* goTemplate = sObjectMgr->GetGameObjectTemplate(hordeGameObjectId);
+ if (!goTemplate)
+ {
+ TC_LOG_ERROR("sql.sql", "Non-existing gameobject_template entry %u was referenced in `garrison_plot_finalize_info`.`hordeGameObjectId` for garrPlotInstanceId %u.",
+ hordeGameObjectId, garrPlotInstanceId);
+ continue;
+ }
+
+ if (goTemplate->type != GAMEOBJECT_TYPE_GOOBER)
+ {
+ TC_LOG_ERROR("sql.sql", "Invalid gameobject type %u (entry %u) was referenced in `garrison_plot_finalize_info`.`hordeGameObjectId` for garrPlotInstanceId %u.",
+ goTemplate->type, hordeGameObjectId, garrPlotInstanceId);
+ continue;
+ }
+
+ goTemplate = sObjectMgr->GetGameObjectTemplate(allianceGameObjectId);
+ if (!goTemplate)
+ {
+ TC_LOG_ERROR("sql.sql", "Non-existing gameobject_template entry %u was referenced in `garrison_plot_finalize_info`.`allianceGameObjectId` for garrPlotInstanceId %u.",
+ allianceGameObjectId, garrPlotInstanceId);
+ continue;
+ }
+
+ if (goTemplate->type != GAMEOBJECT_TYPE_GOOBER)
+ {
+ TC_LOG_ERROR("sql.sql", "Invalid gameobject type %u (entry %u) was referenced in `garrison_plot_finalize_info`.`allianceGameObjectId` for garrPlotInstanceId %u.",
+ goTemplate->type, allianceGameObjectId, garrPlotInstanceId);
+ continue;
+ }
+
+ if (hordeAnimKitId && !sAnimKitStore.LookupEntry(hordeAnimKitId))
+ {
+ TC_LOG_ERROR("sql.sql", "Non-existing AnimKit.dbc entry %u was referenced in `garrison_plot_finalize_info`.`hordeAnimKitId` for garrPlotInstanceId %u.",
+ hordeAnimKitId, garrPlotInstanceId);
+ continue;
+ }
+
+ if (allianceAnimKitId && !sAnimKitStore.LookupEntry(allianceAnimKitId))
+ {
+ TC_LOG_ERROR("sql.sql", "Non-existing AnimKit.dbc entry %u was referenced in `garrison_plot_finalize_info`.`allianceAnimKitId` for garrPlotInstanceId %u.",
+ allianceAnimKitId, garrPlotInstanceId);
+ continue;
+ }
+
+ FinalizeGarrisonPlotGOInfo& info = _finalizePlotGOInfo[garrPlotInstanceId];
+ info.FactionInfo[GARRISON_FACTION_INDEX_HORDE].GameObjectId = hordeGameObjectId;
+ info.FactionInfo[GARRISON_FACTION_INDEX_HORDE].Pos.Relocate(fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat(), fields[5].GetFloat());
+ info.FactionInfo[GARRISON_FACTION_INDEX_HORDE].AnimKitId = hordeAnimKitId;
+
+ info.FactionInfo[GARRISON_FACTION_INDEX_ALLIANCE].GameObjectId = allianceGameObjectId;
+ info.FactionInfo[GARRISON_FACTION_INDEX_ALLIANCE].Pos.Relocate(fields[8].GetFloat(), fields[9].GetFloat(), fields[10].GetFloat(), fields[11].GetFloat());
+ info.FactionInfo[GARRISON_FACTION_INDEX_ALLIANCE].AnimKitId = allianceAnimKitId;
+
+ } while (result->NextRow());
+
+ TC_LOG_INFO("server.loading", ">> Loaded %u garrison plot finalize entries in %u.", uint32(_finalizePlotGOInfo.size()), GetMSTimeDiffToNow(msTime));
+}
+
void GarrisonMgr::LoadFollowerClassSpecAbilities()
{
QueryResult result = WorldDatabase.Query("SELECT classSpecId, abilityId FROM garrison_follower_class_spec_abilities");
@@ -321,6 +417,7 @@ void GarrisonMgr::LoadFollowerClassSpecAbilities()
return;
}
+ uint32 msTime = getMSTime();
uint32 count = 0;
do
{
@@ -349,5 +446,5 @@ void GarrisonMgr::LoadFollowerClassSpecAbilities()
for (auto& pair : _garrisonFollowerClassSpecAbilities)
pair.second.sort();
- TC_LOG_INFO("server.loading", ">> Loaded %u garrison follower class spec abilities.", count);
+ TC_LOG_INFO("server.loading", ">> Loaded %u garrison follower class spec abilities in %u.", count, GetMSTimeDiffToNow(msTime));
}
diff --git a/src/server/game/Garrison/GarrisonMgr.h b/src/server/game/Garrison/GarrisonMgr.h
index 63810e3c3ab..26fc6867f0c 100644
--- a/src/server/game/Garrison/GarrisonMgr.h
+++ b/src/server/game/Garrison/GarrisonMgr.h
@@ -21,6 +21,16 @@
#include "DB2Stores.h"
#include <unordered_set>
+struct FinalizeGarrisonPlotGOInfo
+{
+ struct
+ {
+ uint32 GameObjectId;
+ Position Pos;
+ uint16 AnimKitId;
+ } FactionInfo[2];
+};
+
struct GarrAbilities
{
std::unordered_set<GarrAbilityEntry const*> Counters;
@@ -44,12 +54,14 @@ public:
bool IsPlotMatchingBuilding(uint32 garrPlotId, uint32 garrBuildingId) const;
uint32 GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSiteLevelPlotInstId) const;
GarrBuildingEntry const* GetPreviousLevelBuilding(uint32 buildingType, uint32 currentLevel) const;
+ FinalizeGarrisonPlotGOInfo const* GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const;
uint64 GenerateFollowerDbId();
std::list<GarrAbilityEntry const*> RollFollowerAbilities(GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const;
std::list<GarrAbilityEntry const*> GetClassSpecAbilities(GarrFollowerEntry const* follower, uint32 faction) const;
private:
void InitializeDbIdSequences();
+ void LoadPlotFinalizeGOInfo();
void LoadFollowerClassSpecAbilities();
std::unordered_map<uint32 /*garrSiteId*/, std::vector<GarrSiteLevelPlotInstEntry const*>> _garrisonPlotInstBySiteLevel;
@@ -57,6 +69,7 @@ private:
std::unordered_map<uint32 /*garrPlotId*/, std::unordered_set<uint32/*garrBuildingId*/>> _garrisonBuildingsByPlot;
std::unordered_map<uint64 /*garrBuildingId | garrSiteLevelPlotInstId << 32*/, uint32 /*garrBuildingPlotInstId*/> _garrisonBuildingPlotInstances;
std::unordered_map<uint32 /*buildingType*/, std::vector<GarrBuildingEntry const*>> _garrisonBuildingsByType;
+ std::unordered_map<uint32 /*garrPlotInstanceId*/, FinalizeGarrisonPlotGOInfo> _finalizePlotGOInfo;
std::unordered_map<uint32 /*garrFollowerId*/, GarrAbilities> _garrisonFollowerAbilities[2];
std::unordered_map<uint32 /*classSpecId*/, std::list<GarrAbilityEntry const*>> _garrisonFollowerClassSpecAbilities;
std::set<GarrAbilityEntry const*> _garrisonFollowerRandomTraits;