Ihr vergesst, das Objekte auch Mover sein können. ( Monster etc. Aber auch Items. )
Diese Funktion löscht einfach die Object Array's wenn etwas aus der Welt verschwindet, so wie Items nach 3 Minuten auf dem Boden, oder auch Monster die Tot sind.
Also wäre ich du, würde ich das ganze mal Loggen lassen, undzwar so:
PHP Code:
void CWorld::RemoveObjArray( CObj* pObj )
{
#ifdef __WORLDSERVER
// loggen der ID und Obj Array ID ( Fals Crash, sollte es angezeigt werden welche ID das Monster/Item hat. Wenn nicht dann ist das Objekt sehr verbuggt.
FILEOUT("LOG_OBJ_REMOVEARRAY.txt", "[Remove Object]: ID %d, m_dwObjAryIdx %d", pObj->GetProp()->dwID, pObj->m_dwObjAryIdx );
if( pObj->m_dwObjAryIdx == 0xffffffff )
{
WriteError( "RemoveObjArray pObj->m_dwObjAryIdx == 0xffffffff " );
return;
}
if( m_apObject[pObj->m_dwObjAryIdx] == pObj )
{
m_ObjStack.Push( pObj->m_dwObjAryIdx );
m_apObject[pObj->m_dwObjAryIdx] = NULL;
}
else
{
WriteError( "RemoveObjArray m_apObject[pObj->m_dwObjAryIdx] != pObj " );
}
m_cbRunnableObject--;
#else // __WORLDSERVER
CLandscape* pLandscape = GetLandscape( pObj );
if( NULL != pLandscape )
{
pLandscape->RemoveObjArray( pObj );
}
/*
else
{
char szMessage[260] = { 0, };
sprintf( szMessage, "ROA error with landscape unloaded - g_pPlayer = %f, %f\t//pObj = %f, %f",
g_pPlayer->GetPos().x, g_pPlayer->GetPos().z, pObj->GetPos().x, pObj->GetPos().z );
DEBUGOUT2( szMessage );
}
*/
#endif // __WORLDSERVER
}