| 1 | /* |
|---|
| 2 | * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> |
|---|
| 3 | * |
|---|
| 4 | * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> |
|---|
| 5 | * |
|---|
| 6 | * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | * it under the terms of the GNU General Public License as published by |
|---|
| 8 | * the Free Software Foundation; either version 2 of the License, or |
|---|
| 9 | * (at your option) any later version. |
|---|
| 10 | * |
|---|
| 11 | * This program is distributed in the hope that it will be useful, |
|---|
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 14 | * GNU General Public License for more details. |
|---|
| 15 | * |
|---|
| 16 | * You should have received a copy of the GNU General Public License |
|---|
| 17 | * along with this program; if not, write to the Free Software |
|---|
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|---|
| 19 | */ |
|---|
| 20 | |
|---|
| 21 | #ifndef TRINITY_GRID_H |
|---|
| 22 | #define TRINITY_GRID_H |
|---|
| 23 | |
|---|
| 24 | /* |
|---|
| 25 | @class Grid |
|---|
| 26 | Grid is a logical segment of the game world represented inside TrinIty. |
|---|
| 27 | Grid is bind at compile time to a particular type of object which |
|---|
| 28 | we call it the object of interested. There are many types of loader, |
|---|
| 29 | specially, dynamic loader, static loader, or on-demand loader. There's |
|---|
| 30 | a subtle difference between dynamic loader and on-demand loader but |
|---|
| 31 | this is implementation specific to the loader class. From the |
|---|
| 32 | Grid's perspective, the loader meets its API requirement is suffice. |
|---|
| 33 | */ |
|---|
| 34 | |
|---|
| 35 | #include "Platform/Define.h" |
|---|
| 36 | #include "Policies/ThreadingModel.h" |
|---|
| 37 | #include "TypeContainer.h" |
|---|
| 38 | #include "TypeContainerVisitor.h" |
|---|
| 39 | |
|---|
| 40 | // forward declaration |
|---|
| 41 | template<class A, class T, class O> class GridLoader; |
|---|
| 42 | |
|---|
| 43 | template |
|---|
| 44 | < |
|---|
| 45 | class ACTIVE_OBJECT, |
|---|
| 46 | class WORLD_OBJECT_TYPES, |
|---|
| 47 | class GRID_OBJECT_TYPES, |
|---|
| 48 | class ThreadModel = Trinity::SingleThreaded<ACTIVE_OBJECT> |
|---|
| 49 | > |
|---|
| 50 | class TRINITY_DLL_DECL Grid |
|---|
| 51 | { |
|---|
| 52 | // allows the GridLoader to access its internals |
|---|
| 53 | template<class A, class T, class O> friend class GridLoader; |
|---|
| 54 | public: |
|---|
| 55 | |
|---|
| 56 | /** destructor to clean up its resources. This includes unloading the |
|---|
| 57 | grid if it has not been unload. |
|---|
| 58 | */ |
|---|
| 59 | ~Grid() {} |
|---|
| 60 | |
|---|
| 61 | /** an object of interested enters the grid |
|---|
| 62 | */ |
|---|
| 63 | template<class SPECIFIC_OBJECT> bool AddWorldObject(SPECIFIC_OBJECT *obj, OBJECT_HANDLE hdl) |
|---|
| 64 | { |
|---|
| 65 | return i_objects.template insert<SPECIFIC_OBJECT>(hdl, obj); |
|---|
| 66 | } |
|---|
| 67 | |
|---|
| 68 | /** an object of interested exits the grid |
|---|
| 69 | */ |
|---|
| 70 | template<class SPECIFIC_OBJECT> bool RemoveWorldObject(SPECIFIC_OBJECT *obj, OBJECT_HANDLE hdl) |
|---|
| 71 | { |
|---|
| 72 | return i_objects.template remove<SPECIFIC_OBJECT>(obj, hdl); |
|---|
| 73 | } |
|---|
| 74 | |
|---|
| 75 | /** Accessors: Returns a specific type of object in the WORDL_OBJECT_TYPES |
|---|
| 76 | */ |
|---|
| 77 | template<class SPECIFIC_OBJECT> const SPECIFIC_OBJECT* GetWorldObject(OBJECT_HANDLE hdl, SPECIFIC_OBJECT* fake) const { return i_objects.template find<SPECIFIC_OBJECT>(hdl); } |
|---|
| 78 | template<class SPECIFIC_OBJECT> SPECIFIC_OBJECT* GetWorldObject(OBJECT_HANDLE hdl, SPECIFIC_OBJECT *fake) { return i_objects.template find<SPECIFIC_OBJECT>(hdl, fake); } |
|---|
| 79 | |
|---|
| 80 | /** Refreshes/update the grid. This required for remote grids. |
|---|
| 81 | */ |
|---|
| 82 | void RefreshGrid(void) { /* TBI */} |
|---|
| 83 | |
|---|
| 84 | /** Locks a grid. Any object enters must wait until the grid is unlock. |
|---|
| 85 | */ |
|---|
| 86 | void LockGrid(void) { /* TBI */ } |
|---|
| 87 | |
|---|
| 88 | /** Unlocks the grid. |
|---|
| 89 | */ |
|---|
| 90 | void UnlockGrid(void) { /* TBI */ } |
|---|
| 91 | |
|---|
| 92 | /** Grid visitor for grid objects |
|---|
| 93 | */ |
|---|
| 94 | template<class T> void Visit(TypeContainerVisitor<T, TypeMapContainer<GRID_OBJECT_TYPES> > &visitor) |
|---|
| 95 | { |
|---|
| 96 | visitor.Visit(i_container); |
|---|
| 97 | } |
|---|
| 98 | |
|---|
| 99 | /** Grid visitor for world objects |
|---|
| 100 | */ |
|---|
| 101 | template<class T> void Visit(TypeContainerVisitor<T, TypeMapContainer<WORLD_OBJECT_TYPES> > &visitor) |
|---|
| 102 | { |
|---|
| 103 | visitor.Visit(i_objects); |
|---|
| 104 | } |
|---|
| 105 | |
|---|
| 106 | /** Returns the number of object within the grid. |
|---|
| 107 | */ |
|---|
| 108 | unsigned int ActiveObjectsInGrid(void) const { return i_objects.template Count<ACTIVE_OBJECT>(); } |
|---|
| 109 | |
|---|
| 110 | /** Accessors: Returns a specific type of object in the GRID_OBJECT_TYPES |
|---|
| 111 | */ |
|---|
| 112 | template<class SPECIFIC_OBJECT> const SPECIFIC_OBJECT* GetGridObject(OBJECT_HANDLE hdl, SPECIFIC_OBJECT *fake) const { return i_container.template find<SPECIFIC_OBJECT>(hdl, fake); } |
|---|
| 113 | template<class SPECIFIC_OBJECT> SPECIFIC_OBJECT* GetGridObject(OBJECT_HANDLE hdl, SPECIFIC_OBJECT *fake) { return i_container.template find<SPECIFIC_OBJECT>(hdl, fake); } |
|---|
| 114 | |
|---|
| 115 | /** Inserts a container type object into the grid. |
|---|
| 116 | */ |
|---|
| 117 | template<class SPECIFIC_OBJECT> bool AddGridObject(SPECIFIC_OBJECT *obj, OBJECT_HANDLE hdl) { return i_container.template insert<SPECIFIC_OBJECT>(hdl, obj); } |
|---|
| 118 | |
|---|
| 119 | /** Removes a containter type object from the grid |
|---|
| 120 | */ |
|---|
| 121 | template<class SPECIFIC_OBJECT> bool RemoveGridObject(SPECIFIC_OBJECT *obj, OBJECT_HANDLE hdl) { return i_container.template remove<SPECIFIC_OBJECT>(obj, hdl); } |
|---|
| 122 | |
|---|
| 123 | private: |
|---|
| 124 | |
|---|
| 125 | typedef typename ThreadModel::Lock Guard; |
|---|
| 126 | typedef typename ThreadModel::VolatileType VolatileType; |
|---|
| 127 | |
|---|
| 128 | TypeMapContainer<GRID_OBJECT_TYPES> i_container; |
|---|
| 129 | TypeMapContainer<WORLD_OBJECT_TYPES> i_objects; |
|---|
| 130 | }; |
|---|
| 131 | #endif |
|---|