// g_joe_misc.c // JOSEPH 14-JUN-99 ALL #include "g_local.h" /*QUAKED props_hydrant (0 .5 .8) (-10 -10 -19) (10 10 19) A hydrant that does jack model="models\props\hydrant\" */ void metal_explode (edict_t *self) { vec3_t org; float spd; vec3_t save; edict_t *breakit; extern void breakittrash_sound (edict_t *self); VectorCopy (self->s.origin, save); VectorMA (self->absmin, 0.5, self->size, self->s.origin); // a few big chunks spd = 1.5 * (float)self->dmg / 200.0; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); // bottom corners spd = 1.75 * (float)self->dmg / 200.0; VectorCopy (self->absmin, org); ThrowDebris (self, "models/props/metal/metal2.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; ThrowDebris (self, "models/props/metal/metal3.md2", spd, org); VectorCopy (self->absmin, org); org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal4.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal5.md2", spd, org); // a bunch of little chunks spd = 2 * self->dmg / 200; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); breakit = NULL; breakit = G_Spawn(); if (breakit) { breakit->think = breakittrash_sound; breakit->nextthink = level.time + 0.1; VectorCopy (self->s.origin, breakit->s.origin); gi.linkentity(breakit); } VectorCopy (save, self->s.origin); G_FreeEdict (self); } void metal_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = metal_explode; } void SP_props_hydrant (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/hydrant/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -10, -10, -19); VectorSet (self->maxs, 10, 10, 19); self->surfacetype = SURF_METAL; gi.linkentity (self); } // END JOSEPH /*QUAKED props_antenna1a (0 .5 .8) (-28 -22 -22) (28 22 22) An antenna model="models\props\antenna\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna1a (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antenna/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -28, -22, -22); VectorSet (self->maxs, 28, 22, 22); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/antenna/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/antenna/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna2a (0 .5 .8) (-26 -30 -22) (26 30 22) An antenna model="models\props\ant2a\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna2a (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antenna2/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -26, -30, -22); VectorSet (self->maxs, 26, 30, 22); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant2a/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant2a/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna3a (0 .5 .8) (-14 -2 -22) (14 2 22) An antenna model="models\props\ant3a\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna3a (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antenna3/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -14, -2, -22); VectorSet (self->maxs, 14, 2, 22); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant3a/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant3a/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna1b (0 .5 .8) (-41 -33 -32) (41 33 32) An antenna model="models\props\ant1b\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna1b (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antennab/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -41, -33, -32); VectorSet (self->maxs, 41, 33, 32); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant1b/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant1b/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna2b (0 .5 .8) (-38 -45 -32) (38 45 32) An antenna model="models\props\ant2b\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna2b (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antenna2b/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -38, -45, -32); VectorSet (self->maxs, 38, 45, 32); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant2b/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant2b/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna3b (0 .5 .8) (-21 -3 -33) (21 3 33) An antenna model="models\props\ant3b\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna3b (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antenna3b/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -21, -3, -33); VectorSet (self->maxs, 21, 3, 33); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant3b/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant3b/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna1c (0 .5 .8) (-55 -44 -43) (55 44 43) An antenna model="models\props\ant1c\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna1c (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antennac/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -55, -44, -43); VectorSet (self->maxs, 55, 44, 43); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant1c/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant1c/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna2c (0 .5 .8) (-50 -60 -43) (60 50 43) An antenna model="models\props\ant2c\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna2c (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antenna2c/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -50, -60, -43); VectorSet (self->maxs, 50, 60, 43); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant2c/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant2c/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_antenna3c (0 .5 .8) (-28 -3 -44) (28 3 44) An antenna model="models\props\ant3c\antenna.mdx" skin="models\props\antenna\antenna.pcx" */ void SP_props_antenna3c (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; //self->model = "models/props/antenna3c/tris.md2"; //self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -28, -3, -44); VectorSet (self->maxs, 28, 3, 44); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ant3c/antenna.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ant3c/antenna.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_fan (0 .5 .8) (-8 -12 -16) (8 12 16) A fan model="models\props\fan\tris.md2" */ void think_fan (edict_t *self) { if (self->s.frame < 18) { self->s.frame++; } else { self->s.frame = 0; } self->nextthink = level.time + FRAMETIME; } void radio_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject); void SP_props_fan (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/fan/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -8, -12, -16); VectorSet (self->maxs, 8, 12, 16); self->die = radio_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_METAL_L; gi.linkentity (self); self->nextthink = level.time + FRAMETIME *2; self->think = think_fan; } /*QUAKED props_aircon (0 .5 .8) (-16 -16 -24) (16 16 24) A cool box deluxe model="models\props\aircon\tris.md2" */ void think_aircon (edict_t *self) { if (self->s.frame < 18) { self->s.frame++; } else { self->s.frame = 0; } self->nextthink = level.time + FRAMETIME; } void SP_props_aircon (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/aircon/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, 24); self->surfacetype = SURF_METAL_L; gi.linkentity (self); self->nextthink = level.time + FRAMETIME *2; self->think = think_aircon; } // JOSEPH 12-OCT-98 /*QUAKED props_phone (0 .5 .8) (-8 -8 -6) (8 8 6) A phone (telephone) model="models\props\phone\tris.md2" */ void SP_props_phone (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/phone/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -8, -8, -6); VectorSet (self->maxs, 8, 8, 6); self->die = radio_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } // JOSEPH 12-OCT-98 // JOSEPH 13-FEB-99 /*QUAKED props_tablesetA (0 .5 .8) (-26 -27 -6) (26 27 6) Card-shark table setting model="models\props\tablesets\set.mdx" skin="models\props\tablesets\card_skin.pcx" */ void SP_props_tablesetA (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -26, -27, -6); VectorSet (self->maxs, 26, 27, 6); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/tablesets/set.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/tablesets/set.mdx", &self->s.model_parts[PART_HEAD]); // JOSEPH 24-JAN-99 self->s.renderfx2 |= RF2_DIR_LIGHTS; // JOSEPH 5-FEB-99-B self->s.renderfx2 |= RF2_NOSHADOW; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } // END JOSEPH /*QUAKED props_radio (0 .5 .8) (-8 -12 -8) (8 12 8) A radio that will take damage and activate triggers on destruction "health" - hit points (25 default) model="models\props\radio\tris.md2" */ void radio_explode (edict_t *self) { vec3_t org; float spd; vec3_t save; VectorCopy (self->s.origin, save); VectorMA (self->absmin, 0.5, self->size, self->s.origin); // a few big chunks spd = 1.5 * (float)self->dmg / 200.0; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); // bottom corners spd = 1.75 * (float)self->dmg / 200.0; VectorCopy (self->absmin, org); ThrowDebris (self, "models/props/metal/metal2.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; ThrowDebris (self, "models/props/metal/metal3.md2", spd, org); VectorCopy (self->absmin, org); org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal4.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal5.md2", spd, org); // a bunch of little chunks spd = 2 * self->dmg / 200; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); VectorCopy (save, self->s.origin); G_FreeEdict (self); } void radio_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = radio_explode; self->activator = attacker; G_UseTargets (self, inflictor); { vec3_t realorigin; VectorCopy(self->s.origin, realorigin); realorigin[2] += 8; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SPLASH); gi.WriteByte (25); gi.WritePosition (realorigin); gi.WriteDir (self->movedir); gi.WriteByte (1); gi.multicast (realorigin, MULTICAST_PVS); } } void SP_props_radio (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/radio/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -8, -12, -8); VectorSet (self->maxs, 8, 12, 8); if (!(self->health == 666)) { self->die = radio_die; self->takedamage = DAMAGE_YES; if (!self->health) self->health = 25; } self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED elements_raincloud (0 .5 .8) ? Snow falls from this invisable cloud at random points center of cloud to ground trace determines the drop fall distance cloud can be any recatangle size fxdensity - total number of drops in the sky 1 - 1000 (default 400) firetype - type of drops, 0 = rain 1 = drip */ void think_new_first_raincloud (edict_t *self) { vec3_t neworigin, minmaxsize; int effectsizex, effectsizey, effectsizez; // Find cloud size VectorSubtract(self->mins, self->maxs, minmaxsize); effectsizex = abs(minmaxsize[0])-2; effectsizey = abs(minmaxsize[1])-2; effectsizez = abs(minmaxsize[2])-2; // Find cloud center VectorCopy(self->mins, neworigin); neworigin[0] += (effectsizex >> 1); neworigin[1] += (effectsizey >> 1); neworigin[2] += (effectsizez >> 1); // Adjust rain density if (!self->fxdensity) self->fxdensity = 400; else if (self->fxdensity > 1000) self->fxdensity = 1000; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_RAIN); gi.WritePosition (neworigin); gi.WriteShort (self->fxdensity); gi.WriteShort (effectsizex); gi.WriteShort (effectsizey); gi.WriteShort (effectsizez); gi.WriteShort (self->firetype); gi.multicast (neworigin, MULTICAST_ALL_R); } void SP_elements_raincloud (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BSP; self->movetype = MOVETYPE_NONE; gi.setmodel (self, self->model); gi.linkentity (self); self->nextthink = level.time + (10 * FRAMETIME); self->think = think_new_first_raincloud; self->svflags |= SVF_NOCLIENT; } /*QUAKED elements_snowcloud (0 .5 .8) ? Snow falls from this invisable cloud at random points center of cloud to ground trace determines the flake fall distance cloud can be any recatangle size fxdensity - total number of flakes in the sky 1 - 1000 (default 400) */ void think_new_first_snowcloud (edict_t *self) { vec3_t neworigin, minmaxsize; int effectsizex, effectsizey, effectsizez; // Find cloud size VectorSubtract(self->mins, self->maxs, minmaxsize); effectsizex = abs(minmaxsize[0])-2; effectsizey = abs(minmaxsize[1])-2; effectsizez = abs(minmaxsize[2])-2; // Find cloud center VectorCopy(self->mins, neworigin); neworigin[0] += (effectsizex >> 1); neworigin[1] += (effectsizey >> 1); neworigin[2] += (effectsizez >> 1); // Adjust snow density if (!self->fxdensity) self->fxdensity = 400; else if (self->fxdensity > 1000) self->fxdensity = 1000; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SNOW); gi.WritePosition (neworigin); gi.WriteShort (self->fxdensity); gi.WriteShort (effectsizex); gi.WriteShort (effectsizey); gi.WriteShort (effectsizez); gi.multicast (neworigin, MULTICAST_ALL_R); } void SP_elements_snowcloud (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BSP; self->movetype = MOVETYPE_NONE; gi.setmodel (self, self->model); gi.linkentity (self); self->nextthink = level.time + (10 * FRAMETIME); self->think = think_new_first_snowcloud; self->svflags |= SVF_NOCLIENT; } #define NON_MOVEABLE 2 #define TYPE_WOOD 4 #define TYPE_WOOD2 8 #define TYPE_METAL 16 #define TYPE_CARDBOARD 32 // JOSEPH 04-JAN-99 /*QUAKED props_trashcanA (0 .5 .8) (-16 -16 -21) (16 16 21) ? NON_MOVEABLE Trash can you can push. You can override its mass (400), health (10). "item" - Item to spawn on destruction model="models\props\t_can\" */ void trashcanA_check_sound (edict_t *ent) { if (((ent->s.origin[1] == ent->save_avel[1]) && (ent->s.origin[0] == ent->save_avel[0])) || (ent->groundentity == NULL)) { ent->s.sound = 0; } } // JOSEPH 5-FEB-99-B void trashcanA_explode (edict_t *self); void trashcanA_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) { float ratio; vec3_t v; if ((!other->groundentity) || (other->groundentity == self)) return; self->pullingflag = 0; // If activate key is pressed if ((plane) && (plane->type == 123)) { if ((other->s.origin[0] != other->s.old_origin[0]) || (other->s.origin[1] != other->s.old_origin[1])) { //vec3_t move; //float yaw, dist; self->pullingflag = 1; ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, 180+vectoyaw(v), 20 * ratio * FRAMETIME); /*yaw = vectoyaw(v); yaw = yaw*M_PI*2 / 360; dist = 20 * ratio * FRAMETIME; move[0] = cos(yaw)*dist; move[1] = sin(yaw)*dist; move[2] = 0; if (abs(other->client->ps.pmove.velocity[0]) > abs(move[0])) other->client->ps.pmove.velocity[0] = move[0]; if (abs(other->client->ps.pmove.velocity[1]) > abs(move[1])) other->client->ps.pmove.velocity[1] = move[1];*/ if (!self->s.sound) self->s.sound = gi.soundindex ("world/trash1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } else { ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, vectoyaw(v), 20 * ratio * FRAMETIME); if (((self->s.origin[0] != self->s.old_origin[0]) || (self->s.origin[1] != self->s.old_origin[1]))) { if (!self->s.sound) self->s.sound = gi.soundindex ("world/trash1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } if (self->health <= 0) trashcanA_explode(self); } // END JOSEPH // JOSEPH 5-FEB-99-C void breakittrash_sound (edict_t *self) { gi.sound (self, CHAN_VOICE, gi.soundindex("world/trash3.wav"), 1, ATTN_NORM, 0); self->think = G_FreeEdict; self->nextthink = level.time + 2.0; } void trashcanA_explode (edict_t *self) { vec3_t org; float spd; vec3_t save; edict_t *breakit; VectorCopy (self->s.origin, save); VectorMA (self->absmin, 0.5, self->size, self->s.origin); // a few big chunks spd = 1.5 * (float)self->dmg / 200.0; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); // bottom corners spd = 1.75 * (float)self->dmg / 200.0; VectorCopy (self->absmin, org); ThrowDebris (self, "models/props/metal/metal2.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; ThrowDebris (self, "models/props/metal/metal3.md2", spd, org); VectorCopy (self->absmin, org); org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal4.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal5.md2", spd, org); // a bunch of little chunks spd = 2 * self->dmg / 200; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); if (self->item) { Drop_Item (self, self->item); self->item = NULL; } breakit = G_Spawn(); if (breakit) { breakit->think = breakittrash_sound; breakit->nextthink = level.time + 0.1; VectorCopy (self->s.origin, breakit->s.origin); gi.linkentity(breakit); } VectorCopy (save, self->s.origin); G_FreeEdict (self); } // END JOSEPH void crate_stuff (edict_t *self) { vec3_t org; float spd; vec3_t save; VectorCopy (self->s.origin, save); VectorMA (self->absmin, 0.5, self->size, self->s.origin); // a few big chunks spd = 7.0 * (float)self->dmg / 200.0; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); // bottom corners spd = 6.0 * (float)self->dmg / 200.0; VectorCopy (self->absmin, org); ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); VectorCopy (self->absmin, org); org[1] += self->size[1]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; org[1] += self->size[1]; ThrowDebris_stuff (self, "models/props/stuff/piece2.md2", spd, org); // a bunch of little chunks spd = 10 * self->dmg / 200; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece2.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece3.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris_stuff (self, "models/props/stuff/piece2.md2", spd, org); } /*QUAKED props_crate_bust_32 (0 .5 .8) (-16 -16 -16) (16 16 16) ? NON_MOVEABLE TYPE_WOOD TYPE_WOOD2 TYPE_METAL TYPE_CARDBOARD Crate can bust and you can push health (10). "item" - Item to spawn on destruction model="models\props\crate\stillcrate32_1.mdx" */ /*QUAKED props_crate_bust_48 (0 .5 .8) (-24 -24 -24) (24 24 24) ? NON_MOVEABLE TYPE_WOOD TYPE_WOOD2 X TYPE_CARDBOARD Crate can bust and you can push health (10). "item" - Item to spawn on destruction model="models\props\crate\stillcrate48_1.mdx" */ /*QUAKED props_crate_bust_64 (0 .5 .8) (-32 -32 -32) (32 32 32) ? X TYPE_WOOD TYPE_WOOD2 X TYPE_CARDBOARD Crate you can bust health (10). "item" - Item to spawn on destruction model="models\props\crate\stillcrate64_1.mdx" */ void crate_check_sound (edict_t *ent) { if (((ent->s.origin[1] == ent->save_avel[1]) && (ent->s.origin[0] == ent->save_avel[0])) || (ent->groundentity == NULL)) { ent->s.sound = 0; } } void crate_explode (edict_t *self); void breakit_sound (edict_t *self) { gi.sound (self, CHAN_VOICE, gi.soundindex("world/boardbreak.wav"), 1, ATTN_NORM, 0); self->think = G_FreeEdict; self->nextthink = level.time + 2.0; } void crate_bust_final_32 (edict_t *self) { if (self->s.frame < 19) { if (self->item) { Drop_Item (self, self->item); self->item = NULL; } else { if (self->s.frame == 0) crate_stuff (self); } self->s.frame++; self->nextthink = level.time + 0.1; } else if (self->misstime-- > 0) { if (self->misstime <= 20) { if (self->misstime == 20) { self->s.renderfx2 |= RF2_PASSALPHA; self->s.effects = 1; // this is full alpha now } self->s.effects += (255/20); if (self->s.effects > 255) self->s.effects = 255; } self->nextthink = level.time + 0.1; } else { G_FreeEdict (self); } } void crate_bust_die_32 (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { int i; if (self->takedamage == DAMAGE_NO) return; self->s.sound = 0; self->think = crate_bust_final_32; self->nextthink = level.time + FRAMETIME; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; if (self->spawnflags & TYPE_CARDBOARD) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/cardboard32.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/cardboard32.mdx", &self->s.model_parts[PART_HEAD]); self->takedamage = DAMAGE_NO; self->think = NULL; self->nextthink = 0; gi.sound (self, CHAN_AUTO, gi.soundindex ("weapons/melee/pipehitcboard.wav"), 1, ATTN_NORM, 0); return; } if (self->spawnflags & TYPE_WOOD2) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/crate32_2.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/crate32_2.mdx", &self->s.model_parts[PART_HEAD]); } else { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/crate32_1.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/crate32_1.mdx", &self->s.model_parts[PART_HEAD]); } self->s.renderfx2 |= RF2_NOSHADOW; self->solid = 0; self->touch = NULL; gi.sound (self, CHAN_AUTO, gi.soundindex ("world/crate2.wav"), 1, ATTN_NORM, 0); } void crate_touch_32 (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) { float ratio; vec3_t v; if ((!other->groundentity) || (other->groundentity == self)) return; self->pullingflag = 0; // If activate key is pressed if ((plane) && (plane->type == 123)) { if ((other->s.origin[0] != other->s.old_origin[0]) || (other->s.origin[1] != other->s.old_origin[1])) { self->pullingflag = 1; ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, 180+vectoyaw(v), 20 * ratio * FRAMETIME); if (!self->s.sound) self->s.sound = gi.soundindex ("world/crate1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } else { ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, vectoyaw(v), 20 * ratio * FRAMETIME); if (((self->s.origin[0] != self->s.old_origin[0]) || (self->s.origin[1] != self->s.old_origin[1]))) { if (!self->s.sound) self->s.sound = gi.soundindex ("world/crate1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } if (!(self->spawnflags & TYPE_METAL)) { if (self->health <= 0) crate_bust_die_32(self, 0, 0, 0, vec3_origin, 0, 0); } } void SP_props_crate_bust_32 (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; if (self->spawnflags & NON_MOVEABLE) self->movetype = MOVETYPE_NONE; else self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; if (self->spawnflags & TYPE_METAL) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate32.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate32.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } else if (self->spawnflags & TYPE_CARDBOARD) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcard32.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcard32.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_FABRIC; } else if (self->spawnflags & TYPE_WOOD2) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate32_2.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate32_2.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } else { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate32_1.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate32_1.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } if (!(self->spawnflags & NON_MOVEABLE)) { self->pullable = 1; self->nokickbackflag = 1; self->fallerflag = 1; } if (!self->mass) self->mass = 400; if (!self->health) self->health = 10; if (!self->dmg) self->dmg = 0; if (self->spawnflags & TYPE_METAL) { if (self->pullable) self->touch = crate_touch_32; } else { self->die = crate_bust_die_32; self->takedamage = DAMAGE_YES; if (self->pullable) self->touch = crate_touch_32; } self->cast_info.aiflags = AI_NOSTEP; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->misstime = 21; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); } void crate_bust_final_48 (edict_t *self) { if (self->s.frame < 28) { if (self->item) { Drop_Item (self, self->item); self->item = NULL; } else { if (self->s.frame == 0) crate_stuff (self); } self->s.frame++; self->nextthink = level.time + 0.1; } else if (self->misstime-- > 0) { if (self->misstime <= 20) { if (self->misstime == 20) { self->s.renderfx2 |= RF2_PASSALPHA; self->s.effects = 1; // this is full alpha now } self->s.effects += (255/20); if (self->s.effects > 255) self->s.effects = 255; } self->nextthink = level.time + 0.1; } else { G_FreeEdict (self); } } void crate_bust_die_48 (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { int i; if (self->takedamage == DAMAGE_NO) return; self->s.sound = 0; self->think = crate_bust_final_48; self->nextthink = level.time + FRAMETIME; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; if (self->spawnflags & TYPE_CARDBOARD) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/cardboard48.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/cardboard48.mdx", &self->s.model_parts[PART_HEAD]); self->takedamage = DAMAGE_NO; self->think = NULL; self->nextthink = 0; gi.sound (self, CHAN_AUTO, gi.soundindex ("weapons/melee/pipehitcboard.wav"), 1, ATTN_NORM, 0); return; } if (self->spawnflags & TYPE_WOOD2) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/crate48_2.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/crate48_2.mdx", &self->s.model_parts[PART_HEAD]); } else { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/crate48_1.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/crate48_1.mdx", &self->s.model_parts[PART_HEAD]); } self->s.renderfx2 |= RF2_NOSHADOW; self->solid = 0; self->touch = NULL; gi.sound (self, CHAN_AUTO, gi.soundindex ("world/crate2.wav"), 1, ATTN_NORM, 0); } void crate_touch_48 (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) { float ratio; vec3_t v; if ((!other->groundentity) || (other->groundentity == self)) return; self->pullingflag = 0; // If activate key is pressed if ((plane) && (plane->type == 123)) { if ((other->s.origin[0] != other->s.old_origin[0]) || (other->s.origin[1] != other->s.old_origin[1])) { self->pullingflag = 1; ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, 180+vectoyaw(v), 20 * ratio * FRAMETIME); if (!self->s.sound) self->s.sound = gi.soundindex ("world/crate1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } else { ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, vectoyaw(v), 20 * ratio * FRAMETIME); if (((self->s.origin[0] != self->s.old_origin[0]) || (self->s.origin[1] != self->s.old_origin[1]))) { if (!self->s.sound) self->s.sound = gi.soundindex ("world/crate1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } if (!(self->spawnflags & TYPE_METAL)) { if (self->health <= 0) crate_bust_die_48(self, 0, 0, 0, vec3_origin, 0, 0); } } void SP_props_crate_bust_48 (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; if (self->spawnflags & NON_MOVEABLE) self->movetype = MOVETYPE_NONE; else self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; VectorSet (self->mins, -24.1, -24.1, -24.1); VectorSet (self->maxs, 24.1, 24.1, 24.1); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; if (self->spawnflags & TYPE_METAL) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate48.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate48.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } else if (self->spawnflags & TYPE_CARDBOARD) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcard48.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcard48.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_FABRIC; } else if (self->spawnflags & TYPE_WOOD2) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate48_2.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate48_2.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } else { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate48_1.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate48_1.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } if (!(self->spawnflags & NON_MOVEABLE)) { self->pullable = 1; self->nokickbackflag = 1; self->fallerflag = 1; } if (!self->mass) self->mass = 400; if (!self->health) self->health = 10; if (!self->dmg) self->dmg = 0; if (self->spawnflags & TYPE_METAL) { if (self->pullable) self->touch = crate_touch_48; } else { self->die = crate_bust_die_48; self->takedamage = DAMAGE_YES; if (self->pullable) self->touch = crate_touch_48; } self->cast_info.aiflags = AI_NOSTEP; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->misstime = 21; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); } void crate_bust_final_64 (edict_t *self) { if (self->s.frame < 39) { if (self->item) { Drop_Item (self, self->item); self->item = NULL; } else { if (self->s.frame == 0) crate_stuff (self); } self->s.frame++; self->nextthink = level.time + 0.1; } else if (self->misstime-- > 0) { if (self->misstime <= 20) { if (self->misstime == 20) { self->s.renderfx2 |= RF2_PASSALPHA; self->s.effects = 1; // this is full alpha now } self->s.effects += (255/20); if (self->s.effects > 255) self->s.effects = 255; } self->nextthink = level.time + 0.1; } else { G_FreeEdict (self); } } void crate_bust_die_64 (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { int i; if (self->takedamage == DAMAGE_NO) return; self->s.sound = 0; self->think = crate_bust_final_64; self->nextthink = level.time + FRAMETIME; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; if (self->spawnflags & TYPE_CARDBOARD) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/cardboard64.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/cardboard64.mdx", &self->s.model_parts[PART_HEAD]); self->takedamage = DAMAGE_NO; self->think = NULL; self->nextthink = 0; gi.sound (self, CHAN_AUTO, gi.soundindex ("weapons/melee/pipehitcboard.wav"), 1, ATTN_NORM, 0); return; } if (self->spawnflags & TYPE_WOOD2) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/crate64_2.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/crate64_2.mdx", &self->s.model_parts[PART_HEAD]); } else { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/crate64_1.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/crate64_1.mdx", &self->s.model_parts[PART_HEAD]); } self->s.renderfx2 |= RF2_NOSHADOW; self->solid = 0; self->touch = NULL; gi.sound (self, CHAN_AUTO, gi.soundindex ("world/crate2.wav"), 1, ATTN_NORM, 0); } void SP_props_crate_bust_64 (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -32, -32, -32); VectorSet (self->maxs, 32, 32, 32); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; if (self->spawnflags & TYPE_METAL) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate64.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate64.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } else if (self->spawnflags & TYPE_CARDBOARD) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcard64.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcard64.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_FABRIC; } else if (self->spawnflags & TYPE_WOOD2) { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate64_2.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate64_2.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } else { self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/crate/stillcrate64_1.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/crate/stillcrate64_1.mdx", &self->s.model_parts[PART_HEAD]); self->surfacetype = SURF_WOOD; } if (!self->mass) self->mass = 400; if (!self->health) self->health = 10; if (!self->dmg) self->dmg = 0; if (!(self->spawnflags & TYPE_METAL)) { self->die = crate_bust_die_64; self->takedamage = DAMAGE_YES; } self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->misstime = 21; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); } /*QUAKED props_ammocrate_bust (0 .5 .8) (-32 -16 -8) (32 16 8) Crate you may bust. health (10). "item" - Item to spawn on destruction if hit by pipe or crowbar The bounding box can be rotated in angles of 90 deg and block properly model="models\props\crate\crate_32_64.mdx" skin="models\props\crate\crate_exp.tga" */ void ammocrate_bust_finalA (edict_t *self) { if (self->s.frame < 15) { self->s.frame++; self->nextthink = level.time + 0.1; } else if (self->misstime-- > 0) { if (self->misstime <= 20) { if (self->misstime == 20) { self->s.renderfx2 |= RF2_PASSALPHA; self->s.effects = 1; // this is full alpha now } self->s.effects += (255/20); if (self->s.effects > 255) self->s.effects = 255; } self->nextthink = level.time + 0.1; } else { G_FreeEdict (self); } } void ammocrate_bust_finalB (edict_t *self) { if (self->s.frame < 7) { if (self->item) { Drop_Item (self, self->item); self->item = NULL; } self->s.frame++; self->nextthink = level.time + 0.1; } else if (self->misstime-- > 0) { if (self->misstime <= 20) { if (self->misstime == 20) { self->s.renderfx2 |= RF2_PASSALPHA; self->s.effects = 1; // this is full alpha now } self->s.effects += (255/20); if (self->s.effects > 255) self->s.effects = 255; } self->nextthink = level.time + 0.1; } else { G_FreeEdict (self); } } void ammocrate_bust_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { if ((attacker->client) && (attacker->client->pers.weapon) && ((!strcmp(attacker->client->pers.weapon->pickup_name, "Crowbar")) || // Ridah, 12-may-99, added brackets to fix crash if Dog busts open crate while attacking player (!strcmp(attacker->client->pers.weapon->pickup_name, "Pipe")))) { self->think = ammocrate_bust_finalB; self->nextthink = level.time + FRAMETIME; } else { vec3_t vec; self->model = "models/props/crate/exp.md2"; self->s.modelindex = gi.modelindex (self->model); self->think = ammocrate_bust_finalA; self->nextthink = level.time + FRAMETIME; { edict_t *breakit; breakit = G_Spawn(); if (breakit) { VectorCopy (self->s.origin, breakit->s.origin); gi.linkentity(breakit); gi.sound (breakit, CHAN_VOICE, gi.soundindex("world/explosion1.wav"), 1, ATTN_NORM, 0); breakit->think = G_FreeEdict; breakit->nextthink = level.time + 5.0; } } { vec3_t neworigin; VectorCopy(self->s.origin, neworigin); neworigin[1] -= 48; neworigin[0] -= 32; neworigin[2] += 16; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_EXPLOSION1); gi.WritePosition (neworigin); gi.WriteDir( vec ); gi.WriteByte( (int)(self->dmg / 2) ); gi.WriteByte (self->fxdensity); gi.multicast (neworigin, MULTICAST_PVS); } } self->s.renderfx2 |= RF2_NOSHADOW; self->solid = 0; self->touch = NULL; gi.sound (self, CHAN_AUTO, gi.soundindex ("world/crate2.wav"), 1, ATTN_NORM, 0); } void SP_props_ammocrate_bust (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/crate/tris.md2"; self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -16, -32, -8); VectorSet (self->maxs, 16, 32, 8); } else { VectorSet (self->mins, -32, -16, -8); VectorSet (self->maxs, 32, 16, 8); } if (!self->mass) self->mass = 400; if (!self->health) self->health = 10; if (!self->dmg) self->dmg = 0; self->die = ammocrate_bust_die; self->takedamage = DAMAGE_YES; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->misstime = 26; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } self->surfacetype = SURF_WOOD; gi.linkentity (self); } void trashcanA_delay (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->takedamage = DAMAGE_NO; self->nextthink = level.time + 2 * FRAMETIME; self->think = trashcanA_explode; self->activator = attacker; } void SP_props_trashcanA (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } VectorClear(self->s.angles); if (!(self->spawnflags & NON_MOVEABLE)) self->fallerflag = 1; self->pullable = 1; // JOSEPH 24-NOV-98 self->nokickbackflag = 1; // END JOSEPH // JOSEPH 20-JAN-99 gi.modelindex ("models/props/metal/metal1.md2"); gi.modelindex ("models/props/metal/metal2.md2"); gi.modelindex ("models/props/metal/metal3.md2"); gi.modelindex ("models/props/metal/metal4.md2"); gi.modelindex ("models/props/metal/metal5.md2"); // END JOSEPH self->solid = SOLID_BBOX; self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; self->model = "models/props/t_can/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -16, -16, -21); VectorSet (self->maxs, 16, 16, 21); if (!self->mass) self->mass = 400; if (!self->health) self->health = 10; if (!self->dmg) self->dmg = 0; self->die = trashcanA_delay; self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; if (!(self->spawnflags & NON_MOVEABLE)) self->touch = trashcanA_touch; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props_trashcan_fall (0 .5 .8) (-16 -16 -21) (16 16 21) Trash can you can push. You can override its mass (100), health (80). "item" - Item to spawn on push down or destruction model="models\props\t_can2\" */ // JOSEPH 9-FEB-99 void trashcan_fall_final (edict_t *self) { float ratio; vec3_t forward; if (self->s.frame < 14) { if (self->item) { Drop_Item (self, self->item); self->item = NULL; } self->s.frame++; if ((self->s.frame > 2) && (self->s.frame < 12)) { ratio = 500 / (float)self->mass; AngleVectors(self->s.angles, forward, NULL, NULL); M_walkmove (self, vectoyaw(forward), 20 * ratio * FRAMETIME); } } if (self->health <= 0) trashcanA_explode(self); else self->nextthink = level.time + 0.1; } // END JOSEPH void trashcan_fall_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) { self->s.angles[1] = (other->s.angles[1] + 90); self->s.angles[1] += (((rand() / (float)RAND_MAX)*(float)180.0)-(float)90.0); self->touch = NULL; self->think = trashcan_fall_final; self->nextthink = level.time + FRAMETIME; gi.sound (self, CHAN_AUTO, gi.soundindex ("world/trash2.wav"), 1, ATTN_NORM, 0); } void SP_props_trashcan_fall (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } VectorClear(self->s.angles); // JOSEPH 20-JAN-99 gi.modelindex ("models/props/metal/metal1.md2"); gi.modelindex ("models/props/metal/metal2.md2"); gi.modelindex ("models/props/metal/metal3.md2"); gi.modelindex ("models/props/metal/metal4.md2"); gi.modelindex ("models/props/metal/metal5.md2"); // END JOSEPH self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/t_can2/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -16, -16, -21); VectorSet (self->maxs, 16, 16, 21); if (!self->mass) self->mass = 400; if (!self->health) self->health = 10; if (!self->dmg) self->dmg = 0; self->die = trashcanA_delay; self->takedamage = DAMAGE_YES; self->touch = trashcan_fall_touch; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED light_fire_esm (1 0 0) (-8 -8 -8) (8 8 8) X X X DYNAMIC Cool fire extra-small alphalevel 1 - 10 (default 5) */ /*QUAKED light_fire_sm (1 0 0) (-16 -16 -16) (16 16 16) X X X DYNAMIC Cool fire small alphalevel 1 - 10 (default 5) */ /*QUAKED light_fire_med (1 0 0) (-24 -24 -24) (24 24 24) X X X DYNAMIC Cool fire medium alphalevel 1 - 10 (default 5) */ /*QUAKED light_fire_lg (1 0 0) (-32 -32 -32) (32 32 32) X X X DYNAMIC Cool fire large alphalevel 1 - 10 (default 5) */ /*QUAKED smoke_esm (1 0 0) (-8 -8 -8) (8 8 8) Cool smoke extra-small alphalevel 1 - 10 (default 4) */ /*QUAKED smoke_sm (1 0 0) (-16 -16 -16) (16 16 16) Cool smoke small alphalevel 1 - 10 (default 4) */ /*QUAKED smoke_med (1 0 0) (-24 -24 -24) (24 24 24) Cool smoke medium alphalevel 1 - 10 (default 4) */ /*QUAKED smoke_lg (1 0 0) (-32 -32 -32) (32 32 32) Cool smoke large alphalevel 1 - 10 (default 4) */ void light_fire_think( edict_t *ent) { ent->nextthink = level.time + 0.1; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SFXFIRE); gi.WritePosition (ent->s.origin); // gi.WriteDir (ent->s.angles); gi.WriteByte (ent->firetype); if (ent->alphalevel) { gi.WriteByte (ent->alphalevel); } else { gi.WriteByte (0); } gi.multicast (ent->s.origin, MULTICAST_PVS); } void smoke_think( edict_t *ent) { ent->nextthink = level.time + 0.5; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SFXSMOKE); gi.WritePosition (ent->s.origin); // gi.WriteDir (ent->s.angles); gi.WriteByte (ent->firetype); if (ent->alphalevel) { gi.WriteByte (ent->alphalevel); } else { gi.WriteByte (0); } gi.multicast (ent->s.origin, MULTICAST_PVS); } void SP_light_fire_esm (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = light_fire_think; ent->nextthink = level.time + 0.1; ent->firetype = 8; gi.linkentity (ent); AddLightSource(ent); } void SP_light_fire_sm (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = light_fire_think; ent->nextthink = level.time + 0.1; ent->firetype = 16; gi.linkentity (ent); AddLightSource(ent); } void SP_light_fire_med (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = light_fire_think; ent->nextthink = level.time + 0.1; ent->firetype = 24; gi.linkentity (ent); AddLightSource(ent); } void SP_light_fire_lg (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = light_fire_think; ent->nextthink = level.time + 0.1; ent->firetype = 32; gi.linkentity (ent); AddLightSource(ent); } void SP_smoke_esm (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = smoke_think; ent->nextthink = level.time + 0.1; ent->firetype = 5; gi.linkentity (ent); } void SP_smoke_sm (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = smoke_think; ent->nextthink = level.time + 0.1; ent->firetype = 10; gi.linkentity (ent); } void SP_smoke_med (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = smoke_think; ent->nextthink = level.time + 0.1; ent->firetype = 20; gi.linkentity (ent); } void SP_smoke_lg (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; VectorSet (ent->movedir, 0.0, 1, 0.0); ent->think = smoke_think; ent->nextthink = level.time + 0.1; ent->firetype = 30; gi.linkentity (ent); } /*QUAKED cast_buma (1 .5 0) (-30 -16 -25) (31 43 13) Bum model = "models\actors\bum_seg" */ /*QUAKED cast_bumb (1 .5 0) (-30 -16 -25) (31 43 13) Bum model = "models\actors\bum_seg" */ void think_bum1b (edict_t *self); void think_bum2b (edict_t *self); void think_bum1a (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 17) { self->s.frame++; } else { self->s.frame = 0; if (((float)rand() / (float)RAND_MAX) < (float)0.1) { self->think = think_bum1b; gi.sound ( self, CHAN_VOICE, gi.soundindex ("actors/bum/bum.wav"), 1, 3, 0); return; } } self->think = think_bum1a; } void think_bum1b (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 74) { self->s.frame++; } else { self->s.frame = 0; self->think = think_bum1a; return; } self->think = think_bum1b; } void think_bum2a (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 117) { self->s.frame++; } else { self->s.frame = 75; if (((float)rand() / (float)RAND_MAX) < (float)0.1) { self->think = think_bum2b; gi.sound ( self, CHAN_VOICE, gi.soundindex ("actors/bum/bum.wav"), 1, 3, 0); return; } } self->think = think_bum2a; } void think_bum2b (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 218) { self->s.frame++; } else { self->s.frame = 75; self->think = think_bum2a; return; } self->think = think_bum2b; } // JOSEPH 24-JAN-99 void SP_cast_buma (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->s.skinnum = self->skin; VectorSet (self->mins, -16, -30, -25); VectorSet (self->maxs, 43, 31, 13); memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/actors/bum_seg/parta.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/actors/bum_seg/parta.mdx", &self->s.model_parts[PART_HEAD] ); self->s.num_parts++; self->s.model_parts[PART_BODY].modelindex = gi.modelindex("models/actors/bum_seg/partb.mdx"); for (i=0; is.model_parts[PART_BODY].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/actors/bum_seg/partb.mdx", &self->s.model_parts[PART_BODY] ); self->health = 100; self->gib_health = -40; self->mass = 100; //self->pain = bum_pain; //self->die = bum_die; self->s.renderfx2 |= RF2_DIR_LIGHTS; gi.linkentity (self); self->think = think_bum1a; self->nextthink = level.time + 2 * FRAMETIME; } void SP_cast_bumb (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->s.skinnum = self->skin; VectorSet (self->mins, -16, -30, -25); VectorSet (self->maxs, 43, 31, 13); memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/actors/bum_seg/parta.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/actors/bum_seg/parta.mdx", &self->s.model_parts[PART_HEAD] ); self->s.num_parts++; self->s.model_parts[PART_BODY].modelindex = gi.modelindex("models/actors/bum_seg/partb.mdx"); for (i=0; is.model_parts[PART_BODY].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/actors/bum_seg/partb.mdx", &self->s.model_parts[PART_BODY] ); self->health = 100; self->gib_health = -40; self->mass = 100; //self->pain = bum_pain; //self->die = bum_die; gi.linkentity (self); self->s.renderfx2 |= RF2_DIR_LIGHTS; // Ridah self->s.frame = 75; self->think = think_bum2b; self->nextthink = level.time + 2 * FRAMETIME; } // END JOSEPH // JOSEPH 23-JAN-99-B /*QUAKED props_chair (0 .5 .8) (-11 -13 -26) (11 13 26) A chair model="models\props\chair\chair.mdx" skin="models\props\chair\chair1.tga" */ void SP_props_chair (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = 0; //SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -11, -13, -26); VectorSet (self->maxs, 11, 13, 26); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/chair/chair.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/chair/chair.mdx", &self->s.model_parts[PART_HEAD]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->surfacetype = SURF_WOOD; gi.linkentity (self); } // END JOSEPH /*QUAKED props2_chair_push (0 .5 .8) (-16 -16 -26) (16 16 26) A pushable chair "health" - default 25 model="models\props\chair\chair.mdx" skin="models\props\chair\chair1.tga" */ void chair_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) { float ratio; vec3_t v; if ((!other->groundentity) || (other->groundentity == self)) return; self->pullingflag = 0; // If activate key is pressed if ((plane) && (plane->type == 123)) { if ((other->s.origin[0] != other->s.old_origin[0]) || (other->s.origin[1] != other->s.old_origin[1])) { self->pullingflag = 1; ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, 180+vectoyaw(v), 20 * ratio * FRAMETIME); if (!self->s.sound) self->s.sound = gi.soundindex ("world/crate1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } else { ratio = (float)other->mass / (float)self->mass; VectorSubtract (self->s.origin, other->s.origin, v); M_walkmove (self, vectoyaw(v), 20 * ratio * FRAMETIME); if (((self->s.origin[0] != self->s.old_origin[0]) || (self->s.origin[1] != self->s.old_origin[1]))) { if (!self->s.sound) self->s.sound = gi.soundindex ("world/crate1.wav"); VectorCopy(self->s.origin, self->save_avel); self->think = trashcanA_check_sound; self->nextthink = level.time + (FRAMETIME * 1.1); } } if (self->health <= 0) trashcanA_delay(self, NULL, NULL, 0, vec3_origin, 0, 0); } void SP_props2_chair_push (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; self->pullable = 1; self->nokickbackflag = 1; gi.modelindex ("models/props/metal/metal1.md2"); gi.modelindex ("models/props/metal/metal2.md2"); gi.modelindex ("models/props/metal/metal3.md2"); gi.modelindex ("models/props/metal/metal4.md2"); gi.modelindex ("models/props/metal/metal5.md2"); VectorSet (self->mins, -16, -16, -26); VectorSet (self->maxs, 16, 16, 0); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/chair/chair.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/chair/chair.mdx", &self->s.model_parts[PART_HEAD]); self->s.renderfx2 |= RF2_DIR_LIGHTS; if (!self->mass) self->mass = 400; if (!self->health) self->health = 25; self->die = trashcanA_delay; self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; self->touch = chair_touch; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->surfacetype = SURF_METAL; gi.linkentity (self); } // END JOSEPH // JOSEPH 24-JAN-99 /*QUAKED props_extinguisherA (0 .5 .8) (-16 -16 -16) (16 16 16) An extingusher model="models\pu_icon\exting\ext1.md2" dmg - damage an exploding extinguisher causes (default 25) */ /*QUAKED props_extinguisherB (0 .5 .8) (-16 -16 -16) (16 16 16) An extingusher dmg - damage an exploding extinguisher causes (default 25) model="models\pu_icon\exting\ext2.md2" */ void exting_delay (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { vec3_t vec; self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = trashcanA_explode; self->activator = attacker; VectorClear(vec); vec[2] = 1; { edict_t *breakit; breakit = G_Spawn(); if (breakit) { VectorCopy (self->s.origin, breakit->s.origin); gi.linkentity(breakit); gi.sound (breakit, CHAN_VOICE, gi.soundindex("world/explosion1.wav"), 1, ATTN_NORM, 0); breakit->think = G_FreeEdict; breakit->nextthink = level.time + 5.0; } } gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_EXPLOSION1); gi.WritePosition (self->s.origin); gi.WriteDir( vec ); gi.WriteByte( (int)(self->dmg / 2) ); gi.WriteByte (self->fxdensity); gi.multicast (self->s.origin, MULTICAST_PVS); T_RadiusDamage (self, self->activator, self->dmg, NULL, self->dmg+40, MOD_EXPLOSIVE); } // JOSEPH 3-FEB-99 void SP_props_extinguisherA (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/pu_icon/exting/ext1.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->die = exting_delay; self->takedamage = DAMAGE_YES; if (!self->dmg) self->dmg = 25; self->s.renderfx |= RF_REFL_MAP; self->surfacetype = SURF_METAL; gi.linkentity (self); } void SP_props_extinguisherB (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/pu_icon/exting/ext2.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->die = exting_delay; self->takedamage = DAMAGE_YES; if (!self->dmg) self->dmg = 25; self->s.renderfx |= RF_REFL_MAP; self->surfacetype = SURF_METAL; gi.linkentity (self); } // END JOSEPH // JOSEPH 13-FEB-99 /*QUAKED props_motorcycle (0 .5 .8) (-60 -20 -26) (60 20 26) A motorcycle model="models\props\moto\moto.mdx;models\props\moto\chrome.mdx" skin="models\props\moto\motoskin.tga;models\props\moto\motoskin_a.tga" */ void SP_props_motorcycle (edict_t *self) { int i; //edict_t *box = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/moto/moto.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/moto/moto.mdx", &self->s.model_parts[PART_HEAD]); self->s.num_parts++; self->s.model_parts[PART_BODY].modelindex = gi.modelindex("models/props/moto/chrome.mdx"); for (i=0; is.model_parts[PART_BODY].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/moto/chrome.mdx", &self->s.model_parts[PART_BODY] ); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx |= RF_REFL_MAP; self->surfacetype = SURF_METAL; gi.linkentity (self); } // END JOSEPH /*QUAKED props_motorcycle_run (0 .5 .8) (-16 -16 -16) (16 16 16) A motorcycle speeding away model="models\props\ride\moto.mdx" */ void think_motorcycle_run (edict_t *self) { if (self->s.frame < 111) { self->nextthink = level.time + 0.1; self->s.frame++; } else { G_FreeEdict (self); } } void SP_props_motorcycle_run (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.angles[0] = 0; self->s.angles[1] = 270; self->s.angles[2] = 0; self->s.origin[0] = -2368+16; self->s.origin[1] = -880-16; self->s.origin[2] = 48-16-5; self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/ride/head.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/ride/head.mdx", &self->s.model_parts[PART_HEAD]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/ride/moto.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/ride/moto.mdx", &self->s.model_parts[1] ); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/ride/body.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/ride/body.mdx", &self->s.model_parts[2] ); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/ride/legs.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/ride/legs.mdx", &self->s.model_parts[3] ); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/ride/cigar.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/ride/cigar.mdx", &self->s.model_parts[4] ); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx |= RF_REFL_MAP; self->think = think_motorcycle_run; self->nextthink = level.time + 2.0; gi.linkentity (self); } /*QUAKED props_motorcycle_runaway (0 .5 .8) (-16 -16 -16) (16 16 16) A motorcycle riding in place model="models\props\runaway\moto.mdx" */ void think_motorcycle_runaway (edict_t *self) { if (self->s.frame < 55) { self->s.frame++; /*if (self->count) { edict_t *player; if (self->count > 10) self->count = 10; player = &g_edicts[1]; player->client->ps.stats[STAT_ENDPIC] = self->count; self->count++; } else { edict_t *player; player = &g_edicts[1]; player->client->ps.stats[STAT_ENDPIC] = 100; }*/ } else { self->s.frame = 0; self->count++; } self->nextthink = level.time + 0.1; } void SP_props_motorcycle_runaway (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/runaway/head.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/runaway/head.mdx", &self->s.model_parts[PART_HEAD]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/runaway/moto.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/runaway/moto.mdx", &self->s.model_parts[1] ); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/runaway/body.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/runaway/body.mdx", &self->s.model_parts[2] ); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/runaway/legs.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/runaway/legs.mdx", &self->s.model_parts[3] ); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx |= RF_REFL_MAP; self->think = think_motorcycle_runaway; self->nextthink = level.time + 0.1; self->count = 0; gi.linkentity (self); } // JOSEPH 13-FEB-99 /*QUAKED props_shelf (0 .5 .8) (-40 -85 -51) (40 85 51) The pawn shop shelf model="models\props\shelf\flametank.mdx;models\props\shelf\pistol.mdx;models\props\shelf\shotgun.mdx;models\props\shelf\tomgun.mdx;models\props\shelf\sshell.mdx" */ void SP_props_shelf (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/shelf/flametank.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/flametank.mdx", &self->s.model_parts[PART_HEAD]); self->s.num_parts++; self->s.model_parts[PART_BODY].modelindex = gi.modelindex("models/props/shelf/pistol.mdx"); for (i=0; is.model_parts[PART_BODY].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/shelf/pistol.mdx", &self->s.model_parts[PART_BODY] ); self->s.num_parts++; self->s.model_parts[PART_LEGS].modelindex = gi.modelindex("models/props/shelf/shotgun.mdx"); for (i=0; is.model_parts[PART_LEGS].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/shelf/shotgun.mdx", &self->s.model_parts[PART_BODY] ); self->s.num_parts++; self->s.model_parts[PART_GUN].modelindex = gi.modelindex("models/props/shelf/sshell.mdx"); for (i=0; is.model_parts[PART_GUN].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/shelf/sshell.mdx", &self->s.model_parts[PART_BODY] ); self->s.num_parts++; self->s.model_parts[PART_GUN2].modelindex = gi.modelindex("models/props/shelf/tomgun.mdx"); for (i=0; is.model_parts[PART_GUN2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/shelf/tomgun.mdx", &self->s.model_parts[PART_BODY] ); self->s.renderfx2 |= RF2_DIR_LIGHTS; gi.linkentity (self); } // END JOSEPH /*QUAKED props_mattressA (0 .5 .8) (-36 -28 -38) (36 28 38) model="models/props/mattress/matt.md2" A mattress */ void SP_props_mattressA (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/mattress/matt.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -36, -28, -38); VectorSet (self->maxs, 36, 28, 38); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props_mattressB (0 .5 .8) (-8 -34-38) (8 34 38) A mattress model="models/props/mattress/matt2.md2" */ void SP_props_mattressB (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/mattress/matt2.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -8, -34, -38); VectorSet (self->maxs, 8, 34, 38); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props_mattressC (0 .5 .8) (-34 -38 -8) (34 38 8) A mattress model="models/props/mattress/matt3.md2" */ void SP_props_mattressC (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/mattress/matt3.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -34, -38, -8); VectorSet (self->maxs, 34, 38, 8); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props_tv (0 .5 .8) (-8 -16 -22) (8 16 22) A television model="models\props\tv\tv.md2" */ void SP_props_tv (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/tv/tv.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -8, -16, -22); VectorSet (self->maxs, 8, 16, 22); self->s.renderfx2 |= RF2_NOSHADOW; self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props_steam_machine (0 .5 .8) (-8 -8 -8) (8 8 8) A real steam producer "alphalevel" 1 - 10 (default 2) "firetype" length of steam 1 - 100 (default 15) "thudsurf" start size of steam 1 - 10 (default 5) "thudsnd" end size steam increase 1 - 10 (default 5) "deadticks" number of steam puffs per length element 1- 10 (default 2) */ void steam_think( edict_t *ent) { ent->nextthink = level.time + 0.5; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SFXSTEAM); gi.WritePosition (ent->s.origin); gi.WriteDir (ent->s.angles); gi.WriteByte (ent->firetype); // length gi.WriteByte (ent->deadticks); // puffs gi.WriteByte (ent->thudsurf); // start size gi.WriteByte (ent->thudsnd); // end size if (ent->alphalevel) gi.WriteByte (ent->alphalevel); else gi.WriteByte (0); gi.multicast (ent->s.origin, MULTICAST_PVS); } void SP_props_steam_machine (edict_t *ent) { if (ent->alphalevel > 10) ent->alphalevel = 10; if ((!ent->thudsurf) || (ent->thudsurf > 10)) ent->thudsurf = 5; if ((!ent->thudsnd) || (ent->thudsnd > 10)) ent->thudsnd = 5; if ((!ent->firetype) || (ent->firetype > 100)) ent->firetype = 15; if ((!ent->deadticks) || (ent->deadticks > 10)) ent->deadticks = 2; ent->think = steam_think; ent->nextthink = level.time + 0.1; gi.linkentity (ent); } // JOSEPH 24-FEB-99 /*QUAKED props_trash (0 .5 .8) (-64 -64 -4) (64 64 4) Some trash model="models\props\trash\tris.md2" */ void SP_props_trash (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -64, -64, -4); VectorSet (self->maxs, 64, 64, 4); self->model = "models/props/trash/tris.md2"; self->s.modelindex = gi.modelindex (self->model); self->s.renderfx2 |= RF2_NOSHADOW; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); } // END JOSEPH /*UAKED props_wall_fall_test (0 .5 .8) (-64 -26 -48) (64 26 48) A test wall model="models\props\wall\testwall.mdx" */ /*QUAKED props_wall_fall (0 .5 .8) (-64 -26 -48) (64 26 48) A wall that falls when trigered model="models\props\wall\wall.mdx" */ void wall_fall_final (edict_t *self) { if (self->s.frame < 45) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } if (self->misstime-- > 0) { if (self->misstime <= 20) { if (self->misstime == 20) { self->s.renderfx2 |= RF2_PASSALPHA; self->s.effects = 1; // this is full alpha now } self->s.effects += (255/20); if (self->s.effects > 255) self->s.effects = 255; } self->nextthink = level.time + 0.1; } else { G_FreeEdict (self); } } // END JOSEPH void wall_fall_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = wall_fall_final; ent->nextthink = level.time + FRAMETIME; gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props_wall_fall (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -64, -26, -48); VectorSet (self->maxs, 64, 26, 48); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/wall/wall.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/wall/wall.mdx", &self->s.model_parts[PART_HEAD]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = wall_fall_trigger; self->svflags |= SVF_NOCLIENT; self->misstime = 40; gi.linkentity (self); } /*QUAKED props_trashbottle (0 .5 .8) (-8 -2 -2) (8 2 2) Some trash model="models\props\trashbottle\tris.md2" */ void SP_props_trashbottle (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/trashbottle/tris.md2"; self->s.modelindex = gi.modelindex (self->model); self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); } // END JOSEPH /*QUAKED props_trashpaper (0 .5 .8) (-18 -18 -2) (18 18 2) Some trash model="models\props\trashpaper\tris.md2" */ void SP_props_trashpaper (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/trashpaper/tris.md2"; self->s.modelindex = gi.modelindex (self->model); self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); } // END JOSEPH /*QUAKED props_trashwall (0 .5 .8) (-70 -25 -10) (70 25 10) Some trash model="models\props\trashwall\tris.md2" */ void SP_props_trashwall (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/trashwall/tris.md2"; self->s.modelindex = gi.modelindex (self->model); self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); } // END JOSEPH /*QUAKED props_trashcorner (0 .5 .8) (-40 -40 -8) (40 40 8) Some trash model="models\props\trashcorner\tris.md2" */ void SP_props_trashcorner (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/trashcorner/tris.md2"; self->s.modelindex = gi.modelindex (self->model); self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); } // END JOSEPH /*QUAKED props_trashbottle_vert (0 .5 .8) (-2 -2 -8) (2 2 8) A vertical trash bottle model="models\props\trashbottle_vert\tris.md2" */ void SP_props_trashbottle_vert (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/trashbottle_vert/tris.md2"; self->s.modelindex = gi.modelindex (self->model); self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); } // END JOSEPH /*QUAKED props_shelf_fall (0 .5 .8) (-65 -13 -51) (65 13 51) An falling shelf The bounding box can be rotated in angles of 90 deg and block properly model="models\props\shelf\shelf.mdx;models\props\shelf\top.mdx" */ void shelf_fall_final (edict_t *self) { if (self->s.frame < 84) { self->nextthink = level.time + 0.1; self->s.frame++; self->handle2->s.frame++; } } void shelf_fall_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = shelf_fall_final; } void SP_props_shelf_fall (edict_t *self) { int i; edict_t *newent = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -20, -78, -52); VectorSet (self->maxs, 20, 78, 52); } else { VectorSet (self->mins, -78, -20, -52); VectorSet (self->maxs, 78, 20, 52); } self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/shelf/shelf.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/shelf.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/shelf/tops.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/tops.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/shelf/barre0.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre0.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/shelf/barre1.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre1.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/shelf/barre2.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre2.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/shelf/barre3.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre3.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/shelf/barre4.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre4.mdx", &self->s.model_parts[6]); newent = G_Spawn(); if (!newent) return; self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_NOT; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = newent->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/shelf/barre5.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre5.mdx", &newent->s.model_parts[0]); newent->s.num_parts++; newent->s.model_parts[1].modelindex = gi.modelindex("models/props/shelf/barre6.mdx"); for (i=0; is.model_parts[1].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre6.mdx", &newent->s.model_parts[1]); newent->s.num_parts++; newent->s.model_parts[2].modelindex = gi.modelindex("models/props/shelf/barre7.mdx"); for (i=0; is.model_parts[2].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre7.mdx", &newent->s.model_parts[2]); newent->s.num_parts++; newent->s.model_parts[3].modelindex = gi.modelindex("models/props/shelf/barre8.mdx"); for (i=0; is.model_parts[3].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre8.mdx", &newent->s.model_parts[3]); newent->s.num_parts++; newent->s.model_parts[4].modelindex = gi.modelindex("models/props/shelf/barre9.mdx"); for (i=0; is.model_parts[4].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre9.mdx", &newent->s.model_parts[4]); newent->s.num_parts++; newent->s.model_parts[5].modelindex = gi.modelindex("models/props/shelf/barre10.mdx"); for (i=0; is.model_parts[5].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelf/barre10.mdx", &newent->s.model_parts[5]); newent->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->die = shelf_fall_die; self->takedamage = DAMAGE_YES; newent->surfacetype = SURF_WOOD; self->surfacetype = SURF_WOOD; gi.linkentity (newent); gi.linkentity (self); } /*QUAKED props_shelfB_fall (0 .5 .8) (-65 -13 -51) (65 13 51) Another falling shelf model="models\props\shelftwo\shelf.mdx;models\props\shelftwo\top.mdx" */ void shelfB_fall_final (edict_t *self) { if (self->s.frame < 75) { self->nextthink = level.time + 0.1; self->s.frame++; self->handle->s.frame++; self->handle2->s.frame++; } } void shelfB_fall_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = shelfB_fall_final; } void SP_props_shelfB_fall (edict_t *self) { int i; edict_t *newent = NULL; edict_t *newent2 = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -20, -78, -52); VectorSet (self->maxs, 20, 78, 52); } else { VectorSet (self->mins, -78, -20, -52); VectorSet (self->maxs, 78, 20, 52); } self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/shelftwo/shelf.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/shelf.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/shelftwo/tanktops.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tanktops.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/shelftwo/barre0.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barre0.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/shelftwo/barre1.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barre1.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/shelftwo/barre2.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barre2.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/shelftwo/barre3.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barre3.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/shelftwo/barre4.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barre4.mdx", &self->s.model_parts[6]); newent = G_Spawn(); if (!newent) return; self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_NOT; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = newent->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/shelftwo/barre6.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barre6.mdx", &newent->s.model_parts[0]); newent->s.num_parts++; newent->s.model_parts[1].modelindex = gi.modelindex("models/props/shelftwo/barre8.mdx"); for (i=0; is.model_parts[1].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barre8.mdx", &newent->s.model_parts[1]); newent->s.num_parts++; newent->s.model_parts[2].modelindex = gi.modelindex("models/props/shelftwo/tank_lg.mdx"); for (i=0; is.model_parts[2].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tank_lg.mdx", &newent->s.model_parts[2]); newent->s.num_parts++; newent->s.model_parts[3].modelindex = gi.modelindex("models/props/shelftwo/tank_lg3.mdx"); for (i=0; is.model_parts[3].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tank_lg3.mdx", &newent->s.model_parts[3]); newent->s.num_parts++; newent->s.model_parts[4].modelindex = gi.modelindex("models/props/shelftwo/tank_lg1.mdx"); for (i=0; is.model_parts[4].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tank_lg1.mdx", &newent->s.model_parts[4]); newent->s.num_parts++; newent->s.model_parts[5].modelindex = gi.modelindex("models/props/shelftwo/tank_lg2.mdx"); for (i=0; is.model_parts[5].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tank_lg2.mdx", &newent->s.model_parts[5]); newent2 = G_Spawn(); if (!newent2) return; self->handle = newent2; VectorCopy(self->s.origin, newent2->s.origin); VectorCopy(self->s.angles, newent2->s.angles); newent2->solid = SOLID_NOT; newent2->movetype = MOVETYPE_NONE; newent2->svflags |= SVF_PROP; newent2->s.skinnum = newent2->skin; memset(&(newent2->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent2->s.num_parts++; newent2->s.model_parts[0].modelindex = gi.modelindex("models/props/shelftwo/tank_sm.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tank_sm.mdx", &newent2->s.model_parts[0]); newent2->s.num_parts++; newent2->s.model_parts[1].modelindex = gi.modelindex("models/props/shelftwo/tank_sm1.mdx"); for (i=0; is.model_parts[1].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tank_sm1.mdx", &newent2->s.model_parts[1]); newent2->s.num_parts++; newent2->s.model_parts[2].modelindex = gi.modelindex("models/props/shelftwo/tank_sm2.mdx"); for (i=0; is.model_parts[2].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/tank_sm2.mdx", &newent2->s.model_parts[2]); newent2->s.num_parts++; newent2->s.model_parts[3].modelindex = gi.modelindex("models/props/shelftwo/barreltops.mdx"); for (i=0; is.model_parts[3].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelftwo/barreltops.mdx", &newent2->s.model_parts[3]); newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent2->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->die = shelfB_fall_die; self->takedamage = DAMAGE_YES; newent->surfacetype = SURF_WOOD; newent2->surfacetype = SURF_WOOD; self->surfacetype = SURF_WOOD; gi.linkentity (newent); gi.linkentity (newent2); gi.linkentity (self); } /*QUAKED props_rat (0 .5 .8) (-12 -12 0) (12 12 10) A rat "dmg" - rat bite damage (2 default) "health" - heath of the rat (10 default) */ void rat_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { vec3_t realorigin; VectorCopy(self->s.origin, realorigin); realorigin[2] += 8; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_GIBS); gi.WritePosition (realorigin); gi.WriteDir (vec3_origin); gi.WriteByte ( 1 ); // number of gibs gi.WriteByte ( 0 ); // scale of direction to add to velocity gi.WriteByte ( 0 ); // random offset scale gi.WriteByte ( 10 ); // random velocity scale gi.multicast (realorigin, MULTICAST_PVS); gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SPLASH); gi.WriteByte (50); gi.WritePosition (realorigin); gi.WriteDir (self->movedir); gi.WriteByte (6); gi.multicast (realorigin, MULTICAST_PVS); // If this rat was spawned - tell spawner to make a new one if (self->targetname) { int i; edict_t *e = NULL; for (i=1, e=g_edicts+i ; i < globals.num_edicts ; i++,e++) { if ((e->classname) && (!strcmp(e->classname, "props_rat_spawner")) && (e->target) && (!strcmp(e->target, self->targetname))) { e->fxdensity++; break; } } } G_FreeEdict (self); } int check_rat_hit_player(edict_t *ent) { trace_t tr; vec3_t endpos, forward; AngleVectors (ent->s.angles, forward, NULL, NULL); VectorMA(ent->s.origin, 32, forward, endpos); endpos[2] += 32; tr = gi.trace(ent->s.origin, NULL, NULL, endpos, ent, MASK_SHOT); if (tr.fraction < 1) { if ((tr.ent) && (tr.ent->client)) { vec3_t start, aimdir, dang; if (ent->timestamp > level.time) return false; ent->timestamp = level.time + 0.5; ent->debugprint = 1; //T_Damage (tr.ent, tr.ent, tr.ent, vec3_origin, tr.ent->s.origin, vec3_origin, ent->dmg, ent->dmg, 0, MOD_DOGBITE); VectorSubtract (tr.ent->s.origin, ent->s.origin, aimdir); vectoangles (aimdir, dang); AngleVectors (dang, forward, NULL, NULL); VectorMA (ent->s.origin, 16, forward, start); fire_rat (ent, start, forward, ent->dmg); return true; } } return false; } void rat_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) { if (!other->client) return; if (self->timestamp > level.time) return; self->timestamp = level.time + 0.5; self->debugprint = 1; T_Damage (other, self, self, vec3_origin, other->s.origin, vec3_origin, self->dmg, self->dmg, 0, MOD_DOGBITE); } void rat_go (edict_t *self) { if (self->option) { cvar_t *props; props = gi.cvar("props", "1", CVAR_ARCHIVE); if (!props->value) { self->nextthink = level.time + (FRAMETIME * 10); return; } } if (self->debugprint != 1) M_walkmove (self, self->healspeed, 20 * 5 * FRAMETIME); if (self->debugprint == 1) { if (self->s.frame < 8 || self->s.frame >= 17) { self->s.frame = 8; } else { self->s.frame++; if (self->s.frame == 17) { self->debugprint = 0; } } } else if (!VectorCompare(self->s.origin, self->s.old_origin)) { if (self->s.frame <= 3) { self->s.frame++; } else { self->s.frame = 0; } if (self->fxdensity++ >= self->deadticks) { self->deadticks = rand()&7; self->healspeed += (rand()&31)-16; if (self->healspeed > 360) self->healspeed = (self->healspeed - 360); if (self->healspeed < 0) self->healspeed = (self->healspeed + 360); self->s.angles[1] = self->healspeed; } if ((rand()&127) == 4) { self->debugprint = 1; } } else { if (self->s.frame <= 7 && self->s.frame >= 4) { self->s.frame++; } else { self->s.frame = 4; } if (self->durationflag) self->healspeed += 16; else self->healspeed -= 16; if (self->healspeed > 360) self->healspeed = (self->healspeed - 360); if (self->healspeed < 0) self->healspeed = (self->healspeed + 360); self->s.angles[1] = self->healspeed; M_walkmove (self, self->healspeed, 20 * 5 * FRAMETIME); if (!VectorCompare(self->s.origin, self->s.old_origin)) { self->deadticks = (rand()&3)+6; } else { if (check_rat_hit_player(self)) { self->debugprint = 1; } } } self->nextthink = level.time + FRAMETIME; } void SP_props_rat (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; VectorSet (self->mins, -8, -8, 0); VectorSet (self->maxs, 8, 8, 10); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/actors/rat/rat.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/actors/rat/rat.mdx", &self->s.model_parts[0]); self->s.renderfx2 |= RF2_DIR_LIGHTS; // Note to Joseph: you can use AI_ADJUSTPITCH to keep them angled correctly on slopes self->monsterprop = 1; self->deadticks = 1; self->fxdensity = 0; self->healspeed = rand()&360; self->debugprint = 0; // Born left or right handed self->durationflag = rand()&1; self->die = rat_die; self->touch = rat_touch; self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; if (!self->dmg) self->dmg = 2; if (!self->health) self->health = 10; self->think = rat_go; self->nextthink = level.time + (FRAMETIME * 2); self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props_rat_trigger (0 .5 .8) (-12 -12 0) (12 12 10) A rat that is spawned when triggered "dmg" - rat bite damage (2 default) "health" - heath of the rat (10 default) "targetname" - target ID */ void rat_trigger_use (edict_t *self, edict_t *other, edict_t *activator) { self->svflags &= ~SVF_NOCLIENT; self->use = NULL; self->targetname = NULL; self->solid = SOLID_BBOX; self->think = rat_go; self->nextthink = level.time + FRAMETIME; } void SP_props_rat_trigger (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; VectorSet (self->mins, -8, -8, 0); VectorSet (self->maxs, 8, 8, 10); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/actors/rat/rat.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/actors/rat/rat.mdx", &self->s.model_parts[0]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->monsterprop = 1; self->deadticks = 1; self->fxdensity = 0; self->healspeed = rand()&360; self->debugprint = 0; // Born left or right handed self->durationflag = rand()&1; self->die = rat_die; self->touch = rat_touch; self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; if (!self->dmg) self->dmg = 2; if (!self->health) self->health = 10; if (self->targetname) { self->solid = SOLID_NOT; self->use = rat_trigger_use; self->svflags |= SVF_NOCLIENT; } else { gi.dprintf ("props_rat_trigger without a targetname at %s\n", vtos(self->absmin)); G_FreeEdict (self); return; } self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props_rat_spawner (0 .5 .8) (-16 -16 -16) (16 16 16) Base rat spawner props_rat_spawner_node determine possible spawn point "dmg" - rat bite damage (2 default) "health" - heath of the rat (10 default) "deadticks" - total number of rats in level from spawner at a time (default 5) "target" - ID string for spawner */ void rat_spawn_think (edict_t *self) { if (self->fxdensity) { int i, tnode, node; edict_t *e = NULL; if (self->option) { cvar_t *props; props = gi.cvar("props", "1", CVAR_ARCHIVE); if (!props->value) { self->nextthink = level.time + FRAMETIME * 50; return; } } tnode = rand()%self->firetype; node = 0; // Find a spawner origin for (i=1, e=g_edicts+i ; i < globals.num_edicts ; i++,e++) { if ((e->classname) && (!strcmp(e->classname, "props_rat_spawner_node")) && (e->targetname) && (self->target) && (!strcmp(e->targetname, self->target)) // Ridah, added this so they don't spawn if you can see them && (!gi.inPVS(g_edicts[1].s.origin, e->s.origin))) { if (node == tnode) { edict_t *rat = NULL; rat = G_Spawn(); if (!rat) return; // Spawn new rat VectorCopy(e->s.origin, rat->s.origin); rat->s.origin[2] -= 6; rat->targetname = self->target; rat->dmg = self->dmg; rat->health = self->health; rat->option = self->option; SP_props_rat(rat); self->fxdensity--; self->nextthink = level.time + FRAMETIME * 50; return; } node++; } } } self->nextthink = level.time + FRAMETIME * 50; // Ridah, increased this } void rat_spawn_first_think (edict_t *self) { int i; edict_t *e = NULL; if (self->target) { for (i=1, e=g_edicts+i ; i < globals.num_edicts ; i++,e++) { if ((e->classname) && (!strcmp(e->classname, "props_rat_spawner_node")) && (e->targetname) && (!strcmp(e->targetname, self->target))) { self->firetype++; } } if (self->firetype) { self->think = rat_spawn_think; self->nextthink = level.time + FRAMETIME; } } else { gi.dprintf ("props_rat_spawner without a target at %s\n", vtos(self->absmin)); } } void SP_props_rat_spawner (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if (!self->deadticks) self->deadticks = 5; self->fxdensity = self->deadticks; if (!self->dmg) self->dmg = 2; if (!self->health) self->health = 10; self->firetype = 0; self->think = rat_spawn_first_think; self->nextthink = level.time + (FRAMETIME * 3); gi.linkentity (self); } // END JOSEPH /*QUAKED props_rat_spawner_node (0 .5 .8) (-16 -16 -16) (16 16 16) Possible rat spawn point from props_rat_spawner "targetname" - ID string for spawner */ void SP_props_rat_spawner_node (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; gi.linkentity (self); } /*QUAKED props_blimp (0 .5 .8) (-140 -40 -58) (140 40 58) A path corner blimp - trigger to make visable and start moving "speed" speed of the blimp (20 default) "target" target path corner ID model="models\props\blimp\tris.md2" */ void train_use (edict_t *self, edict_t *other, edict_t *activator); void func_train_find (edict_t *self); void blimp_use (edict_t *self, edict_t *other, edict_t *activator) { self->svflags &= ~SVF_NOCLIENT; self->use = train_use; train_use (self, other, activator); } void SP_props_blimp (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } if (!self->target) { gi.dprintf ("props_blimp without a target at %s\n", vtos(self->absmin)); G_FreeEdict (self); return; } if (!self->speed) self->speed = 20; self->solid = SOLID_NOT; self->movetype = MOVETYPE_FLY; self->svflags |= SVF_PROP; self->model = "models/props/blimp/tris.md2"; self->s.modelindex = gi.modelindex (self->model); self->s.renderfx2 |= RF2_NOSHADOW; self->think = func_train_find; self->nextthink = level.time + FRAMETIME; self->use = blimp_use; self->svflags |= SVF_NOCLIENT; self->moveinfo.accel = self->moveinfo.decel = self->moveinfo.speed = self->speed; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props_roof_vent (0 .5 .8) (-32 -36 -48) (32 36 48) A moving roof vent "health" - hit points (25 default) model="models\props\roof_vent\tris.md2" */ void vent_explode (edict_t *self) { vec3_t org; float spd; vec3_t save; VectorCopy (self->s.origin, save); VectorMA (self->absmin, 0.5, self->size, self->s.origin); // a few big chunks spd = 1.5 * (float)self->dmg / 200.0; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); // bottom corners spd = 1.75 * (float)self->dmg / 200.0; VectorCopy (self->absmin, org); ThrowDebris (self, "models/props/metal/metal2.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; ThrowDebris (self, "models/props/metal/metal3.md2", spd, org); VectorCopy (self->absmin, org); org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal4.md2", spd, org); VectorCopy (self->absmin, org); org[0] += self->size[0]; org[1] += self->size[1]; ThrowDebris (self, "models/props/metal/metal5.md2", spd, org); // a bunch of little chunks spd = 2 * self->dmg / 200; org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); org[0] = self->s.origin[0] + crandom() * self->size[0]; org[1] = self->s.origin[1] + crandom() * self->size[1]; org[2] = self->s.origin[2] + crandom() * self->size[2]; ThrowDebris (self, "models/props/metal/metal1.md2", spd, org); VectorCopy (save, self->s.origin); } void vent_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->s.frame = 0; self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = vent_explode; self->activator = attacker; self->model = "models/props/ventbroke/tris.md2"; self->s.modelindex = gi.modelindex (self->model); } void think_roof_vent (edict_t *self) { if (self->s.frame < 11) { self->s.frame++; } else { self->s.frame = 0; } self->nextthink = level.time + FRAMETIME; } void SP_props_roof_vent (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/roof_vent/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -32, -36, -48); VectorSet (self->maxs, 32, 36, 48); self->surfacetype = SURF_METAL_L; self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); self->die = vent_die; self->takedamage = DAMAGE_YES; if (!self->health) self->health = 25; self->nextthink = level.time + FRAMETIME *2; self->think = think_roof_vent; } /*QUAKED props2_truck_die_TEST (0 .5 .8) (-61 -148 -78) (61 148 78) First and last frames of the truck model="models\props\trucktest\1st.mdx;models\props\trucktest\last.mdx" */ /*QUAKED props2_truck_die (0 .5 .8) (-61 -148 -78) (61 148 78) A truck that becomes toast model="models\props\truck\box.mdx;models\props\truck\tires.mdx;models\props\truck\wood.mdx;models\props\truck\c4.mdx;models\props\truck\m26y.mdx;models\props\truck\mn3.mdx;models\props\truck\mp1a.mdx;models\props\truck\v1a.mdx;models\props\truck\v1b.mdx;models\props\truck\v1c.mdx;" */ void truck_die_final (edict_t *self) { if (self->s.frame < 59) { self->svflags &= ~SVF_NOCLIENT; self->handle2->svflags &= ~SVF_NOCLIENT; self->nextthink = level.time + 0.1; self->s.frame++; self->handle2->s.frame++; } //self->s.origin[2] += 5; //gi.dprintf ("z: %5.3f\n", self->s.origin[2]); } void truck_die_use (edict_t *self, edict_t *other, edict_t *activator) { self->use = NULL; self->nextthink = level.time + FRAMETIME; self->think = truck_die_final; } void SP_props2_truck_die (edict_t *self) { int i; edict_t *newent = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.angles[1] = 270; //VectorSet (self->mins, -148, -61, -78); //VectorSet (self->maxs, 148, 61, 78); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/truck/box.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/truck/box.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/truck/c4.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/truck/c4.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/truck/m26y.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/truck/m26y.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/truck/mn3.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/truck/mn3.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/truck/mp1a.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/truck/mp1a.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/truck/tires.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/truck/tires.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/truck/v1a.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/truck/v1a.mdx", &self->s.model_parts[6]); newent = G_Spawn(); if (!newent) return; self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_NOT; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = newent->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/truck/v1b.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/truck/v1b.mdx", &newent->s.model_parts[0]); newent->s.num_parts++; newent->s.model_parts[1].modelindex = gi.modelindex("models/props/truck/v1c.mdx"); for (i=0; is.model_parts[1].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/truck/v1c.mdx", &newent->s.model_parts[1]); newent->s.num_parts++; newent->s.model_parts[2].modelindex = gi.modelindex("models/props/truck/wood.mdx"); for (i=0; is.model_parts[2].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/truck/wood.mdx", &newent->s.model_parts[2]); newent->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->use = truck_die_use; self->s.renderfx2 |= RF2_NOSHADOW; newent->s.renderfx2 |= RF2_NOSHADOW; self->svflags |= SVF_NOCLIENT; newent->svflags |= SVF_NOCLIENT; gi.linkentity (newent); gi.linkentity (self); } /*QUAKED props_cola_machine (0 .5 .8) (-16 -24 -32) (24 32 32) A cola machine The bounding box can be rotated in angles of 90 deg and block properly model="models\props\vending_mach\tris.md2" */ void SP_props_cola_machine (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/vending_mach/tris.md2"; self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -24, -16, -32); VectorSet (self->maxs, 24, 16, 32); } else { VectorSet (self->mins, -16, -24, -32); VectorSet (self->maxs, 16, 24, 32); } self->s.renderfx2 |= RF2_NOSHADOW; self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props_cig_machine (0 .5 .8) (-16 -24 -32) (16 24 32) A cigarette machine The bounding box can be rotated in angles of 90 deg and block properly model="models\props\cigmachine\tris.md2" */ void SP_props_cig_machine (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/cigmachine/tris.md2"; self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -24, -16, -32); VectorSet (self->maxs, 24, 16, 32); } else { VectorSet (self->mins, -16, -24, -32); VectorSet (self->maxs, 16, 24, 32); } self->s.renderfx2 |= RF2_NOSHADOW; self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props2_barrels_fallA_TEST (0 .5 .8) (-69 -33 -49) (69 33 49) First and last frame of barrels model="models\props\barl1test\1st.mdx;models\props\barl1test\last.mdx" */ /*QUAKED props2_barrels_fallA (0 .5 .8) (-69 -33 -49) (69 33 49) A set of barrels that you can trigger to fall model="models\props\barl1\barrels.mdx;models\props\barl1\tops.mdx" */ void barrels_fallA (edict_t *self) { if (self->s.frame < 28) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } void barrelsfallA_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = barrels_fallA; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_barrels_fallA (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -69, -33, -49); VectorSet (self->maxs, 69, 33, 49); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/barl1/barrels.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/barl1/barrels.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/barl1/tops.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/barl1/tops.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallA_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props2_barrels_fallB_TEST (0 .5 .8) (-69 -33 -49) (69 33 49) First and last frame of barrels model="models\props\barl2test\1st.mdx;models\props\barl2test\last.mdx" */ /*QUAKED props2_barrels_fallB (0 .5 .8) (-33 -81 -49) (33 81 49) Another set of barrels that you can trigger to fall model="models\props\barl2\barrels2.mdx;models\props\barl2\tops2.mdx" */ void barrels_fallB (edict_t *self) { if (self->s.frame < 38) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } void barrelsfallB_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = barrels_fallB; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_barrels_fallB (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -33, -81, -49); VectorSet (self->maxs, 33, 81, 49); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/barl2/barrels2.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/barl2/barrels2.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/barl2/tops2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/barl2/tops2.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallB_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props2_clubcouch (0 .5 .8) (-32 -64 -24) (32 64 24) A couch The bounding box can be rotated in angles of 90 deg and block properly model="models\props\clubcouch\" */ void SP_props2_clubcouch (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/clubcouch/tris.md2"; self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -64, -32, -24); VectorSet (self->maxs, 64, 32, 24); } else { VectorSet (self->mins, -32, -64, -24); VectorSet (self->maxs, 32, 64, 24); } self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_clubchair (0 .5 .8) (-32 -32 -24) (32 32 24) A pushable chair model="models\props\clubchair\" */ void SP_props2_clubchair (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; self->pullable = 1; self->nokickbackflag = 1; self->model = "models/props/clubchair/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -32, -32, -24); VectorSet (self->maxs, 32, 32, 24); if (!self->mass) self->mass = 400; if (!self->health) self->health = 25; //self->die = trashcanA_delay; //self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; self->touch = chair_touch; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_vaseA (0 .5 .8) (-16 -16 -24) (16 16 24) A vase model="models\props\vase1\" */ void SP_props2_vaseA (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/vase1/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, 24); if (!self->health) self->health = 25; self->die = metal_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_TILE; gi.linkentity (self); } /*QUAKED props2_vaseB (0 .5 .8) (-16 -16 -24) (16 16 24) A vase model="models\props\vase2\" */ void SP_props2_vaseB (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/vase2/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, 24); if (!self->health) self->health = 25; self->die = metal_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_TILE; gi.linkentity (self); } /*QUAKED props2_chair_conf (0 .5 .8) (-24 -24 -32) (24 24 32) An pushable chair model="models\props\confchair\" */ void SP_props2_chair_conf (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_STEP; self->svflags |= SVF_PROP; self->pullable = 1; self->nokickbackflag = 1; self->model = "models/props/confchair/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -24, -24, -32); VectorSet (self->maxs, 24, 24, 32); if (!self->mass) self->mass = 400; if (!self->health) self->health = 25; //self->die = trashcanA_delay; //self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; self->touch = chair_touch; self->think = M_droptofloor; self->nextthink = level.time + 2 * FRAMETIME; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_shelf_metal_A_fall (0 .5 .8) (-60 -20 -56) (60 20 66) A falling metal shelf The bounding box can be rotated in angles of 90 deg and block properly model="models\props\shelfmetal1\shelf1.mdx;models\props\shelfmetal1\shelf2.mdx;models/props/shelfmetal1/barreltops.mdx;models/props/shelfmetal1/tanktops.mdx" */ void shelfA_fall_final_mb (edict_t *self) { if (self->s.frame < 62) { self->solid = SOLID_NOT; self->nextthink = level.time + 0.1; self->s.frame++; self->handle->s.frame++; self->handle2->s.frame++; } } void shelfA_fall_die_mb (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = shelfA_fall_final_mb; } void SP_props2_shelf_metal_A_fall (edict_t *self) { int i; edict_t *newent = NULL; edict_t *newent2 = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -20, -60, -56); VectorSet (self->maxs, 20, 60, 66); } else { VectorSet (self->mins, -60, -20, -56); VectorSet (self->maxs, 60, 20, 66); } self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/shelfmetal1/shelf1.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/shelf1.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/shelfmetal1/tanktops.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/tanktops.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/shelfmetal1/shelf2.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/shelf2.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/shelfmetal1/barre1.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/barre1.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/shelfmetal1/barre2.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/barre2.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/shelfmetal1/barre3.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/barre3.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/shelfmetal1/barre4.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/barre4.mdx", &self->s.model_parts[6]); newent = G_Spawn(); if (!newent) return; self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_NOT; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = newent->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); //newent->s.num_parts++; //newent->s.model_parts[0].modelindex = gi.modelindex("models/props/shelfmetal1/cartboard1.mdx"); //for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; //gi.GetObjectBounds("models/props/shelfmetal1/cartboard1.mdx", &newent->s.model_parts[0]); //newent->s.num_parts++; //newent->s.model_parts[1].modelindex = gi.modelindex("models/props/shelfmetal1/cartboard2.mdx"); //for (i=0; is.model_parts[1].skinnum[i] = newent->s.skinnum; //gi.GetObjectBounds("models/props/shelfmetal1/cartboard2.mdx", &newent->s.model_parts[1]); //newent->s.num_parts++; //newent->s.model_parts[2].modelindex = gi.modelindex("models/props/shelfmetal1/tank_lg.mdx"); //for (i=0; is.model_parts[2].skinnum[i] = newent->s.skinnum; //gi.GetObjectBounds("models/props/shelfmetal1/tank_lg.mdx", &newent->s.model_parts[2]); newent->s.num_parts++; newent->s.model_parts[3].modelindex = gi.modelindex("models/props/shelfmetal1/tank_lg3.mdx"); for (i=0; is.model_parts[3].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/tank_lg3.mdx", &newent->s.model_parts[3]); newent->s.num_parts++; newent->s.model_parts[4].modelindex = gi.modelindex("models/props/shelfmetal1/tank_lg1.mdx"); for (i=0; is.model_parts[4].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/tank_lg1.mdx", &newent->s.model_parts[4]); newent->s.num_parts++; newent->s.model_parts[5].modelindex = gi.modelindex("models/props/shelfmetal1/tank_lg2.mdx"); for (i=0; is.model_parts[5].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/tank_lg2.mdx", &newent->s.model_parts[5]); newent2 = G_Spawn(); if (!newent2) return; self->handle = newent2; VectorCopy(self->s.origin, newent2->s.origin); VectorCopy(self->s.angles, newent2->s.angles); newent2->solid = SOLID_NOT; newent2->movetype = MOVETYPE_NONE; newent2->svflags |= SVF_PROP; newent2->s.skinnum = newent2->skin; memset(&(newent2->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent2->s.num_parts++; newent2->s.model_parts[0].modelindex = gi.modelindex("models/props/shelfmetal1/tank_sm.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/tank_sm.mdx", &newent2->s.model_parts[0]); newent2->s.num_parts++; newent2->s.model_parts[1].modelindex = gi.modelindex("models/props/shelfmetal1/tank_sm1.mdx"); for (i=0; is.model_parts[1].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/tank_sm1.mdx", &newent2->s.model_parts[1]); newent2->s.num_parts++; newent2->s.model_parts[2].modelindex = gi.modelindex("models/props/shelfmetal1/tank_sm2.mdx"); for (i=0; is.model_parts[2].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/tank_sm2.mdx", &newent2->s.model_parts[2]); newent2->s.num_parts++; newent2->s.model_parts[3].modelindex = gi.modelindex("models/props/shelfmetal1/barreltops.mdx"); for (i=0; is.model_parts[3].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal1/barreltops.mdx", &newent2->s.model_parts[3]); newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent2->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->die = shelfA_fall_die_mb; self->takedamage = DAMAGE_YES; newent->surfacetype = SURF_METAL_L; newent2->surfacetype = SURF_METAL_L; self->surfacetype = SURF_METAL_L; gi.linkentity (newent); gi.linkentity (newent2); gi.linkentity (self); } /*QUAKED props2_shelf_metal_B_fall (0 .5 .8) (-60 -20 -56) (60 20 66) Another falling metal shelf The bounding box can be rotated in angles of 90 deg and block properly model="models\props\shelfmetal2\shelf1.mdx;models\props\shelfmetal2\shelf2.mdx;models/props/shelfmetal2/barreltops.mdx;models/props/shelfmetal2/tanktops.mdx" */ void shelfB_fall_final_mb (edict_t *self) { if (self->s.frame < 76) { self->solid = SOLID_NOT; self->nextthink = level.time + 0.1; self->s.frame++; self->handle->s.frame++; self->handle2->s.frame++; } } void shelfB_fall_die_mb (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { self->takedamage = DAMAGE_NO; self->nextthink = level.time + FRAMETIME; self->think = shelfB_fall_final_mb; } void SP_props2_shelf_metal_B_fall (edict_t *self) { int i; edict_t *newent = NULL; edict_t *newent2 = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -20, -60, -56); VectorSet (self->maxs, 20, 60, 66); } else { VectorSet (self->mins, -60, -20, -56); VectorSet (self->maxs, 60, 20, 66); } self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/shelfmetal2/shelf1.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/shelf1.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/shelfmetal2/tanktops.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/tanktops.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/shelfmetal2/shelf2.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/shelf2.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/shelfmetal2/barre1.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/barre1.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/shelfmetal2/barre2.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/barre2.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/shelfmetal2/barre3.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/barre3.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/shelfmetal2/barre4.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/barre4.mdx", &self->s.model_parts[6]); newent = G_Spawn(); if (!newent) return; self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_NOT; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = newent->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/shelfmetal2/cartboard1.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/cartboard1.mdx", &newent->s.model_parts[0]); newent->s.num_parts++; newent->s.model_parts[1].modelindex = gi.modelindex("models/props/shelfmetal2/cartboard2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/cartboard2.mdx", &newent->s.model_parts[1]); //newent->s.num_parts++; //newent->s.model_parts[2].modelindex = gi.modelindex("models/props/shelfmetal2/tank_lg.mdx"); //for (i=0; is.model_parts[2].skinnum[i] = newent->s.skinnum; //gi.GetObjectBounds("models/props/shelfmetal2/tank_lg.mdx", &newent->s.model_parts[2]); //newent->s.num_parts++; //newent->s.model_parts[3].modelindex = gi.modelindex("models/props/shelfmetal2/tank_lg3.mdx"); //for (i=0; is.model_parts[3].skinnum[i] = newent->s.skinnum; //gi.GetObjectBounds("models/props/shelfmetal2/tank_lg3.mdx", &newent->s.model_parts[3]); newent->s.num_parts++; newent->s.model_parts[4].modelindex = gi.modelindex("models/props/shelfmetal2/tank_lg1.mdx"); for (i=0; is.model_parts[4].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/tank_lg1.mdx", &newent->s.model_parts[4]); newent->s.num_parts++; newent->s.model_parts[5].modelindex = gi.modelindex("models/props/shelfmetal2/tank_lg2.mdx"); for (i=0; is.model_parts[5].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/tank_lg2.mdx", &newent->s.model_parts[5]); newent2 = G_Spawn(); if (!newent2) return; self->handle = newent2; VectorCopy(self->s.origin, newent2->s.origin); VectorCopy(self->s.angles, newent2->s.angles); newent2->solid = SOLID_NOT; newent2->movetype = MOVETYPE_NONE; newent2->svflags |= SVF_PROP; newent2->s.skinnum = newent2->skin; memset(&(newent2->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent2->s.num_parts++; newent2->s.model_parts[0].modelindex = gi.modelindex("models/props/shelfmetal2/tank_sm.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/tank_sm.mdx", &newent2->s.model_parts[0]); newent2->s.num_parts++; newent2->s.model_parts[1].modelindex = gi.modelindex("models/props/shelfmetal2/tank_sm1.mdx"); for (i=0; is.model_parts[1].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/tank_sm1.mdx", &newent2->s.model_parts[1]); newent2->s.num_parts++; newent2->s.model_parts[2].modelindex = gi.modelindex("models/props/shelfmetal2/tank_sm2.mdx"); for (i=0; is.model_parts[2].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/tank_sm2.mdx", &newent2->s.model_parts[2]); newent2->s.num_parts++; newent2->s.model_parts[3].modelindex = gi.modelindex("models/props/shelfmetal2/barreltops.mdx"); for (i=0; is.model_parts[3].skinnum[i] = newent2->s.skinnum; gi.GetObjectBounds("models/props/shelfmetal2/barreltops.mdx", &newent2->s.model_parts[3]); newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent2->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->die = shelfB_fall_die_mb; self->takedamage = DAMAGE_YES; newent->surfacetype = SURF_METAL_L; newent2->surfacetype = SURF_METAL_L; self->surfacetype = SURF_METAL_L; gi.linkentity (newent); gi.linkentity (newent2); gi.linkentity (self); } /*QUAKED props2_deadguy (0 .5 .8) (-40 -27 -9) (40 27 9) An dead guy body you can shoot The bounding box can be rotated in angles of 90 deg and block properly "health" - pre-gib hit points for the dead body (50 default) model="models\props\deadguy\body.mdx;models\props\deadguy\head.mdx;models\props\deadguy\legs.mdx" */ void body_gib (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { int i; vec3_t realorigin; VectorCopy(self->s.origin, realorigin); realorigin[2] += 8; for (i = 0; i < 20; i++) { realorigin[0] = (self->s.origin[0] + ((rand()&63) - 32)); realorigin[1] = (self->s.origin[1] + ((rand()&63) - 31)); gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_GIBS); gi.WritePosition (realorigin); gi.WriteDir (vec3_origin); gi.WriteByte ( 2 ); // number of gibs gi.WriteByte ( 0 ); // scale of direction to add to velocity gi.WriteByte ( 0 ); // random offset scale gi.WriteByte ( 10 ); // random velocity scale gi.multicast (realorigin, MULTICAST_PVS); gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SPLASH); gi.WriteByte (4); gi.WritePosition (realorigin); gi.WriteDir (self->movedir); gi.WriteByte (6); gi.multicast (realorigin, MULTICAST_PVS); } if (self->item) { Drop_Item (self, self->item); self->item = NULL; } G_FreeEdict (self); } void SP_props2_deadguy (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->svflags |= SVF_DEADMONSTER; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -27, -40, -9); VectorSet (self->maxs, 27, 40, 9); } else { VectorSet (self->mins, -40, -27, -9); VectorSet (self->maxs, 40, 27, 9); } self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/deadguy/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/deadguy/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/deadguy/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/deadguy/body.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/deadguy/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/deadguy/legs.mdx", &self->s.model_parts[2]); self->die = body_gib; self->takedamage = DAMAGE_YES; if (!self->health) self->health = 50; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); } /*QUAKED props2_deadguy_underwater (0 .5 .8) (-17 -50 0) (13 30 88) An underwater dead guy in cement body you can shoot The bounding box can be rotated in angles of 90 deg and block properly "health" - pre-gib hit points for the dead body (50 default) model="models\props\cementguy\body.mdx;models\props\cementguy\head.mdx;models\props\cementguy\legs.mdx" */ void think_deadguy_underwater (edict_t *self) { if (self->s.frame < 39) { self->s.frame++; } else { self->s.frame = 0; } self->nextthink = level.time + FRAMETIME; } void SP_props2_deadguy_underwater (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -64, -32, 0); VectorSet (self->maxs, 64, 32, 88); } else { VectorSet (self->mins, -32, -64, -0); VectorSet (self->maxs, 32, 64, 88); } self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/cementguy/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cementguy/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/cementguy/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cementguy/head.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/cementguy/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cementguy/legs.mdx", &self->s.model_parts[2]); self->die = body_gib; self->takedamage = DAMAGE_YES; if (!self->health) self->health = 50; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); self->s.renderfx2 |= RF2_NOSHADOW; self->think = think_deadguy_underwater; self->nextthink = level.time + (FRAMETIME*3); } /*QUAKED props2_deadgal_headless (0 .5 .8) (-32 -26 -7) (32 26 7) A female dead body you can shoot that has no head The bounding box can be rotated in angles of 90 deg and block properly "health" - pre-gib hit points for the dead body (50 default) model="models\props\dead_fem\body.mdx;models\props\dead_fem\legs.mdx" */ void SP_props2_deadgal_headless (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->svflags |= SVF_DEADMONSTER; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -26, -32, -7); VectorSet (self->maxs, 26, 32, 7); } else { VectorSet (self->mins, -32, -26, -7); VectorSet (self->maxs, 32, 26, 7); } self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/dead_fem/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/dead_fem/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/dead_fem/legs.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/dead_fem/legs.mdx", &self->s.model_parts[1]); self->die = body_gib; self->takedamage = DAMAGE_YES; if (!self->health) self->health = 50; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); } #define FLAG1 2 #define FLAG2 4 #define FLAG3 8 /*QUAKED props2_flag (0 .5 .8) (-47 -6 -100) (47 6 100) ? FLAG1 FLAG2 FLAG3 A flag The bounding box can be rotated in angles of 90 deg and block properly model="models\props\flag\flag1.md2" */ void think_flag (edict_t *self) { if (self->s.frame < 39) { self->s.frame++; } else { self->s.frame = 0; } self->nextthink = level.time + FRAMETIME; } void SP_props2_flag (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if (self->spawnflags & FLAG2) { self->model = "models/props/flag/flag1.md2"; } else if (self->spawnflags & FLAG3) { self->model = "models/props/flag/flag2.md2"; } else { self->model = "models/props/flag/flag3.md2"; } self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -6, -47, -100); VectorSet (self->maxs, 6, 47, 100); } else { VectorSet (self->mins, -47, -6, -100); VectorSet (self->maxs, 47, 6, 100); } self->s.renderfx2 |= RF2_NOSHADOW; self->surfacetype = SURF_METAL_L; gi.linkentity (self); self->nextthink = level.time + FRAMETIME *2; self->think = think_flag; } /*QUAKED props2_fish (0 .5 .8) (-12 -12 0) (12 12 10) A fish "dmg" - fish bite damage (2 default) "health" - heath of the fish (10 default) */ void fish_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject) { vec3_t realorigin; VectorCopy(self->s.origin, realorigin); realorigin[2] += 8; gi.WriteByte (svc_temp_entity); gi.WriteByte (TE_SPLASH); gi.WriteByte (15); gi.WritePosition (realorigin); gi.WriteDir (self->movedir); gi.WriteByte (6); gi.multicast (realorigin, MULTICAST_PVS); // If this fish was spawned - tell spawner to make a new one if (self->targetname) { int i; edict_t *e = NULL; for (i=1, e=g_edicts+i ; i < globals.num_edicts ; i++,e++) { if ((e->classname) && (!strcmp(e->classname, "props2_fish_spawner")) && (e->target) && (!strcmp(e->target, self->targetname))) { e->fxdensity++; break; } } } G_FreeEdict (self); } int check_fish_hit_player(edict_t *ent) { trace_t tr; vec3_t endpos, forward; AngleVectors (ent->s.angles, forward, NULL, NULL); VectorMA(ent->s.origin, 32, forward, endpos); endpos[2] += 32; tr = gi.trace(ent->s.origin, NULL, NULL, endpos, ent, MASK_SHOT); if (tr.fraction < 1) { if ((tr.ent) && (tr.ent->client)) { vec3_t start, aimdir, dang; if (ent->timestamp > level.time) return false; ent->timestamp = level.time + 0.5; ent->debugprint = 1; //T_Damage (tr.ent, tr.ent, tr.ent, vec3_origin, tr.ent->s.origin, vec3_origin, ent->dmg, ent->dmg, 0, MOD_DOGBITE); VectorSubtract (tr.ent->s.origin, ent->s.origin, aimdir); vectoangles (aimdir, dang); AngleVectors (dang, forward, NULL, NULL); VectorMA (ent->s.origin, 16, forward, start); fire_rat (ent, start, forward, ent->dmg); return true; } } return false; } void fish_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf) { if (!other->client) return; if (self->timestamp > level.time) return; self->timestamp = level.time + 0.5; self->debugprint = 1; T_Damage (other, self, self, vec3_origin, other->s.origin, vec3_origin, self->dmg, self->dmg, 0, MOD_DOGBITE); } void fish_go (edict_t *self) { if (self->option) { cvar_t *props; props = gi.cvar("props", "1", CVAR_ARCHIVE); if (!props->value) { self->nextthink = level.time + (FRAMETIME * 10); return; } } self->waterlevel = 3; M_walkmove (self, self->healspeed, 16 * FRAMETIME); if (!VectorCompare(self->s.origin, self->s.old_origin)) { if (self->s.frame <= 1) { self->s.frame++; } else { self->s.frame = 0; } if (self->fxdensity++ >= self->deadticks) { vec3_t point; int cont; int cangoup = 0; int cangodown = 0; point[0] = self->s.origin[0]; point[1] = self->s.origin[1]; point[2] = self->s.origin[2] + self->maxs[2] - 2; cont = gi.pointcontents (point); if (cont & MASK_WATER) cangoup = 1; point[0] = self->s.origin[0]; point[1] = self->s.origin[1]; point[2] = self->s.origin[2] + self->mins[2] - 4; cont = gi.pointcontents (point); if (cont & MASK_WATER) cangodown = 1; self->deadticks = rand()&7; self->healspeed += (rand()&7)-4; if (self->deadticks > 3) { if (cangodown) self->s.origin[2] -= 0.5; } else { if (cangoup) self->s.origin[2] += 0.5; } if (self->healspeed > 360) self->healspeed = (self->healspeed - 360); if (self->healspeed < 0) self->healspeed = (self->healspeed + 360); self->s.angles[1] = self->healspeed; } } else { if (self->s.frame <= 1) { self->s.frame++; } else { self->s.frame = 0; } if (self->durationflag) self->healspeed += 8; else self->healspeed -= 8; if (self->healspeed > 360) self->healspeed = (self->healspeed - 360); if (self->healspeed < 0) self->healspeed = (self->healspeed + 360); self->s.angles[1] = self->healspeed; self->waterlevel = 3; M_walkmove (self, self->healspeed, 16 * FRAMETIME); if (!VectorCompare(self->s.origin, self->s.old_origin)) { self->deadticks = (rand()&7)+12; } else { check_fish_hit_player(self); } } self->nextthink = level.time + FRAMETIME; } void SP_props2_fish (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_FLY; self->svflags |= SVF_PROP; self->flags |= FL_FLY; self->waterlevel = 3; VectorSet (self->mins, -8, -8, 0); VectorSet (self->maxs, 8, 8, 10); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/actors/shrimp/shrimp.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/actors/shrimp/shrimp.mdx", &self->s.model_parts[0]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->monsterprop = 1; self->deadticks = 1; self->fxdensity = 0; self->healspeed = rand()&360; self->debugprint = 0; // Born left or right handed self->durationflag = rand()&1; self->die = fish_die; self->touch = fish_touch; self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; if (!self->dmg) self->dmg = 2; if (!self->health) self->health = 10; self->think = fish_go; self->nextthink = level.time + (FRAMETIME * 2); self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_fish_trigger (0 .5 .8) (-12 -12 0) (12 12 10) A fish that is spawned when triggered "dmg" - fish bite damage (2 default) "health" - heath of the fish (10 default) "targetname" - target ID */ void fish_trigger_use (edict_t *self, edict_t *other, edict_t *activator) { self->svflags &= ~SVF_NOCLIENT; self->use = NULL; self->targetname = NULL; self->solid = SOLID_BBOX; self->think = fish_go; self->nextthink = level.time + FRAMETIME; } void SP_props2_fish_trigger (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->movetype = MOVETYPE_FLY; self->svflags |= SVF_PROP; self->flags |= FL_FLY; self->waterlevel = 3; VectorSet (self->mins, -8, -8, 0); VectorSet (self->maxs, 8, 8, 10); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/actors/shrimp/shrimp.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/actors/shrimp/shrimp.mdx", &self->s.model_parts[0]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->monsterprop = 1; self->deadticks = 1; self->fxdensity = 0; self->healspeed = rand()&360; self->debugprint = 0; // Born left or right handed self->durationflag = rand()&1; self->die = fish_die; self->touch = fish_touch; self->takedamage = DAMAGE_YES; self->cast_info.aiflags = AI_NOSTEP; if (!self->dmg) self->dmg = 2; if (!self->health) self->health = 10; if (self->targetname) { self->solid = SOLID_NOT; self->use = fish_trigger_use; self->svflags |= SVF_NOCLIENT; } else { gi.dprintf ("props2_fish_trigger without a targetname at %s\n", vtos(self->absmin)); G_FreeEdict (self); return; } self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_fish_spawner (0 .5 .8) (-16 -16 -16) (16 16 16) Base fish spawner props2_fish_spawner_node determine possible spawn point "dmg" - fish bite damage (2 default) "health" - heath of the fish (10 default) "deadticks" - total number of fishs in level from spawner at a time (default 5) "target" - ID string for spawner */ void fish_spawn_think (edict_t *self) { if (self->fxdensity) { int i, tnode, node; edict_t *e = NULL; if (self->option) { cvar_t *props; props = gi.cvar("props", "1", CVAR_ARCHIVE); if (!props->value) { self->nextthink = level.time + FRAMETIME * 50; return; } } tnode = rand()%self->firetype; node = 0; // Find a spawner origin for (i=1, e=g_edicts+i ; i < globals.num_edicts ; i++,e++) { if ((e->classname) && (!strcmp(e->classname, "props2_fish_spawner_node")) && (e->targetname) && (self->target) && (!strcmp(e->targetname, self->target))) { if (node == tnode) { edict_t *fish = NULL; fish = G_Spawn(); if (!fish) return; // Spawn new fish VectorCopy(e->s.origin, fish->s.origin); fish->s.origin[2] -= 6; fish->targetname = self->target; fish->dmg = self->dmg; fish->health = self->health; fish->option = self->option; SP_props2_fish(fish); self->fxdensity--; self->nextthink = level.time + FRAMETIME * 50; return; } node++; } } } self->nextthink = level.time + FRAMETIME * 10; } void fish_spawn_first_think (edict_t *self) { int i; edict_t *e = NULL; if (self->target) { for (i=1, e=g_edicts+i ; i < globals.num_edicts ; i++,e++) { if ((e->classname) && (!strcmp(e->classname, "props2_fish_spawner_node")) && (e->targetname) && (!strcmp(e->targetname, self->target))) { self->firetype++; } } if (self->firetype) { self->think = fish_spawn_think; self->nextthink = level.time + FRAMETIME; } } else { gi.dprintf ("props2_fish_spawner without a target at %s\n", vtos(self->absmin)); } } void SP_props2_fish_spawner (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; if (!self->deadticks) self->deadticks = 5; self->fxdensity = self->deadticks; if (!self->dmg) self->dmg = 2; if (!self->health) self->health = 10; self->firetype = 0; self->think = fish_spawn_first_think; self->nextthink = level.time + (FRAMETIME * 3); gi.linkentity (self); } // END JOSEPH /*QUAKED props2_fish_spawner_node (0 .5 .8) (-16 -16 -16) (16 16 16) Possible fish spawn point from props2_fish_spawner "targetname" - ID string for spawner */ void SP_props2_fish_spawner_node (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; gi.linkentity (self); } /*QUAKED props2_wall_fish (0 .5 .8) (-2 -40 -12) (2 40 12) A fish on the wall The bounding box can be rotated in angles of 90 deg and block properly model="models\props\fish\tris.md2" */ void SP_props2_wall_fish (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/fish/tris.md2"; self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -40, -2, -12); VectorSet (self->maxs, 40, 2, 12); } else { VectorSet (self->mins, -2, -40, -12); VectorSet (self->maxs, 2, 40, 12); } self->s.renderfx2 |= RF2_NOSHADOW; self->surfacetype = SURF_WOOD; gi.linkentity (self); } /*QUAKED props2_barrels_fall_ST (0 .5 .8) (-89 -48 -56) (89 48 56) A set of barrels that you can trigger to fall model="models\props\barl_steel\barrels.mdx;models\props\barl_steel\tops.mdx;models\props\barl_steel\door.mdx" */ void barrels_fallST (edict_t *self) { if (self->s.frame < 37) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } void barrelsfallST_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = barrels_fallST; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_barrels_fall_ST (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -89, -48, -56); VectorSet (self->maxs, 89, 48, 56); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/barl_steel/barrels.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/barl_steel/barrels.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/barl_steel/door.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/barl_steel/door.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/barl_steel/tops.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/barl_steel/tops.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallST_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props2_sign (0 .5 .8) (-4 -44 -44) (4 44 44) A sign The bounding box can be rotated in angles of 90 deg and block properly model="models\props\sign\sign.mdx;models\props\sign\bar.mdx;models\props\sign\chain.mdx" */ void think_sign (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 40) { self->s.frame++; } else { self->s.frame = 0; } } void SP_props2_sign (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -44, -4, -44); VectorSet (self->maxs, 44, 4, 44); } else { VectorSet (self->mins, -4, -44, -44); VectorSet (self->maxs, 4, 44, 44); } memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/sign/sign.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/sign/sign.mdx", &self->s.model_parts[0] ); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/sign/bar.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/sign/bar.mdx", &self->s.model_parts[1] ); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->surfacetype = SURF_METAL_L; gi.linkentity (self); self->think = think_sign; self->nextthink = level.time + 2 * FRAMETIME; } /*QUAKED props2_lighthouse_beam (0 .5 .8) (-16 -16 -88) (16 16 -40) A light house light beam that rotates -482 -25 -88, -85 25 -40 "reactdelay" light distance from center (default 40) model="models\props\litecone\litecone.mdx" */ void think_lighthouse_beam (edict_t *self) { self->nextthink = level.time + FRAMETIME; self->s.angles[1] += 3; if (self->handle) { vec3_t forward; AngleVectors(self->s.angles, forward, NULL, NULL); VectorMA(self->s.origin, self->reactdelay, forward, self->handle->s.origin); self->handle->s.origin[2] -= 64; } } void SP_props2_lighthouse_beam (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/litecone/litecone.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/litecone/litecone.mdx", &self->s.model_parts[0] ); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_PASSALPHA; self->s.effects = 128+32; gi.linkentity (self); if (!self->reactdelay) self->reactdelay = 40; { edict_t *newent = NULL; vec3_t forward; newent = G_Spawn(); if (!newent) return; self->handle = newent; AngleVectors(self->s.angles, forward, NULL, NULL); VectorMA(self->s.origin, self->reactdelay, forward, newent->s.origin); newent->s.origin[2] -= 64; newent->s.effects |= EF_BLUEHYPERBLASTER; newent->s.modelindex = gi.modelindex("models/weapons/sshell_md2/tris.md2"); gi.linkentity (newent); newent->s.renderfx |= RF_BEAM; newent->s.renderfx2 |= RF2_NOSHADOW; } self->think = think_lighthouse_beam; self->nextthink = level.time + 2 * FRAMETIME; } /*QUAKED props2_boat (0 .5 .8) (-80 -160 -38) (80 160 38) A boat The bounding box can be rotated in angles of 90 deg and block properly model="models\props\boat\boat.mdx;models\props\boat\glass.mdx" */ void SP_props2_boat (edict_t *self) { int i; edict_t *newent = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -160, -80, -38); VectorSet (self->maxs, 160, 80, 38); } else { VectorSet (self->mins, -80, -160, -38); VectorSet (self->maxs, 80, 160, 38); } memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/boat/boat.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/boat/boat.mdx", &self->s.model_parts[0] ); newent = G_Spawn(); if (!newent) return; //self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_BBOX; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = self->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/boat/glass.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds( "models/props/boat/glass.mdx", &newent->s.model_parts[0] ); newent->s.renderfx2 |= RF2_NOSHADOW; newent->s.renderfx2 |= RF2_PASSALPHA; newent->s.effects = 64; newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent->surfacetype = SURF_METAL; gi.linkentity (newent); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props2_buoy (0 .5 .8) (-41 -41 -75) (41 41 75) A buoy model="models\props\buoy\buoy.mdx" */ void SP_props2_buoy (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -41, -41, -75); VectorSet (self->maxs, 41, 41, 75); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/buoy/buoy.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/buoy/buoy.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/buoy/light.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/buoy/light.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL; gi.linkentity (self); //AddLightSource(self); } /*QUAKED props2_buoy_side (1 0 0) (-81 -55 -64) (81 55 64) A buoy on it's side model="models\props\buoyside\buoy.mdx" */ void SP_props2_buoy_side (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -81, -55, -64); VectorSet (self->maxs, 81, 55, 64); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/buoyside/buoy.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/buoyside/buoy.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/buoyside/light.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/buoyside/light.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL; gi.linkentity (self); //AddLightSource(self); } /*QUAKED props2_buoy_animate (0 .5 .8) (-41 -41 -75) (41 41 75) An animated buoy model="models\props\buoya\buoy.mdx" */ void think_buoya (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 49) { self->s.frame++; } else { self->s.frame = 0; } } void SP_props2_buoy_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -41, -41, -75); VectorSet (self->maxs, 41, 41, 75); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/buoya/buoy.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/buoy/buoy.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/buoya/light.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/buoy/light.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL; gi.linkentity (self); self->think = think_buoya; self->nextthink = level.time + 2 * FRAMETIME; //AddLightSource(self); } /*QUAKED props2_gargoyle (0 .5 .8) (-47 -22 -50) (47 22 50) A gargoyle model="models\props\gargoyle\" */ void SP_props2_gargoyle (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/gargoyle/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -47, -22, -50); VectorSet (self->maxs, 47, 22, 50); self->surfacetype = SURF_METAL; self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); } #define DONOTMOVE 2 /*QUAKED props2_clothesline (0 .5 .8) (-4 -85 -25) (4 85 25) ? DONOTMOVE A clothes line model="models\props\clothes\" */ void think_clothesline (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 19) { self->s.frame++; } else { self->s.frame = 0; } } void SP_props2_clothesline (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/clothes/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -4, -85, -25); VectorSet (self->maxs, 4, 85, 25); self->surfacetype = SURF_FABRIC; gi.linkentity (self); if (!(self->spawnflags & DONOTMOVE)) { self->think = think_clothesline; self->nextthink = level.time + 2 * FRAMETIME; } } /*QUAKED props2_plant_XL (0 .5 .8) (-50 -46 -53) (50 46 53) A plant model="models\props\plants\plant_xl.md2" */ void SP_props2_plant_XL (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/plants/plant_xl.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -50, -46, -53); VectorSet (self->maxs, 50, 46, 53); if (!self->health) self->health = 25; self->die = metal_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_plant_SM (0 .5 .8) (-12 -9 -20) (12 9 20) A plant model="models\props\plants\plant_sm.md2" */ void SP_props2_plant_SM (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/plants/plant_sm.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -12, -9, -20); VectorSet (self->maxs, 12, 9, 20); if (!self->health) self->health = 25; self->die = metal_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_lunch (0 .5 .8) (-10 -7 -5) (10 7 5) A lunch model="models\props\lunch_set\tris.md2" */ void SP_props2_lunch (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/lunch_set/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -10, -7, -5); VectorSet (self->maxs, 10, 7, 5); self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props2_ashtray (0 .5 .8) (-12 -18 -4) (12 18 4) An ashtray model="models\props\ashtray_set\tris.md2" */ void SP_props2_ashtray (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/ashtray_set/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -12, -18, -4); VectorSet (self->maxs, 12, 18, 4); self->surfacetype = SURF_TILE; gi.linkentity (self); } /*QUAKED props2_boatphone (0 .5 .8) (-5 -9 -12) (5 9 12) A boat phone model="models\props\boatphone\tris.md2" */ void SP_props2_boatphone (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/boatphone/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -5, -9, -12); VectorSet (self->maxs, 5, 9, 12); self->surfacetype = SURF_METAL_L; gi.linkentity (self); } /*QUAKED props2_plant_bush (0 .5 .8) (-9 -11 -32) (9 11 32) A bush like plant model="models\props\bush\tris.md2" */ void SP_props2_plant_bush (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/bush/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -9, -11, -32); VectorSet (self->maxs, 9, 11, 32); if (!self->health) self->health = 25; self->die = metal_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props2_boat_animate (0 .5 .8) (-80 -160 -38) (80 160 38) An animated boat model="models\props\boata\boat.mdx" */ void think_boat_a (edict_t *self) { self->nextthink = level.time + FRAMETIME; if (self->s.frame < 49) { self->s.frame++; if (self->handle) self->handle->s.frame++; } else { self->s.frame = 0; if (self->handle) self->handle->s.frame = 0; } } void SP_props2_boat_animate (edict_t *self) { int i; edict_t *newent = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -80, -160, -38); VectorSet (self->maxs, 80, 160, 38); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/boata/boat.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/boata/boat.mdx", &self->s.model_parts[0]); newent = G_Spawn(); if (!newent) return; self->handle = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_BBOX; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = self->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/boata/window.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds( "models/props/boata/window.mdx", &newent->s.model_parts[0] ); newent->s.renderfx2 |= RF2_NOSHADOW; newent->s.renderfx2 |= RF2_PASSALPHA; newent->s.effects = 64; newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent->surfacetype = SURF_METAL; gi.linkentity (newent); self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL; gi.linkentity (self); self->think = think_boat_a; self->nextthink = level.time + 2 * FRAMETIME; } /*QUAKED props2_helicopter_animate (0 .5 .8) (-16 -16 -16) (16 16 16) A helicopter and actor that animate when trigered model="models\props\helicopter\helicopter.mdx;models\props\helicopter\rotor.mdx;models\props\helicopter\body.mdx;models\props\helicopter\foot.mdx;models\props\helicopter\legs.mdx;models\props\helicopter\head.mdx" */ void helicopter_a_final (edict_t *self) { if (self->s.frame < 223) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } void helicopter_a_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = helicopter_a_final; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_helicopter_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/helicopter/helicopter.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/helicopter/helicopter.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/helicopter/rotor.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/helicopter/rotor.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/helicopter/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/helicopter/legs.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/helicopter/body.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/helicopter/body.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/helicopter/foot.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/helicopter/foot.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/helicopter/head.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/helicopter/head.mdx", &self->s.model_parts[5]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = helicopter_a_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props2_car_animate (0 .5 .8) (-16 -16 -16) (16 16 16) A car and actors that animate when trigered model="models\props\cars\car.mdx;models\props\cars\legs_boss.mdx;models\props\cars\body_boss.mdx;models\props\cars\head_boss.mdx;models\props\cars\legs_chick.mdx;models\props\cars\body_chick.mdx;models\props\cars\head_chick.mdx" */ void car_a_final (edict_t *self) { if (self->s.frame < 85) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } // END JOSEPH void car_a_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = car_a_final; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_car_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/cars/car.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cars/car.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/cars/legs_boss.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cars/legs_boss.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/cars/body_boss.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cars/body_boss.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/cars/head_boss.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cars/head_boss.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/cars/legs_chick.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cars/legs_chick.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/cars/body_chick.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cars/body_chick.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/cars/head_chick.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cars/head_chick.mdx", &self->s.model_parts[6]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = car_a_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props2_car_topup (0 .5 .8) (-50 -102 -35) (50 102 35) A car with top up The bounding box can be rotated in angles of 90 deg and block properly model="models\props\car\car_up.md2" */ void SP_props2_car_topup (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/car/car_up.md2"; self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -102, -50, -35); VectorSet (self->maxs, 102, 50, 35); } else { VectorSet (self->mins, -50, -102, -35); VectorSet (self->maxs, 50, 102, 35); } self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props2_car_topdown (0 .5 .8) (-50 -102 -33) (50 102 33) A car with top down The bounding box can be rotated in angles of 90 deg and block properly model="models\props\car\car_td.md2" */ void SP_props2_car_topdown (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/car/car_td.md2"; self->s.modelindex = gi.modelindex (self->model); if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -102, -50, -33); VectorSet (self->maxs, 102, 50, 33); } else { VectorSet (self->mins, -50, -102, -33); VectorSet (self->maxs, 50, 102, 33); } self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props2_plant_fern (0 .5 .8) (-50 -46 -40) (50 46 40) A fern plant model="models\props\fern\tris.md2" */ void SP_props2_plant_fern (edict_t *self) { if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->model = "models/props/fern/tris.md2"; self->s.modelindex = gi.modelindex (self->model); VectorSet (self->mins, -50, -46, -40); VectorSet (self->maxs, 50, 46, 40); if (!self->health) self->health = 25; self->die = metal_die; self->takedamage = DAMAGE_YES; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } #define PINNUM1 2 #define PINNUM2 4 #define PINNUM3 8 /*QUAKED props2_pinball_machine (0 .5 .8) (-42 -18 -38) (42 18 38) ? PINNUM1 PINNUM2 PINNUM3 A pinball machine The bounding box can be rotated in angles of 90 deg and block properly model="models\props\pinball\pinball_m.mdx;models\props\pinball\glass.mdx;models\props\pinball\ball.mdx" */ void pinball_go (edict_t *self) { if (self->s.frame < 44) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->handle) { self->handle->s.frame++; } } else { self->s.frame = 0; if (self->handle) { self->handle->s.frame = 0; } } } void pinball_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = pinball_go; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_pinball_machine (edict_t *self) { int i; edict_t *newent = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; if ((self->s.angles[1] == 90) || self->s.angles[1] == 270) { VectorSet (self->mins, -18, -42, -38); VectorSet (self->maxs, 18, 42, 38); } else { VectorSet (self->mins, -42, -18, -38); VectorSet (self->maxs, 42, 18, 38); } memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; if (self->spawnflags & PINNUM3) { self->s.model_parts[0].modelindex = gi.modelindex("models/props/pin3/pinball_m.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/pin3/pinball_m.mdx", &self->s.model_parts[0] ); } else if (self->spawnflags & PINNUM2) { self->s.model_parts[0].modelindex = gi.modelindex("models/props/pin2/pinball_m.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/pin2/pinball_m.mdx", &self->s.model_parts[0] ); } else { self->s.model_parts[0].modelindex = gi.modelindex("models/props/pin1/pinball_m.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/pin1/pinball_m.mdx", &self->s.model_parts[0] ); } self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/pinball/ball.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/pinball/ball.mdx", &self->s.model_parts[1] ); newent = G_Spawn(); if (!newent) return; self->handle = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_BBOX; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = self->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/pinball/glass.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds( "models/props/pinball/glass.mdx", &newent->s.model_parts[0] ); newent->s.renderfx2 |= RF2_NOSHADOW; newent->s.renderfx2 |= RF2_PASSALPHA; newent->s.effects = 128; newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent->surfacetype = SURF_WOOD; gi.linkentity (newent); self->use = pinball_trigger; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_WOOD; gi.linkentity (self); } /*QUAKED props2_barrels_PV_A (0 .5 .8) (-90 -32 -48) (90 32 48) A set of barrels that you can trigger to fall model="models\props\pv_barl1\barrel_v4last.mdx;models\props\pv_barl1\barrel_v2.mdx;models\props\pv_barl1\barrel_v4.mdx;models\props\pv_barl1\top_barrel_v2.mdx;models\props\pv_barl1\top_barrel_v4.mdx" */ /*QUAKED props2_barrels_PV_B (0 .5 .8) (-17 -77 -49) (17 77 49) A set of barrels that you can trigger to fall model="models\props\pv_barl7\barrel_v2.mdx;models\props\pv_barl7\barrel_v4.mdx;models\props\pv_barl7\top_barrel_v2.mdx;models\props\pv_barl7\top_barrel_v4.mdx" */ /*QUAKED props2_barrels_PV_C (0 .5 .8) (-68 -50 -48) (68 50 48) A set of barrels that you can trigger to fall model="models\props\pv_barl3\barrel_v2.mdx;models\props\pv_barl3\barrel_v2.mdx;models\props\pv_barl3\barrel_v4.mdx;models\props\pv_barl3\top_barrel_v2.mdx;models\props\pv_barl3\top_barrel_v4.mdx" */ /*QUAKED props2_barrels_PV_D (0 .5 .8) (-20 -52 -48) (20 52 48) A set of barrels that you can trigger to fall model="models\props\pv_barl4\barrel_v2.mdx;models\props\pv_barl4\barrel_v4.mdx;models\props\pv_barl4\top_barrel_v2.mdx;models\props\pv_barl4\top_barrel_v4.mdx" */ /*QUAKED props2_barrels_PV_E (0 .5 .8) (-24 -64 -48) (24 64 48) A set of barrels that you can trigger to fall model="models\props\pv_barl5\barrel_v2.mdx;models\props\pv_barl5\barrel_v4.mdx;models\props\pv_barl5\top_barrel_v2.mdx;models\props\pv_barl5\top_barrel_v4.mdx" */ /*QUAKED props2_barrels_PV_F (0 .5 .8) (-20 -32 -24) (20 32 24) A set of barrels that you can trigger to fall model="models\props\pv_barl6\barrel_v2.mdx;models\props\pv_barl6\top_barrel_v2.mdx" */ void barrels_fallPV (edict_t *self) { if (self->s.frame < 37) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } else if (self->s.frame == 13) { if (self->classname) { if (!(strcmp(self->classname, "props2_barrels_PV_B"))) { self->s.model_parts[1].modelindex = 0; self->s.model_parts[3].modelindex = 0; } } } else if (self->s.frame == 16) { if (self->classname) { if (!(strcmp(self->classname, "props2_barrels_PV_A"))) { self->s.model_parts[1].modelindex = 0; self->s.model_parts[3].modelindex = 0; } } } else if (self->s.frame == 17) { if (self->classname) { if (!(strcmp(self->classname, "props2_barrels_PV_D"))) { self->s.model_parts[1].modelindex = 0; self->s.model_parts[3].modelindex = 0; } else if (!(strcmp(self->classname, "props2_barrels_PV_E"))) { self->s.model_parts[1].modelindex = 0; self->s.model_parts[3].modelindex = 0; } } } else if (self->s.frame == 37) { if (self->classname) { if (!(strcmp(self->classname, "props2_barrels_PV_F"))) { self->s.model_parts[0].modelindex = 0; self->s.model_parts[1].modelindex = 0; } } } } } void barrels_fallPV_BlackSheep (edict_t *self) { if (self->s.frame < 47) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } else if (self->s.frame == (93/4)) { if (self->classname) { if (!(strcmp(self->classname, "props2_barrels_PV_C"))) { self->s.model_parts[1].modelindex = 0; self->s.model_parts[3].modelindex = 0; } } } } } void barrelsfallPV_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = barrels_fallPV; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void barrelsfallPV_trigger_BlackSheep (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = barrels_fallPV_BlackSheep; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_barrels_PV_A (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -90, -32, -48); VectorSet (self->maxs, 90, 32, 48); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); //self->s.num_parts++; //self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl1/barrel_v4last.mdx"); //for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; //gi.GetObjectBounds("models/props/pv_barl1/barrel_v4last.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl1/top_barrel_v4.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl1/top_barrel_v4.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/pv_barl1/barrel_v2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl1/barrel_v2.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/pv_barl1/barrel_v4.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl1/barrel_v4.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/pv_barl1/top_barrel_v2.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl1/top_barrel_v2.mdx", &self->s.model_parts[3]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallPV_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props2_barrels_PV_B (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -17, -77, -49); VectorSet (self->maxs, 17, 77, 49); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); //self->s.num_parts++; //self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl1/barrel_v4last.mdx"); //for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; //gi.GetObjectBounds("models/props/pv_barl1/barrel_v4last.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl7/top_barrel_v4.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl7/top_barrel_v4.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/pv_barl7/barrel_v2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl7/barrel_v2.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/pv_barl7/barrel_v4.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl7/barrel_v4.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/pv_barl7/top_barrel_v2.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl7/top_barrel_v2.mdx", &self->s.model_parts[3]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallPV_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props2_barrels_PV_C (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -68, -50, -48); VectorSet (self->maxs, 68, 50, 48); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; //self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl3/barrel_v4last.mdx"); //for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; //gi.GetObjectBounds("models/props/pv_barl3/barrel_v4last.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl3/top_barrel_v4.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl3/top_barrel_v4.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/pv_barl3/barrel_v2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl3/barrel_v2.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/pv_barl3/barrel_v4.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl3/barrel_v4.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/pv_barl3/top_barrel_v2.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl3/top_barrel_v2.mdx", &self->s.model_parts[3]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallPV_trigger_BlackSheep; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props2_barrels_PV_D (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -20, -52, -48); VectorSet (self->maxs, 20, 52, 48); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl4/top_barrel_v4.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl4/top_barrel_v4.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/pv_barl4/barrel_v2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl4/barrel_v2.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/pv_barl4/barrel_v4.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl4/barrel_v4.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/pv_barl4/top_barrel_v2.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl4/top_barrel_v2.mdx", &self->s.model_parts[3]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallPV_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props2_barrels_PV_E (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -24, -64, -48); VectorSet (self->maxs, 24, 64, 48); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl5/top_barrel_v4.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl5/top_barrel_v4.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/pv_barl5/barrel_v2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl5/barrel_v2.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/pv_barl5/barrel_v4.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl5/barrel_v4.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/pv_barl5/top_barrel_v2.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl5/top_barrel_v2.mdx", &self->s.model_parts[3]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallPV_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props2_barrels_PV_F (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -20, -32, -24); VectorSet (self->maxs, 20, 32, 24); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/pv_barl6/barrel_v2.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl6/barrel_v2.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/pv_barl6/top_barrel_v2.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/pv_barl6/top_barrel_v2.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfallPV_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props2_air_train (0 .5 .8) (-65 -259 -129) (65 255 139) An an train that animates when trigger model="models\props\air_train\beam.mdx;models\props\air_train\frontfront.mdx;models\props\air_train\bottom.mdx;models\props\air_train\frontside.mdx;models\props\air_train\middle.mdx;models\props\air_train\middle2.mdx;models\props\air_train\propeler.mdx;models\props\air_train\top.mdx" */ /*QUAKED props2_air_train_test (0 .5 .8) (-66 -257 -135) (66 257 135) An an train that animates when trigger model="models\props\air_train\frontfront.mdx;models\props\air_train\bottom.mdx;models\props\air_train\frontside.mdx;models\props\air_train\middle.mdx;models\props\air_train\middle2.mdx;models\props\air_train\propeler.mdx;models\props\air_train\top.mdx;models\props\air_last\frontfront.mdx;models\props\air_last\bottom.mdx;models\props\air_last\frontside.mdx;models\props\air_last\middle.mdx;models\props\air_last\middle2.mdx;models\props\air_last\propeler.mdx;models\props\air_last\top.mdx" */ void air_train_go (edict_t *self) { if (self->s.frame < 153) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } void air_train_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = air_train_go; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props2_air_train (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -66, -257, -135); VectorSet (self->maxs, 66, 257, 135); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/air_train/frontfront.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/frontfront.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/air_train/bottom.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/bottom.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/air_train/frontside.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/frontside.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/air_train/middle.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/middle.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/air_train/middle2.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/middle2.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/air_train/propeler.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/propeler.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/air_train/top.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/top.mdx", &self->s.model_parts[6]); self->s.num_parts++; self->s.model_parts[7].modelindex = gi.modelindex("models/props/air_train/beam.mdx"); for (i=0; is.model_parts[7].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/air_train/beam.mdx", &self->s.model_parts[7]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = air_train_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_dead_louie (0 .5 .8) (-40 -48 -14) (40 48 14) An dead louie body you can shoot "health" - pre-gib hit points for the dead body (50 default) model="models\props\louie\body.mdx;models\props\louie\head.mdx;models\props\louie\legs.mdx" */ void SP_props3_dead_louie (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->svflags |= SVF_DEADMONSTER; VectorSet (self->mins, -40, -48, -14); VectorSet (self->maxs, 40, 48, 14); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/louie/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/louie/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/louie/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/louie/body.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/louie/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/louie/legs.mdx", &self->s.model_parts[2]); self->die = body_gib; self->takedamage = DAMAGE_YES; if (!self->health) self->health = 50; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; if (st.item) { self->item = FindItemByClassname (st.item); if (!self->item) gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item); } gi.linkentity (self); } /*QUAKED props3_cut_boss_player_animate (0 .5 .8) (-16 -16 -16) (16 16 16) A boss and player that animate when trigered model="models\props\player\bodyP.mdx;models\props\player\legsP.mdx;models\props\player\headP.mdx;models\props\boss\body_boss.mdx;models\props\boss\legs_boss.mdx;models\props\boss\head_boss.mdx" */ void cutbossplayer_final (edict_t *self) { if (self->s.frame < 137) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cutbossplayer_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cutbossplayer_final; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props3_cut_boss_player_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/boss/body_boss.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/boss/body_boss.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/boss/head_boss.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/boss/head_boss.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/boss/legs_boss.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/boss/legs_boss.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/player/bodyP.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/player/bodyP.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/player/headP.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/player/headP.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/player/legsP.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/player/legsP.mdx", &self->s.model_parts[5]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cutbossplayer_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_deco_fixture (0 .5 .8) (-32 -8 -58) (32 8 58) A deco fixture model="models\props\deco_fixture\deco_fixture.mdx" */ void SP_props3_deco_fixture (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -32, -8, -58); VectorSet (self->maxs, 32, 8, 58); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/deco_fixture/deco_fixture.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/deco_fixture/deco_fixture.mdx", &self->s.model_parts[0]); self->surfacetype = SURF_TILE; self->s.renderfx2 |= RF2_NOSHADOW; gi.linkentity (self); } /*QUAKED props3_cut_boss_chick_animate (0 .5 .8) (-16 -16 -16) (16 16 16) A boss and chick that animate on a balcony when trigered model="models\props\cutbc\body_chick.mdx;models\props\cutbc\legs_chick.mdx;models\props\cutbc\head_chick.mdx;models\props\cutbc\body.mdx;models\props\cutbc\legs.mdx;models\props\cutbc\head.mdx;models\props\cutbc\cigar.mdx" */ void cutbosschick_final (edict_t *self) { if (self->s.frame < 210) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cutbosschick_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cutbosschick_final; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props3_cut_boss_chick_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/cutbc/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cutbc/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/cutbc/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cutbc/head.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/cutbc/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cutbc/legs.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/cutbc/body_chick.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cutbc/body_chick.mdx", &self->s.model_parts[3]); self->s.num_parts++; self->s.model_parts[4].modelindex = gi.modelindex("models/props/cutbc/head_chick.mdx"); for (i=0; is.model_parts[4].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cutbc/head_chick.mdx", &self->s.model_parts[4]); self->s.num_parts++; self->s.model_parts[5].modelindex = gi.modelindex("models/props/cutbc/legs_chick.mdx"); for (i=0; is.model_parts[5].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cutbc/legs_chick.mdx", &self->s.model_parts[5]); self->s.num_parts++; self->s.model_parts[6].modelindex = gi.modelindex("models/props/cutbc/cigar.mdx"); for (i=0; is.model_parts[6].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cutbc/cigar.mdx", &self->s.model_parts[6]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cutbosschick_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_cut_train_run_animate (0 .5 .8) (-16 -16 -16) (16 16 16) A guy that likes to run to trains model="models\props\train_jump\bodyP.mdx;models\props\train_jump\legsP.mdx;models\props\train_jump\headP.mdx; */ void cuttrainrun_final (edict_t *self) { if (self->s.frame < 41) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cuttrainrun_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cuttrainrun_final; ent->nextthink = level.time + FRAMETIME; //gi.sound (ent, CHAN_AUTO, gi.soundindex ("world/brickfall.wav"), 1, ATTN_NORM, 0); } void SP_props3_cut_train_run_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/train_jump/bodyP.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/train_jump/bodyP.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/train_jump/headP.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/train_jump/headP.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/train_jump/legsP.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/train_jump/legsP.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cuttrainrun_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_cut_A_animate (0 .5 .8) (-16 -16 -16) (16 16 16) A guy sitting on a chair model="models\props\kpcut1\body.mdx;models\props\kpcut1\legs.mdx;models\props\kpcut1\head.mdx; */ /*QUAKED props3_cut_B_animate (0 .5 .8) (-16 -16 -16) (16 16 16) model="models\props\kpcut2\body.mdx;models\props\kpcut2\legs.mdx;models\props\kpcut2\head.mdx; */ /*QUAKED props3_cut_C_animate (0 .5 .8) (-16 -16 -16) (16 16 16) model="models\props\kpcut3\body.mdx;models\props\kpcut3\legs.mdx;models\props\kpcut3\head.mdx; */ /*QUAKED props3_cut_D_animate (0 .5 .8) (-16 -16 -16) (16 16 16) model="models\props\kpcut4\body.mdx;models\props\kpcut4\legs.mdx;models\props\kpcut4\head.mdx; */ void cutA_A_final (edict_t *self) { if (self->s.frame < 250) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cutB_A_final (edict_t *self) { if (self->s.frame < 514) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cutC_A_final (edict_t *self) { if (self->s.frame < 249) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cutD_A_final (edict_t *self) { if (self->s.frame < 365) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cutA_A_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cutA_A_final; ent->nextthink = level.time + FRAMETIME; } void cutB_A_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cutB_A_final; ent->nextthink = level.time + FRAMETIME; } void cutC_A_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cutC_A_final; ent->nextthink = level.time + FRAMETIME; } void cutD_A_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cutD_A_final; ent->nextthink = level.time + FRAMETIME; } void SP_props3_cut_A_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/kpcut1/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut1/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/kpcut1/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut1/head.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/kpcut1/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut1/legs.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cutA_A_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props3_cut_B_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/kpcut2/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut2/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/kpcut2/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut2/head.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/kpcut2/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut2/legs.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cutB_A_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props3_cut_C_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/kpcut3/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut3/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/kpcut3/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut3/head.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/kpcut3/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut3/legs.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cutC_A_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } void SP_props3_cut_D_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/kpcut4/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut4/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/kpcut4/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut4/head.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/kpcut4/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut4/legs.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cutD_A_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_cash_counter_animate (0 .5 .8) (-12 -14 -8) (12 18 7) A cash counter machine that animates when triggered model="models\props\bill_counter\cashstack.mdx;models\props\bill_counter\numbers.mdx;models\props\bill_counter\machine.mdx; */ void cashcounter_final (edict_t *self) { if (self->s.frame < 39) { self->nextthink = level.time + 0.1; self->s.frame++; } } void cashcounter_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cashcounter_final; ent->nextthink = level.time + FRAMETIME; ent->s.frame = 0; } void SP_props3_cash_counter_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -14, -12, -8); VectorSet (self->maxs, 18, 12, 7); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/bill_counter/cashstack.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/bill_counter/cashstack.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/bill_counter/machine.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/bill_counter/machine.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/bill_counter/numbers.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/bill_counter/numbers.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cashcounter_trigger; gi.linkentity (self); } /*QUAKED props3_decanter (0 .5 .8) (-3 -5 -6) (3 5 6) A decanter model="models\props\decanter\solid.mdx;models\props\decanter\glass.mdx" */ void SP_props3_decanter (edict_t *self) { int i; edict_t *newent = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; VectorSet (self->mins, -3, -5, -6); VectorSet (self->maxs, 3, 5, 6); memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/decanter/solid.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/decanter/solid.mdx", &self->s.model_parts[0] ); newent = G_Spawn(); if (!newent) return; //self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_NOT; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = self->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/decanter/glass.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds( "models/props/decanter/glass.mdx", &newent->s.model_parts[0] ); newent->s.renderfx2 |= RF2_NOSHADOW; newent->s.renderfx2 |= RF2_PASSALPHA; newent->s.effects = 100; newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent->surfacetype = SURF_METAL; gi.linkentity (newent); //self->s.renderfx2 |= RF2_PASSALPHA; //self->s.effects = 32; self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props3_whiskey_glass (0 .5 .8) (-2 -2 -2) (2 2 2) A decanter model="models\props\whiskeyglass\solid.mdx;models\props\whiskeyglass\glass.mdx" */ void SP_props3_whiskey_glass (edict_t *self) { int i; edict_t *newent = NULL; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; self->s.skinnum = self->skin; VectorSet (self->mins, -2, -2, -2); VectorSet (self->maxs, 2, 2, 2); memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/whiskeyglass/solid.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds( "models/props/whiskeyglass/solid.mdx", &self->s.model_parts[0] ); newent = G_Spawn(); if (!newent) return; //self->handle2 = newent; VectorCopy(self->s.origin, newent->s.origin); VectorCopy(self->s.angles, newent->s.angles); newent->solid = SOLID_NOT; newent->movetype = MOVETYPE_NONE; newent->svflags |= SVF_PROP; newent->s.skinnum = self->skin; memset(&(newent->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); newent->s.num_parts++; newent->s.model_parts[0].modelindex = gi.modelindex("models/props/whiskeyglass/glass.mdx"); for (i=0; is.model_parts[0].skinnum[i] = newent->s.skinnum; gi.GetObjectBounds( "models/props/whiskeyglass/glass.mdx", &newent->s.model_parts[0] ); newent->s.renderfx2 |= RF2_NOSHADOW; newent->s.renderfx2 |= RF2_PASSALPHA; newent->s.effects = 128; newent->s.renderfx2 |= RF2_DIR_LIGHTS; newent->surfacetype = SURF_METAL; gi.linkentity (newent); //self->s.renderfx2 |= RF2_PASSALPHA; //self->s.effects = 32; self->s.renderfx2 |= RF2_NOSHADOW; self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_METAL; gi.linkentity (self); } /*QUAKED props3_barrels_fall_nikki_A (0 .5 .8) (-44 -60 -49) (44 60 49) A set of barrels that you can trigger to fall model="models\props\nikki1\barrel_v4.mdx;models\props\nikki1\top_barrel_v4.mdx" */ void barrels_fall_nikki_A (edict_t *self) { if (self->s.frame < 85) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } void barrelsfall_nikkiA_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = barrels_fall_nikki_A; ent->nextthink = level.time + FRAMETIME; } void SP_props3_barrels_fall_nikki_A (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -44, -60, -49); VectorSet (self->maxs, 44, 60, 49); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/nikki1/barrel_v4.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/nikki1/barrel_v4.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/nikki1/top_barrel_v4.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/nikki1/top_barrel_v4.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfall_nikkiA_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_barrels_fall_nikki_B (0 .5 .8) (-24 -48 -24) (24 48 24) A set of barrels that you can trigger to fall model="models\props\nikki2\barrel_v4.mdx;models\props\nikki2\top_barrel_v4.mdx" */ void barrels_fall_nikki_B (edict_t *self) { if (self->s.frame < 90) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } } void barrelsfall_nikkiB_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = barrels_fall_nikki_B; ent->nextthink = level.time + FRAMETIME; } void SP_props3_barrels_fall_nikki_B (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -24, -48, -24); VectorSet (self->maxs, 24, 48, 24); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/nikki2/barrel_v4.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/nikki2/barrel_v4.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/nikki2/top_barrel_v4.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/nikki2/top_barrel_v4.mdx", &self->s.model_parts[1]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = barrelsfall_nikkiB_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_cut_run_to_car_animate (0 .5 .8) (-16 -16 -16) (16 16 16) An actor running to a car model="models\props\run_to_car\body_boss.mdx;models\props\run_to_car\legs_boss.mdx;models\props\run_to_car\head_boss.mdx" */ void cut_carrun_final (edict_t *self) { if (self->s.frame < 44) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cut_carrun_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cut_carrun_final; ent->nextthink = level.time + FRAMETIME; } void SP_props3_cut_run_to_car_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/run_to_car/body_boss.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/run_to_car/body_boss.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/run_to_car/head_boss.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/run_to_car/head_boss.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/run_to_car/legs_boss.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/run_to_car/legs_boss.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cut_carrun_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_cut_final_animate (0 .5 .8) (-16 -16 -16) (16 16 16) The final cut scene model="models\props\finale\body_bossf.mdx;models\props\finale\legs_bossf.mdx;models\props\finale\head_bossf.mdx;models\props\finale\cigarf.mdx" */ void cut_final_final (edict_t *self) { if (self->s.frame < 245) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cut_final_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cut_final_final; ent->nextthink = level.time + FRAMETIME; } void SP_props3_cut_final_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/finale/body_bossf.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/finale/body_bossf.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/finale/head_bossf.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/finale/head_bossf.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/finale/legs_bossf.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/finale/legs_bossf.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/finale/cigarf.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/finale/cigarf.mdx", &self->s.model_parts[3]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cut_final_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_cash (0 .5 .8) (-12 -11 -5) (12 11 5) Some cash model="models\props\cash\cashstack.mdx" */ void SP_props3_cash (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_BBOX; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -12, -11, -5); VectorSet (self->maxs, 12, 11, 5); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/props/cash/cashstack.mdx"); for (i=0; is.model_parts[PART_HEAD].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/cash/cashstack.mdx", &self->s.model_parts[PART_HEAD]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->surfacetype = SURF_FABRIC; gi.linkentity (self); } /*QUAKED props3_cut_truck_driver (0 .5 .8) (-67 -16 -58) (0 17 8) The driver driving a truck model="models\props\driver\body_driver.mdx;models\props\driver\legs_driver.mdx;models\props\driver\head_driver.mdx;models\props\driver\wheel.mdx" */ void cut_truckdriver_final (edict_t *self) { if (self->s.frame < 20) { self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { self->s.frame = 0; } self->nextthink = level.time + 0.1; } void cut_truckdriver_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cut_truckdriver_final; ent->nextthink = level.time + FRAMETIME; } void SP_props3_cut_truck_driver (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -67, -16, -58); VectorSet (self->maxs, 0, 17, 8); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/driver/body_driver.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/driver/body_driver.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/driver/head_driver.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/driver/head_driver.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/driver/legs_driver.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/driver/legs_driver.mdx", &self->s.model_parts[2]); self->s.num_parts++; self->s.model_parts[3].modelindex = gi.modelindex("models/props/driver/wheel.mdx"); for (i=0; is.model_parts[3].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/driver/wheel.mdx", &self->s.model_parts[3]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cut_truckdriver_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); } /*QUAKED props3_cut_pinball_guy_animate (0 .5 .8) (-16 -16 -16) (16 16 16) A cut scene of a guy and his pinball machine model="models\props\kpcut4_pinball\body.mdx;models\props\kpcut4_pinball\legs.mdx;models\props\kpcut4_pinball\head.mdx" */ void cut_pinballguy_final (edict_t *self) { if (self->s.frame < 365) { self->nextthink = level.time + 0.1; self->s.frame++; if (self->s.frame == 1) { self->svflags &= ~SVF_NOCLIENT; } } else { G_FreeEdict (self); } } void cut_pinballguy_trigger (edict_t *ent, edict_t *other, edict_t *activator) { ent->think = cut_pinballguy_final; ent->nextthink = level.time + FRAMETIME; } void SP_props3_cut_pinball_guy_animate (edict_t *self) { int i; if (deathmatch->value) { // auto-remove for deathmatch G_FreeEdict (self); return; } self->solid = SOLID_NOT; self->movetype = MOVETYPE_NONE; self->svflags |= SVF_PROP; VectorSet (self->mins, -16, -16, -16); VectorSet (self->maxs, 16, 16, 16); self->s.skinnum = self->skin; memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS); self->s.num_parts++; self->s.model_parts[0].modelindex = gi.modelindex("models/props/kpcut4_pinball/body.mdx"); for (i=0; is.model_parts[0].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut4_pinball/body.mdx", &self->s.model_parts[0]); self->s.num_parts++; self->s.model_parts[1].modelindex = gi.modelindex("models/props/kpcut4_pinball/head.mdx"); for (i=0; is.model_parts[1].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut4_pinball/head.mdx", &self->s.model_parts[1]); self->s.num_parts++; self->s.model_parts[2].modelindex = gi.modelindex("models/props/kpcut4_pinball/legs.mdx"); for (i=0; is.model_parts[2].skinnum[i] = self->s.skinnum; gi.GetObjectBounds("models/props/kpcut4_pinball/legs.mdx", &self->s.model_parts[2]); self->s.renderfx2 |= RF2_DIR_LIGHTS; self->s.renderfx2 |= RF2_NOSHADOW; self->use = cut_pinballguy_trigger; self->svflags |= SVF_NOCLIENT; gi.linkentity (self); }