Updated README.txt

This commit is contained in:
Walter Julius Hennecke 2012-05-05 14:13:02 +02:00
parent 8041829d0a
commit c8f750721c
21 changed files with 51 additions and 1517 deletions

View file

@ -28,6 +28,12 @@ On Windows:
- make clean removes all compiled files (including the - make clean removes all compiled files (including the
shared libraries) shared libraries)
Cross Compiling for Windows:
Not yet but hopefully soon.
Mac OSX:
Not yet but hopefully soon.
Bug Reports and Patch/Feature Suggestions: Bug Reports and Patch/Feature Suggestions:
-------------- --------------
We have a bug report system set up at http://bugs.rpg-x.net We have a bug report system set up at http://bugs.rpg-x.net
@ -36,6 +42,10 @@ please let us know! Also if you fixed a bug in the code of
have coded a new feature feels free suggest us adding it have coded a new feature feels free suggest us adding it
there (please upload a *.diff file). there (please upload a *.diff file).
Note:
As the UberGames bug tracker is down right now use
http://bugs.hennecke-online.net instead.
Contact: Contact:
-------------- --------------
@ -44,8 +54,11 @@ Come join our forum at http://forums.ubergames.net/
Legal Notice: Legal Notice:
------------- -------------
All assets used in this file are copyrighted to the RPG-X Mod and/or their All assets used in this file and/or git repository are copyrighted
original creators. Any external use of these assets without explicit permission to the UberGames and/or their original creators. Any external
from their original creators is not allowed. use of these assets without explicit permission from their original
The RPG-X Mod and its creators cannot be held accountable for any damage that creators is not allowed. Feel free to use the source code included
may have been caused by playing the game. in this file and/or git repository for your own mod as long as you
give full credit to UberGames. The Ubergames and other conributers
to the RPG-X Mod cannot be held accountable for any damage that may
have been caused by playing the game.

View file

@ -954,19 +954,24 @@ void CG_InitConsoleCommands( void ) {
/* temp */ /* temp */
trap_AddCommand("ui_holodeck"); trap_AddCommand("ui_holodeck");
#ifdef XTRA /*
* note:
* - some of these might get removed
* - some of these don't require rpgxEF anymore
* and will be merged into the non rpgxEF version
*/
trap_AddCommand("userlogin"); trap_AddCommand("userlogin");
trap_AddCommand("userAdd"); trap_AddCommand("userAdd");
trap_AddCommand("sql_setup"); trap_AddCommand("sql_setup");
trap_AddCommand("userMod"); trap_AddCommand("userMod");
trap_AddCommand("userDel"); trap_AddCommand("userDel");
#endif
/* lua */
#ifdef CG_LUA #ifdef CG_LUA
trap_AddCommand("lua_status"); trap_AddCommand("lua_status");
#endif #endif
/* CCAM */ /* Cinematic Cam testing */
trap_AddCommand("camtest"); trap_AddCommand("camtest");
trap_AddCommand("camtestend"); trap_AddCommand("camtestend");
} }

View file

@ -2493,8 +2493,7 @@ void CG_InitLensFlare( vec3_t worldCoord,
//TiM - Allow parts of the lerp code to update the 3rd view if need be //TiM - Allow parts of the lerp code to update the 3rd view if need be
void CG_ResetThirdPersonViewDamp ( void ); void CG_ResetThirdPersonViewDamp ( void );
#ifdef XTRA /* shader remapping */
void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ); void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset );
void CG_ShaderStateChanged(void); void CG_ShaderStateChanged(void);
#endif

View file

@ -1826,9 +1826,8 @@ void CG_Init( int serverMessageNum, int serverCommandSequence ) {
//TiM2 - Separated this out so class data has to be locally accessed now //TiM2 - Separated this out so class data has to be locally accessed now
//CG_ParseClassData(); //CG_ParseClassData();
#ifdef XTRA /* shader remapping */
CG_ShaderStateChanged(); CG_ShaderStateChanged();
#endif
if(grp_berp.integer) if(grp_berp.integer)
CG_Printf(S_COLOR_YELLOW "GSIO01 and Ubergames greet Brave Explorers.\n"); CG_Printf(S_COLOR_YELLOW "GSIO01 and Ubergames greet Brave Explorers.\n");

View file

@ -7,9 +7,6 @@
// //
// rpgxEF?
#define XTRA 1
#define CMD_BACKUP 64 #define CMD_BACKUP 64
#define CMD_MASK (CMD_BACKUP - 1) #define CMD_MASK (CMD_BACKUP - 1)
// allow a lot of command backups for very fast systems // allow a lot of command backups for very fast systems
@ -126,10 +123,7 @@ typedef enum {
CG_CEIL, CG_CEIL,
CG_TESTPRINTINT, CG_TESTPRINTINT,
CG_TESTPRINTFLOAT, CG_TESTPRINTFLOAT,
#ifdef XTRA
CG_R_REMAP_SHADER = 200, CG_R_REMAP_SHADER = 200,
#endif
} cgameImport_t; } cgameImport_t;
//these must match up with cg_syscalls.asm //these must match up with cg_syscalls.asm

View file

@ -340,12 +340,9 @@ static void CG_ConfigStringModified( void ) {
cgs.redflag = str[0] - '0'; cgs.redflag = str[0] - '0';
cgs.blueflag = str[1] - '0'; cgs.blueflag = str[1] - '0';
} }
#ifdef XTRA
else if(num == CS_SHADERSTATE) { else if(num == CS_SHADERSTATE) {
CG_ShaderStateChanged(); CG_ShaderStateChanged();
} }
#endif
} }
@ -618,7 +615,6 @@ char *ConcatArgs2( int start ) {
return line; return line;
} }
#ifdef XTRA
/* /*
===================== =====================
CG_ShaderStateChanged CG_ShaderStateChanged
@ -661,7 +657,6 @@ void CG_ShaderStateChanged(void) {
} }
} }
} }
#endif
/* /*
@ -866,7 +861,7 @@ static void CG_ServerCommand( void ) {
return; return;
} }
#ifdef XTRA /* shader remap */
if ( Q_stricmp (cmd, "remapShader") == 0 ) if ( Q_stricmp (cmd, "remapShader") == 0 )
{ {
if (trap_Argc() == 4) if (trap_Argc() == 4)
@ -884,7 +879,6 @@ static void CG_ServerCommand( void ) {
return; return;
} }
#endif
if(!strcmp(cmd, "ui_transporter")) { if(!strcmp(cmd, "ui_transporter")) {
trap_SendConsoleCommand(va("ui_transporter %s", CG_Argv(1))); trap_SendConsoleCommand(va("ui_transporter %s", CG_Argv(1)));
@ -906,12 +900,11 @@ static void CG_ServerCommand( void ) {
return; return;
} }
#ifdef XTRA /* TODO remove me? */
if(!strcmp(cmd, "sqlkey")) { if(!strcmp(cmd, "sqlkey")) {
trap_SendClientCommand(va("sqlkey %i", CG_Argv(1))); trap_SendClientCommand(va("sqlkey %i", CG_Argv(1)));
return; return;
} }
#endif
CG_Printf( "Unknown client game command: %s\n", cmd ); CG_Printf( "Unknown client game command: %s\n", cmd );
} }

View file

@ -286,8 +286,8 @@ int trap_MemoryRemaining( void ) {
return syscall( CG_MEMORY_REMAINING ); return syscall( CG_MEMORY_REMAINING );
} }
#ifdef XTRA /* shader remap */
void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ) { void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ) {
syscall( CG_R_REMAP_SHADER, oldShader, newShader, timeOffset ); syscall( CG_R_REMAP_SHADER, oldShader, newShader, timeOffset );
} }
#endif

View file

@ -6,11 +6,7 @@
#define MAX_DLIGHTS 32 // can't be increased, because bit flags are used on surfaces #define MAX_DLIGHTS 32 // can't be increased, because bit flags are used on surfaces
#ifndef XTRA
#define ENTITYNUM_BITS 10 // can't be increased without changing drawsurf bit packing
#else
#define ENTITYNUM_BITS 11 // can't be increased without changing drawsurf bit packing #define ENTITYNUM_BITS 11 // can't be increased without changing drawsurf bit packing
#endif
#define MAX_ENTITIES ((1<<ENTITYNUM_BITS) - 1) #define MAX_ENTITIES ((1<<ENTITYNUM_BITS) - 1)
// renderfx flags // renderfx flags

View file

