bring in Deek's bug fixes and whitespace cleanups

This commit is contained in:
Bill Currie 2002-02-22 20:01:05 +00:00
parent e158247afb
commit d8d86b931e
23 changed files with 261 additions and 1821 deletions

View file

@ -28,8 +28,8 @@ void() button_return =
};
void() button_blocked =
{ // do nothing, just don't ome all the way back out
void() button_blocked = // do nothing, just don't come all the way back out
{
};
@ -85,23 +85,19 @@ When a button is touched, it moves some distance in the direction of it's angle,
*/
void() func_button =
{
if (self.sounds == 0)
{
if (self.sounds == 0) {
precache_sound ("buttons/airbut1.wav");
self.noise = "buttons/airbut1.wav";
}
if (self.sounds == 1)
{
if (self.sounds == 1) {
precache_sound ("buttons/switch21.wav");
self.noise = "buttons/switch21.wav";
}
if (self.sounds == 2)
{
if (self.sounds == 2) {
precache_sound ("buttons/switch02.wav");
self.noise = "buttons/switch02.wav";
}
if (self.sounds == 3)
{
if (self.sounds == 3) {
precache_sound ("buttons/switch04.wav");
self.noise = "buttons/switch04.wav";
}
@ -115,17 +111,13 @@ void() func_button =
self.blocked = button_blocked;
self.use = button_use;
if (self.health)
{
if (self.health) {
self.max_health = self.health;
self.th_die = button_killed;
self.takedamage = DAMAGE_YES;
// + POX
self.nobleed = TRUE;
// - POX
}
else
self.nobleed = TRUE; // + POX
} else
self.touch = button_touch;
if (!self.speed)

View file

@ -14,18 +14,16 @@ float modelindex_eyes, modelindex_player;
/*
=============================================================================
LEVEL CHANGING / INTERMISSION
=============================================================================
*/
string nextmap;
// POX - moved to poxdefs.qc
//float intermission_running;
//float intermission_running; // POX - moved to poxdefs.qc
float intermission_exittime;
/*QUAKED info_intermission (1 0.5 0.5) (-16 -16 -16) (16 16 16)
This is the camera point for the intermission.
Use mangle instead of angle, so you can set pitch or roll as well as yaw. 'pitch roll yaw'
@ -52,7 +50,6 @@ void() SetNewParms =
// Quake Complains if this function isn't defined
};
void() DecodeLevelParms =
{
//POX v1.2 - parms are used to store the Taget ID toggle, and to prevent running autoexec.cfg more than once per session
@ -62,19 +59,15 @@ void() DecodeLevelParms =
self.configed = parm2;
//POX v1.2 - run autoexec.cfg ONCE when first joining server only!
if (!self.configed)
{
if (!self.configed) {
self.configed = TRUE;
stuffcmd(self, "exec autoexec.cfg\n");
}
};
/*
============
FindIntermission
Returns the entity to view from
============
*/
@ -82,14 +75,12 @@ entity() FindIntermission =
{
local entity spot;
local float cyc;
// look for info_intermission first
spot = find (world, classname, "info_intermission");
if (spot)
{ // pick a random one
cyc = random() * 4;
while (cyc > 1)
{
while (cyc > 1) {
spot = find (spot, classname, "info_intermission");
if (!spot)
spot = find (spot, classname, "info_intermission");
@ -97,7 +88,6 @@ entity() FindIntermission =
}
return spot;
}
// then look for the start position
spot = find (world, classname, "info_player_start");
if (spot)
@ -106,14 +96,12 @@ entity() FindIntermission =
objerror ("FindIntermission: no spot");
};
void() GotoNextMap =
{
local string newmap;
//ZOID: 12-13-96, samelevel is overloaded, only 1 works for same level
if (cvar("samelevel") == 1) // if samelevel is set, stay on same level
//ZOID: 12-13-96, samelevel is overloaded, only 1 works for same level
if (cvar ("samelevel") == 1) // if samelevel is set, stay on same level
changelevel (mapname);
else {
// configurable map lists, see if the current map exists as a
@ -126,12 +114,9 @@ void() GotoNextMap =
}
};
/*
============
IntermissionThink
When the player presses attack or jump, change to the next level
============
*/
@ -157,18 +142,14 @@ Take the players to the intermission spot
void() execute_changelevel =
{
local entity pos;
intermission_running = 1;
// enforce a wait time before allowing changelevel
intermission_exittime = time + 5;
pos = FindIntermission ();
// play intermission music
WriteByte (MSG_ALL, SVC_CDTRACK);
WriteByte (MSG_ALL, 3);
WriteByte (MSG_ALL, SVC_INTERMISSION);
WriteCoord (MSG_ALL, pos.origin_x);
WriteCoord (MSG_ALL, pos.origin_y);
@ -186,15 +167,11 @@ void() execute_changelevel =
other.modelindex = 0;
other = find (other, classname, "player");
}
};
void() changelevel_touch =
{
if (other.classname != "player")
return;
// if "noexit" is set, blow up the player trying to leave
//ZOID, 12-13-96, noexit isn't supported in QW. Overload samelevel
// if ((cvar("noexit") == 1) || ((cvar("noexit") == 2) && (mapname != "start")))
@ -203,22 +180,17 @@ void() changelevel_touch =
T_Damage (other, self, self, 50000);
return;
}
bprint (PRINT_HIGH, other.netname);
bprint (PRINT_HIGH," exited the level\n");
nextmap = self.map;
SUB_UseTargets ();
self.touch = SUB_Null;
// we can't move people right now, because touch functions are called
// in the middle of C movement code, so set a think time to do it
self.think = execute_changelevel;
self.nextthink = time + 0.1;
};
/*QUAKED trigger_changelevel (0.5 0.5 0.5) ? NO_INTERMISSION
When the player touches this, he gets sent to the map listed in the "map" variable. Unless the NO_INTERMISSION flag is set, the view will go to the info_intermission spot and display stats.
*/
@ -230,18 +202,12 @@ void() trigger_changelevel =
InitTrigger ();
self.touch = changelevel_touch;
};
/*
=============================================================================
PLAYER GAME EDGE FUNCTIONS
=============================================================================
*/
void() set_suicide_frame;
// called by ClientKill and DeadThink
void() respawn =
{
@ -252,18 +218,13 @@ void() respawn =
// respawn
PutClientInServer ();
};
/*
============
ClientKill
Player entered the suicide command
============
*/
void() NextLevel; //POX v1.12
void() ClientKill =
{
//POX v1.12 - don't let LMS observers suicide!
@ -303,16 +264,13 @@ void() ClientKill =
respawn ();
};
float(vector v) CheckSpawnPoint =
{
return FALSE;
};
/*
============
SelectSpawnPoint
Returns the entity to spawn at
============
*/
@ -322,25 +280,20 @@ entity() SelectSpawnPoint =
local float numspots, totalspots;
local float pcount;
local entity spots;
numspots = 0;
totalspots = 0;
// testinfo_player_start is only found in regioned levels
spot = find (world, classname, "testplayerstart");
if (spot)
return spot;
// choose a info_player_deathmatch point
// ok, find all spots that don't have players nearby
spots = world;
spot = find (world, classname, "info_player_deathmatch");
while (spot)
{
totalspots = totalspots + 1;
thing=findradius(spot.origin, 84);
pcount=0;
while (thing)
@ -354,7 +307,6 @@ entity() SelectSpawnPoint =
spots = spot;
numspots = numspots + 1;
}
// Get the next spot in the chain
spot = find (spot, classname, "info_player_deathmatch");
}
@ -372,29 +324,22 @@ entity() SelectSpawnPoint =
}
// We now have the number of spots available on the map in numspots
// Generate a random number between 1 and numspots
numspots = numspots - 1;
numspots = rint((random() * numspots ) );
spot = spots;
while (numspots > 0) {
spot = spot.goalentity;
numspots = numspots - 1;
}
return spot;
};
//void() DecodeLevelParms;
void() PlayerDie;
/*
===========
ValidateUser
============
*/
float(entity e) ValidateUser =
@ -403,7 +348,6 @@ float(entity e) ValidateUser =
local string s;
local string userclan;
local float rank, rankmin, rankmax;
//
// if the server has set "clan1" and "clan2", then it
// is a clan match that will allow only those two clans in
@ -419,14 +363,12 @@ float(entity e) ValidateUser =
return true;
return false;
}
//
// if the server has set "rankmin" and/or "rankmax" then
// the users rank must be between those two values
//
s = masterinfo (e, "rank");
rank = stof (s);
s = serverinfo("rankmin");
if (s)
{
@ -441,16 +383,12 @@ float(entity e) ValidateUser =
if (rankmax < rank)
return false;
}
return true;
*/
};
/*
===========
PutClientInServer
called each time a player enters a new level
============
*/
@ -498,11 +436,9 @@ void() PutClientInServer =
self.armorvalue = 50;
self.armortype = 0.9;
// - POX
DecodeLevelParms (); //POX v1.2 - exec autoconfig if needed, restore Target ID value
W_SetCurrentAmmo ();
self.attack_finished = time;
self.th_pain = player_pain;
self.th_die = PlayerDie;
@ -513,48 +449,36 @@ void() PutClientInServer =
// + POX resest reload_rocket after death
self.reload_rocket = 0;
//resest triple shot after death
self.prime_tshot = FALSE;
// - POX
spot = SelectSpawnPoint ();
self.origin = spot.origin + '0 0 1';
self.angles = spot.angles;
self.fixangle = TRUE; // turn this way immediately
// oh, this is a hack!
setmodel (self, "progs/eyes.mdl");
modelindex_eyes = self.modelindex;
setmodel (self, "progs/player.mdl");
modelindex_player = self.modelindex;
setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);
self.view_ofs = '0 0 22';
// Mod - Xian (May.20.97)
// Bug where player would have velocity from their last kill
self.velocity = '0 0 0';
player_stand1 ();
makevectors(self.angles);
spawn_tfog (self.origin + v_forward*20);
spawn_tdeath (self.origin, self);
// Set Rocket Jump Modifiers
if (stof(infokey(world, "rj")) != 0)
{
rj = stof(infokey(world, "rj"));
}
// + POX - New DM mode stuff -----------------------------------------------------
//Last Man Standing Rules
if ((deathmatch & DM_LMS) && !self.LMS_registered)
{
@ -566,7 +490,6 @@ void() PutClientInServer =
self.LMS_registered = TRUE;
lms_plrcount = lms_plrcount + 1;
}
// + POX - Dark Mode more stuff is done in Player_PostThink - doesn't work here (?)
if (deathmatch & DM_DARK)
flash_on(self);
@ -617,9 +540,7 @@ void() PutClientInServer =
self.invisible_time = 1;
self.invisible_finished = time + 9999999999;
}
// - POX - New DM mode stuff -----------------------------------------------------
/* if (deathmatch == 4)
{
self.ammo_shells = 0;
@ -644,7 +565,6 @@ void() PutClientInServer =
self.invincible_time = 1;
self.invincible_finished = time + 3;
}
if (deathmatch == 5)
{
self.ammo_nails = 80;
@ -666,56 +586,41 @@ void() PutClientInServer =
self.invincible_finished = time + 3;
}
*/
};
/*
=============================================================================
QUAKED FUNCTIONS
=============================================================================
*/
/*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 24)
The normal starting point for a level.
*/
void() info_player_start =
{
};
/*QUAKED info_player_start2 (1 0 0) (-16 -16 -24) (16 16 24)
Only used on start map for the return point from an episode.
*/
void() info_player_start2 =
{
};
/*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 24)
potential spawning position for deathmatch games
*/
void() info_player_deathmatch =
{
};
/*QUAKED info_player_coop (1 0 1) (-16 -16 -24) (16 16 24)
potential spawning position for coop games
*/
void() info_player_coop =
{
};
/*
===============================================================================
RULES
===============================================================================
*/
/*
go to the next level for deathmatch
*/
@ -730,7 +635,6 @@ void() NextLevel =
if (nextmap != "")
return; // already done
if (mapname == "start")
{
if (!cvar("registered"))
@ -771,20 +675,16 @@ void() NextLevel =
o.map = mapname;
}
}
nextmap = o.map;
if (o.nextthink < time)
{
o.think = execute_changelevel;
o.nextthink = time + 0.1;
}
};
/*
============
CheckRules
Exit deathmatch games upon conditions
============
*/
@ -811,13 +711,10 @@ void() CheckRules =
// - POX
};
//============================================================================
void() PlayerDeathThink =
{
local float forward;
if ((self.flags & FL_ONGROUND))
{
forward = vlen (self.velocity);
@ -827,7 +724,6 @@ void() PlayerDeathThink =
else
self.velocity = forward * normalize(self.velocity);
}
// wait for all buttons released
if (self.deadflag == DEAD_DEAD)
{
@ -836,11 +732,9 @@ void() PlayerDeathThink =
self.deadflag = DEAD_RESPAWNABLE;
return;
}
// + POX - don't let players lay around as dead guys during a Last Man Standing game
if (!self.button2 && !self.button1 && !self.button0 && !(deathmatch & DM_LMS))
return;
if (deathmatch & DM_LMS)
stuffcmd (self, "wait;wait;wait;wait;wait;wait\n");
@ -848,14 +742,11 @@ void() PlayerDeathThink =
// if (!self.button2 && !self.button1 && !self.button0)
// return;
// - POX
self.button0 = 0;
self.button1 = 0;
self.button2 = 0;
respawn();
};
void() PlayerJump =
{
if (self.flags & FL_WATERJUMP)
@ -873,7 +764,6 @@ void() PlayerJump =
else
sound (self, CHAN_BODY, "misc/water2.wav", 1, ATTN_NORM);
}
return;
}
*/
@ -886,33 +776,24 @@ void() PlayerJump =
self.velocity_z = 80;
else
self.velocity_z = 50;
return;
}
// - POX
if (!(self.flags & FL_ONGROUND))
return;
if ( !(self.flags & FL_JUMPRELEASED) )
return; // don't pogo stick
self.flags = self.flags - (self.flags & FL_JUMPRELEASED);
self.button2 = 0;
// player jumping sound
sound (self, CHAN_VOICE, "player/plyrjmp8.wav", 1, ATTN_NORM);
};
/*
===========
WaterMove
============
*/
.float dmgtime;
void() WaterMove =
{
//dprint (ftos(self.waterlevel));
@ -920,7 +801,6 @@ void() WaterMove =
return;
if (self.health < 0)
return;
if (self.waterlevel != 3)
{
if (self.air_finished < time)
@ -961,7 +841,6 @@ void() WaterMove =
}
return;
}
if (self.watertype == CONTENT_LAVA)
{ // do damage
if (self.dmgtime < time)
@ -970,7 +849,6 @@ void() WaterMove =
self.dmgtime = time + 1;
else
self.dmgtime = time + 0.2;
T_Damage (self, world, world, 10*self.waterlevel);
}
}
@ -985,20 +863,16 @@ void() WaterMove =
if ( !(self.flags & FL_INWATER) )
{
// player enter water sound
if (self.watertype == CONTENT_LAVA)
sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM);
if (self.watertype == CONTENT_WATER)
sound (self, CHAN_VOICE, "player/inh2o.wav", 1, ATTN_NORM);
if (self.watertype == CONTENT_SLIME)
sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM);
self.flags = self.flags + FL_INWATER;
self.dmgtime = 0;
}
// + POX - New water movement sounds
if (self.waterlevel >= 3)
{
@ -1046,13 +920,10 @@ if (self.waterlevel >= 3)
*/
}
// - POX
};
void() CheckWaterJump =
{
local vector start, end;
// check for a jump-out-of-water
makevectors (self.angles);
start = self.origin;
@ -1077,11 +948,9 @@ void() CheckWaterJump =
}
}
};
/*
================
PlayerPreThink
Called every frame before physics are run
================
*/
@ -1092,12 +961,9 @@ void() PlayerPreThink =
IntermissionThink (); // otherwise a button could be missed between
return; // the think tics
}
if (self.view_ofs == '0 0 0')
return; // intermission or finale
makevectors (self.v_angle); // is this still used
self.deathtype = "";
CheckRules ();
@ -1113,13 +979,11 @@ void() PlayerPreThink =
return;
}
// - POX
WaterMove ();
/*
if (self.waterlevel == 2)
CheckWaterJump ();
*/
if (self.deadflag >= DEAD_DEAD)
{
PlayerDeathThink ();
@ -1135,7 +999,6 @@ void() PlayerPreThink =
}
else
self.flags = self.flags | FL_JUMPRELEASED;
// teleporters can force a non-moving pause time
if (time < self.pausetime)
self.velocity = '0 0 0';
@ -1155,7 +1018,6 @@ void() PlayerPreThink =
/*
================
CheckPowerups
Check for turning off powerups
================
*/
@ -1163,7 +1025,6 @@ void() CheckPowerups =
{
if (self.health <= 0)
return;
// + POX - Rot armour down to 150 (max 250)
if (self.armorvalue > 150 && self.armor_rot < time)
{
@ -1175,7 +1036,6 @@ void() CheckPowerups =
self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR2;
}
// - POX
// invisibility
if (self.invisible_finished)
{
@ -1185,8 +1045,6 @@ void() CheckPowerups =
sound (self, CHAN_AUTO, "items/inv3.wav", 0.5, ATTN_IDLE);
self.invisible_sound = time + ((random() * 3) + 1);
}
if (self.invisible_finished < time + 3)
{
if (self.invisible_time == 1)
@ -1203,7 +1061,6 @@ void() CheckPowerups =
stuffcmd (self, "bf\n");
}
}
if (self.invisible_finished < time)
{ // just stopped
self.items = self.items - IT_INVISIBILITY;
@ -1217,7 +1074,6 @@ void() CheckPowerups =
}
else
self.modelindex = modelindex_player; // don't use eyes
// invincibility
if (self.invincible_finished)
{
@ -1257,13 +1113,10 @@ void() CheckPowerups =
self.effects = self.effects - (self.effects & EF_RED);
}
}
// super damage
if (self.super_damage_finished)
{
// sound and screen flash when items starts to run out
if (self.super_damage_finished < time + 3)
{
if (self.super_time == 1)
@ -1283,7 +1136,6 @@ void() CheckPowerups =
stuffcmd (self, "bf\n");
}
}
if (self.super_damage_finished < time)
{ // just stopped
self.items = self.items - IT_QUAD;
@ -1309,12 +1161,10 @@ void() CheckPowerups =
self.effects = self.effects - (self.effects & EF_BLUE);
}
}
// suit
if (self.radsuit_finished)
{
self.air_finished = time + 12; // don't drown
// sound and screen flash when items starts to run out
if (self.radsuit_finished < time + 3)
{
@ -1332,7 +1182,6 @@ void() CheckPowerups =
stuffcmd (self, "bf\n");
}
}
if (self.radsuit_finished < time)
{ // just stopped
self.items = self.items - IT_SUIT;
@ -1340,13 +1189,10 @@ void() CheckPowerups =
self.radsuit_finished = 0;
}
}
};
//POX v1.2 - PlayerRegen - for better handling of regen staion touch
.float armregen;
.float regen_finished;
void() PlayerRegen =
{
local float type, bit;
@ -1357,13 +1203,11 @@ local string snd;
self.regen_finished = time;
return; // already have max armour that station can give
}
self.armorvalue = self.armorvalue + 3;
//Cap armour
if (self.armorvalue > self.armregen)
self.armorvalue = self.armregen;
if (self.armorvalue > 150) //Equivlent to Red (level 3) Armour
{
type = 0.8;
@ -1396,13 +1240,10 @@ local string snd;
//POX - 1.01b - Don't allow armour to rot while recharging
self.armor_rot = time + 5;
};
/*
================
PlayerPostThink
Called every frame after physics are run
================
*/
@ -1421,7 +1262,6 @@ void() PlayerPostThink =
self.cshift_off = TRUE;
}
}
if (self.view_ofs == '0 0 0')
return; // intermission or finale
@ -1459,7 +1299,6 @@ void() PlayerPostThink =
else
sound (self, CHAN_VOICE, "player/land.wav", 1, ATTN_NORM);
}
self.jump_flag = self.velocity_z;
//POX v1.2 - better regen touch handling
@ -1467,22 +1306,16 @@ void() PlayerPostThink =
PlayerRegen ();
CheckPowerups ();
W_WeaponFrame ();
};
/*
===========
ClientConnect
called when a player connects to a server
============
*/
void() ClientConnect =
{
// + POX - I hard coded some environmental changes to prevent tampering....
// NOTE: autoexec.cfg is called at DecodeLevelParms (QW ignores it when called from quake.rc - which is also ignored)
// POX v1.12 added 'fov 90' (mostly for lms_observer additions)
@ -1491,7 +1324,6 @@ void() ClientConnect =
//POX v1.12 - why bother...
//sprint (self, PRINT_HIGH, "\n\n---------------\nPOXworld v1.11b\n---------------\n\n");
// + POX LMS late joiners get booted to spectate
if (!(deathmatch & DM_LMS))
{
@ -1532,17 +1364,13 @@ void() ClientConnect =
}
// a client connecting during an intermission can cause problems
if (intermission_running)
GotoNextMap ();
};
/*
===========
ClientDisconnect
called when a player disconnects from a server
============
*/
@ -1554,7 +1382,6 @@ void() ClientDisconnect =
bprint (PRINT_HIGH, ftos(self.frags));
bprint (PRINT_HIGH, " frags\n");
sound (self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE);
// + POX
if ((deathmatch & DM_LMS) && (self.LMS_registered))
{
@ -1567,21 +1394,17 @@ void() ClientDisconnect =
set_suicide_frame ();
};
/*
===========
ClientObituary
called when a player dies
============
*/
void(entity targ, entity attacker) ClientObituary =
{
local float rnum;
local string deathstring, deathstring2;
local string attackerteam, targteam;
rnum = random();
//ZOID 12-13-96: self.team doesn't work in QW. Use keys
attackerteam = infokey(attacker, "team");
@ -1605,7 +1428,6 @@ void(entity targ, entity attacker) ClientObituary =
if (lms_plrcount <= 1) //1 or no players left so end the game
lms_gameover = TRUE;//POX v1.2 - Check this in CheckRules (so frag logging is still done)
//Put'em into LMS observer mode at next spawn
//POX v1.12 - fixed a stupid overlook on my part - said 'self.' (!?)
targ.frags = 0;
@ -1618,7 +1440,6 @@ void(entity targ, entity attacker) ClientObituary =
if (targ.classname == "player")
{
/*if (deathmatch > 3)
{
if (targ.deathtype == "selfwater")
@ -1629,7 +1450,6 @@ void(entity targ, entity attacker) ClientObituary =
return;
}
}*/
if (attacker.classname == "teledeath")
{
bprint (PRINT_MEDIUM,targ.netname);
@ -1644,7 +1464,6 @@ void(entity targ, entity attacker) ClientObituary =
return;
}
if (attacker.classname == "teledeath2")
{
bprint (PRINT_MEDIUM,"MegaSheild's power deflects ");
@ -1655,10 +1474,8 @@ void(entity targ, entity attacker) ClientObituary =
if (!(deathmatch & DM_LMS)) //POX 1.2 - do regular obituary taunts in LMS mode
targ.frags = targ.frags - 1;
return;
}
// double 666 telefrag (can happen often in deathmatch 4)
if (attacker.classname == "teledeath3")
{
@ -1671,11 +1488,9 @@ void(entity targ, entity attacker) ClientObituary =
if (!(deathmatch & DM_LMS)) //POX 1.2 - do regular obituary taunts in LMS mode
targ.frags = targ.frags - 1;
return;
}
if (targ.deathtype == "squish")
{
if (teamplay && targteam == attackerteam && attackerteam != "" && targ != attacker)
@ -1715,7 +1530,6 @@ void(entity targ, entity attacker) ClientObituary =
return;
}
}
if (attacker.classname == "player")
{
if (targ == attacker)
@ -1762,7 +1576,6 @@ void(entity targ, entity attacker) ClientObituary =
if (!(deathmatch & DM_LMS)) //POX 1.2 - do regular obituary taunts in LMS mode
attacker.frags = attacker.frags - 1;
return;
}
else
@ -1898,9 +1711,7 @@ void(entity targ, entity attacker) ClientObituary =
if (!(deathmatch & DM_LMS)) //POX 1.2 - do regular obituary taunts in LMS mode
targ.frags = targ.frags - 1; // killed self
rnum = targ.watertype;
bprint (PRINT_MEDIUM,targ.netname);
if (rnum == -3)
{
@ -1962,7 +1773,6 @@ void(entity targ, entity attacker) ClientObituary =
bprint (PRINT_MEDIUM," tried to leave\n");
return;
}
bprint (PRINT_MEDIUM," died\n");
}
}

View file

