TrinityCore
Garrison.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef Garrison_h__
19#define Garrison_h__
20
21#include "Define.h"
22#include "DatabaseEnvFwd.h"
23#include "GarrisonPackets.h"
24#include "Optional.h"
25#include "QuaternionData.h"
26#include <unordered_map>
27
28class GameObject;
29class Map;
30class Player;
32
34{
39};
40
42{
45};
46
48{
50};
51
53{
55};
56
58{
64};
65
67{
79};
80
82{
173
175{
182
184{
185public:
186 struct Building
187 {
188 bool CanActivate() const;
189
191 std::unordered_set<ObjectGuid> Spawns;
193 };
194
195 struct Plot
196 {
197 GameObject* CreateGameObject(Map* map, GarrisonFactionIndex faction);
198 void DeleteGameObject(Map* map);
199 void ClearBuildingInfo(GarrisonType garrisonType, Player* owner);
200 void SetBuildingInfo(WorldPackets::Garrison::GarrisonBuildingInfo const& buildingInfo, Player* owner);
201
204 uint32 EmptyGameObjectId = 0;
205 uint32 GarrSiteLevelPlotInstId = 0;
207 };
208
209 struct Follower
210 {
211 uint32 GetItemLevel() const;
212 bool HasAbility(uint32 garrAbilityId) const;
213
215 };
216
217 explicit Garrison(Player* owner);
218
219 bool LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blueprints, PreparedQueryResult buildings,
220 PreparedQueryResult followers, PreparedQueryResult abilities);
222 static void DeleteFromDB(ObjectGuid::LowType ownerGuid, CharacterDatabaseTransaction trans);
223
224 bool Create(uint32 garrSiteId);
225 void Delete();
226 void Upgrade();
227
228 void Enter() const;
229 void Leave() const;
230
231 GarrisonFactionIndex GetFaction() const;
233 GarrSiteLevelEntry const* GetSiteLevel() const { return _siteLevel; }
234
235 // Plots
236 std::vector<Plot*> GetPlots();
237 Plot* GetPlot(uint32 garrPlotInstanceId);
238 Plot const* GetPlot(uint32 garrPlotInstanceId) const;
239
240 // Buildings
241 void LearnBlueprint(uint32 garrBuildingId);
242 void UnlearnBlueprint(uint32 garrBuildingId);
243 bool HasBlueprint(uint32 garrBuildingId) const { return _knownBuildings.find(garrBuildingId) != _knownBuildings.end(); }
244 void PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId);
245 void CancelBuildingConstruction(uint32 garrPlotInstanceId);
246 void ActivateBuilding(uint32 garrPlotInstanceId);
247
248 // Followers
249 void AddFollower(uint32 garrFollowerId);
250 Follower const* GetFollower(uint64 dbId) const;
251 template<typename Predicate>
252 uint32 CountFollowers(Predicate&& predicate) const
253 {
254 uint32 count = 0;
255 for (auto itr = _followers.begin(); itr != _followers.end(); ++itr)
256 if (predicate(itr->second))
257 ++count;
258
259 return count;
260 }
261
262 void SendInfo();
263 void SendRemoteInfo() const;
264 void SendBlueprintAndSpecializationData();
265 void SendMapData(Player* receiver) const;
266
267 void ResetFollowerActivationLimit() { _followerActivationsRemainingToday = 1; }
268
269private:
270 Map* FindMap() const;
271 void InitializePlots();
272 GarrisonError CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 garrBuildingId) const;
273 GarrisonError CheckBuildingRemoval(uint32 garrPlotInstanceId) const;
277
278 std::unordered_map<uint32 /*garrPlotInstanceId*/, Plot> _plots;
279 std::unordered_set<uint32 /*garrBuildingId*/> _knownBuildings;
280 std::unordered_map<uint64 /*dbId*/, Follower> _followers;
281 std::unordered_set<uint32> _followerIds;
282};
283
284#endif // Garrison_h__
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
#define TC_GAME_API
Definition: Define.h:123
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
GarrisonFactionIndex
Definition: Garrison.h:42
@ GARRISON_FACTION_INDEX_HORDE
Definition: Garrison.h:43
@ GARRISON_FACTION_INDEX_ALLIANCE
Definition: Garrison.h:44
GarrisonAbilityFlags
Definition: Garrison.h:67
@ GARRISON_ABILITY_FLAG_ACTIVE_ONLY_ON_ZONE_SUPPORT
Definition: Garrison.h:75
@ GARRISON_ABILITY_FLAG_EXCLUSIVE
Definition: Garrison.h:73
@ GARRISON_ABILITY_FLAG_CANNOT_REMOVE
Definition: Garrison.h:72
@ GARRISON_ABILITY_FLAG_TRAIT
Definition: Garrison.h:68
@ GARRISON_ABILITY_FLAG_IS_SPECIALIZATION
Definition: Garrison.h:77
@ GARRISON_ABILITY_FLAG_IS_EMPTY_SLOT
Definition: Garrison.h:78
@ GARRISON_ABILITY_ALLIANCE_ONLY
Definition: Garrison.h:71
@ GARRISON_ABILITY_FLAG_SINGLE_MISSION_DURATION
Definition: Garrison.h:74
@ GARRISON_ABILITY_CANNOT_ROLL
Definition: Garrison.h:69
@ GARRISON_ABILITY_HORDE_ONLY
Definition: Garrison.h:70
@ GARRISON_ABILITY_FLAG_APPLY_TO_FIRST_MISSION
Definition: Garrison.h:76
GarrisonFollowerType
Definition: Garrison.h:58
@ FOLLOWER_TYPE_GARRISON
Definition: Garrison.h:59
@ FOLLOWER_TYPE_CLASS_ORDER
Definition: Garrison.h:61
@ FOLLOWER_TYPE_COVENANT
Definition: Garrison.h:63
@ FOLLOWER_TYPE_SHIPYARD
Definition: Garrison.h:60
@ FOLLOWER_TYPE_WAR_CAMPAIGN
Definition: Garrison.h:62
GarrisonType
Definition: Garrison.h:34
@ GARRISON_TYPE_GARRISON
Definition: Garrison.h:35
@ GARRISON_TYPE_COVENANT
Definition: Garrison.h:38
@ GARRISON_TYPE_CLASS_ORDER
Definition: Garrison.h:36
@ GARRISON_TYPE_WAR_CAMPAIGN
Definition: Garrison.h:37
GarrisonBuildingFlags
Definition: Garrison.h:48
@ GARRISON_BUILDING_FLAG_NEEDS_PLAN
Definition: Garrison.h:49
GarrisonFollowerFlags
Definition: Garrison.h:53
@ GARRISON_FOLLOWER_FLAG_UNIQUE
Definition: Garrison.h:54
GarrisonFollowerStatus
Definition: Garrison.h:175
@ FOLLOWER_STATUS_INACTIVE
Definition: Garrison.h:178
@ FOLLOWER_STATUS_FAVORITE
Definition: Garrison.h:176
@ FOLLOWER_STATUS_EXHAUSTED
Definition: Garrison.h:177
@ FOLLOWER_STATUS_TROOP
Definition: Garrison.h:179
@ FOLLOWER_STATUS_NO_XP_GAIN
Definition: Garrison.h:180
GarrisonError
Definition: Garrison.h:82
@ GARRISON_ERROR_REQUIRES_BLUEPRINT
Definition: Garrison.h:105
@ GARRISON_ERROR_BUILDING_MISSING
Definition: Garrison.h:131
@ GARRISON_ERROR_INVALID_SITE_ID
Definition: Garrison.h:98
@ GARRISON_ERROR_FAILED_CONDITION
Definition: Garrison.h:169
@ GARRISON_ERROR_PROXY_NOT_OK
Definition: Garrison.h:146
@ GARRISON_ERROR_INVALID_GARRISON
Definition: Garrison.h:87
@ GARRISON_ERROR_MISSION_NOT_OFFERED
Definition: Garrison.h:120
@ GARRISON_ERROR_FOLLOWER_FATIGUED
Definition: Garrison.h:150
@ GARRISON_ERROR_INVALID_BUILDINGID
Definition: Garrison.h:94
@ GARRISON_SUCCESS
Definition: Garrison.h:83
@ GARRISON_ERROR_INVALID_PLOT_BUILDING
Definition: Garrison.h:99
@ GARRISON_ERROR_INVALID_PLOT_INSTANCEID
Definition: Garrison.h:93
@ GARRISON_ERROR_BUILDING_TYPE_EXISTS
Definition: Garrison.h:107
@ GARRISON_ERROR_FOLLOWER_ALREADY_ON_MISSION
Definition: Garrison.h:112
@ GARRISON_ERROR_UPGRADE_LEVEL_EXCEEDS_GARRISON_LEVEL
Definition: Garrison.h:96
@ GARRISON_ERROR_INTERNAL_ERROR
Definition: Garrison.h:136
@ GARRISON_ERROR_RECRUITMENT_ON_COOLDOWN
Definition: Garrison.h:142
@ GARRISON_ERROR_MISSION_REQUIRES_100_TO_START
Definition: Garrison.h:165
@ GARRISON_ERROR_SPECIALIZATION_ON_COOLDOWN
Definition: Garrison.h:103
@ GARRISON_ERROR_FOLLOWER_ACTIVATION_UNAVAILABLE
Definition: Garrison.h:154
@ GARRISON_ERROR_NOT_ENOUGH_CURRENCY
Definition: Garrison.h:129
@ GARRISON_ERROR_ON_REMOVE_BUILDING_SPELL_FAILED
Definition: Garrison.h:148
@ GARRISON_ERROR_OPERATION_NOT_SUPPORTED
Definition: Garrison.h:149
@ GARRISON_ERROR_INVALID_MISSION
Definition: Garrison.h:117
@ GARRISON_ERROR_BUILDING_EXISTS
Definition: Garrison.h:92
@ GARRISON_ERROR_INVALID_UPGRADE_LEVEL
Definition: Garrison.h:95
@ GARRISON_ERROR_RECALL_PORTAL_USED_LESS_THAN_24_HOURS_AGO
Definition: Garrison.h:147
@ GARRISON_ERROR_INVALID_STATIC_TABLE_VALUE
Definition: Garrison.h:137
@ GARRISON_ERROR_ALREADY_RESEARCHING_TALENT
Definition: Garrison.h:168
@ GARRISON_ERROR_PLOTS_NOT_FULL
Definition: Garrison.h:97
@ GARRISON_ERROR_NO_BUILDING
Definition: Garrison.h:91
@ GARRISON_ERROR_FOLLOWER_CANNOT_GAIN_XP
Definition: Garrison.h:162
@ GARRISON_ERROR_CONSTRUCTION_COMPLETE
Definition: Garrison.h:109
@ GARRISON_ERROR_HIGHER_BUILDING_TYPE_EXISTS
Definition: Garrison.h:160
@ GARRISON_ERROR_NO_GARRISON
Definition: Garrison.h:84
@ GARRISON_ERROR_FOLLOWER_ACTIVE
Definition: Garrison.h:153
@ GARRISON_ERROR_NO_OP
Definition: Garrison.h:163
@ GARRISON_ERROR_MISSION_REWARDS_PENDING
Definition: Garrison.h:127
@ GARRISON_ERROR_NOT_IN_GARRISON
Definition: Garrison.h:90
@ GARRISON_ERROR_NO_MISSION_NPC
Definition: Garrison.h:134
@ GARRISON_ERROR_UPGRADE_CONDITION_FAILED
Definition: Garrison.h:151
@ GARRISON_ERROR_NOT_ON_MISSION
Definition: Garrison.h:124
@ GARRISON_ERROR_INVALID_SPECIALIZATION
Definition: Garrison.h:101
@ GARRISON_ERROR_FOLLOWER_SOFT_CAP_EXCEEDED
Definition: Garrison.h:123
@ GARRISON_ERROR_RECRUITMENT_NPC_NOT_AVAILABLE
Definition: Garrison.h:144
@ GARRISON_ERROR_INVALID_MISSION_TIME
Definition: Garrison.h:118
@ GARRISON_ERROR_RECRUIT_BLOCKED_BY_GENERATION
Definition: Garrison.h:143
@ GARRISON_ERROR_MISSION_NOT_COMPLETE
Definition: Garrison.h:126
@ GARRISON_ERROR_SPECIALIZATION_EXISTS
Definition: Garrison.h:102
@ GARRISON_ERROR_INVALID_MISSION_REWARD_INDEX
Definition: Garrison.h:119
@ GARRISON_ERROR_INVALID_AVAILABLE_RECRUIT
Definition: Garrison.h:139
@ GARRISON_ERROR_INVALID_MISSION_BONUS_ABILITY
Definition: Garrison.h:159
@ GARRISON_ERROR_INVALID_GARRISON_LEVEL
Definition: Garrison.h:88
@ GARRISON_ERROR_INVALID_CLASS
Definition: Garrison.h:171
@ GARRISON_ERROR_INVALID_TIER
Definition: Garrison.h:170
@ GARRISON_ERROR_AT_CLASS_SPEC_CAP
Definition: Garrison.h:164
@ GARRISON_ERROR_INVALID_FOLLOWER
Definition: Garrison.h:111
@ GARRISON_ERROR_MISSION_MISSING_REQUIRED_FOLLOWER
Definition: Garrison.h:166
@ GARRISON_ERROR_INVALID_ITEM_LEVEL
Definition: Garrison.h:138
@ GARRISON_ERROR_GARRISON_LEVEL_UNCHANGED
Definition: Garrison.h:89
@ GARRISON_ERROR_NOT_ENOUGH_GOLD
Definition: Garrison.h:130
@ GARRISON_ERROR_ARCHITECT_NOT_AVAILABLE
Definition: Garrison.h:133
@ GARRISON_ERROR_FOLLOWER_EXISTS
Definition: Garrison.h:110
@ GARRISON_ERROR_BLUEPRINT_EXISTS
Definition: Garrison.h:104
@ GARRISON_ERROR_RECRUITMENT_GENERATION_IN_PROGRESS
Definition: Garrison.h:141
@ GARRISON_ERROR_INVALID_DOODAD_SET_ID
Definition: Garrison.h:106
@ GARRISON_ERROR_FOLLOWER_TYPE_MISMATCH
Definition: Garrison.h:155
@ GARRISON_ERROR_FOLLOWER_INACTIVE
Definition: Garrison.h:152
@ GARRISON_ERROR_MISSION_SIZE_INVALID
Definition: Garrison.h:122
@ GARRISON_ERROR_ALREADY_COMPLETED_MISSION
Definition: Garrison.h:125
@ GARRISON_ERROR_MISSION_START_CONDITION_FAILED
Definition: Garrison.h:157
@ GARRISON_ERROR_ALREADY_ON_MISSION
Definition: Garrison.h:121
@ GARRISON_ERROR_INVALID_FOLLOWER_LEVEL
Definition: Garrison.h:115
@ GARRISON_ERROR_FOLLOWER_INVALID_FOR_BUILDING
Definition: Garrison.h:114
@ GARRISON_ERROR_FOLLOWER_IN_BUILDING
Definition: Garrison.h:113
@ GARRISON_ERROR_GARRISON_EXISTS
Definition: Garrison.h:85
@ GARRISON_ERROR_NO_ARCHITECT
Definition: Garrison.h:132
@ GARRISON_ERROR_INVALID_GARRISON_TYPE
Definition: Garrison.h:156
@ GARRISON_ERROR_MISSION_EXISTS
Definition: Garrison.h:116
@ GARRISON_ERROR_GARRISON_SAME_TYPE_EXISTS
Definition: Garrison.h:86
@ GARRISON_ERROR_AT_FOLLOWER_HARD_CAP
Definition: Garrison.h:161
@ GARRISON_ERROR_FOLLOWER_ALREADY_RECRUITED
Definition: Garrison.h:140
@ GARRISON_ERROR_INVALID_FOLLOWER_QUALITY
Definition: Garrison.h:145
@ GARRISON_ERROR_INVALID_FACTION
Definition: Garrison.h:100
@ GARRISON_ERROR_MISSION_NPC_NOT_AVAILABLE
Definition: Garrison.h:135
@ GARRISON_ERROR_INVALID_TALENT
Definition: Garrison.h:167
@ GARRISON_ERROR_MISSION_EXPIRED
Definition: Garrison.h:128
@ GARRISON_ERROR_INVALID_FOLLOWER_ABILITY
Definition: Garrison.h:158
@ GARRISON_ERROR_BUILDING_NOT_ACTIVE
Definition: Garrison.h:108
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
Definition: QuestPools.cpp:50
GarrSiteLevelEntry const * _siteLevel
Definition: Garrison.h:275
std::unordered_map< uint64, Follower > _followers
Definition: Garrison.h:280
std::unordered_set< uint32 > _followerIds
Definition: Garrison.h:281
uint32 CountFollowers(Predicate &&predicate) const
Definition: Garrison.h:252
GarrisonType GetType() const
Definition: Garrison.h:232
bool HasBlueprint(uint32 garrBuildingId) const
Definition: Garrison.h:243
std::unordered_map< uint32, Plot > _plots
Definition: Garrison.h:278
GarrSiteLevelEntry const * GetSiteLevel() const
Definition: Garrison.h:233
std::unordered_set< uint32 > _knownBuildings
Definition: Garrison.h:279
Player * _owner
Definition: Garrison.h:274
uint32 _followerActivationsRemainingToday
Definition: Garrison.h:276
void ResetFollowerActivationLimit()
Definition: Garrison.h:267
Definition: Map.h:189
uint64 LowType
Definition: ObjectGuid.h:278
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
Definition: Vignette.cpp:72
ObjectGuid Guid
Definition: Garrison.h:190
Optional< WorldPackets::Garrison::GarrisonBuildingInfo > PacketInfo
Definition: Garrison.h:192
std::unordered_set< ObjectGuid > Spawns
Definition: Garrison.h:191
WorldPackets::Garrison::GarrisonFollower PacketInfo
Definition: Garrison.h:214
QuaternionData Rotation
Definition: Garrison.h:203
WorldPackets::Garrison::GarrisonPlotInfo PacketInfo
Definition: Garrison.h:202
Building BuildingInfo
Definition: Garrison.h:206