@ -2,8 +2,6 @@
// //
// bg_public.h -- definitions shared by both the server game and client game modules // bg_public.h -- definitions shared by both the server game and client game modules
// are we compiling for rpgxEF?
#define XTRA 1
// meh somehow preprocessor G_LUA won't work for me // meh somehow preprocessor G_LUA won't work for me
#define G_LUA 1 #define G_LUA 1
#define CG_LUA 1 #define CG_LUA 1
@ -169,9 +167,8 @@ typedef enum
#define CS_RED_GROUP 16 //!< used to send down what the group the red team is #define CS_RED_GROUP 16 //!< used to send down what the group the red team is
#define CS_BLUE_GROUP 17 //!< used to send down what the group the blue team is #define CS_BLUE_GROUP 17 //!< used to send down what the group the blue team is
#ifdef XTRA /** shader remapping info */
#define CS_SHADERSTATE 18 #define CS_SHADERSTATE 18
#endif
#define CS_ITEMS 27 //!< string of 0's and 1's that tell which items are present #define CS_ITEMS 27 //!< string of 0's and 1's that tell which items are present
//TiM: Ooooh! a gap between 27 + 32! Exploitationism! //TiM: Ooooh! a gap between 27 + 32! Exploitationism!

View file

@ -773,110 +773,6 @@ given a race name, go find all the skins that use it, and randomly select one
/** /**
* given a race name, go find all the skins that use it, and randomly select one * given a race name, go find all the skins that use it, and randomly select one
*/ */
#ifdef Q3_VM
void randomSkin(const char* race, char* model, int current_team, int clientNum)
{
char skinsForRace[MAX_SKINS_FOR_RACE][128];
int howManySkins = 0;
int i,x;
int temp;
int skin_count_check;
char skinNamesAlreadyUsed[16][128];
int current_skin_count = 0;
gentity_t *ent = NULL;
char userinfo[MAX_INFO_STRING];
char temp_model[MAX_QPATH];
memset(skinsForRace, 0, sizeof(skinsForRace));
memset(skinNamesAlreadyUsed, 0, sizeof(skinNamesAlreadyUsed));
// first up, check to see if we want to select a skin from someone that's already playing on this guys team
skin_count_check = g_random_skin_limit.integer;
if (skin_count_check)
{
// sanity check the skins to compare against count
if (skin_count_check > 16)
{
skin_count_check = 16;
}
// now construct an array of the names already used
for (i=0; i<g_maxclients.integer; i++)
{
// did we find enough skins to grab a random one from yet?
if (current_skin_count == skin_count_check)
{
break;
}
ent = g_entities + i;
if (!ent->inuse || i == clientNum)
continue;
// no, so look at the next one, and see if it's in the list we are constructing
// same team?
if (ent->client && ent->client->sess.sessionTeam == current_team)
{
// so what's this clients model then?
trap_GetUserinfo( i, userinfo, sizeof( userinfo ) );
Q_strncpyz( temp_model, Info_ValueForKey (userinfo, "model"), sizeof( temp_model ) );
// check the name
for (x = 0; x< current_skin_count; x++)
{
// are we the same?
if (!Q_stricmp(skinNamesAlreadyUsed[x], temp_model))
{
// yeah - ok we already got this one
break;
}
}
// ok, did we match anything?
if (x == current_skin_count)
{
// no - better add this name in
Q_strncpyz(skinNamesAlreadyUsed[current_skin_count], temp_model, sizeof(skinNamesAlreadyUsed[current_skin_count]));
current_skin_count++;
}
}
}
// ok, array constructed. Did we get enough?
if (current_skin_count >= skin_count_check)
{
// yeah, we did - so select a skin from one of these then
temp = rand() % current_skin_count;
Q_strncpyz( model, skinNamesAlreadyUsed[temp], MAX_QPATH );
ForceClientSkin(model, "");
return;
}
}
// search through each and every skin we can find
for (i=0; i<group_count && howManySkins < MAX_SKINS_FOR_RACE; i++)
{
// if this models race list contains the race we want, then add it to the list
if (legalSkin(group_list[i].text, race))
{
Q_strncpyz( skinsForRace[howManySkins++], group_list[i].name , 128 );
}
}
// set model to a random one
if (howManySkins)
{
temp = rand() % howManySkins;
Q_strncpyz( model, skinsForRace[temp], MAX_QPATH );
}
else
{
model[0] = 0;
}
}
#else
void randomSkin(const char* race, char* model, int current_team, int clientNum) void randomSkin(const char* race, char* model, int current_team, int clientNum)
{ {
char **skinsForRace; char **skinsForRace;
@ -1002,7 +898,6 @@ void randomSkin(const char* race, char* model, int current_team, int clientNum)
free(skinNamesAlreadyUsed); free(skinNamesAlreadyUsed);
} }
#endif
/* /*
=========== ===========
@ -1950,13 +1845,12 @@ void ClientBegin( int clientNum, qboolean careAboutWarmup, qboolean isBot, qbool
} }
#ifdef XTRA /* TODO remove me? */
if(sql_use.integer) { if(sql_use.integer) {
int key = (byte)irandom(4096, 65535); int key = (byte)irandom(4096, 65535);
ent->client->sqlkey = (byte)key; ent->client->sqlkey = (byte)key;
trap_SendServerCommand(ent-g_entities, va("sqlkey \"%i\"", key)); trap_SendServerCommand(ent-g_entities, va("sqlkey \"%i\"", key));
} }
#endif
} }
// WEAPONS - PHENIX1 // WEAPONS - PHENIX1

View file

