Esempio n. 1
0
/*
====================
CL_UISystemCalls

The ui module is making a system call
====================
*/
int CL_UISystemCalls( int *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:
		return (int)strncpy( (char *)VMA(1), (const char *)VMA(2), args[3] );
	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 UI_ERROR:
		Com_Error( ERR_DROP, "%s", VMA(1) );
		return 0;

	case UI_PRINT:
		Com_Printf( "%s", VMA(1) );
		return 0;

	case UI_MILLISECONDS:
		return Sys_Milliseconds();

	case UI_CVAR_REGISTER:
		Cvar_Register( (vmCvar_t *)VMA(1), (const char *)VMA(2), (const char *)VMA(3), args[4] ); 
		return 0;

	case UI_CVAR_UPDATE:
		Cvar_Update( (vmCvar_t *)VMA(1) );
		return 0;

	case UI_CVAR_SET:
		Cvar_Set( (const char *)VMA(1), (const char *)VMA(2) );
		return 0;

	case UI_CVAR_VARIABLEVALUE:
		return FloatAsInt( Cvar_VariableValue( (const char *)VMA(1) ) );

	case UI_CVAR_VARIABLESTRINGBUFFER:
		Cvar_VariableStringBuffer( (const char *)VMA(1), (char *)VMA(2), args[3] );
		return 0;

	case UI_CVAR_SETVALUE:
		Cvar_SetValue( (const char *)VMA(1), VMF(2) );
		return 0;

	case UI_CVAR_RESET:
		Cvar_Reset( (const char *)VMA(1) );
		return 0;

	case UI_CVAR_CREATE:
		Cvar_Get( (const char *)VMA(1), (const char *)VMA(2), args[3] );
		return 0;

	case UI_CVAR_INFOSTRINGBUFFER:
		Cvar_InfoStringBuffer( args[1], (char *)VMA(2), args[3] );
		return 0;

	case UI_ARGC:
		return Cmd_Argc();

	case UI_ARGV:
		Cmd_ArgvBuffer( args[1], (char *)VMA(2), args[3] );
		return 0;

	case UI_CMD_EXECUTETEXT:
		Cbuf_ExecuteText( args[1], (const char *)VMA(2) );
		return 0;

	case UI_FS_FOPENFILE:
		return FS_FOpenFileByMode( (const char *)VMA(1), (int *)VMA(2), (fsMode_t)args[3] );

	case UI_FS_READ:
		FS_Read2( VMA(1), args[2], args[3] );
		return 0;

	case UI_FS_WRITE:
		FS_Write( VMA(1), args[2], args[3] );
		return 0;

	case UI_FS_FCLOSEFILE:
		FS_FCloseFile( args[1] );
		return 0;

	case UI_FS_GETFILELIST:
		return FS_GetFileList( (const char *)VMA(1), (const char *)VMA(2), (char *)VMA(3), args[4] );

	case UI_R_REGISTERMODEL:
		return re.RegisterModel( (const char *)VMA(1) );

	case UI_R_REGISTERSKIN:
		return re.RegisterSkin( (const char *)VMA(1) );

	case UI_R_REGISTERSHADERNOMIP:
		return re.RegisterShaderNoMip( (const char *)VMA(1) );

	case UI_R_SHADERNAMEFROMINDEX:
		{
			char *gameMem = (char *)VMA(1);
			const char *retMem = re.ShaderNameFromIndex(args[2]);
			if (retMem)
			{
				strcpy(gameMem, retMem);
			}
			else
			{
				gameMem[0] = 0;
			}
		}
		return 0;

	case UI_R_CLEARSCENE:
		re.ClearScene();
		return 0;

	case UI_R_ADDREFENTITYTOSCENE:
		re.AddRefEntityToScene( (const refEntity_t *)VMA(1) );
		return 0;

	case UI_R_ADDPOLYTOSCENE:
		re.AddPolyToScene( args[1], args[2], (const polyVert_t *)VMA(3), 1 );
		return 0;

	case UI_R_ADDLIGHTTOSCENE:
#ifdef VV_LIGHTING
		VVLightMan.RE_AddLightToScene( (const float *)VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) );
#else
		re.AddLightToScene( (const float *)VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) );
