/* ============= G_NewTarget ============= */ gentityCallDefinition_t G_NewCallDefinition( char *eventKey, const char *string ) { char *stringPointer; int i, stringLength; gentityCallDefinition_t newCallDefinition = { NULL, ON_DEFAULT, NULL, NULL, ECA_NOP }; stringLength = strlen( string ) + 1; if(stringLength == 1) return newCallDefinition; stringPointer = BG_Alloc( stringLength ); newCallDefinition.name = stringPointer; for ( i = 0; i < stringLength; i++ ) { if ( string[ i ] == ':' && !newCallDefinition.action ) { *stringPointer++ = '\0'; newCallDefinition.action = stringPointer; continue; } *stringPointer++ = string[ i ]; } newCallDefinition.actionType = G_GetCallActionTypeFor( newCallDefinition.action ); newCallDefinition.event = eventKey; newCallDefinition.eventType = G_GetCallEventTypeFor( newCallDefinition.event ); return newCallDefinition; }
void Svcmd_EntityFire_f() { char argument[ MAX_STRING_CHARS ]; int entityNum; gentity_t *selection; gentityCall_t call; gentityCallDefinition_t callDefinition = { nullptr, ON_DEFAULT, nullptr, nullptr, ECA_DEFAULT }; if ( trap_Argc() < 2 || trap_Argc() > 3 ) { G_Printf( "usage: entityFire <entityNum> [<action>]\n" ); return; } trap_Argv( 1, argument, sizeof( argument ) ); entityNum = atoi( argument ); if ( entityNum >= level.num_entities || entityNum < MAX_CLIENTS ) { G_Printf( "invalid entityId %d\n", entityNum ); return; } selection = &g_entities[entityNum]; if (!selection->inuse) { G_Printf("entity slot %d is not in use\n", entityNum); return; } if( trap_Argc() >= 3 ) { trap_Argv( 2, argument, sizeof( argument ) ); callDefinition.action = argument; callDefinition.actionType = G_GetCallActionTypeFor( callDefinition.action ); } G_Printf( "firing %s:%s\n", etos( selection ), callDefinition.action ? callDefinition.action : "default" ); if(selection->names[0]) callDefinition.name = selection->names[0]; call.definition = &callDefinition; call.caller = &g_entities[ ENTITYNUM_NONE ]; call.activator = &g_entities[ ENTITYNUM_NONE ] ; G_CallEntity(selection, &call); }
void G_ReorderCallTargets( gentity_t *ent ) { int i, j; // don't leave any "gaps" between multiple targets j = 0; for (i = 0; i < MAX_ENTITY_CALLTARGETS; ++i) { if (ent->calltargets[i].name) { ent->calltargets[j] = ent->calltargets[i]; ent->calltargets[j].actionType = G_GetCallActionTypeFor(ent->calltargets[i].action); j++; } } ent->calltargets[ j ].name = NULL; ent->calltargets[ j ].action = NULL; ent->calltargets[ j ].actionType = ECA_NOP; ent->callTargetCount = j; }