jkxr/Projects/Android/jni/OpenJK/codemp/client/cl_cgameapi.cpp

1939 lines
61 KiB
C++

/*
===========================================================================
Copyright (C) 2013 - 2015, OpenJK contributors
This file is part of the OpenJK source code.
OpenJK is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see <http://www.gnu.org/licenses/>.
===========================================================================
*/
// cl_cgameapi.cpp -- client system interaction with client game
#include "qcommon/cm_public.h"
#include "qcommon/RoffSystem.h"
#include "qcommon/stringed_ingame.h"
#include "qcommon/timing.h"
#include "client.h"
#include "cl_uiapi.h"
#include "botlib/botlib.h"
#include "snd_ambient.h"
#include "FXExport.h"
#include "FxUtil.h"
extern IHeapAllocator *G2VertSpaceClient;
extern botlib_export_t *botlib_export;
// cgame interface
static cgameExport_t *cge; // cgame export table
static vm_t *cgvm; // cgame vm, valid for legacy and new api
//
// cgame vmMain calls
//
void CGVM_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_INIT, serverMessageNum, serverCommandSequence, clientNum );
return;
}
VMSwap v( cgvm );
cge->Init( serverMessageNum, serverCommandSequence, clientNum );
}
void CGVM_Shutdown( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_SHUTDOWN );
return;
}
VMSwap v( cgvm );
cge->Shutdown();
}
qboolean CGVM_ConsoleCommand( void ) {
if ( cgvm->isLegacy ) {
return (qboolean)VM_Call( cgvm, CG_CONSOLE_COMMAND );
}
VMSwap v( cgvm );
return cge->ConsoleCommand();
}
void CGVM_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_DRAW_ACTIVE_FRAME, serverTime, stereoView, demoPlayback );
return;
}
VMSwap v( cgvm );
cge->DrawActiveFrame( serverTime, stereoView, demoPlayback );
}
int CGVM_CrosshairPlayer( void ) {
if ( cgvm->isLegacy ) {
return VM_Call( cgvm, CG_CROSSHAIR_PLAYER );
}
VMSwap v( cgvm );
return cge->CrosshairPlayer();
}
int CGVM_LastAttacker( void ) {
if ( cgvm->isLegacy ) {
return VM_Call( cgvm, CG_LAST_ATTACKER );
}
VMSwap v( cgvm );
return cge->LastAttacker();
}
void CGVM_KeyEvent( int key, qboolean down ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_KEY_EVENT, key, down );
return;
}
VMSwap v( cgvm );
cge->KeyEvent( key, down );
}
void CGVM_MouseEvent( int x, int y ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_MOUSE_EVENT, x, y );
return;
}
VMSwap v( cgvm );
cge->MouseEvent( x, y );
}
void CGVM_EventHandling( int type ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_EVENT_HANDLING, type );
return;
}
VMSwap v( cgvm );
cge->EventHandling( type );
}
int CGVM_PointContents( void ) {
if ( cgvm->isLegacy ) {
return VM_Call( cgvm, CG_POINT_CONTENTS );
}
VMSwap v( cgvm );
return cge->PointContents();
}
void CGVM_GetLerpOrigin( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_GET_LERP_ORIGIN );
return;
}
VMSwap v( cgvm );
cge->GetLerpOrigin();
}
void CGVM_GetLerpData( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_GET_LERP_DATA );
return;
}
VMSwap v( cgvm );
cge->GetLerpData();
}
void CGVM_Trace( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_TRACE );
return;
}
VMSwap v( cgvm );
cge->Trace();
}
void CGVM_G2Trace( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_G2TRACE );
return;
}
VMSwap v( cgvm );
cge->G2Trace();
}
void CGVM_G2Mark( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_G2MARK );
return;
}
VMSwap v( cgvm );
cge->G2Mark();
}
int CGVM_RagCallback( int callType ) {
if ( cgvm->isLegacy ) {
return VM_Call( cgvm, CG_RAG_CALLBACK, callType );
}
VMSwap v( cgvm );
return cge->RagCallback( callType );
}
qboolean CGVM_IncomingConsoleCommand( void ) {
if ( cgvm->isLegacy ) {
return (qboolean)VM_Call( cgvm, CG_INCOMING_CONSOLE_COMMAND );
}
VMSwap v( cgvm );
return cge->IncomingConsoleCommand();
}
qboolean CGVM_NoUseableForce( void ) {
if ( cgvm->isLegacy ) {
return (qboolean)VM_Call( cgvm, CG_GET_USEABLE_FORCE );
}
VMSwap v( cgvm );
return cge->NoUseableForce();
}
void CGVM_GetOrigin( int entID, vec3_t out ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_GET_ORIGIN, entID, reinterpret_cast< intptr_t >( out ) );
return;
}
VMSwap v( cgvm );
cge->GetOrigin( entID, out );
}
void CGVM_GetAngles( int entID, vec3_t out ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_GET_ANGLES, entID, reinterpret_cast< intptr_t >( out ) );
return;
}
VMSwap v( cgvm );
cge->GetAngles( entID, out );
}
trajectory_t *CGVM_GetOriginTrajectory( int entID ) {
if ( cgvm->isLegacy ) {
return (trajectory_t *)VM_Call( cgvm, CG_GET_ORIGIN_TRAJECTORY, entID );
}
VMSwap v( cgvm );
return cge->GetOriginTrajectory( entID );
}
trajectory_t *CGVM_GetAngleTrajectory( int entID ) {
if ( cgvm->isLegacy ) {
return (trajectory_t *)VM_Call( cgvm, CG_GET_ANGLE_TRAJECTORY, entID );
}
VMSwap v( cgvm );
return cge->GetAngleTrajectory( entID );
}
void CGVM_ROFF_NotetrackCallback( int entID, const char *notetrack ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_ROFF_NOTETRACK_CALLBACK, entID, reinterpret_cast< intptr_t >( notetrack ) );
return;
}
VMSwap v( cgvm );
cge->ROFF_NotetrackCallback( entID, notetrack );
}
void CGVM_MapChange( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_MAP_CHANGE );
return;
}
VMSwap v( cgvm );
cge->MapChange();
}
void CGVM_AutomapInput( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_AUTOMAP_INPUT );
return;
}
VMSwap v( cgvm );
cge->AutomapInput();
}
void CGVM_MiscEnt( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_MISC_ENT );
return;
}
VMSwap v( cgvm );
cge->MiscEnt();
}
void CGVM_CameraShake( void ) {
if ( cgvm->isLegacy ) {
VM_Call( cgvm, CG_FX_CAMERASHAKE );
return;
}
VMSwap v( cgvm );
cge->CameraShake();
}
//
// cgame syscalls
// only used by legacy mods!
//
extern int CL_GetValueForHidden( const char *s ); //cl_parse.cpp
extern qboolean cl_bUseFighterPitch; //cl_input.cpp
int CM_LoadSubBSP( const char *name, qboolean clientload ); //cm_load.cpp
void FX_FeedTrail( effectTrailArgStruct_t *a ); //FxPrimitives.cpp
// wrappers and such
static void CL_AddCgameCommand( const char *cmdName ) {
Cmd_AddCommand( cmdName, NULL );
}
static void CL_CM_LoadMap( const char *mapname, qboolean subBSP ) {
if ( subBSP ) CM_LoadSubBSP( va( "maps/%s.bsp", mapname+1 ), qfalse );
else CM_LoadMap( mapname, qtrue, NULL );
}
static void CL_GetGlconfig( glconfig_t *glconfig ) {
*glconfig = cls.glconfig;
}
static void CL_GetGameState( gameState_t *gs ) {
*gs = cl.gameState;
}
static void RegisterSharedMemory( char *memory ) {
cl.mSharedMemory = memory;
}
static int CL_Milliseconds( void ) {
return Sys_Milliseconds();
}
static void CL_AddReliableCommand2( const char *cmd ) {
CL_AddReliableCommand( cmd, qfalse );
}
static int CL_CM_RegisterTerrain( const char *config ) {
return 0;
}
extern int s_entityWavVol[MAX_GENTITIES];
static int CL_S_GetVoiceVolume( int entID ) {
return s_entityWavVol[entID];
}
static void CL_S_Shutup( qboolean shutup ) {
s_shutUp = shutup;
}
static int CL_GetCurrentCmdNumber( void ) {
return cl.cmdNumber;
}
static void _CL_SetUserCmdValue( int stateValue, float sensitivityScale, float mPitchOverride, float mYawOverride, float mSensitivityOverride, int fpSel, int invenSel, qboolean fighterControls ) {
cl_bUseFighterPitch = fighterControls;
CL_SetUserCmdValue( stateValue, sensitivityScale, mPitchOverride, mYawOverride, mSensitivityOverride, fpSel, invenSel );
}
static void CL_OpenUIMenu( int menuID ) {
UIVM_SetActiveMenu( (uiMenuCommand_t)menuID );
}
static void CGFX_AddLine( vec3_t start, vec3_t end, float size1, float size2, float sizeParm, float alpha1, float alpha2, float alphaParm, vec3_t sRGB, vec3_t eRGB, float rgbParm, int killTime, qhandle_t shader, int flags ) {
FX_AddLine( start, end, size1, size2, sizeParm, alpha1, alpha2, alphaParm, sRGB, eRGB, rgbParm, killTime, shader, flags );
}
static void CGFX_AddPoly( addpolyArgStruct_t *p ) {
FX_AddPoly( p->p, p->ev, p->numVerts, p->vel, p->accel, p->alpha1, p->alpha2, p->alphaParm, p->rgb1, p->rgb2, p->rgbParm, p->rotationDelta, p->bounce, p->motionDelay, p->killTime, p->shader, p->flags );
}
static void CGFX_AddBezier( addbezierArgStruct_t *b ) {
FX_AddBezier( b->start, b->end, b->control1, b->control1Vel, b->control2, b->control2Vel, b->size1, b->size2, b->sizeParm, b->alpha1, b->alpha2, b->alphaParm, b->sRGB, b->eRGB, b->rgbParm, b->killTime, b->shader, b->flags );
}
static void CGFX_AddPrimitive( effectTrailArgStruct_t *e ) {
FX_FeedTrail( e );
}
static void CGFX_AddSprite( addspriteArgStruct_t *s ) {
vec3_t rgb = { 1.0f, 1.0f, 1.0f };
FX_AddParticle( s->origin, s->vel, s->accel, s->scale, s->dscale, 0, s->sAlpha, s->eAlpha, 0, rgb, rgb, 0, s->rotation, 0, vec3_origin, vec3_origin, s->bounce, 0, 0, s->life, s->shader, s->flags );
}
static void CGFX_AddElectricity( addElectricityArgStruct_t *p ) {
FX_AddElectricity( p->start, p->end, p->size1, p->size2, p->sizeParm, p->alpha1, p->alpha2, p->alphaParm, p->sRGB, p->eRGB, p->rgbParm, p->chaos, p->killTime, p->shader, p->flags );
}
static qboolean CL_ROFF_Clean( void ) {
return theROFFSystem.Clean( qtrue );
}
static void CL_ROFF_UpdateEntities( void ) {
theROFFSystem.UpdateEntities( qtrue );
}
static int CL_ROFF_Cache( char *file ) {
return theROFFSystem.Cache( file, qtrue );
}
static qboolean CL_ROFF_Play( int entID, int roffID, qboolean doTranslation ) {
return theROFFSystem.Play( entID, roffID, doTranslation, qtrue );
}
static qboolean CL_ROFF_Purge_Ent( int entID ) {
return theROFFSystem.PurgeEnt( entID, qtrue );
}
static void CL_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) {
*snapshotNumber = cl.snap.messageNum;
*serverTime = cl.snap.serverTime;
}
static void CL_SetClientForceAngle( int time, vec3_t angle ) {
cl.cgameViewAngleForceTime = time;
VectorCopy(angle, cl.cgameViewAngleForce);
}
static void CL_PrecisionTimerStart( void **p ) {
timing_c *newTimer = new timing_c; //create the new timer
*p = newTimer; //assign the pointer within the pointer to point at the mem addr of our new timer
newTimer->Start(); //start the timer
}
static int CL_PrecisionTimerEnd( void *p ) {
int r = 0;
timing_c *timer = (timing_c *)p; //this is the pointer we assigned in start, so we can directly cast it back
r = timer->End(); //get the result
delete timer; //delete the timer since we're done with it
return r; //return the result
}
static void CL_RMG_Init( int /* terrainID */, const char * /* terrainInfo */ ) { }
static qboolean CGFX_PlayBoltedEffectID( int id, vec3_t org, void *ghoul2, const int boltNum, const int entNum, const int modelNum, int iLooptime, qboolean isRelative ) {
if ( !ghoul2 ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
int boltInfo=0;
if ( re->G2API_AttachEnt( &boltInfo, g2, modelNum, boltNum, entNum, modelNum ) )
{
FX_PlayBoltedEffectID(id, org, boltInfo, &g2, iLooptime, isRelative );
return qtrue;
}
return qfalse;
}
static qboolean CL_SE_GetStringTextString( const char *text, char *buffer, int bufferLength ) {
const char *str;
assert( text && buffer );
str = SE_GetString( text );
if ( str[0] ) {
Q_strncpyz( buffer, str, bufferLength );
return qtrue;
}
Com_sprintf( buffer, bufferLength, "??%s", str );
return qfalse;
}
static void CL_G2API_ListModelSurfaces( void *ghlInfo ) {
re->G2API_ListSurfaces( (CGhoul2Info *)ghlInfo );
}
static void CL_G2API_ListModelBones( void *ghlInfo, int frame ) {
re->G2API_ListBones( (CGhoul2Info *)ghlInfo, frame );
}
static void CL_G2API_SetGhoul2ModelIndexes( void *ghoul2, qhandle_t *modelList, qhandle_t *skinList ) {
if ( !ghoul2 ) return;
re->G2API_SetGhoul2ModelIndexes( *((CGhoul2Info_v *)ghoul2), modelList, skinList );
}
static qboolean CL_G2API_HaveWeGhoul2Models( void *ghoul2) {
if ( !ghoul2 ) return qfalse;
return re->G2API_HaveWeGhoul2Models( *((CGhoul2Info_v *)ghoul2) );
}
static qboolean CL_G2API_GetBoltMatrix( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale );
}
static qboolean CL_G2API_GetBoltMatrix_NoReconstruct( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) {
if ( !ghoul2 ) return qfalse;
re->G2API_BoltMatrixReconstruction( qfalse );
return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale );
}
static qboolean CL_G2API_GetBoltMatrix_NoRecNoRot( void *ghoul2, const int modelIndex, const int boltIndex, mdxaBone_t *matrix, const vec3_t angles, const vec3_t position, const int frameNum, qhandle_t *modelList, vec3_t scale ) {
if ( !ghoul2 ) return qfalse;
// Intentionally not setting bolt matrix reconstruction state per original code comments
re->G2API_BoltMatrixSPMethod( qtrue );
return re->G2API_GetBoltMatrix( *((CGhoul2Info_v *)ghoul2), modelIndex, boltIndex, matrix, angles, position, frameNum, modelList, scale );
}
static int CL_G2API_InitGhoul2Model( void **ghoul2Ptr, const char *fileName, int modelIndex, qhandle_t customSkin, qhandle_t customShader, int modelFlags, int lodBias ) {
#ifdef _FULL_G2_LEAK_CHECKING
g_G2AllocServer = 0;
#endif
return re->G2API_InitGhoul2Model( (CGhoul2Info_v **)ghoul2Ptr, fileName, modelIndex, customSkin, customShader, modelFlags, lodBias );
}
static qboolean CL_G2API_SetSkin( void *ghoul2, int modelIndex, qhandle_t customSkin, qhandle_t renderSkin ) {
if ( !ghoul2 ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
return re->G2API_SetSkin( g2, modelIndex, customSkin, renderSkin );
}
static void CL_G2API_CollisionDetect( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position, int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius ) {
if ( !ghoul2 ) return;
re->G2API_CollisionDetect( collRecMap, *((CGhoul2Info_v *)ghoul2), angles, position, frameNumber, entNum, rayStart, rayEnd, scale, G2VertSpaceClient, traceFlags, useLod, fRadius );
}
static void CL_G2API_CollisionDetectCache( CollisionRecord_t *collRecMap, void* ghoul2, const vec3_t angles, const vec3_t position, int frameNumber, int entNum, vec3_t rayStart, vec3_t rayEnd, vec3_t scale, int traceFlags, int useLod, float fRadius ) {
if ( !ghoul2 ) return;
re->G2API_CollisionDetectCache( collRecMap, *((CGhoul2Info_v *)ghoul2), angles, position, frameNumber, entNum, rayStart, rayEnd, scale, G2VertSpaceClient, traceFlags, useLod, fRadius );
}
static void CL_G2API_CleanGhoul2Models( void **ghoul2Ptr ) {
#ifdef _FULL_G2_LEAK_CHECKING
g_G2AllocServer = 0;
#endif
re->G2API_CleanGhoul2Models( (CGhoul2Info_v **)ghoul2Ptr );
}
static qboolean CL_G2API_SetBoneAngles( void *ghoul2, int modelIndex, const char *boneName, const vec3_t angles, const int flags, const int up, const int right, const int forward, qhandle_t *modelList, int blendTime , int currentTime ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_SetBoneAngles( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName, angles, flags, (const Eorientations)up, (const Eorientations)right, (const Eorientations)forward, modelList, blendTime , currentTime );
}
static qboolean CL_G2API_SetBoneAnim( void *ghoul2, const int modelIndex, const char *boneName, const int startFrame, const int endFrame, const int flags, const float animSpeed, const int currentTime, const float setFrame, const int blendTime ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_SetBoneAnim( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName, startFrame, endFrame, flags, animSpeed, currentTime, setFrame, blendTime );
}
static qboolean CL_G2API_GetBoneAnim( void *ghoul2, const char *boneName, const int currentTime, float *currentFrame, int *startFrame, int *endFrame, int *flags, float *animSpeed, int *modelList, const int modelIndex ) {
if ( !ghoul2 ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
return re->G2API_GetBoneAnim( g2, modelIndex, boneName, currentTime, currentFrame, startFrame, endFrame, flags, animSpeed, modelList );
}
static qboolean CL_G2API_GetBoneFrame( void *ghoul2, const char *boneName, const int currentTime, float *currentFrame, int *modelList, const int modelIndex ) {
if ( !ghoul2 ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
int iDontCare1 = 0, iDontCare2 = 0, iDontCare3 = 0;
float fDontCare1 = 0;
return re->G2API_GetBoneAnim(g2, modelIndex, boneName, currentTime, currentFrame, &iDontCare1, &iDontCare2, &iDontCare3, &fDontCare1, modelList);
}
static void CL_G2API_GetGLAName( void *ghoul2, int modelIndex, char *fillBuf ) {
if ( !ghoul2 )
{
fillBuf[0] = '\0';
return;
}
char *tmp = re->G2API_GetGLAName( *((CGhoul2Info_v *)ghoul2), modelIndex );
if ( tmp )
strcpy( fillBuf, tmp );
else
fillBuf[0] = '\0';
}
static int CL_G2API_CopyGhoul2Instance( void *g2From, void *g2To, int modelIndex ) {
if ( !g2From || !g2To ) return 0;
return re->G2API_CopyGhoul2Instance( *((CGhoul2Info_v *)g2From), *((CGhoul2Info_v *)g2To), modelIndex );
}
static void CL_G2API_CopySpecificGhoul2Model( void *g2From, int modelFrom, void *g2To, int modelTo ) {
if ( !g2From || !g2To) return;
re->G2API_CopySpecificG2Model( *((CGhoul2Info_v *)g2From), modelFrom, *((CGhoul2Info_v *)g2To), modelTo );
}
static void CL_G2API_DuplicateGhoul2Instance( void *g2From, void **g2To ) {
#ifdef _FULL_G2_LEAK_CHECKING
g_G2AllocServer = 0;
#endif
if ( !g2From || !g2To ) return;
re->G2API_DuplicateGhoul2Instance( *((CGhoul2Info_v *)g2From), (CGhoul2Info_v **)g2To );
}
static qboolean CL_G2API_HasGhoul2ModelOnIndex( void *ghlInfo, int modelIndex ) {
return re->G2API_HasGhoul2ModelOnIndex( (CGhoul2Info_v **)ghlInfo, modelIndex );
}
static qboolean CL_G2API_RemoveGhoul2Model( void *ghlInfo, int modelIndex ) {
#ifdef _FULL_G2_LEAK_CHECKING
g_G2AllocServer = 0;
#endif
return re->G2API_RemoveGhoul2Model( (CGhoul2Info_v **)ghlInfo, modelIndex );
}
static qboolean CL_G2API_SkinlessModel( void *ghlInfo, int modelIndex ) {
if ( !ghlInfo ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghlInfo);
return re->G2API_SkinlessModel( g2, modelIndex );
}
static int CL_G2API_GetNumGoreMarks( void *ghlInfo, int modelIndex ) {
#ifdef _G2_GORE
if ( !ghlInfo ) return 0;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghlInfo);
return re->G2API_GetNumGoreMarks( g2, modelIndex );
#else
return 0;
#endif
}
static void CL_G2API_AddSkinGore( void *ghlInfo, SSkinGoreData *gore ) {
#ifdef _G2_GORE
if ( !ghlInfo ) return;
re->G2API_AddSkinGore( *((CGhoul2Info_v *)ghlInfo), *(SSkinGoreData *)gore );
#endif
}
static void CL_G2API_ClearSkinGore( void *ghlInfo ) {
#ifdef _G2_GORE
if ( !ghlInfo ) return;
re->G2API_ClearSkinGore( *((CGhoul2Info_v *)ghlInfo) );
#endif
}
static int CL_G2API_Ghoul2Size( void *ghlInfo ) {
if ( !ghlInfo ) return 0;
return re->G2API_Ghoul2Size( *((CGhoul2Info_v *)ghlInfo) );
}
static int CL_G2API_AddBolt( void *ghoul2, int modelIndex, const char *boneName ) {
if ( !ghoul2 ) return -1;
return re->G2API_AddBolt( *((CGhoul2Info_v *)ghoul2), modelIndex, boneName );
}
static qboolean CL_G2API_AttachEnt( int *boltInfo, void *ghlInfoTo, int toBoltIndex, int entNum, int toModelNum ) {
if ( !ghlInfoTo ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghlInfoTo);
return re->G2API_AttachEnt( boltInfo, g2, 0, toBoltIndex, entNum, toModelNum );
}
static void CL_G2API_SetBoltInfo( void *ghoul2, int modelIndex, int boltInfo ) {
if ( !ghoul2 ) return;
re->G2API_SetBoltInfo( *((CGhoul2Info_v *)ghoul2), modelIndex, boltInfo );
}
static qboolean CL_G2API_SetRootSurface( void *ghoul2, const int modelIndex, const char *surfaceName ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_SetRootSurface( *((CGhoul2Info_v *)ghoul2), modelIndex, surfaceName );
}
static qboolean CL_G2API_SetSurfaceOnOff( void *ghoul2, const char *surfaceName, const int flags ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_SetSurfaceOnOff( *((CGhoul2Info_v *)ghoul2), surfaceName, flags );
}
static qboolean CL_G2API_SetNewOrigin( void *ghoul2, const int boltIndex ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_SetNewOrigin( *((CGhoul2Info_v *)ghoul2), boltIndex );
}
static qboolean CL_G2API_DoesBoneExist( void *ghoul2, int modelIndex, const char *boneName ) {
if ( !ghoul2 ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
return re->G2API_DoesBoneExist( g2, modelIndex, boneName );
}
static int CL_G2API_GetSurfaceRenderStatus( void *ghoul2, const int modelIndex, const char *surfaceName ) {
if ( !ghoul2 ) return -1;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
return re->G2API_GetSurfaceRenderStatus( g2, modelIndex, surfaceName );
}
static int CL_G2API_GetTime( void ) {
return re->G2API_GetTime( 0 );
}
static void CL_G2API_SetTime( int time, int clock ) {
re->G2API_SetTime( time, clock );
}
static void CL_G2API_AbsurdSmoothing( void *ghoul2, qboolean status ) {
if ( !ghoul2 ) return;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
re->G2API_AbsurdSmoothing( g2, status );
}
static void CL_G2API_SetRagDoll( void *ghoul2, sharedRagDollParams_t *params ) {
if ( !ghoul2 ) return;
CRagDollParams rdParams;
if ( !params ) {
re->G2API_ResetRagDoll( *((CGhoul2Info_v *)ghoul2) );
return;
}
VectorCopy( params->angles, rdParams.angles );
VectorCopy( params->position, rdParams.position );
VectorCopy( params->scale, rdParams.scale );
VectorCopy( params->pelvisAnglesOffset, rdParams.pelvisAnglesOffset );
VectorCopy( params->pelvisPositionOffset, rdParams.pelvisPositionOffset );
rdParams.fImpactStrength = params->fImpactStrength;
rdParams.fShotStrength = params->fShotStrength;
rdParams.me = params->me;
rdParams.startFrame = params->startFrame;
rdParams.endFrame = params->endFrame;
rdParams.collisionType = params->collisionType;
rdParams.CallRagDollBegin = params->CallRagDollBegin;
rdParams.RagPhase = (CRagDollParams::ERagPhase)params->RagPhase;
rdParams.effectorsToTurnOff = (CRagDollParams::ERagEffector)params->effectorsToTurnOff;
re->G2API_SetRagDoll( *((CGhoul2Info_v *)ghoul2), &rdParams );
}
static void CL_G2API_AnimateG2Models( void *ghoul2, int time, sharedRagDollUpdateParams_t *params ) {
if ( !ghoul2 ) return;
if ( !params ) return;
CRagDollUpdateParams rduParams;
VectorCopy( params->angles, rduParams.angles );
VectorCopy( params->position, rduParams.position );
VectorCopy( params->scale, rduParams.scale );
VectorCopy( params->velocity, rduParams.velocity );
rduParams.me = params->me;
rduParams.settleFrame = params->settleFrame;
re->G2API_AnimateG2ModelsRag( *((CGhoul2Info_v *)ghoul2), time, &rduParams );
}
static qboolean CL_G2API_RagPCJConstraint( void *ghoul2, const char *boneName, vec3_t min, vec3_t max ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_RagPCJConstraint( *((CGhoul2Info_v *)ghoul2), boneName, min, max );
}
static qboolean CL_G2API_RagPCJGradientSpeed( void *ghoul2, const char *boneName, const float speed ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_RagPCJGradientSpeed( *((CGhoul2Info_v *)ghoul2), boneName, speed );
}
static qboolean CL_G2API_RagEffectorGoal( void *ghoul2, const char *boneName, vec3_t pos ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_RagEffectorGoal( *((CGhoul2Info_v *)ghoul2), boneName, pos );
}
static qboolean CL_G2API_GetRagBonePos( void *ghoul2, const char *boneName, vec3_t pos, vec3_t entAngles, vec3_t entPos, vec3_t entScale ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_GetRagBonePos( *((CGhoul2Info_v *)ghoul2), boneName, pos, entAngles, entPos, entScale );
}
static qboolean CL_G2API_RagEffectorKick( void *ghoul2, const char *boneName, vec3_t velocity ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_RagEffectorKick( *((CGhoul2Info_v *)ghoul2), boneName, velocity );
}
static qboolean CL_G2API_RagForceSolve( void *ghoul2, qboolean force ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_RagForceSolve( *((CGhoul2Info_v *)ghoul2), force );
}
static qboolean CL_G2API_SetBoneIKState( void *ghoul2, int time, const char *boneName, int ikState, sharedSetBoneIKStateParams_t *params ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_SetBoneIKState( *((CGhoul2Info_v *)ghoul2), time, boneName, ikState, params );
}
static qboolean CL_G2API_IKMove( void *ghoul2, int time, sharedIKMoveParams_t *params ) {
if ( !ghoul2 ) return qfalse;
return re->G2API_IKMove( *((CGhoul2Info_v *)ghoul2), time, params );
}
static qboolean CL_G2API_RemoveBone( void *ghoul2, const char *boneName, int modelIndex ) {
if ( !ghoul2 ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
return re->G2API_RemoveBone( g2, modelIndex, boneName );
}
static void CL_G2API_AttachInstanceToEntNum( void *ghoul2, int entityNum, qboolean server ) {
if ( !ghoul2 ) return;
re->G2API_AttachInstanceToEntNum( *((CGhoul2Info_v *)ghoul2), entityNum, server );
}
static void CL_G2API_ClearAttachedInstance( int entityNum ) {
re->G2API_ClearAttachedInstance( entityNum );
}
static void CL_G2API_CleanEntAttachments( void ) {
re->G2API_CleanEntAttachments();
}
static qboolean CL_G2API_OverrideServer( void *serverInstance ) {
if ( !serverInstance ) return qfalse;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)serverInstance);
return re->G2API_OverrideServerWithClientData( g2, 0 );
}
static void CL_G2API_GetSurfaceName( void *ghoul2, int surfNumber, int modelIndex, char *fillBuf ) {
if ( !ghoul2 ) return;
CGhoul2Info_v &g2 = *((CGhoul2Info_v *)ghoul2);
char *tmp = re->G2API_GetSurfaceName( g2, modelIndex, surfNumber );
strcpy( fillBuf, tmp );
}
static void CL_Key_SetCatcher( int catcher ) {
// Don't allow the cgame module to close the console
Key_SetCatcher( catcher | ( Key_GetCatcher( ) & KEYCATCH_CONSOLE ) );
}
static void CGVM_Cvar_Set( const char *var_name, const char *value ) {
Cvar_VM_Set( var_name, value, VM_CGAME );
}
static void CGVM_Cmd_RemoveCommand( const char *cmd_name ) {
Cmd_VM_RemoveCommand( cmd_name, VM_CGAME );
}
// legacy syscall
intptr_t CL_CgameSystemCalls( intptr_t *args ) {
switch ( args[0] ) {
//rww - alright, DO NOT EVER add a GAME/CGAME/UI generic call without adding a trap to match, and
//all of these traps must be shared and have cases in sv_game, cl_cgame, and cl_ui. They must also
//all be in the same order, and start at 100.
case TRAP_MEMSET:
Com_Memset( VMA(1), args[2], args[3] );
return 0;
case TRAP_MEMCPY:
Com_Memcpy( VMA(1), VMA(2), args[3] );
return 0;
case TRAP_STRNCPY:
strncpy( (char *)VMA(1), (const char *)VMA(2), args[3] );
return args[1];
case TRAP_SIN:
return FloatAsInt( sin( VMF(1) ) );
case TRAP_COS:
return FloatAsInt( cos( VMF(1) ) );
case TRAP_ATAN2:
return FloatAsInt( atan2( VMF(1), VMF(2) ) );
case TRAP_SQRT:
return FloatAsInt( sqrt( VMF(1) ) );
case TRAP_MATRIXMULTIPLY:
MatrixMultiply( (vec3_t *)VMA(1), (vec3_t *)VMA(2), (vec3_t *)VMA(3) );
return 0;
case TRAP_ANGLEVECTORS:
AngleVectors( (const float *)VMA(1), (float *)VMA(2), (float *)VMA(3), (float *)VMA(4) );
return 0;
case TRAP_PERPENDICULARVECTOR:
PerpendicularVector( (float *)VMA(1), (const float *)VMA(2) );
return 0;
case TRAP_FLOOR:
return FloatAsInt( floor( VMF(1) ) );
case TRAP_CEIL:
return FloatAsInt( ceil( VMF(1) ) );
case TRAP_TESTPRINTINT:
return 0;
case TRAP_TESTPRINTFLOAT:
return 0;
case TRAP_ACOS:
return FloatAsInt( Q_acos( VMF(1) ) );
case TRAP_ASIN:
return FloatAsInt( Q_asin( VMF(1) ) );
case CG_PRINT:
Com_Printf( "%s", (const char*)VMA(1) );
return 0;
case CG_ERROR:
Com_Error( ERR_DROP, "%s", (const char*)VMA(1) );
return 0;
case CG_MILLISECONDS:
return CL_Milliseconds();
//rww - precision timer funcs... -ALWAYS- call end after start with supplied ptr, or you'll get a nasty memory leak.
//not that you should be using these outside of debug anyway.. because you shouldn't be. So don't.
case CG_PRECISIONTIMER_START:
CL_PrecisionTimerStart( (void **)VMA(1) );
return 0;
case CG_PRECISIONTIMER_END:
return CL_PrecisionTimerEnd( (void *)args[1] );
case CG_CVAR_REGISTER:
Cvar_Register( (vmCvar_t *)VMA(1), (const char *)VMA(2), (const char *)VMA(3), args[4] );
return 0;
case CG_CVAR_UPDATE:
Cvar_Update( (vmCvar_t *)VMA(1) );
return 0;
case CG_CVAR_SET:
Cvar_VM_Set( (const char *)VMA(1), (const char *)VMA(2), VM_CGAME );
return 0;
case CG_CVAR_VARIABLESTRINGBUFFER:
Cvar_VariableStringBuffer( (const char *)VMA(1), (char *)VMA(2), args[3] );
return 0;
case CG_CVAR_GETHIDDENVALUE:
return CL_GetValueForHidden((const char *)VMA(1));
case CG_ARGC:
return Cmd_Argc();
case CG_ARGV:
Cmd_ArgvBuffer( args[1], (char *)VMA(2), args[3] );
return 0;
case CG_ARGS:
Cmd_ArgsBuffer( (char *)VMA(1), args[2] );
return 0;
case CG_FS_FOPENFILE:
return FS_FOpenFileByMode( (const char *)VMA(1), (int *)VMA(2), (fsMode_t)args[3] );
case CG_FS_READ:
FS_Read( VMA(1), args[2], args[3] );
return 0;
case CG_FS_WRITE:
FS_Write( VMA(1), args[2], args[3] );
return 0;
case CG_FS_FCLOSEFILE:
FS_FCloseFile( args[1] );
return 0;
case CG_FS_GETFILELIST:
return FS_GetFileList( (const char *)VMA(1), (const char *)VMA(2), (char *)VMA(3), args[4] );
case CG_SENDCONSOLECOMMAND:
Cbuf_AddText( (const char *)VMA(1) );
return 0;
case CG_ADDCOMMAND:
CL_AddCgameCommand( (const char *)VMA(1) );
return 0;
case CG_REMOVECOMMAND:
Cmd_VM_RemoveCommand( (const char *)VMA(1), VM_CGAME );
return 0;
case CG_SENDCLIENTCOMMAND:
CL_AddReliableCommand2( (const char *)VMA(1) );
return 0;
case CG_UPDATESCREEN:
// this is used during lengthy level loading, so pump message loop
// Com_EventLoop(); // FIXME: if a server restarts here, BAD THINGS HAPPEN!
// We can't call Com_EventLoop here, a restart will crash and this _does_ happen
// if there is a map change while we are downloading at pk3.
// ZOID
SCR_UpdateScreen();
return 0;
case CG_CM_LOADMAP:
CL_CM_LoadMap( (const char *)VMA(1), (qboolean)args[2] );
return 0;
case CG_CM_NUMINLINEMODELS:
return CM_NumInlineModels();
case CG_CM_INLINEMODEL:
return CM_InlineModel( args[1] );
case CG_CM_TEMPBOXMODEL:
return CM_TempBoxModel( (const float *)VMA(1), (const float *)VMA(2), /*int capsule*/ qfalse );
case CG_CM_TEMPCAPSULEMODEL:
return CM_TempBoxModel( (const float *)VMA(1), (const float *)VMA(2), /*int capsule*/ qtrue );
case CG_CM_POINTCONTENTS:
return CM_PointContents( (const float *)VMA(1), args[2] );
case CG_CM_TRANSFORMEDPOINTCONTENTS:
return CM_TransformedPointContents( (const float *)VMA(1), args[2], (const float *)VMA(3), (const float *)VMA(4) );
case CG_CM_BOXTRACE:
CM_BoxTrace( (trace_t *)VMA(1), (const float *)VMA(2), (const float *)VMA(3), (const float *)VMA(4), (const float *)VMA(5), args[6], args[7], /*int capsule*/ qfalse );
return 0;
case CG_CM_CAPSULETRACE:
CM_BoxTrace( (trace_t *)VMA(1), (const float *)VMA(2), (const float *)VMA(3), (const float *)VMA(4), (const float *)VMA(5), args[6], args[7], /*int capsule*/ qtrue );
return 0;
case CG_CM_TRANSFORMEDBOXTRACE:
CM_TransformedBoxTrace( (trace_t *)VMA(1), (const float *)VMA(2), (const float *)VMA(3), (const float *)VMA(4), (const float *)VMA(5), args[6], args[7], (const float *)VMA(8), (const float *)VMA(9), /*int capsule*/ qfalse );
return 0;
case CG_CM_TRANSFORMEDCAPSULETRACE:
CM_TransformedBoxTrace( (trace_t *)VMA(1), (const float *)VMA(2), (const float *)VMA(3), (const float *)VMA(4), (const float *)VMA(5), args[6], args[7], (const float *)VMA(8), (const float *)VMA(9), /*int capsule*/ qtrue );
return 0;
case CG_CM_MARKFRAGMENTS:
return re->MarkFragments( args[1], (const vec3_t *)VMA(2), (const float *)VMA(3), args[4], (float *)VMA(5), args[6], (markFragment_t *)VMA(7) );
case CG_S_GETVOICEVOLUME:
return CL_S_GetVoiceVolume( args[1] );
case CG_S_MUTESOUND:
S_MuteSound( args[1], args[2] );
return 0;
case CG_S_STARTSOUND:
S_StartSound( (float *)VMA(1), args[2], args[3], args[4] );
return 0;
case CG_S_STARTLOCALSOUND:
S_StartLocalSound( args[1], args[2] );
return 0;
case CG_S_CLEARLOOPINGSOUNDS:
S_ClearLoopingSounds();
return 0;
case CG_S_ADDLOOPINGSOUND:
S_AddLoopingSound( args[1], (const float *)VMA(2), (const float *)VMA(3), args[4] );
return 0;
case CG_S_ADDREALLOOPINGSOUND:
/*S_AddRealLoopingSound*/S_AddLoopingSound( args[1], (const float *)VMA(2), (const float *)VMA(3), args[4] );
return 0;
case CG_S_STOPLOOPINGSOUND:
S_StopLoopingSound( args[1] );
return 0;
case CG_S_UPDATEENTITYPOSITION:
S_UpdateEntityPosition( args[1], (const float *)VMA(2) );
return 0;
case CG_S_RESPATIALIZE:
S_Respatialize( args[1], (const float *)VMA(2), (vec3_t *)VMA(3), args[4] );
return 0;
case CG_S_SHUTUP:
CL_S_Shutup( (qboolean)args[1] );
return 0;
case CG_S_REGISTERSOUND:
return S_RegisterSound( (const char *)VMA(1) );
case CG_S_STARTBACKGROUNDTRACK:
S_StartBackgroundTrack( (const char *)VMA(1), (const char *)VMA(2), args[3]?qtrue:qfalse );
return 0;
case CG_S_UPDATEAMBIENTSET:
S_UpdateAmbientSet((const char *)VMA(1), (float *)VMA(2));
return 0;
case CG_AS_PARSESETS:
AS_ParseSets();
return 0;
case CG_AS_ADDPRECACHEENTRY:
AS_AddPrecacheEntry((const char *)VMA(1));
return 0;
case CG_S_ADDLOCALSET:
return S_AddLocalSet((const char *)VMA(1), (float *)VMA(2), (float *)VMA(3), args[4], args[5]);
case CG_AS_GETBMODELSOUND:
return AS_GetBModelSound((const char *)VMA(1), args[2]);
case CG_R_LOADWORLDMAP:
re->LoadWorld( (const char *)VMA(1) );
return 0;
case CG_R_REGISTERMODEL:
return re->RegisterModel( (const char *)VMA(1) );
case CG_R_REGISTERSKIN:
return re->RegisterSkin( (const char *)VMA(1) );
case CG_R_REGISTERSHADER:
return re->RegisterShader( (const char *)VMA(1) );
case CG_R_REGISTERSHADERNOMIP:
return re->RegisterShaderNoMip( (const char *)VMA(1) );
case CG_R_REGISTERFONT:
return re->RegisterFont( (const char *)VMA(1) );
case CG_R_FONT_STRLENPIXELS:
return re->Font_StrLenPixels( (const char *)VMA(1), args[2], VMF(3) );
case CG_R_FONT_STRLENCHARS:
return re->Font_StrLenChars( (const char *)VMA(1) );
case CG_R_FONT_STRHEIGHTPIXELS:
return re->Font_HeightPixels( args[1], VMF(2) );
case CG_R_FONT_DRAWSTRING:
re->Font_DrawString( args[1], args[2], (const char *)VMA(3), (const float *) VMA(4), args[5], args[6], VMF(7) );
return 0;
case CG_LANGUAGE_ISASIAN:
return re->Language_IsAsian();
case CG_LANGUAGE_USESSPACES:
return re->Language_UsesSpaces();
case CG_ANYLANGUAGE_READCHARFROMSTRING:
return re->AnyLanguage_ReadCharFromString( (const char *) VMA(1), (int *) VMA(2), (qboolean *) VMA(3) );
case CG_R_CLEARSCENE:
re->ClearScene();
return 0;
case CG_R_CLEARDECALS:
re->ClearDecals();
return 0;
case CG_R_ADDREFENTITYTOSCENE:
re->AddRefEntityToScene( (const refEntity_t *)VMA(1) );
return 0;
case CG_R_ADDPOLYTOSCENE:
re->AddPolyToScene( args[1], args[2], (const polyVert_t *)VMA(3), 1 );
return 0;
case CG_R_ADDPOLYSTOSCENE:
re->AddPolyToScene( args[1], args[2], (const polyVert_t *)VMA(3), args[4] );
return 0;
case CG_R_ADDDECALTOSCENE:
re->AddDecalToScene( (qhandle_t)args[1], (const float*)VMA(2), (const float*)VMA(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), (qboolean)args[9], VMF(10), (qboolean)args[11] );
return 0;
case CG_R_LIGHTFORPOINT:
return re->LightForPoint( (float *)VMA(1), (float *)VMA(2), (float *)VMA(3), (float *)VMA(4) );
case CG_R_ADDLIGHTTOSCENE:
re->AddLightToScene( (const float *)VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) );
return 0;
case CG_R_ADDADDITIVELIGHTTOSCENE:
re->AddAdditiveLightToScene( (const float *)VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) );
return 0;
case CG_R_RENDERSCENE:
re->RenderScene( (const refdef_t *)VMA(1) );
return 0;
case CG_R_SETCOLOR:
re->SetColor( (const float *)VMA(1) );
return 0;
case CG_R_DRAWSTRETCHPIC:
re->DrawStretchPic( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), args[9] );
return 0;
case CG_R_MODELBOUNDS:
re->ModelBounds( args[1], (float *)VMA(2), (float *)VMA(3) );
return 0;
case CG_R_LERPTAG:
return re->LerpTag( (orientation_t *)VMA(1), args[2], args[3], args[4], VMF(5), (const char *)VMA(6) );
case CG_R_DRAWROTATEPIC:
re->DrawRotatePic( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), VMF(9), args[10] );
return 0;
case CG_R_DRAWROTATEPIC2:
re->DrawRotatePic2( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), VMF(9), args[10] );
return 0;
case CG_R_SETRANGEFOG:
re->SetRangedFog( VMF(1) );
return 0;
case CG_R_SETREFRACTIONPROP:
re->SetRefractionProperties( VMF(1), VMF(2), (qboolean)args[3], (qboolean)args[4] );
return 0;
case CG_GETGLCONFIG:
CL_GetGlconfig( (glconfig_t *)VMA(1) );
return 0;
case CG_GETGAMESTATE:
CL_GetGameState( (gameState_t *)VMA(1) );
return 0;
case CG_GETCURRENTSNAPSHOTNUMBER:
CL_GetCurrentSnapshotNumber( (int *)VMA(1), (int *)VMA(2) );
return 0;
case CG_GETSNAPSHOT:
return CL_GetSnapshot( args[1], (snapshot_t *)VMA(2) );
case CG_GETDEFAULTSTATE:
return CL_GetDefaultState(args[1], (entityState_t *)VMA(2));
case CG_GETSERVERCOMMAND:
return CL_GetServerCommand( args[1] );
case CG_GETCURRENTCMDNUMBER:
return CL_GetCurrentCmdNumber();
case CG_GETUSERCMD:
return CL_GetUserCmd( args[1], (struct usercmd_s *)VMA(2) );
case CG_SETUSERCMDVALUE:
_CL_SetUserCmdValue( args[1], VMF(2), VMF(3), VMF(4), VMF(5), args[6], args[7], (qboolean)args[8] );
return 0;
case CG_SETCLIENTFORCEANGLE:
CL_SetClientForceAngle(args[1], (float *)VMA(2));
return 0;
case CG_SETCLIENTTURNEXTENT:
return 0;
case CG_OPENUIMENU:
CL_OpenUIMenu( args[1] );
return 0;
case CG_MEMORY_REMAINING:
return Hunk_MemoryRemaining();
case CG_KEY_ISDOWN:
return Key_IsDown( args[1] );
case CG_KEY_GETCATCHER:
return Key_GetCatcher();
case CG_KEY_SETCATCHER:
CL_Key_SetCatcher( args[1] );
return 0;
case CG_KEY_GETKEY:
return Key_GetKey( (const char *)VMA(1) );
case CG_PC_ADD_GLOBAL_DEFINE:
return botlib_export->PC_AddGlobalDefine( (char *)VMA(1) );
case CG_PC_LOAD_SOURCE:
return botlib_export->PC_LoadSourceHandle( (const char *)VMA(1) );
case CG_PC_FREE_SOURCE:
return botlib_export->PC_FreeSourceHandle( args[1] );
case CG_PC_READ_TOKEN:
return botlib_export->PC_ReadTokenHandle( args[1], (struct pc_token_s *)VMA(2) );
case CG_PC_SOURCE_FILE_AND_LINE:
return botlib_export->PC_SourceFileAndLine( args[1], (char *)VMA(2), (int *)VMA(3) );
case CG_PC_LOAD_GLOBAL_DEFINES:
return botlib_export->PC_LoadGlobalDefines ( (char *)VMA(1) );
case CG_PC_REMOVE_ALL_GLOBAL_DEFINES:
botlib_export->PC_RemoveAllGlobalDefines ( );
return 0;
case CG_S_STOPBACKGROUNDTRACK:
S_StopBackgroundTrack();
return 0;
case CG_REAL_TIME:
return Com_RealTime( (struct qtime_s *)VMA(1) );
case CG_SNAPVECTOR:
Sys_SnapVector( (float *)VMA(1) );
return 0;
case CG_CIN_PLAYCINEMATIC:
return CIN_PlayCinematic((const char *)VMA(1), args[2], args[3], args[4], args[5], args[6]);
case CG_CIN_STOPCINEMATIC:
return CIN_StopCinematic(args[1]);
case CG_CIN_RUNCINEMATIC:
return CIN_RunCinematic(args[1]);
case CG_CIN_DRAWCINEMATIC:
CIN_DrawCinematic(args[1]);
return 0;
case CG_CIN_SETEXTENTS:
CIN_SetExtents(args[1], args[2], args[3], args[4], args[5]);
return 0;
case CG_R_REMAP_SHADER:
re->RemapShader( (const char *)VMA(1), (const char *)VMA(2), (const char *)VMA(3) );
return 0;
case CG_R_GET_LIGHT_STYLE:
re->GetLightStyle(args[1], (unsigned char *)VMA(2));
return 0;
case CG_R_SET_LIGHT_STYLE:
re->SetLightStyle(args[1], args[2]);
return 0;
case CG_R_GET_BMODEL_VERTS:
re->GetBModelVerts( args[1], (float (*)[3])VMA(2), (float *)VMA(3) );
return 0;
case CG_R_GETDISTANCECULL:
{
float *f = (float *)VMA(1);
*f = re->GetDistanceCull();
}
return 0;
case CG_R_GETREALRES:
{
int *w = (int *)VMA(1);
int *h = (int *)VMA(2);
re->GetRealRes( w, h );
}
return 0;
case CG_R_AUTOMAPELEVADJ:
re->AutomapElevationAdjustment(VMF(1));
return 0;
case CG_R_INITWIREFRAMEAUTO:
return re->InitializeWireframeAutomap();
case CG_GET_ENTITY_TOKEN:
return re->GetEntityToken( (char *)VMA(1), args[2] );
case CG_R_INPVS:
return re->inPVS( (const float *)VMA(1), (const float *)VMA(2), (byte *)VMA(3) );
#ifndef DEBUG_DISABLEFXCALLS
case CG_FX_ADDLINE:
CGFX_AddLine( (float *)VMA(1), (float *)VMA(2), VMF(3), VMF(4), VMF(5),
VMF(6), VMF(7), VMF(8),
(float *)VMA(9), (float *)VMA(10), VMF(11),
args[12], args[13], args[14]);
return 0;
case CG_FX_REGISTER_EFFECT:
return FX_RegisterEffect((const char *)VMA(1));
case CG_FX_PLAY_EFFECT:
FX_PlayEffect((const char *)VMA(1), (float *)VMA(2), (float *)VMA(3), args[4], args[5] );
return 0;
case CG_FX_PLAY_ENTITY_EFFECT:
assert(0);
return 0;
case CG_FX_PLAY_EFFECT_ID:
FX_PlayEffectID(args[1], (float *)VMA(2), (float *)VMA(3), args[4], args[5] );
return 0;
case CG_FX_PLAY_PORTAL_EFFECT_ID:
FX_PlayEffectID(args[1], (float *)VMA(2), (float *)VMA(3), args[4], args[5], qtrue );
return 0;
case CG_FX_PLAY_ENTITY_EFFECT_ID:
FX_PlayEntityEffectID(args[1], (float *)VMA(2), (vec3_t *)VMA(3), args[4], args[5], args[6], args[7] );
return 0;
case CG_FX_PLAY_BOLTED_EFFECT_ID:
return CGFX_PlayBoltedEffectID( args[1], (float *)VMA(2), (void *)args[3], args[4], args[5], args[6], args[7], (qboolean)args[8] );
case CG_FX_ADD_SCHEDULED_EFFECTS:
FX_AddScheduledEffects((qboolean)args[1]);
return 0;
case CG_FX_DRAW_2D_EFFECTS:
FX_Draw2DEffects ( VMF(1), VMF(2) );
return 0;
case CG_FX_INIT_SYSTEM:
return FX_InitSystem( (refdef_t*)VMA(1) );
case CG_FX_SET_REFDEF:
FX_SetRefDefFromCGame( (refdef_t*)VMA(1) );
return 0;
case CG_FX_FREE_SYSTEM:
return FX_FreeSystem();
case CG_FX_ADJUST_TIME:
FX_AdjustTime(args[1]);
return 0;
case CG_FX_RESET:
FX_Free ( false );
return 0;
case CG_FX_ADDPOLY:
CGFX_AddPoly( (addpolyArgStruct_t *)VMA(1) );
return 0;
case CG_FX_ADDBEZIER:
CGFX_AddBezier( (addbezierArgStruct_t *)VMA(1) );
return 0;
case CG_FX_ADDPRIMITIVE:
CGFX_AddPrimitive( (effectTrailArgStruct_t *)VMA(1) );
return 0;
case CG_FX_ADDSPRITE:
CGFX_AddSprite( (addspriteArgStruct_t *)VMA(1) );
return 0;
case CG_FX_ADDELECTRICITY:
CGFX_AddElectricity( (addElectricityArgStruct_t *)VMA(1) );
return 0;
#else
case CG_FX_REGISTER_EFFECT:
case CG_FX_PLAY_EFFECT:
case CG_FX_PLAY_ENTITY_EFFECT:
case CG_FX_PLAY_EFFECT_ID:
case CG_FX_PLAY_PORTAL_EFFECT_ID:
case CG_FX_PLAY_ENTITY_EFFECT_ID:
case CG_FX_PLAY_BOLTED_EFFECT_ID:
case CG_FX_ADD_SCHEDULED_EFFECTS:
case CG_FX_INIT_SYSTEM:
case CG_FX_FREE_SYSTEM:
case CG_FX_ADJUST_TIME:
case CG_FX_ADDPOLY:
case CG_FX_ADDBEZIER:
case CG_FX_ADDPRIMITIVE:
case CG_FX_ADDSPRITE:
case CG_FX_ADDELECTRICITY:
return 0;
#endif
case CG_ROFF_CLEAN:
return CL_ROFF_Clean();
case CG_ROFF_UPDATE_ENTITIES:
CL_ROFF_UpdateEntities();
return 0;
case CG_ROFF_CACHE:
return CL_ROFF_Cache( (char *)VMA(1) );
case CG_ROFF_PLAY:
return CL_ROFF_Play( args[1], args[2], (qboolean)args[3] );
case CG_ROFF_PURGE_ENT:
return CL_ROFF_Purge_Ent( args[1] );
case CG_TRUEMALLOC:
VM_Shifted_Alloc((void **)VMA(1), args[2]);
return 0;
case CG_TRUEFREE:
VM_Shifted_Free((void **)VMA(1));
return 0;
case CG_G2_LISTSURFACES:
CL_G2API_ListModelSurfaces( VMA(1) );
return 0;
case CG_G2_LISTBONES:
CL_G2API_ListModelBones( VMA(1), args[2]);
return 0;
case CG_G2_HAVEWEGHOULMODELS:
return CL_G2API_HaveWeGhoul2Models( VMA(1) );
case CG_G2_SETMODELS:
CL_G2API_SetGhoul2ModelIndexes( VMA(1), (qhandle_t *)VMA(2), (qhandle_t *)VMA(3) );
return 0;
case CG_G2_GETBOLT:
return CL_G2API_GetBoltMatrix(VMA(1), args[2], args[3], (mdxaBone_t *)VMA(4), (const float *)VMA(5),(const float *)VMA(6), args[7], (qhandle_t *)VMA(8), (float *)VMA(9));
case CG_G2_GETBOLT_NOREC:
return CL_G2API_GetBoltMatrix_NoReconstruct(VMA(1), args[2], args[3], (mdxaBone_t *)VMA(4), (const float *)VMA(5),(const float *)VMA(6), args[7], (qhandle_t *)VMA(8), (float *)VMA(9));
case CG_G2_GETBOLT_NOREC_NOROT:
return CL_G2API_GetBoltMatrix_NoRecNoRot(VMA(1), args[2], args[3], (mdxaBone_t *)VMA(4), (const float *)VMA(5),(const float *)VMA(6), args[7], (qhandle_t *)VMA(8), (float *)VMA(9));
case CG_G2_INITGHOUL2MODEL:
return CL_G2API_InitGhoul2Model((void **)VMA(1), (const char *)VMA(2), args[3], (qhandle_t) args[4], (qhandle_t) args[5], args[6], args[7]);
case CG_G2_SETSKIN:
return CL_G2API_SetSkin( VMA(1), args[2], args[3], args[4] );
case CG_G2_COLLISIONDETECT:
CL_G2API_CollisionDetect ( (CollisionRecord_t*)VMA(1), VMA(2), (const float*)VMA(3), (const float*)VMA(4), args[5], args[6], (float*)VMA(7), (float*)VMA(8), (float*)VMA(9), args[10], args[11], VMF(12) );
return 0;
case CG_G2_COLLISIONDETECTCACHE:
CL_G2API_CollisionDetectCache ( (CollisionRecord_t*)VMA(1), VMA(2), (const float*)VMA(3), (const float*)VMA(4), args[5], args[6], (float*)VMA(7), (float*)VMA(8), (float*)VMA(9), args[10], args[11], VMF(12) );
return 0;
case CG_G2_ANGLEOVERRIDE:
return CL_G2API_SetBoneAngles( VMA(1), args[2], (const char *)VMA(3), (float *)VMA(4), args[5], args[6], args[7], args[8], (qhandle_t *)VMA(9), args[10], args[11] );
case CG_G2_CLEANMODELS:
CL_G2API_CleanGhoul2Models( (void **)VMA(1) );
return 0;
case CG_G2_PLAYANIM:
return CL_G2API_SetBoneAnim( VMA(1), args[2], (const char *)VMA(3), args[4], args[5], args[6], VMF(7), args[8], VMF(9), args[10] );
case CG_G2_GETBONEANIM:
return CL_G2API_GetBoneAnim( VMA(1), (const char *)VMA(2), args[3], (float *)VMA(4), (int *)VMA(5), (int *)VMA(6), (int *)VMA(7), (float *)VMA(8), (int *)VMA(9), args[10] );
case CG_G2_GETBONEFRAME:
return CL_G2API_GetBoneFrame( VMA(1), (const char*)VMA(2), args[3], (float *)VMA(4), (int *)VMA(5), args[6] );
case CG_G2_GETGLANAME:
CL_G2API_GetGLAName( VMA(1), args[2], (char *)VMA(3) );
return 0;
case CG_G2_COPYGHOUL2INSTANCE:
return CL_G2API_CopyGhoul2Instance( VMA(1), VMA(2), args[3] );
case CG_G2_COPYSPECIFICGHOUL2MODEL:
CL_G2API_CopySpecificGhoul2Model( VMA(1), args[2], VMA(3), args[4] );
return 0;
case CG_G2_DUPLICATEGHOUL2INSTANCE:
CL_G2API_DuplicateGhoul2Instance( VMA(1), (void **)VMA(2) );
return 0;
case CG_G2_HASGHOUL2MODELONINDEX:
return CL_G2API_HasGhoul2ModelOnIndex( VMA(1), args[2]);
case CG_G2_REMOVEGHOUL2MODEL:
return CL_G2API_RemoveGhoul2Model( VMA(1), args[2]);
case CG_G2_SKINLESSMODEL:
return CL_G2API_SkinlessModel( VMA(1), args[2] );
case CG_G2_GETNUMGOREMARKS:
return CL_G2API_GetNumGoreMarks( VMA(1), args[2] );
case CG_G2_ADDSKINGORE:
CL_G2API_AddSkinGore( VMA(1), (SSkinGoreData *)VMA(2));
return 0;
case CG_G2_CLEARSKINGORE:
CL_G2API_ClearSkinGore ( VMA(1) );
return 0;
case CG_G2_SIZE:
return CL_G2API_Ghoul2Size ( VMA(1) );
case CG_G2_ADDBOLT:
return CL_G2API_AddBolt( VMA(1), args[2], (const char *)VMA(3));
case CG_G2_ATTACHENT:
return CL_G2API_AttachEnt( (int*)VMA(1), VMA(2), args[3], args[4], args[5] );
case CG_G2_SETBOLTON:
CL_G2API_SetBoltInfo( VMA(1), args[2], args[3] );
return 0;
case CG_G2_SETROOTSURFACE:
return CL_G2API_SetRootSurface( VMA(1), args[2], (const char *)VMA(3));
case CG_G2_SETSURFACEONOFF:
return CL_G2API_SetSurfaceOnOff( VMA(1), (const char *)VMA(2), args[3]);
case CG_G2_SETNEWORIGIN:
return CL_G2API_SetNewOrigin( VMA(1), args[2]);
case CG_G2_DOESBONEEXIST:
return CL_G2API_DoesBoneExist( VMA(1), args[2], (const char *)VMA(3));
case CG_G2_GETSURFACERENDERSTATUS:
return CL_G2API_GetSurfaceRenderStatus( VMA(1), args[2], (const char *)VMA(3));
case CG_G2_GETTIME:
return CL_G2API_GetTime();
case CG_G2_SETTIME:
CL_G2API_SetTime(args[1], args[2]);
return 0;
case CG_G2_ABSURDSMOOTHING:
CL_G2API_AbsurdSmoothing( VMA(1), (qboolean)args[2]);
return 0;
case CG_G2_SETRAGDOLL:
CL_G2API_SetRagDoll( VMA(1), (sharedRagDollParams_t *)VMA(2) );
return 0;
case CG_G2_ANIMATEG2MODELS:
CL_G2API_AnimateG2Models( VMA(1), args[2], (sharedRagDollUpdateParams_t *)VMA(3) );
return 0;
//additional ragdoll options -rww
case CG_G2_RAGPCJCONSTRAINT:
return CL_G2API_RagPCJConstraint( VMA(1), (const char *)VMA(2), (float *)VMA(3), (float *)VMA(4));
case CG_G2_RAGPCJGRADIENTSPEED:
return CL_G2API_RagPCJGradientSpeed( VMA(1), (const char *)VMA(2), VMF(3));
case CG_G2_RAGEFFECTORGOAL:
return CL_G2API_RagEffectorGoal( VMA(1), (const char *)VMA(2), (float *)VMA(3));
case CG_G2_GETRAGBONEPOS:
return CL_G2API_GetRagBonePos( VMA(1), (const char *)VMA(2), (float *)VMA(3), (float *)VMA(4), (float *)VMA(5), (float *)VMA(6));
case CG_G2_RAGEFFECTORKICK:
return CL_G2API_RagEffectorKick( VMA(1), (const char *)VMA(2), (float *)VMA(3));
case CG_G2_RAGFORCESOLVE:
return CL_G2API_RagForceSolve( VMA(1), (qboolean)args[2]);
case CG_G2_SETBONEIKSTATE:
return CL_G2API_SetBoneIKState( VMA(1), args[2], (const char *)VMA(3), args[4], (sharedSetBoneIKStateParams_t *)VMA(5));
case CG_G2_IKMOVE:
return CL_G2API_IKMove( VMA(1), args[2], (sharedIKMoveParams_t *)VMA(3));
case CG_G2_REMOVEBONE:
return CL_G2API_RemoveBone( VMA(1), (const char *)VMA(2), args[3] );
case CG_G2_ATTACHINSTANCETOENTNUM:
CL_G2API_AttachInstanceToEntNum( VMA(1), args[2], (qboolean)args[3]);
return 0;
case CG_G2_CLEARATTACHEDINSTANCE:
CL_G2API_ClearAttachedInstance(args[1]);
return 0;
case CG_G2_CLEANENTATTACHMENTS:
CL_G2API_CleanEntAttachments();
return 0;
case CG_G2_OVERRIDESERVER:
return CL_G2API_OverrideServer( VMA(1) );
case CG_G2_GETSURFACENAME:
CL_G2API_GetSurfaceName( VMA(1), args[2], args[3], (char *)VMA(4) );
return 0;
case CG_SP_GETSTRINGTEXTSTRING:
return CL_SE_GetStringTextString( (const char *)VMA(1), (char *)VMA(2), args[3] );
case CG_SET_SHARED_BUFFER:
RegisterSharedMemory( (char *)VMA(1) );
return 0;
case CG_CM_REGISTER_TERRAIN:
return 0;
case CG_RMG_INIT:
return 0;
case CG_RE_INIT_RENDERER_TERRAIN:
return 0;
case CG_R_WEATHER_CONTENTS_OVERRIDE:
//contentOverride = args[1];
return 0;
case CG_R_WORLDEFFECTCOMMAND:
re->WorldEffectCommand((const char *)VMA(1));
return 0;
case CG_WE_ADDWEATHERZONE:
re->AddWeatherZone( (float *)VMA(1), (float *)VMA(2) );
return 0;
default:
assert(0); // bk010102
Com_Error( ERR_DROP, "Bad cgame system trap: %ld", (long int) args[0] );
}
return 0;
}
// Stub function for old RMG system.
static void RE_InitRendererTerrain ( const char * /*info*/ ) {}
void CL_BindCGame( void ) {
static cgameImport_t cgi;
cgameExport_t *ret;
GetCGameAPI_t GetCGameAPI;
char dllName[MAX_OSPATH] = "cgame" ARCH_STRING DLL_EXT;
memset( &cgi, 0, sizeof( cgi ) );
cgvm = VM_Create( VM_CGAME );
if ( cgvm && !cgvm->isLegacy ) {
cgi.Print = Com_Printf;
cgi.Error = Com_Error;
cgi.SnapVector = Sys_SnapVector;
cgi.MemoryRemaining = Hunk_MemoryRemaining;
cgi.RegisterSharedMemory = RegisterSharedMemory;
cgi.TrueMalloc = VM_Shifted_Alloc;
cgi.TrueFree = VM_Shifted_Free;
cgi.Milliseconds = CL_Milliseconds;
cgi.RealTime = Com_RealTime;
cgi.PrecisionTimerStart = CL_PrecisionTimerStart;
cgi.PrecisionTimerEnd = CL_PrecisionTimerEnd;
cgi.Cvar_Register = Cvar_Register;
cgi.Cvar_Set = CGVM_Cvar_Set;
cgi.Cvar_Update = Cvar_Update;
cgi.Cvar_VariableStringBuffer = Cvar_VariableStringBuffer;
cgi.AddCommand = CL_AddCgameCommand;
cgi.Cmd_Argc = Cmd_Argc;
cgi.Cmd_Args = Cmd_ArgsBuffer;
cgi.Cmd_Argv = Cmd_ArgvBuffer;
cgi.RemoveCommand = CGVM_Cmd_RemoveCommand;
cgi.SendClientCommand = CL_AddReliableCommand2;
cgi.SendConsoleCommand = Cbuf_AddText;
cgi.FS_Close = FS_FCloseFile;
cgi.FS_GetFileList = FS_GetFileList;
cgi.FS_Open = FS_FOpenFileByMode;
cgi.FS_Read = FS_Read;
cgi.FS_Write = FS_Write;
cgi.UpdateScreen = SCR_UpdateScreen;
cgi.CM_InlineModel = CM_InlineModel;
cgi.CM_LoadMap = CL_CM_LoadMap;
cgi.CM_NumInlineModels = CM_NumInlineModels;
cgi.CM_PointContents = CM_PointContents;
cgi.CM_RegisterTerrain = CL_CM_RegisterTerrain;
cgi.CM_TempModel = CM_TempBoxModel;
cgi.CM_Trace = CM_BoxTrace;
cgi.CM_TransformedPointContents = CM_TransformedPointContents;
cgi.CM_TransformedTrace = CM_TransformedBoxTrace;
cgi.RMG_Init = CL_RMG_Init;
cgi.S_AddLocalSet = S_AddLocalSet;
cgi.S_AddLoopingSound = S_AddLoopingSound;
cgi.S_ClearLoopingSounds = S_ClearLoopingSounds;
cgi.S_GetVoiceVolume = CL_S_GetVoiceVolume;
cgi.S_MuteSound = S_MuteSound;
cgi.S_RegisterSound = S_RegisterSound;
cgi.S_Respatialize = S_Respatialize;
cgi.S_Shutup = CL_S_Shutup;
cgi.S_StartBackgroundTrack = S_StartBackgroundTrack;
cgi.S_StartLocalSound = S_StartLocalSound;
cgi.S_StartSound = S_StartSound;
cgi.S_StopBackgroundTrack = S_StopBackgroundTrack;
cgi.S_StopLoopingSound = S_StopLoopingSound;
cgi.S_UpdateEntityPosition = S_UpdateEntityPosition;
cgi.S_UpdateAmbientSet = S_UpdateAmbientSet;
cgi.AS_AddPrecacheEntry = AS_AddPrecacheEntry;
cgi.AS_GetBModelSound = AS_GetBModelSound;
cgi.AS_ParseSets = AS_ParseSets;
cgi.R_AddAdditiveLightToScene = re->AddAdditiveLightToScene;
cgi.R_AddDecalToScene = re->AddDecalToScene;
cgi.R_AddLightToScene = re->AddLightToScene;
cgi.R_AddPolysToScene = re->AddPolyToScene;
cgi.R_AddRefEntityToScene = re->AddRefEntityToScene;
cgi.R_AnyLanguage_ReadCharFromString = re->AnyLanguage_ReadCharFromString;
cgi.R_AutomapElevationAdjustment = re->AutomapElevationAdjustment;
cgi.R_ClearDecals = re->ClearDecals;
cgi.R_ClearScene = re->ClearScene;
cgi.R_DrawStretchPic = re->DrawStretchPic;
cgi.R_DrawRotatePic = re->DrawRotatePic;
cgi.R_DrawRotatePic2 = re->DrawRotatePic2;
cgi.R_Font_DrawString = re->Font_DrawString;
cgi.R_Font_HeightPixels = re->Font_HeightPixels;
cgi.R_Font_StrLenChars = re->Font_StrLenChars;
cgi.R_Font_StrLenPixels = re->Font_StrLenPixels;
cgi.R_GetBModelVerts = re->GetBModelVerts;
cgi.R_GetDistanceCull = re->GetDistanceCull;
cgi.R_GetEntityToken = re->GetEntityToken;
cgi.R_GetLightStyle = re->GetLightStyle;
cgi.R_GetRealRes = re->GetRealRes;
cgi.R_InitializeWireframeAutomap = re->InitializeWireframeAutomap;
cgi.R_InPVS = re->inPVS;
cgi.R_Language_IsAsian = re->Language_IsAsian;
cgi.R_Language_UsesSpaces = re->Language_UsesSpaces;
cgi.R_LerpTag = re->LerpTag;
cgi.R_LightForPoint = re->LightForPoint;
cgi.R_LoadWorld = re->LoadWorld;
cgi.R_MarkFragments = re->MarkFragments;
cgi.R_ModelBounds = re->ModelBounds;
cgi.R_RegisterFont = re->RegisterFont;
cgi.R_RegisterModel = re->RegisterModel;
cgi.R_RegisterShader = re->RegisterShader;
cgi.R_RegisterShaderNoMip = re->RegisterShaderNoMip;
cgi.R_RegisterSkin = re->RegisterSkin;
cgi.R_RemapShader = re->RemapShader;
cgi.R_RenderScene = re->RenderScene;
cgi.R_SetColor = re->SetColor;
cgi.R_SetLightStyle = re->SetLightStyle;
cgi.R_SetRangedFog = re->SetRangedFog;
cgi.R_SetRefractionProperties = re->SetRefractionProperties;
cgi.R_WorldEffectCommand = re->WorldEffectCommand;
cgi.RE_InitRendererTerrain = RE_InitRendererTerrain;
cgi.WE_AddWeatherZone = re->AddWeatherZone;
cgi.GetCurrentSnapshotNumber = CL_GetCurrentSnapshotNumber;
cgi.GetCurrentCmdNumber = CL_GetCurrentCmdNumber;
cgi.GetDefaultState = CL_GetDefaultState;
cgi.GetGameState = CL_GetGameState;
cgi.GetGlconfig = CL_GetGlconfig;
cgi.GetServerCommand = CL_GetServerCommand;
cgi.GetSnapshot = CL_GetSnapshot;
cgi.GetUserCmd = CL_GetUserCmd;
cgi.OpenUIMenu = CL_OpenUIMenu;
cgi.SetClientForceAngle = CL_SetClientForceAngle;
cgi.SetUserCmdValue = _CL_SetUserCmdValue;
cgi.Key_GetCatcher = Key_GetCatcher;
cgi.Key_GetKey = Key_GetKey;
cgi.Key_IsDown = Key_IsDown;
cgi.Key_SetCatcher = CL_Key_SetCatcher;
cgi.PC_AddGlobalDefine = botlib_export->PC_AddGlobalDefine;
cgi.PC_FreeSource = botlib_export->PC_FreeSourceHandle;
cgi.PC_LoadGlobalDefines = botlib_export->PC_LoadGlobalDefines;
cgi.PC_LoadSource = botlib_export->PC_LoadSourceHandle;
cgi.PC_ReadToken = botlib_export->PC_ReadTokenHandle;
cgi.PC_RemoveAllGlobalDefines = botlib_export->PC_RemoveAllGlobalDefines;
cgi.PC_SourceFileAndLine = botlib_export->PC_SourceFileAndLine;
cgi.CIN_DrawCinematic = CIN_DrawCinematic;
cgi.CIN_PlayCinematic = CIN_PlayCinematic;
cgi.CIN_RunCinematic = CIN_RunCinematic;
cgi.CIN_SetExtents = CIN_SetExtents;
cgi.CIN_StopCinematic = CIN_StopCinematic;
cgi.FX_AddLine = CGFX_AddLine;
cgi.FX_RegisterEffect = FX_RegisterEffect;
cgi.FX_PlayEffect = FX_PlayEffect;
cgi.FX_PlayEffectID = FX_PlayEffectID;
cgi.FX_PlayEntityEffectID = FX_PlayEntityEffectID;
cgi.FX_PlayBoltedEffectID = CGFX_PlayBoltedEffectID;
cgi.FX_AddScheduledEffects = FX_AddScheduledEffects;
cgi.FX_InitSystem = FX_InitSystem;
cgi.FX_SetRefDef = FX_SetRefDef;
cgi.FX_FreeSystem = FX_FreeSystem;
cgi.FX_AdjustTime = FX_AdjustTime;
cgi.FX_Draw2DEffects = FX_Draw2DEffects;
cgi.FX_AddPoly = CGFX_AddPoly;
cgi.FX_AddBezier = CGFX_AddBezier;
cgi.FX_AddPrimitive = CGFX_AddPrimitive;
cgi.FX_AddSprite = CGFX_AddSprite;
cgi.FX_AddElectricity = CGFX_AddElectricity;
cgi.SE_GetStringTextString = CL_SE_GetStringTextString;
cgi.ROFF_Clean = CL_ROFF_Clean;
cgi.ROFF_UpdateEntities = CL_ROFF_UpdateEntities;
cgi.ROFF_Cache = CL_ROFF_Cache;
cgi.ROFF_Play = CL_ROFF_Play;
cgi.ROFF_Purge_Ent = CL_ROFF_Purge_Ent;
cgi.G2_ListModelSurfaces = CL_G2API_ListModelSurfaces;
cgi.G2_ListModelBones = CL_G2API_ListModelBones;
cgi.G2_SetGhoul2ModelIndexes = CL_G2API_SetGhoul2ModelIndexes;
cgi.G2_HaveWeGhoul2Models = CL_G2API_HaveWeGhoul2Models;
cgi.G2API_GetBoltMatrix = CL_G2API_GetBoltMatrix;
cgi.G2API_GetBoltMatrix_NoReconstruct = CL_G2API_GetBoltMatrix_NoReconstruct;
cgi.G2API_GetBoltMatrix_NoRecNoRot = CL_G2API_GetBoltMatrix_NoRecNoRot;
cgi.G2API_InitGhoul2Model = CL_G2API_InitGhoul2Model;
cgi.G2API_SetSkin = CL_G2API_SetSkin;
cgi.G2API_CollisionDetect = CL_G2API_CollisionDetect;
cgi.G2API_CollisionDetectCache = CL_G2API_CollisionDetectCache;
cgi.G2API_CleanGhoul2Models = CL_G2API_CleanGhoul2Models;
cgi.G2API_SetBoneAngles = CL_G2API_SetBoneAngles;
cgi.G2API_SetBoneAnim = CL_G2API_SetBoneAnim;
cgi.G2API_GetBoneAnim = CL_G2API_GetBoneAnim;
cgi.G2API_GetBoneFrame = CL_G2API_GetBoneFrame;
cgi.G2API_GetGLAName = CL_G2API_GetGLAName;
cgi.G2API_CopyGhoul2Instance = CL_G2API_CopyGhoul2Instance;
cgi.G2API_CopySpecificGhoul2Model = CL_G2API_CopySpecificGhoul2Model;
cgi.G2API_DuplicateGhoul2Instance = CL_G2API_DuplicateGhoul2Instance;
cgi.G2API_HasGhoul2ModelOnIndex = CL_G2API_HasGhoul2ModelOnIndex;
cgi.G2API_RemoveGhoul2Model = CL_G2API_RemoveGhoul2Model;
cgi.G2API_SkinlessModel = CL_G2API_SkinlessModel;
cgi.G2API_GetNumGoreMarks = CL_G2API_GetNumGoreMarks;
cgi.G2API_AddSkinGore = CL_G2API_AddSkinGore;
cgi.G2API_ClearSkinGore = CL_G2API_ClearSkinGore;
cgi.G2API_Ghoul2Size = CL_G2API_Ghoul2Size;
cgi.G2API_AddBolt = CL_G2API_AddBolt;
cgi.G2API_AttachEnt = CL_G2API_AttachEnt;
cgi.G2API_SetBoltInfo = CL_G2API_SetBoltInfo;
cgi.G2API_SetRootSurface = CL_G2API_SetRootSurface;
cgi.G2API_SetSurfaceOnOff = CL_G2API_SetSurfaceOnOff;
cgi.G2API_SetNewOrigin = CL_G2API_SetNewOrigin;
cgi.G2API_DoesBoneExist = CL_G2API_DoesBoneExist;
cgi.G2API_GetSurfaceRenderStatus = CL_G2API_GetSurfaceRenderStatus;
cgi.G2API_GetTime = CL_G2API_GetTime;
cgi.G2API_SetTime = CL_G2API_SetTime;
cgi.G2API_AbsurdSmoothing = CL_G2API_AbsurdSmoothing;
cgi.G2API_SetRagDoll = CL_G2API_SetRagDoll;
cgi.G2API_AnimateG2Models = CL_G2API_AnimateG2Models;
cgi.G2API_RagPCJConstraint = CL_G2API_RagPCJConstraint;
cgi.G2API_RagPCJGradientSpeed = CL_G2API_RagPCJGradientSpeed;
cgi.G2API_RagEffectorGoal = CL_G2API_RagEffectorGoal;
cgi.G2API_GetRagBonePos = CL_G2API_GetRagBonePos;
cgi.G2API_RagEffectorKick = CL_G2API_RagEffectorKick;
cgi.G2API_RagForceSolve = CL_G2API_RagForceSolve;
cgi.G2API_SetBoneIKState = CL_G2API_SetBoneIKState;
cgi.G2API_IKMove = CL_G2API_IKMove;
cgi.G2API_RemoveBone = CL_G2API_RemoveBone;
cgi.G2API_AttachInstanceToEntNum = CL_G2API_AttachInstanceToEntNum;
cgi.G2API_ClearAttachedInstance = CL_G2API_ClearAttachedInstance;
cgi.G2API_CleanEntAttachments = CL_G2API_CleanEntAttachments;
cgi.G2API_OverrideServer = CL_G2API_OverrideServer;
cgi.G2API_GetSurfaceName = CL_G2API_GetSurfaceName;
cgi.ext.R_Font_StrLenPixels = re->ext.Font_StrLenPixels;
GetCGameAPI = (GetCGameAPI_t)cgvm->GetModuleAPI;
ret = GetCGameAPI( CGAME_API_VERSION, &cgi );
if ( !ret ) {
//free VM?
cls.cgameStarted = qfalse;
Com_Error( ERR_FATAL, "GetGameAPI failed on %s", dllName );
}
cge = ret;
return;
}
// fall back to legacy syscall/vm_call api
cgvm = VM_CreateLegacy( VM_CGAME, CL_CgameSystemCalls );
if ( !cgvm ) {
cls.cgameStarted = qfalse;
Com_Error( ERR_DROP, "VM_CreateLegacy on cgame failed" );
}
}
void CL_UnbindCGame( void ) {
CGVM_Shutdown();
VM_Free( cgvm );
cgvm = NULL;
}