work on world
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
#include "worldsystem.h"
|
||||
#include "game.h"
|
||||
#include "entitysystem.h"
|
||||
#include "baseentity.h"
|
||||
#include "netprotocol.h"
|
||||
|
||||
void CWorldSystem::LoadEntity( IJSONValue *pObject )
|
||||
{
|
||||
if (pObject->GetType() != JSON_PARAMETER_OBJECT)
|
||||
return;
|
||||
IJSONObject *pObjectRoot = pObject->GetObject();
|
||||
|
||||
const char *szClassName = NULL;
|
||||
|
||||
for ( int i = 0; i < pObjectRoot->GetCount(); i++)
|
||||
{
|
||||
if (V_strcmp(pObjectRoot->GetParameterName(i),"classname"))
|
||||
continue;
|
||||
|
||||
IJSONValue *pValue = pObjectRoot->GetParameter(i);
|
||||
if (pValue->GetType() != JSON_PARAMETER_STRING)
|
||||
{
|
||||
V_printf("classname must be a string\n");
|
||||
break;
|
||||
}
|
||||
szClassName = pValue->GetStringValue();
|
||||
break;
|
||||
}
|
||||
if (szClassName == NULL)
|
||||
return;
|
||||
CBaseEntity *pEntity = EntitySystem()->CreateByClassname(szClassName, NULL);
|
||||
if (!pEntity)
|
||||
return;
|
||||
for ( int i = 0; i < pObjectRoot->GetCount(); i++)
|
||||
{
|
||||
if (!V_strcmp(pObjectRoot->GetParameterName(i),"classname"))
|
||||
continue;
|
||||
|
||||
|
||||
IJSONValue *pValue = pObjectRoot->GetParameter(i);
|
||||
typedescription_t *pDataMap = pEntity->FindDataByMapName(pObjectRoot->GetParameterName(i));
|
||||
if (!pDataMap)
|
||||
continue;
|
||||
union {
|
||||
void *pData;
|
||||
float *pfData;
|
||||
Vector *pvData;
|
||||
char *pcData;
|
||||
};
|
||||
pData = (char*)pEntity+pDataMap->m_iFieldOffset;
|
||||
switch (pDataMap->m_eFieldType)
|
||||
{
|
||||
case FIELD_STRING:
|
||||
if (pValue->GetType() != JSON_PARAMETER_STRING)
|
||||
continue;
|
||||
V_strncpy(pcData, pValue->GetStringValue(), pDataMap->m_uFieldSize);
|
||||
V_printf("loading %s %u\n", pValue->GetStringValue(), pDataMap->m_uFieldSize);
|
||||
continue;
|
||||
case FIELD_FLOAT3:
|
||||
if (pValue->GetType() != JSON_PARAMETER_ARRAY)
|
||||
continue;
|
||||
if (pValue->GetArray()->GetCount() == 3)
|
||||
{
|
||||
if ( pValue->GetArray()->GetParameter(0)->GetType()
|
||||
== JSON_PARAMETER_NUMBER )
|
||||
pvData->x = pValue->GetArray()->GetParameter(0)->GetNumberValue();
|
||||
if ( pValue->GetArray()->GetParameter(1)->GetType()
|
||||
== JSON_PARAMETER_NUMBER )
|
||||
pvData->y = pValue->GetArray()->GetParameter(1)->GetNumberValue();
|
||||
if ( pValue->GetArray()->GetParameter(2)->GetType()
|
||||
== JSON_PARAMETER_NUMBER )
|
||||
pvData->z = pValue->GetArray()->GetParameter(2)->GetNumberValue();
|
||||
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
pEntity->Spawn();
|
||||
}
|
||||
|
||||
bool CWorldSystem::LoadMap( const char *szName )
|
||||
{
|
||||
V_printf("Loading %s\n", szName);
|
||||
// unload the map
|
||||
|
||||
IFileHandle *pHandle = filesystem->Open(szName, FILEMODE_READ);
|
||||
if (!pHandle)
|
||||
return 0;
|
||||
|
||||
CUtlString szProperties = filesystem->ReadString(pHandle);
|
||||
IJSONValue *pRoot = JSONManager()->ReadString(szProperties);
|
||||
filesystem->Close(pHandle);
|
||||
|
||||
if (!pRoot)
|
||||
return 0;
|
||||
|
||||
|
||||
// can't fail at this point
|
||||
|
||||
|
||||
|
||||
switch (pRoot->GetType())
|
||||
{
|
||||
case JSON_PARAMETER_ARRAY:
|
||||
{
|
||||
for ( uint32_t u = 0; u < pRoot->GetArray()->GetCount(); u++ )
|
||||
{
|
||||
IJSONValue *pObjectValue = pRoot->GetArray()->GetParameter(u);
|
||||
if ( !pObjectValue )
|
||||
continue;
|
||||
LoadEntity(pObjectValue);
|
||||
}
|
||||
JSONManager()->FreeValue(pRoot);
|
||||
return 1;
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
static CWorldSystem s_worldSystem;
|
||||
CWorldSystem *g_pWorldSystem = &s_worldSystem;
|
||||
|
||||
Reference in New Issue
Block a user