123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747 |
- /* Copyright (C) 1996-2022 id Software LLC
- 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 the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- See file, 'COPYING', for details.
- */
- /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
- Used as a positional target for spotlights, etc.
- */
- void() info_null =
- {
- remove(self);
- };
- /*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
- Used as a positional target for lightning.
- */
- void() info_notnull =
- {
- };
- //============================================================================
- float START_OFF = 1;
- void() light_use =
- {
- if (self.spawnflags & START_OFF)
- {
- lightstyle(self.style, "m");
- self.spawnflags = self.spawnflags - START_OFF;
- }
- else
- {
- lightstyle(self.style, "a");
- self.spawnflags = self.spawnflags + START_OFF;
- }
- };
- /*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
- Non-displayed light.
- Default light value is 300
- Default style is 0
- If targeted, it will toggle between on or off.
- */
- void() light =
- {
- if (!self.targetname)
- { // inert light
- remove(self);
- return;
- }
-
- if (self.style >= 32)
- {
- self.use = light_use;
- if (self.spawnflags & START_OFF)
- lightstyle(self.style, "a");
- else
- lightstyle(self.style, "m");
- }
- };
- /*QUAKED light_fluoro (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
- Non-displayed light.
- Default light value is 300
- Default style is 0
- If targeted, it will toggle between on or off.
- Makes steady fluorescent humming sound
- */
- void() light_fluoro =
- {
- if (self.style >= 32)
- {
- self.use = light_use;
- if (self.spawnflags & START_OFF)
- lightstyle(self.style, "a");
- else
- lightstyle(self.style, "m");
- }
-
- precache_sound ("ambience/fl_hum1.wav");
- ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8)
- Non-displayed light.
- Default light value is 300
- Default style is 10
- Makes sparking, broken fluorescent sound
- */
- void() light_fluorospark =
- {
- if (!self.style)
- self.style = 10;
- precache_sound ("ambience/buzz1.wav");
- ambientsound (self.origin, "ambience/buzz1.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED light_globe (0 1 0) (-8 -8 -8) (8 8 8)
- Sphere globe light.
- Default light value is 300
- Default style is 0
- */
- void() light_globe =
- {
- precache_model ("progs/s_light.spr");
- setmodel (self, "progs/s_light.spr");
- makestatic (self);
- };
- void() FireAmbient =
- {
- precache_sound ("ambience/fire1.wav");
- // attenuate fast
- ambientsound (self.origin, "ambience/fire1.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED light_torch_small_walltorch (0 .5 0) (-10 -10 -20) (10 10 20) Quiet
- Short wall torch
- Default light value is 300
- Default style is 0
- */
- void() light_torch_small_walltorch =
- {
- precache_model ("progs/flame.mdl");
- setmodel (self, "progs/flame.mdl");
- if (!(self.spawnflags & 1))
- FireAmbient ();
- makestatic (self);
- };
- /*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
- Large yellow flame ball
- */
- void() light_flame_large_yellow =
- {
- precache_model ("progs/flame2.mdl");
- setmodel (self, "progs/flame2.mdl");
- self.frame = 1;
- FireAmbient ();
- makestatic (self);
- };
- /*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
- Small yellow flame ball
- */
- void() light_flame_small_yellow =
- {
- precache_model ("progs/flame2.mdl");
- setmodel (self, "progs/flame2.mdl");
- FireAmbient ();
- makestatic (self);
- };
- /*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
- Small white flame ball
- */
- void() light_flame_small_white =
- {
- precache_model ("progs/flame2.mdl");
- setmodel (self, "progs/flame2.mdl");
- FireAmbient ();
- makestatic (self);
- };
- //============================================================================
- /*QUAKED misc_fireball (0 .5 .8) (-8 -8 -8) (8 8 8)
- Lava Balls
- */
- void() fire_fly;
- void() fire_touch;
- void() misc_fireball =
- {
-
- precache_model ("progs/lavaball.mdl");
- self.classname = "fireball";
- self.nextthink = time + (random() * 5);
- self.think = fire_fly;
- if (!self.speed)
- self.speed == 1000;
- };
- void() fire_fly =
- {
- local entity fireball;
- fireball = spawn();
- fireball.solid = SOLID_TRIGGER;
- fireball.movetype = MOVETYPE_TOSS;
- fireball.velocity = '0 0 1000';
- fireball.velocity_x = (random() * 100) - 50;
- fireball.velocity_y = (random() * 100) - 50;
- fireball.velocity_z = self.speed + (random() * 200);
- fireball.classname = "fireball";
- setmodel (fireball, "progs/lavaball.mdl");
- setsize (fireball, '0 0 0', '0 0 0');
- setorigin (fireball, self.origin);
- fireball.nextthink = time + 5;
- fireball.think = SUB_Remove;
- fireball.touch = fire_touch;
-
- self.nextthink = time + (random() * 5) + 3;
- self.think = fire_fly;
- };
- void() fire_touch =
- {
- T_Damage (other, self, self, 20);
- remove(self);
- };
- //============================================================================
- void() barrel_explode =
- {
- self.takedamage = DAMAGE_NO;
- self.classname = "explo_box";
- // did say self.owner
- T_RadiusDamage (self, self, 160, world);
- sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
- particle (self.origin, '0 0 0', 75, 255);
- self.origin_z = self.origin_z + 32;
- BecomeExplosion ();
- };
- /*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64)
- TESTING THING
- */
- void() misc_explobox =
- {
- local float oldz;
-
- self.solid = SOLID_BBOX;
- self.movetype = MOVETYPE_NONE;
- precache_model ("maps/b_explob.bsp");
- setmodel (self, "maps/b_explob.bsp");
- precache_sound ("weapons/r_exp3.wav");
- self.health = 20;
- self.th_die = barrel_explode;
- self.takedamage = DAMAGE_AIM;
- self.origin_z = self.origin_z + 2;
- oldz = self.origin_z;
- droptofloor();
- if (oldz - self.origin_z > 250)
- {
- dprint ("item fell out of level at ");
- dprint (vtos(self.origin));
- dprint ("\n");
- remove(self);
- }
- };
- /*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
- Smaller exploding box, REGISTERED ONLY
- */
- void() misc_explobox2 =
- {
- local float oldz;
-
- self.solid = SOLID_BBOX;
- self.movetype = MOVETYPE_NONE;
- precache_model2 ("maps/b_exbox2.bsp");
- setmodel (self, "maps/b_exbox2.bsp");
- precache_sound ("weapons/r_exp3.wav");
- self.health = 20;
- self.th_die = barrel_explode;
- self.takedamage = DAMAGE_AIM;
- self.origin_z = self.origin_z + 2;
- oldz = self.origin_z;
- droptofloor();
- if (oldz - self.origin_z > 250)
- {
- dprint ("item fell out of level at ");
- dprint (vtos(self.origin));
- dprint ("\n");
- remove(self);
- }
- };
- //============================================================================
- float SPAWNFLAG_SUPERSPIKE = 1;
- float SPAWNFLAG_LASER = 2;
- float SPAWNFLAG_LAVASPIKE = 4;
- float SPAWNFLAG_SUPERLAVA = 8;
- float SPAWNFLAG_LAVASKILL = 16;
- float SPAWNFLAG_FIREBALL = 32;
- void(vector org, vector vec) LaunchLaser;
- void(vector org, vector dir) launch_lava_spike;
- void(vector org, vector dir) launch_fireball;
- void() spikeshooter_use =
- {
- if (self.spawnflags & SPAWNFLAG_SUPERSPIKE || !(self.spawnflags))
- {
- sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM);
- launch_spike (self.origin, self.movedir);
- newmis.velocity = self.movedir * 500;
- if (self.spawnflags & SPAWNFLAG_SUPERSPIKE)
- newmis.touch = superspike_touch;
- }
- else if (self.spawnflags & SPAWNFLAG_LASER)
- {
- sound (self, CHAN_VOICE, "enforcer/enfire.wav", 1, ATTN_NORM);
- LaunchLaser (self.origin, self.movedir);
- }
- else if (self.spawnflags & SPAWNFLAG_FIREBALL)
- {
- launch_fireball (self.origin, self.movedir);
- }
- else
- {
- sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM);
- launch_lava_spike (self.origin, self.movedir);
- newmis.velocity = self.movedir * 500;
- if (self.spawnflags & SPAWNFLAG_SUPERLAVA)
- newmis.touch = superlavaspike_touch;
- else if((self.spawnflags & SPAWNFLAG_LAVASKILL) && (skill > 1))
- newmis.touch = superlavaspike_touch;
- }
- };
- void() shooter_think =
- {
- spikeshooter_use ();
- self.nextthink = time + self.wait;
- newmis.velocity = self.movedir * 500;
- };
- /*QUAKED trap_spikeshooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser lava superlava skilllava fireball
- When triggered, fires a spike in the direction set in QuakeEd.
- Laser, Lava and SuperLava are only for REGISTERED.
- */
- void() trap_spikeshooter =
- {
- SetMovedir ();
- self.use = spikeshooter_use;
- if (self.spawnflags & SPAWNFLAG_LASER)
- {
- precache_model2 ("progs/laser.mdl");
-
- precache_sound2 ("enforcer/enfire.wav");
- precache_sound2 ("enforcer/enfstop.wav");
- }
- else if (self.spawnflags & SPAWNFLAG_LAVASPIKE)
- {
- precache_model2 ("progs/lspike.mdl");
- precache_sound2 ("lavagun/snail.wav"); // lava nail gun cooldown
- precache_sound2 ("weapons/rocket1i.wav");
- }
- else if (self.spawnflags & SPAWNFLAG_SUPERLAVA)
- {
- precache_model2 ("progs/lspike.mdl");
- precache_sound2 ("lavagun/snail.wav"); // lava nail gun cooldown
- precache_sound2 ("weapons/spike2.wav");
- }
- else if (self.spawnflags & SPAWNFLAG_LAVASKILL)
- {
- precache_model2 ("progs/lspike.mdl");
- precache_sound2 ("lavagun/snail.wav"); // lava nail gun cooldown
- precache_sound2 ("weapons/rocket1i.wav");
- precache_sound2 ("weapons/spike2.wav");
- }
- else if (self.spawnflags & SPAWNFLAG_FIREBALL)
- {
- precache_model ("progs/fireball.mdl");
- }
- else
- precache_sound ("weapons/spike2.wav");
- };
- /*QUAKED trap_shooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
- Continuously fires spikes.
- "wait" time between spike (1.0 default)
- "nextthink" delay before firing first spike, so multiple shooters can be stagered.
- */
- void() trap_shooter =
- {
- trap_spikeshooter ();
-
- if (self.wait == 0)
- self.wait = 1;
- self.nextthink = self.nextthink + self.wait + self.ltime;
- self.think = shooter_think;
- };
- /*
- ===============================================================================
- ===============================================================================
- */
- void() make_bubbles;
- void() bubble_remove;
- void() bubble_bob;
- /*QUAKED air_bubbles (0 .5 .8) (-8 -8 -8) (8 8 8)
- testing air bubbles
- */
- void() air_bubbles =
- {
- if (deathmatch)
- {
- remove (self);
- return;
- }
- precache_model ("progs/s_bubble.spr");
- self.nextthink = time + 1;
- self.think = make_bubbles;
- };
- void() make_bubbles =
- {
- local entity bubble;
- bubble = spawn();
- setmodel (bubble, "progs/s_bubble.spr");
- setorigin (bubble, self.origin);
- bubble.movetype = MOVETYPE_NOCLIP;
- bubble.solid = SOLID_NOT;
- bubble.velocity = '0 0 15';
- bubble.nextthink = time + 0.5;
- bubble.think = bubble_bob;
- bubble.touch = bubble_remove;
- bubble.classname = "bubble";
- bubble.frame = 0;
- bubble.cnt = 0;
- setsize (bubble, '-8 -8 -8', '8 8 8');
- self.nextthink = time + random() + 0.5;
- self.think = make_bubbles;
- };
- void() bubble_split =
- {
- local entity bubble;
- bubble = spawn();
- setmodel (bubble, "progs/s_bubble.spr");
- setorigin (bubble, self.origin);
- bubble.movetype = MOVETYPE_NOCLIP;
- bubble.solid = SOLID_NOT;
- bubble.velocity = self.velocity;
- bubble.nextthink = time + 0.5;
- bubble.think = bubble_bob;
- bubble.touch = bubble_remove;
- bubble.classname = "bubble";
- bubble.frame = 1;
- bubble.cnt = 10;
- setsize (bubble, '-8 -8 -8', '8 8 8');
- self.frame = 1;
- self.cnt = 10;
- if (self.waterlevel != 3)
- remove (self);
- };
- void() bubble_remove =
- {
- if (other.classname == self.classname)
- {
- // dprint ("bump");
- return;
- }
- remove(self);
- };
- void() bubble_bob =
- {
- local float rnd1, rnd2, rnd3;
- local vector vtmp1, modi;
- // PGM fix - 02/25/97 so bubbles won't go through walls
- rnd1 = pointcontents(self.origin);
- if (rnd1 == CONTENT_SOLID)
- remove(self);
- // PGM fix - 02/25/97 so bubbles pop 2 seconds after leaving water
- else if (rnd1 == CONTENT_EMPTY)
- {
- if (self.cnt < 16)
- self.cnt = 16;
- }
- self.cnt = self.cnt + 1;
- if (self.cnt == 4)
- bubble_split();
- if (self.cnt == 20)
- remove(self);
- rnd1 = self.velocity_x + (-10 + (random() * 20));
- rnd2 = self.velocity_y + (-10 + (random() * 20));
- rnd3 = self.velocity_z + 10 + random() * 10;
- if (rnd1 > 10)
- rnd1 = 5;
- if (rnd1 < -10)
- rnd1 = -5;
-
- if (rnd2 > 10)
- rnd2 = 5;
- if (rnd2 < -10)
- rnd2 = -5;
-
- if (rnd3 < 10)
- rnd3 = 15;
- if (rnd3 > 30)
- rnd3 = 25;
-
- self.velocity_x = rnd1;
- self.velocity_y = rnd2;
- self.velocity_z = rnd3;
-
- self.nextthink = time + 0.5;
- self.think = bubble_bob;
- };
- /*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
- ~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
- /*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8)
- Just for the debugging level. Don't use
- */
- void() viewthing =
- {
- self.movetype = MOVETYPE_NONE;
- self.solid = SOLID_NOT;
- precache_model ("progs/player.mdl");
- setmodel (self, "progs/player.mdl");
- };
- /*
- ==============================================================================
- SIMPLE BMODELS
- ==============================================================================
- */
- void() func_wall_use =
- { // change to alternate textures
- self.frame = 1 - self.frame;
- };
- /*QUAKED func_wall (0 .5 .8) ?
- This is just a solid wall if not inhibitted
- */
- void() func_wall =
- {
- self.angles = '0 0 0';
- self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything
- self.solid = SOLID_BSP;
- self.use = func_wall_use;
- setmodel (self, self.model);
- };
- /*QUAKED func_illusionary (0 .5 .8) ?
- A simple entity that looks solid but lets you walk through it.
- */
- void() func_illusionary =
- {
- self.angles = '0 0 0';
- self.movetype = MOVETYPE_NONE;
- self.solid = SOLID_NOT;
- setmodel (self, self.model);
- makestatic ();
- };
- /*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4
- This bmodel will appear if the episode has allready been completed, so players can't reenter it.
- */
- void() func_episodegate =
- {
- if (!(serverflags & self.spawnflags))
- return; // can still enter episode
- self.angles = '0 0 0';
- self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything
- self.solid = SOLID_BSP;
- self.use = func_wall_use;
- setmodel (self, self.model);
- };
- /*QUAKED func_bossgate (0 .5 .8) ?
- This bmodel appears unless players have all of the episode sigils.
- */
- void() func_bossgate =
- {
- if ( (serverflags & 15) == 15)
- return; // all episodes completed
- self.angles = '0 0 0';
- self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything
- self.solid = SOLID_BSP;
- self.use = func_wall_use;
- setmodel (self, self.model);
- };
- //============================================================================
- /*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_suck_wind =
- {
- precache_sound ("ambience/suck1.wav");
- ambientsound (self.origin, "ambience/suck1.wav", 1, ATTN_STATIC);
- };
- /*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_drone =
- {
- precache_sound ("ambience/drone6.wav");
- ambientsound (self.origin, "ambience/drone6.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_flouro_buzz =
- {
- precache_sound ("ambience/buzz1.wav");
- ambientsound (self.origin, "ambience/buzz1.wav", 1, ATTN_STATIC);
- };
- /*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_drip =
- {
- precache_sound ("ambience/drip1.wav");
- ambientsound (self.origin, "ambience/drip1.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_comp_hum =
- {
- precache_sound ("ambience/comp1.wav");
- ambientsound (self.origin, "ambience/comp1.wav", 1, ATTN_STATIC);
- };
- /*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_thunder =
- {
- precache_sound ("ambience/thunder1.wav");
- ambientsound (self.origin, "ambience/thunder1.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_light_buzz =
- {
- precache_sound ("ambience/fl_hum1.wav");
- ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_swamp1 =
- {
- precache_sound ("ambience/swamp1.wav");
- ambientsound (self.origin, "ambience/swamp1.wav", 0.5, ATTN_STATIC);
- };
- /*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
- */
- void() ambient_swamp2 =
- {
- precache_sound ("ambience/swamp2.wav");
- ambientsound (self.origin, "ambience/swamp2.wav", 0.5, ATTN_STATIC);
- };
- //============================================================================
- void() noise_think =
- {
- self.nextthink = time + 0.5;
- sound (self, 1, "enforcer/enfire.wav", 1, ATTN_NORM);
- sound (self, 2, "enforcer/enfstop.wav", 1, ATTN_NORM);
- sound (self, 3, "enforcer/sight1.wav", 1, ATTN_NORM);
- sound (self, 4, "enforcer/sight2.wav", 1, ATTN_NORM);
- sound (self, 5, "enforcer/sight3.wav", 1, ATTN_NORM);
- sound (self, 6, "enforcer/sight4.wav", 1, ATTN_NORM);
- sound (self, 7, "enforcer/pain1.wav", 1, ATTN_NORM);
- };
- /*QUAKED misc_noisemaker (1 0.5 0) (-10 -10 -10) (10 10 10)
- For optimzation testing, starts a lot of sounds.
- */
- void() misc_noisemaker =
- {
- precache_sound2 ("enforcer/enfire.wav");
- precache_sound2 ("enforcer/enfstop.wav");
- precache_sound2 ("enforcer/sight1.wav");
- precache_sound2 ("enforcer/sight2.wav");
- precache_sound2 ("enforcer/sight3.wav");
- precache_sound2 ("enforcer/sight4.wav");
- precache_sound2 ("enforcer/pain1.wav");
- precache_sound2 ("enforcer/pain2.wav");
- precache_sound2 ("enforcer/death1.wav");
- precache_sound2 ("enforcer/idle1.wav");
- self.nextthink = time + 0.1 + random();
- self.think = noise_think;
- };
|