quakec/source/server/entities/power_switch.qc

208 lines
5.1 KiB
C++

/*
server/entities/power_switch.qc
Power Switch Entity Logic
Copyright (C) 2021-2024 NZ:P Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to:
Free Software Foundation, Inc.
59 Temple Place - Suite 330
Boston, MA 02111-1307, USA
*/
#define POWER_SPAWNFLAG_NOHANDLE 1
void(entity who) Turn_PerkLight_On;
//
// Power_ActivateLights()
// Activates Perk Light Effects and LightStyles
//
void() Power_ActivateLights =
{
// Perk Lights
entity tempe = findfloat(world, requirespower, 1);
while (tempe)
{
Turn_PerkLight_On(tempe);
tempe = findfloat (tempe, requirespower, 1);
}
// Light Styles
tempe = find(world, classname, "light");
while(tempe)
{
if (tempe.spawnflags & LIGHT_SPAWNFLAG_STARTOFF) {
tempe.style = tempe.score;
LS_Setup();
}
tempe = find(tempe, classname, "light");
}
}
//
// Power_HandleStop()
// Stops "flipping" the Power Switch handle.
//
void() Power_HandleStop =
{
self.avelocity = '0 0 0';
self.think = SUB_Null;
}
//
// Power_HandleFlip()
// Programmatically "flips" the Power Switch handle.
//
void() Power_HandleFlip =
{
self.boxweapon.avelocity = '185 0 0';
self.boxweapon.think = Power_HandleStop;
self.boxweapon.nextthink = time + 0.50;
}
//
// Power_Touch()
// Power Switch touch function, triggers global activation.
//
void() Power_Touch =
{
if (other.classname != "player" || other.downed)
return;
if (isPowerOn == true)
return;
entity tempe;
entity old_self;
useprint (other, 10, 0, 0);
if (other.button7 && !isPowerOn) {
// Animate the handle programmatically.
if (!(self.spawnflags & POWER_SPAWNFLAG_NOHANDLE))
Power_HandleFlip();
// Play the sound of the Power Switch flipping
if (self.powerup_vo)
Sound_PlaySound(self, self.powerup_vo, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS);
isPowerOn = true;
Sound_PlaySound(world, self.oldmodel, SOUND_TYPE_ENV_VOICE, SOUND_PRIORITY_PLAYALWAYS);
// Trigger all doors that are marked as requiring power.
tempe = find (world, classname, "door_nzp");
while (tempe) {
entity starte;
if (!tempe.targetname) {
if (!tempe.cost) {
old_self = self;
self = tempe;
starte = self;
door_go_up ();
tempe.classname = "door_open";
tempe = find (tempe, classname, "door_nzp");
self = old_self;
}
}
if (tempe.targetname) {
old_self = self;
self = tempe;
remove(self);
self = old_self;
tempe = find (tempe, classname, "door_nzp");
}
}
tempe = find(world, classname, "perk_pap");
while(tempe != world) {
entity tempe2 = self;
self = tempe;
PAP_TurnOn();
self = tempe2;
tempe = find(tempe, classname, "perk_pap");
}
Power_ActivateLights();
SUB_UseTargets();
}
}
void() power_switch =
{
//
// Set Default Stats for Compatibility
//
// Model
if (!self.model)
self.model = "models/machines/quake_scale/power_switch.mdl";
// Handle Model
if (!self.weapon2model)
self.weapon2model = "models/machines/quake_scale/power_handle.mdl";
// Compatibility Hack -- it doesn't make sense if the Power Switch is HL
// and the handle is Quake.
if (self.model == "models/machines/hl_scale/power_switch.mdl" &&
self.weapon2model == "models/machines/quake_scale/power_handle.mdl") {
self.weapon2model = "models/machines/hl_scale/power_handle.mdl";
self.box1 = '-3 0 -2';
}
// Power Sound (Plays Everywhere)
if (!self.oldmodel)
self.oldmodel = "sounds/machines/power.wav";
// Handle Offset
if (!self.box1)
self.box1 = '-4 0 12';
// Switch Flip Sound (Spatialized)
if (self.powerup_vo)
precache_sound(self.powerup_vo);
self.solid = SOLID_TRIGGER;
Precache_Set(self.model);
precache_sound(self.oldmodel);
setorigin (self, self.origin);
setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX);
self.classname = "power_switch";
self.touch = Power_Touch;
// Spawn the Handle
if (!(self.spawnflags & POWER_SPAWNFLAG_NOHANDLE)) {
precache_model(self.weapon2model);
entity handle = spawn();
setmodel(handle, self.weapon2model);
makevectors(self.angles);
handle.origin = self.origin;
handle.origin += v_right * self.box1_y;
handle.origin += v_forward * self.box1_x;
handle.origin += v_up * self.box1_z;
handle.angles = self.angles;
setorigin(handle, handle.origin);
handle.movetype = MOVETYPE_NOCLIP;
self.boxweapon = handle;
}
// Set the global flag that indicates the Power isn't on
isPowerOn = false;
}