mirror of
https://git.code.sf.net/p/quake/game-source
synced 2024-11-22 20:11:49 +00:00
185 lines
3.7 KiB
C++
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;
|
|
};
|