#endif
		return 0;

	case UI_R_RENDERSCENE:
		re.RenderScene( (const refdef_t *)VMA(1) );
		return 0;

	case UI_R_SETCOLOR:
		re.SetColor( (const float *)VMA(1) );
		return 0;

	case UI_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 UI_R_MODELBOUNDS:
		re.ModelBounds( args[1], (float *)VMA(2), (float *)VMA(3) );
		return 0;

	case UI_UPDATESCREEN:
		SCR_UpdateScreen();
		return 0;

	case UI_CM_LERPTAG:
		re.LerpTag( (orientation_t *)VMA(1), args[2], args[3], args[4], VMF(5), (const char *)VMA(6) );
		return 0;

	case UI_S_REGISTERSOUND:
		return S_RegisterSound( (const char *)VMA(1) );

	case UI_S_STARTLOCALSOUND:
		S_StartLocalSound( args[1], args[2] );
		return 0;

	case UI_KEY_KEYNUMTOSTRINGBUF:
		Key_KeynumToStringBuf( args[1], (char *)VMA(2), args[3] );
		return 0;

	case UI_KEY_GETBINDINGBUF:
		Key_GetBindingBuf( args[1], (char *)VMA(2), args[3] );
		return 0;

	case UI_KEY_SETBINDING:
		Key_SetBinding( args[1], (const char *)VMA(2) );
		return 0;

	case UI_KEY_ISDOWN:
		return Key_IsDown( args[1] );

	case UI_KEY_GETOVERSTRIKEMODE:
		return Key_GetOverstrikeMode();

	case UI_KEY_SETOVERSTRIKEMODE:
		Key_SetOverstrikeMode( (qboolean)args[1] );
		return 0;

	case UI_KEY_CLEARSTATES:
		Key_ClearStates();
		return 0;

	case UI_KEY_GETCATCHER:
		return Key_GetCatcher();

	case UI_KEY_SETCATCHER:
		Key_SetCatcher( args[1] );
		return 0;

	case UI_GETCLIPBOARDDATA:
		GetClipboardData( (char *)VMA(1), args[2] );
		return 0;

	case UI_GETCLIENTSTATE:
		GetClientState( (uiClientState_t *)VMA(1) );
		return 0;		

	case UI_GETGLCONFIG:
		CL_GetGlconfig( (glconfig_t *)VMA(1) );
		return 0;

	case UI_GETCONFIGSTRING:
		return GetConfigString( args[1], (char *)VMA(2), args[3] );

	case UI_LAN_LOADCACHEDSERVERS:
		LAN_LoadCachedServers();
		return 0;

	case UI_LAN_SAVECACHEDSERVERS:
		LAN_SaveServersToCache();
		return 0;

	case UI_LAN_ADDSERVER:
		return LAN_AddServer(args[1], (const char *)VMA(2), (const char *)VMA(3));

	case UI_LAN_REMOVESERVER:
		LAN_RemoveServer(args[1], (const char *)VMA(2));
		return 0;

	case UI_LAN_GETPINGQUEUECOUNT:
		return LAN_GetPingQueueCount();

	case UI_LAN_CLEARPING:
		LAN_ClearPing( args[1] );
		return 0;

	case UI_LAN_GETPING:
		LAN_GetPing( args[1], (char *)VMA(2), args[3], (int *)VMA(4) );
		return 0;

	case UI_LAN_GETPINGINFO:
		LAN_GetPingInfo( args[1], (char *)VMA(2), args[3] );
		return 0;

	case UI_LAN_GETSERVERCOUNT:
		return LAN_GetServerCount(args[1]);

	case UI_LAN_GETSERVERADDRESSSTRING:
		LAN_GetServerAddressString( args[1], args[2], (char *)VMA(3), args[4] );
		return 0;

	case UI_LAN_GETSERVERINFO:
		LAN_GetServerInfo( args[1], args[2], (char *)VMA(3), args[4] );
		return 0;

	case UI_LAN_GETSERVERPING:
		return LAN_GetServerPing( args[1], args[2] );

	case UI_LAN_MARKSERVERVISIBLE:
		LAN_MarkServerVisible( args[1], args[2], (qboolean)args[3] );
		return 0;

	case UI_LAN_SERVERISVISIBLE:
		return LAN_ServerIsVisible( args[1], args[2] );

	case UI_LAN_UPDATEVISIBLEPINGS:
		return LAN_UpdateVisiblePings( args[1] );

	case UI_LAN_RESETPINGS:
		LAN_ResetPings( args[1] );
		return 0;

	case UI_LAN_SERVERSTATUS:
		return LAN_GetServerStatus( (char *)VMA(1), (char *)VMA(2), args[3] );

	case UI_LAN_COMPARESERVERS:
		return LAN_CompareServers( args[1], args[2], args[3], args[4], args[5] );

	case UI_MEMORY_REMAINING:
		return Hunk_MemoryRemaining();

#ifdef USE_CD_KEY
	case UI_GET_CDKEY:
		CLUI_GetCDKey( (char *)VMA(1), args[2] );
		return 0;

	case UI_SET_CDKEY:
		CLUI_SetCDKey( (char *)VMA(1) );
		return 0;
