diff options
Diffstat (limited to 'src/game/server/gameworld.cpp')
| -rw-r--r-- | src/game/server/gameworld.cpp | 129 |
1 files changed, 58 insertions, 71 deletions
diff --git a/src/game/server/gameworld.cpp b/src/game/server/gameworld.cpp index 8fc9fec8..b4ab4594 100644 --- a/src/game/server/gameworld.cpp +++ b/src/game/server/gameworld.cpp @@ -15,16 +15,16 @@ CGameWorld::CGameWorld() m_Paused = false; m_ResetRequested = false; - m_pFirstEntity = 0x0; - for(int i = 0; i < NUM_ENT_TYPES; i++) + for(int i = 0; i < NUM_ENTTYPES; i++) m_apFirstEntityTypes[i] = 0; } CGameWorld::~CGameWorld() { // delete all entities - while(m_pFirstEntity) - delete m_pFirstEntity; + for(int i = 0; i < NUM_ENTTYPES; i++) + while(m_apFirstEntityTypes[i]) + delete m_apFirstEntityTypes[i]; } void CGameWorld::SetGameServer(CGameContext *pGameServer) @@ -35,15 +35,16 @@ void CGameWorld::SetGameServer(CGameContext *pGameServer) CEntity *CGameWorld::FindFirst(int Type) { - return m_apFirstEntityTypes[Type]; + return Type < 0 || Type >= NUM_ENTTYPES ? 0 : m_apFirstEntityTypes[Type]; } - int CGameWorld::FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max, int Type) { + if(Type < 0 || Type >= NUM_ENTTYPES) + return 0; + int Num = 0; - for(CEntity *pEnt = (Type<0) ? m_pFirstEntity : m_apFirstEntityTypes[Type]; - pEnt; pEnt = (Type<0) ? pEnt->m_pNextEntity : pEnt->m_pNextTypeEntity) + for(CEntity *pEnt = m_apFirstEntityTypes[Type]; pEnt; pEnt = pEnt->m_pNextTypeEntity) { if(distance(pEnt->m_Pos, Pos) < Radius+pEnt->m_ProximityRadius) { @@ -59,26 +60,17 @@ int CGameWorld::FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max, void CGameWorld::InsertEntity(CEntity *pEnt) { - CEntity *pCur = m_pFirstEntity; - while(pCur) - { +#ifdef CONF_DEBUG + for(CEntity *pCur = m_apFirstEntityTypes[pEnt->m_Objtype]; pCur; pCur = pCur->m_pNextTypeEntity) dbg_assert(pCur != pEnt, "err"); - pCur = pCur->m_pNextEntity; - } +#endif // insert it - if(m_pFirstEntity) - m_pFirstEntity->m_pPrevEntity = pEnt; - pEnt->m_pNextEntity = m_pFirstEntity; - pEnt->m_pPrevEntity = 0x0; - m_pFirstEntity = pEnt; - - // into typelist aswell - if(m_apFirstEntityTypes[pEnt->m_Objtype]) - m_apFirstEntityTypes[pEnt->m_Objtype]->m_pPrevTypeEntity = pEnt; - pEnt->m_pNextTypeEntity = m_apFirstEntityTypes[pEnt->m_Objtype]; + if(m_apFirstEntityTypes[pEnt->m_ObjType]) + m_apFirstEntityTypes[pEnt->m_ObjType]->m_pPrevTypeEntity = pEnt; + pEnt->m_pNextTypeEntity = m_apFirstEntityTypes[pEnt->m_ObjType]; pEnt->m_pPrevTypeEntity = 0x0; - m_apFirstEntityTypes[pEnt->m_Objtype] = pEnt; + m_apFirstEntityTypes[pEnt->m_ObjType] = pEnt; } void CGameWorld::DestroyEntity(CEntity *pEnt) @@ -89,30 +81,21 @@ void CGameWorld::DestroyEntity(CEntity *pEnt) void CGameWorld::RemoveEntity(CEntity *pEnt) { // not in the list - if(!pEnt->m_pNextEntity && !pEnt->m_pPrevEntity && m_pFirstEntity != pEnt) + if(!pEnt->m_pNextTypeEntity && !pEnt->m_pPrevTypeEntity && m_apFirstEntityTypes[pEnt->m_ObjType] != pEnt) return; // remove - if(pEnt->m_pPrevEntity) - pEnt->m_pPrevEntity->m_pNextEntity = pEnt->m_pNextEntity; - else - m_pFirstEntity = pEnt->m_pNextEntity; - if(pEnt->m_pNextEntity) - pEnt->m_pNextEntity->m_pPrevEntity = pEnt->m_pPrevEntity; - if(pEnt->m_pPrevTypeEntity) pEnt->m_pPrevTypeEntity->m_pNextTypeEntity = pEnt->m_pNextTypeEntity; else - m_apFirstEntityTypes[pEnt->m_Objtype] = pEnt->m_pNextTypeEntity; + m_apFirstEntityTypes[pEnt->m_ObjType] = pEnt->m_pNextTypeEntity; if(pEnt->m_pNextTypeEntity) pEnt->m_pNextTypeEntity->m_pPrevTypeEntity = pEnt->m_pPrevTypeEntity; // keep list traversing valid if(m_pNextTraverseEntity == pEnt) - m_pNextTraverseEntity = pEnt->m_pNextEntity; + m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; - pEnt->m_pNextEntity = 0; - pEnt->m_pPrevEntity = 0; pEnt->m_pNextTypeEntity = 0; pEnt->m_pPrevTypeEntity = 0; } @@ -120,23 +103,25 @@ void CGameWorld::RemoveEntity(CEntity *pEnt) // void CGameWorld::Snap(int SnappingClient) { - for(CEntity *pEnt = m_pFirstEntity; pEnt; ) - { - m_pNextTraverseEntity = pEnt->m_pNextEntity; - pEnt->Snap(SnappingClient); - pEnt = m_pNextTraverseEntity; - } + for(int i = 0; i < NUM_ENTTYPES; i++) + for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) + { + m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; + pEnt->Snap(SnappingClient); + pEnt = m_pNextTraverseEntity; + } } void CGameWorld::Reset() { // reset all entities - for(CEntity *pEnt = m_pFirstEntity; pEnt; ) - { - m_pNextTraverseEntity = pEnt->m_pNextEntity; - pEnt->Reset(); - pEnt = m_pNextTraverseEntity; - } + for(int i = 0; i < NUM_ENTTYPES; i++) + for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) + { + m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; + pEnt->Reset(); + pEnt = m_pNextTraverseEntity; + } RemoveEntities(); GameServer()->m_pController->PostReset(); @@ -148,17 +133,17 @@ void CGameWorld::Reset() void CGameWorld::RemoveEntities() { // destroy objects marked for destruction - CEntity *pEnt = m_pFirstEntity; - while(pEnt) - { - m_pNextTraverseEntity = pEnt->m_pNextEntity; - if(pEnt->m_MarkedForDestroy) + for(int i = 0; i < NUM_ENTTYPES; i++) + for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { - RemoveEntity(pEnt); - pEnt->Destroy(); + m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; + if(pEnt->m_MarkedForDestroy) + { + RemoveEntity(pEnt); + pEnt->Destroy(); + } + pEnt = m_pNextTraverseEntity; } - pEnt = m_pNextTraverseEntity; - } } void CGameWorld::Tick() @@ -171,19 +156,21 @@ void CGameWorld::Tick() if(GameServer()->m_pController->IsForceBalanced()) GameServer()->SendChat(-1, CGameContext::CHAT_ALL, "Teams have been balanced"); // update all objects - for(CEntity *pEnt = m_pFirstEntity; pEnt; ) - { - m_pNextTraverseEntity = pEnt->m_pNextEntity; - pEnt->Tick(); - pEnt = m_pNextTraverseEntity; - } + for(int i = 0; i < NUM_ENTTYPES; i++) + for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) + { + m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; + pEnt->Tick(); + pEnt = m_pNextTraverseEntity; + } - for(CEntity *pEnt = m_pFirstEntity; pEnt; ) - { - m_pNextTraverseEntity = pEnt->m_pNextEntity; - pEnt->TickDefered(); - pEnt = m_pNextTraverseEntity; - } + for(int i = 0; i < NUM_ENTTYPES; i++) + for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) + { + m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; + pEnt->TickDefered(); + pEnt = m_pNextTraverseEntity; + } } RemoveEntities(); @@ -198,7 +185,7 @@ CCharacter *CGameWorld::IntersectCharacter(vec2 Pos0, vec2 Pos1, float Radius, v vec2 LineDir = normalize(Pos1-Pos0); CCharacter *pClosest = 0; - CCharacter *p = (CCharacter *)FindFirst(NETOBJTYPE_CHARACTER); + CCharacter *p = (CCharacter *)FindFirst(ENTTYPE_CHARACTER); for(; p; p = (CCharacter *)p->TypeNext()) { if(p == pNotThis) @@ -228,7 +215,7 @@ CCharacter *CGameWorld::ClosestCharacter(vec2 Pos, float Radius, CEntity *pNotTh float ClosestRange = Radius*2; CCharacter *pClosest = 0; - CCharacter *p = (CCharacter *)GameServer()->m_World.FindFirst(NETOBJTYPE_CHARACTER); + CCharacter *p = (CCharacter *)GameServer()->m_World.FindFirst(ENTTYPE_CHARACTER); for(; p; p = (CCharacter *)p->TypeNext()) { if(p == pNotThis) |