diff options
Diffstat (limited to 'src/server/game')
-rw-r--r-- | src/server/game/Garrison/Garrison.cpp | 32 | ||||
-rw-r--r-- | src/server/game/Garrison/Garrison.h | 15 |
2 files changed, 30 insertions, 17 deletions
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 5bab93e7c23..c4bd9c256e9 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -346,13 +346,13 @@ Garrison::Plot const* Garrison::GetPlot(uint32 garrPlotInstanceId) const void Garrison::LearnBlueprint(uint32 garrBuildingId) { WorldPackets::Garrison::GarrisonLearnBlueprintResult learnBlueprintResult; - learnBlueprintResult.GarrTypeID = GARRISON_TYPE_GARRISON; + learnBlueprintResult.GarrTypeID = GetType(); learnBlueprintResult.BuildingID = garrBuildingId; learnBlueprintResult.Result = GARRISON_SUCCESS; if (!sGarrBuildingStore.LookupEntry(garrBuildingId)) learnBlueprintResult.Result = GARRISON_ERROR_INVALID_BUILDINGID; - else if (_knownBuildings.count(garrBuildingId)) + else if (HasBlueprint(garrBuildingId)) learnBlueprintResult.Result = GARRISON_ERROR_BLUEPRINT_EXISTS; else _knownBuildings.insert(garrBuildingId); @@ -363,13 +363,13 @@ void Garrison::LearnBlueprint(uint32 garrBuildingId) void Garrison::UnlearnBlueprint(uint32 garrBuildingId) { WorldPackets::Garrison::GarrisonUnlearnBlueprintResult unlearnBlueprintResult; - unlearnBlueprintResult.GarrTypeID = GARRISON_TYPE_GARRISON; + unlearnBlueprintResult.GarrTypeID = GetType(); unlearnBlueprintResult.BuildingID = garrBuildingId; unlearnBlueprintResult.Result = GARRISON_SUCCESS; if (!sGarrBuildingStore.LookupEntry(garrBuildingId)) unlearnBlueprintResult.Result = GARRISON_ERROR_INVALID_BUILDINGID; - else if (!_knownBuildings.count(garrBuildingId)) + else if (!HasBlueprint(garrBuildingId)) unlearnBlueprintResult.Result = GARRISON_ERROR_REQUIRES_BLUEPRINT; else _knownBuildings.erase(garrBuildingId); @@ -380,7 +380,7 @@ void Garrison::UnlearnBlueprint(uint32 garrBuildingId) void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) { WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult; - placeBuildingResult.GarrTypeID = GARRISON_TYPE_GARRISON; + placeBuildingResult.GarrTypeID = GetType(); placeBuildingResult.Result = CheckBuildingPlacement(garrPlotInstanceId, garrBuildingId); if (placeBuildingResult.Result == GARRISON_SUCCESS) { @@ -399,7 +399,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) { oldBuildingId = plot->BuildingInfo.PacketInfo->GarrBuildingID; if (sGarrBuildingStore.AssertEntry(oldBuildingId)->BuildingType != building->BuildingType) - plot->ClearBuildingInfo(_owner); + plot->ClearBuildingInfo(GetType(), _owner); } plot->SetBuildingInfo(placeBuildingResult.BuildingInfo, _owner); @@ -413,7 +413,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) if (oldBuildingId) { WorldPackets::Garrison::GarrisonBuildingRemoved buildingRemoved; - buildingRemoved.GarrTypeID = GARRISON_TYPE_GARRISON; + buildingRemoved.GarrTypeID = GetType(); buildingRemoved.Result = GARRISON_SUCCESS; buildingRemoved.GarrPlotInstanceID = garrPlotInstanceId; buildingRemoved.GarrBuildingID = oldBuildingId; @@ -429,7 +429,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) { WorldPackets::Garrison::GarrisonBuildingRemoved buildingRemoved; - buildingRemoved.GarrTypeID = GARRISON_TYPE_GARRISON; + buildingRemoved.GarrTypeID = GetType(); buildingRemoved.Result = CheckBuildingRemoval(garrPlotInstanceId); if (buildingRemoved.Result == GARRISON_SUCCESS) { @@ -442,7 +442,7 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) if (map) plot->DeleteGameObject(map); - plot->ClearBuildingInfo(_owner); + plot->ClearBuildingInfo(GetType(), _owner); _owner->SendDirectMessage(buildingRemoved.Write()); GarrBuildingEntry const* constructing = sGarrBuildingStore.AssertEntry(buildingRemoved.GarrBuildingID); @@ -457,7 +457,7 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) ASSERT(restored); WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult; - placeBuildingResult.GarrTypeID = GARRISON_TYPE_GARRISON; + placeBuildingResult.GarrTypeID = GetType(); placeBuildingResult.Result = GARRISON_SUCCESS; placeBuildingResult.BuildingInfo.GarrPlotInstanceID = garrPlotInstanceId; placeBuildingResult.BuildingInfo.GarrBuildingID = restored; @@ -500,7 +500,7 @@ void Garrison::ActivateBuilding(uint32 garrPlotInstanceId) void Garrison::AddFollower(uint32 garrFollowerId) { WorldPackets::Garrison::GarrisonAddFollowerResult addFollowerResult; - addFollowerResult.GarrTypeID = GARRISON_TYPE_GARRISON; + addFollowerResult.GarrTypeID = GetType(); GarrFollowerEntry const* followerEntry = sGarrFollowerStore.LookupEntry(garrFollowerId); if (_followerIds.count(garrFollowerId) || !followerEntry) { @@ -546,7 +546,7 @@ void Garrison::SendInfo() garrisonInfo.Garrisons.emplace_back(); WorldPackets::Garrison::GarrisonInfo& garrison = garrisonInfo.Garrisons.back(); - garrison.GarrTypeID = GARRISON_TYPE_GARRISON; + garrison.GarrTypeID = GetType(); garrison.GarrSiteID = _siteLevel->GarrSiteID; garrison.GarrSiteLevelID = _siteLevel->ID; garrison.NumFollowerActivationsRemaining = _followerActivationsRemainingToday; @@ -585,7 +585,7 @@ void Garrison::SendRemoteInfo() const void Garrison::SendBlueprintAndSpecializationData() { WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationDataResult data; - data.GarrTypeID = GARRISON_TYPE_GARRISON; + data.GarrTypeID = GetType(); data.BlueprintsKnown = &_knownBuildings; _owner->SendDirectMessage(data.Write()); } @@ -631,7 +631,7 @@ GarrisonError Garrison::CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 if (building->Flags & GARRISON_BUILDING_FLAG_NEEDS_PLAN) { - if (!_knownBuildings.count(garrBuildingId)) + if (!HasBlueprint(garrBuildingId)) return GARRISON_ERROR_REQUIRES_BLUEPRINT; } else // Building is built as a quest reward @@ -805,10 +805,10 @@ void Garrison::Plot::DeleteGameObject(Map* map) BuildingInfo.Guid.Clear(); } -void Garrison::Plot::ClearBuildingInfo(Player* owner) +void Garrison::Plot::ClearBuildingInfo(GarrisonType garrisonType, Player* owner) { WorldPackets::Garrison::GarrisonPlotPlaced plotPlaced; - plotPlaced.GarrTypeID = GARRISON_TYPE_GARRISON; + plotPlaced.GarrTypeID = garrisonType; plotPlaced.PlotInfo = &PacketInfo; owner->SendDirectMessage(plotPlaced.Write()); diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 295d4119565..0dd41482ec7 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -191,7 +191,7 @@ public: { GameObject* CreateGameObject(Map* map, GarrisonFactionIndex faction); void DeleteGameObject(Map* map); - void ClearBuildingInfo(Player* owner); + void ClearBuildingInfo(GarrisonType garrisonType, Player* owner); void SetBuildingInfo(WorldPackets::Garrison::GarrisonBuildingInfo const& buildingInfo, Player* owner); WorldPackets::Garrison::GarrisonPlotInfo PacketInfo; @@ -223,6 +223,8 @@ public: void Leave() const; GarrisonFactionIndex GetFaction() const; + GarrisonType GetType() const { return GARRISON_TYPE_GARRISON; } + GarrSiteLevelEntry const* GetSiteLevel() const { return _siteLevel; } // Plots std::vector<Plot*> GetPlots(); @@ -232,6 +234,7 @@ public: // Buildings void LearnBlueprint(uint32 garrBuildingId); void UnlearnBlueprint(uint32 garrBuildingId); + bool HasBlueprint(uint32 garrBuildingId) const { return _knownBuildings.find(garrBuildingId) != _knownBuildings.end(); } void PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId); void CancelBuildingConstruction(uint32 garrPlotInstanceId); void ActivateBuilding(uint32 garrPlotInstanceId); @@ -239,6 +242,16 @@ public: // Followers void AddFollower(uint32 garrFollowerId); Follower const* GetFollower(uint64 dbId) const; + template<typename Predicate> + uint32 CountFollowers(Predicate&& predicate) const + { + uint32 count = 0; + for (auto itr = _followers.begin(); itr != _followers.end(); ++itr) + if (predicate(itr->second)) + ++count; + + return count; + } void SendInfo(); void SendRemoteInfo() const; |