ddnet/src/game/server/gameworld.h
2023-01-04 21:08:47 +01:00

172 lines
4.1 KiB
C++

/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
#ifndef GAME_SERVER_GAMEWORLD_H
#define GAME_SERVER_GAMEWORLD_H
#include <game/gamecore.h>
#include <list>
class CEntity;
class CCharacter;
/*
Class: Game World
Tracks all entities in the game. Propagates tick and
snap calls to all entities.
*/
class CGameWorld
{
public:
enum
{
ENTTYPE_PROJECTILE = 0,
ENTTYPE_LASER,
ENTTYPE_PICKUP,
ENTTYPE_FLAG,
ENTTYPE_CHARACTER,
NUM_ENTTYPES
};
private:
void Reset();
void RemoveEntities();
CEntity *m_pNextTraverseEntity = nullptr;
CEntity *m_apFirstEntityTypes[NUM_ENTTYPES];
class CGameContext *m_pGameServer;
class CConfig *m_pConfig;
class IServer *m_pServer;
void UpdatePlayerMaps();
public:
class CGameContext *GameServer() { return m_pGameServer; }
class CConfig *Config() { return m_pConfig; }
class IServer *Server() { return m_pServer; }
bool m_ResetRequested;
bool m_Paused;
CWorldCore m_Core;
CGameWorld();
~CGameWorld();
void SetGameServer(CGameContext *pGameServer);
CEntity *FindFirst(int Type);
/*
Function: FindEntities
Finds entities close to a position and returns them in a list.
Arguments:
Pos - Position.
Radius - How close the entities have to be.
ppEnts - Pointer to a list that should be filled with the pointers
to the entities.
Max - Number of entities that fits into the ents array.
Type - Type of the entities to find.
Returns:
Number of entities found and added to the ents array.
*/
int FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max, int Type);
/*
Function: InterserctCharacters
Finds the CCharacters that intersects the line. // made for types lasers=1 and doors=0
Arguments:
Pos0 - Start position
Pos1 - End position
Radius - How for from the line the CCharacter is allowed to be.
NewPos - Intersection position
pNotThis - Entity to ignore intersecting with
Returns:
Returns a pointer to the closest hit or NULL of there is no intersection.
*/
CCharacter *IntersectCharacter(vec2 Pos0, vec2 Pos1, float Radius, vec2 &NewPos, const CCharacter *pNotThis = nullptr, int CollideWith = -1, const CCharacter *pThisOnly = nullptr);
/*
Function: ClosestCharacter
Finds the closest CCharacter to a specific point.
Arguments:
Pos - The center position.
Radius - How far off the CCharacter is allowed to be
pNotThis - Entity to ignore
Returns:
Returns a pointer to the closest CCharacter or NULL if no CCharacter is close enough.
*/
CCharacter *ClosestCharacter(vec2 Pos, float Radius, const CEntity *pNotThis);
/*
Function: InsertEntity
Adds an entity to the world.
Arguments:
pEntity - Entity to add
*/
void InsertEntity(CEntity *pEntity);
/*
Function: RemoveEntity
Removes an entity from the world.
Arguments:
pEntity - Entity to remove
*/
void RemoveEntity(CEntity *pEntity);
void RemoveEntitiesFromPlayer(int PlayerId);
void RemoveEntitiesFromPlayers(int PlayerIds[], int NumPlayers);
/*
Function: Snap
Calls Snap on all the entities in the world to create
the snapshot.
Arguments:
SnappingClient - ID of the client which snapshot
is being created.
*/
void Snap(int SnappingClient);
/*
Function: Tick
Calls Tick on all the entities in the world to progress
the world to the next tick.
*/
void Tick();
/*
Function: SwapClients
Calls SwapClients on all the entities in the world to ensure that /swap
command is handled safely.
*/
void SwapClients(int Client1, int Client2);
// DDRace
void ReleaseHooked(int ClientID);
/*
Function: IntersectedCharacters
Finds all CCharacters that intersect the line.
Arguments:
Pos0 - Start position
Pos1 - End position
Radius - How for from the line the CCharacter is allowed to be.
pNotThis - Entity to ignore intersecting with
Returns:
Returns list with all Characters on line.
*/
std::list<CCharacter *> IntersectedCharacters(vec2 Pos0, vec2 Pos1, float Radius, const CEntity *pNotThis = nullptr);
};
#endif