about summary refs log tree commit diff
path: root/src/game/server/gameworld.cpp
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-01-19 18:27:50 +0100
committeroy <Tom_Adams@web.de>2011-01-19 18:27:50 +0100
commit19a9462fe88b2573ab9f24a2890d4affb2bdcf47 (patch)
tree699ea43000384716ef42843b2f2a7f33010f9a67 /src/game/server/gameworld.cpp
parent7ca7c95bc0d29aca731838d9c404c038cbc15599 (diff)
downloadzcatch-19a9462fe88b2573ab9f24a2890d4affb2bdcf47.tar.gz
zcatch-19a9462fe88b2573ab9f24a2890d4affb2bdcf47.zip
removed double entity list in gameworld and cleaned up connected stuff
Diffstat (limited to 'src/game/server/gameworld.cpp')
-rw-r--r--src/game/server/gameworld.cpp129
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)