1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-25 19:17:45 +00:00
sapphire/src/servers/Server_Zone/Zone/CellHandler.h

172 lines
3.2 KiB
C
Raw Normal View History

2017-08-08 13:53:47 +02:00
#ifndef _CELLHANDLER_H
#define _CELLHANDLER_H
#define TilesCount 32
#define TileSize 250.0f
2017-12-11 16:55:05 +11:00
#define _minY ( -TilesCount * TileSize / 2 )
#define _minX ( -TilesCount * TileSize / 2 )
2017-08-08 13:53:47 +02:00
2017-12-11 16:55:05 +11:00
#define _maxY ( TilesCount * TileSize / 2 )
#define _maxX ( TilesCount * TileSize / 2 )
2017-08-08 13:53:47 +02:00
#define CellsPerTile 4
2017-12-11 16:55:05 +11:00
#define _cellSize ( TileSize / CellsPerTile )
#define _sizeX ( TilesCount * CellsPerTile )
#define _sizeY ( TilesCount * CellsPerTile )
2017-08-08 13:53:47 +02:00
2017-12-11 16:55:05 +11:00
#define GetRelatCoord( Coord, CellCoord ) ( ( _maxX - Coord ) - CellCoord * _cellSize )
2017-08-08 13:53:47 +02:00
namespace Core {
class Zone;
2017-12-11 16:55:05 +11:00
template< class T >
2017-08-08 13:53:47 +02:00
class CellHandler
{
public:
CellHandler();
~CellHandler();
T* getCell( uint32_t x, uint32_t y );
T* getCellByCoords( float x, float y );
T* create( uint32_t x, uint32_t y );
T* createByCoords( float x, float y );
void remove( uint32_t x, uint32_t y );
2017-12-11 16:55:05 +11:00
bool allocated( uint32_t x, uint32_t y ) { return m_pCells[x][y] != nullptr; }
2017-08-08 13:53:47 +02:00
static uint32_t getPosX( float x );
static uint32_t getPosY( float y );
protected:
void _init();
2017-12-11 16:55:05 +11:00
T*** m_pCells;
2017-08-08 13:53:47 +02:00
};
2017-12-11 16:55:05 +11:00
template< class T >
CellHandler< T >::CellHandler()
2017-08-08 13:53:47 +02:00
{
_init();
}
2017-12-11 16:55:05 +11:00
template< class T >
void CellHandler< T >::_init()
2017-08-08 13:53:47 +02:00
{
m_pCells = new T**[_sizeX];
assert( m_pCells );
for( uint32_t i = 0; i < _sizeX; i++ )
{
m_pCells[i] = nullptr;
}
}
2017-12-11 16:55:05 +11:00
template< class T >
CellHandler< T >::~CellHandler()
2017-08-08 13:53:47 +02:00
{
if( m_pCells )
{
for( uint32_t i = 0; i < _sizeX; i++ )
{
if( !m_pCells[i] )
{
continue;
}
for( uint32_t j = 0; j < _sizeY; j++ )
{
if( m_pCells[i][j] )
{
delete m_pCells[i][j];
}
}
delete[] m_pCells[i];
}
delete[] m_pCells;
}
}
2017-12-11 16:55:05 +11:00
template< class T >
T* CellHandler< T >::create( uint32_t x, uint32_t y )
2017-08-08 13:53:47 +02:00
{
if( x >= _sizeX || y >= _sizeY )
{
return nullptr;
}
if( !m_pCells[x] )
{
m_pCells[x] = new T*[_sizeY];
2017-12-11 16:55:05 +11:00
memset( m_pCells[x], 0, sizeof( T* ) * _sizeY );
2017-08-08 13:53:47 +02:00
}
assert( m_pCells[x][y] == nullptr );
2017-12-11 16:55:05 +11:00
T* cls = new T;
2017-08-08 13:53:47 +02:00
m_pCells[x][y] = cls;
return cls;
}
2017-12-11 16:55:05 +11:00
template< class T >
T* CellHandler< T >::createByCoords( float x, float y )
2017-08-08 13:53:47 +02:00
{
return create( getPosX( x ), getPosY( y ) );
}
2017-12-11 16:55:05 +11:00
template< class T >
void CellHandler< T >::remove( uint32_t x, uint32_t y )
2017-08-08 13:53:47 +02:00
{
if( x >= _sizeX || y >= _sizeY )
{
return;
}
if( !m_pCells[x] )
{
return;
}
assert( m_pCells[x][y] != nullptr );
2017-12-11 16:55:05 +11:00
T* cls = m_pCells[x][y];
2017-08-08 13:53:47 +02:00
m_pCells[x][y] = nullptr;
delete cls;
}
2017-12-11 16:55:05 +11:00
template< class T >
T* CellHandler< T >::getCell( uint32_t x, uint32_t y )
2017-08-08 13:53:47 +02:00
{
if( !m_pCells[x] )
{
return nullptr;
}
return m_pCells[x][y];
}
2017-12-11 16:55:05 +11:00
template< class T >
T* CellHandler< T >::getCellByCoords( float x, float y )
2017-08-08 13:53:47 +02:00
{
return getCell( getPosX( x ), getPosY( y ) );
}
2017-12-11 16:55:05 +11:00
template< class T >
uint32_t CellHandler< T >::getPosX( float x )
2017-08-08 13:53:47 +02:00
{
assert( ( x >= _minX ) && ( x <= _maxX ) );
2017-12-11 16:55:05 +11:00
return ( uint32_t )( ( _maxX - x ) / _cellSize );
2017-08-08 13:53:47 +02:00
}
2017-12-11 16:55:05 +11:00
template< class T >
uint32_t CellHandler< T >::getPosY( float y )
2017-08-08 13:53:47 +02:00
{
assert( ( y >= _minY ) && ( y <= _maxY ) );
2017-12-11 16:55:05 +11:00
return ( uint32_t )( ( _maxY - y ) / _cellSize );
2017-08-08 13:53:47 +02:00
}
2017-12-11 16:55:05 +11:00
} // namespace Core
2017-08-08 13:53:47 +02:00
#endif