Beware. klik of death.

This commit is contained in:
Ragnvald Maartmann-Moe IV 2004-02-09 04:25:00 +00:00
parent cf14b40c95
commit 1cb1b902f9
14 changed files with 889 additions and 655 deletions

View file

@ -6,55 +6,63 @@
#include "mdl.qh" #include "mdl.qh"
#include "weapon.qh" #include "weapon.qh"
.void() prethink; .void () prethink;
.void() actthink; .void () actthink;
.void() postthink; .void () postthink;
void() PlayerPreThink = { void ()
if (is_cl(self)) PlayerPreThink =
PlayerStartFrame(); {
if (is_cl (self))
PlayerStartFrame ();
if (self.prethink) if (self.prethink)
self.prethink(); self.prethink ();
}; };
void() act_think = { void ()
if (!is_autothink(self)) { act_think =
{
if (!is_autothink (self)) {
frametime = 0.1; frametime = 0.1;
PlayerPreThink(); PlayerPreThink ();
} }
/*if (0.1 seconds have passed) {*/ /*if (0.1 seconds have passed) {*/
if (self.actthink) if (self.actthink)
self.actthink(); self.actthink ();
if (self.menu_think) if (self.menu_think)
self.menu_think(); self.menu_think ();
if (self.mdl_think && !self.mdl_thought) if (self.mdl_think && !self.mdl_thought)
self.mdl_think(); self.mdl_think ();
self.mdl_thought = FALSE; self.mdl_thought = FALSE;
if (self.w_think && !self.w_thought) if (self.w_think && !self.w_thought)
self.w_think(); self.w_think ();
self.w_thought = FALSE; self.w_thought = FALSE;
/*}*/ /*}*/
self.nextthink = time + 0.1; /* FIXME: Use sv_mintic here when non-client? */ self.nextthink = time + 0.1; /* FIXME: Use sv_mintic here when non-client? */
if (!is_autothink(self)) if (!is_autothink (self))
PlayerPostThink(); PlayerPostThink ();
}; };
void() PlayerPostThink = { void ()
PlayerPostThink =
{
if (self.postthink) if (self.postthink)
self.postthink(); self.postthink ();
if (is_cl(self)) if (is_cl (self))
PlayerEndFrame(); PlayerEndFrame ();
}; };
void() act_setup = { void ()
act_setup =
{
self.think = act_think; self.think = act_think;
self.nextthink = time; self.nextthink = time;
}; };

View file

@ -5,13 +5,11 @@
#include "damage.qh" #include "damage.qh"
@extern { @extern {
.void () prethink;
.void () actthink;
.void () postthink;
.void() prethink; void () act_setup;
.void() actthink;
.void() postthink;
void() act_setup;
}; };
#endif #endif

View file

