aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Garrison/GarrisonMap.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-05-08 00:03:15 +0200
committerShauren <shauren.trinity@gmail.com>2015-05-08 00:03:15 +0200
commit5b725db033c656bda5e718ea05a79005946e089e (patch)
treec15ad544c542cdd7dd7cb395c8ec6d3d35e4d2e9 /src/server/game/Garrison/GarrisonMap.cpp
parent0972552e84068cf453231b372bcb232cf2d2f42b (diff)
Core/Garrisons: Basics for garrisons
Diffstat (limited to 'src/server/game/Garrison/GarrisonMap.cpp')
-rw-r--r--src/server/game/Garrison/GarrisonMap.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/server/game/Garrison/GarrisonMap.cpp b/src/server/game/Garrison/GarrisonMap.cpp
new file mode 100644
index 00000000000..32b37cff03f
--- /dev/null
+++ b/src/server/game/Garrison/GarrisonMap.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "GarrisonMap.h"
+#include "Garrison.h"
+#include "ObjectAccessor.h"
+#include "ObjectGridLoader.h"
+
+class GarrisonGridLoader
+{
+public:
+ GarrisonGridLoader(NGridType* grid, GarrisonMap* map, Cell const& cell)
+ : i_cell(cell), i_grid(grid), i_map(map), i_garrison(map->GetGarrison()), i_gameObjects(0), i_creatures(0)
+ { }
+
+ void Visit(GameObjectMapType& m);
+ void Visit(CreatureMapType& m);
+
+ void LoadN();
+
+ template<class T> static void SetObjectCell(T* obj, CellCoord const& cellCoord);
+ template<class T> void Visit(GridRefManager<T>& /*m*/) { }
+
+private:
+ Cell i_cell;
+ NGridType* i_grid;
+ GarrisonMap* i_map;
+ Garrison* i_garrison;
+ uint32 i_gameObjects;
+ uint32 i_creatures;
+};
+
+void GarrisonGridLoader::LoadN()
+{
+ if (i_garrison)
+ {
+ i_cell.data.Part.cell_y = 0;
+ for (uint32 x = 0; x < MAX_NUMBER_OF_CELLS; ++x)
+ {
+ i_cell.data.Part.cell_x = x;
+ for (uint32 y = 0; y < MAX_NUMBER_OF_CELLS; ++y)
+ {
+ i_cell.data.Part.cell_y = y;
+
+ //Load creatures and game objects
+ TypeContainerVisitor<GarrisonGridLoader, GridTypeMapContainer> visitor(*this);
+ i_grid->VisitGrid(x, y, visitor);
+ }
+ }
+ }
+
+ TC_LOG_DEBUG("maps", "%u GameObjects and %u Creatures loaded for grid %u on map %u", i_gameObjects, i_creatures, i_grid->GetGridId(), i_map->GetId());
+}
+
+void GarrisonGridLoader::Visit(GameObjectMapType& m)
+{
+ std::vector<Garrison::Plot*> plots = i_garrison->GetPlots();
+ if (!plots.empty())
+ {
+ CellCoord cellCoord = i_cell.GetCellCoord();
+ for (Garrison::Plot* plot : plots)
+ {
+ Position const& spawn = plot->PacketInfo.PlotPos;
+ if (cellCoord != Trinity::ComputeCellCoord(spawn.GetPositionX(), spawn.GetPositionY()))
+ continue;
+
+ GameObject* go = plot->CreateGameObject(i_map, i_garrison->GetFaction());
+ if (!go)
+ continue;
+
+ go->AddToGrid(m);
+ ObjectGridLoader::SetObjectCell(go, cellCoord);
+ go->AddToWorld();
+ ++i_gameObjects;
+ }
+ }
+}
+
+void GarrisonGridLoader::Visit(CreatureMapType& /*m*/)
+{
+
+}
+
+GarrisonMap::GarrisonMap(uint32 id, time_t expiry, uint32 instanceId, Map* parent, ObjectGuid const& owner)
+ : Map(id, expiry, instanceId, DIFFICULTY_NORMAL, parent), _owner(owner)
+{
+ GarrisonMap::InitVisibilityDistance();
+}
+
+void GarrisonMap::LoadGridObjects(NGridType* grid, Cell const& cell)
+{
+ Map::LoadGridObjects(grid, cell);
+
+ GarrisonGridLoader loader(grid, this, cell);
+ loader.LoadN();
+}
+
+Garrison* GarrisonMap::GetGarrison()
+{
+ if (Player* owner = ObjectAccessor::FindConnectedPlayer(_owner))
+ return owner->GetGarrison();
+
+ return nullptr;
+}
+
+void GarrisonMap::InitVisibilityDistance()
+{
+ //init visibility distance for instances
+ m_VisibleDistance = World::GetMaxVisibleDistanceInBGArenas();
+ m_VisibilityNotifyPeriod = World::GetVisibilityNotifyPeriodInBGArenas();
+}