game-source/klik/bodyque.qc

150 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;
};