mirror of
https://github.com/mapbase-source/source-sdk-2013.git
synced 2025-04-29 16:39:38 +03:00
Merge pull request #321 from z33ky/dangling-vscript-vector
Prevent return of dangling Vector/QAngle to VScript
This commit is contained in:
commit
a5236830fc
@ -16,6 +16,10 @@
|
|||||||
#include "saverestore_utlvector.h"
|
#include "saverestore_utlvector.h"
|
||||||
#include "dt_utlvector_send.h"
|
#include "dt_utlvector_send.h"
|
||||||
|
|
||||||
|
#ifdef MAPBASE_VSCRIPT
|
||||||
|
#include "mapbase/vscript_funcs_shared.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// memdbgon must be the last include file in a .cpp file!!!
|
// memdbgon must be the last include file in a .cpp file!!!
|
||||||
#include "tier0/memdbgon.h"
|
#include "tier0/memdbgon.h"
|
||||||
|
|
||||||
@ -471,7 +475,8 @@ void CAnimationLayer::DispatchAnimEvents( CBaseAnimating *eventHandler, CBaseAni
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
if (eventHandler->m_ScriptScope.IsInitialized() && eventHandler->ScriptHookHandleAnimEvent( &event ) == false)
|
scriptanimevent_t wrapper( event );
|
||||||
|
if (eventHandler->m_ScriptScope.IsInitialized() && !eventHandler->ScriptHookHandleAnimEvent( wrapper ))
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1261,7 +1261,8 @@ void CBaseAnimating::DispatchAnimEvents ( CBaseAnimating *eventHandler )
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
if (eventHandler->ScriptHookHandleAnimEvent( &event ) == false)
|
scriptanimevent_t wrapper( event );
|
||||||
|
if (!eventHandler->ScriptHookHandleAnimEvent( wrapper ))
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1299,11 +1300,11 @@ void CBaseAnimating::DispatchAnimEvents ( CBaseAnimating *eventHandler )
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose:
|
// Purpose:
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool CBaseAnimating::ScriptHookHandleAnimEvent( animevent_t *pEvent )
|
bool CBaseAnimating::ScriptHookHandleAnimEvent( scriptanimevent_t &event )
|
||||||
{
|
{
|
||||||
if (m_ScriptScope.IsInitialized() && g_Hook_HandleAnimEvent.CanRunInScope(m_ScriptScope))
|
if (m_ScriptScope.IsInitialized() && g_Hook_HandleAnimEvent.CanRunInScope(m_ScriptScope))
|
||||||
{
|
{
|
||||||
HSCRIPT hEvent = g_pScriptVM->RegisterInstance( reinterpret_cast<scriptanimevent_t*>(pEvent) );
|
HSCRIPT hEvent = g_pScriptVM->RegisterInstance( &event );
|
||||||
|
|
||||||
// event
|
// event
|
||||||
ScriptVariant_t args[] = { hEvent };
|
ScriptVariant_t args[] = { hEvent };
|
||||||
|
@ -16,6 +16,9 @@
|
|||||||
#include "datacache/idatacache.h"
|
#include "datacache/idatacache.h"
|
||||||
#include "tier0/threadtools.h"
|
#include "tier0/threadtools.h"
|
||||||
|
|
||||||
|
#ifdef MAPBASE_VSCRIPT
|
||||||
|
struct scriptanimevent_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct animevent_t;
|
struct animevent_t;
|
||||||
struct matrix3x4_t;
|
struct matrix3x4_t;
|
||||||
@ -146,7 +149,7 @@ public:
|
|||||||
virtual void DispatchAnimEvents ( CBaseAnimating *eventHandler ); // Handle events that have happend since last time called up until X seconds into the future
|
virtual void DispatchAnimEvents ( CBaseAnimating *eventHandler ); // Handle events that have happend since last time called up until X seconds into the future
|
||||||
virtual void HandleAnimEvent( animevent_t *pEvent );
|
virtual void HandleAnimEvent( animevent_t *pEvent );
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
bool ScriptHookHandleAnimEvent( animevent_t *pEvent );
|
bool ScriptHookHandleAnimEvent( scriptanimevent_t &event );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int LookupPoseParameter( CStudioHdr *pStudioHdr, const char *szName );
|
int LookupPoseParameter( CStudioHdr *pStudioHdr, const char *szName );
|
||||||
|
@ -2645,18 +2645,21 @@ Vector CProtoSniper::DesiredBodyTarget( CBaseEntity *pTarget )
|
|||||||
{
|
{
|
||||||
// By default, aim for the center
|
// By default, aim for the center
|
||||||
Vector vecTarget = pTarget->WorldSpaceCenter();
|
Vector vecTarget = pTarget->WorldSpaceCenter();
|
||||||
|
const Vector vecBulletOrigin = GetBulletOrigin();
|
||||||
|
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
if (m_ScriptScope.IsInitialized() && g_Hook_GetActualShootPosition.CanRunInScope(m_ScriptScope))
|
if ( m_ScriptScope.IsInitialized() && g_Hook_GetActualShootPosition.CanRunInScope( m_ScriptScope ) )
|
||||||
{
|
{
|
||||||
ScriptVariant_t functionReturn;
|
ScriptVariant_t functionReturn;
|
||||||
ScriptVariant_t args[] = { GetBulletOrigin(), ToHScript( pTarget ) };
|
ScriptVariant_t args[] = { vecBulletOrigin, ToHScript( pTarget ) };
|
||||||
if (g_Hook_GetActualShootPosition.Call( m_ScriptScope, &functionReturn, args ))
|
if ( g_Hook_GetActualShootPosition.Call( m_ScriptScope, &functionReturn, args ) )
|
||||||
|
{
|
||||||
|
if ( functionReturn.m_type == FIELD_VECTOR && functionReturn.m_pVector->LengthSqr() != 0.0f )
|
||||||
{
|
{
|
||||||
if (functionReturn.m_type == FIELD_VECTOR && functionReturn.m_pVector->LengthSqr() != 0.0f)
|
|
||||||
return *functionReturn.m_pVector;
|
return *functionReturn.m_pVector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
float flTimeSinceLastMiss = gpGlobals->curtime - m_flTimeLastShotMissed;
|
float flTimeSinceLastMiss = gpGlobals->curtime - m_flTimeLastShotMissed;
|
||||||
@ -2682,12 +2685,12 @@ Vector CProtoSniper::DesiredBodyTarget( CBaseEntity *pTarget )
|
|||||||
{
|
{
|
||||||
if( flTimeSinceLastMiss > 0.0f && flTimeSinceLastMiss < 4.0f && hl2_episodic.GetBool() )
|
if( flTimeSinceLastMiss > 0.0f && flTimeSinceLastMiss < 4.0f && hl2_episodic.GetBool() )
|
||||||
{
|
{
|
||||||
vecTarget = pTarget->BodyTarget( GetBulletOrigin(), false );
|
vecTarget = pTarget->BodyTarget( vecBulletOrigin, false );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Shoot zombies in the headcrab
|
// Shoot zombies in the headcrab
|
||||||
vecTarget = pTarget->HeadTarget( GetBulletOrigin() );
|
vecTarget = pTarget->HeadTarget( vecBulletOrigin );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( pTarget->Classify() == CLASS_ANTLION )
|
else if( pTarget->Classify() == CLASS_ANTLION )
|
||||||
|
@ -357,7 +357,8 @@ void RegisterSharedScriptConstants()
|
|||||||
ScriptRegisterConstant( g_pScriptVM, ROPE_NO_GRAVITY, "Disable gravity on this rope. (for use in rope flags)" );
|
ScriptRegisterConstant( g_pScriptVM, ROPE_NO_GRAVITY, "Disable gravity on this rope. (for use in rope flags)" );
|
||||||
ScriptRegisterConstant( g_pScriptVM, ROPE_NUMFLAGS, "The number of rope flags recognized by the game." );
|
ScriptRegisterConstant( g_pScriptVM, ROPE_NUMFLAGS, "The number of rope flags recognized by the game." );
|
||||||
|
|
||||||
ScriptRegisterConstantNamed( g_pScriptVM, Vector( ROPE_GRAVITY ), "ROPE_GRAVITY", "Default rope gravity vector." );
|
static Vector vecRopeGravity( ROPE_GRAVITY );
|
||||||
|
ScriptRegisterConstantNamed( g_pScriptVM, vecRopeGravity, "ROPE_GRAVITY", "Default rope gravity vector." );
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sounds
|
// Sounds
|
||||||
|
@ -532,7 +532,7 @@ bool CAnimEventTInstanceHelper::Get( void *p, const char *pszKey, ScriptVariant_
|
|||||||
{
|
{
|
||||||
DevWarning( "VScript animevent_t.%s: animevent_t metamethod members are deprecated! Use 'script_help animevent_t' to see the correct functions.\n", pszKey );
|
DevWarning( "VScript animevent_t.%s: animevent_t metamethod members are deprecated! Use 'script_help animevent_t' to see the correct functions.\n", pszKey );
|
||||||
|
|
||||||
animevent_t *ani = ((animevent_t *)p);
|
animevent_t *ani = &((scriptanimevent_t *)p)->event;
|
||||||
if (FStrEq( pszKey, "event" ))
|
if (FStrEq( pszKey, "event" ))
|
||||||
variant = ani->event;
|
variant = ani->event;
|
||||||
else if (FStrEq( pszKey, "options" ))
|
else if (FStrEq( pszKey, "options" ))
|
||||||
@ -555,18 +555,28 @@ bool CAnimEventTInstanceHelper::Set( void *p, const char *pszKey, ScriptVariant_
|
|||||||
{
|
{
|
||||||
DevWarning( "VScript animevent_t.%s: animevent_t metamethod members are deprecated! Use 'script_help animevent_t' to see the correct functions.\n", pszKey );
|
DevWarning( "VScript animevent_t.%s: animevent_t metamethod members are deprecated! Use 'script_help animevent_t' to see the correct functions.\n", pszKey );
|
||||||
|
|
||||||
animevent_t *ani = ((animevent_t *)p);
|
scriptanimevent_t *script_ani = ((scriptanimevent_t *)p);
|
||||||
|
animevent_t *ani = &script_ani->event;
|
||||||
if (FStrEq( pszKey, "event" ))
|
if (FStrEq( pszKey, "event" ))
|
||||||
ani->event = variant;
|
{
|
||||||
|
return variant.AssignTo( &ani->event );
|
||||||
|
}
|
||||||
else if (FStrEq( pszKey, "options" ))
|
else if (FStrEq( pszKey, "options" ))
|
||||||
ani->options = variant;
|
{
|
||||||
|
char *szOptions;
|
||||||
|
if (!variant.AssignTo( &szOptions ))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
script_ani->SetOptions( szOptions );
|
||||||
|
}
|
||||||
else if (FStrEq( pszKey, "cycle" ))
|
else if (FStrEq( pszKey, "cycle" ))
|
||||||
ani->cycle = variant;
|
return variant.AssignTo( &ani->cycle );
|
||||||
else if (FStrEq( pszKey, "eventtime" ))
|
else if (FStrEq( pszKey, "eventtime" ))
|
||||||
ani->eventtime = variant;
|
return variant.AssignTo( &ani->eventtime );
|
||||||
else if (FStrEq( pszKey, "type" ))
|
else if (FStrEq( pszKey, "type" ))
|
||||||
ani->type = variant;
|
return variant.AssignTo( &ani->type );
|
||||||
else if (FStrEq( pszKey, "source" ))
|
else if (FStrEq( pszKey, "source" ) && variant.m_type == FIELD_HSCRIPT)
|
||||||
{
|
{
|
||||||
CBaseEntity *pEnt = ToEnt( variant.m_hScript );
|
CBaseEntity *pEnt = ToEnt( variant.m_hScript );
|
||||||
if (pEnt)
|
if (pEnt)
|
||||||
|
@ -172,30 +172,47 @@ private:
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Exposes animevent_t to VScript
|
// Exposes animevent_t to VScript
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
struct scriptanimevent_t : public animevent_t
|
struct scriptanimevent_t
|
||||||
{
|
{
|
||||||
int GetEvent() { return event; }
|
friend class CAnimEventTInstanceHelper;
|
||||||
void SetEvent( int nEvent ) { event = nEvent; }
|
|
||||||
|
|
||||||
const char *GetOptions() { return options; }
|
public:
|
||||||
void SetOptions( const char *pOptions ) { options = pOptions; }
|
scriptanimevent_t( animevent_t &event ) : event( event ), options( NULL ) { }
|
||||||
|
~scriptanimevent_t( ) { delete[] options; }
|
||||||
|
|
||||||
float GetCycle() { return cycle; }
|
int GetEvent() { return event.event; }
|
||||||
void SetCycle( float flCycle ) { cycle = flCycle; }
|
void SetEvent( int nEvent ) { event.event = nEvent; }
|
||||||
|
|
||||||
float GetEventTime() { return eventtime; }
|
const char *GetOptions() { return event.options; }
|
||||||
void SetEventTime( float flEventTime ) { eventtime = flEventTime; }
|
void SetOptions( const char *pOptions )
|
||||||
|
{
|
||||||
|
size_t len = strlen( pOptions );
|
||||||
|
delete[] options;
|
||||||
|
event.options = options = new char[len + 1];
|
||||||
|
memcpy( options, pOptions, len + 1 );
|
||||||
|
}
|
||||||
|
|
||||||
int GetType() { return type; }
|
float GetCycle() { return event.cycle; }
|
||||||
void SetType( int nType ) { eventtime = type; }
|
void SetCycle( float flCycle ) { event.cycle = flCycle; }
|
||||||
|
|
||||||
HSCRIPT GetSource() { return ToHScript( pSource ); }
|
float GetEventTime() { return event.eventtime; }
|
||||||
|
void SetEventTime( float flEventTime ) { event.eventtime = flEventTime; }
|
||||||
|
|
||||||
|
int GetType() { return event.type; }
|
||||||
|
void SetType( int nType ) { event.type = nType; }
|
||||||
|
|
||||||
|
HSCRIPT GetSource() { return ToHScript( event.pSource ); }
|
||||||
void SetSource( HSCRIPT hSource )
|
void SetSource( HSCRIPT hSource )
|
||||||
{
|
{
|
||||||
CBaseEntity *pEnt = ToEnt( hSource );
|
CBaseEntity *pEnt = ToEnt( hSource );
|
||||||
if (pEnt)
|
if (pEnt)
|
||||||
pSource = pEnt->GetBaseAnimating();
|
event.pSource = pEnt->GetBaseAnimating();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
animevent_t &event;
|
||||||
|
// storage for ScriptVariant_t string, which may be temporary
|
||||||
|
char *options;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CAnimEventTInstanceHelper : public IScriptInstanceHelper
|
class CAnimEventTInstanceHelper : public IScriptInstanceHelper
|
||||||
|
@ -300,7 +300,8 @@ enum ScriptFuncBindingFlags_t
|
|||||||
SF_MEMBER_FUNC = 0x01,
|
SF_MEMBER_FUNC = 0x01,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef bool (*ScriptBindingFunc_t)( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn );
|
union ScriptVariantTemporaryStorage_t;
|
||||||
|
typedef bool (*ScriptBindingFunc_t)( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage );
|
||||||
|
|
||||||
struct ScriptFunctionBinding_t
|
struct ScriptFunctionBinding_t
|
||||||
{
|
{
|
||||||
@ -321,11 +322,6 @@ public:
|
|||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
virtual bool Get( void *p, const char *pszKey, ScriptVariant_t &variant ) { return false; }
|
virtual bool Get( void *p, const char *pszKey, ScriptVariant_t &variant ) { return false; }
|
||||||
virtual bool Set( void *p, const char *pszKey, ScriptVariant_t &variant ) { return false; }
|
virtual bool Set( void *p, const char *pszKey, ScriptVariant_t &variant ) { return false; }
|
||||||
|
|
||||||
virtual ScriptVariant_t *Add( void *p, ScriptVariant_t &variant ) { return NULL; }
|
|
||||||
virtual ScriptVariant_t *Subtract( void *p, ScriptVariant_t &variant ) { return NULL; }
|
|
||||||
virtual ScriptVariant_t *Multiply( void *p, ScriptVariant_t &variant ) { return NULL; }
|
|
||||||
virtual ScriptVariant_t *Divide( void *p, ScriptVariant_t &variant ) { return NULL; }
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -390,13 +386,17 @@ struct ScriptVariant_t
|
|||||||
ScriptVariant_t( bool val ) : m_flags( 0 ), m_type( FIELD_BOOLEAN ) { m_bool = val; }
|
ScriptVariant_t( bool val ) : m_flags( 0 ), m_type( FIELD_BOOLEAN ) { m_bool = val; }
|
||||||
ScriptVariant_t( HSCRIPT val ) : m_flags( 0 ), m_type( FIELD_HSCRIPT ) { m_hScript = val; }
|
ScriptVariant_t( HSCRIPT val ) : m_flags( 0 ), m_type( FIELD_HSCRIPT ) { m_hScript = val; }
|
||||||
|
|
||||||
ScriptVariant_t( const Vector &val, bool bCopy = false ) : m_flags( 0 ), m_type( FIELD_VECTOR ) { if ( !bCopy ) { m_pVector = &val; } else { m_pVector = new Vector( val ); m_flags |= SV_FREE; } }
|
ScriptVariant_t( const Vector &val ) : m_flags( 0 ), m_type( FIELD_VECTOR ) { m_pVector = &val; }
|
||||||
ScriptVariant_t( const Vector *val, bool bCopy = false ) : m_flags( 0 ), m_type( FIELD_VECTOR ) { if ( !bCopy ) { m_pVector = val; } else { m_pVector = new Vector( *val ); m_flags |= SV_FREE; } }
|
ScriptVariant_t( const Vector *val ) : ScriptVariant_t( *val ) { }
|
||||||
ScriptVariant_t( const char *val , bool bCopy = false ) : m_flags( 0 ), m_type( FIELD_CSTRING ) { if ( !bCopy ) { m_pszString = val; } else { m_pszString = strdup( val ); m_flags |= SV_FREE; } }
|
|
||||||
|
ScriptVariant_t( const char *val ) : m_flags( 0 ), m_type( FIELD_CSTRING ) { m_pszString = val; }
|
||||||
|
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
ScriptVariant_t( const QAngle &val, bool bCopy = false ) : m_flags( 0 ), m_type( FIELD_VECTOR ) { if ( !bCopy ) { m_pAngle = &val; } else { m_pAngle = new QAngle( val ); m_flags |= SV_FREE; } }
|
ScriptVariant_t( const QAngle &val ) : m_flags( 0 ), m_type( FIELD_VECTOR ) { m_pAngle = &val; }
|
||||||
ScriptVariant_t( const QAngle *val, bool bCopy = false ) : m_flags( 0 ), m_type( FIELD_VECTOR ) { if ( !bCopy ) { m_pAngle = val; } else { m_pAngle = new QAngle( *val ); m_flags |= SV_FREE; } }
|
ScriptVariant_t( const QAngle *val ) : ScriptVariant_t( *val ) { }
|
||||||
|
|
||||||
|
ScriptVariant_t( Vector &&val ) = delete;
|
||||||
|
ScriptVariant_t( QAngle &&val ) = delete;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool IsNull() const { return (m_type == FIELD_VOID ); }
|
bool IsNull() const { return (m_type == FIELD_VOID ); }
|
||||||
@ -404,74 +404,41 @@ struct ScriptVariant_t
|
|||||||
operator int() const { Assert( m_type == FIELD_INTEGER ); return m_int; }
|
operator int() const { Assert( m_type == FIELD_INTEGER ); return m_int; }
|
||||||
operator float() const { Assert( m_type == FIELD_FLOAT ); return m_float; }
|
operator float() const { Assert( m_type == FIELD_FLOAT ); return m_float; }
|
||||||
operator const char *() const { Assert( m_type == FIELD_CSTRING ); return ( m_pszString ) ? m_pszString : ""; }
|
operator const char *() const { Assert( m_type == FIELD_CSTRING ); return ( m_pszString ) ? m_pszString : ""; }
|
||||||
operator const Vector &() const { Assert( m_type == FIELD_VECTOR ); static Vector vecNull(0, 0, 0); return (m_pVector) ? *m_pVector : vecNull; }
|
operator const Vector &() const { Assert( m_type == FIELD_VECTOR ); return (m_pVector) ? *m_pVector : vec3_origin; }
|
||||||
operator char() const { Assert( m_type == FIELD_CHARACTER ); return m_char; }
|
operator char() const { Assert( m_type == FIELD_CHARACTER ); return m_char; }
|
||||||
operator bool() const { Assert( m_type == FIELD_BOOLEAN ); return m_bool; }
|
operator bool() const { Assert( m_type == FIELD_BOOLEAN ); return m_bool; }
|
||||||
operator HSCRIPT() const { Assert( m_type == FIELD_HSCRIPT ); return m_hScript; }
|
operator HSCRIPT() const { Assert( m_type == FIELD_HSCRIPT ); return m_hScript; }
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
operator const QAngle &() const { Assert( m_type == FIELD_VECTOR ); static QAngle vecNull(0, 0, 0); return (m_pAngle) ? *m_pAngle : vecNull; }
|
operator const QAngle &() const { Assert( m_type == FIELD_VECTOR ); return (m_pAngle) ? *m_pAngle : vec3_angle; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void operator=( int i ) { m_type = FIELD_INTEGER; m_int = i; }
|
void operator=( int i ) { m_type = FIELD_INTEGER; m_flags = 0; m_int = i; }
|
||||||
void operator=( float f ) { m_type = FIELD_FLOAT; m_float = f; }
|
void operator=( float f ) { m_type = FIELD_FLOAT; m_flags = 0; m_float = f; }
|
||||||
void operator=( double f ) { m_type = FIELD_FLOAT; m_float = (float)f; }
|
void operator=( double f ) { m_type = FIELD_FLOAT; m_flags = 0; m_float = (float)f; }
|
||||||
void operator=( const Vector &vec ) { m_type = FIELD_VECTOR; m_pVector = &vec; }
|
void operator=( const Vector &vec ) { m_type = FIELD_VECTOR; m_flags = 0; m_pVector = &vec; }
|
||||||
void operator=( const Vector *vec ) { m_type = FIELD_VECTOR; m_pVector = vec; }
|
void operator=( const Vector *vec ) { m_type = FIELD_VECTOR; m_flags = 0; m_pVector = vec; }
|
||||||
void operator=( const char *psz ) { m_type = FIELD_CSTRING; m_pszString = psz; }
|
void operator=( const char *psz ) { m_type = FIELD_CSTRING; m_flags = 0; m_pszString = psz; }
|
||||||
void operator=( char c ) { m_type = FIELD_CHARACTER; m_char = c; }
|
void operator=( char c ) { m_type = FIELD_CHARACTER; m_flags = 0; m_char = c; }
|
||||||
void operator=( bool b ) { m_type = FIELD_BOOLEAN; m_bool = b; }
|
void operator=( bool b ) { m_type = FIELD_BOOLEAN; m_flags = 0; m_bool = b; }
|
||||||
void operator=( HSCRIPT h ) { m_type = FIELD_HSCRIPT; m_hScript = h; }
|
void operator=( HSCRIPT h ) { m_type = FIELD_HSCRIPT; m_flags = 0; m_hScript = h; }
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
void operator=( const QAngle &vec ) { m_type = FIELD_VECTOR; m_pAngle = &vec; }
|
void operator=( const QAngle &ang ) { m_type = FIELD_VECTOR; m_flags = 0; m_pAngle = ∠ }
|
||||||
void operator=( const QAngle *vec ) { m_type = FIELD_VECTOR; m_pAngle = vec; }
|
void operator=( const QAngle *ang ) { m_type = FIELD_VECTOR; m_flags = 0; m_pAngle = ang; }
|
||||||
|
|
||||||
|
void operator=( Vector &&vec ) = delete;
|
||||||
|
void operator=( QAngle &&ang ) = delete;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Free() { if ( ( m_flags & SV_FREE ) && ( m_type == FIELD_HSCRIPT || m_type == FIELD_VECTOR || m_type == FIELD_CSTRING ) ) delete m_pszString; } // Generally only needed for return results
|
void Free()
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T Get()
|
|
||||||
{
|
{
|
||||||
T value;
|
// Generally only needed for return results
|
||||||
AssignTo( &value );
|
if ( ! ( m_flags & SV_FREE ) )
|
||||||
return value;
|
{
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
AssertMsg( m_type == FIELD_CSTRING || m_type == FIELD_VECTOR, "Don't know how to free script variant of type %d", m_type );
|
||||||
bool AssignTo( T *pDest )
|
free( (void*)m_pszString );
|
||||||
{
|
|
||||||
ScriptDataType_t destType = ScriptDeduceType( T );
|
|
||||||
if ( destType == FIELD_TYPEUNKNOWN )
|
|
||||||
{
|
|
||||||
DevWarning( "Unable to convert script variant to unknown type\n" );
|
|
||||||
}
|
|
||||||
if ( destType == m_type )
|
|
||||||
{
|
|
||||||
*pDest = *this;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( m_type != FIELD_VECTOR && m_type != FIELD_CSTRING && destType != FIELD_VECTOR && destType != FIELD_CSTRING )
|
|
||||||
{
|
|
||||||
switch ( m_type )
|
|
||||||
{
|
|
||||||
case FIELD_VOID: *pDest = 0; break;
|
|
||||||
case FIELD_INTEGER: *pDest = m_int; return true;
|
|
||||||
case FIELD_FLOAT: *pDest = m_float; return true;
|
|
||||||
case FIELD_CHARACTER: *pDest = m_char; return true;
|
|
||||||
case FIELD_BOOLEAN: *pDest = m_bool; return true;
|
|
||||||
case FIELD_HSCRIPT: *pDest = m_hScript; return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DevWarning( "No free conversion of %s script variant to %s right now\n",
|
|
||||||
ScriptFieldTypeName( m_type ), ScriptFieldTypeName<T>() );
|
|
||||||
if ( destType != FIELD_VECTOR )
|
|
||||||
{
|
|
||||||
*pDest = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssignTo( float *pDest )
|
bool AssignTo( float *pDest )
|
||||||
@ -526,12 +493,15 @@ struct ScriptVariant_t
|
|||||||
|
|
||||||
bool AssignTo( ScriptVariant_t *pDest )
|
bool AssignTo( ScriptVariant_t *pDest )
|
||||||
{
|
{
|
||||||
|
pDest->Free();
|
||||||
pDest->m_type = m_type;
|
pDest->m_type = m_type;
|
||||||
|
if ( m_flags & SV_FREE )
|
||||||
|
{
|
||||||
if ( m_type == FIELD_VECTOR )
|
if ( m_type == FIELD_VECTOR )
|
||||||
{
|
{
|
||||||
pDest->m_pVector = new Vector;
|
pDest->m_pVector = (Vector*)malloc( sizeof( Vector ) );
|
||||||
((Vector *)(pDest->m_pVector))->Init( m_pVector->x, m_pVector->y, m_pVector->z );
|
pDest->EmplaceAllocedVector( *m_pVector );
|
||||||
pDest->m_flags |= SV_FREE;
|
m_flags |= SV_FREE;
|
||||||
}
|
}
|
||||||
else if ( m_type == FIELD_CSTRING )
|
else if ( m_type == FIELD_CSTRING )
|
||||||
{
|
{
|
||||||
@ -540,11 +510,21 @@ struct ScriptVariant_t
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Assert( false );
|
||||||
pDest->m_int = m_int;
|
pDest->m_int = m_int;
|
||||||
|
pDest->m_flags &= ~SV_FREE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pDest->m_int = m_int;
|
||||||
|
pDest->m_flags &= ~SV_FREE;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmplaceAllocedVector( const Vector &vec );
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
int m_int;
|
int m_int;
|
||||||
@ -566,8 +546,25 @@ struct ScriptVariant_t
|
|||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include "tier0/memdbgoff.h"
|
||||||
|
inline void ScriptVariant_t::EmplaceAllocedVector( const Vector &vec )
|
||||||
|
{
|
||||||
|
new ( (Vector*)m_pVector ) Vector( vec );
|
||||||
|
}
|
||||||
|
#include "tier0/memdbgon.h"
|
||||||
|
|
||||||
#define SCRIPT_VARIANT_NULL ScriptVariant_t()
|
#define SCRIPT_VARIANT_NULL ScriptVariant_t()
|
||||||
|
|
||||||
|
union ScriptVariantTemporaryStorage_t
|
||||||
|
{
|
||||||
|
// members must be initialized via placement-new
|
||||||
|
ScriptVariantTemporaryStorage_t() { }
|
||||||
|
|
||||||
|
// members must have trivial destructor, since no destructor will be invoked
|
||||||
|
Vector m_vec;
|
||||||
|
QAngle m_ang;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
struct ScriptConstantBinding_t
|
struct ScriptConstantBinding_t
|
||||||
@ -660,7 +657,7 @@ static inline int ToConstantVariant(int value)
|
|||||||
// This is used for registering variants (particularly vectors) not tied to existing variables.
|
// This is used for registering variants (particularly vectors) not tied to existing variables.
|
||||||
// The principal difference is that m_data is initted with bCopy set to true.
|
// The principal difference is that m_data is initted with bCopy set to true.
|
||||||
#define ScriptRegisterConstantFromTemp( pVM, constant, description ) ScriptRegisterConstantFromTempNamed( pVM, constant, #constant, description )
|
#define ScriptRegisterConstantFromTemp( pVM, constant, description ) ScriptRegisterConstantFromTempNamed( pVM, constant, #constant, description )
|
||||||
#define ScriptRegisterConstantFromTempNamed( pVM, constant, scriptName, description ) do { static ScriptConstantBinding_t binding; binding.m_pszScriptName = scriptName; binding.m_pszDescription = description; binding.m_data = ScriptVariant_t( constant, true ); pVM->RegisterConstant( &binding ); } while (0)
|
#define ScriptRegisterConstantFromTempNamed( pVM, constant, scriptName, description ) do { static const auto constantStorage = constant; static ScriptConstantBinding_t binding; binding.m_pszScriptName = scriptName; binding.m_pszDescription = description; binding.m_data = ScriptVariant_t( constantStorage ); pVM->RegisterConstant( &binding ); } while (0)
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
|
@ -326,7 +326,7 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
class CNonMemberScriptBinding##N \
|
class CNonMemberScriptBinding##N \
|
||||||
{ \
|
{ \
|
||||||
public: \
|
public: \
|
||||||
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn ) \
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
{ \
|
{ \
|
||||||
Assert( nArguments == N ); \
|
Assert( nArguments == N ); \
|
||||||
Assert( pReturn ); \
|
Assert( pReturn ); \
|
||||||
@ -337,8 +337,6 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
return false; \
|
return false; \
|
||||||
} \
|
} \
|
||||||
*pReturn = ((FUNC_TYPE)pFunction)( SCRIPT_BINDING_ARGS_##N ); \
|
*pReturn = ((FUNC_TYPE)pFunction)( SCRIPT_BINDING_ARGS_##N ); \
|
||||||
if ( pReturn->m_type == FIELD_VECTOR ) \
|
|
||||||
pReturn->m_pVector = new Vector(*pReturn->m_pVector); \
|
|
||||||
return true; \
|
return true; \
|
||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
@ -347,7 +345,7 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
class CNonMemberScriptBinding##N<FUNC_TYPE, void FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
class CNonMemberScriptBinding##N<FUNC_TYPE, void FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
||||||
{ \
|
{ \
|
||||||
public: \
|
public: \
|
||||||
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn ) \
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
{ \
|
{ \
|
||||||
Assert( nArguments == N ); \
|
Assert( nArguments == N ); \
|
||||||
Assert( !pReturn ); \
|
Assert( !pReturn ); \
|
||||||
@ -362,11 +360,51 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
|
template <typename FUNC_TYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
||||||
|
class CNonMemberScriptBinding##N<FUNC_TYPE, Vector FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
|
{ \
|
||||||
|
Assert( nArguments == N ); \
|
||||||
|
Assert( pReturn ); \
|
||||||
|
Assert( !pContext ); \
|
||||||
|
\
|
||||||
|
if ( nArguments != N || !pReturn || pContext ) \
|
||||||
|
{ \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
new ( &temporaryReturnStorage.m_vec ) Vector( ((FUNC_TYPE)pFunction)( SCRIPT_BINDING_ARGS_##N ) ); \
|
||||||
|
*pReturn = temporaryReturnStorage.m_vec; \
|
||||||
|
return true; \
|
||||||
|
} \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
template <typename FUNC_TYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
||||||
|
class CNonMemberScriptBinding##N<FUNC_TYPE, QAngle FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
|
{ \
|
||||||
|
Assert( nArguments == N ); \
|
||||||
|
Assert( pReturn ); \
|
||||||
|
Assert( !pContext ); \
|
||||||
|
\
|
||||||
|
if ( nArguments != N || !pReturn || pContext ) \
|
||||||
|
{ \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
new ( &temporaryReturnStorage.m_ang ) QAngle( ((FUNC_TYPE)pFunction)( SCRIPT_BINDING_ARGS_##N ) ); \
|
||||||
|
*pReturn = temporaryReturnStorage.m_ang; \
|
||||||
|
return true; \
|
||||||
|
} \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
template <class OBJECT_TYPE_PTR, typename FUNC_TYPE, typename FUNCTION_RETTYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
template <class OBJECT_TYPE_PTR, typename FUNC_TYPE, typename FUNCTION_RETTYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
||||||
class CMemberScriptBinding##N \
|
class CMemberScriptBinding##N \
|
||||||
{ \
|
{ \
|
||||||
public: \
|
public: \
|
||||||
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn ) \
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
{ \
|
{ \
|
||||||
Assert( nArguments == N ); \
|
Assert( nArguments == N ); \
|
||||||
Assert( pReturn ); \
|
Assert( pReturn ); \
|
||||||
@ -377,8 +415,6 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
return false; \
|
return false; \
|
||||||
} \
|
} \
|
||||||
*pReturn = (((OBJECT_TYPE_PTR)(pContext))->*ScriptConvertFuncPtrFromVoid<FUNC_TYPE>(pFunction))( SCRIPT_BINDING_ARGS_##N ); \
|
*pReturn = (((OBJECT_TYPE_PTR)(pContext))->*ScriptConvertFuncPtrFromVoid<FUNC_TYPE>(pFunction))( SCRIPT_BINDING_ARGS_##N ); \
|
||||||
if ( pReturn->m_type == FIELD_VECTOR ) \
|
|
||||||
pReturn->m_pVector = new Vector(*pReturn->m_pVector); \
|
|
||||||
return true; \
|
return true; \
|
||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
@ -387,7 +423,7 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
class CMemberScriptBinding##N<OBJECT_TYPE_PTR, FUNC_TYPE, void FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
class CMemberScriptBinding##N<OBJECT_TYPE_PTR, FUNC_TYPE, void FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
||||||
{ \
|
{ \
|
||||||
public: \
|
public: \
|
||||||
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn ) \
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
{ \
|
{ \
|
||||||
Assert( nArguments == N ); \
|
Assert( nArguments == N ); \
|
||||||
Assert( !pReturn ); \
|
Assert( !pReturn ); \
|
||||||
@ -402,6 +438,46 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
|
template <class OBJECT_TYPE_PTR, typename FUNC_TYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
||||||
|
class CMemberScriptBinding##N<OBJECT_TYPE_PTR, FUNC_TYPE, Vector FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
|
{ \
|
||||||
|
Assert( nArguments == N ); \
|
||||||
|
Assert( pReturn ); \
|
||||||
|
Assert( pContext ); \
|
||||||
|
\
|
||||||
|
if ( nArguments != N || !pReturn || !pContext ) \
|
||||||
|
{ \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
new ( &temporaryReturnStorage.m_vec ) Vector( (((OBJECT_TYPE_PTR)(pContext))->*ScriptConvertFuncPtrFromVoid<FUNC_TYPE>(pFunction))( SCRIPT_BINDING_ARGS_##N ) ); \
|
||||||
|
*pReturn = temporaryReturnStorage.m_vec; \
|
||||||
|
return true; \
|
||||||
|
} \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
template <class OBJECT_TYPE_PTR, typename FUNC_TYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
||||||
|
class CMemberScriptBinding##N<OBJECT_TYPE_PTR, FUNC_TYPE, QAngle FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N> \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
static bool Call( void *pFunction, void *pContext, ScriptVariant_t *pArguments, int nArguments, ScriptVariant_t *pReturn, ScriptVariantTemporaryStorage_t &temporaryReturnStorage ) \
|
||||||
|
{ \
|
||||||
|
Assert( nArguments == N ); \
|
||||||
|
Assert( pReturn ); \
|
||||||
|
Assert( pContext ); \
|
||||||
|
\
|
||||||
|
if ( nArguments != N || !pReturn || !pContext ) \
|
||||||
|
{ \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
new ( &temporaryReturnStorage.m_ang ) QAngle( (((OBJECT_TYPE_PTR)(pContext))->*ScriptConvertFuncPtrFromVoid<FUNC_TYPE>(pFunction))( SCRIPT_BINDING_ARGS_##N ) ); \
|
||||||
|
*pReturn = temporaryReturnStorage.m_ang; \
|
||||||
|
return true; \
|
||||||
|
} \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
template <typename FUNCTION_RETTYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
template <typename FUNCTION_RETTYPE FUNC_TEMPLATE_FUNC_PARAMS_##N> \
|
||||||
inline ScriptBindingFunc_t ScriptCreateBinding(FUNCTION_RETTYPE (*pfnProxied)( FUNC_BASE_TEMPLATE_FUNC_PARAMS_##N ) ) \
|
inline ScriptBindingFunc_t ScriptCreateBinding(FUNCTION_RETTYPE (*pfnProxied)( FUNC_BASE_TEMPLATE_FUNC_PARAMS_##N ) ) \
|
||||||
{ \
|
{ \
|
||||||
@ -423,7 +499,11 @@ inline FUNCPTR_TYPE ScriptConvertFuncPtrFromVoid( void *p )
|
|||||||
return &CMemberScriptBinding##N<OBJECT_TYPE_PTR, Func_t, FUNCTION_RETTYPE FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N>::Call; \
|
return &CMemberScriptBinding##N<OBJECT_TYPE_PTR, Func_t, FUNCTION_RETTYPE FUNC_BASE_TEMPLATE_FUNC_PARAMS_PASSTHRU_##N>::Call; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//note: no memory is actually allocated in the functions that get defined,
|
||||||
|
// it merely uses placement-new for which we need to disable this
|
||||||
|
#include "tier0/memdbgoff.h"
|
||||||
FUNC_GENERATE_ALL( DEFINE_SCRIPT_BINDINGS );
|
FUNC_GENERATE_ALL( DEFINE_SCRIPT_BINDINGS );
|
||||||
|
#include "tier0/memdbgon.h"
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
|
@ -439,13 +439,11 @@ bool CScriptColorInstanceHelper::Get( void *p, const char *pszKey, ScriptVariant
|
|||||||
bool CScriptColorInstanceHelper::Set( void *p, const char *pszKey, ScriptVariant_t &variant )
|
bool CScriptColorInstanceHelper::Set( void *p, const char *pszKey, ScriptVariant_t &variant )
|
||||||
{
|
{
|
||||||
Color *pClr = ((Color *)p);
|
Color *pClr = ((Color *)p);
|
||||||
if ( strlen(pszKey) == 1 )
|
|
||||||
{
|
|
||||||
int iVal;
|
int iVal;
|
||||||
variant.AssignTo( &iVal );
|
if ( strlen(pszKey) == 1 && variant.AssignTo( &iVal ) )
|
||||||
|
{
|
||||||
switch (pszKey[0])
|
switch (pszKey[0])
|
||||||
{
|
{
|
||||||
// variant.AssignTo( &(*pClr)[0] );
|
|
||||||
case 'r':
|
case 'r':
|
||||||
(*pClr)[0] = iVal;
|
(*pClr)[0] = iVal;
|
||||||
return true;
|
return true;
|
||||||
|
@ -258,39 +258,18 @@ bool CScriptQuaternionInstanceHelper::Set( void *p, const char *pszKey, ScriptVa
|
|||||||
switch (pszKey[0])
|
switch (pszKey[0])
|
||||||
{
|
{
|
||||||
case 'x':
|
case 'x':
|
||||||
variant.AssignTo( &pQuat->x );
|
return variant.AssignTo( &pQuat->x );
|
||||||
return true;
|
|
||||||
case 'y':
|
case 'y':
|
||||||
variant.AssignTo( &pQuat->y );
|
return variant.AssignTo( &pQuat->y );
|
||||||
return true;
|
|
||||||
case 'z':
|
case 'z':
|
||||||
variant.AssignTo( &pQuat->z );
|
return variant.AssignTo( &pQuat->z );
|
||||||
return true;
|
|
||||||
case 'w':
|
case 'w':
|
||||||
variant.AssignTo( &pQuat->w );
|
return variant.AssignTo( &pQuat->w );
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptVariant_t *CScriptQuaternionInstanceHelper::Add( void *p, ScriptVariant_t &variant )
|
|
||||||
{
|
|
||||||
Quaternion *pQuat = ((Quaternion *)p);
|
|
||||||
|
|
||||||
float flAdd;
|
|
||||||
variant.AssignTo( &flAdd );
|
|
||||||
|
|
||||||
(*pQuat)[0] += flAdd;
|
|
||||||
(*pQuat)[1] += flAdd;
|
|
||||||
(*pQuat)[2] += flAdd;
|
|
||||||
(*pQuat)[3] += flAdd;
|
|
||||||
|
|
||||||
static ScriptVariant_t result;
|
|
||||||
result = (HSCRIPT)p;
|
|
||||||
return &result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -40,11 +40,6 @@ class CScriptQuaternionInstanceHelper : public IScriptInstanceHelper
|
|||||||
|
|
||||||
bool Get( void *p, const char *pszKey, ScriptVariant_t &variant );
|
bool Get( void *p, const char *pszKey, ScriptVariant_t &variant );
|
||||||
bool Set( void *p, const char *pszKey, ScriptVariant_t &variant );
|
bool Set( void *p, const char *pszKey, ScriptVariant_t &variant );
|
||||||
|
|
||||||
ScriptVariant_t *Add( void *p, ScriptVariant_t &variant );
|
|
||||||
//ScriptVariant_t *Subtract( void *p, ScriptVariant_t &variant );
|
|
||||||
//ScriptVariant_t *Multiply( void *p, ScriptVariant_t &variant );
|
|
||||||
//ScriptVariant_t *Divide( void *p, ScriptVariant_t &variant );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Quaternion *ToQuaternion( HSCRIPT hQuat ) { return HScriptToClass<Quaternion>( hQuat ); }
|
inline Quaternion *ToQuaternion( HSCRIPT hQuat ) { return HScriptToClass<Quaternion>( hQuat ); }
|
||||||
|
@ -1232,6 +1232,8 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
|
|||||||
{
|
{
|
||||||
case OT_NULL:
|
case OT_NULL:
|
||||||
{
|
{
|
||||||
|
variant.Free();
|
||||||
|
variant.m_flags = 0;
|
||||||
// TODO: Should this be (HSCRIPT)nullptr
|
// TODO: Should this be (HSCRIPT)nullptr
|
||||||
variant.m_type = FIELD_VOID;
|
variant.m_type = FIELD_VOID;
|
||||||
return true;
|
return true;
|
||||||
@ -1243,6 +1245,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
variant.Free();
|
||||||
variant = (int)val;
|
variant = (int)val;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1253,6 +1256,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
variant.Free();
|
||||||
variant = (float)val;
|
variant = (float)val;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1263,6 +1267,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
variant.Free();
|
||||||
variant = val ? true : false;
|
variant = val ? true : false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1274,7 +1279,8 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
char* buffer = new char[size + 1];
|
variant.Free();
|
||||||
|
char* buffer = (char*)malloc(size + 1);
|
||||||
V_memcpy(buffer, val, size);
|
V_memcpy(buffer, val, size);
|
||||||
buffer[size] = 0;
|
buffer[size] = 0;
|
||||||
variant = buffer;
|
variant = buffer;
|
||||||
@ -1289,7 +1295,9 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
|
|||||||
tag == TYPETAG_VECTOR &&
|
tag == TYPETAG_VECTOR &&
|
||||||
SQ_SUCCEEDED(sq_getinstanceup(vm, idx, (SQUserPointer*)&v, TYPETAG_VECTOR)))
|
SQ_SUCCEEDED(sq_getinstanceup(vm, idx, (SQUserPointer*)&v, TYPETAG_VECTOR)))
|
||||||
{
|
{
|
||||||
variant = new Vector(*v);
|
variant.Free();
|
||||||
|
variant = (Vector*)malloc(sizeof(Vector));
|
||||||
|
variant.EmplaceAllocedVector(*v);
|
||||||
variant.m_flags |= SV_FREE;
|
variant.m_flags |= SV_FREE;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1297,6 +1305,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
variant.Free();
|
||||||
HSQOBJECT* obj = new HSQOBJECT;
|
HSQOBJECT* obj = new HSQOBJECT;
|
||||||
sq_resetobject(obj);
|
sq_resetobject(obj);
|
||||||
sq_getstackobj(vm, idx, obj);
|
sq_getstackobj(vm, idx, obj);
|
||||||
@ -1423,29 +1432,46 @@ SQInteger function_stub(HSQUIRRELVM vm)
|
|||||||
instance = ((ClassInstanceData*)self)->instance;
|
instance = ((ClassInstanceData*)self)->instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptVariant_t retval;
|
ScriptVariant_t script_retval;
|
||||||
|
ScriptVariantTemporaryStorage_t script_retval_storage;
|
||||||
|
|
||||||
SquirrelVM* pSquirrelVM = (SquirrelVM*)sq_getsharedforeignptr(vm);
|
SquirrelVM* pSquirrelVM = (SquirrelVM*)sq_getsharedforeignptr(vm);
|
||||||
Assert(pSquirrelVM);
|
Assert(pSquirrelVM);
|
||||||
|
|
||||||
sq_resetobject(&pSquirrelVM->lastError_);
|
sq_resetobject(&pSquirrelVM->lastError_);
|
||||||
|
|
||||||
(*pFunc->m_pfnBinding)(pFunc->m_pFunction, instance, params.Base(), nargs,
|
bool call_success = (*pFunc->m_pfnBinding)(pFunc->m_pFunction, instance, params.Base(), nargs,
|
||||||
pFunc->m_desc.m_ReturnType == FIELD_VOID ? nullptr : &retval);
|
pFunc->m_desc.m_ReturnType == FIELD_VOID ? nullptr : &script_retval, script_retval_storage);
|
||||||
|
Assert(call_success);
|
||||||
|
(void)call_success;
|
||||||
|
|
||||||
|
SQInteger sq_retval;
|
||||||
if (!sq_isnull(pSquirrelVM->lastError_))
|
if (!sq_isnull(pSquirrelVM->lastError_))
|
||||||
{
|
{
|
||||||
sq_pushobject(vm, pSquirrelVM->lastError_);
|
sq_pushobject(vm, pSquirrelVM->lastError_);
|
||||||
sq_resetobject(&pSquirrelVM->lastError_);
|
sq_resetobject(&pSquirrelVM->lastError_);
|
||||||
return sq_throwobject(vm);
|
sq_retval = sq_throwobject(vm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Assert(script_retval.m_type == pFunc->m_desc.m_ReturnType);
|
||||||
|
|
||||||
|
if (pFunc->m_desc.m_ReturnType != FIELD_VOID)
|
||||||
|
{
|
||||||
|
PushVariant(vm, script_retval);
|
||||||
|
sq_retval = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sq_retval = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PushVariant(vm, retval);
|
// strings never get copied here, Vector and QAngle are stored in script_retval_storage
|
||||||
|
// everything else is stored inline, so there should be no memory to free
|
||||||
|
Assert(!(script_retval.m_flags & SV_FREE));
|
||||||
|
|
||||||
if (retval.m_type == FIELD_VECTOR)
|
return sq_retval;
|
||||||
delete retval.m_pVector;
|
|
||||||
|
|
||||||
return pFunc->m_desc.m_ReturnType != FIELD_VOID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1485,12 +1511,8 @@ SQInteger constructor_stub(HSQUIRRELVM vm)
|
|||||||
|
|
||||||
void* instance = pClassDesc->m_pfnConstruct();
|
void* instance = pClassDesc->m_pfnConstruct();
|
||||||
|
|
||||||
if (!sq_isnull(pSquirrelVM->lastError_))
|
// expect construction to always succeed
|
||||||
{
|
Assert(sq_isnull(pSquirrelVM->lastError_));
|
||||||
sq_pushobject(vm, pSquirrelVM->lastError_);
|
|
||||||
sq_resetobject(&pSquirrelVM->lastError_);
|
|
||||||
return sq_throwobject(vm);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
SQUserPointer p;
|
SQUserPointer p;
|
||||||
@ -1547,19 +1569,22 @@ SQInteger get_stub(HSQUIRRELVM vm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ScriptVariant_t var;
|
ScriptVariant_t var;
|
||||||
|
SQInteger sq_retval = 0;
|
||||||
if (classInstanceData &&
|
if (classInstanceData &&
|
||||||
classInstanceData->instance &&
|
classInstanceData->instance &&
|
||||||
classInstanceData->desc->pHelper &&
|
classInstanceData->desc->pHelper &&
|
||||||
classInstanceData->desc->pHelper->Get(classInstanceData->instance, key, var))
|
classInstanceData->desc->pHelper->Get(classInstanceData->instance, key, var))
|
||||||
{
|
{
|
||||||
PushVariant(vm, var);
|
PushVariant(vm, var);
|
||||||
|
sq_retval = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
|
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
var.Free();
|
||||||
|
return sq_retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQInteger set_stub(HSQUIRRELVM vm)
|
SQInteger set_stub(HSQUIRRELVM vm)
|
||||||
@ -1576,122 +1601,22 @@ SQInteger set_stub(HSQUIRRELVM vm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ScriptVariant_t var;
|
ScriptVariant_t var;
|
||||||
|
SQInteger sq_retval = 0;
|
||||||
getVariant( vm, -1, var );
|
getVariant( vm, -1, var );
|
||||||
|
|
||||||
if (classInstanceData &&
|
if (!(
|
||||||
|
classInstanceData &&
|
||||||
classInstanceData->instance &&
|
classInstanceData->instance &&
|
||||||
classInstanceData->desc->pHelper &&
|
classInstanceData->desc->pHelper &&
|
||||||
classInstanceData->desc->pHelper->Set(classInstanceData->instance, key, var))
|
classInstanceData->desc->pHelper->Set(classInstanceData->instance, key, var)
|
||||||
|
))
|
||||||
{
|
{
|
||||||
sq_pop(vm, 1);
|
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
var.Free();
|
||||||
}
|
|
||||||
|
|
||||||
SQInteger add_stub(HSQUIRRELVM vm)
|
|
||||||
{
|
|
||||||
ClassInstanceData* classInstanceData = nullptr;
|
|
||||||
sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0);
|
|
||||||
|
|
||||||
ScriptVariant_t var;
|
|
||||||
getVariant( vm, 1, var );
|
|
||||||
|
|
||||||
if (classInstanceData &&
|
|
||||||
classInstanceData->instance &&
|
|
||||||
classInstanceData->desc->pHelper)
|
|
||||||
{
|
|
||||||
ScriptVariant_t *result = classInstanceData->desc->pHelper->Add( classInstanceData->instance, var );
|
|
||||||
if (result != nullptr)
|
|
||||||
{
|
|
||||||
PushVariant( vm, *result );
|
|
||||||
sq_pop(vm, 1);
|
sq_pop(vm, 1);
|
||||||
return 1;
|
return sq_retval;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return sqstd_throwerrorf(vm, "invalid arith op +");
|
|
||||||
}
|
|
||||||
|
|
||||||
SQInteger sub_stub(HSQUIRRELVM vm)
|
|
||||||
{
|
|
||||||
ClassInstanceData* classInstanceData = nullptr;
|
|
||||||
sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0);
|
|
||||||
|
|
||||||
ScriptVariant_t var;
|
|
||||||
getVariant( vm, 1, var );
|
|
||||||
|
|
||||||
if (classInstanceData &&
|
|
||||||
classInstanceData->instance &&
|
|
||||||
classInstanceData->desc->pHelper)
|
|
||||||
{
|
|
||||||
ScriptVariant_t *result = classInstanceData->desc->pHelper->Subtract( classInstanceData->instance, var );
|
|
||||||
if (result != nullptr)
|
|
||||||
{
|
|
||||||
PushVariant( vm, *result );
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return sqstd_throwerrorf(vm, "invalid arith op -");
|
|
||||||
}
|
|
||||||
|
|
||||||
SQInteger mul_stub(HSQUIRRELVM vm)
|
|
||||||
{
|
|
||||||
ClassInstanceData* classInstanceData = nullptr;
|
|
||||||
sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0);
|
|
||||||
|
|
||||||
ScriptVariant_t var;
|
|
||||||
getVariant( vm, 1, var );
|
|
||||||
|
|
||||||
if (classInstanceData &&
|
|
||||||
classInstanceData->instance &&
|
|
||||||
classInstanceData->desc->pHelper )
|
|
||||||
{
|
|
||||||
ScriptVariant_t *result = classInstanceData->desc->pHelper->Add( classInstanceData->instance, var );
|
|
||||||
if (result != nullptr)
|
|
||||||
{
|
|
||||||
PushVariant( vm, *result );
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return sqstd_throwerrorf(vm, "invalid arith op *");
|
|
||||||
}
|
|
||||||
|
|
||||||
SQInteger div_stub(HSQUIRRELVM vm)
|
|
||||||
{
|
|
||||||
ClassInstanceData* classInstanceData = nullptr;
|
|
||||||
sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0);
|
|
||||||
|
|
||||||
ScriptVariant_t var;
|
|
||||||
getVariant( vm, 1, var );
|
|
||||||
|
|
||||||
if (classInstanceData &&
|
|
||||||
classInstanceData->instance &&
|
|
||||||
classInstanceData->desc->pHelper )
|
|
||||||
{
|
|
||||||
ScriptVariant_t *result = classInstanceData->desc->pHelper->Add( classInstanceData->instance, var );
|
|
||||||
if (result != nullptr)
|
|
||||||
{
|
|
||||||
PushVariant( vm, *result );
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sq_pop(vm, 1);
|
|
||||||
return sqstd_throwerrorf(vm, "invalid arith op /");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SQInteger IsValid_stub(HSQUIRRELVM vm)
|
SQInteger IsValid_stub(HSQUIRRELVM vm)
|
||||||
@ -2479,6 +2404,7 @@ void SquirrelVM::RegisterFunction(ScriptFunctionBinding_t* pScriptFunction)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
char typemask[64];
|
char typemask[64];
|
||||||
|
Assert(pScriptFunction->m_desc.m_Parameters.Count() < sizeof(typemask));
|
||||||
if (!CreateParamCheck(*pScriptFunction, typemask))
|
if (!CreateParamCheck(*pScriptFunction, typemask))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@ -2564,22 +2490,6 @@ bool SquirrelVM::RegisterClass(ScriptClassDesc_t* pClassDesc)
|
|||||||
sq_newclosure(vm_, set_stub, 0);
|
sq_newclosure(vm_, set_stub, 0);
|
||||||
sq_newslot(vm_, -3, SQFalse);
|
sq_newslot(vm_, -3, SQFalse);
|
||||||
|
|
||||||
sq_pushstring(vm_, "_add", -1);
|
|
||||||
sq_newclosure(vm_, add_stub, 0);
|
|
||||||
sq_newslot(vm_, -3, SQFalse);
|
|
||||||
|
|
||||||
sq_pushstring(vm_, "_sub", -1);
|
|
||||||
sq_newclosure(vm_, sub_stub, 0);
|
|
||||||
sq_newslot(vm_, -3, SQFalse);
|
|
||||||
|
|
||||||
sq_pushstring(vm_, "_mul", -1);
|
|
||||||
sq_newclosure(vm_, mul_stub, 0);
|
|
||||||
sq_newslot(vm_, -3, SQFalse);
|
|
||||||
|
|
||||||
sq_pushstring(vm_, "_div", -1);
|
|
||||||
sq_newclosure(vm_, div_stub, 0);
|
|
||||||
sq_newslot(vm_, -3, SQFalse);
|
|
||||||
|
|
||||||
sq_pushstring(vm_, "IsValid", -1);
|
sq_pushstring(vm_, "IsValid", -1);
|
||||||
sq_newclosure(vm_, IsValid_stub, 0);
|
sq_newclosure(vm_, IsValid_stub, 0);
|
||||||
sq_newslot(vm_, -3, SQFalse);
|
sq_newslot(vm_, -3, SQFalse);
|
||||||
@ -2598,6 +2508,7 @@ bool SquirrelVM::RegisterClass(ScriptClassDesc_t* pClassDesc)
|
|||||||
auto& scriptFunction = pClassDesc->m_FunctionBindings[i];
|
auto& scriptFunction = pClassDesc->m_FunctionBindings[i];
|
||||||
|
|
||||||
char typemask[64];
|
char typemask[64];
|
||||||
|
Assert(scriptFunction.m_desc.m_Parameters.Count() < sizeof(typemask));
|
||||||
if (!CreateParamCheck(scriptFunction, typemask))
|
if (!CreateParamCheck(scriptFunction, typemask))
|
||||||
{
|
{
|
||||||
Warning("Unable to create param check for %s.%s\n",
|
Warning("Unable to create param check for %s.%s\n",
|
||||||
@ -3138,6 +3049,7 @@ void SquirrelVM::ReleaseValue(ScriptVariant_t& value)
|
|||||||
|
|
||||||
// Let's prevent this being called again and giving some UB
|
// Let's prevent this being called again and giving some UB
|
||||||
value.m_type = FIELD_VOID;
|
value.m_type = FIELD_VOID;
|
||||||
|
value.m_flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SquirrelVM::ClearValue(HSCRIPT hScope, const char* pszKey)
|
bool SquirrelVM::ClearValue(HSCRIPT hScope, const char* pszKey)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user