@ -3,17 +3,13 @@ void() T_MissileTouch;
void() info_player_start;
void(entity targ, entity attacker) ClientObituary;
void(entity inflictor, entity attacker, float damage, entity ignore, string dtype) T_RadiusDamage;
/*SERVER
void() monster_death_use;
*/
//============================================================================
/*
============
CanDamage
Returns true if the inflictor can directly damage the target. Used for
explosions and melee attacks.
============
@ -46,11 +42,8 @@ float(entity targ, entity inflictor) CanDamage =
traceline(inflictor.origin, targ.origin + '15 -15 0', TRUE, self);
if (trace_fraction == 1)
return TRUE;
return FALSE;
};
/*
============
Killed
@ -59,35 +52,29 @@ Killed
void(entity targ, entity attacker) Killed =
{
local entity oself;
oself = self;
self = targ;
if (self.health < -99)
self.health = -99; // don't let sbar look bad if a player
if (self.movetype == MOVETYPE_PUSH || self.movetype == MOVETYPE_NONE)
{ // doors, triggers, etc
self.th_die ();
self = oself;
return;
}
self.enemy = attacker;
// bump the monster counter
if (self.flags & FL_MONSTER)
{
killed_monsters = killed_monsters + 1;
WriteByte (MSG_ALL, SVC_KILLEDMONSTER);
}
ClientObituary(self, attacker);
self.takedamage = DAMAGE_NO;
self.touch = SUB_Null;
self.effects = 0;
/*SERVER
monster_death_use();
*/
@ -95,12 +82,9 @@ void(entity targ, entity attacker) Killed =
self = oself;
};
/*
============
T_Damage
The damage is coming from inflictor, but get mad at attacker
This should be the only function that ever reduces health.
============
@ -112,22 +96,16 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
local float save;
local float take;
local string attackerteam, targteam;
if (!targ.takedamage)
return;
// used by buttons and triggers to set activator for target firing
damage_attacker = attacker;
// check for quad damage powerup on the attacker
if (attacker.super_damage_finished > time && inflictor.classname != "door")
if (deathmatch == 4)
damage = damage * 8;
else
damage = damage * 4;
//POX - this was moved from below the armour save routines to above so armour isn't lost
// check for godmode or invincibility
if (targ.flags & FL_GODMODE)
@ -141,9 +119,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
}
return;
}
// save damage based on the target's armor level
save = ceil(targ.armortype*damage);
if (save >= targ.armorvalue)
{
@ -153,7 +129,6 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
}
targ.armorvalue = targ.armorvalue - save;
// POX - Armour Stuff to dynamically change the type along with the value
if (targ.armorvalue > 150)
{
@ -174,7 +149,6 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
}
take = ceil(damage-save);
// add to the damage total for clients, which will be sent as a single
// message at the end of the frame
// FIXME: remove after combining shotgun blasts?
@ -184,10 +158,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
targ.dmg_save = targ.dmg_save + save;
targ.dmg_inflictor = inflictor;
}
damage_inflictor = inflictor;
// figure momentum add
if ( (inflictor != world) && (targ.movetype == MOVETYPE_WALK) )
{
@ -205,20 +176,15 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
// Rocket Jump modifiers
if ( (rj > 1) & ((attacker.classname == "player") & (targ.classname == "player")) & ( attacker.netname == targ.netname))
targ.velocity = targ.velocity + dir * damage * rj;
}
// team play damage avoidance
//ZOID 12-13-96: self.team doesn't work in QW. Use keys
attackerteam = infokey(attacker, "team");
targteam = infokey(targ, "team");
if ((teamplay == 1) && (targteam == attackerteam) &&
(attacker.classname == "player") && (attackerteam != "") &&
inflictor.classname !="door")
return;
if ((teamplay == 3) && (targteam == attackerteam) &&
(attacker.classname == "player") && (attackerteam != "") &&
(targ != attacker)&& inflictor.classname !="door")
@ -226,17 +192,14 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
// do the damage
targ.health = targ.health - take;
if (targ.health <= 0)
{
Killed (targ, attacker);
return;
}
// react to the damage
oldself = self;
self = targ;
/*SERVER
if ( (self.flags & FL_MONSTER) && attacker != world)
{
@ -258,10 +221,8 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
{
self.th_pain (attacker, take);
}
self = oldself;
};
/*
============
T_RadiusDamage
@ -272,7 +233,6 @@ void(entity inflictor, entity attacker, float damage, entity ignore, string dtyp
local float points;
local entity head;
local vector org;
head = findradius(inflictor.origin, damage+40);
while (head)
@ -307,7 +267,6 @@ void(entity inflictor, entity attacker, float damage, entity ignore, string dtyp
head = head.chain;
}
};
/*
============
T_BeamDamage
@ -339,4 +298,3 @@ void(entity attacker, float damage) T_BeamDamage =
head = head.chain;
}
};

View file

@ -4,36 +4,26 @@ float DOOR_DONT_LINK = 4;
float DOOR_GOLD_KEY = 8;
float DOOR_SILVER_KEY = 16;
float DOOR_TOGGLE = 32;
/*
Doors are similar to buttons, but can spawn a fat trigger field around them
to open without a touch, and they link together to form simultanious
double/quad doors.
Door.owner is the master door. If there is only one door, it points to itself.
If multiple doors, all will point to a single one.
Door.enemy chains from the master door through all doors linked in the chain.
*/
/*
=============================================================================
THINK FUNCTIONS
=============================================================================
*/
void() door_go_down;
void() door_go_up;
void() door_blocked =
{
other.deathtype = "squish";
T_Damage (other, self, self.goalentity, self.dmg);
// if a door has a negative wait, it would never come back if blocked,
// so let it just squash the object to death real fast
if (self.wait >= 0)
@ -44,8 +34,6 @@ void() door_blocked =
door_go_down ();
}
};
void() door_hit_top =
{
sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM);
@ -55,13 +43,11 @@ void() door_hit_top =
self.think = door_go_down;
self.nextthink = self.ltime + self.wait;
};
void() door_hit_bottom =
{
sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM);
self.state = STATE_BOTTOM;
};
void() door_go_down =
{
sound (self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
@ -74,12 +60,10 @@ void() door_go_down =
self.state = STATE_DOWN;
SUB_CalcMove (self.pos1, self.speed, door_hit_bottom);
};
void() door_go_up =
{
if (self.state == STATE_UP)
return; // allready going up
if (self.state == STATE_TOP)
{ // reset top wait time
self.nextthink = self.ltime + self.wait;
@ -89,35 +73,24 @@ void() door_go_up =
sound (self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
self.state = STATE_UP;
SUB_CalcMove (self.pos2, self.speed, door_hit_top);
SUB_UseTargets();
};
/*
=============================================================================
ACTIVATION FUNCTIONS
=============================================================================
*/
void() door_fire =
{
local entity oself;
local entity starte;
if (self.owner != self)
objerror ("door_fire: self.owner != self");
// play use key sound
if (self.items)
sound (self, CHAN_VOICE, self.noise4, 1, ATTN_NORM);
self.message = string_null; // no more message
oself = self;
if (self.spawnflags & DOOR_TOGGLE)
{
if (self.state == STATE_UP || self.state == STATE_TOP)
@ -144,39 +117,28 @@ void() door_fire =
} while ( (self != starte) && (self != world) );
self = oself;
};
void() door_use =
{
local entity oself;
self.message = ""; // door message are for touch only
self.owner.message = "";
self.enemy.message = "";
oself = self;
self = self.owner;
door_fire ();
self = oself;
};
void() door_trigger_touch =
{
if (other.health <= 0)
return;
if (time < self.attack_finished)
return;
self.attack_finished = time + 1;
activator = other;
self = self.owner;
door_use ();
};
void() door_killed =
{
local entity oself;
@ -188,12 +150,9 @@ void() door_killed =
door_use ();
self = oself;
};
/*
================
door_touch
Prints messages and opens key doors
================
*/
@ -203,9 +162,7 @@ void() door_touch =
return;
if (self.owner.attack_finished > time)
return;
self.owner.attack_finished = time + 2;
if (self.owner.message != "")
{
self.target_id_finished = time + 4;//POX don't let TargetID override centerprints
@ -216,7 +173,6 @@ void() door_touch =
// key door stuff
if (!self.items)
return;
// FIXME: blink key on player's status bar
if ( (self.items & other.items) != self.items )
{
@ -260,41 +216,31 @@ void() door_touch =
}
return;
}
other.items = other.items - self.items;
self.touch = SUB_Null;
if (self.enemy)
self.enemy.touch = SUB_Null; // get paired door
door_use ();
};
/*
=============================================================================
SPAWNING FUNCTIONS
=============================================================================
*/
entity(vector fmins, vector fmaxs) spawn_field =
{
local entity trigger;
local vector t1, t2;
trigger = spawn();
trigger.movetype = MOVETYPE_NONE;
trigger.solid = SOLID_TRIGGER;
trigger.owner = self;
trigger.touch = door_trigger_touch;
t1 = fmins;
t2 = fmaxs;
setsize (trigger, t1 - '60 60 8', t2 + '60 60 8');
return (trigger);
};
float (entity e1, entity e2) EntitiesTouching =
{
if (e1.mins_x > e2.maxs_x)
@ -311,20 +257,15 @@ float (entity e1, entity e2) EntitiesTouching =
return FALSE;
return TRUE;
};
/*
=============
LinkDoors
=============
*/
void() LinkDoors =
{
local entity t, starte;
local vector cmins, cmaxs;
if (self.enemy)
return; // already linked by another door
if (self.spawnflags & 4)
@ -332,7 +273,6 @@ void() LinkDoors =
self.owner = self.enemy = self;
return; // don't want to link this door
}
cmins = self.mins;
cmaxs = self.maxs;
@ -342,36 +282,29 @@ void() LinkDoors =
do
{
self.owner = starte; // master door
if (self.health)
starte.health = self.health;
if (self.targetname)
starte.targetname = self.targetname;
if (self.message != "")
starte.message = self.message;
t = find (t, classname, self.classname);
if (!t)
{
self.enemy = starte; // make the chain a loop
// shootable, fired, or key doors just needed the owner/enemy links,
// they don't spawn a field
self = self.owner;
if (self.health)
return;
if (self.targetname)
return;
if (self.items)
return;
self.owner.trigger_field = spawn_field(cmins, cmaxs);
return;
}
if (EntitiesTouching(self,t))
{
if (t.enemy)
@ -379,7 +312,6 @@ void() LinkDoors =
self.enemy = t;
self = t;
if (t.mins_x < cmins_x)
cmins_x = t.mins_x;
if (t.mins_y < cmins_y)
@ -394,19 +326,12 @@ void() LinkDoors =
cmaxs_z = t.maxs_z;
}
} while (1 );
};
/*QUAKED func_door (0 .5 .8) ? START_OPEN x DOOR_DONT_LINK GOLD_KEY SILVER_KEY TOGGLE
if two doors touch, they are assumed to be connected and operate as a unit.
TOGGLE causes the door to wait in both the start and end states for a trigger event.
START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors).
Key doors are allways wait -1.
"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet
"angle" determines the opening direction
"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door.
@ -422,11 +347,8 @@ Key doors are allways wait -1.
3) stone chain
4) screechy metal
*/
void() func_door =
{
if (world.worldtype == 0)
{
precache_sound ("doors/medtry.wav");
@ -487,17 +409,13 @@ void() func_door =
self.noise1 = "doors/ddoor2.wav";
self.noise2 = "doors/ddoor1.wav";
}
SetMovedir ();
self.max_health = self.health;
self.solid = SOLID_BSP;
self.movetype = MOVETYPE_PUSH;
setorigin (self, self.origin);
setmodel (self, self.model);
self.classname = "door";
self.blocked = door_blocked;
self.use = door_use;
@ -514,10 +432,8 @@ void() func_door =
self.lip = 8;
if (!self.dmg)
self.dmg = 2;
self.pos1 = self.origin;
self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip);
// DOOR_START_OPEN is to allow an entity to be lighted in the closed position
// but spawn in the open position
if (self.spawnflags & DOOR_START_OPEN)
@ -526,9 +442,7 @@ void() func_door =
self.pos2 = self.pos1;
self.pos1 = self.origin;
}
self.state = STATE_BOTTOM;
if (self.health)
{
self.takedamage = DAMAGE_YES;
@ -539,21 +453,16 @@ void() func_door =
self.wait = -1;
self.touch = door_touch;
// LinkDoors can't be done until all of the doors have been spawned, so
// the sizes can be detected properly.
self.think = LinkDoors;
self.nextthink = self.ltime + 0.1;
};
/*
=============================================================================
SECRET DOORS
=============================================================================
*/
void() fd_secret_move1;
void() fd_secret_move2;
void() fd_secret_move3;
@ -561,26 +470,21 @@ void() fd_secret_move4;
void() fd_secret_move5;
void() fd_secret_move6;
void() fd_secret_done;
float SECRET_OPEN_ONCE = 1; // stays open
float SECRET_1ST_LEFT = 2; // 1st move is left of arrow
float SECRET_1ST_DOWN = 4; // 1st move is down from arrow
float SECRET_NO_SHOOT = 8; // only opened by trigger
float SECRET_YES_SHOOT = 16; // shootable even if targeted
void () fd_secret_use =
{
local float temp;
self.health = 10000;
// exit if still moving around...
if (self.origin != self.oldorigin)
return;
self.message = string_null; // no more message
SUB_UseTargets(); // fire all targets / killtargets
if (!(self.spawnflags & SECRET_NO_SHOOT))
@ -589,12 +493,10 @@ void () fd_secret_use =
self.takedamage = DAMAGE_NO;
}
self.velocity = '0 0 0';
// Make a sound, wait a little...
sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
self.nextthink = self.ltime + 0.1;
temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1
makevectors(self.mangle);
@ -608,7 +510,6 @@ void () fd_secret_use =
if (!self.t_length)
self. t_length = fabs(v_forward * self.size);
if (self.spawnflags & SECRET_1ST_DOWN)
self.dest1 = self.origin - v_up * self.t_width;
else
@ -618,12 +519,10 @@ void () fd_secret_use =
SUB_CalcMove(self.dest1, self.speed, fd_secret_move1);
sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
};
void (entity attacker, float damage) fd_secret_pain =
{
fd_secret_use ();
};
// Wait after first movement...
void () fd_secret_move1 =
{
@ -631,14 +530,12 @@ void () fd_secret_move1 =
self.think = fd_secret_move2;
sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
};
// Start moving sideways w/sound...
void () fd_secret_move2 =
{
sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
SUB_CalcMove(self.dest2, self.speed, fd_secret_move3);
};
// Wait here until time to go back...
void () fd_secret_move3 =
{
@ -649,14 +546,12 @@ void () fd_secret_move3 =
self.think = fd_secret_move4;
}
};
// Move backward...
void () fd_secret_move4 =
{
sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
SUB_CalcMove(self.dest1, self.speed, fd_secret_move5);
};
// Wait 1 second...
void () fd_secret_move5 =
{
@ -664,13 +559,11 @@ void () fd_secret_move5 =
self.think = fd_secret_move6;
sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
};
void () fd_secret_move6 =
{
sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done);
};
void () fd_secret_done =
{
if (!self.targetname || self.spawnflags&SECRET_YES_SHOOT)
@ -682,7 +575,6 @@ void () fd_secret_done =
}
sound(self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise3, 1, ATTN_NORM);
};
void () secret_blocked =
{
if (time < self.attack_finished)
@ -691,11 +583,9 @@ void () secret_blocked =
other.deathtype = "squish";
T_Damage (other, self, self, self.dmg);
};
/*
================
secret_touch
Prints messages
================
*/
@ -705,7 +595,6 @@ void() secret_touch =
return;
if (self.attack_finished > time)
return;
self.attack_finished = time + 2;
if (self.message)
@ -716,8 +605,6 @@ void() secret_touch =
sound (other, CHAN_BODY, "misc/talk.wav", 1, ATTN_NORM);
}
};
/*QUAKED func_door_secret (0 .5 .8) ? open_once 1st_left 1st_down no_shoot always_shoot
Basic secret door. Slides back, then to the side. Angle determines direction.
wait = # of seconds before coming back
@ -727,14 +614,12 @@ always_shoot = even if targeted, keep shootable
t_width = override WIDTH to move back (or height if going down)
t_length = override LENGTH to move sideways
"dmg" damage to inflict when blocked (2 default)
If a secret door has a targetname, it will only be opened by it's botton or trigger, not by damage.
"sounds"
1) medieval
2) metal
3) base
*/
void () func_door_secret =
{
if (self.sounds == 0)
@ -764,7 +649,6 @@ void () func_door_secret =
self.noise1 = "doors/basesec2.wav";
self.noise3 = "doors/basesec2.wav";
}
if (!self.dmg)
self.dmg = 2;

View file

@ -1,7 +1,6 @@
/*
Frank Condello 09.28.98 - originally for the M.A.H.E.M. MacQuake Mod.
Now used in paroxysm
EMAIL: pox@planetquake.com
WEB: http://www.planetquake.com/paroxysm/
=========================================================================
@ -19,7 +18,6 @@ Dynamic Light can also be triggered, They currenty only start turned off.
.float dynlight_style;
void() dynlight_next;
void() dynlight_find;
void() start_dynlight =
{
//POX v1.1 - changed this for QW support
@ -39,7 +37,6 @@ void() start_dynlight =
dynlight_next();
};
void() dynlight_wait =
{
if (self.wait)
@ -49,11 +46,9 @@ void() dynlight_wait =
self.think = dynlight_next;
};
void() dynlight_next =
{
local entity targ;
targ = find (world, targetname, self.target);
self.target = targ.target;
if (!self.target)
@ -64,12 +59,9 @@ void() dynlight_next =
self.wait = 0;
SUB_CalcMove (targ.origin - self.mins, self.speed, dynlight_wait);
};
void() dynlight_find =
{
local entity targ;
targ = find (world, targetname, self.target);
self.target = targ.target;
setorigin (self, targ.origin - self.mins);
@ -79,20 +71,15 @@ void() dynlight_find =
self.think = start_dynlight;
}
};
void() dynlight_use =
{
if (self.think != dynlight_find)
return; // already activated
start_dynlight();
};
void() dyn_light =
{
precache_model ("progs/null.spr");
if (!self.speed)
self.speed = 100;
@ -107,7 +94,6 @@ void() dyn_light =
setmodel (self, "progs/null.spr");
setsize (self, '0 0 0', '0 0 0');
setorigin (self, self.origin);
// start trains on the second frame, to make sure their targets have had
// a chance to spawn
self.nextthink = self.ltime + 0.1;

View file

@ -1,39 +1,29 @@
/*
POX - Flashlight code from the Flashlight Tutorial at the Inside3D website <http://www.inside3d.com>
Created by ShockMan eMail: shockman@brutality.com
Added an entity attribute to the spawn function for bot support (since self is only the bot at respwan)
*/
void() flash_update =
{
// The Player is dead so turn the Flashlight off
if (self.owner.deadflag != DEAD_NO)
self.effects = 0;
// The Player is alive so turn On the Flashlight
else
self.effects = EF_DIMLIGHT;
// Find out which direction player facing
makevectors (self.owner.v_angle);
// Check if there is any things infront of the flashlight
traceline (self.owner.origin , (self.owner.origin+(v_forward * 500)) , FALSE , self);
// Set the Flashlight's position
setorigin (self, trace_endpos+(v_forward * -5));
// Repeat it in 0.02 seconds...
self.nextthink = time + 0.02;
};
void(entity me) flash_on =
{
// Make a new entity to hold the Flashlight
local entity myflash;
// spawn flash
myflash = spawn ();
myflash.movetype = MOVETYPE_NONE;
@ -45,7 +35,6 @@ void(entity me) flash_on =
//POX - changed it to a null sprite
setmodel (myflash, "progs/null.spr");
setsize (myflash, '0 0 0', '0 0 0');
// Wire Player And Flashlight Together
myflash.owner = me;
me.flash = myflash;
@ -58,14 +47,13 @@ void(entity me) flash_on =
makevectors (self.v_angle);
traceline (self.origin , (self.origin+(v_forward * 500)) , FALSE , self);
setorigin (myflash, trace_endpos);
// Start Flashlight Update
myflash.think = flash_update;
myflash.nextthink = time + 0.02;
};
//POX - the user toggle is not implemented (auto light for Darkmode only)
/*
void () flash_toggle =
{
// If Off, Turn On
@ -74,7 +62,6 @@ void () flash_toggle =
self.flash_flag = TRUE;
flash_on();
}
// If On, Turn Off
else
{
@ -84,5 +71,5 @@ void () flash_toggle =
self.flash.nextthink = time + 0.1;
}
};
*/
*/

View file

