TrinityCore
Loading...
Searching...
No Matches
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 "SharedDefines.h"
27#include <unordered_map>
28
29class GameObject;
30class Map;
31class Player;
33
41
47
52
57
66
81
83{
174
183
185{
186public:
187 struct Building
188 {
189 bool CanActivate() const;
190
192 std::unordered_set<ObjectGuid> Spawns;
194 };
195
196 struct Plot
197 {
198 GameObject* CreateGameObject(Map* map, GarrisonFactionIndex faction);
199 void DeleteGameObject(Map* map);
200 void ClearBuildingInfo(GarrisonType garrisonType, Player* owner);
201 void SetBuildingInfo(WorldPackets::Garrison::GarrisonBuildingInfo const& buildingInfo, Player* owner);
202
205 uint32 EmptyGameObjectId = 0;
206 uint32 GarrSiteLevelPlotInstId = 0;
208 };
209
210 struct Follower
211 {
212 uint32 GetItemLevel() const;
213 bool HasAbility(uint32 garrAbilityId) const;
214
216 };
217
218 explicit Garrison(Player* owner);
219
220 bool LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blueprints, PreparedQueryResult buildings,
221 PreparedQueryResult followers, PreparedQueryResult abilities);
223 static void DeleteFromDB(ObjectGuid::LowType ownerGuid, CharacterDatabaseTransaction trans);
224
225 bool Create(uint32 garrSiteId);
226 void Delete();
227 void Upgrade();
228
229 void Enter() const;
230 void Leave() const;
231
233 GarrisonFactionIndex GetFaction() const;
235 GarrSiteLevelEntry const* GetSiteLevel() const { return _siteLevel; }
236
237 // Plots
238 std::vector<Plot*> GetPlots();
239 Plot* GetPlot(uint32 garrPlotInstanceId);
240 Plot const* GetPlot(uint32 garrPlotInstanceId) const;
241
242 // Buildings
243 void LearnBlueprint(uint32 garrBuildingId);
244 void UnlearnBlueprint(uint32 garrBuildingId);
245 bool HasBlueprint(uint32 garrBuildingId) const { return _knownBuildings.find(garrBuildingId) != _knownBuildings.end(); }
246 void PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId);
247 void CancelBuildingConstruction(uint32 garrPlotInstanceId);
248 void ActivateBuilding(uint32 garrPlotInstanceId);
249
250 // Followers
251 void AddFollower(uint32 garrFollowerId);
252 Follower const* GetFollower(uint64 dbId) const;
253 template<typename Predicate>
254 uint32 CountFollowers(Predicate&& predicate) const
255 {
256 uint32 count = 0;
257 for (auto itr = _followers.begin(); itr != _followers.end(); ++itr)
258 if (predicate(itr->second))
259 ++count;
260
261 return count;
262 }
263
264 void BuildInfoPacket(WorldPackets::Garrison::GarrisonInfo& garrison) const;
265 void SendRemoteInfo() const;
266 void SendBlueprintAndSpecializationData();
267 void SendMapData(Player* receiver) const;
268
269 void ResetFollowerActivationLimit() { _followerActivationsRemainingToday = 1; }
270
271private:
272 Map* FindMap() const;
273 void InitializePlots();
274 GarrisonError CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 garrBuildingId) const;
275 GarrisonError CheckBuildingRemoval(uint32 garrPlotInstanceId) const;
279
280 std::unordered_map<uint32 /*garrPlotInstanceId*/, Plot> _plots;
281 std::unordered_set<uint32 /*garrBuildingId*/> _knownBuildings;
282 std::unordered_map<uint64 /*dbId*/, Follower> _followers;
283 std::unordered_set<uint32> _followerIds;
284};
285
286#endif // Garrison_h__
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
#define TC_GAME_API
Definition Define.h:129
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
GarrisonFactionIndex
Definition Garrison.h:43
@ GARRISON_FACTION_INDEX_HORDE
Definition Garrison.h:44
@ GARRISON_FACTION_INDEX_ALLIANCE
Definition Garrison.h:45
GarrisonAbilityFlags
Definition Garrison.h:68
@ GARRISON_ABILITY_FLAG_ACTIVE_ONLY_ON_ZONE_SUPPORT
Definition Garrison.h:76
@ GARRISON_ABILITY_FLAG_EXCLUSIVE
Definition Garrison.h:74
@ GARRISON_ABILITY_FLAG_CANNOT_REMOVE
Definition Garrison.h:73
@ GARRISON_ABILITY_FLAG_TRAIT
Definition Garrison.h:69
@ GARRISON_ABILITY_FLAG_IS_SPECIALIZATION
Definition Garrison.h:78
@ GARRISON_ABILITY_FLAG_IS_EMPTY_SLOT
Definition Garrison.h:79
@ GARRISON_ABILITY_ALLIANCE_ONLY
Definition Garrison.h:72
@ GARRISON_ABILITY_FLAG_SINGLE_MISSION_DURATION
Definition Garrison.h:75
@ GARRISON_ABILITY_CANNOT_ROLL
Definition Garrison.h:70
@ GARRISON_ABILITY_HORDE_ONLY
Definition Garrison.h:71
@ GARRISON_ABILITY_FLAG_APPLY_TO_FIRST_MISSION
Definition Garrison.h:77
GarrisonFollowerType
Definition Garrison.h:59
@ FOLLOWER_TYPE_GARRISON
Definition Garrison.h:60
@ FOLLOWER_TYPE_CLASS_ORDER
Definition Garrison.h:62
@ FOLLOWER_TYPE_COVENANT
Definition Garrison.h:64
@ FOLLOWER_TYPE_SHIPYARD
Definition Garrison.h:61
@ FOLLOWER_TYPE_WAR_CAMPAIGN
Definition Garrison.h:63
GarrisonType
Definition Garrison.h:35
@ GARRISON_TYPE_GARRISON
Definition Garrison.h:36
@ GARRISON_TYPE_COVENANT
Definition Garrison.h:39
@ GARRISON_TYPE_CLASS_ORDER
Definition Garrison.h:37
@ GARRISON_TYPE_WAR_CAMPAIGN
Definition Garrison.h:38
GarrisonBuildingFlags
Definition Garrison.h:49
@ GARRISON_BUILDING_FLAG_NEEDS_PLAN
Definition Garrison.h:50
GarrisonFollowerFlags
Definition Garrison.h:54
@ GARRISON_FOLLOWER_FLAG_UNIQUE
Definition Garrison.h:55
GarrisonFollowerStatus
Definition Garrison.h:176
@ FOLLOWER_STATUS_INACTIVE
Definition Garrison.h:179
@ FOLLOWER_STATUS_FAVORITE
Definition Garrison.h:177
@ FOLLOWER_STATUS_EXHAUSTED
Definition Garrison.h:178
@ FOLLOWER_STATUS_TROOP
Definition Garrison.h:180
@ FOLLOWER_STATUS_NO_XP_GAIN
Definition Garrison.h:181
GarrisonError
Definition Garrison.h:83
@ GARRISON_ERROR_REQUIRES_BLUEPRINT
Definition Garrison.h:106
@ GARRISON_ERROR_BUILDING_MISSING
Definition Garrison.h:132
@ GARRISON_ERROR_INVALID_SITE_ID
Definition Garrison.h:99
@ GARRISON_ERROR_FAILED_CONDITION
Definition Garrison.h:170
@ GARRISON_ERROR_PROXY_NOT_OK
Definition Garrison.h:147
@ GARRISON_ERROR_INVALID_GARRISON
Definition Garrison.h:88
@ GARRISON_ERROR_MISSION_NOT_OFFERED
Definition Garrison.h:121
@ GARRISON_ERROR_FOLLOWER_FATIGUED
Definition Garrison.h:151
@ GARRISON_ERROR_INVALID_BUILDINGID
Definition Garrison.h:95
@ GARRISON_SUCCESS
Definition Garrison.h:84
@ GARRISON_ERROR_INVALID_PLOT_BUILDING
Definition Garrison.h:100
@ GARRISON_ERROR_INVALID_PLOT_INSTANCEID
Definition Garrison.h:94
@ GARRISON_ERROR_BUILDING_TYPE_EXISTS
Definition Garrison.h:108
@ GARRISON_ERROR_FOLLOWER_ALREADY_ON_MISSION
Definition Garrison.h:113
@ GARRISON_ERROR_UPGRADE_LEVEL_EXCEEDS_GARRISON_LEVEL
Definition Garrison.h:97
@ GARRISON_ERROR_INTERNAL_ERROR
Definition Garrison.h:137
@ GARRISON_ERROR_RECRUITMENT_ON_COOLDOWN
Definition Garrison.h:143
@ GARRISON_ERROR_MISSION_REQUIRES_100_TO_START
Definition Garrison.h:166
@ GARRISON_ERROR_SPECIALIZATION_ON_COOLDOWN
Definition Garrison.h:104
@ GARRISON_ERROR_FOLLOWER_ACTIVATION_UNAVAILABLE
Definition Garrison.h:155
@ GARRISON_ERROR_NOT_ENOUGH_CURRENCY
Definition Garrison.h:130
@ GARRISON_ERROR_ON_REMOVE_BUILDING_SPELL_FAILED
Definition Garrison.h:149
@ GARRISON_ERROR_OPERATION_NOT_SUPPORTED
Definition Garrison.h:150
@ GARRISON_ERROR_INVALID_MISSION
Definition Garrison.h:118
@ GARRISON_ERROR_BUILDING_EXISTS
Definition Garrison.h:93
@ GARRISON_ERROR_INVALID_UPGRADE_LEVEL
Definition Garrison.h:96
@ GARRISON_ERROR_RECALL_PORTAL_USED_LESS_THAN_24_HOURS_AGO
Definition Garrison.h:148
@ GARRISON_ERROR_INVALID_STATIC_TABLE_VALUE
Definition Garrison.h:138
@ GARRISON_ERROR_ALREADY_RESEARCHING_TALENT
Definition Garrison.h:169
@ GARRISON_ERROR_PLOTS_NOT_FULL
Definition Garrison.h:98
@ GARRISON_ERROR_NO_BUILDING
Definition Garrison.h:92
@ GARRISON_ERROR_FOLLOWER_CANNOT_GAIN_XP
Definition Garrison.h:163
@ GARRISON_ERROR_CONSTRUCTION_COMPLETE
Definition Garrison.h:110
@ GARRISON_ERROR_HIGHER_BUILDING_TYPE_EXISTS
Definition Garrison.h:161
@ GARRISON_ERROR_NO_GARRISON
Definition Garrison.h:85
@ GARRISON_ERROR_FOLLOWER_ACTIVE
Definition Garrison.h:154
@ GARRISON_ERROR_NO_OP
Definition Garrison.h:164
@ GARRISON_ERROR_MISSION_REWARDS_PENDING
Definition Garrison.h:128
@ GARRISON_ERROR_NOT_IN_GARRISON
Definition Garrison.h:91
@ GARRISON_ERROR_NO_MISSION_NPC
Definition Garrison.h:135
@ GARRISON_ERROR_UPGRADE_CONDITION_FAILED
Definition Garrison.h:152
@ GARRISON_ERROR_NOT_ON_MISSION
Definition Garrison.h:125
@ GARRISON_ERROR_INVALID_SPECIALIZATION
Definition Garrison.h:102
@ GARRISON_ERROR_FOLLOWER_SOFT_CAP_EXCEEDED
Definition Garrison.h:124
@ GARRISON_ERROR_RECRUITMENT_NPC_NOT_AVAILABLE
Definition Garrison.h:145
@ GARRISON_ERROR_INVALID_MISSION_TIME
Definition Garrison.h:119
@ GARRISON_ERROR_RECRUIT_BLOCKED_BY_GENERATION
Definition Garrison.h:144
@ GARRISON_ERROR_MISSION_NOT_COMPLETE
Definition Garrison.h:127
@ GARRISON_ERROR_SPECIALIZATION_EXISTS
Definition Garrison.h:103
@ GARRISON_ERROR_INVALID_MISSION_REWARD_INDEX
Definition Garrison.h:120
@ GARRISON_ERROR_INVALID_AVAILABLE_RECRUIT
Definition Garrison.h:140
@ GARRISON_ERROR_INVALID_MISSION_BONUS_ABILITY
Definition Garrison.h:160
@ GARRISON_ERROR_INVALID_GARRISON_LEVEL
Definition Garrison.h:89
@ GARRISON_ERROR_INVALID_CLASS
Definition Garrison.h:172
@ GARRISON_ERROR_INVALID_TIER
Definition Garrison.h:171
@ GARRISON_ERROR_AT_CLASS_SPEC_CAP
Definition Garrison.h:165
@ GARRISON_ERROR_INVALID_FOLLOWER
Definition Garrison.h:112
@ GARRISON_ERROR_MISSION_MISSING_REQUIRED_FOLLOWER
Definition Garrison.h:167
@ GARRISON_ERROR_INVALID_ITEM_LEVEL
Definition Garrison.h:139
@ GARRISON_ERROR_GARRISON_LEVEL_UNCHANGED
Definition Garrison.h:90
@ GARRISON_ERROR_NOT_ENOUGH_GOLD
Definition Garrison.h:131
@ GARRISON_ERROR_ARCHITECT_NOT_AVAILABLE
Definition Garrison.h:134
@ GARRISON_ERROR_FOLLOWER_EXISTS
Definition Garrison.h:111
@ GARRISON_ERROR_BLUEPRINT_EXISTS
Definition Garrison.h:105
@ GARRISON_ERROR_RECRUITMENT_GENERATION_IN_PROGRESS
Definition Garrison.h:142
@ GARRISON_ERROR_INVALID_DOODAD_SET_ID
Definition Garrison.h:107
@ GARRISON_ERROR_FOLLOWER_TYPE_MISMATCH
Definition Garrison.h:156
@ GARRISON_ERROR_FOLLOWER_INACTIVE
Definition Garrison.h:153
@ GARRISON_ERROR_MISSION_SIZE_INVALID
Definition Garrison.h:123
@ GARRISON_ERROR_ALREADY_COMPLETED_MISSION
Definition Garrison.h:126
@ GARRISON_ERROR_MISSION_START_CONDITION_FAILED
Definition Garrison.h:158
@ GARRISON_ERROR_ALREADY_ON_MISSION
Definition Garrison.h:122
@ GARRISON_ERROR_INVALID_FOLLOWER_LEVEL
Definition Garrison.h:116
@ GARRISON_ERROR_FOLLOWER_INVALID_FOR_BUILDING
Definition Garrison.h:115
@ GARRISON_ERROR_FOLLOWER_IN_BUILDING
Definition Garrison.h:114
@ GARRISON_ERROR_GARRISON_EXISTS
Definition Garrison.h:86
@ GARRISON_ERROR_NO_ARCHITECT
Definition Garrison.h:133
@ GARRISON_ERROR_INVALID_GARRISON_TYPE
Definition Garrison.h:157
@ GARRISON_ERROR_MISSION_EXISTS
Definition Garrison.h:117
@ GARRISON_ERROR_GARRISON_SAME_TYPE_EXISTS
Definition Garrison.h:87
@ GARRISON_ERROR_AT_FOLLOWER_HARD_CAP
Definition Garrison.h:162
@ GARRISON_ERROR_FOLLOWER_ALREADY_RECRUITED
Definition Garrison.h:141
@ GARRISON_ERROR_INVALID_FOLLOWER_QUALITY
Definition Garrison.h:146
@ GARRISON_ERROR_INVALID_FACTION
Definition Garrison.h:101
@ GARRISON_ERROR_MISSION_NPC_NOT_AVAILABLE
Definition Garrison.h:136
@ GARRISON_ERROR_INVALID_TALENT
Definition Garrison.h:168
@ GARRISON_ERROR_MISSION_EXPIRED
Definition Garrison.h:129
@ GARRISON_ERROR_INVALID_FOLLOWER_ABILITY
Definition Garrison.h:159
@ GARRISON_ERROR_BUILDING_NOT_ACTIVE
Definition Garrison.h:109
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
@ HORDE
GarrSiteLevelEntry const * _siteLevel
Definition Garrison.h:277
std::unordered_map< uint64, Follower > _followers
Definition Garrison.h:282
std::unordered_set< uint32 > _followerIds
Definition Garrison.h:283
uint32 CountFollowers(Predicate &&predicate) const
Definition Garrison.h:254
GarrisonType GetType() const
Definition Garrison.h:234
bool HasBlueprint(uint32 garrBuildingId) const
Definition Garrison.h:245
std::unordered_map< uint32, Plot > _plots
Definition Garrison.h:280
GarrSiteLevelEntry const * GetSiteLevel() const
Definition Garrison.h:235
std::unordered_set< uint32 > _knownBuildings
Definition Garrison.h:281
static constexpr GarrisonFactionIndex GetFaction(Team team)
Definition Garrison.h:232
Player * _owner
Definition Garrison.h:276
uint32 _followerActivationsRemainingToday
Definition Garrison.h:278
void ResetFollowerActivationLimit()
Definition Garrison.h:269
Definition Map.h:225
uint64 LowType
Definition ObjectGuid.h:321
ObjectGuid Guid
Definition Garrison.h:191
Optional< WorldPackets::Garrison::GarrisonBuildingInfo > PacketInfo
Definition Garrison.h:193
std::unordered_set< ObjectGuid > Spawns
Definition Garrison.h:192
WorldPackets::Garrison::GarrisonFollower PacketInfo
Definition Garrison.h:215
QuaternionData Rotation
Definition Garrison.h:204
WorldPackets::Garrison::GarrisonPlotInfo PacketInfo
Definition Garrison.h:203
Building BuildingInfo
Definition Garrison.h:207