void SP_misc_beam(gentity_t *self) { char *str; G_SpawnString("target2", "", &str); if (*str) { self->message = G_NewString(str); } G_SpawnString("shader", "lightningBolt", &str); if (*str) { self->s.modelindex2 = G_ShaderIndex(str); } G_SpawnInt("scale", "1", &self->s.torsoAnim); G_SpawnVector("color", "1 1 1", self->s.angles2); // let everything else get spawned before we start firing self->accuracy = 0; self->think = misc_beam_start; self->nextthink = level.time + FRAMETIME; }
void SP_gfx_light_flare( gentity_t *self ) { self->s.eType = ET_LIGHTFLARE; self->s.modelindex = G_ShaderIndex( self->shaderKey ); VectorCopy( self->activatedPosition, self->s.origin2 ); //try to find a spot near to the flare which is empty. This //is used to facilitate visibility testing findEmptySpot( self->s.origin, 8.0f, self->s.angles2 ); self->act = gfx_light_flare_toggle; if( !self->config.speed ) self->config.speed = 200; self->s.time = self->config.speed; G_SpawnInt( "mindist", "0", &self->s.generic1 ); if ( self->spawnflags & SPF_SPAWN_DISABLED ) { self->s.eFlags |= EF_NODRAW; } trap_LinkEntity( self ); }
const char *BuildShaderStateConfig() { static char buff[MAX_STRING_CHARS * 4]; char out[( MAX_QPATH * 2 ) + 5]; int i; memset( buff, 0, MAX_STRING_CHARS ); for ( i = 0; i < remapCount; i++ ) { int i1, i2; i1 = G_ShaderIndex( remappedShaders[i].oldShader ); i2 = G_ShaderIndex( remappedShaders[i].newShader ); Com_sprintf( out, ( MAX_QPATH * 2 ) + 5, "%i=%i:%5.2f@", i1, i2, remappedShaders[i].timeOffset ); Q_strcat( buff, sizeof( buff ), out ); } return buff; }
/* =============== SP_misc_light_flare Spawn function for light flare =============== */ void SP_misc_light_flare(gentity_t *self) { self->s.eType = ET_LIGHTFLARE; self->s.modelindex = G_ShaderIndex(self->targetShaderName); VectorCopy(self->pos2, self->s.origin2); //try to find a spot near to the flare which is empty. This //is used to facilitate visibility testing findEmptySpot(self->s.origin, 8.0f, self->s.angles2); self->use = SP_use_light_flare; G_SpawnFloat("speed", "200", &self->speed); self->s.time = self->speed; G_SpawnInt("mindist", "0", &self->s.generic1); if (self->spawnflags & 1) self->s.eFlags |= EF_NODRAW; trap_LinkEntity(self); }
/* ============== G_Script_ScriptParse Parses the script for the given entity ============== */ void G_Script_ScriptParse(gentity_t *ent) { char *pScript; qboolean wantName; qboolean inScript; int eventNum; g_script_event_t events[G_MAX_SCRIPT_STACK_ITEMS]; int numEventItems; g_script_event_t *curEvent; char params[MAX_INFO_STRING]; 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)); for (;;) { char *token; 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; } wantName = qfalse; } else if (inScript) { Q_strlwr(token); eventNum = G_Script_EventForString(token); if (eventNum < 0) { G_Error("G_Script_ScriptParse(), Error (line %d): unknown event: %s.\n", COM_GetCurrentParseLine(), token); } if (numEventItems >= G_MAX_SCRIPT_STACK_ITEMS) { G_Error("G_Script_ScriptParse(), Error (line %d): G_MAX_SCRIPT_STACK_ITEMS reached (%d)\n", COM_GetCurrentParseLine(), G_MAX_SCRIPT_STACK_ITEMS); } curEvent = &events[numEventItems]; curEvent->eventNum = eventNum; memset(params, 0, sizeof (params)); // parse any event params before the start of this event's actions while ((token = COM_Parse(&pScript)) != NULL && (token[0] != '{')) { if (!token[0]) { G_Error("G_Script_ScriptParse(), Error (line %d): '}' expected, end of script found.\n", COM_GetCurrentParseLine()); } if (strlen(params)) { // add a space between each param Q_strcat(params, sizeof (params), " "); } Q_strcat(params, sizeof (params), token); } if (strlen(params)) { // copy the params into the event curEvent->params = G_Alloc(strlen(params) + 1); Q_strncpyz(curEvent->params, params, strlen(params) + 1); } // parse the actions for this event while ((token = COM_Parse(&pScript)) != NULL && (token[0] != '}')) { if (!token[0]) { G_Error("G_Script_ScriptParse(), Error (line %d): '}' expected, end of script found.\n", COM_GetCurrentParseLine()); } action = G_Script_ActionForString(token); if (!action) { G_Error("G_Script_ScriptParse(), Error (line %d): unknown action: %s.\n", COM_GetCurrentParseLine(), token); } curEvent->stack.items[curEvent->stack.numItems].action = action; memset(params, 0, sizeof (params)); // Ikkyo - Parse for {}'s if this is a set command // Nico, added "create" & "delete" condition if (!Q_stricmp(action->actionString, "set") || !Q_stricmp(action->actionString, "create") || !Q_stricmp(action->actionString, "delete")) { token = COM_Parse(&pScript); if (token[0] != '{') { COM_ParseError("'{' expected, found: %s.\n", token); } while ((token = COM_Parse(&pScript)) != NULL && (token[0] != '}')) { if (strlen(params)) { // add a space between each param Q_strcat(params, sizeof (params), " "); } if (strrchr(token, ' ')) { // need to wrap this param in quotes since it has more than one word Q_strcat(params, sizeof (params), "\""); } Q_strcat(params, sizeof (params), token); if (strrchr(token, ' ')) { // need to wrap this param in quotes since it has mor Q_strcat(params, sizeof (params), "\""); } } } else // hackly precaching of custom characters if (!Q_stricmp(token, "spawnbot")) { // this is fairly indepth, so I'll move it to a separate function for readability G_Script_ParseSpawnbot(&pScript, params, MAX_INFO_STRING); } else { token = COM_ParseExt(&pScript, qfalse); for (i = 0; token[0]; ++i) { if (strlen(params)) { // add a space between each param Q_strcat(params, sizeof (params), " "); } if (i == 0) { // Special case: playsound's need to be cached on startup to prevent in-game pauses if (!Q_stricmp(action->actionString, "playsound")) { G_SoundIndex(token); } else if (!Q_stricmp(action->actionString, "changemodel")) { G_ModelIndex(token); } else if (buildScript && (!Q_stricmp(action->actionString, "mu_start") || !Q_stricmp(action->actionString, "mu_play") || !Q_stricmp(action->actionString, "mu_queue") || !Q_stricmp(action->actionString, "startcam")) && strlen(token)) { trap_SendServerCommand(-1, va("addToBuild %s\n", token)); } } if ((i == 0 || i == 1) && !Q_stricmp(action->actionString, "remapshader")) { G_ShaderIndex(token); } if (strrchr(token, ' ')) { // need to wrap this param in quotes since it has more than one word Q_strcat(params, sizeof (params), "\""); } Q_strcat(params, sizeof (params), token); if (strrchr(token, ' ')) { // need to wrap this param in quotes since it has more than one word Q_strcat(params, sizeof (params), "\""); } token = COM_ParseExt(&pScript, qfalse); } } if (strlen(params)) { // copy the params into the event curEvent->stack.items[curEvent->stack.numItems].params = G_Alloc(strlen(params) + 1); Q_strncpyz(curEvent->stack.items[curEvent->stack.numItems].params, params, strlen(params) + 1); } curEvent->stack.numItems++; if (curEvent->stack.numItems >= G_MAX_SCRIPT_STACK_ITEMS) { G_Error("G_Script_ScriptParse(): script exceeded G_MAX_SCRIPT_STACK_ITEMS (%d), line %d\n", G_MAX_SCRIPT_STACK_ITEMS, COM_GetCurrentParseLine()); } } numEventItems++; } else { // skip this character completely // TTimo gcc: suggest parentheses around assignment used as truth value while ((token = COM_Parse(&pScript)) != NULL) { if (!token[0]) { G_Error("G_Script_ScriptParse(), Error (line %d): '}' expected, end of script found.\n", COM_GetCurrentParseLine()); } else if (token[0] == '{') { bracketLevel++; } else if (token[0] == '}' && !--bracketLevel) { break; } } } } // alloc and copy the events into the gentity_t for this cast if (numEventItems > 0) { ent->scriptEvents = G_Alloc(sizeof (g_script_event_t) * numEventItems); memcpy(ent->scriptEvents, events, sizeof (g_script_event_t) * numEventItems); ent->numScriptEvents = numEventItems; } }
void SP_target_smoke(gentity_t *ent) { char *buffer; if (G_SpawnString("shader", "", &buffer)) { ent->s.modelindex2 = G_ShaderIndex(buffer); } else { ent->s.modelindex2 = 0; } // Arnout - modified this a lot to be sent to the client as one entity and then is shown at the client if (!ent->delay) { ent->delay = 100; } ent->use = smoke_toggle; ent->think = smoke_init; ent->nextthink = level.time + FRAMETIME; G_SetOrigin(ent, ent->s.origin); ent->r.svFlags = 0; ent->s.eType = ET_SMOKER; if (ent->spawnflags & 2) { ent->s.density = 4; } else { ent->s.density = 0; } // using "time" ent->s.time = ent->speed; if (!ent->s.time) { ent->s.time = 5000; // 5 seconds } ent->s.time2 = ent->duration; if (!ent->s.time2) { ent->s.time2 = 2000; } ent->s.angles2[0] = ent->start_size; if (!ent->s.angles2[0]) { ent->s.angles2[0] = 24; } ent->s.angles2[1] = ent->end_size; if (!ent->s.angles2[1]) { ent->s.angles2[1] = 96; } ent->s.angles2[2] = ent->wait; if (!ent->s.angles2[2]) { ent->s.angles2[2] = 50; } // idiot check if (ent->s.time < ent->s.time2) { ent->s.time = ent->s.time2 + 100; } if (ent->spawnflags & 8) { ent->s.frame = 1; } ent->s.dl_intensity = ent->health; ent->s.constantLight = ent->delay; if (ent->spawnflags & 4) { trap_LinkEntity(ent); } }
void SP_trigger_objective_info( gentity_t *ent ) { char *scorestring; char* customimage; int cix, cia, objflags; if ( !ent->track ) G_Error ("'trigger_objective_info' does not have a 'track' \n"); /* if ( !ent->message ) G_Error ("'trigger_objective_info' does not have a 'shortname' \n");*/ if(ent->spawnflags & MESSAGE_OVERRIDE) { if ( !ent->spawnitem ) G_Error ("'trigger_objective_info' has override flag set but no override text\n"); } // Gordon: for specifying which commandmap objectives this entity "belongs" to G_SpawnInt( "objflags", "0", &objflags ); if(G_SpawnString( "customimage", "", &customimage )) { cix = cia = G_ShaderIndex( customimage ); } else { if(G_SpawnString( "customaxisimage", "", &customimage )) { cix = G_ShaderIndex( customimage ); } else { cix = 0; } if(G_SpawnString( "customalliesimage", "", &customimage )) { cia = G_ShaderIndex( customimage ); } else if(G_SpawnString( "customalliedimage", "", &customimage )) { cia = G_ShaderIndex( customimage ); } else { cia = 0; } } G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "e", va( "%i", ent-g_entities ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "o", va( "%i", objflags ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "cix", va( "%i", cix ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "cia", va( "%i", cia ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "s", va( "%i", ent->spawnflags ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "n", ent->message ? ent->message : "" ); if( level.numOidTriggers >= MAX_OID_TRIGGERS ) { G_Error ("Exceeded maximum number of 'trigger_objective_info' entities\n"); } // JPW NERVE -- if this trigger has a "score" field set, then blowing up an objective // inside of this field will add "score" to the right player team. storing this // in ent->accuracy since that's unused. G_SpawnString ("score", "0", &scorestring); ent->accuracy = atof (scorestring); trap_SetConfigstring( CS_OID_TRIGGERS + level.numOidTriggers, ent->track ); InitTrigger( ent ); if( ent->s.origin[0] || ent->s.origin[1] || ent->s.origin[2] ) { G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "x", va( "%i", (int)ent->s.origin[0] ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "y", va( "%i", (int)ent->s.origin[1] ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "z", va( "%i", (int)ent->s.origin[2] ) ); } else { vec3_t mid; VectorAdd( ent->r.absmin, ent->r.absmax, mid ); VectorScale( mid, 0.5f, mid ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "x", va( "%i", (int)mid[0] ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "y", va( "%i", (int)mid[1] ) ); G_SetConfigStringValue( CS_OID_DATA + level.numOidTriggers, "z", va( "%i", (int)mid[2] ) ); } ent->s.teamNum = level.numOidTriggers++; // unlike other triggers, we need to send this one to the client ent->r.svFlags &= ~SVF_NOCLIENT; ent->s.eType = ET_OID_TRIGGER; if( !ent->target ) { // no target - just link and go trap_LinkEntity (ent); } else { // Arnout: finalize spawing on fourth frame to allow for proper linking with targets ent->nextthink = level.time + (3*FRAMETIME); ent->think = Think_SetupObjectiveInfo; } }