@ -4,10 +4,8 @@
All rights reserved.
Do not distribute.
*/
//----------------------------------------------------------------------------------------------
// 12/29/98 Combined all functions neccessary for rotating objects from Hips QW source
.vector neworigin;
.vector rotate;
.float endtime;
@ -16,12 +14,10 @@
.string path;
.string group;
.string event;
void() RotateTargets;
void() RotateTargetsFinal;
void() SetTargetOrigin;
void() LinkRotateTargets;
void( entity ent, float amount ) hurt_setdamage =
{
ent.dmg = amount;
@ -35,7 +31,6 @@ void( entity ent, float amount ) hurt_setdamage =
}
ent.nextthink = -1;
};
vector ( vector ang ) SUB_NormalizeAngles =
{
while( ang_x > 360 )
@ -46,7 +41,6 @@ vector ( vector ang ) SUB_NormalizeAngles =
{
ang_x = ang_x + 360;
}
while( ang_y > 360 )
{
ang_y = ang_y - 360;
@ -55,7 +49,6 @@ vector ( vector ang ) SUB_NormalizeAngles =
{
ang_y = ang_y + 360;
}
while( ang_z > 360 )
{
ang_z = ang_z - 360;
@ -64,35 +57,28 @@ vector ( vector ang ) SUB_NormalizeAngles =
{
ang_z = ang_z + 360;
}
return ang;
};
//----------------------------------------------------------------------------------------------
// Start Rotate code
float STATE_ACTIVE = 0;
float STATE_INACTIVE = 1;
float STATE_SPEEDINGUP = 2;
float STATE_SLOWINGDOWN = 3;
float STATE_CLOSED = 4;
float STATE_OPEN = 5;
float STATE_OPENING = 6;
float STATE_CLOSING = 7;
float STATE_WAIT = 0;
float STATE_MOVE = 1;
float STATE_STOP = 2;
float STATE_FIND = 3;
float STATE_NEXT = 4;
float OBJECT_ROTATE = 0;
float OBJECT_MOVEWALL = 1;
float OBJECT_SETORIGIN = 2;
float TOGGLE = 1;
float START_ON = 2;
float ROTATION = 1;
float ANGLES = 2;
float STOP = 4;
@ -100,13 +86,10 @@ float NO_ROTATE = 8;
float DAMAGE = 16;
float MOVETIME = 32;
float SET_DAMAGE = 64;
float VISIBLE = 1;
float TOUCH = 2;
float NONBLOCKING = 4;
float STAYOPEN = 1;
/*QUAKED info_rotate (0 0.5 0) (-4 -4 -4) (4 4 4)
Used as the point of rotation for rotatable objects.
*/
@ -117,7 +100,6 @@ void() info_rotate =
self.nextthink = time + 2;
self.think = SUB_Remove;
};
void() RotateTargets =
{
local entity ent;
@ -125,9 +107,7 @@ void() RotateTargets =
local vector vy;
local vector vz;
local vector org;
makevectors (self.angles);
ent = find( world, targetname, self.target);
while( ent )
{
@ -166,11 +146,9 @@ void() RotateTargets =
ent = find( ent, targetname, self.target);
}
};
void() RotateTargetsFinal =
{
local entity ent;
ent = find( world, targetname, self.target);
while( ent )
{
@ -182,11 +160,9 @@ void() RotateTargetsFinal =
ent = find( ent, targetname, self.target);
}
};
void() SetTargetOrigin =
{
local entity ent;
ent = find( world, targetname, self.target);
while( ent )
{
@ -202,12 +178,10 @@ void() SetTargetOrigin =
ent = find( ent, targetname, self.target);
}
};
void() LinkRotateTargets =
{
local entity ent;
local vector tempvec;
self.oldorigin = self.origin;
ent = find( world, targetname, self.target);
while( ent )
@ -236,11 +210,9 @@ void() LinkRotateTargets =
ent = find (ent, targetname, self.target);
}
};
void( float amount ) SetDamageOnTargets =
{
local entity ent;
ent = find( world, targetname, self.target);
while( ent )
{
@ -255,21 +227,16 @@ void( float amount ) SetDamageOnTargets =
ent = find( ent, targetname, self.target);
}
};
//************************************************
//
// Simple continual rotatation
//
//************************************************
void() rotate_entity_think =
{
local float t;
t = time - self.ltime;
self.ltime = time;
if ( self.state == STATE_SPEEDINGUP )
{
self.count = self.count + self.cnt * t;
@ -277,7 +244,6 @@ void() rotate_entity_think =
{
self.count = 1;
}
// get rate of rotation
t = t * self.count;
}
@ -291,22 +257,18 @@ void() rotate_entity_think =
self.think = SUB_Null;
return;
}
// get rate of rotation
t = t * self.count;
}
self.angles = self.angles + ( self.rotate * t );
self.angles = SUB_NormalizeAngles( self.angles );
RotateTargets();
self.nextthink = time + 0.02;
};
void() rotate_entity_use =
{
// change to alternate textures
self.frame = 1 - self.frame;
if ( self.state == STATE_ACTIVE )
{
if ( self.spawnflags & TOGGLE )
@ -350,7 +312,6 @@ void() rotate_entity_use =
self.state = STATE_SPEEDINGUP;
}
};
void() rotate_entity_firstthink =
{
LinkRotateTargets();
@ -368,63 +329,44 @@ void() rotate_entity_firstthink =
}
self.use = rotate_entity_use;
};
/*QUAKED func_rotate_entity (0 .5 .8) (-8 -8 -8) (8 8 8) TOGGLE START_ON
Creates an entity that continually rotates. Can be toggled on and
off if targeted.
TOGGLE = allows the rotation to be toggled on/off
START_ON = wether the entity is spinning when spawned. If TOGGLE is 0, entity can be turned on, but not off.
If "deathtype" is set with a string, this is the message that will appear when a player is killed by the train.
"rotate" is the rate to rotate.
"target" is the center of rotation.
"speed" is how long the entity takes to go from standing still to full speed and vice-versa.
*/
void() func_rotate_entity =
{
self.solid = SOLID_NOT;
self.movetype = MOVETYPE_NONE;
setmodel (self, self.model);
setsize( self, self.mins, self.maxs );
if ( self.speed != 0 )
{
self.cnt = 1 / self.speed;
}
self.think = rotate_entity_firstthink;
self.nextthink = time + 0.1;
self.ltime = time;
};
//************************************************
//
// Train with rotation functionality
//
//************************************************
/*QUAKED path_rotate (0.5 0.3 0) (-8 -8 -8) (8 8 8) ROTATION ANGLES STOP NO_ROTATE DAMAGE MOVETIME SET_DAMAGE
Path for rotate_train.
ROTATION tells train to rotate at rate specified by "rotate". Use '0 0 0' to stop rotation.
ANGLES tells train to rotate to the angles specified by "angles" while traveling to this path_rotate. Use values < 0 or > 360 to guarantee that it turns in a certain direction. Having this flag set automatically clears any rotation.
STOP tells the train to stop and wait to be retriggered.
NO_ROTATE tells the train to stop rotating when waiting to be triggered.
DAMAGE tells the train to cause damage based on "dmg".
MOVETIME tells the train to interpret "speed" as the length of time to take moving from one corner to another.
SET_DAMAGE tells the train to set all targets damage to "dmg"
"noise" contains the name of the sound to play when train stops.
"noise1" contains the name of the sound to play when train moves.
"event" is a target to trigger when train arrives at path_rotate.
@ -440,20 +382,15 @@ void() path_rotate =
precache_sound( self.noise1 );
}
};
void() rotate_train;
void() rotate_train_next;
void() rotate_train_find;
void() rotate_train_think =
{
local float t;
local float timeelapsed;
t = time - self.ltime;
self.ltime = time;
if ( ( self.endtime ) && ( time >= self.endtime ) )
{
self.endtime = 0;
@ -462,7 +399,6 @@ void() rotate_train_think =
setorigin(self, self.finaldest);
self.velocity = '0 0 0';
}
if (self.think1)
self.think1();
}
@ -473,14 +409,11 @@ void() rotate_train_think =
timeelapsed = 1;
setorigin( self, self.dest1 + ( self.dest2 * timeelapsed ) );
}
self.angles = self.angles + ( self.rotate * t );
self.angles = SUB_NormalizeAngles( self.angles );
RotateTargets();
self.nextthink = time + 0.02;
};
void() rotate_train_use =
{
if (self.think1 != rotate_train_find)
@ -493,11 +426,9 @@ void() rotate_train_use =
}
}
};
void() rotate_train_wait =
{
self.state = STATE_WAIT;
if ( self.goalentity.noise )
{
sound (self, CHAN_VOICE, self.goalentity.noise, 1, ATTN_NORM);
@ -518,11 +449,9 @@ void() rotate_train_wait =
self.endtime = self.ltime + self.goalentity.wait;
self.think1 = rotate_train_next;
};
void() rotate_train_stop =
{
self.state = STATE_STOP;
if ( self.goalentity.noise )
{
sound (self, CHAN_VOICE, self.goalentity.noise, 1, ATTN_NORM);
@ -540,11 +469,9 @@ void() rotate_train_stop =
{
self.rotate = '0 0 0';
}
self.dmg = 0;
self.think1 = rotate_train_next;
};
void() rotate_train_next =
{
local entity targ;
@ -552,25 +479,20 @@ void() rotate_train_next =
local vector vdestdelta;
local float len, traveltime, div;
local string temp;
self.state = STATE_NEXT;
current = self.goalentity;
targ = find (world, targetname, self.path );
if ( targ.classname != "path_rotate" )
objerror( "Next target is not path_rotate" );
if ( self.goalentity.noise1 )
{
self.noise1 = self.goalentity.noise1;
}
sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
self.goalentity = targ;
self.path = targ.target;
if (!self.path )
objerror ("rotate_train_next: no next target");
if ( targ.spawnflags & STOP )
{
self.think1 = rotate_train_stop;
@ -583,7 +505,6 @@ void() rotate_train_next =
{
self.think1 = rotate_train_next;
}
if ( current.event )
{
// Trigger any events that should happen at the corner.
@ -594,40 +515,33 @@ void() rotate_train_next =
self.target = temp;
self.message = string_null;
}
if ( current.spawnflags & ANGLES )
{
self.rotate = '0 0 0';
self.angles = self.finalangle;
}
if ( current.spawnflags & ROTATION )
{
self.rotate = current.rotate;
}
if ( current.spawnflags & DAMAGE )
{
self.dmg = current.dmg;
}
if ( current.spawnflags & SET_DAMAGE )
{
SetDamageOnTargets( current.dmg );
}
if ( current.speed == -1 )
{
// Warp to the next path_corner
setorigin( self, targ.origin );
self.endtime = self.ltime + 0.01;
SetTargetOrigin();
if ( targ.spawnflags & ANGLES )
{
self.angles = targ.angles;
}
self.duration = 1; // 1 / duration
self.cnt = time; // start time
self.dest2 = '0 0 0'; // delta
@ -637,13 +551,11 @@ void() rotate_train_next =
else
{
self.state = STATE_MOVE;
self.finaldest = targ.origin;
if (self.finaldest == self.origin)
{
self.velocity = '0 0 0';
self.endtime = self.ltime + 0.1;
self.duration = 1; // 1 / duration
self.cnt = time; // start time
self.dest2 = '0 0 0'; // delta
@ -653,10 +565,8 @@ void() rotate_train_next =
}
// set destdelta to the vector needed to move
vdestdelta = self.finaldest - self.origin;
// calculate length of vector
len = vlen (vdestdelta);
if ( current.spawnflags & MOVETIME )
{
traveltime = current.speed;
@ -666,14 +576,11 @@ void() rotate_train_next =
// check if there's a speed change
if (current.speed>0)
self.speed = current.speed;
if (!self.speed)
objerror("No speed is defined!");
// divide by speed to get time to reach dest
traveltime = len / self.speed;
}
if (traveltime < 0.1)
{
self.velocity = '0 0 0';
@ -684,52 +591,40 @@ void() rotate_train_next =
}
return;
}
// qcc won't take vec/float
div = 1 / traveltime;
if ( targ.spawnflags & ANGLES )
{
self.finalangle = SUB_NormalizeAngles( targ.angles );
self.rotate = ( targ.angles - self.angles ) * div;
}
// set endtime to trigger a think when dest is reached
self.endtime = self.ltime + traveltime;
// scale the destdelta vector by the time spent traveling to get velocity
self.velocity = vdestdelta * div;
self.duration = div; // 1 / duration
self.cnt = time; // start time
self.dest2 = vdestdelta; // delta
self.dest1 = self.origin; // original position
}
};
void() rotate_train_find =
{
local entity targ;
self.state = STATE_FIND;
LinkRotateTargets();
// the first target is the point of rotation.
// the second target is the path.
targ = find ( world, targetname, self.path);
if ( targ.classname != "path_rotate" )
objerror( "Next target is not path_rotate" );
// Save the current entity
self.goalentity = targ;
if ( targ.spawnflags & ANGLES )
{
self.angles = targ.angles;
self.finalangle = SUB_NormalizeAngles( targ.angles );
}
self.path = targ.target;
setorigin (self, targ.origin );
SetTargetOrigin();
@ -744,60 +639,49 @@ void() rotate_train_find =
{
self.endtime = 0;
}
self.duration = 1; // 1 / duration
self.cnt = time; // start time
self.dest2 = '0 0 0'; // delta
self.dest1 = self.origin; // original position
};
/*QUAKED func_rotate_train (0 .5 .8) (-8 -8 -8) (8 8 8)
In path_rotate, set speed to be the new speed of the train after it reaches
the path change. If speed is -1, the train will warp directly to the next
path change after the specified wait time. If MOVETIME is set on the
path_rotate, the train to interprets "speed" as the length of time to
take moving from one corner to another.
"noise" contains the name of the sound to play when train stops.
"noise1" contains the name of the sound to play when train moves.
Both "noise" and "noise1" defaults depend upon "sounds" variable and
can be overridden by the "noise" and "noise1" variable in path_rotate.
Also in path_rotate, if STOP is set, the train will wait until it is
retriggered before moving on to the next goal.
Trains are moving platforms that players can ride.
"path" specifies the first path_rotate and is the starting position.
If the train is the target of a button or trigger, it will not begin moving until activated.
The func_rotate_train entity is the center of rotation of all objects targeted by it.
If "deathtype" is set with a string, this is the message that will appear when a player is killed by the train.
speed default 100
dmg default 0
sounds
1) ratchet metal
*/
void() rotate_train =
{
objerror ("rotate_train entities should be changed to rotate_object with\nfunc_rotate_train controllers\n");
};
void() func_rotate_train =
{
if (!self.speed)
self.speed = 100;
if (!self.target)
objerror ("rotate_train without a target");
if ( !self.noise )
{
if (self.sounds == 0)
{
self.noise = ("misc/null.wav");
}
if (self.sounds == 1)
{
self.noise = ("plats/train2.wav");
@ -814,19 +698,15 @@ void() func_rotate_train =
self.noise1 = ("plats/train1.wav");
}
}
precache_sound( self.noise );
precache_sound( self.noise1 );
self.cnt = 1;
self.solid = SOLID_NOT;
self.movetype = MOVETYPE_STEP;
self.use = rotate_train_use;
setmodel (self, self.model);
setsize (self, self.mins, self.maxs);
setorigin (self, self.origin);
// start trains on the second frame, to make sure their targets have had
// a chance to spawn
self.ltime = time;
@ -835,30 +715,23 @@ void() func_rotate_train =
self.think = rotate_train_think;
self.think1 = rotate_train_find;
self.state = STATE_FIND;
self.duration = 1; // 1 / duration
self.cnt = 0.1; // start time
self.dest2 = '0 0 0'; // delta
self.dest1 = self.origin; // original position
self.flags = self.flags | FL_ONGROUND;
};
//************************************************
//
// Moving clip walls
//
//************************************************
void() rotate_door_reversedirection;
void() rotate_door_group_reversedirection;
void() movewall_touch =
{
if (time < self.owner.attack_finished)
return;
if ( self.dmg )
{
T_Damage (other, self, self.owner, self.dmg);
@ -870,16 +743,12 @@ void() movewall_touch =
self.owner.attack_finished = time + 0.5;
}
};
void() movewall_blocked =
{
local entity temp;
if (time < self.owner.attack_finished)
return;
self.owner.attack_finished = time + 0.5;
if ( self.owner.classname == "func_rotate_door" )
{
temp = self;
@ -887,7 +756,6 @@ void() movewall_blocked =
rotate_door_group_reversedirection();
self = temp;
}
if ( self.dmg )
{
T_Damage (other, self, self.owner, self.dmg);
@ -899,22 +767,16 @@ void() movewall_blocked =
self.owner.attack_finished = time + 0.5;
}
};
void() movewall_think =
{
self.ltime = time;
self.nextthink = time + 0.02;
};
/*QUAKED func_movewall (0 .5 .8) ? VISIBLE TOUCH NONBLOCKING
Used to emulate collision on rotating objects.
VISIBLE causes brush to be displayed.
TOUCH specifies whether to cause damage when touched by player.
NONBLOCKING makes the brush non-solid. This is useless if VISIBLE is set.
"dmg" specifies the damage to cause when touched or blocked.
*/
void() func_movewall =
@ -943,7 +805,6 @@ void() func_movewall =
self.nextthink = time + 0.02;
self.ltime = time;
};
/*QUAKED rotate_object (0 .5 .8) ?
This defines an object to be rotated. Used as the target of func_rotate_door.
*/
@ -956,7 +817,6 @@ void() rotate_object =
setsize( self, self.mins, self.maxs );
self.think = SUB_Null;
};
/*
for PAROXYSM - Added 12/30/98
rotate_placeholder
@ -964,13 +824,9 @@ Replaces rotate_object with a pre-lit BSP model.
This is a hack so you don't need to use Hipnotic's (Win9x only) bsp and Light utilities.
Essentially the same as rotate_object above except it calls a bsp model instead of
using a brush defined in the map.
the_mdl = String that defines the path to the BSP model - "maps/mymodel.bsp"
*/
.string the_mdl;
void() rotate_placeholder =
{
precache_model(self.the_mdl);
@ -981,25 +837,19 @@ void() rotate_placeholder =
setsize( self, self.mins, self.maxs );
self.think = SUB_Null;
};
//************************************************
//
// Rotating doors
//
//************************************************
void() rotate_door_think2 =
{
local float t;
t = time - self.ltime;
self.ltime = time;
// change to alternate textures
self.frame = 1 - self.frame;
self.angles = self.dest;
if ( self.state == STATE_OPENING )
{
self.state = STATE_OPEN;
@ -1013,20 +863,15 @@ void() rotate_door_think2 =
}
self.state = STATE_CLOSED;
}
sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
self.think = SUB_Null;
RotateTargetsFinal();
};
void() rotate_door_think =
{
local float t;
t = time - self.ltime;
self.ltime = time;
if ( time < self.endtime )
{
self.angles = self.angles + ( self.rotate * t );
@ -1038,17 +883,13 @@ void() rotate_door_think =
RotateTargets();
self.think = rotate_door_think2;
}
self.nextthink = time + 0.01;
};
void() rotate_door_reversedirection =
{
local vector start;
// change to alternate textures
self.frame = 1 - self.frame;
if ( self.state == STATE_CLOSING )
{
start = self.dest1;
@ -1061,20 +902,16 @@ void() rotate_door_reversedirection =
self.dest = self.dest1;
self.state = STATE_CLOSING;
}
sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
self.rotate = ( self.dest - start ) * ( 1 / self.speed );
self.think = rotate_door_think;
self.nextthink = time + 0.02;
self.endtime = time + self.speed - ( self.endtime - time );
self.ltime = time;
};
void() rotate_door_group_reversedirection =
{
local string name;
// tell all associated rotaters to reverse direction
if ( self.group )
{
@ -1091,23 +928,18 @@ void() rotate_door_group_reversedirection =
rotate_door_reversedirection();
}
};
void() rotate_door_use =
{
local vector start;
if ( ( self.state != STATE_OPEN ) && ( self.state != STATE_CLOSED ) )
return;
if ( !self.cnt )
{
self.cnt = 1;
LinkRotateTargets();
}
// change to alternate textures
self.frame = 1 - self.frame;
if ( self.state == STATE_CLOSED )
{
start = self.dest1;
@ -1120,59 +952,46 @@ void() rotate_door_use =
self.dest = self.dest1;
self.state = STATE_CLOSING;
}
sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
self.rotate = ( self.dest - start ) * ( 1 / self.speed );
self.think = rotate_door_think;
self.nextthink = time + 0.01;
self.endtime = time + self.speed;
self.ltime = time;
};
/*QUAKED func_rotate_door (0 .5 .8) (-8 -8 -8) (8 8 8) STAYOPEN
Creates a door that rotates between two positions around a point of
rotation each time it's triggered.
STAYOPEN tells the door to reopen after closing. This prevents a trigger-
once door from closing again when it's blocked.
"dmg" specifies the damage to cause when blocked. Defaults to 2. Negative numbers indicate no damage.
"speed" specifies how the time it takes to rotate
"sounds"
1) medieval (default)
2) metal
3) base
*/
void() func_rotate_door =
{
if (!self.target)
{
objerror( "rotate_door without target." );
}
self.dest1 = '0 0 0';
self.dest2 = self.angles;
self.angles = self.dest1;
// default to 2 seconds
if ( !self.speed )
{
self.speed = 2;
}
self.cnt = 0;
if (!self.dmg)
self.dmg = 2;
else if ( self.dmg < 0 )
{
self.dmg = 0;
}
if (self.sounds == 0)
self.sounds = 1;
if (self.sounds == 1)
@ -1200,7 +1019,6 @@ void() func_rotate_door =
self.noise1 = "doors/basesec2.wav";
self.noise3 = "doors/basesec2.wav";
}
self.solid = SOLID_NOT;
self.movetype = MOVETYPE_NONE;
setmodel (self, self.model);

View file

