void WidowSpawn(edict_t *self) { vec3_t f, r, u, offset, startpoint, spawnpoint; edict_t *ent, *designated_enemy; int i; if (!self) { return; } AngleVectors(self->s.angles, f, r, u); for (i = 0; i < 2; i++) { VectorCopy(spawnpoints[i], offset); G_ProjectSource2(self->s.origin, offset, f, r, u, startpoint); if (FindSpawnPoint(startpoint, stalker_mins, stalker_maxs, spawnpoint, 64)) { ent = CreateGroundMonster(spawnpoint, self->s.angles, stalker_mins, stalker_maxs, "monster_stalker", 256); if (!ent) { continue; } self->monsterinfo.monster_used++; ent->monsterinfo.commander = self; ent->nextthink = level.time; ent->think(ent); ent->monsterinfo.aiflags |= /* AI_SPAWNED_WIDOW | */ AI_DO_NOT_COUNT | AI_IGNORE_SHOTS; designated_enemy = self->enemy; if ((designated_enemy->inuse) && (designated_enemy->health > 0)) { ent->enemy = designated_enemy; FoundTarget(ent); ent->monsterinfo.attack(ent); } } } }
void medic_finish_spawn (edict_t *self) { edict_t *ent; vec3_t f, r, offset, startpoint, spawnpoint; int summonStr; int count; int inc; int num_summoned; // should be 1, 3, or 5 qboolean behind = false; edict_t *designated_enemy; // trace_t tr; // vec3_t mins, maxs; // this is one bigger than the soldier's real mins .. just for paranoia's sake // VectorSet (mins, -17, -17, -25); // VectorSet (maxs, 17, 17, 33); //FIXME - better place to store this info? if (self->plat2flags < 0) { behind = true; self->plat2flags *= -1; } summonStr = self->plat2flags; AngleVectors (self->s.angles, f, r, NULL); // num_summoned = ((((summonStr-1)/2)+1)*2)-1; // this yields either 1, 3, or 5 if (summonStr) num_summoned = (summonStr - 1) + (summonStr % 2); else num_summoned = 1; // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("medic_commander: summonStr = %d num = %d\n", summonStr, num_summoned); for (count = 0; count < num_summoned; count++) { inc = count + (count%2); // 0, 2, 2, 4, 4 VectorCopy (reinforcement_position[count], offset); G_ProjectSource (self->s.origin, offset, f, r, startpoint); // a little off the ground startpoint[2] += 10; ent = NULL; if (FindSpawnPoint (startpoint, reinforcement_mins[summonStr-inc], reinforcement_maxs[summonStr-inc], spawnpoint, 32)) { if (CheckSpawnPoint (spawnpoint, reinforcement_mins[summonStr-inc], reinforcement_maxs[summonStr-inc])) ent = CreateGroundMonster (spawnpoint, self->s.angles, reinforcement_mins[summonStr-inc], reinforcement_maxs[summonStr-inc], reinforcements[summonStr-inc], 256); // else if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("CheckSpawnPoint failed volume check!\n"); } else { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("FindSpawnPoint failed to find a point!\n"); } if (!ent) { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("Spawn point obstructed for %s, aborting!\n", reinforcements[summonStr-inc]); continue; } // gi.sound (self, CHAN_WEAPON, commander_sound_spawn, 1, ATTN_NORM, 0); if (ent->think) { ent->nextthink = level.time; ent->think (ent); } ent->monsterinfo.aiflags |= AI_IGNORE_SHOTS|AI_DO_NOT_COUNT|AI_SPAWNED_MEDIC_C; ent->monsterinfo.commander = self; self->monsterinfo.monster_slots--; // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("medic_commander: %d slots remaining\n", self->monsterinfo.monster_slots); if (self->monsterinfo.aiflags & AI_MEDIC) designated_enemy = self->oldenemy; else designated_enemy = self->enemy; if (coop && coop->value) { designated_enemy = PickCoopTarget(ent); if (designated_enemy) { // try to avoid using my enemy if (designated_enemy == self->enemy) { designated_enemy = PickCoopTarget(ent); if (designated_enemy) { // if ((g_showlogic) && (g_showlogic->value)) // { // gi.dprintf ("PickCoopTarget returned a %s - ", designated_enemy->classname); // if (designated_enemy->client) // gi.dprintf ("with name %s\n", designated_enemy->client->pers.netname); // else // gi.dprintf ("NOT A CLIENT\n"); // } } else { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("pick coop failed, using my current enemy\n"); designated_enemy = self->enemy; } } } else { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("pick coop failed, using my current enemy\n"); designated_enemy = self->enemy; } } if ((designated_enemy) && (designated_enemy->inuse) && (designated_enemy->health > 0)) { // fixme // if ((g_showlogic) && (g_showlogic -> value)) // gi.dprintf ("setting enemy to %s\n", designated_enemy->classname); ent->enemy = designated_enemy; FoundTarget (ent); } else { ent->enemy = NULL; ent->monsterinfo.stand (ent); } // ent->s.event = EV_PLAYER_TELEPORT; } }
void Widow2Spawn (edict_t *self) { vec3_t f, r, u, offset, startpoint, spawnpoint; edict_t *ent, *designated_enemy; int i; AngleVectors (self->s.angles, f, r, u); for (i=0; i < 2; i++) { VectorCopy (spawnpoints[i], offset); G_ProjectSource2 (self->s.origin, offset, f, r, u, startpoint); if (FindSpawnPoint (startpoint, stalker_mins, stalker_maxs, spawnpoint, 64)) { ent = CreateGroundMonster (spawnpoint, self->s.angles, stalker_mins, stalker_maxs, "monster_stalker", 256); if (!ent) continue; self->monsterinfo.monster_used++; ent->monsterinfo.commander = self; // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("widow: post-spawn : %d slots left\n", SELF_SLOTS_LEFT); ent->nextthink = level.time; ent->think (ent); ent->monsterinfo.aiflags |= AI_SPAWNED_WIDOW|AI_DO_NOT_COUNT|AI_IGNORE_SHOTS; if (!(coop && coop->value)) { designated_enemy = self->enemy; } else { designated_enemy = PickCoopTarget(ent); if (designated_enemy) { // try to avoid using my enemy if (designated_enemy == self->enemy) { designated_enemy = PickCoopTarget(ent); if (designated_enemy) { // if ((g_showlogic) && (g_showlogic->value)) // { // gi.dprintf ("PickCoopTarget returned a %s - ", designated_enemy->classname); // if (designated_enemy->client) // gi.dprintf ("with name %s\n", designated_enemy->client->pers.netname); // else // gi.dprintf ("NOT A CLIENT\n"); // } } else { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("pick coop failed, using my current enemy\n"); designated_enemy = self->enemy; } } } else { // if ((g_showlogic) && (g_showlogic->value)) // gi.dprintf ("pick coop failed, using my current enemy\n"); designated_enemy = self->enemy; } } if ((designated_enemy->inuse) && (designated_enemy->health > 0)) { ent->enemy = designated_enemy; FoundTarget (ent); ent->monsterinfo.attack(ent); } } } }