/* ============ ScorePlum ============ */ void ScorePlum( gentity_t *ent, vec3_t origin, int score ) { gentity_t *plum; plum = G_TempEntity( origin, EV_SCOREPLUM ); // only send this temp entity to a single player plum->r.svFlags |= SVF_PLAYERMASK; Com_ClientListClear( &plum->r.sendPlayers ); Com_ClientListAdd( &plum->r.sendPlayers, ent->s.number ); // plum->s.otherEntityNum = ent->s.number; plum->s.time = score; }
/* ================== G_ClientListForTeam ================== */ static clientList_t G_ClientListForTeam(team_t team) { int i; clientList_t clientList; Com_Memset(&clientList, 0, sizeof(clientList_t)); for (i = 0; i < g_maxclients.integer; i++) { gentity_t *ent = g_entities + i; if (ent->client->pers.connected != CON_CONNECTED) continue; if (ent->inuse && (ent->client->ps.stats[STAT_TEAM] == team)) Com_ClientListAdd(&clientList, ent->client->ps.clientNum); } return clientList; }
/* ================== G_ClientListForTeam ================== */ static clientList_t G_ClientListForTeam( team_t team ) { int i; clientList_t clientList; Com_Memset( &clientList, 0, sizeof( clientList_t ) ); for ( i = 0; i < level.maxclients; i++ ) { gentity_t *ent = g_entities + i; if ( ent->client->pers.connected != CON_CONNECTED ) { continue; } if ( ent->inuse && ( ent->client->pers.team == team ) ) { Com_ClientListAdd( &clientList, ent->client->ps.clientNum ); } } return clientList; }
/* =============== Touch_Item =============== */ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) { int respawn; qboolean predict; if (!other->player) return; if (other->health < 1) return; // dead people can't pickup // the same pickup rules are used for client side and server side if ( !BG_CanItemBeGrabbed( g_gametype.integer, &ent->s, &other->player->ps ) ) { return; } G_LogPrintf( "Item: %i %s\n", other->s.number, ent->item->classname ); predict = other->player->pers.predictItemPickup; // call the item-specific pickup function switch( ent->item->giType ) { case IT_WEAPON: respawn = Pickup_Weapon(ent, other); // predict = qfalse; break; case IT_AMMO: respawn = Pickup_Ammo(ent, other); // predict = qfalse; break; case IT_ARMOR: respawn = Pickup_Armor(ent, other); break; case IT_HEALTH: respawn = Pickup_Health(ent, other); break; case IT_POWERUP: respawn = Pickup_Powerup(ent, other); predict = qfalse; break; case IT_PERSISTANT_POWERUP: respawn = Pickup_PersistantPowerup(ent, other); break; case IT_TEAM: respawn = Pickup_Team(ent, other); break; case IT_HOLDABLE: respawn = Pickup_Holdable(ent, other); break; default: return; } if ( !respawn ) { return; } // play the normal pickup sound if (predict) { G_AddPredictableEvent( other, EV_ITEM_PICKUP, ent->s.modelindex ); } else { G_AddEvent( other, EV_ITEM_PICKUP, ent->s.modelindex ); } // powerup pickups are global broadcasts if ( ent->item->giType == IT_POWERUP || ent->item->giType == IT_TEAM) { // if we want the global sound to play if (!ent->speed) { gentity_t *te; te = G_TempEntity( ent->s.pos.trBase, EV_GLOBAL_ITEM_PICKUP ); te->s.eventParm = ent->s.modelindex; te->r.svFlags |= SVF_BROADCAST; } else { gentity_t *te; te = G_TempEntity( ent->s.pos.trBase, EV_GLOBAL_ITEM_PICKUP ); te->s.eventParm = ent->s.modelindex; // only send this temp entity to a single player te->r.svFlags |= SVF_PLAYERMASK; Com_ClientListClear( &te->r.sendPlayers ); Com_ClientListAdd( &te->r.sendPlayers, other->s.number ); } } // fire item targets G_UseTargets (ent, other); // wait of -1 will not respawn if ( ent->wait == -1 ) { ent->r.svFlags |= SVF_NOCLIENT; ent->s.eFlags |= EF_NODRAW; ent->s.contents = 0; ent->unlinkAfterEvent = qtrue; return; } // non zero wait overrides respawn time if ( ent->wait ) { respawn = ent->wait; } // random can be used to vary the respawn time if ( ent->random ) { respawn += crandom() * ent->random; if ( respawn < 1 ) { respawn = 1; } } // dropped items will not respawn if ( ent->flags & FL_DROPPED_ITEM ) { ent->freeAfterEvent = qtrue; } // picked up items still stay around, they just don't // draw anything. This allows respawnable items // to be placed on movers. ent->r.svFlags |= SVF_NOCLIENT; ent->s.eFlags |= EF_NODRAW; ent->s.contents = 0; // ZOID // A negative respawn times means to never respawn this item (but don't // delete it). This is used by items that are respawned by third party // events such as ctf flags if ( respawn <= 0 ) { ent->nextthink = 0; ent->think = 0; } else { ent->nextthink = level.time + respawn * 1000; ent->think = RespawnItem; } trap_LinkEntity( ent ); }