@ -1,12 +1,9 @@
// POX - had to make room for Paroxysm's DM modes......
void() W_SetCurrentAmmo;
/* ALL LIGHTS SHOULD BE 0 1 0 IN COLOR ALL OTHER ITEMS SHOULD
BE .8 .3 .4 IN COLOR */
.entity quadcore; // + POX - used by the dual model quad
void() SUB_regen =
{
self.model = self.mdl; // restore original model
@ -22,9 +19,6 @@ void() SUB_regen =
}
// - POX
};
/*QUAKED noclass (0 0 0) (-8 -8 -8) (8 8 8)
prints a warning message when spawned
*/
@ -35,20 +29,15 @@ void() noclass =
dprint ("\n");
remove (self);
};
void() q_touch;
void() q_touch =
{
local string s;
if (other.classname != "player")
return;
if (other.health <= 0)
return;
self.mdl = self.model;
sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
@ -60,13 +49,10 @@ local string s;
// other.armorvalue = 0 * 0.01;
// other.ammo_cells = 0;
//}
// do the apropriate action
other.super_time = 1;
other.super_damage_finished = self.cnt;
s=ftos(rint(other.super_damage_finished - time));
bprint (PRINT_LOW, other.netname);
//if (deathmatch == 4)
// bprint (PRINT_LOW, " recovered an OctaPower with ");
@ -74,16 +60,12 @@ local string s;
bprint (PRINT_LOW, " recovered a Quad with ");
bprint (PRINT_LOW, s);
bprint (PRINT_LOW, " seconds remaining!\n");
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
void(float timeleft) DropQuad =
{
local entity item;
item = spawn();
item.origin = self.origin;
@ -102,27 +84,20 @@ void(float timeleft) DropQuad =
item.nextthink = time + timeleft; // remove it with the time left on it
item.think = SUB_Remove;
};
void() r_touch;
void() r_touch =
{
local string s;
if (other.classname != "player")
return;
if (other.health <= 0)
return;
self.mdl = self.model;
sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
other.items = other.items | IT_INVISIBILITY;
self.model = string_null;
// do the apropriate action
other.invisible_time = 1;
other.invisible_finished = self.cnt;
@ -132,16 +107,12 @@ local string s;
bprint (PRINT_LOW, s);
bprint (PRINT_LOW, " seconds remaining!\n");
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
void(float timeleft) DropRing =
{
local entity item;
item = spawn();
item.origin = self.origin;
@ -160,18 +131,15 @@ void(float timeleft) DropRing =
item.nextthink = time + timeleft; // remove after 30 seconds
item.think = SUB_Remove;
};
/*
============
PlaceItem
plants the object on the floor
============
*/
void() PlaceItem =
{
local float oldz;
self.mdl = self.model; // so it can be restored on respawn
self.flags = FL_ITEM; // make extra wide
self.solid = SOLID_TRIGGER;
@ -188,11 +156,9 @@ void() PlaceItem =
return;
}
};
/*
============
StartItem
Sets the clipping size and plants the object on the floor
============
*/
@ -201,12 +167,9 @@ void() StartItem =
self.nextthink = time + 0.2; // items start after other solids
self.think = PlaceItem;
};
/*
=========================================================================
HEALTH BOX
=========================================================================
*/
//
@ -220,7 +183,6 @@ float (entity e, float healamount, float ignore) T_Heal =
if ((!ignore) && (e.health >= other.max_health))
return 0;
healamount = ceil(healamount);
e.health = e.health + healamount;
if ((!ignore) && (e.health >= other.max_health))
e.health = other.max_health;
@ -229,7 +191,6 @@ float (entity e, float healamount, float ignore) T_Heal =
e.health = 250;
return 1;
};
/*QUAKED item_health (.3 .3 1) (0 0 0) (32 32 32) rotten megahealth
Health box. Normally gives 25 points.
Rotten box heals 5-10 points,
@ -237,13 +198,11 @@ megahealth will add 100 health, then
rot you down to your maximum health limit,
one point per second.
*/
float H_ROTTEN = 1;
float H_MEGA = 2;
.float healamount, healtype;
void() health_touch;
void() item_megahealth_rot;
void() item_health =
{
// + POX - no items in FFA mode
@ -254,11 +213,9 @@ void() item_health =
}
self.touch = health_touch;
if (self.spawnflags & H_ROTTEN)
{
precache_model("maps/b_bh10.bsp");
precache_sound("items/health1.wav");
setmodel(self, "maps/b_bh10.bsp");
self.noise = "items/health1.wav";
@ -287,8 +244,6 @@ void() item_health =
setsize (self, '0 0 0', '32 32 56');
StartItem ();
};
void() health_touch =
{
local string s;
@ -296,7 +251,6 @@ void() health_touch =
//if (deathmatch == 4)
// if (other.invincible_time > 0)
// return;
if (other.classname != "player")
return;
@ -320,12 +274,10 @@ void() health_touch =
// health touch sound
sound(other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
self.model = string_null;
self.solid = SOLID_NOT;
// Megahealth = rot down the player's super health
if (self.healtype == 2)
{
@ -349,7 +301,6 @@ void() health_touch =
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
void() item_megahealth_rot =
{
other = self.owner;
@ -360,7 +311,6 @@ void() item_megahealth_rot =
self.nextthink = time + 1;
return;
}
// it is possible for a player to die and respawn between rots, so don't
// just blindly subtract the flag off
other.items = other.items - (other.items & IT_SUPERHEALTH);
@ -371,19 +321,14 @@ void() item_megahealth_rot =
self.think = SUB_regen;
//}
};
/* + POX - see sheilds.qc
//ARMOR
/* - POX
/*
===============================================================================
WEAPONS
===============================================================================
*/
void() bound_other_ammo =
{
if (other.ammo_shells > 100)
@ -396,8 +341,6 @@ void() bound_other_ammo =
if (other.ammo_cells > 200)
other.ammo_cells = 200;
};
float(float w) RankForWeapon =
{
if (w == IT_LIGHTNING)
@ -414,7 +357,6 @@ float(float w) RankForWeapon =
return 6;
return 7;
};
float (float w) WeaponCode =
{
if (w == IT_COMBOGUN)
@ -431,46 +373,37 @@ float (float w) WeaponCode =
return 8;
return 1;
};
/*
=============
Deathmatch_Weapon
Deathmatch weapon change rules for picking up a weapon
.float ammo_shells, ammo_nails, ammo_rockets, ammo_cells;
=============
*/
void(float old, float new) Deathmatch_Weapon =
{
local float or, nr;
// change self.weapon if desired
or = RankForWeapon (self.weapon);
nr = RankForWeapon (new);
if ( nr < or )
self.weapon = new;
};
/*
=============
weapon_touch
=============
*/
float() W_BestWeapon;
void() weapon_touch =
{
local float hadammo, best, new = 0, old;
local entity stemp;
//local float leave;
// For client weapon_switch
local float w_switch;
if (!(other.flags & FL_CLIENT))
return;
if ((stof(infokey(other,"w_switch"))) == 0)
w_switch = 8;
else
@ -481,13 +414,11 @@ void() weapon_touch =
self = other;
best = W_BestWeapon();
self = stemp;
// POX - leave is useless in POX since weapons are never allowed to be picked up if posessed
//if (deathmatch == 2 || deathmatch == 3 || deathmatch == 5)
// leave = 1;
//else
// leave = 0;
// POX - Don't bother checking if weapon is in inventory
if (other.items & self.weapon)
{
@ -495,9 +426,7 @@ void() weapon_touch =
SUB_UseTargets(); //Just in case it's required to get out of somewhere
return;
}
// POX- changed classnames to constants
if (self.weapon == IT_PLASMAGUN)
{
hadammo = other.ammo_rockets;
@ -532,23 +461,19 @@ void() weapon_touch =
}
else
objerror ("weapon_touch: unknown classname");
sprint (other, PRINT_LOW, "You got the ");
sprint (other, PRINT_LOW, self.netname);
sprint (other, PRINT_LOW, "\n");
// weapon touch sound
sound (other, CHAN_ITEM, "weapons/pkup.wav", 1, ATTN_NORM);
stuffcmd (other, "bf\n");
bound_other_ammo ();
// change to the weapon
old = other.items;
other.items = other.items | new;
stemp = self;
self = other;
//POX - check for autoswitch
if (deathmatch & DM_AUTOSWITCH)
{
@ -569,14 +494,10 @@ void() weapon_touch =
}
else
self.weapon = new;
W_SetCurrentAmmo();
self = stemp;
//if (leave)
// return;
//if (deathmatch!=3 || deathmatch !=5)
//{
// remove it in single player, or setup for respawning in deathmatch
@ -589,12 +510,9 @@ void() weapon_touch =
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
// + POX - models/netnames changed
/*QUAKED weapon_supershotgun (0 .5 .8) (-16 -16 0) (16 16 32)
*/
void() weapon_supershotgun =
{
// + POX - no items in FFA mode
@ -612,10 +530,8 @@ void() weapon_supershotgun =
setsize (self, '-16 -16 0', '16 16 56');
StartItem ();
};
/*QUAKED weapon_nailgun (0 .5 .8) (-16 -16 0) (16 16 32)
*/
void() weapon_nailgun =
{
// + POX - no items in FFA mode
@ -633,10 +549,8 @@ void() weapon_nailgun =
setsize (self, '-16 -16 0', '16 16 56');
StartItem ();
};
/*QUAKED weapon_supernailgun (0 .5 .8) (-16 -16 0) (16 16 32)
*/
void() weapon_supernailgun =
{
// + POX - no items in FFA mode
@ -654,10 +568,8 @@ void() weapon_supernailgun =
setsize (self, '-16 -16 0', '16 16 56');
StartItem ();
};
/*QUAKED weapon_grenadelauncher (0 .5 .8) (-16 -16 0) (16 16 32)
*/
void() weapon_grenadelauncher =
{
// + POX - no items in FFA mode
@ -675,10 +587,8 @@ void() weapon_grenadelauncher =
setsize (self, '-16 -16 0', '16 16 56');
StartItem ();
};
/*QUAKED weapon_rocketlauncher (0 .5 .8) (-16 -16 0) (16 16 32)
*/
void() weapon_rocketlauncher =
{
// + POX - no items in FFA mode
@ -696,10 +606,7 @@ void() weapon_rocketlauncher =
setsize (self, '-16 -16 0', '16 16 56');
StartItem ();
};
// + POX - PlasmaGun also replaces Thunderbolt in existing levels
void() weapon_lightning =
{
// + POX - no items in FFA mode
@ -717,34 +624,24 @@ void() weapon_lightning =
setsize (self, '-16 -16 0', '16 16 56');
StartItem ();
};
/*
===============================================================================
AMMO
===============================================================================
*/
void() ammo_touch =
{
local entity stemp;
local float best;
if (other.classname != "player")
return;
if (other.health <= 0)
return;
// if the player was using his best weapon, change up to the new one if better
stemp = self;
self = other;
best = W_BestWeapon();
self = stemp;
// shotgun
if (self.weapon == 1)
{
@ -754,7 +651,6 @@ local float best;
//+ POX - switch ammo to shells for ComboGun
other.which_ammo = 0;
}
// spikes
if (self.weapon == 2)
{
@ -762,7 +658,6 @@ local float best;
return;
other.ammo_nails = other.ammo_nails + self.aflag;
}
// rockets
if (self.weapon == 3)
{
@ -770,7 +665,6 @@ local float best;
return;
other.ammo_rockets = other.ammo_rockets + self.aflag;
}
// cells
if (self.weapon == 4)
{
@ -779,7 +673,6 @@ local float best;
return;
other.ammo_cells = other.ammo_cells + self.aflag;
}
bound_other_ammo ();
sprint (other, PRINT_LOW, "You got the ");
@ -788,7 +681,6 @@ local float best;
// ammo touch sound
sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
stuffcmd (other, "bf\n");
// change to a better weapon if appropriate
if (deathmatch & DM_AUTOSWITCH)
{
@ -801,38 +693,26 @@ if (deathmatch & DM_AUTOSWITCH)
self = stemp;
}
}
// if changed current ammo, update it
stemp = self;
self = other;
W_SetCurrentAmmo();
self = stemp;
// remove it in single player, or setup for respawning in deathmatch
self.model = string_null;
self.solid = SOLID_NOT;
//if (deathmatch != 2)
self.nextthink = time + 30;
// Xian -- If playing in DM 3.0 mode, halve the time ammo respawns
// if (deathmatch == 3 || deathmatch == 5)
// self.nextthink = time + 15;
self.think = SUB_regen;
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
float WEAPON_BIG2 = 1;
/*QUAKED item_shells (0 .5 .8) (0 0 0) (32 32 32) big
*/
void() item_shells =
{
//if (deathmatch == 4)
@ -846,7 +726,6 @@ void() item_shells =
}
self.touch = ammo_touch;
if (self.spawnflags & WEAPON_BIG2)
{
precache_model ("maps/bspmdls/b_shell1.bsp");
@ -864,10 +743,8 @@ void() item_shells =
setsize (self, '0 0 0', '32 32 56');
StartItem ();
};
/*QUAKED item_spikes (0 .5 .8) (0 0 0) (32 32 32) big
*/
void() item_spikes =
{
//if (deathmatch == 4)
@ -879,9 +756,7 @@ void() item_spikes =
remove(self);
return;
}
self.touch = ammo_touch;
if (self.spawnflags & WEAPON_BIG2)
{
precache_model ("maps/bspmdls/b_nail1.bsp");
@ -898,12 +773,9 @@ void() item_spikes =
self.netname = "nails";
setsize (self, '0 0 0', '32 32 56');
StartItem ();
};
/*QUAKED item_rockets (0 .5 .8) (0 0 0) (32 32 32) big
*/
void() item_rockets =
{
//if (deathmatch == 4)
@ -915,9 +787,7 @@ void() item_rockets =
remove(self);
return;
}
self.touch = ammo_touch;
if (self.spawnflags & WEAPON_BIG2)
{
precache_model ("maps/bspmdls/b_rock1.bsp");
@ -934,13 +804,9 @@ void() item_rockets =
self.netname = "rockets";
setsize (self, '0 0 0', '32 32 56');
StartItem ();
};
/*QUAKED item_cells (0 .5 .8) (0 0 0) (32 32 32) big
*/
void() item_cells =
{
//if (deathmatch == 4)
@ -952,9 +818,7 @@ void() item_cells =
remove(self);
return;
}
self.touch = ammo_touch;
if (self.spawnflags & WEAPON_BIG2)
{
precache_model ("maps/bspmdls/b_batt1.bsp");
@ -971,14 +835,10 @@ void() item_cells =
self.netname = "cells";
setsize (self, '0 0 0', '32 32 56');
StartItem ();
};
/*QUAKED item_weapon (0 .5 .8) (0 0 0) (32 32 32) shotgun rocket spikes big
DO NOT USE THIS!!!! IT WILL BE REMOVED!
*/
float WEAPON_SHOTGUN = 1;
float WEAPON_ROCKET = 2;
float WEAPON_SPIKES = 4;
@ -993,7 +853,6 @@ void() item_weapon =
}
self.touch = ammo_touch;
if (self.spawnflags & WEAPON_SHOTGUN)
{
if (self.spawnflags & WEAPON_BIG)
@ -1011,7 +870,6 @@ void() item_weapon =
self.weapon = 1;
self.netname = "shells";
}
if (self.spawnflags & WEAPON_SPIKES)
{
if (self.spawnflags & WEAPON_BIG)
@ -1029,7 +887,6 @@ void() item_weapon =
self.weapon = 2;
self.netname = "spikes";
}
if (self.spawnflags & WEAPON_ROCKET)
{
if (self.spawnflags & WEAPON_BIG)
@ -1051,16 +908,11 @@ void() item_weapon =
setsize (self, '0 0 0', '32 32 56');
StartItem ();
};
/*
===============================================================================
KEYS
===============================================================================
*/
void() key_touch =
{
if (other.classname != "player")
@ -1069,23 +921,17 @@ void() key_touch =
return;
if (other.items & self.items)
return;
sprint (other, PRINT_LOW, "You got the ");
sprint (other, PRINT_LOW, self.netname);
sprint (other,PRINT_LOW, "\n");
sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
other.items = other.items | self.items;
self.solid = SOLID_NOT;
self.model = string_null;
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
void() key_setsounds =
{
if (world.worldtype == 0)
@ -1104,7 +950,6 @@ void() key_setsounds =
self.noise = "misc/basekey.wav";
}
};
/*QUAKED item_key1 (0 .5 .8) (-16 -16 -24) (16 16 32)
SILVER key
In order for keys to work
@ -1115,7 +960,6 @@ following:
1: metal
2: base
*/
void() item_key1 =
{
if (world.worldtype == 0)
@ -1142,7 +986,6 @@ void() item_key1 =
setsize (self, '-16 -16 -24', '16 16 32');
StartItem ();
};
/*QUAKED item_key2 (0 .5 .8) (-16 -16 -24) (16 16 32)
GOLD key
In order for keys to work
@ -1153,7 +996,6 @@ following:
1: metal
2: base
*/
void() item_key2 =
{
if (world.worldtype == 0)
@ -1180,17 +1022,11 @@ void() item_key2 =
setsize (self, '-16 -16 -24', '16 16 32');
StartItem ();
};
/*
===============================================================================
END OF LEVEL RUNES
===============================================================================
*/
void() sigil_touch =
{
if (other.classname != "player")
@ -1201,7 +1037,6 @@ void() sigil_touch =
self.target_id_finished = time + 4;//POX don't let TargetID override centerprints
centerprint (other, "You got the rune!");
sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
@ -1212,20 +1047,15 @@ void() sigil_touch =
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
/*QUAKED item_sigil (0 .5 .8) (-16 -16 -24) (16 16 32) E1 E2 E3 E4
End of level sigil, pick up to end episode and return to jrstart.
*/
void() item_sigil =
{
if (!self.spawnflags)
objerror ("no spawnflags");
precache_sound ("misc/runekey.wav");
self.noise = "misc/runekey.wav";
if (self.spawnflags & 1)
{
precache_model ("progs/end1.mdl");
@ -1251,29 +1081,21 @@ void() item_sigil =
setsize (self, '-16 -16 -24', '16 16 32');
StartItem ();
};
/*
===============================================================================
POWERUPS
===============================================================================
*/
void() powerup_touch;
void() powerup_touch =
{
if (other.classname != "player")
return;
if (other.health <= 0)
return;
sprint (other, PRINT_LOW, "You got the ");
sprint (other,PRINT_LOW, self.netname);
sprint (other,PRINT_LOW, "\n");
self.mdl = self.model;
if ((self.classname == "item_artifact_invulnerability") ||
@ -1283,13 +1105,11 @@ void() powerup_touch =
self.nextthink = time + 60;
self.think = SUB_regen;
sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
other.items = other.items | self.items;
self.model = string_null;
// do the apropriate action
if (self.classname == "item_artifact_envirosuit")
{
@ -1308,7 +1128,6 @@ void() powerup_touch =
other.invisible_time = 1;
other.invisible_finished = time + 30;
}
if (self.classname == "item_artifact_super_damage")
{
self.quadcore.mdl = self.quadcore.model;
@ -1317,20 +1136,16 @@ void() powerup_touch =
other.super_time = 1;
other.super_damage_finished = time + 30;
}
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
//POX - just changed the look of these (and some respawn times)
/*QUAKED item_artifact_invulnerability (0 .5 .8) (-16 -16 -24) (16 16 32)
Player is invulnerable for 30 seconds
*/
void() item_artifact_invulnerability =
{
self.touch = powerup_touch;
precache_model ("progs/poxmegs.mdl");
precache_sound ("items/protect.wav");
precache_sound ("items/protect2.wav");
@ -1343,14 +1158,12 @@ void() item_artifact_invulnerability =
setsize (self, '-16 -16 -24', '16 16 32');
StartItem ();
};
/*QUAKED item_artifact_envirosuit (0 .5 .8) (-16 -16 -24) (16 16 32)
Player takes no damage from water or slime for 30 seconds
*/
void() item_artifact_envirosuit =
{
self.touch = powerup_touch;
precache_model ("progs/suit.mdl");
precache_sound ("items/suit.wav");
precache_sound ("items/suit2.wav");
@ -1361,8 +1174,6 @@ void() item_artifact_envirosuit =
setsize (self, '-16 -16 -24', '16 16 32');
StartItem ();
};
/*QUAKED item_artifact_invisibility (0 .5 .8) (-16 -16 -24) (16 16 32)
Player is invisible for 30 seconds
*/
@ -1373,7 +1184,6 @@ void() item_artifact_invisibility =
remove(self);
self.touch = powerup_touch;
precache_model ("progs/cloak.mdl");
precache_sound ("items/inv1.wav");
precache_sound ("items/inv2.wav");
@ -1385,7 +1195,6 @@ void() item_artifact_invisibility =
setsize (self, '-16 -16 -24', '16 16 32');
StartItem ();
};
//POX - A little hack to get a multi-model item for a cool effect
void() Spawn_QuadCore =
{
@ -1408,14 +1217,12 @@ void() Spawn_QuadCore =
qcore.nextthink = time + 999999999;
qcore.think = SUB_Null;
};
/*QUAKED item_artifact_super_damage (0 .5 .8) (-16 -16 -24) (16 16 32)
The next attack from the player will do 4x damage
*/
void() item_artifact_super_damage =
{
self.touch = powerup_touch;
precache_model ("progs/poxquad.mdl");
precache_model ("progs/poxquad2.mdl");
@ -1434,17 +1241,11 @@ void() item_artifact_super_damage =
StartItem ();
};
/*
===============================================================================
PLAYER BACKPACKS
===============================================================================
*/
void() BackpackTouch =
{
local string s;
@ -1452,17 +1253,14 @@ void() BackpackTouch =
local entity stemp;
local float acount;
local float b_switch;
//if (deathmatch == 4)
// if (other.invincible_time > 0)
// return;
if ((stof(infokey(other,"b_switch"))) == 0)
b_switch = 8;
else
b_switch = stof(infokey(other,"b_switch"));
if (other.classname != "player")
return;
if (other.health <= 0)
@ -1482,7 +1280,6 @@ void() BackpackTouch =
sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
stuffcmd (other, "bf\n");
remove(self);
if (other.health >299)
{
if (other.invincible_time != 1)
@ -1494,7 +1291,6 @@ void() BackpackTouch =
other.super_time = 1;
other.super_damage_finished = time + 30;
other.items = other.items | IT_QUAD;
other.ammo_cells = 0;
@ -1521,13 +1317,11 @@ void() BackpackTouch =
self = other;
best = W_BestWeapon();
self = stemp;
// change weapons
other.ammo_shells = other.ammo_shells + self.ammo_shells;
other.ammo_nails = other.ammo_nails + self.ammo_nails;
other.ammo_rockets = other.ammo_rockets + self.ammo_rockets;
other.ammo_cells = other.ammo_cells + self.ammo_cells;
new = self.items;
if (!new)
new = other.weapon;
@ -1535,7 +1329,6 @@ void() BackpackTouch =
other.items = other.items | self.items;
bound_other_ammo ();
if (self.ammo_shells)
{
if (acount)
@ -1597,7 +1390,6 @@ void() BackpackTouch =
// backpack touch sound
sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
stuffcmd (other, "bf\n");
remove(self);
self = other;
@ -1623,7 +1415,6 @@ if (deathmatch & DM_AUTOSWITCH)
}
W_SetCurrentAmmo ();
};
/*
===============
DropBackpack
@ -1636,7 +1427,6 @@ void() DropBackpack =
// + POX - DM_FFA check
if (!(self.ammo_shells + self.ammo_nails + self.ammo_rockets + self.ammo_cells) && !(deathmatch & DM_FFA))
return; // nothing in it
item = spawn();
item.origin = self.origin - '0 0 24';
@ -1666,7 +1456,6 @@ void() DropBackpack =
item.healamount = 25;
item.healtype = 1;
}
item.ammo_shells = self.ammo_shells;
item.ammo_nails = self.ammo_nails;
item.ammo_rockets = self.ammo_rockets;
@ -1674,7 +1463,6 @@ void() DropBackpack =
// + POX - round rockets up to nearest integer incase someone died in between rhino barrel fires
item.ammo_rockets = rint(item.ammo_rockets);
item.ammo_cells = self.ammo_cells;
item.velocity_z = 300;
item.velocity_x = -100 + (random() * 200);
item.velocity_y = -100 + (random() * 200);
@ -1689,5 +1477,3 @@ void() DropBackpack =
item.nextthink = time + 30; // remove after 1 minutes
item.think = SUB_Remove;
};

View file

@ -6,18 +6,14 @@ 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)
@ -31,7 +27,6 @@ void() light_use =
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
@ -52,7 +47,6 @@ void() light =
remove(self);
return;
}
if (self.style >= 32)
{
self.use = light_use;
@ -62,7 +56,6 @@ void() light =
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
@ -91,7 +84,6 @@ void() light_fluoro =
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
@ -109,11 +101,9 @@ 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
@ -132,14 +122,12 @@ void() light_globe =
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)
Short wall torch
Default light value is 200
@ -159,7 +147,6 @@ void() light_torch_small_walltorch =
FireAmbient ();
makestatic (self);
};
/*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
Large yellow flame ball
*/
@ -178,7 +165,6 @@ void() light_flame_large_yellow =
FireAmbient ();
makestatic (self);
};
/*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
Small yellow flame ball
*/
@ -196,7 +182,6 @@ void() light_flame_small_yellow =
FireAmbient ();
makestatic (self);
};
/*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
Small white flame ball
*/
@ -214,14 +199,10 @@ void() light_flame_small_white =
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 =
@ -234,11 +215,9 @@ void() misc_fireball =
if (!self.speed)
self.speed = 1000;
};
void() fire_fly =
{
local entity fireball;
fireball = spawn();
fireball.solid = SOLID_TRIGGER;
fireball.movetype = MOVETYPE_TOSS;
@ -257,23 +236,20 @@ local entity fireball;
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);
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
WriteByte (MSG_MULTICAST, TE_EXPLOSION);
WriteCoord (MSG_MULTICAST, self.origin_x);
@ -282,13 +258,9 @@ void() barrel_explode =
multicast (self.origin, MULTICAST_PHS);
remove (self);
};
/*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64)
TESTING THING
*/
void() misc_explobox =
{
local float oldz;
@ -302,7 +274,6 @@ void() misc_explobox =
self.health = 20;
self.th_die = barrel_explode;
self.takedamage = DAMAGE_AIM;
self.origin_z = self.origin_z + 2;
oldz = self.origin_z;
droptofloor();
@ -316,14 +287,9 @@ void() misc_explobox =
self.nobleed = TRUE;
};
/*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
Smaller exploding box, REGISTERED ONLY
*/
void() misc_explobox2 =
{
local float oldz;
@ -337,7 +303,6 @@ void() misc_explobox2 =
self.health = 20;
self.th_die = barrel_explode;
self.takedamage = DAMAGE_AIM;
self.origin_z = self.origin_z + 2;
oldz = self.origin_z;
droptofloor();
@ -351,20 +316,15 @@ void() misc_explobox2 =
self.nobleed = TRUE;
};
//============================================================================
float SPAWNFLAG_SUPERSPIKE = 1;
float SPAWNFLAG_LASER = 2;
void() Laser_Touch =
{
local vector org;
if (other == self.owner)
return; // don't explode on owner
if (pointcontents(self.origin) == CONTENT_SKY)
{
remove(self);
@ -373,7 +333,6 @@ void() Laser_Touch =
sound (self, CHAN_WEAPON, "enforcer/enfstop.wav", 1, ATTN_STATIC);
org = self.origin - 8*normalize(self.velocity);
if (other.health)
{
SpawnBlood (org, 15);
@ -393,12 +352,10 @@ void() Laser_Touch =
remove(self);
};
void(vector org, vector vec) LaunchLaser =
{
if (self.classname == "monster_enforcer")
sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
vec = normalize(vec);
newmis = spawn();
@ -406,20 +363,15 @@ void(vector org, vector vec) LaunchLaser =
newmis.movetype = MOVETYPE_FLY;
newmis.solid = SOLID_BBOX;
newmis.effects = EF_DIMLIGHT;
setmodel (newmis, "progs/laser.mdl");
setsize (newmis, '0 0 0', '0 0 0');
setorigin (newmis, org);
newmis.velocity = vec * 600;
newmis.angles = vectoangles(newmis.velocity);
newmis.nextthink = time + 5;
newmis.think = SUB_Remove;
newmis.touch = Laser_Touch;
};
void() spikeshooter_use =
{
if (self.spawnflags & SPAWNFLAG_LASER)
@ -436,20 +388,16 @@ void() spikeshooter_use =
newmis.touch = superspike_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
When triggered, fires a spike in the direction set in QuakeEd.
Laser is only for REGISTERED.
*/
void() trap_spikeshooter =
{
SetMovedir ();
@ -464,8 +412,6 @@ void() trap_spikeshooter =
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)
@ -480,35 +426,23 @@ void() trap_shooter =
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 =
{
remove (self);
};
void() make_bubbles =
{
local entity bubble;
bubble = spawn();
setmodel (bubble, "progs/s_bubble.spr");
setorigin (bubble, self.origin);
@ -525,7 +459,6 @@ local entity bubble;
self.nextthink = time + random() + 0.5;
self.think = make_bubbles;
};
void() bubble_split =
{
local entity bubble;
@ -547,7 +480,6 @@ local entity bubble;
if (self.waterlevel != 3)
remove (self);
};
void() bubble_remove =
{
if (other.classname == self.classname)
@ -557,21 +489,17 @@ void() bubble_remove =
}
remove(self);
};
void() bubble_bob =
{
local float rnd1, rnd2, rnd3;
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)
@ -594,38 +522,27 @@ local float rnd1, rnd2, 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
*/
@ -637,13 +554,10 @@ void() func_wall =
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;
@ -651,28 +565,23 @@ void() func_illusionary =
setmodel (self, self.model);
makestatic (self);
};
/*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
@ -682,7 +591,6 @@ void() func_bossgate =
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)
*/
@ -691,7 +599,6 @@ 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 =
@ -699,7 +606,6 @@ 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 =
@ -749,9 +655,7 @@ 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;
@ -763,14 +667,10 @@ void() noise_think =
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");
@ -782,7 +682,6 @@ void() misc_noisemaker =
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;
};

View file

@ -2,14 +2,10 @@
POX - Last Man Standing Observer Code
This was written to support Last Man Standing Rules, it is a crude form of Spectate that allows
observes to stay connected as players so they can play the next game.
An LMS observer is counted as a player, so you can still have the max amount of true Spectors connected
*/
entity() SelectSpawnPoint;
void() teleport_touch; //POX v1.12
//POX v1.12 - sets fov for observer (impulses 1 and 2)
/*------------------
SetObserverFOV
@ -23,9 +19,7 @@ void() SetObserverFOV =
stuffcmd (self, "fov ");
stuffcmd (self, ob_fov);
stuffcmd (self, "\n");
};
//POX v1.12 - Allows observers to use teleporters
/*------------------
ObserverTeleportTouch
@ -44,7 +38,6 @@ local entity t;
setorigin (self, t.origin);
self.angles = t.mangle;
self.fixangle = 1; // turn this way immediately
self.teleport_time = time + 1.7;//POX v1.2 increased this
if (self.flags & FL_ONGROUND)
@ -52,15 +45,12 @@ local entity t;
self.velocity = v_forward * 300;
self.flags = self.flags - self.flags & FL_ONGROUND;
};
/*------------------
ObserverImpulses
Handels observer controls
-------------------*/
void() ObserverImpulses =
{
//Jump to a dm start point (Fire Button)
if (self.button0)
{
@ -133,7 +123,6 @@ void() ObserverImpulses =
else
{
self.target_id_toggle = TRUE;
//POX v1.12 - don't centerprint if a message is up
if (self.target_id_finished < time)
centerprint (self, "Target Identifier ON\n");
@ -147,14 +136,11 @@ void() ObserverImpulses =
self.impulse = 0;
self.button0 = 0;
self.button1 = 0;
};
/*------------------
ObserverThink
Rerouted from PlayerPostThink
-------------------*/
void() ObserverThink =
{
local entity tele; //POX v1.12
@ -216,13 +202,10 @@ void() ObserverThink =
}
ObserverImpulses ();
};
/*------------------
SpawnObserver
-------------------*/
void() SpawnObserver =
{
local entity spot;
@ -240,24 +223,19 @@ void() SpawnObserver =
self.invincible_finished = 0;
self.effects = 0;
self.invincible_time = 0;
self.items = 0;
self.ammo_shells = 0;
self.ammo_nails = 0;
self.ammo_rockets = 0;
self.ammo_cells = 0;
self.weapon = 0;
self.armorvalue = 0;
self.armortype = 0;
self.deadflag = DEAD_NO;
spot = SelectSpawnPoint ();
self.origin = spot.origin + '0 0 1';
self.angles = spot.angles;
self.fixangle = TRUE; // turn this way immediately
setmodel (self, string_null);
self.weaponmodel = string_null;
setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);
@ -279,9 +257,3 @@ void() SpawnObserver =
stuffcmd (self, "fov 100\n");
self.target_id_toggle = TRUE; //POX v1.12 default to on
};

View file

@ -1,5 +1,4 @@
void() plat_center_touch;
void() plat_outside_touch;
void() plat_trigger_use;
@ -7,12 +6,10 @@ void() plat_go_up;
void() plat_go_down;
void() plat_crush;
float PLAT_LOW_TRIGGER = 1;
void() plat_spawn_inside_trigger =
{
local entity trigger;
local vector tmin, tmax;
//
// middle trigger
//
@ -41,7 +38,6 @@ void() plat_spawn_inside_trigger =
setsize (trigger, tmin, tmax);
};
void() plat_hit_top =
{
sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM);
@ -49,27 +45,23 @@ void() plat_hit_top =
self.think = plat_go_down;
self.nextthink = self.ltime + 3;
};
void() plat_hit_bottom =
{
sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM);
self.state = STATE_BOTTOM;
};
void() plat_go_down =
{
sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
self.state = STATE_DOWN;
SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom);
};
void() plat_go_up =
{
sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
self.state = STATE_UP;
SUB_CalcMove (self.pos1, self.speed, plat_hit_top);
};
void() plat_center_touch =
{
if (other.classname != "player")
@ -77,19 +69,16 @@ void() plat_center_touch =
if (other.health <= 0)
return;
self = self.enemy;
if (self.state == STATE_BOTTOM)
plat_go_up ();
else if (self.state == STATE_TOP)
self.nextthink = self.ltime + 1; // delay going down
};
void() plat_outside_touch =
{
if (other.classname != "player")
return;
if (other.health <= 0)
return;
@ -98,19 +87,15 @@ void() plat_outside_touch =
if (self.state == STATE_TOP)
plat_go_down ();
};
void() plat_trigger_use =
{
if (self.think)
return; // allready activated
plat_go_down();
};
void() plat_crush =
{
//dprint ("plat_crush\n");
other.deathtype = "squish";
T_Damage (other, self, self, 1);
@ -121,7 +106,6 @@ void() plat_crush =
else
objerror ("plat_crush: bad self.state\n");
};
void() plat_use =
{
self.use = SUB_Null;
@ -129,34 +113,24 @@ void() plat_use =
objerror ("plat_use: not in up state");
plat_go_down();
};
/*QUAKED func_plat (0 .5 .8) ? PLAT_LOW_TRIGGER
speed default 150
Plats are always drawn in the extended position, so they will light correctly.
If the plat is the target of another trigger or button, it will start out disabled in the extended position until it is trigger, when it will lower and become a normal plat.
If the "height" key is set, that will determine the amount the plat moves, instead of being implicitly determined by the model's height.
Set "sounds" to one of the following:
1) base fast
2) chain slow
*/
void() func_plat =
{
if (!self.t_length)
self.t_length = 80;
if (!self.t_width)
self.t_width = 10;
if (self.sounds == 0)
self.sounds = 3;// + POX - changed from 2
// FIX THIS TO LOAD A GENERIC PLAT SOUND
if (self.sounds == 1)
{
precache_sound ("plats/plat1.wav");
@ -164,7 +138,6 @@ void() func_plat =
self.noise = "plats/plat1.wav";
self.noise1 = "plats/plat2.wav";
}
if (self.sounds == 2)
{
precache_sound ("plats/medplat1.wav");
@ -180,7 +153,6 @@ void() func_plat =
self.noise = "doors/hydro1.wav";
self.noise1 = "doors/hydro2.wav";
}
if (self.sounds == 4)
{
precache_sound ("doors/stndr1.wav");
@ -188,7 +160,6 @@ void() func_plat =
self.noise = "doors/stndr1.wav";
self.noise1 = "doors/stndr2.wav";
}
if (self.sounds == 5)
{
precache_sound ("doors/ddoor1.wav");
@ -197,21 +168,17 @@ void() func_plat =
self.noise1 = "doors/ddoor1.wav";
}
// - POX
self.mangle = self.angles;
self.angles = '0 0 0';
self.classname = "plat";
self.solid = SOLID_BSP;
self.movetype = MOVETYPE_PUSH;
setorigin (self, self.origin);
setmodel (self, self.model);
setsize (self, self.mins , self.maxs);
self.blocked = plat_crush;
if (!self.speed)
self.speed = 150;
// pos1 is the top position, pos2 is the bottom
self.pos1 = self.origin;
self.pos2 = self.origin;
@ -219,11 +186,8 @@ void() func_plat =
self.pos2_z = self.origin_z - self.height;
else
self.pos2_z = self.origin_z - self.size_z + 8;
self.use = plat_trigger_use;
plat_spawn_inside_trigger (); // the "start moving" trigger
if (self.targetname)
{
self.state = STATE_UP;
@ -235,12 +199,9 @@ void() func_plat =
self.state = STATE_BOTTOM;
}
};
//============================================================================
void() train_next;
void() func_train_find;
void() train_blocked =
{
if (time < self.attack_finished)
@ -249,14 +210,12 @@ void() train_blocked =
other.deathtype = "squish";
T_Damage (other, self, self, self.dmg);
};
void() train_use =
{
if (self.think != func_train_find)
return; // already activated
train_next();
};
void() train_wait =
{
if (self.wait)
@ -269,11 +228,9 @@ void() train_wait =
self.think = train_next;
};
void() train_next =
{
local entity targ;
targ = find (world, targetname, self.target);
self.target = targ.target;
if (!self.target)
@ -285,12 +242,9 @@ void() train_next =
sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
SUB_CalcMove (targ.origin - self.mins, self.speed, train_wait);
};
void() func_train_find =
{
local entity targ;
targ = find (world, targetname, self.target);
self.target = targ.target;
setorigin (self, targ.origin - self.mins);
@ -300,7 +254,6 @@ void() func_train_find =
self.think = train_next;
}
};
/*QUAKED func_train (0 .5 .8) ?
Trains are moving platforms that players can ride.
The targets origin specifies the min point of the train at each corner.
@ -310,7 +263,6 @@ speed default 100
dmg default 2
sounds
1) ratchet metal
*/
void() func_train =
{
@ -320,7 +272,6 @@ void() func_train =
objerror ("func_train without a target");
if (!self.dmg)
self.dmg = 2;
if (self.sounds == 0)
{
self.noise = ("misc/null.wav");
@ -328,7 +279,6 @@ void() func_train =
self.noise1 = ("misc/null.wav");
precache_sound ("misc/null.wav");
}
if (self.sounds == 1)
{
self.noise = ("plats/train2.wav");
@ -336,24 +286,20 @@ void() func_train =
self.noise1 = ("plats/train1.wav");
precache_sound ("plats/train1.wav");
}
self.cnt = 1;
self.solid = SOLID_BSP;
self.movetype = MOVETYPE_PUSH;
self.blocked = train_blocked;
self.use = train_use;
self.classname = "train";
setmodel (self, self.model);
setsize (self, self.mins , self.maxs);
setorigin (self, self.origin);
// start trains on the second frame, to make sure their targets have had
// a chance to spawn
self.nextthink = self.ltime + 0.1;
self.think = func_train_find;
};
/*QUAKED misc_teleporttrain (0 .5 .8) (-8 -8 -8) (8 8 8)
This is used for the final bos
*/
@ -363,27 +309,22 @@ void() misc_teleporttrain =
self.speed = 100;
if (!self.target)
objerror ("func_train without a target");
self.cnt = 1;
self.solid = SOLID_NOT;
self.movetype = MOVETYPE_PUSH;
self.blocked = train_blocked;
self.use = train_use;
self.avelocity = '100 200 300';
self.noise = ("misc/null.wav");
precache_sound ("misc/null.wav");
self.noise1 = ("misc/null.wav");
precache_sound ("misc/null.wav");
precache_model2 ("progs/teleport.mdl");
setmodel (self, "progs/teleport.mdl");
setsize (self, self.mins , self.maxs);
setorigin (self, self.origin);
// start trains on the second frame, to make sure their targets have had
// a chance to spawn
self.nextthink = self.ltime + 0.1;
self.think = func_train_find;
};