#endif	// USE_CD_KEY

	case UI_R_REGISTERFONT:
		return re.RegisterFont( (const char *)VMA(1) );

	case UI_R_FONT_STRLENPIXELS:
		return re.Font_StrLenPixels( (const char *)VMA(1), args[2], VMF(3) );

	case UI_R_FONT_STRLENCHARS:
		return re.Font_StrLenChars( (const char *)VMA(1) );

	case UI_R_FONT_STRHEIGHTPIXELS:
		return re.Font_HeightPixels( args[1], VMF(2) );

	case UI_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 UI_LANGUAGE_ISASIAN:
		return re.Language_IsAsian();

	case UI_LANGUAGE_USESSPACES:
		return re.Language_UsesSpaces();

	case UI_ANYLANGUAGE_READCHARFROMSTRING:
		return re.AnyLanguage_ReadCharFromString( (const char *)VMA(1), (int *) VMA(2), (qboolean *) VMA(3) );

	case UI_PC_ADD_GLOBAL_DEFINE:
		return botlib_export->PC_AddGlobalDefine( (char *)VMA(1) );
	case UI_PC_LOAD_SOURCE:
		return botlib_export->PC_LoadSourceHandle( (const char *)VMA(1) );
	case UI_PC_FREE_SOURCE:
		return botlib_export->PC_FreeSourceHandle( args[1] );
	case UI_PC_READ_TOKEN:
		return botlib_export->PC_ReadTokenHandle( args[1], (struct pc_token_s *)VMA(2) );
	case UI_PC_SOURCE_FILE_AND_LINE:
		return botlib_export->PC_SourceFileAndLine( args[1], (char *)VMA(2), (int *)VMA(3) );
	case UI_PC_LOAD_GLOBAL_DEFINES:
		return botlib_export->PC_LoadGlobalDefines ( (char *)VMA(1) );
	case UI_PC_REMOVE_ALL_GLOBAL_DEFINES:
		botlib_export->PC_RemoveAllGlobalDefines ( );
		return 0;

	case UI_S_STOPBACKGROUNDTRACK:
		S_StopBackgroundTrack();
		return 0;
	case UI_S_STARTBACKGROUNDTRACK:
		S_StartBackgroundTrack( (const char *)VMA(1), (const char *)VMA(2), qfalse);
		return 0;

	case UI_REAL_TIME:
		return Com_RealTime( (struct qtime_s *)VMA(1) );

	case UI_CIN_PLAYCINEMATIC:
	  Com_DPrintf("UI_CIN_PlayCinematic\n");
	  return CIN_PlayCinematic((const char *)VMA(1), args[2], args[3], args[4], args[5], args[6]);

	case UI_CIN_STOPCINEMATIC:
	  return CIN_StopCinematic(args[1]);

	case UI_CIN_RUNCINEMATIC:
	  return CIN_RunCinematic(args[1]);

	case UI_CIN_DRAWCINEMATIC:
	  CIN_DrawCinematic(args[1]);
	  return 0;

	case UI_CIN_SETEXTENTS:
	  CIN_SetExtents(args[1], args[2], args[3], args[4], args[5]);
	  return 0;

	case UI_R_REMAP_SHADER:
		re.RemapShader( (const char *)VMA(1), (const char *)VMA(2), (const char *)VMA(3) );
		return 0;

#ifdef USE_CD_KEY
	case UI_VERIFY_CDKEY:
		return CL_CDKeyValidate((const char *)VMA(1), (const char *)VMA(2));
#endif // USE_CD_KEY

	case UI_SP_GETNUMLANGUAGES:
		return SE_GetNumLanguages();

	case UI_SP_GETLANGUAGENAME:
		char *languageName,*holdName;

		holdName = ((char *)VMA(2));
		languageName = (char *) SE_GetLanguageName((const int)VMA(1));
		Q_strncpyz( holdName, languageName,128 );
		return 0;

	case UI_SP_GETSTRINGTEXTSTRING:
		const char* text;

		assert(VMA(1));
		assert(VMA(2));
		text = SE_GetString((const char *) VMA(1));
		Q_strncpyz( (char *) VMA(2), text, args[3] );
		return qtrue;

