r5sdk/r5dev/game/server/variant_t.cpp

333 lines
7.3 KiB
C++
Raw Normal View History

////////////////////////// variant_t implementation //////////////////////////
#include "entityoutput.h"
#include "baseentity.h"
//-----------------------------------------------------------------------------
// Purpose: All types must be able to display as strings for debugging purposes.
// Output : Returns a pointer to the string that represents this value.
//
// NOTE: The returned pointer should not be stored by the caller as
// subsequent calls to this function will overwrite the contents
// of the buffer!
//-----------------------------------------------------------------------------
const char* variant_t::ToString(void) const
{
static char szBuf[512];
switch (fieldType)
{
case FIELD_STRING:
{
return(STRING(iszVal));
}
case FIELD_BOOLEAN:
{
if (bVal == 0)
{
Q_strncpy(szBuf, "false", sizeof(szBuf));
}
else
{
Q_strncpy(szBuf, "true", sizeof(szBuf));
}
return(szBuf);
}
case FIELD_INTEGER:
{
Q_snprintf(szBuf, sizeof(szBuf), "%i", iVal);
return(szBuf);
}
case FIELD_FLOAT:
{
Q_snprintf(szBuf, sizeof(szBuf), "%g", flVal);
return(szBuf);
}
case FIELD_COLOR32:
{
Q_snprintf(szBuf, sizeof(szBuf), "%d %d %d %d", (int)rgbaVal.r, (int)rgbaVal.g, (int)rgbaVal.b, (int)rgbaVal.a);
return(szBuf);
}
case FIELD_VECTOR:
{
Q_snprintf(szBuf, sizeof(szBuf), "[%g %g %g]", (double)vecVal[0], (double)vecVal[1], (double)vecVal[2]);
return(szBuf);
}
case FIELD_VOID:
{
szBuf[0] = '\0';
return(szBuf);
}
case FIELD_EHANDLE:
{
const char* pszName = (Entity()) ? STRING(Entity()->GetEntityName()) : "<<null entity>>";
Q_strncpy(szBuf, pszName, 512);
return (szBuf);
}
}
return("No conversion to string");
}
//-----------------------------------------------------------------------------
// Purpose: sets the entity
//-----------------------------------------------------------------------------
void variant_t::SetEntity(CBaseEntity* val)
{
eVal = val;
fieldType = FIELD_EHANDLE;
}
// BUGBUG: Add support for function pointer save/restore to variants
// BUGBUG: Must pass datamap_t to read/write fields
//void variant_t::Set(fieldtype_t ftype, void* data)
//{
// fieldType = ftype;
//
// switch (ftype)
// {
// case FIELD_BOOLEAN: bVal = *((bool*)data); break;
// case FIELD_CHARACTER: iVal = *((char*)data); break;
// case FIELD_SHORT: iVal = *((short*)data); break;
// case FIELD_INTEGER: iVal = *((int*)data); break;
// case FIELD_STRING: iszVal = *((string_t*)data); break;
// case FIELD_FLOAT: flVal = *((float*)data); break;
// case FIELD_COLOR32: rgbaVal = *((color32*)data); break;
//
// case FIELD_VECTOR:
// case FIELD_POSITION_VECTOR:
// {
// vecVal[0] = ((float*)data)[0];
// vecVal[1] = ((float*)data)[1];
// vecVal[2] = ((float*)data)[2];
// break;
// }
//
// case FIELD_EHANDLE: eVal = *((EHANDLE*)data); break;
// case FIELD_CLASSPTR: eVal = *((CBaseEntity**)data); break;
// case FIELD_VOID:
// default:
// iVal = 0; fieldType = FIELD_VOID;
// break;
// }
//}
//-----------------------------------------------------------------------------
// Purpose: Copies the value in the variant into a block of memory
// Input : *data - the block to write into
//-----------------------------------------------------------------------------
void variant_t::SetOther(void* data)
{
switch (fieldType)
{
case FIELD_BOOLEAN: *((bool*)data) = bVal != 0; break;
case FIELD_CHARACTER: *((char*)data) = (char)iVal; break;
case FIELD_SHORT: *((short*)data) = (short)iVal; break;
case FIELD_INTEGER: *((int*)data) = iVal; break;
case FIELD_STRING: *((string_t*)data) = iszVal; break;
case FIELD_FLOAT: *((float*)data) = flVal; break;
case FIELD_COLOR32: *((color32*)data) = rgbaVal; break;
case FIELD_VECTOR:
case FIELD_POSITION_VECTOR:
{
((float*)data)[0] = vecVal[0];
((float*)data)[1] = vecVal[1];
((float*)data)[2] = vecVal[2];
break;
}
case FIELD_EHANDLE: *((EHANDLE*)data) = eVal; break;
case FIELD_CLASSPTR: *((CBaseEntity**)data) = eVal; break;
}
}
//-----------------------------------------------------------------------------
// Purpose: Converts the variant to a new type. This function defines which I/O
// types can be automatically converted between. Connections that require
// an unsupported conversion will cause an error message at runtime.
// Input : newType - the type to convert to
// Output : Returns true on success, false if the conversion is not legal
//-----------------------------------------------------------------------------
//bool variant_t::Convert(fieldtype_t newType)
//{
// if (newType == fieldType)
// {
// return true;
// }
//
// //
// // Converting to a null value is easy.
// //
// if (newType == FIELD_VOID)
// {
// Set(FIELD_VOID, NULL);
// return true;
// }
//
// //
// // FIELD_INPUT accepts the variant type directly.
// //
// if (newType == FIELD_INPUT)
// {
// return true;
// }
//
// switch (fieldType)
// {
// case FIELD_INTEGER:
// {
// switch (newType)
// {
// case FIELD_FLOAT:
// {
// SetFloat((float)iVal);
// return true;
// }
//
// case FIELD_BOOLEAN:
// {
// SetBool(iVal != 0);
// return true;
// }
// }
// break;
// }
//
// case FIELD_FLOAT:
// {
// switch (newType)
// {
// case FIELD_INTEGER:
// {
// SetInt((int)flVal);
// return true;
// }
//
// case FIELD_BOOLEAN:
// {
// SetBool(flVal != 0);
// return true;
// }
// }
// break;
// }
//
// //
// // Everyone must convert from FIELD_STRING if possible, since
// // parameter overrides are always passed as strings.
// //
// case FIELD_STRING:
// {
// switch (newType)
// {
// case FIELD_INTEGER:
// {
// if (iszVal != NULL_STRING)
// {
// SetInt(atoi(STRING(iszVal)));
// }
// else
// {
// SetInt(0);
// }
// return true;
// }
//
// case FIELD_FLOAT:
// {
// if (iszVal != NULL_STRING)
// {
// SetFloat(atof(STRING(iszVal)));
// }
// else
// {
// SetFloat(0);
// }
// return true;
// }
//
// case FIELD_BOOLEAN:
// {
// if (iszVal != NULL_STRING)
// {
// SetBool(atoi(STRING(iszVal)) != 0);
// }
// else
// {
// SetBool(false);
// }
// return true;
// }
//
// case FIELD_VECTOR:
// {
// ::Vector3D tmpVec = vec3_origin;
// if (sscanf(STRING(iszVal), "[%f %f %f]", &tmpVec[0], &tmpVec[1], &tmpVec[2]) == 0)
// {
// // Try sucking out 3 floats with no []s
// sscanf(STRING(iszVal), "%f %f %f", &tmpVec[0], &tmpVec[1], &tmpVec[2]);
// }
// SetVector3D(tmpVec);
// return true;
// }
//
// case FIELD_COLOR32:
// {
// int nRed = 0;
// int nGreen = 0;
// int nBlue = 0;
// int nAlpha = 255;
//
// sscanf(STRING(iszVal), "%d %d %d %d", &nRed, &nGreen, &nBlue, &nAlpha);
// SetColor32(nRed, nGreen, nBlue, nAlpha);
// return true;
// }
//
// case FIELD_EHANDLE:
// {
// // convert the string to an entity by locating it by classname
// CBaseEntity* ent = NULL;
// if (iszVal != NULL_STRING)
// {
// // FIXME: do we need to pass an activator in here?
// ent = gEntList.FindEntityByName(NULL, iszVal);
// }
// SetEntity(ent);
// return true;
// }
// }
//
// break;
// }
//
// case FIELD_EHANDLE:
// {
// switch (newType)
// {
// case FIELD_STRING:
// {
// // take the entities targetname as the string
// string_t iszStr = NULL_STRING;
// if (eVal != NULL)
// {
// SetString(eVal->GetEntityName());
// }
// return true;
// }
// }
// break;
// }
// }
//
// // invalid conversion
// return false;
//}