Compare commits
5 commits
Author | SHA1 | Date | |
---|---|---|---|
|
0e20a29227 | ||
|
5ec19369e5 | ||
|
88be1d246c | ||
|
2a4c0638b2 | ||
|
ba33f2e180 |
20 changed files with 1375 additions and 409 deletions
85
amtest.qc
85
amtest.qc
|
@ -1,85 +0,0 @@
|
|||
/*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
|
||||
~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
|
||||
|
||||
void() test_teleport_touch;
|
||||
void() tele_done;
|
||||
|
||||
/*QUAKED test_teleport (0 .5 .8) ?
|
||||
Teleporter testing
|
||||
*/
|
||||
void() test_teleport =
|
||||
{
|
||||
precache_model ("sprites/s_aball.spr");
|
||||
setsize (self, self.mins, self.maxs);
|
||||
self.touch = test_teleport_touch;
|
||||
self.solid = 1;
|
||||
|
||||
if (!self.target)
|
||||
objerror ("no target\n");
|
||||
};
|
||||
|
||||
void() test_teleport_touch =
|
||||
{
|
||||
local entity oldself;
|
||||
other.movetype = MOVETYPE_TOSS;
|
||||
// other.solid = SOLID_NOT;
|
||||
other.dest = '256 -128 -128';
|
||||
oldself = self;
|
||||
self = other;
|
||||
// SUB_CalcMove (self.dest, 200, tele_done);
|
||||
self.velocity = '1000 0 0 ';
|
||||
self = oldself;
|
||||
};
|
||||
|
||||
void() tele_done =
|
||||
{
|
||||
self.movetype = MOVETYPE_WALK;
|
||||
self.solid = SOLID_SLIDEBOX;
|
||||
};
|
||||
|
||||
/*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
|
||||
~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
|
||||
|
||||
void() test_goaway;
|
||||
void() test_spawn;
|
||||
|
||||
/*QUAKED test_fodder (0 .5 .8) ?
|
||||
beating guy
|
||||
*/
|
||||
void() test_fodder =
|
||||
{
|
||||
self.nextthink = time + 3;
|
||||
self.think = test_spawn;
|
||||
};
|
||||
|
||||
void() test_spawn =
|
||||
{
|
||||
local entity body;
|
||||
makevectors (self.angles);
|
||||
|
||||
body = spawn();
|
||||
setmodel (body, "progs/soldier.mdl");
|
||||
setorigin (body, self.origin);
|
||||
body.classname = "player";
|
||||
body.health = 1000;
|
||||
body.frags = 0;
|
||||
body.takedamage = DAMAGE_AIM;
|
||||
body.solid = SOLID_SLIDEBOX;
|
||||
body.movetype = MOVETYPE_WALK;
|
||||
body.show_hostile = 0;
|
||||
body.weapon = 1;
|
||||
body.velocity = v_forward * 200;
|
||||
|
||||
body.nextthink = time + 5;
|
||||
body.think = test_goaway;
|
||||
|
||||
self.nextthink = time + 3;
|
||||
self.think = test_spawn;
|
||||
|
||||
};
|
||||
|
||||
void() test_goaway =
|
||||
{
|
||||
remove (self);
|
||||
};
|
||||
|
27
buttons.qc
27
buttons.qc
|
@ -1,4 +1,29 @@
|
|||
// button and multiple button
|
||||
/*
|
||||
buttons.qc
|
||||
|
||||
button and multiple button
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
void() button_wait;
|
||||
void() button_return;
|
||||
|
|
397
client.qc
397
client.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
client.qc
|
||||
|
||||
client functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
// prototypes
|
||||
void () W_WeaponFrame;
|
||||
|
@ -28,6 +54,7 @@ Use mangle instead of angle, so you can set pitch or roll as well as yaw. 'pitc
|
|||
*/
|
||||
void() info_intermission =
|
||||
{
|
||||
self.angles = self.mangle; // so C can get at it
|
||||
};
|
||||
|
||||
|
||||
|
@ -133,11 +160,21 @@ entity() FindIntermission =
|
|||
|
||||
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
|
||||
changelevel (mapname);
|
||||
else {
|
||||
// configurable map lists, see if the current map exists as a
|
||||
// serverinfo/localinfo var
|
||||
newmap = infokey(world, mapname);
|
||||
if (newmap != "")
|
||||
changelevel (newmap);
|
||||
else
|
||||
changelevel (nextmap);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -302,8 +339,14 @@ Returns the entity to spawn at
|
|||
*/
|
||||
entity() SelectSpawnPoint =
|
||||
{
|
||||
local entity spot, thing;
|
||||
local float pcount;
|
||||
local entity spot, newspot, thing;
|
||||
local float numspots, totalspots;
|
||||
local float rnum, pcount;
|
||||
local float rs;
|
||||
local entity spots;
|
||||
|
||||
numspots = 0;
|
||||
totalspots = 0;
|
||||
|
||||
// testinfo_player_start is only found in regioned levels
|
||||
spot = find (world, classname, "testplayerstart");
|
||||
|
@ -311,37 +354,61 @@ entity() SelectSpawnPoint =
|
|||
return spot;
|
||||
|
||||
// choose a info_player_deathmatch point
|
||||
spot = lastspawn;
|
||||
while (1)
|
||||
|
||||
// ok, find all spots that don't have players nearby
|
||||
|
||||
spots = world;
|
||||
spot = find (world, classname, "info_player_deathmatch");
|
||||
while (spot)
|
||||
{
|
||||
spot = find(spot, classname, "info_player_deathmatch");
|
||||
if (spot != world)
|
||||
{
|
||||
if (spot == lastspawn)
|
||||
return lastspawn;
|
||||
pcount = 0;
|
||||
thing = findradius(spot.origin, 50);
|
||||
while(thing)
|
||||
totalspots = totalspots + 1;
|
||||
|
||||
thing=findradius(spot.origin, 84);
|
||||
pcount=0;
|
||||
while (thing)
|
||||
{
|
||||
if (thing.classname == "player")
|
||||
pcount = pcount + 1;
|
||||
thing = thing.chain;
|
||||
}
|
||||
if (pcount == 0)
|
||||
{
|
||||
lastspawn = spot;
|
||||
return spot;
|
||||
}
|
||||
pcount=pcount + 1;
|
||||
thing=thing.chain;
|
||||
}
|
||||
if (pcount == 0) {
|
||||
spot.goalentity = spots;
|
||||
spots = spot;
|
||||
numspots = numspots + 1;
|
||||
}
|
||||
|
||||
spot = find (world, classname, "info_player_start");
|
||||
if (!spot)
|
||||
error ("PutClientInServer: no info_player_start on level");
|
||||
|
||||
// Get the next spot in the chain
|
||||
spot = find (spot, classname, "info_player_deathmatch");
|
||||
}
|
||||
totalspots=totalspots - 1;
|
||||
if (!numspots) {
|
||||
// ack, they are all full, just pick one at random
|
||||
// bprint (PRINT_HIGH, "Ackk! All spots are full. Selecting random spawn spot\n");
|
||||
totalspots = rint((random() * totalspots));
|
||||
spot = find (world, classname, "info_player_deathmatch");
|
||||
while (totalspots > 0) {
|
||||
totalspots = totalspots - 1;
|
||||
spot = find (spot, classname, "info_player_deathmatch");
|
||||
}
|
||||
return spot;
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
|
@ -412,6 +479,7 @@ called each time a player enters a new level
|
|||
void() PutClientInServer =
|
||||
{
|
||||
local entity spot;
|
||||
local string s;
|
||||
|
||||
self.classname = "player";
|
||||
self.health = 100;
|
||||
|
@ -459,6 +527,11 @@ void() PutClientInServer =
|
|||
|
||||
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);
|
||||
|
@ -472,6 +545,53 @@ void() PutClientInServer =
|
|||
rj = stof(infokey(world, "rj"));
|
||||
}
|
||||
|
||||
if (deathmatch == 4)
|
||||
{
|
||||
self.ammo_shells = 0;
|
||||
if (stof(infokey(world, "axe")) == 0)
|
||||
{
|
||||
self.ammo_nails = 255;
|
||||
self.ammo_shells = 255;
|
||||
self.ammo_rockets = 255;
|
||||
self.ammo_cells = 255;
|
||||
self.items = self.items | IT_NAILGUN;
|
||||
self.items = self.items | IT_SUPER_NAILGUN;
|
||||
self.items = self.items | IT_SUPER_SHOTGUN;
|
||||
self.items = self.items | IT_ROCKET_LAUNCHER;
|
||||
// self.items = self.items | IT_GRENADE_LAUNCHER;
|
||||
self.items = self.items | IT_LIGHTNING;
|
||||
}
|
||||
self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3;
|
||||
self.armorvalue = 200;
|
||||
self.armortype = 0.8;
|
||||
self.health = 250;
|
||||
self.items = self.items | IT_INVULNERABILITY;
|
||||
self.invincible_time = 1;
|
||||
self.invincible_finished = time + 3;
|
||||
}
|
||||
|
||||
if (deathmatch == 5)
|
||||
{
|
||||
self.ammo_nails = 80;
|
||||
self.ammo_shells = 30;
|
||||
self.ammo_rockets = 10;
|
||||
self.ammo_cells = 30;
|
||||
self.items = self.items | IT_NAILGUN;
|
||||
self.items = self.items | IT_SUPER_NAILGUN;
|
||||
self.items = self.items | IT_SUPER_SHOTGUN;
|
||||
self.items = self.items | IT_ROCKET_LAUNCHER;
|
||||
self.items = self.items | IT_GRENADE_LAUNCHER;
|
||||
self.items = self.items | IT_LIGHTNING;
|
||||
self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3;
|
||||
self.armorvalue = 200;
|
||||
self.armortype = 0.8;
|
||||
self.health = 200;
|
||||
self.items = self.items | IT_INVULNERABILITY;
|
||||
self.invincible_time = 1;
|
||||
self.invincible_finished = time + 3;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -527,6 +647,10 @@ go to the next level for deathmatch
|
|||
void() NextLevel =
|
||||
{
|
||||
local entity o;
|
||||
local string newmap;
|
||||
|
||||
if (nextmap != "")
|
||||
return; // already done
|
||||
|
||||
if (mapname == "start")
|
||||
{
|
||||
|
@ -560,7 +684,7 @@ void() NextLevel =
|
|||
}
|
||||
else
|
||||
{
|
||||
// find a trigger changelevel
|
||||
// find a trigger changelevel
|
||||
o = find(world, classname, "trigger_changelevel");
|
||||
if (!o || mapname == "start")
|
||||
{ // go back to same map if no trigger_changelevel
|
||||
|
@ -805,6 +929,8 @@ void() PlayerPreThink =
|
|||
|
||||
makevectors (self.v_angle); // is this still used
|
||||
|
||||
self.deathtype = "";
|
||||
|
||||
CheckRules ();
|
||||
WaterMove ();
|
||||
/*
|
||||
|
@ -921,9 +1047,15 @@ void() CheckPowerups =
|
|||
self.invincible_finished = 0;
|
||||
}
|
||||
if (self.invincible_finished > time)
|
||||
{
|
||||
self.effects = self.effects | EF_DIMLIGHT;
|
||||
self.effects = self.effects | EF_RED;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.effects = self.effects - (self.effects & EF_DIMLIGHT);
|
||||
self.effects = self.effects - (self.effects & EF_RED);
|
||||
}
|
||||
}
|
||||
|
||||
// super damage
|
||||
|
@ -936,6 +1068,9 @@ void() CheckPowerups =
|
|||
{
|
||||
if (self.super_time == 1)
|
||||
{
|
||||
if (deathmatch == 4)
|
||||
sprint (self, PRINT_HIGH, "OctaPower is wearing off\n");
|
||||
else
|
||||
sprint (self, PRINT_HIGH, "Quad Damage is wearing off\n");
|
||||
stuffcmd (self, "bf\n");
|
||||
sound (self, CHAN_AUTO, "items/damage2.wav", 1, ATTN_NORM);
|
||||
|
@ -952,13 +1087,26 @@ void() CheckPowerups =
|
|||
if (self.super_damage_finished < time)
|
||||
{ // just stopped
|
||||
self.items = self.items - IT_QUAD;
|
||||
if (deathmatch == 4)
|
||||
{
|
||||
self.ammo_cells = 255;
|
||||
self.armorvalue = 1;
|
||||
self.armortype = 0.8;
|
||||
self.health = 100;
|
||||
}
|
||||
self.super_damage_finished = 0;
|
||||
self.super_time = 0;
|
||||
}
|
||||
if (self.super_damage_finished > time)
|
||||
{
|
||||
self.effects = self.effects | EF_DIMLIGHT;
|
||||
self.effects = self.effects | EF_BLUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.effects = self.effects - (self.effects & EF_DIMLIGHT);
|
||||
self.effects = self.effects - (self.effects & EF_BLUE);
|
||||
}
|
||||
}
|
||||
|
||||
// suit
|
||||
|
@ -1020,9 +1168,9 @@ void() PlayerPostThink =
|
|||
sound (self, CHAN_BODY, "player/h2ojump.wav", 1, ATTN_NORM);
|
||||
else if (self.jump_flag < -650)
|
||||
{
|
||||
self.deathtype = "falling";
|
||||
T_Damage (self, world, world, 5);
|
||||
sound (self, CHAN_VOICE, "player/land2.wav", 1, ATTN_NORM);
|
||||
self.deathtype = "falling";
|
||||
}
|
||||
else
|
||||
sound (self, CHAN_VOICE, "player/land.wav", 1, ATTN_NORM);
|
||||
|
@ -1080,6 +1228,7 @@ ClientObituary
|
|||
called when a player dies
|
||||
============
|
||||
*/
|
||||
|
||||
void(entity targ, entity attacker) ClientObituary =
|
||||
{
|
||||
local float rnum;
|
||||
|
@ -1088,15 +1237,31 @@ void(entity targ, entity attacker) ClientObituary =
|
|||
local string attackerteam, targteam;
|
||||
|
||||
rnum = random();
|
||||
//ZOID 12-13-96: self.team doesn't work in QW. Use keys
|
||||
attackerteam = infokey(attacker, "team");
|
||||
targteam = infokey(targ, "team");
|
||||
|
||||
if (targ.classname == "player")
|
||||
{
|
||||
|
||||
if (deathmatch > 3)
|
||||
{
|
||||
if (targ.deathtype == "selfwater")
|
||||
{
|
||||
bprint (PRINT_MEDIUM, targ.netname);
|
||||
bprint (PRINT_MEDIUM," electrocutes himself.\n ");
|
||||
targ.frags = targ.frags - 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (attacker.classname == "teledeath")
|
||||
{
|
||||
bprint (PRINT_MEDIUM,targ.netname);
|
||||
bprint (PRINT_MEDIUM," was telefragged by ");
|
||||
bprint (PRINT_MEDIUM,attacker.owner.netname);
|
||||
bprint (PRINT_MEDIUM,"\n");
|
||||
logfrag (attacker.owner, targ);
|
||||
|
||||
attacker.owner.frags = attacker.owner.frags + 1;
|
||||
return;
|
||||
|
@ -1113,30 +1278,72 @@ void(entity targ, entity attacker) ClientObituary =
|
|||
return;
|
||||
}
|
||||
|
||||
// double 666 telefrag (can happen often in deathmatch 4)
|
||||
if (attacker.classname == "teledeath3")
|
||||
{
|
||||
bprint (PRINT_MEDIUM,targ.netname);
|
||||
bprint (PRINT_MEDIUM," was telefragged by ");
|
||||
bprint (PRINT_MEDIUM,attacker.owner.netname);
|
||||
bprint (PRINT_MEDIUM, "'s Satan's power\n");
|
||||
targ.frags = targ.frags - 1;
|
||||
logfrag (targ, targ);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (targ.deathtype == "squish")
|
||||
{
|
||||
if (teamplay && targteam == attackerteam && attackerteam != "" && targ != attacker)
|
||||
{
|
||||
logfrag (attacker, attacker);
|
||||
attacker.frags = attacker.frags - 1;
|
||||
bprint (PRINT_MEDIUM,attacker.netname);
|
||||
bprint (PRINT_MEDIUM," squished a teammate\n");
|
||||
return;
|
||||
}
|
||||
else if (attacker.classname == "player" && attacker != targ)
|
||||
{
|
||||
bprint (PRINT_MEDIUM, attacker.netname);
|
||||
bprint (PRINT_MEDIUM," squishes ");
|
||||
bprint (PRINT_MEDIUM,targ.netname);
|
||||
bprint (PRINT_MEDIUM,"\n");
|
||||
logfrag (attacker, targ);
|
||||
attacker.frags = attacker.frags + 1;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
logfrag (targ, targ);
|
||||
targ.frags = targ.frags - 1; // killed self
|
||||
bprint (PRINT_MEDIUM,targ.netname);
|
||||
bprint (PRINT_MEDIUM," was squished\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (attacker.classname == "player")
|
||||
{
|
||||
//ZOID 12-13-96: self.team doesn't work in QW. Use keys
|
||||
attackerteam = infokey(attacker, "team");
|
||||
targteam = infokey(targ, "team");
|
||||
|
||||
if (targ == attacker)
|
||||
{
|
||||
// killed self
|
||||
logfrag (attacker, attacker);
|
||||
attacker.frags = attacker.frags - 1;
|
||||
bprint (PRINT_MEDIUM,targ.netname);
|
||||
|
||||
if (targ.weapon == 64 && targ.waterlevel > 1)
|
||||
{
|
||||
bprint (PRINT_MEDIUM," discharges into the water.\n");
|
||||
return;
|
||||
}
|
||||
if (targ.weapon == 16)
|
||||
if (targ.deathtype == "grenade")
|
||||
bprint (PRINT_MEDIUM," tries to put the pin back in\n");
|
||||
else if (rnum)
|
||||
else if (targ.deathtype == "rocket")
|
||||
bprint (PRINT_MEDIUM," becomes bored with life\n");
|
||||
else if (targ.weapon == 64 && targ.waterlevel > 1)
|
||||
{
|
||||
if (targ.watertype == CONTENT_SLIME)
|
||||
bprint (PRINT_MEDIUM," discharges into the slime\n");
|
||||
else if (targ.watertype == CONTENT_LAVA)
|
||||
bprint (PRINT_MEDIUM," discharges into the lava\n");
|
||||
else
|
||||
bprint (PRINT_MEDIUM," checks if his weapon is loaded\n");
|
||||
bprint (PRINT_MEDIUM," discharges into the water.\n");
|
||||
}
|
||||
else
|
||||
bprint (PRINT_MEDIUM," becomes bored with life\n");
|
||||
return;
|
||||
}
|
||||
else if ( (teamplay == 2) && (targteam == attackerteam) &&
|
||||
|
@ -1163,32 +1370,17 @@ void(entity targ, entity attacker) ClientObituary =
|
|||
attacker.frags = attacker.frags + 1;
|
||||
|
||||
rnum = attacker.weapon;
|
||||
if (rnum == IT_AXE)
|
||||
{
|
||||
deathstring = " was ax-murdered by ";
|
||||
deathstring2 = "\n";
|
||||
}
|
||||
if (rnum == IT_SHOTGUN)
|
||||
{
|
||||
deathstring = " chewed on ";
|
||||
deathstring2 = "'s boomstick\n";
|
||||
}
|
||||
if (rnum == IT_SUPER_SHOTGUN)
|
||||
{
|
||||
deathstring = " ate 2 loads of ";
|
||||
deathstring2 = "'s buckshot\n";
|
||||
}
|
||||
if (rnum == IT_NAILGUN)
|
||||
if (targ.deathtype == "nail")
|
||||
{
|
||||
deathstring = " was nailed by ";
|
||||
deathstring2 = "\n";
|
||||
}
|
||||
if (rnum == IT_SUPER_NAILGUN)
|
||||
else if (targ.deathtype == "supernail")
|
||||
{
|
||||
deathstring = " was punctured by ";
|
||||
deathstring2 = "\n";
|
||||
}
|
||||
if (rnum == IT_GRENADE_LAUNCHER)
|
||||
else if (targ.deathtype == "grenade")
|
||||
{
|
||||
deathstring = " eats ";
|
||||
deathstring2 = "'s pineapple\n";
|
||||
|
@ -1198,7 +1390,26 @@ void(entity targ, entity attacker) ClientObituary =
|
|||
deathstring2 = "'s grenade\n";
|
||||
}
|
||||
}
|
||||
if (rnum == IT_ROCKET_LAUNCHER)
|
||||
else if (targ.deathtype == "rocket")
|
||||
{
|
||||
if (attacker.super_damage_finished > 0 && targ.health < -40)
|
||||
{
|
||||
rnum = random();
|
||||
if (rnum < 0.3)
|
||||
deathstring = " was brutalized by ";
|
||||
else if (rnum < 0.6)
|
||||
deathstring = " was smeared by ";
|
||||
else
|
||||
{
|
||||
bprint (PRINT_MEDIUM, attacker.netname);
|
||||
bprint (PRINT_MEDIUM, " rips ");
|
||||
bprint (PRINT_MEDIUM, targ.netname);
|
||||
bprint (PRINT_MEDIUM, " a new one\n");
|
||||
return;
|
||||
}
|
||||
deathstring2 = "'s quad rocket\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
deathstring = " rides ";
|
||||
deathstring2 = "'s rocket\n";
|
||||
|
@ -1208,7 +1419,23 @@ void(entity targ, entity attacker) ClientObituary =
|
|||
deathstring2 = "'s rocket\n" ;
|
||||
}
|
||||
}
|
||||
if (rnum == IT_LIGHTNING)
|
||||
}
|
||||
else if (rnum == IT_AXE)
|
||||
{
|
||||
deathstring = " was ax-murdered by ";
|
||||
deathstring2 = "\n";
|
||||
}
|
||||
else if (rnum == IT_SHOTGUN)
|
||||
{
|
||||
deathstring = " chewed on ";
|
||||
deathstring2 = "'s boomstick\n";
|
||||
}
|
||||
else if (rnum == IT_SUPER_SHOTGUN)
|
||||
{
|
||||
deathstring = " ate 2 loads of ";
|
||||
deathstring2 = "'s buckshot\n";
|
||||
}
|
||||
else if (rnum == IT_LIGHTNING)
|
||||
{
|
||||
deathstring = " accepts ";
|
||||
if (attacker.waterlevel > 1)
|
||||
|
@ -1260,64 +1487,26 @@ void(entity targ, entity attacker) ClientObituary =
|
|||
return;
|
||||
}
|
||||
|
||||
if (attacker.flags & FL_MONSTER)
|
||||
{
|
||||
if (attacker.classname == "monster_army")
|
||||
bprint (PRINT_MEDIUM," was shot by a Grunt\n");
|
||||
if (attacker.classname == "monster_demon1")
|
||||
bprint (PRINT_MEDIUM," was eviscerated by a Fiend\n");
|
||||
if (attacker.classname == "monster_dog")
|
||||
bprint (PRINT_MEDIUM," was mauled by a Rottweiler\n");
|
||||
if (attacker.classname == "monster_dragon")
|
||||
bprint (PRINT_MEDIUM," was fried by a Dragon\n");
|
||||
if (attacker.classname == "monster_enforcer")
|
||||
bprint (PRINT_MEDIUM," was blasted by an Enforcer\n");
|
||||
if (attacker.classname == "monster_fish")
|
||||
bprint (PRINT_MEDIUM," was fed to the Rotfish\n");
|
||||
if (attacker.classname == "monster_hell_knight")
|
||||
bprint (PRINT_MEDIUM," was slain by a Death Knight\n");
|
||||
if (attacker.classname == "monster_knight")
|
||||
bprint (PRINT_MEDIUM," was slashed by a Knight\n");
|
||||
if (attacker.classname == "monster_ogre")
|
||||
bprint (PRINT_MEDIUM," was destroyed by an Ogre\n");
|
||||
if (attacker.classname == "monster_oldone")
|
||||
bprint (PRINT_MEDIUM," became one with Shub-Niggurath\n");
|
||||
if (attacker.classname == "monster_shalrath")
|
||||
bprint (PRINT_MEDIUM," was exploded by a Vore\n");
|
||||
if (attacker.classname == "monster_shambler")
|
||||
bprint (PRINT_MEDIUM," was smashed by a Shambler\n");
|
||||
if (attacker.classname == "monster_tarbaby")
|
||||
bprint (PRINT_MEDIUM," was slimed by a Spawn\n");
|
||||
if (attacker.classname == "monster_vomit")
|
||||
bprint (PRINT_MEDIUM," was vomited on by a Vomitus\n");
|
||||
if (attacker.classname == "monster_wizard")
|
||||
bprint (PRINT_MEDIUM," was scragged by a Scrag\n");
|
||||
if (attacker.classname == "monster_zombie")
|
||||
bprint (PRINT_MEDIUM," joins the Zombies\n");
|
||||
|
||||
return;
|
||||
}
|
||||
if (attacker.classname == "explo_box")
|
||||
{
|
||||
bprint (PRINT_MEDIUM," blew up\n");
|
||||
return;
|
||||
}
|
||||
if (attacker.solid == SOLID_BSP && attacker != world)
|
||||
{
|
||||
bprint (PRINT_MEDIUM," was squished\n");
|
||||
return;
|
||||
}
|
||||
if (targ.deathtype == "falling")
|
||||
{
|
||||
targ.deathtype = "";
|
||||
bprint (PRINT_MEDIUM," fell to his death\n");
|
||||
return;
|
||||
}
|
||||
if (attacker.classname == "trap_shooter" || attacker.classname == "trap_spikeshooter")
|
||||
if (targ.deathtype == "nail" || targ.deathtype == "supernail")
|
||||
{
|
||||
bprint (PRINT_MEDIUM," was spiked\n");
|
||||
return;
|
||||
}
|
||||
if (targ.deathtype == "laser")
|
||||
{
|
||||
bprint (PRINT_MEDIUM," was zapped\n");
|
||||
return;
|
||||
}
|
||||
if (attacker.classname == "fireball")
|
||||
{
|
||||
bprint (PRINT_MEDIUM," ate a lavaball\n");
|
||||
|
|
69
combat.qc
69
combat.qc
|
@ -1,7 +1,34 @@
|
|||
/*
|
||||
combat.qc
|
||||
|
||||
damage, obit, etc related functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
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;
|
||||
|
@ -120,8 +147,12 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
|
|||
// 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)
|
||||
if (attacker.super_damage_finished > time && inflictor.classname != "door")
|
||||
if (deathmatch == 4)
|
||||
damage = damage * 8;
|
||||
else
|
||||
damage = damage * 4;
|
||||
|
||||
// save damage based on the target's armor level
|
||||
|
@ -156,10 +187,11 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
|
|||
dir = targ.origin - (inflictor.absmin + inflictor.absmax) * 0.5;
|
||||
dir = normalize(dir);
|
||||
// Set kickback for smaller weapons
|
||||
// Read: only if it's not yourself doing the damage
|
||||
if ( (damage < 60) & ((attacker.classname == "player") & (targ.classname == "player")) & ( attacker.netname != targ.netname))
|
||||
targ.velocity = targ.velocity + dir * damage * 11;
|
||||
else
|
||||
//Zoid -- use normal NQ kickback
|
||||
// // Read: only if it's not yourself doing the damage
|
||||
// if ( (damage < 60) & ((attacker.classname == "player") & (targ.classname == "player")) & ( attacker.netname != targ.netname))
|
||||
// targ.velocity = targ.velocity + dir * damage * 11;
|
||||
// else
|
||||
// Otherwise, these rules apply to rockets and grenades
|
||||
// for blast velocity
|
||||
targ.velocity = targ.velocity + dir * damage * 8;
|
||||
|
@ -170,6 +202,8 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// check for godmode or invincibility
|
||||
if (targ.flags & FL_GODMODE)
|
||||
return;
|
||||
|
@ -189,11 +223,13 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
|
|||
targteam = infokey(targ, "team");
|
||||
|
||||
if ((teamplay == 1) && (targteam == attackerteam) &&
|
||||
(attacker.classname == "player") && (attackerteam != ""))
|
||||
(attacker.classname == "player") && (attackerteam != "") &&
|
||||
inflictor.classname !="door")
|
||||
return;
|
||||
|
||||
if ((teamplay == 3) && (targteam == attackerteam) &&
|
||||
(attacker.classname == "player") && (attackerteam != "") &&
|
||||
(targ != attacker))
|
||||
(targ != attacker)&& inflictor.classname !="door")
|
||||
return;
|
||||
|
||||
// do the damage
|
||||
|
@ -239,7 +275,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=
|
|||
T_RadiusDamage
|
||||
============
|
||||
*/
|
||||
void(entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage =
|
||||
void(entity inflictor, entity attacker, float damage, entity ignore, string dtype) T_RadiusDamage =
|
||||
{
|
||||
local float points;
|
||||
local entity head;
|
||||
|
@ -249,6 +285,11 @@ void(entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDam
|
|||
|
||||
while (head)
|
||||
{
|
||||
//bprint (PRINT_HIGH, head.classname);
|
||||
//bprint (PRINT_HIGH, " | ");
|
||||
//bprint (PRINT_HIGH, head.netname);
|
||||
//bprint (PRINT_HIGH, "\n");
|
||||
|
||||
if (head != ignore)
|
||||
{
|
||||
if (head.takedamage)
|
||||
|
@ -258,15 +299,14 @@ void(entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDam
|
|||
if (points < 0)
|
||||
points = 0;
|
||||
points = damage - points;
|
||||
|
||||
if (head == attacker)
|
||||
points = points * 0.5;
|
||||
if (points > 0)
|
||||
{
|
||||
if (CanDamage (head, inflictor))
|
||||
{ // shambler takes half damage from all explosions
|
||||
if (head.classname == "monster_shambler")
|
||||
T_Damage (head, inflictor, attacker, points*0.5);
|
||||
else
|
||||
{
|
||||
head.deathtype = dtype;
|
||||
T_Damage (head, inflictor, attacker, points);
|
||||
}
|
||||
}
|
||||
|
@ -301,14 +341,9 @@ void(entity attacker, float damage) T_BeamDamage =
|
|||
if (points > 0)
|
||||
{
|
||||
if (CanDamage (head, attacker))
|
||||
{
|
||||
if (head.classname == "monster_shambler")
|
||||
T_Damage (head, attacker, attacker, points*0.5);
|
||||
else
|
||||
T_Damage (head, attacker, attacker, points);
|
||||
}
|
||||
}
|
||||
}
|
||||
head = head.chain;
|
||||
}
|
||||
};
|
||||
|
|
41
defs.qc
41
defs.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
defs.qc
|
||||
|
||||
global definitions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
@ -390,8 +416,9 @@ float EF_BRIGHTLIGHT = 4;
|
|||
float EF_DIMLIGHT = 8;
|
||||
float EF_FLAG1 = 16;
|
||||
float EF_FLAG2 = 32;
|
||||
|
||||
|
||||
// GLQuakeWorld Stuff
|
||||
float EF_BLUE = 64; // Blue Globe effect for Quad
|
||||
float EF_RED = 128; // Red Globe effect for Pentagram
|
||||
// messages
|
||||
float MSG_BROADCAST = 0; // unreliable to all
|
||||
float MSG_ONE = 1; // reliable to one (msg_entity)
|
||||
|
@ -413,6 +440,9 @@ float MULTICAST_ALL_R = 3; // every client, reliable
|
|||
float MULTICAST_PHS_R = 4; // within hearing, reliable
|
||||
float MULTICAST_PVS_R = 5; // within sight, reliable
|
||||
|
||||
|
||||
|
||||
|
||||
//================================================
|
||||
|
||||
//
|
||||
|
@ -486,8 +516,15 @@ float AS_MISSILE = 4;
|
|||
//
|
||||
// player only fields
|
||||
//
|
||||
.float voided;
|
||||
.float walkframe;
|
||||
|
||||
// Zoid Additions
|
||||
.float maxspeed; // Used to set Maxspeed on a player
|
||||
.float gravity; // Gravity Multiplier (0 to 1.0)
|
||||
|
||||
|
||||
|
||||
.float attack_finished;
|
||||
.float pain_finished;
|
||||
|
||||
|
|
33
doors.qc
33
doors.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
doors.qc
|
||||
|
||||
door functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
float DOOR_START_OPEN = 1;
|
||||
float DOOR_DONT_LINK = 4;
|
||||
|
@ -31,7 +57,8 @@ void() door_go_up;
|
|||
|
||||
void() door_blocked =
|
||||
{
|
||||
T_Damage (other, self, self, self.dmg);
|
||||
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
|
||||
|
@ -134,8 +161,10 @@ void() door_fire =
|
|||
|
||||
// trigger all paired doors
|
||||
starte = self;
|
||||
|
||||
do
|
||||
{
|
||||
self.goalentity = activator; // Who fired us
|
||||
door_go_up ();
|
||||
self = self.enemy;
|
||||
} while ( (self != starte) && (self != world) );
|
||||
|
@ -150,6 +179,7 @@ void() door_use =
|
|||
self.message = ""; // door message are for touch only
|
||||
self.owner.message = "";
|
||||
self.enemy.message = "";
|
||||
|
||||
oself = self;
|
||||
self = self.owner;
|
||||
door_fire ();
|
||||
|
@ -676,6 +706,7 @@ void () secret_blocked =
|
|||
if (time < self.attack_finished)
|
||||
return;
|
||||
self.attack_finished = time + 0.5;
|
||||
other.deathtype = "squish";
|
||||
T_Damage (other, self, self, self.dmg);
|
||||
};
|
||||
|
||||
|
|
260
items.qc
260
items.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
items.qc
|
||||
|
||||
item functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
void() W_SetCurrentAmmo;
|
||||
/* ALL LIGHTS SHOULD BE 0 1 0 IN COLOR ALL OTHER ITEMS SHOULD
|
||||
BE .8 .3 .4 IN COLOR */
|
||||
|
@ -24,7 +50,134 @@ void() noclass =
|
|||
remove (self);
|
||||
};
|
||||
|
||||
void() q_touch;
|
||||
|
||||
void() q_touch =
|
||||
{
|
||||
local entity stemp;
|
||||
local float best;
|
||||
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_QUAD;
|
||||
self.model = string_null;
|
||||
if (deathmatch == 4)
|
||||
{
|
||||
other.armortype = 0;
|
||||
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 ");
|
||||
else
|
||||
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;
|
||||
|
||||
item.velocity_z = 300;
|
||||
item.velocity_x = -100 + (random() * 200);
|
||||
item.velocity_y = -100 + (random() * 200);
|
||||
|
||||
item.flags = FL_ITEM;
|
||||
item.solid = SOLID_TRIGGER;
|
||||
item.movetype = MOVETYPE_TOSS;
|
||||
item.noise = "items/damage.wav";
|
||||
setmodel (item, "progs/quaddama.mdl");
|
||||
setsize (item, '-16 -16 -24', '16 16 32');
|
||||
item.cnt = time + timeleft;
|
||||
item.touch = q_touch;
|
||||
item.nextthink = time + timeleft; // remove it with the time left on it
|
||||
item.think = SUB_Remove;
|
||||
};
|
||||
|
||||
|
||||
void() r_touch;
|
||||
|
||||
void() r_touch =
|
||||
{
|
||||
local entity stemp;
|
||||
local float best;
|
||||
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;
|
||||
s=ftos(rint(other.invisible_finished - time));
|
||||
bprint (PRINT_LOW, other.netname);
|
||||
bprint (PRINT_LOW, " recovered a Ring with ");
|
||||
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;
|
||||
|
||||
item.velocity_z = 300;
|
||||
item.velocity_x = -100 + (random() * 200);
|
||||
item.velocity_y = -100 + (random() * 200);
|
||||
|
||||
item.flags = FL_ITEM;
|
||||
item.solid = SOLID_TRIGGER;
|
||||
item.movetype = MOVETYPE_TOSS;
|
||||
item.noise = "items/inv1.wav";
|
||||
setmodel (item, "progs/invisibl.mdl");
|
||||
setsize (item, '-16 -16 -24', '16 16 32');
|
||||
item.cnt = time + timeleft;
|
||||
item.touch = r_touch;
|
||||
item.nextthink = time + timeleft; // remove after 30 seconds
|
||||
item.think = SUB_Remove;
|
||||
};
|
||||
|
||||
/*
|
||||
============
|
||||
|
@ -152,6 +305,10 @@ void() health_touch =
|
|||
local float amount;
|
||||
local string s;
|
||||
|
||||
if (deathmatch == 4)
|
||||
if (other.invincible_time > 0)
|
||||
return;
|
||||
|
||||
if (other.classname != "player")
|
||||
return;
|
||||
|
||||
|
@ -185,8 +342,11 @@ void() health_touch =
|
|||
if (self.healtype == 2)
|
||||
{
|
||||
other.items = other.items | IT_SUPERHEALTH;
|
||||
if (deathmatch != 4)
|
||||
{
|
||||
self.nextthink = time + 5;
|
||||
self.think = item_megahealth_rot;
|
||||
}
|
||||
self.owner = other;
|
||||
}
|
||||
else
|
||||
|
@ -243,6 +403,10 @@ void() armor_touch =
|
|||
if (other.classname != "player")
|
||||
return;
|
||||
|
||||
if (deathmatch == 4)
|
||||
if (other.invincible_time > 0)
|
||||
return;
|
||||
|
||||
if (self.classname == "item_armor1")
|
||||
{
|
||||
type = 0.3;
|
||||
|
@ -428,7 +592,7 @@ void() weapon_touch =
|
|||
best = W_BestWeapon();
|
||||
self = stemp;
|
||||
|
||||
if (deathmatch == 2 || deathmatch == 3)
|
||||
if (deathmatch == 2 || deathmatch == 3 || deathmatch == 5)
|
||||
leave = 1;
|
||||
else
|
||||
leave = 0;
|
||||
|
@ -522,7 +686,7 @@ void() weapon_touch =
|
|||
if (leave)
|
||||
return;
|
||||
|
||||
if (deathmatch!=3)
|
||||
if (deathmatch!=3 || deathmatch !=5)
|
||||
{
|
||||
// remove it in single player, or setup for respawning in deathmatch
|
||||
self.model = string_null;
|
||||
|
@ -540,6 +704,8 @@ void() weapon_touch =
|
|||
*/
|
||||
|
||||
void() weapon_supershotgun =
|
||||
{
|
||||
if (deathmatch <= 3)
|
||||
{
|
||||
precache_model ("progs/g_shot.mdl");
|
||||
setmodel (self, "progs/g_shot.mdl");
|
||||
|
@ -548,12 +714,15 @@ void() weapon_supershotgun =
|
|||
self.touch = weapon_touch;
|
||||
setsize (self, '-16 -16 0', '16 16 56');
|
||||
StartItem ();
|
||||
}
|
||||
};
|
||||
|
||||
/*QUAKED weapon_nailgun (0 .5 .8) (-16 -16 0) (16 16 32)
|
||||
*/
|
||||
|
||||
void() weapon_nailgun =
|
||||
{
|
||||
if (deathmatch <= 3)
|
||||
{
|
||||
precache_model ("progs/g_nail.mdl");
|
||||
setmodel (self, "progs/g_nail.mdl");
|
||||
|
@ -562,12 +731,15 @@ void() weapon_nailgun =
|
|||
self.touch = weapon_touch;
|
||||
setsize (self, '-16 -16 0', '16 16 56');
|
||||
StartItem ();
|
||||
}
|
||||
};
|
||||
|
||||
/*QUAKED weapon_supernailgun (0 .5 .8) (-16 -16 0) (16 16 32)
|
||||
*/
|
||||
|
||||
void() weapon_supernailgun =
|
||||
{
|
||||
if (deathmatch <= 3)
|
||||
{
|
||||
precache_model ("progs/g_nail2.mdl");
|
||||
setmodel (self, "progs/g_nail2.mdl");
|
||||
|
@ -576,12 +748,15 @@ void() weapon_supernailgun =
|
|||
self.touch = weapon_touch;
|
||||
setsize (self, '-16 -16 0', '16 16 56');
|
||||
StartItem ();
|
||||
}
|
||||
};
|
||||
|
||||
/*QUAKED weapon_grenadelauncher (0 .5 .8) (-16 -16 0) (16 16 32)
|
||||
*/
|
||||
|
||||
void() weapon_grenadelauncher =
|
||||
{
|
||||
if (deathmatch <= 3)
|
||||
{
|
||||
precache_model ("progs/g_rock.mdl");
|
||||
setmodel (self, "progs/g_rock.mdl");
|
||||
|
@ -590,12 +765,15 @@ void() weapon_grenadelauncher =
|
|||
self.touch = weapon_touch;
|
||||
setsize (self, '-16 -16 0', '16 16 56');
|
||||
StartItem ();
|
||||
}
|
||||
};
|
||||
|
||||
/*QUAKED weapon_rocketlauncher (0 .5 .8) (-16 -16 0) (16 16 32)
|
||||
*/
|
||||
|
||||
void() weapon_rocketlauncher =
|
||||
{
|
||||
if (deathmatch <= 3)
|
||||
{
|
||||
precache_model ("progs/g_rock2.mdl");
|
||||
setmodel (self, "progs/g_rock2.mdl");
|
||||
|
@ -604,6 +782,7 @@ void() weapon_rocketlauncher =
|
|||
self.touch = weapon_touch;
|
||||
setsize (self, '-16 -16 0', '16 16 56');
|
||||
StartItem ();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -611,6 +790,8 @@ void() weapon_rocketlauncher =
|
|||
*/
|
||||
|
||||
void() weapon_lightning =
|
||||
{
|
||||
if (deathmatch <= 3)
|
||||
{
|
||||
precache_model ("progs/g_light.mdl");
|
||||
setmodel (self, "progs/g_light.mdl");
|
||||
|
@ -619,6 +800,7 @@ void() weapon_lightning =
|
|||
self.touch = weapon_touch;
|
||||
setsize (self, '-16 -16 0', '16 16 56');
|
||||
StartItem ();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -713,7 +895,7 @@ local float best;
|
|||
|
||||
// Xian -- If playing in DM 3.0 mode, halve the time ammo respawns
|
||||
|
||||
if (deathmatch == 3)
|
||||
if (deathmatch == 3 || deathmatch == 5)
|
||||
self.nextthink = time + 15;
|
||||
|
||||
self.think = SUB_regen;
|
||||
|
@ -732,6 +914,9 @@ float WEAPON_BIG2 = 1;
|
|||
|
||||
void() item_shells =
|
||||
{
|
||||
if (deathmatch == 4)
|
||||
return;
|
||||
|
||||
self.touch = ammo_touch;
|
||||
|
||||
if (self.spawnflags & WEAPON_BIG2)
|
||||
|
@ -757,6 +942,9 @@ void() item_shells =
|
|||
|
||||
void() item_spikes =
|
||||
{
|
||||
if (deathmatch == 4)
|
||||
return;
|
||||
|
||||
self.touch = ammo_touch;
|
||||
|
||||
if (self.spawnflags & WEAPON_BIG2)
|
||||
|
@ -775,6 +963,7 @@ 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
|
||||
|
@ -782,6 +971,9 @@ void() item_spikes =
|
|||
|
||||
void() item_rockets =
|
||||
{
|
||||
if (deathmatch == 4)
|
||||
return;
|
||||
|
||||
self.touch = ammo_touch;
|
||||
|
||||
if (self.spawnflags & WEAPON_BIG2)
|
||||
|
@ -800,6 +992,7 @@ void() item_rockets =
|
|||
self.netname = "rockets";
|
||||
setsize (self, '0 0 0', '32 32 56');
|
||||
StartItem ();
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -808,6 +1001,9 @@ void() item_rockets =
|
|||
|
||||
void() item_cells =
|
||||
{
|
||||
if (deathmatch == 4)
|
||||
return;
|
||||
|
||||
self.touch = ammo_touch;
|
||||
|
||||
if (self.spawnflags & WEAPON_BIG2)
|
||||
|
@ -826,6 +1022,7 @@ void() item_cells =
|
|||
self.netname = "cells";
|
||||
setsize (self, '0 0 0', '32 32 56');
|
||||
StartItem ();
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -1165,6 +1362,12 @@ local float best;
|
|||
|
||||
if (self.classname == "item_artifact_super_damage")
|
||||
{
|
||||
if (deathmatch == 4)
|
||||
{
|
||||
other.armortype = 0;
|
||||
other.armorvalue = 0 * 0.01;
|
||||
other.ammo_cells = 0;
|
||||
}
|
||||
other.super_time = 1;
|
||||
other.super_damage_finished = time + 30;
|
||||
}
|
||||
|
@ -1189,6 +1392,7 @@ void() item_artifact_invulnerability =
|
|||
self.noise = "items/protect.wav";
|
||||
setmodel (self, "progs/invulner.mdl");
|
||||
self.netname = "Pentagram of Protection";
|
||||
self.effects = self.effects | EF_RED;
|
||||
self.items = IT_INVULNERABILITY;
|
||||
setsize (self, '-16 -16 -24', '16 16 32');
|
||||
StartItem ();
|
||||
|
@ -1246,8 +1450,12 @@ void() item_artifact_super_damage =
|
|||
precache_sound ("items/damage3.wav");
|
||||
self.noise = "items/damage.wav";
|
||||
setmodel (self, "progs/quaddama.mdl");
|
||||
if (deathmatch == 4)
|
||||
self.netname = "OctaPower";
|
||||
else
|
||||
self.netname = "Quad Damage";
|
||||
self.items = IT_QUAD;
|
||||
self.effects = self.effects | EF_BLUE;
|
||||
setsize (self, '-16 -16 -24', '16 16 32');
|
||||
StartItem ();
|
||||
};
|
||||
|
@ -1268,9 +1476,12 @@ void() BackpackTouch =
|
|||
local float best, old, new;
|
||||
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
|
||||
|
@ -1285,6 +1496,41 @@ void() BackpackTouch =
|
|||
acount = 0;
|
||||
sprint (other, PRINT_LOW, "You get ");
|
||||
|
||||
if (deathmatch == 4)
|
||||
{
|
||||
other.health = other.health + 10;
|
||||
sprint (other, PRINT_LOW, "10 additional health\n");
|
||||
if ((other.health > 250) && (other.health < 300))
|
||||
sound (other, CHAN_ITEM, "items/protect3.wav", 1, ATTN_NORM);
|
||||
else
|
||||
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)
|
||||
{
|
||||
other.invincible_time = 1;
|
||||
other.invincible_finished = time + 30;
|
||||
other.items = other.items | IT_INVULNERABILITY;
|
||||
|
||||
other.super_time = 1;
|
||||
other.super_damage_finished = time + 30;
|
||||
other.items = other.items | IT_QUAD;
|
||||
|
||||
other.ammo_cells = 0;
|
||||
|
||||
|
||||
sound (other, CHAN_VOICE, "boss1/sight1.wav", 1, ATTN_NORM);
|
||||
stuffcmd (other, "bf\n");
|
||||
bprint (PRINT_HIGH, other.netname);
|
||||
bprint (PRINT_HIGH, " attains bonus powers!!!\n");
|
||||
}
|
||||
}
|
||||
self = other;
|
||||
return;
|
||||
}
|
||||
if (self.items)
|
||||
if ((other.items & self.items) == 0)
|
||||
{
|
||||
|
@ -1350,7 +1596,7 @@ void() BackpackTouch =
|
|||
sprint (other,PRINT_LOW, " cells");
|
||||
}
|
||||
|
||||
if ( (deathmatch==3) & ( (WeaponCode(new)==6) || (WeaponCode(new)==7) ) & (other.ammo_rockets < 5) )
|
||||
if ( (deathmatch==3 || deathmatch == 5) & ( (WeaponCode(new)==6) || (WeaponCode(new)==7) ) & (other.ammo_rockets < 5) )
|
||||
other.ammo_rockets = 5;
|
||||
|
||||
sprint (other, PRINT_LOW, "\n");
|
||||
|
@ -1379,8 +1625,6 @@ void() BackpackTouch =
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
W_SetCurrentAmmo ();
|
||||
};
|
||||
|
||||
|
@ -1438,3 +1682,5 @@ void() DropBackpack =
|
|||
item.nextthink = time + 120; // remove after 2 minutes
|
||||
item.think = SUB_Remove;
|
||||
};
|
||||
|
||||
|
||||
|
|
15
jctest.qc
15
jctest.qc
|
@ -1,15 +0,0 @@
|
|||
|
||||
void() jctrig =
|
||||
{
|
||||
dprint ("here\n\n");
|
||||
lightstyle(0, "az");
|
||||
};
|
||||
|
||||
/*QUAKED trigger_jctest (.5 .5 .5) ?
|
||||
*/
|
||||
void() trigger_jctest =
|
||||
{
|
||||
setsize (self, self.mins, self.maxs);
|
||||
self.solid = SOLID_EDGE;
|
||||
self.touch = jctrig;
|
||||
};
|
29
misc.qc
29
misc.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
misc.qc
|
||||
|
||||
pretty much everything else
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
|
||||
Used as a positional target for spotlights, etc.
|
||||
|
@ -217,7 +243,7 @@ void() barrel_explode =
|
|||
self.takedamage = DAMAGE_NO;
|
||||
self.classname = "explo_box";
|
||||
// did say self.owner
|
||||
T_RadiusDamage (self, self, 160, world);
|
||||
T_RadiusDamage (self, self, 160, world, "");
|
||||
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
||||
WriteByte (MSG_MULTICAST, TE_EXPLOSION);
|
||||
WriteCoord (MSG_MULTICAST, self.origin_x);
|
||||
|
@ -316,6 +342,7 @@ void() Laser_Touch =
|
|||
if (other.health)
|
||||
{
|
||||
SpawnBlood (org, 15);
|
||||
other.deathtype = "laser";
|
||||
T_Damage (other, self, self.owner, 15);
|
||||
}
|
||||
else
|
||||
|
|
26
models.qc
26
models.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
models.qc
|
||||
|
||||
model definitions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
===============================================================================
|
||||
|
|
29
plats.qc
29
plats.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
plats.qc
|
||||
|
||||
platform functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
|
||||
void() plat_center_touch;
|
||||
|
@ -111,6 +137,7 @@ void() plat_crush =
|
|||
{
|
||||
//dprint ("plat_crush\n");
|
||||
|
||||
other.deathtype = "squish";
|
||||
T_Damage (other, self, self, 1);
|
||||
|
||||
if (self.state == STATE_UP)
|
||||
|
@ -223,8 +250,10 @@ void() train_blocked =
|
|||
if (time < self.attack_finished)
|
||||
return;
|
||||
self.attack_finished = time + 0.5;
|
||||
other.deathtype = "squish";
|
||||
T_Damage (other, self, self, self.dmg);
|
||||
};
|
||||
|
||||
void() train_use =
|
||||
{
|
||||
if (self.think != func_train_find)
|
||||
|
|
60
player.qc
60
player.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
player.qc
|
||||
|
||||
player functions/definitions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
void() bubble_bob;
|
||||
|
||||
|
@ -409,7 +435,7 @@ local float rs;
|
|||
// water death sounds
|
||||
if (self.waterlevel == 3)
|
||||
{
|
||||
DeathBubbles(20);
|
||||
DeathBubbles(5);
|
||||
sound (self, CHAN_VOICE, "player/h2odeath.wav", 1, ATTN_NONE);
|
||||
return;
|
||||
}
|
||||
|
@ -546,8 +572,38 @@ void() GibPlayer =
|
|||
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)
|
||||
{
|
||||
DropQuad (self.super_damage_finished - time);
|
||||
bprint (PRINT_LOW, self.netname);
|
||||
if (deathmatch == 4)
|
||||
bprint (PRINT_LOW, " lost an OctaPower with ");
|
||||
else
|
||||
bprint (PRINT_LOW, " lost a quad with ");
|
||||
s = ftos(rint(self.super_damage_finished - time));
|
||||
bprint (PRINT_LOW, s);
|
||||
bprint (PRINT_LOW, " seconds remaining\n");
|
||||
}
|
||||
}
|
||||
|
||||
if ((stof(infokey(world,"dr"))) != 0)
|
||||
{
|
||||
if (self.invisible_finished > 0)
|
||||
{
|
||||
bprint (PRINT_LOW, self.netname);
|
||||
bprint (PRINT_LOW, " lost a ring with ");
|
||||
s = ftos(rint(self.invisible_finished - time));
|
||||
bprint (PRINT_LOW, s);
|
||||
bprint (PRINT_LOW, " seconds remaining\n");
|
||||
DropRing (self.invisible_finished - time);
|
||||
}
|
||||
}
|
||||
|
||||
self.invisible_finished = 0; // don't die as eyes
|
||||
self.invincible_finished = 0;
|
||||
self.super_damage_finished = 0;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
../progs.dat
|
||||
./qwprogs.dat
|
||||
|
||||
defs.qc
|
||||
subs.qc
|
||||
|
@ -7,6 +7,7 @@ items.qc
|
|||
weapons.qc
|
||||
world.qc
|
||||
client.qc
|
||||
spectate.qc
|
||||
player.qc
|
||||
doors.qc
|
||||
buttons.qc
|
||||
|
|
27
server.qc
27
server.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
server.qc
|
||||
|
||||
server functions (movetarget code)
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
void() monster_ogre = {remove(self);};
|
||||
void() monster_demon1 = {remove(self);};
|
||||
|
@ -14,6 +40,7 @@ void() monster_fish = {remove(self);};
|
|||
void() monster_shalrath = {remove(self);};
|
||||
void() monster_enforcer = {remove(self);};
|
||||
void() monster_oldone = {remove(self);};
|
||||
void() event_lightning = {remove(self);};
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
|
111
spectate.qc
Normal file
111
spectate.qc
Normal file
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
spectate.qc
|
||||
|
||||
spectator functions
|
||||
|
||||
PURPOSE
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
// Added Aug11'97 by Zoid <zoid@idsoftware.com>
|
||||
//
|
||||
// These functions are called from the server if they exist.
|
||||
// Note that Spectators only have one think since they movement code doesn't
|
||||
// track them much. Impulse commands work as usual, but don't call
|
||||
// the regular ImpulseCommand handler in weapons.qc since Spectators don't
|
||||
// have any weapons and things can explode.
|
||||
//
|
||||
// --- Zoid.
|
||||
|
||||
/*
|
||||
===========
|
||||
SpectatorConnect
|
||||
|
||||
called when a spectator connects to a server
|
||||
============
|
||||
*/
|
||||
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
|
||||
============
|
||||
*/
|
||||
void() SpectatorDisconnect =
|
||||
{
|
||||
bprint (PRINT_MEDIUM, "Spectator ");
|
||||
bprint (PRINT_MEDIUM, self.netname);
|
||||
bprint (PRINT_MEDIUM, " left the game\n");
|
||||
};
|
||||
|
||||
/*
|
||||
================
|
||||
SpectatorImpulseCommand
|
||||
|
||||
Called by SpectatorThink if the spectator entered an impulse
|
||||
================
|
||||
*/
|
||||
void() SpectatorImpulseCommand =
|
||||
{
|
||||
if (self.impulse == 1) {
|
||||
// teleport the spectator to the next spawn point
|
||||
// note that if the spectator is tracking, this doesn't do
|
||||
// much
|
||||
self.goalentity = find(self.goalentity, classname, "info_player_deathmatch");
|
||||
if (self.goalentity == world)
|
||||
self.goalentity = find(self.goalentity, classname, "info_player_deathmatch");
|
||||
if (self.goalentity != world) {
|
||||
setorigin(self, self.goalentity.origin);
|
||||
self.angles = self.goalentity.angles;
|
||||
self.fixangle = TRUE; // turn this way immediately
|
||||
}
|
||||
}
|
||||
|
||||
self.impulse = 0;
|
||||
};
|
||||
|
||||
/*
|
||||
================
|
||||
SpectatorThink
|
||||
|
||||
Called every frame after physics are run
|
||||
================
|
||||
*/
|
||||
void() SpectatorThink =
|
||||
{
|
||||
// self.origin, etc contains spectator position, so you could
|
||||
// do some neat stuff here
|
||||
|
||||
if (self.impulse)
|
||||
SpectatorImpulseCommand();
|
||||
};
|
||||
|
||||
|
26
sprites.qc
26
sprites.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
sprites.qc
|
||||
|
||||
sprite definitions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
// these are the only sprites still in the game...
|
||||
|
||||
|
|
26
subs.qc
26
subs.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
subs.qc
|
||||
|
||||
sub-functions, mostly movement related
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
|
||||
void() SUB_Null = {};
|
||||
|
|
42
triggers.qc
42
triggers.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
triggers.qc
|
||||
|
||||
trigger functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
entity stemp, otemp, s, old;
|
||||
|
||||
|
@ -318,16 +344,28 @@ void(vector org) spawn_tfog =
|
|||
|
||||
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")
|
||||
{
|
||||
if (other.invincible_finished > time &&
|
||||
self.owner.invincible_finished > time) {
|
||||
self.classname = "teledeath3";
|
||||
other.invincible_finished = 0;
|
||||
self.owner.invincible_finished = 0;
|
||||
T_Damage (other, self, self, 50000);
|
||||
other2 = self.owner;
|
||||
self.owner = other;
|
||||
T_Damage (other2, self, self, 50000);
|
||||
}
|
||||
|
||||
if (other.invincible_finished > time)
|
||||
{
|
||||
self.classname = "teledeath2";
|
||||
if (self.owner.classname != "player")
|
||||
{ // other monsters explode themselves
|
||||
T_Damage (self.owner, self, self, 50000);
|
||||
return;
|
||||
}
|
||||
|
|
128
weapons.qc
128
weapons.qc
|
@ -1,8 +1,33 @@
|
|||
/*
|
||||
weapons.qc
|
||||
|
||||
weapon and weapon hit functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
void (entity targ, entity inflictor, entity attacker, float damage) T_Damage;
|
||||
void () player_run;
|
||||
void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage;
|
||||
void(entity bomb, entity attacker, float rad, entity ignore, string dtype) T_RadiusDamage;
|
||||
void(vector org, float damage) SpawnBlood;
|
||||
void() SuperDamageSound;
|
||||
|
||||
|
@ -51,6 +76,9 @@ void() W_FireAxe =
|
|||
{
|
||||
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
|
||||
|
@ -144,7 +172,6 @@ void(float damage) spawn_touchblood =
|
|||
SpawnBlood (self.origin + vel*0.01, damage);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
|
@ -221,9 +248,7 @@ void() Multi_Finish =
|
|||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
BULLETS
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
@ -279,7 +304,6 @@ void(float shotcount, vector dir, vector spread) FireBullets =
|
|||
|
||||
while (shotcount > 0)
|
||||
{
|
||||
|
||||
direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up;
|
||||
traceline (src, src + direction*2048, FALSE, self);
|
||||
if (trace_fraction != 1.0)
|
||||
|
@ -305,7 +329,9 @@ void() W_FireShotgun =
|
|||
msg_entity = self;
|
||||
WriteByte (MSG_ONE, SVC_SMALLKICK);
|
||||
|
||||
if (deathmatch != 4 )
|
||||
self.currentammo = self.ammo_shells = self.ammo_shells - 1;
|
||||
|
||||
dir = aim (self, 100000);
|
||||
FireBullets (6, dir, '0.04 0.04 0');
|
||||
};
|
||||
|
@ -331,6 +357,7 @@ void() W_FireSuperShotgun =
|
|||
msg_entity = self;
|
||||
WriteByte (MSG_ONE, SVC_BIGKICK);
|
||||
|
||||
if (deathmatch != 4)
|
||||
self.currentammo = self.ammo_shells = self.ammo_shells - 2;
|
||||
dir = aim (self, 100000);
|
||||
FireBullets (14, dir, '0.14 0.08 0');
|
||||
|
@ -349,9 +376,31 @@ void() T_MissileTouch =
|
|||
{
|
||||
local float damg;
|
||||
|
||||
// if (deathmatch == 4)
|
||||
// {
|
||||
// if ( ((other.weapon == 32) || (other.weapon == 16)))
|
||||
// {
|
||||
// if (random() < 0.1)
|
||||
// {
|
||||
// if (other != world)
|
||||
// {
|
||||
// // bprint (PRINT_HIGH, "Got here\n");
|
||||
// other.deathtype = "blaze";
|
||||
// T_Damage (other, self, self.owner, 1000 );
|
||||
// T_RadiusDamage (self, self.owner, 1000, other);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
if (other == self.owner)
|
||||
return; // don't explode on owner
|
||||
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
if (pointcontents(self.origin) == CONTENT_SKY)
|
||||
{
|
||||
remove(self);
|
||||
|
@ -362,14 +411,15 @@ void() T_MissileTouch =
|
|||
|
||||
if (other.health)
|
||||
{
|
||||
if (other.classname == "monster_shambler")
|
||||
damg = damg * 0.5; // mostly immune
|
||||
other.deathtype = "rocket";
|
||||
T_Damage (other, self, self.owner, damg );
|
||||
}
|
||||
|
||||
// don't do radius damage to the other, because all the damage
|
||||
// was done in the impact
|
||||
T_RadiusDamage (self, self.owner, 120, other);
|
||||
|
||||
|
||||
T_RadiusDamage (self, self.owner, 120, other, "rocket");
|
||||
|
||||
// sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
|
||||
self.origin = self.origin - 8 * normalize(self.velocity);
|
||||
|
@ -393,6 +443,7 @@ W_FireRocket
|
|||
*/
|
||||
void() W_FireRocket =
|
||||
{
|
||||
if (deathmatch != 4)
|
||||
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
|
||||
|
||||
sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
|
||||
|
@ -413,10 +464,12 @@ void() W_FireRocket =
|
|||
newmis.angles = vectoangles(newmis.velocity);
|
||||
|
||||
newmis.touch = T_MissileTouch;
|
||||
newmis.voided = 0;
|
||||
|
||||
// set newmis duration
|
||||
newmis.nextthink = time + 5;
|
||||
newmis.think = SUB_Remove;
|
||||
newmis.classname = "rocket";
|
||||
|
||||
setmodel (newmis, "progs/missile.mdl");
|
||||
setsize (newmis, '0 0 0', '0 0 0');
|
||||
|
@ -425,9 +478,7 @@ void() W_FireRocket =
|
|||
|
||||
/*
|
||||
===============================================================================
|
||||
|
||||
LIGHTNING
|
||||
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
|
@ -463,6 +514,7 @@ void(vector p1, vector p2, entity from, float damage) LightningDamage =
|
|||
e1 = e2 = world;
|
||||
|
||||
traceline (p1, p2, FALSE, self);
|
||||
|
||||
if (trace_ent.takedamage)
|
||||
{
|
||||
LightningHit (from, damage);
|
||||
|
@ -503,13 +555,32 @@ void() W_FireLightning =
|
|||
|
||||
// explode if under water
|
||||
if (self.waterlevel > 1)
|
||||
{
|
||||
if (deathmatch > 3)
|
||||
{
|
||||
if (random() <= 0.5)
|
||||
{
|
||||
self.deathtype = "selfwater";
|
||||
T_Damage (self, self, self.owner, 4000 );
|
||||
}
|
||||
else
|
||||
{
|
||||
cells = self.ammo_cells;
|
||||
self.ammo_cells = 0;
|
||||
W_SetCurrentAmmo ();
|
||||
T_RadiusDamage (self, self, 35*cells, world);
|
||||
T_RadiusDamage (self, self, 35*cells, world, "");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cells = self.ammo_cells;
|
||||
self.ammo_cells = 0;
|
||||
W_SetCurrentAmmo ();
|
||||
T_RadiusDamage (self, self, 35*cells, world,"");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (self.t_width < time)
|
||||
{
|
||||
|
@ -519,6 +590,7 @@ void() W_FireLightning =
|
|||
msg_entity = self;
|
||||
WriteByte (MSG_ONE, SVC_SMALLKICK);
|
||||
|
||||
if (deathmatch != 4)
|
||||
self.currentammo = self.ammo_cells = self.ammo_cells - 1;
|
||||
|
||||
org = self.origin + '0 0 16';
|
||||
|
@ -545,7 +617,12 @@ void() W_FireLightning =
|
|||
|
||||
void() GrenadeExplode =
|
||||
{
|
||||
T_RadiusDamage (self, self.owner, 120, world);
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
T_RadiusDamage (self, self.owner, 120, world, "grenade");
|
||||
|
||||
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
||||
WriteByte (MSG_MULTICAST, TE_EXPLOSION);
|
||||
|
@ -578,6 +655,7 @@ W_FireGrenade
|
|||
*/
|
||||
void() W_FireGrenade =
|
||||
{
|
||||
if (deathmatch != 4)
|
||||
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
|
||||
|
||||
sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
|
||||
|
@ -586,6 +664,7 @@ void() W_FireGrenade =
|
|||
WriteByte (MSG_ONE, SVC_SMALLKICK);
|
||||
|
||||
newmis = spawn ();
|
||||
newmis.voided=0;
|
||||
newmis.owner = self;
|
||||
newmis.movetype = MOVETYPE_BOUNCE;
|
||||
newmis.solid = SOLID_BBOX;
|
||||
|
@ -611,7 +690,16 @@ void() W_FireGrenade =
|
|||
newmis.touch = GrenadeTouch;
|
||||
|
||||
// set newmis duration
|
||||
if (deathmatch == 4)
|
||||
{
|
||||
newmis.nextthink = time + 2.5;
|
||||
self.attack_finished = time + 1.1;
|
||||
// self.health = self.health - 1;
|
||||
T_Damage (self, self, self.owner, 10 );
|
||||
}
|
||||
else
|
||||
newmis.nextthink = time + 2.5;
|
||||
|
||||
newmis.think = GrenadeExplode;
|
||||
|
||||
setmodel (newmis, "progs/grenade.mdl");
|
||||
|
@ -636,6 +724,7 @@ Used for both the player and the ogre
|
|||
void(vector org, vector dir) launch_spike =
|
||||
{
|
||||
newmis = spawn ();
|
||||
newmis.voided=0;
|
||||
newmis.owner = self;
|
||||
newmis.movetype = MOVETYPE_FLYMISSILE;
|
||||
newmis.solid = SOLID_BBOX;
|
||||
|
@ -660,6 +749,7 @@ void() W_FireSuperSpikes =
|
|||
|
||||
sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM);
|
||||
self.attack_finished = time + 0.2;
|
||||
if (deathmatch != 4)
|
||||
self.currentammo = self.ammo_nails = self.ammo_nails - 2;
|
||||
dir = aim (self, 1000);
|
||||
launch_spike (self.origin + '0 0 16', dir);
|
||||
|
@ -692,6 +782,7 @@ void(float ox) W_FireSpikes =
|
|||
|
||||
sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
|
||||
self.attack_finished = time + 0.2;
|
||||
if (deathmatch != 4)
|
||||
self.currentammo = self.ammo_nails = self.ammo_nails - 1;
|
||||
dir = aim (self, 1000);
|
||||
launch_spike (self.origin + '0 0 16' + v_right*ox, dir);
|
||||
|
@ -709,6 +800,11 @@ local float rand;
|
|||
if (other == self.owner)
|
||||
return;
|
||||
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
if (other.solid == SOLID_TRIGGER)
|
||||
return; // trigger field, do nothing
|
||||
|
||||
|
@ -722,6 +818,7 @@ local float rand;
|
|||
if (other.takedamage)
|
||||
{
|
||||
spawn_touchblood (9);
|
||||
other.deathtype = "nail";
|
||||
T_Damage (other, self, self.owner, 9);
|
||||
}
|
||||
else
|
||||
|
@ -749,6 +846,12 @@ local float rand;
|
|||
if (other == self.owner)
|
||||
return;
|
||||
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
|
||||
if (other.solid == SOLID_TRIGGER)
|
||||
return; // trigger field, do nothing
|
||||
|
||||
|
@ -762,6 +865,7 @@ local float rand;
|
|||
if (other.takedamage)
|
||||
{
|
||||
spawn_touchblood (18);
|
||||
other.deathtype = "supernail";
|
||||
T_Damage (other, self, self.owner, 18);
|
||||
}
|
||||
else
|
||||
|
|
38
world.qc
38
world.qc
|
@ -1,3 +1,29 @@
|
|||
/*
|
||||
world.qc
|
||||
|
||||
main/world setup functions
|
||||
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to:
|
||||
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330
|
||||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
|
||||
void() InitBodyQue;
|
||||
|
||||
|
@ -176,13 +202,11 @@ void() worldspawn =
|
|||
|
||||
// custom map attributes
|
||||
|
||||
// can't change gravity in QuakeWorld
|
||||
/*
|
||||
if (self.model == "maps/e1m8.bsp")
|
||||
cvar_set ("sv_gravity", "100");
|
||||
else
|
||||
cvar_set ("sv_gravity", "800");
|
||||
*/
|
||||
|
||||
|
||||
// the area based ambient sounds MUST be the first precache_sounds
|
||||
|
||||
|
@ -241,6 +265,8 @@ void() worldspawn =
|
|||
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
|
||||
|
@ -258,6 +284,12 @@ void() worldspawn =
|
|||
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");
|
||||
|
||||
|
||||
precache_model ("progs/player.mdl");
|
||||
precache_model ("progs/eyes.mdl");
|
||||
precache_model ("progs/h_player.mdl");
|
||||
|
|
Loading…
Reference in a new issue