View file

@ -1,93 +1,62 @@
void() bubble_bob;
/*
==============================================================================
PLAYER
==============================================================================
*/
$cd /raid/quake/id1/models/player_4
$origin 0 -6 24
$base base
$skin skin
//
// running
//
$frame axrun1 axrun2 axrun3 axrun4 axrun5 axrun6
$frame rockrun1 rockrun2 rockrun3 rockrun4 rockrun5 rockrun6
//
// standing
//
$frame stand1 stand2 stand3 stand4 stand5
$frame axstnd1 axstnd2 axstnd3 axstnd4 axstnd5 axstnd6
$frame axstnd7 axstnd8 axstnd9 axstnd10 axstnd11 axstnd12
//
// pain
//
$frame axpain1 axpain2 axpain3 axpain4 axpain5 axpain6
$frame pain1 pain2 pain3 pain4 pain5 pain6
//
// death
//
$frame axdeth1 axdeth2 axdeth3 axdeth4 axdeth5 axdeth6
$frame axdeth7 axdeth8 axdeth9
$frame deatha1 deatha2 deatha3 deatha4 deatha5 deatha6 deatha7 deatha8
$frame deatha9 deatha10 deatha11
$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
$frame deathb9
$frame deathc1 deathc2 deathc3 deathc4 deathc5 deathc6 deathc7 deathc8
$frame deathc9 deathc10 deathc11 deathc12 deathc13 deathc14 deathc15
$frame deathd1 deathd2 deathd3 deathd4 deathd5 deathd6 deathd7
$frame deathd8 deathd9
$frame deathe1 deathe2 deathe3 deathe4 deathe5 deathe6 deathe7
$frame deathe8 deathe9
//
// attacks
//
$frame nailatt1 nailatt2
$frame light1 light2
$frame rockatt1 rockatt2 rockatt3 rockatt4 rockatt5 rockatt6
$frame shotatt1 shotatt2 shotatt3 shotatt4 shotatt5 shotatt6
$frame axatt1 axatt2 axatt3 axatt4 axatt5 axatt6
$frame axattb1 axattb2 axattb3 axattb4 axattb5 axattb6
$frame axattc1 axattc2 axattc3 axattc4 axattc5 axattc6
$frame axattd1 axattd2 axattd3 axattd4 axattd5 axattd6
/*
==============================================================================
PLAYER
==============================================================================
*/
void() player_run;
void() player_stand1 =[ $axstnd1, player_stand1 ]
{
self.weaponframe=0;
@ -97,7 +66,6 @@ void() player_stand1 =[ $axstnd1, player_stand1 ]
player_run();
return;
}
if (self.weapon == IT_AXE)
{
if (self.walkframe >= 12)
@ -112,7 +80,6 @@ void() player_stand1 =[ $axstnd1, player_stand1 ]
}
self.walkframe = self.walkframe + 1;
};
void() player_run =[ $rockrun1, player_run ]
{
self.weaponframe=0;
@ -122,7 +89,6 @@ void() player_run =[ $rockrun1, player_run ]
player_stand1();
return;
}
if (self.weapon == IT_AXE)
{
if (self.walkframe == 6)
@ -137,7 +103,6 @@ void() player_run =[ $rockrun1, player_run ]
}
// + POX - footstep sounds
self.spawnsilent = self.spawnsilent + vlen(self.origin - self.old_velocity);
self.old_velocity = self.origin;
@ -180,14 +145,12 @@ void() player_run =[ $rockrun1, player_run ]
self.walkframe = self.walkframe + 1;
};
void()muzzleflash =
{
WriteByte (MSG_MULTICAST, SVC_MUZZLEFLASH);
WriteEntity (MSG_MULTICAST, self);
multicast (self.origin, MULTICAST_PVS);
};
// POX - used for tShot and ComboGun primary triggers
void() player_shot1 = [$shotatt1, player_shot2 ] {self.weaponframe=1;muzzleflash();};
void() player_shot2 = [$shotatt2, player_shot3 ] {self.weaponframe=2;};
@ -195,7 +158,6 @@ void() player_shot3 = [$shotatt3, player_shot4 ] {self.weaponframe=3;};
void() player_shot4 = [$shotatt4, player_shot5 ] {self.weaponframe=4;};
void() player_shot5 = [$shotatt5, player_shot6 ] {self.weaponframe=5;};
void() player_shot6 = [$shotatt6, player_run ] {self.weaponframe=6;};
// POX - New Frame Macro For tShot 3 barrel fire
void() player_tshot1 = [$shotatt1, player_tshot2 ] {self.weaponframe=1;muzzleflash();};
void() player_tshot2 = [$shotatt2, player_tshot3 ] {self.weaponframe=16;};//triple flare frame
@ -203,7 +165,6 @@ void() player_tshot3 = [$shotatt3, player_tshot4 ] {self.weaponframe=3;};
void() player_tshot4 = [$shotatt4, player_tshot5 ] {self.weaponframe=4;};
void() player_tshot5 = [$shotatt5, player_tshot6 ] {self.weaponframe=5;};
void() player_tshot6 = [$shotatt6, player_run ] {self.weaponframe=6;};
// POX - New Frame Macro For tShot 3 barrel prime
void() player_reshot1 = [$shotatt1, player_reshot2 ] {self.weaponframe=7;};
void() player_reshot2 = [$shotatt3, player_reshot3 ] {self.weaponframe=8;};
@ -214,42 +175,32 @@ void() player_reshot6 = [$shotatt5, player_reshot7 ] {self.weaponframe=12;};
void() player_reshot7 = [$shotatt4, player_reshot8 ] {self.weaponframe=13;};
void() player_reshot8 = [$shotatt3, player_reshot9 ] {self.weaponframe=14;};
void() player_reshot9 = [$shotatt1, player_run ] {self.weaponframe=15;};
// POX - New Frame Macro For ComboGun Second Trigger (Impact Grenades)
void() player_gshot1 = [$shotatt1, player_gshot2 ] {self.weaponframe=2;muzzleflash();};
void() player_gshot2 = [$shotatt2, player_gshot3 ] {self.weaponframe=3;};
void() player_gshot3 = [$shotatt3, player_gshot4 ] {self.weaponframe=4;};
void() player_gshot4 = [$shotatt4, player_gshot5 ] {self.weaponframe=5;};
void() player_gshot5 = [$shotatt5, player_run ] {self.weaponframe=6;};
// POX - New Frame Macro For Nailgun Second Trigger (Shrapnel Bomb)
void() player_shrap1 = [$nailatt1, player_shrap2 ] {muzzleflash();};
void() player_shrap2 = [$nailatt2, player_run ] {};
void() player_axe1 = [$axatt1, player_axe2 ] {self.weaponframe=1;};
void() player_axe2 = [$axatt2, player_axe3 ] {self.weaponframe=2;};
void() player_axe3 = [$axatt3, player_axe4 ] {self.weaponframe=3;W_FireAxe();};
void() player_axe4 = [$axatt4, player_run ] {self.weaponframe=4;};
void() player_axeb1 = [$axattb1, player_axeb2 ] {self.weaponframe=5;};
void() player_axeb2 = [$axattb2, player_axeb3 ] {self.weaponframe=6;};
void() player_axeb3 = [$axattb3, player_axeb4 ] {self.weaponframe=7;W_FireAxe();};
void() player_axeb4 = [$axattb4, player_run ] {self.weaponframe=8;};
void() player_axec1 = [$axattc1, player_axec2 ] {self.weaponframe=1;};
void() player_axec2 = [$axattc2, player_axec3 ] {self.weaponframe=2;};
void() player_axec3 = [$axattc3, player_axec4 ] {self.weaponframe=3;W_FireAxe();};
void() player_axec4 = [$axattc4, player_run ] {self.weaponframe=4;};
void() player_axed1 = [$axattd1, player_axed2 ] {self.weaponframe=5;};
void() player_axed2 = [$axattd2, player_axed3 ] {self.weaponframe=6;};
void() player_axed3 = [$axattd3, player_axed4 ] {self.weaponframe=7;W_FireAxe();};
void() player_axed4 = [$axattd4, player_run ] {self.weaponframe=8;};
//============================================================================
// POX - NailGun animation - In sync with Paroxysm v1.1
void() player_nail1 =[$nailatt1, player_nail2 ]
{
@ -265,7 +216,6 @@ void() player_nail1 =[$nailatt1, player_nail2 ]
else
{
muzzleflash();
if (!self.button0)
{player_run ();return;}
self.weaponframe = self.weaponframe + 1;
@ -295,7 +245,6 @@ void() player_nail2 =[$nailatt2, player_nail1 ]
{
muzzleflash();
if (!self.button0)
{player_run ();return;}
self.weaponframe = self.weaponframe + 1;
@ -311,11 +260,8 @@ void() player_nail2 =[$nailatt2, player_nail1 ]
}
};
//============================================================================
// POX - PlasmaGun animation - In sync with Paroxysm v1.1
void() player_plasma1 =[$nailatt1, player_plasma2 ]
{
if (self.st_plasma > time)
@ -348,9 +294,7 @@ void() player_plasma1 =[$nailatt1, player_plasma2 ]
self.st_plasma = time + 0.1;
}
};
void() player_plasma2 =[$nailatt2, player_plasma1 ]
{
if (self.st_plasma > time)
@ -385,16 +329,12 @@ void() player_plasma2 =[$nailatt2, player_plasma1 ]
self.st_plasma = time + 0.1;
}
};
//============================================================================
// POX - MegaPlasma Burst
void() player_mplasma1 =[$rockatt1, player_mplasma2 ] {self.weaponframe=0;};
void() player_mplasma2 =[$rockatt2, player_mplasma3 ] {};
void() player_mplasma3 =[$rockatt3, player_run ] {};
// POX - Grenadelauncher Animation
void() player_grenade1 =[$rockatt1, player_grenade2 ] {self.weaponframe=1;muzzleflash();};
void() player_grenade2 =[$rockatt2, player_grenade3 ] {self.weaponframe=2;};
@ -402,7 +342,6 @@ void() player_grenade3 =[$rockatt3, player_grenade4 ] {self.weaponframe=3;};
void() player_grenade4 =[$rockatt4, player_grenade5 ] {self.weaponframe=4;};
void() player_grenade5 =[$rockatt5, player_grenade6 ] {self.weaponframe=5;};
void() player_grenade6 =[$rockatt6, player_run ] {self.weaponframe=6;};
// POX - Annihilator firing sequence
void() player_rocket1 =[$rockatt1, player_rocket2 ] {self.weaponframe=1;
W_FireRocket('0 0 16');
@ -411,16 +350,12 @@ sound (self, CHAN_WEAPON, "weapons/rhino.wav", 1, ATTN_NORM);
if (self.flags & FL_ONGROUND)
self.velocity = v_forward* -25;
msg_entity = self;
WriteByte (MSG_ONE, SVC_BIGKICK);
muzzleflash();};
void() player_rocket2 =[$rockatt2, player_rocket3 ] {self.weaponframe=2;
W_FireRocket('0 0 24');};
void() player_rocket3 =[$rockatt3, player_run ] {self.weaponframe=3;};
// POX - Annihilator Reload sequence
void() player_rocketload1 =[$rockatt1, player_rocketload2 ] {self.weaponframe=4;};
void() player_rocketload2 =[$rockatt3, player_rocketload3 ] {self.weaponframe=5;};
@ -428,22 +363,17 @@ void() player_rocketload3 =[$rockatt4, player_rocketload4 ] {self.weaponframe
void() player_rocketload4 =[$rockatt5, player_rocketload5 ] {self.weaponframe=7;};
void() player_rocketload5 =[$rockatt6, player_rocketload6 ] {self.weaponframe=8;};
void() player_rocketload6 =[$rockatt4, player_run ] {self.weaponframe=9;};
void(float num_bubbles) DeathBubbles;
void() PainSound =
{
local float rs;
if (self.health < 0)
return;
if (damage_attacker.classname == "teledeath")
{
sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
return;
}
// water pain sounds
if (self.watertype == CONTENT_WATER && self.waterlevel == 3)
{
@ -454,7 +384,6 @@ local float rs;
sound (self, CHAN_VOICE, "player/drown2.wav", 1, ATTN_NORM);
return;
}
// slime pain sounds
if (self.watertype == CONTENT_SLIME)
{
@ -465,7 +394,6 @@ local float rs;
sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM);
return;
}
if (self.watertype == CONTENT_LAVA)
{
if (random() > 0.5)
@ -474,16 +402,13 @@ local float rs;
sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM);
return;
}
if (self.pain_finished > time)
{
self.axhitme = 0;
return;
}
self.pain_finished = time + 0.5;
// don't make multiple pain sounds right after each other
// ax pain sound
if (self.axhitme == 1)
{
@ -492,9 +417,7 @@ local float rs;
return;
}
rs = rint((random() * 5) + 1);
self.noise = "";
if (rs == 1)
self.noise = "player/pain1.wav";
@ -508,46 +431,38 @@ local float rs;
self.noise = "player/pain5.wav";
else
self.noise = "player/pain6.wav";
sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
return;
};
void() player_pain1 = [ $pain1, player_pain2 ] {PainSound();self.weaponframe=0;};
void() player_pain2 = [ $pain2, player_pain3 ] {};
void() player_pain3 = [ $pain3, player_pain4 ] {};
void() player_pain4 = [ $pain4, player_pain5 ] {};
void() player_pain5 = [ $pain5, player_pain6 ] {};
void() player_pain6 = [ $pain6, player_run ] {};
void() player_axpain1 = [ $axpain1, player_axpain2 ] {PainSound();self.weaponframe=0;};
void() player_axpain2 = [ $axpain2, player_axpain3 ] {};
void() player_axpain3 = [ $axpain3, player_axpain4 ] {};
void() player_axpain4 = [ $axpain4, player_axpain5 ] {};
void() player_axpain5 = [ $axpain5, player_axpain6 ] {};
void() player_axpain6 = [ $axpain6, player_run ] {};
void(entity attacker, float damage) player_pain =
{
if (self.weaponframe)
return;
if (self.invisible_finished > time)
return; // eyes don't have pain frames
if (self.weapon == IT_AXE)
player_axpain1 ();
else
player_pain1 ();
};
void() player_diea1;
void() player_dieb1;
void() player_diec1;
void() player_died1;
void() player_diee1;
void() player_die_ax1;
void() DeathBubblesSpawn =
{
local entity bubble;
@ -571,7 +486,6 @@ local entity bubble;
if (self.air_finished >= self.bubble_count)
remove(self);
};
void(float num_bubbles) DeathBubbles =
{
local entity bubble_spawner;
@ -587,12 +501,9 @@ local entity bubble_spawner;
bubble_spawner.bubble_count = num_bubbles;
return;
};
void() DeathSound =
{
local float rs;
// water death sounds
if (self.waterlevel == 3)
{
@ -612,23 +523,18 @@ local float rs;
self.noise = "player/death4.wav";
if (rs == 5)
self.noise = "player/death5.wav";
sound (self, CHAN_VOICE, self.noise, 1, ATTN_NONE);
return;
};
void() PlayerDead =
{
self.nextthink = -1;
// allow respawn after a certain time
self.deadflag = DEAD_DEAD;
};
vector(float dm) VelocityForDamage =
{
local vector v;
if (vlen(damage_inflictor.velocity)>0)
{
v = 0.5 * damage_inflictor.velocity;
@ -644,11 +550,9 @@ vector(float dm) VelocityForDamage =
v_y = 100 * crandom();
v_z = 200 + 100 * random();
}
//v_x = 100 * crandom();
//v_y = 100 * crandom();
//v_z = 200 + 100 * random();
if (dm > -50)
{
// dprint ("level 1\n");
@ -661,14 +565,11 @@ vector(float dm) VelocityForDamage =
}
else
v = v * 10;
return v;
};
void(string gibname, float dm) ThrowGib =
{
local entity new;
new = spawn();
new.origin = self.origin;
setmodel (new, gibname);
@ -685,7 +586,6 @@ void(string gibname, float dm) ThrowGib =
new.frame = 0;
new.flags = 0;
};
void(string gibname, float dm) ThrowHead =
{
setmodel (self, gibname);
@ -701,8 +601,6 @@ void(string gibname, float dm) ThrowHead =
self.flags = self.flags - (self.flags & FL_ONGROUND);
self.avelocity = crandom() * '0 600 0';
};
void() GibPlayer =
{
@ -714,15 +612,12 @@ void() GibPlayer =
ThrowGib ("progs/gib1.mdl", self.health);
ThrowGib ("progs/gib2.mdl", self.health);
ThrowGib ("progs/gib3.mdl", self.health);
self.deadflag = DEAD_DEAD;
if (damage_attacker.classname == "teledeath")
{
sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
return;
}
if (damage_attacker.classname == "teledeath2")
{
sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
@ -734,14 +629,12 @@ void() GibPlayer =
else
sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NONE);
};
void() PlayerDie =
{
local float i;
local string s;
self.items = self.items - (self.items & IT_INVISIBILITY);
if ((stof(infokey(world,"dq"))) != 0)
{
if (self.super_damage_finished > 0)
@ -757,7 +650,6 @@ void() PlayerDie =
bprint (PRINT_LOW, " seconds remaining\n");
}
}
if ((stof(infokey(world,"dr"))) != 0)
{
if (self.invisible_finished > 0)
@ -770,7 +662,6 @@ void() PlayerDie =
DropRing (self.invisible_finished - time);
}
}
self.invisible_finished = 0; // don't die as eyes
self.invincible_finished = 0;
self.super_damage_finished = 0;
@ -826,9 +717,7 @@ void() PlayerDie =
player_died1();
else
player_diee1();
};
void() set_suicide_frame =
{ // used by klill command and diconnect command
if (self.model != "progs/player.mdl")
@ -839,8 +728,6 @@ void() set_suicide_frame =
self.deadflag = DEAD_DEAD;
self.nextthink = -1;
};
void() player_diea1 = [ $deatha1, player_diea2 ] {};
void() player_diea2 = [ $deatha2, player_diea3 ] {};
void() player_diea3 = [ $deatha3, player_diea4 ] {};
@ -852,7 +739,6 @@ void() player_diea8 = [ $deatha8, player_diea9 ] {};
void() player_diea9 = [ $deatha9, player_diea10 ] {};
void() player_diea10 = [ $deatha10, player_diea11 ] {};
void() player_diea11 = [ $deatha11, player_diea11 ] {PlayerDead();};
void() player_dieb1 = [ $deathb1, player_dieb2 ] {};
void() player_dieb2 = [ $deathb2, player_dieb3 ] {};
void() player_dieb3 = [ $deathb3, player_dieb4 ] {};
@ -862,7 +748,6 @@ void() player_dieb6 = [ $deathb6, player_dieb7 ] {};
void() player_dieb7 = [ $deathb7, player_dieb8 ] {};
void() player_dieb8 = [ $deathb8, player_dieb9 ] {};
void() player_dieb9 = [ $deathb9, player_dieb9 ] {PlayerDead();};
void() player_diec1 = [ $deathc1, player_diec2 ] {};
void() player_diec2 = [ $deathc2, player_diec3 ] {};
void() player_diec3 = [ $deathc3, player_diec4 ] {};
@ -878,7 +763,6 @@ void() player_diec12 = [ $deathc12, player_diec13 ] {};
void() player_diec13 = [ $deathc13, player_diec14 ] {};
void() player_diec14 = [ $deathc14, player_diec15 ] {};
void() player_diec15 = [ $deathc15, player_diec15 ] {PlayerDead();};
void() player_died1 = [ $deathd1, player_died2 ] {};
void() player_died2 = [ $deathd2, player_died3 ] {};
void() player_died3 = [ $deathd3, player_died4 ] {};
@ -888,7 +772,6 @@ void() player_died6 = [ $deathd6, player_died7 ] {};
void() player_died7 = [ $deathd7, player_died8 ] {};
void() player_died8 = [ $deathd8, player_died9 ] {};
void() player_died9 = [ $deathd9, player_died9 ] {PlayerDead();};
void() player_diee1 = [ $deathe1, player_diee2 ] {};
void() player_diee2 = [ $deathe2, player_diee3 ] {};
void() player_diee3 = [ $deathe3, player_diee4 ] {};
@ -898,7 +781,6 @@ void() player_diee6 = [ $deathe6, player_diee7 ] {};
void() player_diee7 = [ $deathe7, player_diee8 ] {};
void() player_diee8 = [ $deathe8, player_diee9 ] {};
void() player_diee9 = [ $deathe9, player_diee9 ] {PlayerDead();};
void() player_die_ax1 = [ $axdeth1, player_die_ax2 ] {};
void() player_die_ax2 = [ $axdeth2, player_die_ax3 ] {};
void() player_die_ax3 = [ $axdeth3, player_die_ax4 ] {};

