TrinityCore
GarrisonMap.cpp
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#include "GarrisonMap.h"
19#include "DBCEnums.h"
20#include "GameObject.h"
21#include "Garrison.h"
22#include "Log.h"
23#include "ObjectAccessor.h"
24#include "ObjectGridLoader.h"
25#include "Player.h"
26#include "World.h"
27
29{
30public:
31 GarrisonGridLoader(NGridType* grid, GarrisonMap* map, Cell const& cell)
32 : i_cell(cell), i_grid(grid), i_map(map), i_garrison(map->GetGarrison()), i_gameObjects(0), i_creatures(0)
33 { }
34
35 void Visit(GameObjectMapType& m);
36 void Visit(CreatureMapType& m);
37
38 void LoadN();
39
40 template<class T> static void SetObjectCell(T* obj, CellCoord const& cellCoord);
41 template<class T> void Visit(GridRefManager<T>& /*m*/) { }
42
43private:
50};
51
53{
54 if (i_garrison)
55 {
57 for (uint32 x = 0; x < MAX_NUMBER_OF_CELLS; ++x)
58 {
60 for (uint32 y = 0; y < MAX_NUMBER_OF_CELLS; ++y)
61 {
63
64 //Load creatures and game objects
66 i_grid->VisitGrid(x, y, visitor);
67 }
68 }
69 }
70
71 TC_LOG_DEBUG("maps", "{} GameObjects and {} Creatures loaded for grid {} on map {}", i_gameObjects, i_creatures, i_grid->GetGridId(), i_map->GetId());
72}
73
75{
76 std::vector<Garrison::Plot*> plots = i_garrison->GetPlots();
77 if (!plots.empty())
78 {
79 CellCoord cellCoord = i_cell.GetCellCoord();
80 for (Garrison::Plot* plot : plots)
81 {
82 Position const& spawn = plot->PacketInfo.PlotPos.Pos;
83 if (cellCoord != Trinity::ComputeCellCoord(spawn.GetPositionX(), spawn.GetPositionY()))
84 continue;
85
87 if (!go)
88 continue;
89
90 go->AddToGrid(m);
92 go->AddToWorld();
94 }
95 }
96}
97
99{
100
101}
102
103GarrisonMap::GarrisonMap(uint32 id, time_t expiry, uint32 instanceId, ObjectGuid const& owner)
104 : Map(id, expiry, instanceId, DIFFICULTY_NORMAL), _owner(owner), _loadingPlayer(nullptr)
105{
107}
108
110{
111 Map::LoadGridObjects(grid, cell);
112
113 GarrisonGridLoader loader(grid, this, cell);
114 loader.LoadN();
115}
116
118{
119 if (_loadingPlayer)
120 return _loadingPlayer->GetGarrison();
121
123 return owner->GetGarrison();
124
125 return nullptr;
126}
127
129{
130 //init visibility distance for instances
133}
134
135bool GarrisonMap::AddPlayerToMap(Player* player, bool initPlayer /*= true*/)
136{
137 if (player->GetGUID() == _owner)
138 _loadingPlayer = player;
139
140 bool result = Map::AddPlayerToMap(player, initPlayer);
141
142 if (player->GetGUID() == _owner)
143 _loadingPlayer = nullptr;
144
145 return result;
146}
@ DIFFICULTY_NORMAL
Definition: DBCEnums.h:875
uint32_t uint32
Definition: Define.h:142
#define MAX_NUMBER_OF_CELLS
Definition: GridDefines.h:36
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
static GameObject * CreateGameObject(uint32 entry, Map *map, Position const &pos, QuaternionData const &rotation, uint32 animProgress, GOState goState, uint32 artKit=0)
void AddToWorld() override
Definition: GameObject.cpp:904
void Visit(GridRefManager< T > &)
Definition: GarrisonMap.cpp:41
GarrisonGridLoader(NGridType *grid, GarrisonMap *map, Cell const &cell)
Definition: GarrisonMap.cpp:31
void Visit(GameObjectMapType &m)
Definition: GarrisonMap.cpp:74
NGridType * i_grid
Definition: GarrisonMap.cpp:45
GarrisonMap * i_map
Definition: GarrisonMap.cpp:46
static void SetObjectCell(T *obj, CellCoord const &cellCoord)
Garrison * i_garrison
Definition: GarrisonMap.cpp:47
ObjectGuid _owner
Definition: GarrisonMap.h:39
bool AddPlayerToMap(Player *player, bool initPlayer=true) override
Player * _loadingPlayer
@workaround Player is not registered in ObjectAccessor during login
Definition: GarrisonMap.h:40
void LoadGridObjects(NGridType *grid, Cell const &cell) override
GarrisonMap(uint32 id, time_t, uint32 instanceId, ObjectGuid const &owner)
void InitVisibilityDistance() override
Garrison * GetGarrison()
GarrisonFactionIndex GetFaction() const
Definition: Garrison.cpp:313
std::vector< Plot * > GetPlots()
Definition: Garrison.cpp:318
void AddToGrid(GridRefManager< T > &m)
Definition: GridObject.h:31
Definition: Map.h:189
virtual bool AddPlayerToMap(Player *player, bool initPlayer=true)
Definition: Map.cpp:415
int32 m_VisibilityNotifyPeriod
Definition: Map.h:620
uint32 GetId() const
Definition: Map.cpp:3228
float m_VisibleDistance
Definition: Map.h:614
virtual void LoadGridObjects(NGridType *grid, Cell const &cell)
Definition: Map.cpp:376
Definition: NGrid.h:70
uint32 GetGridId(void) const
Definition: NGrid.h:90
void VisitGrid(const uint32 x, const uint32 y, TypeContainerVisitor< T, TypeMapContainer< TT > > &visitor)
Definition: NGrid.h:145
static void SetObjectCell(MapObject *obj, CellCoord const &cellCoord)
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Garrison * GetGarrison() const
Definition: Player.h:2710
static float GetMaxVisibleDistanceInInstances()
Definition: World.h:753
static int32 GetVisibilityNotifyPeriodInInstances()
Definition: World.h:758
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
CellCoord ComputeCellCoord(float x, float y)
Definition: GridDefines.h:206
Definition: Cell.h:47
CellCoord GetCellCoord() const
Definition: Cell.h:78
union Cell::@313 data
unsigned cell_y
Definition: Cell.h:99
unsigned cell_x
Definition: Cell.h:98
struct Cell::@313::@314 Part
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77