@ -17,8 +17,10 @@
#define STOP_EPSILON 0.1 #define STOP_EPSILON 0.1
void() dead_prethink = { void ()
if (vlen(self.movedir) > vlen(self.velocity)) { dead_prethink =
{
if (vlen (self.movedir) > vlen (self.velocity)) {
self.velocity = '0 0 0'; self.velocity = '0 0 0';
} else { } else {
/* FIXME: Use e, decay per frame. */ /* FIXME: Use e, decay per frame. */
@ -27,11 +29,14 @@ void() dead_prethink = {
self.pain_finished = time + 0.1; self.pain_finished = time + 0.1;
} }
if (self.velocity_x > -STOP_EPSILON && self.velocity_x < STOP_EPSILON) if ((self.velocity_x > -STOP_EPSILON)
&& (self.velocity_x < STOP_EPSILON))
self.velocity_x = 0; self.velocity_x = 0;
if (self.velocity_y > -STOP_EPSILON && self.velocity_y < STOP_EPSILON) if ((self.velocity_y > -STOP_EPSILON)
&& (self.velocity_y < STOP_EPSILON))
self.velocity_y = 0; self.velocity_y = 0;
if (self.velocity_z > -STOP_EPSILON && self.velocity_z < STOP_EPSILON) if ((self.velocity_z > -STOP_EPSILON)
&& (self.velocity_z < STOP_EPSILON))
self.velocity_z = 0; self.velocity_z = 0;
} }
@ -48,28 +53,42 @@ void() dead_prethink = {
self.movedir = self.velocity; self.movedir = self.velocity;
}; };
void() dead_postthink = { void ()
dead_postthink =
{
local vector vieworg; local vector vieworg;
self.dmg_take = 0; self.dmg_take = 0;
self.dmg_save = 0; self.dmg_save = 0;
vieworg = vieworigin(self); vieworg = vieworigin (self);
if (pointcontents(vieworg + self.velocity*sv_maxtic) != pointcontents(vieworg)) { if (pointcontents (vieworg + self.velocity * sv_maxtic)
!= pointcontents (vieworg)) {
self.movetype = MOVETYPE_NONE; self.movetype = MOVETYPE_NONE;
self.velocity = '0 0 0'; self.velocity = '0 0 0';
setorigin(self, self.origin); setorigin(self, self.origin);
} }
}; };
float() dead_takeitem = { return FALSE; }; float ()
float(float d) dead_takedamage = { return FALSE; }; dead_takeitem =
{
return FALSE;
};
void() act_setup_dead = { float (float d)
act_setup(); dead_takedamage =
{
return FALSE;
};
weapon_select_by_impulse(0); void ()
act_setup_dead =
{
act_setup ();
weapon_select_by_impulse (0);
self.solid = SOLID_NOT; self.solid = SOLID_NOT;
self.takedamage = DAMAGE_NO; self.takedamage = DAMAGE_NO;
@ -105,16 +124,16 @@ void() act_setup_dead = {
self.mass = 0; self.mass = 0;
self.movedir = self.velocity; self.movedir = self.velocity;
self.movedir_z -= sv_gravity * sv_maxtic; /* Gravity hack. */ self.movedir_z -= sv_gravity * sv_maxtic; // Gravity hack.
self.pain_finished = time + 0.1; self.pain_finished = time + 0.1;
self.air_finished = time + 2; self.air_finished = time + 2;
override_set_th_takeitem(self, dead_takeitem); override_set_th_takeitem (self, dead_takeitem);
override_set_th_takedamage(self, dead_takedamage); override_set_th_takedamage (self, dead_takedamage);
override_set_prethink(self, dead_prethink); override_set_prethink (self, dead_prethink);
override_set_actthink(self, NOTHING_function); override_set_actthink (self, NOTHING_function);
override_set_postthink(self, dead_postthink); override_set_postthink (self, dead_postthink);
dead_postthink(); /* make sure we don't noclip when near walls */ dead_postthink (); // make sure we don't noclip when near walls
}; };

View file

@ -2,9 +2,7 @@
#define ACT_DEAD_qh 1 #define ACT_DEAD_qh 1
@extern { @extern {
void () act_setup_dead;
void() act_setup_dead;
}; };
#endif #endif

View file

@ -15,75 +15,79 @@
#include "override.qh" #include "override.qh"
void() act_player_init = { void ()
precache_sound("player/plyrjmp8.wav"); act_player_init =
precache_sound("player/h2ojump.wav"); {
precache_sound ("player/plyrjmp8.wav");
precache_sound ("player/h2ojump.wav");
precache_sound("player/land.wav"); precache_sound ("player/land.wav");
precache_sound("player/land2.wav"); precache_sound ("player/land2.wav");
precache_sound("player/inh2o.wav"); precache_sound ("player/inh2o.wav");
precache_sound("player/slimbrn2.wav"); precache_sound ("player/slimbrn2.wav");
precache_sound("player/inlava.wav"); precache_sound ("player/inlava.wav");
precache_sound("misc/water1.wav"); precache_sound ("misc/water1.wav");
precache_sound("misc/water2.wav"); precache_sound ("misc/water2.wav");
precache_sound("player/drown1.wav"); precache_sound ("player/drown1.wav");
precache_sound("player/drown2.wav"); precache_sound ("player/drown2.wav");
precache_sound("player/lburn1.wav"); precache_sound ("player/lburn1.wav");
precache_sound("player/lburn2.wav"); precache_sound ("player/lburn2.wav");
precache_sound("player/gasp1.wav"); precache_sound ("player/gasp1.wav");
precache_sound("player/gasp2.wav"); precache_sound ("player/gasp2.wav");
precache_sound("misc/outwater.wav"); precache_sound ("misc/outwater.wav");
precache_sound("player/pain1.wav"); precache_sound ("player/pain1.wav");
precache_sound("player/pain2.wav"); precache_sound ("player/pain2.wav");
precache_sound("player/pain3.wav"); precache_sound ("player/pain3.wav");
precache_sound("player/pain4.wav"); precache_sound ("player/pain4.wav");
precache_sound("player/pain5.wav"); precache_sound ("player/pain5.wav");
precache_sound("player/pain6.wav"); precache_sound ("player/pain6.wav");
precache_sound("player/death1.wav"); precache_sound ("player/death1.wav");
precache_sound("player/death2.wav"); precache_sound ("player/death2.wav");
precache_sound("player/death3.wav"); precache_sound ("player/death3.wav");
precache_sound("player/death4.wav"); precache_sound ("player/death4.wav");
precache_sound("player/death5.wav"); precache_sound ("player/death5.wav");
precache_sound("player/gib.wav"); precache_sound ("player/gib.wav");
precache_sound("player/udeath.wav"); precache_sound ("player/udeath.wav");
precache_sound("player/h2odeath.wav"); precache_sound ("player/h2odeath.wav");
precache_model("progs/backpack.mdl"); precache_model ("progs/backpack.mdl");
precache_sound("weapons/lock4.wav"); precache_sound ("weapons/lock4.wav");
precache_sound("items/itembk2.wav"); precache_sound ("items/itembk2.wav");
}; };
// ======================================================================== // ========================================================================
void(float scl) player_throw_ammo = { void (float scl)
player_throw_ammo =
{
local entity player; local entity player;
player = self; player = self;
self = spawn("BACKPACK"); self = spawn ("BACKPACK");
if (scl > 1) { if (scl > 1) {
/* FIXME: This is actually a hack to avoid powerups */ /* FIXME: This is actually a hack to avoid powerups */
#define qg(eid) \ #define qg(eid) \
if (equip_query(player, eid)) \ if (equip_query (player, eid)) \
equip_grant(self, eid) \ equip_grant (self, eid) \
qg(EQUIPID_SUPER_SHOTGUN); qg (EQUIPID_SUPER_SHOTGUN);
qg(EQUIPID_NAILGUN); qg (EQUIPID_NAILGUN);
qg(EQUIPID_SUPER_NAILGUN); qg (EQUIPID_SUPER_NAILGUN);
qg(EQUIPID_GRENADE_LAUNCHER); qg (EQUIPID_GRENADE_LAUNCHER);
qg(EQUIPID_ROCKET_LAUNCHER); qg (EQUIPID_ROCKET_LAUNCHER);
qg(EQUIPID_LIGHTNING_GUN); qg (EQUIPID_LIGHTNING_GUN);
#undef qg #undef qg
player.itemfield_1 = 0; player.itemfield_1 = 0;
@ -103,18 +107,19 @@ void(float scl) player_throw_ammo = {
self.ammo_cells = player.ammo_cells * scl; self.ammo_cells = player.ammo_cells * scl;
player.ammo_cells -= self.ammo_cells; player.ammo_cells -= self.ammo_cells;
if (!self.ammo_shells && !self.ammo_nails && !self.ammo_rockets && !self.ammo_cells if (!self.ammo_shells && !self.ammo_nails && !self.ammo_rockets
&& !self.itemfield_1 && !self.itemfield_2 && !self.itemfield_3 && !self.itemfield_4) { && !self.ammo_cells && !self.itemfield_1 && !self.itemfield_2
remove(self); && !self.itemfield_3 && !self.itemfield_4) {
remove (self);
self = player; self = player;
return; return;
} }
self.origin = center(player); self.origin = center (player);
self.movetype = MOVETYPE_TOSS; self.movetype = MOVETYPE_TOSS;
self.velocity_x = crandom()*100; self.velocity_x = crandom () * 100;
self.velocity_y = crandom()*100; self.velocity_y = crandom () * 100;
self.velocity_z = 200; self.velocity_z = 200;
self.mins = '-16 -16 0'; self.mins = '-16 -16 0';
@ -127,42 +132,51 @@ void(float scl) player_throw_ammo = {
self.wait = -1; self.wait = -1;
self.think = SUB_remove; self.think = SUB_remove;
self.nextthink = time + 20 + random()*20; self.nextthink = time + 20 + random () *20;
item_generic(); item_generic ();
self = player; self = player;
}; };
void() player_die = { void ()
player_die =
{
local float r; local float r;
if (self.health > CONFIG_GIB_HEALTH) { if (self.health > CONFIG_GIB_HEALTH) {
if (self.waterlevel >= 3) { if (self.waterlevel >= 3) {
self.noise = "player/h2odeath.wav"; self.noise = "player/h2odeath.wav";
} else { } else {
r = random()*5; r = random () * 5;
if (r < 1) self.noise = "player/death1.wav"; if (r < 1)
else if (r < 2) self.noise = "player/death2.wav"; self.noise = "player/death1.wav";
else if (r < 3) self.noise = "player/death3.wav"; else if (r < 2)
else if (r < 4) self.noise = "player/death4.wav"; self.noise = "player/death2.wav";
else self.noise = "player/death5.wav"; else if (r < 3)
self.noise = "player/death3.wav";
else if (r < 4)
self.noise = "player/death4.wav";
else
self.noise = "player/death5.wav";
} }
sound(self, CHAN_VOICE, self.noise, 1, ATTN_NONE); sound (self, CHAN_VOICE, self.noise, 1, ATTN_NONE);
player_throw_ammo(2); player_throw_ammo (2);
mdl_bodyque_and_func(MDL_FUNC_DIE, floor(random()*5)); mdl_bodyque_and_func (MDL_FUNC_DIE, floor (random () * 5));
} else { } else {
r = random()*2; r = random () * 2;
if (r < 1) self.noise = "player/gib.wav"; if (r < 1)
else self.noise = "player/udeath.wav"; self.noise = "player/gib.wav";
else
self.noise = "player/udeath.wav";
sound(self, CHAN_VOICE, self.noise, 1, ATTN_NONE); sound (self, CHAN_VOICE, self.noise, 1, ATTN_NONE);
mdl_bodyque_and_func(MDL_FUNC_GIB, 0); mdl_bodyque_and_func (MDL_FUNC_GIB, 0);
} }
makevectors(self.angles); /* Not v_angle! */ makevectors (self.angles); /* Not v_angle! */
self.velocity = (v_forward*-200) + (v_up*100); self.velocity = (v_forward * -200) + (v_up * 100);
if (self.v_angle_x < 75 && self.v_angle_x > -75) { if (self.v_angle_x < 75 && self.v_angle_x > -75) {
self.angles = self.v_angle; self.angles = self.v_angle;
@ -171,155 +185,199 @@ void() player_die = {
} }
/* FIXME: Hack. */ /* FIXME: Hack. */
setorigin(self, vieworigin(self)); setorigin (self, vieworigin (self));
RemoveClientFromGame(); RemoveClientFromGame ();
}; };
// ======================================================================== // ========================================================================
float(float d) _player_takedamage_core = { float (float d)
_player_takedamage_core =
{
self.health -= d; self.health -= d;
self.dmg_take += d; self.dmg_take += d;
if (floor(self.health) <= 0) { if (floor (self.health) <= 0) {
deathmsg_display(); deathmsg_display ();
player_die(); player_die ();
} else { } else {
deathmsg_nodisplay(); deathmsg_nodisplay ();
self.mdl_func(MDL_FUNC_PAIN, d); self.mdl_func (MDL_FUNC_PAIN, d);
} }
return TRUE; return TRUE;
}; };
float(float d) player_takedamage = { float (float d)
local float r, taked; player_takedamage =
{
local float taked, r;
damage_push(d); damage_push (d);
taked = damage_armor(d); taked = damage_armor (d);
self.dmg_save = self.dmg_save + (d - taked); self.dmg_save += (d - taked);
if (taked <= 0) if (taked <= 0)
return FALSE; return FALSE;
if (self.pain_finished < time) { if (self.pain_finished < time) {
if ((self.mdl_mod & MDL_MOD_SWIM_IN) && self.air_finished < (time + random()*9)) { if ((self.mdl_mod & MDL_MOD_SWIM_IN) && self.air_finished < (time + random () * 9)) {
r = random()*2; r = random () * 2;
if (r < 1) self.noise = "player/drown2.wav"; if (r < 1)
else self.noise = "player/drown1.wav"; self.noise = "player/drown2.wav";
else
self.noise = "player/drown1.wav";
} else { } else {
r = random()*5; r = random () * 5;
if (r < 1) self.noise = "player/pain1.wav"; if (r < 1)
else if (r < 2) self.noise = "player/pain2.wav"; self.noise = "player/pain1.wav";
else if (r < 3) self.noise = "player/pain3.wav"; else if (r < 2)
else if (r < 4) self.noise = "player/pain4.wav"; self.noise = "player/pain2.wav";
else if (r < 5) self.noise = "player/pain5.wav"; else if (r < 3)
else self.noise = "player/pain6.wav"; self.noise = "player/pain3.wav";
else if (r < 4)
self.noise = "player/pain4.wav";
else if (r < 5)
self.noise = "player/pain5.wav";
else
self.noise = "player/pain6.wav";
} }
sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
self.pain_finished = time + 1; self.pain_finished = time + 1;
} }
return _player_takedamage_core(taked); return _player_takedamage_core (taked);
}; };
// ======================================================================== // ========================================================================
float(float d) _player_takedamage_drown = { float (float d)
_player_takedamage_drown =
{
local float r; local float r;
if (d <= 0) if (d <= 0)
return FALSE; return FALSE;
if (self.pain_finished < time) { if (self.pain_finished < time) {
r = random()*2; r = random () * 2;
if (r < 1) self.noise = self.noise3; if (r < 1)
else self.noise = self.noise4; self.noise = self.noise3;
else
self.noise = self.noise4;
sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
self.pain_finished = time + 1; self.pain_finished = time + 1;
} }
return _player_takedamage_core(d); return _player_takedamage_core (d);
}; };
float(float d) _player_takedamage_melt = { float (float d)
local float r, taked; _player_takedamage_melt =
{
local float taked, r;
taked = damage_armor(d); taked = damage_armor (d);
self.dmg_save += d - taked; self.dmg_save += d - taked;
if (taked <= 0) if (taked <= 0)
return FALSE; return FALSE;
if (self.pain_finished < time) { if (self.pain_finished < time) {
r = random()*2; r = random () * 2;
if (r < 1) self.noise = self.noise3; if (r < 1)
else self.noise = self.noise4; self.noise = self.noise3;
else
self.noise = self.noise4;
sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
self.pain_finished = time + 1; self.pain_finished = time + 1;
} }
return _player_takedamage_core(taked); return _player_takedamage_core (taked);
}; };
float(float d, float(float d) damg_func, void() deathmessage) _player_damage_custom = { float (float d, float (float d) damg_func, void () deathmessage)
_player_damage_custom =
{
local float ret; local float ret;
override_set_th_takedamage(self, damg_func); override_set_th_takedamage (self, damg_func);
ret = damage(self, self, world, d, deathmessage); ret = damage (self, self, world, d, deathmessage);
override_set_th_takedamage(self, player_takedamage); override_set_th_takedamage (self, player_takedamage);
return ret; return ret;
}; };
// ======================================================================== // ========================================================================
void() _deathmsg_player_liquid = { void ()
_deathmsg_player_liquid =
{
local string def_nname; local string def_nname;
local float r; local float r;
def_nname = name(self); def_nname = name (self);
if (self.watertype == CONTENT_WATER) { switch (self.watertype) {
r = random()*2; case CONTENT_WATER:
if (r < 1) bprint(PRINT_DEATH, def_nname, " sleeps with the fishes.\n"); r = random () * 2;
else bprint(PRINT_DEATH, def_nname, " hunts for air.\n"); if (r < 1)
} else if (self.watertype == CONTENT_SLIME) { bprint (PRINT_DEATH, def_nname, " sleeps with the fishes.\n");
r = random()*2; else
if (r < 1) bprint(PRINT_DEATH, def_nname, " can't exist on slime alone.\n"); bprint (PRINT_DEATH, def_nname, " hunts for air.\n");
else bprint(PRINT_DEATH, def_nname, " floats in slime.\n"); break;
} else if (self.watertype == CONTENT_LAVA) { case CONTENT_SLIME:
r = random()*3; r = random () * 2;
if (r < 1) bprint(PRINT_DEATH, def_nname, " swam in a volcano.\n"); if (r < 1)
else if (r < 2) bprint(PRINT_DEATH, def_nname, " turned into hot slag.\n"); bprint (PRINT_DEATH, def_nname, " can't exist on slime alone.\n");
else bprint(PRINT_DEATH, def_nname, " parties with Chthon.\n"); else
} else { bprint (PRINT_DEATH, def_nname, " floats in slime.\n");
bprint(PRINT_DEATH, def_nname, " gulps it down.\n"); break;
case CONTENT_LAVA:
r = random () * 3;
if (r < 1)
bprint (PRINT_DEATH, def_nname, " swam in a volcano.\n");
else if (r < 2)
bprint (PRINT_DEATH, def_nname, " turned into hot slag.\n");
else
bprint (PRINT_DEATH, def_nname, " parties with Chthon.\n");
break;
default:
bprint (PRINT_DEATH, def_nname, " gulps it down.\n");
break;
} }
}; };
void() _deathmsg_player_fall = { void ()
_deathmsg_player_fall =
{
local string def_name; local string def_name;
local float r; local float r;
def_name = name(self); def_name = name (self);
r = random()*3; r = random () * 3;
if (r < 1) bprint(PRINT_DEATH, def_name, " landed head-first.\n"); if (r < 1)
else if (r < 2) bprint(PRINT_DEATH, def_name, " cratered.\n"); bprint (PRINT_DEATH, def_name, " landed head-first.\n");
else bprint(PRINT_DEATH, def_name, " took a nose dive into the ground.\n"); else if (r < 2)
bprint (PRINT_DEATH, def_name, " cratered.\n");
else
bprint (PRINT_DEATH, def_name,
" took a nose dive into the ground.\n");
}; };
// ======================================================================== // ========================================================================
/* This is so stupid. */ /* This is so stupid. */
float() _player_jump = { float ()
_player_jump =
{
if (!self.button2) { if (!self.button2) {
self.flags |= FL_JUMPRELEASED; self.flags |= FL_JUMPRELEASED;
return FALSE; return FALSE;
@ -331,7 +389,7 @@ float() _player_jump = {
if (!(self.flags & FL_JUMPRELEASED)) if (!(self.flags & FL_JUMPRELEASED))
return FALSE; return FALSE;
self.mdl_func(MDL_FUNC_JUMP, 0); self.mdl_func (MDL_FUNC_JUMP, 0);
self.flags &= ~FL_JUMPRELEASED; self.flags &= ~FL_JUMPRELEASED;
self.button2 = 0; self.button2 = 0;
@ -339,39 +397,43 @@ float() _player_jump = {
return TRUE; return TRUE;
}; };
void() _player_water_jump = { void ()
_player_water_jump =
{
if (self.waterlevel <= 1) { if (self.waterlevel <= 1) {
if (_player_jump()) if (_player_jump())
sound(self, CHAN_BODY, "player/plyrjmp8.wav", 1, ATTN_NORM); sound (self, CHAN_BODY, "player/plyrjmp8.wav", 1, ATTN_NORM);
return; return;
} }
if (self.waterlevel <= 2) { if (self.waterlevel <= 2) {
if (_player_jump()) if (_player_jump ())
sound(self, CHAN_BODY, "misc/water2.wav", 1, ATTN_NORM); sound (self, CHAN_BODY, "misc/water2.wav", 1, ATTN_NORM);
} }
/* Yeah. The engine is a piece of crap. */ /* Yeah. The engine is a piece of crap. */
if (self.button2) { if (self.button2) {
if (self.flags & FL_ONGROUND) { if (self.flags & FL_ONGROUND) {
self.flags = self.flags - FL_ONGROUND; self.flags &= ~FL_ONGROUND;
self.origin_z = self.origin_z + 1; self.origin_z++;
} }
} }
}; };
/* This is called every frame... */ /* This is called every frame... */
void() player_prethink = { void ()
player_prethink =
{
/* Gasp for air if we weren't swimming.. /* Gasp for air if we weren't swimming..
/* Checking here rather than later, with mdl_mod is a HACK */ /* Checking here rather than later, with mdl_mod is a HACK */
/* It avoids the gasp when the player hasn't communicated /* It avoids the gasp when the player hasn't communicated
with the server in a while (it happens..) */ with the server in a while (it happens..) */
if (self.waterlevel < 3) { if (self.waterlevel < 3) {
if (self.mdl_mod&MDL_MOD_SWIM_IN) { if (self.mdl_mod & MDL_MOD_SWIM_IN) {
if (self.air_finished < time) if (self.air_finished < time)
sound(self, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM); sound (self, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM);
else if (self.air_finished < (time + 9)) else if (self.air_finished < (time + 9))
sound(self, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM); sound (self, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM);
} }
self.air_finished = time + 12; self.air_finished = time + 12;
@ -388,11 +450,15 @@ void() player_prethink = {
if (self.watertype == CONTENT_SLIME) { if (self.watertype == CONTENT_SLIME) {
self.noise3 = "player/lburn1.wav"; self.noise3 = "player/lburn1.wav";
self.noise4 = "player/lburn2.wav"; self.noise4 = "player/lburn2.wav";
_player_damage_custom(4*self.waterlevel*frametime, _player_takedamage_melt, _deathmsg_player_liquid); _player_damage_custom (4 * self.waterlevel * frametime,
_player_takedamage_melt,
_deathmsg_player_liquid);
} else if (self.watertype == CONTENT_LAVA) { } else if (self.watertype == CONTENT_LAVA) {
self.noise3 = "player/lburn1.wav"; self.noise3 = "player/lburn1.wav";
self.noise4 = "player/lburn2.wav"; self.noise4 = "player/lburn2.wav";
_player_damage_custom(50*self.waterlevel*frametime, _player_takedamage_melt, _deathmsg_player_liquid); _player_damage_custom (50 * self.waterlevel * frametime,
_player_takedamage_melt,
_deathmsg_player_liquid);
} }
/* Try to breathe :) */ /* Try to breathe :) */
@ -400,22 +466,24 @@ void() player_prethink = {
local float damg; local float damg;
damg = (time - self.air_finished) * 0.2; damg = (time - self.air_finished) * 0.2;
if (damg > 1.5) damg = 1.5; if (damg > 1.5)
damg = 1.5;
self.noise3 = "player/drown1.wav"; self.noise3 = "player/drown1.wav";
self.noise4 = "player/drown2.wav"; self.noise4 = "player/drown2.wav";
_player_damage_custom(damg, _player_takedamage_drown, _deathmsg_player_liquid); _player_damage_custom (damg, _player_takedamage_drown,
_deathmsg_player_liquid);
} }
/* Enter/exit water, swim sound */ /* Enter/exit water, swim sound */
if (!self.waterlevel) { if (!self.waterlevel) {
if (self.flags & FL_INWATER) { if (self.flags & FL_INWATER) {
sound(self, CHAN_BODY, "misc/outwater.wav", 1, ATTN_NORM); sound (self, CHAN_BODY, "misc/outwater.wav", 1, ATTN_NORM);
self.flags = self.flags - FL_INWATER; self.flags &= ~FL_INWATER;
} }
if (_player_jump()) if (_player_jump())
sound(self, CHAN_BODY, "player/plyrjmp8.wav", 1, ATTN_NORM); sound (self, CHAN_BODY, "player/plyrjmp8.wav", 1, ATTN_NORM);
} else { } else {
if (!(self.flags & FL_INWATER)) { if (!(self.flags & FL_INWATER)) {
if (self.watertype == CONTENT_WATER) if (self.watertype == CONTENT_WATER)
@ -424,7 +492,7 @@ void() player_prethink = {
self.noise = "player/slimbrn2.wav"; self.noise = "player/slimbrn2.wav";
else if (self.watertype == CONTENT_LAVA) else if (self.watertype == CONTENT_LAVA)
self.noise = "player/inlava.wav"; self.noise = "player/inlava.wav";
sound(self, CHAN_BODY, self.noise, 1, ATTN_NORM); sound (self, CHAN_BODY, self.noise, 1, ATTN_NORM);
self.flags = (self.flags & ~FL_JUMPRELEASED) | FL_INWATER; self.flags = (self.flags & ~FL_JUMPRELEASED) | FL_INWATER;
@ -434,39 +502,44 @@ void() player_prethink = {
if (self.mdl_mod&MDL_MOD_SWIM) { if (self.mdl_mod&MDL_MOD_SWIM) {
local float increment, mxspeed; local float increment, mxspeed;
increment = vlen(self.origin - self.pos1); increment = vlen (self.origin - self.pos1);
mxspeed = calc_max_speed(self); mxspeed = calc_max_speed (self);
if (increment > mxspeed) if (increment > mxspeed)
increment = mxspeed; increment = mxspeed;
self.water_finished += increment; self.water_finished += increment;
if (self.water_finished >= mxspeed) { if (self.water_finished >= mxspeed) {
self.water_finished = 0; self.water_finished = 0;
if (random() < 0.5) self.noise = "misc/water1.wav"; if (random () < 0.5)
else self.noise = "misc/water2.wav"; self.noise = "misc/water1.wav";
sound(self, CHAN_BODY, self.noise, 1, ATTN_NORM); else
self.noise = "misc/water2.wav";
sound (self, CHAN_BODY, self.noise, 1, ATTN_NORM);
} }
} }
_player_water_jump(); _player_water_jump ();
} }
self.pos1 = self.origin; self.pos1 = self.origin;
#if DEBUG #if DEBUG
debug_impulse(); debug_impulse ();
#endif #endif
weapon_player_impulse(); weapon_player_impulse ();
}; };
/* This is not called every frame */ /* This is not called every frame */
void() player_think = { void ()
/* The player does not think. */ player_think =
{ // The player does not think.
}; };
/* FIXME: We should check to see if we actually collided. /* FIXME: We should check to see if we actually collided.
I don't know how to at the moment... */ I don't know how to at the moment... */
void() player_velocity_damage = { void ()
player_velocity_damage =
{
local vector vel, dir; local vector vel, dir;
local float v1, v2; local float v1, v2;
@ -478,45 +551,47 @@ void() player_velocity_damage = {
return; return;
/* Did we slow down a lot? */ /* Did we slow down a lot? */
v1 = vlen(vel); v1 = vlen (vel);
v2 = vlen(self.velocity); v2 = vlen (self.velocity);
if (v2 >= v1) if (v2 >= v1)
return; return;
vel = vel - self.velocity; vel = vel - self.velocity;
vel_z = vel_z * 2; vel_z = vel_z * 2;
v1 = vlen(vel); v1 = vlen (vel);
/* Find the largest magnitude dir */ /* Find the largest magnitude dir */
vel_x = fabs(vel_x); vel_x = fabs (vel_x);
vel_y = fabs(vel_y); vel_y = fabs (vel_y);
vel_z = fabs(vel_z); vel_z = fabs (vel_z);
dir = '0 0 1'; dir = '0 0 1';
if (vel_y > (vel*dir)) if (vel_y > (vel * dir))
dir = '0 1 0'; dir = '0 1 0';
if (vel_x > (vel*dir)) if (vel_x > (vel * dir))
dir = '1 0 0'; dir = '1 0 0';
/* Play sounds, apply damage */ /* Play sounds, apply damage */
if (v1 > CONFIG_LAND_SOUND) { if (v1 > CONFIG_LAND_SOUND) {
if (dir_z && self.watertype == CONTENT_WATER) { if (dir_z && (self.watertype == CONTENT_WATER)) {
self.noise = "player/h2ojump.wav"; self.noise = "player/h2ojump.wav";
} else if (v1 > CONFIG_LAND_HURT) { } else if (v1 > CONFIG_LAND_HURT) {
self.noise = "player/land2.wav"; self.noise = "player/land2.wav";
self.pain_finished = time + 1; self.pain_finished = time + 1;
damage(self, self, world, 5, _deathmsg_player_fall); damage (self, self, world, 5, _deathmsg_player_fall);
} else { } else {
self.noise = "player/land.wav"; self.noise = "player/land.wav";
} }
sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
} }
}; };
/* This is also called every frame... */ /* This is also called every frame... */
void() player_postthink = { void ()
player_velocity_damage(); player_postthink =
{
player_velocity_damage ();
self.items &= ~(IT_ARMOR1|IT_ARMOR2|IT_ARMOR3); self.items &= ~(IT_ARMOR1|IT_ARMOR2|IT_ARMOR3);
if (self.armortype >= 0.8) if (self.armortype >= 0.8)
@ -526,100 +601,119 @@ void() player_postthink = {
else if (self.armortype >= 0.3) else if (self.armortype >= 0.3)
self.items |= IT_ARMOR1; self.items |= IT_ARMOR1;
update_weapon_flags(); update_weapon_flags ();
weapon_set_ammo(); weapon_set_ammo ();
}; };
// ======================================================================== // ========================================================================
void(float nitem, string str1, string str2) _item_xprint_strs = { void (float nitem, string str1, string str2)
if (!is_cl(self)) _item_xprint_strs =
{
if (!is_cl (self))
return;
if (!str1)
return; return;
if (!str1) return;
if (nitem == 1) { if (nitem == 1) {
stuffcmd(self, "bf\n"); stuffcmd (self, "bf\n");
xprint_start(self, PRINT_LOW); xprint_start (self, PRINT_LOW);
xprint_str("You get "); xprint_str ("You get ");
} else if (nitem > 1) xprint_str(", "); } else if (nitem > 1)
xprint_str (", ");
xprint_str(str1); xprint_str (str1);
if (str2) xprint_str(str2); if (str2)
xprint_str (str2);
}; };
void(float nitem, string str1, string str2) _item_xprint_strs_last = { void (float nitem, string str1, string str2)
_item_xprint_strs_last =
{
if (!is_cl(self)) if (!is_cl(self))
return; return;
if (!str1)
if (!str1) return; return;
if (nitem == 1) { if (nitem == 1) {
stuffcmd(self, "bf\n"); stuffcmd (self, "bf\n");
xprint_start(self, PRINT_LOW); xprint_start (self, PRINT_LOW);
xprint_str("You get "); xprint_str ("You get ");
} }
if (nitem == 2) xprint_str(" and "); if (nitem == 2)
else if (nitem > 2) xprint_str(", and "); xprint_str (" and ");
else if (nitem > 2)
xprint_str (", and ");
xprint_str(str1); xprint_str (str1);
if (str2) xprint_str(str2); if (str2)
xprint_str (str2);
xprint_str("\n"); xprint_str ("\n");
}; };
float nitem; float nitem;
string str1, str2; string str1, str2;
void(.float fld, float max, string sing, string plur) _player_takefield = { void (.float fld, float max, string sing, string plur)
_player_takefield =
{
local float new, diff; local float new, diff;
new = increase_bound(self.fld, other.fld, max); new = increase_bound (self.fld, other.fld, max);
if (new > 999) new = 999; if (new > 999)
new = 999;
if (new > self.fld) { if (new > self.fld) {
diff = floor(new) - floor(self.fld); diff = floor (new) - floor (self.fld);
if (!diff) diff = new - self.fld; if (!diff)
diff = new - self.fld;
_item_xprint_strs(nitem, str1, str2); _item_xprint_strs (nitem, str1, str2);
str1 = ftos(diff); str1 = ftos (diff);
if (diff == 1) str2 = sing; if (diff == 1)
else str2 = plur; str2 = sing;
else
str2 = plur;
nitem++; nitem++;
self.fld = new; self.fld = new;
} }
}; };
float() player_takeitem = { float ()
player_takeitem =
{
local float eid; local float eid;
nitem = 0; nitem = 0;
str1 = NIL; str1 = NIL;
str2 = NIL; str2 = NIL;
while ((eid = equip_iter(other)) != -1) { while ((eid = equip_iter (other)) != -1) {
if (equip_query(self, eid)) if (equip_query (self, eid))
continue; continue;
equip_grant(self, eid); equip_grant (self, eid);
_item_xprint_strs(nitem, str1, str2); _item_xprint_strs (nitem, str1, str2);
str1 = "the "; str1 = "the ";
str2 = equip_id_to_string(eid); str2 = equip_id_to_string (eid);
nitem++; nitem++;
} }
_player_takefield(ammo_shells, self.max_ammo_shells, " shell", " shells"); _player_takefield (ammo_shells, self.max_ammo_shells, " shell", " shells");
_player_takefield(ammo_nails, self.max_ammo_nails, " nail", " nails"); _player_takefield (ammo_nails, self.max_ammo_nails, " nail", " nails");
_player_takefield(ammo_rockets, self.max_ammo_rockets, " rocket", " rockets"); _player_takefield (ammo_rockets, self.max_ammo_rockets, " rocket",
_player_takefield(ammo_cells, self.max_ammo_cells, " cell", " cells"); " rockets");
_player_takefield (ammo_cells, self.max_ammo_cells, " cell", " cells");
if (other.armorvalue <= self.max_armor) { if (other.armorvalue <= self.max_armor) {
if ((other.armorvalue*other.armortype) > (self.armorvalue*self.armortype)) { if ((other.armorvalue * other.armortype)
> (self.armorvalue * self.armortype)) {
self.armorvalue = other.armorvalue; self.armorvalue = other.armorvalue;
self.armortype = other.armortype; self.armortype = other.armortype;
_item_xprint_strs(nitem, str1, str2); _item_xprint_strs (nitem, str1, str2);
str2 = NIL; str2 = NIL;
if (self.armortype >= 0.8) if (self.armortype >= 0.8)
str1 = "strong armor"; str1 = "strong armor";
@ -633,18 +727,20 @@ float() player_takeitem = {
} }
} }
_player_takefield(health, self.max_health, " health", " health"); _player_takefield (health, self.max_health, " health", " health");
_item_xprint_strs_last(nitem, str1, str2); _item_xprint_strs_last (nitem, str1, str2);
if (nitem) return TRUE; if (nitem)
return TRUE;
return FALSE; return FALSE;
}; };
// ===================================================================== // // ===================================================================== //
void() act_setup_player = { void ()
act_setup(); act_setup_player ={
act_setup ();
self.movedir = '0 0 0'; self.movedir = '0 0 0';
@ -662,11 +758,11 @@ void() act_setup_player = {
self.pain_finished = 0; self.pain_finished = 0;
self.water_finished = 0; self.water_finished = 0;
override_set_th_takeitem(self, player_takeitem); override_set_th_takeitem (self, player_takeitem);
override_set_th_takedamage(self, player_takedamage); override_set_th_takedamage (self, player_takedamage);
override_set_prethink(self, player_prethink); override_set_prethink (self, player_prethink);
override_set_actthink(self, player_think); override_set_actthink (self, player_think);
override_set_postthink(self, player_postthink); override_set_postthink (self, player_postthink);
}; };

View file

@ -2,10 +2,8 @@
#define ACT_PLAYER_qh 1 #define ACT_PLAYER_qh 1
@extern { @extern {
void () act_player_init;
void() act_player_init; void () act_setup_player;
void() act_setup_player;
}; };
#endif #endif

View file

@ -15,7 +15,11 @@
/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4) /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
Used as a positional target for spotlights, etc. Used as a positional target for spotlights, etc.
*/ */
void() info_null = { remove(self); }; void ()
info_null =
{
remove (self);
};
// =============================================================== // ===============================================================
@ -26,9 +30,11 @@ Default style is 0
If targeted, it will toggle between on or off. If targeted, it will toggle between on or off.
Makes steady fluorescent humming sound Makes steady fluorescent humming sound
*/ */
void() light_fluoro = { void ()
light_fluoro =
{
self.noise = "ambience/fl_hum1.wav"; self.noise = "ambience/fl_hum1.wav";
light(); light ();
}; };
/*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8) /*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8)
@ -37,7 +43,9 @@ Default light value is 300
Default style is 10 Default style is 10
Makes sparking, broken fluorescent sound Makes sparking, broken fluorescent sound
*/ */
void() light_fluorospark = { void ()
light_fluorospark =
{
if (!self.style) if (!self.style)
self.style = 10; self.style = 10;
@ -50,7 +58,9 @@ Sphere globe light.
Default light value is 300 Default light value is 300
Default style is 0 Default style is 0
*/ */
void() light_globe = { void ()
light_globe =
{
self.model = "progs/s_light.spr"; self.model = "progs/s_light.spr";
light(); light();
}; };
@ -60,38 +70,46 @@ Short wall torch
Default light value is 200 Default light value is 200
Default style is 0 Default style is 0
*/ */
void() light_torch_small_walltorch = { void ()
light_torch_small_walltorch =
{
self.model = "progs/flame.mdl"; self.model = "progs/flame.mdl";
self.noise = "ambience/fire1.wav"; self.noise = "ambience/fire1.wav";
light(); light ();
}; };
/*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18) /*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
Large yellow flame ball Large yellow flame ball
*/ */
void() light_flame_large_yellow = { void ()
light_flame_large_yellow =
{
self.model = "progs/flame2.mdl"; self.model = "progs/flame2.mdl";
self.frame = 1; self.frame = 1;
self.noise = "ambience/fire1.wav"; self.noise = "ambience/fire1.wav";
light(); light ();
}; };
/*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF /*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
Small yellow flame ball Small yellow flame ball
*/ */
void() light_flame_small_yellow = { void ()
light_flame_small_yellow =
{
self.model = "progs/flame2.mdl"; self.model = "progs/flame2.mdl";
self.noise = "ambience/fire1.wav"; self.noise = "ambience/fire1.wav";
light(); light ();
}; };
/*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF /*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
Small white flame ball Small white flame ball
*/ */
void() light_flame_small_white = { void ()
light_flame_small_white =
{
self.model = "progs/flame2.mdl"; self.model = "progs/flame2.mdl";
self.noise = "ambience/fire1.wav"; self.noise = "ambience/fire1.wav";
light(); light ();
}; };
// ==================================================================== // ====================================================================
@ -99,7 +117,9 @@ void() light_flame_small_white = {
/*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64) /*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
Smaller exploding box, REGISTERED ONLY Smaller exploding box, REGISTERED ONLY
*/ */
void() misc_explobox2 = { void ()
misc_explobox2 =
{
self.model = "maps/b_exbox2.bsp"; self.model = "maps/b_exbox2.bsp";
self.noise = "weapons/r_exp3.wav"; self.noise = "weapons/r_exp3.wav";
self.dmg = 160; self.dmg = 160;
@ -109,80 +129,102 @@ void() misc_explobox2 = {
self.maxs = '32 32 32'; self.maxs = '32 32 32';
} }
misc_explobox(); misc_explobox ();
}; };
// ==================================================================== // ====================================================================
/*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_suck_wind = { void ()
ambient_suck_wind =
{
self.noise = "ambience/suck1.wav"; self.noise = "ambience/suck1.wav";
self.volume = 1.0; self.volume = 1.0;
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_drone = { void ()
ambient_drone =
{
self.noise = "ambience/drone6.wav"; self.noise = "ambience/drone6.wav";
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_flouro_buzz = { void ()
ambient_flouro_buzz =
{
self.noise = "ambience/buzz1.wav"; self.noise = "ambience/buzz1.wav";
self.volume = 1.0; self.volume = 1.0;
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_drip = { void ()
ambient_drip =
{
self.noise = "ambience/drip1.wav"; self.noise = "ambience/drip1.wav";
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_comp_hum = { void ()
ambient_comp_hum =
{
self.noise = "ambience/comp1.wav"; self.noise = "ambience/comp1.wav";
self.volume = 1.0; self.volume = 1.0;
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_thunder = { void ()
ambient_thunder =
{
self.noise = "ambience/thunder1.wav"; self.noise = "ambience/thunder1.wav";
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_light_buzz = { void ()
ambient_light_buzz =
{
self.noise = "ambience/fl_hum1.wav"; self.noise = "ambience/fl_hum1.wav";
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_swamp1 = { void ()
ambient_swamp1 =
{
self.noise = "ambience/swamp1.wav"; self.noise = "ambience/swamp1.wav";
info_notnull(); info_notnull ();
}; };
/*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) /*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
*/ */
void() ambient_swamp2 = { void ()
ambient_swamp2 =
{
self.noise = "ambience/swamp2.wav"; self.noise = "ambience/swamp2.wav";
info_notnull(); info_notnull ();
}; };
// =========================================================================== // ===========================================================================
void() path_corner = { info_notnull(); }; void ()
path_corner =
{
info_notnull ();
};
// =========================================================================== // ===========================================================================
@ -200,54 +242,71 @@ sounds
4) 4)
set "message" to text string set "message" to text string
*/ */
void() trigger_multiple = { void ()
if (self.sounds == 1) self.noise1 = "misc/secret.wav"; trigger_multiple =
else if (self.sounds == 2) self.noise1 = "misc/talk.wav"; {
else if (self.sounds == 3) self.noise1 = "misc/trigger1.wav"; switch (self.sounds) {
case 1:
self.noise1 = "misc/secret.wav";
break;
case 2:
self.noise1 = "misc/talk.wav";
break;
case 3:
self.noise1 = "misc/trigger1.wav";
break;
}
trigger_generic(); trigger_generic ();
if (!self.wait) self.wait = 0.2; if (!self.wait)
self.wait = 0.2;
self.count = 0; self.count = 0;
}; };
/*QUAKED trigger_once (.5 .5 .5) ? notouch /*QUAKED trigger_once (.5 .5 .5) ? notouch
*/ */
void() trigger_once = { void ()
trigger_multiple(); trigger_once =
{
trigger_multiple ();
self.count = 1; self.count = 1;
}; };
/*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) /*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8)
*/ */
void() trigger_relay = { void ()
trigger_relay =
{
self.spawnflags |= SPAWNFLAGS_TRIGGER_NOTOUCH; self.spawnflags |= SPAWNFLAGS_TRIGGER_NOTOUCH;
trigger_multiple(); trigger_multiple ();
}; };
#define SPAWNFLAGS_NOMESSAGE 1 #define SPAWNFLAGS_NOMESSAGE 1
void() _trigger_counter_use = { void ()
_trigger_counter_use =
{
local float doprint; local float doprint;
doprint = !(self.spawnflags & SPAWNFLAGS_NOMESSAGE) && is_cl(other); doprint = !(self.spawnflags & SPAWNFLAGS_NOMESSAGE) && is_cl (other);
self.count--; self.count--;
if (self.count <= 0) { if (self.count <= 0) {
if (doprint) centerprint(other, "Sequence completed!"); if (doprint) centerprint (other, "Sequence completed!");
self.count = self.max_health; self.count = self.max_health;
util_use_targets(); util_use_targets ();
} else { } else {
if (doprint) { if (doprint) {
if (self.count > 3) if (self.count > 3)
centerprint(other, "There are more to go..."); centerprint (other, "There are more to go...");
else if (self.count > 2) else if (self.count > 2)
centerprint(other, "Only 3 more to go..."); centerprint (other, "Only 3 more to go...");
else if (self.count > 1) else if (self.count > 1)
centerprint(other, "Only 2 more to go..."); centerprint (other, "Only 2 more to go...");
else else
centerprint(other, "Only 1 more to go..."); centerprint (other, "Only 1 more to go...");
} }
} }
}; };
@ -255,8 +314,10 @@ void() _trigger_counter_use = {
/*QUAKED trigger_counter (.5 .5 .5) ? SPAWNFLAGS_NOMESSAGE /*QUAKED trigger_counter (.5 .5 .5) ? SPAWNFLAGS_NOMESSAGE
Wait decrease count by 1 until it reaches 0, then activate targets. Wait decrease count by 1 until it reaches 0, then activate targets.
*/ */
void() trigger_counter = { void ()
util_map_entity_init(); trigger_counter =
{
util_map_entity_init ();
self.model = NIL; self.model = NIL;
self.modelindex = 0; self.modelindex = 0;
@ -272,12 +333,17 @@ void() trigger_counter = {
/*QUAKED trigger_secret (.5 .5 .5) ? /*QUAKED trigger_secret (.5 .5 .5) ?
*/ */
void() trigger_secret = { void ()
if (!self.message) self.message = "You found a secret area!"; trigger_secret =
if (!self.sounds) self.sounds = 1; {
if (self.sounds > 2) self.sounds = 0; if (!self.message)
self.message = "You found a secret area!";
if (!self.sounds)
self.sounds = 1;
if (self.sounds > 2)
self.sounds = 0;
trigger_multiple(); trigger_multiple ();
self.count = 1; self.count = 1;
}; };
@ -286,15 +352,21 @@ void() trigger_secret = {
sets skill level to the value of "message". sets skill level to the value of "message".
Only used on start map. Only used on start map.
*/ */
void() trigger_setskill = { remove(self); }; void ()
trigger_setskill =
{
remove (self);
};
/*QUAKED trigger_onlyregistered (.5 .5 .5) ? /*QUAKED trigger_onlyregistered (.5 .5 .5) ?
Only fires if playing the registered version, otherwise prints the message Only fires if playing the registered version, otherwise prints the message
*/ */
void() trigger_onlyregistered = { void ()
trigger_onlyregistered =
{
self.message = ""; self.message = "";
self.wait = -1; self.wait = -1;
trigger_generic(); trigger_generic ();
}; };
/*QUAKED trigger_monsterjump (.5 .5 .5) ? /*QUAKED trigger_monsterjump (.5 .5 .5) ?
@ -302,55 +374,66 @@ Walking monsters that touch this will jump in the direction of the trigger's ang
"speed" default to 200, the speed thrown forward "speed" default to 200, the speed thrown forward
"height" default to 200, the speed thrown upwards "height" default to 200, the speed thrown upwards
*/ */
void() trigger_monsterjump = { remove(self); }; void ()
trigger_monsterjump =
{
remove (self);
};
/*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4 /*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. This bmodel will appear if the episode has allready been completed, so players can't reenter it.
*/ */
void() func_episodegate = { void ()
func_episodegate =
{
if (!(serverflags & self.spawnflags)) { if (!(serverflags & self.spawnflags)) {
remove(self); remove (self);
return; return;
} }
func_wall(); func_wall ();
}; };
/*QUAKED func_bossgate (0 .5 .8) ? /*QUAKED func_bossgate (0 .5 .8) ?
This bmodel appears unless players have all of the episode sigils. This bmodel appears unless players have all of the episode sigils.
*/ */
void() func_bossgate = { void ()
func_bossgate =
{
if ((serverflags & 15) == 15) { if ((serverflags & 15) == 15) {
remove(self); remove (self);
return; return;
} }
func_wall(); func_wall ();
}; };
/* Monsters */ /* Monsters */
void() monster_boss = { remove(self); }; void () monster_boss = { remove(self); };
void() monster_demon1 = { remove(self); }; void () monster_demon1 = { remove(self); };
void() monster_dog = { remove(self); }; void () monster_dog = { remove(self); };
void() monster_enforcer = { remove(self); }; void () monster_enforcer = { remove(self); };
void() monster_fish = { remove(self); }; void () monster_fish = { remove(self); };
void() monster_hell_knight = { remove(self); }; void () monster_hell_knight = { remove(self); };
void() monster_knight = { remove(self); }; void () monster_knight = { remove(self); };
void() monster_ogre = { remove(self); }; void () monster_ogre = { remove(self); };
void() monster_ogre_marksman = { remove(self); }; void () monster_ogre_marksman = { remove(self); };
void() monster_oldone = { remove(self); }; void () monster_oldone = { remove(self); };
void() monster_shalrath = { remove(self); }; void () monster_shalrath = { remove(self); };
void() monster_shambler = { remove(self); }; void () monster_shambler = { remove(self); };
void() monster_army = { remove(self); }; void () monster_army = { remove(self); };
void() monster_tarbaby = { remove(self); }; void () monster_tarbaby = { remove(self); };
void() monster_wizard = { remove(self); }; void () monster_wizard = { remove(self); };
void() monster_zombie = { remove(self); }; void () monster_zombie = { remove(self); };
// ========================================================================= // =========================================================================
void() item_weapon = { void ()
if (!self.noise2) self.noise2 = "weapons/pkup.wav"; item_weapon =
{
if (!self.noise2)
self.noise2 = "weapons/pkup.wav";
if (!self.mins && !self.maxs) { if (!self.mins && !self.maxs) {
self.mins = '-16 -16 0'; self.mins = '-16 -16 0';
self.maxs = '16 16 56'; self.maxs = '16 16 56';
@ -359,67 +442,91 @@ void() item_weapon = {
self.wait = 25; self.wait = 25;
self.delay = 10; self.delay = 10;
} }
item_generic(); item_generic ();
}; };
/*QUAKED weapon_supershotgun (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED weapon_supershotgun (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() weapon_supershotgun = { void ()
weapon_supershotgun =
{
self.netname = STR_EQUIPID_SUPER_SHOTGUN; self.netname = STR_EQUIPID_SUPER_SHOTGUN;
if (!self.model) self.model = "progs/g_shot.mdl"; if (!self.model)
if (!self.ammo_shells) self.ammo_shells = 5; self.model = "progs/g_shot.mdl";
equip_grant(self, EQUIPID_SUPER_SHOTGUN); if (!self.ammo_shells)
item_weapon(); self.ammo_shells = 5;
equip_grant (self, EQUIPID_SUPER_SHOTGUN);
item_weapon ();
}; };
/*QUAKED weapon_nailgun (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED weapon_nailgun (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() weapon_nailgun = { void ()
weapon_nailgun =
{
self.netname = STR_EQUIPID_NAILGUN; self.netname = STR_EQUIPID_NAILGUN;
if (!self.model) self.model = "progs/g_nail.mdl"; if (!self.model)
if (!self.ammo_nails) self.ammo_nails = 30; self.model = "progs/g_nail.mdl";
equip_grant(self, EQUIPID_NAILGUN); if (!self.ammo_nails)
item_weapon(); self.ammo_nails = 30;
equip_grant (self, EQUIPID_NAILGUN);
item_weapon ();
}; };
/*QUAKED weapon_supernailgun (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED weapon_supernailgun (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() weapon_supernailgun = { void ()
weapon_supernailgun =
{
self.netname = STR_EQUIPID_SUPER_NAILGUN; self.netname = STR_EQUIPID_SUPER_NAILGUN;
if (!self.model) self.model = "progs/g_nail2.mdl"; if (!self.model)
if (!self.ammo_nails) self.ammo_nails = 30; self.model = "progs/g_nail2.mdl";
equip_grant(self, EQUIPID_SUPER_NAILGUN); if (!self.ammo_nails)
item_weapon(); self.ammo_nails = 30;
equip_grant (self, EQUIPID_SUPER_NAILGUN);
item_weapon ();
}; };
/*QUAKED weapon_grenadelauncher (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED weapon_grenadelauncher (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() weapon_grenadelauncher = { void ()
weapon_grenadelauncher =
{
self.netname = STR_EQUIPID_GRENADE_LAUNCHER; self.netname = STR_EQUIPID_GRENADE_LAUNCHER;
if (!self.model) self.model = "progs/g_rock.mdl"; if (!self.model)
if (!self.ammo_rockets) self.ammo_rockets = 5; self.model = "progs/g_rock.mdl";
equip_grant(self, EQUIPID_GRENADE_LAUNCHER); if (!self.ammo_rockets)
item_weapon(); self.ammo_rockets = 5;
equip_grant (self, EQUIPID_GRENADE_LAUNCHER);
item_weapon ();
}; };
/*QUAKED weapon_rocketlauncher (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED weapon_rocketlauncher (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() weapon_rocketlauncher = { void ()
weapon_rocketlauncher =
{
self.netname = STR_EQUIPID_ROCKET_LAUNCHER; self.netname = STR_EQUIPID_ROCKET_LAUNCHER;
if (!self.model) self.model = "progs/g_rock2.mdl"; if (!self.model)
if (!self.ammo_rockets) self.ammo_rockets = 5; self.model = "progs/g_rock2.mdl";
equip_grant(self, EQUIPID_ROCKET_LAUNCHER); if (!self.ammo_rockets)
item_weapon(); self.ammo_rockets = 5;
equip_grant (self, EQUIPID_ROCKET_LAUNCHER);
item_weapon ();
}; };
/*QUAKED weapon_lightning (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED weapon_lightning (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() weapon_lightning = { void ()
weapon_lightning =
{
self.netname = STR_EQUIPID_LIGHTNING_GUN; self.netname = STR_EQUIPID_LIGHTNING_GUN;
if (!self.model) self.model = "progs/g_light.mdl"; if (!self.model)
if (!self.ammo_cells) self.ammo_cells = 15; self.model = "progs/g_light.mdl";
equip_grant(self, EQUIPID_LIGHTNING_GUN); if (!self.ammo_cells)
item_weapon(); self.ammo_cells = 15;
equip_grant (self, EQUIPID_LIGHTNING_GUN);
item_weapon ();
}; };
// ======================================================================== // ========================================================================
@ -428,7 +535,9 @@ void() weapon_lightning = {
/*QUAKED item_shells (0 .5 .8) (0 0 0) (32 32 32) BIG /*QUAKED item_shells (0 .5 .8) (0 0 0) (32 32 32) BIG
*/ */
void() item_shells = { void ()
item_shells =
{
if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) { if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) {
self.model = "maps/b_shell1.bsp"; self.model = "maps/b_shell1.bsp";
self.ammo_shells = 40; self.ammo_shells = 40;
@ -436,12 +545,14 @@ void() item_shells = {
self.model = "maps/b_shell0.bsp"; self.model = "maps/b_shell0.bsp";
self.ammo_shells = 20; self.ammo_shells = 20;
} }
item_ammo(); item_ammo ();
}; };
/*QUAKED item_spikes (0 .5 .8) (0 0 0) (32 32 32) BIG /*QUAKED item_spikes (0 .5 .8) (0 0 0) (32 32 32) BIG
*/ */
void() item_spikes = { void ()
item_spikes =
{
if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) { if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) {
self.model = "maps/b_nail1.bsp"; self.model = "maps/b_nail1.bsp";
self.ammo_nails = 50; self.ammo_nails = 50;
@ -449,12 +560,14 @@ void() item_spikes = {
self.model = "maps/b_nail0.bsp"; self.model = "maps/b_nail0.bsp";
self.ammo_nails = 25; self.ammo_nails = 25;
} }
item_ammo(); item_ammo ();
}; };
/*QUAKED item_rockets (0 .5 .8) (0 0 0) (32 32 32) BIG /*QUAKED item_rockets (0 .5 .8) (0 0 0) (32 32 32) BIG
*/ */
void() item_rockets = { void ()
item_rockets =
{
if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) { if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) {
self.model = "maps/b_rock1.bsp"; self.model = "maps/b_rock1.bsp";
self.ammo_rockets = 10; self.ammo_rockets = 10;
@ -462,12 +575,14 @@ void() item_rockets = {
self.model = "maps/b_rock0.bsp"; self.model = "maps/b_rock0.bsp";
self.ammo_rockets = 5; self.ammo_rockets = 5;
} }
item_ammo(); item_ammo ();
}; };
/*QUAKED item_cells (0 .5 .8) (0 0 0) (32 32 32) BIG /*QUAKED item_cells (0 .5 .8) (0 0 0) (32 32 32) BIG
*/ */
void() item_cells = { void ()
item_cells =
{
if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) { if (self.spawnflags & SPAWNFLAGS_AMMO_BIG) {
self.model = "maps/b_batt1.bsp"; self.model = "maps/b_batt1.bsp";
self.ammo_cells = 12; self.ammo_cells = 12;
@ -475,7 +590,7 @@ void() item_cells = {
self.model = "maps/b_batt0.bsp"; self.model = "maps/b_batt0.bsp";
self.ammo_cells = 6; self.ammo_cells = 6;
} }
item_ammo(); item_ammo ();
}; };
@ -483,40 +598,48 @@ void() item_cells = {
/*QUAKED item_armor1 (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED item_armor1 (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() item_armor1 = { void ()
item_armor1 =
{
self.skin = 0; self.skin = 0;
self.armorvalue = 100; self.armorvalue = 100;
self.armortype = 0.3; self.armortype = 0.3;
item_armor(); item_armor ();
}; };
/*QUAKED item_armor2 (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED item_armor2 (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() item_armor2 = { void ()
item_armor2 =
{
self.skin = 1; self.skin = 1;
self.armorvalue = 150; self.armorvalue = 150;
self.armortype = 0.6; self.armortype = 0.6;
item_armor(); item_armor ();
}; };
/*QUAKED item_armorInv (0 .5 .8) (-16 -16 0) (16 16 32) /*QUAKED item_armorInv (0 .5 .8) (-16 -16 0) (16 16 32)
*/ */
void() item_armorInv = { void ()
item_armorInv =
{
self.skin = 2; self.skin = 2;
self.armorvalue = 200; self.armorvalue = 200;
self.armortype = 0.8; self.armortype = 0.8;
item_armor(); item_armor ();
}; };
// ======================================================================== // ========================================================================
/*QUAKED misc_teleporttrain (0 .5 .8) (-8 -8 -8) (8 8 8) /*QUAKED misc_teleporttrain (0 .5 .8) (-8 -8 -8) (8 8 8)
*/ */
void() misc_teleporttrain = { void ()
misc_teleporttrain =
{
self.model = "progs/teleport.mdl"; self.model = "progs/teleport.mdl";
self.dmg = -1; self.dmg = -1;
self.avelocity = '100 200 300'; self.avelocity = '100 200 300';
func_train(); func_train ();
}; };

View file

@ -395,7 +395,7 @@ void (string str)
xprint_str = xprint_str =
{ {
msg_entity = _xprint_client; msg_entity = _xprint_client;
WriteBytes (MSG_ONE, (float) SVC_PRINT, _xprint_level); WriteBytes (MSG_ONE, SVC_PRINT, _xprint_level);
WriteString (MSG_ONE, str); WriteString (MSG_ONE, str);
}; };

View file

@ -1,99 +1,99 @@
/* Builtin functions */ /* Builtin functions */
entity () BUILTIN_spawn = #14; entity() BUILTIN_spawn = #14;
void (entity e) remove = #15; void(entity e) remove = #15;
void (entity e, vector o) setorigin = #2; void(entity e, vector o) setorigin = #2;
void (entity e, string m) setmodel = #3; // set movetype and solid first void(entity e, string m) setmodel = #3; // set movetype and solid first
void (entity e, vector min, vector max) setsize = #4; void(entity e, vector min, vector max) setsize = #4;
string (string s) precache_sound = #19; string(string s) precache_sound = #19;
string (string s) precache_model = #20; string(string s) precache_model = #20;
string (string s) precache_file = #68; // no effect except for -copy string(string s) precache_file = #68; // no effect except for -copy
string (string s) precache_sound2 = #76; // registered version only string(string s) precache_sound2 = #76; // registered version only
string (string s) precache_model2 = #75; // registered version only string(string s) precache_model2 = #75; // registered version only
string (string s) precache_file2 = #77; // registered version only string(string s) precache_file2 = #77; // registered version only
void (float style, string value) lightstyle = #35; void (float style, string value) lightstyle = #35;
// debug functions // debug functions
void () BUILTIN_break = #6; // shatter progs void() BUILTIN_break = #6; // shatter progs
void (string e, ...) error = #10; void(string e, ...) error = #10;
void (string e, ...) objerror = #11; void(string e, ...) objerror = #11;
void () coredump = #28; // prints all edicts void() coredump = #28; // prints all edicts
void () traceon = #29; // turns statment trace on void() traceon = #29; // turns statment trace on
void () traceoff = #30; void() traceoff = #30;
void (entity e, float chan, string samp, float vol, float atten) sound = #8; void(entity e, float chan, string samp, float vol, float atten) sound = #8;
void (vector ang) makevectors = #1; // sets v_forward, etc globals void(vector ang) makevectors = #1; // sets v_forward, etc globals
vector (vector v) normalize = #9; vector(vector v) normalize = #9;
float (vector v) vlen = #12; float(vector v) vlen = #12;
float (vector v) vectoyaw = #13; float(vector v) vectoyaw = #13;
vector (vector v) vectoangles = #51; vector(vector v) vectoangles = #51;
vector (entity e, float speed) aim = #44; // returns the shooting vector vector(entity e, float speed) aim = #44; // returns the shooting vector
float () random = #7; // returns 0 - 1 float() random = #7; // returns 0 - 1
string (float f) ftos = #26; string(float f) ftos = #26;
float (string s) stof = #81; // convert string to float float(string s) stof = #81; // convert string to float
string (vector v) vtos = #27; string(vector v) vtos = #27;
float (float v) rint = #36; // round to nearest int float(float v) rint = #36; // round to nearest int
float (float v) floor = #37; // largest integer <= v float(float v) floor = #37; // largest integer <= v
float (float v) ceil = #38; // smallest integer >= v float(float v) ceil = #38; // smallest integer >= v
float (float f) fabs = #43; float(float f) fabs = #43;
// sets trace_* globals // sets trace_* globals
// nomonsters can be: // nomonsters can be:
// An entity will also be ignored for testing if forent == test, // An entity will also be ignored for testing if forent == test,
// forent->owner == test, or test->owner == forent // forent->owner == test, or test->owner == forent
// a forent of world is ignored // a forent of world is ignored
void (vector v1, vector v2, float nomonsters, entity forent) traceline = #16; void(vector v1, vector v2, float nomonsters, entity forent) traceline = #16;
float (vector v) pointcontents = #41; // returns a CONTENT_* float(vector v) pointcontents = #41; // returns a CONTENT_*
float (entity e) checkbottom = #40; // true if self is on ground float(entity e) checkbottom = #40; // true if self is on ground
float () droptofloor = #34; // TRUE if landed on floor float() droptofloor = #34; // TRUE if landed on floor
float (float yaw, float dist) walkmove = #32; // returns TRUE or FALSE float(float yaw, float dist) walkmove = #32; // returns TRUE or FALSE
void (float step) movetogoal = #67; void(float step) movetogoal = #67;
entity () checkclient = #17; // returns a client to look for entity() checkclient = #17; // returns a client to look for
entity (entity start, .string fld, string match) find = #18; entity(entity start, .string fld, string match) find = #18;
entity (vector org, float rad) findradius = #22; entity(vector org, float rad) findradius = #22;
entity (entity e) nextent = #47; // for looping through all ents entity(entity e) nextent = #47; // for looping through all ents
void (float level, string s, ...) bprint = #23; void(float level, string s, ...) bprint = #23;
void (entity client, float level, string s, ...) sprint = #24; void(entity client, float level, string s, ...) sprint = #24;
void (entity client, string s, ...) centerprint = #73; // sprint, but centered void(entity client, string s, ...) centerprint = #73; // sprint, but centered
void (string s, ...) dprint = #25; void(string s, ...) dprint = #25;
void (entity e) eprint = #31; // prints an entire edict void(entity e) eprint = #31; // prints an entire edict
float (string s) cvar = #45; // return cvar.value float(string s) cvar = #45; // return cvar.value
void (string var, string val) cvar_set = #72; // sets cvar.value void(string var, string val) cvar_set = #72; // sets cvar.value
string (entity e, string key) infokey = #80; // get a key value (world = serverinfo) string(entity e, string key) infokey = #80; // get a key value (world = serverinfo)
void (string s1, ...) localcmd = #46; // put string into local que void(string s1, ...) localcmd = #46; // put string into local que
void (entity client, string s) stuffcmd = #21; void(entity client, string s) stuffcmd = #21;
void () ChangeYaw = #49; // turn towards self.ideal_yaw void() ChangeYaw = #49; // turn towards self.ideal_yaw
// at self.yaw_speed // at self.yaw_speed
// direct client message generation // direct client message generation
void (float to, vector v) WriteAngleV = #0; void(float to, vector v) WriteAngleV = #0;
void (float to, vector v) WriteCoordV = #0; void(float to, vector v) WriteCoordV = #0;
void (float to, ...) WriteBytes = #0; void(float to, ...) WriteBytes = #0;
void (float to, float f) WriteByte = #52; void(float to, float f) WriteByte = #52;
void (float to, float f) WriteChar = #53; void(float to, float f) WriteChar = #53;
void (float to, float f) WriteShort = #54; void(float to, float f) WriteShort = #54;
void (float to, float f) WriteLong = #55; void(float to, float f) WriteLong = #55;
void (float to, float f) WriteCoord = #56; void(float to, float f) WriteCoord = #56;
void (float to, float f) WriteAngle = #57; void(float to, float f) WriteAngle = #57;
void (float to, string s) WriteString = #58; void(float to, string s) WriteString = #58;
void (float to, entity s) WriteEntity = #59; void(float to, entity s) WriteEntity = #59;
void (vector where, float set) multicast = #82; // sends the temp message to a set void(vector where, float set) multicast = #82; // sends the temp message to a set
void (entity e) BUILTIN_makestatic = #69; void(entity e) BUILTIN_makestatic = #69;
void (string s) changelevel = #70; void(string s) changelevel = #70;
void (vector pos, string samp, float vol, float atten) BUILTIN_ambientsound = #74; void(vector pos, string samp, float vol, float atten) BUILTIN_ambientsound = #74;
void (entity e) setspawnparms = #78; // set parm1... to the void(entity e) setspawnparms = #78; // set parm1... to the
// values at level start // values at level start
// for coop respawn // for coop respawn
void (entity killer, entity killee) logfrag = #79; // add to stats void(entity killer, entity killee) logfrag = #79; // add to stats

View file

@ -5,92 +5,93 @@
#include "misc.qh" #include "misc.qh"
void() effect_muzzleflash = { void ()
WriteByte(MSG_MULTICAST, SVC_MUZZLEFLASH); effect_muzzleflash =
WriteEntity(MSG_MULTICAST, self); {
multicast(self.origin, MULTICAST_PVS); WriteByte (MSG_MULTICAST, SVC_MUZZLEFLASH);
WriteEntity (MSG_MULTICAST, self);
multicast (self.origin, MULTICAST_PVS);
}; };
void(entity e) effect_smallkick = { void (entity e)
effect_smallkick =
{
if (!is_cl(e)) if (!is_cl(e))
return; return;
msg_entity = e; msg_entity = e;
WriteByte(MSG_ONE, SVC_SMALLKICK); WriteByte (MSG_ONE, SVC_SMALLKICK);
}; };
void(vector org, vector dir, float d) effect_blood = { void (vector org, vector dir, float d)
effect_blood =
{
d = d / 5; d = d / 5;
if (d < 3) d = 3; if (d < 3)
if (d > 255) d = 255; d = 3;
if (d > 255)
d = 255;
WriteByte(MSG_MULTICAST, SVC_TEMPENTITY); WriteBytes (MSG_MULTICAST, SVC_TEMPENTITY, TE_BLOOD, d);
WriteByte(MSG_MULTICAST, TE_BLOOD); WriteCoordV (MSG_MULTICAST, org);
WriteByte(MSG_MULTICAST, d); multicast (org, MULTICAST_PVS);
WriteCoord(MSG_MULTICAST, org_x);
WriteCoord(MSG_MULTICAST, org_y);
WriteCoord(MSG_MULTICAST, org_z);
multicast(org, MULTICAST_PVS);
}; };
void(vector org, vector vel, float d) effect_gun_spark = { void (vector org, vector vel, float d)
WriteByte(MSG_MULTICAST, SVC_TEMPENTITY); effect_gun_spark =
WriteByte(MSG_MULTICAST, TE_GUNSHOT); {
WriteByte(MSG_MULTICAST, d); WriteBytes (MSG_MULTICAST, SVC_TEMPENTITY, TE_GUNSHOT, d);
WriteCoord(MSG_MULTICAST, org_x); WriteCoordV (MSG_MULTICAST, org);
WriteCoord(MSG_MULTICAST, org_y); multicast (org, MULTICAST_PVS);
WriteCoord(MSG_MULTICAST, org_z);
multicast(org, MULTICAST_PVS);
}; };
void(vector org, vector vel) effect_nail_spark = { void (vector org, vector vel)
WriteByte(MSG_MULTICAST, SVC_TEMPENTITY); effect_nail_spark =
WriteByte(MSG_MULTICAST, TE_SPIKE); {
WriteCoord(MSG_MULTICAST, org_x); WriteBytes (MSG_MULTICAST, SVC_TEMPENTITY, TE_SPIKE);
WriteCoord(MSG_MULTICAST, org_y); WriteCoordV (MSG_MULTICAST, org);
WriteCoord(MSG_MULTICAST, org_z); multicast (org, MULTICAST_PHS);
multicast(org, MULTICAST_PHS);
}; };
void(vector org) effect_explosion = { void (vector org)
WriteByte(MSG_MULTICAST, SVC_TEMPENTITY); effect_explosion =
WriteByte(MSG_MULTICAST, TE_EXPLOSION); {
WriteCoord(MSG_MULTICAST, org_x); WriteBytes (MSG_MULTICAST, SVC_TEMPENTITY, TE_EXPLOSION);
WriteCoord(MSG_MULTICAST, org_y); WriteCoordV (MSG_MULTICAST, org);
WriteCoord(MSG_MULTICAST, org_z); multicast (org, MULTICAST_PHS);
multicast(org, MULTICAST_PHS);
}; };
void(vector org) effect_teleport_fog = { void (vector org)
effect_teleport_fog =
{
local float r; local float r;
local string snd; local string snd;
r = random() * 5; r = random () * 5;
if (r < 1) snd = "misc/r_tele1.wav"; if (r < 1)
else if (r < 2) snd = "misc/r_tele2.wav"; snd = "misc/r_tele1.wav";
else if (r < 3) snd = "misc/r_tele3.wav"; else if (r < 2)
else if (r < 4) snd = "misc/r_tele4.wav"; snd = "misc/r_tele2.wav";
else snd = "misc/r_tele5.wav"; else if (r < 3)
snd = "misc/r_tele3.wav";
else if (r < 4)
snd = "misc/r_tele4.wav";
else
snd = "misc/r_tele5.wav";
WriteByte(MSG_MULTICAST, SVC_TEMPENTITY); WriteBytes (MSG_MULTICAST, SVC_TEMPENTITY, TE_TELEPORT);
WriteByte(MSG_MULTICAST, TE_TELEPORT); WriteCoordV (MSG_MULTICAST, org);
WriteCoord(MSG_MULTICAST, org_x); multicast (org, MULTICAST_PHS);
WriteCoord(MSG_MULTICAST, org_y);
WriteCoord(MSG_MULTICAST, org_z);
multicast(org, MULTICAST_PHS);
sound_vector(org, snd, 1, ATTN_NORM); sound_vector (org, snd, 1, ATTN_NORM);
}; };
void(entity from, vector p1, vector p2) effect_lightning2 = { void (entity from, vector p1, vector p2)
WriteByte(MSG_MULTICAST, SVC_TEMPENTITY); effect_lightning2 =
WriteByte(MSG_MULTICAST, TE_LIGHTNING2); {
WriteEntity(MSG_MULTICAST, from); WriteBytes (MSG_MULTICAST, SVC_TEMPENTITY, TE_LIGHTNING2);
WriteCoord(MSG_MULTICAST, p1_x); WriteEntity (MSG_MULTICAST, from);
WriteCoord(MSG_MULTICAST, p1_y); WriteCoordV (MSG_MULTICAST, p1);
WriteCoord(MSG_MULTICAST, p1_z); WriteCoordV (MSG_MULTICAST, p2);
WriteCoord(MSG_MULTICAST, p2_x); multicast (p1, MULTICAST_PHS);
WriteCoord(MSG_MULTICAST, p2_y);
WriteCoord(MSG_MULTICAST, p2_z);
multicast(p1, MULTICAST_PHS);
}; };

View file

@ -2,39 +2,39 @@
#define QW_PROTOCOL_qh 1 #define QW_PROTOCOL_qh 1
// protocol bytes // protocol bytes
#define SVC_PRINT 8 #define SVC_PRINT 8.0
#define SVC_UPDATEFRAGS 14 #define SVC_UPDATEFRAGS 14.0
#define SVC_MAKESTATIC 20 #define SVC_MAKESTATIC 20.0
#define SVC_TEMPENTITY 23 #define SVC_TEMPENTITY 23.0
#define SVC_CENTERPRINT 26 #define SVC_CENTERPRINT 26.0
#define SVC_KILLEDMONSTER 27 #define SVC_KILLEDMONSTER 27.0
#define SVC_FOUNDSECRET 28 #define SVC_FOUNDSECRET 28.0
#define SVC_INTERMISSION 30 #define SVC_INTERMISSION 30.0
#define SVC_FINALE 31 #define SVC_FINALE 31.0
#define SVC_CDTRACK 32 #define SVC_CDTRACK 32.0
#define SVC_SELLSCREEN 33 #define SVC_SELLSCREEN 33.0
#define SVC_SMALLKICK 34 #define SVC_SMALLKICK 34.0
#define SVC_BIGKICK 35 #define SVC_BIGKICK 35.0
#define SVC_UPDATEPING 36 #define SVC_UPDATEPING 36.0
#define SVC_UPDATEENTERTIME 37 #define SVC_UPDATEENTERTIME 37.0
#define SVC_MUZZLEFLASH 39 #define SVC_MUZZLEFLASH 39.0
#define SVC_UPDATEUSERINFO 40 #define SVC_UPDATEUSERINFO 40.0
#define SVC_UPDATEPL 53 #define SVC_UPDATEPL 53.0
// temp entities // temp entities
#define TE_SPIKE 0 #define TE_SPIKE 0.0
#define TE_SUPERSPIKE 1 #define TE_SUPERSPIKE 1.0
#define TE_GUNSHOT 2 #define TE_GUNSHOT 2.0
#define TE_EXPLOSION 3 #define TE_EXPLOSION 3.0
#define TE_TAREXPLOSION 4 #define TE_TAREXPLOSION 4.0
#define TE_LIGHTNING1 5 #define TE_LIGHTNING1 5.0
#define TE_LIGHTNING2 6 #define TE_LIGHTNING2 6.0
#define TE_WIZSPIKE 7 #define TE_WIZSPIKE 7.0
#define TE_KNIGHTSPIKE 8 #define TE_KNIGHTSPIKE 8.0
#define TE_LIGHTNING3 9 #define TE_LIGHTNING3 9.0
#define TE_LAVASPLASH 10 #define TE_LAVASPLASH 10.0
#define TE_TELEPORT 11 #define TE_TELEPORT 11.0
#define TE_BLOOD 12 #define TE_BLOOD 12.0
#define TE_LIGHTNINGBLOOD 13 #define TE_LIGHTNINGBLOOD 13.0
#endif #endif

View file

@ -62,25 +62,22 @@ entity msg_entity; // destination of single entity writes
#ifndef QW_SYSTEM_qh #ifndef QW_SYSTEM_qh
@system { @system {
#endif #endif
void() main; // only for testing void () main; // only for testing
void() StartFrame; void () StartFrame;
void() PlayerPreThink; void () PlayerPreThink;
void() PlayerPostThink; void () PlayerPostThink;
void() ClientKill; void () ClientKill;
void() ClientConnect; void () ClientConnect;
void() PutClientInServer; // call after setting the parm1... parms void () PutClientInServer; // call after setting the parm1... parms
void() ClientDisconnect; void () ClientDisconnect;
void() SetNewParms; // called when a client first connects to
// a server. sets parms so they can be
// saved off for restarts
void() SetChangeParms; // call to set parms for self so they can
// be saved for a level transition
void () SetNewParms; // called when a client first connects to a server.
// sets parms so they can be saved off for restarts
void () SetChangeParms; // call to set parms for self so they can
// be saved for a level transition
void end_sys_globals; // flag for structure dumping void end_sys_globals; // flag for structure dumping
#ifndef QW_SYSTEM_qh #ifndef QW_SYSTEM_qh
@ -88,8 +85,8 @@ void end_sys_globals; // flag for structure dumping
#endif #endif
/* End of system globals */ /* End of system globals */
// ========================================================================== // // ========================================================================= //
// ========================================================================== // // ========================================================================= //
/* Do not change. These are the system fields required by C code */ /* Do not change. These are the system fields required by C code */
/* (*** = do not set in prog code, maintained by C code) */ /* (*** = do not set in prog code, maintained by C code) */
@ -117,16 +114,15 @@ void end_sys_globals; // flag for structure dumping
.vector mins, maxs; // bounding box extents reletive to origin .vector mins, maxs; // bounding box extents reletive to origin
.vector size; // *** maxs - mins, use setsize .vector size; // *** maxs - mins, use setsize
.void() touch; .void () touch;
.void() use; .void () use;
.void() think; .void () think;
.void() blocked; // for doors or plats, called when can't push other .void () blocked; // for doors or plats, called when can't push other
.float nextthink; .float nextthink;
.entity groundentity; .entity groundentity;
// stats // stats
.float health; .float health;
.float frags; .float frags;
@ -144,7 +140,6 @@ void end_sys_globals; // flag for structure dumping
.vector view_ofs; // add to origin to get eye point .vector view_ofs; // add to origin to get eye point
.float button0; // fire .float button0; // fire
.float button1; // use .float button1; // use
.float button2; // jump .float button2; // jump
@ -203,5 +198,5 @@ void end_sys_globals; // flag for structure dumping
void end_sys_fields; // flag for structure dumping void end_sys_fields; // flag for structure dumping
/* End of system fields */ /* End of system fields */
// ========================================================================== // // ========================================================================= //
// ========================================================================== // // ========================================================================= //

View file

@ -21,11 +21,10 @@ float sv_spawning;
#define SV_SIGNON_BUFFERS 8 #define SV_SIGNON_BUFFERS 8
#define SV_SIGNON_BUFFER_SWAP 512 #define SV_SIGNON_BUFFER_SWAP 512
// QF == 1, twilight/stock == 0 #define SV_FLUSHSIGNON_BREAKS 1 // QF == 1, twilight/stock == 0
#define SV_FLUSHSIGNON_BREAKS 1
#define SV_MAX_DATAGRAM 1450 #define SV_MAX_DATAGRAM 1450
#define SV_FRAME_OVERHEAD 725 /* Wild guess. */ #define SV_FRAME_OVERHEAD 725 // Wild guess.
#define SIZEOF_BASELINE 22 #define SIZEOF_BASELINE 22
#define SIZEOF_AMBIENTSOUND 16 #define SIZEOF_AMBIENTSOUND 16
@ -39,7 +38,9 @@ float sv_frame_remaining;
// ================= // =================
float(float space) SZ_GetSpace_frame = { float (float space)
SZ_GetSpace_frame =
{
if (sv_frame_remaining < space) if (sv_frame_remaining < space)
return FALSE; return FALSE;
@ -48,7 +49,10 @@ float(float space) SZ_GetSpace_frame = {
}; };
entity SZ_self; entity SZ_self;
float(float space) SZ_GetSpace_signon = {
float (float space)
SZ_GetSpace_signon =
{
if (sv_spawning || !SV_FLUSHSIGNON_BREAKS) { if (sv_spawning || !SV_FLUSHSIGNON_BREAKS) {
if (self != SZ_self) { if (self != SZ_self) {
SZ_self = self; SZ_self = self;
@ -72,66 +76,62 @@ float(float space) SZ_GetSpace_signon = {
// ================= // =================
void() SZ_init = { void ()
SZ_init =
{
sv_signon_buf_remaining = SV_SIGNON_BUFFERS; sv_signon_buf_remaining = SV_SIGNON_BUFFERS;
sv_signon_remaining = SV_MAX_DATAGRAM; sv_signon_remaining = SV_MAX_DATAGRAM;
while ((self = nextent(self))) while ((self = nextent (self)))
SZ_GetSpace_signon(SIZEOF_BASELINE); SZ_GetSpace_signon (SIZEOF_BASELINE);
self = world; self = world;
}; };
void() SZ_frame = { void ()
SZ_frame =
{
sv_frame_remaining = SV_MAX_DATAGRAM - SV_FRAME_OVERHEAD; sv_frame_remaining = SV_MAX_DATAGRAM - SV_FRAME_OVERHEAD;
}; };
// ================= // =================
void(entity e) makestatic = { void (entity e)
makestatic =
{
e.solid = SOLID_NOT; e.solid = SOLID_NOT;
e.movetype = MOVETYPE_NONE; e.movetype = MOVETYPE_NONE;
e.velocity = '0 0 0'; e.velocity = '0 0 0';
e.avelocity = '0 0 0'; e.avelocity = '0 0 0';
e.nextthink = -1; e.nextthink = -1;
/* No more space? Just let it be... */ // No more space? Just let it be...
if (!SZ_GetSpace_signon(SIZEOF_MAKESTATIC)) if (!SZ_GetSpace_signon (SIZEOF_MAKESTATIC))
return; return;
if (!sv_spawning) { if (!sv_spawning) {
if (!SZ_GetSpace_frame(SIZEOF_MAKESTATIC)) { if (!SZ_GetSpace_frame (SIZEOF_MAKESTATIC)) {
self.think = SUB_makestatic; self.think = SUB_makestatic;
self.nextthink = time + sv_mintic; self.nextthink = time + sv_mintic;
return; return;
} }
WriteByte(MSG_ALL, SVC_MAKESTATIC); WriteBytes (MSG_ALL, SVC_MAKESTATIC, e.modelindex, e.frame,
e.colormap, e.skin);
WriteByte(MSG_ALL, e.modelindex); WriteCoordV (MSG_ALL, e.origin);
WriteAngleV (MSG_ALL, e.angles);
WriteByte(MSG_ALL, e.frame);
WriteByte(MSG_ALL, e.colormap);
WriteByte(MSG_ALL, e.skin);
WriteCoord(MSG_ALL, e.origin_x);
WriteCoord(MSG_ALL, e.origin_y);
WriteCoord(MSG_ALL, e.origin_z);
WriteAngle(MSG_ALL, e.angles_x);
WriteAngle(MSG_ALL, e.angles_y);
WriteAngle(MSG_ALL, e.angles_z);
} }
BUILTIN_makestatic(e); BUILTIN_makestatic (e);
}; };
void(vector pos, string samp, float vol, float atten) ambientsound = { void (vector pos, string samp, float vol, float atten)
ambientsound =
{
if (!sv_spawning) if (!sv_spawning)
error("ambientsound after spawn functions\n"); error ("ambientsound after spawn functions\n");
SZ_GetSpace_signon(SIZEOF_AMBIENTSOUND); SZ_GetSpace_signon (SIZEOF_AMBIENTSOUND);
/* Do it anyway */ // Do it anyway
BUILTIN_ambientsound(pos, samp, vol, atten); BUILTIN_ambientsound (pos, samp, vol, atten);
}; };

View file

@ -2,15 +2,13 @@
#define SZ_WATCH_qh 1 #define SZ_WATCH_qh 1
@extern { @extern {
float sv_spawning;
float sv_spawning; void () SZ_init;
void () SZ_frame;
void() SZ_init;
void() SZ_frame;
void(entity e) makestatic;
void(vector pos, string samp, float vol, float atten) ambientsound;
void (entity e) makestatic;
void (vector pos, string samp, float vol, float atten) ambientsound;
}; };
#endif #endif