/*
Ghoul2 Insert Start
*/
/*
Ghoul2 Insert Start
*/
		
	case UI_G2_LISTSURFACES:
		G2API_ListSurfaces( (CGhoul2Info *) args[1] );
		return 0;

	case UI_G2_LISTBONES:
		G2API_ListBones( (CGhoul2Info *) args[1], args[2]);
		return 0;

	case UI_G2_HAVEWEGHOULMODELS:
		return G2API_HaveWeGhoul2Models( *((CGhoul2Info_v *)args[1]) );

	case UI_G2_SETMODELS:
		G2API_SetGhoul2ModelIndexes( *((CGhoul2Info_v *)args[1]),(qhandle_t *)VMA(2),(qhandle_t *)VMA(3));
		return 0;

	case UI_G2_GETBOLT:
		return G2API_GetBoltMatrix(*((CGhoul2Info_v *)args[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 UI_G2_GETBOLT_NOREC:
		gG2_GBMNoReconstruct = qtrue;
		return G2API_GetBoltMatrix(*((CGhoul2Info_v *)args[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 UI_G2_GETBOLT_NOREC_NOROT:
		gG2_GBMNoReconstruct = qtrue;
		gG2_GBMUseSPMethod = qtrue;
		return G2API_GetBoltMatrix(*((CGhoul2Info_v *)args[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 UI_G2_INITGHOUL2MODEL:
#ifdef _FULL_G2_LEAK_CHECKING
		g_G2AllocServer = 0;
#endif
		return	G2API_InitGhoul2Model((CGhoul2Info_v **)VMA(1), (const char *)VMA(2), args[3], (qhandle_t) args[4],
									  (qhandle_t) args[5], args[6], args[7]);


	case UI_G2_COLLISIONDETECT:
	case UI_G2_COLLISIONDETECTCACHE:
		return 0; //not supported for ui

	case UI_G2_ANGLEOVERRIDE:
		return G2API_SetBoneAngles(*((CGhoul2Info_v *)args[1]), args[2], (const char *)VMA(3), (float *)VMA(4), args[5],
							 (const Eorientations) args[6], (const Eorientations) args[7], (const Eorientations) args[8],
							 (qhandle_t *)VMA(9), args[10], args[11] );
	
	case UI_G2_CLEANMODELS:
#ifdef _FULL_G2_LEAK_CHECKING
		g_G2AllocServer = 0;
#endif
		G2API_CleanGhoul2Models((CGhoul2Info_v **)VMA(1));
	//	G2API_CleanGhoul2Models((CGhoul2Info_v **)args[1]);
		return 0;

	case UI_G2_PLAYANIM:
		return G2API_SetBoneAnim(*((CGhoul2Info_v *)args[1]), args[2], (const char *)VMA(3), args[4], args[5],
								args[6], VMF(7), args[8], VMF(9), args[10]);

	case UI_G2_GETBONEANIM:
		{
			CGhoul2Info_v &g2 = *((CGhoul2Info_v *)args[1]);
			int modelIndex = args[10];

			return G2API_GetBoneAnim(&g2[modelIndex], (const char*)VMA(2), args[3], (float *)VMA(4), (int *)VMA(5),
								(int *)VMA(6), (int *)VMA(7), (float *)VMA(8), (int *)VMA(9));
		}

	case UI_G2_GETBONEFRAME:
		{ //rwwFIXMEFIXME: Just make a G2API_GetBoneFrame func too. This is dirty.
			CGhoul2Info_v &g2 = *((CGhoul2Info_v *)args[1]);
			int modelIndex = args[6];
			int iDontCare1 = 0, iDontCare2 = 0, iDontCare3 = 0;
			float fDontCare1 = 0;

			return G2API_GetBoneAnim(&g2[modelIndex], (const char*)VMA(2), args[3], (float *)VMA(4), &iDontCare1,
								&iDontCare2, &iDontCare3, &fDontCare1, (int *)VMA(5));
		}

	case UI_G2_GETGLANAME:
		//	return (int)G2API_GetGLAName(*((CGhoul2Info_v *)VMA(1)), args[2]);
		{
			char *point = ((char *)VMA(3));
			char *local;
			local = G2API_GetGLAName(*((CGhoul2Info_v *)args[1]), args[2]);
			if (local)
			{
				strcpy(point, local);
			}
		}
		return 0;

	case UI_G2_COPYGHOUL2INSTANCE:
		return (int)G2API_CopyGhoul2Instance(*((CGhoul2Info_v *)args[1]), *((CGhoul2Info_v *)args[2]), args[3]);

	case UI_G2_COPYSPECIFICGHOUL2MODEL:
		G2API_CopySpecificG2Model(*((CGhoul2Info_v *)args[1]), args[2], *((CGhoul2Info_v *)args[3]), args[4]);
		return 0;

	case UI_G2_DUPLICATEGHOUL2INSTANCE:
#ifdef _FULL_G2_LEAK_CHECKING
		g_G2AllocServer = 0;
#endif
		G2API_DuplicateGhoul2Instance(*((CGhoul2Info_v *)args[1]), (CGhoul2Info_v **)VMA(2));
		return 0;

	case UI_G2_HASGHOUL2MODELONINDEX:
		return (int)G2API_HasGhoul2ModelOnIndex((CGhoul2Info_v **)VMA(1), args[2]);
		//return (int)G2API_HasGhoul2ModelOnIndex((CGhoul2Info_v **)args[1], args[2]);

	case UI_G2_REMOVEGHOUL2MODEL:
#ifdef _FULL_G2_LEAK_CHECKING
		g_G2AllocServer = 0;
#endif
		return (int)G2API_RemoveGhoul2Model((CGhoul2Info_v **)VMA(1), args[2]);
		//return (int)G2API_RemoveGhoul2Model((CGhoul2Info_v **)args[1], args[2]);

	case UI_G2_ADDBOLT:
		return G2API_AddBolt(*((CGhoul2Info_v *)args[1]), args[2], (const char *)VMA(3));

//	case UI_G2_REMOVEBOLT:
//		return G2API_RemoveBolt(*((CGhoul2Info_v *)VMA(1)), args[2]);

	case UI_G2_SETBOLTON:
		G2API_SetBoltInfo(*((CGhoul2Info_v *)args[1]), args[2], args[3]);
		return 0;

#ifdef _SOF2	
	case UI_G2_ADDSKINGORE:
		G2API_AddSkinGore(*((CGhoul2Info_v *)args[1]),*(SSkinGoreData *)VMA(2));
		return 0;
#endif // _SOF2
/*
Ghoul2 Insert End
*/
	case UI_G2_SETROOTSURFACE:
		return G2API_SetRootSurface(*((CGhoul2Info_v *)args[1]), args[2], (const char *)VMA(3));

	case UI_G2_SETSURFACEONOFF:
		return G2API_SetSurfaceOnOff(*((CGhoul2Info_v *)args[1]), (const char *)VMA(2), /*(const int)VMA(3)*/args[3]);

	case UI_G2_SETNEWORIGIN:
		return G2API_SetNewOrigin(*((CGhoul2Info_v *)args[1]), /*(const int)VMA(2)*/args[2]);

	case UI_G2_GETTIME:
		return G2API_GetTime(0);

	case UI_G2_SETTIME:
		G2API_SetTime(args[1], args[2]);
		return 0;

	case UI_G2_SETRAGDOLL:
		return 0; //not supported for ui
		break;
	case UI_G2_ANIMATEG2MODELS:
		return 0; //not supported for ui
		break;

	case UI_G2_SETBONEIKSTATE:
		return G2API_SetBoneIKState(*((CGhoul2Info_v *)args[1]), args[2], (const char *)VMA(3), args[4], (sharedSetBoneIKStateParams_t *)VMA(5));
	case UI_G2_IKMOVE:
		return G2API_IKMove(*((CGhoul2Info_v *)args[1]), args[2], (sharedIKMoveParams_t *)VMA(3));

	case UI_G2_GETSURFACENAME:
		{ //Since returning a pointer in such a way to a VM seems to cause MASSIVE FAILURE<tm>, we will shove data into the pointer the vm passes instead
			char *point = ((char *)VMA(4));
			char *local;
			int modelindex = args[3];

			CGhoul2Info_v &g2 = *((CGhoul2Info_v *)args[1]);

			local = G2API_GetSurfaceName(&g2[modelindex], args[2]);
			if (local)
			{
				strcpy(point, local);
			}
		}

		return 0;
	case UI_G2_SETSKIN:
		{
			CGhoul2Info_v &g2 = *((CGhoul2Info_v *)args[1]);
			int modelIndex = args[2];
			
			return G2API_SetSkin(&g2[modelIndex], args[3], args[4]);
		}

	case UI_G2_ATTACHG2MODEL:
		{
			CGhoul2Info_v *g2From = ((CGhoul2Info_v *)args[1]);
			CGhoul2Info_v *g2To = ((CGhoul2Info_v *)args[3]);
			
			return G2API_AttachG2Model(g2From[0], args[2], g2To[0], args[4], args[5]);
		}
/*
Ghoul2 Insert End
*/
	default:
		Com_Error( ERR_DROP, "Bad UI system trap: %i", args[0] );

	}

	return 0;
}
Esempio n. 2
0
int CL_CgameSystemCalls( int *args ) {
#ifndef __NO_JK2
    if( Cvar_VariableIntegerValue("com_jk2") )
    {
        args[0] = (int)CL_ConvertJK2SysCall((cgameJK2Import_t)args[0]);
    }
#endif
    switch( args[0] ) {
    case CG_PRINT:
        Com_Printf( "%s", VMA(1) );
        return 0;
    case CG_ERROR:
        Com_Error( ERR_DROP, S_COLOR_RED"%s", VMA(1) );
        return 0;
    case CG_MILLISECONDS:
        return Sys_Milliseconds();
    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_Set( (const char *) VMA(1), (const char *) VMA(2) );
        return 0;
    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_SENDCONSOLECOMMAND:
        Cbuf_AddText( (const char *) VMA(1) );
        return 0;
    case CG_ADDCOMMAND:
        CL_AddCgameCommand( (const char *) VMA(1) );
        return 0;
    case CG_SENDCLIENTCOMMAND:
        CL_AddReliableCommand( (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!
        SCR_UpdateScreen();
        return 0;

#ifdef _XBOX
    case CG_RMG_INIT:
    case CG_CM_REGISTER_TERRAIN:
    case CG_RE_INIT_RENDERER_TERRAIN:
        Com_Error( ERR_FATAL, "ERROR: Terrain unsupported on Xbox.\n" );
#else
    case CG_RMG_INIT:
        /*
        if (!com_sv_running->integer)
        {	// don't do this if we are connected locally
        	if (!TheRandomMissionManager)
        	{
        		TheRandomMissionManager = new CRMManager;
        	}
        	TheRandomMissionManager->SetLandScape( cmg.landScapes[args[1]] );
        	TheRandomMissionManager->LoadMission(qfalse);
        	TheRandomMissionManager->SpawnMission(qfalse);
        	cmg.landScapes[args[1]]->UpdatePatches();
        }
        */ //this is SP.. I guess we're always the client and server.
//		cl.mRMGChecksum = cm.landScapes[args[1]]->get_rand_seed();
        RM_CreateRandomModels(args[1], (const char *)VMA(2));
        //cmg.landScapes[args[1]]->rand_seed(cl.mRMGChecksum);		// restore it, in case we do a vid restart
        cmg.landScape->rand_seed(cmg.landScape->get_rand_seed());
//		TheRandomMissionManager->CreateMap();
        return 0;
    case CG_CM_REGISTER_TERRAIN:
        return CM_RegisterTerrain((const char *)VMA(1), false)->GetTerrainId();

    case CG_RE_INIT_RENDERER_TERRAIN:
        RE_InitRendererTerrain((const char *)VMA(1));
        return 0;
#endif	// _XBOX

    case CG_CM_LOADMAP:
#ifdef _XBOX
        CL_CM_LoadMap( (const char *) VMA(1) );
#else
        CL_CM_LoadMap( (const char *) VMA(1), args[2] );
#endif
        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) VMA(3) );
    case CG_CM_POINTCONTENTS:
        return CM_PointContents( (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] );
        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) );
        return 0;
    case CG_CM_MARKFRAGMENTS:
        return re.MarkFragments( args[1], (float(*)[3]) VMA(2), (const float *) VMA(3), args[4], (float *) VMA(5), args[6], (markFragment_t *) VMA(7) );
    case CG_CM_SNAPPVS:
        CM_SnapPVS((float(*))VMA(1),(byte *) VMA(2));
        return 0;
    case CG_S_STOPSOUNDS:
        S_StopSounds( );
        return 0;

    case CG_S_STARTSOUND:
        // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here
        //	legally during level start where normally the internal s_soundStarted check would return. So ok to hit this.
        if (!cls.cgameStarted) {
            return 0;
        }
        S_StartSound( (float *) VMA(1), args[2], (soundChannel_t)args[3], args[4] );
        return 0;
    case CG_S_UPDATEAMBIENTSET:
        // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here
        //	legally during level start where normally the internal s_soundStarted check would return. So ok to hit this.
        if (!cls.cgameStarted) {
            return 0;
        }
        S_UpdateAmbientSet( (const char *) VMA(1), (float *) VMA(2) );
        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_PARSESETS:
        AS_ParseSets();
        return 0;
    case CG_AS_ADDENTRY:
        AS_AddPrecacheEntry( (const char *) VMA(1) );
        return 0;
    case CG_AS_GETBMODELSOUND:
        return AS_GetBModelSound( (const char *) VMA(1), args[2] );
    case CG_S_STARTLOCALSOUND:
        // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here
        //	legally during level start where normally the internal s_soundStarted check would return. So ok to hit this.
        if (!cls.cgameStarted) {
            return 0;
        }
        S_StartLocalSound( args[1], args[2] );
        return 0;
    case CG_S_CLEARLOOPINGSOUNDS:
        S_ClearLoopingSounds();
        return 0;
    case CG_S_ADDLOOPINGSOUND:
        // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here
        //	legally during level start where normally the internal s_soundStarted check would return. So ok to hit this.
        if (!cls.cgameStarted) {
            return 0;
        }
        S_AddLoopingSound( args[1], (const float *) VMA(2), (const float *) VMA(3), args[4], (soundChannel_t)args[5] );
        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), (float(*)[3]) VMA(3), args[4] );
        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]);
        return 0;
    case CG_S_GETSAMPLELENGTH:
        return S_GetSampleLengthInMilliSeconds(  args[1]);
    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_FONTSTRLENPIXELS:
        return re.Font_StrLenPixels( (const char *) VMA(1), args[2], VMF(3) );
    case CG_R_FONTSTRLENCHARS:
        return re.Font_StrLenChars( (const char *) VMA(1) );
    case CG_R_FONTHEIGHTPIXELS:
        return re.Font_HeightPixels( args[1], VMF(2) );
    case CG_R_FONTDRAWSTRING:
        re.Font_DrawString(args[1],args[2], (const char *) VMA(3), (float*)args[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_READFROMSTRING:
        return re.AnyLanguage_ReadCharFromString( (char *) VMA(1), (int *) VMA(2), (qboolean *) VMA(3) );
    case CG_ANYLANGUAGE_READFROMSTRING2:
        return re.AnyLanguage_ReadCharFromString2( (char **) VMA(1), (qboolean *) VMA(3) );
    case CG_R_SETREFRACTIONPROP:
        tr_distortionAlpha = VMF(1);
        tr_distortionStretch = VMF(2);
        tr_distortionPrePost = (qboolean)args[3];
        tr_distortionNegate = (qboolean)args[4];
        return 0;
    case CG_R_CLEARSCENE:
        re.ClearScene();
        return 0;
    case CG_R_ADDREFENTITYTOSCENE:
        re.AddRefEntityToScene( (const refEntity_t *) VMA(1) );
        return 0;

    case CG_R_INPVS:
        return R_inPVS((float *) VMA(1), (float *) VMA(2));

    case CG_R_GETLIGHTING:
        return re.GetLighting( (const float * ) VMA(1), (float *) VMA(2), (float *) VMA(3), (float *) VMA(4) );
    case CG_R_ADDPOLYTOSCENE:
        re.AddPolyToScene( args[1], args[2], (const polyVert_t *) VMA(3) );
        return 0;
    case CG_R_ADDLIGHTTOSCENE:
#ifdef VV_LIGHTING
        VVLightMan.RE_AddLightToScene ( (const float *) VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) );
#else
        re.AddLightToScene( (const float *) VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) );
#endif
        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;
    // The below was commented out for whatever reason... /me shrugs --eez
    case CG_R_DRAWSCREENSHOT:
        re.DrawStretchRaw( VMF(1), VMF(2), VMF(3), VMF(4), SG_SCR_WIDTH, SG_SCR_HEIGHT, SCR_GetScreenshot(0), 0, qtrue);
        return 0;
    case CG_R_MODELBOUNDS:
        re.ModelBounds( args[1], (float *) VMA(2), (float *) VMA(3) );
        return 0;
    case CG_R_LERPTAG:
        re.LerpTag( (orientation_t *) VMA(1), args[2], args[3], args[4], VMF(5), (const char *) VMA(6) );
        return 0;
    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:
        if (tr.rangedFog <= 0.0f)
        {
            g_oldRangedFog = tr.rangedFog;
        }
        tr.rangedFog = VMF(1);
        if (tr.rangedFog == 0.0f && g_oldRangedFog)
        {   //restore to previous state if applicable
            tr.rangedFog = g_oldRangedFog;
        }
        return 0;
    case CG_R_LA_GOGGLES:
        re.LAGoggles();
        return 0;
    case CG_R_SCISSOR:
        re.Scissor( VMF(1), VMF(2), VMF(3), VMF(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], (usercmd_s *) VMA(2) );
    case CG_SETUSERCMDVALUE:
        CL_SetUserCmdValue( args[1], VMF(2), VMF(3), VMF(4) );
        return 0;
    case CG_SETUSERCMDANGLES:
        CL_SetUserCmdAngles( VMF(1), VMF(2), VMF(3) );
        return 0;
    case COM_SETORGANGLES:
        Com_SetOrgAngles((float *)VMA(1),(float *)VMA(2));
        return 0;
    /*
    Ghoul2 Insert Start
    */

    case CG_G2_LISTSURFACES:
        G2API_ListSurfaces( (CGhoul2Info *) VMA(1) );
        return 0;

    case CG_G2_LISTBONES:
        G2API_ListBones( (CGhoul2Info *) VMA(1), args[2]);
        return 0;

    case CG_G2_HAVEWEGHOULMODELS:
        return G2API_HaveWeGhoul2Models( *((CGhoul2Info_v *)VMA(1)) );

    case CG_G2_SETMODELS:
        G2API_SetGhoul2ModelIndexes( *((CGhoul2Info_v *)VMA(1)),(qhandle_t *)VMA(2),(qhandle_t *)VMA(3));
        return 0;

    /*
    Ghoul2 Insert End
    */

    case CG_R_GET_LIGHT_STYLE:
        re.GetLightStyle(args[1], (byte*) 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_WORLD_EFFECT_COMMAND:
        re.WorldEffectCommand( (const char *) 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], (const char *) VMA(7));

    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_Z_MALLOC:
        return (int)Z_Malloc(args[1], (memtag_t) args[2], qfalse);

    case CG_Z_FREE:
        Z_Free((void *) VMA(1));
        return 0;

    case CG_UI_SETACTIVE_MENU:
        UI_SetActiveMenu((const char *) VMA(1),NULL);
        return 0;

    case CG_UI_MENU_OPENBYNAME:
        Menus_OpenByName((const char *) VMA(1));
        return 0;

    case CG_UI_MENU_RESET:
        Menu_Reset();
        return 0;

    case CG_UI_MENU_NEW:
        Menu_New((char *) VMA(1));
        return 0;

    case CG_UI_PARSE_INT:
        PC_ParseInt((int *) VMA(1));
        return 0;

    case CG_UI_PARSE_STRING:
        PC_ParseString((const char **) VMA(1));
        return 0;

    case CG_UI_PARSE_FLOAT:
        PC_ParseFloat((float *) VMA(1));
        return 0;

    case CG_UI_STARTPARSESESSION:
        return(PC_StartParseSession((char *) VMA(1),(char **) VMA(2)));

    case CG_UI_ENDPARSESESSION:
        PC_EndParseSession((char *) VMA(1));
        return 0;

    case CG_UI_PARSEEXT:
        char **holdPtr;

        holdPtr = (char **) VMA(1);

        if(!holdPtr)
        {
            Com_Error(ERR_FATAL, "CG_UI_PARSEEXT: NULL holdPtr");
        }

        *holdPtr = PC_ParseExt();
        return 0;

    case CG_UI_MENUCLOSE_ALL:
        Menus_CloseAll();
        return 0;

    case CG_UI_MENUPAINT_ALL:
        Menu_PaintAll();
        return 0;

    case CG_UI_STRING_INIT:
        String_Init();
        return 0;

    case CG_UI_GETMENUINFO:
        menuDef_t *menu;
        int		*xPos,*yPos,*w,*h,result;
#ifndef __NO_JK2
        if(!Cvar_VariableIntegerValue("com_jk2"))
        {
#endif

            menu = Menus_FindByName((char *) VMA(1));	// Get menu
            if (menu)
            {
                xPos = (int *) VMA(2);
                *xPos = (int) menu->window.rect.x;
                yPos = (int *) VMA(3);
                *yPos = (int) menu->window.rect.y;
                w = (int *) VMA(4);
                *w = (int) menu->window.rect.w;
                h = (int *) VMA(5);
                *h = (int) menu->window.rect.h;
                result = qtrue;
            }
            else
            {
                result = qfalse;
            }

            return result;
#ifndef __NO_JK2
        }
        else
        {
            menu = Menus_FindByName((char *) VMA(1));	// Get menu
            if (menu)
            {
                xPos = (int *) VMA(2);
                *xPos = (int) menu->window.rect.x;
                yPos = (int *) VMA(3);
                *yPos = (int) menu->window.rect.y;
                result = qtrue;
            }
            else
            {
                result = qfalse;
            }

            return result;
        }
#endif
        break;

    case CG_UI_GETITEMTEXT:
        itemDef_t *item;
        menu = Menus_FindByName((char *) VMA(1));	// Get menu

        if (menu)
        {
            item = (itemDef_s *) Menu_FindItemByName((menuDef_t *) menu, (char *) VMA(2));
            if (item)
            {
                Q_strncpyz( (char *) VMA(3), item->text, 256 );
                result = qtrue;
            }
            else
            {
                result = qfalse;
            }
        }
        else
        {
            result = qfalse;
        }

        return result;

    case CG_UI_GETITEMINFO:
        menu = Menus_FindByName((char *) VMA(1));	// Get menu

        if (menu)
        {
            qhandle_t *background;

            item = (itemDef_s *) Menu_FindItemByName((menuDef_t *) menu, (char *) VMA(2));
            if (item)
            {
                xPos = (int *) VMA(3);
                *xPos = (int) item->window.rect.x;
                yPos = (int *) VMA(4);
                *yPos = (int) item->window.rect.y;
                w = (int *) VMA(5);
                *w = (int) item->window.rect.w;
                h = (int *) VMA(6);
                *h = (int) item->window.rect.h;

                vec4_t *color;

                color = (vec4_t *) VMA(7);
                if (!color)
                {
                    return qfalse;
                }

                (*color)[0] = (float) item->window.foreColor[0];
                (*color)[1] = (float) item->window.foreColor[1];
                (*color)[2] = (float) item->window.foreColor[2];
                (*color)[3] = (float) item->window.foreColor[3];
                background = (qhandle_t *) VMA(8);
                if (!background)
                {
                    return qfalse;
                }
                *background = item->window.background;

                result = qtrue;
            }
            else
            {
                result = qfalse;
            }
        }
        else
        {
            result = qfalse;
        }

        return result;

    case CG_SP_GETSTRINGTEXTSTRING:
#ifndef __NO_JK2
    case CG_SP_GETSTRINGTEXT:
        if(Cvar_VariableIntegerValue("com_jk2"))
        {
            const char* text;

            assert(VMA(1));
            //		assert(VMA(2));	// can now pass in NULL to just query the size

            if (args[0] == CG_SP_GETSTRINGTEXT)
            {
                text = JK2SP_GetStringText( args[1] );
            }
            else
            {
                text = JK2SP_GetStringTextString( (const char *) VMA(1) );
            }

            if (VMA(2))	// only if dest buffer supplied...
            {
                if ( text[0] )
                {
                    Q_strncpyz( (char *) VMA(2), text, args[3] );
                }
                else
                {
                    Q_strncpyz( (char *) VMA(2), "??", args[3] );
                }
            }
            return strlen(text);
        }
        else
        {
#endif
            const char* text;

            assert(VMA(1));
            text = SE_GetString( (const char *) VMA(1) );

            if (VMA(2))	// only if dest buffer supplied...
            {
                if ( text[0] )
                {
                    Q_strncpyz( (char *) VMA(2), text, args[3] );
                }
                else
                {
                    Com_sprintf( (char *) VMA(2), args[3], "??%s", VMA(1) );
                }
            }
            return strlen(text);
#ifndef __NO_JK2
        }
    //break;

    case CG_SP_REGISTER:
        return JK2SP_Register( (const char *) VMA(1), args[2]?(SP_REGISTER_MENU|SP_REGISTER_REQUIRED):SP_REGISTER_CLIENT );
#endif
    default:
        Com_Error( ERR_DROP, "Bad cgame system trap: %i", args[0] );
    }
    return 0;
}