Add a cvar g_commanderbody_nogod to make the com. body destructable.

The commanders body entity is special, because it's spawned in god mode.
That's no problem in the baseq2 and addons campaigns. But it may break
some custom maps and prevents some hacks, one example is putting the
entity inside an killbox.

Submitted by Евгений T.
This commit is contained in:
Yamagi 2021-03-30 11:11:56 +02:00
parent 635f6ffb16
commit ee945625d3
7 changed files with 55 additions and 1 deletions

View file

@ -138,6 +138,10 @@ it's `+set busywait 0` (setting the `busywait` cvar) and `-portable`
disable it again before playing Ground Zero maps in co-op. By
default this cvar is disabled (set to 0).
* **g_commanderbody_nogod**: If set to `1` the tank commanders body
entity can be destroyed. If the to `0` (the default) it is
indestructible.
* **g_footsteps**: If set to `1` (the default) footstep sounds are
generated when the player faster than 255. This is the behaviour of
Vanilla Quake II. If set to `2` footestep sound always generated. If

View file

@ -56,6 +56,7 @@ cvar_t *g_select_empty;
cvar_t *dedicated;
cvar_t *g_footsteps;
cvar_t *g_fix_triggered;
cvar_t *g_commanderbody_nogod;
cvar_t *filterban;

View file

@ -1610,6 +1610,40 @@ commander_body_drop(edict_t *self)
self->s.origin[2] += 2;
}
void
commander_body_die(edict_t *self, edict_t *inflictor /* unused */,
edict_t *attacker /* unused */, int damage, vec3_t point /* unused */)
{
int n;
if (!self)
{
return;
}
/* check for gib */
if (self->health <= self->gib_health)
{
gi.sound(self, CHAN_BODY, gi.soundindex("tank/pain.wav"), 1, ATTN_NORM, 0);
for (n = 0; n < 1; n++)
{
ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
}
for (n = 0; n < 4; n++)
{
ThrowGib(self, "models/objects/gibs/sm_metal/tris.md2", damage, GIB_METALLIC);
}
ThrowGib(self, "models/objects/gibs/chest/tris.md2", damage, GIB_ORGANIC);
ThrowHead(self, "models/objects/gibs/gear/tris.md2", damage, GIB_METALLIC);
self->deadflag = DEAD_DEAD;
return;
}
}
void
SP_monster_commander_body(edict_t *self)
{
@ -1626,8 +1660,19 @@ SP_monster_commander_body(edict_t *self)
VectorSet(self->maxs, 32, 32, 48);
self->use = commander_body_use;
self->takedamage = DAMAGE_YES;
self->flags = FL_GODMODE;
self->s.renderfx |= RF_FRAMELERP;
if (g_commanderbody_nogod->value)
{
self->deadflag = DEAD_DEAD;
self->svflags |= SVF_MONSTER | SVF_DEADMONSTER;
self->die = commander_body_die;
}
else
{
self->flags = FL_GODMODE;
}
gi.linkentity(self);
gi.soundindex("tank/thud.wav");

View file

@ -521,6 +521,7 @@ extern cvar_t *g_select_empty;
extern cvar_t *dedicated;
extern cvar_t *g_footsteps;
extern cvar_t *g_fix_triggered;
extern cvar_t *g_commanderbody_nogod;
extern cvar_t *filterban;

View file

@ -238,6 +238,7 @@ InitGame(void)
maxentities = gi.cvar("maxentities", "1024", CVAR_LATCH);
g_footsteps = gi.cvar("g_footsteps", "1", CVAR_ARCHIVE);
g_fix_triggered = gi.cvar ("g_fix_triggered", "0", 0);
g_commanderbody_nogod = gi.cvar("g_commanderbody_nogod", "0", CVAR_ARCHIVE);
/* change anytime vars */
dmflags = gi.cvar("dmflags", "0", CVAR_SERVERINFO);

View file

@ -812,6 +812,7 @@ extern void misc_deadsoldier_die ( edict_t * self , edict_t * inflictor , edict_
extern void SP_misc_banner ( edict_t * ent ) ;
extern void misc_banner_think ( edict_t * ent ) ;
extern void SP_monster_commander_body ( edict_t * self ) ;
extern void commander_body_die ( edict_t * self , edict_t * inflictor , edict_t * attacker , int damage , vec3_t point ) ;
extern void commander_body_drop ( edict_t * self ) ;
extern void commander_body_use ( edict_t * self , edict_t * other , edict_t * activator ) ;
extern void commander_body_think ( edict_t * self ) ;

View file

@ -812,6 +812,7 @@
{"SP_misc_banner", (byte *)SP_misc_banner},
{"misc_banner_think", (byte *)misc_banner_think},
{"SP_monster_commander_body", (byte *)SP_monster_commander_body},
{"commander_body_die", (byte *)commander_body_die},
{"commander_body_drop", (byte *)commander_body_drop},
{"commander_body_use", (byte *)commander_body_use},
{"commander_body_think", (byte *)commander_body_think},