View file

@ -1,48 +1,36 @@
// POX - bunch of new variable declarations and prototypes for POXworld
//New stuff for timing second triggers and other weapon stuff
.float prime_tshot; //this is set when tShot is primed for a triple barrel fire
.float st_tshotload; //used to time out the tSot's trigger during reload
.float st_sshotgun; //next attack for ComboGun
.float st_pball; //next attack for Impact grenade
.float which_ammo; //used to clean up ammo switching for ComboGun
.float st_mplasma; //next attack for MegaPlasma Burst
.float st_plasma; //next attack for PlasmaGun
.float LorR; //sets which barrel to use for next PlasmaGun shot
.float st_mine; //next attack for PhaseMine
.float st_grenade; //next attack for Grenades
.float no_obj; //fixes a problem with 'hanging' mines on breakable objects destroyed be something else
.entity spawnmaster;
.entity lastowner;
.float st_nailgun; //next attack for Nailgun
.float st_shrapnel; //next attack for ShrapnelBomb
.float shrap_detonate; //decide whether to launch or detonate a ShrapnelBomb
.float shrap_time; //holds the bombs time out (2 minutes then boom) - just in case owner died
.float reload_rocket; //keeps count of rockets fired
.float st_rocketload; //used to time out the rhino's trigger during reload
.float missfire_finished; //used to seperate attacks and missfires (POXnote : DO I STILL NEED THIS?)
.float nobleed; //set to TRUE for triggers, breakable objects, buttons, etc...
// Footsteps
.float spawnsilent;
.vector old_velocity;
//POX v1.2 REMOVED EARTHQUAKE! (not suitable for DM)
void() func_earthquake = {remove(self);};
//Water Movement
.float uwmuffle; //underwater muffle sound timeout
.float onwsound; //on water sound timeout
.float outwsound; //head out of water sound flag
.float inwsound; //head in water sound flag
//New DM option constants
float DM_PREDATOR = 2;
float DM_DARK = 4;
@ -50,7 +38,6 @@ float DM_LMS = 8;
float DM_FFA = 16;
float DM_GIB = 32;
float DM_AUTOSWITCH = 128;
float fraglimit_LMS; // stores the fraglimit at worldspawn so it can't be changed during a game
float lms_plrcount; // Keeps track of the number of players in an LMS game
float lms_gameover; // Lets CheckRules know when one or zero players are left
@ -59,26 +46,20 @@ float lms_gameover; // Lets CheckRules know when one or zero players are left
.float LMS_observer_fov; // Stores observer's current fov
.float LMS_zoom; // 1 = zoom in, 2 = zoom out, 0 = stop
.float LMS_observer_time; // times the display of observer instructions
//Dark Mode stuff...
.float flash_flag; // flashlight toggle (no user toggle)
.entity flash; // flash entity
// Moved here for use in weapons.qc
float intermission_running;
.float gl_fix; //a hack for toggling gl_flashblend
//Used by Target ID impulse
.float target_id_finished;
.float target_id_toggle;
.float target_id_same;
.entity last_target_id;
void(entity client, string s1, string s2, string s3, string s4) centerprint4 = #73;
//POX v1.2 - improved reseting of colour_light
.float cshift_finished;
.float cshift_off;
//POX 1.2 - allows idtarget state to be saved across levelchanges
.float target_id_temp;

View file

