Skip to content

Commit 2d01391

Browse files
Add support for reading output values in NetProps
1 parent b31fb17 commit 2d01391

3 files changed

Lines changed: 184 additions & 2 deletions

File tree

sp/src/game/server/entityoutput.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,16 @@ class CBaseEntityOutput
8585
void SetActionList(CEventAction *newlist) { m_ActionList = newlist; }
8686
#endif
8787

88+
#ifdef MAPBASE_VSCRIPT
89+
// Value is accessed in CScriptNetPropManager
90+
public:
91+
#else
8892
protected:
93+
#endif
8994
variant_t m_Value;
95+
#ifdef MAPBASE_VSCRIPT
96+
protected:
97+
#endif
9098
CEventAction *m_ActionList;
9199
DECLARE_SIMPLE_DATADESC();
92100

@@ -104,6 +112,14 @@ template< class Type, fieldtype_t fieldType >
104112
class CEntityOutputTemplate : public CBaseEntityOutput
105113
{
106114
public:
115+
#ifdef MAPBASE_VSCRIPT
116+
// Initialise type to allow script access
117+
CEntityOutputTemplate() : CBaseEntityOutput()
118+
{
119+
m_Value.fieldType = fieldType;
120+
}
121+
#endif
122+
107123
//
108124
// Sets an initial value without firing the output.
109125
//
@@ -138,6 +154,13 @@ template<>
138154
class CEntityOutputTemplate<class Vector, FIELD_VECTOR> : public CBaseEntityOutput
139155
{
140156
public:
157+
#ifdef MAPBASE_VSCRIPT
158+
CEntityOutputTemplate() : CBaseEntityOutput()
159+
{
160+
m_Value.fieldType = FIELD_VECTOR;
161+
}
162+
#endif
163+
141164
void Init( const Vector &value )
142165
{
143166
m_Value.SetVector3D( value );
@@ -183,6 +206,13 @@ template<>
183206
class CEntityOutputTemplate<class Vector, FIELD_POSITION_VECTOR> : public CBaseEntityOutput
184207
{
185208
public:
209+
#ifdef MAPBASE_VSCRIPT
210+
CEntityOutputTemplate() : CBaseEntityOutput()
211+
{
212+
m_Value.fieldType = FIELD_POSITION_VECTOR;
213+
}
214+
#endif
215+
186216
void Init( const Vector &value )
187217
{
188218
m_Value.SetPositionVector3D( value );

sp/src/game/server/variant_t.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ struct ScriptVariant_t;
2727
//
2828
class variant_t
2929
{
30+
#ifdef MAPBASE_VSCRIPT
31+
// Offsets are read in CScriptNetPropManager
32+
public:
33+
#endif
34+
3035
union
3136
{
3237
bool bVal;

sp/src/game/shared/mapbase/vscript_singletons.cpp

Lines changed: 149 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ class CScriptNetPropManager
355355
int fieldType = td->fieldType;
356356
int fieldOffset = td->fieldOffset[ TD_OFFSET_NORMAL ];
357357

358-
if ( td->flags & (FTYPEDESC_FUNCTIONTABLE | FTYPEDESC_INPUT | FTYPEDESC_OUTPUT) )
358+
if ( td->flags & (FTYPEDESC_FUNCTIONTABLE | FTYPEDESC_INPUT) )
359359
continue;
360360

361361
if ( fieldType == FIELD_VOID || fieldType == FIELD_FUNCTION )
@@ -924,6 +924,63 @@ class CScriptNetPropManager
924924
}
925925
case FIELD_CUSTOM:
926926
{
927+
#ifdef GAME_DLL
928+
if ( pField->flags & FTYPEDESC_OUTPUT )
929+
{
930+
CBaseEntityOutput *pOutput = (CBaseEntityOutput*)( (char*)pEnt + offset );
931+
offset += offsetof( CBaseEntityOutput, m_Value );
932+
enum types datatype;
933+
934+
switch ( pOutput->ValueFieldType() )
935+
{
936+
case FIELD_INTEGER:
937+
case FIELD_COLOR32:
938+
{
939+
datatype = types::_INT32;
940+
offset += offsetof( variant_t, iVal );
941+
break;
942+
}
943+
case FIELD_FLOAT:
944+
{
945+
datatype = types::_FLOAT;
946+
offset += offsetof( variant_t, flVal );
947+
break;
948+
}
949+
case FIELD_VECTOR:
950+
case FIELD_POSITION_VECTOR:
951+
{
952+
datatype = types::_VEC3;
953+
offset += offsetof( variant_t, vecVal );
954+
break;
955+
}
956+
case FIELD_STRING:
957+
{
958+
datatype = types::_STRING_T;
959+
offset += offsetof( variant_t, iszVal );
960+
break;
961+
}
962+
case FIELD_EHANDLE:
963+
{
964+
datatype = types::_EHANDLE;
965+
offset += offsetof( variant_t, eVal );
966+
break;
967+
}
968+
default:
969+
AssertMsg(
970+
pOutput->ValueFieldType() == FIELD_INPUT ||
971+
pOutput->ValueFieldType() == FIELD_VOID,
972+
"not implemented" );
973+
return NULL;
974+
}
975+
976+
varinfo_t *pInfo = CacheNew( pEnt, szProp, false );
977+
pInfo->arraysize = 1;
978+
pInfo->offset = offset;
979+
pInfo->datatype = datatype;
980+
return pInfo;
981+
}
982+
#endif
983+
927984
if ( pField->pSaveRestoreOps == GetPhysObjSaveRestoreOps( PIID_IPHYSICSOBJECT ) )
928985
{
929986
SetVarInfo();
@@ -2130,6 +2187,47 @@ class CScriptNetPropManager
21302187
{
21312188
Assert( td->fieldType == FIELD_CUSTOM );
21322189

2190+
#ifdef GAME_DLL
2191+
if ( td->flags & FTYPEDESC_OUTPUT )
2192+
{
2193+
CBaseEntityOutput *pOutput = (CBaseEntityOutput*)pVar;
2194+
Print( "output " );
2195+
2196+
switch ( pOutput->ValueFieldType() )
2197+
{
2198+
case FIELD_INTEGER:
2199+
Print( "int" );
2200+
break;
2201+
case FIELD_COLOR32:
2202+
Print( "clr32" );
2203+
break;
2204+
case FIELD_FLOAT:
2205+
Print( "float" );
2206+
break;
2207+
case FIELD_VECTOR:
2208+
case FIELD_POSITION_VECTOR:
2209+
Print( "vec3" );
2210+
break;
2211+
case FIELD_STRING:
2212+
Print( "string" );
2213+
break;
2214+
case FIELD_EHANDLE:
2215+
Print( "entity" );
2216+
break;
2217+
case FIELD_INPUT:
2218+
Print( "variant" );
2219+
break;
2220+
case FIELD_VOID:
2221+
m_output.SeekPut( CUtlBuffer::SEEK_CURRENT, -1 );
2222+
break;
2223+
default:
2224+
Print( "unknown %d", pOutput->ValueFieldType() );
2225+
}
2226+
2227+
return;
2228+
}
2229+
#endif
2230+
21332231
const char *g_ppszPhysTypeNames[PIID_NUM_TYPES] =
21342232
{
21352233
"Unknown Phys",
@@ -2247,6 +2345,55 @@ class CScriptNetPropManager
22472345
{
22482346
Assert( td->fieldType == FIELD_CUSTOM );
22492347

2348+
#ifdef GAME_DLL
2349+
if ( td->flags & FTYPEDESC_OUTPUT )
2350+
{
2351+
CBaseEntityOutput *pOutput = (CBaseEntityOutput*)pVar;
2352+
pVar += offsetof( CBaseEntityOutput, m_Value );
2353+
2354+
switch ( pOutput->ValueFieldType() )
2355+
{
2356+
case FIELD_INTEGER:
2357+
{
2358+
Print( "%i", ((variant_t*)pVar)->iVal );
2359+
break;
2360+
}
2361+
case FIELD_COLOR32:
2362+
{
2363+
Print( "0x%08x", ((variant_t*)pVar)->iVal );
2364+
break;
2365+
}
2366+
case FIELD_FLOAT:
2367+
{
2368+
Print( "%f", ((variant_t*)pVar)->flVal );
2369+
break;
2370+
}
2371+
case FIELD_VECTOR:
2372+
case FIELD_POSITION_VECTOR:
2373+
{
2374+
PrintVec3( ((variant_t*)pVar)->vecVal );
2375+
break;
2376+
}
2377+
case FIELD_STRING:
2378+
{
2379+
PrintString( ((variant_t*)pVar)->String() );
2380+
break;
2381+
}
2382+
case FIELD_EHANDLE:
2383+
{
2384+
PrintEntity( &((variant_t*)pVar)->eVal );
2385+
break;
2386+
}
2387+
case FIELD_INPUT:
2388+
case FIELD_VOID:
2389+
default:
2390+
break;
2391+
}
2392+
2393+
return;
2394+
}
2395+
#endif
2396+
22502397
for ( int i = 0; i < PIID_NUM_TYPES; i++ )
22512398
{
22522399
if ( td->pSaveRestoreOps == GetPhysObjSaveRestoreOps( (PhysInterfaceId_t)i ) )
@@ -2512,7 +2659,7 @@ class CScriptNetPropManager
25122659
{
25132660
typedescription_t* td = &pFields[i];
25142661

2515-
if ( td->flags & (FTYPEDESC_FUNCTIONTABLE | FTYPEDESC_INPUT | FTYPEDESC_OUTPUT) )
2662+
if ( td->flags & (FTYPEDESC_FUNCTIONTABLE | FTYPEDESC_INPUT) )
25162663
continue;
25172664

25182665
if ( td->fieldType == FIELD_VOID || td->fieldType == FIELD_FUNCTION )

0 commit comments

Comments
 (0)