thirtyflightsofloving/missionpack/z_trigger.c
2020-09-04 03:39:59 -04:00

110 lines
2.4 KiB
C

#include "g_local.h"
/*
======================================================================
trigger_laser
======================================================================
*/
/*QUAKED trigger_laser (1 0 0) (-16 -16 -16) (16 16 16) TRIGGER_MULTIPLE
Laser-type trigger
"wait" "x" where x is the delay before reactivation
"target" target to trigger
"message" message to center print
"delay" delay before trigger
*/
#define TRIGGER_MULTIPLE 1
void trigger_laser_on (edict_t *self);
void trigger_laser_think (edict_t *self)
{
vec3_t start;
vec3_t end;
trace_t tr;
int count = 8;
self->nextthink = level.time + FRAMETIME;
VectorCopy (self->s.origin, start);
VectorMA (start, 2048, self->movedir, end);
tr = gi.trace (start, NULL, NULL, end, self, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER);
if (!tr.ent)
return;
// if we hit something that's not a monster or player
if (!(tr.ent->svflags & SVF_MONSTER) && (!tr.ent->client))
{
if (self->spawnflags & 0x80000000)
{
self->spawnflags &= ~0x80000000;
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_LASER_SPARKS);
gi.WriteByte (count);
gi.WritePosition (tr.endpos);
gi.WriteDir (tr.plane.normal);
gi.WriteByte (self->s.skinnum);
gi.multicast (tr.endpos, MULTICAST_PVS);
}
}
else
{
// trigger
G_UseTargets (self, tr.ent);
if (self->spawnflags & TRIGGER_MULTIPLE)
{
// hide for a time
self->svflags |= SVF_NOCLIENT;
self->nextthink = level.time + self->wait;
self->think = trigger_laser_on;
}
else
{
// remove self
G_FreeEdict(self);
}
}
VectorCopy (tr.endpos, self->s.old_origin);
}
void trigger_laser_on (edict_t *self)
{
self->svflags &= ~SVF_NOCLIENT;
self->think = trigger_laser_think;
trigger_laser_think(self);
}
void SP_trigger_laser (edict_t *self)
{
// if no target
if (!self->target)
{
gi.dprintf("trigger_laser without target\n");
G_FreeEdict(self);
return;
}
self->class_id = ENTITY_TRIGGER_LASER;
// if no wait, set default
if (!self->wait)
{
self->wait = 4;
}
G_SetMovedir (self->s.angles, self->movedir);
self->s.skinnum = 0xf2f2f0f0; // colour
self->s.frame = 2; // diameter
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_NOT;
self->s.renderfx |= RF_BEAM|RF_TRANSLUCENT;
self->s.modelindex = 1;
self->spawnflags |= 0x80000000;
self->think = trigger_laser_on;
self->nextthink = level.time + 0.1;
self->svflags |= SVF_NOCLIENT;
gi.linkentity (self);
}