@ -2,17 +2,13 @@
void(float shotcount, vector dir, vector spread) FireBullets2;
void(float damage) spawn_touchblood;
void() muzzleflash;
void (entity targ, entity inflictor, entity attacker, float damage) T_Damage;
void () player_run;
void(entity bomb, entity attacker, float rad, entity ignore, string dtype) T_RadiusDamage;
void(vector org, float damage) SpawnBlood;
void() SuperDamageSound;
float SECOND_TRIGGER = 15; // Impulse constant for second trigger (more readable than 15)
void(vector org) launch_shrapnel; //Predeclare
void() player_shot1;
void() player_gshot1;
void() player_plasma1;
@ -30,12 +26,10 @@ void() player_axeb1;
void() player_axec1;
void() player_axed1;
//Some nitty-gritty from weapons.qc ...
float() crandom =
{
return 2*(random() - 0.5);
return 2 * (random() - 0.5);
};
@ -50,7 +44,6 @@ vector() wall_velocity =
return vel;
};
/*
================
Triple Barrel Shot for T-shot
@ -77,7 +70,6 @@ void() W_FireTShot =
FireBullets2 (12, dir, '0.16 0.1 0'); //make priming this thing worth while!
};
//=================================================================================
//Start MegaPlasmaBurst - Used by PlasmaGun's Second Trigger
//=================================================================================
@ -95,12 +87,10 @@ void() T_MplasmaTouch =
self.voided = 1;
if (pointcontents(self.origin) == CONTENT_SKY)
{
if (pointcontents(self.origin) == CONTENT_SKY) {
remove(self);
return;
}
damg = 120 + random()*20;
T_RadiusDamage (self, self.owner, damg, world, "megaplasma");
@ -114,14 +104,10 @@ void() T_MplasmaTouch =
WriteCoord (MSG_MULTICAST, self.origin_y);
WriteCoord (MSG_MULTICAST, self.origin_z);
multicast (self.origin, MULTICAST_PHS);
remove(self);
};
//launch_megaplasma
void() launch_megaplasma =
{
local vector dir;
@ -129,7 +115,6 @@ void() launch_megaplasma =
self.currentammo = self.ammo_cells = self.ammo_cells - 9;
sound (self, CHAN_WEAPON, "weapons/mplasma.wav", 1, ATTN_NORM);
msg_entity = self;
WriteByte (MSG_ONE, SVC_BIGKICK);
@ -145,7 +130,7 @@ void() launch_megaplasma =
newmis.classname = "megaplasma";
newmis.effects = newmis.effects | EF_BLUE;
// set speed
// set speed
dir = aim ( self, 1000 );
newmis.velocity = dir * 0.01;
newmis.avelocity = '300 300 300';
@ -155,28 +140,23 @@ void() launch_megaplasma =
newmis.touch = T_MplasmaTouch;
// set duration
// set duration
newmis.think = SUB_Remove;
newmis.nextthink = time + 5;
setmodel (newmis, "progs/plasma.mdl");
setsize (newmis, '0 0 0', '0 0 0');
setorigin (newmis, self.origin + v_forward*12 + '0 0 12');
};
//End MegaPlasmaBurst
//=================================================================================
//=============================================================================
//
// START PumkinBall CODE - Used by SuperShotgun's Second Trigger (Impact Grenades)
//
//=============================================================================
void() T_PballTouch =
{
local float damg;
if (other == self.owner)
return; // don't explode on owner
@ -193,7 +173,6 @@ void() T_PballTouch =
}
damg = 100 + random()*20;
T_RadiusDamage (self, self.owner, damg, world, "impactgrenade");
// sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
@ -205,10 +184,8 @@ void() T_PballTouch =
WriteCoord (MSG_MULTICAST, self.origin_y);
WriteCoord (MSG_MULTICAST, self.origin_z);
multicast (self.origin, MULTICAST_PHS);
remove(self);
};
/*
================
W_FirePball
@ -216,11 +193,9 @@ W_FirePball
*/
void() W_FirePball =
{
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
sound (self, CHAN_AUTO, "weapons/ssgrnde.wav", 1, ATTN_NORM);
sound (self, CHAN_AUTO, "weapons/gren2.wav", 1, ATTN_NORM);
msg_entity = self;
WriteByte (MSG_ONE, SVC_BIGKICK);
@ -235,29 +210,24 @@ void() W_FirePball =
newmis.solid = SOLID_BBOX;
newmis.classname = "impactgrenade";
// set newmis speed
// set newmis speed
makevectors (self.v_angle);
newmis.velocity = v_forward*700 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
newmis.angles = vectoangles(newmis.velocity);
newmis.touch = T_PballTouch;
// set newmis duration
newmis.nextthink = time + 2.5;
// set newmis duration
newmis.think = SUB_Remove;
newmis.nextthink = time + 5;
setmodel (newmis, "progs/grenade.mdl");
setsize (newmis, '0 0 0', '0 0 0');
setorigin (newmis, self.origin + v_forward*4);
};
// END PumkinBall CODE
//=============================================================================
//=============================================================================
//
// START MINE CODE (based on hipnotic's proximity mine - uh... hacked to death)
@ -266,12 +236,11 @@ void() W_FirePball =
// But it works.
//
//=============================================================================
void() M_DamExplode =
{
if (self.voided) {
if (self.voided)
return;
}
self.voided = 1;
T_RadiusDamage (self, self.owner, 95, world, "mine");
@ -284,13 +253,11 @@ void() M_DamExplode =
remove (self);
};
/*
================
MineExplode
================
*/
//explode immediately! (for doors, plats and breakable objects
void() MineImExplode =
{
@ -315,58 +282,48 @@ MineTouch
================
*/
void() MineTouch =
{
{
if (other == self)
{
return;
}
if (other.solid == SOLID_TRIGGER)
{
if (other.solid == SOLID_TRIGGER) {
sound (self, CHAN_AUTO, "weapons/bounce.wav", 1, ATTN_NORM);
return;
}
if (other.classname == "grenade")
{
if (other.classname == "grenade") {
sound (self, CHAN_AUTO, "weapons/bounce2.wav", 1, ATTN_NORM);
self.nextthink = time + 1;
return;
}
if (other.classname == "mine")
{
if (other.classname == "mine") {
sound (self, CHAN_AUTO, "weapons/bounce2.wav", 1, ATTN_NORM);
self.nextthink = time + 1;
return;
}
if (other.classname == "minearm")
{
if (other.classname == "minearm") {
sound (self, CHAN_AUTO, "weapons/bounce2.wav", 1, ATTN_NORM);
self.nextthink = time + 1;
return;
}
if (other.classname == "minearmed")
{
if (other.classname == "minearmed") {
sound (self, CHAN_AUTO, "weapons/bounce.wav", 1, ATTN_NORM);
self.classname = "minearm";
self.nextthink = time + 1;
return;
}
if (other.classname == "player")
{
if (other.classname == "player") {
sound (self, CHAN_BODY, "weapons/minedet.wav", 1, ATTN_NORM);
MineExplode();
self.nextthink = time + 0.4;
return;
}
if (other.takedamage == DAMAGE_AIM)
{
if (other.takedamage == DAMAGE_AIM) {
MineExplode();
self.think();
return;
@ -377,19 +334,17 @@ void() MineTouch =
self.spawnmaster = other;
self.nextthink = time + 0.1;
};
/*
================
MineArm
================
*/
void() MineArm =
{
local entity head;
local float detonate;
{
local entity head;
local float detonate;
if (self.classname == "minearm")
{
if (self.classname == "minearm") {
sound (self, CHAN_WEAPON, "weapons/armed.wav", 1, ATTN_NORM);
setsize (self, '-3 -3 -3', '3 3 3');
self.owner = world;
@ -398,7 +353,6 @@ void() MineArm =
self.classname = "minearmed";
muzzleflash(); //Will this work?
}
if ((time > self.delay) || (self.spawnmaster.no_obj == TRUE))
{
sound (self, CHAN_BODY, "weapons/minedet.wav", 1, ATTN_NORM);
@ -424,22 +378,19 @@ void() MineArm =
if (self.health < 0)
detonate = 1;
while (head)
{
while (head) {
if ((head != self) && (head.health > 0) && ((head.flags & (FL_CLIENT|FL_MONSTER)) || (head.classname == "bot")) && (head.classname!=self.classname))
detonate = 1;
traceline(self.origin,head.origin,TRUE,self);
traceline(self.origin, head.origin, TRUE, self);
if (trace_fraction != 1.0)
detonate = 0;
if (detonate==1)
{
sound (self, CHAN_BODY, "weapons/minedet.wav", 1, ATTN_NORM);
MineExplode();
self.nextthink = time + 0.25;
return;
}
if (detonate==1) {
sound (self, CHAN_BODY, "weapons/minedet.wav", 1, ATTN_NORM);
MineExplode();
self.nextthink = time + 0.25;
return;
}
head = head.chain;
}
@ -453,8 +404,7 @@ W_FireMine
void() W_FireMine =
{
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
sound (self, CHAN_AUTO, "weapons/ssgrnde.wav", 1, ATTN_NORM);
sound (self, CHAN_AUTO, "weapons/gren.wav", 1, ATTN_NORM);
msg_entity = self;
WriteByte (MSG_ONE, SVC_SMALLKICK);
@ -476,40 +426,33 @@ void() W_FireMine =
//POX v1.2 - mines don't bleed....
newmis.nobleed = TRUE;
// set missile speed
// set missile speed
makevectors (self.v_angle);
if (self.v_angle_x)
if (self.v_angle_x) {
newmis.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
else
{
} else {
newmis.velocity = aim(self, 10000);
newmis.velocity = newmis.velocity * 600;
newmis.velocity_z = 200;
}
newmis.avelocity = '100 600 100';
newmis.avelocity = '100 600 100';
newmis.angles = vectoangles(newmis.velocity);
newmis.touch = MineTouch;
newmis.angles = vectoangles(newmis.velocity);
newmis.touch = MineTouch;
// set missile duration
newmis.nextthink = time + 0.2;
newmis.delay = time + 15;
newmis.think = MineArm;
newmis.th_die = MineExplode;
setmodel (newmis, "progs/grenade.mdl");
setorigin (newmis, self.origin + v_forward*4);
setsize (newmis, '-1 -1 -1', '0 0 0');
// set missile duration
newmis.nextthink = time + 0.2;
newmis.delay = time + 60;
newmis.think = MineArm;
newmis.th_die = MineExplode;
setmodel (newmis, "progs/grenade.mdl");
setorigin (newmis, self.origin + v_forward*4);
setsize (newmis, '-1 -1 -1', '0 0 0');
};
// END MINE CODE
//=============================================================================
//=============================================================================
//=============================================================================
//
@ -519,9 +462,13 @@ void() W_FireMine =
//----------------------------------------------------------
//These functions launch a single spike in a random direction
void() spikenal_touch =
{
if (pointcontents(self.origin) == CONTENT_SKY) {
remove(self);
return;
}
if (self.voided) {
return;
}
@ -530,23 +477,15 @@ void() spikenal_touch =
if (other.solid == SOLID_TRIGGER)
return; // trigger field, do nothing
if (pointcontents(self.origin) == CONTENT_SKY)
{
remove(self);
return;
}
// hit something that bleeds
if (other.takedamage)
{
// hit something that bleeds
if (other.takedamage) {
spawn_touchblood (12);
other.deathtype = "shrapnel";
T_Damage (other, self, self.owner, 12);
remove(self);
}
else if (random() > 0.9)
{
else if (random() > 0.9) {
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
WriteByte (MSG_MULTICAST, TE_SPIKE);
WriteCoord (MSG_MULTICAST, self.origin_x);
@ -555,14 +494,12 @@ void() spikenal_touch =
multicast (self.origin, MULTICAST_PHS);
remove(self);
}
};
//POX - Get a random vector for Shrapnel
vector() VelocityForShrapnel =
{
local vector v;
v_x = 200 * crandom();
v_y = 200 * crandom();
v_z = 200 * crandom();
@ -571,7 +508,6 @@ vector() VelocityForShrapnel =
v_z = v_z - (v_z*2);
v = v * 6;
return v;
};
@ -579,6 +515,7 @@ vector() VelocityForShrapnel =
void(vector org) launch_shrapnel =
{
newmis = spawn ();
newmis.voided = 0;
newmis.owner = self.owner;
newmis.movetype = MOVETYPE_BOUNCE;
@ -598,12 +535,9 @@ void(vector org) launch_shrapnel =
setmodel (newmis, "progs/mwrub1.mdl");
setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
setorigin (newmis, org);
};
//----------------------------------------------------------
//and now the bomb code...
void() ShrapnelExplode =
{
if (self.voided) {
@ -611,18 +545,16 @@ void() ShrapnelExplode =
}
self.voided = 1;
//POX - 1.0b1 - A LOT less Shrapnel!
// Toss the nails (this function is with the spike stuff since it uses the same touch)
launch_shrapnel(self.origin);
launch_shrapnel(self.origin);
launch_shrapnel(self.origin);
launch_shrapnel(self.origin);
launch_shrapnel(self.origin);
T_RadiusDamage (self, self.owner, 160, world, "shrapnel");
if (self.owner != world)
self.owner.shrap_detonate = FALSE;//Enable next launch
self.owner.shrap_detonate = FALSE; // Enable next launch
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
WriteByte (MSG_MULTICAST, TE_EXPLOSION);
@ -630,7 +562,6 @@ void() ShrapnelExplode =
WriteCoord (MSG_MULTICAST, self.origin_y);
WriteCoord (MSG_MULTICAST, self.origin_z);
multicast (self.origin, MULTICAST_PHS);
remove (self);
};
@ -641,7 +572,7 @@ void() ShrapnelDetonate =
self.nextthink = time + 0.1;
};
//Wait for a detonation impulse or time up
// Wait for a detonation impulse or time up
void() ShrapnelThink =
{
if (self.shrap_time < time)
@ -650,9 +581,8 @@ void() ShrapnelThink =
if (self.owner == world)
return;
//Owner died so change to world and wait for detonate
if (self.owner.health <= 0)
{
// Owner died so change to world and wait for detonate
if (self.owner.health <= 0) {
self.owner.shrap_detonate = FALSE;//Enable next launch
self.owner = world;
self.nextthink = self.shrap_time;
@ -666,9 +596,10 @@ void() ShrapnelThink =
self.nextthink = time + 0.1;
};
void() ShrapnelTouch =
{
local float r;
local float r;
r = random();
@ -690,10 +621,9 @@ void() ShrapnelTouch =
if (self.velocity == '0 0 0')
self.avelocity = '0 0 0';
};
// End shrapnel bomb
//=============================================================================
//=============================================================================
/*
================
@ -704,8 +634,7 @@ void() W_FireShrapnel =
{
self.ammo_rockets = self.ammo_rockets - 1;
self.currentammo = self.ammo_nails = self.ammo_nails - 30;
sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
sound (self, CHAN_WEAPON, "weapons/gren2.wav", 1, ATTN_NORM);
msg_entity = self;
WriteByte (MSG_ONE, SVC_SMALLKICK);
@ -713,73 +642,59 @@ void() W_FireShrapnel =
//Added weapon kickback (as long as you're not in mid air)
if (self.flags & FL_ONGROUND)
self.velocity = self.velocity + v_forward* -115;
newmis = spawn ();
newmis.voided = 0;
newmis.owner = self;
newmis.movetype = MOVETYPE_BOUNCE;
newmis.solid = SOLID_BBOX;
newmis.classname = "shrapnel";
newmis.shrap_time = time + 120;
// set newmis speed
// set newmis speed
makevectors (self.v_angle);
if (self.v_angle_x)
if (self.v_angle_x) {
newmis.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
else
{
} else {
newmis.velocity = aim(self, 10000);
newmis.velocity = newmis.velocity * 600;
newmis.velocity_z = 200;
}
newmis.avelocity = '300 300 300';
newmis.angles = vectoangles(newmis.velocity);
newmis.touch = ShrapnelTouch;
// set newmis duration
// set newmis duration
newmis.nextthink = time + 0.1;
newmis.think = ShrapnelThink;
setmodel (newmis, "progs/grenade.mdl");
newmis.skin = 2;
setsize (newmis, '0 0 0', '0 0 0');
setorigin (newmis, self.origin);
};
/*
============
W_SecondTrigger
Second Trigger Impulses
POX v1.1 - seperated this from weapons.qc - cleaned it up a bit
============
*/
void() W_SecondTrigger =
{
//Don't fire during intermission
if (intermission_running)
return;
// Don't fire during intermission
if (intermission_running)
return;
// check for NailGun's second Trigger
if (self.weapon == IT_SUPER_NAILGUN)
{
if (!self.shrap_detonate) // Check if a bomb is already set
{
// check for NailGun's second Trigger
if (self.weapon == IT_SUPER_NAILGUN) {
if (!self.shrap_detonate) { // Check if a bomb is already set
// check for nails and rockets
if ((self.ammo_nails < 30) || (self.ammo_rockets < 1))
{
if ((self.ammo_nails < 30) || (self.ammo_rockets < 1)) {
sound (self, CHAN_AUTO, "weapons/mfire1.wav", 1, ATTN_NORM);
sprint (self, PRINT_HIGH, "Not enough ammo...\n");
}
else if (self.st_shrapnel < time)
{
} else if (self.st_shrapnel < time) {
self.weaponframe = 0;
SuperDamageSound();
self.st_shrapnel = time + 0.1; // Allow a fast detonate
@ -787,12 +702,10 @@ void() W_SecondTrigger =
W_FireShrapnel();
self.shrap_detonate = TRUE;
}
else
} else {
sound (self, CHAN_AUTO, "weapons/mfire1.wav", 1, ATTN_NORM);
}
else
{
}
} else {
sound (self, CHAN_WEAPON, "weapons/shrapdet.wav", 1, ATTN_NORM);
SuperDamageSound();
self.st_shrapnel = time + 0.7; // Time out before next launch
@ -800,46 +713,39 @@ void() W_SecondTrigger =
}
}
// check for t-shot prime
if (self.weapon == IT_TSHOT) {
if (self.prime_tshot == TRUE) { // already primed
// check for t-shot prime
if (self.weapon == IT_TSHOT)
{
//already primed
if (self.prime_tshot == TRUE)
SUB_Null ();
//not enough ammo
else if (self.ammo_shells < 3)
{
} else if (self.ammo_shells < 3) { // not enough ammo
SUB_Null ();
}
else
{
} else {
self.st_tshotload = time + 0.9; //give the reload a chance to happen
//make a reload sound!
sound (self, CHAN_WEAPON, "weapons/tsload.wav", 1, ATTN_NORM);
player_reshot1(); //play prime animation
player_reshot1(); // play prime animation
self.prime_tshot = TRUE; //set the prime bit
}
}
// check for rhino reload
if (self.weapon == IT_ROCKET_LAUNCHER)
{
//already reloaded
if (self.reload_rocket == 0)
// check for rhino reload
if (self.weapon == IT_ROCKET_LAUNCHER) {
if (self.reload_rocket == 0) { // already reloaded
SUB_Null ();
//if no rockets go away
else if (self.ammo_rockets < 1)
{
} else if (self.ammo_rockets < 1) { // if no rockets go away
SUB_Null ();
}
else
{
} else {
self.st_rocketload = time + 0.6; //give the reload a chance to happen
sound (self, CHAN_WEAPON, "weapons/rhinore.wav", 1, ATTN_NORM);
@ -850,92 +756,75 @@ void() W_SecondTrigger =
}
}
// check for Plasmagun second Trigger
if (self.weapon == IT_PLASMAGUN) {
if (self.ammo_cells < 9) { // check for cells
// check for Plasmagun second Trigger
if (self.weapon == IT_PLASMAGUN)
{
// check for cells
if (self.ammo_cells < 9)
{
sound (self, CHAN_AUTO, "weapons/mfire2.wav", 1, ATTN_NORM);
}
else
} else {
if (self.st_mplasma < time) {
if (self.waterlevel > 1) { // explode under water
sound (self, CHAN_WEAPON, "weapons/mplasex.wav", 1, ATTN_NORM);
self.ammo_cells = 0;
W_SetCurrentAmmo ();
T_RadiusDamage (self, self, 250, world, "waterplasma");
return;
}
if (self.st_mplasma < time)
{
if (self.waterlevel > 1) //explode under water
{
sound (self, CHAN_WEAPON, "weapons/mplasex.wav", 1, ATTN_NORM);
self.ammo_cells = 0;
W_SetCurrentAmmo ();
T_RadiusDamage (self, self, 250, world, "waterplasma");
return;
self.weaponframe = 0;
SuperDamageSound();
self.st_mplasma = time + 1.9;
player_mplasma1();
launch_megaplasma();
} else {
SUB_Null ();
}
self.weaponframe = 0;
SuperDamageSound();
self.st_mplasma = time + 1.9;
player_mplasma1();
launch_megaplasma();
}
else
SUB_Null ();
}
// check for Super Shotgun second Trigger
if (self.weapon == IT_COMBOGUN)
{
// check for Super Shotgun second Trigger
if (self.weapon == IT_COMBOGUN) {
// check for rockets
if (self.ammo_rockets < 1)
{
if (self.ammo_rockets < 1) { // check for rockets
self.items = self.items - ( self.items & (IT_SHELLS) );
self.items = self.items | IT_ROCKETS;
self.currentammo = self.ammo_rockets;
self.which_ammo = 1;
sound (self, CHAN_WEAPON, "weapons/mfire1.wav", 1, ATTN_NORM);
} else {
if (self.st_pball < time) {
self.items = self.items - ( self.items & (IT_SHELLS) );
self.items = self.items | IT_ROCKETS;
self.currentammo = self.ammo_rockets;
self.which_ammo = 1;
player_gshot1();
SuperDamageSound();
W_FirePball();
self.st_pball = time + 0.9;
} else {
sound (self, CHAN_WEAPON, "weapons/mfire1.wav", 1, ATTN_NORM);
}
}
else
if (self.st_pball < time)
{
self.items = self.items - ( self.items & (IT_SHELLS) );
self.items = self.items | IT_ROCKETS;
self.currentammo = self.ammo_rockets;
self.which_ammo = 1;
player_gshot1();
SuperDamageSound();
W_FirePball();
self.st_pball = time + 0.9;
}
else
sound (self, CHAN_WEAPON, "weapons/mfire1.wav", 1, ATTN_NORM);
}
// check for GrenadeLauncher second Trigger
if (self.weapon == IT_GRENADE_LAUNCHER)
{
// check for rockets
if (self.ammo_rockets < 1)
{
// check for GrenadeLauncher second Trigger
if (self.weapon == IT_GRENADE_LAUNCHER) {
if (self.ammo_rockets < 1) { // check for rockets
sound (self, CHAN_WEAPON, "weapons/mfire1.wav", 1, ATTN_NORM);
} else {
if (self.st_mine < time) {
player_grenade1();
W_FireMine();
// big delay between refires helps keep the # of mines down in a deathmatch game
self.st_mine = time + 1.25;
} else {
sound (self, CHAN_WEAPON, "weapons/mfire1.wav", 1, ATTN_NORM);
}
}
else
if (self.st_mine < time)
{
player_grenade1();
W_FireMine();
//big delay between refires helps keep the # of mines down in a deathmatch game
self.st_mine = time + 1.25;
}
else
sound (self, CHAN_WEAPON, "weapons/mfire1.wav", 1, ATTN_NORM);
}
self.impulse = 0;

View file

@ -15,30 +15,21 @@ void() monster_shalrath = {remove(self);};
void() monster_enforcer = {remove(self);};
void() monster_oldone = {remove(self);};
void() event_lightning = {remove(self);};
/*
==============================================================================
MOVETARGET CODE
The angle of the movetarget effects standing and bowing direction, but has no effect on movement, which allways heads to the next target.
targetname
must be present. The name of this movetarget.
target
the next spot to move to. If not present, stop here for good.
pausetime
The number of seconds to spend standing or bowing for path_stand or path_bow
==============================================================================
*/
/*
=============
t_movetarget
Something has bumped into a movetarget. If it is a monster
moving towards it, change the next destination and continue.
==============
@ -46,20 +37,16 @@ moving towards it, change the next destination and continue.
void() t_movetarget =
{
local entity temp;
if (other.movetarget != self)
return;
if (other.enemy)
return; // fighting, not following a path
temp = self;
self = other;
other = temp;
if (self.classname == "monster_ogre")
sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);// play chainsaw drag sound
//dprint ("t_movetarget\n");
self.goalentity = self.movetarget = find (world, targetname, other.target);
self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin);
@ -70,9 +57,6 @@ local entity temp;
return;
}
};
void() movetarget_f =
{
if (!self.targetname)
@ -83,7 +67,6 @@ void() movetarget_f =
setsize (self, '-8 -8 -8', '8 8 8');
};
/*QUAKED path_corner (0.5 0.3 0) (-8 -8 -8) (8 8 8)
Monsters will continue walking towards the next target corner.
*/
@ -91,7 +74,4 @@ void() path_corner =
{
movetarget_f ();
};
//============================================================================

View file

@ -3,31 +3,23 @@ EMAIL: pox@planetquake.com
WEB: http://www.planetquake.com/paroxysm/
=========================================================================
*/
//Armor regeneration stations
//surprisingly little coding required to get this going
//Had to add a value/type check routine in T_Damage
//Armour is now gained by standing at Regen_stations,
//The colour of armour only indocates how much you have, it is always the same strength
//Here's a breakdown:
//1 - 50 points is blue
//51 - 150 points is yellow
//151 - 255 points is red
//POX v1.2 - moved to client.qc
//.float armregen;
//RegenStation Default Ambient Sound
void() regen_ambientsound =
{
ambientsound (self.origin, "ambience/regen1.wav", 0.5, ATTN_STATIC);
};
//POX v1.11 - particle stream replaced by a mdl with client side animation (for POXworld)
/*
//A paritcle effect for regen stations
void() regen_make_smoke =
@ -37,7 +29,6 @@ void() regen_make_smoke =
self.nextthink = time + 0.1;
};
*/
//Particle emiting entity
void(float colour) regen_streamer =
{
@ -48,9 +39,7 @@ void(float colour) regen_streamer =
streamer.movetype = MOVETYPE_TOSS;
setmodel(streamer, "progs/stream.mdl");
setsize (streamer, '-16 -16 0', '16 16 56');
streamer.velocity = '0 0 0';
setorigin(streamer, self.origin);
@ -59,13 +48,10 @@ void(float colour) regen_streamer =
regen_ambientsound();
};
void() regen_touch =
{
if (other.regen_finished > time) //already touched
return;
if (other.classname != "player")
return;
@ -79,32 +65,24 @@ void() regen_touch =
other.regen_finished = time + 0.2;
};
//Regen triggers for custom maps - can be BIG (whole rooms)
void() regen_station =
{
if (self.armregen <= 0)
self.armregen = 50;
InitTrigger ();
self.touch = regen_touch;
//self.netname = "regen station";
};
//These replace armor in existing Maps
void() item_armor1 =
{
precache_sound("ambience/regen1.wav");
precache_model ("progs/regen.mdl");
precache_model ("progs/stream.mdl");
self.touch = regen_touch;
setmodel (self, "progs/regen.mdl");
self.skin = 0;
setsize (self, '-16 -16 0', '16 16 56');
@ -114,25 +92,20 @@ void() item_armor1 =
self.movetype = MOVETYPE_TOSS;
self.velocity = '0 0 0';
self.origin_z = self.origin_z + 6;
self.armregen = 50;
//self.netname = "regen station";
regen_streamer(0);
};
void() item_armor2 =
{
precache_sound("ambience/regen1.wav");
precache_model ("progs/regen.mdl");
precache_model ("progs/stream.mdl");
self.touch = regen_touch;
setmodel (self, "progs/regen.mdl");
self.skin = 1;
setsize (self, '-16 -16 0', '16 16 56');
@ -146,20 +119,15 @@ void() item_armor2 =
//self.netname = "regen station";
regen_streamer(1);
};
void() item_armorInv =
{
precache_sound("ambience/regen1.wav");
precache_model ("progs/regen.mdl");
precache_model ("progs/stream.mdl");
self.touch = regen_touch;
setmodel (self, "progs/regen.mdl");
self.skin = 2;
setsize (self, '-16 -16 0', '16 16 56');
@ -173,7 +141,4 @@ void() item_armorInv =
//self.netname = "regen station";
regen_streamer(2);
};

View file

@ -2,65 +2,44 @@
EMAIL: pox@planetquake.com
WEB: http://www.planetquake.com/paroxysm
=========================================================================
Custom Paroxysm visual and audio effects
These are simple little ambient effects that are customizable within Quiver.
Feel free to use this code in anyway.
=========================================================================
*/
//NOT USED IN POXworld
.float spark_freq; // To avoid 'not a feild' server errors
void() e_spark =
{remove(self);};
void() a_drip =
{remove(self);};
/*
=================================================================================================
Custom Sound Entity (cust_sound)
The lack of a Mac sound editor that produces looping .wav files in a format that Quake understands
prompted the creation of this function. Then I added some options to make it worth while.
snd_attn - sets the sound's attenuation (defaults to ATTN_NORM (1))
snd_volume - sets the sounds overall volume (typically values of 0.5 to 1) default is 1
strt_onoff - 0 = initially on, 1 = initially off
snd_rep - number of times to play the sound (-2 is infinite loop)
snd_loop - delay in seconds before playing sound again (use sound length for looping sounds)
snd_rand - random seed, this number is multiplied by random() and added to loop (default 0 is no random)
the_snd - directory path to the sound - example: "misc/mysound.wav" NOTE: "sound/" is NOT needed
targetname - sounds can be triggered by using a targetname.
TOGGLE_SND - spawn flag, determines if sounds can be toggled on and off.
BUGS
1. Quake won't start playing these sounds on the first frame - (Unless you precache every possible sound
at world_spawn)
HACKY FIX - If you need a sound to play right away;
Position a trigger in such a way that it is touched when the player enters the map - NOT touching the
player initially (doesn't work on frame 1 remember?). Try making a trigger 4 units tall and place
info_player_start just above it. Not pretty, but it does the trick - Don't forget to set
strt_onoff to 1 (initially off) for this to work
2. When Quake no longer 'hears' or more arcurately - 'sees' the sound, it kills it until it comes into view
again. This causes the sound to stop playing and remsume at the NEXT loop point when it is in view, so for
sounds that must be looped constantly, I would reccomend using the ambient_sound function (see below)
=================================================================================================
*/
//NOTE: some of these .floats are used in ambient_sound as well (see below)
float TOGGLE_SND = 1;
.float snd_attn;
@ -71,17 +50,14 @@ float TOGGLE_SND = 1;
.float snd_loop;
.float snd_strt;
.string the_snd;
void() sound_think;
void() play_sound;
void() sound_wait =
{
// hang around until next use
self.nextthink = time + 60*10;
self.think = sound_wait;
};
void() stop_sound =
{
// if sound is set to toggle, silence it and set use to play
@ -99,7 +75,6 @@ void() stop_sound =
remove (self);
}
};
void() play_sound =
{
//infinite repeat
@ -122,7 +97,6 @@ void() play_sound =
}
};
void() sound_think =
{
// if sound is toggled, set next use to stop
@ -133,7 +107,6 @@ void() sound_think =
self.nextthink = time + (random()*self.snd_rand) + self.snd_loop;
self.think = play_sound;
};
void() cust_sound =
{
precache_sound (self.the_snd);
@ -168,7 +141,6 @@ void() cust_sound =
};
//Made this so custom ambient sounds could be called with a single function
//ONLY WORKS WITH LOOPED .WAV FILES
//Added a targetname attribute so ambient sounds can be triggered.
@ -176,12 +148,10 @@ void() cust_sound =
//To my knowledge you can't make these with existing Mac sound editors
//(you can make looping wavs, just not ones Quake will loop)
//CoolEdit 1.5 (for Windows) is the only editor that can create these looping wavs (to my knowledge)
void() ambientsound_go =
{
ambientsound (self.origin, self.the_snd, self.snd_volume, self.snd_attn);
};
void() ambient_sound =
{
precache_sound (self.the_snd);
@ -208,36 +178,26 @@ void() ambient_sound =
else
self.use = ambientsound_go;
};
/*
colour_light is a small hack to try and simulate coloured lighting.
It does this by calling the built-in v_cshift function
This can be used for 'atmospheric' effects like outdoor haze and darkness.
This function is overriden by Quake when under liquids and by the background flash when an item is picked up
The GL Quake command 'gl_polyblend 0' also negates this entity.
colourvalue - this is the only parameter, must be in this format;
v_cshift R G B I\n
where R is Red (0 - 255), G is Green (0 - 255), B is Rlue (0 - 255), and I is Intensity (0 - 255)
This effect works poorly in small increments in GL Quake, no colour will be noticeable until about an
intesity of about 5 (depending on the colour) and some colour/intensity combinations result in ugly
banding. It's best to test colour levels in the console before applying them in your map.
These entities are activated by touch (the colour shift only occurs when the player is touching the trigger field)
But can also be enabled/disabled by using a targetname.
The string must be exactly as shown (including the v_cshift and the carraige return
at the end) I could have used multiple stuffcmd statements to make it more user friendly but.. eh.
*/
void() colourlight_wait;
.string colourvalue;
float CLSTART_OFF = 1;
void() colourlight_off =
{
if(other.classname != "player")
@ -249,7 +209,6 @@ void() colourlight_off =
self.touch = SUB_Null;
};
void() colourlight_toggle =
{
//called after light is triggered a second time
@ -276,14 +235,11 @@ void() colourlight_use =
self.use = colourlight_toggle;
};
void() colourlight_wait =
{
//activated by a trigger so wait for touch
self.touch = colourlight_use;
};
void() colour_light =
{
InitTrigger ();
@ -298,23 +254,16 @@ void() colour_light =
self.use = colourlight_wait;
self.touch = SUB_Null;
}
};
/*
particle_stream
Changed for Paroxysm v1.11's new regen stations
Creates a regen stream-pulse model with out a grate and no touch
This entity should be used in conjunction with a regen_station trigger
clr = skin# (0 = blue, 1 = yellow, 2 = red)
*/
.float clr;
void() regen_ambientsound;
void() particle_stream =
{
precache_sound("ambience/regen1.wav");
@ -336,15 +285,12 @@ void() particle_stream =
makestatic (self);
};
/*
POX v1.2
misc_explobox
BSP based explo_box'es
Try to use rectangular objects, since entites use bounding box collision detection
*/
void() bsp_explode =
{
self.takedamage = DAMAGE_NO;
@ -352,6 +298,7 @@ void() bsp_explode =
// did say self.owner
T_RadiusDamage (self.trigger_field, self.trigger_field, self.dmg, world, "");
sound (self.trigger_field, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
WriteByte (MSG_MULTICAST, TE_EXPLOSION);
@ -362,9 +309,7 @@ void() bsp_explode =
remove (self);
remove (self.trigger_field);
};
void() misc_explobsp =
{
local entity spot;
@ -374,7 +319,6 @@ void() misc_explobsp =
setmodel (self, self.model);
setsize( self, self.mins, self.maxs );
precache_sound ("weapons/r_exp3.wav");
if (!self.health)

View file

@ -8,11 +8,9 @@
// have any weapons and things can explode.
//
// --- Zoid.
/*
===========
SpectatorConnect
called when a spectator connects to a server
============
*/
@ -21,14 +19,11 @@ void() SpectatorConnect =
bprint (PRINT_MEDIUM, "Spectator ");
bprint (PRINT_MEDIUM, self.netname);
bprint (PRINT_MEDIUM, " entered the game\n");
self.goalentity = world; // used for impulse 1 below
};
/*
===========
SpectatorDisconnect
called when a spectator disconnects from a server
============
*/
@ -38,11 +33,9 @@ void() SpectatorDisconnect =
bprint (PRINT_MEDIUM, self.netname);
bprint (PRINT_MEDIUM, " left the game\n");
};
/*
================
SpectatorImpulseCommand
Called by SpectatorThink if the spectator entered an impulse
================
*/
@ -61,14 +54,11 @@ void() SpectatorImpulseCommand =
self.fixangle = TRUE; // turn this way immediately
}
}
self.impulse = 0;
};
/*
================
SpectatorThink
Called every frame after physics are run
================
*/
@ -76,9 +66,6 @@ void() SpectatorThink =
{
// self.origin, etc contains spectator position, so you could
// do some neat stuff here
if (self.impulse)
SpectatorImpulseCommand();
};

View file

@ -1,10 +1,6 @@
void() SUB_Null = {};
void() SUB_Remove = {remove(self);};
/*
QuakeEd only writes a single float for angles (bad idea), so up and down are
just constant angles.
@ -23,7 +19,6 @@ vector() SetMovedir =
self.angles = '0 0 0';
};
/*
================
InitTrigger
@ -41,11 +36,9 @@ void() InitTrigger =
self.modelindex = 0;
self.model = "";
};
/*
=============
SUB_CalcMove
calculate self.velocity and self.nextthink to reach dest from
self.origin traveling at speed
===============
@ -55,23 +48,18 @@ void(entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt =
local entity stemp;
stemp = self;
self = ent;
SUB_CalcMove (tdest, tspeed, func);
self = stemp;
};
void(vector tdest, float tspeed, void() func) SUB_CalcMove =
{
local vector vdestdelta;
local float len, traveltime;
if (!tspeed)
objerror("No speed is defined!");
self.think1 = func;
self.finaldest = tdest;
self.think = SUB_CalcMoveDone;
if (tdest == self.origin)
{
self.velocity = '0 0 0';
@ -87,17 +75,14 @@ local float len, traveltime;
// divide by speed to get time to reach dest
traveltime = len / tspeed;
if (traveltime < 0.03)
traveltime = 0.03;
// set nextthink to trigger a think when dest is reached
self.nextthink = self.ltime + traveltime;
// scale the destdelta vector by the time spent traveling to get velocity
self.velocity = vdestdelta * (1/traveltime); // qcc won't take vec/float
};
/*
============
After moving, set origin to exact final destination
@ -111,15 +96,11 @@ void() SUB_CalcMoveDone =
if (self.think1)
self.think1();
};
/*
=============
SUB_CalcAngleMove
calculate self.avelocity and self.nextthink to reach destangle from
self.angles rotating
The calling function should make sure self.think is valid
===============
*/
@ -131,12 +112,10 @@ local entity stemp;
SUB_CalcAngleMove (destangle, tspeed, func);
self = stemp;
};
void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove =
{
local vector destdelta;
local float len, traveltime;
if (!tspeed)
objerror("No speed is defined!");
@ -148,10 +127,8 @@ local float len, traveltime;
// divide by speed to get time to reach dest
traveltime = len / tspeed;
// set nextthink to trigger a think when dest is reached
self.nextthink = self.ltime + traveltime;
// scale the destdelta vector by the time spent traveling to get velocity
self.avelocity = destdelta * (1 / traveltime);
@ -159,7 +136,6 @@ local float len, traveltime;
self.finalangle = destangle;
self.think = SUB_CalcAngleMoveDone;
};
/*
============
After rotating, set angle to exact final angle
@ -173,40 +149,29 @@ void() SUB_CalcAngleMoveDone =
if (self.think1)
self.think1();
};
//=============================================================================
void() DelayThink =
{
activator = self.enemy;
SUB_UseTargets ();
remove(self);
};
/*
==============================
SUB_UseTargets
the global "activator" should be set to the entity that initiated the firing.
If self.delay is set, a DelayedUse entity will be created that will actually
do the SUB_UseTargets after that many seconds have passed.
Centerprints any self.message to the activator.
Removes all entities with a targetname that match self.killtarget,
and removes them, so some events can remove other triggers.
Search for (string)targetname in all entities that
match (string)self.target and call their .use function
==============================
*/
void() SUB_UseTargets =
{
local entity t, stemp, otemp, act;
//
// check for a delay
//
@ -236,7 +201,6 @@ void() SUB_UseTargets =
if (!self.noise)
sound (activator, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM);
}
//
// kill the killtagets
//
@ -281,6 +245,4 @@ void() SUB_UseTargets =
} while ( 1 );
}
};

View file

@ -1,6 +1,5 @@
// POX - v1.1 target identifier ala Quake3 - displays the name of players who cross your sight
// by Frank Condello (POX) - http://www.planetquake.com/paroxysm/ - pox@planetquake.com
/* POX - from original Quake ai.qc
=============
visible
@ -17,14 +16,11 @@ float (entity targ) visible =
if (trace_inopen && trace_inwater)
return FALSE; // sight line crossed contents
if (trace_fraction == 1)
return TRUE;
return FALSE;
};
// Short and sweet....
void() ID_CheckTarget =
{
@ -37,11 +33,9 @@ void() ID_CheckTarget =
self.last_target_id = world;
traceline (self.origin , (self.origin+(v_forward * 800)) , FALSE , self);
org = trace_endpos;
spot = findradius(org, 200);
while (spot)
{
if ((spot.classname == "player") && spot.takedamage)
@ -75,5 +69,4 @@ void() ID_CheckTarget =
spot = spot.chain;
}
};

View file

@ -1,17 +1,12 @@
entity stemp, otemp, s, old;
void() trigger_reactivate =
{
self.solid = SOLID_TRIGGER;
};
//=============================================================================
float SPAWNFLAG_NOMESSAGE = 1;
float SPAWNFLAG_NOTOUCH = 1;
// the wait time has passed, so set back up for another activation
void() multi_wait =
{
@ -22,8 +17,6 @@ void() multi_wait =
self.solid = SOLID_BBOX;
}
};
// the trigger was just touched/killed/used
// self.enemy should be set to the activator so it can be held through a delay
// so wait for the delay time before firing
@ -33,7 +26,6 @@ void() multi_trigger =
{
return; // allready been triggered
}
if (self.classname == "trigger_secret")
{
if (self.enemy.classname != "player")
@ -41,17 +33,13 @@ void() multi_trigger =
found_secrets = found_secrets + 1;
WriteByte (MSG_ALL, SVC_FOUNDSECRET);
}
if (self.noise)
sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
// don't trigger again until reset
self.takedamage = DAMAGE_NO;
activator = self.enemy;
SUB_UseTargets();
if (self.wait > 0)
{
self.think = multi_wait;
@ -65,19 +53,16 @@ void() multi_trigger =
self.think = SUB_Remove;
}
};
void() multi_killed =
{
self.enemy = damage_attacker;
multi_trigger();
};
void() multi_use =
{
self.enemy = activator;
multi_trigger();
};
void() multi_touch =
{
if (other.classname != "player")
@ -94,7 +79,6 @@ void() multi_touch =
self.enemy = other;
multi_trigger ();
};
/*QUAKED trigger_multiple (.5 .5 .5) ? notouch
Variable sized repeatable trigger. Must be targeted at one or more entities. If "health" is set, the trigger must be killed to activate each time.
If "delay" is set, the trigger waits some time after activating before firing.
@ -129,9 +113,7 @@ void() trigger_multiple =
if (!self.wait)
self.wait = 0.2;
self.use = multi_use;
InitTrigger ();
if (self.health)
{
if (self.spawnflags & SPAWNFLAG_NOTOUCH)
@ -155,8 +137,6 @@ void() trigger_multiple =
}
}
};
/*QUAKED trigger_once (.5 .5 .5) ? notouch
Variable sized trigger. Triggers once, then removes itself. You must set the key "target" to the name of another object in the level that has a matching
"targetname". If "health" is set, the trigger must be killed to activate.
@ -175,9 +155,7 @@ void() trigger_once =
self.wait = -1;
trigger_multiple();
};
//=============================================================================
/*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8)
This fixed size trigger cannot be touched, it can only be fired by other events. It can contain killtargets, targets, delays, and messages.
*/
@ -185,10 +163,7 @@ void() trigger_relay =
{
self.use = SUB_UseTargets;
};
//=============================================================================
/*QUAKED trigger_secret (.5 .5 .5) ?
secret counter trigger
sounds
@ -217,13 +192,9 @@ void() trigger_secret =
precache_sound ("misc/talk.wav");
self.noise = "misc/talk.wav";
}
trigger_multiple ();
};
//=============================================================================
void() counter_use =
{
self.count = self.count - 1;
@ -258,12 +229,9 @@ void() counter_use =
self.enemy = activator;
multi_trigger ();
};
/*QUAKED trigger_counter (.5 .5 .5) ? nomessage
Acts as an intermediary for an action that takes multiple inputs.
If nomessage is not set, t will print "1 more.. " etc when triggered and "sequence complete" when finished.
After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself.
*/
void() trigger_counter =
@ -271,22 +239,15 @@ void() trigger_counter =
self.wait = -1;
if (!self.count)
self.count = 2;
self.use = counter_use;
};
/*
==============================================================================
TELEPORT TRIGGERS
==============================================================================
*/
float PLAYER_ONLY = 1;
float SILENT = 2;
void() play_teleport =
{
local string tmpstr;
@ -295,18 +256,15 @@ void() play_teleport =
tmpstr = "misc/r_tele1.wav";
else
tmpstr = "misc/r_tele2.wav";
sound (self, CHAN_VOICE, tmpstr, 1, ATTN_NORM);
remove (self);
};
void(vector org) spawn_tfog =
{
s = spawn ();
s.origin = org;
s.nextthink = time + 0.1;// + POX - quicker
s.think = play_teleport;
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
WriteByte (MSG_MULTICAST, TE_TELEPORT);
WriteCoord (MSG_MULTICAST, org_x);
@ -314,15 +272,11 @@ void(vector org) spawn_tfog =
WriteCoord (MSG_MULTICAST, org_z);
multicast (org, MULTICAST_PHS);
};
void() tdeath_touch =
{
local entity other2;
if (other == self.owner)
return;
// frag anyone who teleports in on top of an invincible player
if (other.classname == "player")
{
@ -345,18 +299,14 @@ void() tdeath_touch =
}
}
if (other.health)
{
T_Damage (other, self, self, 50000);
}
};
void(vector org, entity death_owner) spawn_tdeath =
{
local entity death;
death = spawn();
death.classname = "teledeath";
death.movetype = MOVETYPE_NONE;
@ -371,12 +321,10 @@ local entity death;
force_retouch = 2; // make sure even still objects get hit
};
void() teleport_touch =
{
local entity t;
local vector org;
if (self.targetname)
{
if (self.nextthink < time)
@ -390,16 +338,12 @@ local vector org;
if (other.classname != "player")
return;
}
// only teleport living creatures
if (other.health <= 0 || other.solid != SOLID_SLIDEBOX)
return;
SUB_UseTargets ();
// put a tfog where the player was
spawn_tfog (other.origin);
t = find (world, targetname, self.target);
if (!t)
objerror ("couldn't find target");
@ -407,10 +351,8 @@ local vector org;
// spawn a tfog flash in front of the destination
makevectors (t.mangle);
org = t.origin + 32 * v_forward;
spawn_tfog (org);
spawn_tdeath(t.origin, other);
// move the player and lock him down for a little while
if (!other.health)
{
@ -418,7 +360,6 @@ local vector org;
other.velocity = (v_forward * other.velocity_x) + (v_forward * other.velocity_y);
return;
}
setorigin (other, t.origin);
other.angles = t.mangle;
if (other.classname == "player")
@ -434,7 +375,6 @@ local vector org;
}
other.flags = other.flags - other.flags & FL_ONGROUND;
};
/*QUAKED info_teleport_destination (.5 .5 .5) (-8 -8 -8) (8 8 32)
This is the destination marker for a teleporter. It should have a "targetname" field with the same value as a teleporter's "target" field.
*/
@ -448,30 +388,25 @@ void() info_teleport_destination =
if (!self.targetname)
objerror ("no targetname");
};
void() teleport_use =
{
self.nextthink = time + 0.2;
force_retouch = 2; // make sure even still objects get hit
self.think = SUB_Null;
};
/*QUAKED trigger_teleport (.5 .5 .5) ? PLAYER_ONLY SILENT
Any object touching this will be transported to the corresponding info_teleport_destination entity. You must set the "target" field, and create an object with a "targetname" field that matches.
If the trigger_teleport has a targetname, it will only teleport entities when it has been fired.
*/
void() trigger_teleport =
{
local vector o;
InitTrigger ();
self.touch = teleport_touch;
// find the destination
if (!self.target)
objerror ("no target");
self.use = teleport_use;
if (!(self.spawnflags & SILENT))
{
precache_sound ("ambience/hum1.wav");
@ -479,15 +414,11 @@ void() trigger_teleport =
ambientsound (o, "ambience/hum1.wav",0.5 , ATTN_STATIC);
}
};
/*
==============================================================================
trigger_setskill
==============================================================================
*/
/*QUAKED trigger_setskill (.5 .5 .5) ?
sets skill level to the value of "message".
Only used on start map.
@ -496,23 +427,17 @@ void() trigger_setskill =
{
remove (self);
};
/*
==============================================================================
ONLY REGISTERED TRIGGERS
==============================================================================
*/
void() trigger_onlyregistered_touch =
{
if (other.classname != "player")
return;
if (self.attack_finished > time)
return;
self.attack_finished = time + 2;
if (cvar("registered"))
{
@ -531,7 +456,6 @@ void() trigger_onlyregistered_touch =
}
}
};
/*QUAKED trigger_onlyregistered (.5 .5 .5) ?
Only fires if playing the registered version, otherwise prints the message
*/
@ -541,15 +465,12 @@ void() trigger_onlyregistered =
InitTrigger ();
self.touch = trigger_onlyregistered_touch;
};
//============================================================================
void() hurt_on =
{
self.solid = SOLID_TRIGGER;
self.nextthink = -1;
};
void() hurt_touch =
{
if (other.takedamage)
@ -559,10 +480,8 @@ void() hurt_touch =
self.think = hurt_on;
self.nextthink = time + 1;
}
return;
};
/*QUAKED trigger_hurt (.5 .5 .5) ?
Any object touching this will be hurt
set dmg to damage amount
@ -575,11 +494,8 @@ void() trigger_hurt =
if (!self.dmg)
self.dmg = 5;
};
//============================================================================
float PUSH_ONCE = 1;
void() trigger_push_touch =
{
if (other.classname == "grenade")
@ -599,8 +515,6 @@ void() trigger_push_touch =
if (self.spawnflags & PUSH_ONCE)
remove(self);
};
/*QUAKED trigger_push (.5 .5 .5) ? PUSH_ONCE
Pushes the player
*/
@ -612,24 +526,18 @@ void() trigger_push =
if (!self.speed)
self.speed = 1000;
};
/*--------------------
trigger_bouncepad
POX v1.2 - Adds Q3A style bounce pads
It's kind of a low level entity to create, you must grasp the concept of 3D vectors and acceleration to get it to work
angles - must be entered as '0 0 0' (roll, pitch, yaw) in English, that's (left/right, forward/backward, up/down)
so, negative numbers are (left, back, down) positive numbers are (right, forward, up) The bigger the number,
(in the positive or negative direction) the greater the acceleration in that direction.
A value of (0 40 800) is a good starting point for a vertical, slightly-forward bounce
(Just remeber that forward (pitch) is ALWAYS NORTH when viewing a map from above)
Use SMALL triggers for this one (it has a touch timeout to prevent serious acceleration)
---------------------*/
.float bounce_time;
void() trigger_bounce_touch =
{
if (other.bounce_time > time)
@ -643,8 +551,6 @@ void() trigger_bounce_touch =
sound (other, CHAN_AUTO, "misc/menu2.wav", 1, ATTN_NORM);
}
};
void() trigger_bouncepad =
{
self.solid = SOLID_TRIGGER;
@ -652,18 +558,13 @@ void() trigger_bouncepad =
self.movetype = MOVETYPE_NONE;
self.modelindex = 0;
self.model = "";
self.touch = trigger_bounce_touch;
};
//============================================================================
void() trigger_monsterjump_touch =
{
if ( other.flags & (FL_MONSTER | FL_FLY | FL_SWIM) != FL_MONSTER )
return;
// set XY even if not on ground, so the jump will clear lips
other.velocity_x = self.movedir_x * self.speed;
other.velocity_y = self.movedir_y * self.speed;
@ -672,10 +573,8 @@ void() trigger_monsterjump_touch =
return;
other.flags = other.flags - FL_ONGROUND;
other.velocity_z = self.height;
};
/*QUAKED trigger_monsterjump (.5 .5 .5) ?
Walking monsters that touch this will jump in the direction of the trigger's angle
"speed" default to 200, the speed thrown forward
@ -692,4 +591,3 @@ void() trigger_monsterjump =
InitTrigger ();
self.touch = trigger_monsterjump_touch;
};

View file

@ -7,42 +7,70 @@ void() W_Precache =
{
precache_model ("progs/plasma.mdl");
precache_model ("progs/laser.mdl");
precache_sound ("weapons/r_exp3.wav"); // new rocket explosion
precache_sound ("weapons/r_exp3.wav"); // new rocket explosion
precache_sound ("weapons/rocket1i.wav"); // spike gun
precache_sound ("weapons/sgun1.wav");
precache_sound ("weapons/ric1.wav"); // ricochet (used in c code)
precache_sound ("weapons/ric2.wav"); // ricochet (used in c code)
precache_sound ("weapons/ric3.wav"); // ricochet (used in c code)
precache_sound ("weapons/spike2.wav"); // super spikes
precache_sound ("weapons/nailgun.wav"); // new nailgun sound
precache_sound ("weapons/tink1.wav"); // spikes tink (used in c code)
precache_sound ("weapons/ric1.wav"); // ricochet (used in c code)
precache_sound ("weapons/ric2.wav"); // ricochet (used in c code)
precache_sound ("weapons/ric3.wav"); // ricochet (used in c code)
precache_sound ("weapons/spike2.wav"); // super spikes
precache_sound ("weapons/hog.wav"); // new nailgun sound
precache_sound ("weapons/tink1.wav"); // spikes tink (used in c code)
precache_sound ("weapons/tink2.wav");
precache_sound ("weapons/grenade.wav"); // grenade launcher
precache_sound ("weapons/gren.wav"); // grenade launcher
precache_sound ("weapons/gren2.wav"); // second trigger grenades
precache_sound ("weapons/bounce.wav"); // grenade bounce
precache_sound ("weapons/bounce2.wav"); // grenade bounce alt
precache_sound ("weapons/shotgn2.wav"); // super shotgun
precache_sound ("weapons/shotgn2.wav"); // super shotgun
precache_sound ("weapons/mfire1.wav"); // missfire
precache_sound ("weapons/mfire2.wav"); // megaplasma burst missfire
precache_sound ("weapons/mfire1.wav"); // misfire
precache_sound ("weapons/mfire2.wav"); // megaplasma burst misfire
precache_sound ("weapons/plasma.wav"); // plasmagun fire
precache_sound ("weapons/mplasma.wav"); // megaplasmagun fire
precache_sound ("weapons/mplasex.wav"); // megaplasmagun explosion
precache_sound ("weapons/ssgrnde.wav"); // super shotgun grenade fire
precache_sound ("weapons/gren.wav"); // super shotgun grenade fire
precache_sound ("weapons/armed.wav"); // mine armed sound
precache_sound ("weapons/minedet.wav"); //mine detonate click
precache_sound ("weapons/minedet.wav"); //mine detonate click
precache_sound ("weapons/rhino.wav"); //rhino firing sound
precache_sound ("weapons/rhinore.wav"); //rhino reload sound
precache_sound ("weapons/error.wav"); //weapon error sound
precache_sound ("weapons/rhino.wav"); //rhino firing sound
precache_sound ("weapons/rhinore.wav"); //rhino reload sound
precache_sound ("weapons/error.wav"); //weapon error sound
precache_sound ("weapons/tsload.wav"); //t-shot load
precache_sound ("weapons/tsfire.wav"); //t-shot single fire
precache_sound ("weapons/ts3fire.wav"); //t-shot triple fire
precache_sound ("weapons/tsload.wav"); //t-shot load
precache_sound ("weapons/tsfire.wav"); //t-shot single fire
precache_sound ("weapons/ts3fire.wav"); //t-shot triple fire
precache_sound ("weapons/shrapdet.wav"); //ShrapnelBomb detonation-confirmation beep
//Shrapnel Model
precache_model("progs/mwrub1.mdl");
precache_sound ("weapons/shrapdet.wav"); //ShrapnelBomb detonation-confirmation beep
/*
Precached models
*/
precache_model ("progs/mwrub1.mdl"); //Shrapnel Model
/*
// VisWeap - Player
precache_model ("progs/bsaw_p.mdl");
precache_model ("progs/tshot_p.mdl");
precache_model ("progs/combo_p.mdl");
precache_model ("progs/plasma_p.mdl");
precache_model ("progs/nail_p.mdl");
precache_model ("progs/gren_p.mdl");
precache_model ("progs/rhino_p.mdl");
// VisWeap - Weapon drop
precache_model ("progs/d_bsaw.mdl");
precache_model ("progs/d_tshot.mdl");
precache_model ("progs/d_combo.mdl");
precache_model ("progs/d_plasma.mdl");
precache_model ("progs/d_nail.mdl");
precache_model ("progs/d_gren.mdl");
precache_model ("progs/d_rhino.mdl");
// No weapon Death Model (weapons are dropped)
precache_model ("progs/death_p.mdl");
*/
};
/*
@ -63,17 +91,14 @@ void() W_FireAxe =
org = trace_endpos - v_forward*4;
if (trace_ent.takedamage)
{
if (trace_ent.takedamage) {
trace_ent.axhitme = 1;
SpawnBlood (org, 20);
//if (deathmatch > 3)
// T_Damage (trace_ent, self, self, 75);
//else
T_Damage (trace_ent, self, self, 20);
}
else
{ // hit wall
} else { // hit wall
sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
@ -119,21 +144,6 @@ void(vector org, vector vel) SpawnMeatSpray =
setorigin (missile, org);
};
// + POX - SpawnNoBleed
// Entities with .nobleed=TRUE will display a gunshot particle instead of blood
void(vector org, float damage) SpawnNoBleed =
{
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
WriteByte (MSG_MULTICAST, TE_GUNSHOT);
WriteByte (MSG_MULTICAST, 5);
WriteCoord (MSG_MULTICAST, org_x);
WriteCoord (MSG_MULTICAST, org_y);
WriteCoord (MSG_MULTICAST, org_z);
multicast (org, MULTICAST_PVS);
};
// - POX
/*
================
SpawnBlood
@ -141,21 +151,19 @@ SpawnBlood
*/
void(vector org, float damage) SpawnBlood =
{
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
// + POX - check for a bleeder
if (trace_ent.nobleed)
SpawnNoBleed (org, damage);
else
// - POX
{
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
if (trace_ent.nobleed) {
WriteByte (MSG_MULTICAST, TE_GUNSHOT);
WriteByte (MSG_MULTICAST, 5);
} else {
WriteByte (MSG_MULTICAST, TE_BLOOD);
WriteByte (MSG_MULTICAST, 1);
WriteCoord (MSG_MULTICAST, org_x);
WriteCoord (MSG_MULTICAST, org_y);
WriteCoord (MSG_MULTICAST, org_z);
multicast (org, MULTICAST_PVS);
}
WriteCoord (MSG_MULTICAST, org_x);
WriteCoord (MSG_MULTICAST, org_y);
WriteCoord (MSG_MULTICAST, org_z);
multicast (org, MULTICAST_PVS);
};
@ -170,12 +178,7 @@ void(float damage) spawn_touchblood =
vel = wall_velocity () * 0.2;
// + POX - check for a bleeder
if (other.nobleed)
SpawnNoBleed (self.origin + vel*0.01, damage);
else
// - POX
SpawnBlood (self.origin + vel*0.01, damage);
SpawnBlood (self.origin + vel*0.01, damage);
};
/*
@ -580,7 +583,7 @@ void() W_FireGrenade =
{
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
sound (self, CHAN_WEAPON, "weapons/gren.wav", 1, ATTN_NORM);
msg_entity = self;
WriteByte (MSG_ONE, SVC_SMALLKICK);
@ -828,7 +831,7 @@ void(float ox) W_FireNails =
self.weaponmodel = "progs/v_nailgl.mdl"; // light up nailgun barrels
sound (self, CHAN_WEAPON, "weapons/nailgun.wav", 1, ATTN_NORM);
sound (self, CHAN_WEAPON, "weapons/hog.wav", 0.8, ATTN_NORM);
self.currentammo = self.ammo_nails = self.ammo_nails - 1;

View file

@ -1,49 +1,38 @@
void() InitBodyQue;
void() main =
{
dprint ("main function\n");
// these are just commands the the prog compiler to copy these files
precache_file ("progs.dat");
precache_file ("gfx.wad");
precache_file ("quake.rc");
precache_file ("default.cfg");
precache_file ("end1.bin");
precache_file2 ("end2.bin");
precache_file ("demo1.dem");
precache_file ("demo2.dem");
precache_file ("demo3.dem");
//
// these are all of the lumps from the cached.ls files
//
precache_file ("gfx/palette.lmp");
precache_file ("gfx/colormap.lmp");
precache_file2 ("gfx/pop.lmp");
precache_file ("gfx/complete.lmp");
precache_file ("gfx/inter.lmp");
precache_file ("gfx/ranking.lmp");
precache_file ("gfx/vidmodes.lmp");
precache_file ("gfx/finale.lmp");
precache_file ("gfx/conback.lmp");
precache_file ("gfx/qplaque.lmp");
precache_file ("gfx/menudot1.lmp");
precache_file ("gfx/menudot2.lmp");
precache_file ("gfx/menudot3.lmp");
precache_file ("gfx/menudot4.lmp");
precache_file ("gfx/menudot5.lmp");
precache_file ("gfx/menudot6.lmp");
precache_file ("gfx/menuplyr.lmp");
precache_file ("gfx/bigbox.lmp");
precache_file ("gfx/dim_modm.lmp");
@ -87,26 +76,20 @@ void() main =
precache_file ("gfx/help3.lmp");
precache_file ("gfx/help4.lmp");
precache_file ("gfx/help5.lmp");
precache_file ("gfx/pause.lmp");
precache_file ("gfx/loading.lmp");
precache_file ("gfx/p_option.lmp");
precache_file ("gfx/p_load.lmp");
precache_file ("gfx/p_save.lmp");
precache_file ("gfx/p_multi.lmp");
// sounds loaded by C code
precache_sound ("misc/menu1.wav");
precache_sound ("misc/menu2.wav");
precache_sound ("misc/menu3.wav");
precache_sound ("ambience/water1.wav");
precache_sound ("ambience/wind2.wav");
// shareware
precache_file ("maps/start.bsp");
precache_file ("maps/e1m1.bsp");
precache_file ("maps/e1m2.bsp");
precache_file ("maps/e1m3.bsp");
@ -115,10 +98,8 @@ void() main =
precache_file ("maps/e1m6.bsp");
precache_file ("maps/e1m7.bsp");
precache_file ("maps/e1m8.bsp");
// registered
precache_file2 ("gfx/pop.lmp");
precache_file2 ("maps/e2m1.bsp");
precache_file2 ("maps/e2m2.bsp");
precache_file2 ("maps/e2m3.bsp");
@ -126,7 +107,6 @@ void() main =
precache_file2 ("maps/e2m5.bsp");
precache_file2 ("maps/e2m6.bsp");
precache_file2 ("maps/e2m7.bsp");
precache_file2 ("maps/e3m1.bsp");
precache_file2 ("maps/e3m2.bsp");
precache_file2 ("maps/e3m3.bsp");
@ -134,7 +114,6 @@ void() main =
precache_file2 ("maps/e3m5.bsp");
precache_file2 ("maps/e3m6.bsp");
precache_file2 ("maps/e3m7.bsp");
precache_file2 ("maps/e4m1.bsp");
precache_file2 ("maps/e4m2.bsp");
precache_file2 ("maps/e4m3.bsp");
@ -143,9 +122,7 @@ void() main =
precache_file2 ("maps/e4m6.bsp");
precache_file2 ("maps/e4m7.bsp");
precache_file2 ("maps/e4m8.bsp");
precache_file2 ("maps/end.bsp");
precache_file2 ("maps/dm1.bsp");
precache_file2 ("maps/dm2.bsp");
precache_file2 ("maps/dm3.bsp");
@ -153,16 +130,12 @@ void() main =
precache_file2 ("maps/dm5.bsp");
precache_file2 ("maps/dm6.bsp");
};
entity lastspawn;
//=======================
/*QUAKED worldspawn (0 0 0) ?
Only used for the world entity.
Set message to the level name.
Set sounds to the cd track to play.
World Types:
0: medieval
1: metal
@ -173,37 +146,27 @@ void() worldspawn =
{
lastspawn = world;
InitBodyQue ();
rj = 1;
// custom map attributes
if (self.model == "maps/e1m8.bsp")
cvar_set ("sv_gravity", "100");
// +POX
else
cvar_set ("sv_gravity", "790");
cvar_set ("sv_friction", "3.12");
// + POX-- make sure gamedir is "pox"
if (infokey(world, "*gamedir") != "pox")
error("Gamedir must be pox\n");
if (infokey(world, "*gamedir") != "paroxysm")
error("Gamedir must be \"paroxysm\"\n");
// - POX
//POX - for Last Man Standing Mode
fraglimit_LMS = cvar("fraglimit");
// -POX
// the area based ambient sounds MUST be the first precache_sounds
// player precaches
W_Precache (); // get weapon precaches
// sounds used from C physics code
precache_sound ("demon/dland2.wav"); // landing thud
precache_sound ("misc/h2ohit1.wav"); // landing splash
// setup precaches allways needed
precache_sound ("items/itembk2.wav"); // item respawn sound
precache_sound ("player/plyrjmp8.wav"); // player jump
@ -214,7 +177,6 @@ void() worldspawn =
precache_sound ("player/gasp1.wav"); // gasping for air
precache_sound ("player/gasp2.wav"); // taking breath
precache_sound ("player/h2odeath.wav"); // drowning death
precache_sound ("misc/talk.wav"); // talk
precache_sound ("player/teledth1.wav"); // telefrag
precache_sound ("misc/r_tele1.wav"); // teleport sounds
@ -228,69 +190,54 @@ void() worldspawn =
precache_sound ("weapons/lhit.wav"); //lightning
precache_sound ("weapons/lstart.wav"); //lightning start
precache_sound ("items/damage3.wav");
precache_sound ("misc/power.wav"); //lightning for boss
// player gib sounds
precache_sound ("player/gib.wav"); // player gib sound
precache_sound ("player/udeath.wav"); // player gib sound
precache_sound ("player/tornoff2.wav"); // gib sound
// player pain sounds
precache_sound ("player/pain1.wav");
precache_sound ("player/pain2.wav");
precache_sound ("player/pain3.wav");
precache_sound ("player/pain4.wav");
precache_sound ("player/pain5.wav");
precache_sound ("player/pain6.wav");
// player death sounds
precache_sound ("player/death1.wav");
precache_sound ("player/death2.wav");
precache_sound ("player/death3.wav");
precache_sound ("player/death4.wav");
precache_sound ("player/death5.wav");
precache_sound ("boss1/sight1.wav");
// ax sounds
precache_sound ("weapons/ax1.wav"); // ax swoosh
precache_sound ("player/axhit1.wav"); // ax hit meat
precache_sound ("player/axhit2.wav"); // ax hit world
precache_sound ("player/h2ojump.wav"); // player jumping into water
precache_sound ("player/slimbrn2.wav"); // player enter slime
precache_sound ("player/inh2o.wav"); // player enter water
precache_sound ("player/inlava.wav"); // player enter lava
precache_sound ("misc/outwater.wav"); // leaving water sound
precache_sound ("player/lburn1.wav"); // lava burn
precache_sound ("player/lburn2.wav"); // lava burn
precache_sound ("misc/water1.wav"); // swimming
precache_sound ("misc/water2.wav"); // swimming
// Invulnerability sounds
precache_sound ("items/protect.wav");
precache_sound ("items/protect2.wav");
precache_sound ("items/protect3.wav");
// POX - for Predator Mode
precache_sound ("items/inv1.wav");
precache_sound ("items/inv2.wav");
precache_sound ("items/inv3.wav");
precache_model ("progs/player.mdl");
precache_model ("progs/eyes.mdl");
precache_model ("progs/h_player.mdl");
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
precache_model ("progs/s_bubble.spr"); // drowning bubbles
precache_model ("progs/s_explod.spr"); // sprite explosion
precache_model ("progs/v_axe.mdl");
/*
precache_model ("progs/v_shot.mdl");
@ -299,8 +246,6 @@ void() worldspawn =
precache_model ("progs/v_shot2.mdl");
precache_model ("progs/v_nail2.mdl");
precache_model ("progs/v_rock2.mdl");
precache_model ("progs/bolt.mdl"); // for lightning gun
precache_model ("progs/bolt2.mdl"); // for lightning gun
precache_model ("progs/bolt3.mdl"); // for boss shock
@ -311,13 +256,9 @@ void() worldspawn =
precache_model ("progs/grenade.mdl");
precache_model ("progs/spike.mdl");
precache_model ("progs/s_spike.mdl");
precache_model ("progs/backpack.mdl");
precache_model ("progs/zom_gib.mdl");
//precache_model ("progs/v_light.mdl");
// + POX precaches
precache_sound ("misc/owater2.wav"); // leaving water sound
precache_sound ("misc/inh2ob.wav"); // renter water
@ -337,7 +278,6 @@ void() worldspawn =
precache_sound ("misc/foot2.wav");
precache_sound ("misc/foot3.wav");
precache_sound ("misc/foot4.wav");
//Narration
precache_sound ("nar/n_elim.wav");
@ -350,11 +290,9 @@ void() worldspawn =
//Bounce pad sound
precache_sound ("misc/menu2.wav");
// - POX
//
// Setup light animation tables. 'a' is total darkness, 'z' is maxbright.
//
// 0 normal
lightstyle(0, "m");
@ -388,23 +326,18 @@ void() worldspawn =
// + POX lightstyles
// 12 SLOW STROBE2
lightstyle(12, "ggggggzzzzzzgggggg");
// 13 SLOW STROBE3
lightstyle(13, "ggggggggggggzzzzzz");
// 10 FLUORESCENT FLICKER
lightstyle(10, "bbbbbmmmccmmamambbbmmbbbbmmaammmcccmamamm");
// 11 SLOW PULSE NOT FADE TO BLACK
lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");
// styles 32-62 are assigned by the light program for switchable lights
// 63 testing
lightstyle(63, "a");
};
void() StartFrame =
{
timelimit = cvar("timelimit") * 60;
@ -415,22 +348,16 @@ void() StartFrame =
framecount = framecount + 1;
};
/*
==============================================================================
BODY QUE
==============================================================================
*/
entity bodyque_head;
void() bodyque =
{ // just here so spawn functions don't complain after the world
// creates bodyques
};
void() InitBodyQue =
{
bodyque_head = spawn();
@ -443,8 +370,6 @@ void() InitBodyQue =
bodyque_head.owner.owner.owner.classname = "bodyque";
bodyque_head.owner.owner.owner.owner = bodyque_head;
};
// make a body que entry for the given ent so the ent can be
// respawned elsewhere
void(entity ent) CopyToBodyQue =
@ -461,5 +386,3 @@ void(entity ent) CopyToBodyQue =
setsize (bodyque_head, ent.mins, ent.maxs);
bodyque_head = bodyque_head.owner;
};