game-source/klik/mapents/mapents_util.qc
2004-01-31 08:24:03 +00:00

185 lines
3.7 KiB
C++

#include "common.qh"
#include "misc.qh"
#include "server.qh"
#include "mapents_util.qh"
.void() th_activate;
void() util_map_entity_init = {
self.deadflag = DEAD_NONLIVING;
if (self.noise && sv_spawning) {
if (!self.volume) self.volume = 0.5;
if (!self.attenuation) self.attenuation = ATTN_STATIC;
precache_sound(self.noise);
ambientsound(center(self), self.noise, self.volume, self.attenuation);
} else {
if (!self.volume) self.volume = 1.0;
if (!self.attenuation) self.attenuation = ATTN_NORM;
}
if (sv_spawning) {
if (self.noise1) precache_sound(self.noise1);
if (self.noise2) precache_sound(self.noise2);
if (self.noise5) precache_sound(self.noise5);
if (self.noise6) precache_sound(self.noise6);
}
if (self.mangle)
self.angles = self.mangle;
if (self.model) {
if (sv_spawning)
precache_model(self.model);
setmodel(self, self.model);
}
setsize(self, self.mins, self.maxs);
setorigin(self, self.origin); // Links BSP models
};
void() util_map_entity_cull = {
if (self.solid || self.takedamage)
return;
if (self.nextthink > time)
return;
if (!sv_spawning) {
if (self.targetname) {
if (find(world, target, self.targetname))
return;
}
if (self.target) {
local entity oldself;
oldself = self;
self = world;
while ((self = find(self, targetname, self.target))) {
if (self == oldself)
continue;
util_map_entity_cull();
}
self = oldself;
}
} else {
if (self.targetname || self.target) {
self.think = util_map_entity_cull;
self.nextthink = time + sv_mintic;
return;
}
}
if (self.model) safe_makestatic(self);
else safe_remove(self);
};
void() util_map_entity_drop = {
self.origin = self.origin + '0 0 2';
if (!droptofloor()) {
dprint(self.classname, " fell out of level from ", vtos(self.origin), "\n");
remove(self);
return;
}
};
float() util_check_targets = {
/*
if (self.spawnflags & (SPAWNFLAGS_CHECK_ITEMS|SPAWNFLAGS_TAKE_ITEMS)) {
}
*/
return TRUE;
};
float() util_use_targets = {
if (!util_check_targets())
return FALSE;
if (self.noise1)
sound(self, CHAN_VOICE, self.noise1, self.volume, self.attenuation);
if (self.noise2)
sound(other, CHAN_ITEM, self.noise2, self.volume, self.attenuation);
if (self.message && is_cl(other))
centerprint(other, self.message);
if (self.th_activate)
self.th_activate();
if (self.target)
foreach_field(targetname, self.target, use);
if (self.killtarget)
foreach(targetname, self.killtarget, safe_remove);
if (self.count > 0) {
self.count--;
if (!self.count) {
self.targetname = NIL;
self.target = NIL;
self.killtarget = NIL;
self.use = NOTHING_function;
self.touch = NOTHING_function;
util_map_entity_cull();
}
}
return TRUE;
};
float(entity e) is_living = {
return (e.deadflag == DEAD_NO) && is_solid(e);
};
float(entity e) is_solid = {
return (e.solid != SOLID_NOT && e.solid != SOLID_TRIGGER);
};
float(entity e) is_teleportable = {
return e.movetype != MOVETYPE_NONE &&
e.movetype != MOVETYPE_PUSH &&
e.movetype != MOVETYPE_NOCLIP &&
(e.solid == SOLID_BBOX || e.solid == SOLID_SLIDEBOX);
};
void() util_set_movedir = {
if (self.mangle != '0 0 0')
self.angles = self.mangle;
if (self.angles == '0 -1 0')
self.movedir = '0 0 1';
else if (self.angles == '0 -2 0')
self.movedir = '0 0 -1';
else {
makevectors(self.angles);
self.movedir = v_forward;
}
self.angles = '0 0 0';
};
float(entity ent1, entity ent2) util_entities_touch = {
if (ent1.mins_x > ent2.maxs_x)
return FALSE;
if (ent1.mins_y > ent2.maxs_y)
return FALSE;
if (ent1.mins_z > ent2.maxs_z)
return FALSE;
if (ent2.mins_x > ent1.maxs_x)
return FALSE;
if (ent2.mins_y > ent1.maxs_y)
return FALSE;
if (ent2.mins_z > ent1.maxs_z)
return FALSE;
return TRUE;
};