本文整理汇总了C++中G_Error函数的典型用法代码示例。如果您正苦于以下问题:C++ G_Error函数的具体用法?C++ G_Error怎么用?C++ G_Error使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了G_Error函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: G_ParseCampaigns
void G_ParseCampaigns(void)
{
int i;
qboolean mapFound = qfalse;
level.campaignCount = 0;
level.currentCampaign = -1;
memset(&g_campaigns, 0, sizeof(g_campaignInfo_t) * MAX_CAMPAIGNS);
if (g_gametype.integer != GT_WOLF_CAMPAIGN)
{
trap_Cvar_Set("g_oldCampaign", "");
trap_Cvar_Set("g_currentCampaign", "");
trap_Cvar_Set("g_currentCampaignMap", "0");
return;
}
if (g_campaignFile.string[0])
{
if (G_LoadCampaignsFromFile(g_campaignFile.string))
{
mapFound = qtrue;
}
}
if (!mapFound)
{
// get all campaigns from .campaign files
int dirlen;
int numdirs = trap_FS_GetFileList("scripts", ".campaign", bigTextBuffer, sizeof(bigTextBuffer));
char filename[MAX_QPATH]; // was 128
char *dirptr = bigTextBuffer;
for (i = 0; i < numdirs; i++, dirptr += dirlen + 1)
{
// log a warning if server has more than MAX_CAMPAIGNS
if (level.campaignCount >= MAX_CAMPAIGNS)
{
G_LogPrintf("WARNING G_ParseCampaigns: number of campaigns larger then MAX_CAMPAIGNS\n");
break;
}
dirlen = strlen(dirptr);
strcpy(filename, "scripts/");
strcat(filename, dirptr);
if (G_LoadCampaignsFromFile(filename))
{
mapFound = qtrue;
}
}
}
if (!mapFound)
{
// map isn't found in the current campaign, see if it's the first map in another campaign
for (i = 0; i < level.campaignCount; i++)
{
if (!Q_stricmp(g_campaigns[i].mapnames[0], level.rawmapname))
{
// someone manually specified a /map command, and it's the first map in a campaign
trap_Cvar_Set("g_currentCampaign", g_campaigns[i].shortname);
trap_Cvar_Set("g_currentCampaignMap", "0");
level.newCampaign = qtrue;
g_campaigns[level.campaignCount].current = 0;
level.currentCampaign = i;
break;
}
}
if (i == level.campaignCount)
{
char buf[MAX_STRING_CHARS];
if (trap_Argc() < 1) // command not found, throw error
{
G_Error("Usage 'map <mapname>\n'");
}
trap_Argv(0, buf, sizeof(buf));
if (!(*buf)) // command not found, throw error
{
G_Error("Usage 'map <mapname>\n'");
}
// no campaign found, fallback to GT_WOLF
// and reload the map
trap_Cvar_Set("g_gametype", "2");
trap_SendConsoleCommand(EXEC_APPEND, va("%s %s\n", buf, level.rawmapname));
}
}
}
示例2: value
/*QUAKED worldspawn (0 0 0) ? NO_GT_WOLF NO_GT_STOPWATCH NO_GT_CHECKPOINT NO_LMS
Every map should have exactly one worldspawn.
"music" Music wav file
"gravity" 800 is default gravity
"message" Text to print during connection process
"ambient" Ambient light value (must use '_color')
"_color" Ambient light color (must be used with 'ambient')
"sun" Shader to use for 'sun' image
*/
void SP_worldspawn(void)
{
char *s;
G_SpawnString("classname", "", &s);
if(Q_stricmp(s, "worldspawn"))
{
G_Error("SP_worldspawn: The first entity isn't 'worldspawn'");
}
// make some data visible to connecting client
trap_SetConfigstring(CS_GAME_VERSION, GAME_VERSION);
trap_SetConfigstring(CS_LEVEL_START_TIME, va("%i", level.startTime));
G_SpawnString("music", "", &s);
trap_SetConfigstring(CS_MUSIC, s);
G_SpawnString("message", "", &s);
trap_SetConfigstring(CS_MESSAGE, s); // map specific message
G_SpawnString("cclayers", "0", &s);
if(atoi(s))
{
level.ccLayers = qtrue;
}
level.mapcoordsValid = qfalse;
if(G_SpawnVector2D("mapcoordsmins", "-128 128", level.mapcoordsMins) && // top left
G_SpawnVector2D("mapcoordsmaxs", "128 -128", level.mapcoordsMaxs))
{ // bottom right
level.mapcoordsValid = qtrue;
}
BG_InitLocations(level.mapcoordsMins, level.mapcoordsMaxs);
trap_SetConfigstring(CS_MOTD, g_motd.string); // message of the day
G_SpawnString("gravity", "800", &s);
trap_Cvar_Set("g_gravity", s);
G_SpawnString("spawnflags", "0", &s);
g_entities[ENTITYNUM_WORLD].spawnflags = atoi(s);
g_entities[ENTITYNUM_WORLD].r.worldflags = g_entities[ENTITYNUM_WORLD].spawnflags;
g_entities[ENTITYNUM_WORLD].s.number = ENTITYNUM_WORLD;
g_entities[ENTITYNUM_WORLD].classname = "worldspawn";
// see if we want a warmup time
trap_SetConfigstring(CS_WARMUP, "");
if(g_restarted.integer)
{
trap_Cvar_Set("g_restarted", "0");
level.warmupTime = 0;
}
if(g_gamestate.integer == GS_PLAYING)
{
G_initMatch();
}
}
示例3: EnumerateField
//.........这里部分代码省略.........
*(int *)pv = GetGEntityNum(*(gentity_t **)pv);
break;
case F_GROUP:
*(int *)pv = GetGroupNumber(*(AIGroupInfo_t **)pv);
break;
case F_GCLIENT:
*(int *)pv = GetGClientNum(*(gclient_t **)pv, (gentity_t *) pbBase);
break;
case F_ITEM:
*(int *)pv = GetGItemNum(*(gitem_t **)pv);
break;
case F_VEHINFO:
*(int *)pv = GetVehicleInfoNum(*(vehicleInfo_t **)pv);
break;
case F_BEHAVIORSET:
{
const char **p = (const char **) pv;
for (int i=0; i<NUM_BSETS; i++)
{
pv = &p[i]; // since you can't ++ a void ptr
*(int *)pv = GetStringNum(*(char **)pv);
}
}
break;
/*MCG
case F_BODYQUEUE:
{
gentity_t **p = (gentity_t **) pv;
for (int i=0; i<BODY_QUEUE_SIZE; i++)
{
pv = &p[i]; // since you can't ++ a void ptr
*(int *)pv = GetGEntityNum(*(gentity_t **)pv);
}
}
break;
*/
case F_ALERTEVENT: // convert all gentity_t ptrs in an alertEvent array into indexes...
{
alertEvent_t* p = (alertEvent_t *) pv;
for (int i=0; i<MAX_ALERT_EVENTS; i++)
{
p[i].owner = (gentity_t *) GetGEntityNum(p[i].owner);
}
}
break;
case F_AIGROUPS: // convert to ptrs within this into indexes...
{
AIGroupInfo_t* p = (AIGroupInfo_t *) pv;
for (int i=0; i<MAX_FRAME_GROUPS; i++)
{
p[i].enemy = (gentity_t *) GetGEntityNum(p[i].enemy);
p[i].commander = (gentity_t *) GetGEntityNum(p[i].commander);
}
}
break;
case F_ANIMFILESETS:
{
animFileSet_t* p = (animFileSet_t *) pv;
for (int i=0; i<MAX_ANIM_FILES; i++)
{
for ( int j=0; j<MAX_ANIM_EVENTS; j++ )
{
const char *ptAnimEventStringData = p[i].torsoAnimEvents[j].stringData;
*(int *)(&p[i].torsoAnimEvents[j].stringData) = GetStringNum( ptAnimEventStringData );
const char *plAnimEventStringData = p[i].legsAnimEvents[j].stringData;
*(int *)(&p[i].legsAnimEvents[j].stringData) = GetStringNum( plAnimEventStringData );
}
}
}
break;
case F_BOOLPTR:
*(qboolean *)pv = !!(*(int *)pv);
break;
// These are pointers that are always recreated
case F_NULL:
*(void **)pv = NULL;
break;
case F_IGNORE:
break;
default:
G_Error ("EnumerateField: unknown field type");
break;
}
}
示例4: while
/*
===========
SelectNearestSpawnPoint
for teleporting you back after falling into the void
============
*/
gentity_t *SelectNearestSpawnPoint ( vec3_t Point, vec3_t origin, vec3_t angles ) {
gentity_t *spot;
vec3_t delta;
float dist, nearestDist;
gentity_t *nearestSpot;
nearestDist = 999999;
nearestSpot = NULL;
spot = NULL;
while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) {
VectorSubtract( spot->s.origin, Point, delta );
dist = VectorLength( delta );
if ( dist < nearestDist ) {
nearestDist = dist;
nearestSpot = spot;
}
}
while ((spot = G_Find (spot, FOFS(classname), "team_CTF_redplayer")) != NULL) {
VectorSubtract( spot->s.origin, Point, delta );
dist = VectorLength( delta );
if ( dist < nearestDist ) {
nearestDist = dist;
nearestSpot = spot;
}
}
while ((spot = G_Find (spot, FOFS(classname), "team_CTF_blueplayer")) != NULL) {
VectorSubtract( spot->s.origin, Point, delta );
dist = VectorLength( delta );
if ( dist < nearestDist ) {
nearestDist = dist;
nearestSpot = spot;
}
}
while ((spot = G_Find (spot, FOFS(classname), "team_CTF_redspawn")) != NULL) {
VectorSubtract( spot->s.origin, Point, delta );
dist = VectorLength( delta );
if ( dist < nearestDist ) {
nearestDist = dist;
nearestSpot = spot;
}
}
while ((spot = G_Find (spot, FOFS(classname), "team_CTF_bluespawn")) != NULL) {
VectorSubtract( spot->s.origin, Point, delta );
dist = VectorLength( delta );
if ( dist < nearestDist ) {
nearestDist = dist;
nearestSpot = spot;
}
}
// find a single player start spot
if (!nearestSpot) {
G_Error( "Couldn't find a spawn point" );
}
VectorCopy (nearestSpot->s.origin, origin);
origin[2] += 9;
VectorCopy (nearestSpot->s.angles, angles);
return nearestSpot;
}
示例5: G_RunFrame
//.........这里部分代码省略.........
if ( i == 0 )
{
// decay batteries if the goggles are active
if ( cg.zoomMode == 1 && ent->client->ps.batteryCharge > 0 )
{
ent->client->ps.batteryCharge--;
}
else if ( cg.zoomMode == 3 && ent->client->ps.batteryCharge > 0 )
{
ent->client->ps.batteryCharge -= 2;
if ( ent->client->ps.batteryCharge < 0 )
{
ent->client->ps.batteryCharge = 0;
}
}
G_CheckEndLevelTimers( ent );
//Recalculate the nearest waypoint for the coming NPC updates
NAV_FindPlayerWaypoint();
if( ent->taskManager && !stop_icarus )
{
ent->taskManager->Update();
}
//dead
if ( ent->health <= 0 )
{
if ( ent->client->ps.groundEntityNum != ENTITYNUM_NONE )
{//on the ground
pitch_roll_for_slope( ent, NULL );
}
}
continue; // players are ucmd driven
}
G_RunThink( ent ); // be aware that ent may be free after returning from here, at least one func frees them
ClearNPCGlobals(); // but these 2 funcs are ok
//UpdateTeamCounters( ent ); // to call anyway on a freed ent.
}
// perform final fixups on the player
ent = &g_entities[0];
if ( ent->inuse )
{
ClientEndFrame( ent );
}
if( g_numEntities->integer )
{
gi.Printf( S_COLOR_WHITE"Number of Entities in use : %d\n", ents_inuse );
}
//DEBUG STUFF
NAV_ShowDebugInfo();
NPC_ShowDebugInfo();
G_DynamicMusicUpdate();
#if AI_TIMERS
AITime -= navTime;
if ( AITime > 20 )
{
gi.Printf( S_COLOR_RED"ERROR: total AI time: %d\n", AITime );
}
else if ( AITime > 10 )
{
gi.Printf( S_COLOR_YELLOW"WARNING: total AI time: %d\n", AITime );
}
else if ( AITime > 2 )
{
gi.Printf( S_COLOR_GREEN"total AI time: %d\n", AITime );
}
if ( navTime > 20 )
{
gi.Printf( S_COLOR_RED"ERROR: total nav time: %d\n", navTime );
}
else if ( navTime > 10 )
{
gi.Printf( S_COLOR_YELLOW"WARNING: total nav time: %d\n", navTime );
}
else if ( navTime > 2 )
{
gi.Printf( S_COLOR_GREEN"total nav time: %d\n", navTime );
}
#endif// AI_TIMERS
#ifndef FINAL_BUILD
if ( delayedShutDown != 0 && delayedShutDown < level.time )
{
G_Error( "Game Errors. Scroll up the console to read them." );
}
#endif
#ifdef _DEBUG
if(!(level.framenum&0xff))
{
ValidateInUseBits();
}
#endif
}
示例6: G_ScriptAction_FaceAngles
/*
=================
G_ScriptAction_FaceAngles
syntax: faceangles <pitch> <yaw> <roll> <duration/GOTOTIME> [ACCEL/DECCEL]
The entity will face the given angles, taking <duration> to get there. If the
GOTOTIME is given instead of a timed duration, the duration calculated from the
last gotomarker command will be used instead.
=================
*/
qboolean G_ScriptAction_FaceAngles( gentity_t *ent, char *params ) {
char *pString, *token;
int duration, i;
vec3_t diff;
vec3_t angles;
int trType = TR_LINEAR_STOP;
if ( !params || !params[0] ) {
G_Error( "G_Scripting: syntax: faceangles <pitch> <yaw> <roll> <duration/GOTOTIME>\n" );
}
if ( ent->scriptStatus.scriptStackChangeTime == level.time ) {
pString = params;
for ( i = 0; i < 3; i++ ) {
token = COM_Parse( &pString );
if ( !token || !token[0] ) {
G_Error( "G_Scripting: syntax: faceangles <pitch> <yaw> <roll> <duration/GOTOTIME>\n" );
}
angles[i] = atoi( token );
}
token = COM_Parse( &pString );
if ( !token || !token[0] ) {
G_Error( "G_Scripting: faceangles requires a <pitch> <yaw> <roll> <duration/GOTOTIME>\n" );
}
if ( !Q_strcasecmp( token, "gototime" ) ) {
duration = ent->s.pos.trDuration;
} else {
duration = atoi( token );
}
token = COM_Parse( &pString );
if ( token && token[0] ) {
if ( !Q_strcasecmp( token, "accel" ) ) {
trType = TR_ACCELERATE;
}
if ( !Q_strcasecmp( token, "deccel" ) ) {
trType = TR_DECCELERATE;
}
}
for ( i = 0; i < 3; i++ ) {
diff[i] = AngleDifference( angles[i], ent->s.angles[i] );
while ( diff[i] > 180 )
diff[i] -= 360;
while ( diff[i] < -180 )
diff[i] += 360;
}
VectorCopy( ent->s.angles, ent->s.apos.trBase );
if ( duration ) {
VectorScale( diff, 1000.0 / (float)duration, ent->s.apos.trDelta );
} else {
VectorClear( ent->s.apos.trDelta );
}
ent->s.apos.trDuration = duration;
ent->s.apos.trTime = level.time;
ent->s.apos.trType = TR_LINEAR_STOP;
if ( trType != TR_LINEAR_STOP ) { // accel / deccel logic
// calc the speed from duration and start/end delta
for ( i = 0; i < 3; i++ ) {
ent->s.apos.trDelta[i] = 2.0 * 1000.0 * diff[i] / (float)duration;
}
ent->s.apos.trType = trType;
}
} else if ( ent->s.apos.trTime + ent->s.apos.trDuration <= level.time ) {
// finished turning
BG_EvaluateTrajectory( &ent->s.apos, ent->s.apos.trTime + ent->s.apos.trDuration, ent->s.angles );
VectorCopy( ent->s.angles, ent->s.apos.trBase );
VectorCopy( ent->s.angles, ent->r.currentAngles );
ent->s.apos.trTime = level.time;
ent->s.apos.trDuration = 0;
ent->s.apos.trType = TR_STATIONARY;
VectorClear( ent->s.apos.trDelta );
script_linkentity( ent );
return qtrue;
}
BG_EvaluateTrajectory( &ent->s.apos, level.time, ent->r.currentAngles );
script_linkentity( ent );
return qfalse;
}
示例7: misc_model_breakable_init
//initization for misc_model_breakable
void misc_model_breakable_init( gentity_t *ent )
{
int type;
type = MDL_OTHER;
if (!ent->model) {
G_Error("no model set on %s at (%.1f %.1f %.1f)\n", ent->classname, ent->s.origin[0],ent->s.origin[1],ent->s.origin[2]);
}
//Main model
ent->s.modelindex = ent->sound2to1 = G_ModelIndex( ent->model );
if ( ent->spawnflags & 1 )
{//Blocks movement
ent->r.contents = CONTENTS_SOLID|CONTENTS_OPAQUE|CONTENTS_BODY|CONTENTS_MONSTERCLIP|CONTENTS_BOTCLIP;//Was CONTENTS_SOLID, but only architecture should be this
ent->s.solid = 2; //SOLID_BBOX
ent->clipmask = MASK_PLAYERSOLID;
}
else if ( ent->health )
{//Can only be shot
ent->r.contents = CONTENTS_SHOTCLIP;
}
if (type == MDL_OTHER)
{
ent->use = misc_model_use;
}
else if ( type == MDL_ARMOR_HEALTH )
{
// G_SoundIndex("sound/player/suithealth.wav");
ent->use = health_use;
if (!ent->count)
{
ent->count = 100;
}
ent->health = 60;
}
else if ( type == MDL_AMMO )
{
// G_SoundIndex("sound/player/suitenergy.wav");
//RAFIXME: add this use function
ent->use = ammo_use;
if (!ent->count)
{
ent->count = 100;
}
ent->health = 60;
}
if ( ent->health )
{
G_SoundIndex("sound/weapons/explosions/cargoexplode.wav");
ent->maxHealth = ent->health;
G_ScaleNetHealth(ent);
ent->takedamage = qtrue;
ent->pain = misc_model_breakable_pain;
//RACC - I think should be ->die
ent->die = misc_model_breakable_die;
//ent->think = misc_model_breakable_die;
}
ent->touch = misc_model_breakable_touch;
}
示例8: SP_target_speaker
void SP_target_speaker( gentity_t *ent ) {
char buffer[MAX_QPATH];
char *s;
G_SpawnFloat( "wait", "0", &ent->wait );
G_SpawnFloat( "random", "0", &ent->random );
if ( !G_SpawnString( "noise", "NOSOUND", &s ) ) {
G_Error( "target_speaker without a noise key at %s", vtos( ent->s.origin ) );
}
// force all client reletive sounds to be "activator" speakers that
// play on the entity that activates it
if ( s[0] == '*' ) {
ent->spawnflags |= 8;
}
// Ridah, had to disable this so we can use sound scripts
// don't worry, if the script isn't found, it'll default back to
// .wav on the client-side
//if (!strstr( s, ".wav" )) {
// Com_sprintf (buffer, sizeof(buffer), "%s.wav", s );
//} else {
Q_strncpyz( buffer, s, sizeof(buffer) );
//}
ent->noise_index = G_SoundIndex(buffer);
// a repeating speaker can be done completely client side
ent->s.eType = ET_SPEAKER;
ent->s.eventParm = ent->noise_index;
ent->s.frame = ent->wait * 10;
ent->s.clientNum = ent->random * 10;
// check for prestarted looping sound
if ( ent->spawnflags & 1 ) {
ent->s.loopSound = ent->noise_index;
}
ent->use = Use_Target_Speaker;
// GLOBAL
if (ent->spawnflags & (4|32)) {
ent->r.svFlags |= SVF_BROADCAST;
}
VectorCopy( ent->s.origin, ent->s.pos.trBase );
if (ent->spawnflags & 16)
{
ent->think = target_speaker_multiple;
ent->nextthink = level.time + 50;
}
// NO_PVS
if(ent->spawnflags & 32)
ent->s.density = 1;
else
ent->s.density = 0;
if(ent->radius)
ent->s.dmgFlags = ent->radius; // store radius in dmgflags
else
ent->s.dmgFlags = 0;
// must link the entity so we get areas and clusters so
// the server can determine who to send updates to
trap_LinkEntity( ent );
}
示例9: G_RegisterFireteam
// Should be the only function that ever creates a fireteam
void G_RegisterFireteam(/*const char* name,*/ int entityNum)
{
fireteamData_t *ft;
gentity_t *leader;
int count, ident;
if (entityNum < 0 || entityNum >= MAX_CLIENTS)
{
G_Error("G_RegisterFireteam: invalid client\n");
}
leader = &g_entities[entityNum];
if (!leader->client)
{
G_Error("G_RegisterFireteam: attempting to register a Fireteam to an entity with no client\n");
}
if (G_IsOnFireteam(entityNum, NULL))
{
G_ClientPrint(entityNum, "You are already on a fireteam, leave it first");
return;
}
if ((ft = G_FindFreeFireteam()) == NULL)
{
G_ClientPrint(entityNum, "No free fireteams available");
return;
}
if (leader->client->sess.sessionTeam != TEAM_AXIS && leader->client->sess.sessionTeam != TEAM_ALLIES)
{
G_ClientPrint(entityNum, "Only players on a team can create a fireteam");
return;
}
count = G_CountTeamFireteams(leader->client->sess.sessionTeam);
if (count >= MAX_FIRETEAMS / 2)
{
G_ClientPrint(entityNum, "Your team already has the maximum number of fireteams allowed");
return;
}
ident = G_FindFreeFireteamIdent(leader->client->sess.sessionTeam) + 1;
if (ident == 0)
{
G_ClientPrint(entityNum, "Um, something is broken, spoink Gordon");
return;
}
// good to go now, i hope!
ft->inuse = qtrue;
memset(ft->joinOrder, -1, sizeof(level.fireTeams[0].joinOrder));
ft->joinOrder[0] = leader - g_entities;
ft->ident = ident;
if (g_autoFireteams.integer)
{
ft->priv = qfalse;
trap_SendServerCommand(entityNum, "aft -1");
leader->client->pers.autofireteamEndTime = level.time + 20500;
}
else
{
ft->priv = qfalse;
}
#ifdef FEATURE_OMNIBOT
Bot_Event_FireTeamCreated(entityNum, ft->ident);
Bot_Event_JoinedFireTeam(leader - g_entities, leader);
#endif
G_UpdateFireteamConfigString(ft);
}
示例10: G_Script_ScriptParse
/*
==============
G_Script_ScriptParse
Parses the script for the given entity
==============
*/
void G_Script_ScriptParse(gentity_t *ent)
{
char *pScript;
char *token;
qboolean wantName;
qboolean inScript;
int eventNum;
g_script_event_t events[G_MAX_SCRIPT_STACK_ITEMS];
int numEventItems;
g_script_event_t *curEvent;
// DHM - Nerve :: Some of our multiplayer script commands have longer parameters
//char params[MAX_QPATH];
char params[MAX_INFO_STRING];
// dhm - end
g_script_stack_action_t *action;
int i;
int bracketLevel;
qboolean buildScript;
if (!ent->scriptName)
{
return;
}
if (!level.scriptEntity)
{
return;
}
buildScript = trap_Cvar_VariableIntegerValue("com_buildScript");
pScript = level.scriptEntity;
wantName = qtrue;
inScript = qfalse;
COM_BeginParseSession("G_Script_ScriptParse");
bracketLevel = 0;
numEventItems = 0;
memset(events, 0, sizeof(events));
while (1)
{
token = COM_Parse(&pScript);
if (!token[0])
{
if (!wantName)
{
G_Error("G_Script_ScriptParse(), Error (line %d): '}' expected, end of script found.\n", COM_GetCurrentParseLine());
}
break;
}
// end of script
if (token[0] == '}')
{
if (inScript)
{
break;
}
if (wantName)
{
G_Error("G_Script_ScriptParse(), Error (line %d): '}' found, but not expected.\n", COM_GetCurrentParseLine());
}
wantName = qtrue;
}
else if (token[0] == '{')
{
if (wantName)
{
G_Error("G_Script_ScriptParse(), Error (line %d): '{' found, NAME expected.\n", COM_GetCurrentParseLine());
}
}
else if (wantName)
{
if (!Q_stricmp(token, "bot"))
{
// a bot, skip this whole entry
SkipRestOfLine(&pScript);
// skip this section
SkipBracedSection(&pScript);
//
continue;
}
if (!Q_stricmp(token, "entity"))
{
// this is an entity, so go back to look for a name
continue;
}
if (!Q_stricmp(ent->scriptName, token))
{
inScript = qtrue;
numEventItems = 0;
}
//.........这里部分代码省略.........
示例11: destroyed
//.........这里部分代码省略.........
set size better?
multiple damage models?
custom explosion effect/sound?
*/
void SP_misc_model_breakable( gentity_t *ent )
{
char damageModel[MAX_QPATH];
char chunkModel[MAX_QPATH];
char useModel[MAX_QPATH];
int len;
// Chris F. requested default for misc_model_breakable to be NONE...so don't arbitrarily change this.
G_SpawnInt( "material", "8", (int*)&ent->material );
G_SpawnFloat( "radius", "1", &ent->radius ); // used to scale chunk code if desired by a designer
CacheChunkEffects( ent->material );
misc_model_breakable_init( ent );
len = strlen( ent->model ) - 4;
strncpy( damageModel, ent->model, len );
damageModel[len] = 0; //chop extension
strncpy( chunkModel, damageModel, sizeof(chunkModel));
strncpy( useModel, damageModel, sizeof(useModel));
if (ent->takedamage) {
//Dead/damaged model
if( !(ent->spawnflags & 8) ) { //no dmodel
strcat( damageModel, "_d1.md3" );
ent->s.modelindex2 = G_ModelIndex( damageModel );
}
//Chunk model
strcat( chunkModel, "_c1.md3" );
ent->s.modelindex3 = G_ModelIndex( chunkModel );
}
//Use model
if( ent->spawnflags & 32 ) { //has umodel
strcat( useModel, "_u1.md3" );
ent->sound1to2 = G_ModelIndex( useModel );
}
if ( !ent->mins[0] && !ent->mins[1] && !ent->mins[2] )
{
VectorSet (ent->mins, -16, -16, -16);
}
if ( !ent->maxs[0] && !ent->maxs[1] && !ent->maxs[2] )
{
VectorSet (ent->maxs, 16, 16, 16);
}
if ( ent->spawnflags & 2 )
{
ent->s.eFlags |= EF_ANIM_ALLFAST;
}
G_SetOrigin( ent, ent->s.origin );
G_SetAngles( ent, ent->s.angles );
gi.linkentity (ent);
if ( ent->spawnflags & 128 )
{//Can be used by the player's BUTTON_USE
ent->svFlags |= SVF_PLAYER_USABLE;
}
if ( ent->team && ent->team[0] )
{
ent->noDamageTeam = TranslateTeamName( ent->team );
if ( ent->noDamageTeam == TEAM_FREE )
{
G_Error("team name %s not recognized\n", ent->team);
}
}
ent->team = NULL;
//HACK
if ( ent->model && Q_stricmp( "models/map_objects/ships/tie_fighter.md3", ent->model ) == 0 )
{//run a think
G_EffectIndex( "fighter_explosion2" );
G_SoundIndex( "sound/weapons/tie_fighter/tiepass1.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/tiepass2.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/tiepass3.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/tiepass4.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/tiepass5.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/tie_fire.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/tie_fire2.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/tie_fire3.wav" );
G_SoundIndex( "sound/weapons/tie_fighter/TIEexplode.wav" );
ent->e_ThinkFunc = thinkF_TieFighterThink;
ent->nextthink = level.time + FRAMETIME;
}
float grav = 0;
G_SpawnFloat( "gravity", "0", &grav );
if ( grav )
{//affected by gravity
G_SetAngles( ent, ent->s.angles );
G_SetOrigin( ent, ent->currentOrigin );
misc_model_breakable_gravity_init( ent, qtrue );
}
}
示例12: multiplier
/*QUAKED script_mover (0.5 0.25 1.0) ? TRIGGERSPAWN SOLID EXPLOSIVEDAMAGEONLY RESURECTABLE COMPASS ALLIED AXIS MOUNTED_GUN
Scripted brush entity. A simplified means of moving brushes around based on events.
"modelscale" - Scale multiplier (defaults to 1, and scales uniformly)
"modelscale_vec" - Set scale per-axis. Overrides "modelscale", so if you have both the "modelscale" is ignored
"model2" optional md3 to draw over the solid clip brush
"scriptname" name used for scripting purposes (like aiName in AI scripting)
"health" optionally make this entity damagable
"description" used with health, if the entity is damagable, it draws a healthbar with this description above it.
*/
void SP_script_mover(gentity_t *ent)
{
float scale[3] = { 1, 1, 1 };
vec3_t scalevec;
char tagname[MAX_QPATH];
char *modelname;
char *tagent;
char cs[MAX_INFO_STRING];
char *s;
if (!ent->model)
{
G_Error("script_mover must have a \"model\"\n");
}
if (!ent->scriptName)
{
G_Error("script_mover must have a \"scriptname\"\n");
}
ent->blocked = script_mover_blocked;
// first position at start
VectorCopy(ent->s.origin, ent->pos1);
// VectorCopy( ent->r.currentOrigin, ent->pos1 );
VectorCopy(ent->pos1, ent->pos2); // don't go anywhere just yet
trap_SetBrushModel(ent, ent->model);
InitMover(ent);
ent->reached = NULL;
ent->s.animMovetype = 0;
ent->s.density = 0;
if (ent->spawnflags & 256)
{
ent->s.density |= 2;
}
if (ent->spawnflags & 8)
{
ent->use = script_mover_use;
}
if (ent->spawnflags & 16)
{
ent->s.time2 = 1;
}
else
{
ent->s.time2 = 0;
}
if (ent->spawnflags & 32)
{
ent->s.teamNum = TEAM_ALLIES;
}
else if (ent->spawnflags & 64)
{
ent->s.teamNum = TEAM_AXIS;
}
else
{
ent->s.teamNum = TEAM_FREE;
}
if (ent->spawnflags & 1)
{
ent->use = script_mover_use;
trap_UnlinkEntity(ent); // make sure it's not visible
return;
}
G_SetAngle(ent, ent->s.angles);
G_SpawnInt("health", "0", &ent->health);
if (ent->health)
{
ent->takedamage = qtrue;
ent->count = ent->health;
// client needs to know about it as well
ent->s.effect1Time = ent->count;
ent->s.dl_intensity = 255;
if (G_SpawnString("description", "", &s))
{
trap_GetConfigstring(CS_SCRIPT_MOVER_NAMES, cs, sizeof(cs));
//.........这里部分代码省略.........
示例13: sizeof
void *G_Alloc( int size )
{
// Find a free block and allocate.
// Does two passes, attempts to fill same-sized free slot first.
struct freememnode *fmn, *prev, *next, *smallest;
int allocsize, smallestsize;
char *endptr;
int *ptr;
allocsize = ( size + sizeof( int ) + ROUNDBITS ) & ~ROUNDBITS; // Round to 32-byte boundary
ptr = NULL;
smallest = NULL;
smallestsize = POOLSIZE + 1; // Guaranteed not to miss any slots :)
for ( fmn = freehead; fmn; fmn = fmn->next )
{
if ( fmn->cookie != FREEMEMCOOKIE )
{
G_Error( "G_Alloc: Memory corruption detected!\n" );
}
if ( fmn->size >= allocsize )
{
// We've got a block
if ( fmn->size == allocsize )
{
// Same size, just remove
prev = fmn->prev;
next = fmn->next;
if ( prev )
{
prev->next = next; // Point previous node to next
}
if ( next )
{
next->prev = prev; // Point next node to previous
}
if ( fmn == freehead )
{
freehead = next; // Set head pointer to next
}
ptr = ( int * ) fmn;
break; // Stop the loop, this is fine
}
else
{
// Keep track of the smallest free slot
if ( fmn->size < smallestsize )
{
smallest = fmn;
smallestsize = fmn->size;
}
}
}
}
if ( !ptr && smallest )
{
// We found a slot big enough
smallest->size -= allocsize;
endptr = ( char * ) smallest + smallest->size;
ptr = ( int * ) endptr;
}
if ( ptr )
{
freemem -= allocsize;
if ( g_debugAlloc.integer )
{
G_Printf( "G_Alloc of %i bytes (%i left)\n", allocsize, freemem );
}
memset( ptr, 0, allocsize );
*ptr++ = allocsize; // Store a copy of size for deallocation
return ( ( void * ) ptr );
}
G_Error( "G_Alloc: failed on allocation of %i bytes\n", size );
return ( NULL );
}
示例14: G_ScriptAction_GotoMarker
/*
===============
G_ScriptAction_GotoMarker
syntax: gotomarker <targetname> <speed> [accel/deccel] [turntotarget] [wait]
NOTE: speed may be modified to round the duration to the next 50ms for smooth
transitions
===============
*/
qboolean G_ScriptAction_GotoMarker( gentity_t *ent, char *params ) {
char *pString, *token;
gentity_t *target;
vec3_t vec;
float speed, dist;
qboolean wait = qfalse, turntotarget = qfalse;
int trType;
int duration, i;
vec3_t diff;
vec3_t angles;
if ( params && ( ent->scriptStatus.scriptFlags & SCFL_GOING_TO_MARKER ) ) {
// we can't process a new movement until the last one has finished
return qfalse;
}
if ( !params || ent->scriptStatus.scriptStackChangeTime < level.time ) { // we are waiting for it to reach destination
if ( ent->s.pos.trTime + ent->s.pos.trDuration <= level.time ) { // we made it
ent->scriptStatus.scriptFlags &= ~SCFL_GOING_TO_MARKER;
// set the angles at the destination
BG_EvaluateTrajectory( &ent->s.apos, ent->s.apos.trTime + ent->s.apos.trDuration, ent->s.angles );
VectorCopy( ent->s.angles, ent->s.apos.trBase );
VectorCopy( ent->s.angles, ent->r.currentAngles );
ent->s.apos.trTime = level.time;
ent->s.apos.trDuration = 0;
ent->s.apos.trType = TR_STATIONARY;
VectorClear( ent->s.apos.trDelta );
// stop moving
BG_EvaluateTrajectory( &ent->s.pos, level.time, ent->s.origin );
VectorCopy( ent->s.origin, ent->s.pos.trBase );
VectorCopy( ent->s.origin, ent->r.currentOrigin );
ent->s.pos.trTime = level.time;
ent->s.pos.trDuration = 0;
ent->s.pos.trType = TR_STATIONARY;
VectorClear( ent->s.pos.trDelta );
script_linkentity( ent );
return qtrue;
}
} else { // we have just started this command
pString = params;
token = COM_ParseExt( &pString, qfalse );
if ( !token[0] ) {
G_Error( "G_Scripting: gotomarker must have an targetname\n" );
}
// find the entity with the given "targetname"
target = G_Find( NULL, FOFS( targetname ), token );
if ( !target ) {
G_Error( "G_Scripting: can't find entity with \"targetname\" = \"%s\"\n", token );
}
VectorSubtract( target->r.currentOrigin, ent->r.currentOrigin, vec );
token = COM_ParseExt( &pString, qfalse );
if ( !token[0] ) {
G_Error( "G_Scripting: gotomarker must have a speed\n" );
}
speed = atof( token );
trType = TR_LINEAR_STOP;
while ( token[0] ) {
token = COM_ParseExt( &pString, qfalse );
if ( token[0] ) {
if ( !Q_stricmp( token, "accel" ) ) {
trType = TR_ACCELERATE;
} else if ( !Q_stricmp( token, "deccel" ) ) {
trType = TR_DECCELERATE;
} else if ( !Q_stricmp( token, "wait" ) ) {
wait = qtrue;
} else if ( !Q_stricmp( token, "turntotarget" ) ) {
turntotarget = qtrue;
}
}
}
// start the movement
if ( ent->s.eType == ET_MOVER ) {
VectorCopy( vec, ent->movedir );
VectorCopy( ent->r.currentOrigin, ent->pos1 );
VectorCopy( target->r.currentOrigin, ent->pos2 );
ent->speed = speed;
dist = VectorDistance( ent->pos1, ent->pos2 );
//.........这里部分代码省略.........
示例15: G_RemoveClientFromFireteams
// The only way a client should be removed from a fireteam
void G_RemoveClientFromFireteams(int entityNum, qboolean update, qboolean print)
{
fireteamData_t *ft;
int i;
if ((entityNum < 0 || entityNum >= MAX_CLIENTS) || !g_entities[entityNum].client)
{
G_Error("G_RemoveClientFromFireteams: invalid client\n");
}
if (G_IsOnFireteam(entityNum, &ft))
{
int j, firstHuman;
for (i = 0; i < MAX_FIRETEAM_MEMBERS && i < g_maxclients.integer; ++i)
{
if (ft->joinOrder[i] == entityNum)
{
if (i == 0)
{
if (ft->joinOrder[1] == -1)
{
ft->inuse = qfalse;
ft->ident = -1;
}
else
{
// core: only bots left in the fireteam? we disband the fireteam..
if (G_OnlyBotsInFireteam(ft, entityNum, &firstHuman))
{
// empty the fireteam
for (j = 0; j < g_maxclients.integer - 1; j++)
{
#ifdef FEATURE_OMNIBOT
Bot_Event_LeftFireTeam(ft->joinOrder[j]);
#endif
ft->joinOrder[j] = -1;
}
ft->inuse = qfalse;
ft->ident = -1;
G_UpdateFireteamConfigString(ft);
return;
}
else
{
// core: a bot as FT-leader? we try to pick a human..
if (g_entities[(int)(ft->joinOrder[1])].r.svFlags & SVF_BOT)
{
if (firstHuman != -1)
{
// Swap first human with first bot..
int tmp = ft->joinOrder[1];
ft->joinOrder[1] = ft->joinOrder[firstHuman];
ft->joinOrder[firstHuman] = tmp;
}
}
else
{
firstHuman = 1;
}
// Inform client of promotion to leader
if (firstHuman != -1)
{
trap_SendServerCommand(ft->joinOrder[firstHuman], "cpm \"You are now the leader of your fireteam\"\n");
}
}
}
}
for (j = i; j < g_maxclients.integer - 1; j++)
{
ft->joinOrder[j] = ft->joinOrder[j + 1];
}
ft->joinOrder[g_maxclients.integer - 1] = -1;
break;
}
}
}
else
{
return;
}
#ifdef FEATURE_OMNIBOT
Bot_Event_LeftFireTeam(entityNum);
#endif
if (print)
{
for (i = 0; i < MAX_CLIENTS; i++)
{
if (ft->joinOrder[i] == -1)
{
break;
}
trap_SendServerCommand(ft->joinOrder[i], va("cpm \"%s ^7has left the Fireteam\"\n", level.clients[entityNum].pers.netname));
}
//.........这里部分代码省略.........