game-source/klik/mapents/mapents_util.qc

196 lines
3.8 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;
setsize (self, self.mins, self.maxs);
setorigin (self, self.origin); // Links BSP models
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);
}
};
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;
};