quake2-rerelease-dll/rerelease/xatrix/g_xatrix_target.cpp
2023-08-07 14:48:30 -05:00

99 lines
2.5 KiB
C++

// Copyright (c) ZeniMax Media Inc.
// Licensed under the GNU General Public License 2.0.
#include "../g_local.h"
/*QUAKED target_mal_laser (1 0 0) (-4 -4 -4) (4 4 4) START_ON RED GREEN BLUE YELLOW ORANGE FAT
Mal's laser
*/
void target_mal_laser_on(edict_t *self)
{
if (!self->activator)
self->activator = self;
self->spawnflags |= SPAWNFLAG_LASER_ZAP | SPAWNFLAG_LASER_ON;
self->svflags &= ~SVF_NOCLIENT;
self->flags |= FL_TRAP;
// target_laser_think (self);
self->nextthink = level.time + gtime_t::from_sec(self->wait + self->delay);
}
USE(target_mal_laser_use) (edict_t *self, edict_t *other, edict_t *activator) -> void
{
self->activator = activator;
if (self->spawnflags.has(SPAWNFLAG_LASER_ON))
target_laser_off(self);
else
target_mal_laser_on(self);
}
void mal_laser_think(edict_t *self);
THINK(mal_laser_think2) (edict_t *self) -> void
{
self->svflags |= SVF_NOCLIENT;
self->think = mal_laser_think;
self->nextthink = level.time + gtime_t::from_sec(self->wait);
self->spawnflags |= SPAWNFLAG_LASER_ZAP;
}
THINK(mal_laser_think) (edict_t *self) -> void
{
self->svflags &= ~SVF_NOCLIENT;
target_laser_think(self);
self->think = mal_laser_think2;
self->nextthink = level.time + 100_ms;
}
void SP_target_mal_laser(edict_t *self)
{
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_NOT;
self->s.renderfx |= RF_BEAM;
self->s.modelindex = MODELINDEX_WORLD; // must be non-zero
self->flags |= FL_TRAP_LASER_FIELD;
// set the beam diameter
if (self->spawnflags.has(SPAWNFLAG_LASER_FAT))
self->s.frame = 16;
else
self->s.frame = 4;
// set the color
if (self->spawnflags.has(SPAWNFLAG_LASER_RED))
self->s.skinnum = 0xf2f2f0f0;
else if (self->spawnflags.has(SPAWNFLAG_LASER_GREEN))
self->s.skinnum = 0xd0d1d2d3;
else if (self->spawnflags.has(SPAWNFLAG_LASER_BLUE))
self->s.skinnum = 0xf3f3f1f1;
else if (self->spawnflags.has(SPAWNFLAG_LASER_YELLOW))
self->s.skinnum = 0xdcdddedf;
else if (self->spawnflags.has(SPAWNFLAG_LASER_ORANGE))
self->s.skinnum = 0xe0e1e2e3;
G_SetMovedir(self->s.angles, self->movedir);
if (!self->delay)
self->delay = 0.1f;
if (!self->wait)
self->wait = 0.1f;
if (!self->dmg)
self->dmg = 5;
self->mins = { -8, -8, -8 };
self->maxs = { 8, 8, 8 };
self->nextthink = level.time + gtime_t::from_sec(self->delay);
self->think = mal_laser_think;
self->use = target_mal_laser_use;
gi.linkentity(self);
if (self->spawnflags.has(SPAWNFLAG_LASER_ON))
target_mal_laser_on(self);
else
target_laser_off(self);
}
// END 15-APR-98