game-source/klik/bodyque.qc
Bill Currie 88c055ea3c <zinx> taniwha: FWIW, the code is officially donated to quakeforge :)
<taniwha> zinx: thanks :)

zinx' klik mod :)
2003-10-24 21:43:32 +00:00

135 lines
3 KiB
C++

#include "common.qh"
#include "damage.qh"
#include "effect.qh"
#include "mdl.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 = i + 1) {
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;
};