@ -361,10 +361,8 @@ struct gentity_s {
//*core, // -->falsetarget //*core, // -->falsetarget
//*coreSwap; // -->bluename //*coreSwap; // -->bluename
#ifdef XTRA
char *targetShaderName; //!< shader to remap for shader remapping char *targetShaderName; //!< shader to remap for shader remapping
char *targetShaderNewName; //!< shader to remap to for shader remapping char *targetShaderNewName; //!< shader to remap to for shader remapping
#endif
qboolean tmpEntity; //!< is this a temporal entity? qboolean tmpEntity; //!< is this a temporal entity?
#ifdef G_LUA #ifdef G_LUA
@ -602,12 +600,10 @@ struct gclient_s {
qboolean *universalTrans;*/ qboolean *universalTrans;*/
languageData_t *languages; languageData_t *languages;
#ifdef XTRA
// for sql // for sql
char *userName; //!< username (not player name) in the sql database char *userName; //!< username (not player name) in the sql database
int uid; //!< uiser id of the player in the sql database int uid; //!< uiser id of the player in the sql database
byte sqlkey; //!< random key used to make transmission of the username and password from the ui at least a bit safer byte sqlkey; //!< random key used to make transmission of the username and password from the ui at least a bit safer
#endif
// CCAM // CCAM
vec3_t origViewAngles; vec3_t origViewAngles;
@ -839,9 +835,8 @@ int G_GetEntityByTargetname(const char *targetname, gentity_t *entities[MAX_GENT
int G_GetEntityByTarget(const char *target, gentity_t *entities[MAX_GENTITIES]); int G_GetEntityByTarget(const char *target, gentity_t *entities[MAX_GENTITIES]);
int G_GetEntityByBmodel(char *bmodel, gentity_t *entities[MAX_GENTITIES]); int G_GetEntityByBmodel(char *bmodel, gentity_t *entities[MAX_GENTITIES]);
#ifdef XTRA /* shader remapping */
void AddRemap(const char *oldShader, const char *newShader, float timeOffset); void AddRemap(const char *oldShader, const char *newShader, float timeOffset);
#endif
// //
// g_combat.c // g_combat.c
@ -1546,7 +1541,7 @@ extern vmCvar_t rpg_server6;
// SP level change // SP level change
extern vmCvar_t rpg_allowSPLevelChange; extern vmCvar_t rpg_allowSPLevelChange;
#ifdef XTRA /* TODO some can be removed */
extern vmCvar_t sql_dbName; extern vmCvar_t sql_dbName;
extern vmCvar_t sql_use; extern vmCvar_t sql_use;
extern vmCvar_t sql_server; extern vmCvar_t sql_server;
@ -1554,7 +1549,6 @@ extern vmCvar_t sql_user;
extern vmCvar_t sql_password; extern vmCvar_t sql_password;
extern vmCvar_t sql_port; extern vmCvar_t sql_port;
extern vmCvar_t sql_hash; extern vmCvar_t sql_hash;
#endif
// developer tools // developer tools
extern vmCvar_t dev_showTriggers; extern vmCvar_t dev_showTriggers;
@ -2036,12 +2030,10 @@ struct srvChangeData_s {
char bspname[16][MAX_QPATH]; char bspname[16][MAX_QPATH];
}; };
#ifdef XTRA
/** /**
* Builds the config string for shader remapping. * Builds the config string for shader remapping.
*/ */
const char *BuildShaderStateConfig(void); const char *BuildShaderStateConfig(void);
#endif
typedef struct luaAlertState_s luaAlertState_t; typedef struct luaAlertState_s luaAlertState_t;
struct luaAlertState_s { struct luaAlertState_s {

View file

@ -338,7 +338,7 @@ vmCvar_t rpg_server6;
//! Allow target_levelchange to change the current level? //! Allow target_levelchange to change the current level?
vmCvar_t rpg_allowSPLevelChange; vmCvar_t rpg_allowSPLevelChange;
#ifdef XTRA /* TODO some can be removed */
vmCvar_t sql_dbName; //!< Name of the SQL Database vmCvar_t sql_dbName; //!< Name of the SQL Database
vmCvar_t sql_use; //!< Use SQL? 1 = mysql, 2 = sqlite vmCvar_t sql_use; //!< Use SQL? 1 = mysql, 2 = sqlite
vmCvar_t sql_server; //!< SQL server to connect to (only mysql) vmCvar_t sql_server; //!< SQL server to connect to (only mysql)
@ -613,7 +613,7 @@ static cvarTable_t gameCvarTable[] = {
{ &dev_showTriggers, "dev_showTriggers", "0", CVAR_ARCHIVE, 0, qfalse } { &dev_showTriggers, "dev_showTriggers", "0", CVAR_ARCHIVE, 0, qfalse }
#ifdef XTRA /* TODO some can be removed */
, ,
{ &sql_dbName, "sql_dbName", "rpgx", CVAR_ARCHIVE, 0, qfalse }, { &sql_dbName, "sql_dbName", "rpgx", CVAR_ARCHIVE, 0, qfalse },
{ &sql_use, "sql_use", "0", CVAR_ARCHIVE, 0, qfalse }, { &sql_use, "sql_use", "0", CVAR_ARCHIVE, 0, qfalse },
@ -788,270 +788,6 @@ and parses the class data
for utilization on the server for utilization on the server
and transfer to clients and transfer to clients
**************************/ **************************/
#ifdef Q3_VM
static qboolean G_LoadClassData( char* fileName )
{
char buffer[32000];
char *textPtr, *token;
int fileLen;
fileHandle_t f;
qboolean classValid=qfalse;
int classIndex=0;
int weapon;
int i;
//Init the storage place
memset( &g_classData, 0, sizeof ( g_classData ) );
fileLen = trap_FS_FOpenFile( fileName, &f, FS_READ );
if ( !f ) {
G_Printf( S_COLOR_RED "ERROR: File %s not found.\n", fileName );
return qfalse;
}
if ( fileLen >= sizeof( buffer ) ) {
G_Printf( S_COLOR_RED "ERROR: File %s was way too big.\n", fileName );
trap_FS_FCloseFile( f );
return qfalse;
}
trap_FS_Read( buffer, fileLen, f );
buffer[fileLen] = 0;
trap_FS_FCloseFile( f );
COM_BeginParseSession();
textPtr = buffer;
token = COM_Parse( &textPtr );
if ( !token[0] ) {
G_Printf( S_COLOR_RED "ERROR: No data was found when going to parse the file!\n" );
return qfalse;
}
if ( Q_stricmpn( token, "{", 1 ) ) {
G_Printf( S_COLOR_RED "ERROR: File did not start with a '{' symbol!\n" );
return qfalse;
}
while ( 1 )
{
if ( classIndex >= MAX_CLASSES )
break;
if ( !Q_stricmpn( token, "{", 1 ) )
{
while ( 1 )
{
token = COM_Parse( &textPtr );
if (!token[0]) {
break;
}
if ( !Q_stricmpn( token, "consoleName", 11 ) )
{
if ( COM_ParseString( &textPtr, &token ) )
{
G_Printf( S_COLOR_RED "ERROR: Invalid class console name in class index: %i.\n", classIndex );
SkipBracedSection( &textPtr );
continue;
}
Q_strncpyz( g_classData[classIndex].consoleName, token, sizeof( g_classData[classIndex].consoleName ) );
classValid = qtrue;
//G_Printf( S_COLOR_RED "%s\n", g_classData[classIndex].consoleName );
continue;
}
if ( !Q_stricmpn( token, "formalName", 11 ) )
{
if ( COM_ParseString( &textPtr, &token ) )
{
G_Printf( S_COLOR_RED "ERROR: Invalid class formal name in class index: %i.\n", classIndex );
SkipBracedSection( &textPtr );
continue;
}
Q_strncpyz( g_classData[classIndex].formalName, token, sizeof( g_classData[classIndex].formalName ) );
classValid = qtrue;
//G_Printf( S_COLOR_RED "%s\n", g_classData[classIndex].consoleName );
continue;
}
if ( !Q_stricmpn( token, "message", 7 ) )
{
if ( COM_ParseString( &textPtr, &token ) )
{
G_Printf( S_COLOR_RED "ERROR: Invalid class message in class index: %i.\n", classIndex );
continue;
}
Q_strncpyz( g_classData[classIndex].message, token, sizeof( g_classData[classIndex].message ) );
continue;
}
if ( !Q_stricmpn( token, "modelSkin", 9 ) )
{
if ( COM_ParseString( &textPtr, &token ) )
{
G_Printf( S_COLOR_RED "ERROR: Invalid class skin color in class index: %i.\n", classIndex );
continue;
}
Q_strncpyz( g_classData[classIndex].modelSkin, token, sizeof( g_classData[classIndex].modelSkin ) );
continue;
}
if ( !Q_stricmpn( token, "weapons", 7) )
{
token = COM_Parse( &textPtr );
if ( Q_stricmpn( token, "{", 1 ) )
{
G_Printf( S_COLOR_RED "No opening bracket found for weapons field in class: %i.\n", classIndex );
SkipRestOfLine( &textPtr );
continue;
}
//sub loop
while ( 1 )
{
token = COM_Parse( &textPtr );
if ( !token[0] )
break;
if ( !Q_stricmpn( token, "|", 1 ) )
continue;
if ( !Q_stricmpn( token, "}", 1 ) )
break;
if( !Q_stricmpn( token, "WP_", 3 ) )
{
weapon = GetIDForString( WeaponTable, token );
if ( weapon >= 0 )
{
g_classData[classIndex].weaponsFlags |= ( 1 << weapon );
continue;
}
}
}
continue;
}
if ( !Q_stricmpn( token, "admin", 5 ) )
{
if ( COM_ParseInt( &textPtr, &g_classData[classIndex].isAdmin ) )
{
G_Printf( S_COLOR_RED "ERROR: Class admin check for class %i was invalid.\n", classIndex );
continue;
}
continue;
}
if ( !Q_stricmpn( token, "marine", 6 ) )
{
if ( COM_ParseInt( &textPtr, &g_classData[classIndex].isMarine ) )
{
G_Printf( S_COLOR_RED "ERROR: Class marine check for class %i was invalid.\n", classIndex );
continue;
}
continue;
}
if ( !Q_stricmpn( token, "medical", 7 ) )
{
if ( COM_ParseInt( &textPtr, &g_classData[classIndex].isMedical ) )
{
G_Printf( S_COLOR_RED "ERROR: Class medic check for class %i was invalid.\n", classIndex );
continue;
}
continue;
}
if( !Q_stricmpn( token, "isBorg", 6 ) )
{
if( COM_ParseInt( &textPtr, &g_classData[classIndex].isBorg ) )
{
G_Printf( S_COLOR_RED "ERROR: Class borg check for class %i was invalid.\n", classIndex );
continue;
}
continue;
}
if ( !Q_stricmpn( token, "n00b", 4 ) )
{
if ( COM_ParseInt( &textPtr, &g_classData[classIndex].isn00b ) )
{
G_Printf( S_COLOR_RED "ERROR: Class n00b check for class %i was invalid.\n", classIndex );
continue;
}
continue;
}
//skip the client-side specific entries since they interfere with the parsing
if ( !Q_stricmpn( token, "radarColor", 10 )
|| !Q_stricmpn( token, "iconColor", 9 )
|| !Q_stricmpn( token, "hasRanks", 8 )
|| !Q_stricmpn( token, "noShow", 6 )
)
{
SkipRestOfLine( &textPtr );
continue;
}
if ( !Q_stricmpn( token, "}", 1 ) )
{
break;
}
}
if ( classValid )
{
classIndex++;
classValid = qfalse;
}
}
token = COM_Parse( &textPtr );
if (!token[0])
{
break;
}
}
//build ourselves custom CVARs for each class
for ( i=0; g_classData[i].consoleName[0] && i < MAX_CLASSES; i++ )
{
trap_Cvar_Register( NULL, va("rpg_%sPass", g_classData[i].consoleName ), g_classData[i].consoleName, CVAR_ARCHIVE );
trap_Cvar_Register( NULL, va("rpg_%sFlags", g_classData[i].consoleName ), va("%i", g_classData[i].weaponsFlags), CVAR_ARCHIVE );
}
if ( classIndex > 0 )
{
return qtrue;
}
else
{
G_Printf( S_COLOR_RED "ERROR: No valid classes were found.\n");
return qfalse;
}
}
#else
static qboolean G_LoadClassData( char* fileName ) static qboolean G_LoadClassData( char* fileName )
{ {
char *buffer; char *buffer;
@ -1326,137 +1062,12 @@ static qboolean G_LoadClassData( char* fileName )
return qfalse; return qfalse;
} }
} }
#endif
void BG_LanguageFilename(char *baseName,char *baseExtension,char *finalName); void BG_LanguageFilename(char *baseName,char *baseExtension,char *finalName);
void SP_target_location (gentity_t *ent); void SP_target_location (gentity_t *ent);
holoData_t holoData; holoData_t holoData;
#ifdef Q3_VM
void G_LoadHolodeckFile(void) {
char fileRoute[MAX_QPATH];
char mapRoute[MAX_QPATH];
char info[MAX_INFO_STRING];
fileHandle_t f;
char buffer[20000];
int file_len;
char *txtPtr, *token;
int numProgs = 0;
int i;
//get the map name out of the server data
trap_GetServerinfo( info, sizeof( info ) );
//setup the file route
Com_sprintf( mapRoute, sizeof( mapRoute ), "maps/%s", Info_ValueForKey( info, "mapname" ) );
BG_LanguageFilename( mapRoute, "holodeck", fileRoute );
file_len = trap_FS_FOpenFile( fileRoute, &f, FS_READ );
if ( !file_len )
return;
memset( buffer, 0, sizeof(buffer) );
trap_FS_Read( buffer, file_len, f );
if ( !buffer[0] )
{
G_Printf( S_COLOR_RED "ERROR: Couldn't read in file: %s!\n", fileRoute );
trap_FS_FCloseFile( f );
return;
}
buffer[file_len] = '\0';
trap_FS_FCloseFile( f );
COM_BeginParseSession();
txtPtr = buffer;
while(1) {
token = COM_Parse(&txtPtr);
if(!token[0]) break;
if(!Q_stricmpn(token, "HolodeckData", 12)) {
token = COM_Parse(&txtPtr);
if(Q_stricmpn(token, "{", 1)) {
G_Printf( S_COLOR_RED "ERROR: HolodeckData had no opening brace ( { )!\n");
continue;
}
while(Q_stricmpn(token, "}", 1)) {
token = COM_Parse(&txtPtr);
if(!token[0]) break;
if(!Q_stricmpn(token, "Program", 7)) {
token = COM_Parse(&txtPtr);
if(Q_stricmpn(token, "[", 1)) {
G_Printf( S_COLOR_RED "ERROR: Program had no opening brace ( [ )!\n");
continue;
}
// expected format:
// <string> - target notnull
// <string> - name
// <string> - desc1
// <string> - desc2
// <string> - image
// <string> - iTrigger
// <string> - dTrigger
while(Q_stricmpn(token, "]", 1)) {
if(!token[0]) break;
if(numProgs >= 5) return;
// targetname of info_notnull
token = COM_Parse(&txtPtr);
Q_strncpyz(holoData.target[numProgs], token, sizeof(holoData.target[numProgs]));
// parse name
token = COM_Parse(&txtPtr);
Q_strncpyz(holoData.name[numProgs], token, sizeof(holoData.name[numProgs]));
// parse desc1
token = COM_Parse(&txtPtr);
Q_strncpyz(holoData.desc1[numProgs], token, sizeof(holoData.desc1[numProgs]));
// parse desc2
token = COM_Parse(&txtPtr);
Q_strncpyz(holoData.desc2[numProgs], token, sizeof(holoData.desc2[numProgs]));
// parse image
token = COM_Parse(&txtPtr);
Q_strncpyz(holoData.image[numProgs], token, sizeof(holoData.image[numProgs]));
// parse iTrigger
token = COM_Parse(&txtPtr);
Q_strncpyz(holoData.iTrigger[numProgs+1], token, sizeof(holoData.iTrigger[numProgs+1]));
// parse dTrigger
token = COM_Parse(&txtPtr);
Q_strncpyz(holoData.dTrigger[numProgs+1], token, sizeof(holoData.dTrigger[numProgs+1]));
holoData.active = -1;
numProgs++;
token = COM_Parse(&txtPtr);
}
}
}
}
}
for(i = 0; i < MAX_GENTITIES; i++)
if(!strcmp("target_holodeck", &g_entities[i]->classname)) {
strcpy(holoData.iTrigger[0], &g_entities[i]->target);
strcpy(holoData.dTrigger[0], &g_entities[i]->redsound);
break;
}
holoData.numProgs = numProgs;
}
#else
void G_LoadHolodeckFile(void) { void G_LoadHolodeckFile(void) {
char fileRoute[MAX_QPATH]; char fileRoute[MAX_QPATH];
char mapRoute[MAX_QPATH]; char mapRoute[MAX_QPATH];
@ -1582,107 +1193,9 @@ void G_LoadHolodeckFile(void) {
free(buffer); free(buffer);
} }
#endif
srvChangeData_t srvChangeData; srvChangeData_t srvChangeData;
#ifdef Q3_VM
static void G_LoadServerChangeFile(void) {
char fileRoute[MAX_QPATH];
//char mapRoute[MAX_QPATH];
char infoString[MAX_INFO_STRING];
fileHandle_t f;
char buffer[20000];
int file_len;
char *txtPtr, *token;
char *temp;
int cnt = 0;
int i = 0;
BG_LanguageFilename("serverchange", "cfg", fileRoute);
file_len = trap_FS_FOpenFile(fileRoute, &f, FS_READ);
if(!file_len)
return;
memset(buffer, 0, sizeof(buffer));
memset(infoString, 0, sizeof(infoString));
trap_FS_Read(buffer, file_len, f);
if ( !buffer[0] )
{
G_Printf( S_COLOR_RED "ERROR: Couldn't read in file: %s!\n", fileRoute );
trap_FS_FCloseFile( f );
return;
}
buffer[file_len] = '\0';
trap_FS_FCloseFile(f);
COM_BeginParseSession();
txtPtr = buffer;
while(1) {
token = COM_Parse(&txtPtr);
if(!token[0]) break;
if(!Q_stricmp(token, "ServerChangeConfig")) {
token = COM_Parse( &txtPtr );
if ( Q_strncmp( token, "{", 1 ) != 0 )
{
G_Printf( S_COLOR_RED "ERROR: ServerChangeConfig had no opening brace ( { )!\n" );
continue;
}
while(Q_strncmp(token, "}", 1)) {
token = COM_Parse(&txtPtr);
if(!token[0]) break;
if(!Q_stricmp(token, "Server")) {
token = COM_Parse(&txtPtr);
if ( Q_strncmp( token, "[", 1 ) != 0 )
{
G_Printf( S_COLOR_RED "ERROR: Server had no opening brace ( [ )!\n" );
continue;
}
token = COM_Parse(&txtPtr);
while(Q_strncmp(token, "]", 1)) {
if(!token[0]) break;
if(cnt > 12) break;
temp = G_NewString(token);
/*if(!infoString[0])
Com_sprintf(infoString, sizeof(infoString), "i%i\\%s\\", cnt, temp);
else {
if(cnt % 2 == 0)
Com_sprintf(infoString, sizeof(infoString), "%si%i\\%s\\", infoString, i, temp);
else
Com_sprintf(infoString, sizeof(infoString), "%sd%i\\%s\\", infoString, i, temp);
}*/
if(cnt % 2 == 0)
Q_strncpyz(srvChangeData.ip[i], token, sizeof(srvChangeData.ip[i]));
else
Q_strncpyz(srvChangeData.name[i], token, sizeof(srvChangeData.name[i]));
cnt++;
if(cnt % 2 == 0)
i++;
token = COM_Parse(&txtPtr);
}
}
}
}
}
//trap_SetConfigstring(CS_SERVERCHANGE, infoString);
}
#else
static void G_LoadServerChangeFile(void) { static void G_LoadServerChangeFile(void) {
char fileRoute[MAX_QPATH]; char fileRoute[MAX_QPATH];
//char mapRoute[MAX_QPATH]; //char mapRoute[MAX_QPATH];
@ -1785,107 +1298,9 @@ static void G_LoadServerChangeFile(void) {
free(buffer); free(buffer);
//trap_SetConfigstring(CS_SERVERCHANGE, infoString); //trap_SetConfigstring(CS_SERVERCHANGE, infoString);
} }
#endif
mapChangeData_t mapChangeData; mapChangeData_t mapChangeData;
#ifdef Q3_VM
static void G_LoadMapChangeFile(void) {
char fileRoute[MAX_QPATH];
//char mapRoute[MAX_QPATH];
char infoString[MAX_INFO_STRING];
fileHandle_t f;
char buffer[20000];
int file_len;
char *txtPtr, *token;
char *temp;
int cnt = 0;
int i = 0;
BG_LanguageFilename("mapchange", "cfg", fileRoute);
file_len = trap_FS_FOpenFile(fileRoute, &f, FS_READ);
if(!file_len)
return;
memset(buffer, 0, sizeof(buffer));
memset(infoString, 0, sizeof(infoString));
trap_FS_Read(buffer, file_len, f);
if ( !buffer[0] )
{
G_Printf( S_COLOR_RED "ERROR: Couldn't read in file: %s!\n", fileRoute );
trap_FS_FCloseFile( f );
return;
}
buffer[file_len] = '\0';
trap_FS_FCloseFile(f);
COM_BeginParseSession();
txtPtr = buffer;
while(1) {
token = COM_Parse(&txtPtr);
if(!token[0]) break;
if(!Q_stricmp(token, "MapChangeConfig")) {
token = COM_Parse( &txtPtr );
if ( Q_strncmp( token, "{", 1 ) != 0 )
{
G_Printf( S_COLOR_RED "ERROR: MapChangeConfig had no opening brace ( { )!\n" );
continue;
}
while(Q_strncmp(token, "}", 1)) {
token = COM_Parse(&txtPtr);
if(!token[0]) break;
if(!Q_stricmp(token, "Map")) {
token = COM_Parse(&txtPtr);
if ( Q_strncmp( token, "[", 1 ) != 0 )
{
G_Printf( S_COLOR_RED "ERROR: Server had no opening brace ( [ )!\n" );
continue;
}
token = COM_Parse(&txtPtr);
while(Q_strncmp(token, "]", 1)) {
if(!token[0]) break;
if(cnt > 12) break;
temp = G_NewString(token);
/*if(!infoString[0])
Com_sprintf(infoString, sizeof(infoString), "i%i\\%s\\", cnt, temp);
else {
if(cnt % 2 == 0)
Com_sprintf(infoString, sizeof(infoString), "%si%i\\%s\\", infoString, i, temp);
else
Com_sprintf(infoString, sizeof(infoString), "%sd%i\\%s\\", infoString, i, temp);
}*/
if(cnt % 2 == 0)
Q_strncpyz(mapChangeData.name[i], token, sizeof(mapChangeData.name[i]));
else
Q_strncpyz(mapChangeData.bspname[i], token, sizeof(mapChangeData.bspname[i]));
cnt++;
if(cnt % 2 == 0)
i++;
token = COM_Parse(&txtPtr);
}
}
}
}
}
//trap_SetConfigstring(CS_SERVERCHANGE, infoString);
}
#else
static void G_LoadMapChangeFile(void) { static void G_LoadMapChangeFile(void) {
char fileRoute[MAX_QPATH]; char fileRoute[MAX_QPATH];
//char mapRoute[MAX_QPATH]; //char mapRoute[MAX_QPATH];
@ -1988,213 +1403,7 @@ static void G_LoadMapChangeFile(void) {
free(buffer); free(buffer);
//trap_SetConfigstring(CS_SERVERCHANGE, infoString); //trap_SetConfigstring(CS_SERVERCHANGE, infoString);
} }
#endif
#ifdef Q3_VM
static void G_LoadLocationsFile( void )
{
char fileRoute[MAX_QPATH];
char mapRoute[MAX_QPATH];
char serverInfo[MAX_TOKEN_CHARS];
fileHandle_t f;
char buffer[20000];
int file_len;
char *textPtr, *token;
vec3_t origin, angles;
gentity_t *ent;
char *desc;
int rest;
//get the map name out of the server data
trap_GetServerinfo( serverInfo, sizeof( serverInfo ) );
//setup the file route
Com_sprintf( mapRoute, sizeof( mapRoute ), "maps/%s", Info_ValueForKey( serverInfo, "mapname" ) );
BG_LanguageFilename( mapRoute, "locations", fileRoute );
file_len = trap_FS_FOpenFile( fileRoute, &f, FS_READ );
if ( !file_len )
return;
memset( buffer, 0, sizeof(buffer) );
trap_FS_Read( buffer, file_len, f );
if ( !buffer[0] )
{
G_Printf( S_COLOR_RED "ERROR: Couldn't read in file: %s!\n", fileRoute );
trap_FS_FCloseFile( f );
return;
}
buffer[file_len] = '\0';
trap_FS_FCloseFile( f );
G_Printf( "Locations file %s located. Proceeding to load scan data.\n", fileRoute ); //GSIO01: why did this say "Usables file ..."? lol
COM_BeginParseSession();
textPtr = buffer;
while( 1 )
{
token = COM_Parse( &textPtr );
if ( !token[0] )
break;
if(!Q_strncmp( token, "LocationsList2", 19 )) { // new style locations list with restricted locations
token = COM_Parse( &textPtr );
if ( Q_strncmp( token, "{", 1 ) != 0 )
{
G_Printf( S_COLOR_RED "ERROR: LocationsList2 had no opening brace ( { )!\n", fileRoute );
continue;
}
//expected format is "<origin> <angle> <int> <string>"
while ( Q_strncmp( token, "}", 1 ) )
{
if ( !token[0] )
break;
//Parse origin
if ( COM_ParseVec3( &textPtr, origin ) )
{
G_Printf( S_COLOR_RED "Invalid origin entry in %s!\n", fileRoute );
return;
}
//Parse angles
if ( COM_ParseVec3( &textPtr, angles ) )
{
G_Printf( S_COLOR_RED "Invalid origin entry in %s!\n", fileRoute );
return;
}
//Pars restriction value
if( COM_ParseInt( &textPtr, &rest ) )
{
G_Printf( S_COLOR_RED "Invalid restriction entry in %s!\n", fileRoute );
return;
}
//Parse Location string
token = COM_ParseExt( &textPtr, qfalse );
if ( !token[0] )
{
G_Printf( S_COLOR_RED "Invalid string desc entry in %s!\n", fileRoute );
return;
}
desc = token;
//create a new entity
ent = G_Spawn();
if ( !ent )
{
G_Printf( S_COLOR_RED "Couldn't create entity in %s!\n", fileRoute );
return;
}
ent->classname = "target_location";
//copy position data
VectorCopy( origin, ent->s.origin );
VectorCopy( angles, ent->s.angles );
//copy string
ent->message = G_NewString( desc );
//copy desc into target as well
ent->target = ent->targetname = G_NewString( desc );
// copy restriction value
ent->sound1to2 = rest;
//G_Printf( S_COLOR_RED "Added string %s to entity %i.\n", ent->message, (int)(ent-g_entities) );
//initiate it as a location ent
SP_target_location( ent );
//reset the ent
ent = NULL;
//--
token = COM_Parse( &textPtr );
}
} else if ( !Q_strncmp( token, "LocationsList", 18 ) ) // old stly locations file
{
token = COM_Parse( &textPtr );
if ( Q_strncmp( token, "{", 1 ) != 0 )
{
G_Printf( S_COLOR_RED "ERROR: LocationsList had no opening brace ( { )!\n", fileRoute );
continue;
}
//expected format is "<origin> <angle> <string>"
while ( Q_strncmp( token, "}", 1 ) )
{
if ( !token[0] )
break;
//Parse origin
if ( COM_ParseVec3( &textPtr, origin ) )
{
G_Printf( S_COLOR_RED "Invalid origin entry in %s!\n", fileRoute );
return;
}
//Parse angles
if ( COM_ParseVec3( &textPtr, angles ) )
{
G_Printf( S_COLOR_RED "Invalid origin entry in %s!\n", fileRoute );
return;
}
//Parse Location string
token = COM_ParseExt( &textPtr, qfalse );
if ( !token[0] )
{
G_Printf( S_COLOR_RED "Invalid string desc entry in %s!\n", fileRoute );
return;
}
desc = token;
//create a new entity
ent = G_Spawn();
if ( !ent )
{
G_Printf( S_COLOR_RED "Couldn't create entity in %s!\n", fileRoute );
return;
}
ent->classname = "target_location";
//copy position data
VectorCopy( origin, ent->s.origin );
VectorCopy( angles, ent->s.angles );
//copy string
ent->message = G_NewString( desc );
//copy desc into target as well
ent->target = ent->targetname = G_NewString( desc );
//G_Printf( S_COLOR_RED "Added string %s to entity %i.\n", ent->message, (int)(ent-g_entities) );
//initiate it as a location ent
SP_target_location( ent );
//reset the ent
ent = NULL;
//--
token = COM_Parse( &textPtr );
}
}
}
}
#else
static void G_LoadLocationsFile( void ) static void G_LoadLocationsFile( void )
{ {
char fileRoute[MAX_QPATH]; char fileRoute[MAX_QPATH];
@ -2423,7 +1632,6 @@ static void G_LoadLocationsFile( void )
free(buffer); free(buffer);
} }
#endif
/*void G_initGroupsList(void) /*void G_initGroupsList(void)
{ {

View file

@ -183,9 +183,8 @@ void SP_target_warp(gentity_t *ent); //RPG-X | GSIO01 | 19/05/2009
void SP_target_deactivate(gentity_t *ent); void SP_target_deactivate(gentity_t *ent);
void SP_target_serverchange(gentity_t *ent); void SP_target_serverchange(gentity_t *ent);
void SP_target_levelchange(gentity_t *ent); void SP_target_levelchange(gentity_t *ent);
#ifdef XTRA /* shader remap */
void SP_target_shaderremap(gentity_t *ent); void SP_target_shaderremap(gentity_t *ent);
#endif
void SP_light (gentity_t *self); void SP_light (gentity_t *self);
void SP_info_null (gentity_t *self); void SP_info_null (gentity_t *self);
@ -388,9 +387,8 @@ spawn_t spawns[] = {
{"target_deactivate", SP_target_deactivate}, {"target_deactivate", SP_target_deactivate},
{"target_serverchange", SP_target_serverchange}, {"target_serverchange", SP_target_serverchange},
{"target_levelchange", SP_target_levelchange}, {"target_levelchange", SP_target_levelchange},
#ifdef XTRA /* shader remap */
{"target_shaderremap", SP_target_shaderremap}, {"target_shaderremap", SP_target_shaderremap},
#endif
{"light", SP_light}, {"light", SP_light},
{"path_corner", SP_path_corner}, {"path_corner", SP_path_corner},

View file

@ -960,10 +960,7 @@ static void target_turbolift_endMove ( gentity_t *ent )
gentity_t* lights=NULL; gentity_t* lights=NULL;
gentity_t* otherLift=NULL; gentity_t* otherLift=NULL;
//gentity_t* tent=NULL; //gentity_t* tent=NULL;
#ifdef XTRA
float f = 0; float f = 0;
#endif
otherLift = &g_entities[ent->count]; otherLift = &g_entities[ent->count];
if ( !otherLift ) if ( !otherLift )
@ -1063,8 +1060,7 @@ static void target_turbolift_endMove ( gentity_t *ent )
} }
} }
#ifdef XTRA /* check for shader remaps */
// check for shader remaps
if(rpg_calcLiftTravelDuration.integer) { if(rpg_calcLiftTravelDuration.integer) {
if((ent->truename && otherLift->truename) || (ent->falsename && otherLift->falsename)) { if((ent->truename && otherLift->truename) || (ent->falsename && otherLift->falsename)) {
f = level.time * 0.001; f = level.time * 0.001;
@ -1073,7 +1069,6 @@ static void target_turbolift_endMove ( gentity_t *ent )
} }
trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig()); trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig());
} }
#endif
//next phase, teleport player //next phase, teleport player
ent->nextthink = level.time + ent->sound1to2; ent->nextthink = level.time + ent->sound1to2;
@ -1124,65 +1119,6 @@ static void TeleportPlayers ( gentity_t* ent, gentity_t* targetLift, int numEnts
} }
} }
#ifdef Q3_VM
static void target_turbolift_TeleportPlayers ( gentity_t *ent )
{
gentity_t *targetLift;
vec3_t mins, maxs;
float time;
//store both sets of data so they can be swapped at the same time
int liftTouch[MAX_GENTITIES];
int targetLiftTouch[MAX_GENTITIES];
int liftNumEnts;
int targetLiftNumEnts;
//teleport the players
targetLift = &g_entities[ent->count];
if ( !targetLift ) {
target_turbolift_unlock( ent );
return;
}
//scan the turbo region for players
//in the current lift
{
VectorCopy( ent->r.maxs, maxs );
VectorCopy( ent->r.mins, mins );
liftNumEnts = trap_EntitiesInBox( mins, maxs, liftTouch, MAX_GENTITIES );
}
//the target lift
{
VectorCopy( targetLift->r.maxs, maxs );
VectorCopy( targetLift->r.mins, mins );
targetLiftNumEnts = trap_EntitiesInBox( mins, maxs, targetLiftTouch, MAX_GENTITIES );
}
//TiM - Teleport the players from the other target to this one
TeleportPlayers( targetLift, ent, targetLiftNumEnts, targetLiftTouch );
//TiM - Teleport the main players
TeleportPlayers( ent, targetLift, liftNumEnts, liftTouch );
if(rpg_calcLiftTravelDuration.integer) {
time = targetLift->health - ent->health;
if(time < 0)
time *= -1;
time *= rpg_liftDurationModifier.value;
time *= 1000;
ent->think = target_turbolift_endMove;
ent->nextthink = level.time + (time * 0.5f);
} else {
//first thing's first
ent->think = target_turbolift_endMove;
ent->nextthink = level.time + (ent->wait*0.5f);
}
}
#else
static void target_turbolift_TeleportPlayers ( gentity_t *ent ) static void target_turbolift_TeleportPlayers ( gentity_t *ent )
{ {
gentity_t *targetLift; gentity_t *targetLift;
@ -1266,8 +1202,6 @@ static void target_turbolift_TeleportPlayers ( gentity_t *ent )
free(liftTouch); free(liftTouch);
free(targetLiftTouch); free(targetLiftTouch);
} }
#endif
static void target_turbolift_startSoundEnd(gentity_t *ent) { static void target_turbolift_startSoundEnd(gentity_t *ent) {
ent->nextthink = -1; ent->nextthink = -1;
@ -1281,10 +1215,7 @@ static void target_turbolift_startMove ( gentity_t *ent )
gentity_t* otherLift=NULL; gentity_t* otherLift=NULL;
gentity_t* tent=NULL; gentity_t* tent=NULL;
float time = 0, time2 = 0; float time = 0, time2 = 0;
#ifdef XTRA
float f = 0; float f = 0;
#endif
otherLift = &g_entities[ent->count]; otherLift = &g_entities[ent->count];
if ( !otherLift ) if ( !otherLift )
@ -1399,7 +1330,6 @@ static void target_turbolift_startMove ( gentity_t *ent )
} }
} }
#ifdef XTRA
// check for shader remaps // check for shader remaps
if(rpg_calcLiftTravelDuration.integer) { if(rpg_calcLiftTravelDuration.integer) {
if(time2 < 0 && ent->truename && otherLift->truename) { if(time2 < 0 && ent->truename && otherLift->truename) {
@ -1413,7 +1343,6 @@ static void target_turbolift_startMove ( gentity_t *ent )
} }
trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig()); trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig());
} }
#endif
if(rpg_calcLiftTravelDuration.integer) { if(rpg_calcLiftTravelDuration.integer) {
/*time = ent->health - otherLift->health; /*time = ent->health - otherLift->health;
@ -1766,295 +1695,6 @@ void SP_target_doorLock(gentity_t *ent) {
} }
//RPG-X | GSIO01 | 11/05/2009 | MOD START //RPG-X | GSIO01 | 11/05/2009 | MOD START
#ifndef XTRA
/*QUAKED target_alert (1 0 0) (-8 -8 -8) (8 8 8) SOUND_TOGGLE SOUND_OFF
This entity acts like 3-Alert-Conditions scripts.
Any of the func_usables that are used as buttons must have the NO_ACTIVATOR spawnflag.
SOUND_TOGGLE if set the alert sound can be toggled on/off by using the alerts trigger again.
SOUND_OFF if SOUND_TOGGLE is set, the alert will be silent at beginning
"greenname" the trigger for green alert should target this
"yellowname" the trigger for yellow alert should target this
"redname" the trigger for red alert should target this
"bluename" the trigger for blue alert should target this
"greentarget" anything that should be toggled when activating green alert
"yellowtarget" anything that should be toggled when activating yellow alert
"redtarget" anything that should be toggled when activating red alert
"bluetarget" anything that should be toggled when activating blue alert
"greensnd" targetname of target_speaker with sound for green alert
"yellowsnd" targetname of target_speaker with sound for yellow alert
"redsnd" targetname of target_speaker with sound for red alert
"bluesnd" targetname of target_speaker with sound for blue alert
*/
void target_alert_use(gentity_t *ent, gentity_t *other, gentity_t *activator) {
if(!Q_stricmp(activator->target, ent->swapname)) {
if(ent->damage == 0) {
if(ent->spawnflags & 1) {
ent->health = !ent->health;
ent->target = ent->greensound;
G_UseTargets(ent, ent);
}
} else {
switch(ent->damage) {
case 1: // yellow
if(ent->health) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->falsetarget;
G_UseTargets(ent, ent);
break;
case 2: // red
if(ent->health) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->paintarget;
G_UseTargets(ent, ent);
break;
case 3: // blue
if(ent->health) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->targetname2;
G_UseTargets(ent, ent);
break;
}
if(!ent->spawnflags) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
} else if(ent->spawnflags & 2) {
ent->health = 0;
} else {
if(ent->spawnflags) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
ent->health = 1;
}
}
ent->target = ent->truetarget;
G_UseTargets(ent, ent);
ent->damage = 0;
}
} else if(!Q_stricmp(activator->target, ent->truename)) {
if(ent->damage == 1) {
if(ent->spawnflags & 1) {
ent->health = !ent->health;
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
}
} else {
switch(ent->damage) {
case 0: // green
if(ent->health) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->truetarget;
G_UseTargets(ent, ent);
break;
case 2: // red
if(ent->health) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->paintarget;
G_UseTargets(ent, ent);
break;
case 3: // blue
if(ent->health) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->targetname2;
G_UseTargets(ent, ent);
break;
}
if(!ent->spawnflags) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
} else if(ent->spawnflags & 2) {
ent->health = 0;
} else {
if(ent->spawnflags) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
ent->health = 1;
}
}
ent->target = ent->falsetarget;
G_UseTargets(ent, ent);
ent->damage = 1;
}
} else if(!Q_stricmp(activator->target, ent->falsename)) {
if(ent->damage == 2) {
if(ent->spawnflags & 1) {
ent->health = !ent->health;
ent->target = ent->redsound;
G_UseTargets(ent, ent);
}
} else {
switch(ent->damage) {
case 0: // green
if(ent->health) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->truetarget;
G_UseTargets(ent, ent);
break;
case 1: // ryellow
if(ent->health) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->falsetarget;
G_UseTargets(ent, ent);
break;
case 3: // blue
if(ent->health) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->targetname2;
G_UseTargets(ent, ent);
break;
}
if(!ent->spawnflags) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
} else if(ent->spawnflags & 2) {
ent->health = 0;
} else {
if(ent->spawnflags) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
ent->health = 1;
}
}
ent->target = ent->paintarget;
G_UseTargets(ent, ent);
ent->damage = 2;
}
} if(!Q_stricmp(activator->target, ent->bluename)) {
if(ent->damage == 3) {
if(ent->spawnflags & 1) {
ent->health = !ent->health;
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
}
} else {
switch(ent->damage) {
case 0: // green
if(ent->health) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->greensound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->truetarget;
G_UseTargets(ent, ent);
break;
case 1: // yellow
if(ent->health) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->yellowsound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->falsetarget;
G_UseTargets(ent, ent);
break;
case 2: // red
if(ent->health) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
ent->health = !ent->health;
}
/*if(!ent->spawnflags) {
ent->target = ent->redsound;
G_UseTargets(ent, ent);
}*/
ent->target = ent->paintarget;
G_UseTargets(ent, ent);
break;
}
if(!ent->spawnflags) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
} else if(ent->spawnflags & 2) {
ent->health = 0;
} else {
if(ent->spawnflags) {
ent->target = ent->bluesound;
G_UseTargets(ent, ent);
ent->health = 1;
}
}
ent->target = ent->targetname2;
G_UseTargets(ent, ent);
ent->damage = 3;
}
}
// Free activator if no classname <-- alert command
if(!activator->classname)
G_FreeEntity(activator);
}
#else
/*QUAKED target_alert (1 0 0) (-8 -8 -8) (8 8 8) SOUND_TOGGLE SOUND_OFF /*QUAKED target_alert (1 0 0) (-8 -8 -8) (8 8 8) SOUND_TOGGLE SOUND_OFF
This entity acts like 3-Alert-Conditions scripts. This entity acts like 3-Alert-Conditions scripts.
@ -2411,9 +2051,7 @@ void target_alert_use(gentity_t *ent, gentity_t *other, gentity_t *activator) {
if(!activator->classname) if(!activator->classname)
G_FreeEntity(activator); G_FreeEntity(activator);
} }
#endif
#ifdef XTRA
void target_alert_parseShaders(gentity_t *ent) { void target_alert_parseShaders(gentity_t *ent) {
char buffer[BIG_INFO_STRING]; char buffer[BIG_INFO_STRING];
char *txtPtr; char *txtPtr;
@ -2495,7 +2133,6 @@ void target_alert_parseShaders(gentity_t *ent) {
} }
} }
} }
#endif
void SP_target_alert(gentity_t *ent) { void SP_target_alert(gentity_t *ent) {
//int errorNum = 0; //int errorNum = 0;
@ -2517,7 +2154,6 @@ void SP_target_alert(gentity_t *ent) {
G_SpawnString("bluetarget", "", &temp); G_SpawnString("bluetarget", "", &temp);
ent->targetname2 = G_NewString(temp); ent->targetname2 = G_NewString(temp);
#ifdef XTRA
if(G_SpawnString("greenshader", "", &temp)) if(G_SpawnString("greenshader", "", &temp))
ent->message = G_NewString(temp); ent->message = G_NewString(temp);
if(G_SpawnString("yellowshader", "", &temp)) if(G_SpawnString("yellowshader", "", &temp))
@ -2528,7 +2164,6 @@ void SP_target_alert(gentity_t *ent) {
ent->model2 = G_NewString(temp); ent->model2 = G_NewString(temp);
target_alert_parseShaders(ent); target_alert_parseShaders(ent);
#endif
if(!ent->swapname || !ent->truename || !ent->falsename || !ent->bluename || if(!ent->swapname || !ent->truename || !ent->falsename || !ent->bluename ||
!ent->truetarget || !ent->falsetarget || !ent->paintarget || !ent->targetname2) { !ent->truetarget || !ent->falsetarget || !ent->paintarget || !ent->targetname2) {
@ -2878,7 +2513,6 @@ void SP_target_holodeck(gentity_t *ent) {
} }
//RPG-X | Harry Young | 15/10/2011 | MOD START //RPG-X | Harry Young | 15/10/2011 | MOD START
#ifdef XTRA
/*QUAKED target_shaderremap (1 0 0) (-8 -8 -8) (8 8 8) /*QUAKED target_shaderremap (1 0 0) (-8 -8 -8) (8 8 8)
This will remap the shader "falsename" with shader "truename" and vice versa. This will remap the shader "falsename" with shader "truename" and vice versa.
It will save you some vfx-usables. It will save you some vfx-usables.
@ -2922,5 +2556,4 @@ void SP_target_shaderremap(gentity_t *ent) {
ent->use = target_shaderremap_use; ent->use = target_shaderremap_use;
} }
#endif
//RPG-X | Harry Young | 15/10/2011 | MOD END //RPG-X | Harry Young | 15/10/2011 | MOD END

View file

@ -49,14 +49,12 @@ void func_usable_think( gentity_t *self )
void func_usable_use (gentity_t *self, gentity_t *other, gentity_t *activator) void func_usable_use (gentity_t *self, gentity_t *other, gentity_t *activator)
{//Toggle on and off {//Toggle on and off
#ifdef XTRA
//Remap shader //Remap shader
if(self->targetShaderName && self->targetShaderNewName) { if(self->targetShaderName && self->targetShaderNewName) {
float f = level.time * 0.001; float f = level.time * 0.001;
AddRemap(self->targetShaderName, self->targetShaderNewName, f); AddRemap(self->targetShaderName, self->targetShaderNewName, f);
trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig()); trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig());
} }
#endif
//RPG-X | GSIO01 | 09/05/2009: //RPG-X | GSIO01 | 09/05/2009:
@ -310,139 +308,6 @@ G_LoadMapConfigurations
* \return sucessfully loaded? * \return sucessfully loaded?
* \author Ubergames - TiM * \author Ubergames - TiM
*/ */
#ifdef Q3_VM
qboolean G_SetupUsablesStrings( void )
{
char serverInfo[MAX_TOKEN_CHARS];
char fileRoute[MAX_QPATH];
char buffer[20000];
int file_len;
char *textPtr, *token;
fileHandle_t f;
int i, j;
level.hasScannableFile = qfalse;
level.hasEntScannableFile = qfalse;
//get the map name out of the server data
trap_GetServerinfo( serverInfo, sizeof( serverInfo ) );
//setup the file route
Com_sprintf( fileRoute, sizeof( fileRoute ), "maps/%s.usables", Info_ValueForKey( serverInfo, "mapname" ) );
file_len = trap_FS_FOpenFile( fileRoute, &f, FS_READ );
//It's assumed most maps won't have this feature, so just exit 'gracefully'
if ( file_len<=1 )
{
trap_FS_FCloseFile( f );
//G_Printf( S_COLOR_YELLOW "WARNING: No file named %s was found.\n", fileRoute );
return qfalse;
}
//fill the buffer with the file data
memset( &buffer, 0, sizeof( buffer ) );
trap_FS_Read( buffer, file_len, f );
buffer[file_len] = '0';
trap_FS_FCloseFile( f );
if ( !buffer[0] )
{
G_Printf( S_COLOR_RED "ERROR: Attempted to load %s, but no data was inside!\n", fileRoute );
return qfalse;
}
G_Printf( "Usables file %s located. Proceeding to load scan data.\n", fileRoute );
COM_BeginParseSession();
textPtr = buffer;
i = 0; //used for the main arrays indices
while( 1 )
{
token = COM_Parse( &textPtr );
if ( !token[0] )
break;
if ( !Q_strncmp( token, "UsableDescriptions", 18 ) )
{
token = COM_Parse( &textPtr );
if ( Q_strncmp( token, "{", 1 ) != 0 )
{
G_Printf( S_COLOR_RED "ERROR: UsableDescriptions had no opening brace ( { )!\n", fileRoute );
continue;
}
level.hasScannableFile = qtrue;
token = COM_Parse( &textPtr );
//expected format is 'id' <space> 'string'
while ( Q_strncmp( token, "}", 1 ) )
{
if ( !token[0] )
break;
if ( !Q_strncmp( token, "UsableEntities", 14 ) )
{
token = COM_Parse( &textPtr );
if ( Q_strncmp( token, "{", 1 ) )
{
G_Printf( S_COLOR_RED "ERROR: UsableEntities had no opening brace ( { )!\n", fileRoute );
continue;
}
level.hasEntScannableFile = qtrue;
token = COM_Parse( &textPtr );
j = 0;
while( Q_strncmp( token, "}", 1 ) )
{
if ( !token[0] )
break;
if ( token[0] != 'e' )
{
SkipRestOfLine( &textPtr );
continue;
}
token++; //skip the 'e'
level.g_entScannables[j][0] = atoi( token );
token = COM_ParseExt( &textPtr, qfalse );
level.g_entScannables[j][1] = atoi( token );
//there's no way clients are scannable in here, so just validate the entry b4 proceeding
if ( level.g_entScannables[j][0] > MAX_CLIENTS-1 && level.g_entScannables[j][1] > 0 )
j++;
token = COM_Parse( &textPtr );
}
}
else
{
level.g_scannables[i] = atoi( token );
//ensure a valid number was passed, else ignore it
if ( level.g_scannables[i] > 0 )
i++;
//we don't need the text on the server side
SkipRestOfLine( &textPtr );
token = COM_Parse( &textPtr );
}
}
}
}
return qtrue;
}
#else
qboolean G_SetupUsablesStrings( void ) qboolean G_SetupUsablesStrings( void )
{ {
char *serverInfo; char *serverInfo;
@ -588,5 +453,5 @@ qboolean G_SetupUsablesStrings( void )
free(buffer); free(buffer);
return qtrue; return qtrue;
} }
#endif

