mirror of
https://git.code.sf.net/p/quake/game-source
synced 2024-11-25 05:11:58 +00:00
149 lines
3.1 KiB
C++
149 lines
3.1 KiB
C++
#include "common.qh"
|
|
|
|
#include "damage.qh"
|
|
#include "effect.qh"
|
|
#include "mdl.qh"
|
|
|
|
#include "misc.qh"
|
|
|
|
#include "bodyque.qh"
|
|
|
|
float _bodyque_current;
|
|
entity bodyque_head;
|
|
|
|
void ()
|
|
bodyque_init =
|
|
{
|
|
local float i;
|
|
local entity e;
|
|
|
|
e = bodyque_head = spawn ("BODYQUE");
|
|
bodyque_head.owner = bodyque_head;
|
|
for (i = 1; i < CONFIG_BODYQUE_MAX; i++) {
|
|
bodyque_head.owner = spawn ("BODYQUE");
|
|
bodyque_head.owner.chain = bodyque_head;
|
|
bodyque_head = bodyque_head.owner;
|
|
}
|
|
e.chain = bodyque_head;
|
|
bodyque_head.owner = e;
|
|
|
|
precache_sound ("zombie/z_miss.wav");
|
|
|
|
precache_sound ("player/gib.wav");
|
|
precache_sound ("player/udeath.wav");
|
|
};
|
|
|
|
void ()
|
|
_bodyque_fade_think =
|
|
{
|
|
local vector org;
|
|
|
|
if (self.mdl_think) {
|
|
if (!self.mdl_thought)
|
|
self.mdl_think ();
|
|
self.mdl_thought = FALSE;
|
|
}
|
|
|
|
org = self.origin;
|
|
org_z = org_z + self.maxs_z;
|
|
if (pointcontents (org) == CONTENT_SOLID) {
|
|
_bodyque_current = _bodyque_current - 1;
|
|
remove (self);
|
|
return;
|
|
}
|
|
|
|
self.nextthink = time + 0.1;
|
|
};
|
|
|
|
void ()
|
|
_bodyque_fade_from_reality =
|
|
{
|
|
local entity new_bodyque;
|
|
|
|
if (_bodyque_current >= CONFIG_BODYQUE_FADE_MAX)
|
|
return;
|
|
|
|
new_bodyque = spawn("BODYQUE");
|
|
|
|
// Link the new entity in, let the old one fade
|
|
if (bodyque_head.owner != bodyque_head) {
|
|
new_bodyque.owner = bodyque_head.owner;
|
|
new_bodyque.chain = bodyque_head.chain;
|
|
|
|
new_bodyque.owner.chain = new_bodyque;
|
|
new_bodyque.chain.owner = new_bodyque;
|
|
} else {
|
|
// This happens if CONFIG_BODYQUE_MAX == 1
|
|
new_bodyque.owner = new_bodyque;
|
|
new_bodyque.chain = new_bodyque;
|
|
}
|
|
|
|
bodyque_head.movetype = MOVETYPE_NOCLIP;
|
|
bodyque_head.think = _bodyque_fade_think;
|
|
bodyque_head.nextthink = time + 0.1;
|
|
bodyque_head.velocity = '0 0 -10';
|
|
|
|
bodyque_head = new_bodyque;
|
|
|
|
_bodyque_current = _bodyque_current + 1;
|
|
};
|
|
|
|
void ()
|
|
_bodyque_think =
|
|
{
|
|
if (self.mdl_think) {
|
|
if (!self.mdl_thought)
|
|
self.mdl_think ();
|
|
self.mdl_thought = FALSE;
|
|
}
|
|
|
|
self.nextthink = time + 0.1;
|
|
};
|
|
|
|
entity (entity body)
|
|
bodyque_que =
|
|
{
|
|
local entity ret;
|
|
|
|
if (bodyque_head.count)
|
|
_bodyque_fade_from_reality ();
|
|
|
|
ret = bodyque_head;
|
|
|
|
bodyque_head.deadflag = DEAD_DEAD;
|
|
|
|
bodyque_head.count = TRUE;
|
|
bodyque_head.model = body.model;
|
|
bodyque_head.modelindex = body.modelindex;
|
|
bodyque_head.mins = body.mins;
|
|
bodyque_head.maxs = body.maxs;
|
|
bodyque_head.size = body.size;
|
|
bodyque_head.angles = body.angles;
|
|
bodyque_head.frame = body.frame;
|
|
bodyque_head.colormap = body.colormap;
|
|
bodyque_head.movetype = body.movetype;
|
|
bodyque_head.velocity = body.velocity;
|
|
bodyque_head.avelocity = body.avelocity;
|
|
bodyque_head.health = body.health;
|
|
bodyque_head.mass = body.mass;
|
|
|
|
bodyque_head.solid = SOLID_NOT;
|
|
bodyque_head.movetype = MOVETYPE_BOUNCE;
|
|
|
|
bodyque_head.takedamage = DAMAGE_NO;
|
|
|
|
bodyque_head.mdl_func = body.mdl_func;
|
|
bodyque_head.mdl_mod = body.mdl_mod;
|
|
bodyque_head.mdl_think = body.mdl_think;
|
|
bodyque_head.mdl_thought = body.mdl_thought;
|
|
|
|
setorigin(bodyque_head, body.origin);
|
|
setsize(bodyque_head, body.mins, body.maxs);
|
|
|
|
bodyque_head.think = _bodyque_think;
|
|
bodyque_head.nextthink = time + 0.1;
|
|
|
|
bodyque_head = bodyque_head.owner;
|
|
|
|
return ret;
|
|
};
|