View file

@ -4,7 +4,6 @@
#include "g_local.h" #include "g_local.h"
#ifdef XTRA
typedef struct { typedef struct {
char oldShader[MAX_QPATH]; char oldShader[MAX_QPATH];
char newShader[MAX_QPATH]; char newShader[MAX_QPATH];
@ -47,7 +46,6 @@ const char *BuildShaderStateConfig(void) {
} }
return buff; return buff;
} }
#endif
/* /*
========================================================================= =========================================================================
@ -336,13 +334,11 @@ void G_UseTargets2( gentity_t *ent, gentity_t *activator, char *target ) {
return; return;
} }
#ifdef XTRA
if (ent->targetShaderName && ent->targetShaderNewName) { if (ent->targetShaderName && ent->targetShaderNewName) {
float f = level.time * 0.001; float f = level.time * 0.001;
AddRemap(ent->targetShaderName, ent->targetShaderNewName, f); AddRemap(ent->targetShaderName, ent->targetShaderNewName, f);
trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig()); trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig());
} }
#endif
if ( !target ) { if ( !target ) {
return; return;

View file

@ -905,26 +905,6 @@ char *Q_CleanStr( char *string ) {
return string; return string;
} }
#ifdef Q3_VM
void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) {
int len;
va_list argptr;
char bigbuffer[32000]; /* big, but small enough to fit in PPC stack */
va_start (argptr,fmt);
len = vsprintf (bigbuffer,fmt,argptr);
va_end (argptr);
if ( len >= sizeof( bigbuffer ) ) {
Com_Error( ERR_FATAL, "Com_sprintf: overflowed bigbuffer" );
}
if (len >= size) {
Com_Printf ("Com_sprintf: overflow of %i in %i\n", len, size);
Com_Printf("Fmt: %s\n", fmt);
Com_Printf("BigBuffer: %s\n", bigbuffer);
}
Q_strncpyz (dest, bigbuffer, size );
}
#else
void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) { void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) {
int len; int len;
va_list argptr; va_list argptr;
@ -953,7 +933,6 @@ void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) {
} }
Q_strncpyz (dest, bigbuffer, size ); Q_strncpyz (dest, bigbuffer, size );
} }
#endif
/* /*
============ ============

View file

@ -53,16 +53,13 @@
**********************************************************************/ **********************************************************************/
// use this to specify whether the code is compile for rpgxEF or not
#define XTRA 1
// meh somehow preprocessor G_LUA won't work for me // meh somehow preprocessor G_LUA won't work for me
#define G_LUA 1 #define G_LUA 1
#define CG_LUA 1 #define CG_LUA 1
#ifdef Q3_VM #ifdef Q3_VM
//#include "bg_lib.h"
#include "bg_lib.h" #error "Q3_VM detected: QVMs are no longer supported by RPG-X2
#else #else
#include <assert.h> #include <assert.h>
@ -85,7 +82,8 @@
// Needed for mods compiled in 64 bit shared objects. // Needed for mods compiled in 64 bit shared objects.
#ifdef Q3_VM #ifdef Q3_VM
typedef int intptr_t; // typedef int intptr_t;
#error "Q3_VM detected: QVMs are no longer supported by RPG-X2
#else #else
#ifdef _MSC_VER #ifdef _MSC_VER
#include <stddef.h> #include <stddef.h>
@ -906,13 +904,7 @@ typedef enum {
// //
#define MAX_CLIENTS 128 // absolute limit #define MAX_CLIENTS 128 // absolute limit
#define MAX_LOCATIONS 64 #define MAX_LOCATIONS 64
#define GENTITYNUM_BITS 11
#ifndef XTRA
#define GENTITYNUM_BITS 10 // don't need to send any more
#else
#define GENTITYNUM_BITS 11 // XTRA
#endif
#define MAX_GENTITIES (1<<GENTITYNUM_BITS) #define MAX_GENTITIES (1<<GENTITYNUM_BITS)
// entitynums are communicated with GENTITY_BITS, so any reserved // entitynums are communicated with GENTITY_BITS, so any reserved
@ -922,12 +914,7 @@ typedef enum {
#define ENTITYNUM_WORLD (MAX_GENTITIES-2) #define ENTITYNUM_WORLD (MAX_GENTITIES-2)
#define ENTITYNUM_MAX_NORMAL (MAX_GENTITIES-2) #define ENTITYNUM_MAX_NORMAL (MAX_GENTITIES-2)
#ifndef XTRA #define MAX_MODELS_BITS 9
#define MAX_MODELS_BITS 8
#else
#define MAX_MODELS_BITS 9 // XTRA
#endif
#define MAX_MODELS (1<<MAX_MODELS_BITS) // these are sent over the net as 8 bits <--- who cares xD #define MAX_MODELS (1<<MAX_MODELS_BITS) // these are sent over the net as 8 bits <--- who cares xD
#define MAX_SOUNDS 256 // so they cannot be blindly increased #define MAX_SOUNDS 256 // so they cannot be blindly increased
@ -935,11 +922,7 @@ typedef enum {
#define MAX_TRIC_STRINGS 64 #define MAX_TRIC_STRINGS 64
#define MAX_DECOYS 64 //128 #define MAX_DECOYS 64 //128
#ifndef XTRA
#define MAX_CONFIGSTRINGS 1024
#else
#define MAX_CONFIGSTRINGS 4096 #define MAX_CONFIGSTRINGS 4096
#endif
// these are the only configstrings that the system reserves, all the // these are the only configstrings that the system reserves, all the
// other ones are strictly for servergame to clientgame communication // other ones are strictly for servergame to clientgame communication
@ -948,12 +931,7 @@ typedef enum {
#define RESERVED_CONFIGSTRINGS 2 // game can't modify below this, only the system can #define RESERVED_CONFIGSTRINGS 2 // game can't modify below this, only the system can
#ifndef XTRA
#define MAX_GAMESTATE_CHARS 16000
#else
#define MAX_GAMESTATE_CHARS 64000 #define MAX_GAMESTATE_CHARS 64000
#endif
typedef struct { typedef struct {
int stringOffsets[MAX_CONFIGSTRINGS]; int stringOffsets[MAX_CONFIGSTRINGS];

View file

@ -1314,12 +1314,11 @@ qboolean UI_ConsoleCommand( void ) {
return qtrue; return qtrue;
} }
#ifdef XTRA /* TODO remove me? */
if ( Q_stricmp( cmd, "sqlkey" ) == 0) { if ( Q_stricmp( cmd, "sqlkey" ) == 0) {
//UI_LoginSetSqlkey((int)UI_Argv(1)); //UI_LoginSetSqlkey((int)UI_Argv(1));
return qtrue; return qtrue;
} }
#endif
return qfalse; return qfalse;

View file

@ -1859,9 +1859,7 @@ extern void TransDataReceived(const char *data);
// //
// ui_login.c // ui_login.c
// //
#ifdef XTRA
extern void UI_LoginSetSqlkey(int key); extern void UI_LoginSetSqlkey(int key);
#endif
// //
// ui_demo2.c // ui_demo2.c

View file

@ -5,8 +5,7 @@
**********************************************************************/ **********************************************************************/
#include "ui_local.h" #include "ui_local.h"
#ifdef XTRA /* TODO remove me? */
static byte sqlkey; static byte sqlkey;
typedef struct { typedef struct {
@ -138,4 +137,3 @@ void UI_LoginMenu(void) {
Menu_AdjustCursor(&s_login.menu, 1); Menu_AdjustCursor(&s_login.menu, 1);
} }
#endif //XTRA