Git Repos / fte_dogmode / commit af8bb75
Commit: af8bb75e3540dfb8605969ad0f163071245f8bab
Parent: 35274130796675826bed4e6886dd3ace90e2933c
Author: Cameron Vanderzanden, 2025-08-13 05:20
Committer: Cameron Vanderzanden, 2025-08-13 05:20
Commit Message
Another big commit. Item changes, field rework, etc. Once again I do not fully remember everything I've changed. I've reworked (and removed) a bunch of fields. In that process some progs_dump 3 features have been removed; some may be reimplemented. I'll document what's been removed eventually. (It's mostly things like custom models and sounds based on entity fields). Items, gibs, debris, and etc. have been again reworked. Some entities now use the .item[] fields to drop things when destroyed. Gibs and debris have been unified as 'throwables' (a feature inspired by imsims, particularly Deus Ex HR and MD). Sounds have also been somewhat reworked. Definitions are now stored in a big struct and can be passed around that way. Handy for simplifying calls to sound(). (This isn't consistent across the entire program as sounds are often specified in .noise fields). Movement prediction still does not work correctly when interacting with certain types of entity (notably monsters and moving brush funcs). Clientside func interpolation has been improved a bit and should now appear a bit less stuttery. There are *a lot* of other changes. Some things fixed and undoubtedly some new bugs introducted.
Change List
Diff autoexec.cfg
diff --git a/autoexec.cfg b/autoexec.cfg
index caee44a..afb1f40 100644
--- a/autoexec.cfg
+++ b/autoexec.cfg
@@ -6,9 +6,6 @@ seta cl_rollangle 0.5
seta cl_rollspeed 200
//
seta cl_run 0
-seta cl_forwardspeed 320
-seta cl_sidespeed 320
-seta cl_backspeed 320
// enable air stepping
seta pm_airstep 1
// enable wall jumps
@@ -20,4 +17,6 @@ seta sv_savefmt 1
//
seta sv_gameplayfix_setmodelrealbox 1
//
+seta sv_sound_watersplash ""
+//
seta v_gunkick 1
Return to the top of this page or return to the overview of this repo.
Diff qc/Makefile
diff --git a/qc/Makefile b/qc/Makefile
index bfbb90f..d77f642 100644
--- a/qc/Makefile
+++ b/qc/Makefile
@@ -1,5 +1,5 @@
CC=fteqcc64
-CCOPTS=-Wall -O3
+CCOPTS=-Wall -O2 -Fembedsrc
client:
$(CC) $(CCOPTS) cl_progs.src
Return to the top of this page or return to the overview of this repo.
Diff qc/base_entities.qc
diff --git a/qc/base_entities.qc b/qc/base_entities.qc
index 7930eeb..0ff8183 100644
--- a/qc/base_entities.qc
+++ b/qc/base_entities.qc
@@ -37,17 +37,17 @@ typedef enumflags
NETFLAG_BASE_ENTITY_ORIGIN_Y,
NETFLAG_BASE_ENTITY_ORIGIN_Z,
NETFLAG_BASE_ENTITY_ANGLES_Y, // .angles_y has changed
- NETFLAG_BASE_ENTITY_RESERVED1, // reserved
+ NETFLAG_BASE_ENTITY_VELOCITY, // .velocity has changed
NETFLAG_BASE_ENTITY_FRAME, // .frame has changed
NETFLAG_BASE_ENTITY_SKIN, // .skin has changed
// second byte of netflags
NETFLAG_BASE_ENTITY_ANGLES_X, // .angles_x has changed
NETFLAG_BASE_ENTITY_ANGLES_Z, // .angles_z has changed
NETFLAG_BASE_ENTITY_MODEL, // model has changed
- NETFLAG_BASE_ENTITY_SIZE, // .mins and/or .maxs have changed
+ NETFLAG_BASE_ENTITY_RESERVED2, // reserved
NETFLAG_BASE_ENTITY_SOLID, // .solid and/or .movetype
NETFLAG_BASE_ENTITY_WEAPON, // .weapon has changed
- NETFLAG_BASE_ENTITY_RESERVED2, // reserved
+ NETFLAG_BASE_ENTITY_RESERVED3, // reserved
NETFLAG_BASE_ENTITY_ALPHA // .alpha has changed
} base_entity_netflags;
@@ -66,22 +66,30 @@ const float NETFLAG_BASE_ENTITY_ORIGIN = NETFLAG_BASE_ENTITY_ORIGIN_X |
const float NETFLAG_BASE_ENTITY_FULLSEND = NETFLAG_BASE_ENTITY_EXTRA1 |
NETFLAG_BASE_ENTITY_ORIGIN_X | NETFLAG_BASE_ENTITY_ORIGIN_Y |
NETFLAG_BASE_ENTITY_ORIGIN_Z | NETFLAG_BASE_ENTITY_ANGLES_Y |
- NETFLAG_BASE_ENTITY_RESERVED1 | NETFLAG_BASE_ENTITY_FRAME |
+ NETFLAG_BASE_ENTITY_VELOCITY | NETFLAG_BASE_ENTITY_FRAME |
NETFLAG_BASE_ENTITY_SKIN |
NETFLAG_BASE_ENTITY_ANGLES_X | NETFLAG_BASE_ENTITY_ANGLES_Z |
- NETFLAG_BASE_ENTITY_MODEL | NETFLAG_BASE_ENTITY_SIZE |
+ NETFLAG_BASE_ENTITY_MODEL | NETFLAG_BASE_ENTITY_RESERVED2 |
NETFLAG_BASE_ENTITY_SOLID | NETFLAG_BASE_ENTITY_WEAPON |
- NETFLAG_BASE_ENTITY_RESERVED2 | NETFLAG_BASE_ENTITY_ALPHA;
+ NETFLAG_BASE_ENTITY_RESERVED3 | NETFLAG_BASE_ENTITY_ALPHA;
#endif
#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
-typedef enum
+typedef enumflags
{
- STATE_ACTIVE = 0, // .estate field values
- STATE_INACTIVE = 1,
- STATE_INVISIBLE = 8
-} base_entity_estates;
+ STATE_INACTIVE = 1<<0, // .estate replacement -- CEV
+ STATE_INVISIBLE, // invisible
+ STATE_WAITING, // .is_waiting -- CEV
+ STATE_LEFTY, // .lefty -- CEV
+ STATE_LOCKED, // can be unlocked with a key
+ STATE_DISPLACEABLE, // can be bumped by player / explosions
+ STATE_PUSHABLE, // interacts with trigger_push ents
+ STATE_TELEPORTABLE, // interacts with trigger_teleport ents
+ STATE_AXEHITME = 1<<20, // .axhitme -- CEV
+ STATE_NOPAIN, // .berserk; no pain reactions -- CEV
+ STATE_SUPPRESSCENTERPRINT // .suppressCenterPrint
+} base_entity_stateflags;
#endif
#if defined(CSQC) || defined(SSQC)
@@ -92,7 +100,6 @@ typedef enumflags
{
QUE_TYPE_ACTOR, // moving actors (on the client)
QUE_TYPE_BODY, // the id1 bodyque
- QUE_TYPE_CORPSE, // corpses
QUE_TYPE_DEBRIS // debris and gibs
} base_entity_queflags;
#endif
@@ -112,14 +119,14 @@ typedef enumflags
} base_entity_dimensionflags;
#endif
+#if defined(CSQC) || defined(SSQC)
+const float BASE_ENTITY_ITEMLEN = 8; // for looping over .item[] -- CEV
+#endif
+
//======================================================================
// globals
//======================================================================
-#ifdef CSQC
-float servertime;
-#endif
-
#ifdef SSQC
entity activator; // entity that activated trigger/brush
entity damage_attacker; // set by T_Damage
@@ -136,9 +143,7 @@ float parm17, parm18; /* parm19, parm20, parm21, parm22, parm23, parm24,
entity actorque_head; // moving actors -- CEV
#endif
#ifdef SSQC
-entity corpseque_head; // monster corpses -- CEV
entity debrisque_head; // debris from breakables -- CEV
-float corpseque_count; // count of corpses queued -- CEV
float debrisque_count; // count of debris -- CEV
#endif
@@ -151,7 +156,7 @@ __unused var string __fullspawndata;
#endif
#if defined(CSQC) || defined(SSQC)
-float trace_surfaceflagsf; // float form is deprecated
+float trace_surfaceflagsf; // float form is deprecated -- CEV
#endif
//======================================================================
@@ -159,53 +164,57 @@ float trace_surfaceflagsf; // float form is deprecated
//======================================================================
#if defined(CSQC) || defined(SSQC)
-.float aflag; // trigger_filter, func_counter, item_
+.float aflag; // misc flag, misc field
.float alpha; // translucency in supported engines
.float cnt; // misc flag
.float color; // Hipnotic
-.float conlevel; // engine clobbers .waterlevel -- CEV
-.float contype; // engine clobbers .watertype -- CEV
.float count; // for counting triggers
-.float damage_mod; // dumptruck_ds
.float delay; // time from activation to firing
.float dimension_hit; // FTEQW
.float dimension_solid; //
.float distance;
-.float dmg; // damage done by door when hit
-.float height;
+.float dmg; // direct damage
+.float dmg_splash; // splash damage
.float gravity; // from custdefs.qc by way of Hipnotic
-.float is_waiting; // wait until activated before trigger?
-.float inventory1; // inventory slots 1 through 8 -- CEV
-.float inventory2; //
-.float inventory3; //
-.float inventory4; //
-.float inventory5; //
-.float inventory6; //
-.float inventory7; //
-.float inventory8; //
-.float lefty; // used by monsters and func_bob
-.float modelflags; // used to overwrite model flags -- CEV
+.float item[8]; // inventory slots 1 through 8 -- CEV
+.float modelflags; // overwrite model flags -- CEV
+.float moveflags; // movement state flags -- CEV
+.float moveflags_prev; //
+.float movetimer; // generic movement timer -- CEV
.float queflag; // linked list flag -- CEV
-.float scale; // resizes model. 1=normal, 2=double
.float speed;
.float speed2;
-.float state; // plats / doors / buttons
-.float style, style2;
-.float t_length, t_width; // func_, monster face, player LG, etc
+.float stateflags; // see base_entity_stateflags -- CEV
+.float step_time; // for player/etc footsteps -- CEV
+.float style;
+.float style2;
+.float t_height; // was .height -- CEV
+.float t_length; // func_, monster face, player LG, etc
+.float t_width; //
.float wait; // time from firing to restarting
-.float waitmin; // sounds (removed: waitmax)
.float wantedgravity; // thanks Spike!
.float volume; // sounds
-.float estate; // entity state
-.float prevstate; // previous entity state
-.void() olduse; // previous use function
+.entity oldenemy; // mad at this ent before taking damage
+.entity que_next; // linked lists -- CEV
+.entity trigger_field; // TODO CEV: cutscene, door, shambler
+
+.vector groundnormal; // ground plane normal; NOT networked
+.vector mangle; // angle at start
+.vector neworigin; // prediction, hipnotic rotation
+.vector pos1; // used to hold size & etc -- CEV
+.vector pos2; //
.string mdl; // hold original model for switching
+// .string message; // defined in entvars_t -- CEV
.string message2; // func_laser & trigger_heal
+// .string noise, noise1, noise2, noise3; // defined in entvars_t -- CEV
.string noise4; // noise & noise1-3 defined in entvars_t
// variables for enhanced triggering from Custents -- dumptruck_ds
+.string pain_target; // dumptruck_ds
+.string killtarget; // first target to kill
+.string killtarget2; // second target to kill
// .string target // defined in entvars_t -- CEV
.string target2; // second target's name
.string target3; // third target's name
@@ -214,33 +223,23 @@ float trace_surfaceflagsf; // float form is deprecated
.string targetname2; // second name
.string targetname3; // third name
.string targetname4; // fourth name
-.string killtarget; // first target to kill
-.string killtarget2; // second target to kill
-.string pain_target; // dumptruck_ds
-.vector dest; // MG1
-.vector dest2; // MG1
-.vector mangle; // angle at start
-.vector neworigin; // prediction, hipnotic rotation
-.vector pos1; // used by func classes & to hold orig
-.vector pos2; // mins & maxes -- CEV
-
-.entity oldenemy; // mad at this ent before taking damage
-.entity que_next; // linked lists -- CEV
-.entity trigger_field; // TODO CEV: cutscene, door, shambler
+.void() customphysics; // override entity's movetype & logic
#endif
#ifdef SSQC
+.void(float old, float new) contentstransition; // liquid -> air and reverse
+.void() think1; // stored think (calcmove, etc) -- CEV
+.void() use1; // previous / alternate use function
.void() tick; // MG1 frametick system -- CEV
-.void(entity src, float amount) th_pain;
-.void(vector dir) destroy; // th_die
-#endif
-#ifdef SSQC
+.void(vector dir) th_destroy; // th_die, called when ent destroyed
+.void(entity src, float amount) th_pain;// called when ent is dealt damage
+
// Called by the engine whenever an entity needs to be (re)sent to a client's
// csprogs, either because SendFlags was set or because data was lost. Must
// write its data to the MSG_ENTITY buffer. Will be called at the engine's
-// leasure.
+// leisure.
.float(entity e, float changedflags) SendEntity;
// Indicates that something in the entity has been changed, and that it needs
// to be updated to all players that can see it. The engine will clear it at
@@ -253,24 +252,20 @@ float trace_surfaceflagsf; // float form is deprecated
//----------------------------------------------------------------------
// entity networking / prediction; based on Nuclide and CSQCTest -- CEV
//----------------------------------------------------------------------
-.vector origin_net; // last origin sent/received
-.vector origin_prev; // previous origin received
.vector angles_net; // last angles sent/received
.vector angles_prev; // previous angles received
+.vector origin_net; // last origin sent/received
+.vector origin_prev; // previous origin received
+.vector velocity_net; // for player prediction -- CEV
.float frame_net; // last .frame sent/received
#ifdef CSQC
-.vector velocity_net; // for player prediction -- CEV
-.float origin_prev_stime;
.float origin_prev_time; // timestamp of previous origin receipt
-.float origin_net_stime;
.float origin_net_time; // timestamp of most recent origin
-.float angles_prev_stime;
.float angles_prev_time; // timestamp of previous angles receipt
-.float angles_net_stime;
.float angles_net_time; // timestamp of most recent angles
.float flags_net; // last .flags received
-.float pm_flags_net; // last .pm_flags received
-.float pm_timer_net; // last .pm_timer received
+.float moveflags_net; // last .moveflags received
+.float movetimer_net; // last .pm_timer received
#endif
#endif
@@ -279,6 +274,9 @@ float trace_surfaceflagsf; // float form is deprecated
//======================================================================
// base entity
+#if defined(CSQC) || defined(SSQC)
+// BASE_ENTITY_CHECKVELOCITY(vel)
+#endif
#ifdef CSQC
// BASE_ENTITY_NETFLAGS2(fl) // read netflags2 built by macro below
// BASE_ENTITY_READALPHA(fl) // Read macros for often-used fields
@@ -290,6 +288,7 @@ float trace_surfaceflagsf; // float form is deprecated
// BASE_ENTITY_READSIZE(fl)
// BASE_ENTITY_READSKIN(fl)
// BASE_ENTITY_READSOLID(fl)
+// BASE_ENTITY_READVELOCITY(fl)
// BASE_ENTITY_READWEAPON(fl)
float(float isnew) base_entity_netreceive;
#endif
@@ -300,6 +299,7 @@ float(float isnew) base_entity_netreceive;
// BASE_ENTITY_NETFLAGS_FRAMEHACK(fl)
// BASE_ENTITY_NETFLAGS_ANGLESHACK(flP, flY, flR)
// BASE_ENTITY_NETFLAGS_ORIGINHACK(flX, flY, flZ)
+// BASE_ENTITY_NETFLAGS_VELOCITYHACK(fl)
// BASE_ENTITY_WRITEALPHA(fl) // Write macros for often-used fields
// BASE_ENTITY_WRITEANGLES(flP, flY, flR)
// BASE_ENTITY_WRITECLASSTYPE()
@@ -309,6 +309,7 @@ float(float isnew) base_entity_netreceive;
// BASE_ENTITY_WRITESIZE(fl)
// BASE_ENTITY_WRITESKIN(fl)
// BASE_ENTITY_WRITESOLID(fl)
+// BASE_ENTITY_WRITEVELOCITY(fl)
// BASE_ENTITY_WRITEWEAPON(fl)
float(entity to, float netflags) base_entity_netsend_null;
float(entity to, float netflags) base_entity_netsend;
@@ -321,13 +322,14 @@ float() base_entity_parsemapdata;
#if defined(CSQC) || defined(SSQC)
// BASE_ENTITY_WEAPONLOOKUP(ent)
void(entity e) base_entity_aligntoground;
-void(entity e, entity p, float maxspeed) base_entity_push;
+void(entity e, entity p, float maxspeed) base_entity_displace;
void(entity e) base_entity_positioncontents;
void(entity e) base_entity_remove;
#endif
#ifdef SSQC
void() base_entity_movetype_push;
void(entity e) base_entity_boundammo;
+void(float drop_item) base_entity_init_drop_item; // .drop_item -- CEV
#endif
#if defined(CSQC) || defined(SSQC)
entity(entity e, float fl) base_entity_que_add;
@@ -403,6 +405,18 @@ void() noclass;
// Generic entity networking -- Client
//==============================================================
+#if defined(CSQC) || defined(SSQC)
+ //--------------------------------------------------------------
+ // CHECKVELOCITY - bound self.velocity to server maximums -- CEV
+ //--------------------------------------------------------------
+ #define BASE_ENTITY_CHECKVELOCITY(vel) \
+ /* { */ \
+ vel.x = bound (-PM_MAXVELOCITY, vel.x, PM_MAXVELOCITY); \
+ vel.y = bound (-PM_MAXVELOCITY, vel.y, PM_MAXVELOCITY); \
+ vel.z = bound (-PM_MAXVELOCITY, vel.z, PM_MAXVELOCITY); \
+ /* } */
+#endif
+
#ifdef CSQC
//--------------------------------------------------------------
#define BASE_ENTITY_NETFLAGS2(fl) \
@@ -418,7 +432,7 @@ void() noclass;
/* { */ \
if (netflags & fl) \
{ \
- self.alpha = ReadFloat (); \
+ self.alpha = ReadByte () * (1 / 255.0f); \
} \
/* } */
@@ -445,8 +459,6 @@ void() noclass;
self.angles_net = self.angles; \
self.angles_prev_time = time; \
self.angles_net_time = self.angles_prev_time; \
- self.angles_prev_stime = servertime; \
- self.angles_net_stime = servertime; \
} \
else \
{ \
@@ -466,13 +478,23 @@ void() noclass;
if (newangles != self.angles_net) \
{ \
self.angles_prev = self.angles_net; \
- self.angles_prev_time = \
- self.angles_net_time; \
- self.angles_prev_stime = \
- self.angles_net_stime; \
self.angles_net = newangles; \
- self.angles_net_time = time; \
- self.angles_net_stime = servertime; \
+ /* FUNC entities seem to need different
+ * timestamps than other ents -- CEV
+ */ \
+ if (self.classgroup & CG_FUNC) \
+ { \
+ self.angles_prev_time = \
+ serverprevtime; \
+ self.angles_net_time = \
+ servertime; \
+ } \
+ else \
+ { \
+ self.angles_prev_time = \
+ self.angles_net_time; \
+ self.angles_net_time = time; \
+ } \
} \
} \
} \
@@ -509,39 +531,47 @@ void() noclass;
self.origin.y = ReadCoord (); \
if (netflags & flZ) \
self.origin.z = ReadCoord (); \
+ setorigin (self, self.origin); \
self.origin_prev = self.origin; \
self.origin_net = self.origin; \
- self.origin_prev_time = time; \
+ self.origin_prev_time = servertime; \
self.origin_net_time = self.origin_prev_time; \
- self.origin_prev_stime = servertime; \
- self.origin_net_stime = servertime; \
- setorigin (self, self.origin); \
} \
else \
{ \
- local vector neworigin; \
+ local vector neworg; \
if (netflags & flX) \
- neworigin.x = ReadCoord (); \
+ neworg.x = ReadCoord (); \
else \
- neworigin.x = self.origin_net.x; \
+ neworg.x = self.origin_net.x; \
if (netflags & flY) \
- neworigin.y = ReadCoord (); \
+ neworg.y = ReadCoord (); \
else \
- neworigin.y = self.origin_net.y; \
+ neworg.y = self.origin_net.y; \
if (netflags & flZ) \
- neworigin.z = ReadCoord (); \
+ neworg.z = ReadCoord (); \
else \
- neworigin.z = self.origin_net.z; \
- if (neworigin != self.origin_net) \
+ neworg.z = self.origin_net.z; \
+ if (neworg != self.origin_net) \
{ \
self.origin_prev = self.origin_net; \
- self.origin_prev_time = \
- self.origin_net_time; \
- self.origin_prev_stime = \
- self.origin_net_stime; \
- self.origin_net = neworigin; \
- self.origin_net_time = time; \
- self.origin_net_stime = servertime; \
+ self.origin_net = neworg; \
+ /* FUNC entities seem to need different
+ * timestamps than other ents -- CEV
+ */ \
+ if (self.classgroup & CG_FUNC) \
+ { \
+ self.origin_prev_time = \
+ serverprevtime; \
+ self.origin_net_time = \
+ servertime; \
+ } \
+ else \
+ { \
+ self.origin_prev_time = \
+ self.origin_net_time; \
+ self.origin_net_time = time; \
+ } \
} \
} \
} \
@@ -575,8 +605,21 @@ void() noclass;
/* { */ \
if (netflags & fl) \
{ \
- self.solid = ReadByte (); \
- self.movetype = ReadByte (); \
+ local float solidmovetype = ReadByte (); \
+ self.solid = (solidmovetype / 16) & 15; \
+ self.movetype = solidmovetype & 15; \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_ENTITY_READVELOCITY(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ self.velocity_net.x = ReadShort() * 0.125; \
+ self.velocity_net.y = ReadShort() * 0.125; \
+ self.velocity_net.z = ReadShort() * 0.125; \
+ self.velocity = self.velocity_net; \
} \
/* } */
@@ -600,10 +643,10 @@ void() noclass;
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_ANGLES_X)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_ANGLES_Z)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_MODEL)
- BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_SIZE)
+ BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_RESERVED2)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_SOLID)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_WEAPON)
- BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_RESERVED2)
+ BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_RESERVED3)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_ALPHA)
}
@@ -613,10 +656,10 @@ void() noclass;
BASE_ENTITY_READANGLES (NETFLAG_BASE_ENTITY_ANGLES_X,
NETFLAG_BASE_ENTITY_ANGLES_Y,
NETFLAG_BASE_ENTITY_ANGLES_Z)
+ BASE_ENTITY_READVELOCITY (NETFLAG_BASE_ENTITY_VELOCITY)
BASE_ENTITY_READFRAME (NETFLAG_BASE_ENTITY_FRAME)
BASE_ENTITY_READSKIN (NETFLAG_BASE_ENTITY_SKIN)
BASE_ENTITY_READMODEL (NETFLAG_BASE_ENTITY_MODEL)
- BASE_ENTITY_READSIZE (NETFLAG_BASE_ENTITY_SIZE)
BASE_ENTITY_READSOLID (NETFLAG_BASE_ENTITY_SOLID)
BASE_ENTITY_READWEAPON (NETFLAG_BASE_ENTITY_WEAPON)
BASE_ENTITY_READALPHA (NETFLAG_BASE_ENTITY_ALPHA)
@@ -770,11 +813,31 @@ void() noclass;
/* } */
//--------------------------------------------------------------
+ #define BASE_ENTITY_NETFLAGS_VELOCITYHACK(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ if (self.velocity == self.velocity_net) \
+ { \
+ netflags &= ~fl; \
+ } \
+ } \
+ else \
+ { \
+ if (self.velocity != self.velocity_net) \
+ { \
+ netflags |= fl; \
+ } \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
#define BASE_ENTITY_WRITEALPHA(fl) \
/* { */ \
if (netflags & fl) \
{ \
- WriteFloat (MSG_ENTITY, self.alpha); \
+ WriteByte (MSG_ENTITY, \
+ bound(0, ceil(self.alpha * 255), 255)); \
} \
/* } */
@@ -871,8 +934,21 @@ void() noclass;
/* { */ \
if (netflags & fl) \
{ \
- WriteByte (MSG_ENTITY, self.solid); \
- WriteByte (MSG_ENTITY, self.movetype); \
+ WriteByte (MSG_ENTITY, self.solid * 16 + \
+ self.movetype); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_ENTITY_WRITEVELOCITY(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ BASE_ENTITY_CHECKVELOCITY (self.velocity) \
+ WriteShort (MSG_ENTITY, floor(self.velocity.x * 8)); \
+ WriteShort (MSG_ENTITY, floor(self.velocity.y * 8)); \
+ WriteShort (MSG_ENTITY, floor(self.velocity.z * 8)); \
+ self.velocity_net = self.velocity; \
} \
/* } */
@@ -922,6 +998,10 @@ void() noclass;
NETFLAG_BASE_ENTITY_ANGLES_Y,
NETFLAG_BASE_ENTITY_ANGLES_Z)
+ // rewrite velocity flag -- CEV
+ BASE_ENTITY_NETFLAGS_VELOCITYHACK (
+ NETFLAG_BASE_ENTITY_VELOCITY)
+
// rewrite frame flag -- CEV
BASE_ENTITY_NETFLAGS_FRAMEHACK (
NETFLAG_BASE_ENTITY_FRAME)
@@ -936,7 +1016,7 @@ void() noclass;
BASE_ENTITY_NETFLAGS1 (NETFLAG_BASE_ENTITY_ORIGIN_Y)
BASE_ENTITY_NETFLAGS1 (NETFLAG_BASE_ENTITY_ORIGIN_Z)
BASE_ENTITY_NETFLAGS1 (NETFLAG_BASE_ENTITY_ANGLES_Y)
- BASE_ENTITY_NETFLAGS1 (NETFLAG_BASE_ENTITY_RESERVED1)
+ BASE_ENTITY_NETFLAGS1 (NETFLAG_BASE_ENTITY_VELOCITY)
BASE_ENTITY_NETFLAGS1 (NETFLAG_BASE_ENTITY_FRAME)
BASE_ENTITY_NETFLAGS1 (NETFLAG_BASE_ENTITY_SKIN)
@@ -949,10 +1029,10 @@ void() noclass;
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_ANGLES_X)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_ANGLES_Z)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_MODEL)
- BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_SIZE)
+ BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_RESERVED2)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_SOLID)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_WEAPON)
- BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_RESERVED2)
+ BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_RESERVED3)
BASE_ENTITY_NETFLAGS2 (NETFLAG_BASE_ENTITY_ALPHA)
// write second byte -- CEV
@@ -966,10 +1046,10 @@ void() noclass;
BASE_ENTITY_WRITEANGLES (NETFLAG_BASE_ENTITY_ANGLES_X,
NETFLAG_BASE_ENTITY_ANGLES_Y,
NETFLAG_BASE_ENTITY_ANGLES_Z)
+ BASE_ENTITY_WRITEVELOCITY (NETFLAG_BASE_ENTITY_VELOCITY)
BASE_ENTITY_WRITEFRAME (NETFLAG_BASE_ENTITY_FRAME)
BASE_ENTITY_WRITESKIN (NETFLAG_BASE_ENTITY_SKIN)
BASE_ENTITY_WRITEMODEL (NETFLAG_BASE_ENTITY_MODEL)
- BASE_ENTITY_WRITESIZE (NETFLAG_BASE_ENTITY_SIZE)
BASE_ENTITY_WRITESOLID (NETFLAG_BASE_ENTITY_SOLID)
BASE_ENTITY_WRITEWEAPON (NETFLAG_BASE_ENTITY_WEAPON)
BASE_ENTITY_WRITEALPHA (NETFLAG_BASE_ENTITY_ALPHA)
@@ -1135,14 +1215,18 @@ void() noclass;
/* the engine (Ironwail at least) sometimes adjusts
* the client's time global while bounding the lerp
* fraction; let's not do that here in QC -- CEV */ \
- of2 = bound (0, of2, 1); \
- ent.origin = pvec + (nvec - pvec) * of2; \
+ /* of2 = bound (0, of2, 1); */ \
+ if (of2 <= 0) \
+ setorigin (ent, pvec); \
+ else if (of2 >= 1) \
+ setorigin (ent, nvec); \
+ else \
+ setorigin (ent, pvec + (nvec - pvec) * of2); \
/*
dprint (sprintf("BASE_ENTITY_LERP_ORIGIN: " \
"t - n %g, n - p %g, of2 %g\n", \
ctime - ntime, ntime - ptime, of2)); \
*/ \
- setorigin (ent, ent.origin); \
} \
/* } */
#endif
@@ -1154,14 +1238,14 @@ void() noclass;
local float item_index = 0; \
switch (ent.weapon) \
{ \
- case 1: item_index = ent.inventory1; break; \
- case 2: item_index = ent.inventory2; break; \
- case 3: item_index = ent.inventory3; break; \
- case 4: item_index = ent.inventory4; break; \
- case 5: item_index = ent.inventory5; break; \
- case 6: item_index = ent.inventory6; break; \
- case 7: item_index = ent.inventory7; break; \
- case 8: item_index = ent.inventory8; break; \
+ case 1: item_index = ent.item[0]; break; \
+ case 2: item_index = ent.item[1]; break; \
+ case 3: item_index = ent.item[2]; break; \
+ case 4: item_index = ent.item[3]; break; \
+ case 5: item_index = ent.item[4]; break; \
+ case 6: item_index = ent.item[5]; break; \
+ case 7: item_index = ent.item[6]; break; \
+ case 8: item_index = ent.item[7]; break; \
} \
/* } */
@@ -1198,8 +1282,11 @@ void() noclass;
//--------------------------------------------------------------
// Push entity e away from entity p at a rate based on p's
// velocity (no higher than maxspeed) -- CEV
+ //
+ // This causes prediction errors at high (50+) ping & could
+ // be improved. Might need to depend on input_timelength -- CEV
//--------------------------------------------------------------
- void(entity e, entity p, float maxspeed) base_entity_push =
+ void(entity e, entity p, float maxspeed) base_entity_displace =
{
local float espeed, newspeed, zspeed;
@@ -1247,15 +1334,13 @@ void() noclass;
void(entity e) base_entity_positioncontents =
{
local vector v = e.origin;
- #ifdef SSQC
- local float oldtype = e.contype;
- #endif
+ local float oldtype = e.watertype;
// check contents at e's feet + 1
v_z = e.origin_z + e.mins_z + 1;
- e.contype = pointcontents (v);
+ e.watertype = pointcontents (v);
- if (e.contype < CONTENT_SOLID)
+ if (e.watertype < CONTENT_SOLID)
{
if (e.classtype == CT_PLAYER)
{
@@ -1265,69 +1350,71 @@ void() noclass;
v_z = e.origin_z + e.maxs_z;
if (pointcontents(v) < CONTENT_SOLID)
{
- e.conlevel = WATERLEVEL_EYES;
+ e.waterlevel = WATERLEVEL_EYES;
}
else
{
- e.conlevel = WATERLEVEL_WAIST;
+ e.waterlevel = WATERLEVEL_WAIST;
}
}
else
{
- e.conlevel = WATERLEVEL_FEET;
+ e.waterlevel = WATERLEVEL_FEET;
}
}
else if (e.classgroup & CG_MONSTER)
{
// only check contents past feet if the
// monster is in water
- if (e.contype == CONTENT_WATER)
+ if (e.watertype == CONTENT_WATER)
{
v_z = e.origin_z + e.maxs_z;
if (pointcontents(v) < CONTENT_SOLID)
{
- e.conlevel = WATERLEVEL_EYES;
+ e.waterlevel = WATERLEVEL_EYES;
}
else
{
- e.conlevel = WATERLEVEL_FEET;
+ e.waterlevel = WATERLEVEL_FEET;
}
}
else
{
- e.conlevel = WATERLEVEL_FEET;
+ e.waterlevel = WATERLEVEL_FEET;
}
}
else
{
// all other entities only check to feet level
- e.conlevel = WATERLEVEL_FEET;
+ e.waterlevel = WATERLEVEL_FEET;
}
}
else
{
- e.conlevel = WATERLEVEL_NONE;
+ e.waterlevel = WATERLEVEL_NONE;
if (e.classgroup & CG_MONSTER)
e.air_finished = time + 12;
}
- #ifdef SSQC
// do our content transition checks right here -- CEV
- if (e.contype <= CONTENT_WATER && oldtype == CONTENT_EMPTY) {
+ // TODO CEV
+ #if 0
+ if (e.watertype <= CONTENT_WATER && oldtype == CONTENT_EMPTY) {
if (e.classtype != CT_PLAYER) {
if (e.swim_time < time)
{
e.swim_time = time + 2;
- sound (e, CHAN_AUTO, "misc/h2ohit1.wav", VOL_MID,
- ATTN_NORM);
+ SOUND (e, snd_misc_h2ohit)
} } }
+ #endif
+ /*
if (e.contype == CONTENT_EMPTY)
{
e.watertype = e.contype;
e.waterlevel = e.conlevel;
}
- #endif
+ */
};
//--------------------------------------------------------------
@@ -1351,13 +1438,13 @@ void() noclass;
#ifdef SSQC
//--------------------------------------------------------------
- // .customphysics for MOVETYPE_PUSH entities that set SendFlags
+ // .customphysics for MOVETYPE_PUSH entities that sets SendFlags
// on the moving entity and any moved entities -- CEV
//--------------------------------------------------------------
void() base_entity_movetype_push =
{
- local float mt = server_deltatime;
- local float oldltime = self.ltime;
+ var float mt = server_deltatime;
+ var float oldltime = self.ltime;
if (self.nextthink < self.ltime + mt)
mt = max (0, self.nextthink - self.ltime);
@@ -1369,8 +1456,8 @@ void() noclass;
}
else
{
- local vector oldmin = self.absmin;
- local vector oldmax = self.absmax;
+ var vector oldmin = self.absmin;
+ var vector oldmax = self.absmax;
// pushing entities is hard; let the engine do it -- CEV
if (pushmove(self, self.velocity * mt,
@@ -1380,7 +1467,7 @@ void() noclass;
// flag any nearby ents to transmit origin to
// CSQC; findradius options from Xonotic -- CEV
- local entity e = findradius(
+ var entity e = findradius(
(oldmin + oldmax) * 0.5,
vlen(oldmin - oldmax) * 0.5);
@@ -1455,6 +1542,87 @@ void() noclass;
if (e.ammo_cells > AMMO_CELLS_MAX)
e.ammo_cells = AMMO_CELLS_MAX;
};
+
+ //--------------------------------------------------------------
+ // Handle .drop_item field; based on DropStuff by dumptruck_ds -- CEV
+ //--------------------------------------------------------------
+ void(float drop_item) base_entity_init_drop_item =
+ {
+ var float ra[3] = {0, 0, 0};
+
+ switch (drop_item)
+ {
+ case 0:
+ // no-op -- CEV
+ break;
+ case 1:
+ // 1 = Silver Key
+ ra[0] = base_item_key_silverindex ();
+ break;
+ case 2:
+ // 2 = Gold Key
+ ra[0] = base_item_key_goldindex ();
+ break;
+ case 3:
+ // 3 = Health Vial
+ ra[0] = ITEM_SEQ_HEALTH_VIAL;
+ break;
+ case 4:
+ // 4 = Armor Shard
+ ra[0] = ITEM_SEQ_ARMOR_SHARD;
+ break;
+ case 5:
+ // 5 = Health Vial & Armor Shard
+ ra[0] = ITEM_SEQ_HEALTH_VIAL;
+ ra[1] = ITEM_SEQ_ARMOR_SHARD;
+ break;
+ case 6:
+ // 6 = random 3 Vials and/or Shards
+ var float rd = rint(random() * 3);
+ if (rd == 1)
+ {
+ ra[0] = ITEM_SEQ_ARMOR_SHARD;
+ ra[1] = ITEM_SEQ_HEALTH_VIAL;
+ ra[2] = ITEM_SEQ_HEALTH_VIAL;
+ }
+ else if (rd == 2)
+ {
+ ra[0] = ITEM_SEQ_ARMOR_SHARD;
+ ra[1] = ITEM_SEQ_ARMOR_SHARD;
+ ra[2] = ITEM_SEQ_HEALTH_VIAL;
+ }
+ else if (rd == 0)
+ {
+ ra[0] = ITEM_SEQ_ARMOR_SHARD;
+ ra[1] = ITEM_SEQ_ARMOR_SHARD;
+ ra[2] = ITEM_SEQ_ARMOR_SHARD;
+ }
+ else
+ {
+ ra[0] = ITEM_SEQ_HEALTH_VIAL;
+ ra[1] = ITEM_SEQ_HEALTH_VIAL;
+ ra[2] = ITEM_SEQ_HEALTH_VIAL;
+ }
+ break;
+ default:
+ dprint (sprintf("base_monster_init_field: "
+ "unhandled drop_item %g\n", drop_item));
+ }
+
+ // map ra to self.item -- CEV
+ for (float i = 0; i < 3; i++)
+ {
+ // skip if already holding an item in that slot -- CEV
+ if (self.item[i])
+ continue;
+
+ // skip if empty -- CEV
+ if (ra[i] == 0)
+ continue;
+
+ self.item[i] = ra[i];
+ }
+ };
#endif
//==============================================================
@@ -1463,9 +1631,6 @@ void() noclass;
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
- #define BASE_ENTITY_QUE_DEBUG
-
- //--------------------------------------------------------------
#define BASE_ENTITY_QUE_ADD_DEBUGPRINT() \
{ \
newcount = *que_count; \
@@ -1504,7 +1669,7 @@ void() noclass;
local float *que_count = __NULL__;
local float que_count_max = 0;
- #ifdef BASE_ENTITY_QUE_DEBUG
+ #ifdef DEBUG
local float newcount = 0;
#endif
@@ -1519,10 +1684,6 @@ void() noclass;
case QUE_TYPE_BODY:
que_head = &bodyque_head;
break;
- case QUE_TYPE_CORPSE:
- que_head = &corpseque_head;
- que_count = &corpseque_count;
- break;
case QUE_TYPE_DEBRIS:
que_head = &debrisque_head;
que_count = &debrisque_count;
@@ -1552,7 +1713,7 @@ void() noclass;
if (que_count)
{
*que_count = *que_count + 1;
- #ifdef BASE_ENTITY_QUE_DEBUG
+ #ifdef DEBUG
BASE_ENTITY_QUE_ADD_DEBUGPRINT ()
#endif
}
@@ -1587,7 +1748,7 @@ void() noclass;
}
}
- #ifdef BASE_ENTITY_QUE_DEBUG
+ #ifdef DEBUG
if (que_count)
{
BASE_ENTITY_QUE_ADD_DEBUGPRINT ()
@@ -1623,7 +1784,7 @@ void() noclass;
local entity *que_head = __NULL__;
local float *que_count = __NULL__;
- #ifdef BASE_ENTITY_QUE_DEBUG
+ #ifdef DEBUG
local float newcount = 0;
#endif
@@ -1638,10 +1799,6 @@ void() noclass;
case QUE_TYPE_BODY:
que_head = &bodyque_head;
break;
- case QUE_TYPE_CORPSE:
- que_head = &corpseque_head;
- que_count = &corpseque_count;
- break;
case QUE_TYPE_DEBRIS:
que_head = &debrisque_head;
que_count = &debrisque_count;
@@ -1666,7 +1823,7 @@ void() noclass;
{
*que_count = *que_count - 1;
- #ifdef BASE_ENTITY_QUE_DEBUG
+ #ifdef DEBUG
BASE_ENTITY_QUE_REM_DEBUGPRINT ()
#endif
}
@@ -1692,7 +1849,7 @@ void() noclass;
{
*que_count = *que_count - 1;
- #ifdef BASE_ENTITY_QUE_DEBUG
+ #ifdef DEBUG
BASE_ENTITY_QUE_REM_DEBUGPRINT ()
#endif
}
@@ -1782,13 +1939,13 @@ void() noclass;
{
self.th_die ();
}
- else if (self.destroy)
+ else if (self.th_destroy)
{
// rework for MOVETYPE_NONE, PUSH, etc -- CEV
dir = ((targ.absmin + targ.absmax) * 0.5) -
((inflictor.absmin + inflictor.absmax)
* 0.5);
- self.destroy (normalize(dir));
+ self.th_destroy (normalize(dir));
}
self = stemp;
return;
@@ -1813,8 +1970,8 @@ void() noclass;
if (self.th_die)
self.th_die ();
- else if (self.destroy)
- self.destroy (dir);
+ else if (self.th_destroy)
+ self.th_destroy (dir);
self = stemp;
};
@@ -1840,32 +1997,22 @@ void() noclass;
}
org = head.origin + (head.mins + head.maxs) * 0.5;
- points = 0.5 * vlen (inflictor.origin - org);
- if (points < 0)
- points = 0;
+ points = max (0, 0.5 * vlen(inflictor.origin - org));
points = damage - points;
+
if (head == attacker)
points = points * 0.5;
- if (points > 0)
+ if (points > 0) {
+ if (can_damage(inflictor, head))
{
- if (can_damage(inflictor, head))
- {
- // shambler takes half damage from
- // all explosions
- if (head.classtype ==
- CT_MONSTER_SHAMBLER)
- {
- t_damage2 (head, inflictor,
- attacker, points * 0.5);
- }
- else
- {
- t_damage2 (head, inflictor,
- attacker, points);
- }
- }
- }
+ // shambler takes half damage from explosions
+ if (head.classtype == CT_MONSTER_SHAMBLER)
+ points = points * 0.5;
+
+ t_damage2 (head, inflictor, attacker, points);
+ } }
+
head = head.chain;
}
};
@@ -1994,7 +2141,7 @@ void() noclass;
return;
// some func_breakables ignore monster damage -- johnfitz
- // dded from Rubicon2 combat.qc -- dumptruck_ds
+ // added from Rubicon2 combat.qc -- dumptruck_ds
if (targ.classtype == CT_FUNC_BREAKABLE) {
if (targ.spawnflags & SPAWNFLAG_BASE_BREAKABLE_NO_MONSTERS) {
if (attacker.flags & FL_MONSTER)
@@ -2009,14 +2156,7 @@ void() noclass;
// check for quad damage powerup on the attacker
if (attacker.super_damage_finished > time)
- {
- dprint ("QUAD\n");
damage = damage * 4;
- }
-
- // damage mod for monsters -- dumptruck_ds
- if (attacker.damage_mod)
- damage = damage * attacker.damage_mod;
// TODO CEV this is a quick hack
if ((inflictor.classgroup & CG_PROJECTILE &&
@@ -2082,25 +2222,24 @@ void() noclass;
targ.dmg_inflictor = inflictor;
}
- // apply momentum change to players and monsters -- CEV
- if (inflictor != world && targ.solid != SOLID_CORPSE && (
- targ.movetype == MOVETYPE_WALK ||
- targ.movetype == MOVETYPE_STEP ||
- targ.movetype == MOVETYPE_FLY))
+ // figure momentum direction
+ if (inflictor != world)
{
- // figure momentum direction
dir = targ.origin -
(inflictor.absmin + inflictor.absmax) * 0.5;
// only a fraction of dir_z -- CEV
dir_z = dir_z * 0.5;
dir = normalize (dir);
+ }
- if (targ.flags & FL_MONSTER &&
- targ.flags & FL_ONGROUND &&
- targ.movetype == MOVETYPE_STEP)
- {
+ // apply momentum change to players and monsters -- CEV
+ if (inflictor != world && targ.solid != SOLID_CORPSE && (
+ targ.movetype == MOVETYPE_WALK ||
+ targ.movetype == MOVETYPE_STEP ||
+ targ.movetype == MOVETYPE_FLY))
+ {
+ if (targ.flags & FL_MONSTER && targ.flags & FL_ONGROUND)
targ.flags &= ~FL_ONGROUND;
- }
if (attacker.classtype == CT_PLAYER && attacker == targ)
// standard knockback for self-damage -- CEV
@@ -2128,8 +2267,7 @@ void() noclass;
{
if (self.invincible_sound < time)
{
- sound (targ, CHAN_ITEM, "items/protect3.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (targ, snd_item_pent_prot)
self.invincible_sound = time + 2;
}
return;
@@ -2266,15 +2404,20 @@ void() noclass;
//--------------------------------------------------------------
void() sub_remove_fade =
{
- if (self.alpha <= 0)
+ if (self.alpha <= 0.1)
{
base_entity_remove (self);
}
else
{
- self.alpha -= 0.05;
+ if (self.alpha >= 0.1)
+ self.alpha -= 0.05;
self.think = sub_remove_fade;
self.nextthink = time + 0.1;
+
+ #ifdef SSQC
+ self.SendFlags |= NETFLAG_BASE_ENTITY_ALPHA;
+ #endif
}
};
@@ -2327,7 +2470,7 @@ void() noclass;
if (toucher.movetype == MOVETYPE_NOCLIP)
return FALSE;
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return FALSE;
return TRUE;
@@ -2338,7 +2481,7 @@ void() noclass;
//--------------------------------------------------------------
void() sub_usetargets =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
if (self.delay)
@@ -2361,9 +2504,9 @@ void() noclass;
{
centerprint (t, self.message);
if (!self.noise)
- sound (t, CHAN_VOICE,
- "misc/talk.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (t, snd_misc_talk)
+ }
t = findfloat (t, classtype, CT_PLAYER);
}
}
@@ -2371,9 +2514,9 @@ void() noclass;
{
centerprint (activator, self.message);
if (!self.noise)
- sound (activator, CHAN_VOICE,
- "misc/talk.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (activator, snd_misc_talk)
+ }
}
}
Return to the top of this page or return to the overview of this repo.
Diff qc/base_func.qc
diff --git a/qc/base_func.qc b/qc/base_func.qc
index 616a968..6a4fd4a 100644
--- a/qc/base_func.qc
+++ b/qc/base_func.qc
@@ -12,11 +12,11 @@
//----------------------------------------------------------------------
typedef enum
{
- FUNC_STATE_TOP = 0,
- FUNC_STATE_BOTTOM = 1,
- FUNC_STATE_UP = 2,
- FUNC_STATE_DOWN = 3
-} base_func_states;
+ FMF_TOP = 0, // top position
+ FMF_BOTTOM = 1, // bottom position
+ FMF_UP = 2, // moving up
+ FMF_DOWN = 3 // moving down
+} base_func_moveflags;
#endif
//======================================================================
@@ -24,10 +24,8 @@ typedef enum
//======================================================================
#ifdef SSQC
-.float lip; //
-.vector finaldest, finalangle;
-
-.void() think1; // called by calcmove_done
+.vector finaldest; // used by calcmove
+.vector finalangle; // used by calcanglemove
#endif
//======================================================================
@@ -49,6 +47,9 @@ void() sub_calcanglemovecontroller_done;
void(entity e, vector destangle, float tspeed, void() func, entity c)
sub_calcanglemovecontroller;
#endif
+#ifdef SSQC
+// BASE_FUNC_PREINIT(func)
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) base_func_init;
#endif
@@ -82,12 +83,8 @@ strip void() base_func;
if (self.modelindex) \
{ \
setmodelindex (self, self.modelindex); \
- } } \
- if (netflags & NETFLAG_BASE_ENTITY_SIZE) \
- { \
setsize (self, self.mins, self.maxs); \
- } \
- /*
+ } } \
else if (netflags & NETFLAG_BASE_ENTITY_SOLID) \
{ \
if (self.solid) \
@@ -97,7 +94,6 @@ strip void() base_func;
if (!(netflags & NETFLAG_BASE_ENTITY_ORIGIN)) \
setorigin (self, self.origin); \
} \
- */ \
if (netflags & NETFLAG_BASE_ENTITY_ORIGIN) \
setorigin (self, self.origin); \
} \
@@ -106,24 +102,70 @@ strip void() base_func;
//--------------------------------------------------------------
float() base_func_predraw =
{
- // func_ entities are (I hope) not changing frame often
+ // func_ entities are (I hope) not changing .frame often
// enough to need interpolation -- CEV
- // interpolate angles -- see base_entities.qc -- CEV
- BASE_ENTITY_LERP_ANGLES (self,
- self.angles_net, self.angles_prev, time,
- self.angles_net_time, self.angles_prev_time)
+ // interpolate angles, origins -- func ents do this a bit
+ // differently than others, they seem to need different
+ // timestamps, not sure why. MOVETYPE_PUSH might have
+ // something to do with it. -- CEV
+ local float lf = 0;
+
+ // this is similar to/inspired by the logic used in Xonotic;
+ // see lib/csqcmodel/interpolate.qc in the Xonotic QuakeC src
+ // -- CEV
+ if (self.origin_net_time && self.origin_prev_time &&
+ self.origin_net_time != self.origin_prev_time)
+ {
+ lf = (time - self.origin_prev_time) /
+ (self.origin_net_time - self.origin_prev_time);
+
+ if (time - self.origin_net_time >= 0.2)
+ setorigin (self, self.origin_net);
+ else if (lf <= 0)
+ setorigin (self, self.origin_prev);
+ else if (lf >= 1)
+ setorigin (self, self.origin_net);
+ else
+ setorigin (self, (1 - lf) * self.origin_prev +
+ lf * self.origin_net);
+ }
- // interpolate origin -- see base_entities.qc -- CEV
- BASE_ENTITY_LERP_ORIGIN (self,
- self.origin_net, self.origin_prev, time,
- self.origin_net_time, self.origin_prev_time)
+ // same as BASE_ENTITY_LERP_ANGLES but copied here -- CEV
+ if (self.angles_net_time && self.angles_prev_time &&
+ self.angles_net_time != self.angles_prev_time)
+ {
+ lf = (time - self.angles_prev_time) /
+ (self.angles_net_time - self.angles_prev_time);
+ lf = bound (0, lf, 1);
+
+ local float ang;
+
+ // correctly wrap angles when interpolating. this is
+ // the same logic used in Ironwail 0.7.0; see
+ // Quake/cl_main.c line 547 -- CEV
+ for (float angi = 0; angi < 3; angi++)
+ {
+ ang = self.angles_net[angi] -
+ self.angles_prev[angi];
+
+ if (ang > 180)
+ ang -= 360;
+ else if (ang < -180)
+ ang += 360;
+
+ self.angles[angi] = self.angles_prev[angi] +
+ ang * lf;
+ }
+ }
// draw this entity -- CEV
addentity (self);
- // rewind to last sent server position -- CEV
- setorigin (self, self.origin_net);
+ // reset to latest server position after drawing (for player
+ // prediction collision checking) -- CEV
+ if (self.origin != self.origin_net)
+ setorigin (self, self.origin_net);
// go to next without auto-drawing this entity -- CEV
return PREDRAW_NEXT;
@@ -293,6 +335,17 @@ strip void() base_func;
// Constructor & Spawn Functions
//==============================================================
+#ifdef SSQC
+ //--------------------------------------------------------------
+ #define BASE_FUNC_PREINIT(func) \
+ /* { */ \
+ base_mapentity_init_spawndata (func); \
+ /* new spawnflags for all entities -- iw */ \
+ if (SUB_Inhibit()) \
+ return; \
+ /* } */
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) base_func_init =
Return to the top of this page or return to the overview of this repo.
Diff qc/base_item.qc
diff --git a/qc/base_item.qc b/qc/base_item.qc
index 6919253..c81500a 100644
--- a/qc/base_item.qc
+++ b/qc/base_item.qc
@@ -24,9 +24,9 @@ typedef enumflags
// SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
// SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
// SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
- SPAWNFLAG_ITEM_RESPAWN = 2097152,// respawn
- SPAWNFLAG_ITEM_THROWN = 4194304, // item was thrown
- SPAWNFLAG_ITEM_DONTDROP = 8388608 // last flag! don't drop to the ground
+ SPAWNFLAG_ITEM_RESPAWN = 1048576, // respawn
+ SPAWNFLAG_ITEM_THROWN = 2097152, // item was thrown
+ SPAWNFLAG_ITEM_DONTDROP = 4194304 // last flag! don't drop to the ground
} base_item_spawnflags;
#endif
@@ -34,16 +34,6 @@ typedef enumflags
const float ITEM_ALPHA_WAITSPAWN = 0.00001; // alpha values (respawn feedback)
const float ITEM_ALPHA_NEARSPAWN = 0.2;
const float ITEM_ALPHA_OPAQUE = 1.0;
-
-const string ITEM_SOUND_SPAWN = "cev/items/respawn.ogg";
-#endif
-
-//======================================================================
-// fields
-//======================================================================
-
-#ifdef SSQC
-.vector particles_offset;
#endif
//======================================================================
@@ -61,10 +51,10 @@ void() base_item_neteval;
#ifdef SSQC
// BASE_ITEM_INVENTORY_ADD(from, to)
// BASE_ITEM_INVENTORY_REMOVE(holder)
-// BASE_ITEM_PICKUPMESSAGE(p, i, chan)
+// BASE_ITEM_PICKUPMESSAGE(p, i)
// BASE_ITEM_CHECKREMOVE(bic_item, sp_wait, dm_wait)
// BASE_ITEM_THROW_ROTATION(ent, item)
-void(entity actor) base_item_drop_stuff;
+void(float old, float new) base_item_contentstransition;
float() base_item_touch_projectile;
float(entity item, float delay_sp, float delay_dm) base_item_check_respawn;
void() base_item_think_respawn;
@@ -73,6 +63,7 @@ void() base_item_think_rhull;
void() base_item_think_throwgroundcheck;
void() base_item_think_place;
void() base_item_use_delayspawn;
+entity(float idx, vector org, vector vel, float fl) spawn_base_item;
// BASE_ITEM_PREINIT(func)
void(string key, string value) base_item_init_field;
#endif
@@ -115,12 +106,10 @@ strip void() base_item;
{ \
if (self.solid) \
{ \
- if (self.pos1 || self.pos2) \
- setsize (self, self.pos1, \
- self.pos2); \
- else \
- setsize (self, self.mins, \
- self.maxs); \
+ local item_info_t iit = \
+ item_info[self.weapon]; \
+ setsize (self, iit.world_mins, \
+ iit.world_maxs); \
} \
else \
{ \
@@ -137,6 +126,11 @@ strip void() base_item;
if (!self.modelindex)
return PREDRAW_NEXT;
+ // interpolate origin -- see base_entities.qc -- CEV
+ BASE_ENTITY_LERP_ORIGIN (self,
+ self.origin_net, self.origin_prev, pmovelatesttime,
+ self.origin_net_time, self.origin_prev_time)
+
if (self.modelflags & MF_ROTATE)
{
// this item is flagged to automatically rotate -- CEV
@@ -152,18 +146,25 @@ strip void() base_item;
{
// interpolate angles -- see base_entities.qc -- CEV
BASE_ENTITY_LERP_ANGLES (self,
- self.angles_net, self.angles_prev, time,
+ self.angles_net, self.angles_prev,
+ pmovelatesttime,
self.angles_net_time, self.angles_prev_time)
}
- // interpolate origin -- see base_entities.qc -- CEV
- BASE_ENTITY_LERP_ORIGIN (self,
- self.origin_net, self.origin_prev, time,
- self.origin_net_time, self.origin_prev_time)
+ if (self.effects & EF_REDTINT)
+ {
+ self.colormod = '1.0 0 0';
+ self.effects &= ~EF_REDTINT;
+ }
+ else if (self.colormod)
+ {
+ self.colormod = '0 0 0';
+ }
// draw this entity -- CEV
addentity (self);
+ // rewind to last known server origin -- CEV
setorigin (self, self.origin_net);
// go to next without auto-drawing this entity -- CEV
@@ -205,14 +206,14 @@ strip void() base_item;
/* { */ \
switch (to.weapon) \
{ \
- case 1: to.inventory1 = from.weapon; break; \
- case 2: to.inventory2 = from.weapon; break; \
- case 3: to.inventory3 = from.weapon; break; \
- case 4: to.inventory4 = from.weapon; break; \
- case 5: to.inventory5 = from.weapon; break; \
- case 6: to.inventory6 = from.weapon; break; \
- case 7: to.inventory7 = from.weapon; break; \
- case 8: to.inventory8 = from.weapon; break; \
+ case 1: to.item[0] = from.weapon; break; \
+ case 2: to.item[1] = from.weapon; break; \
+ case 3: to.item[2] = from.weapon; break; \
+ case 4: to.item[3] = from.weapon; break; \
+ case 5: to.item[4] = from.weapon; break; \
+ case 6: to.item[5] = from.weapon; break; \
+ case 7: to.item[6] = from.weapon; break; \
+ case 8: to.item[7] = from.weapon; break; \
} \
/* } */
@@ -221,24 +222,25 @@ strip void() base_item;
/* { */ \
switch (holder.weapon) \
{ \
- case 1: holder.inventory1 = ITEM_SEQ_HANDS; break; \
- case 2: holder.inventory2 = ITEM_SEQ_HANDS; break; \
- case 3: holder.inventory3 = ITEM_SEQ_HANDS; break; \
- case 4: holder.inventory4 = ITEM_SEQ_HANDS; break; \
- case 5: holder.inventory5 = ITEM_SEQ_HANDS; break; \
- case 6: holder.inventory6 = ITEM_SEQ_HANDS; break; \
- case 7: holder.inventory7 = ITEM_SEQ_HANDS; break; \
- case 8: holder.inventory8 = ITEM_SEQ_HANDS; break; \
+ case 1: holder.item[0] = ITEM_SEQ_HANDS; break; \
+ case 2: holder.item[1] = ITEM_SEQ_HANDS; break; \
+ case 3: holder.item[2] = ITEM_SEQ_HANDS; break; \
+ case 4: holder.item[3] = ITEM_SEQ_HANDS; break; \
+ case 5: holder.item[4] = ITEM_SEQ_HANDS; break; \
+ case 6: holder.item[5] = ITEM_SEQ_HANDS; break; \
+ case 7: holder.item[6] = ITEM_SEQ_HANDS; break; \
+ case 8: holder.item[7] = ITEM_SEQ_HANDS; break; \
} \
/* } */
//--------------------------------------------------------------
- #define BASE_ITEM_PICKUPMESSAGE(p, i, chan) \
+ #define BASE_ITEM_PICKUPMESSAGE(p, i) \
/* { */ \
/* item touch message */ \
sprint (p, sprintf("%s got the %s!\n", p.netname, i.name)); \
/* item touch sound */ \
- sound (p, chan, i.pickup_sound, i.pickup_vol, ATTN_NORM); \
+ sound (p, i.pickup_sound.channel, i.pickup_sound.wav, \
+ i.pickup_sound.volume, i.pickup_sound.attenuation); \
/* item touch screenflash */ \
stuffcmd (p, "bf\n"); \
/* } */
@@ -296,77 +298,26 @@ strip void() base_item;
} \
/* } */
- //==============================================================
- // Static Helper Functions
- //==============================================================
-
//--------------------------------------------------------------
- // DropStuff -- dumptruck_ds
- // set drops_item on a monster to a number:
- //
- // 1 = Silver Key
- // 2 = Gold Key
- // 3 = Health Vial
- // 4 = Armor Shard
- // 5 = Health Vial & Armor Shard
- // 6 = random combination of 3 Vials and/or Shards
- //
- // TODO CEV this should probably be outside of base_item
- //--------------------------------------------------------------
- void(entity actor) base_item_drop_stuff =
+ void(float old, float new) base_item_contentstransition =
{
- switch (actor.drop_item)
+ dprint (sprintf("base_item_contentstransition: class %s, "
+ "old %g, new %g\n", self.classname, old, new));
+
+ if (self.swim_time >= time)
+ return;
+
+ if (new <= CONTENT_WATER && old == CONTENT_EMPTY)
{
- case 0:
- // drop nothing
- break;
- case 1:
- item_key1_drop (actor);
- break;
- case 2:
- item_key2_drop (actor);
- break;
- case 3:
- item_health_vial_drop (actor);
- break;
- case 4:
- item_armor_shard_drop (actor);
- break;
- case 5:
- item_health_vial_drop (actor);
- item_armor_shard_drop (actor);
- break;
- case 6:
- local float rand_drop = rint(random() * 3);
- if (rand_drop == 1)
- {
- item_armor_shard_drop (actor);
- item_health_vial_drop (actor);
- item_health_vial_drop (actor);
- }
- else if (rand_drop == 2)
- {
- item_armor_shard_drop (actor);
- item_armor_shard_drop (actor);
- item_health_vial_drop (actor);
- }
- else if (rand_drop == 0)
- {
- item_armor_shard_drop (actor);
- item_armor_shard_drop (actor);
- item_armor_shard_drop (actor);
- }
- else
- {
- item_health_vial_drop (actor);
- item_health_vial_drop (actor);
- item_health_vial_drop (actor);
- }
- break;
- default:
- dprint (sprintf("base_item_drop_stuff: "
- "unhandled drop_item %g\n",
- actor.drop_item));
+ // just crossed into water
+ self.swim_time = time + 2;
+ SOUND_RDELAY (self, snd_misc_h2ohit)
+ }
+ else if (old != CONTENT_EMPTY)
+ {
+ // just crossed into open
+ self.swim_time = time + 2;
+ SOUND_RDELAY (self, snd_misc_h2ohit)
}
};
@@ -405,7 +356,7 @@ strip void() base_item;
other.classname, self.velocity));
if (other.classtype == CT_WORLD) {
- if (self.velocity_z < 0)
+ if (self.velocity.z < 0)
{
base_entity_aligntoground (self);
} }
@@ -449,6 +400,8 @@ strip void() base_item;
float(entity item, float delay_sp, float delay_dm)
base_item_check_respawn =
{
+ local item_info_t iit = item_info[item.weapon];
+
// DM rules first
if (deathmatch == 1)
{
@@ -467,7 +420,8 @@ strip void() base_item;
}
item.nextthink = time + delay_dm;
- setmodel (item, item.mdl);
+ setmodel (item, iit.world_model);
+ setsize (item, iit.world_mins, iit.world_maxs);
return FALSE;
}
@@ -528,7 +482,8 @@ strip void() base_item;
}
}
- setmodel (item, item.mdl);
+ setmodel (item, iit.world_model);
+ setsize (item, iit.world_mins, iit.world_maxs);
return FALSE;
};
@@ -541,24 +496,26 @@ strip void() base_item;
//--------------------------------------------------------------
void() base_item_think_respawn =
{
+ local item_info_t iit = item_info[self.weapon];
+
// restore original model
- self.model = self.mdl;
+ self.model = iit.world_model;
self.alpha = ITEM_ALPHA_OPAQUE;
setmodel (self, self.model);
+ setsize (self, iit.world_mins, iit.world_maxs);
// allow it to be touched again
self.solid = SOLID_TRIGGER;
self.flags |= FL_FINDABLE_NONSOLID;
// guarantee size -- CEV
- if (self.pos1 || self.pos2)
- setsize (self, self.pos1, self.pos2);
+ setsize (self, iit.world_mins, iit.world_maxs);
// relink -- CEV
setorigin (self, self.origin);
// new respawning effects -- CEV
- sound (self, CHAN_VOICE, ITEM_SOUND_SPAWN, VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_item_respawn)
// make sure the client knows -- CEV
self.SendFlags |= NETFLAG_BASE_ENTITY_MODEL |
@@ -583,10 +540,8 @@ strip void() base_item;
dprint ("base_item_think_rhull: fix for bboxes\n");
// dumptruck_ds -- fix for bounding boxes
- if (self.pos1 || self.pos2)
- setsize (self, self.pos1, self.pos2);
- else
- setsize (self, '0 0 0', '32 32 56');
+ local item_info_t iit = item_info[self.weapon];
+ setsize (self, iit.world_mins, iit.world_maxs);
self.movetype = MOVETYPE_NONE;
self.velocity = '0 0 0';
@@ -598,19 +553,27 @@ strip void() base_item;
{
if (self.flags & FL_ONGROUND)
{
+ dprint (sprintf("base_item_think_throwgroundcheck: "
+ "onground at %g, owner %s\n",
+ time, self.owner.classname));
+
// yaw to 0 (so the bbox will fit the item) -- CEV
if (!(self.classgroup & CG_CORPSE))
if (self.angles_y)
self.angles_y = 0;
// return to original size -- CEV
- if (self.pos1 || self.pos2)
- setsize (self, self.pos1, self.pos2);
+ local item_info_t iit = item_info[self.weapon];
+ setsize (self, iit.world_mins, iit.world_maxs);
// remove from frametick que if needed -- CEV
if (self.classgroup & CG_FRAMETICK)
self.classgroup &= ~CG_FRAMETICK;
+ // clear owner (if we have one) -- CEV
+ if (self.owner)
+ self.owner = world;
+
// stop moving, thinking, & return to non-solid -- CEV
self.velocity = '0 0 0';
self.avelocity = '0 0 0';
@@ -627,22 +590,25 @@ strip void() base_item;
*/
// manage rotation towards center -- CEV
- if (self.angles_y)
+ if (!(self.classgroup & CG_CORPSE))
{
- if (self.avelocity_y > 0)
+ if (self.angles_y)
{
- if (self.angles_y > 0)
+ if (self.avelocity_y > 0)
{
- self.angles_y = 0;
- self.avelocity_y = 0;
+ if (self.angles_y > 0)
+ {
+ self.angles_y = 0;
+ self.avelocity_y = 0;
+ }
}
- }
- else
- {
- if (self.angles_y < 0)
+ else
{
- self.angles_y = 0;
- self.avelocity_y = 0;
+ if (self.angles_y < 0)
+ {
+ self.angles_y = 0;
+ self.avelocity_y = 0;
+ }
}
}
}
@@ -664,11 +630,8 @@ strip void() base_item;
// so findradius can find it -- CEV
self.flags |= FL_FINDABLE_NONSOLID;
- // make extra wide
- self.flags |= FL_ITEM;
-
- // so it can be restored on respawn
- self.mdl = self.model;
+ // don't make extra wide, it interferes w/tracelines -- CEV
+ // self.flags |= FL_ITEM;
if (!(self.spawnflags & SPAWNFLAG_ITEM_THROWN))
{
@@ -677,17 +640,13 @@ strip void() base_item;
}
// guarantee size -- CEV
- if (!self.pos1 && !self.pos2)
- {
- self.pos1 = '0 0 0';
- self.pos2 = '32 32 56';
- }
+ local item_info_t iit = item_info[self.weapon];
if (self.spawnflags & SPAWNFLAG_ITEM_THROWN)
{
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_TOSS;
- setsize (self, self.pos1, self.pos2);
+ setsize (self, iit.world_mins, iit.world_maxs);
setorigin (self, self.origin);
// add to frametick queue -- CEV
@@ -704,13 +663,13 @@ strip void() base_item;
dprint (sprintf("base_item_think_place: spawned "
"suspended item %s at %v\n",
self.classname, self.origin));
- setsize (self, self.pos1, self.pos2);
+ setsize (self, iit.world_mins, iit.world_maxs);
self.solid = SOLID_TRIGGER;
self.movetype = MOVETYPE_FLY;
}
else
{
- setsize (self, self.pos1, self.pos2);
+ setsize (self, iit.world_mins, iit.world_maxs);
// The following hack for item_health was inherited
// from the RMQ code, and was here when the
@@ -767,8 +726,7 @@ strip void() base_item;
if (self.spawnflags & SPAWNFLAG_ITEM_SPAWNED)
{
// SPAWNED, gb
- self.pos1 = self.mins;
- self.pos2 = self.maxs;
+ setsize (self, '0 0 0', '0 0 0');
self.model = "";
self.solid = SOLID_NOT;
@@ -780,6 +738,10 @@ strip void() base_item;
self.use = base_item_use_delayspawn;
}
+ // manage watertype and waterlevel -- CEV
+ self.watertype = self.owner.watertype;
+ self.contentstransition = base_item_contentstransition;
+
self.SendEntity = base_entity_netsend;
self.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
};
@@ -791,14 +753,16 @@ strip void() base_item;
//--------------------------------------------------------------
void() base_item_use_delayspawn =
{
+ local item_info_t iit = item_info[self.weapon];
+
self.solid = SOLID_TRIGGER;
self.flags |= FL_FINDABLE_NONSOLID;
- setmodel (self, self.mdl);
- setsize (self, self.pos1, self.pos2);
+ setmodel (self, iit.world_model);
+ setsize (self, iit.world_mins, iit.world_maxs);
if (!(self.spawnflags & SPAWNFLAG_ITEM_SPAWNSILENT))
// SILENT, gb
- spawn_tfog (self.origin + self.particles_offset);
+ spawn_tfog (self.origin + self.view_ofs);
if (self.spawnflags & SPAWNFLAG_ITEM_SUSPENDED)
self.movetype = MOVETYPE_FLY;
@@ -813,6 +777,94 @@ strip void() base_item;
//==============================================================
//--------------------------------------------------------------
+ // generic item spawn function - args are item_index, origin,
+ // velocity, and spawnflags -- CEV
+ //
+ // 'self' is assumed to be the source/owner entity -- CEV
+ //--------------------------------------------------------------
+ entity(float idx, vector org, vector vel, float fl) spawn_base_item =
+ {
+ // some item types need special handling -- CEV
+ if (idx >= ITEM_SEQ_PACKS_START && idx <= ITEM_SEQ_PACKS_END)
+ {
+ // backpacks
+ return spawn_item_backpack (self, org, vel);
+ }
+ else if (idx >= ITEM_SEQ_THROWABLE_START &&
+ idx <= ITEM_SEQ_THROWABLE_END)
+ {
+ // throwables
+ return spawn_base_item_throwable (idx, org, vel, fl);
+ }
+
+ // spawn an entity and set it up -- CEV
+ local entity e = spawn ();
+ e.owner = self;
+ e.spawnflags = fl;
+ e.origin = org;
+ e.velocity = vel;
+ e.weapon = idx;
+
+ // map item_index to a spawn function -- CEV
+ switch (idx)
+ {
+ case ITEM_SEQ_SHOTGUN:
+ case ITEM_SEQ_SUPERSHOTGUN:
+ case ITEM_SEQ_NAILGUN:
+ case ITEM_SEQ_SUPERNAILGUN:
+ case ITEM_SEQ_GRENADELAUNCHER:
+ case ITEM_SEQ_ROCKETLAUNCHER:
+ case ITEM_SEQ_LIGHTNINGGUN:
+ base_item_weapon_init (e); break;
+ case ITEM_SEQ_AMMO_SHELLS_LARGE:
+ e.spawnflags |= SPAWNFLAG_ITEM_AMMO_LARGE_BOX;
+ case ITEM_SEQ_AMMO_SHELLS_SMALL:
+ base_item_ammo_init (e); break;
+ case ITEM_SEQ_AMMO_NAILS_LARGE:
+ e.spawnflags |= SPAWNFLAG_ITEM_AMMO_LARGE_BOX;
+ case ITEM_SEQ_AMMO_NAILS_SMALL:
+ base_item_ammo_init (e); break;
+ case ITEM_SEQ_AMMO_ROCKETS_LARGE:
+ e.spawnflags |= SPAWNFLAG_ITEM_AMMO_LARGE_BOX;
+ case ITEM_SEQ_AMMO_ROCKETS_SMALL:
+ base_item_ammo_init (e); break;
+ case ITEM_SEQ_AMMO_CELLS_LARGE:
+ e.spawnflags |= SPAWNFLAG_ITEM_AMMO_LARGE_BOX;
+ case ITEM_SEQ_AMMO_CELLS_SMALL:
+ base_item_ammo_init (e); break;
+ case ITEM_SEQ_ARMOR_GREEN:
+ case ITEM_SEQ_ARMOR_YELLOW:
+ case ITEM_SEQ_ARMOR_RED:
+ case ITEM_SEQ_ARMOR_SHARD:
+ base_item_armor_init (e); break;
+ case ITEM_SEQ_HEALTH_MEGA:
+ e.spawnflags |= SPAWNFLAG_ITEM_HEALTH_MEGA;
+ base_item_health_init (e); break;
+ case ITEM_SEQ_HEALTH_ROTTEN:
+ e.spawnflags |= SPAWNFLAG_ITEM_HEALTH_ROTTEN;
+ base_item_health_init (e); break;
+ case ITEM_SEQ_HEALTH:
+ case ITEM_SEQ_HEALTH_VIAL:
+ base_item_health_init (e); break;
+ case ITEM_SEQ_ARTIFACT_ENVIROSUIT:
+ case ITEM_SEQ_ARTIFACT_INVISIBILITY:
+ case ITEM_SEQ_ARTIFACT_INVULNERABILITY:
+ case ITEM_SEQ_ARTIFACT_QUAD:
+ base_item_powerup_init (e); break;
+ case ITEM_SEQ_TORCH:
+ item_torch_init (e); break;
+ default:
+ objerror (sprintf("spawn_base_item: "
+ "unknown item type %g!\n", idx));
+ remove (e);
+ return __NULL__;
+ }
+
+ // now return our (hopefully initialized) new entity -- CEV
+ return e;
+ }
+
+ //--------------------------------------------------------------
// pre-initialization macro. remap spawnflags for known releases,
// check spawnflags to inhibit spawn, then loop over spawndata
// if necessary -- CEV
@@ -870,6 +922,10 @@ strip void() base_item;
self.spawnflags |=
SPAWNFLAG_ITEM_RESPAWN;
break;
+ case "particles_offset":
+ // remap to view_ofs -- CEV
+ if (!self.view_ofs)
+ self.view_ofs = stov (value);
}
};
#endif
@@ -881,13 +937,17 @@ strip void() base_item;
base_mapentity_init (e);
e.classgroup |= CG_ITEM;
+ e.stateflags |= STATE_PUSHABLE | STATE_TELEPORTABLE;
+
#ifdef CSQC
- setsize (e, e.pos1, e.pos2);
+ local item_info_t iit = item_info[e.weapon];
+
+ setsize (e, iit.world_mins, iit.world_maxs);
setorigin (e, e.origin);
- // let the server run physics (toss) for items -- CEV
- e.movetype = MOVETYPE_NONE;
e.drawmask = DRAWMASK_NORMAL;
e.predraw = base_item_predraw;
+ // make sure MOVE_EVERYTHING traces will hit items -- CEV
+ e.flags |= FL_FINDABLE_NONSOLID;
#endif
#ifdef SSQC
Return to the top of this page or return to the overview of this repo.
Diff qc/base_monster.qc
diff --git a/qc/base_monster.qc b/qc/base_monster.qc
index c289869..52289db 100644
--- a/qc/base_monster.qc
+++ b/qc/base_monster.qc
@@ -13,7 +13,6 @@
typedef enumflags
{
SPAWNFLAG_MONSTER_TELEWAIT = 8, // teleport-wait enemy
- SPAWNFLAG_MONSTER_BERSERK = 16, // was .berserk -- CEV
SPAWNFLAG_MONSTER_NO_SIGHT_SOUND = 32, // no alert sound
SPAWNFLAG_MONSTER_PASSIVE_UNTIL_ATTACKED = 64,
SPAWNFLAG_MONSTER_PASSIVE_ALWAYS = 128,
@@ -107,20 +106,17 @@ entity sight_entity; // was in ai.qc
#if defined(CSQC) || defined(SSQC)
.float air_finished; // when time > air_finished, drown
+.float pain_finished; // for timing pain sounds -- CEV
+.float swim_time; // monster swimming sound flag
#endif
#ifdef SSQC
-.float attack_elevation; // Preach's Z-aware nades -- CEV
.float attack_state;
-.float berserk; // dumptruck_ds
-.float drop_item; // key DropStuff
-.float infight_mode;
-.float keep_ammo; // dumptruck_ds
+.float infight_mode; // TODO CEV
+.float keep_ammo; // dumptruck_ds TODO CEV
.float pain_threshold; // dumptruck_ds
.float pausetime;
.float search_time;
-.float sight_trigger; // dumptruck_ds
-.float swim_time; // monster swimming sound flag
-.float touch_time;
+.float sight_trigger; // dumptruck_ds TODO CEV
#endif
#ifdef SSQC
@@ -139,7 +135,6 @@ entity sight_entity; // was in ai.qc
#ifdef SSQC
.float() checkattack; // per-monster CheckAttack -- CEV
-.void(float old, float new) contentstransition; // liquid -> air and reverse
.void() sightsound; // per-monster SightSound -- CEV
#endif
@@ -173,6 +168,8 @@ void(vector org, vector dir, float damage, float projspeed)
void(vector org, vector dir) base_monster_fire_voreball;
void() base_monster_fire_wizardspell;
void(vector offset, float elevation) base_monster_fire_zombiechunk;
+void(entity e, float item_index) base_monster_item_add; // monster item handling
+void(vector dir) base_monster_item_dropitems; // spawn items on death -- CEV
void() base_monster_liquiddamage; // monster AI
void(float old, float new) base_monster_contentstransition;
float() ai_checkattack;
@@ -317,6 +314,7 @@ void(float n) monster_update_total =
else \
setsize (self, '0 0 0', '0 0 0'); \
} \
+ setorigin (self, self.origin_net); \
} \
if (self.frame_net != self.frame || isnew) \
{ \
@@ -337,7 +335,10 @@ void(float n) monster_update_total =
{
// interpolate frame
if (self.lerptime)
+ {
self.lerpfrac = 1 - (time - self.lerptime) * 10;
+ self.lerpfrac = max (0, self.lerpfrac);
+ }
}
// interpolate angles -- see base_entities.qc -- CEV
@@ -381,8 +382,7 @@ void(float n) monster_update_total =
local vector dir, ang;
self.effects = self.effects | EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "weapons/spike2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_supernailgun)
// make angles out of the current displacement vector...
ang = vectoangles (self.enemy.origin - self.origin);
@@ -399,8 +399,7 @@ void(float n) monster_update_total =
// f*cking hack...is this a v_forward problem?
dir_z *= -1;
// SetSpeed -- CEV
- dir *= min (projspeed * (self.proj_speed_mod ?
- self.proj_speed_mod : 1), world_maxvelocity);
+ dir *= min (projspeed, world_maxvelocity);
spawn_projectile_flak (self, org, dir);
flakcount -= 1;
@@ -413,11 +412,10 @@ void(float n) monster_update_total =
void(vector org, float direct, float splash, float elevation)
base_monster_fire_grenade =
{
- local vector missile_velocity = '0 0 0';
+ local vector vel = '0 0 0';
- self.effects = self.effects | EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "weapons/grenade.wav",
- VOL_HIGH, ATTN_NORM);
+ self.effects |= EF_MUZZLEFLASH;
+ SOUND (self, snd_weapon_grenadelauncher)
// set missile speed
if (elevation)
@@ -425,25 +423,22 @@ void(float n) monster_update_total =
local vector ang = self.angles;
ang_x = -elevation;
makevectors (ang);
- missile_velocity = v_forward * GRENADE_SPEED;
+ vel = v_forward * GRENADE_SPEED;
}
else
{
- missile_velocity =
- normalize (self.enemy.origin - self.origin);
- missile_velocity *= 600;
- missile_velocity_z = 200;
+ vel = normalize (self.enemy.origin - self.origin);
+ vel *= 600;
+ vel_z = 200;
}
- // TODO CEV pass direct and splash damage?
- spawn_projectile_grenade (self, org, missile_velocity);
+ spawn_projectile_grenade (self, org, vel);
};
//--------------------------------------------------------------
void() base_monster_fire_tribolt =
{
- sound (self, CHAN_WEAPON, "weapons/grenade.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenadelauncher)
spawn_projectile_bolt (self, 0);
spawn_projectile_bolt (self, BOLT_FIRING_DELAY);
@@ -458,12 +453,10 @@ void(float n) monster_update_total =
// set missile speed
dir = normalize (v_forward);
dir_z = 0 - dir_z + (random() - 0.5) * 0.1;
- dir *= min (HKNSPELL_SPEED * (self.proj_speed_mod ?
- self.proj_speed_mod : 1), world_maxvelocity);
+ dir *= HKNSPELL_SPEED;
spawn_projectile_hknightspell (self, org, dir, off);
- sound (self, CHAN_WEAPON, "hknight/attack1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_hknight_attack)
};
//--------------------------------------------------------------
@@ -472,13 +465,11 @@ void(float n) monster_update_total =
void(vector org, vector dir) base_monster_fire_laser =
{
self.effects = self.effects | EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "enforcer/enfire.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_enforcer_fire)
dir = normalize (dir);
// SetSpeed (newmis, vec, projspeed);
- dir *= min (LASER_SPEED * (self.proj_speed_mod ?
- self.proj_speed_mod : 1), world_maxvelocity);
+ dir *= LASER_SPEED;
spawn_projectile_laser (self, org, dir);
};
@@ -489,8 +480,7 @@ void(float n) monster_update_total =
{
dir = normalize (dir);
// SetSpeed
- dir *= min (projspeed * (self.proj_speed_mod ?
- self.proj_speed_mod : 1), world_maxvelocity);
+ dir *= min (projspeed, world_maxvelocity);
spawn_projectile_lavaball (self, org, dir);
};
@@ -502,8 +492,7 @@ void(float n) monster_update_total =
{
local vector missile_velocity;
- sound (self, CHAN_WEAPON, "weapons/grenade.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenadelauncher)
// set missile speed
missile_velocity = normalize (self.enemy.origin - self.origin);
@@ -519,17 +508,14 @@ void(float n) monster_update_total =
float projspeed) base_monster_fire_rocket =
{
self.effects = self.effects | EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "weapons/sgun1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_rocketlauncher)
dir = normalize (dir);
// SetSpeed
- dir *= min (projspeed * (self.proj_speed_mod ?
- self.proj_speed_mod : 1), world_maxvelocity);
-
+ dir *= min (projspeed, world_maxvelocity);
// TODO CEV pass direct & splash damage?
- spawn_projectile_rocket (self, org, dir, projspeed);
+ spawn_projectile_rocket (self, org, dir);
};
//--------------------------------------------------------------
@@ -557,10 +543,9 @@ void(float n) monster_update_total =
{
dir = normalize (dir);
// SetSpeed
- dir *= min (projspeed * (self.proj_speed_mod ?
- self.proj_speed_mod : 1), world_maxvelocity);
+ dir *= min (projspeed, world_maxvelocity);
- spawn_projectile_spike (self, org, dir, damage, projspeed);
+ spawn_projectile_spike (self, org, dir, damage);
};
//--------------------------------------------------------------
@@ -568,23 +553,20 @@ void(float n) monster_update_total =
//--------------------------------------------------------------
void(vector org, vector dir) base_monster_fire_voreball =
{
- local float basespeed;
+ local float turnspeed;
- self.effects = self.effects | EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "shalrath/attack2.wav",
- VOL_HIGH, ATTN_NORM);
+ self.effects |= EF_MUZZLEFLASH;
+ SOUND (self, snd_shalrath_attack_02)
dir = normalize (dir);
- // SetSpeed
- dir *= min (VOREBALL_SPEED * self.proj_speed_mod,
- world_maxvelocity);
+ dir *= VOREBALL_SPEED;
if (skill == 3)
- basespeed = 350 * self.proj_speed_mod;
+ turnspeed = 350;
else
- basespeed = 250 * self.proj_speed_mod;
+ turnspeed = 250;
- spawn_projectile_voreball (self, org, dir, basespeed);
+ spawn_projectile_voreball (self, org, dir, turnspeed);
};
//--------------------------------------------------------------
@@ -617,8 +599,7 @@ void(float n) monster_update_total =
{
local vector vel = '0 0 0';
- sound (self, CHAN_WEAPON, "zombie/z_shot1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_shot)
// set missile speed
if (elevation)
@@ -646,6 +627,97 @@ void(float n) monster_update_total =
};
//==============================================================
+ // Monster Item Handling
+ //==============================================================
+
+ //--------------------------------------------------------------
+ // add item_index to the first empty item slot -- CEV
+ //--------------------------------------------------------------
+ void(entity e, float item_index) base_monster_item_add =
+ {
+ for (float i = 0; i < BASE_ENTITY_ITEMLEN; i++)
+ {
+ // is there an item in this slot? if yes, skip -- CEV
+ if (e.item[i])
+ continue;
+
+ // add the specified item & stop the loop -- CEV
+ e.item[i] = item_index;
+ break;
+ }
+ };
+
+ //--------------------------------------------------------------
+ // loop over self.item[] and spawn anything contained -- CEV
+ // 'self' in this context is the entity dropping items -- CEV
+ //--------------------------------------------------------------
+ void(vector dir) base_monster_item_dropitems =
+ {
+ var float i, item_index;
+ var vector org = '0 0 0';
+ var vector vel = '0 0 0';
+
+ // now drop normal items -- CEV
+ for (i = 0; i < BASE_ENTITY_ITEMLEN; i++)
+ {
+ item_index = self.item[i];
+
+ if (item_index == 0 || item_index == __NULL__)
+ continue;
+
+ if (item_index >= ITEM_SEQ_GIBS_START &&
+ item_index <= ITEM_SEQ_GIBS_END)
+ {
+ // skip spawning gibs if not gibbed -- CEV
+ if (!(self.deadflag & DF_GIBBED))
+ continue;
+ }
+
+ if (item_index >= ITEM_SEQ_PACKS_START &&
+ item_index <= ITEM_SEQ_PACKS_END)
+ {
+ // skip spawning packs if gibbed -- CEV
+ if (self.deadflag & DF_GIBBED)
+ continue;
+
+ if (self.ammo_rockets + self.ammo_shells +
+ self.ammo_nails + self.ammo_cells <= 0)
+ {
+ // nothing in the pack, empty the slot
+ // and continue -- CEV
+ dprint ("base_monster_item_dropitems: "
+ "empty pack!\n");
+ self.item[i] = 0;
+ continue;
+ }
+
+ // original id1 formula for backpack origin
+ // and velocity -- CEV
+ org = self.origin - '0 0 24';
+ vel_x = -100 + (random() * 200);
+ vel_y = -100 + (random() * 200);
+ vel_z = 300;
+ }
+ else
+ {
+ org = self.origin;
+ vel = velocity_for_damage (dir, self.health);
+ }
+
+ #ifdef DEBUG
+ dprint (sprintf("base_monster_item_dropitems: "
+ "spawning %g for entity type %s\n",
+ item_index, self.classname));
+ #endif
+
+ spawn_base_item (item_index, org, vel,
+ SPAWNFLAG_ITEM_THROWN);
+
+ self.item[i] = 0;
+ }
+ };
+
+ //==============================================================
// Monster AI
//==============================================================
@@ -655,11 +727,11 @@ void(float n) monster_update_total =
//--------------------------------------------------------------
void() base_monster_liquiddamage =
{
- if (self.conlevel == WATERLEVEL_NONE)
+ if (self.waterlevel == WATERLEVEL_NONE)
return;
- if (self.contype == CONTENT_WATER &&
- self.conlevel > WATERLEVEL_WAIST &&
+ if (self.watertype == CONTENT_WATER &&
+ self.waterlevel > WATERLEVEL_WAIST &&
self.air_finished < time)
{
if (self.classtype == CT_MONSTER_ZOMBIE)
@@ -675,7 +747,7 @@ void(float n) monster_update_total =
self.pain_finished = time + 1;
}
}
- else if (self.contype == CONTENT_LAVA)
+ else if (self.watertype == CONTENT_LAVA)
{
// monsters damaged by lava
if (self.damage_time < time)
@@ -692,7 +764,7 @@ void(float n) monster_update_total =
self.deathtype = "";
}
}
- else if (self.contype == CONTENT_SLIME)
+ else if (self.watertype == CONTENT_SLIME)
{
if (self.classtype == CT_MONSTER_ZOMBIE)
// zombies aren't damaged by slime
@@ -712,14 +784,29 @@ void(float n) monster_update_total =
};
//--------------------------------------------------------------
- // a no-op to prevent the engine from playing h2ohit1.wav when
- // an entity enters water -- CEV
+ // replacement for the standard entering/exiting water behavior -- CEV
//--------------------------------------------------------------
void(float old, float new) base_monster_contentstransition =
{
dprint (sprintf("base_monster_contentstransition: "
"entering; self %s, old %g, new %g\n",
self.classname, old, new));
+
+ if (self.swim_time >= time)
+ return;
+
+ if (new <= CONTENT_WATER && old == CONTENT_EMPTY)
+ {
+ // just crossed into water
+ self.swim_time = time + 2;
+ SOUND_RDELAY (self, snd_misc_h2ohit)
+ }
+ else if (old != CONTENT_EMPTY)
+ {
+ // just crossed into open
+ self.swim_time = time + 2;
+ // no sound here when exiting water -- CEV
+ }
};
//--------------------------------------------------------------
@@ -1307,7 +1394,8 @@ void(float n) monster_update_total =
self.ideal_yaw = enemy_yaw;
changeyaw ();
- if (self.lefty)
+
+ if (self.stateflags & STATE_LEFTY)
ofs = 90;
else
ofs = -90;
@@ -1321,7 +1409,10 @@ void(float n) monster_update_total =
return;
}
- self.lefty = 1 - self.lefty;
+ if (self.stateflags & STATE_LEFTY)
+ self.stateflags &= ~STATE_LEFTY;
+ else
+ self.stateflags |= STATE_LEFTY;
walkmove (self.ideal_yaw - ofs, movedist);
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN_X |
@@ -1479,8 +1570,6 @@ void(float n) monster_update_total =
NETFLAG_BASE_ENTITY_ORIGIN_Y |
NETFLAG_BASE_ENTITY_ORIGIN_Z |
NETFLAG_BASE_ENTITY_ANGLES;
- // lose patience
- self.touch_time = self.touch_time - 0.1;
return;
}
@@ -1762,7 +1851,7 @@ void(float n) monster_update_total =
// you can add other stuff like pushable players/monsters here
// will do Kryten, thanks for the tip -- CEV
- // base_entity_push (self, other, PM_MAXSPEED);
+ base_entity_displace (self, other, PM_MAXSPEED);
// 1998-09-16 Sliding/not-jumping on monsters/boxes/players
// fix by Maddes/Kryten end
@@ -1889,17 +1978,27 @@ void(float n) monster_update_total =
switch (key)
{
case "berserk":
- local float zerk = stof (value);
+ var float zerk = stof (value);
if (zerk)
- self.spawnflags |=
- SPAWNFLAG_MONSTER_BERSERK;
+ self.stateflags |= STATE_NOPAIN;
+ break;
+ case "drop_item":
+ base_entity_init_drop_item (stof(value));
+ break;
+ case "projexpl":
+ self.style2 = stof (value);
break;
case "spawn_angry":
- local float angry = stof (value);
+ var float angry = stof (value);
if (angry)
self.spawnflags |=
SPAWNFLAG_MONSTER_ANGRY;
break;
+ case "waitmin":
+ var float waitmin = stof (value);
+ if (waitmin)
+ self.movetimer = waitmin;
+ break;
}
};
@@ -1956,9 +2055,8 @@ void(float n) monster_update_total =
void() base_monster_init_start =
{
#if 0
- dprint (sprintf("base_monster_init_start: "
- "initializing %s at %v\n",
- self.classname, self.origin));
+ dprint (sprintf("base_monster_init_start: initializing "
+ "%s at %v\n", self.classname, self.origin));
#endif
self.solid = SOLID_SLIDEBOX;
@@ -1976,6 +2074,7 @@ void(float n) monster_update_total =
setsize (self, self.mins, self.maxs);
self.flags |= FL_MONSTER;
+ self.stateflags |= STATE_PUSHABLE | STATE_TELEPORTABLE;
if (!(self.classgroup & CG_MONSTER_FLY) &&
!(self.classgroup & CG_MONSTER_SWIM))
@@ -2138,8 +2237,6 @@ void(float n) monster_update_total =
// generic flags & masks for the client side -- CEV
e.drawmask = DRAWMASK_NORMAL;
e.flags |= FL_MONSTER;
- e.movetype = MOVETYPE_NONE;
- e.solid = SOLID_SLIDEBOX;
// generic monster predraw (interpolates angles, origin, and
// frames). See above. -- CEV
@@ -2216,7 +2313,7 @@ void(float n) monster_update_total =
e.target = e.target2 = e.target3 = e.target4 = __NULL__;
// clear everything but destroy and think
- // leave e.destroy alone, the existing destroy will handle it
+ // leave e.th_destroy alone, the existing destroy will handle it
e.th_pain = sub_nullpain;
// leave e.think alone so e's animation can finish
e.touch = sub_null;
@@ -2250,4 +2347,3 @@ void(float n) monster_update_total =
};
// };
#endif
-
Return to the top of this page or return to the overview of this repo.
Diff qc/base_proj.qc
diff --git a/qc/base_proj.qc b/qc/base_proj.qc
index f47cecf..0d0ec34 100644
--- a/qc/base_proj.qc
+++ b/qc/base_proj.qc
@@ -14,8 +14,8 @@ order, for reference when writing a projectile constructor function
a. set PROJECTILE_EXPLOSIVE if necessary (parse_projexpl)
5. set health and takedamage if desired (for explosives)
6. angles (required) & avelocity
-7. check (and set if necessary) proj_basespeed
-8. check (and set if necessary) direct_damage and splash_damage
+7. check (and set if necessary) .speed
+8. check (and set if necessary) direct damage (dmg) and splash (dmg_splash)
9. setmodel and skin (required)
10. setup_homing
11. setsize, setorigin (required)
@@ -33,13 +33,13 @@ see the files in projectiles/ for examples -- CEV
typedef enum
{
EXPLOSION_THINK_1, // explosion frame/think tracking
- EXPLOSION_THINK_2,
- EXPLOSION_THINK_3,
+ EXPLOSION_THINK_2, // stored in .moveflags although
+ EXPLOSION_THINK_3, // these aren't really flags -- CEV
EXPLOSION_THINK_4,
EXPLOSION_THINK_5,
EXPLOSION_THINK_6,
EXPLOSION_THINK_REMOVE
-} base_explosion_states;
+} base_explosion_moveflags;
typedef enumflags
{
@@ -56,17 +56,10 @@ const float BP_BOUNCE_MIN_ZVEL = 60; // MOVETYPE_BOUNCE stop if _z less than
//======================================================================
#ifdef SSQC
-.float direct_damage; // for t_damage
-.float splash_damage; // for t_radiusdamage
-
// the following are really monster fields. they alter projectile
// behavior and get transferred to projectile objects so they're
// defined here -- CEV
.float homing; // projectile homing
-.float projexpl; // explosive?
-.float proj_speed_mod; // projectile speed modifier
-.float proj_basespeed; // projectile base speed
-.vector cust_avelocity; // projectile custom avelocity
#endif
//======================================================================
@@ -140,18 +133,18 @@ strip void() base_projectile_qcphys;
//--------------------------------------------------------------
void() base_explosion_think =
{
- if (self.state == EXPLOSION_THINK_REMOVE)
+ if (self.moveflags == EXPLOSION_THINK_REMOVE)
{
remove (self);
return;
}
- if (self.state == EXPLOSION_THINK_1)
+ if (self.moveflags == EXPLOSION_THINK_1)
self.frame = 0;
else
self.frame += 1;
- self.state += 1;
+ self.moveflags += 1;
self.nextthink = time + 0.1;
};
@@ -165,7 +158,7 @@ strip void() base_projectile_qcphys;
void(entity e) become_base_explosion =
{
e.customphysics = __NULL__;
- e.destroy = __NULL__;
+ e.th_destroy = __NULL__;
e.th_pain = __NULL__;
e.takedamage = DAMAGE_NO;
base_explosion_init (e);
@@ -192,7 +185,7 @@ strip void() base_projectile_qcphys;
e.classtype = CT_TEMP_EXPLOSION;
e.movetype = MOVETYPE_NONE;
e.solid = SOLID_NOT;
- e.state = EXPLOSION_THINK_1;
+ e.moveflags = EXPLOSION_THINK_1;
e.think = base_explosion_think;
e.touch = sub_null;
e.use = sub_null;
@@ -278,8 +271,7 @@ strip void() base_projectile_qcphys;
self.angles = vectoangles (dir);
// SetSpeed
- self.velocity = dir * min (self.proj_basespeed,
- world_maxvelocity);
+ self.velocity = dir * min (self.speed, world_maxvelocity);
if (self.homing > 0)
{
@@ -301,7 +293,7 @@ strip void() base_projectile_qcphys;
};
//--------------------------------------------------------------
- void(entity mis, float speed) base_projectile_setup_homing =
+ void(entity mis, float turn) base_projectile_setup_homing =
{
local vector dir;
local float dist, flytime, speedmod;
@@ -320,10 +312,8 @@ strip void() base_projectile_qcphys;
return;
}
- if (mis.owner.proj_speed_mod > 1)
- speedmod = 1 / mis.owner.proj_speed_mod;
- else if (speed > 250)
- speedmod = 1 / (speed / 250);
+ if (turn > 250)
+ speedmod = 1 / (turn / 250);
else
speedmod = 1;
@@ -333,13 +323,14 @@ strip void() base_projectile_qcphys;
if (flytime < 0.1)
flytime = 0.1;
- mis.proj_basespeed = speed;
+ mis.speed = turn;
mis.homing = mis.owner.homing;
mis.think = base_projectile_homing_think;
mis.nextthink = flytime + time;
- if (mis.owner.waitmin > 0)
+ // was .waitmin -- CEV
+ if (mis.owner && mis.owner.movetimer > 0)
// store time to start increasing
- mis.attack_finished = time + mis.owner.waitmin;
+ mis.attack_finished = time + mis.owner.movetimer;
};
//==============================================================
@@ -361,10 +352,10 @@ strip void() base_projectile_qcphys;
if (other.classtype == CT_MONSTER_SHAMBLER)
// mostly immune
t_damage2 (other, self, self.owner,
- self.direct_damage * 0.5);
+ self.dmg * 0.5);
else
t_damage2 (other, self, self.owner,
- self.direct_damage);
+ self.dmg);
else
other = world;
@@ -374,10 +365,9 @@ strip void() base_projectile_qcphys;
// don't do radius damage to the other, because all the damage
// was done in the impact
- t_radiusdamage2 (self, self.owner, self.splash_damage, other);
+ t_radiusdamage2 (self, self.owner, self.dmg_splash, other);
- // sound (self, CHAN_WEAPON, "weapons/r_exp3.wav",
- // VOL_HIGH, ATTN_NORM);
+ // SOUND (self, snd_weapon_rocket_explosion)
self.origin = self.origin - 8 * normalize (self.velocity);
// BecomeExplosion
@@ -393,8 +383,8 @@ strip void() base_projectile_qcphys;
// hit something that bleeds
if (other.takedamage)
{
- spawn_touchblood (self.direct_damage);
- t_damage2 (other, self, self.owner, self.direct_damage);
+ spawn_touchblood (self.dmg);
+ t_damage2 (other, self, self.owner, self.dmg);
}
else
{
@@ -454,11 +444,6 @@ strip void() base_projectile_qcphys;
base_tempentity_init (e);
e.classgroup |= CG_PROJECTILE;
-
- // default value for proj_speed_mod is 1 -- CEV
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
e.touch = base_projectile_touch;
};
@@ -540,8 +525,8 @@ strip void() base_projectile_qcphys;
self.solid = SOLID_NOT;
local entity oldother2 = other;
other = trace_ent;
- if (self.destroy)
- self.destroy ('0 0 0');
+ if (self.th_destroy)
+ self.th_destroy ('0 0 0');
else if (self.touch)
self.touch ();
else
Return to the top of this page or return to the overview of this repo.
Diff qc/base_trigger.qc
diff --git a/qc/base_trigger.qc b/qc/base_trigger.qc
index d1a521b..343efa8 100644
--- a/qc/base_trigger.qc
+++ b/qc/base_trigger.qc
@@ -13,9 +13,21 @@
//----------------------------------------------------------------------
typedef enumflags
{
- NETFLAG_BASE_TRIGGER_STATE,
- NETFLAG_BASE_TRIGGER_ESTATE
+ NETFLAG_BASE_TRIGGER_SPAWNFLAGS,// spawnflags for touch functions
+ NETFLAG_BASE_TRIGGER_STATEFLAGS,// stateflags for touch functions
+ NETFLAG_BASE_TRIGGER_SIZE, // mins & maxes
+ NETFLAG_BASE_TRIGGER_MANGLE, // directionality
+ NETFLAG_BASE_TRIGGER_MOVEDIR, // directionality (2)
+ NETFLAG_BASE_TRIGGER_NEWORIGIN, // used for push & tele destination
+ NETFLAG_BASE_TRIGGER_RESERVED1, // use as-needed in subclasses -- CEV
+ NETFLAG_BASE_TRIGGER_RESERVED2 // same as above
} base_trigger_netflags;
+
+const float NETFLAG_BASE_TRIGGER_FULLSEND = NETFLAG_BASE_TRIGGER_SPAWNFLAGS |
+ NETFLAG_BASE_TRIGGER_STATEFLAGS | NETFLAG_BASE_TRIGGER_SIZE |
+ NETFLAG_BASE_TRIGGER_MANGLE | NETFLAG_BASE_TRIGGER_MOVEDIR |
+ NETFLAG_BASE_TRIGGER_NEWORIGIN | NETFLAG_BASE_TRIGGER_RESERVED1 |
+ NETFLAG_BASE_TRIGGER_RESERVED2;
#endif
//======================================================================
@@ -23,10 +35,28 @@ typedef enumflags
//======================================================================
// base_trigger
+#ifdef CSQC
+// BASE_TRIGGER_READMANGLE(fl)
+// BASE_TRIGGER_READMOVEDIR(fl)
+// BASE_TRIGGER_READNEWORIGIN(fl)
+// BASE_TRIGGER_READSIZE(fl)
+// BASE_TRIGGER_READSTATEFLAGS(fl)
+#endif
+#ifdef SSQC
+// BASE_TRIGGER_WRITEMANGLE(fl)
+// BASE_TRIGGER_WRITEMOVEDIR(fl)
+// BASE_TRIGGER_WRITENEWORIGIN(fl)
+// BASE_TRIGGER_WRITESIZE(fl)
+// BASE_TRIGGER_WRITESTATEFLAGS(fl)
+#endif
#ifdef SSQC
void(entity e) sub_checkwaiting;
void() sub_endwaiting;
#endif
+#ifdef SSQC
+// #define BASE_TRIGGER_PREINIT(func)
+void(string key, string value) base_trigger_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) base_trigger_point_init;
void(entity e) base_trigger_init;
@@ -41,6 +71,147 @@ strip void() base_trigger;
// class base_trigger: base_mapentity
// {
//==============================================================
+ // Networking
+ //==============================================================
+
+#ifdef CSQC
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_READMANGLE(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ self.mangle.x = ReadAngle (); \
+ self.mangle.y = ReadAngle (); \
+ self.mangle.z = ReadAngle (); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_READMOVEDIR(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ self.movedir.x = ReadAngle (); \
+ self.movedir.y = ReadAngle (); \
+ self.movedir.z = ReadAngle (); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_READNEWORIGIN(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ self.neworigin.x = ReadCoord (); \
+ self.neworigin.y = ReadCoord (); \
+ self.neworigin.z = ReadCoord (); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_READSIZE(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ self.mins.x = ReadCoord (); \
+ self.mins.y = ReadCoord (); \
+ self.mins.z = ReadCoord (); \
+ self.maxs.x = ReadCoord (); \
+ self.maxs.y = ReadCoord (); \
+ self.maxs.z = ReadCoord (); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_READSTATEFLAGS(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ local float s1 = ReadByte (); \
+ if (s1 & STATE_INACTIVE) \
+ { \
+ self.stateflags |= STATE_INACTIVE; \
+ } \
+ else \
+ { \
+ self.stateflags &= ~STATE_INACTIVE; \
+ } \
+ if (s1 & STATE_WAITING) \
+ { \
+ self.stateflags |= STATE_WAITING; \
+ } \
+ else \
+ { \
+ self.stateflags &= ~STATE_WAITING; \
+ } \
+ } \
+ /* } */
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_WRITEMANGLE(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ WriteAngle (MSG_ENTITY, self.mangle.x); \
+ WriteAngle (MSG_ENTITY, self.mangle.y); \
+ WriteAngle (MSG_ENTITY, self.mangle.z); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_WRITEMOVEDIR(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ WriteAngle (MSG_ENTITY, self.movedir.x); \
+ WriteAngle (MSG_ENTITY, self.movedir.y); \
+ WriteAngle (MSG_ENTITY, self.movedir.z); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_WRITENEWORIGIN(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ WriteCoord (MSG_ENTITY, self.neworigin.x); \
+ WriteCoord (MSG_ENTITY, self.neworigin.y); \
+ WriteCoord (MSG_ENTITY, self.neworigin.z); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_WRITESIZE(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ WriteCoord (MSG_ENTITY, self.mins.x); \
+ WriteCoord (MSG_ENTITY, self.mins.y); \
+ WriteCoord (MSG_ENTITY, self.mins.z); \
+ WriteCoord (MSG_ENTITY, self.maxs.x); \
+ WriteCoord (MSG_ENTITY, self.maxs.y); \
+ WriteCoord (MSG_ENTITY, self.maxs.z); \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_WRITESTATEFLAGS(fl) \
+ /* { */ \
+ if (netflags & fl) \
+ { \
+ local float s1 = 0; \
+ if (self.stateflags & STATE_INACTIVE) \
+ s1 |= STATE_INACTIVE; \
+ if (self.stateflags & STATE_WAITING) \
+ s1 |= STATE_WAITING; \
+ WriteByte (MSG_ENTITY, s1); \
+ } \
+ /* } */
+#endif
+
+ //==============================================================
// Subs
//==============================================================
@@ -48,7 +219,7 @@ strip void() base_trigger;
//--------------------------------------------------------------
void(entity e) sub_checkwaiting =
{
- if (e.is_waiting <= 0)
+ if (!(e.stateflags & STATE_WAITING))
return;
if (known_release == KNOWN_RELEASE_MG1)
@@ -56,34 +227,37 @@ strip void() base_trigger;
return;
// store current use to swap later
- e.olduse = e.use;
+ e.use1 = e.use;
e.use = sub_endwaiting;
- e.estate = STATE_INACTIVE;
+ e.stateflags |= STATE_INACTIVE;
dprint (sprintf("sub_checkwaiting: spawned a waiting "
"%s with targetname %s and target %s\n",
e.classname, e.targetname, e.target));
if (e.SendEntity)
- e.SendFlags |= NETFLAG_BASE_TRIGGER_ESTATE;
+ e.SendFlags |= NETFLAG_BASE_TRIGGER_STATEFLAGS;
};
//--------------------------------------------------------------
void() sub_endwaiting =
{
- self.is_waiting = FALSE;
- self.estate = STATE_ACTIVE;
+ self.stateflags &= ~STATE_WAITING;
+ self.stateflags &= ~STATE_INACTIVE;
if (self.use == sub_endwaiting)
- self.use = self.olduse;
+ self.use = self.use1;
+ // TODO CEV
// special case for teleports, makes it ignore the
// fact that it has a targetname when touched
+ /*
if (self.classtype == CT_TRIGGER_TELEPORT)
self.is_waiting = -1;
+ */
if (self.SendEntity)
- self.SendFlags |= NETFLAG_BASE_TRIGGER_ESTATE;
+ self.SendFlags |= NETFLAG_BASE_TRIGGER_STATEFLAGS;
};
#endif
@@ -91,6 +265,33 @@ strip void() base_trigger;
// Constructor & Spawn Functions
//==============================================================
+#ifdef SSQC
+ //--------------------------------------------------------------
+ #define BASE_TRIGGER_PREINIT(func) \
+ /* { */ \
+ base_mapentity_init_spawndata (func); \
+ /* new spawnflags for all entities -- iw */ \
+ if (SUB_Inhibit()) \
+ return; \
+ /* } */
+
+ //--------------------------------------------------------------
+ void(string key, string value) base_trigger_init_field =
+ {
+ switch (key)
+ {
+ case "fade_amt":
+ self.cnt = stof (value);
+ break;
+ case "is_waiting":
+ // rewrite is_waiting to a stateflag -- CEV
+ if (stof(value))
+ self.stateflags |= STATE_WAITING;
+ break;
+ }
+ };
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
// InitPointTrigger -- Drake -- dumptruck_ds
Return to the top of this page or return to the overview of this repo.
Diff qc/cl_entry.qc
diff --git a/qc/cl_entry.qc b/qc/cl_entry.qc
index 5eb98b3..cdd7914 100644
--- a/qc/cl_entry.qc
+++ b/qc/cl_entry.qc
@@ -9,8 +9,6 @@
#ifdef CSQC
float skill;
-float painfinishtime; // Track player damage for hud face
-
float intermission; // in intermission
float intermission_time; // when the intermission started
@@ -30,16 +28,27 @@ float clientcommandframe;
// This is the input-frame that was last acknowledged by the server.
// Input frames greater than this should be applied to the player's entity.
float servercommandframe;
+float servertime;
+float serverprevtime;
// track the command frame last processed by pmove -- CEV
float pmovecommandframe;
+// track the latest full frame processed (needed for local sounds) -- CEV
+float pmovelatestframe;
+float pmovelatesttime;
+
+// track the latest full timestamp processed by pmove -- CEV
+float pmovetime;
+
entity view_player; // handle to the local player entity
float view_player_commandframe; //
entity view_entity; // camera -- CEV
vector view_origin; // origin for view_entity -- CEV
vector view_angles; // +x=DOWN
+float view_player_pain_finished; // player damage for hud face
+
__used var float physics_mode = 2; // 0 = not run, 1 = DP, 2 = movetypes
#endif
@@ -62,6 +71,8 @@ __used var float physics_mode = 2; // 0 = not run, 1 = DP, 2 = movetypes
.float lerpfrac; // if 0 use frame1, if 1 use frame2,
.float lerptime; // mix together for values between
+.vector colormod; // TODO CEV
+
// Called by addentities after the filter and before the entity is actually
// drawn. Do your interpolation and animation in here. Should return one of
// the PREDRAW_* constants.
@@ -78,18 +89,21 @@ void() CL_TE_Lightning2;
#ifdef CSQC
float(string cmd) CSQC_ConsoleCommand;
+__wrap float(string str) CSQC_ConsoleCommand;
// float(float evtype, float scanx, float chary, float devid) CSQC_InputEvent;
-// __used void() CSQC_Input_Frame;
+__used void() CSQC_Input_Frame;
float(float save, float take, vector dir) CSQC_Parse_Damage;
void() CSQC_Parse_Event;
// void(string printmsg, float printlvl) CSQC_Parse_Print;
+float(float entnum, float channel, string soundname, float vol,
+ float attenuation, vector pos, float pitchmod, float flags)
+ CSQC_Event_Sound;
void() CSQC_DrawViewModel;
void(float vwidth, float vheight, float notmenu) CSQC_UpdateView;
void(float isnew) CSQC_Ent_Update;
void() CSQC_Ent_Remove;
void() CSQC_WorldLoaded;
void(float apilevel, string enginename, float engineversion) CSQC_Init;
-__wrap float(string str) CSQC_ConsoleCommand;
#endif
//------------------------------------------------------------------------------
@@ -125,7 +139,7 @@ void() CL_TE_Lightning2 =
// TODO CEV
dprint (sprintf("CL_TE_Lightning2: time %g\n", time));
- te_lightning2 (view_player, start, end);
+ te_lightning2 (view_entity, start, end);
};
#endif
@@ -141,6 +155,30 @@ float(string cmd) CSQC_ConsoleCommand =
return FALSE;
};
+//----------------------------------------------------------------------
+// Wrapper for CSQC_ConsoleCommand to show different scoreboards
+//----------------------------------------------------------------------
+__wrap float(string str) CSQC_ConsoleCommand =
+{
+ if (prior(str))
+ return TRUE;
+
+ string c = argv(0);
+
+ if (c == "+showscores")
+ sb_showscores |= 1;
+ else if (c == "-showscores")
+ sb_showscores &= ~1;
+ else if (c == "+showteamscores")
+ sb_showscores |= 2;
+ else if (c == "-showteamscores")
+ sb_showscores &= ~2;
+ else
+ return FALSE;
+
+ return TRUE;
+};
+
// Can query/check keyboard/mouse/joystick input with this function
// For key events, scanx is one of the KEY_* values
// chary is the character code (chr2str to shove it into a string)
@@ -156,7 +194,6 @@ float(float evtype, float scanx, float chary, float devid) CSQC_InputEvent =
// can edit the input_* globals in order to apply your own player
// inputs within csqc, which may allow you a convienient way to
// pass certain info to ssqc.
-#if 0
__used void() CSQC_Input_Frame =
{
if (serverkeyfloat(SERVERKEY_PAUSESTATE))
@@ -165,6 +202,7 @@ __used void() CSQC_Input_Frame =
if (intermission == TRUE)
return;
+ #if 0
// rework user input, copying something like QuakeSpasm's always run
// feature here. This turns the +speed button into a hold-to-walk
// button when cl_run is 0 (when FTE's always run setting is on).
@@ -206,8 +244,8 @@ __used void() CSQC_Input_Frame =
/*
}
*/
+ #endif
};
-#endif
// This is linked to client dmg_take / dmg_save / dmg_inflictor fields
// returning TRUE will block the red flash damage stuff
@@ -215,7 +253,7 @@ float(float save, float take, vector dir) CSQC_Parse_Damage =
{
dprint (sprintf("CSQC_Parse_Damage: save %g, take %g, dir %v\n",
save, take, dir));
- painfinishtime = time + 0.2;
+ view_player_pain_finished = time + 0.2;
return FALSE;
};
@@ -263,16 +301,83 @@ void(string printmsg, float printlvl) CSQC_Parse_Print =
*/
//----------------------------------------------------------------------
+float(float entnum, float channel, string wav, float vol,
+ float attenuation, vector pos, float pitchmod, float flags)
+ CSQC_Event_Sound =
+{
+ // only the local player's sounds are predicted -- CEV
+ if (entnum != player_localentnum)
+ return FALSE;
+
+ #if 0
+ dprint (sprintf("CSQC_Event_Sound: player sound %s at time %g\n",
+ soundname, time));
+ #endif
+
+ // the following sounds are suppressed -- mostly movement sounds -- CEV
+ switch (wav)
+ {
+ case snd_player_jump_00.wav:
+ case snd_player_jump_01.wav:
+ case snd_player_jump_02.wav:
+ case snd_player_jump_03.wav:
+ case snd_player_jump_04.wav:
+ case snd_player_jumpwater.wav:
+ case snd_player_land_01.wav:
+ case snd_player_land_02.wav:
+ case snd_player_slide_00.wav:
+ case snd_player_slide_silent.wav:
+ case snd_player_stepdirt_01.wav:
+ case snd_player_stepdirt_02.wav:
+ case snd_player_stepdirt_03.wav:
+ case snd_player_stepdirt_04.wav:
+ case snd_player_stepdirt_05.wav:
+ case snd_player_stepmetal_01.wav:
+ case snd_player_stepmetal_02.wav:
+ case snd_player_stepmetal_03.wav:
+ case snd_player_stepmetal_04.wav:
+ case snd_player_stepmetal_05.wav:
+ case snd_player_stepmetal_06.wav:
+ case snd_player_stepmetal_07.wav:
+ case snd_player_stepmetal_08.wav:
+ case snd_player_stepmetal_09.wav:
+ case snd_player_stepstone_01.wav:
+ case snd_player_stepstone_02.wav:
+ case snd_player_stepstone_03.wav:
+ case snd_player_stepstone_04.wav:
+ case snd_player_stepstone_05.wav:
+ case snd_player_stepstone_06.wav:
+ case snd_player_stepwater_01.wav:
+ case snd_player_stepwater_02.wav:
+ case snd_player_stepwater_03.wav:
+ case snd_player_stepwater_04.wav:
+ case snd_player_stepwood_01.wav:
+ case snd_player_stepwood_02.wav:
+ case snd_player_stepwood_03.wav:
+ case snd_player_stepwood_04.wav:
+ case snd_player_wadewater_01.wav:
+ case snd_player_wadewater_02.wav:
+ case snd_player_water_01.wav:
+ case snd_player_water_02.wav:
+ // don't play these sounds -- CEV
+ return TRUE;
+ default:
+ // let the rest play -- CEV
+ return FALSE;
+ }
+};
+
+//----------------------------------------------------------------------
// TODO CEV
//----------------------------------------------------------------------
void() CSQC_DrawViewModel =
{
// don't draw viewmodel when the player is climbing -- CEV
- if (view_player.pm_flags & PMF_CLIMB)
+ if (view_player.moveflags & PMF_CLIMB)
return;
// don't draw viewmodel when climbing a ladder -- CEV
- if (view_player.pm_flags & PMF_ONLADDER)
+ if (view_player.moveflags & PMF_ONLADDER)
return;
local float newframe = view_player.weaponframe;
@@ -280,30 +385,30 @@ void() CSQC_DrawViewModel =
local float view_entity_item_index = 0;
switch (view_entity.weapon)
{
- case 1: view_entity_item_index = view_entity.inventory1; break;
- case 2: view_entity_item_index = view_entity.inventory2; break;
- case 3: view_entity_item_index = view_entity.inventory3; break;
- case 4: view_entity_item_index = view_entity.inventory4; break;
- case 5: view_entity_item_index = view_entity.inventory5; break;
- case 6: view_entity_item_index = view_entity.inventory6; break;
- case 7: view_entity_item_index = view_entity.inventory7; break;
- case 8: view_entity_item_index = view_entity.inventory8; break;
+ case 1: view_entity_item_index = view_entity.item[0]; break;
+ case 2: view_entity_item_index = view_entity.item[1]; break;
+ case 3: view_entity_item_index = view_entity.item[2]; break;
+ case 4: view_entity_item_index = view_entity.item[3]; break;
+ case 5: view_entity_item_index = view_entity.item[4]; break;
+ case 6: view_entity_item_index = view_entity.item[5]; break;
+ case 7: view_entity_item_index = view_entity.item[6]; break;
+ case 8: view_entity_item_index = view_entity.item[7]; break;
}
local float view_player_item_index = 0;
switch (view_player.weapon)
{
- case 1: view_player_item_index = view_player.inventory1; break;
- case 2: view_player_item_index = view_player.inventory2; break;
- case 3: view_player_item_index = view_player.inventory3; break;
- case 4: view_player_item_index = view_player.inventory4; break;
- case 5: view_player_item_index = view_player.inventory5; break;
- case 6: view_player_item_index = view_player.inventory6; break;
- case 7: view_player_item_index = view_player.inventory7; break;
- case 8: view_player_item_index = view_player.inventory8; break;
+ case 1: view_player_item_index = view_player.item[0]; break;
+ case 2: view_player_item_index = view_player.item[1]; break;
+ case 3: view_player_item_index = view_player.item[2]; break;
+ case 4: view_player_item_index = view_player.item[3]; break;
+ case 5: view_player_item_index = view_player.item[4]; break;
+ case 6: view_player_item_index = view_player.item[5]; break;
+ case 7: view_player_item_index = view_player.item[6]; break;
+ case 8: view_player_item_index = view_player.item[7]; break;
}
- local item_info_t item = item_info[view_player_item_index];
+ local item_info_t iit = item_info[view_player_item_index];
if (view_player.weapon != view_entity.weapon ||
view_player_item_index != view_entity_item_index)
@@ -312,21 +417,21 @@ void() CSQC_DrawViewModel =
view_entity.weapon = view_player.weapon;
switch (view_player.weapon)
{
- case 1: view_entity.inventory1 = view_player.inventory1;
+ case 1: view_entity.item[0] = view_player.item[0];
break;
- case 2: view_entity.inventory2 = view_player.inventory2;
+ case 2: view_entity.item[1] = view_player.item[1];
break;
- case 3: view_entity.inventory3 = view_player.inventory3;
+ case 3: view_entity.item[2] = view_player.item[2];
break;
- case 4: view_entity.inventory4 = view_player.inventory4;
+ case 4: view_entity.item[3] = view_player.item[3];
break;
- case 5: view_entity.inventory5 = view_player.inventory5;
+ case 5: view_entity.item[4] = view_player.item[4];
break;
- case 6: view_entity.inventory6 = view_player.inventory6;
+ case 6: view_entity.item[5] = view_player.item[5];
break;
- case 7: view_entity.inventory7 = view_player.inventory7;
+ case 7: view_entity.item[6] = view_player.item[6];
break;
- case 8: view_entity.inventory8 = view_player.inventory8;
+ case 8: view_entity.item[7] = view_player.item[7];
break;
}
@@ -334,14 +439,20 @@ void() CSQC_DrawViewModel =
dprint (sprintf("CSQC_DrawViewModel: .weapon %g, "
"index %g, frame %g, viewmodel %s\n",
view_player.weapon, view_player_item_index,
- newframe, item.view_model));
+ newframe, iit.view_model));
#endif
// need to grab skin from item.option for armor -- CEV
if (view_player_item_index >= ITEM_SEQ_ARMOR_GREEN &&
view_player_item_index <= ITEM_SEQ_ARMOR_SHARD)
{
- view_entity.skin = item.option;
+ view_entity.skin = iit.world_skin;
+ }
+ else if (view_player_item_index >= ITEM_SEQ_BREAKABLE_START &&
+ view_player_item_index <= ITEM_SEQ_BREAKABLE_END)
+ {
+ newframe = iit.world_frame;
+ view_entity.skin = iit.world_skin;
}
else if (view_entity.skin)
{
@@ -350,33 +461,48 @@ void() CSQC_DrawViewModel =
view_entity.frame2 = view_entity.frame = newframe;
view_entity.lerptime = time;
- setmodel (view_entity, item.view_model);
+ setmodel (view_entity, iit.view_model);
+ setsize (view_entity, '0 0 0', '0 0 0');
}
else if (newframe != view_entity.frame)
{
- view_entity.frame2 = view_entity.frame;
- view_entity.frame = newframe;
- view_entity.lerptime = time;
+ if (!(view_player_item_index >= ITEM_SEQ_BREAKABLE_START &&
+ view_player_item_index <= ITEM_SEQ_BREAKABLE_END))
+ {
+ view_entity.frame2 = view_entity.frame;
+ view_entity.frame = newframe;
+ view_entity.lerptime = time;
+ }
}
- view_entity.lerpfrac = 1 - (time - view_entity.lerptime) * 10;
+ view_entity.lerpfrac = max (0, 1 - (time - view_entity.lerptime) * 10);
// apply user's configured viewmodel offset -- CEV
// TODO CEV this has gotta be slow
view_entity.origin = [
- item.view_origin_offset.x + autocvar(cl_gunx, 0),
- item.view_origin_offset.y + autocvar(cl_guny, 0),
- item.view_origin_offset.z + autocvar(cl_gunz, 0)];
+ iit.view_origin_offset.x + autocvar(cl_gunx, 0),
+ iit.view_origin_offset.y + autocvar(cl_guny, 0),
+ iit.view_origin_offset.z + autocvar(cl_gunz, 0)];
view_entity.angles = [
- item.view_angles_offset.x + autocvar(cl_gunanglex, 0),
- item.view_angles_offset.y + autocvar(cl_gunangley, 0),
- item.view_angles_offset.z + autocvar(gl_gunanglez, 0)];
+ iit.view_angles_offset.x + autocvar(cl_gunanglex, 0),
+ iit.view_angles_offset.y + autocvar(cl_gunangley, 0),
+ iit.view_angles_offset.z + autocvar(gl_gunanglez, 0)];
if (view_player.items & IT_INVISIBILITY)
view_entity.alpha = 0.5f;
else if (view_entity.alpha == 0.5f)
view_entity.alpha = 1.0f;
+ // make sure framegroup animations are updated -- CEV
+ view_entity.frame1time = time;
+
+ if (view_player_item_index == ITEM_SEQ_TORCH)
+ {
+ // lightstyle 6 -- CEV
+ // TODO CEV origin offset to position light at flame
+ dynamiclight_add (view_player.origin, 200, '0.5 0.5 0.5', 6);
+ }
+
addentity (view_entity);
};
@@ -394,13 +520,12 @@ void(float vwidth, float vheight, float notmenu) CSQC_UpdateView =
if (view_player)
{
view_player.renderflags |= RF_EXTERNALMODEL;
+ addentities (DRAWMASK_PLAYER);
addentities (DRAWMASK_ENGINE | DRAWMASK_NORMAL);
// read our smoothed & predicted view origin
setproperty (VF_ORIGIN, view_origin);
- makevectors (view_angles);
-
if (intermission)
{
// camera wobble
@@ -413,21 +538,29 @@ void(float vwidth, float vheight, float notmenu) CSQC_UpdateView =
setproperty (VF_DRAWCROSSHAIR, FALSE);
setproperty (VF_ANGLES, view_angles);
+
+ makevectors (view_angles);
SetListener (view_origin, v_forward, v_right, v_up);
}
else
{
- // view_angle adjustments done in player_predraw -- CEV
- setproperty (VF_DRAWCROSSHAIR, TRUE);
- setproperty (VF_ANGLES, view_angles);
- SetListener (view_origin, v_forward, v_right, v_up);
-
// draw view model when not invisible & when alive
if (view_player.health > 0)
{
setproperty (VF_VIEWENTITY, view_player.entnum);
CSQC_DrawViewModel ();
}
+
+ // view_angle adjustments done in player_predraw -- CEV
+ setproperty (VF_DRAWCROSSHAIR, TRUE);
+ setproperty (VF_ANGLES, view_angles);
+
+ // view_entity is the source for local player sounds,
+ // update its origin before setting listener -- CEV
+ view_entity.origin = view_origin;
+ view_entity.angles = view_angles;
+ makevectors (view_angles);
+ SetListener (view_origin, v_forward, v_right, v_up);
}
}
else
@@ -436,13 +569,14 @@ void(float vwidth, float vheight, float notmenu) CSQC_UpdateView =
if (intermission)
{
setproperty (VF_DRAWCROSSHAIR, FALSE);
- addentities (DRAWMASK_ENGINE | DRAWMASK_NORMAL);
+ addentities (DRAWMASK_ENGINE | DRAWMASK_NORMAL |
+ DRAWMASK_PLAYER);
}
else
{
setproperty (VF_DRAWCROSSHAIR, TRUE);
- addentities (DRAWMASK_ENGINE | DRAWMASK_VIEWMODEL |
- DRAWMASK_NORMAL);
+ addentities (DRAWMASK_ENGINE | DRAWMASK_NORMAL |
+ DRAWMASK_VIEWMODEL | DRAWMASK_PLAYER);
}
}
@@ -450,11 +584,17 @@ void(float vwidth, float vheight, float notmenu) CSQC_UpdateView =
#if 0
local entity t = world;
+ local float tcount = 0;
while ((t = nextent(t)))
{
+ /*
dprint (sprintf("CSQC_UpdateView: found %s num %g, model %s\n",
- t.classname, t.entnum, modelnameforindex(t.modelindex)));
+ t.classname, t.entnum, modelnameforindex(t.modelindex)));
+ */
+ tcount++;
}
+ dprint (sprintf("CSQC_UpdateView: found %g entities at time %g\n",
+ tcount, time));
#endif
// Used on intermission screen later
@@ -483,25 +623,21 @@ void(float isnew) CSQC_Ent_Update =
if (self.classtype && self.classtype != ctype)
{
- if (self.classtype != ctype)
- {
- dprint (sprintf("CSQC_Ent_Update: classtype "
- "mismatch, cleaning up etype %g num %g\n",
- ctype, self.entnum));
+ dprint (sprintf("CSQC_Ent_Update: classtype "
+ "mismatch, cleaning up etype %g num %g\n",
+ ctype, self.entnum));
- // TODO CEV
- if (view_player == self)
- view_player = world;
+ if (view_player == self)
+ view_player = world;
- setmodel (self, "");
- self.predraw = __NULL__;
+ setmodel (self, "");
+ self.predraw = __NULL__;
- if (self.queflag)
- base_entity_que_rem (self, self.queflag);
+ if (self.queflag)
+ base_entity_que_rem (self, self.queflag);
- isnew = TRUE;
- self.classtype = ctype;
- }
+ isnew = TRUE;
+ self.classtype = ctype;
}
else
{
@@ -544,6 +680,9 @@ void(float isnew) CSQC_Ent_Update =
case CT_FUNC_FALL2:
func_fall2_netreceive (isnew);
return;
+ case CT_FUNC_HURT:
+ func_hurt_netreceive (isnew);
+ return;
#if 0
case CT_FUNC_ILLUSIONARY:
func_illusionary_netreceive (isnew);
@@ -576,109 +715,58 @@ void(float isnew) CSQC_Ent_Update =
case CT_FUNC_TOGGLEWALL:
func_togglewall_netreceive (isnew);
return;
+ case CT_FUNC_TOSS:
+ func_toss_netreceive (isnew);
+ return;
case CT_FUNC_TRAIN:
func_train_netreceive (isnew);
return;
case CT_FUNC_WALL:
func_wall_netreceive (isnew);
return;
+ // items/ammo.qc
case CT_ITEM_AMMO_CELLS:
- item_cells_netreceive (isnew);
- return;
case CT_ITEM_AMMO_ROCKETS:
- item_rockets_netreceive (isnew);
- return;
case CT_ITEM_AMMO_SHELLS:
- item_shells_netreceive (isnew);
- return;
case CT_ITEM_AMMO_SPIKES:
- item_spikes_netreceive (isnew);
+ base_item_ammo_netreceive (isnew);
return;
+ // items/armor.qc
case CT_ITEM_ARMOR_GREEN:
- item_armor1_netreceive (isnew);
- return;
case CT_ITEM_ARMOR_YELLOW:
- item_armor2_netreceive (isnew);
- return;
case CT_ITEM_ARMOR_RED:
- item_armorInv_netreceive (isnew);
- return;
case CT_ITEM_ARMOR_SHARD:
- item_armor_shard_netreceive (isnew);
- return;
- case CT_ITEM_AXE:
- weapon_axe_netreceive (isnew);
+ base_item_armor_netreceive (isnew);
return;
+ // items/backpacks.qc
case CT_ITEM_BACKPACK:
item_backpack_netreceive (isnew);
return;
- case CT_ITEM_ENVIROSUIT:
- item_artifact_envirosuit_netreceive (isnew);
- return;
+ // items/throwables.qc
+ case CT_ITEM_DEBRIS:
case CT_ITEM_GIB1:
- base_item_gib_netreceive (isnew, item_gib1_init);
- return;
case CT_ITEM_GIB2:
- base_item_gib_netreceive (isnew, item_gib2_init);
- return;
case CT_ITEM_GIB3:
- base_item_gib_netreceive (isnew, item_gib3_init);
- return;
- case CT_ITEM_GRENADE_LAUNCHER:
- weapon_grenadelauncher_netreceive (isnew);
- return;
case CT_ITEM_HEAD_ARMY:
- base_item_gib_netreceive (isnew, item_head_army_init);
- return;
case CT_ITEM_HEAD_DEMON:
- base_item_gib_netreceive (isnew, item_head_demon_init);
- return;
case CT_ITEM_HEAD_DOG:
- base_item_gib_netreceive (isnew, item_head_dog_init);
- return;
case CT_ITEM_HEAD_ENFORCER:
- base_item_gib_netreceive (isnew,
- item_head_enforcer_init);
- return;
case CT_ITEM_HEAD_HELLKNIGHT:
- base_item_gib_netreceive (isnew,
- item_head_hell_knight_init);
- return;
case CT_ITEM_HEAD_KNIGHT:
- base_item_gib_netreceive (isnew, item_head_knight_init);
- return;
case CT_ITEM_HEAD_OGRE:
- base_item_gib_netreceive (isnew, item_head_ogre_init);
- return;
case CT_ITEM_HEAD_PLAYER:
- base_item_gib_netreceive (isnew, item_head_player_init);
- return;
case CT_ITEM_HEAD_SHALRATH:
- base_item_gib_netreceive (isnew,
- item_head_shalrath_init);
- return;
case CT_ITEM_HEAD_SHAMBLER:
- base_item_gib_netreceive (isnew,
- item_head_shambler_init);
- return;
case CT_ITEM_HEAD_WIZARD:
- base_item_gib_netreceive (isnew, item_head_wizard_init);
- return;
case CT_ITEM_HEAD_ZOMBIE:
- base_item_gib_netreceive (isnew, item_head_zombie_init);
+ base_item_throwable_netreceive (isnew);
return;
+ // items/health.qc
case CT_ITEM_HEALTH:
- item_health_netreceive (isnew);
- return;
case CT_ITEM_HEALTH_VIAL:
- item_health_vial_netreceive (isnew);
- return;
- case CT_ITEM_INVISIBILITY:
- item_artifact_invisibility_netreceive (isnew);
- return;
- case CT_ITEM_INVULNERABILITY:
- item_artifact_invulnerability_netreceive (isnew);
+ base_item_health_netreceive (isnew);
return;
+ // items/keys.qc
case CT_ITEM_KEY1:
item_key1_netreceive (isnew);
return;
@@ -688,29 +776,31 @@ void(float isnew) CSQC_Ent_Update =
case CT_ITEM_KEY_CUSTOM:
item_key_custom_netreceive (isnew);
return;
- case CT_ITEM_LIGHTNING_GUN:
- weapon_lightning_netreceive (isnew);
- return;
- case CT_ITEM_NAILGUN:
- weapon_nailgun_netreceive (isnew);
+ // items/lights.qc
+ case CT_ITEM_TORCH:
+ item_torch_netreceive (isnew);
return;
+ // items/powerups.qc
+ case CT_ITEM_ENVIROSUIT:
+ case CT_ITEM_INVISIBILITY:
+ case CT_ITEM_INVULNERABILITY:
case CT_ITEM_QUAD:
- item_artifact_super_damage_netreceive (isnew);
- return;
- case CT_ITEM_ROCKET_LAUNCHER:
- weapon_rocketlauncher_netreceive (isnew);
+ base_item_powerup_netreceive (isnew);
return;
+ // items/runes.qc
case CT_ITEM_RUNE:
item_sigil_netreceive (isnew);
return;
+ // items/weapons.qc
+ case CT_ITEM_AXE:
case CT_ITEM_SHOTGUN:
- weapon_shotgun_netreceive (isnew);
- return;
- case CT_ITEM_SUPER_NAILGUN:
- weapon_supernailgun_netreceive (isnew);
- return;
case CT_ITEM_SUPER_SHOTGUN:
- weapon_supershotgun_netreceive (isnew);
+ case CT_ITEM_NAILGUN:
+ case CT_ITEM_SUPER_NAILGUN:
+ case CT_ITEM_GRENADE_LAUNCHER:
+ case CT_ITEM_ROCKET_LAUNCHER:
+ case CT_ITEM_LIGHTNING_GUN:
+ base_item_weapon_netreceive (isnew);
return;
case CT_MISC_EXPLOBOX:
case CT_MISC_EXPLOBOX2:
@@ -790,6 +880,8 @@ void(float isnew) CSQC_Ent_Update =
trigger_teleport_netreceive (isnew);
return;
default:
+ // if you get here the game will probably crash to
+ // console due to a networking error -- CEV
dprint (sprintf("CSQC_Ent_Update: received unknown "
"classtype %f!\n", self.classtype));
return;
@@ -896,28 +988,4 @@ void(float apilevel, string enginename, float engineversion) CSQC_Init =
}
}
};
-
-//----------------------------------------------------------------------
-// Wrapper for CSQC_ConsoleCommand to show different scoreboards
-//----------------------------------------------------------------------
-__wrap float(string str) CSQC_ConsoleCommand =
-{
- if (prior(str))
- return TRUE;
-
- string c = argv(0);
-
- if (c == "+showscores")
- sb_showscores |= 1;
- else if (c == "-showscores")
- sb_showscores &= ~1;
- else if (c == "+showteamscores")
- sb_showscores |= 2;
- else if (c == "-showteamscores")
- sb_showscores &= ~2;
- else
- return FALSE;
-
- return TRUE;
-};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/cl_hud.qc
diff --git a/qc/cl_hud.qc b/qc/cl_hud.qc
index 075bc6f..e75c5b2 100644
--- a/qc/cl_hud.qc
+++ b/qc/cl_hud.qc
@@ -353,7 +353,7 @@ void(vector pos) Hud_DrawFace =
hpframe = 4;
// Check for any pain/flinch updates
- if (painfinishtime > time)
+ if (view_player_pain_finished > time)
hpframe = hpframe + 5;
// Final HP face
@@ -540,6 +540,9 @@ void (vector pos, vector br) Hud_DrawIBar =
Hud_DrawNoFont8 (pos + [154, 0], view_player.ammo_cells, 3,
FALSE, HUDFONT_YELLOW);
+ // TODO CEV working out the offset
+ // Hud_DrawNoFont8 (pos + [186, 0], 50, 3, FALSE, HUDFONT_YELLOW);
+
// Draw weapons and highlight current one
// TODO CEV
/*
@@ -593,7 +596,7 @@ void (vector pos, vector br) Hud_DrawIBar =
drawpic (pos + [312, 8], ibrunes[3], HUDSIZE_816, HUDRGB_DEF,
hudalpha, 0);
- //should probably show team scores, but this mimics vanilla
+ // should probably show team scores, but this mimics vanilla
if (deathmatch)
{
// Move to space above powerups
@@ -1039,22 +1042,24 @@ void(vector virtsize, float showscores) CSQC_DrawHud =
pos_y = virtsize_y;
pos_z = 0;
- // trying to center the speedometer display just below
- // the crosshair. This doesn't seem to be right but it
- // works on my 960x720 window. -- CEV.
- pos_speedo_x = virtsize_x / 2.0;
- pos_speedo_y = virtsize_y / 2.0;
- pos_speedo_z = 0;
- if (view_player.speed > 999)
- Hud_Speedometer (pos_speedo - [16, -8]);
- else if (view_player.speed > 99)
- Hud_Speedometer (pos_speedo - [20, -8]);
- else
- Hud_Speedometer (pos_speedo - [24, -8]);
+ if (!cvar("crosshair") && cvar("developer"))
+ {
+ // trying to center the speedometer display just below
+ // the crosshair. This doesn't seem to be right but it
+ // works on my 960x720 window. -- CEV.
+ pos_speedo_x = virtsize_x / 2.0;
+ pos_speedo_y = virtsize_y / 2.0;
+ pos_speedo_z = 0;
+ if (view_player.speed > 999)
+ Hud_Speedometer (pos_speedo - [16, -8]);
+ else if (view_player.speed > 99)
+ Hud_Speedometer (pos_speedo - [20, -8]);
+ else
+ Hud_Speedometer (pos_speedo - [24, -8]);
- // Input Monitor TODO CEV
- if (!cvar("crosshair"))
+ // Input Monitor TODO CEV
Hud_InputMonitor (pos_speedo - [4, 4, 0]);
+ }
if (hudviewsize < 120)
{
Return to the top of this page or return to the overview of this repo.
Diff qc/cl_progs.src
diff --git a/qc/cl_progs.src b/qc/cl_progs.src
index fe882c2..678a0c5 100644
--- a/qc/cl_progs.src
+++ b/qc/cl_progs.src
@@ -15,6 +15,7 @@ defs_fields.qc // id1 entvars_t
defs_builtins.qc // curated builtins list
defs_const.qc // program-wide constants
defs_ctypes.qc // global class list
+defs_sounds.qc // global sound definitions
defs_items.qc // global item definitions
//----------------------------------------------------------------------
@@ -59,6 +60,7 @@ func/episodegate.qc // was misc.qc -- CEV
func/explobox.qc // selections from Rubicon2 QC
func/fall.qc // Renny's original version
func/fall2.qc // Renny's improved version.
+func/hurt.qc // MG1 func_hurt
func/illusionary.qc // id1 illusionary
func/laser.qc // selections from Rubicon2 QC
// func/monster_spawner.qc // not networked -- CEV
@@ -68,17 +70,19 @@ func/plat.qc // id1 platforms
func/rotate.qc // hipnotic rotation (needed for func_movewall)
func/togglevisiblewall.qc // pd3 togglevisiblewall
func/togglewall.qc // hipnotic togglewalls
+func/toss.qc // mg1 func_toss
func/train.qc // id1 trains
// item entities
items/ammo.qc // id1 ammo
items/armor.qc // id1 armor & pd3 shards
items/backpacks.qc // id1 & pd3 backpacks
-items/gore.qc // id1 gibs & heads
items/health.qc // id1 & pd3 health
+items/lights.qc // portable lights
items/keys.qc // id1 & pd3 keys
items/powerups.qc // id1 powerups
items/runes.qc // id1 & MG1 runes
+items/throwables.qc // id1 gibs & heads, various debris
items/weapons.qc // id1 weapons
// misc entities
@@ -111,4 +115,7 @@ triggers/ladder.qc // rubicon ladders
triggers/push.qc // id1 push brushes
triggers/setgravity.qc // hipnotic setgravity
triggers/teleport.qc // id1 teleporters (with pd3 & other additions)
+
+// compat layers
+compat/id1.qc // id1
#endlist
Return to the top of this page or return to the overview of this repo.
Diff qc/compat/id1.qc
diff --git a/qc/compat/id1.qc b/qc/compat/id1.qc
index 8df7650..1f014e8 100644
--- a/qc/compat/id1.qc
+++ b/qc/compat/id1.qc
@@ -14,9 +14,11 @@
// forward declarations
//======================================================================
-#ifdef SSQC
+#if defined(CSQC) || defined(SSQC)
float(string tex) id1_surface_type; // material type for texture name
+#endif
+#ifdef SSQC
void() boss_awake; // support for jam6_scampie
void() boss_missile1;
void() SUB_regen;
@@ -32,7 +34,7 @@ void() barrel_explode;
//------------------------------------------------------------------------------
-#ifdef SSQC
+#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
// given a texture name return a surface type. currently used for floor
// types (footstep sounds) -- CEV
@@ -122,11 +124,13 @@ float(string tex) id1_surface_type =
return SURFACE_STONE;
}
};
+#endif
//----------------------------------------------------------------------
// generic support for func map jam 6, mostly the excellent jam6_scampie
//----------------------------------------------------------------------
+#ifdef SSQC
//----------------------------------------------------------------------
void() boss_awake = { monster_boss_use (); };
void() boss_missile1 = { boss_atk1 (); };
@@ -218,10 +222,10 @@ void() walkmonster_start =
//----------------------------------------------------------------------
void() OgreGrenadeExplode =
{
- sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
+ SOUND (self, snd_weapon_rocket_explosion)
self.velocity = '0 0 0';
- self.destroy = sub_nulldestroy;
+ self.th_destroy = sub_nulldestroy;
self.think = sub_null;
self.touch = sub_null;
Return to the top of this page or return to the overview of this repo.
Diff qc/compat/mg1.qc
diff --git a/qc/compat/mg1.qc b/qc/compat/mg1.qc
index 4e63592..f8a7b97 100644
--- a/qc/compat/mg1.qc
+++ b/qc/compat/mg1.qc
@@ -3,57 +3,6 @@
//==============================================================================
//======================================================================
-// constants
-//======================================================================
-
-#ifdef SSQC
-//----------------------------------------------------------------------
-// misc_corpse_seq -- matches misc_corpse_poses from MG1 -- CEV
-//----------------------------------------------------------------------
-typedef enum
-{
- MISC_CORPSE_SEQ_DEMON_1, // Monster corpses
- MISC_CORPSE_SEQ_DOG_1,
- MISC_CORPSE_SEQ_DOG_2,
- MISC_CORPSE_SEQ_ENFORCER_1,
- MISC_CORPSE_SEQ_ENFORCER_2,
- MISC_CORPSE_SEQ_FISH_1,
- MISC_CORPSE_SEQ_HKNIGHT_1,
- MISC_CORPSE_SEQ_HKNIGHT_2,
- MISC_CORPSE_SEQ_KNIGHT_1,
- MISC_CORPSE_SEQ_KNIGHT_2,
- MISC_CORPSE_SEQ_OGRE_1,
- MISC_CORPSE_SEQ_OGRE_2,
- MISC_CORPSE_SEQ_SHALRATH_1,
- MISC_CORPSE_SEQ_SHAMBLER_1,
- MISC_CORPSE_SEQ_SOLDIER_1,
- MISC_CORPSE_SEQ_SOLDIER_2,
- MISC_CORPSE_SEQ_WIZARD_1,
- MISC_CORPSE_SEQ_PLAYER_1, // Player corpse
- MISC_CORPSE_SEQ_PLAYER_2,
- MISC_CORPSE_SEQ_PLAYER_3,
- MISC_CORPSE_SEQ_PLAYER_4,
- MISC_CORPSE_SEQ_PLAYER_5,
- MISC_CORPSE_SEQ_PLAYER_6,
- MISC_CORPSE_SEQ_DEMON_HEAD, // Heads
- MISC_CORPSE_SEQ_DOG_HEAD,
- MISC_CORPSE_SEQ_SOLDIER_HEAD, // "h_guard"
- MISC_CORPSE_SEQ_HKNIGHT_HEAD,
- MISC_CORPSE_SEQ_KNIGHT_HEAD,
- MISC_CORPSE_SEQ_ENFORCER_HEAD, // "h_mega"
- MISC_CORPSE_SEQ_OGRE_HEAD,
- MISC_CORPSE_SEQ_PLAYER_HEAD,
- MISC_CORPSE_SEQ_SHALRATH_HEAD,
- MISC_CORPSE_SEQ_SHAMBLER_HEAD,
- MISC_CORPSE_SEQ_WIZARD_HEAD,
- MISC_CORPSE_SEQ_ZOMBIE_HEAD,
- MISC_CORPSE_SEQ_GIB_1, // Gibs
- MISC_CORPSE_SEQ_GIB_2,
- MISC_CORPSE_SEQ_GIB_3
-} misc_corpse_seq;
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -82,6 +31,16 @@ void() func_explode;
void() misc_corpse;
#endif
+#ifdef SSQC
+// hub_trigger_changelevel
+void() hub_trigger_changelevel;
+#endif
+
+#ifdef SSQC
+// trigger_cleanup_corpses
+void() trigger_cleanup_corpses;
+#endif
+
//------------------------------------------------------------------------------
#ifdef SSQC
@@ -207,132 +166,100 @@ Custom exploding box
if (SUB_Inhibit())
return;
+ if (self.style < 0 || self.style >= 38)
+ {
+ objerror ("misc_corpse with invalid style");
+ return;
+ }
+
+ self.style += ITEM_SEQ_THROWABLE_START;
+
switch (self.style)
{
- case MISC_CORPSE_SEQ_DEMON_1:
+ case ITEM_SEQ_CORPSE_DEMON_1:
monster_dead_demon_init (self);
break;
- case MISC_CORPSE_SEQ_DOG_1:
+ case ITEM_SEQ_CORPSE_DOG_1:
self.spawnflags |= 2;
monster_dead_dog_init (self);
break;
- case MISC_CORPSE_SEQ_DOG_2:
+ case ITEM_SEQ_CORPSE_DOG_2:
self.spawnflags |= 4;
monster_dead_dog_init (self);
break;
- case MISC_CORPSE_SEQ_ENFORCER_1:
+ case ITEM_SEQ_CORPSE_ENFORCER_1:
monster_dead_enforcer_init (self);
break;
- case MISC_CORPSE_SEQ_ENFORCER_2:
+ case ITEM_SEQ_CORPSE_ENFORCER_2:
self.spawnflags |= 2;
monster_dead_enforcer_init (self);
break;
- case MISC_CORPSE_SEQ_FISH_1:
+ case ITEM_SEQ_CORPSE_FISH_1:
monster_dead_fish_init (self);
break;
- case MISC_CORPSE_SEQ_HKNIGHT_1:
+ case ITEM_SEQ_CORPSE_HKNIGHT_1:
monster_dead_hell_knight_init (self);
break;
- case MISC_CORPSE_SEQ_HKNIGHT_2:
+ case ITEM_SEQ_CORPSE_HKNIGHT_2:
self.spawnflags |= 2;
monster_dead_hell_knight_init (self);
break;
- case MISC_CORPSE_SEQ_KNIGHT_1:
+ case ITEM_SEQ_CORPSE_KNIGHT_1:
self.spawnflags |= 2;
monster_dead_knight_init (self);
break;
- case MISC_CORPSE_SEQ_KNIGHT_2:
+ case ITEM_SEQ_CORPSE_KNIGHT_2:
monster_dead_knight_init (self);
break;
- case MISC_CORPSE_SEQ_OGRE_1:
+ case ITEM_SEQ_CORPSE_OGRE_1:
self.spawnflags |= 2;
monster_dead_ogre_init (self);
break;
- case MISC_CORPSE_SEQ_OGRE_2:
+ case ITEM_SEQ_CORPSE_OGRE_2:
monster_dead_ogre_init (self);
break;
- case MISC_CORPSE_SEQ_SHALRATH_1:
+ case ITEM_SEQ_CORPSE_SHALRATH_1:
monster_dead_shalrath_init (self);
break;
- case MISC_CORPSE_SEQ_SHAMBLER_1:
+ case ITEM_SEQ_CORPSE_SHAMBLER_1:
monster_dead_shambler_init (self);
break;
- case MISC_CORPSE_SEQ_SOLDIER_1:
+ case ITEM_SEQ_CORPSE_SOLDIER_1:
self.spawnflags |= 2;
monster_dead_army_init (self);
break;
- case MISC_CORPSE_SEQ_SOLDIER_2:
+ case ITEM_SEQ_CORPSE_SOLDIER_2:
monster_dead_army_init (self);
break;
- case MISC_CORPSE_SEQ_WIZARD_1:
+ case ITEM_SEQ_CORPSE_WIZARD_1:
monster_dead_wizard_init (self);
break;
- case MISC_CORPSE_SEQ_PLAYER_1:
+ case ITEM_SEQ_CORPSE_PLAYER_1:
player_dead_axe ();
break;
- case MISC_CORPSE_SEQ_PLAYER_2:
+ case ITEM_SEQ_CORPSE_PLAYER_2:
// TODO CEV
// misc_corpse_init (self);
break;
- case MISC_CORPSE_SEQ_PLAYER_3:
+ case ITEM_SEQ_CORPSE_PLAYER_3:
// TODO CEV
// misc_corpse_init (self);
break;
- case MISC_CORPSE_SEQ_PLAYER_4:
+ case ITEM_SEQ_CORPSE_PLAYER_4:
// TODO CEV
// misc_corpse_init (self);
break;
- case MISC_CORPSE_SEQ_PLAYER_5:
+ case ITEM_SEQ_CORPSE_PLAYER_5:
// TODO CEV
// misc_corpse_init (self);
break;
- case MISC_CORPSE_SEQ_PLAYER_6:
+ case ITEM_SEQ_CORPSE_PLAYER_6:
player_dead_on_side ();
break;
- case MISC_CORPSE_SEQ_DEMON_HEAD:
- item_head_demon_init (self);
- break;
- case MISC_CORPSE_SEQ_DOG_HEAD:
- item_head_dog_init (self);
- break;
- case MISC_CORPSE_SEQ_SOLDIER_HEAD:
- item_head_army_init (self);
- break;
- case MISC_CORPSE_SEQ_HKNIGHT_HEAD:
- item_head_hell_knight_init (self);
- break;
- case MISC_CORPSE_SEQ_KNIGHT_HEAD:
- item_head_knight_init (self);
- break;
- case MISC_CORPSE_SEQ_ENFORCER_HEAD:
- item_head_enforcer_init (self);
- break;
- case MISC_CORPSE_SEQ_OGRE_HEAD:
- item_head_ogre_init (self);
- break;
- case MISC_CORPSE_SEQ_PLAYER_HEAD:
- item_head_player_init (self);
- break;
- case MISC_CORPSE_SEQ_SHALRATH_HEAD:
- item_head_shalrath_init (self);
- break;
- case MISC_CORPSE_SEQ_SHAMBLER_HEAD:
- item_head_shambler_init (self);
- break;
- case MISC_CORPSE_SEQ_WIZARD_HEAD:
- item_head_wizard_init (self);
- break;
- case MISC_CORPSE_SEQ_ZOMBIE_HEAD:
- item_head_zombie_init (self);
- break;
- case MISC_CORPSE_SEQ_GIB_1:
- item_gib1_init (self);
- break;
- case MISC_CORPSE_SEQ_GIB_2:
- item_gib2_init (self);
- break;
- case MISC_CORPSE_SEQ_GIB_3:
- item_gib3_init (self);
+ case ITEM_SEQ_HEAD_DEMON..ITEM_SEQ_GIB3:
+ self.weapon = self.style;
+ self.style = 0;
+ base_item_throwable_init (self);
break;
default:
objerror ("misc_corpse with invalid style");
@@ -340,3 +267,35 @@ Custom exploding box
};
// };
#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// class hub_trigger_changelevel: trigger_changelevel
+// {
+ //--------------------------------------------------------------
+ void() hub_trigger_changelevel =
+ {
+ if ((serverflags & SIGIL_ALL) !=SIGIL_ALL)
+ {
+ remove (self);
+ return;
+ }
+
+ trigger_changelevel ();
+ };
+// }
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// class trigger_cleanup_corpses: entity
+// {
+ //--------------------------------------------------------------
+ // TODO CEV might not be a bad idea to implement this for real
+ //--------------------------------------------------------------
+ void() trigger_cleanup_corpses =
+ {
+ remove (self);
+ };
+// };
+#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/compat/quake3.qc
diff --git a/qc/compat/quake3.qc b/qc/compat/quake3.qc
index a25e0ed..1cbfcf1 100644
--- a/qc/compat/quake3.qc
+++ b/qc/compat/quake3.qc
@@ -161,8 +161,8 @@ void() spawnfunc_item_health_mega =
return;
self.classname = "item_health";
- self.spawnflags |= SPAWNFLAG_ITEM_HEALTH_MEGA;
- item_health_init (self);
+ self.weapon = ITEM_SEQ_HEALTH_MEGA;
+ base_item_health_init (self);
};
//----------------------------------------------------------------------
@@ -184,7 +184,8 @@ void() spawnfunc_item_health_small =
return;
self.classname = "item_health_vial";
- item_health_vial_init (self);
+ self.weapon = ITEM_SEQ_HEALTH_VIAL;
+ base_item_health_init (self);
};
#endif
@@ -230,8 +231,8 @@ void() spawnfunc_weapon_plasmagun =
if (SUB_Inhibit ())
return;
- self.classname = "weapon_supernailgun";
- weapon_supernailgun_init (self);
+ self.weapon = ITEM_SEQ_SUPERNAILGUN;
+ base_item_weapon_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/cshift.qc
diff --git a/qc/cshift.qc b/qc/cshift.qc
index 086d7f2..2582970 100644
--- a/qc/cshift.qc
+++ b/qc/cshift.qc
@@ -14,9 +14,6 @@
.float csf_finished; // finish fade at this time
.float csf_speed; // fade at this speed
#endif
-#ifdef SSQC
-.float fade_amt; // see trigger_textstory
-#endif
//======================================================================
// forward declarations
Return to the top of this page or return to the overview of this repo.
Diff qc/cutscene.qc
diff --git a/qc/cutscene.qc b/qc/cutscene.qc
index bdbe71d..a5ed11a 100644
--- a/qc/cutscene.qc
+++ b/qc/cutscene.qc
@@ -15,15 +15,15 @@ float modelindex_invisible; // Invisible (null sprite)
// fields
//======================================================================
-.float script_count; // dhm - ditto.
-.float script_delay; // dhm - time until next script.
-.float script_time; // dhm - used for script timing.
+// .float script_count; // dhm - ditto.
+// .float script_delay; // dhm - time until next script.
+// .float script_time; // dhm - used for script timing.
// .string camera_point; // dhm - target for camera to move to.
-.string focal_point; // dhm - focus point for camera.
-.string script; // dhm - denotes which script to read.
-.string script_num; // dhm - number for info_scripts.
-.string next_script; // dhm - denotes the current script.
+// .string focal_point; // dhm - focus point for camera.
+// .string script; // dhm - denotes which script to read.
+// .string script_num; // dhm - number for info_scripts.
+// .string next_script; // dhm - denotes the current script.
//======================================================================
// forward declarations
Return to the top of this page or return to the overview of this repo.
Diff qc/defs_builtins.qc
diff --git a/qc/defs_builtins.qc b/qc/defs_builtins.qc
index 6d0e31e..e550e9e 100644
--- a/qc/defs_builtins.qc
+++ b/qc/defs_builtins.qc
@@ -349,23 +349,21 @@ void(entity e) setspawnparms = #78;
// Centerprint
//----------------------------------------------------------------------
-.float suppressCenterPrint;
-
void(entity client, string s1) centerprint_builtin = #73;
void(entity client, string s1) centerprint =
{
// Is the centerprint message being used by something else?
- if (!client.suppressCenterPrint)
+ if (client.stateflags & STATE_SUPPRESSCENTERPRINT)
{
- centerprint_builtin(client, s1);
+ // Send message to client console instead
+ sprint (client, "(centerprint) ");
+ sprint (client, s1);
+ sprint (client, "\n");
}
else
{
- // Send message to client console instead
- sprint(client, "(centerprint) ");
- sprint(client, s1);
- sprint(client, "\n");
+ centerprint_builtin (client, s1);
}
};
#endif
@@ -458,6 +456,13 @@ string(string s, ...) strzone = #118;
void(string s) strunzone = #119;
#endif
+#ifdef CSQC
+// copied from fteextensions.qc -- CEV
+// Plays a sound... locally... Also disables reverb
+void(string soundname, optional float channel, optional float volume)
+ localsound = #177;
+#endif
+
#if defined(CSQC) || defined(SSQC)
// Part of EXT_CSQC -- copied from fteextensions.qc -- CEV
// Acts as an alternative to:
Return to the top of this page or return to the overview of this repo.
Diff qc/defs_const.qc
diff --git a/qc/defs_const.qc b/qc/defs_const.qc
index da170e8..22f99ca 100644
--- a/qc/defs_const.qc
+++ b/qc/defs_const.qc
@@ -36,9 +36,9 @@ typedef enumflags
// INPUT_BUTTON1, // not supported by the network protocol
INPUT_BUTTON2, // jump
INPUT_BUTTON3, //
- INPUT_BUTTON4, //
+ INPUT_BUTTON4, // grab/throw
INPUT_BUTTON5, //
- INPUT_BUTTON6, // grab
+ INPUT_BUTTON6, //
INPUT_BUTTON7, // walk
INPUT_BUTTON8 // crouch
} input_button_flags;
@@ -152,8 +152,8 @@ typedef enumflags
IT_ARMOR2 = 16384,
IT_ARMOR3 = 32768,
IT_SUPERHEALTH = 65536, // megahealth
- IT_KEY1 = 131072, // id1 keys
- IT_KEY2 = 262144,
+ IT_KEY1 = 131072, // id1 keys: silver
+ IT_KEY2 = 262144, // id1 keys: gold
IT_INVISIBILITY = 524288, // id1 ring
IT_INVULNERABILITY = 1048576, // id1 pent
IT_SUIT = 2097152, // id1 environment suit
@@ -170,7 +170,17 @@ typedef enumflags
EF_BRIGHTFIELD = 1,
EF_MUZZLEFLASH = 2,
EF_BRIGHTLIGHT = 4,
- EF_DIMLIGHT = 8
+ EF_DIMLIGHT = 8,
+ EF_NODRAW = 16, // don't draw the model
+ EF_ADDITIVE = 32, // additive blend
+ EF_BLUE = 64, // blue glow
+ EF_RED = 128, // red glow
+ EF_GREEN = 262144, // green glow
+ EF_FULLBRIGHT = 512, // ignore lighting
+ EF_NOSHADOW = 4096, // This entity will not cast shadows
+ EF_NODEPTHTEST = 8192, // drawn over top
+ EF_REDTINT = 65536, // red color tint -- CEV
+ EF_NOMODELFLAGS = 8388608 // suppress model flags
} entity_effects_flags;
#endif
@@ -193,13 +203,14 @@ typedef enum
//----------------------------------------------------------------------
// entity .deadflag values
//----------------------------------------------------------------------
-typedef enum
+typedef enumflags
{
- DEAD_NO = 0,
- DEAD_DYING = 1,
- DEAD_DEAD = 2,
- DEAD_RESPAWNABLE = 3
-} entity_deadflag_types;
+ DF_NO = 0, // was 0
+ DF_DYING = 1, // was 1
+ DF_DEAD = 2, // was 2
+ DF_RESPAWNABLE = 4, // was 3
+ DF_GIBBED = 8
+} entity_dead_flags;
#endif
#ifdef SSQC
@@ -209,8 +220,8 @@ typedef enum
typedef enum
{
DAMAGE_NO = 0,
- DAMAGE_YES = 1,
- DAMAGE_AIM = 2
+ DAMAGE_YES = 1, // this ent takes damage
+ DAMAGE_AIM = 2 // checked in the engine by aim ()
} entity_takedamage_types;
#endif
@@ -256,7 +267,7 @@ typedef enumflags
} world_q3surfaceflags;
#endif
-#ifdef SSQC
+#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
// sound channels
//----------------------------------------------------------------------
@@ -271,14 +282,14 @@ typedef enum
CHAN_ITEM_HEALTH, // health sounds
CHAN_ITEM_POWERUP, // powerup sounds
CHAN_ITEM_WEAPON, // weapon sounds
- CHAN_ITEM_WEAPON_ROCKETS, // rocket launcher sounds
CHAN_BODY, //
CHAN_FEET, // dedicated channel for steps -- CEV
- CHAN_SLIDE // dedicated channel for sliding -- CEV
+ CHAN_SLIDE, // dedicated channel for sliding -- CEV
+ CHAN_ROCKETS // rocket launcher sounds
} sound_channels;
#endif
-#ifdef SSQC
+#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
// sound attenuation values
//----------------------------------------------------------------------
@@ -320,6 +331,7 @@ typedef enumflags
SOUNDFLAG_ABSVOLUME = 16, // CSQC: vol isn't scaled by vol cvar
SOUNDFLAG_NOREVERB = 32, // CSQC & SSQC: disable reverb
SOUNDFLAG_FOLLOW = 64, // CSQC & SSQC: update to follow emitter
+ SOUNDFLAG_NOREPLACE = 128, // CSQC & SSQC: ignore if chan busy
SOUNDFLAG_UNICAST = 256, // SSQC: heard only by msg_entity ent
SOUNDFLAG_SENDVELOCITY = 512 // SSQC: vel will be sent (for doppler)
} sound_flags;
@@ -509,14 +521,15 @@ typedef enum
#ifdef CSQC
//----------------------------------------------------------------------
-// drawmask flags; these constants are only used in CSQC_UpdateView -- CEV
+// drawmask flags; used to filter addentities calls -- CEV
//----------------------------------------------------------------------
typedef enumflags
{
DRAWMASK_NONE = 0,
DRAWMASK_ENGINE = 1,
DRAWMASK_VIEWMODEL = 2,
- DRAWMASK_NORMAL = 4
+ DRAWMASK_NORMAL = 4,
+ DRAWMASK_PLAYER = 8
} game_client_drawflags;
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/defs_ctypes.qc
diff --git a/qc/defs_ctypes.qc b/qc/defs_ctypes.qc
index 2a7fee4..c04416c 100644
--- a/qc/defs_ctypes.qc
+++ b/qc/defs_ctypes.qc
@@ -16,6 +16,40 @@
//======================================================================
//----------------------------------------------------------------------
+// classgroups, defined as needed; I did not want to do this -- CEV
+// go no higher than 24 bits (according to the FTEQCC manual) -- CEV
+// current count: 17 -- CEV
+//----------------------------------------------------------------------
+#if defined(CSQC) || defined(SSQC)
+typedef enumflags
+{
+ CG_TEMPENTITY, // temporary entities
+ CG_MAPENTITY, // mapper-placeable entities
+ CG_CORPSE, // corpses, gibs, heads
+ CG_FUNC, // func_*
+ CG_FUNC_ROTATE, // rotation objects
+ CG_ITEM, // items
+ CG_ITEM_ARMOR, // armor pickups
+ CG_ITEM_AMMO, // ammunition boxes
+ CG_ITEM_HEALTH, // health pickups
+ CG_ITEM_KEY, // keys
+ CG_ITEM_POWERUP, // powerups
+ CG_ITEM_WEAPON, // weapon pickups
+ CG_MONSTER, //
+ CG_MONSTER_FLY, //
+ CG_MONSTER_SWIM, //
+ CG_PROJECTILE, // missiles & projectiles
+ CG_TRIGGER, // trigger_*
+ CG_UNUSED1, // unused classgroup flags
+ CG_UNUSED2,
+ CG_UNUSED3,
+ CG_UNUSED4,
+ CG_UNUSED5,
+ CG_FRAMETICK // inspired by the MG1 frametick system
+} entity_groups;
+#endif
+
+//----------------------------------------------------------------------
// classtype list; shared by client & server
//----------------------------------------------------------------------
#if defined(CSQC) || defined(SSQC)
@@ -25,7 +59,6 @@ typedef enum
//--------------------------------------------------------------
// these entities may be networked to the client -- CEV
- // current count: 35 -- CEV
//--------------------------------------------------------------
CT_PLAYER, // player (client)
@@ -45,6 +78,7 @@ typedef enum
CT_FUNC_EXPLOBOX, // id1 func_explobox
CT_FUNC_FALL, // RennyC func_fall
CT_FUNC_FALL2, // RennyC & whirledtsar func_fall2
+ CT_FUNC_HURT, // mg1 func_hurt
CT_FUNC_LASER, // Rubicon2 func_laser
CT_FUNC_MOVEWALL, // Hipnotic rotation
CT_FUNC_NEW_PLAT, // Rogue / PD3 new_plat
@@ -54,6 +88,7 @@ typedef enum
CT_FUNC_ROTATE_TRAIN, // Hipnotic rotation
CT_FUNC_TOGGLEVISIBLEWALL, // pd3(?) togglevisiblewall
CT_FUNC_TOGGLEWALL, // Hipnotic func_togglewall
+ CT_FUNC_TOSS, // mg1 func_toss
CT_FUNC_TRAIN, // id1 train
CT_FUNC_WALL, // func_wall
@@ -68,6 +103,7 @@ typedef enum
CT_ITEM_ARMOR_SHARD, // pd3 armor shards
CT_ITEM_AXE, // id1 weapon axe
CT_ITEM_BACKPACK, // id1 backpacks
+ CT_ITEM_DEBRIS, // misc. debris from breakables, other
CT_ITEM_ENVIROSUIT, // id1 powerup environment suit
CT_ITEM_GIB1, // id1 standard gibs
CT_ITEM_GIB2, // ^^^^^
@@ -100,6 +136,7 @@ typedef enum
CT_ITEM_SHOTGUN, // id1 weapon shotgun (SG)
CT_ITEM_SUPER_NAILGUN, // id1 weapon super nailgun (SNG)
CT_ITEM_SUPER_SHOTGUN, // id1 weapon super shotgun (SSG)
+ CT_ITEM_TORCH, // walltorch item
// misc
CT_MISC_BOB, // RennyC func_bob
@@ -154,8 +191,8 @@ typedef enum
CT_TRIGGER_TELEPORT, // id1 teleporters
//--------------------------------------------------------------
- // entity types past 255 aren't networked to client - for ents
- // that aren't visible and don't effect player movement -- CEV
+ // entity types past 255 aren't networked to CSQC with SendEntity
+ // (for ents that aren't visible / don't effect player movement -- CEV
//--------------------------------------------------------------
// func
@@ -207,7 +244,7 @@ typedef enum
CT_LIGHT_FLUOROSPARK, // id1 light_fluorospark
CT_LIGHT_GLOBE, // id1 light_globe
CT_LIGHT_SPRITE_FLAME, // pd3 sprite flame
- CT_LIGHT_TORCH_SMALL_WALLTORCH, // id1
+ CT_LIGHT_TORCH_SMALL_WALLTORCH, // id1 walltorch
// misc
CT_MISC_AIR_BUBBLES, // id1 air bubbles
@@ -273,6 +310,7 @@ typedef enum
CT_TRIGGER_CHANGEMUSIC, // jleww via changemusic.rar
CT_TRIGGER_CHANGETARGET, // change an entity's target field
CT_TRIGGER_COUNTER, // id1 trigger_counter
+ CT_TRIGGER_COUNTER_TIMED, // mg1 trigger_counter_timed
CT_TRIGGER_CVARSET, // was in cutscene.qc; from Drake?
CT_TRIGGER_EVERYTHING, // pd3; unknown prior source
CT_TRIGGER_EXPLOSION, // mg1 trigger_explosion
@@ -289,6 +327,7 @@ typedef enum
CT_TRIGGER_ONCE, // id1 trigger_once
CT_TRIGGER_ONLYREGISTERED, // id1 registered content trigger
CT_TRIGGER_RELAY, // id1 trigger_relay
+ CT_TRIGGER_REPEATER, // mg1 trigger_repeater
CT_TRIGGER_SECRET, // id1 secret trigger
CT_TRIGGER_SETSKILL, // id1 setskill trigger
CT_TRIGGER_SCREENSHAKE, // mg1 screen shake trigger
@@ -316,37 +355,3 @@ typedef enum
CT_TEMP_WIZARDSPELL // id1 wizard spell (spawns missiles)
} entity_types;
#endif
-
-//----------------------------------------------------------------------
-// classgroups, defined as needed; I did not want to do this -- CEV
-// go no higher than 24 bits (according to the FTEQCC manual) -- CEV
-// current count: 17 -- CEV
-//----------------------------------------------------------------------
-#if defined(CSQC) || defined(SSQC)
-typedef enumflags
-{
- CG_TEMPENTITY, // temporary entities
- CG_MAPENTITY, // mapper-placeable entities
- CG_CORPSE, // corpses, gibs, heads
- CG_FUNC, // func_*
- CG_FUNC_ROTATE, // rotation objects
- CG_ITEM, // items
- CG_ITEM_ARMOR, // armor pickups
- CG_ITEM_AMMO, // ammunition boxes
- CG_ITEM_HEALTH, // health pickups
- CG_ITEM_KEY, // keys
- CG_ITEM_POWERUP, // powerups
- CG_ITEM_WEAPON, // weapon pickups
- CG_MONSTER, //
- CG_MONSTER_FLY, //
- CG_MONSTER_SWIM, //
- CG_PROJECTILE, // missiles & projectiles
- CG_TRIGGER, // trigger_*
- CG_UNUSED1, // unused classgroup flags
- CG_UNUSED2,
- CG_UNUSED3,
- CG_UNUSED4,
- CG_UNUSED5,
- CG_FRAMETICK // inspired by the MG1 frametick system
-} entity_groups;
-#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/defs_fields.qc
diff --git a/qc/defs_fields.qc b/qc/defs_fields.qc
index 4bbf6e9..e710380 100644
--- a/qc/defs_fields.qc
+++ b/qc/defs_fields.qc
@@ -44,7 +44,10 @@
.string weaponmodel;
.float weaponframe;
.float currentammo;
-.float ammo_shells, ammo_nails, ammo_rockets, ammo_cells;
+.float ammo_shells;
+.float ammo_nails;
+.float ammo_rockets;
+.float ammo_cells;
.float items; // bit flags
// next three comments from AD
@@ -108,7 +111,10 @@
.float sounds; // a cd track number or sound number
-.string noise, noise1, noise2, noise3; // contains names of wavs to play
+.string noise; // contains names of wavs to play
+.string noise1;
+.string noise2;
+.string noise3;
//======================================================================
void end_sys_fields; // flag for structure dumping
Return to the top of this page or return to the overview of this repo.
Diff qc/defs_items.qc
diff --git a/qc/defs_items.qc b/qc/defs_items.qc
index 97cffeb..4029e02 100644
--- a/qc/defs_items.qc
+++ b/qc/defs_items.qc
@@ -59,28 +59,119 @@ typedef enum
ITEM_SEQ_ARTIFACT_INVISIBILITY,
ITEM_SEQ_ARTIFACT_INVULNERABILITY,
ITEM_SEQ_ARTIFACT_QUAD,
- ITEM_SEQ_GIB1, // id1 gibs
- ITEM_SEQ_GIB2,
- ITEM_SEQ_GIB3,
- ITEM_SEQ_HEAD_ARMY, // id1 monster heads
- ITEM_SEQ_HEAD_DEMON,
+ ITEM_SEQ_CORPSE_DEMON_1, // id1 monster corpses
+ ITEM_SEQ_CORPSE_DOG_1, // from ITEM_SEQ_CORPSE_DEMON_1 to
+ ITEM_SEQ_CORPSE_DOG_2, // ITEM_SEQ_GIB3 this list matches
+ ITEM_SEQ_CORPSE_ENFORCER_1, // the order of poses[] from mg1 -- CEV
+ ITEM_SEQ_CORPSE_ENFORCER_2,
+ ITEM_SEQ_CORPSE_FISH_1,
+ ITEM_SEQ_CORPSE_HKNIGHT_1,
+ ITEM_SEQ_CORPSE_HKNIGHT_2,
+ ITEM_SEQ_CORPSE_KNIGHT_1,
+ ITEM_SEQ_CORPSE_KNIGHT_2,
+ ITEM_SEQ_CORPSE_OGRE_1,
+ ITEM_SEQ_CORPSE_OGRE_2,
+ ITEM_SEQ_CORPSE_SHALRATH_1,
+ ITEM_SEQ_CORPSE_SHAMBLER_1,
+ ITEM_SEQ_CORPSE_SOLDIER_1,
+ ITEM_SEQ_CORPSE_SOLDIER_2,
+ ITEM_SEQ_CORPSE_WIZARD_1,
+ ITEM_SEQ_CORPSE_PLAYER_1, // id1 player corpses
+ ITEM_SEQ_CORPSE_PLAYER_2,
+ ITEM_SEQ_CORPSE_PLAYER_3,
+ ITEM_SEQ_CORPSE_PLAYER_4,
+ ITEM_SEQ_CORPSE_PLAYER_5,
+ ITEM_SEQ_CORPSE_PLAYER_6,
+ ITEM_SEQ_HEAD_DEMON, // id1 monster heads
ITEM_SEQ_HEAD_DOG,
- ITEM_SEQ_HEAD_ENFORCER,
+ ITEM_SEQ_HEAD_ARMY,
ITEM_SEQ_HEAD_HELLKNIGHT,
ITEM_SEQ_HEAD_KNIGHT,
+ ITEM_SEQ_HEAD_ENFORCER,
ITEM_SEQ_HEAD_OGRE,
ITEM_SEQ_HEAD_PLAYER,
ITEM_SEQ_HEAD_SHALRATH,
ITEM_SEQ_HEAD_SHAMBLER,
ITEM_SEQ_HEAD_WIZARD,
- ITEM_SEQ_HEAD_ZOMBIE
+ ITEM_SEQ_HEAD_ZOMBIE,
+ ITEM_SEQ_GIB1, // id1 gibs
+ ITEM_SEQ_GIB2,
+ ITEM_SEQ_GIB3,
+ ITEM_SEQ_DEBRIS_GREENMETAL, // rubicon / pd3 debris (debris.mdl)
+ ITEM_SEQ_DEBRIS_REDMETAL,
+ ITEM_SEQ_DEBRIS_CONCRETE,
+ ITEM_SEQ_DEBRIS_PINEWOOD,
+ ITEM_SEQ_DEBRIS_BROWNWOOD,
+ ITEM_SEQ_DEBRIS_REDWOOD,
+ ITEM_SEQ_DEBRIS_GLASSYELLOWFLAMES,
+ ITEM_SEQ_DEBRIS_GLASSREDRAYS,
+ ITEM_SEQ_DEBRIS_GLASSYELLOWDRAGON,
+ ITEM_SEQ_DEBRIS_GLASSBLUEDRAGON,
+ ITEM_SEQ_DEBRIS_GLASSREDDRAGON,
+ ITEM_SEQ_DEBRIS_LIGHTCOPPER,
+ ITEM_SEQ_DEBRIS_DARKCOPPER,
+ ITEM_SEQ_DEBRIS_TANBRICKSLG,
+ ITEM_SEQ_DEBRIS_BROWNBRICKSLG,
+ ITEM_SEQ_DEBRIS_GREENBRICKSLG,
+ ITEM_SEQ_DEBRIS_GENLIGHTBROWN,
+ ITEM_SEQ_DEBRIS_REDBROWNCOMP,
+ ITEM_SEQ_DEBRIS_GREYBLACKCOMP,
+ ITEM_SEQ_DEBRIS_BLUEGREENMETAL,
+ ITEM_SEQ_DEBRIS_BLUEGREENRUNIC,
+ ITEM_SEQ_DEBRIS_BROWNMETAL,
+ ITEM_SEQ_DEBRIS_DARKBROWNMETAL,
+ ITEM_SEQ_DEBRIS_MEDIUMBROWNMETAL,
+ ITEM_SEQ_DEBRIS_BLUEMETAL,
+ ITEM_SEQ_DEBRIS_GREENSTONE,
+ ITEM_SEQ_DEBRIS_BLUESTONE,
+ ITEM_SEQ_DEBRIS_BROWNBRICKS,
+ ITEM_SEQ_DEBRIS_TANBLUEBRICKS,
+ ITEM_SEQ_DEBRIS_REDBRICKS,
+ ITEM_SEQ_DEBRIS_BLUEBRICKS,
+ ITEM_SEQ_DEBRIS_METALRIVETS,
+ ITEM_SEQ_TORCH
} item_seq;
+// ranges within item_seq -- CEV
#define ITEM_SEQ_W_START ITEM_SEQ_AXE
#define ITEM_SEQ_W_END ITEM_SEQ_LIGHTNINGGUN
-#define ITEM_SEQ_HEAD_START ITEM_SEQ_HEAD_ARMY
+#define ITEM_SEQ_PACKS_START ITEM_SEQ_BACKPACK
+#define ITEM_SEQ_PACKS_END ITEM_SEQ_PD3BACKPACK
+#define ITEM_SEQ_THROWABLE_START ITEM_SEQ_CORPSE_DEMON_1
+#define ITEM_SEQ_THROWABLE_END ITEM_SEQ_DEBRIS_METALRIVETS
+#define ITEM_SEQ_HEAD_START ITEM_SEQ_HEAD_DEMON
#define ITEM_SEQ_HEAD_END ITEM_SEQ_HEAD_ZOMBIE
+#define ITEM_SEQ_GIBS_START ITEM_SEQ_HEAD_DEMON
+#define ITEM_SEQ_GIBS_END ITEM_SEQ_GIB3
+#define ITEM_SEQ_BREAKABLE_START ITEM_SEQ_DEBRIS_GREENMETAL
+#define ITEM_SEQ_BREAKABLE_END ITEM_SEQ_DEBRIS_METALRIVETS
+#endif
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// item_model_t (broken out for some deduplication) -- CEV
+//----------------------------------------------------------------------
+typedef struct
+{
+ string view_model; // viewmodel for the item
+ vector view_origin_offset; // viewmodel origin offset
+ vector view_angles_offset; // viewmodel angles offset
+ string world_model; // model to be displayed in the world
+ vector world_mins; // world model .mins / .pos1
+ vector world_maxs; // world model .maxs / .pos2
+} item_model_t;
+
+#define M(var) const item_model_t item_model_##var
+M(debris) = {"progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32'};
+M(torch) = {"progs/flame.mdl", '20 -10 -3', '0 10 0',
+ "progs/flame.mdl", '-3.5 -3.5 -14', '3.5 3.5 40'};
+#undef M
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// ammo types (stored in .option) -- CEV
//----------------------------------------------------------------------
typedef enum
{
@@ -90,238 +181,440 @@ typedef enum
ITEM_AMMO_ROCKETS,
ITEM_AMMO_CELLS
} item_ammo_types;
+#endif
+#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
// item_info -- CEV
//----------------------------------------------------------------------
typedef struct
{
- float class; // classtype
- float option; // ammo type (if any), .skin
- float pickup_vol; // volume of pickup sound
+ string name; // plaintext name (netname) of the item
+ string classname; // .classname
+ float classtype; // .classtype
+ float dmg; // damage dealt when thrown
+ float option; // ammo type, .item (for keys)
+ sound_info_t pickup_sound; // sound to play on pickup
+ string view_model; // viewmodel for the item
vector view_origin_offset; // viewmodel origin offset
vector view_angles_offset; // viewmodel angles offset
- string name; // plaintext name (netname) of the item
- string pickup_sound; // sound to play on pickup
string world_model; // model to be displayed in the world
- string view_model; // viewmodel for the item
+ vector world_mins; // world model .mins / .pos1
+ vector world_maxs; // world model .maxs / .pos2
+ float world_frame; // world model .frame
+ float world_skin; // world model .skin
} item_info_t;
// entries in this array must match the order of elements in item_seq -- CEV
-item_info_t item_info[] =
+const item_info_t item_info[] =
{
// index 0: empty hands
- {0, 0, 0, '0 0 0', '0 0 0', "Hands", "", "", ""},
+ {"Hands", "item_hands", 0, 0, 0, snd_empty},
- // index 1-8: id1 weapons, second field is ammo type
- {CT_ITEM_AXE, 0, 0.3, '0 0 0', '0 0 0',
- "Axe", "cev/items/weapon_pickup.ogg",
- "progs/g_axe.mdl", "progs/v_axe.mdl"},
- {CT_ITEM_SHOTGUN, ITEM_AMMO_SHELLS, 0.3, '0 0 0', '0 0 0',
- "Shotgun", "cev/items/weapon_pickup.ogg",
- "progs/g_shotgu.mdl", "progs/v_shot.mdl"},
- {CT_ITEM_SUPER_SHOTGUN, ITEM_AMMO_SHELLS, 0.3, '0 0 0', '0 0 0',
- "Double-barrelled Shotgun", "cev/items/weapon_pickup.ogg",
- "progs/g_shot.mdl", "progs/v_shot2.mdl"},
- {CT_ITEM_NAILGUN, ITEM_AMMO_NAILS, 0.3, '0 0 0', '0 0 0',
- "Nailgun", "cev/items/weapon_pickup.ogg",
- "progs/g_nail.mdl", "progs/v_nail.mdl"},
- {CT_ITEM_SUPER_NAILGUN, ITEM_AMMO_NAILS, 0.3, '0 0 0', '0 0 0',
- "Super Nailgun", "cev/items/weapon_pickup.ogg",
- "progs/g_nail2.mdl", "progs/v_nail2.mdl"},
- {CT_ITEM_GRENADE_LAUNCHER, ITEM_AMMO_ROCKETS, 0.3, '0 0 0', '0 0 0',
- "Grenade Launcher", "cev/items/weapon_pickup.ogg",
- "progs/g_rock.mdl", "progs/v_rock.mdl"},
- {CT_ITEM_ROCKET_LAUNCHER, ITEM_AMMO_ROCKETS, 0.3, '0 0 0', '0 0 0',
- "Rocket Launcher", "cev/items/weapon_pickup.ogg",
- "progs/g_rock2.mdl", "progs/v_rock2.mdl"},
- {CT_ITEM_LIGHTNING_GUN, ITEM_AMMO_CELLS, 0.3, '0 0 0', '0 0 0',
- "Thunderbolt", "cev/items/weapon_pickup.ogg",
- "progs/g_light.mdl", "progs/v_light.mdl"},
+ // index 1-8: id1 weapons, option is ammo type
+ {"Axe", "weapon_axe", CT_ITEM_AXE, 0, 0,
+ snd_item_weapon,
+ "progs/v_axe.mdl", '0 0 0', '0 0 0',
+ "progs/g_axe.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"Shotgun", "weapon_shotgun", CT_ITEM_SHOTGUN, 0, ITEM_AMMO_SHELLS,
+ snd_item_weapon,
+ "progs/v_shot.mdl", '0 0 0', '0 0 0',
+ "progs/g_shotgu.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"Double-barrelled Shotgun", "weapon_supershotgun",
+ CT_ITEM_SUPER_SHOTGUN, 0, ITEM_AMMO_SHELLS,
+ snd_item_weapon,
+ "progs/v_shot2.mdl", '0 0 0', '0 0 0',
+ "progs/g_shot.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"Nailgun", "weapon_nailgun", CT_ITEM_NAILGUN, 0, ITEM_AMMO_NAILS,
+ snd_item_weapon,
+ "progs/v_nail.mdl", '0 0 0', '0 0 0',
+ "progs/g_nail.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"Super Nailgun", "weapon_supernailgun",
+ CT_ITEM_SUPER_NAILGUN, 0, ITEM_AMMO_NAILS,
+ snd_item_weapon,
+ "progs/v_nail2.mdl", '0 0 0', '0 0 0',
+ "progs/g_nail2.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"Grenade Launcher", "weapon_grenadelauncher",
+ CT_ITEM_GRENADE_LAUNCHER, 0, ITEM_AMMO_ROCKETS,
+ snd_item_weapon,
+ "progs/v_rock.mdl", '0 0 0', '0 0 0',
+ "progs/g_rock.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"Rocket Launcher", "weapon_rocketlauncher",
+ CT_ITEM_ROCKET_LAUNCHER, 0, ITEM_AMMO_ROCKETS,
+ snd_item_weapon,
+ "progs/v_rock2.mdl", '0 0 0', '0 0 0',
+ "progs/g_rock2.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"Thunderbolt", "weapon_lightning",
+ CT_ITEM_LIGHTNING_GUN, 0, ITEM_AMMO_CELLS,
+ snd_item_weapon,
+ "progs/v_light.mdl", '0 0 0', '0 0 0',
+ "progs/g_light.mdl", '-16 -16 0', '16 16 56', 0, 0},
// index 9-16: id1 ammo (small then large)
- {CT_ITEM_AMMO_SHELLS, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "shells", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_shell1.mdl", "progs/a_mdls/m_shell1.mdl"},
- {CT_ITEM_AMMO_SHELLS, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "shells", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_shell2.mdl", "progs/a_mdls/m_shell2.mdl"},
- {CT_ITEM_AMMO_SPIKES, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "nails", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_nails1.mdl", "progs/a_mdls/m_nails1.mdl"},
- {CT_ITEM_AMMO_SPIKES, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "nails", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_nails2.mdl", "progs/a_mdls/m_nails2.mdl"},
- {CT_ITEM_AMMO_ROCKETS, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "rockets", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_rock1.mdl", "progs/a_mdls/m_rock1.mdl"},
- {CT_ITEM_AMMO_ROCKETS, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "rockets", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_rock2.mdl", "progs/a_mdls/m_rock2.mdl"},
- {CT_ITEM_AMMO_CELLS, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "cells", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_cells1.mdl", "progs/a_mdls/m_cells1.mdl"},
- {CT_ITEM_AMMO_CELLS, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "cells", "cev/items/ammo_pickup.ogg",
- "progs/a_mdls/m_cells2.mdl", "progs/a_mdls/m_cells2.mdl"},
+ {"shells", "item_shells", CT_ITEM_AMMO_SHELLS, 10, 0, snd_item_ammo,
+ "progs/a_mdls/m_shell1.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_shell1.mdl", '0 0 0', '24 24 32', 0, 0},
+ {"shells", "item_shells", CT_ITEM_AMMO_SHELLS, 15, 0, snd_item_ammo,
+ "progs/a_mdls/m_shell2.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_shell2.mdl", '0 0 0', '24 24 32', 0, 0},
+ {"nails", "item_spikes", CT_ITEM_AMMO_SPIKES, 10, 0, snd_item_ammo,
+ "progs/a_mdls/m_nails1.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_nails1.mdl", '0 0 0', '24 24 32', 0, 0},
+ {"nails", "item_spikes", CT_ITEM_AMMO_SPIKES, 15, 0, snd_item_ammo,
+ "progs/a_mdls/m_nails2.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_nails2.mdl", '0 0 0', '24 24 32', 0, 0},
+ {"rockets", "item_rockets", CT_ITEM_AMMO_ROCKETS, 10, 0, snd_item_ammo,
+ "progs/a_mdls/m_rock1.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_rock1.mdl", '0 0 0', '24 24 32', 0, 0},
+ {"rockets", "item_rockets", CT_ITEM_AMMO_ROCKETS, 15, 0, snd_item_ammo,
+ "progs/a_mdls/m_rock2.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_rock2.mdl", '0 0 0', '24 24 32', 0, 0},
+ {"cells", "item_cells", CT_ITEM_AMMO_CELLS, 10, 0, snd_item_ammo,
+ "progs/a_mdls/m_cells1.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_cells1.mdl", '0 0 0', '24 24 32', 0, 0},
+ {"cells", "item_cells", CT_ITEM_AMMO_CELLS, 15, 0, snd_item_ammo,
+ "progs/a_mdls/m_cells2.mdl", '40 -13 -35', '0 10 0',
+ "progs/a_mdls/m_cells2.mdl", '0 0 0', '24 24 32', 0, 0},
- // id1 armor (second field is .skin)
- {CT_ITEM_ARMOR_GREEN, 0, VOL_MHI, '40 -13 -35', '0 190 0',
- "green armor", "items/armor1.wav",
- "progs/armor.mdl", "progs/armor.mdl"},
- {CT_ITEM_ARMOR_YELLOW, 1, VOL_MHI, '40 -13 -35', '0 190 0',
- "yellow armor", "items/armor1.wav",
- "progs/armor.mdl", "progs/armor.mdl"},
- {CT_ITEM_ARMOR_RED, 2, VOL_MHI, '40 -13 -35', '0 190 0',
- "red armor", "items/armor1.wav",
- "progs/armor.mdl", "progs/armor.mdl"},
+ // id1 armor
+ {"green armor", "item_armor1", CT_ITEM_ARMOR_GREEN, 15, 0,
+ snd_item_armor,
+ "progs/armor.mdl", '40 -13 -35', '0 190 0',
+ "progs/armor.mdl", '-16 -16 0', '16 16 56', 0, 0},
+ {"yellow armor", "item_armor2", CT_ITEM_ARMOR_YELLOW, 15, 0,
+ snd_item_armor,
+ "progs/armor.mdl", '40 -13 -35', '0 190 0',
+ "progs/armor.mdl", '-16 -16 0', '16 16 56', 0, 1},
+ {"red armor", "item_armorInv", CT_ITEM_ARMOR_RED, 15, 0,
+ snd_item_armor,
+ "progs/armor.mdl", '40 -13 -35', '0 190 0',
+ "progs/armor.mdl", '-16 -16 0', '16 16 56', 0, 2},
// pd3 armor shard
- {CT_ITEM_ARMOR_SHARD, 0, VOL_LOW, '40 -13 -35', '0 10 0',
- "armor shard", "cev/items/shard_pickup.ogg",
- "progs/armshr.mdl", "progs/armshr.mdl"},
+ {"armor shard", "item_armor_shard", CT_ITEM_ARMOR_SHARD, 5, 0,
+ snd_item_shard,
+ "progs/armshr.mdl", '40 -13 -35', '0 10 0',
+ "progs/armshr.mdl", '-16 -16 0', '16 16 56', 0, 0},
// id1 backpacks
- {CT_ITEM_BACKPACK, 0, VOL_HIGH, '40 -13 -35', '0 10 0',
- "backpack", "cev/items/backpack_pickup.ogg",
- "progs/backpack.mdl", "progs/backpack.mdl"},
+ {"backpack", "item_backpack", CT_ITEM_BACKPACK, 0, 0, snd_item_backpack,
+ "progs/backpack.mdl", '40 -13 -35', '0 10 0',
+ "progs/backpack.mdl", '-16 -16 0', '16 16 56', 0, 0},
// pd3 backpacks
- {CT_ITEM_BACKPACK, 0, VOL_HIGH, '40 -13 -35', '0 10 0',
- "backpack", "cev/items/backpack_pickup.ogg",
- "progs/pd_bpack.mdl", "progs/pd_bpack.mdl"},
+ {"backpack", "item_backpack", CT_ITEM_BACKPACK, 0, 0, snd_item_backpack,
+ "progs/pd_bpack.mdl", '40 -13 -35', '0 10 0',
+ "progs/pd_bpack.mdl", '-16 -16 0', '16 16 56', 0, 0},
// id1 health
- {CT_ITEM_HEALTH, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Health (Rotten)", "items/r_item1.wav",
- "progs/h_mdls/m_h15.mdl", "progs/h_mdls/m_h15.mdl"},
- {CT_ITEM_HEALTH, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Health", "items/health1.wav",
- "progs/h_mdls/m_h25.mdl", "progs/h_mdls/m_h25.mdl"},
- {CT_ITEM_HEALTH, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Megahealth", "items/r_item2.wav",
- "progs/h_mdls/m_h100.mdl", "progs/h_mdls/m_h100.mdl"},
+ {"Health (Rotten)", "item_health", CT_ITEM_HEALTH, 10, 0,
+ snd_item_health_rott,
+ "progs/h_mdls/m_h15.mdl", '40 -13 -35', '0 10 0',
+ "progs/h_mdls/m_h15.mdl", '0 0 0', '32 32 16', 0, 0},
+ {"Health", "item_health", CT_ITEM_HEALTH, 10, 0,
+ snd_item_health_norm,
+ "progs/h_mdls/m_h25.mdl", '40 -13 -35', '0 10 0',
+ "progs/h_mdls/m_h25.mdl", '0 0 0', '32 32 16', 0, 0},
+ {"Megahealth", "item_health", CT_ITEM_HEALTH, 15, 0,
+ snd_item_health_mega,
+ "progs/h_mdls/m_h100.mdl", '40 -13 -35', '0 10 0',
+ "progs/h_mdls/m_h100.mdl", '0 0 0', '32 32 32', 0, 0},
// pd3 health
- {CT_ITEM_HEALTH_VIAL, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Health Vial", "items/r_item1.wav",
- "progs/h_mdls/pd_vial.mdl", "progs/h_mdls/pd_vial.mdl"},
+ {"Health Vial", "item_health_vial", CT_ITEM_HEALTH_VIAL, 5, 0,
+ snd_item_health_vial,
+ "progs/h_mdls/pd_vial.mdl", '40 -13 -35', '0 10 0',
+ "progs/h_mdls/pd_vial.mdl", '-8 -8 0', '8 8 32', 0, 0},
// id1 keys (.option is the IT_ flag)
- {CT_ITEM_KEY1, IT_KEY1, VOL_HIGH, '0 0 0', '0 0 0',
- "silver key", "misc/medkey.wav",
- "progs/w_s_key.mdl", "progs/w_s_key.mdl"},
- {CT_ITEM_KEY1, IT_KEY1, VOL_HIGH, '0 0 0', '0 0 0',
- "silver runekey", "misc/runekey.wav",
- "progs/m_s_key.mdl", "progs/m_s_key.mdl"},
- {CT_ITEM_KEY1, IT_KEY1, VOL_HIGH, '0 0 0', '0 0 0',
- "silver keycard", "misc/basekey.wav",
- "progs/b_s_key.mdl", "progs/b_s_key.mdl"},
- {CT_ITEM_KEY2, IT_KEY2, VOL_HIGH, '0 0 0', '0 0 0',
- "gold key", "misc/medkey.wav",
- "progs/w_g_key.mdl", "progs/w_g_key.mdl"},
- {CT_ITEM_KEY2, IT_KEY2, VOL_HIGH, '0 0 0', '0 0 0',
- "gold runekey", "misc/runekey.wav",
- "progs/m_g_key.mdl", "progs/m_g_key.mdl"},
- {CT_ITEM_KEY2, IT_KEY2, VOL_HIGH, '0 0 0', '0 0 0',
- "gold keycard", "misc/basekey.wav",
- "progs/b_g_key.mdl", "progs/b_g_key.mdl"},
+ {"silver key", "item_key1", CT_ITEM_KEY1, 0, IT_KEY1,
+ snd_item_key_med,
+ "progs/w_s_key.mdl", '0 0 0', '0 0 0',
+ "progs/w_s_key.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"silver runekey", "item_key1", CT_ITEM_KEY1, 0, IT_KEY1,
+ snd_item_key_rune,
+ "progs/m_s_key.mdl", '0 0 0', '0 0 0',
+ "progs/m_s_key.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"silver keycard", "item_key1", CT_ITEM_KEY1, 0, IT_KEY1,
+ snd_item_key_base,
+ "progs/b_s_key.mdl", '0 0 0', '0 0 0',
+ "progs/b_s_key.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"gold key", "item_key2", CT_ITEM_KEY2, 0, IT_KEY2,
+ snd_item_key_med,
+ "progs/w_g_key.mdl", '0 0 0', '0 0 0',
+ "progs/w_g_key.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"gold runekey", "item_key2", CT_ITEM_KEY2, 0, IT_KEY2,
+ snd_item_key_rune,
+ "progs/m_g_key.mdl", '0 0 0', '0 0 0',
+ "progs/m_g_key.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"gold keycard", "item_key2", CT_ITEM_KEY2, 0, IT_KEY2,
+ snd_item_key_base,
+ "progs/b_g_key.mdl", '0 0 0', '0 0 0',
+ "progs/b_g_key.mdl", '-16 -16 -24', '16 16 32', 0, 0},
// id1 runes
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Earth Magic", "misc/runekey.wav",
- "progs/end1.mdl", "progs/end1.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Black Magic", "misc/runekey.wav",
- "progs/end2.mdl", "progs/end2.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Hell Magic", "misc/runekey.wav",
- "progs/end3.mdl", "progs/end3.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Elder Magic", "misc/runekey.wav",
- "progs/end4.mdl", "progs/end4.mdl"},
+ {"Rune of Earth Magic", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/end1.mdl", '40 -13 -35', '0 10 0',
+ "progs/end1.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Black Magic", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/end2.mdl", '40 -13 -35', '0 10 0',
+ "progs/end2.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Hell Magic", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/end3.mdl", '40 -13 -35', '0 10 0',
+ "progs/end3.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Elder Magic", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/end4.mdl", '40 -13 -35', '0 10 0',
+ "progs/end4.mdl", '-16 -16 -24', '16 16 32', 0, 0},
// mg1 runes
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Machinists", "misc/runekey.wav",
- "progs/mg1_rune1.mdl", "progs/mg1_rune1.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Blacksmiths", "misc/runekey.wav",
- "progs/mg1_rune2.mdl", "progs/mg1_rune2.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Stonemasons", "misc/runekey.wav",
- "progs/mg1_rune3.mdl", "progs/mg1_rune3.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Cultists", "misc/runekey.wav",
- "progs/mg1_rune4.mdl", "progs/mg1_rune4.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Astrologers", "misc/runekey.wav",
- "progs/mg1_rune5.mdl", "progs/mg1_rune5.mdl"},
- {CT_ITEM_RUNE, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Rune of Mystics", "misc/runekey.wav",
- "progs/mg1_rune6.mdl", "progs/mg1_rune6.mdl"},
+ {"Rune of Machinists", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/mg1_rune1.mdl", '40 -13 -35', '0 10 0',
+ "progs/mg1_rune1.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Blacksmiths", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/mg1_rune2.mdl", '40 -13 -35', '0 10 0',
+ "progs/mg1_rune2.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Stonemasons", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/mg1_rune3.mdl", '40 -13 -35', '0 10 0',
+ "progs/mg1_rune3.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Cultists", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/mg1_rune4.mdl", '40 -13 -35', '0 10 0',
+ "progs/mg1_rune4.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Astrologers", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/mg1_rune5.mdl", '40 -13 -35', '0 10 0',
+ "progs/mg1_rune5.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Rune of Mystics", "item_sigil", CT_ITEM_RUNE, 0, 0,
+ snd_item_rune,
+ "progs/mg1_rune6.mdl", '40 -13 -35', '0 10 0',
+ "progs/mg1_rune6.mdl", '-16 -16 -24', '16 16 32', 0, 0},
// id1 powerups
- {CT_ITEM_ENVIROSUIT, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Biosuit", "items/suit.wav",
- "progs/suit.mdl", "progs/suit.mdl"},
- {CT_ITEM_INVISIBILITY, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Ring of Shadows", "items/inv1.wav",
- "progs/invisibl.mdl", "progs/invisibl.mdl"},
- {CT_ITEM_INVULNERABILITY, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Pentagram of Protection", "items/protect.wav",
- "progs/invulner.mdl", "progs/invulner.mdl"},
- {CT_ITEM_QUAD, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Quad Damage", "items/damage.wav",
- "progs/quaddama.mdl", "progs/quaddama.mdl"},
+ {"Biosuit", "item_artifact_envirosuit", CT_ITEM_ENVIROSUIT, 0, IT_SUIT,
+ snd_item_suit_pkup,
+ "progs/suit.mdl", '40 -13 -35', '0 10 0',
+ "progs/suit.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Ring of Shadows", "item_artifact_invisibility", CT_ITEM_INVISIBILITY,
+ 0, IT_INVISIBILITY, snd_item_invis_pkup,
+ "progs/invisibl.mdl", '40 -13 -35', '0 10 0',
+ "progs/invisibl.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Pentagram of Protection", "item_artifact_invulnerability",
+ CT_ITEM_INVULNERABILITY, 0, IT_INVULNERABILITY,
+ snd_item_pent_pkup,
+ "progs/invulner.mdl", '40 -13 -35', '0 10 0',
+ "progs/invulner.mdl", '-16 -16 -24', '16 16 32', 0, 0},
+ {"Quad Damage", "item_artifact_super_damage", CT_ITEM_QUAD, 0, IT_QUAD,
+ snd_item_quad_pkup,
+ "progs/quaddama.mdl", '40 -13 -35', '0 10 0',
+ "progs/quaddama.mdl", '-16 -16 -24', '16 16 32', 0, 0},
- // id1 gibs
- {CT_ITEM_GIB1, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Gib", "items/damage.wav",
- "progs/gib1.mdl", "progs/gib1.mdl"},
- {CT_ITEM_GIB2, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Gib", "items/damage.wav",
- "progs/gib2.mdl", "progs/gib2.mdl"},
- {CT_ITEM_GIB3, 0, VOL_MHI, '40 -13 -35', '0 10 0',
- "Gib", "items/damage.wav",
- "progs/gib3.mdl", "progs/gib3.mdl"},
+ // id1 monster corpses
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+
+ // id1 player corpses
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
// id1 monster heads
- {CT_ITEM_HEAD_ARMY, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Soldier Head", "items/damage.wav",
- "progs/h_guard.mdl", "progs/h_guard.mdl"},
- {CT_ITEM_HEAD_DEMON, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Fiend Head", "items/damage.wav",
- "progs/h_demon.mdl", "progs/h_demon.mdl"},
- {CT_ITEM_HEAD_DOG, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Dog Head", "items/damage.wav",
- "progs/h_dog.mdl", "progs/h_dog.mdl"},
- {CT_ITEM_HEAD_ENFORCER, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Enforcer Head", "items/damage.wav",
- "progs/h_mega.mdl", "progs/h_mega.mdl"},
- {CT_ITEM_HEAD_HELLKNIGHT, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Death Knight Head", "items/damage.wav",
- "progs/h_hellkn.mdl", "progs/h_hellkn.mdl"},
- {CT_ITEM_HEAD_KNIGHT, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Knight Head", "items/damage.wav",
- "progs/h_knight.mdl", "progs/h_knight.mdl"},
- {CT_ITEM_HEAD_OGRE, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Ogre Head", "items/damage.wav",
- "progs/h_ogre.mdl", "progs/h_ogre.mdl"},
- {CT_ITEM_HEAD_PLAYER, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Player Head", "items/damage.wav",
- "progs/h_player.mdl", "progs/h_player.mdl"},
- {CT_ITEM_HEAD_SHALRATH, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Vore Head", "items/damage.wav",
- "progs/h_shal.mdl", "progs/h_shal.mdl"},
- {CT_ITEM_HEAD_SHAMBLER, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Shambler Head", "items/damage.wav",
- "progs/h_shams.mdl", "progs/h_shams.mdl"},
- {CT_ITEM_HEAD_WIZARD, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Wizard Head", "items/damage.wav",
- "progs/h_wizard.mdl", "progs/h_wizard.mdl"},
- {CT_ITEM_HEAD_ZOMBIE, 0, VOL_MHI, '40 0 -20', '0 170 0',
- "Zombie Head", "items/damage.wav",
- "progs/h_zombie.mdl", "progs/h_zombie.mdl"}
+ {"Fiend Head", "item_head_demon", CT_ITEM_HEAD_DEMON, 20, 0,
+ snd_misc_talk,
+ "progs/h_demon.mdl", '40 0 -20', '0 170 0',
+ "progs/h_demon.mdl", '-13.64 -16.77 -0.11', '17.44 16.22 30',
+ 0, 0},
+ {"Dog Head", "item_head_dog", CT_ITEM_HEAD_DOG, 10, 0,
+ snd_misc_talk,
+ "progs/h_dog.mdl", '40 0 -20', '0 170 0',
+ "progs/h_dog.mdl", '-9.66 -11.89 -0.2', '6.57 7.96 13.29',
+ 0, 0},
+ {"Soldier Head", "item_head_army", CT_ITEM_HEAD_ARMY, 10, 0,
+ snd_misc_talk,
+ "progs/h_guard.mdl", '40 0 -20', '0 170 0',
+ "progs/h_guard.mdl", '-9.67 -8.27 -0.28', '4.05 4.8 13.41',
+ 0, 0},
+ {"Death Knight Head", "item_head_hellknight", CT_ITEM_HEAD_HELLKNIGHT,
+ 10, 0, snd_misc_talk,
+ "progs/h_hellkn.mdl", '40 0 -20', '0 170 0',
+ "progs/h_hellkn.mdl", '-7.9 -12.97 -0.63', '10.55 8.87 21.06',
+ 0, 0},
+ {"Knight Head", "item_head_knight", CT_ITEM_HEAD_KNIGHT, 10, 0,
+ snd_misc_talk,
+ "progs/h_knight.mdl", '40 0 -20', '0 170 0',
+ "progs/h_knight.mdl", '-8.17 -7.47 -0.13', '8.36 6.5 30', 0, 0},
+ {"Enforcer Head", "item_head_enforcer", CT_ITEM_HEAD_ENFORCER, 10, 0,
+ snd_misc_talk,
+ "progs/h_mega.mdl", '40 0 -20', '0 170 0',
+ "progs/h_mega.mdl", '-10.63 -10.23 -0.05', '9.27 8.25 30', 0, 0},
+ {"Ogre Head", "item_head_ogre", CT_ITEM_HEAD_OGRE, 15, 0,
+ snd_misc_talk,
+ "progs/h_ogre.mdl", '40 0 -20', '0 170 0',
+ "progs/h_ogre.mdl", '-12.35 -15.7 -0.17', '10.67 13.88 30',
+ 0, 0},
+ {"Player Head", "item_head_player", CT_ITEM_HEAD_PLAYER, 10, 0,
+ snd_misc_talk,
+ "progs/h_player.mdl", '40 0 -20', '0 170 0',
+ "progs/h_player.mdl", '-9.67 -12.38 -2.1', '11.49 50.7 30',
+ 0, 0},
+ {"Vore Head", "item_head_shalrath", CT_ITEM_HEAD_SHALRATH, 15, 0,
+ snd_misc_talk,
+ "progs/h_shal.mdl", '40 0 -20', '0 170 0',
+ "progs/h_shal.mdl", '-19.85 -19.09 -1.44', '13.72 16.8 30',
+ 0, 0},
+ {"Shambler Head", "item_head_shambler", CT_ITEM_HEAD_SHAMBLER, 20, 0,
+ snd_misc_talk,
+ "progs/h_shams.mdl", '40 0 -20', '0 170 0',
+ "progs/h_shams.mdl", '-15.15 -20.638 -0.45', '21.44 21.76 30',
+ 0, 0},
+ {"Wizard Head", "item_head_wizard", CT_ITEM_HEAD_WIZARD, 10, 0,
+ snd_misc_talk,
+ "progs/h_wizard.mdl", '40 0 -20', '0 170 0',
+ "progs/h_wizard.mdl", '-10.41 -8.66 -0.54', '6.52 10.82 30',
+ 0, 0},
+ {"Zombie Head", "item_head_zombie", CT_ITEM_HEAD_ZOMBIE, 10, 0,
+ snd_misc_talk,
+ "progs/h_zombie.mdl", '40 0 -20', '0 170 0',
+ "progs/h_zombie.mdl", '-16 -16 0', '16 16 56', 0, 0},
+
+ // id1 gibs
+ {"Gib", "item_gib1", CT_ITEM_GIB1, 5, 0, snd_misc_talk,
+ "progs/gib1.mdl", '40 -13 -35', '0 10 0',
+ "progs/gib1.mdl", '-3.57 -8.06 -3.34', '3.69 8.31 30', 0, 0},
+ {"Gib", "item_gib2", CT_ITEM_GIB2, 15, 0, snd_misc_talk,
+ "progs/gib2.mdl", '40 -13 -35', '0 10 0',
+ "progs/gib2.mdl", '-12.68 -14.83 -6.19', '13.53 14.57 30',
+ 0, 0},
+ {"Gib", "item_gib3", CT_ITEM_GIB3, 10, 0, snd_misc_talk,
+ "progs/gib3.mdl", '40 -13 -35', '0 10 0',
+ "progs/gib3.mdl", '-18.95 -15.92 -3.13', '13.17 15.66 30',
+ 0, 0},
+
+ // pd3 breakables
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 0},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 1},
+ {"Concrete Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 2},
+ {"Wood Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 3},
+ {"Wood Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 4},
+ {"Wood Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 5},
+ {"Glass Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 6},
+ {"Glass Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 7},
+ {"Glass Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 8},
+ {"Glass Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 9},
+ {"Glass Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 10},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 11},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 12},
+ {"Brick Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 13},
+ {"Brick Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 14},
+ {"Brick Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 15},
+ {"Brown Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 16},
+ {"Computer Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 17},
+ {"Computer Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 18},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 19},
+ {"Runic Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 20},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 21},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 22},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 23},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 24},
+ {"Stone Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 25},
+ {"Stone Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 26},
+ {"Brick Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 27},
+ {"Brick Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 28},
+ {"Brick Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 29},
+ {"Brick Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 30},
+ {"Metal Debris", "item_debris", CT_ITEM_DEBRIS, 10, 0, snd_misc_talk,
+ "progs/debris.mdl", '40 0 -20', '0 170 0',
+ "progs/debris.mdl", '-16 -16 0', '16 16 32', 1, 31},
+
+ // id1 walltorch
+ {"Walltorch", "item_torch", CT_ITEM_TORCH, 0, 0, snd_misc_talk,
+ "progs/flame.mdl", '20 -10 -3', '0 10 0',
+ "progs/flame.mdl", '-3.5 -3.5 -14', '3.5 3.5 40', 0, 0}
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/defs_sounds.qc
diff --git a/qc/defs_sounds.qc b/qc/defs_sounds.qc
new file mode 100644
index 0000000..4275c54
--- /dev/null
+++ b/qc/defs_sounds.qc
@@ -0,0 +1,481 @@
+//==============================================================================
+// defs_sound.qc
+//==============================================================================
+
+//======================================================================
+// constants
+//======================================================================
+
+//----------------------------------------------------------------------
+// convenience macro frontend to sound() -- CEV
+//----------------------------------------------------------------------
+#if defined(CSQC)
+#define SOUND(e, si) sound (e, si.channel, si.wav, si.volume, \
+ si.attenuation, 0, SOUNDFLAG_FOLLOW);
+#elif defined(SSQC)
+#define SOUND(e, si) sound (e, si.channel, si.wav, si.volume, si.attenuation);
+#define SOUND_NOREPLACE(e, si) sound (e, si.channel, si.wav, si.volume, \
+ si.attenuation, 0, SOUNDFLAG_NOREPLACE);
+#define SOUND_RDELAY(e, si) sound (e, si.channel, si.wav, si.volume, \
+ si.attenuation, 0, SOUNDFLAG_NOREPLACE, random() * -1);
+#define AMBSOUND(org, si) ambientsound (org, si.wav, si.volume, si.attenuation);
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// sound_info -- CEV
+//----------------------------------------------------------------------
+typedef struct
+{
+ float attenuation; // sound attenuation
+ float channel; // sound channel
+ float volume; // sound volume
+ string wav; // path to sound
+} sound_info_t;
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// misc sounds
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_misc_##var
+const sound_info_t snd_empty = {ATTN_NORM, CHAN_BODY, 1.0, ""};
+const sound_info_t snd_null = {ATTN_NORM, CHAN_AUTO, 1.0, "misc/null.wav"};
+S(h2ohit) = {ATTN_NORM, CHAN_AUTO, 0.5, "misc/h2ohit1.wav"};
+S(menu1) = {ATTN_NONE, CHAN_AUTO, VOL_HIGH, "misc/menu1.wav"};
+S(menu2) = {ATTN_NONE, CHAN_AUTO, VOL_HIGH, "misc/menu2.wav"};
+S(menu3) = {ATTN_NONE, CHAN_AUTO, VOL_HIGH, "misc/menu3.wav"};
+S(outwater) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "misc/outwater.wav"};
+S(power) = {ATTN_NORM, CHAN_VOICE, 0.9, "misc/power.wav"};
+S(secret) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "misc/secret.wav"};
+S(spark) = {ATTN_STATIC, CHAN_AUTO, VOL_HIGH, "dump/spark.wav"};
+S(talk) = {ATTN_NORM, CHAN_VOICE, 0.9, "misc/talk.wav"};
+S(tele1) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "misc/r_tele1.wav"};
+S(tele2) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "misc/r_tele2.wav"};
+S(tele3) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "misc/r_tele3.wav"};
+S(tele4) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "misc/r_tele4.wav"};
+S(tele5) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "misc/r_tele5.wav"};
+S(trigger1) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "misc/trigger1.wav"};
+#undef S
+#endif
+
+#if defined(SSQC)
+//----------------------------------------------------------------------
+// misc ambient sounds -- snd_amb
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_amb_##var
+S(buzz_f) = {ATTN_STATIC, CHAN_AUTO, VOL_HIGH, "ambience/buzz1.wav"};
+S(buzz_l) = {ATTN_STATIC, CHAN_AUTO, VOL_MID, "ambience/fl_hum1.wav"};
+S(comphum) = {ATTN_STATIC, CHAN_AUTO, VOL_HIGH, "ambience/comp1.wav"};
+S(drip) = {ATTN_STATIC, CHAN_AUTO, VOL_MID, "ambience/drip1.wav"};
+S(drone) = {ATTN_STATIC, CHAN_AUTO, VOL_MID, "ambience/drone6.wav"};
+S(fire) = {ATTN_STATIC, CHAN_AUTO, VOL_LOW, "ambience/fire1.wav"};
+S(suckwind) = {ATTN_STATIC, CHAN_AUTO, VOL_HIGH, "ambience/suck1.wav"};
+S(swamp_01) = {ATTN_STATIC, CHAN_AUTO, VOL_MID, "ambience/swamp1.wav"};
+S(swamp_02) = {ATTN_STATIC, CHAN_AUTO, VOL_MID, "ambience/swamp2.wav"};
+S(telehum) = {ATTN_STATIC, CHAN_AUTO, 0.1, "ambience/hum1.wav"};
+S(thunder) = {ATTN_NONE, CHAN_AUTO, VOL_HIGH, "ambience/thunder1.wav"};
+S(water1) = {ATTN_STATIC, CHAN_AUTO, VOL_HIGH, "ambience/water1.wav"};
+S(wind2) = {ATTN_STATIC, CHAN_AUTO, VOL_HIGH, "ambience/wind2.wav"};
+S(windfly) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "ambience/windfly.wav"};
+#undef S
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// item pickup & misc sounds -- snd_item
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_item_##var
+#define P() "cev/items/"
+S(ammo) = {ATTN_NORM, CHAN_ITEM_AMMO, VOL_MHI, P() "ammo_pickup.ogg"};
+S(armor) = {ATTN_NORM, CHAN_ITEM_ARMOR, VOL_MHI, "items/armor1.wav"};
+S(backpack) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, P() "backpack_pickup.ogg"};
+S(health_rott) = {ATTN_NORM, CHAN_ITEM_HEALTH, VOL_MHI, "items/r_item1.wav"};
+S(health_norm) = {ATTN_NORM, CHAN_ITEM_HEALTH, VOL_MHI, "items/health1.wav"};
+S(health_mega) = {ATTN_NORM, CHAN_ITEM_HEALTH, VOL_MHI, "items/r_item2.wav"};
+S(health_vial) = {ATTN_NORM, CHAN_ITEM_HEALTH, VOL_MHI, "items/r_item1.wav"};
+S(invis_pkup) = {ATTN_NORM, CHAN_ITEM_POWERUP, VOL_MHI, "items/inv1.wav"};
+S(invis_off) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "items/inv2.wav"};
+S(invis_amb) = {ATTN_IDLE, CHAN_AUTO, VOL_MID, "items/inv3.wav"};
+S(key_base) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "misc/basekey.wav"};
+S(key_med) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "misc/medkey.wav"};
+S(key_rune) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "misc/runekey.wav"};
+S(pent_pkup) = {ATTN_NORM, CHAN_ITEM_POWERUP, VOL_MHI, "items/protect.wav"};
+S(pent_off) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "items/protect2.wav"};
+S(pent_prot) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "items/protect3.wav"};
+S(quad_pkup) = {ATTN_NORM, CHAN_ITEM_POWERUP, VOL_MHI, "items/damage.wav"};
+S(quad_off) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "items/damage2.wav"};
+S(quad_dam) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "items/damage3.wav"};
+S(respawn) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, P() "respawn.ogg"};
+S(rune) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "misc/runekey.wav"};
+S(shard) = {ATTN_NORM, CHAN_ITEM_ARMOR, VOL_LOW, P() "shard_pickup.ogg"};
+S(suit_pkup) = {ATTN_NORM, CHAN_ITEM_POWERUP, VOL_MHI, "items/suit.wav"};
+S(suit_off) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "items/suit2.wav"};
+S(weapon) = {ATTN_NORM, CHAN_ITEM_WEAPON, 0.3, P() "weapon_pickup.ogg"};
+#undef P
+#undef S
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// weapon sounds -- snd_weapon
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_weapon_##var
+S(axe_swoosh) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/ax1.wav"};
+S(axe_hit_meat) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "player/axhit1.wav"};
+S(axe_hit_world) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "player/axhit2.wav"};
+S(grenadelauncher) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/grenade.wav"};
+S(grenade_bounce) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "weapons/bounce.wav"};
+S(lightning_start) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "weapons/lstart.wav"};
+S(lightning_hit) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/lhit.wav"};
+S(nailgun) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/rocket1i.wav"};
+S(noammo) = {ATTN_NORM, CHAN_WEAPON, VOL_MID, "cev/items/noammo.ogg"};
+S(ric1) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "weapons/ric1.wav"};
+S(ric2) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "weapons/ric2.wav"};
+S(ric3) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "weapons/ric3.wav"};
+S(rocketlauncher) = {ATTN_NORM, CHAN_ROCKETS, VOL_HIGH, "weapons/sgun1.wav"};
+S(rocket_explosion) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/r_exp3.wav"};
+S(shotgun) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/guncock.wav"};
+S(supernailgun) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/spike2.wav"};
+S(supershotgun) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "weapons/shotgn2.wav"};
+S(tink1) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "weapons/tink1.wav"};
+#undef S
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// button sounds -- snd_button
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_button_##var
+S(inout) = {ATTN_NORM, CHAN_VOICE, VOL_MID, "buttons/switch04.wav"};
+S(metal) = {ATTN_NORM, CHAN_VOICE, VOL_MID, "buttons/switch02.wav"};
+S(steam) = {ATTN_NORM, CHAN_VOICE, VOL_MID, "buttons/airbut1.wav"};
+S(wood) = {ATTN_NORM, CHAN_VOICE, VOL_MID, "buttons/switch21.wav"};
+#undef S
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// door sounds -- snd_door
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_door_##var
+S(base_close) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/hydro2.wav"};
+S(base_open) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/hydro1.wav"};
+S(base_try) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "doors/basetry.wav"};
+S(base_use) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "doors/baseuse.wav"};
+S(chain_close) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/stndr2.wav"};
+S(chain_open) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/stndr1.wav"};
+S(med_try) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "doors/medtry.wav"};
+S(med_use) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "doors/meduse.wav"};
+S(metal_close) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/ddoor2.wav"};
+S(metal_open) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/ddoor1.wav"};
+S(rune_try) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "doors/runetry.wav"};
+S(rune_use) = {ATTN_NORM, CHAN_ITEM, VOL_HIGH, "doors/runeuse.wav"};
+S(stone_close) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/drclos4.wav"};
+S(stone_open) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/doormv1.wav"};
+S(secret_base_close) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/basesec2.wav"};
+S(secret_base_open) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/basesec1.wav"};
+S(secret_med_start) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/latch2.wav"};
+S(secret_med_stop) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/drclos4.wav"};
+S(secret_med_travel) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/winch2.wav"};
+S(secret_metal_close) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/airdoor2.wav"};
+S(secret_metal_open) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "doors/airdoor1.wav"};
+#undef S
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// plat/lift sounds -- snd_plat
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_plat_##var
+S(base1) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "plats/plat1.wav"};
+S(base2) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "plats/plat2.wav"};
+S(med1) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "plats/medplat1.wav"};
+S(med2) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "plats/medplat2.wav"};
+S(train1) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "plats/train1.wav"};
+S(train2) = {ATTN_NORM, CHAN_VOICE, VOL_MHI, "plats/train2.wav"};
+#undef S
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// player sounds -- snd_player
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_player_##var
+#define P() "cev/player/"
+S(death_01) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/death1.wav"};
+S(death_02) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/death2.wav"};
+S(death_03) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/death3.wav"};
+S(death_04) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/death4.wav"};
+S(death_05) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/death5.wav"};
+S(drown_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/drown1.wav"};
+S(drown_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/drown2.wav"};
+S(gasp_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/gasp1.wav"};
+S(gasp_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/gasp2.wav"};
+S(gib_01) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/gib.wav"};
+S(h2odeath) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/h2odeath.wav"};
+S(inlava) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "player/inlava.wav"};
+S(inslime) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "player/slimbrn2.wav"};
+S(inwater) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "player/inh2o.wav"};
+S(jump_00) = {ATTN_NORM, CHAN_BODY, 0.9, "player/plyrjmp8.wav"};
+S(jump_01) = {ATTN_NORM, CHAN_BODY, 0.15, P() "jump_01.ogg"};
+S(jump_02) = {ATTN_NORM, CHAN_BODY, 0.15, P() "jump_02.ogg"};
+S(jump_03) = {ATTN_NORM, CHAN_BODY, 0.15, P() "jump_03.ogg"};
+S(jump_04) = {ATTN_NORM, CHAN_BODY, 0.15, P() "jump_04.ogg"};
+S(jumpwater) = {ATTN_NORM, CHAN_BODY, VOL_HIGH, "player/h2ojump.wav"};
+S(land_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/land.wav"};
+S(land_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/land2.wav"};
+S(lavaburn_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/lburn1.wav"};
+S(lavaburn_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/lburn2.wav"};
+S(pain_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/pain1.wav"};
+S(pain_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/pain2.wav"};
+S(pain_03) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/pain3.wav"};
+S(pain_04) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/pain4.wav"};
+S(pain_05) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/pain5.wav"};
+S(pain_06) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/pain6.wav"};
+S(slide_00) = {ATTN_FEET, CHAN_SLIDE, 0.3, P() "dive.ogg"};
+S(slide_silent) = {ATTN_FEET, CHAN_SLIDE, 0.4, "misc/null.wav"};
+S(stepdirt_01) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_dirt_01.ogg"};
+S(stepdirt_02) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_dirt_02.ogg"};
+S(stepdirt_03) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_dirt_03.ogg"};
+S(stepdirt_04) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_dirt_04.ogg"};
+S(stepdirt_05) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_dirt_05.ogg"};
+S(stepmetal_01) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_01.ogg"};
+S(stepmetal_02) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_02.ogg"};
+S(stepmetal_03) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_03.ogg"};
+S(stepmetal_04) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_04.ogg"};
+S(stepmetal_05) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_05.ogg"};
+S(stepmetal_06) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_06.ogg"};
+S(stepmetal_07) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_07.ogg"};
+S(stepmetal_08) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_08.ogg"};
+S(stepmetal_09) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_metal_09.ogg"};
+S(stepstone_01) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_stone_01.ogg"};
+S(stepstone_02) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_stone_02.ogg"};
+S(stepstone_03) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_stone_03.ogg"};
+S(stepstone_04) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_stone_04.ogg"};
+S(stepstone_05) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_stone_05.ogg"};
+S(stepstone_06) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_stone_06.ogg"};
+S(stepwater_01) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_water_01.ogg"};
+S(stepwater_02) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_water_02.ogg"};
+S(stepwater_03) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_water_03.ogg"};
+S(stepwater_04) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_water_04.ogg"};
+S(stepwood_01) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_wood_01.ogg"};
+S(stepwood_02) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_wood_02.ogg"};
+S(stepwood_03) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_wood_03.ogg"};
+S(stepwood_04) = {ATTN_FEET, CHAN_FEET, 0.3, P() "step_wood_04.ogg"};
+S(teledeath) = {ATTN_NONE, CHAN_VOICE, VOL_HIGH, "player/teledth1.wav"};
+S(tornoff2) = {ATTN_NONE, CHAN_BODY, VOL_HIGH, "player/tornoff2.wav"};
+S(udeath) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "player/udeath.wav"};
+S(wadewater_01) = {ATTN_FEET, CHAN_FEET, 0.3, P() "wade_water_01.ogg"};
+S(wadewater_02) = {ATTN_FEET, CHAN_FEET, 0.3, P() "wade_water_02.ogg"};
+S(water_01) = {ATTN_NORM, CHAN_BODY, 0.6, "misc/water1.wav"};
+S(water_02) = {ATTN_NORM, CHAN_BODY, 0.6, "misc/water2.wav"};
+#undef P
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_boss sounds -- snd_boss -- Chthon
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_boss_##var
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "boss1/death.wav"};
+S(out1) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "boss1/out1.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "boss1/pain.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "boss1/sight1.wav"};
+S(throw) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "boss1/throw.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_demon1 sounds -- snd_demon1 -- Fiends
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_demon1_##var
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "demon/ddeath.wav"};
+S(hit2) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "demon/dhit2.wav"};
+S(idle1) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "demon/idle1.wav"};
+S(jump) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "demon/djump.wav"};
+S(land) = {ATTN_NORM, CHAN_FEET, VOL_HIGH, "demon/dland2.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "demon/dpain1.wav"};
+S(sight2) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "demon/sight2.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_dog sounds -- snd_dog -- Dogs
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_dog_##var
+S(attack1) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "dog/dattack1.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "dog/ddeath.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "dog/idle.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "dog/dpain1.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "dog/dsight.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_enforcer sounds -- snd_enforcer -- Enforcers
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_enforcer_##var
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "enforcer/death1.wav"};
+S(fire) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "enforcer/enfire.wav"};
+S(fire_hit) = {ATTN_STATIC, CHAN_WEAPON, VOL_HIGH, "enforcer/enfstop.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "enforcer/idle1.wav"};
+S(pain_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "enforcer/pain1.wav"};
+S(pain_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "enforcer/pain2.wav"};
+S(sight_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "enforcer/sight1.wav"};
+S(sight_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "enforcer/sight2.wav"};
+S(sight_03) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "enforcer/sight3.wav"};
+S(sight_04) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "enforcer/sight4.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_fish sounds -- snd_fish -- Fishies
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_fish_##var
+S(bite) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "fish/bite.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "fish/death.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "fish/idle.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_hell_knight sounds -- snd_hknight -- Death Knights
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_hknight_##var
+S(attack) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "hknight/attack1.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "hknight/death1.wav"};
+S(grunt) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "hknight/grunt.wav"};
+S(hit) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "hknight/hit.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "hknight/idle.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "hknight/pain1.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "hknight/sight1.wav"};
+S(slash) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "hknight/slash1.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_knight sounds -- snd_knight -- Knights
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_knight_##var
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "knight/kdeath.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "knight/idle.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "knight/khurt.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "knight/ksight.wav"};
+S(sword_01) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "knight/sword1.wav"};
+S(sword_02) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "knight/sword2.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_ogre sounds -- snd_ogre -- Ogres
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_ogre_##var
+S(attack) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "ogre/ogsawatk.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "ogre/ogdth.wav"};
+S(drag) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "ogre/ogdrag.wav"};
+S(idle_01) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "ogre/ogidle.wav"};
+S(idle_02) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "ogre/ogidle2.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "ogre/ogpain1.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "ogre/ogwake.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_oldone sounds -- snd_oldone -- Boss 2
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_oldone_##var
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "boss2/death.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "boss2/idle.wav"};
+S(pop) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "boss2/pop2.wav"};
+S(pop_pd) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "oldone2/pd_pop2.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "boss2/sight.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_shalrath sounds -- snd_shalrath -- Vores
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_shalrath_##var
+S(attack_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shalrath/attack.wav"};
+S(attack_02) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "shalrath/attack2.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shalrath/death.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "shalrath/idle.wav"};
+S(pain) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "shalrath/pain.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shalrath/sight.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_shambler sounds -- snd_shambler -- Shambler
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_shambler_##var
+S(attack) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "shambler/sattck1.wav"};
+S(boom) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "shambler/sboom.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shambler/sdeath.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "shambler/sidle.wav"};
+S(melee_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shambler/melee1.wav"};
+S(melee_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shambler/melee2.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shambler/shurt2.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shambler/ssight.wav"};
+S(smack) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "shambler/smack.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_army sounds -- snd_army -- Soldiers / Grunts / Army
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_army_##var
+S(attack) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "soldier/sattck1.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "soldier/death1.wav"};
+S(idle) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "soldier/idle.wav"};
+S(pain_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "soldier/pain1.wav"};
+S(pain_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "soldier/pain2.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "soldier/sight1.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_wizard sounds -- snd_wizard -- Wizards / Scrags
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_wizard_##var
+S(attack) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "wizard/wattack.wav"};
+S(death) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "wizard/wdeath.wav"};
+S(hit) = {ATTN_NORM, CHAN_AUTO, VOL_HIGH, "wizard/hit.wav"};
+S(idle_01) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "wizard/widle1.wav"};
+S(idle_02) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "wizard/widle2.wav"};
+S(pain) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "wizard/wpain.wav"};
+S(sight) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "wizard/wsight.wav"};
+#undef S
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// monster_zombie sounds -- snd_zombie -- Zombies
+//----------------------------------------------------------------------
+#define S(var) const sound_info_t snd_zombie_##var
+S(fall) = {ATTN_NORM, CHAN_BODY, VOL_HIGH, "zombie/z_fall.wav"};
+S(idle_01) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "zombie/z_idle.wav"};
+S(idle_02) = {ATTN_IDLE, CHAN_VOICE, VOL_HIGH, "zombie/z_idle1.wav"};
+S(idle_03) = {ATTN_STATIC, CHAN_VOICE, VOL_HIGH, "zombie/idle_w2.wav"};
+S(gib) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "zombie/z_gib.wav"};
+S(hit) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "zombie/z_hit.wav"};
+S(miss) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "zombie/z_miss.wav"};
+S(pain_01) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "zombie/z_pain.wav"};
+S(pain_02) = {ATTN_NORM, CHAN_VOICE, VOL_HIGH, "zombie/z_pain1.wav"};
+S(shot) = {ATTN_NORM, CHAN_WEAPON, VOL_HIGH, "zombie/z_shot1.wav"};
+#undef S
+#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/bob.qc
diff --git a/qc/func/bob.qc b/qc/func/bob.qc
index 2106624..260833b 100644
--- a/qc/func/bob.qc
+++ b/qc/func/bob.qc
@@ -34,15 +34,6 @@ const float FUNC_BOB_THINKINTERVAL = 0.05;
#endif
//======================================================================
-// fields
-//======================================================================
-
-#ifdef SSQC
-.float bsporigin; // bmodel origins are 0,0,0; check first
-.float waitmin2;
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -60,6 +51,9 @@ void() base_func_bob_think_timer;
void() base_func_bob_use_mg1;
void() base_func_bob_tick_mg1;
#endif
+#ifdef SSQC
+void(string key, string value) base_func_bob_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) base_func_bob_init;
#ifdef SSQC
@@ -106,11 +100,11 @@ void() misc_bob;
/* MG1 uses makevectors to calculate sin and cos -- CEV */ \
makevectors ([0, self.count, 0]); \
/* v_forward_y is sin */ \
- local vector offs = self.dest * v_forward_y; \
- if (self.dest2) \
+ local vector offs = self.pos1 * v_forward_y; \
+ if (self.pos2) \
{ \
/* v_forward_x is cos */ \
- offs += (self.dest2 * v_forward_x); \
+ offs += (self.pos2 * v_forward_x); \
} \
}
@@ -121,7 +115,7 @@ void() misc_bob;
// allow it to be called repeatedly -- iw
self.use = sub_null;
- if (self.bsporigin)
+ if (self.cnt)
{
self.movetype = MOVETYPE_PUSH;
self.solid = SOLID_BSP;
@@ -144,7 +138,7 @@ void() misc_bob;
self.think = base_func_bob_think_timer;
- if (self.bsporigin)
+ if (self.cnt)
self.nextthink = self.ltime + 0.1 + self.delay;
else
self.nextthink = time + 0.1 + self.delay;
@@ -156,7 +150,7 @@ void() misc_bob;
//--------------------------------------------------------------
void() base_func_bob_off =
{
- if (self.bsporigin)
+ if (self.cnt)
{
self.movetype = MOVETYPE_PUSH;
self.solid = SOLID_BSP;
@@ -200,7 +194,7 @@ void() misc_bob;
//--------------------------------------------------------------
void() base_func_bob_think_mg1 =
{
- local float ang = self.pos1_x * FUNC_BOB_THINKINTERVAL;
+ local float ang = self.finalangle_x * FUNC_BOB_THINKINTERVAL;
// macros everywhere. creates the variable 'offs' -- CEV
BASE_FUNC_BOB_GETPOSITIONFORANGLE (ang)
local vector diff = offs - self.origin;
@@ -217,7 +211,7 @@ void() misc_bob;
{
self.think = base_func_bob_think_timer;
- if (self.bsporigin)
+ if (self.cnt)
self.nextthink = self.ltime + 0.1;
else
self.nextthink = time + 0.1;
@@ -229,12 +223,18 @@ void() misc_bob;
// Setup bob cycle and half way point for slowdown
self.attack_finished = time + self.count;
self.distance = time + (self.count * 0.5);
+
// Flip direction of bmodel bob
- self.lefty = 1 - self.lefty;
- if (self.lefty < 1)
- self.t_length = self.height;
+ if (self.stateflags & STATE_LEFTY)
+ {
+ self.stateflags &= ~STATE_LEFTY;
+ self.t_length = self.t_height;
+ }
else
- self.t_length = -self.height;
+ {
+ self.stateflags |= STATE_LEFTY;
+ self.t_length = -self.t_height;
+ }
// Always reset velocity and flags
self.velocity = '0 0 0';
@@ -243,17 +243,17 @@ void() misc_bob;
// Is the direction set?
// This is a block condition to prevent the bmodel moving
- if (self.lefty != -1)
+ if (!(self.stateflags & STATE_INACTIVE))
{
// Slow down velocity (gradually)
if (self.distance < time)
{
- self.velocity = self.velocity * self.waitmin2;
+ self.velocity = self.velocity * self.speed2;
}
else
{
// Speed up velocity (linear/exponentially)
- self.t_length = self.t_length * self.waitmin;
+ self.t_length = self.t_length * self.speed;
self.velocity += self.movedir * self.t_length;
}
}
@@ -266,7 +266,7 @@ void() misc_bob;
{
if (self.solid == SOLID_NOT)
{
- local float ang = self.pos1_x * server_deltatime;
+ local float ang = self.finalangle_x * server_deltatime;
// macros everywhere. creates the variable 'offs' -- CEV
BASE_FUNC_BOB_GETPOSITIONFORANGLE (ang)
setorigin (self, offs);
@@ -283,7 +283,7 @@ void() misc_bob;
//--------------------------------------------------------------
void() base_func_bob_use_mg1 =
{
- if (self.state)
+ if (!(self.stateflags & STATE_INACTIVE))
{
if (self.solid)
{
@@ -291,6 +291,7 @@ void() misc_bob;
self.nextthink = -1;
}
+ self.stateflags |= STATE_INACTIVE;
self.classgroup &= ~CG_FRAMETICK;
}
else
@@ -298,10 +299,53 @@ void() misc_bob;
if (self.solid)
base_func_bob_think_mg1 ();
+ self.stateflags &= ~STATE_INACTIVE;
self.classgroup |= CG_FRAMETICK;
}
+ };
+#endif
- self.state = 1 - self.state;
+ //==============================================================
+ // Initialization
+ //==============================================================
+
+#ifdef SSQC
+ void(string key, string value) base_func_bob_init_field =
+ {
+ switch (key)
+ {
+ case "bsporigin":
+ // bsporigin used by progs_dump 3 -- CEV
+ // "bmodel origins are 0,0,0; check first"
+ if (!self.cnt)
+ self.cnt = stof (value);
+ break;
+ case "dest":
+ // dest is used in MG1 -- CEV
+ if (!self.pos1)
+ self.pos1 = stov (value);
+ break;
+ case "dest2":
+ // remap dest2, just in case -- CEV
+ if (!self.pos2)
+ self.pos2 = stov (value);
+ break;
+ case "height":
+ // remap height to t_height -- CEV
+ if (!self.t_height)
+ self.t_height = stof (value);
+ break;
+ case "waitmin":
+ // used by pd3 -- speed up scale -- CEV
+ if (!self.speed)
+ self.speed = stof (value);
+ break;
+ case "waitmin2":
+ // used by pd3 -- slow down scale -- CEV
+ if (!self.speed2)
+ self.speed2 = stof (value);
+ break;
+ }
};
#endif
@@ -333,8 +377,8 @@ void() misc_bob;
setmodel (e, e.model);
setorigin (e, e.origin);
- if (!e.dest)
- e.dest = '0 0 64';
+ if (!e.pos1)
+ e.pos1 = '0 0 64';
if (!e.wait)
e.wait = 10;
if (!e.dmg)
@@ -349,8 +393,8 @@ void() misc_bob;
// results in buggy func_bob movement in FTEQW; use
// another (not-used, not-special-to-the-engine)
// vector field and they'll work fine. I've chosen
- // pos1 here. -- CEV
- e.pos1_x = 360 / e.wait;
+ // finalangle here. -- CEV
+ e.finalangle_x = 360 / e.wait;
e.count = 360 * e.delay;
e.blocked = base_func_bob_blocked;
@@ -371,13 +415,14 @@ void() misc_bob;
}
e.SendEntity = base_entity_netsend;
- e.SendFlags = NETFLAG_BASE_ENTITY_MODEL |
- NETFLAG_BASE_ENTITY_ORIGIN |
- NETFLAG_BASE_ENTITY_SIZE |
- NETFLAG_BASE_ENTITY_SOLID;
+ e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
if (e.spawnflags & SPAWNFLAG_FUNC_BOB_MG1_START_ON)
+ {
+ // set inactive so use will toggle on -- CEV
+ e.stateflags |= STATE_INACTIVE;
sub_runvoidas (e, base_func_bob_use_mg1);
+ }
}
else
{
@@ -388,12 +433,12 @@ void() misc_bob;
// Using a custom model?
if (e.mdl == "")
{
- e.bsporigin = TRUE;
+ e.cnt = TRUE;
e.mdl = e.model;
}
else
{
- e.bsporigin = FALSE;
+ e.cnt = FALSE;
e.modelindex = 0;
e.model = "";
}
@@ -401,25 +446,24 @@ void() misc_bob;
sub_setmovedir (e);
e.movedir = normalize (e.movedir);
- if (e.height <= 0)
+ if (e.t_height <= 0)
// Direction intensity
- e.height = 8;
+ e.t_height = 8;
if (e.count < 1)
// Direction switch timer
e.count = 2;
- if (e.waitmin <= 0)
+ if (e.speed <= 0)
// Speed up
- e.waitmin = 1;
- if (e.waitmin2 <= 0)
+ e.speed = 1;
+ if (e.speed2 <= 0)
// Slow down
- e.waitmin2 = 0.75;
+ e.speed2 = 0.75;
if (e.delay < 0)
e.delay = random() + random() + random();
e.SendEntity = base_entity_netsend;
e.SendFlags = NETFLAG_BASE_ENTITY_MODEL |
NETFLAG_BASE_ENTITY_ORIGIN |
- NETFLAG_BASE_ENTITY_SIZE |
NETFLAG_BASE_ENTITY_SOLID;
e.customphysics = base_entity_movetype_push;
e.tick = base_func_neteval;
@@ -481,10 +525,7 @@ A SOLID bmodel that gently moves back and forth
//--------------------------------------------------------------
void() func_bob =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (base_func_bob_init_field)
func_bob_init (self);
};
#endif
@@ -517,10 +558,7 @@ Same as func_bob but uses a custom model instead of a brush. Use the mdl key to
//--------------------------------------------------------------
void() misc_bob =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (base_func_bob_init_field)
misc_bob_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/bossgate.qc
diff --git a/qc/func/bossgate.qc b/qc/func/bossgate.qc
index 57b7c49..d6c8bc4 100644
--- a/qc/func/bossgate.qc
+++ b/qc/func/bossgate.qc
@@ -111,10 +111,7 @@ This bmodel appears unless players have all of the episode sigils.
//--------------------------------------------------------------
void() func_bossgate =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_bossgate_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/breakable.qc
diff --git a/qc/func/breakable.qc b/qc/func/breakable.qc
index 73c081b..90b1bb6 100644
--- a/qc/func/breakable.qc
+++ b/qc/func/breakable.qc
@@ -14,7 +14,6 @@ typedef enumflags
{
SPAWNFLAG_BASE_BREAKABLE_NO_MONSTERS = 1, // used in base_entities.qc
SPAWNFLAG_BASE_BREAKABLE_EXPLODE = 2, // explosion effect and sound
- SPAWNFLAG_BASE_BREAKABLE_CUSTOM = 4 // models specified in fields
// SPAWNFLAG_NOT_ON_EASY = 256, // see base_entities.qc -- CEV
// SPAWNFLAG_NOT_ON_NORMAL = 512,
// SPAWNFLAG_NOT_ON_HARD_OR_NIGHTMARE = 1024,
@@ -27,24 +26,9 @@ typedef enumflags
} base_breakable_spawnflags;
#endif
-//======================================================================
-// fields
-//======================================================================
-
#ifdef SSQC
-.float brk_obj_count1;
-.float brk_obj_count2;
-.float brk_obj_count3;
-.float brk_obj_count4;
-.float brk_obj_count5;
-
-.string break_template1;
-.string break_template2;
-.string break_template3;
-.string break_template4;
-.string break_template5;
-
-.string mdl_debris; // dumptruck_ds
+const float BASE_BREAKABLE_DEFAULTDEBRIS = 5;
+const float BASE_BREAKABLE_MAXDEBRIS = 8;
#endif
//======================================================================
@@ -54,14 +38,10 @@ typedef enumflags
// base_breakable
#ifdef SSQC
void() sub_dislodge_resting_entities;
-void(vector dir, string templatename) base_breakable_template_single_debris;
-void(vector dir) base_breakable_single_debris;
-void(vector dir) base_breakable_make_templates_debris;
-void(vector dir) base_breakable_make_debris;
void(vector dir) base_breakable_die;
void(vector dir) base_breakable_destroy;
void() base_breakable_use;
-void(entity e) base_breakable_template_setup;
+void(string key, string value) base_breakable_init_field;
void(entity e) base_breakable_init;
strip void() base_breakable;
#endif
@@ -92,151 +72,20 @@ void() func_breakable;
//--------------------------------------------------------------
void() sub_dislodge_resting_entities =
{
- local entity e;
+ local entity e = nextent (world);
- e = nextent (world);
while (e && e != world)
{
- if ((e.flags & FL_ONGROUND) && e.groundentity == self)
- e.flags = e.flags - (e.flags & FL_ONGROUND);
- e = nextent (e);
- }
- };
-
- //--------------------------------------------------------------
- void(vector dir, string templatename)
- base_breakable_template_single_debris =
- {
- local entity new;
-
- new = spawn ();
- new.model = templatename;
- new.origin_x = (self.maxs_x - self.mins_x) *
- random() + self.mins_x;
- new.origin_y = (self.maxs_y - self.mins_y) *
- random() + self.mins_y;
- new.origin_z = (self.maxs_z - self.mins_z) *
- random() + self.mins_z;
- // dumptruck_ds
- setmodel (new, new.model);
- setsize (new, '0 0 0', '0 0 0');
- new.movetype = MOVETYPE_BOUNCE;
- new.solid = SOLID_NOT;
- new.avelocity_x = random() * 600;
- new.avelocity_y = random() * 600;
- new.avelocity_z = random() * 600;
- new.velocity = velocity_for_damage (dir, self.health * 2);
- new.think = sub_remove;
- new.ltime = time;
- new.nextthink = time + 10 + random() * 10;
- new.flags = 0;
- };
-
- //--------------------------------------------------------------
- void(vector dir) base_breakable_single_debris =
- {
- local entity new;
-
- new = spawn ();
- new.origin_x = (self.maxs_x - self.mins_x) *
- random() + self.mins_x;
- new.origin_y = (self.maxs_y - self.mins_y) *
- random() + self.mins_y;
- new.origin_z = (self.maxs_z - self.mins_z) *
- random() + self.mins_z;
-
- // this was originally just an mdl from Rubicon2, now you set
- // custom model via spawnflag or use the builtin from
- // Rubicon2 -- dumptruck_ds
- // setmodel (new, "progs/debris.mdl");
-
- // dumptruck_ds
- setmodel (new, self.mdl_debris);
- setsize (new, '0 0 0', '0 0 0');
- new.velocity = velocity_for_damage (dir, self.health * 2);
- new.movetype = MOVETYPE_BOUNCE;
- new.solid = SOLID_NOT;
- new.avelocity_x = random() * 600;
- new.avelocity_y = random() * 600;
- new.avelocity_z = random() * 600;
- new.think = sub_remove;
- new.ltime = time;
- new.nextthink = time + 10 + random() * 10;
- new.flags = 0;
-
- // randomly choose size
- if (random() > 0.333)
- // larger
- new.frame = 1;
- else
- // smaller
- new.frame = 2;
-
- // choose skin based on "style" key
- //
- // this was originally a large block of individual if
- // statements in the form of:
- // if (self.style == 1)
- // new.skin = 1;
- // if (self.style == 2)
- // new.skin = 2;
- // and so on, up until 31. As far as I can tell new.skin
- // was always set to the same value as self.style. So I've
- // simplified the block into the code below.
- // New debris skins start at 3 and continue through 31
- // according to comments left by dumptruck_ds -- CEV
-
- if (self.style > 0 && self.style <= 31)
- {
- new.skin = self.style;
- }
- };
-
- //--------------------------------------------------------------
- // template system from Qmaster -- dumptruck_ds
- //--------------------------------------------------------------
- void(vector dir) base_breakable_make_templates_debris =
- {
- local float count = 0;
- local string break_template = "";
-
- for (float i = 1; i < 6; i++)
- {
- switch (i)
+ if (e.groundentity == self && e.flags & FL_ONGROUND)
{
- case 1:
- break_template = self.break_template1;
- count = self.brk_obj_count1;
- break;
- case 2:
- break_template = self.break_template2;
- count = self.brk_obj_count2;
- break;
- case 3:
- break_template = self.break_template3;
- count = self.brk_obj_count3;
- break;
- case 4:
- break_template = self.break_template4;
- count = self.brk_obj_count4;
- break;
- case 5:
- break_template = self.break_template5;
- count = self.brk_obj_count5;
- break;
- }
+ e.flags &= ~FL_ONGROUND;
- if (break_template != __NULL__ && break_template != "")
- {
- for (float j = 0; j < count; j++)
- {
- base_breakable_template_single_debris
- (dir, break_template);
- }
+ // TODO CEV auto-set NETFLAGS from here
+ // to keep CSQC updated on origin as entity
+ // e falls to the ground
}
- break_template = "";
- count = 0;
+ e = nextent (e);
}
};
@@ -245,36 +94,31 @@ void() func_breakable;
//==============================================================
//--------------------------------------------------------------
- void(vector dir) base_breakable_make_debris =
- {
- for (float i = 0; i < self.cnt; i++)
- base_breakable_single_debris (dir);
- };
-
- //--------------------------------------------------------------
// dumptruck_ds -- set the spawnflag for cosmetic explosion
// effect; use "dmg" value to hurt the player
//--------------------------------------------------------------
void(vector dir) base_breakable_die =
{
- // what is this brace doing here? -- TODO CEV
+ var vector org, vel;
+ var entity d;
+ var float item_index;
+
+ self.deadflag |= DF_DEAD | DF_GIBBED;
+
+ if (self.noise1 != __NULL__ && self.noise1 != "")
{
// thanks to Qmaster!!! He helped me sort out
// noise1 playing from 0 0 0 with this temp
// entity - dumptruck_ds
- local entity ent;
-
- ent = spawn ();
- ent.origin = ((self.absmin + self.absmax) * 0.5);
- setsize (ent, '0 0 0', '0 0 0');
- ent.solid = SOLID_NOT;
- ent.think = sub_remove;
- // ent.ltime = time;
- ent.nextthink = time + 60;
-
- sound (ent, CHAN_AUTO, self.noise1,
- VOL_HIGH, ATTN_NORM);
- // remove (self);
+ var entity s = spawn ();
+
+ s.origin = ((self.absmin + self.absmax) * 0.5);
+ setsize (s, '0 0 0', '0 0 0');
+ s.solid = SOLID_NOT;
+ s.think = sub_remove;
+ s.nextthink = time + 60;
+
+ sound (s, CHAN_AUTO, self.noise1, VOL_HIGH, ATTN_NORM);
}
// this is to ensure that any debris from another
@@ -283,50 +127,59 @@ void() func_breakable;
// after this entity is removed -- iw
sub_dislodge_resting_entities ();
- if (self.spawnflags & SPAWNFLAG_BASE_BREAKABLE_EXPLODE)
+ self.origin = ((self.absmin + self.absmax) * 0.5);
+ setorigin (self, self.origin);
+
+ if (self.switchshadstyle)
+ lightstyle (self.switchshadstyle, "m");
+
+ // increase the distance debris will fly -- CEV
+ self.health *= 2;
+
+ // a more complicated base_monster_destroy_items () that
+ // randomizes origin a bit & sets debris frames -- CEV
+ for (float i = 0; i < BASE_ENTITY_ITEMLEN; i++)
{
- if (self.spawnflags & SPAWNFLAG_BASE_BREAKABLE_CUSTOM)
- base_breakable_make_templates_debris (dir);
- else
- base_breakable_make_debris (dir);
+ item_index = self.item[i];
+
+ if (item_index == 0 || item_index == __NULL__)
+ continue;
+
+ org_x = (self.maxs_x - self.mins_x) * random() +
+ self.mins_x;
+ org_y = (self.maxs_y - self.mins_y) * random() +
+ self.mins_y;
+ org_z = (self.maxs_z - self.mins_z) * random() +
+ self.mins_z;
+ vel = velocity_for_damage (dir, self.health);
+
+ d = spawn_base_item_throwable (item_index,
+ org, vel, SPAWNFLAG_ITEM_THROWN);
+
+ // randomly choose size -- this won't persist once
+ // a player picks up a piece of debris but that's
+ // fine -- CEV
+ if (item_index >= ITEM_SEQ_BREAKABLE_START &&
+ item_index <= ITEM_SEQ_BREAKABLE_END)
+ {
+ if (random() > 0.333)
+ // larger
+ d.frame = 1;
+ else
+ // smaller
+ d.frame = 2;
+ }
+ }
- // to let us use noise2
- // func_explobox_explode_silent ();
+ if (self.spawnflags & SPAWNFLAG_BASE_BREAKABLE_EXPLODE)
+ {
self.takedamage = DAMAGE_NO;
- self.origin = ((self.absmin + self.absmax) * 0.5);
t_radiusdamage2 (self, self, self.dmg, world);
write_explosion (self.origin);
spawn_base_explosion (self.origin);
-
- // this is broken as of 1.1.0 no custom explosion
- // sound for now -- dumptruck_ds
- // sound (self, CHAN_VOICE, self.noise2,
- // VOL_HIGH, ATTN_NORM);
- base_entity_remove (self);
- }
- else
- {
- self.origin = ((self.absmin + self.absmax) * 0.5);
- setorigin (self, self.origin);
- if (self.drop_item)
- base_item_drop_stuff (self);
- if (self.spawnflags & SPAWNFLAG_BASE_BREAKABLE_CUSTOM)
- {
- if (self.switchshadstyle)
- lightstyle (self.switchshadstyle, "m");
- base_breakable_make_templates_debris (dir);
- if (self)
- base_entity_remove (self);
- }
- else
- {
- if (self.switchshadstyle)
- lightstyle (self.switchshadstyle, "m");
- base_breakable_make_debris (dir);
- if (self)
- base_entity_remove (self);
- }
}
+
+ base_entity_remove (self);
};
//--------------------------------------------------------------
@@ -349,25 +202,77 @@ void() func_breakable;
};
//--------------------------------------------------------------
- void(entity e) base_breakable_template_setup =
+ void(string key, string value) base_breakable_init_field =
{
- if (e.break_template1 != "")
- precache_model (e.break_template1);
- if (e.break_template2 != "")
- precache_model (e.break_template2);
- if (e.break_template3 != "")
- precache_model (e.break_template3);
- if (e.break_template4 != "")
- precache_model (e.break_template4);
- if (e.break_template5 != "")
- precache_model (e.break_template5);
+ switch (key)
+ {
+ case "drop_item":
+ base_entity_init_drop_item (stof(value));
+ break;
+ }
};
//--------------------------------------------------------------
+ // need to precache destruction sounds here; debris models
+ // will be precached in items/throwables.qc -- CEV
+ //--------------------------------------------------------------
void(entity e) base_breakable_init =
{
base_func_init (e);
- base_breakable_template_setup (e);
+
+ if (e.noise != __NULL__ && e.noise1 != "")
+ {
+ precache_sound (e.noise1);
+ }
+ else
+ {
+ // adding new default sounds for "simple" breakables
+ // in 1.2.0 -- dumptruck_ds
+ switch (e.style)
+ {
+ // here's generic metal breaking
+ case 0: case 11: case 12: case 17:
+ case 18: case 19: case 24: case 31:
+ precache_sound ("break/metal2.wav");
+ e.noise1 = "break/metal2.wav";
+ break;
+ // wood sounds -- CEV
+ case 3: case 4: case 5:
+ precache_sound ("break/wood1.wav");
+ precache_sound ("break/wood2.wav");
+ // wood only randomized
+ if (random() > 0.6)
+ e.noise1 = "break/wood1.wav";
+ else
+ e.noise1 = "break/wood2.wav";
+ break;
+ // glass sounds -- more of a shattering sound
+ case 6: case 7: case 8: case 9: case 10:
+ precache_sound ("break/metal1.wav");
+ e.noise1 = "break/metal1.wav";
+ break;
+ // bricks -- CEV
+ case 1: case 2: case 13: case 14: case 15:
+ case 16: case 20: case 21: case 22: case 23:
+ precache_sound ("break/stones1.wav");
+ precache_sound ("break/bricks1.wav");
+ if (random() > 0.6)
+ e.noise1 = "break/bricks1.wav";
+ else
+ e.noise1 = "break/stones1.wav";
+ break;
+ // stones -- CEV
+ case 25: case 26: case 27: case 28:
+ case 29: case 30:
+ precache_sound ("break/stones1.wav");
+ precache_sound ("break/bricks1.wav");
+ if (random() > 0.6)
+ e.noise1 = "break/stones1.wav";
+ else
+ e.noise1 = "break/bricks1.wav";
+ break;
+ }
+ }
};
//--------------------------------------------------------------
@@ -383,15 +288,12 @@ void() func_breakable;
"Breakable - See manual for full details
Defaults to built-in .mdl file with 32 styles, cnt is number of pieces of debris to spawn (built-in only)
-Or use spawnflag 4 and break_template1-4 to set path of custom .mdl or .bsp models.
-brk_object_count1-4 sets the number of pieces of each break_template when using custom .mdl or bsp models.
If noise1 is not set it will default to various sounds in sounds/break folder
Use spawnflag 2 for an explosion, dmg is amount of damage inflicted"
spawnflags(flags)
1 : "No Monster Damage" : 0 : "Only the player can break"
2 : "Explosion" : 0 : "Produces explosion effect and sound"
-4 : "Use custom mdls or bsp models" : 0 : "Uses models specified in break_template1, 2, etc"
style(choices) : "Built-in debris style" : 0
0 : "Green Metal (default)"
@@ -428,19 +330,10 @@ style(choices) : "Built-in debris style" : 0
31 : "Metal Rivets"
noise1(string) : "Break noise (overrides default sounds)"
-cnt(integer) : "Number of pieces of debris to spawn" : 5
+cnt(integer) : "Number of pieces of debris to spawn" : 4
health(integer) : "Health of breakable" : 20
dmg(integer) : "Amount of Explosive Damage" : 20
-break_template1(string) : "Template 1 model path, e.g. maps/break/brk.bsp or progs/brick.mdl"
-break_template2(string) : "Template 2 model path, e.g. maps/break/brk.bsp or progs/brick.mdl"
-break_template3(string) : "Template 3 model path, e.g. maps/break/brk.bsp or progs/brick.mdl"
-break_template4(string) : "Template 4 model path, e.g. maps/break/brk.bsp or progs/brick.mdl"
-break_template5(string) : "Template 5 model path, e.g. maps/break/brk.bsp or progs/brick.mdl"
-brk_obj_count1(integer) : "Template 1 spawn count"
-brk_obj_count2(integer) : "Template 2 spawn count"
-brk_obj_count3(integer) : "Template 3 spawn count"
-brk_obj_count4(integer) : "Template 4 spawn count"
-brk_obj_count5(integer) : "Template 5 spawn count"
+
*/
//----------------------------------------------------------------------
// class func_breakable: base_breakable
@@ -449,6 +342,8 @@ brk_obj_count5(integer) : "Template 5 spawn count"
//--------------------------------------------------------------
void(entity e) func_breakable_init =
{
+ var float iaidx = 0;
+
e.classname = "func_breakable";
e.classtype = CT_FUNC_BREAKABLE;
@@ -457,98 +352,32 @@ brk_obj_count5(integer) : "Template 5 spawn count"
e.solid = SOLID_BSP;
e.movetype = MOVETYPE_PUSH;
setmodel (e, e.model);
- e.mdl_debris = "progs/debris.mdl";
- precache_model (e.mdl_debris);
- precache_sound ("blob/hit1.wav");
- if (e.noise1 != "")
- precache_sound (e.noise1);
-
- // adding new default sounds for "simple" breakables in 1.2.0
- // -- dumptruck_ds
-
- // here's genreic metal breaking
- if (e.style == 0 || e.style == 11 ||
- e.style == 12 || e.style == 17 ||
- e.style == 18 || e.style == 19 ||
- e.style == 24 || e.style == 31)
- {
- if !(e.noise1)
- {
- precache_sound ("break/metal2.wav");
- e.noise1 = "break/metal2.wav";
- }
- }
+ if (!e.health)
+ e.health = 20;
- if (e.style == 3 || e.style == 4 || e.style == 5)
- {
- if !(e.noise1)
- {
- precache_sound ("break/wood1.wav");
- precache_sound ("break/wood2.wav");
- // wood only randomized
- if (random() > 0.6)
- e.noise1 = "break/wood1.wav";
- else
- e.noise1 = "break/wood2.wav";
- }
- }
+ // restrict cnt to a sane range w/a default -- CEV
+ if (!e.cnt)
+ e.cnt = BASE_BREAKABLE_DEFAULTDEBRIS;
+ else
+ e.cnt = bound (1, e.cnt, BASE_BREAKABLE_MAXDEBRIS);
- // glass sounds -- this is more of a shattering sound anyway
- if (e.style == 6 || e.style == 7 || e.style == 8 ||
- e.style == 9 || e.style == 10)
+ // set up debris item index array -- CEV
+ for (float i = 0; i < e.cnt; i++)
{
- if !(e.noise1)
- {
- precache_sound ("break/metal1.wav");
- e.noise1 = "break/metal1.wav";
- }
- }
+ iaidx = BASE_ENTITY_ITEMLEN - (i + 1);
- if (e.style == 1 || e.style == 2 ||
- e.style == 13 || e.style == 14 ||
- e.style == 15 || e.style == 16 ||
- e.style == 20 || e.style == 21 ||
- e.style == 22 || e.style == 23)
- {
- if !(e.noise1)
- {
- precache_sound ("break/stones1.wav");
- precache_sound ("break/bricks1.wav");
- // wood only randomized
- if (random() > 0.6)
- e.noise1 = "break/bricks1.wav";
- else
- e.noise1 = "break/stones1.wav";
- }
- }
+ // skip if this item index is occupied -- CEV
+ if (e.item[iaidx])
+ continue;
- if (e.style == 25 || e.style == 26 ||
- e.style == 27 || e.style == 28 ||
- e.style == 29 || e.style == 30)
- {
- if !(e.noise1)
- {
- precache_sound ("break/stones1.wav");
- precache_sound ("break/bricks1.wav");
- // wood only randomized
- if (random() > 0.6)
- e.noise1 = "break/stones1.wav";
- else
- e.noise1 = "break/bricks1.wav";
- }
- // else
- // {
- // (e.noise1 = "blob/hit1.wav");
- // }
+ // .style maps directly to item_info starting at
+ // the ITEM_SEQ_BREAKABLE_START offset (that is,
+ // item_info is in the same order as listed in the
+ // QUAKEED comments on func_breakable -- CEV
+ e.item[iaidx] = ITEM_SEQ_BREAKABLE_START + e.style;
}
- if (!e.health)
- e.health = 20;
- if (!e.cnt)
- // was 6 dumptruck_ds
- e.cnt = 5;
-
if (e.targetname != "" && e.targetname != __NULL__)
{
e.use = base_breakable_use;
@@ -556,7 +385,7 @@ brk_obj_count5(integer) : "Template 5 spawn count"
else
{
e.takedamage = DAMAGE_YES;
- e.destroy = base_breakable_destroy;
+ e.th_destroy = base_breakable_destroy;
}
if (e.switchshadstyle)
@@ -566,10 +395,7 @@ brk_obj_count5(integer) : "Template 5 spawn count"
//--------------------------------------------------------------
void() func_breakable =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (base_breakable_init_field)
func_breakable_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/button.qc
diff --git a/qc/func/button.qc b/qc/func/button.qc
index e5934f8..4f70cd8 100644
--- a/qc/func/button.qc
+++ b/qc/func/button.qc
@@ -45,6 +45,9 @@ void() func_button_touch;
void(entity b) func_button_lock;
void(entity b, float dontresetstate) func_button_unlock;
#endif
+#ifdef SSQC
+void(string key, string value) func_button_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) func_button_init;
#endif
@@ -88,7 +91,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void() func_button_think_wait =
{
- self.state = FUNC_STATE_TOP;
+ self.moveflags = FMF_TOP;
self.think = func_button_think_return;
self.nextthink = self.ltime + self.wait;
@@ -99,7 +102,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME |
NETFLAG_BASE_ENTITY_ORIGIN;
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
sub_usetargets ();
@@ -109,16 +112,16 @@ When a button is touched, it moves some distance in the direction of it's angle,
void() func_button_think_done =
{
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
};
//--------------------------------------------------------------
void() func_button_think_return =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
- self.state = FUNC_STATE_DOWN;
+ self.moveflags = FMF_DOWN;
base_func_calcmove (self, self.pos1, self.speed,
func_button_think_done);
@@ -140,10 +143,10 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void() func_button_fire =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
- if (self.state == FUNC_STATE_UP || self.state == FUNC_STATE_TOP)
+ if (self.moveflags == FMF_UP || self.moveflags == FMF_TOP)
return;
// MG1 compat -- CEV
@@ -160,7 +163,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
sound (self, CHAN_VOICE, self.noise, VOL_MID, ATTN_NORM);
- self.state = FUNC_STATE_UP;
+ self.moveflags = FMF_UP;
base_func_calcmove (self, self.pos2, self.speed,
func_button_think_wait);
};
@@ -168,7 +171,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void(vector dir) func_button_destroy =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
self.enemy = damage_attacker;
@@ -204,30 +207,30 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void(entity b) func_button_lock =
{
- if (b.estate == STATE_INACTIVE)
+ if (b.stateflags & STATE_INACTIVE)
return;
- if (b.state == FUNC_STATE_UP || b.state == FUNC_STATE_TOP)
- b.prevstate = FUNC_STATE_TOP;
+ if (b.moveflags == FMF_UP || b.moveflags == FMF_TOP)
+ b.moveflags_prev = FMF_TOP;
else
- b.prevstate = FUNC_STATE_BOTTOM;
+ b.moveflags_prev = FMF_BOTTOM;
if (b.max_health)
b.takedamage = DAMAGE_NO;
- b.state = FUNC_STATE_UP;
+ b.moveflags = FMF_UP;
base_func_calcmove (b, b.pos2, b.speed, func_button_think_wait);
- b.estate = STATE_INACTIVE;
+ b.stateflags |= STATE_INACTIVE;
};
//--------------------------------------------------------------
void(entity b, float dontresetstate) func_button_unlock =
{
- if (b.estate == STATE_ACTIVE)
+ if (!(b.stateflags & STATE_INACTIVE))
return;
if (!dontresetstate || b.wait != -1 ||
- b.prevstate == FUNC_STATE_BOTTOM)
+ b.moveflags_prev == FMF_BOTTOM)
{
if (b.max_health)
{
@@ -237,12 +240,30 @@ When a button is touched, it moves some distance in the direction of it's angle,
// use normal textures
b.frame = 0;
- b.state = FUNC_STATE_DOWN;
+ b.moveflags = FMF_DOWN;
base_func_calcmove (b, b.pos1, b.speed,
func_button_think_done);
}
- b.estate = STATE_ACTIVE;
+ b.stateflags &= ~STATE_INACTIVE;
+ };
+#endif
+
+ //==============================================================
+ // Initialization
+ //==============================================================
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(string key, string value) func_button_init_field =
+ {
+ switch (key)
+ {
+ case "lip":
+ // rewrite .lip to .aflag -- CEV
+ self.aflag = stof (value);
+ break;
+ }
};
#endif
@@ -266,26 +287,26 @@ When a button is touched, it moves some distance in the direction of it's angle,
#ifdef SSQC
if (e.sounds == 0)
{
- precache_sound ("buttons/airbut1.wav");
- e.noise = "buttons/airbut1.wav";
+ precache_sound (snd_button_steam.wav);
+ e.noise = snd_button_steam.wav;
}
if (e.sounds == 1)
{
- precache_sound ("buttons/switch21.wav");
- e.noise = "buttons/switch21.wav";
+ precache_sound (snd_button_wood.wav);
+ e.noise = snd_button_wood.wav;
}
if (e.sounds == 2)
{
- precache_sound ("buttons/switch02.wav");
- e.noise = "buttons/switch02.wav";
+ precache_sound (snd_button_metal.wav);
+ e.noise = snd_button_metal.wav;
}
if (e.sounds == 3)
{
- precache_sound ("buttons/switch04.wav");
- e.noise = "buttons/switch04.wav";
+ precache_sound (snd_button_inout.wav);
+ e.noise = snd_button_inout.wav;
}
e.movetype = MOVETYPE_PUSH;
@@ -298,7 +319,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
{
e.max_health = e.health;
e.takedamage = DAMAGE_YES;
- e.destroy = func_button_destroy;
+ e.th_destroy = func_button_destroy;
}
else
{
@@ -309,10 +330,12 @@ When a button is touched, it moves some distance in the direction of it's angle,
e.speed = 40;
if (!e.wait)
e.wait = 1;
- if (!e.lip)
- e.lip = 4;
- e.state = FUNC_STATE_BOTTOM;
+ // was .lip -- CEV
+ if (!e.aflag)
+ e.aflag = 4;
+
+ e.moveflags = FMF_BOTTOM;
// MG1 compat -- CEV
if (e.movedir)
@@ -326,9 +349,11 @@ When a button is touched, it moves some distance in the direction of it's angle,
sub_setmovedir (e);
e.pos1 = e.origin;
e.pos2 = e.pos1 + e.movedir *
- (fabs(e.movedir * e.size) - e.lip);
+ (fabs(e.movedir * e.size) - e.aflag);
}
+ e.aflag = 0;
+
// network to CSQC -- CEV
e.tick = base_func_neteval;
e.SendEntity = base_entity_netsend;
@@ -341,10 +366,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void() func_button =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (func_button_init_field)
func_button_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/counter.qc
diff --git a/qc/func/counter.qc b/qc/func/counter.qc
index 1829af4..6803a00 100644
--- a/qc/func/counter.qc
+++ b/qc/func/counter.qc
@@ -106,12 +106,12 @@ it specifies how high to count before reseting to zero. Default is 10.
self.cnt = self.cnt + 1;
if (self.spawnflags & SPAWNFLAG_FUNC_COUNTER_RANDOM)
{
- self.state = random () * self.count;
- self.state = floor (self.state) + 1;
+ self.moveflags = random () * self.count;
+ self.moveflags = floor (self.moveflags) + 1;
}
else
{
- self.state = self.cnt;
+ self.moveflags = self.cnt;
}
// fix func_counter and func_oncount handling of activator -- iw
@@ -172,7 +172,7 @@ it specifies how high to count before reseting to zero. Default is 10.
if (self.spawnflags & SPAWNFLAG_FUNC_COUNTER_RESET)
{
self.cnt = 0;
- self.state = 0;
+ self.moveflags = 0;
}
// fix func_counter and func_oncount handling of activator -- iw
@@ -193,7 +193,7 @@ it specifies how high to count before reseting to zero. Default is 10.
float(entity e) func_counter_getcount =
{
if (e.classtype == CT_FUNC_COUNTER)
- return e.state;
+ return e.moveflags;
return 0;
};
@@ -217,7 +217,7 @@ it specifies how high to count before reseting to zero. Default is 10.
e.pausetime = e.delay;
e.delay = 0;
e.cnt = 0;
- e.state = 0;
+ e.moveflags = 0;
e.use = func_counter_use_off;
@@ -238,10 +238,7 @@ it specifies how high to count before reseting to zero. Default is 10.
//--------------------------------------------------------------
void() func_counter =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_counter_init (self);
};
#endif
@@ -293,10 +290,7 @@ reaches the value set by count, func_oncount triggers its targets.
//--------------------------------------------------------------
void() func_oncount =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_oncount_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/door.qc
diff --git a/qc/func/door.qc b/qc/func/door.qc
index 495cfcb..c9e425e 100644
--- a/qc/func/door.qc
+++ b/qc/func/door.qc
@@ -41,15 +41,6 @@ typedef enumflags
#endif
//======================================================================
-// fields
-//======================================================================
-
-#ifdef SSQC
-.float last_setstate_frame;
-.entity last_setstate = aiment;
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -83,6 +74,9 @@ void(entity e, float closealldoors) func_door_estate_lock;
void(entity e, float openalldoors) func_door_estate_unlock;
void() func_door_think_link;
#endif
+#ifdef SSQC
+void(string key, string value) func_door_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) func_door_init;
#endif
@@ -227,7 +221,7 @@ Key doors are always wait -1.
setsize (other, '0 0 0', '0 0 0');
// continue on the current path -- CEV
- if (self.state == FUNC_STATE_DOWN)
+ if (self.moveflags == FMF_DOWN)
func_door_think_go_down ();
else
func_door_think_go_up ();
@@ -252,7 +246,7 @@ Key doors are always wait -1.
// real fast
if (self.wait >= 0)
{
- if (self.state == FUNC_STATE_DOWN)
+ if (self.moveflags == FMF_DOWN)
func_door_think_go_up ();
else
func_door_think_go_down ();
@@ -263,7 +257,7 @@ Key doors are always wait -1.
void() func_door_hit_top =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_TOP;
+ self.moveflags = FMF_TOP;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
@@ -279,7 +273,7 @@ Key doors are always wait -1.
void() func_door_hit_bottom =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
};
@@ -294,7 +288,7 @@ Key doors are always wait -1.
self.health = self.max_health;
}
- self.state = FUNC_STATE_DOWN;
+ self.moveflags = FMF_DOWN;
// speed2 check from MG1 -- CEV
if (self.speed2)
@@ -327,11 +321,11 @@ Key doors are always wait -1.
//--------------------------------------------------------------
void() func_door_think_go_up =
{
- if (self.state == FUNC_STATE_UP)
+ if (self.moveflags == FMF_UP)
// allready going up
return;
- if (self.state == FUNC_STATE_TOP)
+ if (self.moveflags == FMF_TOP)
{
// reset top wait time
self.nextthink = self.ltime + self.wait;
@@ -339,7 +333,7 @@ Key doors are always wait -1.
}
sound (self, CHAN_VOICE, self.noise2, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_UP;
+ self.moveflags = FMF_UP;
// start the movement -- CEV
base_func_calcmove (self, self.pos2, self.speed,
@@ -409,7 +403,7 @@ Key doors are always wait -1.
if (self.owner != self)
objerror ("func_door_fire: self.owner != self\n");
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
// noise4 is now played in keylock_try_to_unlock -- iw
@@ -419,8 +413,8 @@ Key doors are always wait -1.
if (self.spawnflags & SPAWNFLAG_FUNC_DOOR_TOGGLE)
{
- if (self.state == FUNC_STATE_UP ||
- self.state == FUNC_STATE_TOP)
+ if (self.moveflags == FMF_UP ||
+ self.moveflags == FMF_TOP)
{
func_door_group_go_down ();
return;
@@ -505,8 +499,7 @@ Key doors are always wait -1.
if (self.owner.message != __NULL__ && self.owner.message != "")
{
centerprint (other, self.owner.message);
- sound (other, CHAN_VOICE, "misc/talk.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (other, snd_misc_talk)
}
// key door stuff
@@ -523,12 +516,12 @@ Key doors are always wait -1.
//--------------------------------------------------------------
void(entity e, float closealldoors) func_door_estate_lock =
{
- if (e.owner.estate == STATE_INACTIVE)
+ if (e.owner.stateflags & STATE_INACTIVE)
return;
// blocks linked doors from updating the same owner repeatedly
- if (e.owner.last_setstate == self &&
- e.owner.last_setstate_frame == framecount)
+ // was .last_setstate and .last_setstate_frame -- CEV
+ if (e.owner.oldenemy == self && e.owner.count == framecount)
{
return;
}
@@ -537,14 +530,14 @@ Key doors are always wait -1.
oself = self;
self = e.owner;
- self.estate = STATE_INACTIVE;
+ self.stateflags |= STATE_INACTIVE;
- self.last_setstate = oself;
- self.last_setstate_frame = framecount;
+ self.oldenemy = oself;
+ self.count = framecount;
- self.prevstate = self.estate;
+ self.moveflags_prev = self.moveflags;
- if (self.state == FUNC_STATE_UP || self.state == FUNC_STATE_TOP)
+ if (self.moveflags == FMF_UP || self.moveflags == FMF_TOP)
{
// don't close wait -1 nor toggleable doors...
// ...unless the trigger_setstate has a "Close all
@@ -573,12 +566,11 @@ Key doors are always wait -1.
//--------------------------------------------------------------
void(entity e, float openalldoors) func_door_estate_unlock =
{
- if (e.owner.estate == STATE_ACTIVE)
+ if (!(e.owner.stateflags & STATE_INACTIVE))
return;
// blocks linked doors from updating the same owner repeatedly
- if (e.owner.last_setstate == self &&
- e.owner.last_setstate_frame == framecount)
+ if (e.owner.oldenemy == self && e.owner.count == framecount)
{
return;
}
@@ -587,11 +579,11 @@ Key doors are always wait -1.
oself = self;
self = e.owner;
- self.last_setstate = oself;
- self.last_setstate_frame = framecount;
+ self.oldenemy = oself;
+ self.count = framecount;
- if (self.prevstate == FUNC_STATE_UP ||
- self.prevstate == FUNC_STATE_TOP)
+ if (self.moveflags_prev == FMF_UP ||
+ self.moveflags_prev == FMF_TOP)
{
if ((self.wait == -1 || (openalldoors &&
self.spawnflags & SPAWNFLAG_FUNC_DOOR_TOGGLE)))
@@ -612,13 +604,13 @@ Key doors are always wait -1.
while ((next != self) && (next != world));
}
- self.estate = STATE_ACTIVE;
+ self.stateflags &= ~STATE_INACTIVE;
self = oself;
};
- //--------------------------------------------------------------
- // SPAWNING FUNCTIONS
- //--------------------------------------------------------------
+ //==============================================================
+ // Initialization
+ //==============================================================
//--------------------------------------------------------------
// LinkDoors
@@ -710,6 +702,20 @@ Key doors are always wait -1.
};
#endif
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(string key, string value) func_door_init_field =
+ {
+ switch (key)
+ {
+ case "lip":
+ // rewrite .lip to .aflag -- CEV
+ self.aflag = stof (value);
+ break;
+ }
+ };
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) func_door_init =
@@ -718,39 +724,47 @@ Key doors are always wait -1.
e.classtype = CT_FUNC_DOOR;
base_func_init (e);
+ #ifdef CSQC
+ setmodelindex (e, e.modelindex);
+ setsize (e, e.mins, e.maxs);
+ setorigin (e, e.origin);
+ e.drawmask = DRAWMASK_NORMAL;
+ e.predraw = base_func_predraw;
+ #endif
+
#ifdef SSQC
local string default_noise1;
local string default_noise2;
- // this.noise3 and this.noise4 can now be overridden by
+ // self.noise3 and self.noise4 can now be overridden by
// the mapper, but will be set to default values in
// keylock_init if necessary -- iw
keylock_init (e);
// e.noise1 and e.noise2 can now be overridden by
// the mapper -- iw
- default_noise1 = "misc/null.wav";
- default_noise2 = "misc/null.wav";
+ default_noise1 = snd_null.wav;
+ default_noise2 = snd_null.wav;
if (e.sounds == 1)
{
- default_noise1 = "doors/drclos4.wav";
- default_noise2 = "doors/doormv1.wav";
+ default_noise1 = snd_door_stone_close.wav;
+ default_noise2 = snd_door_stone_open.wav;
}
else if (e.sounds == 2)
{
- default_noise1 = "doors/hydro2.wav";
- default_noise2 = "doors/hydro1.wav";
+ default_noise1 = snd_door_base_close.wav;
+ default_noise2 = snd_door_base_open.wav;
}
else if (e.sounds == 3)
{
- default_noise1 = "doors/stndr2.wav";
- default_noise2 = "doors/stndr1.wav";
+ default_noise1 = snd_door_chain_close.wav;
+ default_noise2 = snd_door_chain_open.wav;
}
else if (e.sounds == 4)
{
- default_noise1 = "doors/ddoor2.wav";
- default_noise2 = "doors/ddoor1.wav";
+ default_noise1 = snd_door_metal_close.wav;
+ default_noise2 = snd_door_metal_open.wav;
}
if (e.noise1 == __NULL__ || e.noise1 == "")
@@ -762,19 +776,12 @@ Key doors are always wait -1.
precache_sound (e.noise2);
e.max_health = e.health;
- #endif
e.solid = SOLID_BSP;
e.movetype = MOVETYPE_PUSH;
setorigin (e, e.origin);
-
- #if defined(SSQC)
setmodel (e, e.model);
- #elif defined(CSQC)
- setmodelindex (e, e.modelindex);
- #endif
- #ifdef SSQC
e.blocked = func_door_blocked;
e.use = func_door_use;
@@ -828,8 +835,9 @@ Key doors are always wait -1.
e.wait = 3;
}
- if (!e.lip)
- e.lip = 8;
+ // was .lip -- CEV
+ if (!e.aflag)
+ e.aflag = 8;
if (!e.dmg)
e.dmg = 2;
@@ -846,9 +854,11 @@ Key doors are always wait -1.
sub_setmovedir (e);
e.pos1 = e.origin;
e.pos2 = e.pos1 + e.movedir *
- (fabs(e.movedir * e.size) - e.lip);
+ (fabs(e.movedir * e.size) - e.aflag);
}
+ e.aflag = 0;
+
// DOOR_START_OPEN is to allow an entity to be lighted in
// the closed position but spawn in the open position
if (e.spawnflags & SPAWNFLAG_FUNC_DOOR_START_OPEN)
@@ -858,12 +868,12 @@ Key doors are always wait -1.
e.pos1 = e.origin;
}
- e.state = FUNC_STATE_BOTTOM;
+ e.moveflags = FMF_BOTTOM;
if (e.health)
{
e.takedamage = DAMAGE_YES;
- e.destroy = func_door_destroy;
+ e.th_destroy = func_door_destroy;
}
if (e.spawnflags & SPAWNFLAG_FUNC_DOOR_DOOM_STYLE_UNLOCK)
@@ -902,11 +912,6 @@ Key doors are always wait -1.
e.SendEntity = base_entity_netsend;
e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
#endif
-
- #ifdef CSQC
- e.drawmask = DRAWMASK_NORMAL;
- e.predraw = base_func_predraw;
- #endif
};
#endif
@@ -914,10 +919,7 @@ Key doors are always wait -1.
//--------------------------------------------------------------
void() func_door =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (func_door_init_field)
func_door_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/door_secret.qc
diff --git a/qc/func/door_secret.qc b/qc/func/door_secret.qc
index df4d5bb..c75594a 100644
--- a/qc/func/door_secret.qc
+++ b/qc/func/door_secret.qc
@@ -135,7 +135,7 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
//--------------------------------------------------------------
void() func_door_secret_think =
{
- switch (self.state)
+ switch (self.moveflags)
{
case fd_secret_move1:
// fd_secret_move1: Wait after first movement
@@ -159,7 +159,7 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
{
self.nextthink = self.ltime + self.wait;
}
- #if 1
+ #if 0
else
{
dprint (sprintf("func_door_secret_think"
@@ -196,7 +196,8 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
{
self.health = 10000;
self.takedamage = DAMAGE_YES;
- self.destroy = func_door_secret_destroy;
+ self.th_destroy =
+ func_door_secret_destroy;
self.th_pain = func_door_secret_pain;
// self.th_pain = sub_nullpain;
}
@@ -212,13 +213,14 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
break;
default:
dprint (sprintf("func_door_secret_think: "
- "unhandled state %f!\n", self.state));
+ "unhandled moveflags %f!\n",
+ self.moveflags));
}
- if (self.state < fd_secret_move4 || !(self.spawnflags &
+ if (self.moveflags < fd_secret_move4 || !(self.spawnflags &
SPAWNFLAG_FUNC_DOOR_SECRET_OPEN_ONCE))
{
- self.state++;
+ self.moveflags++;
}
};
@@ -239,8 +241,7 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
if (self.message != "")
{
centerprint (other, self.message);
- sound (other, CHAN_BODY, "misc/talk.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (other, snd_misc_talk)
}
};
@@ -301,7 +302,7 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
(self.t_width * temp);
self.pos2 = self.pos1 + v_forward * self.t_length;
- self.state = fd_secret_move1;
+ self.moveflags = fd_secret_move1;
base_func_calcmove (self, self.pos1, self.speed,
func_door_secret_think);
sound (self, CHAN_VOICE, self.noise2, VOL_MHI, ATTN_NORM);
@@ -330,30 +331,28 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
if (e.sounds == 1)
{
- precache_sound ("doors/latch2.wav");
- precache_sound ("doors/winch2.wav");
- precache_sound ("doors/drclos4.wav");
- e.noise1 = "doors/latch2.wav";
- e.noise2 = "doors/winch2.wav";
- e.noise3 = "doors/drclos4.wav";
+ precache_sound (snd_door_secret_med_start.wav);
+ precache_sound (snd_door_secret_med_stop.wav);
+ precache_sound (snd_door_secret_med_travel.wav);
+ e.noise1 = snd_door_secret_med_start.wav;
+ e.noise2 = snd_door_secret_med_travel.wav;
+ e.noise3 = snd_door_secret_med_stop.wav;
}
-
- if (e.sounds == 2)
+ else if (e.sounds == 2)
{
- precache_sound ("doors/airdoor1.wav");
- precache_sound ("doors/airdoor2.wav");
- e.noise2 = "doors/airdoor1.wav";
- e.noise1 = "doors/airdoor2.wav";
- e.noise3 = "doors/airdoor2.wav";
+ precache_sound (snd_door_secret_metal_open.wav);
+ precache_sound (snd_door_secret_metal_close.wav);
+ e.noise2 = snd_door_secret_metal_open.wav;
+ e.noise1 = snd_door_secret_metal_close.wav;
+ e.noise3 = snd_door_secret_metal_close.wav;
}
-
- if (e.sounds == 3)
+ else if (e.sounds == 3)
{
- precache_sound ("doors/basesec1.wav");
- precache_sound ("doors/basesec2.wav");
- e.noise2 = "doors/basesec1.wav";
- e.noise1 = "doors/basesec2.wav";
- e.noise3 = "doors/basesec2.wav";
+ precache_sound (snd_door_secret_base_open.wav);
+ precache_sound (snd_door_secret_base_close.wav);
+ e.noise2 = snd_door_secret_base_open.wav;
+ e.noise1 = snd_door_secret_base_close.wav;
+ e.noise3 = snd_door_secret_base_close.wav;
}
if (!e.dmg)
@@ -379,7 +378,7 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
e.health = 10000;
e.takedamage = DAMAGE_YES;
e.th_pain = func_door_secret_pain;
- e.destroy = func_door_secret_destroy;
+ e.th_destroy = func_door_secret_destroy;
}
e.oldorigin = e.origin;
@@ -400,10 +399,7 @@ If a secret door has a targetname, it will only be opened by it's botton or trig
//--------------------------------------------------------------
void() func_door_secret =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_door_secret_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/elvtr_button.qc
diff --git a/qc/func/elvtr_button.qc b/qc/func/elvtr_button.qc
index 3d8881f..e14461d 100644
--- a/qc/func/elvtr_button.qc
+++ b/qc/func/elvtr_button.qc
@@ -55,6 +55,9 @@ void(vector dir) func_elvtr_button_destroy;
void() func_elvtr_button_touch;
void() func_elvtr_button_use;
#endif
+#ifdef SSQC
+void(string key, string value) func_elvtr_button_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) func_elvtr_button_init;
#endif
@@ -109,7 +112,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
else
elv_butn_dir = 1;
- self.state = FUNC_STATE_TOP;
+ self.moveflags = FMF_TOP;
activator = self.enemy;
sub_usetargets ();
@@ -125,13 +128,13 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void() func_elvtr_button_done =
{
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
};
//--------------------------------------------------------------
void() func_elvtr_button_return =
{
- self.state = FUNC_STATE_DOWN;
+ self.moveflags = FMF_DOWN;
base_func_calcmove (self, self.pos1, self.speed,
func_elvtr_button_done);
@@ -147,12 +150,12 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void() func_elvtr_button_fire =
{
- if (self.state == FUNC_STATE_UP || self.state == FUNC_STATE_TOP)
+ if (self.moveflags == FMF_UP || self.moveflags == FMF_TOP)
return;
sound (self, CHAN_VOICE, self.noise, VOL_MID, ATTN_NORM);
- self.state = FUNC_STATE_UP;
+ self.moveflags = FMF_UP;
base_func_calcmove (self, self.pos2, self.speed,
func_elvtr_button_wait);
};
@@ -194,6 +197,24 @@ When a button is touched, it moves some distance in the direction of it's angle,
};
#endif
+ //==============================================================
+ // Initialization
+ //==============================================================
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(string key, string value) func_elvtr_button_init_field =
+ {
+ switch (key)
+ {
+ case "lip":
+ // rewrite .lip to .aflag -- CEV
+ self.aflag = stof (value);
+ break;
+ }
+ };
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) func_elvtr_button_init =
@@ -211,29 +232,16 @@ When a button is touched, it moves some distance in the direction of it's angle,
#endif
#ifdef SSQC
- if (e.sounds == 0)
+ switch (e.sounds)
{
- precache_sound ("buttons/airbut1.wav");
- e.noise = "buttons/airbut1.wav";
+ case 3: e.noise = snd_button_inout.wav; break;
+ case 2: e.noise = snd_button_metal.wav; break;
+ case 1: e.noise = snd_button_wood.wav; break;
+ case 0:
+ default: e.noise = snd_button_steam.wav; break;
}
- if (e.sounds == 1)
- {
- precache_sound ("buttons/switch21.wav");
- e.noise = "buttons/switch21.wav";
- }
-
- if (e.sounds == 2)
- {
- precache_sound ("buttons/switch02.wav");
- e.noise = "buttons/switch02.wav";
- }
-
- if (e.sounds == 3)
- {
- precache_sound ("buttons/switch04.wav");
- e.noise = "buttons/switch04.wav";
- }
+ precache_sound (e.noise);
sub_setmovedir (e);
@@ -248,7 +256,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
{
e.max_health = e.health;
e.takedamage = DAMAGE_YES;
- e.destroy = func_elvtr_button_destroy;
+ e.th_destroy = func_elvtr_button_destroy;
}
else
{
@@ -259,14 +267,18 @@ When a button is touched, it moves some distance in the direction of it's angle,
e.speed = 40;
if (!e.wait)
e.wait = 1;
- if (!e.lip)
- e.lip = 4;
- e.state = FUNC_STATE_BOTTOM;
+ // was .lip -- CEV
+ if (!e.aflag)
+ e.aflag = 4;
+
+ e.moveflags = FMF_BOTTOM;
e.pos1 = e.origin;
e.pos2 = e.pos1 + e.movedir *
- (fabs(e.movedir * e.size) - e.lip);
+ (fabs(e.movedir * e.size) - e.aflag);
+
+ e.aflag = 0;
// network to the CSQC client -- CEV
e.tick = base_func_neteval;
@@ -280,10 +292,7 @@ When a button is touched, it moves some distance in the direction of it's angle,
//--------------------------------------------------------------
void() func_elvtr_button =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (func_elvtr_button_init_field)
func_elvtr_button_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/episodegate.qc
diff --git a/qc/func/episodegate.qc b/qc/func/episodegate.qc
index 83b78e8..a66a9f3 100644
--- a/qc/func/episodegate.qc
+++ b/qc/func/episodegate.qc
@@ -115,10 +115,7 @@ This bmodel will appear if the episode has allready been completed, so players c
//--------------------------------------------------------------
void() func_episodegate =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_episodegate_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/explobox.qc
diff --git a/qc/func/explobox.qc b/qc/func/explobox.qc
index 775cce8..0f5183a 100644
--- a/qc/func/explobox.qc
+++ b/qc/func/explobox.qc
@@ -15,6 +15,9 @@ void() func_explobox_explode_silent;
void(vector dir) func_explobox_destroy;
// void() func_explobox_think;
#endif
+#ifdef SSQC
+void(string key, string value) func_explobox_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) func_explobox_init;
#endif
@@ -54,7 +57,7 @@ Keys:
self.takedamage = DAMAGE_NO;
self.origin = ((self.absmin + self.absmax) * 0.5);
- t_radiusdamage2 (self, self, self.dmg, world);
+ t_radiusdamage2 (self, self, self.dmg_splash, world);
write_explosion (self.origin);
@@ -82,13 +85,33 @@ Keys:
/*
void() func_explobox_think =
{
- // sound (this, CHAN_VOICE, "weapons/r_exp3.wav",
- // VOL_HIGH, ATTN_NORM);
+ #if 0
+ SOUND (self, snd_weapon_rocket_explosion)
+ #endif
func_explobox_explode_silent ();
};
*/
#endif
+ //==============================================================
+ // Initialization
+ //==============================================================
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(string key, string value) func_explobox_init_field =
+ {
+ switch (key)
+ {
+ case "dmg":
+ // rewrite .dmg to .dmg_splash -- CEV
+ self.dmg_splash = stof (value);
+ self.dmg = 0;
+ break;
+ }
+ };
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) func_explobox_init =
@@ -108,20 +131,21 @@ Keys:
e.solid = SOLID_BSP;
e.movetype = MOVETYPE_PUSH;
setmodel (e, e.model);
- precache_sound ("weapons/r_exp3.wav");
+ precache_sound (snd_weapon_rocket_explosion.wav);
if (!e.health)
e.health = 20;
- if (!e.dmg)
+ // exploboxes do radius not direct damage, use dmg_splash -- CEV
+ if (!e.dmg_splash)
{
if (known_release == KNOWN_RELEASE_MG1)
- e.dmg = 160;
+ e.dmg_splash = 160;
else
- e.dmg = 100;
+ e.dmg_splash = 100;
}
- e.destroy = func_explobox_destroy;
+ e.th_destroy = func_explobox_destroy;
e.takedamage = DAMAGE_AIM;
// network func_wall to the CSQC client -- CEV
@@ -135,10 +159,7 @@ Keys:
//--------------------------------------------------------------
void() func_explobox =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (func_explobox_init_field)
func_explobox_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/fall.qc
diff --git a/qc/func/fall.qc b/qc/func/fall.qc
index 80d6997..ec88767 100644
--- a/qc/func/fall.qc
+++ b/qc/func/fall.qc
@@ -83,37 +83,32 @@ Falling brush upon touch
{
if (self.cnt == TRUE && self.attack_finished < time)
{
- self.solid = SOLID_BBOX;
- self.movetype = MOVETYPE_TOSS;
- self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN |
- NETFLAG_BASE_ENTITY_SOLID;
-
- if (!(self.classgroup & CG_FRAMETICK))
- self.classgroup |= CG_FRAMETICK;
-
if (!(self.spawnflags & SPAWNFLAG_FUNC_FADE_DONT_FADE))
{
if (self.alpha > 0.1)
{
- self.alpha = self.alpha - 0.03;
+ self.alpha -= 0.03;
self.SendFlags |=
NETFLAG_BASE_ENTITY_ALPHA;
}
else
{
self.classgroup &= ~CG_FRAMETICK;
+ self.nextthink = 0;
base_entity_remove (self);
return;
}
}
}
- else if (self.flags & FL_ONGROUND)
+
+ if (self.flags & FL_ONGROUND)
{
- if (self.classgroup & CG_FRAMETICK)
- self.classgroup &= ~CG_FRAMETICK;
+ self.nextthink = 0;
+ }
+ else
+ {
+ self.nextthink = time + 0.1;
}
-
- self.nextthink = time + 0.1;
};
//--------------------------------------------------------------
@@ -136,8 +131,15 @@ Falling brush upon touch
if (self.cnt == TRUE)
return;
- self.attack_finished = time + self.wait;
+ self.classgroup |= CG_FRAMETICK;
self.cnt = TRUE;
+ self.solid = SOLID_BBOX;
+ self.movetype = MOVETYPE_TOSS;
+ self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN |
+ NETFLAG_BASE_ENTITY_SOLID;
+
+ self.attack_finished = time + self.wait;
+ self.nextthink = time + 0.1;
if (!(self.spawnflags & SPAWNFLAG_FUNC_FADE_SILENT))
{
@@ -153,9 +155,16 @@ Falling brush upon touch
//--------------------------------------------------------------
void() func_fall_use =
{
- // thanks again RennyC for help on revisions --dumptruck_ds
- self.attack_finished = time + self.wait;
+ // thanks again RennyC for help on revisions -- dumptruck_ds
+ self.classgroup |= CG_FRAMETICK;
self.cnt = TRUE;
+ self.solid = SOLID_BBOX;
+ self.movetype = MOVETYPE_TOSS;
+ self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN |
+ NETFLAG_BASE_ENTITY_SOLID;
+
+ self.attack_finished = time + self.wait;
+ self.nextthink = time + 0.1;
if (self.noise != "")
sound (self, CHAN_AUTO, self.noise, 1, ATTN_NORM);
@@ -193,10 +202,10 @@ Falling brush upon touch
e.use = func_fall_use;
e.touch = func_fall_touch;
e.think = func_fall_think;
- e.nextthink = time;
+ // e.nextthink = time;
setmodel (e, e.model);
- e.customphysics = base_entity_movetype_push;
+ // e.customphysics = base_entity_movetype_push;
e.tick = base_func_neteval;
e.SendEntity = base_entity_netsend;
e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
@@ -208,10 +217,7 @@ Falling brush upon touch
//--------------------------------------------------------------
void() func_fall =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_fall_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/fall2.qc
diff --git a/qc/func/fall2.qc b/qc/func/fall2.qc
index 3ecfad5..fb206cd 100644
--- a/qc/func/fall2.qc
+++ b/qc/func/fall2.qc
@@ -48,7 +48,9 @@ void(float isnew) func_fall2_netreceive;
void() func_fall2_think;
void() func_fall2_touch;
void() func_fall2_use;
-void(entity e) func_fall2_breakable_fields;
+#endif
+#ifdef SSQC
+void(string key, string value) func_fall2_init_field;
#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) func_fall2_init;
@@ -153,99 +155,64 @@ Able to .target other entities, including other func_fall2s
//--------------------------------------------------------------
void() func_fall2_think =
{
- // turn off quake engine splash sound
- self.waterlevel = self.watertype = 0;
-
- if (self.attack_finished < time)
+ if (self.attack_finished >= time)
{
- if (self.target != __NULL__ && self.target != "")
- sub_useandforgettargets ();
+ self.nextthink = self.ltime + 0.1;
+ return;
+ }
+ if (self.target != __NULL__ && self.target != "")
+ sub_useandforgettargets ();
- // removed FALL_SOLID behavior -- dumptruck_ds
- self.solid = SOLID_NOT;
+ // removed FALL_SOLID behavior -- dumptruck_ds
+ self.solid = SOLID_NOT;
- if (self.pos1 != '0 0 0')
- // apply stored avelocity vector values
- self.avelocity = self.pos1;
+ if (self.pos1 != '0 0 0')
+ // apply stored avelocity vector values
+ self.avelocity = self.pos1;
- if (self.pos2 && !self.velocity)
- // Add velocity movement
- self.velocity = self.pos2;
+ if (self.pos2 && !self.velocity)
+ // Add velocity movement
+ self.velocity = self.pos2;
- if (self.cnt > 0)
- {
- // cnt over 0
- if (self.cnt >= 2)
- {
- self.movetype = MOVETYPE_BOUNCE;
- if (self.velocity_z < self.lip)
- self.velocity_z = self.lip;
- }
- else
- {
- // cnt is 1
- self.movetype = MOVETYPE_NOCLIP;
- if (self.velocity_z > self.lip)
- self.velocity_z -= self.speed *
- (frametime * 100);
- else
- self.velocity_z = self.lip;
- }
- }
+ if (self.cnt >= 2)
+ {
+ self.movetype = MOVETYPE_BOUNCE;
+ self.velocity.z = max (self.velocity.z, self.speed2);
+ }
+ else if (self.cnt == 1)
+ {
+ self.movetype = MOVETYPE_NOCLIP;
+ if (self.velocity.z > self.speed2)
+ self.velocity.z -= self.velocity.z -
+ self.speed * (frametime * 100);
else
- {
- // default behavior (cnt is 0)
- self.movetype = MOVETYPE_TOSS;
- if (self.velocity_z < self.lip)
- self.velocity_z = self.lip;
- }
+ self.velocity.z = self.speed2;
+ }
+ else
+ {
+ // default behavior (cnt is 0 or less)
+ self.movetype = MOVETYPE_TOSS;
+ self.velocity.z = max (self.velocity.z, self.speed2);
+ }
- self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
- if (!(self.classgroup & CG_FRAMETICK))
- self.classgroup |= CG_FRAMETICK;
-
- if (self.pain_finished != -1)
+ if (self.pain_finished != -1)
+ {
+ if (self.alpha > 0.1)
{
- if (self.alpha > 0.1)
- {
- self.alpha -= self.pain_finished;
- self.SendFlags |=
- NETFLAG_BASE_ENTITY_ALPHA;
- }
- else
- {
- if (self.noise2 != __NULL__ &&
- self.noise2 != "")
- {
- sound (self, CHAN_AUTO,
- self.noise2,
- VOL_HIGH, ATTN_NORM);
- }
- base_entity_remove (self);
- return;
- }
+ self.alpha -= self.pain_finished;
+ self.SendFlags |= NETFLAG_BASE_ENTITY_ALPHA;
}
-
- if (self.spawnflags & SPAWNFLAG_FUNC_FALL2_BREAKABLE &&
- self.flags & FL_ONGROUND)
+ else
{
- // VR
- // aka BREAKABLE_NO_MONSTERS
- self.spawnflags(-)1;
- // aka BREAK_EXPLODE
- self.spawnflags(-)2;
- // because of how debris origin is calculated
- self.mins = self.absmin;
- self.maxs = self.absmax;
- // debris gets velocity from health
- self.health = self.lip * 0.1;
- // func_breakable uses cnt for quantity of
- // debris to spawn
- self.cnt = self.count;
- // removes self
- base_breakable_die ('0 0 0');
+ if (self.noise2 != __NULL__ && self.noise2!="")
+ {
+ sound (self, CHAN_AUTO, self.noise2,
+ VOL_HIGH, ATTN_NORM);
+ }
+ base_entity_remove (self);
return;
}
}
@@ -253,6 +220,29 @@ Able to .target other entities, including other func_fall2s
{
if (self.classgroup & CG_FRAMETICK)
self.classgroup &= ~CG_FRAMETICK;
+
+ self.movetype = MOVETYPE_NONE;
+ self.think = sub_null;
+ }
+
+ if (self.flags & FL_ONGROUND &&
+ self.spawnflags & SPAWNFLAG_FUNC_FALL2_BREAKABLE)
+ {
+ // VR
+ // aka BREAKABLE_NO_MONSTERS
+ self.spawnflags(-)1;
+ // aka BREAK_EXPLODE
+ self.spawnflags(-)2;
+ // because of how debris origin is calculated
+ self.mins = self.absmin;
+ self.maxs = self.absmax;
+ // debris gets velocity from health
+ self.health = self.speed2 * 0.1;
+ // func_breakable uses cnt for quantity of
+ // debris to spawn
+ self.cnt = self.count;
+ // removes self
+ base_breakable_die ('0 0 0');
}
self.nextthink = self.ltime + 0.1;
@@ -272,30 +262,11 @@ Able to .target other entities, including other func_fall2s
// disable on monster only, also fixes weird issue
return;
- self.think = func_fall2_think;
- self.nextthink = self.ltime + 0.1;
- self.attack_finished = time + self.wait;
-
- // if (self.spawnflags & SPAWNFLAG_FUNC_FALL_SOLID)
- // {
- // // VR
- // setsize (self, self.mins, self.maxs);
- // self.solid = SOLID_BBOX;
- // }
- // else
- // {
- // self.solid = SOLID_NOT;
- // }
-
- if (self.noise != __NULL__ && self.noise != "")
- sound (self, CHAN_AUTO, self.noise,
- VOL_HIGH, ATTN_NORM);
-
- // disable touch, only do self once!
- self.touch = sub_null;
-
if (self.trigger_field)
remove (self.trigger_field);
+
+ // call use 'cause it does the same thing touch() did -- CEV
+ func_fall2_use ();
};
//--------------------------------------------------------------
@@ -303,112 +274,40 @@ Able to .target other entities, including other func_fall2s
{
self.think = func_fall2_think;
self.nextthink = self.ltime + 0.1;
- // disable touch when used
- self.touch = sub_null;
+ self.attack_finished = time + self.wait;
- // if (self.spawnflags & SPAWNFLAG_FUNC_FALL_SOLID)
- // {
- // // VR
- // setsize (self, self.mins, self.maxs);
- // self.solid = SOLID_BBOX;
- // }
- // else
- // {
- // self.solid = SOLID_NOT;
- // }
+ if (!(self.classgroup & CG_FRAMETICK))
+ self.classgroup |= CG_FRAMETICK;
- self.attack_finished = time + self.wait;
if (self.noise != __NULL__ && self.noise != "")
sound (self, CHAN_AUTO, self.noise,
VOL_HIGH, ATTN_NORM);
+
+ // disable touch, only do this once!
+ self.touch = sub_null;
};
// You may have to modify your multi_touch(); command in triggers.qc
// to allow both monsters & players to activate trigger_once/multiple.
// I recommend allowing the mapper themselves to select how that
// occurs. Default behavior is player only.
+#endif
+
+ //==============================================================
+ // Initialization
+ //==============================================================
+#ifdef SSQC
//--------------------------------------------------------------
- void(entity e) func_fall2_breakable_fields =
+ void(string key, string value) func_fall2_init_field =
{
- base_breakable_template_setup (e);
-
- e.mdl_debris = "progs/debris.mdl";
- precache_model (e.mdl_debris);
-
- if (e.noise1 != "")
- precache_sound (e.noise1);
-
- // adding new default sounds for "simple" breakables in 1.2.0
- // -- dumptruck_ds
-
- // here's generic metal breaking
- if (e.style == 0 || e.style == 11 ||
- e.style == 12 || e.style == 17 ||
- e.style == 18 || e.style == 19 ||
- e.style == 24 || e.style == 31)
- {
- if !(e.noise1)
- {
- precache_sound ("break/metal2.wav");
- e.noise1 = "break/metal2.wav";
- }
- }
-
- if (e.style == 3 || e.style == 4 || e.style == 5)
- {
- if !(e.noise1)
- {
- precache_sound ("break/wood1.wav");
- precache_sound ("break/wood2.wav");
- // wood only randomized
- if (random() > 0.6)
- e.noise1 = "break/wood1.wav";
- else
- e.noise1 = "break/wood2.wav";
- }
- }
-
- // glass sounds -- e is more of a shattering sound anyway
- if (e.style == 6 || e.style == 7 || e.style == 8 ||
- e.style == 9 || e.style == 10)
- {
- if !(e.noise1)
- {
- precache_sound ("break/metal1.wav");
- e.noise1 = "break/metal1.wav";
- }
- }
-
- if (e.style == 1 || e.style == 2 ||
- e.style == 13 || e.style == 14 ||
- e.style == 15 || e.style == 16 ||
- e.style == 20 || e.style == 21 ||
- e.style == 22 || e.style == 23)
- {
- if !(e.noise1)
- {
- precache_sound ("break/bricks1.wav");
- e.noise1 = "break/bricks1.wav";
- }
- }
-
- if (e.style == 25 || e.style == 26 ||
- e.style == 27 || e.style == 28 ||
- e.style == 29 || e.style == 30)
+ switch (key)
{
- if !(e.noise1)
- {
- precache_sound ("break/stones1.wav");
- e.noise1 = "break/stones1.wav";
- }
+ case "lip":
+ // rewrite .lip to .speed2 -- CEV
+ self.speed2 = stof (value);
+ break;
}
-
- if (!e.health)
- e.health = 20;
- if (!e.count)
- // was 6 dumptruck_ds
- e.count = 5;
};
#endif
@@ -428,7 +327,24 @@ Able to .target other entities, including other func_fall2s
#endif
#ifdef SSQC
- base_breakable_init (e);
+ if (e.spawnflags & SPAWNFLAG_FUNC_FALL2_BREAKABLE)
+ {
+ // dont fade if set to break -- VR
+ e.pain_finished = -1;
+
+ if (!e.health)
+ e.health = 20;
+ if (!e.count)
+ // was 6 dumptruck_ds
+ e.count = 5;
+
+ // will handle sound precaches -- CEV
+ base_breakable_init (e);
+ }
+ else
+ {
+ base_func_init (e);
+ }
// This is a hack to have monsters be able to trigger it
// by fake touch - Thanks to Nahuel
@@ -460,28 +376,21 @@ Able to .target other entities, including other func_fall2s
if (!e.speed)
e.speed = 10;
- if (!e.lip)
- e.lip = -800;
- if (e.avelocity != '0 0 0')
+ // was .lip -- CEV
+ if (!e.speed2)
+ e.speed2 = -800;
+
+ if (e.avelocity)
{
// store it
e.pos1 = e.avelocity;
e.avelocity = '0 0 0';
}
- if (e.spawnflags & SPAWNFLAG_FUNC_FALL2_BREAKABLE)
- {
- // VR
- // dont fade if set to break
- e.pain_finished = -1;
- func_fall2_breakable_fields (e);
- }
-
e.use = func_fall2_use;
setmodel (e, e.model);
- e.customphysics = base_entity_movetype_push;
e.tick = base_func_neteval;
e.SendEntity = base_entity_netsend;
e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
@@ -493,10 +402,7 @@ Able to .target other entities, including other func_fall2s
//--------------------------------------------------------------
void() func_fall2 =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (func_fall2_init_field)
func_fall2_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/hurt.qc
diff --git a/qc/func/hurt.qc b/qc/func/hurt.qc
new file mode 100644
index 0000000..608b20f
--- /dev/null
+++ b/qc/func/hurt.qc
@@ -0,0 +1,145 @@
+//==============================================================================
+// func_hurt -- entity from MG1
+//==============================================================================
+
+//======================================================================
+// constants
+//======================================================================
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// func_hurt spawnflags -- CEV
+//----------------------------------------------------------------------
+typedef enumflags
+{
+ SPAWNFLAG_FUNC_HURT_START_ON = 1
+ // SPAWNFLAG_NOT_ON_EASY = 256, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_NORMAL = 512,
+ // SPAWNFLAG_NOT_ON_HARD_OR_NIGHTMARE = 1024,
+ // SPAWNFLAG_NOT_IN_DEATHMATCH = 2048,
+ // SPAWNFLAG_NOT_IN_COOP = 4096,
+ // SPAWNFLAG_NOT_IN_SP = 8192,
+ // SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
+ // SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
+} func_hurt_spawnflags;
+#endif
+
+//======================================================================
+// forward declarations
+//======================================================================
+
+// func_hurt
+#ifdef CSQC
+void(float isnew) func_hurt_netreceive;
+#endif
+#ifdef SSQC
+void() func_hurt_touch;
+void() func_hurt_use;
+#endif
+#if defined(CSQC) || defined(SSQC)
+void(entity e) func_hurt_init;
+#endif
+#ifdef SSQC
+void() func_hurt;
+#endif
+
+//------------------------------------------------------------------------------
+
+//----------------------------------------------------------------------
+// class func_hurt: base_func
+// {
+#ifdef CSQC
+ //--------------------------------------------------------------
+ void(float isnew) func_hurt_netreceive =
+ {
+ // creates the netflag variable -- CEV
+ BASE_FUNC_NETRECEIVE (func_hurt_init)
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void() func_hurt_touch =
+ {
+ if (self.stateflags & STATE_INACTIVE)
+ return;
+
+ if (other.health <= 0)
+ return;
+
+ if (!other.takedamage)
+ return;
+
+ if (!(other.flags & (FL_CLIENT | FL_MONSTER)))
+ return;
+
+ if (self.attack_finished > time)
+ return;
+
+ t_damage2 (other, self, world, self.dmg);
+ self.attack_finished = time + self.wait;
+ };
+
+ //--------------------------------------------------------------
+ void() func_hurt_use =
+ {
+ if (self.stateflags & STATE_INACTIVE)
+ self.stateflags &= ~STATE_INACTIVE;
+ else
+ self.stateflags |= STATE_INACTIVE;
+
+ self.attack_finished = 0;
+ };
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+ //--------------------------------------------------------------
+ void(entity e) func_hurt_init =
+ {
+ e.classname = "func_hurt";
+ e.classtype = CT_FUNC_HURT;
+ base_func_init (e);
+
+ #ifdef CSQC
+ setmodelindex (e, e.modelindex);
+ setsize (e, e.mins, e.maxs);
+ setorigin (e, e.origin);
+ e.drawmask = DRAWMASK_NORMAL;
+ e.predraw = base_func_predraw;
+ #endif
+
+ #ifdef SSQC
+ setmodel (e, e.model);
+ setorigin (e, e.origin);
+ e.solid = SOLID_BSP;
+ e.movetype = MOVETYPE_PUSH;
+ e.touch = func_hurt_touch;
+ e.use = func_hurt_use;
+
+ if (!e.dmg)
+ e.dmg = 10;
+
+ if (!e.wait)
+ e.wait = 0.2;
+
+ if (!(e.spawnflags & SPAWNFLAG_FUNC_HURT_START_ON))
+ e.stateflags |= STATE_INACTIVE;
+
+ // send it off to CSQC -- CEV
+ e.tick = base_func_neteval;
+ e.SendEntity = base_entity_netsend;
+ e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
+ #endif
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void() func_hurt =
+ {
+ BASE_FUNC_PREINIT (__NULL__)
+ func_hurt_init (self);
+ };
+#endif
+// }
Return to the top of this page or return to the overview of this repo.
Diff qc/func/illusionary.qc
diff --git a/qc/func/illusionary.qc b/qc/func/illusionary.qc
index 9362bf1..c92f21e 100644
--- a/qc/func/illusionary.qc
+++ b/qc/func/illusionary.qc
@@ -72,10 +72,7 @@ A simple entity that looks solid but lets you walk through it.
//--------------------------------------------------------------
void() func_illusionary =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_illusionary_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/laser.qc
diff --git a/qc/func/laser.qc b/qc/func/laser.qc
index 152a945..4e14df8 100644
--- a/qc/func/laser.qc
+++ b/qc/func/laser.qc
@@ -216,9 +216,6 @@ Keys:
#ifdef SSQC
setmodel (e, e.model);
- precache_sound ("buttons/switch02.wav");
- precache_sound ("buttons/switch04.wav");
-
if (e.spawnflags & SPAWNFLAG_FUNC_LASER_SOLID)
{
// so you can shoot between lasers in a single bmodel
@@ -244,15 +241,14 @@ Keys:
if (e.spawnflags & SPAWNFLAG_FUNC_LASER_START_OFF)
setorigin (e, '0 0 9000');
- if (e.noise != "")
- precache_sound (e.noise);
- else
- e.noise = "buttons/switch02.wav";
+ if (!e.noise || e.noise == "")
+ e.noise = snd_button_metal.wav;
- if (e.noise1 != "")
- precache_sound (e.noise1);
- else
- e.noise1 = "buttons/switch04.wav";
+ if (!e.noise1 || e.noise1 == "")
+ e.noise1 = snd_button_inout.wav;
+
+ precache_sound (e.noise);
+ precache_sound (e.noise1);
#if 0
// spawn a second entity to handle alpha changes, since
@@ -270,10 +266,7 @@ Keys:
//--------------------------------------------------------------
void() func_laser =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_laser_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/monster_spawner.qc
diff --git a/qc/func/monster_spawner.qc b/qc/func/monster_spawner.qc
index 8716f2e..135670a 100644
--- a/qc/func/monster_spawner.qc
+++ b/qc/func/monster_spawner.qc
@@ -351,10 +351,7 @@ Can only use default health, models and sounds.
//--------------------------------------------------------------
void() func_monster_spawner =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_monster_spawner_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/new_plat.qc
diff --git a/qc/func/new_plat.qc b/qc/func/new_plat.qc
index 5464181..45283d4 100644
--- a/qc/func/new_plat.qc
+++ b/qc/func/new_plat.qc
@@ -74,6 +74,9 @@ void() func_new_plat_plat2_go_up;
void() func_new_plat_plat2_use;
void() func_new_plat_plat2_blocked;
#endif
+#ifdef SSQC
+void(string key, string value) func_new_plat_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) func_new_plat_init; // initialization & spawn function
#endif
@@ -114,15 +117,15 @@ void() func_new_plat;
if ((self.owner.invincible_time + 2) > time)
return;
- if (self.owner.state > 4)
+ if (self.owner.moveflags > 4)
// disabled.
return;
- if (self.owner.jump_flag > FUNC_STATE_BOTTOM)
+ if (self.owner.jump_flag > FMF_BOTTOM)
{
if (self.owner.super_time < time)
{
- if (self.owner.jump_flag == FUNC_STATE_UP)
+ if (self.owner.jump_flag == FMF_UP)
sub_runvoidas (self.owner,
func_new_plat_plat2_go_up);
else
@@ -134,29 +137,29 @@ void() func_new_plat;
return;
}
- if (self.owner.state > FUNC_STATE_BOTTOM)
+ if (self.owner.moveflags > FMF_BOTTOM)
// STATE_UP or STATE_DOWN
return;
plat_position = (self.owner.absmax + self.owner.absmin) * 0.5;
- if (self.owner.state == FUNC_STATE_TOP)
+ if (self.owner.moveflags == FMF_TOP)
{
- other_state = FUNC_STATE_TOP;
+ other_state = FMF_TOP;
if (plat_position_z > other.origin_z)
- other_state = FUNC_STATE_BOTTOM;
+ other_state = FMF_BOTTOM;
}
else
{
- other_state = FUNC_STATE_BOTTOM;
+ other_state = FMF_BOTTOM;
if ((other.origin_z - plat_position_z) >
- self.owner.height)
+ self.owner.t_height)
{
- other_state = FUNC_STATE_TOP;
+ other_state = FMF_TOP;
}
}
- if (self.owner.state == other_state)
+ if (self.owner.moveflags == other_state)
{
self.owner.cnt = 0;
self.owner.super_time = time + 0.5;
@@ -167,10 +170,10 @@ void() func_new_plat;
self.owner.cnt = 1;
}
- if (self.owner.state == FUNC_STATE_BOTTOM)
- self.owner.jump_flag = FUNC_STATE_UP;
- else if (self.owner.state == FUNC_STATE_TOP)
- self.owner.jump_flag = FUNC_STATE_DOWN;
+ if (self.owner.moveflags == FMF_BOTTOM)
+ self.owner.jump_flag = FMF_UP;
+ else if (self.owner.moveflags == FMF_TOP)
+ self.owner.jump_flag = FMF_DOWN;
};
//--------------------------------------------------------------
@@ -281,7 +284,7 @@ Set "sounds" to one of the following:
void() func_new_plat_downandwait_hit_top =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_TOP;
+ self.moveflags = FMF_TOP;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
};
@@ -290,7 +293,7 @@ Set "sounds" to one of the following:
void() func_new_plat_downandwait_hit_bottom =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
@@ -302,7 +305,7 @@ Set "sounds" to one of the following:
void() func_new_plat_downandwait_go_down =
{
sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_DOWN;
+ self.moveflags = FMF_DOWN;
base_func_calcmove (self, self.pos2, self.speed,
func_new_plat_downandwait_hit_bottom);
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
@@ -312,7 +315,7 @@ Set "sounds" to one of the following:
void() func_new_plat_downandwait_go_up =
{
sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_UP;
+ self.moveflags = FMF_UP;
base_func_calcmove (self, self.pos1, self.speed,
func_new_plat_downandwait_hit_top);
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
@@ -330,19 +333,19 @@ Set "sounds" to one of the following:
t_damage2 (other, self, self, 1);
- if (self.state == FUNC_STATE_UP)
+ if (self.moveflags == FMF_UP)
func_new_plat_downandwait_go_down ();
- else if (self.state == FUNC_STATE_DOWN)
+ else if (self.moveflags == FMF_DOWN)
func_new_plat_downandwait_go_up ();
else
objerror ("func_new_plat_downandwait_blocked: "
- "bad self.state\n");
+ "bad self.moveflags\n");
};
//--------------------------------------------------------------
void() func_new_plat_downandwait_use =
{
- if (self.state != FUNC_STATE_TOP)
+ if (self.moveflags != FMF_TOP)
return;
func_new_plat_downandwait_go_down ();
@@ -356,7 +359,7 @@ Set "sounds" to one of the following:
void() func_new_plat_toggle_hit_top =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_TOP;
+ self.moveflags = FMF_TOP;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
};
@@ -365,7 +368,7 @@ Set "sounds" to one of the following:
void() func_new_plat_toggle_hit_bottom =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
};
@@ -374,7 +377,7 @@ Set "sounds" to one of the following:
void() func_new_plat_toggle_go_down =
{
sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_DOWN;
+ self.moveflags = FMF_DOWN;
base_func_calcmove (self, self.pos2, self.speed,
func_new_plat_toggle_hit_bottom);
@@ -386,7 +389,7 @@ Set "sounds" to one of the following:
void() func_new_plat_toggle_go_up =
{
sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_UP;
+ self.moveflags = FMF_UP;
base_func_calcmove (self, self.pos1, self.speed,
func_new_plat_toggle_hit_top);
@@ -406,21 +409,21 @@ Set "sounds" to one of the following:
t_damage2 (other, self, self, 1);
- if (self.state == FUNC_STATE_UP)
+ if (self.moveflags == FMF_UP)
func_new_plat_toggle_go_down ();
- else if (self.state == FUNC_STATE_DOWN)
+ else if (self.moveflags == FMF_DOWN)
func_new_plat_toggle_go_up ();
else
objerror ("func_new_plat_toggle_blocked: "
- "bad self.state\n");
+ "bad self.moveflags\n");
};
//--------------------------------------------------------------
void() func_new_plat_toggle_use =
{
- if (self.state == FUNC_STATE_TOP)
+ if (self.moveflags == FMF_TOP)
func_new_plat_toggle_go_down ();
- else if (self.state == FUNC_STATE_BOTTOM)
+ else if (self.moveflags == FMF_BOTTOM)
func_new_plat_toggle_go_up ();
};
@@ -439,7 +442,7 @@ Set "sounds" to one of the following:
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
self.style = self.style2;
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
self.rad_time = time;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
@@ -451,8 +454,8 @@ Set "sounds" to one of the following:
sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
self.finaldest = self.pos2;
- self.finaldest_z = self.pos2_z + (self.height * self.style2);
- self.state = FUNC_STATE_UP;
+ self.finaldest_z = self.pos2_z + (self.t_height * self.style2);
+ self.moveflags = FMF_UP;
self.rad_time = time;
base_func_calcmove (self, self.finaldest, self.speed,
@@ -516,7 +519,7 @@ Set "sounds" to one of the following:
if (elvPos > btnPos)
{
- temp_dist = (elvPos - btnPos) / self.height;
+ temp_dist = (elvPos - btnPos) / self.t_height;
temp_dist = ceil (temp_dist);
self.style2 = self.style - temp_dist;
func_new_plat_elvtr_go ();
@@ -525,9 +528,9 @@ Set "sounds" to one of the following:
else
{
temp_dist = btnPos - elvPos;
- if (temp_dist > self.height)
+ if (temp_dist > self.t_height)
{
- temp_dist = temp_dist / self.height;
+ temp_dist = temp_dist / self.t_height;
temp_dist = floor (temp_dist);
self.style2 = self.style +
temp_dist;
@@ -567,7 +570,7 @@ Set "sounds" to one of the following:
void() func_new_plat_plat2_hit_top =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_TOP;
+ self.moveflags = FMF_TOP;
self.invincible_time = time;
if (self.cnt == 1)
@@ -593,7 +596,7 @@ Set "sounds" to one of the following:
void() func_new_plat_plat2_hit_bottom =
{
sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
self.invincible_time = time;
if (self.cnt == 1)
@@ -618,7 +621,7 @@ Set "sounds" to one of the following:
void() func_new_plat_plat2_go_down =
{
sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_DOWN;
+ self.moveflags = FMF_DOWN;
base_func_calcmove (self, self.pos2, self.speed,
func_new_plat_plat2_hit_bottom);
@@ -630,7 +633,7 @@ Set "sounds" to one of the following:
void() func_new_plat_plat2_go_up =
{
sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
- self.state = FUNC_STATE_UP;
+ self.moveflags = FMF_UP;
base_func_calcmove (self, self.pos1, self.speed,
func_new_plat_plat2_hit_top);
@@ -641,8 +644,8 @@ Set "sounds" to one of the following:
//--------------------------------------------------------------
void() func_new_plat_plat2_use =
{
- if (self.state > 4)
- self.state = self.state - 10;
+ if (self.moveflags > 4)
+ self.moveflags = self.moveflags - 10;
self.use = sub_null;
};
@@ -659,13 +662,13 @@ Set "sounds" to one of the following:
t_damage2 (other, self, self, 1);
- if (self.state == FUNC_STATE_UP)
+ if (self.moveflags == FMF_UP)
func_new_plat_plat2_go_down ();
- else if (self.state == FUNC_STATE_DOWN)
+ else if (self.moveflags == FMF_DOWN)
func_new_plat_plat2_go_up ();
else
objerror ("func_new_plat_plat2_blocked: "
- "bad self.state\n");
+ "bad self.moveflags\n");
};
#endif
@@ -673,6 +676,20 @@ Set "sounds" to one of the following:
// Common Plat Code
//==============================================================
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(string key, string value) func_new_plat_init_field =
+ {
+ switch (key)
+ {
+ case "height":
+ if (!self.t_height)
+ self.t_height = stof (value);
+ break;
+ }
+ };
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) func_new_plat_init =
@@ -705,39 +722,39 @@ Set "sounds" to one of the following:
if (e.sounds == 1)
{
if (!e.noise || e.noise == "")
- e.noise = "plats/plat1.wav";
+ e.noise = snd_plat_base1.wav;
if (!e.noise1 || e.noise1 == "")
- e.noise1 = "plats/plat2.wav";
+ e.noise1 = snd_plat_base2.wav;
}
else if (e.sounds == 2)
{
if (!e.noise || e.noise == "")
- e.noise = "plats/medplat1.wav";
+ e.noise = snd_plat_med1.wav;
if (!e.noise1 || e.noise1 == "")
- e.noise1 = "plats/medplat2.wav";
+ e.noise1 = snd_plat_med2.wav;
}
else if (e.sounds == 3)
{
// base door sound
if (!e.noise || e.noise == "")
- e.noise = "doors/hydro1.wav";
+ e.noise = snd_door_base_open.wav;
if (!e.noise1 || e.noise1 == "")
- e.noise1 = "doors/hydro2.wav";
+ e.noise1 = snd_door_base_close.wav;
}
else if (e.sounds == 4)
{
// func_train sounds
if (!e.noise || e.noise == "")
- e.noise = "plats/train1.wav";
+ e.noise = snd_plat_train1.wav;
if (!e.noise1 || e.noise1 == "")
- e.noise1 = "plats/train2.wav";
+ e.noise1 = snd_plat_train2.wav;
}
else
{
if (!e.noise || e.noise == "")
- e.noise = "misc/null.wav";
+ e.noise = snd_null.wav;
if (!e.noise1 || e.noise1 == "")
- e.noise1 = "misc/null.wav";
+ e.noise1 = snd_null.wav;
}
precache_sound (e.noise);
@@ -759,21 +776,21 @@ Set "sounds" to one of the following:
e.pos1 = e.origin;
e.pos2 = e.origin;
- if (e.height < 0)
+ if (e.t_height < 0)
{
negative_height = 1;
- e.height = 0 - e.height;
+ e.t_height = 0 - e.t_height;
}
- if (e.height)
+ if (e.t_height)
{
- e.pos2_z = e.origin_z - e.height;
+ e.pos2_z = e.origin_z - e.t_height;
}
else
{
negative_height = 1;
- e.height = e.size_z - 8;
- e.pos2_z = e.origin_z - e.height;
+ e.t_height = e.size_z - 8;
+ e.pos2_z = e.origin_z - e.t_height;
}
if (e.spawnflags & SPAWNFLAG_FUNC_NEW_PLAT_DN_N_WAIT)
@@ -783,12 +800,12 @@ Set "sounds" to one of the following:
if (negative_height == 1)
{
- e.state = FUNC_STATE_BOTTOM;
+ e.moveflags = FMF_BOTTOM;
setorigin (e, e.pos2);
}
else
{
- e.state = FUNC_STATE_TOP;
+ e.moveflags = FMF_TOP;
}
if (!e.health)
@@ -802,11 +819,11 @@ Set "sounds" to one of the following:
if (negative_height == 1)
{
setorigin (e, e.pos2);
- e.state = FUNC_STATE_BOTTOM;
+ e.moveflags = FMF_BOTTOM;
}
else
{
- e.state = FUNC_STATE_TOP;
+ e.moveflags = FMF_TOP;
}
}
else if (e.spawnflags & SPAWNFLAG_FUNC_NEW_PLAT_ELEVATOR)
@@ -823,7 +840,7 @@ Set "sounds" to one of the following:
e.pos1 = e.origin;
e.pos2 = e.origin;
e.pos2_z = e.origin_z -
- (e.height * (e.cnt - 1));
+ (e.t_height * (e.cnt - 1));
e.style = e.cnt - 1;
e.style2 = e.style;
}
@@ -832,7 +849,7 @@ Set "sounds" to one of the following:
e.pos1 = e.origin;
e.pos2 = e.origin;
e.pos1_z = e.origin_z +
- (e.height * (e.cnt - 1));
+ (e.t_height * (e.cnt - 1));
e.style = 0;
e.style2 = e.style;
}
@@ -854,7 +871,7 @@ Set "sounds" to one of the following:
if (negative_height == 1)
{
- e.state = FUNC_STATE_BOTTOM;
+ e.moveflags = FMF_BOTTOM;
// make sure START_AT_TOP isn't set.
// We need that...
e.spawnflags = SPAWNFLAG_FUNC_NEW_PLAT_PLAT2;
@@ -865,13 +882,13 @@ Set "sounds" to one of the following:
// default position is top.
e.spawnflags |=
SPAWNFLAG_FUNC_NEW_PLAT_START_AT_TOP;
- e.state = FUNC_STATE_TOP;
+ e.moveflags = FMF_TOP;
}
if (e.targetname != "")
{
e.use = func_new_plat_plat2_use;
- e.state = e.state + 10;
+ e.moveflags = e.moveflags + 10;
}
// the "start moving" trigger
@@ -890,10 +907,7 @@ Set "sounds" to one of the following:
//--------------------------------------------------------------
void() func_new_plat =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (func_new_plat_init_field)
func_new_plat_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/particlefield.qc
diff --git a/qc/func/particlefield.qc b/qc/func/particlefield.qc
index 63cda11..82c3a90 100644
--- a/qc/func/particlefield.qc
+++ b/qc/func/particlefield.qc
@@ -281,10 +281,7 @@ to trigger.
//--------------------------------------------------------------
void() func_particlefield =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_particlefield_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/plat.qc
diff --git a/qc/func/plat.qc b/qc/func/plat.qc
index 351e332..af45ee5 100644
--- a/qc/func/plat.qc
+++ b/qc/func/plat.qc
@@ -42,6 +42,7 @@ strip void() temp_plat_trigger;
void(float isnew) func_plat_netreceive;
#endif
#ifdef SSQC
+// FUNC_PLAT_SOUND(field, sound1, sound2)
void() func_plat_hit_top;
void() func_plat_hit_bottom;
void() func_plat_go_down;
@@ -49,6 +50,9 @@ void() func_plat_go_up;
void() func_plat_blocked;
void() func_plat_use;
#endif
+#ifdef SSQC
+void(string key, string value) func_plat_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) func_plat_init;
#endif
@@ -72,9 +76,9 @@ void() func_plat;
if (self.owner.classtype != CT_FUNC_PLAT)
return;
- if (self.owner.state == FUNC_STATE_BOTTOM)
+ if (self.owner.moveflags == FMF_BOTTOM)
sub_runvoidas (self.owner, func_plat_go_up);
- else if (self.owner.state == FUNC_STATE_TOP)
+ else if (self.owner.moveflags == FMF_TOP)
// delay going down
self.owner.nextthink = self.owner.ltime + 1;
};
@@ -164,11 +168,34 @@ Set "sounds" to one of the following:
#ifdef SSQC
//--------------------------------------------------------------
+ #define FUNC_PLAT_SOUND(field, sound1, sound2) \
+ /* { */ \
+ if (self.field != __NULL__ && self.field != "") \
+ { \
+ sound (self, CHAN_VOICE, self.field, \
+ VOL_MHI, ATTN_NORM); \
+ } \
+ else \
+ { \
+ local sound_info_t snd = snd_empty; \
+ if (self.sounds == 1) \
+ snd = sound1; \
+ else if (self.sounds == 2) \
+ snd = sound2; \
+ if (snd.wav != snd_empty.wav) \
+ { \
+ SOUND (self, snd) \
+ } \
+ } \
+ /* } */
+
+ //--------------------------------------------------------------
void() func_plat_hit_top =
{
- self.state = FUNC_STATE_TOP;
+ self.moveflags = FMF_TOP;
+
+ FUNC_PLAT_SOUND (noise1, snd_plat_base2, snd_plat_med2)
- sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
self.think = func_plat_go_down;
self.nextthink = self.ltime + 3;
@@ -178,9 +205,9 @@ Set "sounds" to one of the following:
//--------------------------------------------------------------
void() func_plat_hit_bottom =
{
- self.state = FUNC_STATE_BOTTOM;
+ self.moveflags = FMF_BOTTOM;
- sound (self, CHAN_VOICE, self.noise1, VOL_MHI, ATTN_NORM);
+ FUNC_PLAT_SOUND (noise1, snd_plat_base2, snd_plat_med2)
self.SendFlags = NETFLAG_BASE_ENTITY_ORIGIN;
};
@@ -188,22 +215,24 @@ Set "sounds" to one of the following:
//--------------------------------------------------------------
void() func_plat_go_down =
{
- self.state = FUNC_STATE_DOWN;
+ self.moveflags = FMF_DOWN;
base_func_calcmove (self, self.pos2, self.speed,
func_plat_hit_bottom);
- sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
+ FUNC_PLAT_SOUND (noise, snd_plat_base1, snd_plat_med1)
+
self.SendFlags = NETFLAG_BASE_ENTITY_ORIGIN;
};
//--------------------------------------------------------------
void() func_plat_go_up =
{
- self.state = FUNC_STATE_UP;
+ self.moveflags = FMF_UP;
base_func_calcmove (self, self.pos1, self.speed,
func_plat_hit_top);
- sound (self, CHAN_VOICE, self.noise, VOL_MHI, ATTN_NORM);
+ FUNC_PLAT_SOUND (noise, snd_plat_base1, snd_plat_med1)
+
self.SendFlags = NETFLAG_BASE_ENTITY_ORIGIN;
};
@@ -217,9 +246,9 @@ Set "sounds" to one of the following:
setsize (other, '0 0 0', '0 0 0');
// continue on the same path
- if (self.state == FUNC_STATE_UP)
+ if (self.moveflags == FMF_UP)
func_plat_go_up ();
- else if (self.state == FUNC_STATE_DOWN)
+ else if (self.moveflags == FMF_DOWN)
func_plat_go_down ();
return;
}
@@ -227,12 +256,12 @@ Set "sounds" to one of the following:
t_damage2 (other, self, self, 1);
// reverse direction
- if (self.state == FUNC_STATE_UP)
+ if (self.moveflags == FMF_UP)
func_plat_go_down ();
- else if (self.state == FUNC_STATE_DOWN)
+ else if (self.moveflags == FMF_DOWN)
func_plat_go_up ();
else
- objerror ("func_plat_blocked: bad self.state\n");
+ objerror ("func_plat_blocked: bad self.moveflags\n");
};
//--------------------------------------------------------------
@@ -242,7 +271,7 @@ Set "sounds" to one of the following:
if (self.targetname != "")
{
- if (self.state != FUNC_STATE_UP)
+ if (self.moveflags != FMF_UP)
objerror ("func_plat_use: not in up state\n");
func_plat_go_down ();
}
@@ -257,6 +286,20 @@ Set "sounds" to one of the following:
};
#endif
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(string key, string value) func_plat_init_field =
+ {
+ switch (key)
+ {
+ case "height":
+ if (!self.t_height)
+ self.t_height = stof (value);
+ break;
+ }
+ };
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) func_plat_init =
@@ -282,22 +325,25 @@ Set "sounds" to one of the following:
if (e.sounds == 0)
e.sounds = 2;
- // FIX THIS TO LOAD A GENERIC PLAT SOUND
- if (e.sounds == 1)
+ // undefined behavior when sounds is set to 3 or greater -- CEV
+ if (e.noise == "" && e.noise1 == "" && e.sounds < 3)
{
- precache_sound ("plats/plat1.wav");
- precache_sound ("plats/plat2.wav");
- e.noise = "plats/plat1.wav";
- e.noise1 = "plats/plat2.wav";
+ if (e.sounds == 1)
+ {
+ precache_sound (snd_plat_base1.wav);
+ precache_sound (snd_plat_base2.wav);
+ }
+ else if (e.sounds == 2)
+ {
+ precache_sound (snd_plat_med1.wav);
+ precache_sound (snd_plat_med2.wav);
+ }
}
- if (e.sounds == 2)
- {
- precache_sound ("plats/medplat1.wav");
- precache_sound ("plats/medplat2.wav");
- e.noise = "plats/medplat1.wav";
- e.noise1 = "plats/medplat2.wav";
- }
+ if (e.noise != __NULL__ && e.noise != "")
+ precache_sound (e.noise);
+ if (e.noise1 != __NULL__ && e.noise1 != "")
+ precache_sound (e.noise1);
e.mangle = e.angles;
e.angles = '0 0 0';
@@ -319,8 +365,8 @@ Set "sounds" to one of the following:
// pos1 is the top position, pos2 is the bottom
e.pos1 = e.origin;
e.pos2 = e.origin;
- if (e.height)
- e.pos2_z = e.origin_z - e.height;
+ if (e.t_height)
+ e.pos2_z = e.origin_z - e.t_height;
else
e.pos2_z = e.origin_z - e.size_z + 8;
@@ -332,15 +378,14 @@ Set "sounds" to one of the following:
if (e.targetname != "")
{
- e.state = FUNC_STATE_UP;
+ e.moveflags = FMF_UP;
}
else
{
setorigin (e, e.pos2);
- e.state = FUNC_STATE_BOTTOM;
+ e.moveflags = FMF_BOTTOM;
}
-
// network func_plat to the CSQC client -- CEV
e.tick = base_func_neteval;
e.SendEntity = base_entity_netsend;
@@ -353,10 +398,7 @@ Set "sounds" to one of the following:
//--------------------------------------------------------------
void() func_plat =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (func_plat_init_field)
func_plat_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/rotate.qc
diff --git a/qc/func/rotate.qc b/qc/func/rotate.qc
index 8cee085..5761b5d 100644
--- a/qc/func/rotate.qc
+++ b/qc/func/rotate.qc
@@ -601,13 +601,13 @@ Trigger to turn on and off.
self.speed = bound (0, self.speed, 1);
if (self.speed == 0)
{
- self.state = MG1_ROTATE_STATE_OFF;
+ self.moveflags = MG1_ROTATE_STATE_OFF;
self.classgroup &= ~CG_FRAMETICK;
return;
}
if (self.speed == 1)
{
- self.state = MG1_ROTATE_STATE_ON;
+ self.moveflags = MG1_ROTATE_STATE_ON;
self.tick = rotate_object_continuously_tick;
self.tick ();
return;
@@ -628,42 +628,42 @@ Trigger to turn on and off.
if (self.delay <= 0)
{
// No acceleration, just toggle on or off
- if (self.state == MG1_ROTATE_STATE_OFF)
+ if (self.moveflags == MG1_ROTATE_STATE_OFF)
{
- self.state = MG1_ROTATE_STATE_ON;
+ self.moveflags = MG1_ROTATE_STATE_ON;
self.classgroup |= CG_FRAMETICK;
}
else
{
- self.state = MG1_ROTATE_STATE_OFF;
+ self.moveflags = MG1_ROTATE_STATE_OFF;
self.classgroup &= ~CG_FRAMETICK;
}
return;
}
- switch (self.state)
+ switch (self.moveflags)
{
case MG1_ROTATE_STATE_OFF:
- self.state = MG1_ROTATE_STATE_ACCEL_UP;
+ self.moveflags = MG1_ROTATE_STATE_ACCEL_UP;
self.tick =
rotate_object_continuously_tween_tick;
self.distance = fabs (self.distance);
self.classgroup |= CG_FRAMETICK;
return;
case MG1_ROTATE_STATE_ACCEL_UP:
- self.state = MG1_ROTATE_STATE_DECEL_DOWN;
+ self.moveflags = MG1_ROTATE_STATE_DECEL_DOWN;
self.tick =
rotate_object_continuously_tween_tick;
self.distance = -fabs (self.distance);
return;
case MG1_ROTATE_STATE_ON:
- self.state = MG1_ROTATE_STATE_DECEL_DOWN;
+ self.moveflags = MG1_ROTATE_STATE_DECEL_DOWN;
self.tick =
rotate_object_continuously_tween_tick;
self.distance = -fabs (self.distance);
return;
case MG1_ROTATE_STATE_DECEL_DOWN:
- self.state = MG1_ROTATE_STATE_ACCEL_UP;
+ self.moveflags = MG1_ROTATE_STATE_ACCEL_UP;
self.tick =
rotate_object_continuously_tween_tick;
self.distance = fabs (self.distance);
@@ -724,11 +724,11 @@ Trigger to turn on and off.
if (e.spawnflags &
SPAWNFLAG_ROTATE_OBJECT_CONTINUOUSLY_START_OFF)
{
- e.state = MG1_ROTATE_STATE_OFF;
+ e.moveflags = MG1_ROTATE_STATE_OFF;
}
else
{
- e.state = MG1_ROTATE_STATE_ON;
+ e.moveflags = MG1_ROTATE_STATE_ON;
e.speed = 1;
self.classgroup |= CG_FRAMETICK;
}
@@ -743,10 +743,7 @@ Trigger to turn on and off.
//--------------------------------------------------------------
void() rotate_object_continuously =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
rotate_object_continuously_init (self);
};
#endif
@@ -801,10 +798,7 @@ This defines an object to be rotated. Used as the target of func_rotate_door.
//--------------------------------------------------------------
void() rotate_object =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
rotate_object_init (self);
};
#endif
@@ -849,14 +843,14 @@ If "deathtype" is set with a string, this is the message that will appear when a
if (self.spawnflags & SPAWNFLAG_FUNC_ROTATE_ENTITY_START_ON)
{
- self.state = ROTATE_STATE_ACTIVE;
+ self.moveflags = ROTATE_STATE_ACTIVE;
self.think = func_rotate_entity_think;
self.nextthink = time + 0.02;
self.ltime = time;
}
else
{
- self.state = ROTATE_STATE_INACTIVE;
+ self.moveflags = ROTATE_STATE_INACTIVE;
self.think = sub_null;
}
@@ -871,7 +865,7 @@ If "deathtype" is set with a string, this is the message that will appear when a
t = time - self.ltime;
self.ltime = time;
- if (self.state == ROTATE_STATE_SPEEDINGUP)
+ if (self.moveflags == ROTATE_STATE_SPEEDINGUP)
{
self.count = self.count + self.cnt * t;
if (self.count > 1)
@@ -880,13 +874,13 @@ If "deathtype" is set with a string, this is the message that will appear when a
// get rate of rotation
t = t * self.count;
}
- else if (self.state == ROTATE_STATE_SLOWINGDOWN)
+ else if (self.moveflags == ROTATE_STATE_SLOWINGDOWN)
{
self.count = self.count - self.cnt * t;
if (self.count < 0)
{
base_rotate_targets_final ();
- self.state = ROTATE_STATE_INACTIVE;
+ self.moveflags = ROTATE_STATE_INACTIVE;
self.think = sub_null;
return;
}
@@ -911,7 +905,7 @@ If "deathtype" is set with a string, this is the message that will appear when a
self.frame = 1 - self.frame;
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME;
- if (self.state == ROTATE_STATE_ACTIVE)
+ if (self.moveflags == ROTATE_STATE_ACTIVE)
{
if (self.spawnflags &
SPAWNFLAG_FUNC_ROTATE_ENTITY_TOGGLE)
@@ -919,16 +913,16 @@ If "deathtype" is set with a string, this is the message that will appear when a
if (self.speed)
{
self.count = 1;
- self.state = ROTATE_STATE_SLOWINGDOWN;
+ self.moveflags=ROTATE_STATE_SLOWINGDOWN;
}
else
{
- self.state = ROTATE_STATE_INACTIVE;
+ self.moveflags = ROTATE_STATE_INACTIVE;
self.think = sub_null;
}
}
}
- else if (self.state == ROTATE_STATE_INACTIVE)
+ else if (self.moveflags == ROTATE_STATE_INACTIVE)
{
self.think = func_rotate_entity_think;
self.nextthink = time + 0.02;
@@ -936,24 +930,24 @@ If "deathtype" is set with a string, this is the message that will appear when a
if (self.speed)
{
self.count = 0;
- self.state = ROTATE_STATE_SPEEDINGUP;
+ self.moveflags = ROTATE_STATE_SPEEDINGUP;
}
else
{
- self.state = ROTATE_STATE_ACTIVE;
+ self.moveflags = ROTATE_STATE_ACTIVE;
}
}
- else if (self.state == ROTATE_STATE_SPEEDINGUP)
+ else if (self.moveflags == ROTATE_STATE_SPEEDINGUP)
{
if (self.spawnflags &
SPAWNFLAG_FUNC_ROTATE_ENTITY_TOGGLE)
{
- self.state = ROTATE_STATE_SLOWINGDOWN;
+ self.moveflags = ROTATE_STATE_SLOWINGDOWN;
}
}
else
{
- self.state = ROTATE_STATE_SPEEDINGUP;
+ self.moveflags = ROTATE_STATE_SPEEDINGUP;
}
};
#endif
@@ -1000,10 +994,7 @@ If "deathtype" is set with a string, this is the message that will appear when a
//--------------------------------------------------------------
void() func_rotate_entity =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_rotate_entity_init (self);
};
#endif
@@ -1055,10 +1046,7 @@ If "deathtype" is set with a string, this is the message that will appear when a
//--------------------------------------------------------------
void() path_rotate =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
path_rotate_init (self);
};
// };
@@ -1108,7 +1096,7 @@ sounds
//--------------------------------------------------------------
void() func_rotate_train_think_wait =
{
- self.state = ROTATE_TRAIN_STATE_WAIT;
+ self.moveflags = ROTATE_TRAIN_STATE_WAIT;
if (self.goalentity.noise != "")
sound (self, CHAN_VOICE, self.goalentity.noise,
@@ -1137,7 +1125,7 @@ sounds
//--------------------------------------------------------------
void() func_rotate_train_think_stop =
{
- self.state = ROTATE_TRAIN_STATE_STOP;
+ self.moveflags = ROTATE_TRAIN_STATE_STOP;
if (self.goalentity.noise != "")
sound (self, CHAN_VOICE, self.goalentity.noise,
@@ -1172,7 +1160,7 @@ sounds
local float len, traveltime, div;
local string temp;
- self.state = ROTATE_TRAIN_STATE_NEXT;
+ self.moveflags = ROTATE_TRAIN_STATE_NEXT;
current = self.goalentity;
targ = find (world, targetname, self.path);
@@ -1251,7 +1239,7 @@ sounds
}
else
{
- self.state = ROTATE_TRAIN_STATE_MOVE;
+ self.moveflags = ROTATE_TRAIN_STATE_MOVE;
self.finaldest = targ.origin;
if (self.finaldest == self.origin)
@@ -1334,7 +1322,7 @@ sounds
{
local entity targ;
- self.state = ROTATE_TRAIN_STATE_FIND;
+ self.moveflags = ROTATE_TRAIN_STATE_FIND;
base_rotate_link_targets ();
@@ -1386,7 +1374,7 @@ sounds
if ((self.endtime) && (time >= self.endtime))
{
self.endtime = 0;
- if (self.state == ROTATE_TRAIN_STATE_MOVE)
+ if (self.moveflags == ROTATE_TRAIN_STATE_MOVE)
{
setorigin (self, self.finaldest);
self.velocity = '0 0 0';
@@ -1454,19 +1442,19 @@ sounds
if (!e.noise)
{
if (e.sounds == 0)
- e.noise = "misc/null.wav";
+ e.noise = snd_null.wav;
if (e.sounds == 1)
- e.noise = "plats/train2.wav";
+ e.noise = snd_plat_train2.wav;
}
if (!e.noise1)
{
if (e.sounds == 0)
- e.noise1 = "misc/null.wav";
+ e.noise1 = snd_null.wav;
if (e.sounds == 1)
- e.noise1 = "plats/train1.wav";
+ e.noise1 = snd_plat_train1.wav;
}
precache_sound (e.noise);
@@ -1488,7 +1476,7 @@ sounds
e.endtime = e.ltime + 0.1;
e.think = func_rotate_train_think;
e.think1 = func_rotate_train_think_find;
- e.state = ROTATE_TRAIN_STATE_FIND;
+ e.moveflags = ROTATE_TRAIN_STATE_FIND;
e.duration = 1; // 1 / duration
e.cnt = 0.1; // start time
@@ -1508,10 +1496,7 @@ sounds
//--------------------------------------------------------------
void() func_rotate_train =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_rotate_train_init (self);
};
#endif
@@ -1625,9 +1610,11 @@ NONBLOCKING makes the brush non-solid. This is useless if VISIBLE is set.
base_rotate_init (e);
#ifdef CSQC
- // movewalls seem to always be invisible so don't honor the
- // modelindex SSQC sent; set to 0 so it won't be seen -- CEV
- setmodelindex (e, 0);
+ // movewalls seem to always be invisible (used only for
+ // collision) so set alpha to a very low value -- CEV
+ e.alpha = 0.00001;
+ // setmodel so that mins & maxs update from model size -- CEV
+ setmodelindex (e, e.modelindex);
setsize (e, e.mins, e.maxs);
setorigin (e, e.origin);
e.drawmask = DRAWMASK_NORMAL;
@@ -1671,10 +1658,7 @@ NONBLOCKING makes the brush non-solid. This is useless if VISIBLE is set.
//--------------------------------------------------------------
void() func_movewall =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_movewall_init (self);
};
#endif
@@ -1722,17 +1706,17 @@ once door from closing again when it's blocked.
self.frame = 1 - self.frame;
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME;
- if (self.state == ROTATE_STATE_CLOSING)
+ if (self.moveflags == ROTATE_STATE_CLOSING)
{
start = self.pos1;
self.finaldest = self.pos2;
- self.state = ROTATE_STATE_OPENING;
+ self.moveflags = ROTATE_STATE_OPENING;
}
else
{
start = self.pos2;
self.finaldest = self.pos1;
- self.state = ROTATE_STATE_CLOSING;
+ self.moveflags = ROTATE_STATE_CLOSING;
}
sound (self, CHAN_VOICE, self.noise2, VOL_MHI, ATTN_NORM);
@@ -1803,9 +1787,9 @@ once door from closing again when it's blocked.
self.SendFlags |= NETFLAG_BASE_ENTITY_ANGLES |
NETFLAG_BASE_ENTITY_FRAME;
- if (self.state == ROTATE_STATE_OPENING)
+ if (self.moveflags == ROTATE_STATE_OPENING)
{
- self.state = ROTATE_STATE_OPEN;
+ self.moveflags = ROTATE_STATE_OPEN;
}
else
{
@@ -1815,7 +1799,7 @@ once door from closing again when it's blocked.
func_rotate_door_group_reversedirection ();
return;
}
- self.state = ROTATE_STATE_CLOSED;
+ self.moveflags = ROTATE_STATE_CLOSED;
}
sound (self, CHAN_VOICE, self.noise3, VOL_MHI, ATTN_NORM);
@@ -1829,8 +1813,8 @@ once door from closing again when it's blocked.
{
local vector start;
- if ((self.state != ROTATE_STATE_OPEN) &&
- (self.state != ROTATE_STATE_CLOSED))
+ if ((self.moveflags != ROTATE_STATE_OPEN) &&
+ (self.moveflags != ROTATE_STATE_CLOSED))
{
return;
}
@@ -1844,17 +1828,17 @@ once door from closing again when it's blocked.
// change to alternate textures
self.frame = 1 - self.frame;
- if (self.state == ROTATE_STATE_CLOSED)
+ if (self.moveflags == ROTATE_STATE_CLOSED)
{
start = self.pos1;
self.finaldest = self.pos2;
- self.state = ROTATE_STATE_OPENING;
+ self.moveflags = ROTATE_STATE_OPENING;
}
else
{
start = self.pos2;
self.finaldest = self.pos1;
- self.state = ROTATE_STATE_CLOSING;
+ self.moveflags = ROTATE_STATE_CLOSING;
}
sound (self, CHAN_VOICE, self.noise2, VOL_MHI, ATTN_NORM);
@@ -1882,7 +1866,7 @@ once door from closing again when it's blocked.
setorigin (e, e.origin);
e.drawmask = DRAWMASK_NORMAL;
e.predraw = base_func_predraw;
- #if 0
+ #if 1
dprint (sprintf("func_rotate_door_init: CSQC entnum %g\n",
e.entnum));
#endif
@@ -1919,37 +1903,36 @@ once door from closing again when it's blocked.
else
{
if (e.noise1 == "")
- e.noise1 = "misc/null.wav";
+ e.noise1 = snd_null.wav;
if (e.noise2 == "")
- e.noise2 = "misc/null.wav";
+ e.noise2 = snd_null.wav;
if (e.noise3 == "")
- e.noise3 = "misc/null.wav";
+ e.noise3 = snd_null.wav;
}
}
if (e.sounds == 1)
{
- e.noise1 = "doors/latch2.wav";
- e.noise2 = "doors/winch2.wav";
- e.noise3 = "doors/drclos4.wav";
+ e.noise1 = snd_door_secret_med_start.wav;
+ e.noise2 = snd_door_secret_med_travel.wav;
+ e.noise3 = snd_door_secret_med_stop.wav;
}
else if (e.sounds == 2)
{
- e.noise2 = "doors/airdoor1.wav";
- e.noise1 = "doors/airdoor2.wav";
+ e.noise2 = snd_door_secret_metal_open.wav;
+ e.noise1 = snd_door_secret_metal_close.wav;
e.noise3 = e.noise1;
}
else if (e.sounds == 3)
{
- e.noise2 = "doors/basesec1.wav";
- e.noise1 = "doors/basesec2.wav";
+ e.noise2 = snd_door_secret_base_open.wav;
+ e.noise1 = snd_door_secret_base_close.wav;
e.noise3 = e.noise1;
}
else if (e.sounds == 4)
{
// added silent option - sounds 4 -- dumptruck_ds
- e.noise1 = e.noise2 = "misc/null.wav";
- e.noise3 = "misc/null.wav";
+ e.noise1 = e.noise2 = e.noise3 = snd_null.wav;
}
precache_sound (e.noise1);
@@ -1961,7 +1944,7 @@ once door from closing again when it's blocked.
setmodel (e, e.model);
setsize (e, e.mins, e.maxs);
setorigin (e, e.origin);
- e.state = ROTATE_STATE_CLOSED;
+ e.moveflags = ROTATE_STATE_CLOSED;
e.use = func_rotate_door_use;
e.think = sub_null;
@@ -1976,10 +1959,7 @@ once door from closing again when it's blocked.
//--------------------------------------------------------------
void() func_rotate_door =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_rotate_door_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/shadow.qc
diff --git a/qc/func/shadow.qc b/qc/func/shadow.qc
index 316d309..57682b8 100644
--- a/qc/func/shadow.qc
+++ b/qc/func/shadow.qc
@@ -82,20 +82,9 @@ void() func_shadow;
if (self.count > 12)
self.count = 12;
- // was self.fading
- /*
- if (self.state >= 0)
- self.state = -1;
- */
-
- /*
- dprint (ftos(self.count));
- dprint ("\n");
- */
-
lightstyle (self.switchshadstyle,
lightstyle_fade_lookup(self.count));
- self.count = self.count + self.dmg;
+ self.count = self.count + self.aflag;
if (self.count > 12)
return;
@@ -111,20 +100,9 @@ void() func_shadow;
if (self.count > 12)
self.count = 12;
- // was self.fading
- /*
- if (self.state <= 0)
- self.state = 1;
- */
-
- /*
- dprint (ftos(self.count));
- dprint ("\n");
- */
-
lightstyle (self.switchshadstyle,
lightstyle_fade_lookup(self.count));
- self.count = self.count - self.dmg;
+ self.count = self.count - self.aflag;
if (self.count < 0)
return;
@@ -136,31 +114,31 @@ void() func_shadow;
void(entity sc, float speed) misc_shadowcontroller_setsteps =
{
// sc.delay -> time between steps
- // sc.dmg -> step size
+ // sc.aflag -> step size
if (speed >= 0.24)
{
sc.delay = (speed / 12);
- sc.dmg = 1;
+ sc.aflag = 1;
}
else if (speed >= 0.12)
{
sc.delay = (speed / 6);
- sc.dmg = 2;
+ sc.aflag = 2;
}
else if (speed >= 0.06)
{
sc.delay = (speed / 3);
- sc.dmg = 4;
+ sc.aflag = 4;
}
else if (speed >= 0.04)
{
sc.delay = (speed / 2);
- sc.dmg = 6;
+ sc.aflag = 6;
}
else
{
sc.delay = 0;
- sc.dmg = 12;
+ sc.aflag = 12;
}
};
@@ -248,11 +226,6 @@ void() func_shadow;
e.switchshadstyle = t1.switchshadstyle;
}
- // was self.fading
- /*
- e.state = 0;
- */
-
if (!e.speed)
e.speed = 0.5;
if (!e.speed2)
@@ -281,10 +254,7 @@ void() func_shadow;
//--------------------------------------------------------------
void() misc_shadowcontroller =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
misc_shadowcontroller_init (self);
};
#endif
@@ -315,10 +285,7 @@ void() func_shadow;
//--------------------------------------------------------------
void() func_shadow =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_shadow_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/togglevisiblewall.qc
diff --git a/qc/func/togglevisiblewall.qc b/qc/func/togglevisiblewall.qc
index 7e72f75..64cfc36 100644
--- a/qc/func/togglevisiblewall.qc
+++ b/qc/func/togglevisiblewall.qc
@@ -70,7 +70,7 @@ void() func_togglevisiblewall;
//--------------------------------------------------------------
void() func_togglevisiblewall_use =
{
- if (!self.state)
+ if (!(self.stateflags & STATE_INACTIVE))
{
if (!(self.spawnflags &
SPAWNFLAG_FUNC_TOGGLEVISWALL_NOTSOLID))
@@ -81,7 +81,7 @@ void() func_togglevisiblewall;
setmodel (self, self.mdl);
if (self.switchshadstyle)
lightstyle (self.switchshadstyle, "a");
- self.state = 1;
+ self.stateflags |= STATE_INACTIVE;
}
else
{
@@ -90,7 +90,7 @@ void() func_togglevisiblewall;
setmodel (self, "");
if (self.switchshadstyle)
lightstyle (self.switchshadstyle, "m");
- self.state = 0;
+ self.stateflags &= ~STATE_INACTIVE;
}
self.SendFlags |= NETFLAG_BASE_ENTITY_MODEL |
@@ -120,9 +120,9 @@ void() func_togglevisiblewall;
e.use = func_togglevisiblewall_use;
if (e.spawnflags & SPAWNFLAG_FUNC_TOGGLEVISWALL_STARTOFF)
- e.state = 1;
+ e.stateflags |= STATE_INACTIVE;
else
- e.state = 0;
+ e.stateflags &= ~STATE_INACTIVE;
if (e.spawnflags & SPAWNFLAG_FUNC_TOGGLEVISWALL_NOTSOLID)
{
@@ -142,10 +142,7 @@ void() func_togglevisiblewall;
//--------------------------------------------------------------
void() func_togglevisiblewall =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_togglevisiblewall_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/togglewall.qc
diff --git a/qc/func/togglewall.qc b/qc/func/togglewall.qc
index 5bb505c..3c5f9d5 100644
--- a/qc/func/togglewall.qc
+++ b/qc/func/togglewall.qc
@@ -92,16 +92,16 @@ START_OFF wall doesn't block until triggered.
//--------------------------------------------------------------
void() func_togglewall_use =
{
- if (self.state)
+ if (!(self.stateflags & STATE_INACTIVE))
{
- self.state = 0;
+ self.stateflags |= STATE_INACTIVE;
self.solid = SOLID_NOT;
sound (self, CHAN_VOICE, self.noise,
VOL_HIGH, ATTN_NORM);
}
else
{
- self.state = 1;
+ self.stateflags &= ~STATE_INACTIVE;
self.solid = SOLID_BSP;
// sound (self, CHAN_VOICE, self.noise1,
// VOL_HIGH, ATTN_NORM);
@@ -137,22 +137,22 @@ START_OFF wall doesn't block until triggered.
e.use = func_togglewall_use;
if (!e.noise)
- e.noise = "misc/null.wav";
+ e.noise = snd_null.wav;
if (!e.noise1)
- e.noise1 = "misc/null.wav";
+ e.noise1 = snd_null.wav;
precache_sound (e.noise);
precache_sound (e.noise1);
if (e.spawnflags & SPAWNFLAG_FUNC_TOGGLEWALL_START_OFF)
{
- e.state = 0;
+ e.stateflags |= STATE_INACTIVE;
e.solid = SOLID_NOT;
}
else
{
- e.state = 1;
+ e.stateflags &= ~STATE_INACTIVE;
sound (e, CHAN_VOICE, e.noise1, VOL_HIGH, ATTN_NORM);
}
@@ -166,10 +166,7 @@ START_OFF wall doesn't block until triggered.
//--------------------------------------------------------------
void() func_togglewall =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_togglewall_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/toss.qc
diff --git a/qc/func/toss.qc b/qc/func/toss.qc
new file mode 100644
index 0000000..25a2a84
--- /dev/null
+++ b/qc/func/toss.qc
@@ -0,0 +1,276 @@
+//==============================================================================
+// func_toss -- entity from MG1
+//==============================================================================
+
+//======================================================================
+// constants
+//======================================================================
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// func_toss spawnflags -- CEV
+//----------------------------------------------------------------------
+typedef enumflags
+{
+ SPAWNFLAG_FUNC_TOSS_WAVE_ORIGIN = 1,
+ SPAWNFLAG_FUNC_TOSS_REM_ON_STOP = 2,
+ SPAWNFLAG_FUNC_TOSS_NO_BOUNCE = 4,
+ SPAWNFLAG_FUNC_TOSS_ONLY_REM_IF_FAR = 8
+ // SPAWNFLAG_NOT_ON_EASY = 256, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_NORMAL = 512,
+ // SPAWNFLAG_NOT_ON_HARD_OR_NIGHTMARE = 1024,
+ // SPAWNFLAG_NOT_IN_DEATHMATCH = 2048,
+ // SPAWNFLAG_NOT_IN_COOP = 4096,
+ // SPAWNFLAG_NOT_IN_SP = 8192,
+ // SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
+ // SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
+} func_toss_spawnflags;
+#endif
+
+#ifdef SSQC
+const string FUNC_TOSS_WAVE_NETNAME = "_toss_origin";
+#endif
+
+//======================================================================
+// forward declarations
+//======================================================================
+
+// func_toss
+#ifdef CSQC
+void(float isnew) func_toss_netreceive;
+#endif
+#ifdef SSQC
+void() func_toss_fire;
+void() func_toss_linkcascade;
+void() func_toss_think;
+void() func_toss_use;
+#endif
+#ifdef SSQC
+void(string key, string value) func_toss_init_field;
+#endif
+#if defined(CSQC) || defined(SSQC)
+void(entity e) func_toss_init;
+#endif
+#ifdef SSQC
+void() func_toss;
+#endif
+
+//------------------------------------------------------------------------------
+
+//----------------------------------------------------------------------
+// class func_toss: base_func
+// {
+#ifdef CSQC
+ //--------------------------------------------------------------
+ void(float isnew) func_toss_netreceive =
+ {
+ // creates the netflag variable -- CEV
+ BASE_FUNC_NETRECEIVE (func_toss_init)
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void() func_toss_fire =
+ {
+ local vector min = self.mins + '4 4 0';
+ // not sure what this was doing in MG1 -- CEV
+ // local vector max = self.maxs - self.dest2;
+
+ self.solid = SOLID_BBOX;
+ if (self.spawnflags & SPAWNFLAG_FUNC_TOSS_NO_BOUNCE)
+ self.movetype = MOVETYPE_TOSS;
+ else
+ self.movetype = MOVETYPE_BOUNCE;
+
+ self.size = self.size - '8 8 0';
+ self.mins = min;
+
+ self.velocity = self.movedir;
+
+ if (self.noise != __NULL__ && self.noise != "")
+ sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
+
+ // update listening clients -- CEV
+ self.classgroup |= CG_FRAMETICK;
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID |
+ NETFLAG_BASE_ENTITY_ORIGIN;
+
+ self.think = func_toss_think;
+ self.nextthink = time + 0.25;
+ };
+
+ //--------------------------------------------------------------
+ void() func_toss_linkcascade =
+ {
+ local vector p;
+ local float dist, mindist = 16384;
+ local entity o = find (world, netname, FUNC_TOSS_WAVE_NETNAME);
+
+ while (o)
+ {
+ if (o.targetname == self.targetname)
+ {
+ p = self.mins + self.size * 0.5;
+ p -= o.mins + o.size * 0.5;
+ dist = vlen(p) / o.speed;
+ if (dist < mindist)
+ mindist = dist;
+ }
+
+ o = find (o, netname, FUNC_TOSS_WAVE_NETNAME);
+ }
+
+ if (mindist < 16384)
+ self.delay = mindist;
+ };
+
+ //--------------------------------------------------------------
+ void() func_toss_think =
+ {
+ if (vlen(self.velocity) < 0.01)
+ {
+ if (self.spawnflags & SPAWNFLAG_FUNC_TOSS_REM_ON_STOP)
+ {
+ if (self.spawnflags &
+ SPAWNFLAG_FUNC_TOSS_ONLY_REM_IF_FAR)
+ {
+ if (vlen(self.oldorigin -
+ self.origin) > 64)
+ {
+ base_entity_remove (self);
+ return;
+ }
+ }
+ else
+ {
+ base_entity_remove (self);
+ return;
+ }
+ }
+
+ self.velocity = '0 0 0';
+ self.solid = SOLID_BSP;
+ self.movetype = MOVETYPE_PUSH;
+
+ // we've come to rest so cancel per-frame updates
+ // and transmit SOLID and ORIGIN now -- CEV
+ self.classgroup &= ~CG_FRAMETICK;
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID |
+ NETFLAG_BASE_ENTITY_ORIGIN;
+ return;
+ }
+
+ self.nextthink = time + 0.5;
+ };
+
+ //--------------------------------------------------------------
+ void() func_toss_use =
+ {
+ self.use = sub_null;
+
+ if (self.delay)
+ {
+ self.think = func_toss_fire;
+ self.nextthink = self.ltime + self.delay;
+ }
+ else
+ {
+ func_toss_fire ();
+ }
+ };
+#endif
+
+ //==============================================================
+ // Initialization
+ //==============================================================
+
+#ifdef SSQC
+ void(string key, string value) func_toss_init_field =
+ {
+ switch (key)
+ {
+ case "dest":
+ // dest is used in MG1 -- CEV
+ if (!self.pos1)
+ self.pos1 = stov (value);
+ break;
+ case "dest2":
+ // remap dest2, just in case -- CEV
+ if (!self.pos2)
+ self.pos2 = stov (value);
+ break;
+ }
+ };
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+ //--------------------------------------------------------------
+ void(entity e) func_toss_init =
+ {
+ e.classname = "func_toss";
+ e.classtype = CT_FUNC_TOSS;
+ base_func_init (e);
+
+ #ifdef CSQC
+ setmodelindex (e, e.modelindex);
+ setsize (e, e.mins, e.maxs);
+ setorigin (e, e.origin);
+ e.drawmask = DRAWMASK_NORMAL;
+ e.predraw = base_func_predraw;
+ #endif
+
+ #ifdef SSQC
+ e.solid = SOLID_BSP;
+ e.movetype = MOVETYPE_PUSH;
+ setmodel (e, e.model);
+ setorigin (e, e.origin);
+ e.oldorigin = e.origin;
+
+ e.use = func_toss_use;
+
+ if (!e.movedir)
+ e.movedir = '0 0 200';
+
+ if (e.pos1)
+ {
+ e.movedir_x += crandom() * e.pos1_x;
+ e.movedir_y += crandom() * e.pos1_y;
+ e.movedir_z += crandom() * e.pos1_z;
+ }
+
+ if (e.spawnflags & SPAWNFLAG_FUNC_TOSS_WAVE_ORIGIN)
+ {
+ e.netname = FUNC_TOSS_WAVE_NETNAME;
+ if (!e.speed)
+ e.speed = 200;
+ }
+ else if (!e.delay)
+ {
+ e.think = func_toss_linkcascade;
+ e.nextthink = e.ltime + 0.2;
+ }
+
+ if (e.noise != __NULL__ && e.noise != "")
+ {
+ precache_sound (e.noise);
+ }
+
+ // send it off to CSQC -- CEV
+ e.tick = base_func_neteval;
+ e.SendEntity = base_entity_netsend;
+ e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
+ #endif
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void() func_toss =
+ {
+ BASE_FUNC_PREINIT (func_toss_init_field)
+ func_toss_init (self);
+ };
+#endif
+// }
Return to the top of this page or return to the overview of this repo.
Diff qc/func/train.qc
diff --git a/qc/func/train.qc b/qc/func/train.qc
index 310f006..99c0f40 100644
--- a/qc/func/train.qc
+++ b/qc/func/train.qc
@@ -211,7 +211,7 @@ void() func_train;
!(self.spawnflags & SPAWNFLAG_FUNC_TRAIN_RETRIGGER))
{
// state: stopped
- self.state = 0;
+ self.stateflags |= STATE_WAITING;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
@@ -266,7 +266,7 @@ void() func_train;
VOL_MHI, ATTN_NORM);
// state: stopped
- self.state = 0;
+ self.stateflags |= STATE_WAITING;
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN;
@@ -357,9 +357,9 @@ void() func_train;
}
}
- if (!self.state)
+ if (self.stateflags & STATE_WAITING)
{
- self.state = 1;
+ self.stateflags &= ~STATE_WAITING;
if (self.classtype == CT_MISC_MODELTRAIN &&
self.style != MISC_MODELTRAIN_STYLE_SINGLEANIM)
@@ -459,24 +459,24 @@ void() func_train;
if (e.sounds == 1)
{
if (e.noise == "")
- e.noise = "plats/train2.wav";
+ e.noise = snd_plat_train2.wav;
if (e.noise1 == "")
- e.noise1 = "plats/train1.wav";
+ e.noise1 = snd_plat_train1.wav;
}
else if (e.sounds == 2)
{
// base door sound
if (e.noise == "")
- e.noise = "doors/hydro2.wav";
+ e.noise = snd_door_base_close.wav;
if (e.noise1 == "")
- e.noise1 = "doors/hydro1.wav";
+ e.noise1 = snd_door_base_open.wav;
}
else
{
if (e.noise == "")
- e.noise = "misc/null.wav";
+ e.noise = snd_null.wav;
if (e.noise1 == "")
- e.noise1 = "misc/null.wav";
+ e.noise1 = snd_null.wav;
}
// backwards compatibility with previous version
@@ -596,10 +596,7 @@ sounds
//--------------------------------------------------------------
void() func_train =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_train_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/func/wall.qc
diff --git a/qc/func/wall.qc b/qc/func/wall.qc
index f4b7702..882906f 100644
--- a/qc/func/wall.qc
+++ b/qc/func/wall.qc
@@ -115,10 +115,7 @@ This is just a solid wall if not inhibitted
//--------------------------------------------------------------
void() func_wall =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_FUNC_PREINIT (__NULL__)
func_wall_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/hazards/ltrail.qc
diff --git a/qc/hazards/ltrail.qc b/qc/hazards/ltrail.qc
index bff4de8..6fa29e9 100644
--- a/qc/hazards/ltrail.qc
+++ b/qc/hazards/ltrail.qc
@@ -84,8 +84,7 @@ void() ltrail_end;
local entity targent;
if (!self.sounds)
- sound (self, CHAN_VOICE, "weapons/lhit.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_lightning_hit)
targent = find (world, targetname, self.target);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
@@ -177,7 +176,7 @@ void() ltrail_end;
e.use = base_hazard_ltrail_use;
- precache_sound ("weapons/lhit.wav");
+ precache_sound (snd_weapon_lightning_hit.wav);
e.movetype = MOVETYPE_NONE;
e.solid = SOLID_BBOX;
Return to the top of this page or return to the overview of this repo.
Diff qc/hazards/shooter.qc
diff --git a/qc/hazards/shooter.qc b/qc/hazards/shooter.qc
index 0dba000..1ed926b 100644
--- a/qc/hazards/shooter.qc
+++ b/qc/hazards/shooter.qc
@@ -42,6 +42,7 @@ typedef enumflags
#ifdef SSQC
void() base_hazard_shooter_think;
void() base_hazard_shooter_use;
+void(string key, string value) base_hazard_shooter_init_field;
void(entity e) base_hazard_shooter_init;
strip void() base_hazard_shooter;
#endif
@@ -76,7 +77,7 @@ void() trap_switched_shooter;
//--------------------------------------------------------------
void() base_hazard_shooter_think =
{
- if (self.state)
+ if (!(self.stateflags & STATE_INACTIVE))
// call the use/firing function directly -- CEV
base_hazard_shooter_use ();
@@ -90,44 +91,45 @@ void() trap_switched_shooter;
//--------------------------------------------------------------
void() base_hazard_shooter_use =
{
- local string sndfile = "";
- local float spct = 0;
- local float fl = 0;
- local float tofs = random() * 100.0;
- tofs *= -1;
+ local sound_info_t snd = snd_empty;
if (self.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_LASER)
{
- sndfile = "enforcer/enfire.wav";
+ snd = snd_enforcer_fire;
local vector l_v = normalize (self.movedir);
// SetSpeed
- l_v *= min (LASER_SPEED *
- self.proj_speed_mod, PM_MAXVELOCITY);
+ l_v *= LASER_SPEED;
spawn_projectile_laser (self, self.origin, l_v);
}
else if (self.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_LAVABALL)
{
- sndfile = "boss1/throw.wav";
+ snd = snd_boss_throw;
spawn_projectile_lavaball (self, self.origin,
self.movedir * 600);
}
else if (self.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_ROCKET)
{
- sndfile = "weapons/sgun1.wav";
+ snd = snd_weapon_rocketlauncher;
spawn_projectile_rocket (self, self.origin,
- self.movedir * ROCKET_SPEED,
- self.proj_basespeed);
+ self.movedir * ROCKET_SPEED);
}
else if (self.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_VOREBALL)
{
- sndfile = "shalrath/attack2.wav";
+ snd = snd_shalrath_attack_02;
+
+ local float basespeed;
+
+ if (skill == 3)
+ basespeed = 350;
+ else
+ basespeed = 250;
+
spawn_projectile_voreball (self, self.origin,
- self.movedir * VOREBALL_SPEED,
- self.proj_basespeed);
+ self.movedir * VOREBALL_SPEED, basespeed);
}
else if (self.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_GRENADE)
{
- sndfile = "weapons/grenade.wav";
+ snd = snd_weapon_grenadelauncher;
local vector g_v = self.movedir * 600 +
v_up * 200 + crandom() * v_right * 10 +
crandom() * v_up * 10;
@@ -135,7 +137,7 @@ void() trap_switched_shooter;
}
else if (self.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_GIBS)
{
- sndfile = "zombie/z_shot1.wav";
+ snd = snd_zombie_shot;
local vector z_v = self.movedir * 600 +
v_up * 200 + crandom() * v_right * 10 +
crandom() * v_up * 10;
@@ -144,7 +146,7 @@ void() trap_switched_shooter;
}
else
{
- sndfile = "weapons/spike2.wav";
+ snd = snd_weapon_supernailgun;
local float damage;
if (self.spawnflags &
@@ -160,17 +162,37 @@ void() trap_switched_shooter;
// shooter spikes move at half the speed of
// player spikes -- CEV
spawn_projectile_spike (self, self.origin,
- self.movedir * 500, damage, 500);
+ self.movedir * 500, damage);
}
if (!(self.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_SILENT)) {
- if (sndfile != "")
+ if (snd.wav != snd_empty.wav)
{
- sound (self, CHAN_VOICE, sndfile, VOL_MHI,
- ATTN_NORM, spct, fl, tofs);
+ // random small delay to start (to prevent loud
+ // stacking of shooter sounds) -- CEV
+ sound (self, CHAN_VOICE, snd.wav, VOL_MHI, ATTN_NORM,
+ 0, 0, random() * -1);
} }
};
+ //==============================================================
+ // Initialization
+ //==============================================================
+
+ //--------------------------------------------------------------
+ void(string key, string value) base_hazard_shooter_init_field =
+ {
+ switch (key)
+ {
+ case "state":
+ if (value == "1")
+ self.stateflags &= ~STATE_INACTIVE;
+ else
+ self.stateflags |= STATE_INACTIVE;
+ break;
+ }
+ };
+
//--------------------------------------------------------------
void(entity e) base_hazard_shooter_init =
{
@@ -178,50 +200,46 @@ void() trap_switched_shooter;
e.think = base_hazard_shooter_think;
e.use = base_hazard_shooter_use;
- if (e.proj_speed_mod <= 0)
- e.proj_speed_mod = 1;
-
sub_setmovedir (e);
if (e.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_LASER)
{
precache_model2 ("progs/laser.mdl");
- precache_sound2 ("enforcer/enfire.wav");
- precache_sound2 ("enforcer/enfstop.wav");
+ precache_sound2 (snd_enforcer_fire.wav);
+ precache_sound2 (snd_enforcer_fire_hit.wav);
}
else if (e.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_LAVABALL)
{
precache_model ("progs/lavaball.mdl");
- // precache_sound2 ("knight/sword2.wav"); // dms
- precache_sound2 ("boss1/throw.wav"); // dms
+ precache_sound2 (snd_boss_throw.wav); // dms
}
else if (e.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_ROCKET)
{
precache_model ("progs/missile.mdl");
- precache_sound ("weapons/sgun1.wav");
+ precache_sound (snd_weapon_rocketlauncher.wav);
}
else if (e.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_VOREBALL)
{
precache_model ("progs/v_spike.mdl");
- precache_sound ("shalrath/attack2.wav");
+ precache_sound (snd_shalrath_attack_02.wav);
}
else if (e.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_GRENADE)
{
precache_model ("progs/grenade.mdl");
// grenade launcher
- precache_sound ("weapons/grenade.wav");
+ precache_sound (snd_weapon_grenadelauncher.wav);
}
else if (e.spawnflags & SPAWNFLAG_HAZARD_SHOOTER_GIBS)
{
precache_model ("progs/zom_gib.mdl");
// Zombie gibs
- precache_sound ("zombie/z_shot1.wav");
- precache_sound ("zombie/z_miss.wav");
- precache_sound ("zombie/z_hit.wav");
+ precache_sound (snd_zombie_shot.wav);
+ precache_sound (snd_zombie_miss.wav);
+ precache_sound (snd_zombie_hit.wav);
}
else
{
- precache_sound ("weapons/spike2.wav");
+ precache_sound (snd_weapon_supernailgun.wav);
}
};
@@ -253,6 +271,8 @@ Laser is only for REGISTERED.
//--------------------------------------------------------------
void() trap_spikeshooter =
{
+ base_mapentity_init_spawndata (base_hazard_shooter_init_field);
+
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;
@@ -282,13 +302,16 @@ Continuously fires spikes.
e.wait = 1;
// MED 11/01/96 added state capability
- e.state = 1;
+ // trap_shooter is always active (apparently) -- CEV
+ e.stateflags &= ~STATE_INACTIVE;
e.nextthink = e.nextthink + e.wait + e.ltime;
};
//--------------------------------------------------------------
void() trap_shooter =
{
+ base_mapentity_init_spawndata (base_hazard_shooter_init_field);
+
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;
@@ -314,7 +337,10 @@ Continuously fires spikes.
//--------------------------------------------------------------
void() trap_switched_shooter_use =
{
- self.state = 1 - self.state;
+ if (self.stateflags & STATE_INACTIVE)
+ self.stateflags &= ~STATE_INACTIVE;
+ else
+ self.stateflags |= STATE_INACTIVE;
};
//--------------------------------------------------------------
@@ -335,6 +361,10 @@ Continuously fires spikes.
//--------------------------------------------------------------
void() trap_switched_shooter =
{
+ // this is needed because 0 is default off/INACTIVE -- CEV
+ self.stateflags |= STATE_INACTIVE;
+ base_mapentity_init_spawndata (base_hazard_shooter_init_field);
+
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;
Return to the top of this page or return to the overview of this repo.
Diff qc/info/path_corner.qc
diff --git a/qc/info/path_corner.qc b/qc/info/path_corner.qc
index 8122fc4..a3a1d29 100644
--- a/qc/info/path_corner.qc
+++ b/qc/info/path_corner.qc
@@ -45,9 +45,10 @@ Monsters will continue walking towards the next target corner.
other = stemp;
if (self.classtype == CT_MONSTER_OGRE)
+ {
// chainsaw drag sound -- dumptruck_ds
- sound (self, CHAN_VOICE, "ogre/ogdrag.wav",
- VOL_HIGH, ATTN_IDLE);
+ SOUND (self, snd_ogre_drag)
+ }
// dprint ("t_movetarget\n");
self.goalentity = self.movetarget = find (world, targetname,
Return to the top of this page or return to the overview of this repo.
Diff qc/items/ammo.qc
diff --git a/qc/items/ammo.qc b/qc/items/ammo.qc
index c0c920e..ffa8e11 100644
--- a/qc/items/ammo.qc
+++ b/qc/items/ammo.qc
@@ -32,9 +32,6 @@ typedef enumflags
#endif
#ifdef SSQC
-const float ITEM_AMMO_DAMAGE_SMALL = 10;// damage a small box deals when thrown
-const float ITEM_AMMO_DAMAGE_LARGE = 15;// same, but for large ammo boxes
-
const float AMMO_RESPAWN_TIME = 30; // ammo respawn time; id1 30s
const float AMMO_CELLS_SMALL = 6; // id1 6; small box of cells
const float AMMO_CELLS_BIG = 12; // id1 12; large box of cells
@@ -57,8 +54,11 @@ const float AMMO_SHELLS_MAX = 100; // id1 maximum 100
// base_item_ammo
#ifdef SSQC
// BASE_ITEM_AMMO_ADDAMMO(p, idx)
-entity(entity src, vector org, vector vel, float fl, void(entity) initfn)
- spawn_item_ammo_n;
+#endif
+#ifdef CSQC
+void(float isnew) base_item_ammo_netreceive;
+#endif
+#ifdef SSQC
void(entity grabber, entity ammo) base_item_ammo_grab;
void(entity attacker, float item_index) base_item_ammo_fire;
void() base_item_ammo_touch;
@@ -71,59 +71,13 @@ void(entity e) base_item_ammo_init;
strip void() base_item_ammo;
#endif
-// item_shells
-#ifdef CSQC
-void(float isnew) item_shells_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_shells;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_shells_init;
-#endif
#ifdef SSQC
+//----------------------------------------------------------------------
+// original id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
void() item_shells;
-#endif
-
-// item_spikes
-#ifdef CSQC
-void(float isnew) item_spikes_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_spikes;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_spikes_init;
-#endif
-#ifdef SSQC
void() item_spikes;
-#endif
-
-// item_rockets
-#ifdef CSQC
-void(float isnew) item_rockets_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_rockets;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_rockets_init;
-#endif
-#ifdef SSQC
void() item_rockets;
-#endif
-
-// item_cells
-#ifdef CSQC
-void(float isnew) item_cells_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_cells;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_cells_init;
-#endif
-#ifdef SSQC
void() item_cells;
#endif
@@ -180,20 +134,18 @@ void() item_cells;
break; \
} \
}
+#endif
+#ifdef CSQC
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl,
- void(entity) initfn) spawn_item_ammo_n =
+ void(float isnew) base_item_ammo_netreceive =
{
- local entity e = spawn ();
- e.owner = src;
- e.spawnflags = fl;
- e.origin = org;
- e.velocity = vel;
- initfn (e);
- return e;
+ // creates a number of variables, including netflags -- CEV
+ BASE_ITEM_NETRECEIVE (base_item_ammo_init)
};
+#endif
+#ifdef SSQC
//--------------------------------------------------------------
// base_item_ammo_grab -- player has 'grabbed' the item -- CEV
//--------------------------------------------------------------
@@ -202,7 +154,7 @@ void() item_cells;
BASE_ITEM_INVENTORY_ADD (ammo, grabber)
// don't re-grab / immediately throw the item -- CEV
- if (grabber.button6)
+ if (grabber.button4)
grabber.flags |= FL_THROW_HELD;
// let the player know -- CEV
@@ -249,8 +201,8 @@ void() item_cells;
NETFLAG_PLAYER_WEAPON;
// and make sure the player knows -- CEV
- local item_info_t item = item_info[item_index];
- BASE_ITEM_PICKUPMESSAGE (attacker, item, CHAN_ITEM_AMMO)
+ local item_info_t iit = item_info[item_index];
+ BASE_ITEM_PICKUPMESSAGE (attacker, iit)
};
//--------------------------------------------------------------
@@ -271,14 +223,12 @@ void() item_cells;
BASE_ENTITY_WEAPONLOOKUP (other)
if (item_index < ITEM_SEQ_W_START||item_index > ITEM_SEQ_W_END)
{
- if (item_index == ITEM_SEQ_HANDS && other.button6 &&
- !(other.flags & FL_THROW_HELD))
+ if (item_index == ITEM_SEQ_HANDS && other.button4)
{
- // self.attack_finished = time + 0.5;
base_item_ammo_grab (other, self);
return;
}
- else
+ else if (!other.button0)
{
return;
}
@@ -294,8 +244,8 @@ void() item_cells;
other.SendFlags |= NETFLAG_PLAYER_AMMO;
// let the player know -- CEV
- local item_info_t item = item_info[self.weapon];
- BASE_ITEM_PICKUPMESSAGE (other, item, CHAN_ITEM_AMMO)
+ local item_info_t iit = item_info[self.weapon];
+ BASE_ITEM_PICKUPMESSAGE (other, iit)
// fire all targets / killtargets
activator = other;
@@ -317,29 +267,76 @@ void() item_cells;
//--------------------------------------------------------------
void(entity e) base_item_ammo_init =
{
- e.classgroup |= CG_ITEM_AMMO;
+ local item_info_t iit = item_info[e.weapon];
- local item_info_t item = item_info[e.weapon];
+ e.netname = iit.name;
+ e.classgroup |= CG_ITEM_AMMO;
#ifdef SSQC
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
+
e.touch = base_item_ammo_touch;
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
+
+ if (!e.dmg && iit.dmg)
+ e.dmg = iit.dmg;
+
+ if (!e.view_ofs)
+ {
+ if (e.spawnflags & SPAWNFLAG_ITEM_AMMO_LARGE_BOX)
+ {
+ if (e.weapon == ITEM_SEQ_AMMO_ROCKETS_LARGE)
+ e.view_ofs = '16 8 16';
+ else
+ e.view_ofs = '16 16 16';
+ }
+ else
+ {
+ if (e.weapon == ITEM_SEQ_AMMO_ROCKETS_SMALL)
+ e.view_ofs = '8 8 16';
+ else
+ e.view_ofs = '12 12 12';
+ }
+ }
+
+ // maybe move these details into the item_info struct? -- CEV
+ switch (e.weapon)
+ {
+ case ITEM_SEQ_AMMO_SHELLS_LARGE:
+ e.ammo_shells = AMMO_SHELLS_BIG; break;
+ case ITEM_SEQ_AMMO_SHELLS_SMALL:
+ e.ammo_shells = AMMO_SHELLS_SMALL; break;
+ case ITEM_SEQ_AMMO_NAILS_LARGE:
+ e.ammo_nails = AMMO_NAILS_BIG; break;
+ case ITEM_SEQ_AMMO_NAILS_SMALL:
+ e.ammo_nails = AMMO_NAILS_SMALL; break;
+ case ITEM_SEQ_AMMO_ROCKETS_LARGE:
+ e.ammo_rockets = AMMO_ROCKETS_BIG; break;
+ case ITEM_SEQ_AMMO_ROCKETS_SMALL:
+ e.ammo_rockets = AMMO_ROCKETS_SMALL; break;
+ case ITEM_SEQ_AMMO_CELLS_LARGE:
+ e.ammo_cells = AMMO_CELLS_BIG; break;
+ case ITEM_SEQ_AMMO_CELLS_SMALL:
+ e.ammo_cells = AMMO_CELLS_SMALL; break;
+ }
#endif
#ifdef CSQC
setmodelindex (e, e.modelindex);
#endif
- e.noise = item.pickup_sound;
- e.netname = item.name;
+ if (!e.skin && iit.world_skin)
+ e.skin = iit.world_skin;
+ // next function will take care of setsize -- CEV
base_item_init (e);
#ifdef SSQC
// set up rotation -- CEV
- BASE_ITEM_THROW_ROTATION (e, item)
+ BASE_ITEM_THROW_ROTATION (e, iit)
#endif
};
#endif
@@ -353,6 +350,22 @@ void() item_cells;
#endif
// };
+//----------------------------------------------------------------------
+// id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+#define ITEM_AMMO(idxlarge, idxsmall) \
+/* { */ \
+ BASE_ITEM_PREINIT (base_item_ammo_init_field) \
+ if (self.spawnflags & SPAWNFLAG_ITEM_AMMO_LARGE_BOX) \
+ self.weapon = idxlarge; \
+ else \
+ self.weapon = idxsmall; \
+ base_item_ammo_init (self);
+/* } */
+
/*QUAKED item_shells (0 .5 .8) (0 0 0) (32 32 32) LARGE_BOX X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{
model ( {{ spawnflags & 1 -> { "path" : "maps/b_shell1.bsp" }, "maps/b_shell0.bsp" }} );
@@ -363,67 +376,9 @@ LARGE_BOX is a box of 40 shells.
//----------------------------------------------------------------------
// class item_shells: base_item_ammo
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_shells_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_shells_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_shells =
- {
- return spawn_item_ammo_n (src, org, vel, fl, item_shells_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_shells_init =
- {
- e.classname = "item_shells";
- e.classtype = CT_ITEM_AMMO_SHELLS;
-
- #ifdef SSQC
- if (e.spawnflags & SPAWNFLAG_ITEM_AMMO_LARGE_BOX)
- {
- e.weapon = ITEM_SEQ_AMMO_SHELLS_LARGE;
- e.ammo_shells = AMMO_SHELLS_BIG;
- e.dmg = ITEM_AMMO_DAMAGE_LARGE;
- if !(e.particles_offset)
- e.particles_offset = '16 16 16';
- }
- else
- {
- e.weapon = ITEM_SEQ_AMMO_SHELLS_SMALL;
- e.ammo_shells = AMMO_SHELLS_SMALL;
- e.dmg = ITEM_AMMO_DAMAGE_SMALL;
- if !(e.particles_offset)
- e.particles_offset = '12 12 12';
- }
- #endif
-
- e.pos1 = '0 0 0';
- e.pos2 = '32 32 56';
-
- // StartItem
- base_item_ammo_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_shells =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_ammo_init_field)
-
- item_shells_init (self);
- };
-#endif
+ { ITEM_AMMO (ITEM_SEQ_AMMO_SHELLS_LARGE, ITEM_SEQ_AMMO_SHELLS_SMALL) };
// };
/*QUAKED item_spikes (0 .5 .8) (0 0 0) (32 32 32) LARGE_BOX X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
@@ -436,67 +391,9 @@ LARGE_BOX is a box of 50 nails.
//----------------------------------------------------------------------
// class item_spikes: base_item_ammo
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_spikes_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_spikes_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_spikes =
- {
- return spawn_item_ammo_n (src, org, vel, fl, item_spikes_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_spikes_init =
- {
- e.classname = "item_spikes";
- e.classtype = CT_ITEM_AMMO_SPIKES;
-
- #ifdef SSQC
- if (e.spawnflags & SPAWNFLAG_ITEM_AMMO_LARGE_BOX)
- {
- e.weapon = ITEM_SEQ_AMMO_NAILS_LARGE;
- e.ammo_nails = AMMO_NAILS_BIG;
- e.dmg = ITEM_AMMO_DAMAGE_LARGE;
- if !(e.particles_offset)
- e.particles_offset = '16 16 16';
- }
- else
- {
- e.weapon = ITEM_SEQ_AMMO_NAILS_SMALL;
- e.ammo_nails = AMMO_NAILS_SMALL;
- e.dmg = ITEM_AMMO_DAMAGE_SMALL;
- if !(e.particles_offset)
- e.particles_offset = '12 12 12';
- }
- #endif
-
- e.pos1 = '0 0 0';
- e.pos2 = '32 32 56';
-
- // StartItem
- base_item_ammo_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_spikes =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_ammo_init_field)
-
- item_spikes_init (self);
- };
-#endif
+ { ITEM_AMMO (ITEM_SEQ_AMMO_NAILS_LARGE, ITEM_SEQ_AMMO_NAILS_SMALL) };
// };
/*QUAKED item_rockets (0 .5 .8) (0 0 0) (32 32 32) LARGE_BOX X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
@@ -507,68 +404,9 @@ LARGE_BOX is a box of 50 nails.
//----------------------------------------------------------------------
// class item_rockets: base_item_ammo
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_rockets_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_rockets_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_rockets =
- {
- return spawn_item_ammo_n (src, org, vel, fl, item_rockets_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_rockets_init =
- {
- e.classname = "item_rockets";
- e.classtype = CT_ITEM_AMMO_ROCKETS;
-
- #ifdef SSQC
- if (e.spawnflags & SPAWNFLAG_ITEM_AMMO_LARGE_BOX)
- {
- e.weapon = ITEM_SEQ_AMMO_ROCKETS_LARGE;
- e.ammo_rockets = AMMO_ROCKETS_BIG;
- e.dmg = ITEM_AMMO_DAMAGE_LARGE;
- if !(e.particles_offset)
- e.particles_offset = '16 8 16';
- }
- else
- {
- e.weapon = ITEM_SEQ_AMMO_ROCKETS_SMALL;
- e.ammo_rockets = AMMO_ROCKETS_SMALL;
- e.dmg = ITEM_AMMO_DAMAGE_SMALL;
- if !(e.particles_offset)
- e.particles_offset = '8 8 16';
- }
- #endif
-
- e.pos1 = '0 0 0';
- e.pos2 = '32 32 56';
-
- // StartItem
- base_item_ammo_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_rockets =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_ammo_init_field)
-
- item_rockets_init (self);
- };
-#endif
+ { ITEM_AMMO (ITEM_SEQ_AMMO_ROCKETS_LARGE,ITEM_SEQ_AMMO_ROCKETS_SMALL) };
// };
/*QUAKED item_cells (0 .5 .8) (0 0 0) (32 32 32) LARGE_BOX X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
@@ -581,65 +419,10 @@ LARGE_BOX is a box of 12 cells.
//----------------------------------------------------------------------
// class item_cells: base_item_ammo
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_cells_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_cells_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_cells =
- {
- return spawn_item_ammo_n (src, org, vel, fl, item_cells_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_cells_init =
- {
- e.classname = "item_cells";
- e.classtype = CT_ITEM_AMMO_CELLS;
-
- #ifdef SSQC
- if (e.spawnflags & SPAWNFLAG_ITEM_AMMO_LARGE_BOX)
- {
- e.weapon = ITEM_SEQ_AMMO_CELLS_LARGE;
- e.ammo_cells = AMMO_CELLS_BIG;
- e.dmg = ITEM_AMMO_DAMAGE_LARGE;
- if !(e.particles_offset)
- e.particles_offset = '16 16 16';
- }
- else
- {
- e.weapon = ITEM_SEQ_AMMO_CELLS_SMALL;
- e.ammo_cells = AMMO_CELLS_SMALL;
- e.dmg = ITEM_AMMO_DAMAGE_SMALL;
- if !(e.particles_offset)
- e.particles_offset = '12 12 12';
- }
- #endif
-
- e.pos1 = '0 0 0';
- e.pos2 = '32 32 56';
-
- // StartItem
- base_item_ammo_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_cells =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_ammo_init_field)
+ { ITEM_AMMO (ITEM_SEQ_AMMO_CELLS_LARGE, ITEM_SEQ_AMMO_CELLS_SMALL) };
+// };
- item_cells_init (self);
- };
+#undef ITEM_AMMO
#endif
-// };
Return to the top of this page or return to the overview of this repo.
Diff qc/items/armor.qc
diff --git a/qc/items/armor.qc b/qc/items/armor.qc
index 6fe1956..6c121b7 100644
--- a/qc/items/armor.qc
+++ b/qc/items/armor.qc
@@ -21,9 +21,6 @@ const float ARMOR_RED_MAX = 225; // id1 225
const float ARMOR_SHARD_AMOUNT = 5; // Q3 5
-const float ARMOR_DAMAGE = 15; // damage armor deals when thrown
-const float ARMOR_DAMAGE_SHARD = 5; // damage a shard deals when thrown
-
const float ARMOR_RESPAWN_SP = 30; // id1 30s
const float ARMOR_RESPAWN_DM = 20; // id1 20s
#endif
@@ -35,8 +32,12 @@ const float ARMOR_RESPAWN_DM = 20; // id1 20s
// base_item_armor
#ifdef SSQC
// BASE_ITEM_ARMOR_ADDARMOR(p, idx)
-entity(entity src, vector org, vector vel, float fl, void(entity) initfn)
- spawn_item_armor;
+#endif
+#ifdef CSQC
+void(float isnew) base_item_armor_netreceive;
+#endif
+#ifdef SSQC
+entity(entity src) item_armor_shard_drop;
void(entity grabber, entity armor) base_item_armor_grab;
void(entity attacker, float item_index) base_item_armor_fire;
void() base_item_armor_touch;
@@ -49,60 +50,13 @@ void(entity e) base_item_armor_init;
strip void() base_item_armor;
#endif
-// item_armor1
-#ifdef CSQC
-void(float isnew) item_armor1_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_armor1;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_armor1_init;
-#endif
#ifdef SSQC
+//----------------------------------------------------------------------
+// original id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
void() item_armor1;
-#endif
-
-// item_armor2
-#ifdef CSQC
-void(float isnew) item_armor2_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_armor2;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_armor2_init;
-#endif
-#ifdef SSQC
void() item_armor2;
-#endif
-
-// item_armorInv
-#ifdef CSQC
-void(float isnew) item_armorInv_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_armorInv;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_armorInv_init;
-#endif
-#ifdef SSQC
void() item_armorInv;
-#endif
-
-// item_armor_shard
-#ifdef CSQC
-void(float isnew) item_armor_shard_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src) item_armor_shard_drop;
-entity(entity src, vector org, vector vel, float fl) spawn_item_armor_shard;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_armor_shard_init;
-#endif
-#ifdef SSQC
void() item_armor_shard;
#endif
@@ -115,9 +69,7 @@ void() item_armor_shard;
//--------------------------------------------------------------
#define BASE_ITEM_ARMOR_ADDARMOR(p, idx) \
{ \
- local float a_type, a_value, a_bit; \
- /* silence a compiler warning -- CEV */ \
- a_type = a_value = a_bit = 0; \
+ local float a_type = 0, a_value = 0, a_bit = 0; \
switch (idx) \
{ \
case ITEM_SEQ_ARMOR_GREEN: \
@@ -181,20 +133,34 @@ void() item_armor_shard;
p.items = p.items - (p.items & \
(IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + a_bit; \
}
+#endif
+#ifdef CSQC
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl,
- void(entity) init_fn) spawn_item_armor =
+ void(float isnew) base_item_armor_netreceive =
{
- local entity e = spawn ();
- e.owner = src;
- e.spawnflags = fl;
- e.origin = org;
- e.velocity = vel;
- init_fn (e);
- return e;
+ // creates a number of variables, including netflags -- CEV
+ BASE_ITEM_NETRECEIVE (base_item_armor_init)
};
+#endif
+#ifdef SSQC
+ //--------------------------------------------------------------
+ // TODO CEV
+ //--------------------------------------------------------------
+ entity(entity src) item_armor_shard_drop =
+ {
+ local vector vel;
+ vel_x = -100 + (random() * 200);
+ vel_y = -100 + (random() * 200);
+ vel_z = 300;
+ local entity oself = self;
+ self = src;
+ local entity e = spawn_base_item (ITEM_SEQ_ARMOR_SHARD,
+ src.origin - '0 0 24', vel, SPAWNFLAG_ITEM_THROWN);
+ self = oself;
+ return e;
+ };
//--------------------------------------------------------------
void(entity grabber, entity armor) base_item_armor_grab =
{
@@ -204,7 +170,7 @@ void() item_armor_shard;
grabber.netname, armor.netname));
// don't re-grab / immediately throw the item -- CEV
- if (grabber.button6)
+ if (grabber.button4)
grabber.flags |= FL_THROW_HELD;
if (grabber.classtype == CT_PLAYER && grabber.SendEntity)
@@ -240,8 +206,8 @@ void() item_armor_shard;
NETFLAG_PLAYER_HEALTH | NETFLAG_PLAYER_WEAPON;
// let the player know -- CEV
- local item_info_t item = item_info[item_index];
- BASE_ITEM_PICKUPMESSAGE (attacker, item, CHAN_ITEM_ARMOR)
+ local item_info_t iit = item_info[item_index];
+ BASE_ITEM_PICKUPMESSAGE (attacker, iit)
};
//--------------------------------------------------------------
@@ -260,14 +226,13 @@ void() item_armor_shard;
BASE_ENTITY_WEAPONLOOKUP (other)
if (item_index < ITEM_SEQ_W_START||item_index > ITEM_SEQ_W_END)
{
- if (item_index == ITEM_SEQ_HANDS && other.button6 &&
- !(other.flags & FL_THROW_HELD))
+ if (item_index == ITEM_SEQ_HANDS && other.button4)
{
// self.attack_finished = time + 0.5;
base_item_armor_grab (other, self);
return;
}
- else
+ else if (!other.button0)
{
return;
}
@@ -282,8 +247,8 @@ void() item_armor_shard;
NETFLAG_PLAYER_HEALTH;
// let the player know -- CEV
- local item_info_t item = item_info[self.weapon];
- BASE_ITEM_PICKUPMESSAGE (other, item, CHAN_ITEM_ARMOR)
+ local item_info_t iit = item_info[self.weapon];
+ BASE_ITEM_PICKUPMESSAGE (other, iit)
// fire all targets / killtargets
activator = other;
@@ -305,16 +270,25 @@ void() item_armor_shard;
//--------------------------------------------------------------
void(entity e) base_item_armor_init =
{
- e.classgroup |= CG_ITEM_ARMOR;
+ local item_info_t iit = item_info[e.weapon];
- local item_info_t item = item_info[e.weapon];
+ e.netname = iit.name;
+ e.classgroup |= CG_ITEM_ARMOR;
#ifdef SSQC
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
- if (!e.skin)
- e.skin = item.option;
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
+
+ e.touch = base_item_armor_touch;
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
+
+ if (!e.dmg && iit.dmg)
+ e.dmg = iit.dmg;
+
+ if (!e.skin && iit.world_skin)
+ e.skin = iit.world_skin;
#endif
#ifdef CSQC
@@ -322,9 +296,7 @@ void() item_armor_shard;
e.modelflags |= MF_ROTATE;
#endif
- e.noise = item.pickup_sound;
- e.netname = item.name;
-
+ // next function will take care of setsize -- CEV
base_item_init (e);
};
#endif
@@ -338,243 +310,41 @@ void() item_armor_shard;
#endif
// };
+//----------------------------------------------------------------------
+// id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+#define ITEM_ARMOR(idx) \
+/* { */ \
+ BASE_ITEM_PREINIT (base_item_armor_init_field) \
+ self.weapon = idx; \
+ base_item_armor_init (self);
+/* } */
+
/*QUAKED item_armor1 (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{
model ("progs/armor.mdl");
}
*/
-//----------------------------------------------------------------------
-// class item_armor1: base_item_armor
-// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_armor1_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_armor1_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_armor1 =
- {
- return spawn_item_armor (src, org, vel, fl, item_armor1_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_armor1_init =
- {
- e.classname = "item_armor1";
- e.classtype = CT_ITEM_ARMOR_GREEN;
-
- #ifdef SSQC
- e.touch = base_item_armor_touch;
- e.weapon = ITEM_SEQ_ARMOR_GREEN;
- e.dmg = ARMOR_DAMAGE;
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_armor_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() item_armor1 =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_armor_init_field)
-
- item_armor1_init (self);
- };
-#endif
-// };
+void() item_armor1 = { ITEM_ARMOR (ITEM_SEQ_ARMOR_GREEN) };
/*QUAKED item_armor2 (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model({ "path": ":progs/armor.mdl", "skin": 1 }); }
*/
-//----------------------------------------------------------------------
-// class item_armor2: base_item_armor
-// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_armor2_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_armor2_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_armor2 =
- {
- return spawn_item_armor (src, org, vel, fl, item_armor2_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_armor2_init =
- {
- e.classname = "item_armor2";
- e.classtype = CT_ITEM_ARMOR_YELLOW;
-
- #ifdef SSQC
- e.touch = base_item_armor_touch;
- e.weapon = ITEM_SEQ_ARMOR_YELLOW;
- e.dmg = ARMOR_DAMAGE;
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_armor_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() item_armor2 =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_armor_init_field)
-
- item_armor2_init (self);
- };
-#endif
-// };
+void() item_armor2 = { ITEM_ARMOR (ITEM_SEQ_ARMOR_YELLOW) };
/*QUAKED item_armorInv (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{
model({ "path": ":progs/armor.mdl", "skin": 2 });
}
*/
-//----------------------------------------------------------------------
-// class item_armorInv: base_item_armor
-// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_armorInv_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_armorInv_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_armorInv =
- {
- return spawn_item_armor (src, org, vel, fl, item_armorInv_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_armorInv_init =
- {
- e.classname = "item_armorInv";
- e.classtype = CT_ITEM_ARMOR_RED;
-
- #ifdef SSQC
- e.touch = base_item_armor_touch;
- e.weapon = ITEM_SEQ_ARMOR_RED;
- e.dmg = ARMOR_DAMAGE;
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_armor_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() item_armorInv =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_armor_init_field)
-
- item_armorInv_init (self);
- };
-#endif
-// };
+void() item_armorInv = { ITEM_ARMOR (ITEM_SEQ_ARMOR_RED) };
//------------------------------------------------------------------------------
// item_armor_shard
//------------------------------------------------------------------------------
-// class item_armor_shard: base_item_armor
-// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_armor_shard_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_armor_shard_init)
- };
+void() item_armor_shard = { ITEM_ARMOR (ITEM_SEQ_ARMOR_SHARD) };
+#undef ITEM_ARMOR
#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src) item_armor_shard_drop =
- {
- local vector vel;
- vel_x = -100 + (random() * 200);
- vel_y = -100 + (random() * 200);
- vel_z = 300;
- return spawn_item_armor_shard (src, src.origin - '0 0 24', vel,
- SPAWNFLAG_ITEM_THROWN);
- };
-
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_armor_shard =
- {
- return spawn_item_armor (src, org, vel, fl,
- item_armor_shard_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_armor_shard_init =
- {
- e.classname = "item_armor_shard";
- e.classtype = CT_ITEM_ARMOR_SHARD;
-
- #ifdef SSQC
- e.touch = base_item_armor_touch;
- e.weapon = ITEM_SEQ_ARMOR_SHARD;
- e.dmg = ARMOR_DAMAGE_SHARD;
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_armor_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() item_armor_shard =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_armor_init_field)
-
- item_armor_shard_init (self);
- };
-#endif
-// };
Return to the top of this page or return to the overview of this repo.
Diff qc/items/backpacks.qc
diff --git a/qc/items/backpacks.qc b/qc/items/backpacks.qc
index 5b8444d..9fac899 100644
--- a/qc/items/backpacks.qc
+++ b/qc/items/backpacks.qc
@@ -133,7 +133,14 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
//--------------------------------------------------------------
void() item_backpack_touch =
{
- if (sub_checkvalidtouch(other) == FALSE)
+ // do a subset of sub_checkvalidtouch() -- CEV
+ if (other.classtype != CT_PLAYER)
+ return;
+
+ if (other.health <= 0)
+ return;
+
+ if (other.movetype == MOVETYPE_NOCLIP)
return;
// don't touch if other isn't holding a weapon -- CEV
@@ -142,41 +149,41 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
{
if (item_index != ITEM_SEQ_HANDS)
return;
- if (!other.button6 && (!(other.flags & FL_THROW_HELD)))
+ if (!other.button4 && (!(other.flags & FL_THROW_HELD)))
return;
}
- // add self.inventory1 (stored weapon) to other -- CEV
- if (self.inventory1)
+ // add self.item[0] (stored weapon) to other -- CEV
+ if (self.item[0])
{
local float slot = 0;
// look up the default slot for this weapon -- CEV
- switch (self.inventory1)
+ switch (self.item[0])
{
case ITEM_SEQ_AXE:
- slot = ITEM_WEAPON_AXE;
+ slot = ITEM_WEAPON_SLOT_AXE;
break;
case ITEM_SEQ_SHOTGUN:
- slot = ITEM_WEAPON_SHOTGUN;
+ slot = ITEM_WEAPON_SLOT_SHOTGUN;
break;
case ITEM_SEQ_SUPERSHOTGUN:
- slot = ITEM_WEAPON_SUPERSHOTGUN;
+ slot = ITEM_WEAPON_SLOT_SUPERSHOTGUN;
break;
case ITEM_SEQ_NAILGUN:
- slot = ITEM_WEAPON_NAILGUN;
+ slot = ITEM_WEAPON_SLOT_NAILGUN;
break;
case ITEM_SEQ_SUPERNAILGUN:
- slot = ITEM_WEAPON_SUPERNAILGUN;
+ slot = ITEM_WEAPON_SLOT_SUPERNAILGUN;
break;
case ITEM_SEQ_GRENADELAUNCHER:
- slot = ITEM_WEAPON_GRENADELAUNCHER;
+ slot = ITEM_WEAPON_SLOT_GRENADELAUNCHER;
break;
case ITEM_SEQ_ROCKETLAUNCHER:
- slot = ITEM_WEAPON_ROCKETLAUNCHER;
+ slot = ITEM_WEAPON_SLOT_ROCKETLAUNCHER;
break;
case ITEM_SEQ_LIGHTNINGGUN:
- slot = ITEM_WEAPON_LIGHTNINGGUN;
+ slot = ITEM_WEAPON_SLOT_LIGHTNINGGUN;
break;
}
@@ -184,49 +191,41 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
switch (slot)
{
case 1:
- if (other.inventory1 == ITEM_SEQ_HANDS)
- other.inventory1 =
- self.inventory1;
+ if (other.item[0] == ITEM_SEQ_HANDS)
+ other.item[0] = self.item[0];
break;
case 2:
- if (other.inventory2 == ITEM_SEQ_HANDS)
- other.inventory2 =
- self.inventory1;
+ if (other.item[1] == ITEM_SEQ_HANDS)
+ other.item[1] = self.item[0];
break;
case 3:
- if (other.inventory3 == ITEM_SEQ_HANDS)
- other.inventory3 =
- self.inventory1;
+ if (other.item[2] == ITEM_SEQ_HANDS)
+ other.item[2] = self.item[0];
break;
case 4:
- if (other.inventory4 == ITEM_SEQ_HANDS)
- other.inventory4 =
- self.inventory1;
+ if (other.item[3] == ITEM_SEQ_HANDS)
+ other.item[3] = self.item[0];
break;
case 5:
- if (other.inventory5 == ITEM_SEQ_HANDS)
- other.inventory5 =
- self.inventory1;
+ if (other.item[4] == ITEM_SEQ_HANDS)
+ other.item[4] = self.item[0];
break;
case 6:
- if (other.inventory6 == ITEM_SEQ_HANDS)
- other.inventory6 =
- self.inventory1;
+ if (other.item[5] == ITEM_SEQ_HANDS)
+ other.item[5] = self.item[0];
break;
case 7:
- if (other.inventory7 == ITEM_SEQ_HANDS)
- other.inventory7 =
- self.inventory1;
+ if (other.item[6] == ITEM_SEQ_HANDS)
+ other.item[6] = self.item[0];
break;
case 8:
- if (other.inventory8 == ITEM_SEQ_HANDS)
- other.inventory8 =
- self.inventory1;
+ if (other.item[7] == ITEM_SEQ_HANDS)
+ other.item[7] = self.item[0];
break;
default:
dprint (sprintf("item_backpack_touch: "
"unknown slot for item index "
- "%d!\n", self.inventory1));
+ "%d!\n", self.item[0]));
break;
}
}
@@ -246,7 +245,7 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
// include self.netname if an item is stored in
// inventory slot 1 -- CEV
- if (self.inventory1)
+ if (self.item[0])
{
s = sprintf ("%s the %s", s, self.netname);
acount += 1;
@@ -272,7 +271,8 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
sprint (other, s);
// backpack touch sound
- sound (other, CHAN_ITEM, self.noise, VOL_HIGH, ATTN_NORM);
+ local item_info_t iit = item_info[self.weapon];
+ SOUND (other, iit.pickup_sound)
// flash, bound ammo, & update CSQC clients -- CEV
if (other.classtype == CT_PLAYER)
@@ -337,12 +337,17 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
if (item_index >= ITEM_SEQ_W_START &&
item_index <= ITEM_SEQ_W_END)
{
- e.inventory1 = item_index;
+ e.item[0] = item_index;
}
}
// now we're clear to init the backpack -- CEV
item_backpack_init (e);
+
+ // clear owner (so player traces can hit this ent) -- CEV
+ if (e.owner)
+ e.owner = world;
+
return e;
};
#endif
@@ -351,12 +356,24 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
//--------------------------------------------------------------
void(entity e) item_backpack_init =
{
- e.classname = "item_backpack";
- e.classtype = CT_ITEM_BACKPACK;
+ #ifdef SSQC
+ if (!e.weapon)
+ {
+ if (e.spawnflags & SPAWNFLAG_ITEM_BACKPACK_DROPPED)
+ e.weapon = ITEM_SEQ_BACKPACK;
+ else
+ e.weapon = ITEM_SEQ_PD3BACKPACK;
+ }
+ #endif
+
+ local item_info_t iit = item_info[e.weapon];
+
+ e.flags |= FL_ITEM | FL_FINDABLE_NONSOLID;
#ifdef SSQC
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
e.touch = item_backpack_touch;
- e.flags = FL_ITEM;
e.solid = SOLID_TRIGGER;
e.movetype = MOVETYPE_TOSS;
@@ -391,41 +408,34 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
if (!e.ammo_cells)
e.ammo_cells = 3;
- if (e.spawnflags & SPAWNFLAG_ITEM_BACKPACK_DROPPED)
- e.weapon = ITEM_SEQ_BACKPACK;
- else
- e.weapon = ITEM_SEQ_PD3BACKPACK;
-
- if (e.inventory1) {
+ if (e.item[0]) {
if (!e.netname || e.netname == "")
{
- if (e.inventory1 == ITEM_SEQ_AXE)
+ if (e.item[0] == ITEM_SEQ_AXE)
e.netname = "Axe";
- else if (e.inventory1 == ITEM_SEQ_SHOTGUN)
+ else if (e.item[0] == ITEM_SEQ_SHOTGUN)
e.netname = "Shotgun";
- else if (e.inventory1 == ITEM_SEQ_SUPERSHOTGUN)
+ else if (e.item[0] == ITEM_SEQ_SUPERSHOTGUN)
e.netname = "Double-barrelled Shotgun";
- else if (e.inventory1 == ITEM_SEQ_NAILGUN)
+ else if (e.item[0] == ITEM_SEQ_NAILGUN)
e.netname = "Nailgun";
- else if (e.inventory1 == ITEM_SEQ_SUPERNAILGUN)
+ else if (e.item[0] == ITEM_SEQ_SUPERNAILGUN)
e.netname = "Super Nailgun";
- else if (e.inventory1 == ITEM_SEQ_GRENADELAUNCHER)
+ else if (e.item[0] == ITEM_SEQ_GRENADELAUNCHER)
e.netname = "Grenade Launcher";
- else if (e.inventory1 == ITEM_SEQ_ROCKETLAUNCHER)
+ else if (e.item[0] == ITEM_SEQ_ROCKETLAUNCHER)
e.netname = "Rocket Launcher";
- else if (e.inventory1 == ITEM_SEQ_LIGHTNINGGUN)
+ else if (e.item[0] == ITEM_SEQ_LIGHTNINGGUN)
e.netname = "Thunderbolt";
else
e.netname = "";
} }
#endif
- local item_info_t item = item_info[e.weapon];
-
#ifdef SSQC
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
#endif
#ifdef CSQC
@@ -433,14 +443,16 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
e.modelflags |= MF_ROTATE;
#endif
- e.noise = item.pickup_sound;
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
+ if (!e.frame && iit.world_frame)
+ e.frame = iit.world_frame;
+
+ if (!e.skin && iit.world_skin)
+ e.skin = iit.world_skin;
// StartItem
#ifdef CSQC
- setsize (e, e.pos1, e.pos2);
+ setsize (e, iit.world_mins, iit.world_maxs);
base_item_init (e);
#endif
@@ -449,13 +461,12 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
{
// don't delay, spawn immediately -- CEV
e.classgroup |= CG_ITEM;
- setsize (e, e.pos1, e.pos2);
+ setsize (e, iit.world_mins, iit.world_maxs);
if (!(e.alpha))
e.alpha = ITEM_ALPHA_OPAQUE;
e.flags |= FL_FINDABLE_NONSOLID;
- e.mdl = e.model;
e.tick = base_item_neteval;
e.classgroup |= CG_FRAMETICK;
@@ -468,7 +479,7 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
}
else
{
- setsize (e, e.pos1, e.pos2);
+ setsize (e, iit.world_mins, iit.world_maxs);
base_item_init (e);
}
#endif
@@ -484,5 +495,5 @@ e.g. For 'You got a bunch of rockets!' the netname key would be
item_backpack_init (self);
};
-// };
#endif
+// };
Return to the top of this page or return to the overview of this repo.
Diff qc/items/gore.qc
diff --git a/qc/items/gore.qc b/qc/items/gore.qc
deleted file mode 100644
index 7648401..0000000
--- a/qc/items/gore.qc
+++ /dev/null
@@ -1,1453 +0,0 @@
-//==============================================================================
-// items/gore.qc -- corpses, gibs, heads. the meaty bits. -- CEV
-//==============================================================================
-
-//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-// Scenic Dead Monster Patch stuff here from DeadStuff mod -- dumptruck_ds
-//
-// deadstuff version 1.0 - tony collen - manero@canweb.net -
-// EfNet IRC #QuakeEd or #Trinity
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-//======================================================================
-// constants
-//======================================================================
-
-#ifdef SSQC
-//----------------------------------------------------------------------
-// base_item_gib spawnflags -- CEV
-//----------------------------------------------------------------------
-typedef enumflags
-{
- SPAWNFLAG_ITEM_GIB_SOLID = 1 // spawnflags: solid
- // SPAWNFLAG_ITEM_SPAWNSILENT = 32, // see base_item.qc -- CEV
- // SPAWNFLAG_ITEM_SPAWNED = 64, // see base_item.qc -- CEV
- // SPAWNFLAG_ITEM_SUSPENDED = 128, // see base_item.qc -- CEV
- // SPAWNFLAG_NOT_ON_EASY = 256, // see base_entities.qc -- CEV
- // SPAWNFLAG_NOT_ON_NORMAL = 512,
- // SPAWNFLAG_NOT_ON_HARD_OR_NIGHTMARE = 1024,
- // SPAWNFLAG_NOT_IN_DEATHMATCH = 2048,
- // SPAWNFLAG_NOT_IN_COOP = 4096,
- // SPAWNFLAG_NOT_IN_SP = 8192,
- // SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
- // SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
- // SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
- // SPAWNFLAG_ITEM_RESPAWN = 2097152, // see base_item.qc -- CEV
- // SPAWNFLAG_ITEM_THROWN = 4194304, // see base_item.qc -- CEV
- // SPAWNFLAG_ITEM_DONTDROP = 8388608 // see base_item.qc -- CEV
-} base_item_gib_spawnflags;
-#endif
-
-#ifdef SSQC
-const float DEBRISQUE_COUNT_MAX = 50; // max number of gibs at one time
-
-const float GIB1_DAMAGE = 5; // small gib damage when thrown
-const float GIB2_DAMAGE = 15; // large gib damage when thrown
-const float GIB3_DAMAGE = 10; // med. (slice-like) gib damage
-
-// TODO CEV
-const string GIB_SOUND_FIRE = "items/damage.wav";
-#endif
-
-#if defined(CSQC) || defined(SSQC)
-// gib & head sizes; values from progs_dump 3 -- CEV
-const vector GIB1_MINS = '-3.57 -8.06 -3.34';
-const vector GIB1_MAXS = '3.69 8.31 30';
-const vector GIB2_MINS = '-12.68 -14.83 -6.19';
-const vector GIB2_MAXS = '13.53 14.57 30';
-const vector GIB3_MINS = '-18.95 -15.92 -3.13';
-const vector GIB3_MAXS = '13.17 15.66 30';
-const vector DEMON1_HEAD_MINS = '-13.64 -16.77 -0.11';
-const vector DEMON1_HEAD_MAXS = '17.44 16.22 30';
-const vector DOG_HEAD_MINS = '-9.66 -11.89 -0.2';
-const vector DOG_HEAD_MAXS = '6.57 7.96 13.29';
-const vector ENFORCER_HEAD_MINS = '-10.63 -10.23 -0.05';
-const vector ENFORCER_HEAD_MAXS = '9.27 8.25 30';
-const vector HELL_KNIGHT_HEAD_MINS = '-7.9 -12.97 -0.63';
-const vector HELL_KNIGHT_HEAD_MAXS = '10.55 8.87 21.06';
-const vector KNIGHT_HEAD_MINS = '-8.17 -7.47 -0.13';
-const vector KNIGHT_HEAD_MAXS = '8.36 6.5 30';
-const vector OGRE_HEAD_MINS = '-12.35 -15.7 -0.17';
-const vector OGRE_HEAD_MAXS = '10.67 13.88 30';
-const vector PLAYER_HEAD_MINS = '-9.67 -12.38 -2.1';
-const vector PLAYER_HEAD_MAXS = '11.49 50.7 30';
-const vector SHALRATH_HEAD_MINS = '-19.85 -19.09 -1.44';
-const vector SHALRATH_HEAD_MAXS = '13.72 16.8 30';
-const vector SHAMBLER_HEAD_MINS = '-15.15 -20.638 -0.45';
-const vector SHAMBLER_HEAD_MAXS = '21.44 21.76 30';
-const vector ARMY_HEAD_MINS = '-9.67 -8.27 -0.28';
-const vector ARMY_HEAD_MAXS = '4.05 4.8 13.41';
-const vector WIZARD_HEAD_MINS = '-10.41 -8.66 -0.54';
-const vector WIZARD_HEAD_MAXS = '6.52 10.82 30';
-const vector ZOMBIE_HEAD_MINS = '-16 -16 0'; // not exact size -- CEV
-const vector ZOMBIE_HEAD_MAXS = '16 16 56';
-#endif
-
-//======================================================================
-// forward declarations
-//======================================================================
-
-#ifdef SSQC
-void(vector org, vector vel, float damage) spawn_blood;
-void(float damage) spawn_touchblood;
-void(vector org, vector vel) spawn_chunk;
-entity(vector org, vector vel) spawn_meatspray;
-vector(vector dir, float dmg) velocity_for_damage;
-#endif
-
-// base_item_gib
-#ifdef CSQC
-void(float isnew, void(entity) initfn) base_item_gib_netreceive;
-#endif
-#ifdef SSQC
-// BASE_ITEM_GIB_THROW(spawnfunc)
-void(entity grabber, entity gib) base_item_gib_grab;
-void(entity attacker, float item_index) base_item_gib_fire;
-void() base_item_gib_touch;
-entity(entity src, vector org, vector vel, float fl, void(entity) initfn)
- spawn_base_item_gib;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) base_item_gib_init;
-#endif
-#ifdef SSQC
-strip void() base_item_gib;
-#endif
-
-// item_gib1
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_gib1_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_gib1;
-void() item_gib1;
-#endif
-
-// item_gib2
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_gib2_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_gib2;
-void() item_gib2;
-#endif
-
-// item_gib3
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_gib3_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_gib3;
-void() item_gib3;
-#endif
-
-// item_head_demon
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_demon_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_demon;
-void() item_head_demon;
-#endif
-
-// item_head_dog
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_dog_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_dog;
-void() item_head_dog;
-#endif
-
-// item_head_enforcer
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_enforcer_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_enforcer;
-void() item_head_enforcer;
-#endif
-
-// item_head_hell_knight
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_hell_knight_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_hell_knight;
-void() item_head_hell_knight;
-#endif
-
-// item_head_knight
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_knight_init
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_knight;
-void() item_head_knight;
-#endif
-
-// item_head_ogre
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_ogre_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_ogre;
-void() item_head_ogre;
-#endif
-
-// item_head_player
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_player_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_player;
-void() item_head_player;
-#endif
-
-// item_head_shalrath
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_shalrath_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_shalrath;
-void() item_head_shalrath;
-#endif
-
-// item_head_shambler
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_shambler_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_shambler;
-void() item_head_shambler;
-#endif
-
-// item_head_army
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_army_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_army;
-void() item_head_army;
-#endif
-
-// item_head_wizard
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_wizard_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_wizard;
-void() item_head_wizard;
-#endif
-
-// item_head_zombie
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_head_zombie_init;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_head_zombie;
-void() item_head_zombie;
-#endif
-
-#ifdef SSQC
-//----------------------------------------------------------------------
-// original progs_dump 3 / DeadStuff entities -- CEV
-//----------------------------------------------------------------------
-void() gib_misc_1 = { item_gib1 (); };
-void() gib_misc_2 = { item_gib2 (); };
-void() gib_misc_3 = { item_gib3 (); };
-void() gib_head_demon = { item_head_demon (); };
-void() gib_head_dog = { item_head_dog (); };
-void() gib_head_enforcer = { item_head_enforcer (); };
-void() gib_head_hell_knight = { item_head_hell_knight (); };
-void() gib_head_knight = { item_head_knight (); };
-void() gib_head_ogre = { item_head_ogre (); };
-void() gib_head_player = { item_head_player (); };
-void() gib_head_shalrath = { item_head_shalrath (); };
-void() gib_head_shambler = { item_head_shambler (); };
-void() gib_head_army = { item_head_army (); };
-void() gib_head_wizard = { item_head_wizard (); };
-void() gib_head_zombie = { item_head_zombie (); };
-#endif
-
-//------------------------------------------------------------------------------
-
-//----------------------------------------------------------------------
-// misc. functions
-//----------------------------------------------------------------------
-
-#ifdef SSQC
-//----------------------------------------------------------------------
-// SpawnBlood
-//----------------------------------------------------------------------
-void(vector org, vector vel, float damage) spawn_blood =
-{
- particle (org, vel * 0.1, 73, damage * 2);
-};
-
-//----------------------------------------------------------------------
-// spawn_touchblood
-//----------------------------------------------------------------------
-void(float damage) spawn_touchblood =
-{
- // wall_velocity
- local vector vel;
-
- vel = normalize (self.velocity);
- vel = normalize (vel + v_up * (random() - 0.5) +
- v_right * (random() - 0.5));
- // TODO CEV when was the last time a trace was called?
- vel = vel + 2 * trace_plane_normal;
- vel = (vel * 200) * 0.2;
-
- spawn_blood (self.origin + vel * 0.01, vel, damage);
-};
-
-//----------------------------------------------------------------------
-// SpawnChunk
-//----------------------------------------------------------------------
-void(vector org, vector vel) spawn_chunk =
-{
- particle (org, vel * 0.02, 0, 10);
-};
-
-//----------------------------------------------------------------------
-// SpawnMeatSpray
-//----------------------------------------------------------------------
-entity(vector org, vector vel) spawn_meatspray =
-{
- // reusing the "zombiechunk" projectile -- CEV
- local entity e = spawn_projectile_zombiechunk (self, org, vel);
- // override some defaults, notably solid and force damage to 0 -- CEV
- e.solid = SOLID_NOT;
- e.direct_damage = 0;
- e.velocity_z += 250 + 50 * random ();
- e.nextthink = time + 1;
- return e;
-};
-
-//----------------------------------------------------------------------
-vector(vector dir, float dmg) velocity_for_damage =
-{
- // uncomment if needed for the debug print below -- CEV
- // local vector startdir = dir;
-
- // next three lines original id1 behavior -- CEV
- local vector v;
- v_x = 100 * crandom ();
- v_y = 100 * crandom ();
- v_z = 200 + 100 * random ();
- // damage response scaling from Alkaline, presumably by bmFbr -- CEV
- v *= max (1, min(10, dmg * dmg / 5000));
-
- if (dir != '0 0 0')
- {
- // directional gib behavior from Alkaline (which appears to
- // be by bmFbr according to the commit log, see Alkaline
- // commit 083f87c18a2d2be645ba197c1f23fc6533afca81).
- // dir is set by killed () and is already normalized -- CEV
- dir *= bound (10, dmg * dmg / 22, 800);
- dir_x *= 2.5;
- dir_y *= 2.5;
- dir_z *= 0.7;
- v += dir;
- }
-
- // velocity limiting code again from Alkaline and written by bmFbr.
- // I'm leaning on Alkaline here and above because the implementation
- // I came up with was way worse. -- CEV
- local float vspeed = vlen (v);
- if (vspeed > 500)
- v *= 500 / vspeed;
- v_z = min (500, v_z);
-
- #if 0
- dprint (sprintf("velocity_for_damage: damage is %g, startdir is %v, "
- "v is %v\n", dmg, startdir, v));
- #endif
-
- return v;
-};
-#endif
-
-//----------------------------------------------------------------------
-// base_item_gib
-//----------------------------------------------------------------------
-
-//----------------------------------------------------------------------
-// class base_item_gib: base_item
-// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew, void(entity) initfn) base_item_gib_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (initfn)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- // was self.origin + '0 0 24' -- CEV
- //--------------------------------------------------------------
- #define BASE_ITEM_GIB_THROW(d, h, func) \
- { \
- spawn_base_item_gib (self, self.origin, \
- velocity_for_damage(d, h), \
- SPAWNFLAG_ITEM_THROWN, func); \
- }
-
- //--------------------------------------------------------------
- void(entity grabber, entity gib) base_item_gib_grab =
- {
- BASE_ITEM_INVENTORY_ADD (gib, grabber)
-
- // don't re-grab / immediately throw the item -- CEV
- if (grabber.button6)
- grabber.flags |= FL_THROW_HELD;
-
- // let the player know -- CEV
- sprint (grabber, sprintf("%s grabbed a %s\n",
- grabber.netname, gib.netname));
-
- // let CSQC know -- CEV
- if (grabber.classtype == CT_PLAYER && grabber.SendEntity)
- grabber.SendFlags |= NETFLAG_PLAYER_WEAPON;
-
- // remove the gib from the queue before firing targets -- CEV
- base_entity_que_rem (gib, QUE_TYPE_DEBRIS);
-
- // fire all targets / killtargets (unlikely to be used) -- CEV
- local entity stemp = self;
- local entity otemp = grabber;
- other = grabber;
- self = gib;
- activator = grabber;
- sub_usetargets ();
- self = stemp;
- other = otemp;
-
- // gibs won't respawn so we're clear to remove here -- CEV
- if (gib)
- {
- gib.model = __NULL__;
- setmodel (gib, gib.model);
- gib.solid = SOLID_NOT;
- gib.touch = sub_null;
- gib.think = sub_remove;
- gib.nextthink = time + 0.2;
-
- gib.SendFlags |= NETFLAG_BASE_ENTITY_MODEL |
- NETFLAG_BASE_ENTITY_SOLID;
- }
- };
-
- //--------------------------------------------------------------
- // player has pressed +attack while holding a gib -- CEV
- //--------------------------------------------------------------
- void(entity attacker, float item_index) base_item_gib_fire =
- {
- // play a sound then delay next attack -- CEV
- sound (attacker, CHAN_ITEM, GIB_SOUND_FIRE, VOL_MHI, ATTN_NORM);
- attacker.attack_finished = time + 0.5;
- };
-
- //--------------------------------------------------------------
- // Inspired by Ivana Gibson's kickable gibs [1] and similar
- // functions found in other mods (Scarlet, etc) -- CEV
- // [1]: https://www.insideqc.com/qctut/lesson-52.shtml
- //
- // gib_touch runs much more often than other item touch funcs
- // (mainly due to touching world); concessions have been made
- // so it doesn't eat too much time -- CEV
- //--------------------------------------------------------------
- void() base_item_gib_touch =
- {
- setorigin (self, self.origin);
-
- self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN |
- NETFLAG_BASE_ENTITY_ANGLES;
-
- // only run if touched by a player or monster -- CEV
- if (other.classtype != CT_PLAYER)
- if (!(other.classgroup & CG_MONSTER))
- return;
-
- // check touch_projectile & return early if in motion -- CEV
- if (self.velocity)
- {
- // thrown item check -- CEV
- base_item_touch_projectile ();
- return;
- }
-
- // only run if other is moving fast enough to disturb
- // stationary objects -- CEV
- if (other.classtype == CT_PLAYER)
- if (other.speed < 200)
- return;
-
- // push self horizontally according to other's direction and
- // speed, maximum of 160ups -- CEV
- base_entity_push (self, other, PM_MAXSPEED * 0.5);
-
- if (self.avelocity_y == 0)
- // a little spin, as a treat. Rotating in the other
- // axes seem to cause gibs to move into the floor -- CEV
- self.avelocity_y = 100 * crandom ();
- };
-
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl,
- void(entity) initfn) spawn_base_item_gib =
- {
- local entity e = spawn ();
- e.owner = src;
- e.spawnflags = fl;
- e.origin = org;
- e.velocity = vel;
- initfn (e);
-
- // thrown from a gibbed enemy -- CEV
- if (fl & SPAWNFLAG_ITEM_THROWN) {
- if (src.health < 0)
- {
- // special handling for heads -- CEV
- if (e.weapon >= ITEM_SEQ_HEAD_START &&
- e.weapon <= ITEM_SEQ_HEAD_END)
- {
- // -24 due to offset from BASE_ITEM_GIB_THROW
- // then an addition -24 -- CEV
- /*
- if (!(src.classgroup & CG_CORPSE))
- e.origin_z -= 48;
- */
- if (!e.avelocity)
- e.avelocity = crandom() * '0 600 0';
- }
- else
- {
- e.avelocity_x = random() * 600;
- e.avelocity_y = random() * 600;
- e.avelocity_z = random() * 600;
- }
- } }
-
- // register this entity in the gib queue -- CEV
- local entity rem = base_entity_que_add (e, QUE_TYPE_DEBRIS);
- if (rem)
- {
- // a gib was removed from the queue; schedule it for
- // removal for real -- CEV
- rem.alpha = 1.0;
- rem.think = sub_remove_fade;
- rem.nextthink = time + 2 + random() * 10;
- }
-
- return e;
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- // gibs don't call base_item_init, they get special treatment -- CEV
- //--------------------------------------------------------------
- void(entity e) base_item_gib_init =
- {
- #ifdef SSQC
- if (e.flags & FL_CLIENT)
- dprint (sprintf("base_item_gib_init: found FL_CLIENT"
- ", classtype %s\n", e.classname));
-
- if (!(e.flags & FL_CLIENT))
- if (!(e.spawnflags & SPAWNFLAG_ITEM_THROWN))
- base_mapentity_init (e);
- #endif
-
- #ifdef CSQC
- base_mapentity_init (e);
- #endif
-
- // both a (part of a) corpse and an item -- CEV
- e.classgroup |= CG_CORPSE | CG_ITEM;
-
- local item_info_t item = item_info[e.weapon];
-
- #ifdef SSQC
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
-
- // TODO CEV
- precache_sound ("items/damage.wav");
- #endif
-
- #ifdef CSQC
- setmodelindex (e, e.modelindex);
- #endif
-
- e.noise = item.pickup_sound;
-
- // guarantee size -- CEV
- if (!e.pos1 && !e.pos2)
- {
- e.pos1 = '0 0 0';
- e.pos2 = '32 32 56';
- }
-
- if (!(e.flags & FL_CLIENT))
- // let's not change the player name lol -- CEV
- e.netname = item.name;
-
- #ifdef CSQC
- e.drawmask = DRAWMASK_NORMAL;
- e.predraw = base_item_predraw;
- #endif
-
- #ifdef SSQC
- // in case we're converting an existing entity -- CEV
- // clear potential leftover flags -- CEV
- if (e.flags & FL_MONSTER)
- e.flags &= ~FL_MONSTER;
-
- if (e.flags & FL_FLY)
- e.flags &= ~FL_FLY;
-
- if (e.flags & FL_SWIM)
- e.flags &= ~FL_SWIM;
-
- // make sure destroy func is inactive -- CEV
- if (e.destroy)
- e.destroy = sub_nulldestroy;
-
- // make sure we won't take damage -- CEV
- e.takedamage = DAMAGE_NO;
-
- // so we can be picked up -- CEV
- e.flags |= FL_FINDABLE_NONSOLID;
-
- if (e.spawnflags & SPAWNFLAG_ITEM_THROWN)
- if (e.flags & FL_CLIENT)
- e.flags &= ~FL_ONGROUND;
-
- if (e.spawnflags & SPAWNFLAG_ITEM_GIB_SOLID)
- {
- // explicitly flagged as solid -- CEV
- e.solid = SOLID_BBOX;
- }
- else if (e.spawnflags & SPAWNFLAG_ITEM_THROWN)
- {
- // thrown (as-in ThrowGib) -- CEV
- if (e.owner && e.owner.classtype == CT_PLAYER)
- {
- e.solid = SOLID_SLIDEBOX;
- e.think = base_item_think_throwgroundcheck;
- e.nextthink = time + 0.1;
- }
- else
- {
- e.solid = SOLID_TRIGGER;
- }
- }
- else
- {
- // otherwise spawn nonsolid -- CEV
- e.solid = SOLID_NOT;
- }
-
- if (self.spawnflags & SPAWNFLAG_ITEM_SUSPENDED)
- {
- // suspended so FLY and no touch displacement -- CEV
- e.movetype = MOVETYPE_FLY;
- e.touch = sub_null;
- }
- else
- {
- // otherwise bounce & displacement (KickGib) -- CEV
- e.movetype = MOVETYPE_BOUNCE;
- e.touch = base_item_gib_touch;
- }
-
- // TODO CEV
- e.angles.y = e.owner.angles.y + item.view_angles_offset.y;
-
- // send this entity to CSQC -- CEV
- e.classgroup |= CG_FRAMETICK;
- e.SendEntity = base_entity_netsend;
- e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
- e.tick = base_item_neteval;
- #endif
-
- // now set bounding box if we're solid -- CEV
- if (e.solid)
- setsize (e, e.pos1, e.pos2);
- else
- setsize (e, '0 0 0', '0 0 0');
-
- setorigin (e, e.origin);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- strip void() base_item_gib =
- {
- base_item_gib_init (self);
- };
-#endif
-// };
-
-//----------------------------------------------------------------------
-// individual gibs
-//----------------------------------------------------------------------
-
-/*QUAKED item_gib1 (0 0.5 0.8) (-8 -8 -8) (8 8 8) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/gib1.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_gib1: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_gib1_init =
- {
- e.classname = "item_gib1";
- e.classtype = CT_ITEM_GIB1;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_GIB1;
- e.dmg = GIB1_DAMAGE;
- e.frame = 0;
- #endif
-
- e.pos1 = GIB1_MINS;
- e.pos2 = GIB1_MAXS;
-
- // this will set e.solid
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_gib1 =
- {
- return spawn_base_item_gib (src, org, vel, fl, item_gib1_init);
- };
-
- //--------------------------------------------------------------
- void() item_gib1 =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (__NULL__)
-
- item_gib1_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_gib2 (0 0.5 0.8) (-8 -8 -8) (8 8 8) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/gib2.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_gib2: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_gib2_init =
- {
- e.classname = "item_gib2";
- e.classtype = CT_ITEM_GIB2;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_GIB2;
- e.dmg = GIB2_DAMAGE;
- e.frame = 0;
- #endif
-
- e.pos1 = GIB2_MINS;
- e.pos2 = GIB2_MAXS;
-
- // this will set e.solid
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_gib2 =
- {
- return spawn_base_item_gib (src, org, vel, fl, item_gib2_init);
- };
-
- //--------------------------------------------------------------
- void() item_gib2 =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (__NULL__)
-
- item_gib2_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_gib3 (0 0.5 0.8) (-8 -8 -8) (8 8 8) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/gib3.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_gib3: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_gib3_init =
- {
- e.classname = "item_gib3";
- e.classtype = CT_ITEM_GIB3;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_GIB3;
- e.dmg = GIB3_DAMAGE;
- e.frame = 0;
- #endif
-
- e.pos1 = GIB3_MINS;
- e.pos2 = GIB3_MAXS;
-
- // this will set e.solid
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_item_gib3 =
- {
- return spawn_base_item_gib (src, org, vel, fl, item_gib3_init);
- };
-
- //--------------------------------------------------------------
- void() item_gib3 =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (__NULL__)
-
- item_gib3_init (self);
- };
-#endif
-// };
-
-//----------------------------------------------------------------------
-// heads
-//----------------------------------------------------------------------
-
-/*QUAKED item_head_demon (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_demon.mdl");
-}
-*/
-//----------------------------------------------------------------------
-// class item_head_demon: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_demon_init =
- {
- e.classname = "item_head_demon";
- e.classtype = CT_ITEM_HEAD_DEMON;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_DEMON;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = DEMON1_HEAD_MINS;
- e.pos2 = DEMON1_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_demon =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_demon_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_demon =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_demon_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_dog (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_dog.mdl");
-}
-*/
-//----------------------------------------------------------------------
-// class item_head_dog: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_dog_init =
- {
- e.classname = "item_head_dog";
- e.classtype = CT_ITEM_HEAD_DOG;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_DOG;
- // was 1 -- dumptruck_ds
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = DOG_HEAD_MINS;
- e.pos2 = DOG_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_dog =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_dog_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_dog =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_dog_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_enforcer (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_mega.mdl");
-}
-*/
-//----------------------------------------------------------------------
-// class item_head_enforcer: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_enforcer_init =
- {
- e.classname = "item_head_enforcer";
- e.classtype = CT_ITEM_HEAD_ENFORCER;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_ENFORCER;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = ENFORCER_HEAD_MINS;
- e.pos2 = ENFORCER_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_enforcer =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_enforcer_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_enforcer =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_enforcer_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_hell_knight (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_hellkn.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_head_hell_knight: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_hell_knight_init =
- {
- e.classname = "item_head_hellknight";
- e.classtype = CT_ITEM_HEAD_HELLKNIGHT;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_HELLKNIGHT;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = HELL_KNIGHT_HEAD_MINS;
- e.pos2 = HELL_KNIGHT_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_hell_knight =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_hell_knight_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_hell_knight =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_hell_knight_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_knight (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_knight.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_head_knight: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_knight_init =
- {
- e.classname = "item_head_knight";
- e.classtype = CT_ITEM_HEAD_KNIGHT;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_KNIGHT;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = KNIGHT_HEAD_MINS;
- e.pos2 = KNIGHT_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_knight =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_knight_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_knight =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_knight_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_ogre (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_ogre.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_head_ogre: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_ogre_init =
- {
- e.classname = "item_head_ogre";
- e.classtype = CT_ITEM_HEAD_OGRE;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_OGRE;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = OGRE_HEAD_MINS;
- e.pos2 = OGRE_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_ogre =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_ogre_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_ogre =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_ogre_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_player (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_player.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_head_player: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_player_init =
- {
- // don't reset class if passed a client entity -- CEV
- if (!(e.flags & FL_CLIENT))
- {
- e.classname = "item_head_player";
- e.classtype = CT_ITEM_HEAD_PLAYER;
- }
-
- #ifdef SSQC
- // TODO CEV let's hope this behaves
- e.weapon = ITEM_SEQ_HEAD_PLAYER;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = PLAYER_HEAD_MINS;
- e.pos2 = PLAYER_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
-
- #ifdef SSQC
- if (e.SendEntity)
- {
- e.SendFlags |= NETFLAG_PLAYER_MODEL |
- NETFLAG_PLAYER_SOLID | NETFLAG_PLAYER_SIZE;
- }
- #endif
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_player =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_player_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_player =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_player_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_shalrath (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_shal.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_head_shalrath: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_shalrath_init =
- {
- e.classname = "item_head_shalrath";
- e.classtype = CT_ITEM_HEAD_SHALRATH;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_SHALRATH;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = SHALRATH_HEAD_MINS;
- e.pos2 = SHALRATH_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_shalrath =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_shalrath_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_shalrath =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_shalrath_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_shambler (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_shams.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_head_shambler: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_shambler_init =
- {
- e.classname = "item_head_shambler";
- e.classtype = CT_ITEM_HEAD_SHAMBLER;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_SHAMBLER;
- // was 1, caused an error -- dumptruck_ds
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = SHAMBLER_HEAD_MINS;
- e.pos2 = SHAMBLER_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_shambler =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_shambler_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_shambler =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_shambler_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_army (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_guard.mdl");
-}
-*/
-//----------------------------------------------------------------------
-// class item_head_army: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_army_init =
- {
- e.classname = "item_head_army";
- e.classtype = CT_ITEM_HEAD_ARMY;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_ARMY;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = ARMY_HEAD_MINS;
- e.pos2 = ARMY_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_army =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_army_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_army =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_army_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_wizard (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_wizard.mdl");
-}*/
-//----------------------------------------------------------------------
-// class item_head_wizard: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_wizard_init =
- {
- e.classname = "item_head_wizard";
- e.classtype = CT_ITEM_HEAD_WIZARD;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_WIZARD;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = WIZARD_HEAD_MINS;
- e.pos2 = WIZARD_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_wizard =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_wizard_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_wizard =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_wizard_init (self);
- };
-#endif
-// };
-
-/*QUAKED item_head_zombie (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
-{
-model ("progs/h_zombie.mdl");
-}
-*/
-//----------------------------------------------------------------------
-// class item_head_zombie: base_item_gib
-// {
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_head_zombie_init =
- {
- e.classname = "item_head_zombie";
- e.classtype = CT_ITEM_HEAD_ZOMBIE;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEAD_ZOMBIE;
- e.frame = 0;
- e.view_ofs = '0 0 8';
- #endif
-
- e.pos1 = ZOMBIE_HEAD_MINS;
- e.pos2 = ZOMBIE_HEAD_MAXS;
-
- // gib_init interprets spawnflags and will set .solid -- CEV
- base_item_gib_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_head_zombie =
- {
- return spawn_base_item_gib (src, org, vel, fl,
- item_head_zombie_init);
- };
-
- //--------------------------------------------------------------
- void() item_head_zombie =
- {
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
- item_head_zombie_init (self);
- };
-#endif
-// };
Return to the top of this page or return to the overview of this repo.
Diff qc/items/health.qc
diff --git a/qc/items/health.qc b/qc/items/health.qc
index 0fafb1a..45063a0 100644
--- a/qc/items/health.qc
+++ b/qc/items/health.qc
@@ -34,10 +34,6 @@ typedef enumflags
#endif
#ifdef SSQC
-const float HEALTH_DAMAGE_SMALL = 10; // damage a small box deals when thrown
-const float HEALTH_DAMAGE_LARGE = 15; // same, but for large boxes (mega)
-const float HEALTH_DAMAGE_VIAL = 5; // same, but for health vials
-
// constants amounts & respawn times
const float HEALTH_ROTTEN_AMOUNT = 15; // rotten heal amount; id1 15
const float HEALTH_NORMAL_AMOUNT = 25; // standard heal amount; id1 25
@@ -58,6 +54,12 @@ float (entity e, float healamount, float ignore) T_Heal;
#endif
// base_item_health
+#ifdef CSQC
+void(float isnew) base_item_health_netreceive;
+#endif
+#ifdef SSQC
+entity(entity src) item_health_vial_drop; // TODO CEV
+#endif
#ifdef SSQC
// BASE_ITEM_HEALTH_RESPAWNDM(health_item)
float(entity toucher, float item_index) base_item_health_addhealth;
@@ -73,32 +75,11 @@ void(entity e) base_item_health_init;
strip void() base_item_health;
#endif
-// item_health
-#ifdef CSQC
-void(float isnew) item_health_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_item_health;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_health_init;
-#endif
#ifdef SSQC
+//----------------------------------------------------------------------
+// original id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
void() item_health;
-#endif
-
-// item_health_vial
-#ifdef CSQC
-void(float isnew) item_health_vial_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src) item_health_vial_drop;
-entity(entity src, vector org, vector vel, float fl) spawn_item_health_vial;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_health_vial_init;
-#endif
-#ifdef SSQC
void() item_health_vial;
#endif
@@ -130,6 +111,34 @@ float (entity e, float healamount, float ignore) T_Heal =
//----------------------------------------------------------------------
// class base_item_health: base_item
// {
+#ifdef CSQC
+ //--------------------------------------------------------------
+ void(float isnew) base_item_health_netreceive =
+ {
+ // creates a number of variables, including netflags -- CEV
+ BASE_ITEM_NETRECEIVE (base_item_health_init)
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ // TODO CEV
+ //--------------------------------------------------------------
+ entity(entity src) item_health_vial_drop =
+ {
+ local vector vel;
+ vel_x = -100 + (random() * 200);
+ vel_y = -100 + (random() * 200);
+ vel_z = 300;
+ local entity oself = self;
+ self = src;
+ local entity e = spawn_base_item (ITEM_SEQ_HEALTH_VIAL,
+ src.origin - '0 0 24', vel, SPAWNFLAG_ITEM_THROWN);
+ self = oself;
+ return e;
+ };
+#endif
+
#ifdef SSQC
//--------------------------------------------------------------
#define BASE_ITEM_HEALTH_RESPAWNDM(health_item) \
@@ -198,9 +207,8 @@ float (entity e, float healamount, float ignore) T_Heal =
sprint (toucher, sprintf("%s receives %g health!\n",
toucher.netname, amount));
- local item_info_t item = item_info[item_index];
- sound (toucher, CHAN_ITEM_HEALTH, item.pickup_sound,
- item.pickup_vol, ATTN_NORM);
+ local item_info_t iit = item_info[item_index];
+ SOUND (toucher, iit.pickup_sound)
stuffcmd (toucher, "bf\n");
@@ -218,7 +226,7 @@ float (entity e, float healamount, float ignore) T_Heal =
grabber.netname, box.netname));
// don't re-grab / immediately throw the item -- CEV
- if (grabber.button6)
+ if (grabber.button4)
grabber.flags |= FL_THROW_HELD;
if (grabber.classtype == CT_PLAYER && grabber.SendEntity)
@@ -275,14 +283,13 @@ float (entity e, float healamount, float ignore) T_Heal =
BASE_ENTITY_WEAPONLOOKUP (other)
if (item_index < ITEM_SEQ_W_START||item_index > ITEM_SEQ_W_END)
{
- if (item_index == ITEM_SEQ_HANDS && other.button6 &&
- !(other.flags & FL_THROW_HELD))
+ if (item_index == ITEM_SEQ_HANDS && other.button4)
{
// self.attack_finished = time + 0.5;
base_item_health_grab (other, self);
return;
}
- else
+ else if (!other.button0)
{
return;
}
@@ -314,29 +321,54 @@ float (entity e, float healamount, float ignore) T_Heal =
//--------------------------------------------------------------
void(entity e) base_item_health_init =
{
- e.classgroup |= CG_ITEM_HEALTH;
+ local item_info_t iit = item_info[e.weapon];
- local item_info_t item = item_info[e.weapon];
+ e.classgroup |= CG_ITEM_HEALTH;
+ e.netname = iit.name;
#ifdef SSQC
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
e.touch = base_item_health_touch;
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
+
+ if (!e.dmg && iit.dmg)
+ e.dmg = iit.dmg;
+
+ if (!e.skin && iit.world_skin)
+ e.skin = iit.world_skin;
+
+ if (!e.view_ofs)
+ {
+ switch (e.weapon)
+ {
+ case ITEM_SEQ_HEALTH_ROTTEN:
+ e.view_ofs = '16 16 8'; break;
+ case ITEM_SEQ_HEALTH_MEGA:
+ e.view_ofs = '16 16 16'; break;
+ case ITEM_SEQ_HEALTH:
+ e.view_ofs = '16 16 8'; break;
+ case ITEM_SEQ_HEALTH_VIAL:
+ e.view_ofs = '0 0 0'; break;
+ }
+ }
#endif
#ifdef CSQC
setmodelindex (e, e.modelindex);
- #endif
- e.noise = item.pickup_sound;
- e.netname = item.name;
+ if (e.weapon == ITEM_SEQ_HEALTH_VIAL)
+ e.modelflags |= MF_ROTATE;
+ #endif
base_item_init (e);
- #ifdef SSQC
+ // TODO CEV
+ #if 0
// set up rotation -- CEV
- BASE_ITEM_THROW_ROTATION (e, item)
+ BASE_ITEM_THROW_ROTATION (e, iit)
#endif
};
#endif
@@ -350,6 +382,11 @@ float (entity e, float healamount, float ignore) T_Heal =
#endif
// };
+//----------------------------------------------------------------------
+// id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
+
+#ifdef SSQC
/*QUAKED item_health (.3 .3 1) (0 0 0) (32 32 32) ROTTEN MEGAHEALTH X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{
model ( {{ spawnflags & 1 -> { "path" : "maps/b_bh10.bsp" }, spawnflags & 2 -> { "path" : "maps/b_bh100.bsp" },
@@ -363,79 +400,21 @@ rot the player back down to 100 health after 5 seconds.
//----------------------------------------------------------------------
// class item_health: base_item_health
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_health_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_health_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_health =
- {
- local entity e = spawn ();
- e.owner = src;
- e.spawnflags = fl;
- e.origin = org;
- e.velocity = vel;
- item_health_init (e);
- return e;
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_health_init =
- {
- e.classname = "item_health";
- e.classtype = CT_ITEM_HEALTH;
-
- #ifdef SSQC
- if (e.spawnflags & SPAWNFLAG_ITEM_HEALTH_ROTTEN)
- {
- e.weapon = ITEM_SEQ_HEALTH_ROTTEN;
- e.dmg = HEALTH_DAMAGE_SMALL;
- if !(e.particles_offset)
- e.particles_offset = '16 16 8';
- }
- else if (e.spawnflags & SPAWNFLAG_ITEM_HEALTH_MEGA)
- {
- e.weapon = ITEM_SEQ_HEALTH_MEGA;
- e.dmg = HEALTH_DAMAGE_LARGE;
- if !(e.particles_offset)
- e.particles_offset = '16 16 16';
- }
- else
- {
- e.weapon = ITEM_SEQ_HEALTH;
- e.dmg = HEALTH_DAMAGE_SMALL;
- if !(e.particles_offset)
- e.particles_offset = '16 16 8';
- }
- #endif
-
- e.pos1 = '0 0 0';
- e.pos2 = '32 32 56';
-
- // StartItem
- base_item_health_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_health =
{
// remap spawnflags, inhibit spawn, remap fields -- CEV
BASE_ITEM_PREINIT (base_item_health_init_field)
- item_health_init (self);
+ if (self.spawnflags & SPAWNFLAG_ITEM_HEALTH_ROTTEN)
+ self.weapon = ITEM_SEQ_HEALTH_ROTTEN;
+ else if (self.spawnflags & SPAWNFLAG_ITEM_HEALTH_MEGA)
+ self.weapon = ITEM_SEQ_HEALTH_MEGA;
+ else
+ self.weapon = ITEM_SEQ_HEALTH;
+
+ base_item_health_init (self);
};
-#endif
// };
//----------------------------------------------------------------------
@@ -443,72 +422,13 @@ rot the player back down to 100 health after 5 seconds.
//----------------------------------------------------------------------
// class item_health_vial: base_item_health
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_health_vial_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_health_vial_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src) item_health_vial_drop =
- {
- local vector vel;
- vel_x = -100 + (random() * 200);
- vel_y = -100 + (random() * 200);
- vel_z = 300;
- return spawn_item_health_vial (src, src.origin - '0 0 24',
- vel, SPAWNFLAG_ITEM_THROWN);
- };
-
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_health_vial =
- {
- local entity e = spawn ();
- e.owner = src;
- e.spawnflags = fl;
- e.origin = org;
- e.velocity = vel;
- item_health_vial_init (e);
- return e;
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_health_vial_init =
- {
- e.classname = "item_health_vial";
- e.classtype = CT_ITEM_HEALTH_VIAL;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_HEALTH_VIAL;
- e.dmg = HEALTH_DAMAGE_VIAL;
-
- if !(e.particles_offset)
- e.particles_offset = '0 0 0';
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_health_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_health_vial =
{
// remap spawnflags, inhibit spawn, remap fields -- CEV
BASE_ITEM_PREINIT (base_item_health_init_field)
-
- item_health_vial_init (self);
+ self.weapon = ITEM_SEQ_HEALTH_VIAL;
+ base_item_health_init (self);
};
-#endif
// };
+#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/items/keys.qc
diff --git a/qc/items/keys.qc b/qc/items/keys.qc
index c83e2a0..62c26db 100644
--- a/qc/items/keys.qc
+++ b/qc/items/keys.qc
@@ -43,7 +43,9 @@ strip void() temp_keydef;
// base_item_key
#ifdef SSQC
string() base_item_key_silvername;
+float() base_item_key_silverindex;
string() base_item_key_goldname;
+float() base_item_key_goldindex;
entity(string key_name) base_item_key_find_keydef;
float(string key_name) base_item_key_customflag;
float(entity client, float flags, float custom_flags) base_item_key_haskeys;
@@ -181,6 +183,22 @@ void() item_key_custom;
//--------------------------------------------------------------
string() base_item_key_silvername =
{
+ local float item_index = base_item_key_silverindex ();
+
+ if (item_index)
+ {
+ local item_info_t iit = item_info[item_index];
+ return iit.name;
+ }
+ else
+ {
+ return "base_item_key_goldname: ERROR";
+ }
+ };
+
+ //--------------------------------------------------------------
+ float() base_item_key_silverindex =
+ {
local float item_index = 0;
if (world.style == WORLDTYPE_BASE)
@@ -190,10 +208,23 @@ void() item_key_custom;
else if (world.style == WORLDTYPE_METAL)
item_index = ITEM_SEQ_KEY_SILVER_METAL;
+ return item_index;
+ };
+
+ //--------------------------------------------------------------
+ // GoldKeyName
+ //
+ // Return the name that should be used for the gold key as per
+ // world.worldtype. -- iw
+ //--------------------------------------------------------------
+ string() base_item_key_goldname =
+ {
+ local float item_index = base_item_key_goldindex ();
+
if (item_index)
{
- local item_info_t item = item_info[item_index];
- return item.name;
+ local item_info_t iit = item_info[item_index];
+ return iit.name;
}
else
{
@@ -202,12 +233,7 @@ void() item_key_custom;
};
//--------------------------------------------------------------
- // GoldKeyName
- //
- // Return the name that should be used for the gold key as per
- // world.worldtype. -- iw
- //--------------------------------------------------------------
- string() base_item_key_goldname =
+ float() base_item_key_goldindex =
{
local float item_index = 0;
@@ -218,15 +244,7 @@ void() item_key_custom;
else if (world.style == WORLDTYPE_METAL)
item_index = ITEM_SEQ_KEY_GOLD_METAL;
- if (item_index)
- {
- local item_info_t item = item_info[item_index];
- return item.name;
- }
- else
- {
- return "base_item_key_goldname: ERROR";
- }
+ return item_index;
};
//--------------------------------------------------------------
@@ -351,7 +369,18 @@ void() item_key_custom;
// pickup message, pickup sound, & flash the screen -- CEV
sprint (other, sprintf("%s got the %s\n",
other.netname, self.netname));
- sound (other, CHAN_ITEM, self.noise, VOL_HIGH, ATTN_NORM);
+
+ if (self.noise != "")
+ {
+ sound (other, CHAN_ITEM, self.noise, VOL_HIGH,
+ ATTN_NORM);
+ }
+ else
+ {
+ local item_info_t iit = item_info[self.weapon];
+ SOUND (other, iit.pickup_sound)
+ }
+
stuffcmd (other, "bf\n");
// support for item_key_custom -- iw
@@ -388,28 +417,26 @@ void() item_key_custom;
// get settings from an item_info def if we have one -- CEV
if (e.weapon)
{
- local item_info_t item = item_info[e.weapon];
+ local item_info_t iit = item_info[e.weapon];
#ifdef SSQC
- e.items = item.option;
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
+ e.items = iit.option;
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
#endif
- e.noise = item.pickup_sound;
-
#ifdef SSQC
if (e.keyname != "")
e.netname = e.keyname;
else
#endif
- e.netname = item.name;
+ e.netname = iit.name;
}
// key_start
#ifdef SSQC
- e.particles_offset = '0 0 18';
+ e.view_ofs = '0 0 18';
#endif
e.pos1 = '-16 -16 -24';
e.pos2 = '16 16 32';
@@ -718,18 +745,18 @@ picked up. This is a limitation of the engine.
{
if (world.style == WORLDTYPE_MEDIEVAL)
{
- precache_sound ("misc/medkey.wav");
- e.noise = "misc/medkey.wav";
+ precache_sound (snd_item_key_med.wav);
+ e.noise = snd_item_key_med.wav;
}
else if (world.style == WORLDTYPE_METAL)
{
- precache_sound ("misc/runekey.wav");
- e.noise = "misc/runekey.wav";
+ precache_sound (snd_item_key_rune.wav);
+ e.noise = snd_item_key_rune.wav;
}
else if (world.style == WORLDTYPE_BASE)
{
- precache_sound2 ("misc/basekey.wav");
- e.noise = "misc/basekey.wav";
+ precache_sound2 (snd_item_key_base.wav);
+ e.noise = snd_item_key_base.wav;
}
}
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/items/lights.qc
diff --git a/qc/items/lights.qc b/qc/items/lights.qc
new file mode 100644
index 0000000..de70e72
--- /dev/null
+++ b/qc/items/lights.qc
@@ -0,0 +1,212 @@
+//==============================================================================
+// item_torch -- CEV
+//==============================================================================
+
+//======================================================================
+// constants
+//======================================================================
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// item_torch spawnflags -- CEV
+//----------------------------------------------------------------------
+typedef enumflags
+{
+ SPAWNFLAG_ITEM_TORCH_DYNAMIC = 1, // this needs dynamic light -- CEV
+ SPAWNFLAG_ITEM_TORCH_SILENT = 4, // silent torch -- dumptruck_ds
+ SPAWNFLAG_ITEM_TORCH_MG1_UPSIDE_DOWN = 4 // MG1 compat -- CEV
+ // SPAWNFLAG_NOT_ON_EASY = 256, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_NORMAL = 512,
+ // SPAWNFLAG_NOT_ON_HARD_OR_NIGHTMARE = 1024,
+ // SPAWNFLAG_NOT_IN_DEATHMATCH = 2048,
+ // SPAWNFLAG_NOT_IN_COOP = 4096,
+ // SPAWNFLAG_NOT_IN_SP = 8192,
+ // SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
+ // SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
+} item_torch_spawnflags;
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+const vector ITEM_TORCH_MINS = '-3.5 -3.5 -14';
+const vector ITEM_TORCH_MAXS = '3.5 3.5 40';
+#endif
+
+//======================================================================
+// forward declarations
+//======================================================================
+
+// item_torch
+#ifdef CSQC
+void(float isnew) item_torch_netreceive;
+float() item_torch_predraw;
+#endif
+#ifdef SSQC
+void(entity grabber, entity torch) item_torch_grab;
+#endif
+#if defined(CSQC) || defined(SSQC)
+void(entity e) item_torch_init;
+#endif
+#ifdef SSQC
+void() item_torch;
+#endif
+
+//------------------------------------------------------------------------------
+
+/*QUAKED item_torch (0 .5 0) (-10 -10 -20) (10 10 20) X X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{ model ("progs/flame.mdl"); }
+Short wall torch
+See the "light" entity for a full description.
+*/
+//----------------------------------------------------------------------
+// class item_torch: base_item
+// {
+#ifdef CSQC
+ void(float isnew) item_torch_netreceive =
+ {
+ // creates a number of variables, including netflags -- CEV
+ BASE_ITEM_NETRECEIVE (item_torch_init)
+ };
+
+ //--------------------------------------------------------------
+ float() item_torch_predraw =
+ {
+ #if 0
+ dynamiclight_add (self.origin, 200, '0.5 0.5 0.5', 6);
+ #endif
+
+ // update frame1time so the torch animates -- CEV
+ self.frame1time = time;
+
+ // interpolate origin -- see base_entities.qc -- CEV
+ BASE_ENTITY_LERP_ORIGIN (self,
+ self.origin_net, self.origin_prev, time,
+ self.origin_net_time, self.origin_prev_time)
+
+ if (self.effects & EF_REDTINT)
+ {
+ self.colormod = '1.0 0 0';
+ self.effects &= ~EF_REDTINT;
+ }
+ else if (self.colormod)
+ {
+ self.colormod = '0 0 0';
+ }
+
+ return PREDRAW_AUTOADD;
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(entity grabber, entity torch) item_torch_grab =
+ {
+ BASE_ITEM_INVENTORY_ADD (torch, grabber)
+
+ // don't re-grab / immediately throw the item -- CEV
+ if (grabber.button4)
+ grabber.flags |= FL_THROW_HELD;
+
+ // let the player know -- CEV
+ sprint (grabber, sprintf("%s grabbed a %s\n",
+ grabber.netname, torch.netname));
+
+ // let CSQC know -- CEV
+ if (grabber.classtype == CT_PLAYER && grabber.SendEntity)
+ grabber.SendFlags |= NETFLAG_PLAYER_WEAPON;
+
+ // torches don't respawn -- CEV
+ if (torch)
+ {
+ torch.model = __NULL__;
+ setmodel (torch, torch.model);
+ torch.solid = SOLID_NOT;
+ torch.think = sub_remove;
+ torch.nextthink = time + 0.2;
+
+ torch.SendFlags |= NETFLAG_BASE_ENTITY_MODEL |
+ NETFLAG_BASE_ENTITY_SOLID;
+ }
+ };
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+ //--------------------------------------------------------------
+ void(entity e) item_torch_init =
+ {
+ e.classname = "item_torch";
+ e.classtype = CT_ITEM_TORCH;
+ base_mapentity_init (e);
+
+ e.classgroup |= CG_ITEM;
+ e.flags |= FL_FINDABLE_NONSOLID;
+ e.pos1 = ITEM_TORCH_MINS;
+ e.pos2 = ITEM_TORCH_MAXS;
+
+ #ifdef CSQC
+ setmodelindex (e, e.modelindex);
+ setsize (e, e.pos1, e.pos2);
+ setorigin (e, e.origin);
+ e.drawmask = DRAWMASK_NORMAL;
+ e.predraw = item_torch_predraw;
+ #endif
+
+ #ifdef SSQC
+ // TODO CEV was BASE_LIGHT_MG1_UPSIDEDOWN
+ if (known_release == KNOWN_RELEASE_MG1) {
+ if (e.spawnflags & SPAWNFLAG_ITEM_TORCH_MG1_UPSIDE_DOWN)
+ {
+ e.spawnflags &= ~SPAWNFLAG_BASE_LIGHT_MG1_UPSIDE_DOWN;
+ e.angles = '180 0 0';
+ } }
+
+ local item_info_t iit = item_info[ITEM_SEQ_TORCH];
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+
+ e.weapon = ITEM_SEQ_TORCH;
+ e.netname = iit.name;
+ e.solid = SOLID_TRIGGER;
+
+ setmodel (e, iit.world_model);
+ setsize (e, e.pos1, e.pos2);
+ setorigin (e, e.origin);
+
+ if (e.spawnflags & SPAWNFLAG_ITEM_THROWN)
+ {
+ e.movetype = MOVETYPE_TOSS;
+ e.tick = base_item_neteval;
+ e.classgroup |= CG_FRAMETICK;
+ e.think = base_item_think_throwgroundcheck;
+ e.nextthink = time + 0.1;
+ }
+ else
+ {
+ e.movetype = MOVETYPE_NONE;
+ }
+
+ // for silent torch -- dumptruck_ds
+ if (!(e.spawnflags && SPAWNFLAG_ITEM_TORCH_SILENT))
+ {
+ precache_sound (snd_amb_fire.wav);
+ AMBSOUND (e.origin, snd_amb_fire)
+ }
+
+ e.SendEntity = base_entity_netsend;
+ e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
+ #endif
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void() item_torch =
+ {
+ // new spawnflags for all entities -- iw
+ if (SUB_Inhibit())
+ return;
+
+ item_torch_init (self);
+ };
+#endif
+// };
Return to the top of this page or return to the overview of this repo.
Diff qc/items/powerups.qc
diff --git a/qc/items/powerups.qc b/qc/items/powerups.qc
index 989b824..0abb6a0 100644
--- a/qc/items/powerups.qc
+++ b/qc/items/powerups.qc
@@ -7,14 +7,15 @@
//======================================================================
// base_item_powerup
+#ifdef CSQC
+void(float isnew) base_item_powerup_netreceive;
+#endif
#ifdef SSQC
// BASE_ITEM_POWERUP_RESPAWNDELAY(idx)
// BASE_ITEM_POWERUP_ADD(pl, idx)
void(entity grabber, entity power) base_item_powerup_grab;
void(entity attacker, float item_index) base_item_powerup_fire;
void() base_item_powerup_touch;
-entity(entity src, vector org, vector vel, float fl, void(entity) init_fn)
- spawn_base_item_powerup;
void(string key, string value) base_item_powerup_init_field;
#endif
#if defined(CSQC) || defined(SSQC)
@@ -24,63 +25,13 @@ void(entity e) base_item_powerup_init;
strip void() base_item_powerup;
#endif
-// item_artifact_envirosuit
-#ifdef CSQC
-void(float isnew) item_artifact_envirosuit_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_envirosuit;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_artifact_envirosuit_init;
-#endif
#ifdef SSQC
+//----------------------------------------------------------------------
+// original id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
void() item_artifact_envirosuit;
-#endif
-
-// item_artifact_invisibility
-#ifdef CSQC
-void(float isnew) item_artifact_invisibility_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_invisibility;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_artifact_invisibility_init;
-#endif
-#ifdef SSQC
void() item_artifact_invisibility;
-#endif
-
-// item_artifact_invulnerability
-#ifdef CSQC
-void(float isnew) item_artifact_invulnerability_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_invulnerability;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_artifact_invulnerability_init;
-#endif
-#ifdef SSQC
void() item_artifact_invulnerability;
-#endif
-
-// item_artifact_super_damage
-#ifdef CSQC
-void(float isnew) item_artifact_super_damage_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_super_damage;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) item_artifact_super_damage_init;
-#endif
-#ifdef SSQC
void() item_artifact_super_damage;
#endif
@@ -89,6 +40,15 @@ void() item_artifact_super_damage;
//----------------------------------------------------------------------
// class base_item_powerup: base_item
// {
+#ifdef CSQC
+ //--------------------------------------------------------------
+ void(float isnew) base_item_powerup_netreceive =
+ {
+ // creates a number of variables, including netflags -- CEV
+ BASE_ITEM_NETRECEIVE (base_item_powerup_init)
+ };
+#endif
+
#ifdef SSQC
//--------------------------------------------------------------
#define BASE_ITEM_POWERUP_RESPAWNDELAY(idx) \
@@ -157,7 +117,7 @@ void() item_artifact_super_damage;
BASE_ITEM_INVENTORY_ADD (power, grabber)
// don't re-grab / immediately throw the item -- CEV
- if (grabber.button6)
+ if (grabber.button4)
grabber.flags |= FL_THROW_HELD;
// let the player know -- CEV
@@ -179,7 +139,6 @@ void() item_artifact_super_damage;
other = otemp;
// either remove the item or set up for respawning -- CEV
- power.mdl = power.model;
BASE_ITEM_POWERUP_RESPAWNDELAY (power.weapon)
BASE_ITEM_CHECKREMOVE (power, delay_sp, delay_dm)
};
@@ -199,8 +158,8 @@ void() item_artifact_super_damage;
NETFLAG_PLAYER_WEAPON;
// and make sure the player knows -- CEV
- local item_info_t item = item_info[item_index];
- BASE_ITEM_PICKUPMESSAGE (attacker, item, CHAN_ITEM_POWERUP)
+ local item_info_t iit = item_info[item_index];
+ BASE_ITEM_PICKUPMESSAGE (attacker, iit)
};
//--------------------------------------------------------------
@@ -217,14 +176,13 @@ void() item_artifact_super_damage;
BASE_ENTITY_WEAPONLOOKUP (other)
if (item_index < ITEM_SEQ_W_START||item_index > ITEM_SEQ_W_END)
{
- if (item_index == ITEM_SEQ_HANDS && other.button6 &&
- !(other.flags & FL_THROW_HELD))
+ if (item_index == ITEM_SEQ_HANDS && other.button4)
{
// self.attack_finished = time + 0.5;
base_item_powerup_grab (other, self);
return;
}
- else
+ else if (!other.button0)
{
return;
}
@@ -234,32 +192,18 @@ void() item_artifact_super_damage;
BASE_ITEM_POWERUP_RESPAWNDELAY (self.weapon)
BASE_ITEM_POWERUP_ADD (other, self.weapon)
- local item_info_t item = item_info[self.weapon];
- BASE_ITEM_PICKUPMESSAGE (other, item, CHAN_ITEM_POWERUP)
+ local item_info_t iit = item_info[self.weapon];
+ BASE_ITEM_PICKUPMESSAGE (other, iit)
// fire all targets / killtargets
activator = other;
sub_usetargets ();
// either remove the item or set up for respawning -- CEV
- self.mdl = self.model;
BASE_ITEM_CHECKREMOVE (self, delay_sp, delay_dm)
};
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl,
- void(entity) init_fn) spawn_base_item_powerup =
- {
- local entity e = spawn ();
- e.owner = src;
- e.spawnflags = fl;
- e.origin = org;
- e.velocity = vel;
- init_fn (e);
- return e;
- };
-
- //--------------------------------------------------------------
void(string key, string value) base_item_powerup_init_field =
{
base_item_init_field (key, value);
@@ -270,10 +214,10 @@ void() item_artifact_super_damage;
//--------------------------------------------------------------
void(entity e) base_item_powerup_init =
{
- e.classgroup |= CG_ITEM_POWERUP;
-
+ local item_info_t iit = item_info[e.weapon];
- local item_info_t item = item_info[e.weapon];
+ e.classgroup |= CG_ITEM_POWERUP;
+ e.netname = iit.name;
#ifdef CSQC
setmodelindex (e, e.modelindex);
@@ -281,16 +225,47 @@ void() item_artifact_super_damage;
#endif
#ifdef SSQC
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
+ e.items = iit.option;
e.touch = base_item_powerup_touch;
- #endif
- e.noise = item.pickup_sound;
+ if (!e.dmg && iit.dmg)
+ e.dmg = iit.dmg;
+
+ if (!e.skin && iit.world_skin)
+ e.skin = iit.world_skin;
- if (e.netname == __NULL__ || e.netname == "")
- e.netname = item.name;
+ // precaches & other info not included in item_info_t -- CEV
+ // t_fog fix for custom models -- dumptruck_ds
+ switch (e.weapon)
+ {
+ case ITEM_SEQ_ARTIFACT_ENVIROSUIT:
+ precache_sound (snd_item_suit_off.wav);
+ e.view_ofs = '0 0 32';
+ break;
+ case ITEM_SEQ_ARTIFACT_INVISIBILITY:
+ precache_sound (snd_item_invis_off.wav);
+ precache_sound (snd_item_invis_amb.wav);
+ e.view_ofs = '0 0 0';
+ break;
+ case ITEM_SEQ_ARTIFACT_INVULNERABILITY:
+ // called in client.qc -- dumptruck_ds
+ precache_sound (snd_item_pent_off.wav);
+ // called in combat.qc -- dumptruck_ds
+ precache_sound (snd_item_pent_prot.wav);
+ e.view_ofs = '0 0 16';
+ break;
+ case ITEM_SEQ_ARTIFACT_QUAD:
+ precache_sound (snd_item_quad_dam.wav);
+ e.view_ofs = '0 0 16';
+ break;
+ }
+
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
+ #endif
base_item_init (e);
};
@@ -305,6 +280,19 @@ void() item_artifact_super_damage;
#endif
// };
+//----------------------------------------------------------------------
+// id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+#define ITEM_PUP(idx) \
+/* { */ \
+ BASE_ITEM_PREINIT (base_item_powerup_init_field) \
+ self.weapon = idx; \
+ base_item_powerup_init (self);
+/* } */
+
/*QUAKED item_artifact_envirosuit (0 .5 .8) (-16 -16 -24) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/suit.mdl"); }
Biosuit
@@ -313,62 +301,9 @@ Player takes no damage from water or slime for 30 seconds
//----------------------------------------------------------------------
// class item_artifact_envirosuit: base_item_powerup
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_artifact_envirosuit_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_artifact_envirosuit_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_envirosuit =
- {
- return spawn_base_item_powerup (src, org, vel, fl,
- item_artifact_envirosuit_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_artifact_envirosuit_init =
- {
- e.classname = "item_artifact_envirosuit";
- e.classtype = CT_ITEM_ENVIROSUIT;
-
- #ifdef SSQC
- // base_item_powerup_init will cache suit.wav -- CEV
- precache_sound ("items/suit2.wav");
-
- e.weapon = ITEM_SEQ_ARTIFACT_ENVIROSUIT;
- e.items = IT_SUIT;
-
- // t_fog fix for custom models dumptruck_ds
- if !(e.particles_offset)
- e.particles_offset = '0 0 32';
- #endif
-
- e.pos1 = '-16 -16 -24';
- e.pos2 = '16 16 32';
-
- // StartItem
- base_item_powerup_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_artifact_envirosuit =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_powerup_init_field)
-
- item_artifact_envirosuit_init (self);
- };
-#endif
+ { ITEM_PUP (ITEM_SEQ_ARTIFACT_ENVIROSUIT) };
// };
/*QUAKED item_artifact_invisibility (0 .5 .8) (-16 -16 -24) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
@@ -379,62 +314,9 @@ Player is invisible for 30 seconds
//----------------------------------------------------------------------
// class item_artifact_invisibility: base_item_powerup
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_artifact_invisibility_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_artifact_invisibility_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_invisibility =
- {
- return spawn_base_item_powerup (src, org, vel, fl,
- item_artifact_invisibility_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_artifact_invisibility_init =
- {
- e.classname = "item_artifact_invisibility";
- e.classtype = CT_ITEM_INVISIBILITY;
-
- #ifdef SSQC
- precache_sound ("items/inv2.wav");
- precache_sound ("items/inv3.wav");
-
- e.weapon = ITEM_SEQ_ARTIFACT_INVISIBILITY;
- e.items = IT_INVISIBILITY;
-
- // t_fog fix for custom models dumptruck_ds
- if !(e.particles_offset)
- e.particles_offset = '0 0 0';
- #endif
-
- e.pos1 = '-16 -16 -24';
- e.pos2 = '16 16 32';
-
- // StartItem
- base_item_powerup_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_artifact_invisibility =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_powerup_init_field)
-
- item_artifact_invisibility_init (self);
- };
-#endif
+ { ITEM_PUP (ITEM_SEQ_ARTIFACT_INVISIBILITY) };
// };
/*QUAKED item_artifact_invulnerability (0 .5 .8) (-16 -16 -24) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
@@ -445,64 +327,9 @@ Player is invulnerable for 30 seconds
//----------------------------------------------------------------------
// class item_artifact_invulnerability: base_item_powerup
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_artifact_invulnerability_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_artifact_invulnerability_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_invulnerability =
- {
- return spawn_base_item_powerup (src, org, vel, fl,
- item_artifact_invulnerability_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_artifact_invulnerability_init =
- {
- e.classname = "item_artifact_invulnerability";
- e.classtype = CT_ITEM_INVULNERABILITY;
-
- #ifdef SSQC
- // called in client.qc -- dumptruck_ds
- precache_sound ("items/protect2.wav");
- // called in combat.qc -- dumptruck_ds
- precache_sound ("items/protect3.wav");
-
- e.weapon = ITEM_SEQ_ARTIFACT_INVULNERABILITY;
- e.items = IT_INVULNERABILITY;
-
- // t_fog fix for custom models dumptruck_ds
- if !(e.particles_offset)
- e.particles_offset = '0 0 16';
- #endif
-
- e.pos1 = '-16 -16 -24';
- e.pos2 = '16 16 32';
-
- // StartItem
- base_item_powerup_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_artifact_invulnerability =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_powerup_init_field)
-
- item_artifact_invulnerability_init (self);
- };
-#endif
+ { ITEM_PUP (ITEM_SEQ_ARTIFACT_INVULNERABILITY) };
// };
/*QUAKED item_artifact_super_damage (0 .5 .8) (-16 -16 -24) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
@@ -513,60 +340,10 @@ Player does 4x damage for 30 seconds
//----------------------------------------------------------------------
// class item_artifact_super_damage: base_item_powerup
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) item_artifact_super_damage_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (item_artifact_super_damage_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_item_artifact_super_damage =
- {
- return spawn_base_item_powerup (src, org, vel, fl,
- item_artifact_super_damage_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) item_artifact_super_damage_init =
- {
- e.classname = "item_artifact_super_damage";
- e.classtype = CT_ITEM_QUAD;
-
- #ifdef SSQC
- // base_item_powerup_init will cache damage.wav -- CEV
- precache_sound ("items/damage3.wav");
-
- e.weapon = ITEM_SEQ_ARTIFACT_QUAD;
- e.items = IT_QUAD;
-
- // t_fog fix for custom models dumptruck_ds
- if !(e.particles_offset)
- e.particles_offset = '0 0 16';
- #endif
-
- e.pos1 = '-16 -16 -24';
- e.pos2 = '16 16 32';
-
- // StartItem
- base_item_powerup_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
void() item_artifact_super_damage =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_powerup_init_field)
+ { ITEM_PUP (ITEM_SEQ_ARTIFACT_QUAD) };
+// };
- item_artifact_super_damage_init (self);
- };
+#undef ITEM_PUP
#endif
-// };
Return to the top of this page or return to the overview of this repo.
Diff qc/items/runes.qc
diff --git a/qc/items/runes.qc b/qc/items/runes.qc
index f35956a..5ce0dfb 100644
--- a/qc/items/runes.qc
+++ b/qc/items/runes.qc
@@ -122,7 +122,7 @@ Episode 4 - The Elder World - Run of Elder Magic
// don't alert the player in sigil_touch2 -- CEV
// centerprint (other, "You got the rune!");
- // sound (other, CHAN_ITEM, this.noise, VOL_HIGH, ATTN_NORM);
+ // sound (other, CHAN_ITEM, self.noise, VOL_HIGH, ATTN_NORM);
// stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
@@ -149,19 +149,31 @@ Episode 4 - The Elder World - Run of Elder Magic
if (sub_checkvalidtouch(other) == FALSE)
return;
- // don't touch if other isn't holding a weapon -- CEV
+ // don't touch if other isn't holding a weapon and not
+ // pressing the grab key -- CEV
BASE_ENTITY_WEAPONLOOKUP (other)
if (item_index < ITEM_SEQ_W_START||item_index > ITEM_SEQ_W_END)
{
if (item_index != ITEM_SEQ_HANDS)
return;
- if (!other.button6 && (!(other.flags & FL_THROW_HELD)))
+ if (!other.button4 && (!(other.flags & FL_THROW_HELD)))
return;
}
centerprint (other, sprintf("%s got the %s!",
other.netname, self.netname));
- sound (other, CHAN_ITEM, self.noise, VOL_HIGH, ATTN_NORM);
+
+ if (self.noise != "")
+ {
+ sound (other, CHAN_ITEM, self.noise, VOL_HIGH,
+ ATTN_NORM);
+ }
+ else
+ {
+ local item_info_t iit = item_info[self.weapon];
+ SOUND (other, iit.pickup_sound)
+ }
+
stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
@@ -200,15 +212,12 @@ Episode 4 - The Elder World - Run of Elder Magic
//--------------------------------------------------------------
void(entity e) item_sigil_init =
{
- e.classname = "item_sigil";
- e.classtype = CT_ITEM_RUNE;
-
#ifdef SSQC
- e.touch = item_sigil_touch;
-
- if (!e.spawnflags)
- objerror ("item_sigil_init: no spawnflags!");
+ if (!e.spawnflags && !e.weapon)
+ objerror ("item_sigil_init: no spawnflags and "
+ "no .weapon!");
+ if (!e.weapon) {
if (known_release == KNOWN_RELEASE_MG1)
{
if (e.spawnflags & SPAWNFLAG_ITEM_SIGIL_RUNE1)
@@ -234,15 +243,31 @@ Episode 4 - The Elder World - Run of Elder Magic
e.weapon = ITEM_SEQ_RUNE3;
else if (e.spawnflags & SPAWNFLAG_ITEM_SIGIL_RUNE4)
e.weapon = ITEM_SEQ_RUNE4;
- }
+ } }
#endif
- local item_info_t item = item_info[e.weapon];
+ // client will already have e.weapon -- CEV
+ local item_info_t iit = item_info[e.weapon];
#ifdef SSQC
- precache_model (item.world_model);
- setmodel (e, item.world_model);
- precache_sound (item.pickup_sound);
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
+ e.touch = item_sigil_touch;
+ e.view_ofs = '0 0 18';
+
+ precache_model (iit.world_model);
+ setmodel (e, iit.world_model);
+
+ if (e.noise != __NULL__ && e.noise != "")
+ precache_sound (e.noise);
+ else
+ precache_sound (iit.pickup_sound.wav);
+
+ if (!e.dmg && iit.dmg)
+ e.dmg = iit.dmg;
+
+ if (!e.skin && iit.world_skin)
+ e.skin = iit.world_skin;
#endif
#ifdef CSQC
@@ -250,14 +275,7 @@ Episode 4 - The Elder World - Run of Elder Magic
e.modelflags |= MF_ROTATE;
#endif
- e.noise = item.pickup_sound;
- e.netname = item.name;
- e.pos1 = '-16 -16 -24';
- e.pos2 = '16 16 32';
-
- #ifdef SSQC
- e.particles_offset = '0 0 18';
- #endif
+ e.netname = iit.name;
// StartItem
base_item_init (e);
Return to the top of this page or return to the overview of this repo.
Diff qc/items/throwables.qc
diff --git a/qc/items/throwables.qc b/qc/items/throwables.qc
new file mode 100644
index 0000000..a162ac6
--- /dev/null
+++ b/qc/items/throwables.qc
@@ -0,0 +1,739 @@
+//==============================================================================
+// items/throwables.qc -- breakable debris, gibs, heads, misc. throwables -- CEV
+//==============================================================================
+
+//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+// Scenic Dead Monster Patch stuff here from DeadStuff mod -- dumptruck_ds
+//
+// deadstuff version 1.0 - tony collen - manero@canweb.net -
+// EfNet IRC #QuakeEd or #Trinity
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+//======================================================================
+// constants
+//======================================================================
+
+#ifdef SSQC
+const float DEBRISQUE_COUNT_MAX = 50; // max number of gibs at one time
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// base_item_throwable spawnflags -- CEV
+//----------------------------------------------------------------------
+typedef enumflags
+{
+ SPAWNFLAG_ITEM_THROWABLE_SOLID = 1 // spawnflags: solid
+ // SPAWNFLAG_ITEM_SPAWNSILENT = 32, // see base_item.qc -- CEV
+ // SPAWNFLAG_ITEM_SPAWNED = 64, // see base_item.qc -- CEV
+ // SPAWNFLAG_ITEM_SUSPENDED = 128, // see base_item.qc -- CEV
+ // SPAWNFLAG_NOT_ON_EASY = 256, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_NORMAL = 512,
+ // SPAWNFLAG_NOT_ON_HARD_OR_NIGHTMARE = 1024,
+ // SPAWNFLAG_NOT_IN_DEATHMATCH = 2048,
+ // SPAWNFLAG_NOT_IN_COOP = 4096,
+ // SPAWNFLAG_NOT_IN_SP = 8192,
+ // SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
+ // SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
+ // SPAWNFLAG_ITEM_RESPAWN = 2097152, // see base_item.qc -- CEV
+ // SPAWNFLAG_ITEM_THROWN = 4194304, // see base_item.qc -- CEV
+ // SPAWNFLAG_ITEM_DONTDROP = 8388608 // see base_item.qc -- CEV
+} base_item_throwable_spawnflags;
+#endif
+
+//======================================================================
+// forward declarations
+//======================================================================
+
+#ifdef SSQC
+void(vector org, vector vel, float damage) spawn_blood;
+void(float damage) spawn_touchblood;
+void(vector org, vector vel) spawn_chunk;
+entity(vector org, vector vel) spawn_meatspray;
+vector(vector dir, float damage) velocity_for_damage;
+#endif
+
+// base_item_throwable
+#ifdef CSQC
+void(float isnew) base_item_throwable_netreceive;
+#endif
+#ifdef SSQC
+// BASE_ITEM_THROWABLE(idx, d, h)
+void(entity attacker, float item_index) base_item_throwable_fire;
+void(entity grabber, entity d) base_item_throwable_grab;
+void() base_item_throwable_think;
+void() base_item_throwable_touch;
+entity(float idx, vector o, vector v, float fl) spawn_base_item_throwable;
+#endif
+#if defined(CSQC) || defined(SSQC)
+void(entity e) base_item_throwable_init;
+#endif
+#ifdef SSQC
+strip void() base_item_throwable;
+#endif
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// original progs_dump 3 / DeadStuff entity spawn functions -- CEV
+//----------------------------------------------------------------------
+void() gib_misc_1;
+void() gib_misc_2;
+void() gib_misc_3;
+void() gib_head_demon;
+void() gib_head_dog;
+void() gib_head_enforcer;
+void() gib_head_hell_knight;
+void() gib_head_knight;
+void() gib_head_ogre;
+void() gib_head_player;
+void() gib_head_shalrath;
+void() gib_head_shambler;
+void() gib_head_army;
+void() gib_head_wizard;
+void() gib_head_zombie;
+#endif
+
+//------------------------------------------------------------------------------
+
+//----------------------------------------------------------------------
+// misc. functions
+//----------------------------------------------------------------------
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// SpawnBlood
+//----------------------------------------------------------------------
+void(vector org, vector vel, float damage) spawn_blood =
+{
+ particle (org, vel * 0.1, 73, damage * 2);
+};
+
+//----------------------------------------------------------------------
+// spawn_touchblood
+//----------------------------------------------------------------------
+void(float damage) spawn_touchblood =
+{
+ // wall_velocity
+ local vector vel;
+
+ vel = normalize (self.velocity);
+ vel = normalize (vel + v_up * (random() - 0.5) +
+ v_right * (random() - 0.5));
+ // TODO CEV when was the last time a trace was called?
+ vel = vel + 2 * trace_plane_normal;
+ vel = (vel * 200) * 0.2;
+
+ spawn_blood (self.origin + vel * 0.01, vel, damage);
+};
+
+//----------------------------------------------------------------------
+// SpawnChunk
+//----------------------------------------------------------------------
+void(vector org, vector vel) spawn_chunk =
+{
+ particle (org, vel * 0.02, 0, 10);
+};
+
+//----------------------------------------------------------------------
+// SpawnMeatSpray
+//----------------------------------------------------------------------
+entity(vector org, vector vel) spawn_meatspray =
+{
+ // reusing the "zombiechunk" projectile -- CEV
+ local entity e = spawn_projectile_zombiechunk (self, org, vel);
+ // override some defaults, notably solid and force damage to 0 -- CEV
+ e.solid = SOLID_NOT;
+ e.dmg = 0;
+ e.velocity_z += 250 + 50 * random ();
+ e.nextthink = time + 1;
+ return e;
+};
+
+//----------------------------------------------------------------------
+vector(vector dir, float damage) velocity_for_damage =
+{
+ // uncomment if needed for the debug print below -- CEV
+ // local vector startdir = dir;
+
+ // next three lines original id1 behavior -- CEV
+ local vector v;
+ v_x = 100 * crandom ();
+ v_y = 100 * crandom ();
+ v_z = 200 + 100 * random ();
+ // damage response scaling from Alkaline, presumably by bmFbr -- CEV
+ v *= max (1, min(10, damage * damage / 5000));
+
+ if (dir != '0 0 0')
+ {
+ // directional gib behavior from Alkaline (which appears to
+ // be by bmFbr according to the commit log, see Alkaline
+ // commit 083f87c18a2d2be645ba197c1f23fc6533afca81).
+ // dir is set by killed () and is already normalized -- CEV
+ dir *= bound (10, damage * damage / 22, 600);
+ dir_x *= 2.5;
+ dir_y *= 2.5;
+ dir_z *= 0.7;
+ v += dir;
+ }
+
+ // velocity limiting code again from Alkaline and written by bmFbr.
+ // I'm leaning on Alkaline here and above because the implementation
+ // I came up with was way worse. -- CEV
+ local float vspeed = vlen (v);
+ if (vspeed > 450)
+ v *= 450 / vspeed;
+ v_z = min (450, v_z);
+
+ #if 0
+ dprint (sprintf("velocity_for_damage: damage is %g, startdir is %v, "
+ "v is %v\n", damage, startdir, v));
+ #endif
+
+ return v;
+};
+#endif
+
+//----------------------------------------------------------------------
+// base_item_throwable
+//----------------------------------------------------------------------
+
+//----------------------------------------------------------------------
+// class base_item_throwable: base_item
+// {
+#ifdef CSQC
+ //--------------------------------------------------------------
+ void(float isnew) base_item_throwable_netreceive =
+ {
+ // creates a number of variables, including netflags -- CEV
+ BASE_ITEM_NETRECEIVE (base_item_throwable_init)
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ // was self.origin + '0 0 24' -- CEV
+ //--------------------------------------------------------------
+ #define BASE_ITEM_THROWABLE(idx, d, h) \
+ { \
+ spawn_base_item_throwable (idx, self.origin, \
+ velocity_for_damage(d, h), \
+ SPAWNFLAG_ITEM_THROWN); \
+ }
+
+ //--------------------------------------------------------------
+ // player has pressed +attack while holding -- CEV
+ //--------------------------------------------------------------
+ void(entity attacker, float item_index) base_item_throwable_fire =
+ {
+ // TODO CEV
+ makevectors (self.v_angle);
+ player_throw_item (v_forward * 400.0f + v_up * 45.0f);
+ };
+
+ //--------------------------------------------------------------
+ void(entity grabber, entity d) base_item_throwable_grab =
+ {
+ BASE_ITEM_INVENTORY_ADD (d, grabber)
+
+ // don't re-grab / immediately throw the item -- CEV
+ if (grabber.button4)
+ grabber.flags |= FL_THROW_HELD;
+
+ // let the player know -- CEV
+ sprint (grabber, sprintf("%s grabbed a %s\n",
+ grabber.netname, d.netname));
+
+ // let CSQC know -- CEV
+ if (grabber.classtype == CT_PLAYER && grabber.SendEntity)
+ grabber.SendFlags |= NETFLAG_PLAYER_WEAPON;
+
+ // remove the ent from the queue before firing targets -- CEV
+ base_entity_que_rem (d, QUE_TYPE_DEBRIS);
+
+ // fire all targets / killtargets (unlikely to be used) -- CEV
+ local entity stemp = self;
+ local entity otemp = grabber;
+ other = grabber;
+ self = d;
+ activator = grabber;
+ sub_usetargets ();
+ self = stemp;
+ other = otemp;
+
+ // throwables won't respawn so we're clear to remove here -- CEV
+ if (d)
+ {
+ d.model = __NULL__;
+ setmodel (d, d.model);
+ d.solid = SOLID_NOT;
+ d.touch = sub_null;
+ d.think = sub_remove;
+ d.nextthink = time + 0.2;
+
+ d.SendFlags |= NETFLAG_BASE_ENTITY_MODEL |
+ NETFLAG_BASE_ENTITY_SOLID;
+ }
+ };
+
+ //--------------------------------------------------------------
+ // cut-down/altered version of base_item_think_throwgroundcheck -- CEV
+ //--------------------------------------------------------------
+ void() base_item_throwable_think =
+ {
+ if (self.flags & FL_ONGROUND)
+ {
+ if (self.classgroup & CG_FRAMETICK)
+ self.classgroup &= ~CG_FRAMETICK;
+
+ if (self.owner)
+ self.owner = world;
+
+ if (self.solid != SOLID_TRIGGER)
+ {
+ self.solid = SOLID_TRIGGER;
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
+ }
+
+ self.velocity = '0 0 0';
+ }
+ else
+ {
+ if (!(self.classgroup & CG_FRAMETICK))
+ self.classgroup |= CG_FRAMETICK;
+ }
+
+ self.think = base_item_throwable_think;
+ self.nextthink = time + 0.1;
+ };
+
+ //--------------------------------------------------------------
+ // Inspired by Ivana Gibson's kickable gibs [1] and similar
+ // functions found in other mods (Scarlet, etc) -- CEV
+ // [1]: https://www.insideqc.com/qctut/lesson-52.shtml
+ //
+ // throwable_touch runs much more often than other item touch
+ // funcs (mainly due to touching world); concessions have been
+ // made // so it doesn't eat too much time -- CEV
+ //--------------------------------------------------------------
+ void() base_item_throwable_touch =
+ {
+ setorigin (self, self.origin);
+
+ self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN |
+ NETFLAG_BASE_ENTITY_ANGLES;
+
+ // only run if touched by a player or monster -- CEV
+ if (other.classtype != CT_PLAYER)
+ if (!(other.classgroup & CG_MONSTER))
+ return;
+
+ // check touch_projectile & return early if in motion -- CEV
+ if (self.velocity)
+ {
+ // thrown item check -- CEV
+ base_item_touch_projectile ();
+ return;
+ }
+
+ // only run if other is moving fast enough to disturb
+ // stationary objects -- CEV
+ if (other.classtype == CT_PLAYER)
+ if (other.speed < 200)
+ return;
+
+ // push self horizontally according to other's direction and
+ // speed, maximum of 160ups -- CEV
+ base_entity_displace (self, other, PM_MAXSPEED * 0.5);
+
+ if (self.avelocity.y == 0)
+ // a little spin, as a treat. Rotating in the other
+ // axes seem to cause ents to move into the floor -- CEV
+ self.avelocity_y = 100 * crandom ();
+ };
+
+ //--------------------------------------------------------------
+ entity(float idx, vector o, vector v, float fl)
+ spawn_base_item_throwable =
+ {
+ local entity e = spawn ();
+ e.owner = self;
+ e.spawnflags = fl;
+ e.origin = o;
+ e.velocity = v;
+ e.weapon = idx;
+
+ // initialize the ent -- CEV
+ base_item_throwable_init (e);
+
+ if (fl & SPAWNFLAG_ITEM_THROWN)
+ {
+ if (self.health <= 0)
+ {
+ // thrown from a gibbed enemy -- CEV
+ if (idx >= ITEM_SEQ_HEAD_START &&
+ idx <= ITEM_SEQ_HEAD_END)
+ {
+ // special handling for heads -- CEV
+ if (!e.avelocity)
+ e.avelocity.y = crandom() * 600;
+ }
+ else
+ {
+ e.avelocity.x = random() * 600;
+ e.avelocity.y = random() * 600;
+ e.avelocity.z = random() * 600;
+ }
+ }
+ }
+
+ // register this entity in the throwable queue -- CEV
+ local entity rem = base_entity_que_add (e, QUE_TYPE_DEBRIS);
+ if (rem)
+ {
+ // a piece of throwable was removed from the queue;
+ // schedule it for removal for real -- CEV
+ rem.alpha = 1.0;
+ rem.think = sub_remove_fade;
+ rem.nextthink = time + 2 + random() * 10;
+ }
+
+ return e;
+ };
+#endif
+
+#if defined(CSQC) || defined(SSQC)
+ //--------------------------------------------------------------
+ // throwables don't call base_item_init, do all that work here -- CEV
+ //--------------------------------------------------------------
+ void(entity e) base_item_throwable_init =
+ {
+ local item_info_t iit = item_info[e.weapon];
+
+ #ifdef SSQC
+ // don't reset class if passed a client entity -- CEV
+ if (!(e.flags & FL_CLIENT))
+ {
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
+ }
+
+ if (!e.dmg)
+ e.dmg = iit.dmg;
+ #endif
+
+ e.frame = iit.world_frame;
+ e.skin = iit.world_skin;
+ e.view_ofs = '0 0 8';
+
+ #ifdef SSQC
+ if (e.flags & FL_CLIENT)
+ dprint (sprintf("base_item_throwable_init: found "
+ "FL_CLIENT, classtype %s\n", e.classname));
+
+ if (!(e.flags & FL_CLIENT))
+ if (!(e.spawnflags & SPAWNFLAG_ITEM_THROWN))
+ base_mapentity_init (e);
+ #endif
+
+ #ifdef CSQC
+ base_mapentity_init (e);
+ #endif
+
+ // both a (part of a) corpse and an item -- CEV
+ e.classgroup |= CG_CORPSE | CG_ITEM;
+
+ #ifdef SSQC
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
+ #endif
+
+ #ifdef CSQC
+ setmodelindex (e, e.modelindex);
+ #endif
+
+ if (!(e.flags & FL_CLIENT))
+ // let's not change the player name lol -- CEV
+ e.netname = iit.name;
+
+ // so we can be picked up -- CEV
+ e.flags |= FL_FINDABLE_NONSOLID;
+
+ // so we are pushed & teleported -- CEV
+ e.stateflags |= STATE_PUSHABLE | STATE_TELEPORTABLE;
+
+ #ifdef CSQC
+ e.drawmask = DRAWMASK_NORMAL;
+ e.predraw = base_item_predraw;
+ #endif
+
+ #ifdef SSQC
+ // in case we're converting an existing entity -- CEV
+ // clear potential leftover flags -- CEV
+ if (e.flags & FL_MONSTER)
+ e.flags &= ~FL_MONSTER;
+
+ if (e.flags & FL_FLY)
+ e.flags &= ~FL_FLY;
+
+ if (e.flags & FL_SWIM)
+ e.flags &= ~FL_SWIM;
+
+ // make sure destroy func is inactive -- CEV
+ if (e.th_destroy)
+ e.th_destroy = sub_nulldestroy;
+
+ // make sure we won't take damage -- CEV
+ e.takedamage = DAMAGE_NO;
+
+ if (e.spawnflags & SPAWNFLAG_ITEM_THROWN)
+ if (e.flags & FL_CLIENT)
+ e.flags &= ~FL_ONGROUND;
+
+ if (e.spawnflags & SPAWNFLAG_ITEM_THROWABLE_SOLID)
+ {
+ // explicitly flagged as solid -- CEV
+ e.solid = SOLID_BBOX;
+ }
+ else if (e.spawnflags & SPAWNFLAG_ITEM_THROWN)
+ {
+ // thrown (as-in ThrowGib) -- CEV
+ if (e.owner && e.owner.classtype == CT_PLAYER)
+ e.solid = SOLID_SLIDEBOX;
+ else
+ e.solid = SOLID_TRIGGER;
+
+ e.think = base_item_throwable_think;
+ e.nextthink = time + 0.1;
+ }
+ else
+ {
+ // otherwise spawn nonsolid -- CEV
+ e.solid = SOLID_NOT;
+ }
+
+ if (self.spawnflags & SPAWNFLAG_ITEM_SUSPENDED)
+ {
+ // suspended so FLY and no touch displacement -- CEV
+ e.movetype = MOVETYPE_FLY;
+ e.touch = sub_null;
+ }
+ else
+ {
+ // otherwise bounce & displacement (KickGib) -- CEV
+ e.movetype = MOVETYPE_BOUNCE;
+ e.touch = base_item_throwable_touch;
+ }
+
+ // TODO CEV
+ e.angles.y = e.owner.angles.y + iit.view_angles_offset.y;
+
+ // send this entity to CSQC -- CEV
+ if (!e.SendEntity)
+ {
+ e.classgroup |= CG_FRAMETICK;
+ e.contentstransition = base_item_contentstransition;
+ e.watertype = e.owner.watertype;
+
+ e.SendEntity = base_entity_netsend;
+ e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
+ e.tick = base_item_neteval;
+ }
+ else if (e.classtype == CT_PLAYER)
+ {
+ e.SendFlags |= NETFLAG_PLAYER_MODEL |
+ NETFLAG_PLAYER_SOLID | NETFLAG_PLAYER_SIZE;
+ }
+ #endif
+
+ // now set bounding box if we're solid -- CEV
+ if (e.solid)
+ setsize (e, iit.world_mins, iit.world_maxs);
+ else
+ setsize (e, '0 0 0', '0 0 0');
+
+ setorigin (e, e.origin);
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ strip void() base_item_throwable =
+ {
+ base_item_throwable_init (self);
+ };
+#endif
+// };
+
+//----------------------------------------------------------------------
+// original progs_dump 3 / DeadStuff entity spawn functions -- CEV
+//----------------------------------------------------------------------
+
+#ifdef SSQC
+
+//----------------------------------------------------------------------
+#define ITEM_GIB(igs) \
+/* { */ \
+ BASE_ITEM_PREINIT (__NULL__) \
+ self.weapon = igs; \
+ base_item_throwable_init (self); \
+/* } */
+
+/*QUAKED gib_misc_1 (0 0.5 0.8) (-8 -8 -8) (8 8 8) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/gib1.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_misc_1: base_item_throwable
+// {
+ void() gib_misc_1 = { ITEM_GIB (ITEM_SEQ_GIB1) };
+// };
+
+/*QUAKED gib_misc_2 (0 0.5 0.8) (-8 -8 -8) (8 8 8) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/gib2.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_misc_2: base_item_throwable
+// {
+ void() gib_misc_2 = { ITEM_GIB (ITEM_SEQ_GIB2) };
+// };
+
+/*QUAKED gib_misc_3 (0 0.5 0.8) (-8 -8 -8) (8 8 8) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/gib3.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_misc_3: base_item_throwable
+// {
+ void() gib_misc_3 = { ITEM_GIB (ITEM_SEQ_GIB3) };
+// };
+
+/*QUAKED gib_head_demon (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_demon.mdl");
+}
+*/
+//----------------------------------------------------------------------
+// class gib_head_demon: base_item_throwable
+// {
+ void() gib_head_demon = { ITEM_GIB (ITEM_SEQ_HEAD_DEMON) };
+// };
+
+/*QUAKED gib_head_dog (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_dog.mdl");
+}
+*/
+//----------------------------------------------------------------------
+// class gib_head_dog: base_item_throwable
+// {
+ void() gib_head_dog = { ITEM_GIB (ITEM_SEQ_HEAD_DOG) };
+// };
+
+/*QUAKED gib_head_enforcer (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_mega.mdl");
+}
+*/
+//----------------------------------------------------------------------
+// class gib_head_enforcer: base_item_throwable
+// {
+ void() gib_head_enforcer = { ITEM_GIB (ITEM_SEQ_HEAD_ENFORCER) };
+// };
+
+/*QUAKED gib_head_hell_knight (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_hellkn.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_head_hell_knight: base_item_throwable
+// {
+ void() gib_head_hell_knight = { ITEM_GIB (ITEM_SEQ_HEAD_HELLKNIGHT) };
+// };
+
+/*QUAKED gib_head_knight (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_knight.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_head_knight: base_item_throwable
+// {
+ void() gib_head_knight = { ITEM_GIB (ITEM_SEQ_HEAD_KNIGHT) };
+// };
+
+/*QUAKED gib_head_ogre (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_ogre.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_head_ogre: base_item_throwable
+// {
+ void() gib_head_ogre = { ITEM_GIB (ITEM_SEQ_HEAD_OGRE) };
+// };
+
+/*QUAKED gib_head_player (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_player.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_head_player: base_item_throwable
+// {
+ void() gib_head_player = { ITEM_GIB (ITEM_SEQ_HEAD_PLAYER) };
+// };
+
+/*QUAKED gib_head_shalrath (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_shal.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_head_shalrath: base_item_throwable
+// {
+ void() gib_head_shalrath = { ITEM_GIB (ITEM_SEQ_HEAD_SHALRATH) };
+// };
+
+/*QUAKED gib_head_shambler (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_shams.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_head_shambler: base_item_throwable
+// {
+ void() gib_head_shambler = { ITEM_GIB (ITEM_SEQ_HEAD_SHAMBLER) };
+// };
+
+/*QUAKED gib_head_army (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_guard.mdl");
+}
+*/
+//----------------------------------------------------------------------
+// class gib_head_army: base_item_throwable
+// {
+ void() gib_head_army = { ITEM_GIB (ITEM_SEQ_HEAD_ARMY) };
+// };
+
+/*QUAKED gib_head_wizard (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_wizard.mdl");
+}*/
+//----------------------------------------------------------------------
+// class gib_head_wizard: base_item_throwable
+// {
+ void() gib_head_wizard = { ITEM_GIB (ITEM_SEQ_HEAD_WIZARD) };
+// };
+
+/*QUAKED gib_head_zombie (0 0.5 0.8) (-16 -16 0) (16 16 56) SOLID X X X X X X X NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER X NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
+{
+model ("progs/h_zombie.mdl");
+}
+*/
+//----------------------------------------------------------------------
+// class gib_head_zombie: base_item_throwable
+// {
+ void() gib_head_zombie = { ITEM_GIB (ITEM_SEQ_HEAD_ZOMBIE) };
+// };
+
+#undef ITEM_GIB
+#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/items/weapons.qc
diff --git a/qc/items/weapons.qc b/qc/items/weapons.qc
index 9ca280b..0012039 100644
--- a/qc/items/weapons.qc
+++ b/qc/items/weapons.qc
@@ -2,9 +2,6 @@
// items/weapons.qc -- weapons
//==============================================================================
-// TODO CEV .weapon is being used for default inventory slot AND
-// the item_seq index. This is a conflict.
-
//======================================================================
// constants
//======================================================================
@@ -15,14 +12,14 @@
//----------------------------------------------------------------------
typedef enum
{
- ITEM_WEAPON_AXE = 1, // id1 weapons first
- ITEM_WEAPON_SHOTGUN = 2,
- ITEM_WEAPON_SUPERSHOTGUN = 3,
- ITEM_WEAPON_NAILGUN = 4,
- ITEM_WEAPON_SUPERNAILGUN = 5,
- ITEM_WEAPON_GRENADELAUNCHER = 6,
- ITEM_WEAPON_ROCKETLAUNCHER = 7,
- ITEM_WEAPON_LIGHTNINGGUN = 8
+ ITEM_WEAPON_SLOT_AXE = 1, // id1 weapons first
+ ITEM_WEAPON_SLOT_SHOTGUN = 2,
+ ITEM_WEAPON_SLOT_SUPERSHOTGUN = 3,
+ ITEM_WEAPON_SLOT_NAILGUN = 4,
+ ITEM_WEAPON_SLOT_SUPERNAILGUN = 5,
+ ITEM_WEAPON_SLOT_GRENADELAUNCHER = 6,
+ ITEM_WEAPON_SLOT_ROCKETLAUNCHER = 7,
+ ITEM_WEAPON_SLOT_LIGHTNINGGUN = 8
} item_info_weapon_defaultslots;
const float AMMO_SHELLS_WP = 5; // shells on weapon pickup; id1 5
@@ -38,6 +35,12 @@ const float WEAPON_RESPAWN_TIME = 30; // as the name suggests; id1 30
//======================================================================
// base_item_weapon
+#ifdef CSQC
+void(float isnew) base_item_weapon_netreceive;
+#endif
+#ifdef SSQC
+void(vector p1, vector p2, entity from, float damage) fire_lightning;
+#endif
#ifdef SSQC
// BASE_ITEM_WEAPON_HAVEWEAPON(p, w)
// BASE_ITEM_WEAPON_SLOTEMPTY(slot, p)
@@ -45,8 +48,6 @@ const float WEAPON_RESPAWN_TIME = 30; // as the name suggests; id1 30
// BASE_ITEM_WEAPON_ADDWEAPON(p, w, slot)
void(entity grabber, entity wep) base_item_weapon_grab;
void() base_item_weapon_touch;
-entity(entity src, vector org, vector vel, float fl, void(entity) init_fn)
- spawn_base_item_weapon;
void(string key, string value) base_item_weapon_init_field;
#endif
#if defined(CSQC) || defined(SSQC)
@@ -56,118 +57,17 @@ void(entity e) base_item_weapon_init;
strip void() base_item_weapon;
#endif
-// weapon_axe
-#ifdef CSQC
-void(float isnew) weapon_axe_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_weapon_axe;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_axe_init;
-#endif
#ifdef SSQC
+//----------------------------------------------------------------------
+// original id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
void() weapon_axe;
-#endif
-
-// weapon_shotgun
-#ifdef CSQC
-void(float isnew) weapon_shotgun_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_weapon_shotgun;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_shotgun_init;
-#endif
-#ifdef SSQC
void() weapon_shotgun;
-#endif
-
-// weapon_supershotgun
-#ifdef CSQC
-void(float isnew) weapon_supershotgun_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_weapon_supershotgun;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_supershotgun_init;
-#endif
-#ifdef SSQC
void() weapon_supershotgun;
-#endif
-
-// weapon_nailgun
-#ifdef CSQC
-void(float isnew) weapon_nailgun_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_weapon_nailgun;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_nailgun_init;
-#endif
-#ifdef SSQC
void() weapon_nailgun;
-#endif
-
-// weapon_supernailgun
-#ifdef CSQC
-void(float isnew) weapon_supernailgun_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl) spawn_weapon_supernailgun;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_supernailgun_init;
-#endif
-#ifdef SSQC
void() weapon_supernailgun;
-#endif
-
-// weapon_grenadelauncher
-#ifdef CSQC
-void(float isnew) weapon_grenadelauncher_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_grenadelauncher;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_grenadelauncher_init;
-#endif
-#ifdef SSQC
void() weapon_grenadelauncher;
-#endif
-
-// weapon_rocketlauncher
-#ifdef CSQC
-void(float isnew) weapon_rocketlauncher_netreceive;
-#endif
-#ifdef SSQC
-entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_rocketlauncher;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_rocketlauncher_init;
-#endif
-#ifdef SSQC
void() weapon_rocketlauncher;
-#endif
-
-// weapon_lightning
-#ifdef CSQC
-void(float isnew) weapon_lightning_netreceive;
-#endif
-#ifdef SSQC
-void(vector p1, vector p2, entity from, float damage) fire_lightning;
-entity(entity src, vector org, vector vel, float fl) spawn_weapon_lightning;
-#endif
-#if defined(CSQC) || defined(SSQC)
-void(entity e) weapon_lightning_init;
-#endif
-#ifdef SSQC
void() weapon_lightning;
#endif
@@ -176,20 +76,79 @@ void() weapon_lightning;
//----------------------------------------------------------------------
// class base_item_weapon: base_item
// {
+#ifdef CSQC
+ //--------------------------------------------------------------
+ void(float isnew) base_item_weapon_netreceive =
+ {
+ // creates a number of variables, including netflags -- CEV
+ BASE_ITEM_NETRECEIVE (base_item_weapon_init)
+ };
+#endif
+
+#ifdef SSQC
+ //--------------------------------------------------------------
+ // this is here 'cause LG doesn't create a projectile... -- CEV
+ // TODO CEV
+ //--------------------------------------------------------------
+ void(vector p1, vector p2, entity from, float damage) fire_lightning =
+ {
+ local entity e1, e2;
+ local vector f;
+
+ f = p2 - p1;
+ normalize (f);
+ f_x = 0 - f_y;
+ f_y = f_x;
+ f_z = 0;
+ f = f * 16;
+
+ e1 = e2 = world;
+
+ traceline (p1, p2, FALSE, from);
+ if (trace_ent.takedamage)
+ {
+ particle (trace_endpos, '0 0 100', 225, damage * 4);
+ t_damage2 (trace_ent, from, from, damage);
+ if (from.classtype == CT_PLAYER)
+ {
+ if (other.classtype == CT_PLAYER)
+ // fly me to the moon
+ trace_ent.velocity_z += 400;
+ }
+ }
+ e1 = trace_ent;
+
+ traceline (p1 + f, p2 + f, FALSE, from);
+ if (trace_ent != e1 && trace_ent.takedamage)
+ {
+ particle (trace_endpos, '0 0 100', 225, damage * 4);
+ t_damage2 (trace_ent, from, from, damage);
+ }
+ e2 = trace_ent;
+
+ traceline (p1 - f, p2 - f, FALSE, from);
+ if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage)
+ {
+ particle (trace_endpos, '0 0 100', 225, damage * 4);
+ t_damage2 (trace_ent, from, from, damage);
+ }
+ };
+#endif
+
#ifdef SSQC
//--------------------------------------------------------------
#define BASE_ITEM_WEAPON_HAVEWEAPON(p, w) \
{ \
local float haveweapon = FALSE; \
- if (p.inventory1 == w.weapon) haveweapon = TRUE; \
- else if (p.inventory2 == w.weapon) haveweapon = TRUE; \
- else if (p.inventory3 == w.weapon) haveweapon = TRUE; \
- else if (p.inventory4 == w.weapon) haveweapon = TRUE; \
- else if (p.inventory5 == w.weapon) haveweapon = TRUE; \
- else if (p.inventory6 == w.weapon) haveweapon = TRUE; \
- else if (p.inventory7 == w.weapon) haveweapon = TRUE; \
- else if (p.inventory8 == w.weapon) haveweapon = TRUE; \
- local item_info_t item = item_info[w.weapon]; \
+ if (p.item[0] == w.weapon) haveweapon = TRUE; \
+ else if (p.item[1] == w.weapon) haveweapon = TRUE; \
+ else if (p.item[2] == w.weapon) haveweapon = TRUE; \
+ else if (p.item[3] == w.weapon) haveweapon = TRUE; \
+ else if (p.item[4] == w.weapon) haveweapon = TRUE; \
+ else if (p.item[5] == w.weapon) haveweapon = TRUE; \
+ else if (p.item[6] == w.weapon) haveweapon = TRUE; \
+ else if (p.item[7] == w.weapon) haveweapon = TRUE; \
+ local item_info_t iit = item_info[w.weapon]; \
}
//--------------------------------------------------------------
@@ -199,35 +158,35 @@ void() weapon_lightning;
switch (xin) \
{ \
case 1: \
- if (p.inventory1 == ITEM_SEQ_HANDS) \
+ if (p.item[0] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
case 2: \
- if (p.inventory2 == ITEM_SEQ_HANDS) \
+ if (p.item[1] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
case 3: \
- if (p.inventory3 == ITEM_SEQ_HANDS) \
+ if (p.item[2] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
case 4: \
- if (p.inventory4 == ITEM_SEQ_HANDS) \
+ if (p.item[3] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
case 5: \
- if (p.inventory5 == ITEM_SEQ_HANDS) \
+ if (p.item[4] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
case 6: \
- if (p.inventory6 == ITEM_SEQ_HANDS) \
+ if (p.item[5] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
case 7: \
- if (p.inventory7 == ITEM_SEQ_HANDS) \
+ if (p.item[6] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
case 8: \
- if (p.inventory8 == ITEM_SEQ_HANDS) \
+ if (p.item[7] == ITEM_SEQ_HANDS) \
slotempty = TRUE; \
break; \
} \
@@ -261,14 +220,14 @@ void() weapon_lightning;
/* assign to the currently selected slot -- CEV */ \
switch (slot) \
{ \
- case 1: p.inventory1 = w.weapon; break; \
- case 2: p.inventory2 = w.weapon; break; \
- case 3: p.inventory3 = w.weapon; break; \
- case 4: p.inventory4 = w.weapon; break; \
- case 5: p.inventory5 = w.weapon; break; \
- case 6: p.inventory6 = w.weapon; break; \
- case 7: p.inventory7 = w.weapon; break; \
- case 8: p.inventory8 = w.weapon; break; \
+ case 1: p.item[0] = w.weapon; break; \
+ case 2: p.item[1] = w.weapon; break; \
+ case 3: p.item[2] = w.weapon; break; \
+ case 4: p.item[3] = w.weapon; break; \
+ case 5: p.item[4] = w.weapon; break; \
+ case 6: p.item[5] = w.weapon; break; \
+ case 7: p.item[6] = w.weapon; break; \
+ case 8: p.item[7] = w.weapon; break; \
} \
} \
}
@@ -286,19 +245,19 @@ void() weapon_lightning;
BASE_ITEM_WEAPON_HAVEWEAPON (pl, wep)
// add ammo first -- CEV
- BASE_ITEM_WEAPON_ADDAMMO (pl, wep, item)
+ BASE_ITEM_WEAPON_ADDAMMO (pl, wep, iit)
// now add the weapon -- CEV
BASE_ITEM_WEAPON_ADDWEAPON (pl, wep, pl.weapon)
// let the player know -- CEV
- BASE_ITEM_PICKUPMESSAGE (pl, item, CHAN_ITEM_WEAPON)
+ BASE_ITEM_PICKUPMESSAGE (pl, iit)
// restrict ammo to game maximums -- CEV
base_entity_boundammo (pl);
// don't re-grab / immediately throw the item -- CEV
- if (pl.button6)
+ if (pl.button4)
pl.flags |= FL_THROW_HELD;
if (pl.classtype == CT_PLAYER && pl.SendEntity)
@@ -345,7 +304,7 @@ void() weapon_lightning;
BASE_ITEM_WEAPON_SLOTEMPTY (self.weapon, other)
// behavior is different if player is holding grab -- CEV
- if (other.button6 && !(other.flags & FL_THROW_HELD))
+ if (other.button4 && !(other.flags & FL_THROW_HELD))
{
// when player is holding grab, don't touch if
// A. they aren't already holding the same weapon or
@@ -367,7 +326,7 @@ void() weapon_lightning;
}
// add ammo from the pickup -- CEV
- BASE_ITEM_WEAPON_ADDAMMO (other, self, item)
+ BASE_ITEM_WEAPON_ADDAMMO (other, self, iit)
// only add the weapon if the player's hands are empty -- CEV
local float destslot = 0;
@@ -382,7 +341,7 @@ void() weapon_lightning;
}
// let the player know -- CEV
- BASE_ITEM_PICKUPMESSAGE (other, item, CHAN_ITEM_WEAPON)
+ BASE_ITEM_PICKUPMESSAGE (other, iit)
// restrict ammo to game maximums -- CEV
base_entity_boundammo (other);
@@ -401,20 +360,6 @@ void() weapon_lightning;
};
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl,
- void(entity) init_fn) spawn_base_item_weapon =
- {
- local entity e = spawn ();
- e.owner = src;
- e.spawnflags = fl;
- e.origin = org;
- e.velocity = vel;
- init_fn (e);
- e.attack_finished = time + 0.5;
- return e;
- };
-
- //--------------------------------------------------------------
void(string key, string value) base_item_weapon_init_field =
{
base_item_init_field (key, value);
@@ -425,32 +370,35 @@ void() weapon_lightning;
//--------------------------------------------------------------
void(entity e) base_item_weapon_init =
{
- e.classgroup |= CG_ITEM_WEAPON;
-
- local item_info_t item = item_info[e.weapon];
+ local item_info_t iit = item_info[e.weapon];
- #ifdef SSQC
- e.touch = base_item_weapon_touch;
- precache_model (item.world_model);
- precache_sound (item.pickup_sound);
- setmodel (e, item.world_model);
- #endif
+ e.classgroup |= CG_ITEM_WEAPON;
+ e.netname = iit.name;
#ifdef CSQC
setmodelindex (e, e.modelindex);
e.modelflags |= MF_ROTATE;
#endif
- e.noise = item.pickup_sound;
- e.netname = item.name;
-
#ifdef SSQC
+ e.classname = iit.classname;
+ e.classtype = iit.classtype;
+ e.touch = base_item_weapon_touch;
+ precache_model (iit.world_model);
+ precache_sound (iit.pickup_sound.wav);
+ setmodel (e, iit.world_model);
+
+ if (!e.dmg && iit.dmg)
+ e.dmg = iit.dmg;
+
+ if (!e.skin && iit.world_skin)
+ e.skin = iit.world_skin;
+
// if we have an owner pull from that entity's ammo pool -- CEV
- if (e.spawnflags & SPAWNFLAG_ITEM_THROWN) {
- if (e.owner)
+ if (e.spawnflags & SPAWNFLAG_ITEM_THROWN && e.owner)
{
local float ammo = 0;
- switch (item.option)
+ switch (iit.option)
{
case ITEM_AMMO_SHELLS:
ammo = AMMO_SHELLS_WP;
@@ -461,9 +409,9 @@ void() weapon_lightning;
else
{
ammo = e.owner.ammo_shells;
- e.ammo_shells = ammo;
e.owner.ammo_shells = 0;
}
+ e.ammo_shells = ammo;
break;
case ITEM_AMMO_NAILS:
ammo = AMMO_NAILS_WP;
@@ -474,9 +422,9 @@ void() weapon_lightning;
else
{
ammo = e.owner.ammo_nails;
- e.ammo_nails = ammo;
e.owner.ammo_nails = 0;
}
+ e.ammo_nails = ammo;
break;
case ITEM_AMMO_ROCKETS:
ammo = AMMO_ROCKETS_WP;
@@ -487,9 +435,9 @@ void() weapon_lightning;
else
{
ammo = e.owner.ammo_rockets;
- e.ammo_rockets = ammo;
e.owner.ammo_rockets = 0;
}
+ e.ammo_rockets = ammo;
break;
case ITEM_AMMO_CELLS:
ammo = AMMO_CELLS_WP;
@@ -500,15 +448,15 @@ void() weapon_lightning;
else
{
ammo = e.owner.ammo_cells;
- e.ammo_cells = ammo;
e.owner.ammo_cells = 0;
}
+ e.ammo_cells = ammo;
break;
default:
dprint (sprintf("base_item_weapon_"
"init: unknown ammo type %g "
"for entity type %s!\n",
- item.option, e.classname));
+ iit.option, e.classname));
break;
}
@@ -519,9 +467,50 @@ void() weapon_lightning;
e.owner.SendFlags |= NETFLAG_PLAYER_WEAPON |
NETFLAG_PLAYER_AMMO;
} }
- } }
+ }
+ else
+ {
+ // no owner, default ammo for weapon pickup -- CEV
+ switch (iit.option)
+ {
+ case ITEM_AMMO_SHELLS:
+ if (!e.ammo_shells)
+ e.ammo_shells = AMMO_SHELLS_WP;
+ break;
+ case ITEM_AMMO_NAILS:
+ if (!e.ammo_nails)
+ e.ammo_nails = AMMO_NAILS_WP;
+ break;
+ case ITEM_AMMO_ROCKETS:
+ if (!e.ammo_rockets)
+ e.ammo_rockets = AMMO_ROCKETS_WP;
+ break;
+ case ITEM_AMMO_CELLS:
+ if (!e.ammo_cells)
+ e.ammo_cells = AMMO_CELLS_WP;
+ break;
+ }
+ }
+
+ // particle offset
+ switch (e.weapon)
+ {
+ case ITEM_SEQ_SUPERSHOTGUN:
+ e.view_ofs = '0 0 33'; break;
+ case ITEM_SEQ_NAILGUN:
+ e.view_ofs = '0 0 31'; break;
+ case ITEM_SEQ_SUPERNAILGUN:
+ e.view_ofs = '0 0 34'; break;
+ case ITEM_SEQ_GRENADELAUNCHER:
+ e.view_ofs = '0 0 28'; break;
+ case ITEM_SEQ_ROCKETLAUNCHER:
+ e.view_ofs = '0 0 32'; break;
+ case ITEM_SEQ_LIGHTNINGGUN:
+ e.view_ofs = '0 0 31'; break;
+ }
#endif
+ // StartItem -- CEV
base_item_init (e);
};
#endif
@@ -535,69 +524,31 @@ void() weapon_lightning;
#endif
// };
-//======================================================================
-// Weapon 1: Ranger's Axe -- johnfitz -- dumptruck_ds from RRP and rubicon2
-//======================================================================
+//----------------------------------------------------------------------
+// id1 & pd3 spawn functions -- CEV
+//----------------------------------------------------------------------
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+#define ITEM_WEP(idx) \
+/* { */ \
+ BASE_ITEM_PREINIT (base_item_weapon_init_field) \
+ self.weapon = idx; \
+ base_item_weapon_init (self);
+/* } */
/*QUAKED weapon_axe (0 .5 .8) (-16 -16 0) (16 16 32)
Axe
*/
//----------------------------------------------------------------------
+// Weapon 1: Ranger's Axe -- johnfitz -- dumptruck_ds from RRP and rubicon2
+//----------------------------------------------------------------------
// class weapon_axe: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_axe_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_axe_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl) spawn_weapon_axe =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_axe_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) weapon_axe_init =
- {
- e.classname = "weapon_axe";
- e.classtype = CT_ITEM_AXE;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_AXE;
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
- void() weapon_axe =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
-
- weapon_axe_init (self);
- };
-#endif
+ void() weapon_axe = { ITEM_WEP (ITEM_SEQ_AXE) };
// };
-//======================================================================
-// Weapon 2: Shotgun -- johnfitz -- dumptruck_ds from RRP and rubicon2
-//======================================================================
-
/*QUAKED weapon_shotgun (0 .5 .8) (-16 -16 0) (16 16 32) X STYLE_1 STYLE_2 X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/g_shotgn.mdl"); }
This is a pickup model that should be used when you want a player to spawn with only an axe and then later get the shotgun: (trigger_take_weapon or reset_items 2 in worldspawn). There are two models to choose from. Spawnflag 2 (the default) selects an unused “classic look” model from Rubicon 2 by metlslime. Spawnflag 4 is an alternate from Slapmap and has been used in a few mods.
@@ -605,489 +556,93 @@ Single-barrelled Shotgun
Shotgun
*/
//----------------------------------------------------------------------
+// Weapon 2: Shotgun -- johnfitz -- dumptruck_ds from RRP and rubicon2
+// new shotgun model by Starshipwaters
+// removed 2 older shotguns that used spawnflags -- dumptruck_ds
+//----------------------------------------------------------------------
// class weapon_shotgun: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_shotgun_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_shotgun_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_shotgun =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_shotgun_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
- void(entity e) weapon_shotgun_init =
- {
- e.classname = "weapon_shotgun";
- e.classtype = CT_ITEM_SHOTGUN;
-
- #ifdef SSQC
- // new shotgun model by Starshipwaters
- // removed 2 older shotguns that used spawnflags -- dumptruck_ds
- e.weapon = ITEM_SEQ_SHOTGUN;
- if (!e.ammo_shells)
- e.ammo_shells = AMMO_SHELLS_WP;
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() weapon_shotgun =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
-
- weapon_shotgun_init (self);
- };
-#endif
+ void() weapon_shotgun = { ITEM_WEP (ITEM_SEQ_SHOTGUN) };
// };
-//======================================================================
-// Weapon 3: Super Shotgun
-//======================================================================
-
/*QUAKED weapon_supershotgun (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/g_shot.mdl"); }
Double-barrelled Shotgun
*/
//----------------------------------------------------------------------
+// Weapon 3: Super Shotgun
+//----------------------------------------------------------------------
// class weapon_supershotgun: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_supershotgun_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_supershotgun_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_supershotgun =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_supershotgun_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
- void(entity e) weapon_supershotgun_init =
- {
- e.classname = "weapon_supershotgun";
- e.classtype = CT_ITEM_SUPER_SHOTGUN;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_SUPERSHOTGUN;
- if (!e.ammo_shells)
- e.ammo_shells = AMMO_SHELLS_WP;
- e.particles_offset = '0 0 33';
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() weapon_supershotgun =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
-
- weapon_supershotgun_init (self);
- };
-#endif
+ void() weapon_supershotgun = { ITEM_WEP (ITEM_SEQ_SUPERSHOTGUN) };
// };
-//======================================================================
-// Weapon 4: Nailgun
-//======================================================================
-
/*QUAKED weapon_nailgun (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/g_nail.mdl"); }
Nailgun
*/
//----------------------------------------------------------------------
+// Weapon 4: Nailgun
+//----------------------------------------------------------------------
// class weapon_nailgun: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_nailgun_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_nailgun_init)
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_nailgun =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_nailgun_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) weapon_nailgun_init =
- {
- e.classname = "weapon_nailgun";
- e.classtype = CT_ITEM_NAILGUN;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_NAILGUN;
- if (!e.ammo_shells)
- e.ammo_nails = AMMO_NAILS_WP;
- e.particles_offset = '0 0 31';
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() weapon_nailgun =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
-
- weapon_nailgun_init (self);
- };
-#endif
+ void() weapon_nailgun = { ITEM_WEP (ITEM_SEQ_NAILGUN) };
// };
-//======================================================================
-// Weapon 5: Super Nailgun
-//======================================================================
-
/*QUAKED weapon_supernailgun (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/g_nail2.mdl"); }
Perforator
*/
//----------------------------------------------------------------------
+// Weapon 5: Super Nailgun
+//----------------------------------------------------------------------
// class weapon_supernailgun: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_supernailgun_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_supernailgun_init)
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_supernailgun =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_supernailgun_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) weapon_supernailgun_init =
- {
- e.classname = "weapon_supernailgun";
- e.classtype = CT_ITEM_SUPER_NAILGUN;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_SUPERNAILGUN;
- if (!e.ammo_shells)
- e.ammo_nails = AMMO_NAILS_WP;
- e.particles_offset = '0 0 34';
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() weapon_supernailgun =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
-
- weapon_supernailgun_init (self);
- };
-#endif
+ void() weapon_supernailgun = { ITEM_WEP (ITEM_SEQ_SUPERNAILGUN) };
// };
-//======================================================================
-// Weapon 6: Grenade Launcher
-//======================================================================
-
/*QUAKED weapon_grenadelauncher (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/g_rock.mdl"); }
Grenade Launcher
*/
//----------------------------------------------------------------------
+// Weapon 6: Grenade Launcher
+//----------------------------------------------------------------------
// class weapon_grenadelauncher: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_grenadelauncher_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_grenadelauncher_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_grenadelauncher =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_grenadelauncher_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) weapon_grenadelauncher_init =
- {
- e.classname = "weapon_grenadelauncher";
- e.classtype = CT_ITEM_GRENADE_LAUNCHER;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_GRENADELAUNCHER;
- if (!e.ammo_shells)
- e.ammo_rockets = AMMO_ROCKETS_WP;
- e.particles_offset = '0 0 28';
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
- void() weapon_grenadelauncher =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
-
- weapon_grenadelauncher_init (self);
- };
-#endif
+ void() weapon_grenadelauncher = { ITEM_WEP (ITEM_SEQ_GRENADELAUNCHER) };
// };
-//======================================================================
-// Weapon 7: Rocket Launcher
-//======================================================================
-
/*QUAKED weapon_rocketlauncher (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/g_rock2.mdl"); }
Rocket Launcher
*/
//----------------------------------------------------------------------
+// Weapon 7: Rocket Launcher
+//----------------------------------------------------------------------
// class weapon_rocketlauncher: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_rocketlauncher_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_rocketlauncher_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_rocketlauncher =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_rocketlauncher_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
- //--------------------------------------------------------------
- void(entity e) weapon_rocketlauncher_init =
- {
- e.classname = "weapon_rocketlauncher";
- e.classtype = CT_ITEM_ROCKET_LAUNCHER;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_ROCKETLAUNCHER;
- if (!e.ammo_shells)
- e.ammo_rockets = AMMO_ROCKETS_WP;
- e.particles_offset = '0 0 32';
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
//--------------------------------------------------------------
- void() weapon_rocketlauncher =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
-
- weapon_rocketlauncher_init (self);
- };
-#endif
+ void() weapon_rocketlauncher = { ITEM_WEP (ITEM_SEQ_ROCKETLAUNCHER) };
// };
-//======================================================================
-// Weapon 8: Lightning Gun
-//======================================================================
-
/*QUAKED weapon_lightning (0 .5 .8) (-16 -16 0) (16 16 32) X X X X X SPAWN_SILENT TRIGGER_SPAWNED SUSPENDED_IN_AIR NOT_ON_EASY NOT_ON_NORMAL NOT_ON_HARD_OR_NIGHTMARE NOT_IN_DEATHMATCH NOT_IN_COOP NOT_IN_SINGLEPLAYER RESPAWN_WITH_DM_EFFECTS NOT_ON_HARD_ONLY NOT_ON_NIGHTMARE_ONLY
{ model("progs/g_light.mdl"); }
Thunderbolt
*/
//----------------------------------------------------------------------
+// Weapon 8: Lightning Gun
+//----------------------------------------------------------------------
// class weapon_lightning: base_item_weapon
// {
-#ifdef CSQC
- //--------------------------------------------------------------
- void(float isnew) weapon_lightning_netreceive =
- {
- // creates a number of variables, including netflags -- CEV
- BASE_ITEM_NETRECEIVE (weapon_lightning_init)
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- // this is here 'cause LG doesn't create a projectile... -- CEV
- //--------------------------------------------------------------
- void(vector p1, vector p2, entity from, float damage) fire_lightning =
- {
- local entity e1, e2;
- local vector f;
-
- f = p2 - p1;
- normalize (f);
- f_x = 0 - f_y;
- f_y = f_x;
- f_z = 0;
- f = f * 16;
-
- e1 = e2 = world;
-
- traceline (p1, p2, FALSE, from);
- if (trace_ent.takedamage)
- {
- particle (trace_endpos, '0 0 100', 225, damage * 4);
- t_damage2 (trace_ent, from, from, damage);
- if (from.classtype == CT_PLAYER)
- {
- if (other.classtype == CT_PLAYER)
- // fly me to the moon
- trace_ent.velocity_z += 400;
- }
- }
- e1 = trace_ent;
-
- traceline (p1 + f, p2 + f, FALSE, from);
- if (trace_ent != e1 && trace_ent.takedamage)
- {
- particle (trace_endpos, '0 0 100', 225, damage * 4);
- t_damage2 (trace_ent, from, from, damage);
- }
- e2 = trace_ent;
-
- traceline (p1 - f, p2 - f, FALSE, from);
- if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage)
- {
- particle (trace_endpos, '0 0 100', 225, damage * 4);
- t_damage2 (trace_ent, from, from, damage);
- }
- };
-
- //--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float fl)
- spawn_weapon_lightning =
- {
- return spawn_base_item_weapon (src, org, vel, fl,
- weapon_lightning_init);
- };
-#endif
-
-#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
- void(entity e) weapon_lightning_init =
- {
- e.classname = "weapon_lightning";
- e.classtype = CT_ITEM_LIGHTNING_GUN;
-
- #ifdef SSQC
- e.weapon = ITEM_SEQ_LIGHTNINGGUN;
- if (!e.ammo_shells)
- e.ammo_cells = AMMO_CELLS_WP;
- e.particles_offset = '0 0 31';
- #endif
-
- e.pos1 = '-16 -16 0';
- e.pos2 = '16 16 56';
-
- // StartItem
- base_item_weapon_init (e);
- };
-#endif
-
-#ifdef SSQC
- //--------------------------------------------------------------
- void() weapon_lightning =
- {
- // remap spawnflags, inhibit spawn, remap fields -- CEV
- BASE_ITEM_PREINIT (base_item_weapon_init_field)
+ void() weapon_lightning = { ITEM_WEP (ITEM_SEQ_LIGHTNINGGUN) };
+// };
- weapon_lightning_init (self);
- };
+#undef ITEM_WEP
#endif
-// };
Return to the top of this page or return to the overview of this repo.
Diff qc/keylock.qc
diff --git a/qc/keylock.qc b/qc/keylock.qc
index b4d9b70..4d8aa83 100644
--- a/qc/keylock.qc
+++ b/qc/keylock.qc
@@ -46,8 +46,8 @@ void(entity e) keylock_set_silver_key;
void(entity e) keylock_set_gold_key;
void(entity e, string key_name) keylock_set_custom_key;
float(entity e) keylock_has_key_set;
-void(entity client, string custom_message,
- void() success_func) keylock_try_to_unlock;
+void(entity client, string custom_message, void() success_func)
+ keylock_try_to_unlock;
#endif
//------------------------------------------------------------------------------
@@ -74,22 +74,20 @@ void(entity e) keylock_init =
local string default_noise3;
local string default_noise4;
- // if (world.worldtype == WORLDTYPE_BASE)
if (world.style == WORLDTYPE_BASE)
{
- default_noise3 = "doors/basetry.wav";
- default_noise4 = "doors/baseuse.wav";
+ default_noise3 = snd_door_base_try.wav;
+ default_noise4 = snd_door_base_use.wav;
}
- // else if (world.worldtype == WORLDTYPE_METAL)
else if (world.style == WORLDTYPE_METAL)
{
- default_noise3 = "doors/runetry.wav";
- default_noise4 = "doors/runeuse.wav";
+ default_noise3 = snd_door_rune_try.wav;
+ default_noise4 = snd_door_rune_use.wav;
}
else
{
- default_noise3 = "doors/medtry.wav";
- default_noise4 = "doors/meduse.wav";
+ default_noise3 = snd_door_med_try.wav;
+ default_noise4 = snd_door_med_use.wav;
}
if (e.noise3 == "")
@@ -188,8 +186,8 @@ The self.cnt functionality is a feature of progs_dump and was not part
of the original game. -- iw
------------------------------------------------------------------------
*/
-void(entity client, string custom_message,
- void() success_func) keylock_try_to_unlock =
+void(entity client, string custom_message, void() success_func)
+ keylock_try_to_unlock =
{
local string s;
@@ -224,7 +222,7 @@ void(entity client, string custom_message,
// the old code in door_fire included a comment from dumptruck_ds
// thanking c0burn re changing CHAN_VOICE to CHAN_ITEM
- sound (self, CHAN_ITEM, self.noise4, 1, ATTN_NORM);
+ sound (self, CHAN_ITEM, self.noise4, VOL_HIGH, ATTN_NORM);
success_func ();
};
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/ambient_sound.qc
diff --git a/qc/misc/ambient_sound.qc b/qc/misc/ambient_sound.qc
index cc8dc18..a7d709a 100644
--- a/qc/misc/ambient_sound.qc
+++ b/qc/misc/ambient_sound.qc
@@ -3,25 +3,6 @@
//==============================================================================
//======================================================================
-// Constants
-//======================================================================
-
-#ifdef SSQC
-const string SND_AMBIENTCOMPHUM = "ambience/comp1.wav";
-const string SND_AMBIENTDRIP = "ambience/drip1.wav";
-const string SND_AMBIENTDRONE = "ambience/drone6.wav";
-const string SND_AMBIENTFIRE = "ambience/fire1.wav";
-const string SND_AMBIENTFBUZZ = "ambience/buzz1.wav";
-const string SND_AMBIENTLBUZZ = "ambience/fl_hum1.wav";
-const string SND_AMBIENTSWIND = "ambience/suck1.wav";
-const string SND_AMBIENTSWAMP1 = "ambience/swamp1.wav";
-const string SND_AMBIENTSWAMP2 = "ambience/swamp2.wav";
-const string SND_AMBIENTWATER1 = "ambience/water1.wav";
-const string SND_AMBIENTWIND2 = "ambience/wind2.wav";
-const string SND_AMBIENTHUNDER = "ambience/thunder1.wav";
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -112,80 +93,78 @@ void() ambient_thunder;
//--------------------------------------------------------------
void(vector source) ambient_sound_comphum =
{
- precache_sound (SND_AMBIENTCOMPHUM);
- ambientsound (source, SND_AMBIENTCOMPHUM,
- VOL_HIGH, ATTN_STATIC);
+ precache_sound (snd_amb_comphum.wav);
+ AMBSOUND (source, snd_amb_comphum)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_drip =
{
- precache_sound (SND_AMBIENTDRIP);
- ambientsound (source, SND_AMBIENTDRIP, VOL_MID, ATTN_STATIC);
+ precache_sound (snd_amb_drip.wav);
+ AMBSOUND (source, snd_amb_drip)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_drone =
{
- precache_sound (SND_AMBIENTDRONE);
- ambientsound (source, SND_AMBIENTDRONE, VOL_MID, ATTN_STATIC);
+ precache_sound (snd_amb_drone.wav);
+ AMBSOUND (source, snd_amb_drone)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_fbuzz =
{
- precache_sound (SND_AMBIENTFBUZZ);
- ambientsound (source, SND_AMBIENTFBUZZ, VOL_HIGH, ATTN_STATIC);
+ precache_sound (snd_amb_buzz_f.wav);
+ AMBSOUND (source, snd_amb_buzz_f)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_fire =
{
- precache_sound (SND_AMBIENTFIRE);
- // attenuate fast
- ambientsound (source, SND_AMBIENTFIRE, VOL_MID, ATTN_STATIC);
+ precache_sound (snd_amb_fire.wav);
+ AMBSOUND (source, snd_amb_fire)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_lbuzz =
{
- precache_sound (SND_AMBIENTLBUZZ);
- ambientsound (source, SND_AMBIENTLBUZZ, VOL_MID, ATTN_STATIC);
+ precache_sound (snd_amb_buzz_l.wav);
+ AMBSOUND (source, snd_amb_buzz_l)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_suckwind =
{
- precache_sound (SND_AMBIENTSWIND);
- ambientsound (source, SND_AMBIENTSWIND, VOL_HIGH, ATTN_STATIC);
+ precache_sound (snd_amb_suckwind.wav);
+ AMBSOUND (source, snd_amb_suckwind)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_swamp1 =
{
- precache_sound (SND_AMBIENTSWAMP1);
- ambientsound (source, SND_AMBIENTSWAMP1, VOL_MID, ATTN_STATIC);
+ precache_sound (snd_amb_swamp_01.wav);
+ AMBSOUND (source, snd_amb_swamp_01)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_swamp2 =
{
- precache_sound (SND_AMBIENTSWAMP2);
- ambientsound (source, SND_AMBIENTSWAMP2, VOL_MID, ATTN_STATIC);
+ precache_sound (snd_amb_swamp_02.wav);
+ AMBSOUND (source, snd_amb_swamp_02)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_water1 =
{
- precache_sound (SND_AMBIENTWATER1);
- ambientsound (source, SND_AMBIENTWATER1, VOL_HIGH, ATTN_STATIC);
+ precache_sound (snd_amb_water1.wav);
+ AMBSOUND (source, snd_amb_water1)
};
//--------------------------------------------------------------
void(vector source) ambient_sound_wind2 =
{
- precache_sound (SND_AMBIENTWIND2);
- ambientsound (source, SND_AMBIENTWIND2, VOL_HIGH, ATTN_STATIC);
+ precache_sound (snd_amb_wind2.wav);
+ AMBSOUND (source, snd_amb_wind2)
};
//--------------------------------------------------------------
@@ -663,11 +642,13 @@ only need one of these in your level. It will play everywhere.
void() ambient_thunder_think =
{
if (random() < 0.5)
- sound (self, CHAN_AUTO, SND_AMBIENTHUNDER,
- VOL_MID, ATTN_NONE);
+ sound (self, snd_amb_thunder.channel,
+ snd_amb_thunder.wav, VOL_MID,
+ snd_amb_thunder.attenuation);
else
- sound (self, CHAN_AUTO, SND_AMBIENTHUNDER,
- VOL_HIGH, ATTN_NONE);
+ sound (self, snd_amb_thunder.channel,
+ snd_amb_thunder.wav, VOL_HIGH,
+ snd_amb_thunder.attenuation);
self.nextthink = time + 40 * random ();
};
@@ -681,9 +662,7 @@ only need one of these in your level. It will play everywhere.
base_ambient_sound_init (e);
// changed from ambient to delayed sound (sounds better)
- precache_sound (SND_AMBIENTHUNDER);
- // this file in not included in the game
- // precache_sound ("ambience/thunder2.wav");
+ precache_sound (snd_amb_thunder.wav);
e.think = ambient_thunder_think;
e.nextthink = time + random ();
};
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/explobox.qc
diff --git a/qc/misc/explobox.qc b/qc/misc/explobox.qc
index 752105d..dbd5c13 100644
--- a/qc/misc/explobox.qc
+++ b/qc/misc/explobox.qc
@@ -3,33 +3,15 @@
//==============================================================================
//======================================================================
-// constants
-//======================================================================
-
-#if defined(CSQC) || defined(SSQC)
-//----------------------------------------------------------------------
-// misc_explobox netflags -- CEV
-//----------------------------------------------------------------------
-typedef enumflags
-{
- NETFLAG_MISC_EXPLOBOX_ORIGIN, // origin has changed
- NETFLAG_MISC_EXPLOBOX_MODEL // model has changed
-} base_explobox_netflags;
-
-const float NETFLAG_MISC_EXPLOBOX_FULLSEND = NETFLAG_MISC_EXPLOBOX_ORIGIN |
- NETFLAG_MISC_EXPLOBOX_MODEL;
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
// base_explobox
#ifdef CSQC
void(float isnew) base_explobox_netreceive;
+float() base_explobox_predraw;
#endif
#ifdef SSQC
-float(entity to, float netflags) base_explobox_netsend;
void(vector dir) base_explobox_destroy;
#endif
#if defined(CSQC) || defined(SSQC)
@@ -64,50 +46,52 @@ void() misc_explobox2;
//--------------------------------------------------------------
void(float isnew) base_explobox_netreceive =
{
- local float netflags = ReadByte ();
+ local float netflags = base_entity_netreceive (isnew);
- if (netflags & NETFLAG_MISC_EXPLOBOX_ORIGIN)
+ if (isnew && !(self.predraw))
{
- self.origin_x = ReadCoord ();
- self.origin_y = ReadCoord ();
- self.origin_z = ReadCoord ();
- }
-
- if (netflags & NETFLAG_MISC_EXPLOBOX_MODEL)
- self.modelindex = ReadShort ();
-
- if (isnew)
if (self.classtype == CT_MISC_EXPLOBOX)
misc_explobox_init (self);
else if (self.classtype == CT_MISC_EXPLOBOX2)
misc_explobox2_init (self);
+ }
+ else
+ {
+ if (netflags & NETFLAG_BASE_ENTITY_MODEL)
+ {
+ setmodelindex (self, self.modelindex);
+
+ if (self.modelindex)
+ self.drawmask = DRAWMASK_NORMAL;
+ else
+ self.drawmask = DRAWMASK_NONE;
+ }
+
+ if (netflags & NETFLAG_BASE_ENTITY_SOLID)
+ {
+ if (self.solid)
+ setsize (self, self.mins, self.maxs);
+ else
+ setsize (self, '0 0 0', '0 0 0');
+
+ if (!(netflags & NETFLAG_BASE_ENTITY_ORIGIN))
+ setorigin (self, self.origin);
+ }
+
+ if (netflags & NETFLAG_BASE_ENTITY_ORIGIN)
+ setorigin (self, self.origin);
+ }
};
-#endif
-#ifdef SSQC
//--------------------------------------------------------------
- float(entity to, float netflags) base_explobox_netsend =
+ float() base_explobox_predraw =
{
- WriteByte (MSG_ENTITY, self.classtype);
-
- if (netflags > 255)
- netflags = NETFLAG_MISC_EXPLOBOX_FULLSEND;
-
- WriteByte (MSG_ENTITY, netflags);
-
- if (netflags & NETFLAG_MISC_EXPLOBOX_ORIGIN)
- {
- WriteCoord (MSG_ENTITY, self.origin_x);
- WriteCoord (MSG_ENTITY, self.origin_y);
- WriteCoord (MSG_ENTITY, self.origin_z);
- }
-
- if (netflags & NETFLAG_MISC_EXPLOBOX_MODEL)
- WriteShort (MSG_ENTITY, self.modelindex);
-
- return TRUE;
+ addentity (self);
+ return PREDRAW_NEXT;
};
+#endif
+#ifdef SSQC
//--------------------------------------------------------------
void(vector dir) base_explobox_destroy =
{
@@ -115,8 +99,7 @@ void() misc_explobox2;
self.classname = "explo_box";
// did say self.owner
t_radiusdamage2 (self, self, 160, world);
- sound (self, CHAN_VOICE, "weapons/r_exp3.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_rocket_explosion)
particle (self.origin, '0 0 0', 75, 255);
self.origin_z = self.origin_z + 32;
@@ -131,9 +114,20 @@ void() misc_explobox2;
//--------------------------------------------------------------
void(entity e) base_explobox_init =
{
+ #ifdef CSQC
+ // setmodelindex will take care of size (mins & maxs) -- CEV
+ e.drawmask = DRAWMASK_NORMAL;
+ e.predraw = base_explobox_predraw;
+ setmodelindex (e, e.modelindex);
+ setorigin (e, e.origin);
+ #endif
+
#ifdef SSQC
- e.destroy = base_explobox_destroy;
+ e.th_destroy = base_explobox_destroy;
+ e.SendEntity = base_entity_netsend;
+ e.SendFlags = NETFLAG_BASE_ENTITY_FULLSEND;
#endif
+
base_mapentity_init (e);
};
#endif
@@ -163,30 +157,15 @@ Explosive box
e.classname = "misc_explobox";
e.classtype = CT_MISC_EXPLOBOX;
- base_explobox_init (e);
-
e.solid = SOLID_BBOX;
e.movetype = MOVETYPE_NONE;
- #ifdef CSQC
- // setmodelindex will take care of size (mins & maxs) -- CEV
- e.solid = SOLID_BSP;
- e.movetype = MOVETYPE_PUSH;
- setmodelindex (e, e.modelindex);
- setorigin (e, e.origin);
- e.drawmask = DRAWMASK_NORMAL;
- #endif
-
#ifdef SSQC
precache_model ("maps/b_explob.bsp");
setmodel (e, "maps/b_explob.bsp");
- precache_sound ("weapons/r_exp3.wav");
+ precache_sound (snd_weapon_rocket_explosion.wav);
e.health = 20;
e.takedamage = DAMAGE_AIM;
- // 1998-09-16 Sliding/not-jumping on monsters/boxes/players
- // fix by Maddes/Kryten
- // TODO CEV
- // e.touch = monster_touch;
e.origin_z = e.origin_z + 2;
local float oldz = e.origin_z;
@@ -197,10 +176,9 @@ Explosive box
"of level at %v\n", e.origin));
remove (e);
}
-
- e.SendEntity = base_explobox_netsend;
- e.SendFlags = NETFLAG_MISC_EXPLOBOX_FULLSEND;
#endif
+
+ base_explobox_init (e);
};
#endif
@@ -233,31 +211,16 @@ Smaller explosive box
e.classname = "misc_explobox2";
e.classtype = CT_MISC_EXPLOBOX2;
- base_explobox_init (e);
-
e.solid = SOLID_BBOX;
e.movetype = MOVETYPE_NONE;
- #ifdef CSQC
- e.solid = SOLID_BSP;
- e.movetype = MOVETYPE_PUSH;
- setmodelindex (e, e.modelindex);
- setorigin (e, e.origin);
- e.drawmask = DRAWMASK_NORMAL;
- #endif
-
#ifdef SSQC
precache_model2 ("maps/b_exbox2.bsp");
setmodel (e, "maps/b_exbox2.bsp");
- precache_sound ("weapons/r_exp3.wav");
+ precache_sound (snd_weapon_rocket_explosion.wav);
e.health = 20;
e.takedamage = DAMAGE_AIM;
- // 1998-09-16 Sliding/not-jumping on monsters/boxes/players
- // fix by Maddes/Kryten
- // TODO CEV
- // e.touch = monster_touch;
-
e.origin_z = e.origin_z + 2;
local float oldz = e.origin_z;
droptofloor ();
@@ -267,10 +230,9 @@ Smaller explosive box
"of level at %v\n", e.origin));
remove (e);
}
-
- e.SendEntity = base_explobox_netsend;
- e.SendFlags = NETFLAG_MISC_EXPLOBOX_FULLSEND;
#endif
+
+ base_explobox_init (e);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/lights.qc
diff --git a/qc/misc/lights.qc b/qc/misc/lights.qc
index a2a6ce7..6260a26 100644
--- a/qc/misc/lights.qc
+++ b/qc/misc/lights.qc
@@ -101,52 +101,37 @@ string(float num) lightstyle_lookup =
{
switch (num)
{
- case 0:
- // 0 normal
- return "m";
- case 1:
- // 1 FLICKER (first variety)
- return "mmnmmommommnonmmonqnmmo";
- case 2:
- // 2 SLOW STRONG PULSE
- return "abcdefghijklmnopqrstuvwxyz"
- "yxwvutsrqponmlkjihgfedcba";
- case 3:
- // 3 CANDLE (first variety)
- return "mmmmmaaaaammmmmaaaaaabcdefgabcdefg";
- case 4:
- // 4 FAST STROBE
- return "mamamamamama";
- case 5:
- // 5 GENTLE PULSE 1
- return "jklmnopqrstuvwxyzyxwvutsrqponmlkj";
- case 6:
- // 6 FLICKER (second variety)
- return "nmonqnmomnmomomno";
- case 7:
- // 7 CANDLE (second variety)
- return "mmmaaaabcdefgmmmmaaaammmaamm";
- case 8:
- // 8 CANDLE (third variety)
- return "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa";
- case 9:
- // 9 SLOW STROBE (fourth variety)
- return "aaaaaaaazzzzzzzz";
- case 10:
- // 10 FLUORESCENT FLICKER
- return "mmamammmmammamamaaamammma";
- case 11:
- // 11 SLOW PULSE NOT FADE TO BLACK
- return "abcdefghijklmnopqrrqponmlkjihgfedcba";
- case 12:
- // 12 BLINK OFF / ON (can be synced with animated
- // textures, e.g. +0light and +1light)
- // textures animate at 5fps but lights are
- // 10fps...
- return "aamm";
- default:
- // DEFAULT
- return "a";
+ // 0 normal
+ case 0: return "m";
+ // 1 FLICKER (first variety)
+ case 1: return "mmnmmommommnonmmonqnmmo";
+ // 2 SLOW STRONG PULSE
+ case 2: return "abcdefghijklmnopqrstuvwxyz"
+ "yxwvutsrqponmlkjihgfedcba";
+ // 3 CANDLE (first variety)
+ case 3: return "mmmmmaaaaammmmmaaaaaabcdefgabcdefg";
+ // 4 FAST STROBE
+ case 4: return "mamamamamama";
+ // 5 GENTLE PULSE 1
+ case 5: return "jklmnopqrstuvwxyzyxwvutsrqponmlkj";
+ // 6 FLICKER (second variety)
+ case 6: return "nmonqnmomnmomomno";
+ // 7 CANDLE (second variety)
+ case 7: return "mmmaaaabcdefgmmmmaaaammmaamm";
+ // 8 CANDLE (third variety)
+ case 8: return "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa";
+ // 9 SLOW STROBE (fourth variety)
+ case 9: return "aaaaaaaazzzzzzzz";
+ // 10 FLUORESCENT FLICKER
+ case 10: return "mmamammmmammamamaaamammma";
+ // 11 SLOW PULSE NOT FADE TO BLACK
+ case 11: return "abcdefghijklmnopqrrqponmlkjihgfedcba";
+ // 12 BLINK OFF / ON (can be synced with animated textures,
+ // e.g. +0light and +1light) textures animate at 5fps but
+ // lights are 10fps...
+ case 12: return "aamm";
+ // DEFAULT
+ default: return "a";
}
};
@@ -170,32 +155,19 @@ string(float num) lightstyle_fade_lookup =
{
switch (num)
{
- case 0:
- return "a";
- case 1:
- return "b";
- case 2:
- return "c";
- case 3:
- return "d";
- case 4:
- return "e";
- case 5:
- return "f";
- case 6:
- return "g";
- case 7:
- return "h";
- case 8:
- return "i";
- case 9:
- return "j";
- case 10:
- return "k";
- case 11:
- return "l";
- case 12:
- return "m";
+ case 0: return "a";
+ case 1: return "b";
+ case 2: return "c";
+ case 3: return "d";
+ case 4: return "e";
+ case 5: return "f";
+ case 6: return "g";
+ case 7: return "h";
+ case 8: return "i";
+ case 9: return "j";
+ case 10: return "k";
+ case 11: return "l";
+ case 12: return "m";
default:
error ("count out of range\n");
break;
@@ -605,10 +577,12 @@ See the "light" entity for a full description.
// for silent torch -- dumptruck_ds
if (!(e.spawnflags && SPAWNFLAG_BASE_LIGHT_SILENT_TORCH))
- ambient_sound_fire (e.origin);
+ {
+ precache_sound (snd_amb_fire.wav);
+ AMBSOUND (e.origin, snd_amb_fire)
+ }
- // TODO CEV
- // makestatic (e);
+ makestatic (e);
};
//--------------------------------------------------------------
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/model.qc
diff --git a/qc/misc/model.qc b/qc/misc/model.qc
index fb1dc06..3f2bb5b 100644
--- a/qc/misc/model.qc
+++ b/qc/misc/model.qc
@@ -7,8 +7,6 @@
// Edited by: dumptruck_ds to add start and stop animations
//==============================================================================
-// TODO CEV the networking could be further optimized
-
//======================================================================
// constants
//======================================================================
@@ -44,20 +42,15 @@ typedef enumflags
typedef enumflags
{
NETFLAG_MISC_MODEL_ORIGIN, // origin has changed
- NETFLAG_MISC_MODEL_MINS, // model size has changed
- NETFLAG_MISC_MODEL_MAXS, // ^^^
+ NETFLAG_MISC_MODEL_SIZE, // model size has changed
NETFLAG_MISC_MODEL_MODEL, // .model has changed
NETFLAG_MISC_MODEL_FRAME, // frame has changed
- NETFLAG_MISC_MODEL_FIRSTFRAME, // first frame
- NETFLAG_MISC_MODEL_LASTFRAME, // last frame
- NETFLAG_MISC_MODEL_STATE // active, inactive
+ NETFLAG_MISC_MODEL_STATEFLAGS // active, inactive
} base_misc_model_netflags;
const float NETFLAG_MISC_MODEL_FULLSEND = NETFLAG_MISC_MODEL_ORIGIN |
- NETFLAG_MISC_MODEL_MINS | NETFLAG_MISC_MODEL_MAXS |
- NETFLAG_MISC_MODEL_MODEL | NETFLAG_MISC_MODEL_FRAME |
- NETFLAG_MISC_MODEL_FIRSTFRAME | NETFLAG_MISC_MODEL_LASTFRAME |
- NETFLAG_MISC_MODEL_STATE;
+ NETFLAG_MISC_MODEL_SIZE | NETFLAG_MISC_MODEL_MODEL |
+ NETFLAG_MISC_MODEL_FRAME | NETFLAG_MISC_MODEL_STATEFLAGS;
#endif
//======================================================================
@@ -69,11 +62,6 @@ const float NETFLAG_MISC_MODEL_FULLSEND = NETFLAG_MISC_MODEL_ORIGIN |
.float last_frame; // The ending frame of the animation
#endif
-#ifdef SSQC
-.vector mdlsz; // additions by bmFbr for custom bbox
-.vector centeroffset;
-#endif
-
//======================================================================
// forward declarations
//======================================================================
@@ -93,6 +81,9 @@ void(entity e) base_misc_model_init;
#endif
// misc_model
+#ifdef SSQC
+void(string key, string value) misc_model_init_field;
+#endif
#if defined(CSQC) || defined(SSQC)
void(entity e) misc_model_init;
#endif
@@ -119,15 +110,11 @@ void() misc_model;
self.origin_z = ReadCoord ();
}
- if (netflags & NETFLAG_MISC_MODEL_MINS)
+ if (netflags & NETFLAG_MISC_MODEL_SIZE)
{
self.mins_x = ReadCoord ();
self.mins_y = ReadCoord ();
self.mins_z = ReadCoord ();
- }
-
- if (netflags & NETFLAG_MISC_MODEL_MAXS)
- {
self.maxs_x = ReadCoord ();
self.maxs_y = ReadCoord ();
self.maxs_z = ReadCoord ();
@@ -139,14 +126,14 @@ void() misc_model;
if (netflags & NETFLAG_MISC_MODEL_FRAME)
newframe = ReadByte ();
- if (netflags & NETFLAG_MISC_MODEL_FIRSTFRAME)
- self.first_frame = ReadByte ();
-
- if (netflags & NETFLAG_MISC_MODEL_LASTFRAME)
- self.last_frame = ReadByte ();
-
- if (netflags & NETFLAG_MISC_MODEL_STATE)
- self.state = ReadByte ();
+ if (netflags & NETFLAG_MISC_MODEL_STATEFLAGS)
+ {
+ local float s1 = ReadByte ();
+ if (s1 & STATE_INACTIVE)
+ self.stateflags |= STATE_INACTIVE;
+ else
+ self.stateflags &= ~STATE_INACTIVE;
+ }
if (isnew && !(self.predraw))
if (self.classtype == CT_MISC_MODEL)
@@ -167,7 +154,7 @@ void() misc_model;
if (self.lerptime)
self.lerpfrac = 1 - (time - self.lerptime) * 10;
- if (self.state == STATE_ACTIVE)
+ if (!(self.stateflags & STATE_INACTIVE))
addentity (self);
return PREDRAW_NEXT;
@@ -178,9 +165,9 @@ void() misc_model;
//--------------------------------------------------------------
float(entity to, float netflags) base_misc_model_netsend =
{
- WriteByte (MSG_ENTITY, self.classtype);
+ BASE_ENTITY_WRITECLASSTYPE ()
- if (netflags > 255)
+ if (netflags > NETFLAG_MISC_MODEL_FULLSEND)
netflags = NETFLAG_MISC_MODEL_FULLSEND;
WriteByte (MSG_ENTITY, netflags);
@@ -192,15 +179,11 @@ void() misc_model;
WriteCoord (MSG_ENTITY, self.origin_z);
}
- if (netflags & NETFLAG_MISC_MODEL_MINS)
+ if (netflags & NETFLAG_MISC_MODEL_SIZE)
{
WriteCoord (MSG_ENTITY, self.mins_x);
WriteCoord (MSG_ENTITY, self.mins_y);
WriteCoord (MSG_ENTITY, self.mins_z);
- }
-
- if (netflags & NETFLAG_MISC_MODEL_MAXS)
- {
WriteCoord (MSG_ENTITY, self.maxs_x);
WriteCoord (MSG_ENTITY, self.maxs_y);
WriteCoord (MSG_ENTITY, self.maxs_z);
@@ -212,14 +195,13 @@ void() misc_model;
if (netflags & NETFLAG_MISC_MODEL_FRAME)
WriteByte (MSG_ENTITY, self.frame);
- if (netflags & NETFLAG_MISC_MODEL_FIRSTFRAME)
- WriteByte (MSG_ENTITY, self.first_frame);
-
- if (netflags & NETFLAG_MISC_MODEL_LASTFRAME)
- WriteByte (MSG_ENTITY, self.last_frame);
-
- if (netflags & NETFLAG_MISC_MODEL_STATE)
- WriteByte (MSG_ENTITY, self.state);
+ if (netflags & NETFLAG_MISC_MODEL_STATEFLAGS)
+ {
+ local float s1 = 0;
+ if (self.stateflags & STATE_INACTIVE)
+ s1 |= STATE_INACTIVE;
+ WriteByte (MSG_ENTITY, s1);
+ }
return TRUE;
};
@@ -230,23 +212,27 @@ void() misc_model;
void() base_misc_model_think =
{
self.nextthink = time + fabs (self.speed);
- if (self.estate != STATE_ACTIVE)
+
+ if (self.stateflags & STATE_INACTIVE)
return;
- self.frame += (self.speed < 0 ? -1 : 1);
+ if (self.frame < 0)
+ self.frame += -1;
+ else
+ self.frame += 1;
if (self.spawnflags &
SPAWNFLAG_BASE_MISC_MODEL_BACK_AND_FORTH &&
self.frame < self.first_frame)
{
- self.speed = -1 * self.speed;
+ self.speed *= -1;
self.frame += 2;
}
else if (self.spawnflags &
SPAWNFLAG_BASE_MISC_MODEL_BACK_AND_FORTH &&
self.frame > self.last_frame)
{
- self.speed = -1 * self.speed;
+ self.speed *= -1;
self.frame -= 2;
}
else
@@ -285,27 +271,33 @@ void() misc_model;
//--------------------------------------------------------------
void() base_misc_model_use =
{
- if (self.state == STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
{
+ // become active -- CEV
if (self.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_SOLID)
- self.solid = SOLID_NOT;
- self.model = "";
+ self.solid = SOLID_BBOX;
- self.state = STATE_INVISIBLE;
+ self.model = self.mdl;
+ setmodel (self, self.model);
setorigin (self, self.origin);
+
+ self.stateflags &= ~STATE_INACTIVE;
}
else
{
+ // become inactive -- CEV
if (self.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_SOLID)
- self.solid = SOLID_BBOX;
- self.model = self.mdl;
+ self.solid = SOLID_NOT;
- self.state = STATE_ACTIVE;
+ self.model = "";
+ setmodel (self, self.model);
setorigin (self, self.origin);
+
+ self.stateflags |= STATE_INACTIVE;
}
// update CSQC
- self.SendFlags |= NETFLAG_MISC_MODEL_STATE;
+ self.SendFlags |= NETFLAG_MISC_MODEL_STATEFLAGS;
};
#endif
@@ -336,6 +328,24 @@ last_frame: The last frame of the animation.
//----------------------------------------------------------------------
// class misc_model: base_misc_model
// {
+#ifdef SSQC
+ //--------------------------------------------------------------
+ void(string key, string value) misc_model_init_field =
+ {
+ switch (key)
+ {
+ // rewrite bmFbr's misc_model fields; will be
+ // consumed in misc_model_init below -- CEV
+ case "centeroffset":
+ self.finaldest = stov (value);
+ break;
+ case "mdlsz":
+ self.finalangle = stov (value);
+ break;
+ }
+ };
+#endif
+
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) misc_model_init =
@@ -344,23 +354,18 @@ last_frame: The last frame of the animation.
e.classtype = CT_MISC_MODEL;
base_misc_model_init (e);
- local vector vmin, vmax;
-
#ifdef CSQC
// only SOLID_BBOX misc_model entities are sent to CSQC -- CEV
e.movetype = MOVETYPE_NONE;
e.solid = SOLID_BBOX;
- vmin = e.mins;
- vmax = e.maxs;
setmodelindex (e, e.modelindex);
setorigin (e, e.origin);
- setsize (e, vmin, vmax);
+ setsize (e, e.mins, e.maxs);
e.drawmask = DRAWMASK_NORMAL;
e.predraw = base_misc_model_predraw;
#endif
#ifdef SSQC
- // TODO CEV
if (known_release == KNOWN_RELEASE_QUAKE3 ||
known_release == KNOWN_RELEASE_CPMA ||
known_release == KNOWN_RELEASE_QUAKELIVE)
@@ -371,23 +376,34 @@ last_frame: The last frame of the animation.
if (!e.mdl || e.mdl == "")
objerror ("Model not defined");
- if (!e.centeroffset)
- e.centeroffset = '0 0 0';
-
- if (!e.mdlsz)
- e.mdlsz = '32 32 32';
-
- vmin_x = e.centeroffset_x - (e.mdlsz_x / 2);
- vmin_y = e.centeroffset_y - (e.mdlsz_y / 2);
- vmin_z = e.centeroffset_z - (e.mdlsz_z / 2);
-
- vmax_x = e.centeroffset_x + (e.mdlsz_x / 2);
- vmax_y = e.centeroffset_y + (e.mdlsz_y / 2);
- vmax_z = e.centeroffset_z + (e.mdlsz_z / 2);
+ if (!e.pos1 && !e.pos2)
+ {
+ if (e.finaldest || e.finalangle)
+ {
+ // bmFbr's fields (rewritten above) -- CEV
+ e.pos1.x = e.finaldest.x - (e.finalangle.x / 2);
+ e.pos1.y = e.finaldest.y - (e.finalangle.y / 2);
+ e.pos1.z = e.finaldest.z - (e.finalangle.z / 2);
+
+ e.pos2.x = e.finaldest.x + (e.finalangle.x / 2);
+ e.pos2.y = e.finaldest.y + (e.finalangle.y / 2);
+ e.pos2.z = e.finaldest.z + (e.finalangle.z / 2);
+
+ // clear the borrowed fields -- CEV
+ e.finaldest = '0 0 0';
+ e.finalangle = '0 0 0';
+ }
+ else
+ {
+ // set a default size -- CEV
+ e.pos1 = '-16 -16 -16';
+ e.pos2 = '16 16 16';
+ }
+ }
precache_model (e.mdl);
setmodel (e, e.mdl);
- setsize (e, vmin, vmax);
+ setsize (e, e.pos1, e.pos2);
if (e.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_SOLID)
e.solid = SOLID_BBOX;
@@ -405,28 +421,15 @@ last_frame: The last frame of the animation.
// Make static (not animate) if not given a frame range, and
// not affected by gravity; also remains active if it has a
// targetname (so it can be killtargeted/toggled)
- if (!e.last_frame &&
+ if (!e.last_frame && !e.targetname && !e.targetname2 &&
!(e.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_GRAVITY) &&
- !(e.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_SOLID) &&
- !e.targetname &&
- !e.targetname2)
- // !(e.spawnflags &
- // SPAWNFLAG_BASE_MISC_MODEL_DONTMAKESTATIC)
+ !(e.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_SOLID))
{
makestatic (e);
+ return;
}
- // Make static (not animate) if not given a frame range, and
- // not affected by gravity
- // changed by bmFbr
- // if (!e.last_frame &&
- // !(e.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_GRAVITY))
- // {
- // makestatic (e);
- // return;
- // }
-
- // if it as a custom animation range
+ // if it has a custom animation range
if (e.last_frame)
{
// Default animation speed to 10 fps
@@ -436,10 +439,12 @@ last_frame: The last frame of the animation.
e.nextthink = time + e.speed;
}
+ // set state to the reverse of expected 'cause model_use
+ // is going to toggle it -- CEV
if (e.spawnflags & SPAWNFLAG_BASE_MISC_MODEL_STARTOFF)
- e.state = STATE_ACTIVE;
+ e.stateflags &= ~STATE_INACTIVE;
else
- e.state = STATE_INVISIBLE;
+ e.stateflags |= STATE_INACTIVE;
sub_runvoidas (e, base_misc_model_use);
@@ -447,14 +452,7 @@ last_frame: The last frame of the animation.
if (e.solid == SOLID_BBOX)
{
e.SendEntity = base_misc_model_netsend;
- // send everything (at first)
- e.SendFlags |= NETFLAG_MISC_MODEL_ORIGIN |
- NETFLAG_MISC_MODEL_MINS |
- NETFLAG_MISC_MODEL_MAXS |
- NETFLAG_MISC_MODEL_MODEL |
- NETFLAG_MISC_MODEL_FRAME |
- NETFLAG_MISC_MODEL_FIRSTFRAME |
- NETFLAG_MISC_MODEL_LASTFRAME;
+ e.SendFlags = NETFLAG_MISC_MODEL_FULLSEND;
}
#endif
};
@@ -464,6 +462,8 @@ last_frame: The last frame of the animation.
//--------------------------------------------------------------
void() misc_model =
{
+ base_mapentity_init_spawndata (misc_model_init_field);
+
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/modeltrain.qc
diff --git a/qc/misc/modeltrain.qc b/qc/misc/modeltrain.qc
index c8bf8d2..3a6f398 100644
--- a/qc/misc/modeltrain.qc
+++ b/qc/misc/modeltrain.qc
@@ -81,10 +81,11 @@ void() misc_modeltrain;
// train just went from stopped to moving or vice-versa,
// and have both animations set
- if (self.state != self.owner.state &&
+ if ((self.stateflags & STATE_WAITING) !=
+ (self.owner.stateflags & STATE_WAITING) &&
self.owner.style != MISC_MODELTRAIN_STYLE_SINGLEANIM)
{
- if (self.owner.state)
+ if (!(self.owner.stateflags & STATE_WAITING))
// just started moving
self.owner.frame = zeroconvert (
self.owner.first_frame2);
@@ -95,11 +96,15 @@ void() misc_modeltrain;
// reset back/forth status
self.owner.distance = 1;
- self.state = self.owner.state;
+
+ if (self.owner.stateflags & STATE_WAITING)
+ self.stateflags |= STATE_WAITING;
+ else
+ self.stateflags &= ~STATE_WAITING;
}
else
{
- if (self.state &&
+ if (!(self.stateflags & STATE_WAITING) &&
self.owner.style !=
MISC_MODELTRAIN_STYLE_SINGLEANIM)
{
@@ -152,7 +157,7 @@ void() misc_modeltrain;
self.think = temp_anim_controller_think;
- if (self.state ||
+ if (!(self.stateflags & STATE_WAITING) ||
self.owner.style == MISC_MODELTRAIN_STYLE_SINGLEANIM)
{
self.nextthink = time + self.owner.frtime;
@@ -177,7 +182,7 @@ void() misc_modeltrain;
{
e.classname = "animcontroller";
e.classtype = CT_TEMP_ANIM_CONTROLLER;
- e.state = 0;
+ e.stateflags |= STATE_WAITING;
base_tempentity_init (e);
if (!e.owner)
@@ -289,6 +294,9 @@ void() misc_modeltrain;
e.animtype2 = e.animtype;
e.frame = e.first_frame;
+
+ // always spawn waiting -- CEV
+ e.stateflags |= STATE_WAITING;
#endif
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/noisemaker.qc
diff --git a/qc/misc/noisemaker.qc b/qc/misc/noisemaker.qc
index a69b50a..d77ef49 100644
--- a/qc/misc/noisemaker.qc
+++ b/qc/misc/noisemaker.qc
@@ -6,8 +6,8 @@
// forward declarations
//======================================================================
-#ifdef SSQC
// misc_noisemaker
+#ifdef SSQC
void() misc_noisemaker_think;
void(entity e) misc_noisemaker_init;
void() misc_noisemaker;
@@ -27,13 +27,13 @@ For optimzation testing, starts a lot of sounds.
void() misc_noisemaker_think =
{
self.nextthink = time + 0.5;
- sound (self, 1, "enforcer/enfire.wav", VOL_HIGH, ATTN_NORM);
- sound (self, 2, "enforcer/enfstop.wav", VOL_HIGH, ATTN_NORM);
- sound (self, 3, "enforcer/sight1.wav", VOL_HIGH, ATTN_NORM);
- sound (self, 4, "enforcer/sight2.wav", VOL_HIGH, ATTN_NORM);
- sound (self, 5, "enforcer/sight3.wav", VOL_HIGH, ATTN_NORM);
- sound (self, 6, "enforcer/sight4.wav", VOL_HIGH, ATTN_NORM);
- sound (self, 7, "enforcer/pain1.wav", VOL_HIGH, ATTN_NORM);
+ sound (self, 1, snd_enforcer_fire.wav, VOL_HIGH, ATTN_NORM);
+ sound (self, 2, snd_enforcer_fire_hit.wav, VOL_HIGH, ATTN_NORM);
+ sound (self, 3, snd_enforcer_sight_01.wav, VOL_HIGH, ATTN_NORM);
+ sound (self, 4, snd_enforcer_sight_02.wav, VOL_HIGH, ATTN_NORM);
+ sound (self, 5, snd_enforcer_sight_03.wav, VOL_HIGH, ATTN_NORM);
+ sound (self, 6, snd_enforcer_sight_04.wav, VOL_HIGH, ATTN_NORM);
+ sound (self, 7, snd_enforcer_pain_01.wav, VOL_HIGH, ATTN_NORM);
};
//--------------------------------------------------------------
@@ -43,16 +43,16 @@ For optimzation testing, starts a lot of sounds.
e.classtype = CT_MISC_NOISEMAKER;
base_mapentity_init (e);
- precache_sound2 ("enforcer/enfire.wav");
- precache_sound2 ("enforcer/enfstop.wav");
- precache_sound2 ("enforcer/sight1.wav");
- precache_sound2 ("enforcer/sight2.wav");
- precache_sound2 ("enforcer/sight3.wav");
- precache_sound2 ("enforcer/sight4.wav");
- precache_sound2 ("enforcer/pain1.wav");
- precache_sound2 ("enforcer/pain2.wav");
- precache_sound2 ("enforcer/death1.wav");
- precache_sound2 ("enforcer/idle1.wav");
+ precache_sound2 (snd_enforcer_fire.wav);
+ precache_sound2 (snd_enforcer_fire_hit.wav);
+ precache_sound2 (snd_enforcer_sight_01.wav);
+ precache_sound2 (snd_enforcer_sight_02.wav);
+ precache_sound2 (snd_enforcer_sight_03.wav);
+ precache_sound2 (snd_enforcer_sight_04.wav);
+ precache_sound2 (snd_enforcer_pain_01.wav);
+ precache_sound2 (snd_enforcer_pain_02.wav);
+ precache_sound2 (snd_enforcer_death.wav);
+ precache_sound2 (snd_enforcer_idle.wav);
e.think = misc_noisemaker_think;
e.nextthink = time + 0.1 + random ();
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/particle_spray.qc
diff --git a/qc/misc/particle_spray.qc b/qc/misc/particle_spray.qc
index 88ff48b..d7d4158 100644
--- a/qc/misc/particle_spray.qc
+++ b/qc/misc/particle_spray.qc
@@ -5,14 +5,6 @@
//==============================================================================
//======================================================================
-// fields
-//======================================================================
-
-#ifdef SSQC
-.float duration;
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -52,12 +44,15 @@ Shoots particles either when triggered, or contiuously when not triggered by any
if (!self.targetname || self.attack_finished > time)
self.nextthink = time + self.delay;
- if (self.noise != "")
+ if (self.noise != __NULL__ && self.noise != "")
+ {
sound (self, CHAN_AUTO, self.noise,
VOL_HIGH, ATTN_NORM);
+ }
else
- sound (self, CHAN_AUTO, "misc/null.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_null)
+ }
};
//--------------------------------------------------------------
@@ -86,9 +81,10 @@ Shoots particles either when triggered, or contiuously when not triggered by any
if (e.delay <= 0)
e.delay = 0.1;
- if (e.noise != "")
+ if (e.noise != __NULL__ && e.noise != "")
precache_sound (e.noise);
- precache_sound ("misc/null.wav");
+
+ precache_sound (snd_null.wav);
e.think = misc_particlespray_think;
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/particle_stream.qc
diff --git a/qc/misc/particle_stream.qc b/qc/misc/particle_stream.qc
index 6a54adb..6199e7a 100644
--- a/qc/misc/particle_stream.qc
+++ b/qc/misc/particle_stream.qc
@@ -104,7 +104,7 @@ I used the info_notnull, but you should be able to target anything
if (!e.cnt)
e.cnt = e.dmg;
if (!e.noise)
- e.noise = "misc/null.wav";
+ e.noise = snd_null.wav;
precache_sound (e.noise);
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/play.qc
diff --git a/qc/misc/play.qc b/qc/misc/play.qc
index f38b312..7cf9317 100644
--- a/qc/misc/play.qc
+++ b/qc/misc/play.qc
@@ -90,18 +90,21 @@ void() play_mflash_use;
void(entity e) play_mflash_init;
void() play_mflash;
+// base_play_light
+void() base_play_light_use;
+void(string key, string value) base_play_light_init_field;
+void(entity e) base_play_light_init;
+strip void() base_play_light;
+
// play_bfield
-void() play_bfield_use
void(entity e) play_bfield_init;
void() play_bfield;
// play_brlight
-void() play_brlight_use;
void(entity e) play_brlight_init;
void() play_brlight;
// play_dimlight
-void() play_dimlight_use;
void(entity e) play_dimlight_init;
void() play_dimlight;
#endif
@@ -134,16 +137,16 @@ void() play_dimlight;
{
if (self.spawnflags & SPAWNFLAG_BASE_PLAY_SOUND_TOGGLE)
{
- if (self.state == 0)
+ if (!(self.stateflags & STATE_INACTIVE))
{
- self.state = 1;
+ self.stateflags |= STATE_INACTIVE;
sound (self, self.impulse, self.noise,
self.volume, self.speed);
}
else
{
- self.state = 0;
- sound (self, self.impulse, "misc/null.wav",
+ self.stateflags &= STATE_INACTIVE;
+ sound (self, self.impulse, snd_null.wav,
self.volume, self.speed);
}
}
@@ -162,7 +165,7 @@ void() play_dimlight;
base_mapentity_init (e);
precache_sound (e.noise);
- precache_sound ("misc/null.wav");
+ precache_sound (snd_null.wav);
if (e.volume == 0)
e.volume = 1;
if (e.speed == 0)
@@ -420,12 +423,15 @@ Use noise key for a custom sound.
void() play_lavasplash_use =
{
// thanks Khreathor -- dumptruck_ds
- if (self.noise != "")
+ if (self.noise != __NULL__ && self.noise != "")
+ {
sound (self, CHAN_AUTO, self.noise,
VOL_HIGH, ATTN_NORM);
+ }
else
- sound (self, CHAN_AUTO, "boss1/out1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_boss_out1)
+ }
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_LAVASPLASH);
@@ -442,10 +448,10 @@ Use noise key for a custom sound.
base_mapentity_init (e);
- if (e.noise != "")
+ if (e.noise != __NULL__ && e.noise != "")
precache_sound (e.noise);
- precache_sound("boss1/out1.wav");
+ precache_sound (snd_boss_out1.wav);
e.use = play_lavasplash_use;
};
@@ -472,29 +478,31 @@ Use noise key for a custom sound.
// -- dumptruck_ds -- thanks to Spike for helping with errors
if (self.style == 1)
{
- BASE_ITEM_GIB_THROW (v, random() * -80, item_gib1_init)
- BASE_ITEM_GIB_THROW (v, random() * -80, item_gib2_init)
- BASE_ITEM_GIB_THROW (v, random() * -80, item_gib3_init)
- BASE_ITEM_GIB_THROW (v, random() * -75, item_gib1_init)
- BASE_ITEM_GIB_THROW (v, random() * -75, item_gib2_init)
- BASE_ITEM_GIB_THROW (v, random() * -75, item_gib3_init)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB1, v, random()*-80)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB2, v, random()*-80)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB3, v, random()*-80)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB1, v, random()*-75)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB2, v, random()*-75)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB3, v, random()*-75)
}
else
{
- BASE_ITEM_GIB_THROW (v, random() * -65, item_gib1_init)
- BASE_ITEM_GIB_THROW (v, random() * -65, item_gib2_init)
- BASE_ITEM_GIB_THROW (v, random() * -65, item_gib3_init)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB1, v, random()*-65)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB2, v, random()*-65)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB3, v, random()*-65)
}
if (self.fly_sound != 1)
return;
if (random() < 0.5)
- sound (self, CHAN_VOICE, "player/gib.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_gib_01)
+ }
else
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_udeath)
+ }
};
//--------------------------------------------------------------
@@ -614,59 +622,93 @@ triggable muzzle flash effect entity
};
// };
-/*QUAKED play_bfield (0 .5 .8) (-8 -8 -8) (8 8 8)
-a triggerable, spherical field of yellow particles
-state 1 = start on
-*/
//----------------------------------------------------------------------
-// class play_bfield: base_mapentity
+// class base_play_light: base_mapentity
// {
//--------------------------------------------------------------
- void() play_bfield_use =
+ void() base_play_light_use =
{
- if (!self.state)
+ if (self.stateflags & STATE_INACTIVE)
{
- self.state = 1;
- self.effects = self.effects | EF_BRIGHTFIELD;
+ // become active
+ self.stateflags &= ~STATE_INACTIVE;
+ self.effects |= self.aflag;
sound (self, CHAN_AUTO, self.noise,
VOL_HIGH, ATTN_NORM);
}
else
{
- self.state = 0;
- self.effects = self.effects -
- (self.effects & EF_BRIGHTFIELD);
+ // become inactive
+ self.stateflags |= STATE_INACTIVE;
+ self.effects &= ~self.aflag;
sound (self, CHAN_AUTO, self.noise,
VOL_HIGH, ATTN_NORM);
}
};
//--------------------------------------------------------------
- void(entity e) play_bfield_init =
+ void(string key, string value) base_play_light_init_field =
{
- e.classname = "play_bfield";
- e.classtype = CT_MISC_PLAY_BFIELD;
+ switch (key)
+ {
+ case "state":
+ if (stof(value))
+ self.stateflags &= ~STATE_INACTIVE;
+ break;
+ }
+ };
+ //--------------------------------------------------------------
+ void(entity e) base_play_light_init =
+ {
base_mapentity_init (e);
+ e.movetype = MOVETYPE_NONE;
+ e.solid = SOLID_NOT;
+ e.use = base_play_light_use;
+
precache_model ("progs/s_null.spr");
if (e.noise != "")
precache_sound (e.noise);
setmodel (e, "progs/s_null.spr");
- setorigin (e, e.origin);
- e.movetype = MOVETYPE_NONE;
- e.solid = SOLID_NOT;
setsize (e, '0 0 0', '0 0 0');
- if (e.state)
- e.effects = e.effects | EF_BRIGHTFIELD;
+ setorigin (e, e.origin);
- e.use = play_bfield_use;
+ if (!(e.stateflags & STATE_INACTIVE))
+ e.effects = e.effects | EF_DIMLIGHT;
+ };
+
+ //--------------------------------------------------------------
+ strip void() base_play_light =
+ {
+ base_play_light_init (self);
+ };
+// };
+
+/*QUAKED play_bfield (0 .5 .8) (-8 -8 -8) (8 8 8)
+a triggerable, spherical field of yellow particles
+state 1 = start on
+*/
+//----------------------------------------------------------------------
+// class play_bfield: base_play_light
+// {
+ //--------------------------------------------------------------
+ void(entity e) play_bfield_init =
+ {
+ e.classname = "play_bfield";
+ e.classtype = CT_MISC_PLAY_BFIELD;
+ e.aflag = EF_BRIGHTFIELD;
+
+ base_play_light_init (e);
};
//--------------------------------------------------------------
void() play_bfield =
{
+ self.stateflags |= STATE_INACTIVE;
+ base_mapentity_init_spawndata (base_play_light_init_field);
+
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;
@@ -680,55 +722,24 @@ a triggerable bright lighting effect
state 1 = start on
*/
//----------------------------------------------------------------------
-// class play_brlight: base_mapentity
+// class play_brlight: base_play_light
// {
//--------------------------------------------------------------
- void() play_brlight_use =
- {
- // dumptruck_ds -- thanks to c0burn
- if (!self.state)
- {
- self.state = 1;
- self.effects = self.effects | EF_BRIGHTLIGHT;
- sound (self, CHAN_AUTO, self.noise,
- VOL_HIGH, ATTN_NORM);
- }
- else
- {
- self.state = 0;
- self.effects = self.effects -
- (self.effects & EF_BRIGHTLIGHT);
- sound (self, CHAN_AUTO, self.noise,
- VOL_HIGH, ATTN_NORM);
- }
- };
-
- //--------------------------------------------------------------
void(entity e) play_brlight_init =
{
e.classname = "play_brlight";
e.classtype = CT_MISC_PLAY_BRLIGHT;
+ e.aflag = EF_BRIGHTLIGHT;
- base_mapentity_init (e);
-
- precache_model ("progs/s_null.spr");
- if (e.noise != "")
- precache_sound (e.noise);
-
- setmodel (e, "progs/s_null.spr");
- setorigin (e, e.origin);
- e.movetype = MOVETYPE_NONE;
- e.solid = SOLID_NOT;
- setsize (e, '0 0 0', '0 0 0');
- if (e.state)
- e.effects = e.effects | EF_BRIGHTLIGHT;
-
- e.use = play_brlight_use;
+ base_play_light_init (e);
};
//--------------------------------------------------------------
void() play_brlight =
{
+ self.stateflags |= STATE_INACTIVE;
+ base_mapentity_init_spawndata (base_play_light_init_field);
+
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;
@@ -742,55 +753,24 @@ a triggerable lighting effect
state 1 = start on
*/
//----------------------------------------------------------------------
-// class play_dimlight: base_mapentity
+// class play_dimlight: base_play_light
// {
//--------------------------------------------------------------
- void() play_dimlight_use =
- {
- if (!self.state)
- {
- self.state = 1;
- self.effects = self.effects | EF_DIMLIGHT;
- sound (self, CHAN_AUTO, self.noise,
- VOL_HIGH, ATTN_NORM);
- }
- else
- {
- self.state = 0;
- self.effects = self.effects -
- (self.effects & EF_DIMLIGHT);
- sound (self, CHAN_AUTO, self.noise,
- VOL_HIGH, ATTN_NORM);
- }
- };
-
- //--------------------------------------------------------------
void(entity e) play_dimlight_init =
{
e.classname = "play_dimlight";
e.classtype = CT_MISC_PLAY_DIMLIGHT;
+ e.aflag = EF_DIMLIGHT;
- base_mapentity_init (e);
-
- precache_model ("progs/s_null.spr");
- if (e.noise != "")
- precache_sound (e.noise);
-
- setmodel (e, "progs/s_null.spr");
- // setorigin (e, e.origin);
- e.movetype = MOVETYPE_NONE;
- e.solid = SOLID_NOT;
- setsize (e, '0 0 0', '0 0 0');
- if (e.state)
- e.effects = e.effects | EF_DIMLIGHT;
- setorigin (e, e.origin);
-
- e.use = play_dimlight_use;
+ base_play_light_init (e);
};
//--------------------------------------------------------------
void() play_dimlight =
{
+ self.stateflags |= STATE_INACTIVE;
+ base_mapentity_init_spawndata (base_play_light_init_field);
+
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/sparks.qc
diff --git a/qc/misc/sparks.qc b/qc/misc/sparks.qc
index f510d65..152a5e3 100644
--- a/qc/misc/sparks.qc
+++ b/qc/misc/sparks.qc
@@ -32,11 +32,11 @@ typedef enumflags
typedef enum
{
TEMP_SPARK_FADE1, // animation states for temp_spark
- TEMP_SPARK_FADE2,
- TEMP_SPARK_FADE3,
+ TEMP_SPARK_FADE2, // stored in .aflag even though
+ TEMP_SPARK_FADE3, // these aren't flags -- CEV
TEMP_SPARK_FADE4,
TEMP_SPARK_REMOVE
-} temp_spark_states;
+} temp_spark_flags;
#endif
//======================================================================
@@ -71,14 +71,14 @@ void() misc_sparks;
//--------------------------------------------------------------
void() temp_spark_think =
{
- if (self.state == TEMP_SPARK_REMOVE)
+ if (self.aflag == TEMP_SPARK_REMOVE)
{
remove (self);
return;
}
self.alpha -= 0.2;
- self.state += 1;
+ self.aflag += 1;
self.nextthink = time + 0.05;
};
@@ -127,7 +127,7 @@ void() misc_sparks;
setorigin (e, e.origin);
setsize (e, '0 0 0', '0 0 0');
- e.state = TEMP_SPARK_FADE1;
+ e.aflag = TEMP_SPARK_FADE1;
e.think = temp_spark_think;
e.nextthink = time + 0.5 + 1.5 * random();
};
@@ -181,12 +181,17 @@ Keys:
}
if (self.sounds == 1)
- if (self.noise != "")
+ {
+ if (self.noise != __NULL__ && self.noise != "")
+ {
sound (self, CHAN_AUTO, self.noise,
VOL_HIGH, ATTN_STATIC);
+ }
else
- sound (self, CHAN_AUTO, "enforcer/enfstop.wav",
- VOL_HIGH, ATTN_STATIC);
+ {
+ SOUND (self, snd_misc_spark)
+ }
+ }
sub_usetargets ();
self.think = misc_sparks_think_turnofflight;
@@ -221,7 +226,7 @@ Keys:
precache_model ("progs/spark.mdl");
if (!e.noise)
- precache_sound ("dump/spark.wav");
+ precache_sound (snd_misc_spark.wav);
else
precache_sound (e.noise);
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/target_autosave.qc
diff --git a/qc/misc/target_autosave.qc b/qc/misc/target_autosave.qc
index 21478fd..4bc691c 100644
--- a/qc/misc/target_autosave.qc
+++ b/qc/misc/target_autosave.qc
@@ -58,21 +58,21 @@ the bprint tends to stomp any other prints on screen in most quake clients, so u
if (!e)
break;
- if (e.estate == STATE_ACTIVE)
+ if (e.stateflags & STATE_INACTIVE)
{
- e.estate = STATE_INACTIVE;
+ e.stateflags &= ~STATE_INACTIVE;
if (!printed)
{
- bprint ("Autosaves disabled\n");
+ bprint ("Autosaves reenabled\n");
printed = TRUE;
}
}
else
{
- e.estate = STATE_ACTIVE;
+ e.stateflags |= STATE_INACTIVE;
if (!printed)
{
- bprint ("Autosaves reenabled\n");
+ bprint ("Autosaves disabled\n");
printed = TRUE;
}
}
@@ -83,7 +83,7 @@ the bprint tends to stomp any other prints on screen in most quake clients, so u
//--------------------------------------------------------------
void() target_autosave_use =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
if (self.enemy)
@@ -113,7 +113,6 @@ the bprint tends to stomp any other prints on screen in most quake clients, so u
return;
}
- // sound(activator, CHAN_VOICE, "misc/sav.wav", 0.3, ATTN_NORM);
target_autosave_save (activator, self.message);
};
@@ -127,7 +126,6 @@ the bprint tends to stomp any other prints on screen in most quake clients, so u
if (e.message == __NULL__ || e.message == "")
e.message = "auto";
- // precache_sound2 ("misc/sav.wav");
e.use = target_autosave_use;
};
Return to the top of this page or return to the overview of this repo.
Diff qc/misc/teleporttrain.qc
diff --git a/qc/misc/teleporttrain.qc b/qc/misc/teleporttrain.qc
index 34c130b..9c33f53 100644
--- a/qc/misc/teleporttrain.qc
+++ b/qc/misc/teleporttrain.qc
@@ -235,10 +235,6 @@ If a targetname is set, it must be triggered to start moving, otherwise it will
// spawner -- dumptruck_ds
e.avelocity = '40 80 120';
- // precache_sound ("misc/null.wav");
- // e.noise = "misc/null.wav";
- // e.noise1 = "misc/null.wav";
-
e.think = misc_teleporttrain_find;
if (e.ltime)
e.nextthink = e.ltime + 0.1;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/boss.qc
diff --git a/qc/monsters/boss.qc b/qc/monsters/boss.qc
index 8aeff92..d8093f5 100644
--- a/qc/monsters/boss.qc
+++ b/qc/monsters/boss.qc
@@ -190,8 +190,7 @@ $frame shockc9 shockc10
base_monster_fire_lavaball (org, d - org, LAVABALL_SPEED);
- sound (self, CHAN_WEAPON, "boss1/throw.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_throw)
// check for dead enemy
if (self.enemy.health <= 0)
@@ -242,14 +241,12 @@ $frame shockc9 shockc10
//--------------------------------------------------------------
void() boss_rise1 = [$rise1, boss_rise2]
{
- sound (self, CHAN_WEAPON, "boss1/out1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_out1)
F ()
};
void() boss_rise2 = [$rise2, boss_rise3]
{
- sound (self, CHAN_VOICE, "boss1/sight1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_sight)
F ()
};
void() boss_rise3 = [$rise3, boss_rise4] { F () };
@@ -350,8 +347,7 @@ $frame shockc9 shockc10
//--------------------------------------------------------------
void() boss_death1 = [$death1, boss_death2]
{
- sound (self, CHAN_VOICE, "boss1/death.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_death)
F ()
};
void() boss_death2 = [$death2, boss_death3] { F () };
@@ -363,8 +359,7 @@ $frame shockc9 shockc10
void() boss_death8 = [$death8, boss_death9] { F () };
void() boss_death9 = [$death9, boss_death10]
{
- sound (self, CHAN_BODY, "boss1/out1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_out1)
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_LAVASPLASH);
WriteCoord (MSG_BROADCAST, self.origin_x);
@@ -459,13 +454,13 @@ $frame shockc9 shockc10
precache_model ("progs/lavaball.mdl");
- precache_sound ("weapons/rocket1i.wav");
- precache_sound ("boss1/out1.wav");
- precache_sound ("boss1/sight1.wav");
- precache_sound ("misc/power.wav");
- precache_sound ("boss1/throw.wav");
- precache_sound ("boss1/pain.wav");
- precache_sound ("boss1/death.wav");
+ precache_sound (snd_weapon_nailgun.wav);
+ precache_sound (snd_boss_out1.wav);
+ precache_sound (snd_boss_throw.wav);
+ precache_sound (snd_misc_power.wav);
+ precache_sound (snd_boss_throw.wav);
+ precache_sound (snd_boss_pain.wav);
+ precache_sound (snd_boss_death.wav);
total_monsters = total_monsters + 1;
@@ -555,11 +550,9 @@ Just for boss level.
return;
}
- if ((le1.state != FUNC_STATE_TOP &&
- le1.state != FUNC_STATE_BOTTOM) ||
- (le2.state != FUNC_STATE_TOP &&
- le2.state != FUNC_STATE_BOTTOM)
- || (le1.state != le2.state))
+ if ((le1.aflag != FMF_TOP && le1.aflag != FMF_BOTTOM) ||
+ (le2.aflag != FMF_TOP&&le2.aflag != FMF_BOTTOM)
+ || (le1.aflag != le2.aflag))
{
// dprint ("not aligned\n");
return;
@@ -570,8 +563,7 @@ Just for boss level.
le2.nextthink = -1;
lightning_end = time + 1;
- sound (self, CHAN_VOICE, "misc/power.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_misc_power)
event_lightning_fire ();
// advance the boss pain if down
@@ -581,10 +573,9 @@ Just for boss level.
return;
boss.enemy = activator;
- if (le1.state == FUNC_STATE_TOP && boss.health > 0)
+ if (le1.aflag == FMF_TOP && boss.health > 0)
{
- sound (boss, CHAN_VOICE, "boss1/pain.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (boss, snd_boss_pain)
boss.health = boss.health - 1;
if (boss.health >= 2)
sub_runvoidas (boss, boss_shocka1);
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/boss2.qc
diff --git a/qc/monsters/boss2.qc b/qc/monsters/boss2.qc
index 60f1377..8b9bf63 100644
--- a/qc/monsters/boss2.qc
+++ b/qc/monsters/boss2.qc
@@ -214,8 +214,7 @@ $frame shockc9 shockc10
base_monster_fire_lavaball (org, d - org, LAVABALL_SPEED);
- sound (self, CHAN_WEAPON, "boss1/throw.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_throw)
// check for dead enemy
if (self.enemy.health <= 0)
@@ -227,16 +226,13 @@ $frame shockc9 shockc10
//--------------------------------------------------------------
void(vector dir) monster_boss2_gib =
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
- // throw tons of meat chunks
+ SOUND (self, snd_player_udeath)
+ // throw tons of meat chunks
local vector boss;
local float x, y, z;
local float r;
- // local entity n;
-
- local void(entity e) func1;
+ local float gtype;
boss = self.origin;
z = 16;
@@ -255,11 +251,11 @@ $frame shockc9 shockc10
r = random ();
if (r < 0.3)
{
- func1 = item_gib1_init;
+ gtype = ITEM_SEQ_GIB1;
}
else if (r < 0.5)
{
- func1 = item_gib2_init;
+ gtype = ITEM_SEQ_GIB2;
}
// FIXME TODO CEV
// else if (r < 0.7)
@@ -267,9 +263,9 @@ $frame shockc9 shockc10
// -120);
else
{
- func1 = item_gib3_init;
+ gtype = ITEM_SEQ_GIB3;
}
- BASE_ITEM_GIB_THROW (dir, -120, func1)
+ BASE_ITEM_THROWABLE (gtype,dir,-120)
y = y + 32;
}
x = x + 32;
@@ -358,14 +354,12 @@ $frame shockc9 shockc10
//--------------------------------------------------------------
void() boss2_rise1 = [$rise1, boss2_rise2]
{
- sound (self, CHAN_WEAPON, "boss1/out1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_out1)
F ()
};
void() boss2_rise2 = [$rise2, boss2_rise3]
{
- sound (self, CHAN_VOICE, "boss1/sight1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_sight)
F ()
};
void() boss2_rise3 = [$rise3, boss2_rise4] { F () };
@@ -470,8 +464,7 @@ $frame shockc9 shockc10
void() boss2_pain4 = [$shocka4, boss2_pain5]
{
// pain noise
- sound (self, CHAN_VOICE, "boss1/pain.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_pain)
F ()
};
void() boss2_pain5 = [$shocka5, boss2_pain6] { F () };
@@ -489,8 +482,7 @@ $frame shockc9 shockc10
//--------------------------------------------------------------
void() boss2_death1 = [$death1, boss2_death2]
{
- sound (self, CHAN_VOICE, "boss1/death.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_death)
F ()
};
void() boss2_death2 = [$death2, boss2_death3] { F () };
@@ -502,8 +494,7 @@ $frame shockc9 shockc10
void() boss2_death8 = [$death8, boss2_death9] { F () };
void() boss2_death9 = [$death9, boss2_death10]
{
- sound (self, CHAN_BODY, "boss1/out1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_out1)
if (!(self.spawnflags & SPAWNFLAG_MONSTER_BOSS2_NO_LAVASPLASH))
{
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
@@ -549,9 +540,12 @@ $frame shockc9 shockc10
//--------------------------------------------------------------
void(vector dir) monster_boss2_destroy =
{
+ self.deadflag |= DF_DEAD;
+
if (self.health < -50)
{
// if health under -15
+ self.deadflag |= DF_GIBBED;
monster_boss2_gib (dir);
return;
}
@@ -589,7 +583,7 @@ $frame shockc9 shockc10
self.th_run = boss2_atk1;
self.th_pain = monster_boss2_pain;
- self.destroy = monster_boss2_destroy;
+ self.th_destroy = monster_boss2_destroy;
// give the boss a couple of seconds to finish rising
// before allowing it to go into its pain animation -- iw
@@ -652,19 +646,19 @@ $frame shockc9 shockc10
precache_model ("progs/h_boss.mdl");
precache_model ("progs/lavaball.mdl");
precache_model ("progs/h_boss.mdl");
-
- precache_sound ("weapons/rocket1i.wav");
- precache_sound ("boss1/out1.wav");
- precache_sound ("boss1/sight1.wav");
- precache_sound ("misc/power.wav");
- precache_sound ("boss1/throw.wav");
- precache_sound ("boss1/pain.wav");
- precache_sound ("boss1/death.wav");
-
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+
+ precache_sound (snd_weapon_nailgun.wav);
+ precache_sound (snd_boss_out1.wav);
+ precache_sound (snd_boss_sight.wav);
+ precache_sound (snd_misc_power.wav);
+ precache_sound (snd_boss_throw.wav);
+ precache_sound (snd_boss_pain.wav);
+ precache_sound (snd_boss_death.wav);
+
total_monsters = total_monsters + 1;
e.classgroup |= CG_MONSTER;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/demon.qc
diff --git a/qc/monsters/demon.qc b/qc/monsters/demon.qc
index 736b754..61b9ae2 100644
--- a/qc/monsters/demon.qc
+++ b/qc/monsters/demon.qc
@@ -116,13 +116,6 @@ Fiend.
Default heath = 300"
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : ""Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound"
-snd_hit(string) : "Path to custom hit sound (DEMON SLASHING)"
-snd_idle(string) : "Path to custom idle sound"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
skin_head(float) : "Skin index of custom head model"
@@ -159,9 +152,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -259,8 +249,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
if (monster_demon1_checkjump())
{
self.attack_state = AS_MISSILE;
- sound (self, CHAN_VOICE, "demon/djump.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_demon1_jump)
return TRUE;
}
@@ -270,8 +259,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_demon1_sightsound =
{
- sound (self, CHAN_VOICE, "demon/sight2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_demon1_sight2)
};
//--------------------------------------------------------------
@@ -293,8 +281,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
if (!can_damage(self, self.enemy))
return;
- sound (self, CHAN_WEAPON, "demon/dhit2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_demon1_hit2)
ldmg = 10 + 5 * random ();
t_damage2 (self.enemy, self, self, ldmg);
@@ -347,8 +334,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() dem1_walk1 = [$walk1, dem1_walk2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "demon/idle1.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_demon1_idle1)
+ }
ai_walk (8);
F ()
};
@@ -366,8 +354,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() dem1_run1 = [$run1, dem1_run2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "demon/idle1.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_demon1_idle1)
+ }
ai_run (20);
F ()
};
@@ -387,7 +376,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_face ();
// fix for instakill bug -- dumptruck_ds
- self.pm_flags &= ~PMF_JUMP_HELD;
+ self.moveflags &= ~PMF_JUMP_HELD;
self.touch = monster_demon1_touch;
makevectors (self.angles);
self.origin_z = self.origin_z + 1;
@@ -479,8 +468,6 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() dem1_die1 = [$death1, dem1_die2]
{
base_entity_aligntoground (self);
- sound (self, CHAN_VOICE, "demon/ddeath.wav",
- VOL_HIGH, ATTN_NORM);
F ()
};
void() dem1_die2 = [$death2, dem1_die3] { F () };
@@ -525,8 +512,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
return;
self.pain_finished = time + 1;
- sound (self, CHAN_VOICE, "demon/dpain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_demon1_pain)
if (random() * 200 > damage)
// didn't flinch
@@ -538,28 +524,28 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_demon1_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -80)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_demon1_death;
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_demon_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
base_entity_remove (self);
- return;
- }
-
- // regular death
- base_item_drop_stuff (self);
- dem1_die1 ();
+ else
+ dem1_die1 ();
};
//--------------------------------------------------------------
@@ -576,7 +562,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
if (vlen(self.velocity) > 400)
{
- if (!(self.pm_flags & PMF_JUMP_HELD))
+ if (!(self.moveflags & PMF_JUMP_HELD))
{
ldmg = 40 + 10 * random();
t_damage2 (other, self, self, ldmg);
@@ -584,7 +570,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// Preach's instakill bug check
// - dumptruck_ds
if (other.health > 0)
- self.pm_flags |= PMF_JUMP_HELD;
+ self.moveflags |= PMF_JUMP_HELD;
}
}
}
@@ -663,12 +649,18 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// precache_model ("progs/gib2.mdl");
// precache_model ("progs/gib3.mdl");
- precache_sound ("demon/ddeath.wav");
- precache_sound ("demon/dhit2.wav");
- precache_sound ("demon/djump.wav");
- precache_sound ("demon/dpain1.wav");
- precache_sound ("demon/idle1.wav");
- precache_sound ("demon/sight2.wav");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_DEMON;
+
+ precache_sound (snd_demon1_death.wav);
+ precache_sound (snd_demon1_hit2.wav);
+ precache_sound (snd_demon1_jump.wav);
+ precache_sound (snd_demon1_pain.wav);
+ precache_sound (snd_demon1_idle1.wav);
+ precache_sound (snd_demon1_sight2.wav);
// set up model and size for later -- CEV
e.mdl = "progs/demon.mdl";
@@ -678,7 +670,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.health = DEMON1_HEALTH;
e.checkattack = monster_demon1_checkattack;
- e.destroy = monster_demon1_destroy;
+ e.th_destroy = monster_demon1_destroy;
e.sightsound = monster_demon1_sightsound;
e.th_stand = dem1_stand1;
e.th_walk = dem1_walk1;
@@ -687,7 +679,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_missile = dem1_jump1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_demon1_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/dog.qc
diff --git a/qc/monsters/dog.qc b/qc/monsters/dog.qc
index bde7715..f70ee17 100644
--- a/qc/monsters/dog.qc
+++ b/qc/monsters/dog.qc
@@ -168,9 +168,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -278,9 +275,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_dog_sightsound =
{
- // dumptruck_ds
- sound (self, CHAN_VOICE, "dog/dsight.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_dog_sight)
};
//--------------------------------------------------------------
@@ -336,9 +331,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() dog_walk1 = [$walk1, dog_walk2]
{
if (random() < 0.2)
- // dumptruck_ds
- sound (self, CHAN_VOICE, "dog/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_dog_idle)
+ }
ai_walk (8);
F ()
};
@@ -356,9 +351,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() dog_run1 = [$run1, dog_run2]
{
if (random() < 0.2)
- // dumptruck_ds
- sound (self, CHAN_VOICE, "dog/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_dog_idle)
+ }
ai_run (16);
F ()
};
@@ -382,9 +377,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() dog_atta3 = [$attack3, dog_atta4] { ai_charge (10); F () };
void() dog_atta4 = [$attack4, dog_atta5]
{
- // dumptruck_ds
- sound (self, CHAN_VOICE, "dog/dattack1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_dog_attack1)
monster_dog_bite ();
F ()
};
@@ -401,7 +394,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_face ();
// fix for instakill bug -- dumptruck_ds
- self.pm_flags &= ~PMF_JUMP_HELD;
+ self.moveflags &= ~PMF_JUMP_HELD;
self.touch = monster_dog_touch_jump;
makevectors (self.angles);
self.origin_z = self.origin_z + 1;
@@ -502,7 +495,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
if (self.origin != self.origin_net)
self.SendFlags |= NETFLAG_BASE_ENTITY_ORIGIN |
NETFLAG_BASE_ENTITY_FRAME;
- else if (self.frame_net != self.frame)
+ else if (self.frame != self.frame_net)
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME;
};
@@ -515,10 +508,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(entity attacker, float damage) monster_dog_pain =
{
- // dumptruck_ds
- sound (self, CHAN_VOICE, "dog/dpain1.wav",
- VOL_HIGH, ATTN_NORM);
-
+ SOUND (self, snd_dog_pain)
if (random() > 0.5)
dog_pain1 ();
else
@@ -528,35 +518,37 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_dog_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -35)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
-
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_dog_init)
-
- base_entity_remove (self);
- return;
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_dog_death;
}
- // regular death
- // dumptruck_ds
- sound (self, CHAN_VOICE, "dog/ddeath.wav", VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd)
self.solid = SOLID_NOT;
- base_item_drop_stuff (self);
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
+ base_monster_item_dropitems (dir);
- if (random() > 0.5)
- dog_die1 ();
+ if (self.deadflag & DF_GIBBED)
+ {
+ base_entity_remove (self);
+ }
else
- dog_dieb1 ();
+ {
+ if (random() > 0.5)
+ dog_die1 ();
+ else
+ dog_dieb1 ();
+ }
};
//--------------------------------------------------------------
@@ -573,7 +565,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
if (vlen(self.velocity) > 300)
{
- if (!(self.pm_flags & PMF_JUMP_HELD))
+ if (!(self.moveflags & PMF_JUMP_HELD))
{
ldmg = 10 + 10 * random();
t_damage2 (other, self, self, ldmg);
@@ -581,7 +573,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// Preach's instakill bug check
// - dumptruck_ds
if (other.health > 0)
- self.pm_flags |= PMF_JUMP_HELD;
+ self.moveflags |= PMF_JUMP_HELD;
}
}
}
@@ -663,16 +655,22 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
#ifdef SSQC
precache_model ("progs/h_dog.mdl");
precache_model ("progs/dog.mdl");
- precache_sound ("dog/dattack1.wav");
- precache_sound ("dog/ddeath.wav");
- precache_sound ("dog/dpain1.wav");
- precache_sound ("dog/dsight.wav");
- precache_sound ("dog/idle.wav");
-
- precache_model ("progs/gib1.mdl");
- precache_model ("progs/gib2.mdl");
+ // precache_model ("progs/gib1.mdl");
+ // precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_DOG;
+
+ precache_sound (snd_dog_attack1.wav);
+ precache_sound (snd_dog_death.wav);
+ precache_sound (snd_dog_idle.wav);
+ precache_sound (snd_dog_pain.wav);
+ precache_sound (snd_dog_sight.wav);
+
// set up model and size for later -- CEV
e.mdl = "progs/dog.mdl";
@@ -681,7 +679,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.health = DOG_HEALTH;
e.checkattack = monster_dog_checkattack;
- e.destroy = monster_dog_destroy;
+ e.th_destroy = monster_dog_destroy;
e.sightsound = monster_dog_sightsound;
e.th_stand = dog_stand1;
e.th_walk = dog_walk1;
@@ -690,7 +688,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_missile = dog_leap1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_dog_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/enforcer.qc
diff --git a/qc/monsters/enforcer.qc b/qc/monsters/enforcer.qc
index fbaf94e..25f2a06 100644
--- a/qc/monsters/enforcer.qc
+++ b/qc/monsters/enforcer.qc
@@ -165,17 +165,6 @@ style(Choices) : "Attack type"
2 : "grenades"
3 : "nails"
-snd_death(string) : Path to custom death sound"
-snd_pain(string) : "Path to 1st custom pain sound"
-snd_sight(string) : "Path to custom sight sound for STOP!"
-snd_attack(string) : Path to custom attack sound e.g laser firing"
-snd_hit(string) : "Path to custom hit sound e.g. laser hits wall"
-snd_idle(string) : "Path to custom idle sound"
-snd_misc(string) : "Path to custom sight sound for FREEZE!"
-snd_misc1(string) : "Path to custom sight sound for YOU THERE!"
-snd_misc2(string) : "Path to custom sight sound for HALT!"
-snd_misc3(string) : "Path to 2nd custom pain sound"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
mdl_proj(string) : "Path to custom projectile model"
@@ -216,9 +205,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -261,18 +247,21 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
rsnd = rint (random() * 3);
if (rsnd == 1)
- // dumptruck_ds
- sound (self, CHAN_VOICE, "enforcer/sight1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_enforcer_sight_01)
+ }
else if (rsnd == 2)
- sound (self, CHAN_VOICE, "enforcer/sight2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_enforcer_sight_02)
+ }
else if (rsnd == 0)
- sound (self, CHAN_VOICE, "enforcer/sight3.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_enforcer_sight_03)
+ }
else
- sound (self, CHAN_VOICE, "enforcer/sight4.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_enforcer_sight_04)
+ }
};
//--------------------------------------------------------------
@@ -283,8 +272,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
local vector org, dir;
self.effects = self.effects | EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "weapons/lstart.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_lightning_start)
ai_face ();
makevectors (self.angles);
org = self.origin + v_forward * 30 + v_right * 8.5 + '0 0 16';
@@ -318,8 +306,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
self.effects = self.effects | EF_MUZZLEFLASH;
ai_face ();
- sound (self, CHAN_WEAPON, "enforcer/enfire.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_enforcer_fire)
makevectors (self.angles);
// last number was 16 - dumptruck_ds
@@ -343,15 +330,14 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
(v_forward * 30 + v_right * 8.5 + '0 0 16');
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
base_monster_fire_grenade (org1,
- 40, 40, self.attack_elevation);
+ 40, 40, self.t_height);
else
base_monster_fire_grenade (org1, 40, 40, 0);
return;
}
else if (self.style == 3 || self.style == 5)
{
- sound (self, CHAN_WEAPON, "weapons/spike2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_supernailgun)
self.effects = self.effects | EF_MUZZLEFLASH;
makevectors (self.angles);
@@ -401,9 +387,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() enf_walk1 = [$walk1, enf_walk2]
{
if (random() < 0.2)
- // dumptruck_ds
- sound (self, CHAN_VOICE, "enforcer/idle1.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_enforcer_idle)
+ }
ai_walk (2);
F ()
};
@@ -429,9 +415,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() enf_run1 = [$run1, enf_run2]
{
if (random() < 0.2)
- // dumptruck_ds
- sound (self, CHAN_VOICE, "enforcer/idle1.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_enforcer_idle)
+ }
ai_run (18);
F ()
};
@@ -560,7 +546,8 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() enf_tur_atk3 = [$attack3, enf_tur_atk4]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ // was .attack_elevation -- CEV
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -568,16 +555,16 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() enf_tur_atk4 = [$attack4, enf_tur_atk5]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() enf_tur_atk5 = [$attack5, enf_tur_atk6]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
@@ -589,24 +576,24 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() enf_tur_atk7 = [$attack7, enf_tur_atk8]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() enf_tur_atk8 = [$attack8, enf_tur_atk9]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() enf_tur_atk9 = [$attack5, enf_tur_atk10]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
@@ -786,26 +773,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() enf_die3 = [$death3, enf_die4]
{
self.solid = SOLID_NOT;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 1)
- self.ammo_rockets = 2;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 2)
- self.ammo_rockets = 2;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 3 || self.style == 5)
- self.ammo_nails = 5;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 0 || self.style == 4)
- self.ammo_cells = 5;
-
- if (!self.keep_ammo)
- item_backpack_drop (self);
-
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
F ()
};
void() enf_die4 = [$death4, enf_die5] { ai_forward (14); F () };
@@ -844,26 +812,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() enf_dief3 = [$fdeath3, enf_dief4]
{
self.solid = SOLID_NOT;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 1)
- self.ammo_rockets = 2;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 2)
- self.ammo_rockets = 2;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 3 || self.style == 5)
- self.ammo_nails = 5;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 0 || self.style == 4)
- self.ammo_cells = 5;
-
- if (!self.keep_ammo)
- item_backpack_drop (self);
-
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
F ()
};
void() enf_dief4 = [$fdeath4, enf_dief5] { F () };
@@ -906,13 +855,13 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
return;
if (r < 0.5)
- // dumptruck_ds
- sound (self, CHAN_VOICE, "enforcer/pain1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_enforcer_pain_01)
+ }
else
- // dumptruck_ds
- sound (self, CHAN_VOICE, "enforcer/pain2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_enforcer_pain_02)
+ }
if (r < 0.2)
{
@@ -955,34 +904,46 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_enforcer_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -35)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_enforcer_death;
+
+ // style ammotype check -- dumptruck_ds
+ switch (self.style)
+ {
+ case 0: case 4:
+ self.ammo_cells = 5; break;
+ case 1: case 2:
+ self.ammo_rockets = 2; break;
+ case 3: case 5:
+ self.ammo_nails = 5; break;
+ }
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_enforcer_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
+ {
base_entity_remove (self);
- return;
}
-
- // regular death
- // dumptruck_ds
- sound (self, CHAN_VOICE, "enforcer/death1.wav",
- VOL_HIGH, ATTN_NORM);
- base_item_drop_stuff (self);
- if (random() > 0.5)
- enf_die1 ();
else
- enf_dief1 ();
+ {
+ if (random() > 0.5)
+ enf_die1 ();
+ else
+ enf_dief1 ();
+ }
};
//==============================================================
@@ -1032,32 +993,39 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
precache_model2 ("progs/laser.mdl");
precache_model2 ("progs/s_spike.mdl");
precache_model2 ("progs/missile.mdl");
- precache_sound2 ("enforcer/death1.wav");
- precache_sound2 ("enforcer/enfire.wav");
- precache_sound2 ("enforcer/enfstop.wav");
- precache_sound2 ("enforcer/idle1.wav");
- precache_sound2 ("enforcer/pain1.wav");
- precache_sound2 ("enforcer/pain2.wav");
- precache_sound2 ("enforcer/sight1.wav");
- precache_sound2 ("enforcer/sight2.wav");
- precache_sound2 ("enforcer/sight3.wav");
- precache_sound2 ("enforcer/sight4.wav");
+
+ precache_sound2 (snd_enforcer_death.wav);
+ precache_sound2 (snd_enforcer_fire.wav);
+ precache_sound2 (snd_enforcer_fire_hit.wav);
+ precache_sound2 (snd_enforcer_idle.wav);
+ precache_sound2 (snd_enforcer_pain_01.wav);
+ precache_sound2 (snd_enforcer_pain_02.wav);
+ precache_sound2 (snd_enforcer_sight_01.wav);
+ precache_sound2 (snd_enforcer_sight_02.wav);
+ precache_sound2 (snd_enforcer_sight_03.wav);
+ precache_sound2 (snd_enforcer_sight_04.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_ENFORCER;
+
+ // add backpack -- CEV
+ base_monster_item_add (e, ITEM_SEQ_BACKPACK);
+
// set up model and size for later -- CEV
e.mdl = "progs/enforcer.mdl";
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
if (!e.health)
// thanks RennyC -- dumptruck_ds
e.health = ENFORCER_HEALTH;
- e.destroy = monster_enforcer_destroy;
+ e.th_destroy = monster_enforcer_destroy;
e.sightsound = monster_enforcer_sightsound;
e.th_stand = enf_stand1;
e.th_walk = enf_walk1;
@@ -1068,7 +1036,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_run = enf_run1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_enforcer_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/fish.qc
diff --git a/qc/monsters/fish.qc b/qc/monsters/fish.qc
index 9b65572..fe37b45 100644
--- a/qc/monsters/fish.qc
+++ b/qc/monsters/fish.qc
@@ -115,10 +115,6 @@ Rotfish.
Default health = 25"
-snd_death(string) : "Path to custom death sound (BUBBLES)"
-snd_attack(string) : "Path to custom attack sound (CRUNCHY BITE)"
-snd_idle(string) : "Path to custom idle sound"
-
mdl_body(string) : "Path to custom body model"
mdl_gib1(string) : "Path to custom 1st gib model"
mdl_gib2(string) : "Path to custom 2nd gib model"
@@ -155,9 +151,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -200,8 +193,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
if (vlen(delta) > 60)
return;
- sound (self, CHAN_VOICE, "fish/bite.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_fish_bite)
ldmg = (random() + random()) * 3;
t_damage2 (self.enemy, self, self, ldmg);
};
@@ -266,8 +258,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_run (12);
if (random() < 0.5)
- sound (self, CHAN_VOICE, "fish/idle.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_fish_idle)
+ }
F ()
};
void() fish_run2 = [$swim3, fish_run3] { ai_run (12); F () };
@@ -383,32 +376,30 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_fish_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -35)
{
- // fish gibs -- dumptruck_ds
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
-
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
-
- // no fish heads -- CEV
- base_entity_remove (self);
- return;
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_fish_death;
}
- // regular death
self.solid = SOLID_NOT;
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME;
- base_item_drop_stuff (self);
- sound (self, CHAN_VOICE, "fish/death.wav",
- VOL_HIGH, ATTN_NORM);
- fish_death1 ();
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+
+ if (self.deadflag & DF_GIBBED)
+ base_entity_remove (self);
+ else
+ fish_death1 ();
};
//==============================================================
@@ -456,14 +447,19 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
#ifdef SSQC
precache_model2 ("progs/fish.mdl");
- precache_sound2 ("fish/death.wav");
- precache_sound2 ("fish/bite.wav");
- precache_sound2 ("fish/idle.wav");
+ precache_sound2 (snd_fish_death.wav);
+ precache_sound2 (snd_fish_bite.wav);
+ precache_sound2 (snd_fish_idle.wav);
- precache_model ("progs/gib1.mdl");
- precache_model ("progs/gib2.mdl");
+ // precache_model ("progs/gib1.mdl");
+ // precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+
// set up model and size for later -- CEV
e.mdl = "progs/fish.mdl";
@@ -471,14 +467,14 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// thanks RennyC -- dumptruck_ds
e.health = FISH_HEALTH;
- e.destroy = monster_fish_destroy;
+ e.th_destroy = monster_fish_destroy;
e.th_stand = fish_stand1;
e.th_walk = fish_walk1;
e.th_run = fish_run1;
e.th_melee = fish_atk1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_fish_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/hknight.qc
diff --git a/qc/monsters/hknight.qc b/qc/monsters/hknight.qc
index 0960820..2e7ad42 100644
--- a/qc/monsters/hknight.qc
+++ b/qc/monsters/hknight.qc
@@ -186,13 +186,6 @@ Hellknight.
Default health = 250"
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound (MAGIC BOING)"
-snd_idle(string) : Path to custom idle sound"
-snd_misc(string) : Path to custom SWORD SLASH sound"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
mdl_proj(string) : "Path to custom projectile model"
@@ -241,9 +234,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -282,8 +272,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_hell_knight_sightsound =
{
- sound (self, CHAN_VOICE, "hknight/sight1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_hknight_sight)
};
//--------------------------------------------------------------
@@ -322,11 +311,13 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
}
if (random() > 0.5)
- sound (self, CHAN_WEAPON, "knight/sword2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_knight_sword_02)
+ }
else
- sound (self, CHAN_WEAPON, "knight/sword1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_knight_sword_01)
+ }
};
//--------------------------------------------------------------
@@ -337,8 +328,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
local vector org, dir;
self.effects |= EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "weapons/lstart.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_lightning_start)
ai_face ();
makevectors (self.angles);
org = self.origin + v_forward * 50 + '0 0 20';
@@ -371,8 +361,8 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
self.animtype = self.animtype + 1;
- sound (self, CHAN_WEAPON, "hknight/slash1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_hknight_slash)
+
if (self.animtype == 1)
{
hkn_slice1 ();
@@ -412,8 +402,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() monster_hell_knight_idlesound =
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "hknight/idle.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_hknight_idle)
+ }
};
//--------------------------------------------------------------
@@ -763,8 +754,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() hkn_magicb10 = [$magicb10, hkn_magicb11]
{
ai_face ();
- sound (self, CHAN_WEAPON, "shambler/sboom.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_boom)
monster_hell_knight_attack_lightning ();
F ()
};
@@ -843,8 +833,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() hkn_tur_magb10 = [$magicb10, hkn_tur_magb11]
{
ai_face ();
- sound (self, CHAN_WEAPON, "shambler/sboom.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_boom)
monster_hell_knight_attack_lightning ();
F ()
};
@@ -900,8 +889,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() hkn_pain1 = [$pain1, hkn_pain2]
{
- sound (self, CHAN_VOICE, "hknight/pain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_hknight_pain)
F ()
};
void() hkn_pain2 = [$pain2, hkn_pain3] { F () };
@@ -1005,15 +993,12 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
if (r < 0.5)
{
self.pain_finished = time + 1.5;
- sound (self, CHAN_VOICE,
- "hknight/pain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_hknight_pain)
}
return;
}
- sound (self, CHAN_VOICE, "hknight/pain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_hknight_pain)
if (time - self.pain_finished > 5)
{
@@ -1036,33 +1021,35 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_hell_knight_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -40)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_hknight_death;
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_hell_knight_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
+ {
base_entity_remove (self);
- return;
}
-
- // regular death
- sound (self, CHAN_VOICE, "hknight/death1.wav",
- VOL_HIGH, ATTN_NORM);
- base_item_drop_stuff (self);
- if (random() > 0.5)
- hkn_die1 ();
else
- hkn_dieb1 ();
+ {
+ if (random() > 0.5)
+ hkn_die1 ();
+ else
+ hkn_dieb1 ();
+ }
};
//==============================================================
@@ -1109,23 +1096,28 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
precache_model2 ("progs/k_spike2.mdl");
precache_model2 ("progs/h_hellkn.mdl");
- precache_sound2 ("hknight/attack1.wav");
- precache_sound2 ("hknight/death1.wav");
- precache_sound2 ("hknight/pain1.wav");
- precache_sound2 ("hknight/sight1.wav");
+ precache_sound2 (snd_hknight_attack.wav);
+ precache_sound2 (snd_hknight_death.wav);
+ precache_sound2 (snd_hknight_pain.wav);
+ precache_sound2 (snd_hknight_sight.wav);
// used by C code, so don't sound2
- precache_sound ("hknight/hit.wav");
- precache_sound2 ("hknight/slash1.wav");
- precache_sound2 ("hknight/idle.wav");
+ precache_sound (snd_hknight_hit.wav);
+ precache_sound2 (snd_hknight_slash.wav);
+ precache_sound2 (snd_hknight_idle.wav);
// what??? never knew about this! -- dumptruck_ds
- precache_sound2 ("hknight/grunt.wav");
-
- precache_sound ("knight/sword1.wav");
- precache_sound ("knight/sword2.wav");
+ precache_sound2 (snd_hknight_grunt.wav);
+ precache_sound (snd_knight_sword_01.wav);
+ precache_sound (snd_knight_sword_02.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_HELLKNIGHT;
// set up model and size for later -- CEV
e.mdl = "progs/hknight.mdl";
@@ -1134,10 +1126,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
if (!e.health)
e.health = HELL_KNIGHT_HEALTH;
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
- e.destroy = monster_hell_knight_destroy;
+ e.th_destroy = monster_hell_knight_destroy;
e.sightsound = monster_hell_knight_sightsound;
e.th_stand = hkn_stand1;
e.th_walk = hkn_walk1;
@@ -1158,7 +1147,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
}
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_hell_knight_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/knight.qc
diff --git a/qc/monsters/knight.qc b/qc/monsters/knight.qc
index 115cad2..c8c7d2f 100644
--- a/qc/monsters/knight.qc
+++ b/qc/monsters/knight.qc
@@ -140,13 +140,6 @@ Knight.
Default heath = 75"
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound (SWORD SLASH 1)"
-snd_idle(string) : "Path to custom idle sound"
-snd_misc(string) : "Path to custom sound (SWORD SLASH 2)"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
skin_head(float) : "Skin index of custom head model"
@@ -185,9 +178,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -221,8 +211,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_knight_sightsound =
{
- sound (self, CHAN_VOICE, "knight/ksight.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_knight_sight)
};
//--------------------------------------------------------------
@@ -268,8 +257,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() kn_walk1 = [$walk1, kn_walk2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "knight/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_knight_idle)
+ }
ai_walk (3);
F ()
};
@@ -293,8 +283,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() kn_run1 = [$runb1, kn_run2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "knight/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_knight_idle)
+ }
ai_run (16);
F ()
};
@@ -312,11 +303,13 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() kn_runatk1 = [$runattack1, kn_runatk2]
{
if (random() > 0.5)
- sound (self, CHAN_WEAPON, "knight/sword2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_knight_sword_02)
+ }
else
- sound (self, CHAN_WEAPON, "knight/sword1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_knight_sword_01)
+ }
ai_charge (20);
F ()
};
@@ -336,8 +329,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() kn_atk1 = [$attackb1, kn_atk2]
{
- sound (self, CHAN_WEAPON, "knight/sword1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_knight_sword_01)
ai_charge (0);
F ()
};
@@ -491,8 +483,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
local float r = random ();
- sound (self, CHAN_VOICE, "knight/khurt.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_knight_pain)
if (r < 0.85)
{
@@ -511,33 +502,35 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_knight_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -40)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_knight_death;
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_knight_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
+ {
base_entity_remove (self);
- return;
}
-
- // regular death
- sound (self, CHAN_VOICE, "knight/kdeath.wav",
- VOL_HIGH, ATTN_NORM);
- base_item_drop_stuff (self);
- if (random() < 0.5)
- kn_die1 ();
else
- kn_dieb1 ();
+ {
+ if (random() < 0.5)
+ kn_die1 ();
+ else
+ kn_dieb1 ();
+ }
};
//==============================================================
@@ -584,17 +577,23 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
#ifdef SSQC
precache_model ("progs/knight.mdl");
precache_model ("progs/h_knight.mdl");
- precache_sound ("knight/kdeath.wav");
- precache_sound ("knight/khurt.wav");
- precache_sound ("knight/ksight.wav");
- precache_sound ("knight/sword1.wav");
- precache_sound ("knight/sword2.wav");
- precache_sound ("knight/idle.wav");
+ precache_sound (snd_knight_death.wav);
+ precache_sound (snd_knight_pain.wav);
+ precache_sound (snd_knight_sight.wav);
+ precache_sound (snd_knight_sword_01.wav);
+ precache_sound (snd_knight_sword_02.wav);
+ precache_sound (snd_knight_idle.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_KNIGHT;
+
// set up model and size for later -- CEV
e.mdl = "progs/knight.mdl";
@@ -602,7 +601,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// thanks RennyC -- dumptruck_ds
e.health = KNIGHT_HEALTH;
- e.destroy = monster_knight_destroy;
+ e.th_destroy = monster_knight_destroy;
e.sightsound = monster_knight_sightsound;
e.th_stand = kn_stand1;
e.th_walk = kn_walk1;
@@ -610,7 +609,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_melee = kn_atk1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_knight_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/ogre.qc
diff --git a/qc/monsters/ogre.qc b/qc/monsters/ogre.qc
index 624c2c7..789d4b4 100644
--- a/qc/monsters/ogre.qc
+++ b/qc/monsters/ogre.qc
@@ -197,13 +197,6 @@ style(Choices) : "Attack type" =
3 : "multi-grenade (Mission Pack 2)"
keep_ammo(integer) : "1 = Don't drop backpack upon death"
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound (CHAINSAW)"
-snd_idle(string) : "Path to custom idle sound (IDLE)"
-snd_misc(string) : "Path to custom sound (IDLE CHAINSAW DRAG)"
-snd_misc1(string) : "Path to custom sound (ATTACK GRUNT)"
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
@@ -245,9 +238,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -285,8 +275,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_ogre_sightsound =
{
- sound (self, CHAN_VOICE, "ogre/ogwake.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_ogre_sight)
};
//--------------------------------------------------------------
@@ -374,8 +363,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_ogre_fire_spike =
{
- sound (self, CHAN_WEAPON, "weapons/spike2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_supernailgun)
self.effects = self.effects | EF_MUZZLEFLASH;
self.attack_finished = time + 0.7;
@@ -399,8 +387,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
makevectors (vectoangles(self.enemy.origin - self.origin));
self.effects = self.effects | EF_MUZZLEFLASH;
- sound (self, CHAN_AUTO, "boss1/throw.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_throw)
// damage should be 40, 40 -- TODO CEV
// custom lavaball speed -- CEV
@@ -420,7 +407,10 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
base_monster_fire_flak (
self.origin + '0 0 16', 800);
else
- base_monster_fire_tribolt ();
+ base_monster_fire_grenade (
+ self.origin + '0 0 16',
+ 40, 40, 0);
+ // base_monster_fire_tribolt ();
break;
case 1:
base_monster_fire_flak (
@@ -435,9 +425,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
case 4:
monster_ogre_fire_lavaball ();
// used for initial attack sound dumptruck_ds
- sound (self, CHAN_WEAPON,
- "shalrath/attack2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shalrath_attack_02)
break;
}
};
@@ -507,8 +495,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_stand5 = [$stand5, ogre_stand6]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "ogre/ogidle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_ogre_idle_01)
+ }
ai_stand ();
F ()
};
@@ -526,8 +515,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_walk (2);
if (random() < 0.2)
- sound (self, CHAN_VOICE, "ogre/ogidle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_ogre_idle_01)
+ }
F ()
};
void() ogre_walk4 = [$walk4, ogre_walk5] { ai_walk (2); F () };
@@ -536,8 +526,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_walk (5);
if (random() < 0.1)
- sound (self, CHAN_VOICE, "ogre/ogdrag.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_ogre_drag)
+ }
F ()
};
void() ogre_walk7 = [$walk7, ogre_walk8] { ai_walk (3); F () };
@@ -558,8 +549,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_run (9);
if (random() < 0.2)
- sound (self, CHAN_VOICE, "ogre/ogidle2.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_ogre_idle_02)
+ }
F ()
};
void() ogre_run2 = [$run2, ogre_run3] { ai_run (12); F () };
@@ -576,8 +568,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_smash1 = [$smash1, ogre_smash2]
{
ai_charge (6);
- sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_ogre_attack)
F ()
};
void() ogre_smash2 = [$smash2, ogre_smash3] { ai_charge (0); F () };
@@ -634,8 +625,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_swing1 = [$swing1, ogre_swing2]
{
ai_charge (11);
- sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_ogre_attack)
F ()
};
void() ogre_swing2 = [$swing2, ogre_swing3] { ai_charge (1); F () };
@@ -694,7 +684,8 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_nail1 = [$shoot1, ogre_nail2]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ // was .attack_elevation -- CEV
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, BOLT_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -702,16 +693,16 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_nail2 = [$shoot2, ogre_nail3]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, BOLT_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, BOLT_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() ogre_nail3 = [$shoot2, ogre_nail4]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, BOLT_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, BOLT_SPEED,
self.origin, self.enemy.origin);
F ()
};
@@ -735,7 +726,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_tur_atk1 = [$shoot1, ogre_tur_atk2]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, BOLT_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -743,16 +734,16 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_tur_atk2 = [$shoot2, ogre_tur_atk3]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, BOLT_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, BOLT_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() ogre_tur_atk3 = [$shoot2, ogre_tur_atk4]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, BOLT_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, BOLT_SPEED,
self.origin, self.enemy.origin);
F ()
};
@@ -778,8 +769,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_tur_seek5 = [$stand5, ogre_tur_seek6]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "ogre/ogidle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_ogre_idle_01)
+ }
ai_run (0);
F ()
};
@@ -869,31 +861,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_die3 = [$death3, ogre_die4]
{
self.solid = SOLID_NOT;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 1)
- {
- // flak style
- self.ammo_nails = 5;
- }
- if (self.style == 2)
- {
- // super nail style
- self.ammo_nails = 5;
- }
- if (self.style == 3)
- {
- // DOE multi-grenade
- self.ammo_rockets = 2;
- }
- else if (self.style == 0)
- {
- // default Ogre
- self.ammo_rockets = 2;
- }
- if (!self.keep_ammo)
- item_backpack_drop (self);
-
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
F ()
};
void() ogre_die4 = [$death4, ogre_die5] { F () };
@@ -932,33 +900,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_bdie3 = [$bdeath3, ogre_bdie4]
{
self.solid = SOLID_NOT;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 1)
- {
- self.ammo_nails = 5;
- }
- if (self.style == 2)
- {
- self.ammo_nails = 5;
- }
- if (self.style == 3)
- {
- // DOE multi-grenade
- self.ammo_rockets = 2;
- }
- if (self.style == 4)
- {
- // lavaball ogre jaycie erysdren 2021-09-14
- self.ammo_rockets = 2;
- }
- else if (self.style == 0)
- {
- self.ammo_rockets = 2;
- }
- if(!self.keep_ammo)
- item_backpack_drop (self);
-
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
F ()
};
void() ogre_bdie4 = [$bdeath4, ogre_bdie5] { ai_forward (1); F () };
@@ -1001,8 +943,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
return;
- sound (self, CHAN_VOICE, "ogre/ogpain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_ogre_pain)
r = random();
@@ -1038,32 +979,47 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_ogre_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -80)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_ogre_death;
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ // style ammotype check -- dumptruck_ds
+ switch (self.style)
+ {
+ case 0: case 3: case 4:
+ // default & DOE multigrenade
+ // lavaball jaycie erysdren 2021-09-14
+ self.ammo_rockets = 2; break;
+ case 1: case 2:
+ // flak & super nail style
+ self.ammo_nails = 5; break;
+ }
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_ogre_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
+ {
base_entity_remove (self);
- return;
}
-
- sound (self, CHAN_VOICE, "ogre/ogdth.wav", VOL_HIGH, ATTN_NORM);
- base_item_drop_stuff (self);
-
- if (random() < 0.5)
- ogre_die1 ();
else
- ogre_bdie1 ();
+ {
+ if (random() < 0.5)
+ ogre_die1 ();
+ else
+ ogre_bdie1 ();
+ }
};
//==============================================================
@@ -1115,33 +1071,39 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
precache_model ("progs/mervup.mdl");
// for style 2 Ogre dumptruck_ds
precache_model ("progs/lspike.mdl");
- precache_sound ("ogre/ogdrag.wav");
- precache_sound ("ogre/ogdth.wav");
- precache_sound ("ogre/ogidle.wav");
- precache_sound ("ogre/ogidle2.wav");
- precache_sound ("ogre/ogpain1.wav");
- precache_sound ("ogre/ogsawatk.wav");
- precache_sound ("ogre/ogwake.wav");
- precache_sound ("shalrath/attack2.wav");
- precache_sound ("fish/bite.wav");
+ precache_sound (snd_ogre_drag.wav);
+ precache_sound (snd_ogre_death.wav);
+ precache_sound (snd_ogre_idle_01.wav);
+ precache_sound (snd_ogre_idle_02.wav);
+ precache_sound (snd_ogre_pain.wav);
+ precache_sound (snd_ogre_attack.wav);
+ precache_sound (snd_ogre_sight.wav);
+ precache_sound (snd_shalrath_attack_02.wav);
+ precache_sound (snd_fish_bite.wav);
// jaycie erysdren 2021-09-14
- precache_sound ("boss1/throw.wav");
+ precache_sound (snd_boss_throw.wav);
- precache_model ("progs/gib1.mdl");
- precache_model ("progs/gib2.mdl");
+ // precache_model ("progs/gib1.mdl");
+ // precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_OGRE;
+
+ // add backpack -- CEV
+ base_monster_item_add (e, ITEM_SEQ_BACKPACK);
+
// set up model and size for later -- CEV
e.mdl = "progs/ogre.mdl";
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
// thanks RennyC -- dumptruck_ds
if (!e.health)
e.health = OGRE_HEALTH;
- e.destroy = monster_ogre_destroy;
+ e.th_destroy = monster_ogre_destroy;
e.checkattack = monster_ogre_checkattack;
e.sightsound = monster_ogre_sightsound;
@@ -1157,7 +1119,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_turret = ogre_tur_atk1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_ogre_pain;
@@ -1192,13 +1154,6 @@ Ogre Marksman.
Unlike vanilla Quake, this is a slightly more accurate Orge.
keep_ammo(integer) : "1 = Don't drop backpack upon death"
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound (CHAINSAW)"
-snd_idle(string) : "Path to custom idle sound (IDLE)"
-snd_misc(string) : "Path to custom sound (IDLE CHAINSAW DRAG)"
-snd_misc1(string) : "Path to custom sound (ATTACK GRUNT)"
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
@@ -1242,7 +1197,6 @@ sight_trigger(integer) : "1 = Fire target upon seeing the player instead of deat
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -1292,7 +1246,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_mm_nail1 = [$shoot1, ogre_mm_nail2]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -1300,24 +1254,23 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_mm_nail2 = [$shoot2, ogre_mm_nail3]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() ogre_mm_nail3 = [$shoot2, ogre_mm_nail4]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() ogre_mm_nail4 = [$shoot3, ogre_nail5]
{
ai_face ();
- base_monster_fire_grenade (
- self.origin, 40, 40, self.attack_elevation);
+ base_monster_fire_grenade (self.origin, 40, 40, self.t_height);
F ()
};
@@ -1329,7 +1282,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_mm_t_atk1 = [$shoot1, ogre_mm_t_atk2]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -1337,24 +1290,23 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_mm_t_atk2 = [$shoot2, ogre_mm_t_atk3]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() ogre_mm_t_atk3 = [$shoot2, ogre_mm_t_atk4]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() ogre_mm_t_atk4 = [$shoot3, ogre_mm_t_atk5]
{
ai_face ();
- base_monster_fire_grenade (
- self.origin, 40, 40, self.attack_elevation);
+ base_monster_fire_grenade (self.origin, 40, 40, self.t_height);
F ()
};
void() ogre_mm_t_atk5 = [$shoot4, ogre_mm_t_atk6] { ai_face (); F () };
@@ -1373,8 +1325,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() ogre_mm_t_seek5 = [$stand5, ogre_mm_t_seek6]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "ogre/ogidle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_ogre_idle_01)
+ }
ai_run (0);
F ()
};
@@ -1422,29 +1375,35 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
precache_model ("progs/h_ogre.mdl");
precache_model ("progs/grenade.mdl");
- precache_sound ("ogre/ogdrag.wav");
- precache_sound ("ogre/ogdth.wav");
- precache_sound ("ogre/ogidle.wav");
- precache_sound ("ogre/ogidle2.wav");
- precache_sound ("ogre/ogpain1.wav");
- precache_sound ("ogre/ogsawatk.wav");
- precache_sound ("ogre/ogwake.wav");
+ precache_sound (snd_ogre_drag.wav);
+ precache_sound (snd_ogre_death.wav);
+ precache_sound (snd_ogre_idle_01.wav);
+ precache_sound (snd_ogre_idle_02.wav);
+ precache_sound (snd_ogre_pain.wav);
+ precache_sound (snd_ogre_attack.wav);
+ precache_sound (snd_ogre_sight.wav);
- precache_model ("progs/gib1.mdl");
- precache_model ("progs/gib2.mdl");
+ // precache_model ("progs/gib1.mdl");
+ // precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_OGRE;
+
+ // add backpack -- CEV
+ base_monster_item_add (e, ITEM_SEQ_BACKPACK);
+
// set up model and size for later -- CEV
e.mdl = "progs/ogre.mdl";
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
// thanks RennyC -- dumptruck_ds
if (!e.health)
e.health = 200;
- e.destroy = monster_ogre_destroy;
+ e.th_destroy = monster_ogre_destroy;
e.checkattack = monster_ogre_checkattack;
e.sightsound = monster_ogre_sightsound;
@@ -1460,7 +1419,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_turret = ogre_mm_t_atk1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_ogre_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/oldone.qc
diff --git a/qc/monsters/oldone.qc b/qc/monsters/oldone.qc
index a5923c4..971001c 100644
--- a/qc/monsters/oldone.qc
+++ b/qc/monsters/oldone.qc
@@ -138,7 +138,6 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
pl.angles = other.v_angle = pos.mangle;
// turn this way immediately
pl.fixangle = TRUE;
- pl.map = self.map;
pl.nextthink = time + 0.5;
pl.takedamage = DAMAGE_NO;
pl.solid = SOLID_NOT;
@@ -174,8 +173,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
WriteCoord (MSG_BROADCAST, o_y);
WriteCoord (MSG_BROADCAST, o_z);
- sound (self.enemy, CHAN_VOICE, "misc/r_tele1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self.enemy, snd_misc_tele1)
self.nextthink = time + 2;
self.think = monster_oldone_finale3;
@@ -186,8 +184,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
{
// start shub thrashing wildly
self.enemy.think = old_thrash1;
- sound (self.enemy, CHAN_VOICE, "boss2/death.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self.enemy, snd_oldone_death)
lightstyle (0, "abcdefghijklmlkjihgfedcb");
};
@@ -199,11 +196,10 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
local vector dir = '0 0 0';
local float x, y, z;
local float r;
+ local float gtype;
local entity n;
- local void(entity e) func1;
- sound (self, CHAN_VOICE, "boss2/pop2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_oldone_pop)
oldo = self.origin;
@@ -222,12 +218,12 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
r = random ();
if (r < 0.3)
- func1 = item_gib1_init;
+ gtype = ITEM_SEQ_GIB1;
else if (r < 0.6)
- func1 = item_gib2_init;
+ gtype = ITEM_SEQ_GIB2;
else
- func1 = item_gib3_init;
- BASE_ITEM_GIB_THROW (dir, -999, func1)
+ gtype = ITEM_SEQ_GIB3;
+ BASE_ITEM_THROWABLE (gtype, dir, -999)
y = y + 32;
}
x = x + 32;
@@ -258,6 +254,10 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
WriteByte (MSG_ALL, 3);
lightstyle (0, "m");
+ // TODO CEV allow the player to switch back to "start" map
+ serverflags = 0;
+ nextmap = "start";
+
remove (self);
};
@@ -459,14 +459,13 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
local vector oldo;
local float x, y, z;
local float r;
- local float gibpow;
- local void(entity e) func1;
+ local float gpow;
+ local float gtype;
- sound (self, CHAN_VOICE, "boss2/pop2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_oldone_pop)
oldo = self.origin;
- gibpow = -160;
+ gpow = -160;
z = 16;
while (z <= 144)
@@ -483,12 +482,12 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
r = random ();
if (r < 0.3)
- func1 = item_gib1_init;
+ gtype = ITEM_SEQ_GIB1;
else if (r < 0.6)
- func1 = item_gib2_init;
+ gtype = ITEM_SEQ_GIB2;
else
- func1 = item_gib3_init;
- BASE_ITEM_GIB_THROW (dir, gibpow, func1)
+ gtype = ITEM_SEQ_GIB3;
+ BASE_ITEM_THROWABLE (gtype, dir, gpow)
y = y + 32;
}
x = x + 32;
@@ -543,12 +542,10 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
precache_model2 ("progs/oldone.mdl");
- precache_sound2 ("boss2/death.wav");
- // precache_sound2 ("boss2/idle.wav");
- precache_sound2 ("boss2/sight.wav");
- // next line silences a compiler warning -- CEV
- precache_sound2 ("boss2/pop2.wav");
- precache_sound2 ("boss2/pop2.wav");
+ precache_sound2 (snd_oldone_death.wav);
+ precache_sound2 (snd_oldone_idle.wav);
+ precache_sound2 (snd_oldone_sight.wav);
+ precache_sound2 (snd_oldone_pop.wav);
e.solid = SOLID_SLIDEBOX;
e.movetype = MOVETYPE_STEP;
@@ -566,9 +563,9 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
// TODO CEV
if (e.spawnflags & 2)
- e.destroy = monster_oldone_destroy;
+ e.th_destroy = monster_oldone_destroy;
else
- e.destroy = monster_oldone_finale1;
+ e.th_destroy = monster_oldone_finale1;
total_monsters = total_monsters + 1;
e.think = old_idle1;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/oldone2.qc
diff --git a/qc/monsters/oldone2.qc b/qc/monsters/oldone2.qc
index bfca6fb..f5a14ff 100644
--- a/qc/monsters/oldone2.qc
+++ b/qc/monsters/oldone2.qc
@@ -126,8 +126,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
//--------------------------------------------------------------
void() monster_oldone2_sightsound =
{
- sound (self, CHAN_VOICE, "boss2/sight.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_oldone_sight)
};
//--------------------------------------------------------------
@@ -160,8 +159,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
// lavaball in your face!
base_monster_fire_lavaball (org, d - org, LAVABALL_SPEED);
- sound (self, CHAN_WEAPON, "boss1/throw.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_throw)
// check for dead enemy
if (self.enemy.health <= 0)
@@ -310,8 +308,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
//--------------------------------------------------------------
void() old2_twitch1 = [$shake1, old2_twitch2]
{
- sound (self, CHAN_VOICE, "boss2/pop2.wav",
- VOL_HIGH, ATTN_NONE);
+ SOUND (self, snd_oldone_pop)
F ()
};
void() old2_twitch2 = [$shake2, old2_twitch3] { F () };
@@ -360,8 +357,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
return;
// new pain sound
- sound (self, CHAN_AUTO, "oldone2/pd_pop2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_oldone_pop_pd)
old2_atk1 ();
self.pain_finished = time + 4;
};
@@ -392,7 +388,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
local vector oldo;
local float x, y, z;
local float r;
- local void(entity e) func1;
+ local float gtype;
oldo = self.origin + '0 0 112';
@@ -411,12 +407,12 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
r = random ();
if (r < 0.3)
- func1 = item_gib1_init;
+ gtype = ITEM_SEQ_GIB1;
else if (r < 0.6)
- func1 = item_gib2_init;
+ gtype = ITEM_SEQ_GIB2;
else
- func1 = item_gib3_init;
- BASE_ITEM_GIB_THROW (dir, -120, func1)
+ gtype = ITEM_SEQ_GIB3;
+ BASE_ITEM_THROWABLE (gtype, dir, -120)
y = y + 32;
}
x = x + 32;
@@ -426,8 +422,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
particle (oldo, '0 0 0', 0, 255);
particle (oldo, '128 128 128', 0, 255);
- sound (self, CHAN_VOICE, "player/teledth1.wav",
- VOL_HIGH, ATTN_NONE);
+ SOUND (self, snd_player_teledeath)
remove (self);
};
#endif
@@ -469,14 +464,14 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
#ifdef SSQC
precache_model2 ("progs/oldone.mdl");
- precache_sound2 ("boss2/death.wav");
- // precache_sound2 ("boss2/idle.wav");
- precache_sound2 ("boss2/sight.wav");
- precache_sound2 ("boss2/pop2.wav");
- precache_sound2 ("oldone2/pd_pop2.wav");
+ precache_sound2 (snd_oldone_death.wav);
+ precache_sound2 (snd_oldone_idle.wav);
+ precache_sound2 (snd_oldone_sight.wav);
+ precache_sound2 (snd_oldone_pop.wav);
+ precache_sound2 (snd_oldone_pop_pd.wav);
precache_model ("progs/lavaball.mdl");
- precache_sound ("boss1/throw.wav");
+ precache_sound (snd_boss_throw.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
@@ -501,7 +496,7 @@ $frame shake15 shake16 shake17 shake18 shake19 shake20
e.sightsound = monster_oldone2_sightsound;
e.th_run = old2_atk1;
e.th_pain = monster_oldone2_pain;
- e.destroy = monster_oldone2_destroy_twitch1;
+ e.th_destroy = monster_oldone2_destroy_twitch1;
e.think = old2_idle1;
e.nextthink = time + 0.1;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/playerclient.qc
diff --git a/qc/monsters/playerclient.qc b/qc/monsters/playerclient.qc
index d1c2fa0..7ef3a26 100644
--- a/qc/monsters/playerclient.qc
+++ b/qc/monsters/playerclient.qc
@@ -35,12 +35,12 @@ typedef enumflags
NETFLAG_PLAYER_SIZE, // size has changed (mins, maxs)
NETFLAG_PLAYER_ANGLES, // player angles have changed
NETFLAG_PLAYER_VELOCITY, // velocity has changed
- NETFLAG_PLAYER_FLAGS, // .flags & .pm_flags
- NETFLAG_PLAYER_TIMERS, // .pm_timer
+ NETFLAG_PLAYER_FLAGS, // .flags & .moveflags
+ NETFLAG_PLAYER_TIMERS, // .movetimer
NETFLAG_PLAYER_SOLID, // .solid and/or .movetype have changed
- NETFLAG_PLAYER_WEAPON, // .weapon, .weaponframe
+ NETFLAG_PLAYER_WEAPON, // .weapon
NETFLAG_PLAYER_ITEMS, // .items (& others) have changed
- NETFLAG_PLAYER_INVENTORY, // .inventory1 thru .inventory8
+ NETFLAG_PLAYER_INVENTORY, // .item[0] thru .item[7]
NETFLAG_PLAYER_AMMO, // ammo fields have changed
NETFLAG_PLAYER_HEALTH, // .health has changed
NETFLAG_PLAYER_PUNCHANGLE // .punchangle has changed
@@ -79,16 +79,17 @@ float modelindex_player;
// fields
//======================================================================
+#if defined(CSQC) || defined(SSQC)
+.float jump_flag; // player jump flag
+#endif
+
#ifdef SSQC
-.float axhitme;
.float fly_sound;
-.float jump_flag; // player jump flag
#endif
#ifdef SSQC
.float air_finished; // when time > air_finished, drown
.float attack_finished;
-.float pain_finished;
.float invincible_finished;
.float invisible_finished;
.float super_damage_finished;
@@ -105,9 +106,7 @@ float modelindex_player;
#endif
#ifdef SSQC
-.float step_time; // CEV
-
-// set to time+0.2 whenever a client fires a weapon or takes damage.
+// set to time + 0.2 whenever a client fires a weapon or takes damage.
// Used to alert monsters that otherwise would let the player go
.float show_hostile;
@@ -116,12 +115,7 @@ float modelindex_player;
#ifdef SSQC
// DP_INPUTBUTTONS (in qw we set 1 to equal 3 to match zquake/fuhquake/mvdsv)
-.float button3;
.float button4;
-.float button5;
-.float button6;
-.float button7;
-.float button8;
#endif
//======================================================================
@@ -166,12 +160,11 @@ void() player_fire_tribolt;
void() player_fire_rocket;
void() player_fire_lightning;
void() player_attack;
-void() player_throw_item;
+void(vector vel) player_throw_item;
void() player_set_suicide_frame; // pain, damage, death
void() player_pain_sound;
void() player_death_sound;
void() player_dead;
-void() player_footstep; // thinking & animation frames
void() player_stand;
void() player_axstand;
void(void() axthink) player_run;
@@ -224,6 +217,8 @@ void(vector dir) player_destroy;
#endif
#if defined(CSQC) || defined(SSQC)
void() player_touch;
+void() player_footstep; // thinking & animation frames
+void(sound_info_t snd, float testcmd) player_sound;
#endif
#ifdef SSQC
entity() player_init_selectspawnpoint; // initialization
@@ -330,8 +325,8 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
e.velocity_net = e.velocity; \
e.angles_net = e.angles; \
e.flags_net = e.flags; \
- e.pm_flags_net = e.pm_flags; \
- e.pm_timer_net = e.pm_timer; \
+ e.moveflags_net = e.moveflags; \
+ e.movetimer_net = e.movetimer; \
/* } */
//--------------------------------------------------------------
@@ -343,12 +338,13 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
e.velocity = e.velocity_net; \
e.angles = e.angles_net; \
e.flags = e.flags_net; \
- e.pm_flags = e.pm_flags_net; \
- e.pm_timer = e.pm_timer_net; \
- if (e.pm_flags & PMF_CROUCHED) \
+ e.moveflags = e.moveflags_net; \
+ e.movetimer = e.movetimer_net; \
+ if (e.moveflags & PMF_CROUCHED) \
setsize (e, PM_CROUCH_MIN, PM_CROUCH_MAX); \
else \
setsize (e, PM_STAND_MIN, PM_STAND_MAX); \
+ pmovetime = e.origin_net_time; \
pmovecommandframe = view_player_commandframe + 1; \
if (pmovecommandframe < clientcommandframe - 128) \
{ \
@@ -426,8 +422,8 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
/* only bob when onground and try to limit abrupt
* view changes when landing -- CEV */ \
/* this is pretty tortured -- CEV */ \
- if (e.pm_flags & PMF_ONGROUND && \
- !(e.pm_flags & PMF_CROUCHSLIDE)) \
+ if (e.moveflags & PMF_ONGROUND && \
+ !(e.moveflags & PMF_CROUCHSLIDE)) \
{ \
if (view_bob_old) \
{ \
@@ -530,8 +526,8 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
local float view_rollangle = autocvar (cl_rollangle, 2.0f); \
if (view_rollspeed && view_rollangle) \
{ \
- if (e.pm_flags & PMF_CROUCHSLIDE || \
- e.pm_flags & PMF_ONSLICK) \
+ if (e.moveflags & PMF_CROUCHSLIDE || \
+ e.moveflags & PMF_ONSLICK) \
{ \
view_rollangle = min (4, view_rollangle * 4); \
} \
@@ -557,7 +553,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
/* { */ \
local float view_step_diff = e.origin.z - view_step_oldz; \
if (view_step_disable == FALSE) { \
- if (e.pm_flags & PMF_ONGROUND) { \
+ if (e.moveflags & PMF_ONGROUND) { \
if (view_step_diff >= 4 && view_step_diff <= PM_STEPHEIGHT) \
{ \
/* was * 0.018f or serverdeltatime -- CEV */ \
@@ -626,37 +622,31 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
{
// self.origin_prev = self.origin_net;
self.origin_prev_time = self.origin_net_time;
- self.origin_x = ReadCoord ();
- self.origin_y = ReadCoord ();
- self.origin_z = ReadCoord ();
+ self.origin.x = ReadCoord ();
+ self.origin.y = ReadCoord ();
+ self.origin.z = ReadCoord ();
// self.origin_net = self.origin;
self.origin_net_time = time;
}
- // we can safely infer NETFLAG_PLAYER_SIZE from .pm_flags;
+ // we can safely infer NETFLAG_PLAYER_SIZE from .moveflags;
// if it's necessary to transmit size (mins & maxs) in
// the future we'd do so here -- CEV
if (netflags & NETFLAG_PLAYER_ANGLES)
{
self.angles_prev_time = self.angles_net_time;
- /*
- self.angles_x = ReadAngle ();
- self.angles_y = ReadAngle ();
- self.angles_z = ReadAngle ();
- */
- self.angles_x = ReadShort () * (360.0 / 65536) + 32768;
- self.angles_y = ReadShort () * (360.0 / 65536) + 32768;
- self.angles_z = ReadShort () * (360.0 / 65536) + 32768;
+ self.angles.x = ReadAngle ();
+ self.angles.y = ReadAngle ();
+ self.angles.z = ReadAngle ();
self.angles_net_time = time;
}
if (netflags & NETFLAG_PLAYER_VELOCITY)
{
- self.velocity_x = ReadShort() * 0.125;
- self.velocity_y = ReadShort() * 0.125;
- self.velocity_z = ReadShort() * 0.125;
- self.speed = vlen ([self.velocity_x,self.velocity_y,0]);
+ self.velocity.x = ReadShort() * 0.125;
+ self.velocity.y = ReadShort() * 0.125;
+ self.velocity.z = ReadShort() * 0.125;
}
if (netflags & NETFLAG_PLAYER_FLAGS)
@@ -666,11 +656,11 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
}
else
{
- newmoveflags = self.pm_flags;
+ newmoveflags = self.moveflags;
}
if (netflags & NETFLAG_PLAYER_TIMERS)
- self.pm_timer = ReadFloat ();
+ self.movetimer = ReadFloat ();
if (netflags & NETFLAG_PLAYER_SOLID)
{
@@ -684,14 +674,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
switch (self.weapon)
{
- case 1: self.inventory1 = ReadByte (); break;
- case 2: self.inventory2 = ReadByte (); break;
- case 3: self.inventory3 = ReadByte (); break;
- case 4: self.inventory4 = ReadByte (); break;
- case 5: self.inventory5 = ReadByte (); break;
- case 6: self.inventory6 = ReadByte (); break;
- case 7: self.inventory7 = ReadByte (); break;
- case 8: self.inventory8 = ReadByte (); break;
+ case 1: self.item[0] = ReadByte (); break;
+ case 2: self.item[1] = ReadByte (); break;
+ case 3: self.item[2] = ReadByte (); break;
+ case 4: self.item[3] = ReadByte (); break;
+ case 5: self.item[4] = ReadByte (); break;
+ case 6: self.item[5] = ReadByte (); break;
+ case 7: self.item[6] = ReadByte (); break;
+ case 8: self.item[7] = ReadByte (); break;
}
}
@@ -701,15 +691,15 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (netflags & NETFLAG_PLAYER_INVENTORY)
{
// dprint (sprintf("player_netreceive: received "
- // "inventory at %g\n", time));
- self.inventory1 = ReadByte ();
- self.inventory2 = ReadByte ();
- self.inventory3 = ReadByte ();
- self.inventory4 = ReadByte ();
- self.inventory5 = ReadByte ();
- self.inventory6 = ReadByte ();
- self.inventory7 = ReadByte ();
- self.inventory8 = ReadByte ();
+ // "item at %g\n", time));
+ self.item[0] = ReadByte ();
+ self.item[1] = ReadByte ();
+ self.item[2] = ReadByte ();
+ self.item[3] = ReadByte ();
+ self.item[4] = ReadByte ();
+ self.item[5] = ReadByte ();
+ self.item[6] = ReadByte ();
+ self.item[7] = ReadByte ();
}
if (netflags & NETFLAG_PLAYER_AMMO)
@@ -728,9 +718,9 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (netflags & NETFLAG_PLAYER_PUNCHANGLE)
{
- self.punchangle_x = ReadByte () - 128;
- self.punchangle_y = ReadByte () - 128;
- self.punchangle_z = ReadByte () - 128;
+ self.punchangle.x = ReadByte () - 128;
+ self.punchangle.y = ReadByte () - 128;
+ self.punchangle.z = ReadByte () - 128;
}
else if (self.punchangle)
{
@@ -738,16 +728,6 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.punchangle = '0 0 0';
}
- // TODO CEV move this ?
- // punchangle code from Ironwail -- CEV
- if (self.entnum == player_localentnum) {
- if (view_punch1 != self.punchangle)
- {
- view_punch2 = view_punch1;
- view_punch1 = self.punchangle;
- view_punch_time = time;
- } }
-
if (isnew && !(self.predraw))
{
if (self.entnum == player_localentnum)
@@ -760,26 +740,27 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
view_entity = spawn ();
view_entity.classname = "weaponentity";
view_entity.drawmask = DRAWMASK_NONE;
+ view_entity.effects |= EF_NOSHADOW;
view_entity.renderflags = RF_DEPTHHACK |
RF_NOSHADOW | RF_VIEWMODEL;
}
}
- self.pm_flags = newmoveflags;
+ self.moveflags = newmoveflags;
player_init (self);
}
- else if (self.pm_flags != newmoveflags)
+ else if (self.moveflags != newmoveflags)
{
if (newmoveflags & PMF_CROUCHED &&
- (!(self.pm_flags & PMF_CROUCHED)))
+ (!(self.moveflags & PMF_CROUCHED)))
{
- self.pm_flags = newmoveflags;
+ self.moveflags = newmoveflags;
PM_CrouchStart ();
}
else if ((!(newmoveflags & PMF_CROUCHED)) &&
- self.pm_flags & PMF_CROUCHED)
+ self.moveflags & PMF_CROUCHED)
{
- self.pm_flags = newmoveflags;
+ self.moveflags = newmoveflags;
PM_CrouchStop ();
}
else
@@ -790,76 +771,100 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
else
setsize (self, PM_STAND_MIN,
PM_STAND_MAX);
- self.pm_flags = newmoveflags;
+ self.moveflags = newmoveflags;
}
}
else
{
- self.pm_flags = newmoveflags;
+ self.moveflags = newmoveflags;
// Make sure mins & maxs match the server -- CEV
- if (self.pm_flags & PMF_CROUCHED)
+ if (self.moveflags & PMF_CROUCHED)
setsize (self, PM_CROUCH_MIN, PM_CROUCH_MAX);
else
setsize (self, PM_STAND_MIN, PM_STAND_MAX);
}
- if (self.entnum == player_localentnum) {
- if (netflags & NETFLAG_PLAYER_ORIGIN)
+ if (newframe != self.frame || isnew)
{
- view_player = self;
+ self.frame2 = self.frame;
+ self.lerptime = time;
+ self.frame = newframe;
+ }
- // locally store what the server sent us -- CEV
- local vector origin_new = self.origin;
- local vector velocity_new = self.velocity;
- local vector angles_new = self.angles;
- local float flags_new = self.flags;
- local float pm_flags_new = self.pm_flags;
- local float pm_timer_new = self.pm_timer;
+ if (self.entnum == player_localentnum)
+ {
+ if (netflags & NETFLAG_PLAYER_ORIGIN)
+ {
+ view_player = self;
- // now rewind to the previous server state -- CEV
- PLAYER_PREDICTION_RESET (self)
+ // locally store what the server sent us -- CEV
+ local vector origin_new = self.origin;
+ local vector velocity_new = self.velocity;
+ local vector angles_new = self.angles;
+ local float flags_new = self.flags;
+ local float moveflags_new = self.moveflags;
+ local float movetimer_new = self.movetimer;
- // run up to clientcommandframe -- CEV
- player_prediction_run (clientcommandframe);
+ // rewind to the previous server state -- CEV
+ PLAYER_PREDICTION_RESET (self)
+ setorigin (self, self.origin);
- // save old predicted origin for later -- CEV
- local vector origin_pred = self.origin;
+ // run up to clientcommandframe -- CEV
+ player_prediction_run (clientcommandframe);
- // revert to what the server sent us -- CEV
- self.origin = origin_new;
- self.velocity = velocity_new;
- self.angles = angles_new;
- self.flags = flags_new;
- self.pm_flags = pm_flags_new;
- self.pm_timer = pm_timer_new;
+ // save old predicted origin for later -- CEV
+ local vector origin_pred = self.origin;
- // start from the most recent servercommandframe -- CEV
- view_player_commandframe = servercommandframe;
- pmovecommandframe = view_player_commandframe + 1;
+ // revert to what the server sent us -- CEV
+ self.origin = origin_new;
+ self.velocity = velocity_new;
+ self.angles = angles_new;
+ self.flags = flags_new;
+ self.moveflags = moveflags_new;
+ self.movetimer = movetimer_new;
- // SAVE our new known-good state -- CEV
- PLAYER_PREDICTION_SAVE (self)
+ // start from the servercommandframe -- CEV
+ view_player_commandframe = servercommandframe;
+ pmovecommandframe = view_player_commandframe+1;
- // run up to clientcommandframe again -- CEV
- player_prediction_run (clientcommandframe);
+ // SAVE our new known-good state -- CEV
+ PLAYER_PREDICTION_SAVE (self)
- // check for a difference (error) in prediction based
- // on extrapolation from the previous server message &
- // the current (most recent) message -- CEV
- PLAYER_PREDICTION_ERRORCHECK (origin_pred, self.origin)
- } }
- else
- {
- dprint ("player_netreceive: non-local player!\n");
- }
+ // run up to clientcommandframe again -- CEV
+ player_prediction_run (clientcommandframe);
- // TODO CEV movement interpolation for other players
+ // check for a difference (error) in prediction
+ // based on extrapolation from the previous
+ // server message & the current (most recent)
+ // message -- CEV
+ PLAYER_PREDICTION_ERRORCHECK (origin_pred,
+ self.origin)
+ }
- if (newframe != self.frame || isnew)
+ // set up punchangle -- TODO move this? -- CEV
+ if (view_punch1 != self.punchangle)
+ {
+ view_punch2 = view_punch1;
+ view_punch1 = self.punchangle;
+ view_punch_time = time;
+ }
+
+ // local footstep sounds -- CEV
+ if (self.frame == $axrun2 || self.frame == $axrun5)
+ {
+ if (self.moveflags & PMF_ONGROUND)
+ player_footstep ();
+ }
+ else if (self.frame == $rockrun2 ||
+ self.frame == $rockrun5)
+ {
+ if (self.moveflags & PMF_ONGROUND)
+ player_footstep ();
+ }
+ }
+ else
{
- self.frame2 = self.frame;
- self.lerptime = time;
- self.frame = newframe;
+ dprint ("player_netreceive: non-local player!\n");
}
};
@@ -892,6 +897,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
{
// reset here or there'll be stuttering -- CEV
PLAYER_PREDICTION_RESET (self)
+ setorigin (self, self.origin);
// run up to the current frame -- CEV
player_prediction_run (clientcommandframe);
@@ -908,6 +914,26 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
makevectors (view_angles);
PLAYER_VIEW_PUNCHANGLE ()
PLAYER_VIEW_ROLL (self)
+
+ // highlight items the player can pick up -- CEV
+ // TODO CEV
+ BASE_ENTITY_WEAPONLOOKUP (self)
+ if (item_index == ITEM_SEQ_HANDS)
+ {
+ // v_forward from the makevectors
+ // view_angles above; view_angles
+ // roughly matches self.v_angle on
+ // the server -- CEV
+ local vector oz = self.origin +
+ self.view_ofs;
+ traceline (oz, oz + v_forward * 64,
+ MOVE_TRIGGERS, self);
+ if (trace_fraction < 1.0f &&
+ trace_ent.classgroup & CG_ITEM)
+ {
+ trace_ent.effects |= EF_REDTINT;
+ }
+ }
}
self.renderflags |= RF_EXTERNALMODEL;
@@ -933,7 +959,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.flags & FL_DIMLIGHT)
{
local vector col;
- makevectors (self.v_angle);
+ makevectors (view_angles);
// quad + pent, pent, quad, normal -- CEV
if (self.items & IT_INVULNERABILITY)
@@ -959,6 +985,15 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
addentity (self);
+ if (self.entnum == player_localentnum)
+ {
+ if (intermission == 0)
+ {
+ PLAYER_PREDICTION_RESET (self)
+ setorigin (self, self.origin);
+ }
+ }
+
return PREDRAW_NEXT;
};
@@ -990,89 +1025,45 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
}
}
- // update view_player -- CEV
- if (self.entnum == player_localentnum)
- if (view_player != self)
- view_player = self;
-
- while (pmovecommandframe <= endframe)
+ // while (pmovecommandframe <= endframe)
+ for (float f1 = pmovecommandframe; f1 <= endframe; f1++)
{
- if (!getinputstate(pmovecommandframe))
+ if (getinputstate(pmovecommandframe) == FALSE)
// no input from client
- break;
+ continue;
if (input_timelength <= 0)
- {
- /*
- if (pmovecommandframe != endframe)
- {
- dprint (sprintf("player_prediction_run: "
- "itl %g clframetime %g\n",
- input_timelength, clframetime));
- }
- */
- break;
- }
+ continue;
- /*
if (pmovecommandframe == clientcommandframe)
- {
CSQC_Input_Frame ();
- }
- */
- #if 1
+ #if 0
local entity act = world;
- // set all moving actors to a best-guess of their
- // position in this pmovecommandframe -- CEV
while ((act = findflags(act, queflag, QUE_TYPE_ACTOR)))
{
- if (act.origin_net == act.origin_prev)
- continue;
-
- #if 1
- if (input_clienttime < act.origin_net_time)
- {
- /*
- dprint (sprintf("player_prediction_run"
- ": skipping %s %g, diff %g\n",
- act.classname, act.entnum,
- act.origin_net_stime -
- input_servertime));
- */
- setorigin (act, act.origin_net);
+ if (act.origin_net_time >= pmovetime)
continue;
- }
- #endif
- // need to do angles for rotating brushes -- CEV
BASE_ENTITY_LERP_ANGLES (act,
act.angles_net, act.angles_prev,
- input_clienttime,
+ pmovetime,
act.angles_net_time,
act.angles_prev_time)
- // now origin for collision checking -- CEV
BASE_ENTITY_LERP_ORIGIN (act,
act.origin_net, act.origin_prev,
- input_clienttime,
+ pmovetime,
act.origin_net_time,
act.origin_prev_time)
- if (act.movetype == MOVETYPE_PUSH)
- {
- local vector dispang, disporg;
- dispang = act.angles - act.angles_net;
- disporg = act.origin - act.origin_net;
- act.angles = act.angles_net;
- setorigin (act, act.origin_net);
-
- pushmove (act, disporg, dispang);
- }
+ setorigin (act, act.origin);
}
#endif
+ pmovetime += input_timelength;
+
// do the move. these three macros stuff most of
// the player movement directly into this function.
// (a wild hack). the same three macros are called
@@ -1084,20 +1075,24 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
setorigin (self, self.origin);
self.oldorigin = self.origin;
- // don't do step smoothing when flagged not to -- CEV
- if (self.pm_flags & PMF_ONMOVINGENT)
- {
- if (view_step_disable == FALSE)
- {
- view_step_disable = TRUE;
- }
- }
- else if (view_step_disable)
+ pmovecommandframe++;
+ }
+
+ // save off the last fully predicted commandframe -- CEV
+ pmovelatesttime = pmovetime;
+ pmovelatestframe = endframe - 1;
+
+ // don't do step smoothing when flagged not to -- CEV
+ if (self.moveflags & PMF_ONMOVINGENT)
+ {
+ if (view_step_disable == FALSE)
{
- view_step_disable = FALSE;
+ view_step_disable = TRUE;
}
-
- pmovecommandframe++;
+ }
+ else if (view_step_disable)
+ {
+ view_step_disable = FALSE;
}
// add anything that was applied after (for low
@@ -1131,24 +1126,16 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
WriteCoord (MSG_ENTITY, self.origin_z);
}
- // we can safely infer NETFLAG_PLAYER_SIZE from .pm_flags;
+ // we can safely infer NETFLAG_PLAYER_SIZE from .moveflags;
// if it's necessary to transmit size (mins & maxs) in
// the future we'd do so here -- CEV
// if (netflags & NETFLAG_PLAYER_SIZE)
if (netflags & NETFLAG_PLAYER_ANGLES)
{
- /*
WriteAngle (MSG_ENTITY, self.angles_x);
WriteAngle (MSG_ENTITY, self.angles_y);
WriteAngle (MSG_ENTITY, self.angles_z);
- */
- WriteShort (MSG_ENTITY, (rint(self.angles_x *
- 65536.0 / 360.0) & 65535) - 32768);
- WriteShort (MSG_ENTITY, (rint(self.angles_y *
- 65536.0 / 360.0) & 65535) - 32768);
- WriteShort (MSG_ENTITY, (rint(self.angles_z *
- 65536.0 / 360.0) & 65535) - 32768);
}
if (netflags & NETFLAG_PLAYER_VELOCITY)
@@ -1161,11 +1148,11 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (netflags & NETFLAG_PLAYER_FLAGS)
{
WriteFloat (MSG_ENTITY, self.flags);
- WriteFloat (MSG_ENTITY, self.pm_flags);
+ WriteFloat (MSG_ENTITY, self.moveflags);
}
if (netflags & NETFLAG_PLAYER_TIMERS)
- WriteFloat (MSG_ENTITY, self.pm_timer);
+ WriteFloat (MSG_ENTITY, self.movetimer);
if (netflags & NETFLAG_PLAYER_SOLID)
{
@@ -1178,21 +1165,21 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
WriteByte (MSG_ENTITY, self.weapon);
switch (self.weapon)
{
- case 1: WriteByte (MSG_ENTITY, self.inventory1);
+ case 1: WriteByte (MSG_ENTITY, self.item[0]);
break;
- case 2: WriteByte (MSG_ENTITY, self.inventory2);
+ case 2: WriteByte (MSG_ENTITY, self.item[1]);
break;
- case 3: WriteByte (MSG_ENTITY, self.inventory3);
+ case 3: WriteByte (MSG_ENTITY, self.item[2]);
break;
- case 4: WriteByte (MSG_ENTITY, self.inventory4);
+ case 4: WriteByte (MSG_ENTITY, self.item[3]);
break;
- case 5: WriteByte (MSG_ENTITY, self.inventory5);
+ case 5: WriteByte (MSG_ENTITY, self.item[4]);
break;
- case 6: WriteByte (MSG_ENTITY, self.inventory6);
+ case 6: WriteByte (MSG_ENTITY, self.item[5]);
break;
- case 7: WriteByte (MSG_ENTITY, self.inventory7);
+ case 7: WriteByte (MSG_ENTITY, self.item[6]);
break;
- case 8: WriteByte (MSG_ENTITY, self.inventory8);
+ case 8: WriteByte (MSG_ENTITY, self.item[7]);
break;
}
}
@@ -1202,14 +1189,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (netflags & NETFLAG_PLAYER_INVENTORY)
{
- WriteByte (MSG_ENTITY, self.inventory1);
- WriteByte (MSG_ENTITY, self.inventory2);
- WriteByte (MSG_ENTITY, self.inventory3);
- WriteByte (MSG_ENTITY, self.inventory4);
- WriteByte (MSG_ENTITY, self.inventory5);
- WriteByte (MSG_ENTITY, self.inventory6);
- WriteByte (MSG_ENTITY, self.inventory7);
- WriteByte (MSG_ENTITY, self.inventory8);
+ WriteByte (MSG_ENTITY, self.item[0]);
+ WriteByte (MSG_ENTITY, self.item[1]);
+ WriteByte (MSG_ENTITY, self.item[2]);
+ WriteByte (MSG_ENTITY, self.item[3]);
+ WriteByte (MSG_ENTITY, self.item[4]);
+ WriteByte (MSG_ENTITY, self.item[5]);
+ WriteByte (MSG_ENTITY, self.item[6]);
+ WriteByte (MSG_ENTITY, self.item[7]);
}
if (netflags & NETFLAG_PLAYER_AMMO)
@@ -1267,14 +1254,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.ammo_shells = 100;
// the traditional id1 layout -- CEV
- self.inventory1 = ITEM_SEQ_AXE;
- self.inventory2 = ITEM_SEQ_SHOTGUN;
- self.inventory3 = ITEM_SEQ_SUPERSHOTGUN;
- self.inventory4 = ITEM_SEQ_NAILGUN;
- self.inventory5 = ITEM_SEQ_SUPERNAILGUN;
- self.inventory6 = ITEM_SEQ_GRENADELAUNCHER;
- self.inventory7 = ITEM_SEQ_ROCKETLAUNCHER;
- self.inventory8 = ITEM_SEQ_LIGHTNINGGUN;
+ self.item[0] = ITEM_SEQ_AXE;
+ self.item[1] = ITEM_SEQ_SHOTGUN;
+ self.item[2] = ITEM_SEQ_SUPERSHOTGUN;
+ self.item[3] = ITEM_SEQ_NAILGUN;
+ self.item[4] = ITEM_SEQ_SUPERNAILGUN;
+ self.item[5] = ITEM_SEQ_GRENADELAUNCHER;
+ self.item[6] = ITEM_SEQ_ROCKETLAUNCHER;
+ self.item[7] = ITEM_SEQ_LIGHTNINGGUN;
self.weapon = 7;
self.impulse = 0;
@@ -1329,14 +1316,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
{ \
switch (i) \
{ \
- case 1: idx = self.inventory1; break; \
- case 2: idx = self.inventory2; break; \
- case 3: idx = self.inventory3; break; \
- case 4: idx = self.inventory4; break; \
- case 5: idx = self.inventory5; break; \
- case 6: idx = self.inventory6; break; \
- case 7: idx = self.inventory7; break; \
- case 8: idx = self.inventory8; break; \
+ case 1: idx = self.item[0]; break; \
+ case 2: idx = self.item[1]; break; \
+ case 3: idx = self.item[2]; break; \
+ case 4: idx = self.item[3]; break; \
+ case 5: idx = self.item[4]; break; \
+ case 6: idx = self.item[5]; break; \
+ case 7: idx = self.item[6]; break; \
+ case 8: idx = self.item[7]; break; \
} \
if (idx == WEAPON) \
{ \
@@ -1359,7 +1346,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
local float i = 1;
local float idx = 0;
- if (self.conlevel <= 1 && self.ammo_cells > 0)
+ if (self.waterlevel <= 1 && self.ammo_cells > 0)
{
// check for LG, switch to it if available, return
SCAN (i, idx, ITEM_SEQ_LIGHTNINGGUN)
@@ -1405,7 +1392,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (time < self.attack_finished)
return;
- // argument will equal the inventory slot here -- CEV
+ // argument will equal the item slot here -- CEV
self.weapon = imp;
// zero out impulse if necessary -- CEV
@@ -1519,8 +1506,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.super_sound < time)
{
self.super_sound = time + 1;
- sound (self, CHAN_AUTO, "items/damage3.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_item_quad_dam)
}
};
@@ -1537,11 +1523,11 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (idx > ITEM_SEQ_LIGHTNINGGUN)
return TRUE;
- local item_info_t item = item_info[idx];
+ local item_info_t iit = item_info[idx];
- if (item.option)
+ if (iit.option)
{
- switch (item.option)
+ switch (iit.option)
{
case ITEM_AMMO_SHELLS:
if (self.ammo_shells > 0)
@@ -1571,96 +1557,81 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//--------------------------------------------------------------
void() player_fire_hands =
{
- // based on / inspired by the find loop in the W_FireAxe
- // function in Arcane Dimensions -- CEV
- local float dot, i;
- local vector org;
- local entity head;
-
+ // trace to look for FINDABLE_NONSOLID item entities -- CEV
makevectors (self.v_angle);
- head = findradius (self.origin, 96);
+ local vector org = self.origin + self.view_ofs;
+ traceline (org, org + v_forward * 64, MOVE_TRIGGERS, self);
- while (head)
- {
- if (!(head.classgroup & CG_ITEM))
- {
- // found a non-item -- CEV
- dprint (sprintf("player_fire_hands: "
- "%s at %v is not an item!\n",
- head.classname, head.origin));
- head = head.chain;
- continue;
- }
+ if (trace_fraction >= 1.0f)
+ return;
- if (head.think == sub_remove)
- {
- // this entity is waiting to be removed -- CEV
- dprint (sprintf("player_fire_hands: "
- "%s at %v is scheduled for removal!\n",
- head.classname, head.origin));
- head = head.chain;
- continue;
- }
+ if (!(trace_ent.classgroup & CG_ITEM))
+ {
+ // found a non-item -- CEV
+ dprint (sprintf("player_fire_hands: "
+ "%s at %v is not an item!\n",
+ trace_ent.classname, trace_ent.origin));
+ return;
+ }
- if (head.solid == SOLID_NOT) {
- if (head.alpha > 0) {
- if (head.alpha < ITEM_ALPHA_OPAQUE)
- {
- // this item is waiting to respawn -- CEV
- dprint (sprintf("player_fire_hands: "
- "%s at %v is waiting to respawn!\n",
- head.classname, head.origin));
- head = head.chain;
- continue;
- } } }
+ if (trace_ent.think == sub_remove)
+ {
+ // this entity is waiting to be removed -- CEV
+ dprint (sprintf("player_fire_hands: "
+ "%s at %v is scheduled for removal!\n",
+ trace_ent.classname, trace_ent.origin));
+ return;
+ }
- org = normalize (head.origin - self.origin);
- dot = org * v_forward;
+ if (trace_ent.solid == SOLID_NOT) {
+ if (trace_ent.alpha > 0) {
+ if (trace_ent.alpha < ITEM_ALPHA_OPAQUE)
+ {
+ // this item is waiting to respawn -- CEV
+ dprint (sprintf("player_fire_hands: "
+ "%s at %v is waiting to respawn!\n",
+ trace_ent.classname, trace_ent.origin));
+ return;
+ } } }
- // check if we're looking at head -- CEV
- if (dot > 0.95)
- {
- if (head.classgroup & CG_ITEM_WEAPON)
- // grab weapon -- CEV
- base_item_weapon_grab (self, head);
- else if (head.classgroup & CG_ITEM_AMMO)
- // grab ammo -- CEV
- base_item_ammo_grab (self, head);
- else if (head.classgroup & CG_ITEM_ARMOR)
- // grab armor -- CEV
- base_item_armor_grab (self, head);
- else if (head.classgroup & CG_ITEM_HEALTH)
- // grab health -- CEV
- base_item_health_grab (self, head);
- else if (head.classgroup & CG_ITEM_KEY)
- // run touch() for keys -- CEV
- sub_runvoidas (head, head.touch);
- else if (head.classgroup & CG_ITEM_POWERUP)
- // grab powerups -- CEV
- base_item_powerup_grab (self, head);
- else if (head.classtype == CT_ITEM_BACKPACK)
- // run touch() for backpacks -- CEV
- sub_runvoidas (head, head.touch);
- else if (head.classtype == CT_ITEM_RUNE)
- // run touch() for runes -- CEV
- sub_runvoidas (head, head.touch);
- else if (head.classgroup & CG_CORPSE &&
- head.classgroup & CG_ITEM)
- base_item_gib_grab (self, head);
- else
- dprint (sprintf("player_fire_hands: "
- "hit %s!, dot %g\n",
- head.classname, dot));
- return;
- }
+ if (self.flags & FL_THROW_HELD)
+ {
+ // behavior when holding throw - perform a grab -- CEV
+ if (trace_ent.classgroup & CG_ITEM_WEAPON)
+ base_item_weapon_grab (self, trace_ent);
+ else if (trace_ent.classgroup & CG_ITEM_AMMO)
+ base_item_ammo_grab (self, trace_ent);
+ else if (trace_ent.classgroup & CG_ITEM_ARMOR)
+ base_item_armor_grab (self, trace_ent);
+ else if (trace_ent.classgroup & CG_ITEM_HEALTH)
+ base_item_health_grab (self, trace_ent);
+ else if (trace_ent.classgroup & CG_ITEM_KEY)
+ sub_runvoidas (trace_ent, trace_ent.touch);
+ else if (trace_ent.classgroup & CG_ITEM_POWERUP)
+ base_item_powerup_grab (self, trace_ent);
+ else if (trace_ent.classtype == CT_ITEM_BACKPACK)
+ sub_runvoidas (trace_ent, trace_ent.touch);
+ else if (trace_ent.classtype == CT_ITEM_RUNE)
+ sub_runvoidas (trace_ent, trace_ent.touch);
+ else if (trace_ent.classgroup & CG_CORPSE &&
+ trace_ent.classgroup & CG_ITEM)
+ base_item_throwable_grab (self, trace_ent);
+ else if (trace_ent.classtype == CT_ITEM_TORCH)
+ item_torch_grab (self, trace_ent);
else
- {
dprint (sprintf("player_fire_hands: "
- "skipping %s!, dot %g\n",
- head.classname, dot));
- }
-
- head = head.chain;
+ "hit %s!, frac %g\n",
+ trace_ent.classname, trace_fraction));
+ }
+ else
+ {
+ // regular attack with hands - call touch() -- CEV
+ if (trace_ent.touch && trace_ent.touch != sub_null)
+ sub_runvoidas (trace_ent, trace_ent.touch);
+ else
+ dprint (sprintf("player_fire_hands: "
+ "hit %s!, frac %g, no touch func\n",
+ trace_ent.classname, trace_fraction));
}
};
@@ -1687,15 +1658,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (trace_ent.takedamage)
{
- trace_ent.axhitme = 1;
+ trace_ent.stateflags |= STATE_AXEHITME;
spawn_blood (org, '0 0 0', 20);
t_damage2 (trace_ent, self, self, 20);
}
else
{
// hit wall
- sound (self, CHAN_WEAPON, "player/axhit2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_axe_hit_world)
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_GUNSHOT);
WriteCoord (MSG_BROADCAST, org_x);
@@ -1712,15 +1682,13 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
local vector org, dir, vdir;
local float vspeed;
- sound (self, CHAN_WEAPON, "weapons/guncock.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_shotgun)
self.punchangle_x = -2;
self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
self.currentammo = self.ammo_shells = self.ammo_shells - 1;
self.SendFlags |= NETFLAG_PLAYER_AMMO;
- // dir = aim (self, 100000);
makevectors (self.v_angle);
org = self.origin + (self.view_ofs - '0 0 16') +
@@ -1758,15 +1726,13 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
return;
}
- sound (self, CHAN_WEAPON, "weapons/shotgn2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_supershotgun)
self.punchangle_x = -4;
self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
self.currentammo = self.ammo_shells = self.ammo_shells - 2;
self.SendFlags |= NETFLAG_PLAYER_AMMO;
- // dir = aim (self, 100000);
makevectors (self.v_angle);
org = self.origin + (self.view_ofs - '0 0 16') +
@@ -1793,8 +1759,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.ammo_nails < 1)
{
// no ammo sound -- CEV
- sound (self, CHAN_WEAPON, "cev/items/noammo.ogg",
- VOL_MID, ATTN_NORM);
+ SOUND (self, snd_weapon_noammo)
self.attack_finished = time + 1.0;
// signal player_attack to switch weapon -- CEV
self.aflag = 1;
@@ -1803,11 +1768,6 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
return;
}
- local vector dir;
- local vector org = self.origin + self.view_ofs;
-
- makevectors (self.v_angle);
-
BASE_ENTITY_WEAPONLOOKUP (self)
if (self.ammo_nails >= 2 && item_index == ITEM_SEQ_SUPERNAILGUN)
@@ -1816,26 +1776,22 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
return;
}
- self.attack_finished = time + 0.2;
-
- sound (self, CHAN_WEAPON, "weapons/rocket1i.wav",
- VOL_HIGH, ATTN_NORM);
- self.currentammo = self.ammo_nails = self.ammo_nails - 1;
- self.SendFlags |= NETFLAG_PLAYER_AMMO;
+ local vector org, vel;
- dir = aim (self, SPIKE_SPEED);
- // dir = normalize (dir);
- // SetSpeed
- dir *= min (SPIKE_SPEED, world_maxvelocity);
-
- // seven Nailgun position fix - thanks to Greenwood
- // -- dumptruck_ds
- org += v_up * -8 + v_right * (offset * 0.5);
+ makevectors (self.v_angle);
+ org = self.origin + self.view_ofs;
+ org += v_forward * 16 - v_up * 8 + v_right * offset;
+ vel = v_forward * SPIKE_SPEED;
- spawn_projectile_spike (self, org, dir, SPIKE_NORMAL_DAMAGE);
+ spawn_projectile_spike (self, org, vel, SPIKE_NORMAL_DAMAGE);
+ // feedback & client updates -- CEV
+ SOUND (self, snd_weapon_nailgun)
+ self.attack_finished = time + 0.2;
+ self.currentammo = self.ammo_nails = self.ammo_nails - 1;
self.punchangle_x = -2;
- self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
+ self.SendFlags |= NETFLAG_PLAYER_AMMO |
+ NETFLAG_PLAYER_PUNCHANGLE;
};
//--------------------------------------------------------------
@@ -1843,26 +1799,21 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//--------------------------------------------------------------
void() player_fire_superspikes =
{
- local vector dir;
- local vector org = self.origin + (self.view_ofs - '0 0 4');
+ local vector org, vel;
- sound (self, CHAN_WEAPON, "weapons/spike2.wav",
- VOL_HIGH, ATTN_NORM);
- self.attack_finished = time + 0.2;
- self.currentammo = self.ammo_nails = self.ammo_nails - 2;
- self.SendFlags |= NETFLAG_PLAYER_AMMO;
-
- dir = aim (self, SPIKE_SPEED);
- // dir = normalize (dir);
- // SetSpeed
- dir *= min (SPIKE_SPEED, world_maxvelocity);
+ makevectors (self.v_angle);
+ org = self.origin + self.view_ofs - '0 0 4';
+ vel = v_forward * SPIKE_SPEED;
- // seven Nailgun position fix - thanks to Greenwood
- // -- dumptruck_ds
- spawn_projectile_spike (self, org, dir, SPIKE_SUPER_DAMAGE);
+ spawn_projectile_spike (self, org, vel, SPIKE_SUPER_DAMAGE);
+ // feedback & client updates -- CEV
+ SOUND (self, snd_weapon_supernailgun)
+ self.attack_finished = time + 0.2;
+ self.currentammo = self.ammo_nails = self.ammo_nails - 2;
self.punchangle_x = -2;
- self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
+ self.SendFlags |= NETFLAG_PLAYER_AMMO |
+ NETFLAG_PLAYER_PUNCHANGLE;
};
//--------------------------------------------------------------
@@ -1876,8 +1827,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
self.SendFlags |= NETFLAG_PLAYER_AMMO;
- sound (self, CHAN_WEAPON, "weapons/grenade.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenadelauncher)
self.punchangle_x = -2;
self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
@@ -1885,18 +1835,9 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// set missile speed
makevectors (self.v_angle);
- if (self.v_angle_x)
- {
- missile_velocity = v_forward * GRENADE_SPEED +
- v_up * 200 + crandom() * v_right * 10 +
- crandom() * v_up * 10;
- }
- else
- {
- missile_velocity = aim (self, 10000);
- missile_velocity = missile_velocity * GRENADE_SPEED;
- missile_velocity_z = 200;
- }
+ missile_velocity = v_forward * GRENADE_SPEED +
+ v_up * 200 + crandom() * v_right * 10 +
+ crandom() * v_up * 10;
spawn_projectile_grenade (self, org, missile_velocity);
};
@@ -1904,13 +1845,10 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//--------------------------------------------------------------
void() player_fire_tribolt =
{
- local vector missile_vel = '0 0 0';
-
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
self.SendFlags |= NETFLAG_PLAYER_AMMO;
- sound (self, CHAN_WEAPON, "weapons/grenade.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenadelauncher)
self.punchangle_x = -2;
self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
@@ -1926,26 +1864,20 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//--------------------------------------------------------------
void() player_fire_rocket =
{
- local vector org = self.origin + (self.view_ofs - '0 0 8');
- local vector missile_velocity = '0 0 0';
-
- self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
- self.SendFlags |= NETFLAG_PLAYER_AMMO;
-
- sound (self, CHAN_ITEM_WEAPON_ROCKETS, "weapons/sgun1.wav",
- VOL_HIGH, ATTN_NORM);
-
- self.punchangle_x = -2;
- self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
+ local vector org, vel;
- // set missile speed
makevectors (self.v_angle);
- missile_velocity = aim (self, 1000);
- missile_velocity *= ROCKET_SPEED;
- org += v_forward * 8;
+ org = self.origin + (self.view_ofs - '0 0 8') + v_forward * 16;
+ vel = v_forward * ROCKET_SPEED;
+
+ spawn_projectile_rocket (self, org, vel);
- spawn_projectile_rocket (self, org, missile_velocity);
+ SOUND (self, snd_weapon_rocketlauncher)
+ self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
+ self.punchangle_x = -2;
+ self.SendFlags |= NETFLAG_PLAYER_AMMO |
+ NETFLAG_PLAYER_PUNCHANGLE;
};
//--------------------------------------------------------------
@@ -1956,8 +1888,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.ammo_cells < 1)
{
// no ammo sound -- CEV
- sound (self, CHAN_WEAPON, "cev/items/noammo.ogg",
- VOL_MID, ATTN_NORM);
+ SOUND (self, snd_weapon_noammo)
self.attack_finished = time + 0.2;
// signal player_attack to switch weapon -- CEV
self.aflag = 1;
@@ -1967,7 +1898,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
}
// explode if under water
- if (self.conlevel > WATERLEVEL_FEET)
+ if (self.waterlevel > WATERLEVEL_FEET)
{
local float cells = self.ammo_cells;
self.ammo_cells = 0;
@@ -1977,10 +1908,10 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.t_width < time)
{
- sound (self, CHAN_WEAPON, "weapons/lhit.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_lightning_hit)
self.t_width = time + 0.6;
}
+
self.punchangle_x = -2;
self.SendFlags |= NETFLAG_PLAYER_PUNCHANGLE;
@@ -2030,8 +1961,6 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//--------------------------------------------------------------
void() player_attack =
{
- local float r;
-
// creates item_index -- CEV
BASE_ENTITY_WEAPONLOOKUP (self)
@@ -2047,8 +1976,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
}
// no ammo sound -- CEV
- sound (self, CHAN_WEAPON, "cev/items/noammo.ogg",
- VOL_MID, ATTN_NORM);
+ SOUND (self, snd_weapon_noammo)
if (self.weaponframe)
self.weaponframe = 0;
@@ -2067,6 +1995,8 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// wake monsters up
self.show_hostile = time + 1;
+ local float r;
+
switch (item_index)
{
case ITEM_SEQ_HANDS:
@@ -2074,8 +2004,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
player_fire_hands ();
break;
case ITEM_SEQ_AXE:
- sound (self, CHAN_WEAPON, "weapons/ax1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_axe_swoosh)
r = random ();
if (r < 0.25)
pl_axe1 ();
@@ -2106,10 +2035,10 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
case ITEM_SEQ_GRENADELAUNCHER:
pl_rocket1 ();
// TODO CEV
- // player_fire_grenade ();
- player_fire_tribolt ();
- // self.attack_finished = time + 0.6;
- self.attack_finished = time + 1.3;
+ player_fire_grenade ();
+ self.attack_finished = time + 0.6;
+ // player_fire_tribolt ();
+ // self.attack_finished = time + 1.3;
break;
case ITEM_SEQ_ROCKETLAUNCHER:
pl_rocket1 ();
@@ -2119,8 +2048,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
case ITEM_SEQ_LIGHTNINGGUN:
pl_light1 ();
self.attack_finished = time + 0.1;
- sound (self, CHAN_AUTO, "weapons/lstart.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_lightning_start)
break;
case ITEM_SEQ_AMMO_SHELLS_SMALL:
case ITEM_SEQ_AMMO_SHELLS_LARGE:
@@ -2154,23 +2082,8 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.attack_finished = time + 0.5;
base_item_powerup_fire (self, item_index);
break;
- case ITEM_SEQ_GIB1:
- case ITEM_SEQ_GIB2:
- case ITEM_SEQ_GIB3:
- case ITEM_SEQ_HEAD_ARMY:
- case ITEM_SEQ_HEAD_DEMON:
- case ITEM_SEQ_HEAD_DOG:
- case ITEM_SEQ_HEAD_ENFORCER:
- case ITEM_SEQ_HEAD_HELLKNIGHT:
- case ITEM_SEQ_HEAD_KNIGHT:
- case ITEM_SEQ_HEAD_OGRE:
- case ITEM_SEQ_HEAD_PLAYER:
- case ITEM_SEQ_HEAD_SHALRATH:
- case ITEM_SEQ_HEAD_SHAMBLER:
- case ITEM_SEQ_HEAD_WIZARD:
- case ITEM_SEQ_HEAD_ZOMBIE:
- self.attack_finished = time + 0.5;
- base_item_gib_fire (self, item_index);
+ case ITEM_SEQ_THROWABLE_START..ITEM_SEQ_THROWABLE_END:
+ base_item_throwable_fire (self, item_index);
break;
default:
dprint (sprintf("player_attack: "
@@ -2184,7 +2097,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// player_throw_item
// throw the active item, freeing the current inventory slot -- CEV
//--------------------------------------------------------------
- void() player_throw_item =
+ void(vector vel) player_throw_item =
{
if (time < self.attack_finished)
// we're waiting to attack -- CEV
@@ -2195,10 +2108,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.flags |= FL_THROW_HELD;
+ // creates item_index variable -- CEV
BASE_ENTITY_WEAPONLOOKUP (self)
+
+ // if we're not holding anything, perform a grab -- CEV
if (item_index == ITEM_SEQ_HANDS)
{
- // call fire_hands to perform a grab -- CEV
+ // player_fire_hands will do the grab to avoid
+ // duplicating code -- CEV
player_fire_hands ();
self.attack_finished = time + 0.5;
return;
@@ -2216,193 +2133,43 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// world space (so the thrown item appears to spawn from
// the same position the player is holding the item)
local vector org = self.origin + (self.view_ofs - '0 0 16') +
- (v_forward * 50);
+ (v_forward * 25);
// don't spawn items into the solid world -- CEV
tracebox (self.origin, '-16 -16 -16', '16 16 16', org,
MOVE_NORMAL, self);
- if (trace_startsolid || trace_allsolid)
- {
- // we're too close to a wall to spawn the ent -- CEV
- self.attack_finished = time + 0.2;
- return;
- }
- if (trace_fraction < 1.0f)
+
+ if (trace_startsolid || trace_allsolid || trace_fraction < 1.0f)
{
- // again, too close to a wall -- CEV
+ // we're too close to a wall to spawn the ent;
+ // delay by 0.2 so the player can try again soon
+ // -- CEV
self.attack_finished = time + 0.2;
return;
}
- local item_info_t item = item_info[item_index];
+ local item_info_t iit = item_info[item_index];
sprint (self, sprintf("%s threw the %s!\n",
- self.netname, item.name));
+ self.netname, iit.name));
// forward and up/down -- CEV
- local vector vel = v_forward * 200.0f + v_up * 180.0f;
- local float fl = SPAWNFLAG_ITEM_THROWN;
+ if (!vel)
+ vel = v_forward * 25.0f + v_up * 45.0f;
// spawn a new entity matching the held item definition -- CEV
- switch (item_index)
+ spawn_base_item (item_index, org, vel, SPAWNFLAG_ITEM_THROWN);
+
+ // now remove the held item -- CEV
+ switch (self.weapon)
{
- // id1 weapons
- case ITEM_SEQ_SHOTGUN:
- spawn_weapon_shotgun (self, org, vel, fl);
- break;
- case ITEM_SEQ_SUPERSHOTGUN:
- spawn_weapon_supershotgun (self, org, vel, fl);
- break;
- case ITEM_SEQ_NAILGUN:
- spawn_weapon_nailgun (self, org, vel, fl);
- break;
- case ITEM_SEQ_SUPERNAILGUN:
- spawn_weapon_supernailgun (self, org, vel, fl);
- break;
- case ITEM_SEQ_GRENADELAUNCHER:
- spawn_weapon_grenadelauncher (self, org, vel,
- fl);
- break;
- case ITEM_SEQ_ROCKETLAUNCHER:
- spawn_weapon_rocketlauncher (self, org, vel,
- fl);
- break;
- case ITEM_SEQ_LIGHTNINGGUN:
- spawn_weapon_lightning (self, org, vel, fl);
- break;
- // id1 ammo
- case ITEM_SEQ_AMMO_SHELLS_SMALL:
- spawn_item_shells (self, org, vel, fl);
- break;
- case ITEM_SEQ_AMMO_SHELLS_LARGE:
- spawn_item_shells (self, org, vel,
- fl | SPAWNFLAG_ITEM_AMMO_LARGE_BOX);
- break;
- case ITEM_SEQ_AMMO_NAILS_SMALL:
- spawn_item_spikes (self, org, vel, fl);
- break;
- case ITEM_SEQ_AMMO_NAILS_LARGE:
- spawn_item_spikes (self, org, vel,
- fl | SPAWNFLAG_ITEM_AMMO_LARGE_BOX);
- break;
- case ITEM_SEQ_AMMO_ROCKETS_SMALL:
- spawn_item_rockets (self, org, vel, fl);
- break;
- case ITEM_SEQ_AMMO_ROCKETS_LARGE:
- spawn_item_rockets (self, org, vel,
- fl | SPAWNFLAG_ITEM_AMMO_LARGE_BOX);
- break;
- case ITEM_SEQ_AMMO_CELLS_SMALL:
- spawn_item_cells (self, org, vel, fl);
- break;
- case ITEM_SEQ_AMMO_CELLS_LARGE:
- spawn_item_cells (self, org, vel,
- fl | SPAWNFLAG_ITEM_AMMO_LARGE_BOX);
- break;
- case ITEM_SEQ_ARMOR_GREEN:
- spawn_item_armor1 (self, org, vel, fl);
- break;
- case ITEM_SEQ_ARMOR_YELLOW:
- spawn_item_armor2 (self, org, vel, fl);
- break;
- case ITEM_SEQ_ARMOR_RED:
- spawn_item_armorInv (self, org, vel, fl);
- break;
- case ITEM_SEQ_ARMOR_SHARD:
- spawn_item_armor_shard (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEALTH_ROTTEN:
- spawn_item_health (self, org, vel,
- fl | SPAWNFLAG_ITEM_HEALTH_ROTTEN);
- break;
- case ITEM_SEQ_HEALTH:
- spawn_item_health (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEALTH_MEGA:
- spawn_item_health (self, org, vel,
- fl | SPAWNFLAG_ITEM_HEALTH_MEGA);
- break;
- case ITEM_SEQ_HEALTH_VIAL:
- spawn_item_health_vial (self, org, vel, fl);
- break;
- case ITEM_SEQ_ARTIFACT_ENVIROSUIT:
- spawn_item_artifact_envirosuit (self, org,
- vel, fl);
- break;
- case ITEM_SEQ_ARTIFACT_INVISIBILITY:
- spawn_item_artifact_invisibility (self, org,
- vel, fl);
- break;
- case ITEM_SEQ_ARTIFACT_INVULNERABILITY:
- spawn_item_artifact_invulnerability (self, org,
- vel, fl);
- break;
- case ITEM_SEQ_ARTIFACT_QUAD:
- spawn_item_artifact_super_damage (self, org,
- vel, fl);
- break;
- case ITEM_SEQ_GIB1:
- spawn_item_gib1 (self, org, vel, fl);
- break;
- case ITEM_SEQ_GIB2:
- spawn_item_gib2 (self, org, vel, fl);
- break;
- case ITEM_SEQ_GIB3:
- spawn_item_gib3 (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_ARMY:
- spawn_item_head_army (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_DEMON:
- spawn_item_head_demon (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_DOG:
- spawn_item_head_dog (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_ENFORCER:
- spawn_item_head_enforcer (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_HELLKNIGHT:
- spawn_item_head_hell_knight(self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_KNIGHT:
- spawn_item_head_knight (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_OGRE:
- spawn_item_head_ogre (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_PLAYER:
- spawn_item_head_player (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_SHALRATH:
- spawn_item_head_shalrath (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_SHAMBLER:
- spawn_item_head_shambler (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_WIZARD:
- spawn_item_head_wizard (self, org, vel, fl);
- break;
- case ITEM_SEQ_HEAD_ZOMBIE:
- spawn_item_head_zombie (self, org, vel, fl);
- break;
- default:
- objerror (sprintf("player_throw_item: "
- "unknown item type %g!\n", item_index));
- self.attack_finished = time + 0.5;
- return;
- }
-
- // now remove the held item -- CEV
- switch (self.weapon)
- {
- case 1: self.inventory1 = ITEM_SEQ_HANDS; break;
- case 2: self.inventory2 = ITEM_SEQ_HANDS; break;
- case 3: self.inventory3 = ITEM_SEQ_HANDS; break;
- case 4: self.inventory4 = ITEM_SEQ_HANDS; break;
- case 5: self.inventory5 = ITEM_SEQ_HANDS; break;
- case 6: self.inventory6 = ITEM_SEQ_HANDS; break;
- case 7: self.inventory7 = ITEM_SEQ_HANDS; break;
- case 8: self.inventory8 = ITEM_SEQ_HANDS; break;
+ case 1: self.item[0] = ITEM_SEQ_HANDS; break;
+ case 2: self.item[1] = ITEM_SEQ_HANDS; break;
+ case 3: self.item[2] = ITEM_SEQ_HANDS; break;
+ case 4: self.item[3] = ITEM_SEQ_HANDS; break;
+ case 5: self.item[4] = ITEM_SEQ_HANDS; break;
+ case 6: self.item[5] = ITEM_SEQ_HANDS; break;
+ case 7: self.item[6] = ITEM_SEQ_HANDS; break;
+ case 8: self.item[7] = ITEM_SEQ_HANDS; break;
}
// clear weaponframe & set a cooldown then we're done -- CEV
@@ -2416,16 +2183,18 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//==============================================================
//--------------------------------------------------------------
+ // used by kill command and disconnect command
+ //--------------------------------------------------------------
void() player_set_suicide_frame =
{
- // used by kill command and disconnect command
if (self.model != "progs/player.mdl")
- // allready gibbed
+ // already gibbed
return;
+
self.frame = $deatha11;
self.solid = SOLID_NOT;
self.movetype = MOVETYPE_TOSS;
- self.deadflag = DEAD_DEAD;
+ self.deadflag = DF_DEAD;
self.nextthink = -1;
};
@@ -2441,60 +2210,69 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (damage_attacker.classname == "teledeath")
{
- sound (self, CHAN_VOICE, "player/teledth1.wav",
- VOL_HIGH, ATTN_NONE);
+ SOUND (self, snd_player_teledeath)
return;
}
// water pain sounds
- if (self.contype == CONTENT_WATER &&
- self.conlevel == WATERLEVEL_EYES)
+ if (self.watertype == CONTENT_WATER &&
+ self.waterlevel == WATERLEVEL_EYES)
{
// PlayerDeathBubbles
spawn_air_bubbles (self, self.origin, 1);
if (random() > 0.5)
- sound (self, CHAN_VOICE, "player/drown1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_drown_01)
+ }
else
- sound (self, CHAN_VOICE, "player/drown2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_drown_02)
+ }
return;
}
// slime pain sounds
- if (self.contype == CONTENT_SLIME)
+ if (self.watertype == CONTENT_SLIME)
{
// FIX ME put in some steam here
// 1998-08-10 Player gulps bubbles when hurt in slime
// by Maddes start
- if (self.conlevel == WATERLEVEL_EYES)
+ if (self.waterlevel == WATERLEVEL_EYES)
// PlayerDeathBubbles
spawn_air_bubbles (self, self.origin, 1);
// 1998-08-10 Player gulps bubbles when hurt in slime
// by Maddes end
if (random() > 0.5)
- sound (self, CHAN_VOICE, "player/lburn1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_lavaburn_01)
+ }
else
- sound (self, CHAN_VOICE, "player/lburn2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_lavaburn_01)
+ }
return;
}
- if (self.contype == CONTENT_LAVA)
+ if (self.watertype == CONTENT_LAVA)
{
if (random() > 0.5)
- sound (self, CHAN_VOICE, "player/lburn1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_lavaburn_01)
+ }
else
- sound (self, CHAN_VOICE, "player/lburn2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_lavaburn_01)
+ }
return;
}
+ // jump_flag landing sound is playing -- CEV
+ if (self.jump_flag < -300 && self.health > 0)
+ return;
+
if (self.pain_finished > time)
{
- self.axhitme = 0;
+ self.stateflags &= ~STATE_AXEHITME;
return;
}
@@ -2502,31 +2280,30 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.pain_finished = time + 0.5;
// ax pain sound
- if (self.axhitme == 1)
+ if (self.stateflags & STATE_AXEHITME)
{
- self.axhitme = 0;
- sound (self, CHAN_VOICE, "player/axhit1.wav",
- VOL_HIGH, ATTN_NORM);
+ self.stateflags &= ~STATE_AXEHITME;
+ SOUND (self, snd_weapon_axe_hit_meat)
return;
}
rs = rint ((random() * 5) + 1);
+ local sound_info_t snd = snd_empty;
- self.noise = "";
- if (rs == 1)
- self.noise = "player/pain1.wav";
- else if (rs == 2)
- self.noise = "player/pain2.wav";
- else if (rs == 3)
- self.noise = "player/pain3.wav";
- else if (rs == 4)
- self.noise = "player/pain4.wav";
- else if (rs == 5)
- self.noise = "player/pain5.wav";
- else
- self.noise = "player/pain6.wav";
+ switch (rs)
+ {
+ case 1: snd = snd_player_pain_01; break;
+ case 2: snd = snd_player_pain_02; break;
+ case 3: snd = snd_player_pain_03; break;
+ case 4: snd = snd_player_pain_04; break;
+ case 5: snd = snd_player_pain_05; break;
+ default: snd = snd_player_pain_06; break;
+ }
- sound (self, CHAN_VOICE, self.noise, VOL_HIGH, ATTN_NORM);
+ if (snd.wav != snd_empty.wav)
+ {
+ SOUND (self, snd)
+ }
return;
};
@@ -2538,28 +2315,31 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
local float rs;
// water death sounds
- if (self.conlevel == WATERLEVEL_EYES)
+ if (self.waterlevel == WATERLEVEL_EYES)
{
// PlayerDeathBubbles
spawn_air_bubbles (self, self.origin, 20);
- sound (self, CHAN_VOICE, "player/h2odeath.wav",
- VOL_HIGH, ATTN_NONE);
+ SOUND (self, snd_player_h2odeath)
return;
}
rs = rint ((random() * 4) + 1);
- if (rs == 1)
- self.noise = "player/death1.wav";
- else if (rs == 2)
- self.noise = "player/death2.wav";
- else if (rs == 3)
- self.noise = "player/death3.wav";
- else if (rs == 4)
- self.noise = "player/death4.wav";
- else if (rs == 5)
- self.noise = "player/death5.wav";
-
- sound (self, CHAN_VOICE, self.noise, VOL_HIGH, ATTN_NONE);
+ local sound_info_t snd = snd_empty;
+
+ switch (rs)
+ {
+ case 1: snd = snd_player_death_01;
+ case 2: snd = snd_player_death_02;
+ case 3: snd = snd_player_death_03;
+ case 4: snd = snd_player_death_04;
+ default: snd = snd_player_death_05;
+ }
+
+ if (snd.wav != snd_empty.wav)
+ {
+ SOUND (self, snd)
+ }
+
return;
};
@@ -2570,7 +2350,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
{
self.nextthink = -1;
// allow respawn after a certain time
- self.deadflag = DEAD_DEAD;
+ self.deadflag |= DF_DEAD;
};
//==============================================================
@@ -2578,128 +2358,6 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//==============================================================
//--------------------------------------------------------------
- void() player_footstep =
- {
- // not moving, no steps
- if (self.velocity_x == 0 || self.velocity_y == 0)
- return;
-
- // no steps when crouching
- if (self.pm_flags & PMF_CROUCHED)
- return;
-
- // no steps when on a slick/icy surface
- if (self.pm_flags & PMF_ONSLICK)
- return;
-
- // at least 200ms between steps
- if (self.step_time >= time - 0.2)
- return;
-
- // no steps when submerged fully
- if (self.conlevel >= WATERLEVEL_EYES)
- return;
-
- if (self.speed < PM_WALKSPEED * 0.9)
- // no footsteps below PM_WALKSPEED * 0.9
- return;
-
- if (self.speed < PM_MAXSPEED * 0.9)
- if (self.frame != $rockrun2 && self.frame != $axrun2)
- // half the footsteps when walking
- return;
-
- local float vol = 0;
- local string wav = "";
-
- if (self.conlevel == WATERLEVEL_FEET)
- {
- // the water foot
- vol = 0.3 + (random() * 0.1);
- self.cnt = rint (random() * 3);
-
- switch (self.cnt)
- {
- case 0:
- wav = "cev/player/step_water_01.ogg";
- break;
- case 1:
- wav = "cev/player/step_water_02.ogg";
- break;
- case 2:
- wav = "cev/player/step_water_03.ogg";
- break;
- case 3:
- wav = "cev/player/step_water_04.ogg";
- }
- }
- else if (self.conlevel == WATERLEVEL_WAIST)
- {
- // the deep water foot
- if (self.frame != $rockrun2 && self.frame != $axrun2)
- return;
-
- vol = 0.3 + (random() * 0.1);
- if (self.cnt > 3)
- self.cnt = 0;
-
- switch (self.cnt)
- {
- case 0:
- wav = "cev/player/wade_water_01.ogg";
- break;
- case 1:
- wav = "cev/player/wade_water_02.ogg";
- }
- }
- else
- {
- // call world_surface_type (which then calls out
- // to compatibility modules) to get a material type
- // under the player -- CEV
- switch (world_surface_type([0, 0, self.mins_z]))
- {
- case SURFACE_DIRT:
- vol = 0.3 + (random() * 0.2);
- if (self.cnt > 4)
- self.cnt = 0;
- wav = sprintf ("cev/player/step_dirt_0"
- "%g.ogg", self.cnt + 1);
- break;
- case SURFACE_METAL:
- vol = 0.3 + (random() * 0.2);
- self.cnt = rint (random() * 8);
- wav = sprintf ("cev/player/step_metal_0"
- "%g.ogg", self.cnt + 1);
- break;
- case SURFACE_WOOD:
- vol = 0.3 + (random() * 0.2);
- if (self.cnt > 3)
- self.cnt = 0;
- wav = sprintf ("cev/player/step_wood_0"
- "%g.ogg", self.cnt + 1);
- break;
- default:
- // default is SURFACE_STONE -- CEV
- vol = 0.3 + (random() * 0.2);
- if (self.cnt > 5)
- self.cnt = 0;
- wav = sprintf ("cev/player/step_stone_0"
- "%g.ogg", self.cnt + 1);
- }
- }
-
- sound (self, CHAN_FEET, wav, vol, ATTN_FEET);
- self.cnt++;
- self.step_time = time;
-
- if (self.lefty == FALSE)
- self.lefty = TRUE;
- else
- self.lefty = FALSE;
- };
-
- //--------------------------------------------------------------
void() player_stand =
{
self.weaponframe = 0;
@@ -2789,14 +2447,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
void() pl_axrun1 = [$axrun1, pl_axrun2]
{
self.weaponframe = 0;
- self.lefty = FALSE;
+ self.stateflags &= ~STATE_LEFTY;
player_axrun (pl_run1);
};
void() pl_axrun2 = [$axrun2, pl_axrun3]
{
// left foot down
player_axrun (pl_run2);
- if (self.flags & FL_ONGROUND)
+ if (self.moveflags & PMF_ONGROUND)
player_footstep ();
};
void() pl_axrun3 = [$axrun3, pl_axrun4] { player_axrun (pl_run3); };
@@ -2805,7 +2463,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
{
// right foot down
player_axrun (pl_run5);
- if (self.flags & FL_ONGROUND)
+ if (self.moveflags & PMF_ONGROUND)
player_footstep ();
};
void() pl_axrun6 = [$axrun6, pl_axrun1] { player_axrun (pl_run6); };
@@ -2816,14 +2474,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
void() pl_run1 = [$rockrun1, pl_run2]
{
self.weaponframe = 0;
- self.lefty = FALSE;
+ self.stateflags &= ~STATE_LEFTY;
player_run (pl_axrun1);
};
void() pl_run2 = [$rockrun2, pl_run3]
{
// left foot down
player_run (pl_axrun2);
- if (self.flags & FL_ONGROUND)
+ if (self.moveflags & PMF_ONGROUND)
player_footstep ();
};
void() pl_run3 = [$rockrun3, pl_run4] { player_run (pl_axrun3); };
@@ -2832,7 +2490,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
{
// right foot down
player_run (pl_axrun5);
- if (self.flags & FL_ONGROUND)
+ if (self.moveflags & PMF_ONGROUND)
player_footstep ();
};
void() pl_run6 = [$rockrun6, pl_run1] { player_run (pl_axrun6); };
@@ -2916,7 +2574,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.weaponframe == 9)
self.weaponframe = 1;
player_superdamage_sound ();
- player_fire_spikes (4);
+ player_fire_spikes (0);
self.attack_finished = time + 0.2;
};
void() pl_nail2 = [$nailatt2, pl_nail1]
@@ -2933,7 +2591,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.weaponframe == 9)
self.weaponframe = 1;
player_superdamage_sound ();
- player_fire_spikes (-4);
+ player_fire_spikes (-6);
self.attack_finished = time + 0.2;
};
@@ -3108,25 +2766,26 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//--------------------------------------------------------------
void() player_death_think =
{
- local float forward;
+ local float fwd;
if (self.flags & FL_ONGROUND)
{
- forward = vlen (self.velocity);
- forward = forward - 20;
- if (forward <= 0)
+ fwd = vlen (self.velocity) - 20;
+
+ if (fwd <= 0)
self.velocity = '0 0 0';
else
- self.velocity = forward *
- normalize (self.velocity);
+ self.velocity = fwd * normalize (self.velocity);
}
// wait for all buttons released
- if (self.deadflag == DEAD_DEAD)
+ if (self.deadflag & DF_DEAD)
{
if (self.button2 || self.button1 || self.button0)
return;
- self.deadflag = DEAD_RESPAWNABLE;
+
+ self.deadflag &= ~DF_DEAD;
+ self.deadflag |= DF_RESPAWNABLE;
return;
}
@@ -3154,14 +2813,16 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.health < 0)
return;
- if (self.conlevel != WATERLEVEL_EYES)
+ if (self.waterlevel != WATERLEVEL_EYES)
{
if (self.air_finished < time)
- sound (self, CHAN_VOICE, "player/gasp2.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_gasp_02)
+ }
else if (self.air_finished < time + 9)
- sound (self, CHAN_VOICE, "player/gasp1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_player_gasp_01)
+ }
self.air_finished = time + 12;
self.dmg = 2;
}
@@ -3180,19 +2841,18 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
}
}
- if (self.conlevel == WATERLEVEL_NONE)
+ if (self.waterlevel == WATERLEVEL_NONE)
{
if (self.flags & FL_INWATER)
{
// play leave water sound
- sound (self, CHAN_AUTO, "misc/outwater.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_misc_outwater)
self.flags &= ~FL_INWATER;
}
return;
}
- if (self.contype == CONTENT_LAVA)
+ if (self.watertype == CONTENT_LAVA)
{
// do damage
if (self.damage_time < time)
@@ -3204,11 +2864,11 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.deathtype = "lava";
t_damage2 (self, world, world,
- 10 * self.conlevel);
+ 10 * self.waterlevel);
self.deathtype = "";
}
}
- else if (self.contype == CONTENT_SLIME)
+ else if (self.watertype == CONTENT_SLIME)
{
// do damage
if (self.damage_time < time &&
@@ -3217,7 +2877,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.damage_time = time + 1;
self.deathtype = "slime";
t_damage2 (self, world, world,
- 4 * self.conlevel);
+ 4 * self.waterlevel);
self.deathtype = "";
}
}
@@ -3225,15 +2885,18 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (!(self.flags & FL_INWATER))
{
// player enter water sound
- if (self.contype == CONTENT_LAVA)
- sound (self, CHAN_AUTO, "player/inlava.wav",
- VOL_HIGH, ATTN_NORM);
- if (self.contype == CONTENT_WATER)
- sound (self, CHAN_AUTO, "player/inh2o.wav",
- VOL_HIGH, ATTN_NORM);
- if (self.contype == CONTENT_SLIME)
- sound (self, CHAN_AUTO, "player/slimbrn2.wav",
- VOL_HIGH, ATTN_NORM);
+ if (self.watertype == CONTENT_LAVA)
+ {
+ SOUND (self, snd_player_inlava)
+ }
+ else if (self.watertype == CONTENT_WATER)
+ {
+ SOUND (self, snd_player_inwater)
+ }
+ else if (self.watertype == CONTENT_SLIME)
+ {
+ SOUND (self, snd_player_inslime)
+ }
self.flags |= FL_INWATER;
self.damage_time = 0;
@@ -3252,15 +2915,15 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
fog_set_from_ent (self, self); \
self.gravity = self.wantedgravity; \
player_prethink_watermove (); \
- if (self.deadflag >= DEAD_DEAD) \
+ if (self.deadflag & DF_DEAD || self.deadflag & DF_RESPAWNABLE) \
{ \
/* dead, so run the death think -- CEV */ \
player_death_think (); \
} \
- else if (self.deadflag != DEAD_DYING) \
+ else if (!(self.deadflag & DF_DYING)) \
{ \
/* clear THROW_HELD if needed -- CEV */ \
- if (!(self.button6)) \
+ if (!(self.button4)) \
if (self.flags & FL_THROW_HELD) \
self.flags &= ~FL_THROW_HELD; \
/* teleporters can force a non-moving pause time */ \
@@ -3287,8 +2950,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// sound and screen flash when items starts to run out
if (self.invisible_sound < time)
{
- sound (self, CHAN_AUTO, "items/inv3.wav",
- VOL_MID, ATTN_IDLE);
+ SOUND (self, snd_item_invis_amb)
self.invisible_sound = time +
((random() * 3) + 1);
}
@@ -3300,8 +2962,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
sprint (self, "Ring of Shadows magic is"
" fading\n");
stuffcmd (self, "bf\n");
- sound (self, CHAN_AUTO,"items/inv2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_item_invis_off)
self.invisible_time = time + 1;
}
@@ -3351,9 +3012,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
sprint (self, "Protection is almost "
"burned out\n");
stuffcmd (self, "bf\n");
- sound (self, CHAN_AUTO,
- "items/protect2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_item_pent_off)
self.invincible_time = time + 1;
}
@@ -3388,9 +3047,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
sprint (self, "Quad Damage is wearing "
"off\n");
stuffcmd (self, "bf\n");
- sound (self, CHAN_AUTO,
- "items/damage2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_item_quad_off)
self.super_time = time + 1;
}
@@ -3428,9 +3085,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
sprint (self, "Air supply in Biosuit "
"expiring\n");
stuffcmd (self, "bf\n");
- sound (self, CHAN_AUTO,
- "items/suit2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_item_suit_off)
self.rad_time = time + 1;
}
@@ -3472,15 +3127,13 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (self.deadflag)
return;
- if (self.pm_flags & PMF_ONGROUND)
+ #if 0
+ // TODO CEV
+ if (self.moveflags & PMF_ONGROUND)
{
- if (self.pm_flags & PMF_CROUCHED)
+ if (self.moveflags & PMF_CROUCHED)
{
- // TODO CEV
local vector l = getlight (self.origin);
- /*
- l = normalize (l);
- */
/*
dprint (sprintf("player_postthink: light %v, "
@@ -3488,6 +3141,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
*/
}
}
+ #endif
// next block was in W_WeaponFrame -- CEV
if (time >= self.attack_finished)
@@ -3498,47 +3152,22 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// don't attack or throw when climbing -- CEV
// don't attack or throw when on ladder -- CEV
// attack and throw are mutually exclusive -- CEV
- if (!(self.pm_flags & PMF_CLIMB)) {
- if (!(self.pm_flags & PMF_ONLADDER)) {
+ if (!(self.moveflags & PMF_CLIMB)) {
+ if (!(self.moveflags & PMF_ONLADDER)) {
if (self.button0)
{
// button0 = attack -- CEV
player_superdamage_sound ();
player_attack ();
}
- else if (self.button6 && !(self.flags & FL_THROW_HELD))
+ else if (self.button4 && !(self.flags & FL_THROW_HELD))
{
- // button6 = grab / throw -- CEV
- player_throw_item ();
+ // button4 = grab / throw -- CEV
+ player_throw_item ('0 0 0');
} } }
}
- // check to see if player landed and play landing sound
- if (self.jump_flag < -300 && self.health > 0)
- {
- if (self.contype == CONTENT_WATER)
- {
- sound (self, CHAN_BODY, "player/h2ojump.wav",
- VOL_HIGH, ATTN_NORM);
- }
- else if (self.jump_flag < -650)
- {
- self.deathtype = "falling";
- t_damage2 (self, world, world, 5);
- self.deathtype = "";
- sound (self, CHAN_VOICE, "player/land2.wav",
- VOL_HIGH, ATTN_NORM);
- }
- else
- {
- sound (self, CHAN_VOICE, "player/land.wav",
- VOL_HIGH, ATTN_NORM);
- }
-
- self.jump_flag = 0;
- }
-
- // dumptruck_ds -- self replaces item_megahealth_rot in items.qc
+ // dumptruck_ds -- this replaces item_megahealth_rot in items.qc
if (self.health > self.max_health)
{
if (self.megahealth_rottime < time)
@@ -3582,10 +3211,15 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
//--------------------------------------------------------------
void(vector dir) player_destroy_gib =
{
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
+ self.deadflag = DF_DEAD;
+ self.deadflag |= DF_GIBBED;
+ // throw instead of calling base_monster_item_dropitems -- CEV
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB1, dir, self.health)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB2, dir, self.health)
+ BASE_ITEM_THROWABLE (ITEM_SEQ_GIB3, dir, self.health)
+
+ // TODO CEV
// throw the player head -- this needs special treatment -- CEV
self.nextthink = -1;
self.spawnflags = SPAWNFLAG_ITEM_THROWN;
@@ -3593,23 +3227,27 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.origin_z = self.origin_z - 24;
self.avelocity = crandom() * '0 600 0';
self.velocity = velocity_for_damage (dir, self.health);
- item_head_player_init (self);
-
- self.deadflag = DEAD_DEAD;
+ gib_head_player ();
if (damage_attacker.classname == "teledeath")
- sound (self, CHAN_VOICE, "player/teledth1.wav",
- VOL_HIGH, ATTN_NONE);
+ {
+ SOUND (self, snd_player_teledeath)
+ }
else if (damage_attacker.classname == "teledeath2")
- sound (self, CHAN_VOICE, "player/teledth1.wav",
- VOL_HIGH, ATTN_NONE);
+ {
+ SOUND (self, snd_player_teledeath)
+ }
else
+ {
if (random() < 0.5)
- sound (self, CHAN_VOICE, "player/gib.wav",
- VOL_HIGH, ATTN_NONE);
+ {
+ SOUND (self, snd_player_gib_01)
+ }
else
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NONE);
+ {
+ SOUND (self, snd_player_udeath)
+ }
+ }
};
//--------------------------------------------------------------
@@ -3641,12 +3279,15 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
if (deathmatch || coop)
item_backpack_drop (self);
+ // TODO CEV
+ // base_entity_destroy_items (dir);
+
self.weaponmodel = "";
self.view_ofs = '0 0 -8';
- self.deadflag = DEAD_DYING;
+ self.deadflag = DF_DYING;
self.solid = SOLID_NOT;
self.flags &= ~FL_ONGROUND;
- self.pm_flags &= ~PMF_ONGROUND;
+ self.moveflags &= ~PMF_ONGROUND;
self.movetype = MOVETYPE_TOSS;
if (self.velocity_z < 10)
@@ -3730,6 +3371,183 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// 1998-09-16 Sliding/not-jumping on monsters/boxes/players
// fix by Maddes/Kryten end
};
+
+ //--------------------------------------------------------------
+ void() player_footstep =
+ {
+ // not moving, no steps
+ if (self.velocity.x == 0 || self.velocity.y == 0)
+ return;
+
+ // no steps when crouching
+ if (self.moveflags & PMF_CROUCHED)
+ return;
+
+ // no steps when on a slick/icy surface
+ if (self.moveflags & PMF_ONSLICK)
+ return;
+
+ // at least 200ms between steps
+ if (self.step_time >= time - 0.2)
+ return;
+
+ // no steps when submerged fully
+ if (self.waterlevel >= WATERLEVEL_EYES)
+ return;
+
+ if (self.speed < PM_WALKSPEED * 0.9)
+ // no footsteps below PM_WALKSPEED * 0.9
+ return;
+
+ if (self.speed < PM_MAXSPEED * 0.9)
+ if (self.frame != $rockrun2 && self.frame != $axrun2)
+ // half the footsteps when walking
+ return;
+
+ local sound_info_t snd = snd_empty;
+
+ if (self.waterlevel == WATERLEVEL_FEET)
+ {
+ // the water foot
+ self.cnt = rint (random() * 3);
+
+ switch (self.cnt)
+ {
+ case 0: snd = snd_player_stepwater_01; break;
+ case 1: snd = snd_player_stepwater_02; break;
+ case 2: snd = snd_player_stepwater_03; break;
+ case 3: snd = snd_player_stepwater_04; break;
+ }
+ }
+ else if (self.waterlevel == WATERLEVEL_WAIST)
+ {
+ // the deep water foot
+ if (self.frame != $rockrun2 && self.frame != $axrun2)
+ return;
+
+ if (self.cnt > 3)
+ self.cnt = 0;
+
+ switch (self.cnt)
+ {
+ case 0: snd = snd_player_wadewater_01; break;
+ case 1: snd = snd_player_wadewater_01; break;
+ }
+ }
+ else
+ {
+ // call world_surface_type (which then calls out
+ // to compatibility modules) to get a surface type
+ // under the player -- CEV
+ switch (world_surface_type([0, 0, self.mins_z]))
+ {
+ case SURFACE_DIRT:
+ if (self.cnt > 4)
+ self.cnt = 0;
+ if (self.cnt == 0)
+ snd = snd_player_stepdirt_01;
+ else if (self.cnt == 1)
+ snd = snd_player_stepdirt_02;
+ else if (self.cnt == 2)
+ snd = snd_player_stepdirt_03;
+ else if (self.cnt == 3)
+ snd = snd_player_stepdirt_04;
+ else if (self.cnt == 4)
+ snd = snd_player_stepdirt_05;
+ break;
+ case SURFACE_METAL:
+ self.cnt = rint (random() * 8);
+ if (self.cnt == 0)
+ snd = snd_player_stepmetal_01;
+ else if (self.cnt == 1)
+ snd = snd_player_stepmetal_02;
+ else if (self.cnt == 2)
+ snd = snd_player_stepmetal_03;
+ else if (self.cnt == 3)
+ snd = snd_player_stepmetal_04;
+ else if (self.cnt == 4)
+ snd = snd_player_stepmetal_05;
+ else if (self.cnt == 5)
+ snd = snd_player_stepmetal_06;
+ else if (self.cnt == 6)
+ snd = snd_player_stepmetal_07;
+ else if (self.cnt == 7)
+ snd = snd_player_stepmetal_08;
+ else if (self.cnt == 8)
+ snd = snd_player_stepmetal_09;
+ break;
+ case SURFACE_WOOD:
+ if (self.cnt > 3)
+ self.cnt = 0;
+ if (self.cnt == 0)
+ snd = snd_player_stepwood_01;
+ else if (self.cnt == 1)
+ snd = snd_player_stepwood_02;
+ else if (self.cnt == 2)
+ snd = snd_player_stepwood_03;
+ else if (self.cnt == 3)
+ snd = snd_player_stepwood_04;
+ break;
+ default:
+ // default is SURFACE_STONE -- CEV
+ if (self.cnt > 5)
+ self.cnt = 0;
+ if (self.cnt == 0)
+ snd = snd_player_stepstone_01;
+ else if (self.cnt == 1)
+ snd = snd_player_stepstone_02;
+ else if (self.cnt == 2)
+ snd = snd_player_stepstone_03;
+ else if (self.cnt == 3)
+ snd = snd_player_stepstone_04;
+ else if (self.cnt == 4)
+ snd = snd_player_stepstone_05;
+ else if (self.cnt == 5)
+ snd = snd_player_stepstone_06;
+ }
+ }
+
+ if (snd.wav != snd_empty.wav)
+ player_sound (snd, FALSE);
+
+ self.cnt++;
+ self.step_time = time;
+
+ if (self.stateflags & STATE_LEFTY)
+ self.stateflags &= ~STATE_LEFTY;
+ else
+ self.stateflags |= STATE_LEFTY;
+ };
+
+ //--------------------------------------------------------------
+ // shim around sound() suitable for use in CSQC and SSQC -- CEV
+ //--------------------------------------------------------------
+ void(sound_info_t snd, float testcmd) player_sound =
+ {
+ #if defined(CSQC)
+ if (testcmd)
+ {
+ if (pmovecommandframe > pmovelatestframe)
+ {
+ if (pmovecommandframe == clientcommandframe - 1)
+ {
+ /*
+ dprint (sprintf("player_sound: "
+ "wav %s, itl %g\n",
+ snd.wav, input_timelength));
+ */
+ SOUND (view_entity, snd)
+ }
+ }
+ }
+ else
+ {
+ SOUND (view_entity, snd)
+ }
+ #elif defined(SSQC)
+ SOUND (self, snd)
+ #endif
+ };
#endif
//==============================================================
@@ -3845,14 +3663,14 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
self.ammo_cells = parm7;
self.weapon = parm8;
self.armortype = parm9 * 0.01;
- self.inventory1 = parm11;
- self.inventory2 = parm12;
- self.inventory3 = parm13;
- self.inventory4 = parm14;
- self.inventory5 = parm15;
- self.inventory6 = parm16;
- self.inventory7 = parm17;
- self.inventory8 = parm18;
+ self.item[0] = parm11;
+ self.item[1] = parm12;
+ self.item[2] = parm13;
+ self.item[3] = parm14;
+ self.item[4] = parm15;
+ self.item[5] = parm16;
+ self.item[6] = parm17;
+ self.item[7] = parm18;
if (self.SendEntity)
self.SendFlags = 0xffffff;
@@ -3920,13 +3738,20 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
e.classname = "player";
e.customphysics = sub_null;
- e.drawmask = DRAWMASK_NORMAL;
+ e.drawmask = DRAWMASK_PLAYER;
e.predraw = player_predraw;
e.view_ofs = PM_STAND_VIEWOFS;
e.velocity = '0 0 0';
+ e.dimension_hit = 1;
+ e.dimension_solid = 1;
+ e.stateflags = STATE_PUSHABLE | STATE_TELEPORTABLE;
+
+ // TODO CEV
+ if (e.entnum == player_localentnum)
+ e.effects |= EF_NOSHADOW;
setmodelindex (e, e.modelindex);
- if (e.pm_flags & PMF_CROUCHED)
+ if (e.moveflags & PMF_CROUCHED)
setsize (e, PM_CROUCH_MIN, PM_CROUCH_MAX);
else
setsize (e, PM_STAND_MIN, PM_STAND_MAX);
@@ -3939,6 +3764,7 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
#ifdef SSQC
e.classname = "player";
e.flags = FL_CLIENT;
+ e.stateflags = STATE_PUSHABLE | STATE_TELEPORTABLE;
e.effects = 0;
e.gravity = 0;
e.wantedgravity = 0;
@@ -3960,18 +3786,21 @@ const float CORPSEFRAME_PLAYER_6 = $deathe9;
// Setup cutscene stuff. Legacy code from Zerstorer.
// -- dumptruck_ds
+ // TODO CEV
+ /*
e.script_count = 2;
e.script_delay = 1;
e.script_time = 0;
+ */
player_init_level_parms ();
e.attack_finished = time;
e.th_pain = player_pain;
- e.destroy = player_destroy;
+ e.th_destroy = player_destroy;
e.contentstransition = base_monster_contentstransition;
e.SendEntity = player_netsend;
- e.deadflag = DEAD_NO;
+ e.deadflag = DF_NO;
// pausetime is set by teleporters to keep the player
// from moving for a while
e.pausetime = 0;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/shalrath.qc
diff --git a/qc/monsters/shalrath.qc b/qc/monsters/shalrath.qc
index 345ca76..e9690b2 100644
--- a/qc/monsters/shalrath.qc
+++ b/qc/monsters/shalrath.qc
@@ -103,13 +103,6 @@ Vore.
Default health = 400
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound (VORE SNARL)"
-snd_idle(string) : "Path to custom idle sound"
-snd_misc(string) : "Path to custom attack2 sound (VOREBALL FIRE)"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
mdl_proj(string) : "Path to custom projectile model"
@@ -150,9 +143,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
homing(float) : "Amount that the projectile should home in target. 1 is default, 0 is none."
*/
@@ -182,8 +172,7 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
//--------------------------------------------------------------
void() monster_shalrath_sightsound =
{
- sound (self, CHAN_VOICE, "shalrath/sight.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shalrath_sight)
};
//--------------------------------------------------------------
@@ -206,8 +195,9 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
void() shal_walk1 = [$walk2, shal_walk2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "shalrath/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_shalrath_idle)
+ }
ai_walk (6);
F ()
};
@@ -229,8 +219,9 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
void() shal_run1 = [$walk2, shal_run2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "shalrath/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_shalrath_idle)
+ }
ai_run (6);
F ()
};
@@ -251,8 +242,7 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
//--------------------------------------------------------------
void() shal_atk1 = [$attack1, shal_atk2]
{
- sound (self, CHAN_VOICE, "shalrath/attack.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shalrath_attack_01)
ai_face ();
F ()
};
@@ -281,8 +271,7 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
//--------------------------------------------------------------
void() shal_tur_atk1 = [$attack1, shal_tur_atk2]
{
- sound (self, CHAN_VOICE, "shalrath/attack.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shalrath_attack_01)
ai_face ();
F ()
};
@@ -376,8 +365,7 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
return;
// CHAN_AUTO was voice - dumptruck_ds
- sound (self, CHAN_AUTO, "shalrath/pain.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shalrath_pain)
self.pain_finished = time + 3;
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
@@ -391,31 +379,30 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
//--------------------------------------------------------------
void(vector dir) monster_shalrath_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -90)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
-
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_shalrath_init)
-
- base_entity_remove (self);
- return;
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_shalrath_death;
}
- // insert death sounds here
- sound (self, CHAN_VOICE, "shalrath/death.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd)
self.solid = SOLID_NOT;
- base_item_drop_stuff (self);
- shal_death1 ();
+ self.SendFlags |= NETFLAG_BASE_ENTITY_SOLID;
+ base_monster_item_dropitems (dir);
+
+ if (self.deadflag & DF_GIBBED)
+ base_entity_remove (self);
+ else
+ shal_death1 ();
};
//==============================================================
@@ -460,29 +447,33 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
precache_model2 ("progs/shalrath.mdl");
precache_model2 ("progs/h_shal.mdl");
precache_model2 ("progs/v_spike.mdl");
- precache_sound2 ("shalrath/attack.wav");
- precache_sound2 ("shalrath/attack2.wav");
- precache_sound2 ("shalrath/death.wav");
- precache_sound2 ("shalrath/idle.wav");
- precache_sound2 ("shalrath/pain.wav");
- precache_sound2 ("shalrath/sight.wav");
+
+ precache_sound2 (snd_shalrath_attack_01.wav);
+ precache_sound2 (snd_shalrath_attack_02.wav);
+ precache_sound2 (snd_shalrath_death.wav);
+ precache_sound2 (snd_shalrath_idle.wav);
+ precache_sound2 (snd_shalrath_pain.wav);
+ precache_sound2 (snd_shalrath_sight.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_SHALRATH;
+
// set up model and size for later -- CEV
e.mdl = "progs/shalrath.mdl";
- e.destroy = monster_shalrath_destroy;
+ e.th_destroy = monster_shalrath_destroy;
if (!e.health)
// thanks RennyC -- dumptruck_ds
e.health = SHALRATH_HEALTH;
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
if (!e.homing)
// default to normal
e.homing = 1;
@@ -501,7 +492,7 @@ homing(float) : "Amount that the projectile should home in target. 1 is default,
e.th_turret = shal_tur_atk1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_shalrath_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/shambler.qc
diff --git a/qc/monsters/shambler.qc b/qc/monsters/shambler.qc
index 541ca8a..3ff739e 100644
--- a/qc/monsters/shambler.qc
+++ b/qc/monsters/shambler.qc
@@ -205,16 +205,6 @@ Shambler.
Default health = 600
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound (GRUNT)"
-snd_hit(string) : "Path to custom hit sound (FLESH TEARING)"
-snd_idle(string) : "Path to custom idle sound"
-snd_misc(string) : "Path to custom sound (GRUNT 2)"
-snd_misc1(string) : "Path to custom sound (LIGHTNING ZAP)"
-snd_misc2(string) : "Path to custom sound (LIGHTNING BOOM)"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
skin_head(float) : "Skin index of custom head model"
@@ -253,9 +243,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -298,8 +285,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_shambler_sightsound =
{
- sound (self, CHAN_VOICE, "shambler/ssight.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_sight)
};
//--------------------------------------------------------------
@@ -397,8 +383,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
ldmg = (random() + random() + random()) * 20;
t_damage2 (self.enemy, self, self, ldmg);
- sound (self, CHAN_VOICE, "shambler/smack.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_smack)
if (side)
{
@@ -447,7 +432,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_shambler_attack_lavaball =
{
- sound (self, CHAN_AUTO, "boss1/throw.wav", VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_boss_throw)
// custom lavaball speed -- CEV
base_monster_fire_lavaball (
@@ -529,8 +514,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_walk (7);
if (random() > 0.8)
- sound (self, CHAN_VOICE, "shambler/sidle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_shambler_idle)
+ }
F ()
};
@@ -546,8 +532,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
ai_run (20);
if (random() > 0.8)
- sound (self, CHAN_VOICE, "shambler/sidle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_shambler_idle)
+ }
F ()
};
@@ -556,8 +543,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() sham_smash1 = [$smash1, sham_smash2]
{
- sound (self, CHAN_VOICE, "shambler/melee1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_melee_01)
ai_charge (2);
F ()
};
@@ -587,8 +573,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
ldmg = (random() + random() + random()) * 40;
t_damage2 (self.enemy, self, self, ldmg);
- sound (self, CHAN_VOICE, "shambler/smack.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_smack)
spawn_meatspray (self.origin + v_forward * 16,
crandom() * 100 * v_right);
@@ -618,8 +603,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() sham_proj10 = [$smash10, sham_proj11]
{
monster_shambler_attack_lavaball ();
- sound (self, CHAN_VOICE, "shambler/melee1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_melee_01)
ai_face ();
F ()
};
@@ -641,8 +625,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() sham_tur_proj10 = [$smash10, sham_tur_proj11]
{
monster_shambler_attack_lavaball ();
- sound (self, CHAN_VOICE, "shambler/melee1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_melee_01)
ai_face();
F ()
};
@@ -662,8 +645,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() sham_swingl1 = [$swingl1, sham_swingl2]
{
- sound (self, CHAN_VOICE, "shambler/melee2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_melee_02)
ai_charge (5);
F ()
};
@@ -692,8 +674,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() sham_swingr1 = [$swingr1, sham_swingr2]
{
- sound (self, CHAN_VOICE, "shambler/melee1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_melee_01)
ai_charge (1);
F ()
};
@@ -724,8 +705,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() sham_magic1 = [$magic1, sham_magic2]
{
ai_face ();
- sound (self, CHAN_WEAPON, "shambler/sattck1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_attack)
F ()
};
void() sham_magic2 = [$magic2, sham_magic3] { ai_face (); F () };
@@ -754,8 +734,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
remove (self.trigger_field);
self.trigger_field = world;
monster_shambler_attack_lightning ();
- sound (self, CHAN_WEAPON, "shambler/sboom.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_boom)
F ()
};
// TODO CEV why are frames $magic8 and $magic9 not used?
@@ -787,8 +766,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() sham_tur_magic1 = [$magic1, sham_tur_magic2]
{
ai_face ();
- sound (self, CHAN_WEAPON, "shambler/sattck1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_attack)
F ()
};
void() sham_tur_magic2 = [$magic2, sham_tur_magic3] { ai_face (); F ()};
@@ -820,8 +798,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
remove (self.trigger_field);
self.trigger_field = world;
monster_shambler_attack_lightning ();
- sound (self, CHAN_WEAPON, "shambler/sboom.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_boom)
F ()
};
// TODO CEV again why are $magic7 and $magic8 not used?
@@ -941,8 +918,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(entity attacker, float damage) monster_shambler_pain =
{
- sound (self, CHAN_VOICE, "shambler/shurt2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_shambler_pain)
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
return;
@@ -974,30 +950,28 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_shambler_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -60)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_shambler_death;
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_shambler_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
base_entity_remove (self);
- return;
- }
-
- // regular death
- sound (self, CHAN_VOICE, "shambler/sdeath.wav",
- VOL_HIGH, ATTN_NORM);
- base_item_drop_stuff (self);
- sham_death1 ();
+ else
+ sham_death1 ();
};
//==============================================================
@@ -1045,22 +1019,28 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
precache_model ("progs/bolt.mdl");
precache_model ("progs/lavaball.mdl");
- precache_sound ("shambler/sattck1.wav");
- precache_sound ("shambler/sboom.wav");
- precache_sound ("shambler/sdeath.wav");
- precache_sound ("shambler/shurt2.wav");
- precache_sound ("shambler/sidle.wav");
- precache_sound ("shambler/ssight.wav");
- precache_sound ("shambler/melee1.wav");
- precache_sound ("shambler/melee2.wav");
- precache_sound ("shambler/smack.wav");
+ precache_sound (snd_shambler_attack.wav);
+ precache_sound (snd_shambler_boom.wav);
+ precache_sound (snd_shambler_death.wav);
+ precache_sound (snd_shambler_pain.wav);
+ precache_sound (snd_shambler_idle.wav);
+ precache_sound (snd_shambler_sight.wav);
+ precache_sound (snd_shambler_melee_01.wav);
+ precache_sound (snd_shambler_melee_02.wav);
+ precache_sound (snd_shambler_smack.wav);
// jaycie erysdren 2021-09-14
- precache_sound ("boss1/throw.wav");
+ precache_sound (snd_boss_throw.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_SHAMBLER;
+
// set up model and size for later -- CEV
e.mdl = "progs/shambler.mdl";
@@ -1068,12 +1048,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// thanks RennyC -- dumptruck_ds
e.health = SHAMBLER_HEALTH;
- if (e.proj_speed_mod <= 0)
- e.proj_speed_mod = 1;
-
e.checkattack = monster_shambler_checkattack;
e.sightsound = monster_shambler_sightsound;
- e.destroy = monster_shambler_destroy;
+ e.th_destroy = monster_shambler_destroy;
e.th_stand = sham_stand1;
e.th_walk = sham_walk1;
@@ -1095,7 +1072,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_turret = sham_tur_magic1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_shambler_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/soldier.qc
diff --git a/qc/monsters/soldier.qc b/qc/monsters/soldier.qc
index 87ab86f..5b2f183 100644
--- a/qc/monsters/soldier.qc
+++ b/qc/monsters/soldier.qc
@@ -188,9 +188,7 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
+
*/
// class monster_army: base_monster
// {
@@ -241,8 +239,15 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// self.th_turret ();
self.attack_state = AS_MISSILE;
sub_attackfinished (1 + random());
+
if (random() < 0.3)
- self.lefty = !self.lefty;
+ {
+ if (self.stateflags & STATE_LEFTY)
+ self.stateflags &= ~STATE_LEFTY;
+ else
+ self.stateflags |= STATE_LEFTY;
+ }
+
return TRUE;
}
@@ -290,8 +295,14 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
{
self.th_missile ();
sub_attackfinished (1 + random());
+
if (random() < 0.3)
- self.lefty = !self.lefty;
+ {
+ if (self.stateflags & STATE_LEFTY)
+ self.stateflags &= ~STATE_LEFTY;
+ else
+ self.stateflags |= STATE_LEFTY;
+ }
return TRUE;
}
@@ -302,8 +313,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_army_sightsound =
{
- sound (self, CHAN_VOICE, "soldier/sight1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_army_sight)
};
//--------------------------------------------------------------
@@ -332,7 +342,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
(v_forward * 30 + v_right * 5 + '0 0 16');
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
base_monster_fire_grenade (
- org1, 40, 40, self.attack_elevation);
+ org1, 40, 40, self.t_height);
else
base_monster_fire_grenade (org1, 40, 40, 0);
}
@@ -350,8 +360,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
// Nailgun; MonFireSpike -- used for Grunts
ai_face ();
- sound (self, CHAN_WEAPON, "weapons/rocket1i.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_nailgun)
self.effects = self.effects | EF_MUZZLEFLASH;
if (self.style == 5)
@@ -374,8 +383,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
ai_face ();
self.effects |= EF_MUZZLEFLASH;
- sound (self, CHAN_WEAPON, "soldier/sattck1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_army_attack)
// fire somewhat behind the player, so a dodging player
// is harder to hit
@@ -396,13 +404,12 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
local float r = random ();
+ // turret checks moved here to play pain sounds correctly
+ // -- dumptruck_ds
if (r < 0.2)
{
- // turret checks moved here to play pain sounds
- // correctly -- dumptruck_ds
self.pain_finished = time + 0.6;
- sound (self, CHAN_VOICE, "soldier/pain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_army_pain_01)
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
return;
else
@@ -411,8 +418,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
else if (r < 0.6)
{
self.pain_finished = time + 1.1;
- sound (self, CHAN_VOICE, "soldier/pain2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_army_pain_02)
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
return;
else
@@ -421,8 +427,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
else
{
self.pain_finished = time + 1.1;
- sound (self, CHAN_VOICE, "soldier/pain2.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_army_pain_02)
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
return;
else
@@ -433,33 +438,48 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_army_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -35)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_army_death;
+
+ // style ammotype check -- dumptruck_ds
+ switch (self.style)
+ {
+ case 0:
+ self.ammo_shells = 5; break;
+ case 1: case 2:
+ self.ammo_rockets = 2; break;
+ case 3:
+ self.ammo_cells = 5; break;
+ case 4: case 5:
+ self.ammo_nails = 5; break;
+ }
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_army_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
+ {
base_entity_remove (self);
- return;
}
-
- // regular death
- sound (self, CHAN_VOICE, "soldier/death1.wav",
- VOL_HIGH, ATTN_NORM);
- base_item_drop_stuff (self);
- if (random() < 0.5)
- army_die1 ();
else
- army_cdie1 ();
+ {
+ if (random() < 0.5)
+ army_die1 ();
+ else
+ army_cdie1 ();
+ }
};
//--------------------------------------------------------------
@@ -489,8 +509,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() army_walk1 = [$prowl_1, army_walk2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "soldier/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_army_idle)
+ }
ai_walk (1);
F ()
};
@@ -524,8 +545,9 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() army_run1 = [$run1, army_run2]
{
if (random() < 0.2)
- sound (self, CHAN_VOICE, "soldier/idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_army_idle)
+ }
ai_run (11);
F ()
};
@@ -587,7 +609,8 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() army_tur_atk2 = [$shoot2, army_tur_atk3]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ // was.attack_elevation -- CEV
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -595,16 +618,16 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() army_tur_atk3 = [$shoot3, army_tur_atk4]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() army_tur_atk4 = [$shoot4, army_tur_atk5]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, GRENADE_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, GRENADE_SPEED,
self.origin, self.enemy.origin);
F ()
};
@@ -704,21 +727,6 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() army_die3 = [$death3, army_die4]
{
self.solid = SOLID_NOT;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 1)
- self.ammo_rockets = 2;
- if (self.style == 2)
- self.ammo_rockets = 2;
- if (self.style == 3)
- self.ammo_cells = 5;
- if (self.style == 4 || self.style == 5)
- self.ammo_nails = 5;
- else if (self.style == 0)
- self.ammo_shells = 5;
-
- if (!self.keep_ammo)
- item_backpack_drop (self);
F ()
};
void() army_die4 = [$death4, army_die5] { F () };
@@ -750,22 +758,6 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
void() army_cdie3 = [$deathc3, army_cdie4]
{
self.solid = SOLID_NOT;
-
- // style ammotype check -- dumptruck_ds
- if (self.style == 1)
- self.ammo_rockets = 2;
- if (self.style == 2)
- self.ammo_rockets = 2;
- if (self.style == 3)
- self.ammo_cells = 5;
- if (self.style == 4 || self.style == 5)
- self.ammo_nails = 5;
- else if (self.style == 0)
- self.ammo_shells = 5;
-
- if (!self.keep_ammo)
- item_backpack_drop (self);
-
ai_back (4);
F ()
};
@@ -846,36 +838,41 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
- precache_sound ("soldier/death1.wav");
- precache_sound ("soldier/idle.wav");
- precache_sound ("soldier/pain1.wav");
- precache_sound ("soldier/pain2.wav");
- precache_sound ("soldier/sattck1.wav");
- precache_sound ("soldier/sight1.wav");
+ precache_sound (snd_army_death.wav);
+ precache_sound (snd_army_idle.wav);
+ precache_sound (snd_army_pain_01.wav);
+ precache_sound (snd_army_pain_02.wav);
+ precache_sound (snd_army_attack.wav);
+ precache_sound (snd_army_sight.wav);
// used if style == 3
- precache_sound2 ("enforcer/enfire.wav");
+ precache_sound2 (snd_enforcer_fire.wav);
// used if style == 3
- precache_sound2 ("enforcer/enfstop.wav");
-
+ precache_sound2 (snd_enforcer_fire_hit.wav);
// gib death
- precache_sound ("player/udeath.wav");
+ precache_sound (snd_player_udeath.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_ARMY;
+
+ // add backpack -- CEV
+ base_monster_item_add (e, ITEM_SEQ_BACKPACK);
+
// set up model and size for later -- CEV
e.mdl = "progs/soldier.mdl";
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
if (!e.health)
// thanks RennyC -- dumptruck_ds
e.health = ARMY_HEALTH;
e.checkattack = monster_army_checkattack;
- e.destroy = monster_army_destroy;
+ e.th_destroy = monster_army_destroy;
e.sightsound = monster_army_sightsound;
e.th_stand = army_stand1;
@@ -888,7 +885,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_turret = army_tur_atk1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_army_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/wizard.qc
diff --git a/qc/monsters/wizard.qc b/qc/monsters/wizard.qc
index b209fab..953c903 100644
--- a/qc/monsters/wizard.qc
+++ b/qc/monsters/wizard.qc
@@ -107,13 +107,6 @@ Wizard a.k.a. Scrag.
Default health = 80
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_attack(string) : "Path to custom attack sound"
-snd_idle(string) : "Path to custom idle sound"
-snd_misc(string) : "Path to custom sound (IDLE 2)"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
skin_head(float) : "Skin index of custom head model"
@@ -156,9 +149,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
*/
//----------------------------------------------------------------------
@@ -228,8 +218,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_wizard_sightsound =
{
- sound (self, CHAN_VOICE, "wizard/wsight.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_wizard_sight)
};
//--------------------------------------------------------------
@@ -237,9 +226,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void() monster_wizard_attacksound =
{
- // this is a hack to fix Wizard custom attack sounds
- sound (self, CHAN_AUTO, "wizard/wattack.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_wizard_attack)
};
//--------------------------------------------------------------
@@ -253,13 +240,13 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
self.fly_sound = time + 2;
if (wr > 4.5)
- sound (self, CHAN_VOICE,
- "wizard/widle1.wav",
- VOL_HIGH, ATTN_IDLE);
- if (wr < 1.5)
- sound (self, CHAN_VOICE,
- "wizard/widle2.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_wizard_idle_01)
+ }
+ else if (wr < 1.5)
+ {
+ SOUND (self, snd_wizard_idle_02)
+ }
}
};
@@ -470,8 +457,6 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
self.velocity_z = 100 + 100 * random ();
// self.flags = self.flags - (self.flags & FL_ONGROUND);
base_entity_aligntoground (self);
- sound (self, CHAN_VOICE, "wizard/wdeath.wav",
- VOL_HIGH, ATTN_NORM);
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME |
NETFLAG_BASE_ENTITY_ANGLES;
};
@@ -510,8 +495,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(entity attacker, float damage) monster_wizard_pain =
{
- sound (self, CHAN_VOICE, "wizard/wpain.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_wizard_pain)
if (random() * 70 > damage)
// didn't flinch
@@ -525,27 +509,28 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
//--------------------------------------------------------------
void(vector dir) monster_wizard_destroy =
{
+ var sound_info_t snd = snd_empty;
+
+ self.deadflag |= DF_DEAD;
+
// check for gib
if (self.classgroup & CG_CORPSE || self.health < -40)
{
- sound (self, CHAN_VOICE, "player/udeath.wav",
- VOL_HIGH, ATTN_NORM);
-
- if (!(self.classgroup & CG_CORPSE))
- base_item_drop_stuff (self);
+ self.deadflag |= DF_GIBBED;
+ snd = snd_player_udeath;
+ }
+ else
+ {
+ snd = snd_wizard_death;
+ }
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health,
- item_head_wizard_init)
+ SOUND (self, snd)
+ base_monster_item_dropitems (dir);
+ if (self.deadflag & DF_GIBBED)
base_entity_remove (self);
- return;
- }
-
- base_item_drop_stuff (self);
- wiz_death1 ();
+ else
+ wiz_death1 ();
};
//==============================================================
@@ -595,30 +580,33 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
precache_model ("progs/h_wizard.mdl");
precache_model ("progs/w_spike.mdl");
// wizard/hit used by c code
- precache_sound ("wizard/hit.wav");
- precache_sound ("wizard/wattack.wav");
- precache_sound ("wizard/wdeath.wav");
- precache_sound ("wizard/widle1.wav");
- precache_sound ("wizard/widle2.wav");
- precache_sound ("wizard/wpain.wav");
- precache_sound ("wizard/wsight.wav");
-
- precache_model ("progs/gib1.mdl");
+ precache_sound (snd_wizard_hit.wav);
+ precache_sound (snd_wizard_attack.wav);
+ precache_sound (snd_wizard_death.wav);
+ precache_sound (snd_wizard_idle_01.wav);
+ precache_sound (snd_wizard_idle_02.wav);
+ precache_sound (snd_wizard_pain.wav);
+ precache_sound (snd_wizard_sight.wav);
+
+ // precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
- precache_model ("progs/gib3.mdl");
+ // precache_model ("progs/gib3.mdl");
+
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_WIZARD;
// set up model and size for later -- CEV
e.mdl = "progs/wizard.mdl";
- if (!e.proj_speed_mod)
- e.proj_speed_mod = 1;
-
if (!e.health)
// thanks RennyC -- dumptruck_ds
e.health = WIZARD_HEALTH;
e.checkattack = monster_wizard_checkattack;
- e.destroy = monster_wizard_destroy;
+ e.th_destroy = monster_wizard_destroy;
e.sightsound = monster_wizard_sightsound;
e.th_stand = wiz_stand1;
@@ -627,7 +615,7 @@ damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by
e.th_missile = wiz_fast1;
// changed berserk test from field to flag -- CEV
- if (self.spawnflags & SPAWNFLAG_MONSTER_BERSERK)
+ if (self.stateflags & STATE_NOPAIN)
e.th_pain = sub_nullpain;
else
e.th_pain = monster_wizard_pain;
Return to the top of this page or return to the overview of this repo.
Diff qc/monsters/zombie.qc
diff --git a/qc/monsters/zombie.qc b/qc/monsters/zombie.qc
index ba0a17a..af87142 100644
--- a/qc/monsters/zombie.qc
+++ b/qc/monsters/zombie.qc
@@ -18,7 +18,8 @@ typedef enumflags
SPAWNFLAG_MONSTER_ZOMBIE_CRUCIFIED = 1, // animated dead
SPAWNFLAG_MONSTER_ZOMBIE_DEAD_CRUCIFIED = 4, // motionless dead
// SPAWN_DEAD = 4, // from Zer src, for reference
- // SPAWN_DEAD_CRUCIFIED = 8, // from Zer src again
+ // SPAWN_DEAD_CRUCIFIED = 8, // from Zer src again for reference
+ // SPAWNFLAG_MONSTER_TELEWAIT = 8, // teleport-wait enemy
SPAWNFLAG_MONSTER_ZOMBIE_SLEEPING = 16 // Zer default was 2
// SPAWNFLAG_MONSTER_NO_SIGHT_SOUND = 32, // see base_monster.qc -- CEV
// SPAWNFLAG_MONSTER_PASSIVE_UNTIL_ATTACKED = 64,
@@ -32,8 +33,11 @@ typedef enumflags
// SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
// SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
// SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
- // SPAWNFLAG_MONSTER_TURRET = 262144, // see base_monster.qc -- CEV
- // SPAWNFLAG_MONSTER_SILENT = 2097152 // see base_monster.qc -- CEV
+ // SPAWNFLAG_MONSTER_SILENT = 262144, // suppress the teleport-in sound
+ // SPAWNFLAG_MONSTER_TURRET = 524288, // dumptruck_ds
+ // SPAWNFLAG_MONSTER_SPAWNED = 1048576, // MG1 SPAWNED flag
+ // SPAWNFLAG_MONSTER_ANGRY = 2097152, // monster spawns in angry -- CEV
+ // SPAWNFLAG_MONSTER_WAITWALK = 4194304 // MG1 WAITWALK flag
} monster_zombie_spawnflags;
#endif
@@ -209,15 +213,6 @@ Default health = 60
If SPAWN_SLEEPING is used there must be a targetname set. The zombie will stand up when targeted. Crucified motionless zombies are silent and do not animate." //dumptruck_ds
-snd_death(string) : "Path to custom death sound"
-snd_pain(string) : "Path to custom pain sound"
-snd_attack(string) : "Path to custom attack sound (WHOOSH)"
-snd_idle(string) : "Path to custom idle sound (CRUCIFIED ONLY)"
-snd_misc(string) : "Path to custom (IDLE 2) sound"
-snd_sight(string) : "Path to custom sight sound"
-snd_misc2(string) : "Path to custom (PAIN 2) sound"
-snd_misc3(string) : "Path to custom (FALLING) sound"
-
mdl_head(string) : "Path to custom head model"
mdl_body(string) : "Path to custom body model"
mdl_proj(string) : "Path to custom projectile model"
@@ -258,9 +253,6 @@ pain_target(string) : "Fire this target when pain_threshold is reached"
pain_threshold(integer) : "Fire pain_target when health drops below this amount"
sight_trigger(integer) : "1 = Fire target upon seeing the player instead of death"
skin(integer) : "Skin index (default 0) Use this when your custom model has more than one skin to select"
-obit_name(string) : "When used with obit_method, this will set part of the text for a custom obituary. e.g. a Super Soldier! Using the examples here, the obituary would read: Player was eviscerated by a Super Solider!"
-obit_method(string) : "When used with obit_name, will set part of the text for a custom obituary. e.g. eviscerated - If empty, defaults to killed."
-damage_mod(float) : "USE WITH CAUTION! Multiply all damage from this monster by this number (e.g. 4 = Quad damage)"
spawnflags(Flags) =
1 : "Crucified"
@@ -288,8 +280,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() monster_zombie_sightsound =
{
- sound (self, CHAN_VOICE, "zombie/z_idle.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_idle_01)
};
//--------------------------------------------------------------
@@ -346,8 +337,9 @@ spawnflags(Flags) =
void() zom_cruc1 = [$cruc_1, zom_cruc2]
{
if (random() < 0.1)
- sound (self, CHAN_VOICE, "zombie/idle_w2.wav",
- VOL_HIGH, ATTN_STATIC);
+ {
+ SOUND (self, snd_zombie_idle_03)
+ }
F ()
};
void() zom_cruc2 = [$cruc_2, zom_cruc3]
@@ -401,7 +393,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_alt_stand1 = [$stand1, zom_alt_stand2]
{
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
ai_stand ();
F ()
};
@@ -427,7 +419,7 @@ spawnflags(Flags) =
{
self.solid = SOLID_SLIDEBOX;
// so he doesn't fall
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
ai_walk (0);
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME |
NETFLAG_BASE_ENTITY_SOLID;
@@ -453,8 +445,9 @@ spawnflags(Flags) =
{
ai_walk (0);
if (random() < 0.2)
- sound (self, CHAN_VOICE, "zombie/z_idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_zombie_idle_01)
+ }
F ()
};
@@ -496,11 +489,13 @@ spawnflags(Flags) =
{
ai_run (8);
if (random() < 0.2)
- sound (self, CHAN_VOICE, "zombie/z_idle.wav",
- VOL_HIGH, ATTN_IDLE);
- if (random() > 0.8)
- sound (self, CHAN_VOICE, "zombie/z_idle1.wav",
- VOL_HIGH, ATTN_IDLE);
+ {
+ SOUND (self, snd_zombie_idle_01)
+ }
+ else if (random() > 0.8)
+ {
+ SOUND (self, snd_zombie_idle_02)
+ }
F ()
};
@@ -579,7 +574,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_tur_atka1 = [$atta1, zom_tur_atka2]
{
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
ai_face ();
F ()
};
@@ -594,7 +589,8 @@ spawnflags(Flags) =
void() zom_tur_atka10 = [$atta10, zom_tur_atka11]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ // was .attack_elevation -- CEV
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -602,23 +598,23 @@ spawnflags(Flags) =
void() zom_tur_atka11 = [$atta11, zom_tur_atka12]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, ZCHUNK_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() zom_tur_atka12 = [$atta12, zom_tur_atka13]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, ZCHUNK_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() zom_tur_atka13 = [$atta13, zom_alt_seek1]
{
ai_run (0);
- base_monster_fire_zombiechunk ('0 0 0', self.attack_elevation);
+ base_monster_fire_zombiechunk ('0 0 0', self.t_height);
F ()
};
@@ -627,7 +623,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_tur_atkb1 = [$attb1, zom_tur_atkb2]
{
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
ai_face ();
F ()
};
@@ -643,7 +639,7 @@ spawnflags(Flags) =
void() zom_tur_atkb11 = [$attb11, zom_tur_atkb12]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -651,23 +647,23 @@ spawnflags(Flags) =
void() zom_tur_atkb12 = [$attb12, zom_tur_atkb13]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, ZCHUNK_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() zom_tur_atkb13 = [$attb13, zom_tur_atkb14]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, ZCHUNK_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() zom_tur_atkb14 = [$attb13, zom_alt_seek1]
{
ai_run (0);
- base_monster_fire_zombiechunk ('0 0 0', self.attack_elevation);
+ base_monster_fire_zombiechunk ('0 0 0', self.t_height);
F ()
};
@@ -676,7 +672,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_tur_atkc1 = [$attc1, zom_tur_atkc2]
{
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
ai_face ();
F ()
};
@@ -690,7 +686,7 @@ spawnflags(Flags) =
void() zom_tur_atkc9 = [$attc9, zom_tur_atkc10]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
+ self.t_height = preach_iterate_elevation (
OGRE_DEFAULT_ELEVATION, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
@@ -698,23 +694,23 @@ spawnflags(Flags) =
void() zom_tur_atkc10 = [$attc10, zom_tur_atkc11]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, ZCHUNK_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() zom_tur_atkc11 = [$attc11, zom_tur_atkc12]
{
ai_face ();
- self.attack_elevation = preach_iterate_elevation (
- self.attack_elevation, ZCHUNK_SPEED,
+ self.t_height = preach_iterate_elevation (
+ self.t_height, ZCHUNK_SPEED,
self.origin, self.enemy.origin);
F ()
};
void() zom_tur_atkc12 = [$attc12, zom_alt_seek1]
{
ai_run (0);
- base_monster_fire_zombiechunk ('0 0 0', self.attack_elevation);
+ base_monster_fire_zombiechunk ('0 0 0', self.t_height);
F ()
};
@@ -723,7 +719,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_alt_seek1 = [$stand1, zom_alt_seek2]
{
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
ai_run (0);
F ()
};
@@ -751,8 +747,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_paina1 = [$paina1, zom_paina2]
{
- sound (self, CHAN_VOICE, "zombie/z_pain.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_pain_01)
F ()
};
void() zom_paina2 = [$paina2, zom_paina3] { ai_painforward (3); F () };
@@ -772,8 +767,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_painb1 = [$painb1, zom_painb2]
{
- sound (self, CHAN_VOICE, "zombie/z_pain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_pain_02)
F ()
};
void() zom_painb2 = [$painb2, zom_painb3] { ai_pain (2); F () };
@@ -785,8 +779,7 @@ spawnflags(Flags) =
void() zom_painb8 = [$painb8, zom_painb9] { F () };
void() zom_painb9 = [$painb9, zom_painb10]
{
- sound (self, CHAN_BODY, "zombie/z_fall.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_fall)
F ()
};
void() zom_painb10 = [$painb10, zom_painb11] { F () };
@@ -818,8 +811,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_painc1 = [$painc1, zom_painc2]
{
- sound (self, CHAN_VOICE, "zombie/z_pain1.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_pain_02)
F ()
};
void() zom_painc2 = [$painc2, zom_painc3] { F () };
@@ -853,8 +845,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_paind1 = [$paind1, zom_paind2]
{
- sound (self, CHAN_VOICE, "zombie/z_pain.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_pain_01)
F ()
};
void() zom_paind2 = [$paind2, zom_paind3] { F () };
@@ -875,15 +866,8 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() zom_paine1 = [$paine1, zom_paine2]
{
- // Chainsaw will gib zombie
- if (self.axhitme == 2)
- {
- t_damage2 (self, world, world, 80);
- return;
- }
- sound (self, CHAN_VOICE, "zombie/z_pain.wav",
- VOL_HIGH, ATTN_NORM);
- self.health = 60;
+ SOUND (self, snd_zombie_pain_01)
+ self.health = ZOMBIE_HEALTH - 1;
F ()
};
void() zom_paine2 = [$paine2, zom_paine3] { ai_pain (8); F () };
@@ -896,8 +880,7 @@ spawnflags(Flags) =
void() zom_paine9 = [$paine9, zom_paine10] { ai_pain (2); F () };
void() zom_paine10 = [$paine10, zom_paine11]
{
- sound (self, CHAN_BODY, "zombie/z_fall.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_fall)
self.solid = SOLID_NOT;
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME |
NETFLAG_BASE_ENTITY_SOLID;
@@ -905,15 +888,15 @@ spawnflags(Flags) =
void() zom_paine11 = [$paine11, zom_paine12]
{
self.nextthink = self.nextthink + 5;
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
F ()
};
void() zom_paine12 = [$paine12, zom_paine13]
{
// see if ok to stand up
- self.health = 60;
- sound (self, CHAN_VOICE, "zombie/z_idle.wav",
- VOL_HIGH, ATTN_IDLE);
+ self.health = ZOMBIE_HEALTH - 1;
+ SOUND (self, snd_zombie_idle_01)
+
if (!walkmove(0, 0))
{
self.think = zom_paine11;
@@ -923,6 +906,7 @@ spawnflags(Flags) =
{
self.solid = SOLID_SLIDEBOX;
}
+
self.SendFlags |= NETFLAG_BASE_ENTITY_FRAME |
NETFLAG_BASE_ENTITY_SOLID;
};
@@ -987,8 +971,8 @@ spawnflags(Flags) =
if (self.spawnflags & SPAWNFLAG_MONSTER_TURRET)
{
// always reset health
- self.health = 60;
- if (take >= 60)
+ self.health = ZOMBIE_HEALTH - 1;
+ if (take >= ZOMBIE_HEALTH - 1)
{
// work out knockback direction -- CEV
vector dir;
@@ -1006,7 +990,7 @@ spawnflags(Flags) =
local float r;
// always reset health
- self.health = 60;
+ self.health = ZOMBIE_HEALTH - 1;
if (take < 9)
// totally ignore
@@ -1018,7 +1002,7 @@ spawnflags(Flags) =
return;
// go down immediately if a big enough hit
- if ((take >= 25) || (self.axhitme == 2))
+ if (take >= 25)
{
// self.inpain = 2;
self.speed2 = 2;
@@ -1065,16 +1049,11 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void(vector dir) monster_zombie_destroy =
{
- sound (self, CHAN_VOICE, "zombie/z_gib.wav",
- VOL_HIGH, ATTN_NORM);
-
- base_item_drop_stuff (self);
-
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib1_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib2_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_gib3_init)
- BASE_ITEM_GIB_THROW (dir, self.health, item_head_zombie_init)
+ self.deadflag |= DF_DEAD;
+ self.deadflag |= DF_GIBBED;
+ SOUND (self, snd_zombie_gib)
+ base_monster_item_dropitems (dir);
base_entity_remove (self);
};
@@ -1107,7 +1086,7 @@ spawnflags(Flags) =
//--------------------------------------------------------------
void() monster_zombie_decide =
{
- if (self.health == 61)
+ if (self.health == ZOMBIE_HEALTH)
zom_paine12 ();
else
zom_run1 ();
@@ -1182,23 +1161,28 @@ spawnflags(Flags) =
precache_model ("progs/h_zombie.mdl");
precache_model ("progs/zom_gib.mdl");
- precache_sound ("zombie/z_idle.wav");
- precache_sound ("zombie/z_idle1.wav");
- precache_sound ("zombie/z_shot1.wav");
- precache_sound ("zombie/z_gib.wav");
- precache_sound ("zombie/z_pain.wav");
- precache_sound ("zombie/z_pain1.wav");
- precache_sound ("zombie/z_fall.wav");
- precache_sound ("zombie/z_miss.wav");
- precache_sound ("zombie/z_hit.wav");
-
- precache_sound ("zombie/idle_w2.wav");
+ precache_sound (snd_zombie_idle_01.wav);
+ precache_sound (snd_zombie_idle_02.wav);
+ precache_sound (snd_zombie_idle_03.wav);
+ precache_sound (snd_zombie_shot.wav);
+ precache_sound (snd_zombie_gib.wav);
+ precache_sound (snd_zombie_pain_01.wav);
+ precache_sound (snd_zombie_pain_02.wav);
+ precache_sound (snd_zombie_fall.wav);
+ precache_sound (snd_zombie_miss.wav);
+ precache_sound (snd_zombie_hit.wav);
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
- e.destroy = monster_zombie_destroy;
+ // set up gibs -- CEV
+ e.item[BASE_ENTITY_ITEMLEN - 4] = ITEM_SEQ_GIB1;
+ e.item[BASE_ENTITY_ITEMLEN - 3] = ITEM_SEQ_GIB2;
+ e.item[BASE_ENTITY_ITEMLEN - 2] = ITEM_SEQ_GIB3;
+ e.item[BASE_ENTITY_ITEMLEN - 1] = ITEM_SEQ_HEAD_ZOMBIE;
+
+ e.th_destroy = monster_zombie_destroy;
e.health = ZOMBIE_HEALTH;
e.sightsound = monster_zombie_sightsound;
Return to the top of this page or return to the overview of this repo.
Diff qc/obituary.qc
diff --git a/qc/obituary.qc b/qc/obituary.qc
index b8d6326..ae51715 100644
--- a/qc/obituary.qc
+++ b/qc/obituary.qc
@@ -3,15 +3,6 @@
//==============================================================================
//======================================================================
-// fields
-//======================================================================
-
-#ifdef SSQC
-.string obit_name; // dumptruck_ds misc pd additions
-.string obit_method; // dumptruck_ds misc pd additions
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -200,8 +191,7 @@ void(entity targ, entity inflictor, entity attacker) ClientObituary =
}
// killed by a monster?
- // if (attacker.flags & FL_MONSTER)
- if ((attacker.flags & FL_MONSTER) && (attacker.obit_name == ""))
+ if (attacker.flags & FL_MONSTER)
{
if (attacker.classname == "monster_army")
bprint (" was shot by a Grunt\n");
@@ -249,22 +239,6 @@ void(entity targ, entity inflictor, entity attacker) ClientObituary =
return;
}
- // obits for custom monsters -- progs_dump -- dumptruck_ds
- if (attacker.obit_name != "")
- {
- bprint (" was ");
- if !(attacker.obit_method)
- bprint ("killed");
- else
- // e.g. ripped apart
- bprint (attacker.obit_method);
- bprint (" by ");
- // a bad monster
- bprint (attacker.obit_name);
- bprint ("\n");
- return;
- }
-
// tricks and traps
if (attacker.classname == "explo_box" ||
attacker.classname == "play_explosion")
@@ -277,6 +251,7 @@ void(entity targ, entity inflictor, entity attacker) ClientObituary =
bprint (" discovered that lasers are hot\n");
return;
}
+
/* TODO CEV
if ((attacker.solid == SOLID_BSP &&
attacker != world &&
@@ -288,6 +263,7 @@ void(entity targ, entity inflictor, entity attacker) ClientObituary =
return;
}
*/
+
if (attacker.classname == "trap_shooter" ||
attacker.classname == "trap_spikeshooter" ||
attacker.classname == "trap_switched_shooter")
Return to the top of this page or return to the overview of this repo.
Diff qc/pmove.qc
diff --git a/qc/pmove.qc b/qc/pmove.qc
index 081944d..c6c7f9b 100644
--- a/qc/pmove.qc
+++ b/qc/pmove.qc
@@ -3,7 +3,6 @@
//==============================================================================
// TODO CEV: improved player unstick function
-// TODO CEV: varied sounds (different jump sounds)
//======================================================================
// globals
@@ -13,45 +12,28 @@
// the following are all managed by FTEQW -- CEV
float input_buttons; // buttons pressed by the client
// float input_impulse;
-#ifdef CSQC
-float input_clienttime; // not supported? seems to work anyway
-float input_servertime; // SSQC timestamp of CSQC lerp state
-#endif
float input_timelength; // frame / tic time
vector input_angles; // +x = DOWN
vector input_movevalues; // movement requested by client
#endif
//======================================================================
-// fields
-//======================================================================
-
-#if defined(CSQC) || defined(SSQC)
-// note: timers are expensive, require synch between server and client -- CEV
-// .entity groundentity; // already defined in entvars_t
-.vector groundnormal; // ground plane normal; NOT networked
-.float pm_flags; // custom movement flags -- CEV
-.float pm_timer; // crouchslide & jump timer -- CEV
-.void() customphysics;
-#endif
-
-//======================================================================
// pmove constants (could be reworked as cvars, would add overhead) -- CEV
//======================================================================
#if defined(CSQC) || defined(SSQC)
// acceleration & friction
-const float PM_AIRACCEL = 1.0f; // for Q3 strafejumping; 1.0 in Q3
const float PM_AIRACCELBACK = 2.5f; // Air stop speed in Q3? 5.0f? 2.5f?
const float PM_AIRACCELFWD = 1.0f; // 1 feels close to Q3 / CPM
const float PM_AIRACCELSIDE = 70.0f; // (320 / 30) * 6.5625; 106.666 in Q1
const float PM_AIRACCELTURN = 6.5625f; // magic value; see PM_AIRCONTROL -- CEV
+const float PM_EDGEFRICTION = 2.0f; // ???
const float PM_GROUNDACCEL = 10.0f; // 10 is Q1 & VQ3, 15 is CPM
const float PM_GROUNDFRICTION = 6.0f; // 4 for Q1, 6 for Q3, 8 for (old?) CPM
const float PM_SLICKACCEL = 10.0f; // accel while on ice / slick floor
-const float PM_SLIDEACCELFWD = 1.0f; // crouchslide accel
-const float PM_SLIDEACCELSIDE = 70.0f; // crouchslide accel
-const float PM_SLIDEFRICTION = 0.25f; // crouchslide friction; 1.0?
+const float PM_SLIDEACCELFWD = 10.0f; // crouchslide accel
+const float PM_SLIDEACCELSIDE = 70.0f; // crouchslide accel; 70.0f
+const float PM_SLIDEFRICTION = 0.4f; // crouchslide friction; 6.0 / 15.0
const float PM_SURFACCEL = 1.0f; //
const float PM_SURFACCELSIDE = 106.666f;// (320 / 30) * 10.0
const float PM_WATERACCEL = 10.0f; // water acceleration
@@ -59,12 +41,14 @@ const float PM_WATERFRICTION = 4.0f; // friction in water
// horizontal speeds (mostly)
const float PM_CROUCHSPEED = 80.0f; // ???
+const float PM_CROUCHSCALE = 0.2f; // 400 * 0.2 = 80ups
const float PM_MAXSPEED = 320.0f; // 320 always
const float PM_MAXAIRSPEED = 30.0f; // 30 for Q1 (PM_MAXSPEED / 10.666)
-const float PM_MAXSLIDESPEED = 30.0f; //
-const float PM_MAXWISHSPEED = 380.0f; // 320, 400
+const float PM_MAXBOOSTSPEED = 409.0f; // see PM_MaxCircleGroundSpeed
+const float PM_MAXSLIDESPEED = 320.0f; //
const float PM_STOPSPEED = 100.0f; // used in friction calculations
const float PM_WALKSPEED = 160.0f; // walk speed
+const float PM_WALKSCALE = 0.4f; // 400 * 0.4 = 160ups
const float PM_WATERMAXSPEED = 224.0f; // id1 224; 320 * 0.7
const float PM_WATERSINKSPEED = 60.0f;
@@ -74,9 +58,14 @@ const float PM_CLIMBSPEEDMIN = 45.0f; // min ladder & climbing speed
const float PM_CLIMBSPEEDMAX = 160.0f; // max climbing speed; Rubicon2 160
const float PM_CLIMBACCEL = 45.0f; // affected by CLIMBSCALE
const float PM_JUMPSPEED = 270.0f; // standard jump Z velocity; 90 * 3
-const float PM_DOUBLEJUMPSPEED = 270.0f;// 270 * 1.5 in CPM
+const float PM_DOUBLEJUMPSPEED = 270.0f;// 270 * 1.5 in CPM?
+#if 0
+const float PM_SHORTJUMPSPEED = 180.0f; // 180 = 90 * 2
+const float PM_SHORTJUMPXYSPEED = 400.0f;
+const float PM_SHORTJUMPTHRESH = 340.0f;// shortjump when horiz speed under this
+#endif
const float PM_STAIRJUMPSPEED = 360.0f; // 360 = 90 * 4
-const float PM_TELEJUMPSPEED = 360.0f; // same as STAIRJUMPSPEED
+const float PM_TELEJUMPSPEED = 405.0f; // 360; 405? (270 * 1.5) in CPM
const float PM_WALLJUMPFORCE = 90.0f; // push away from wall
const float PM_WALLJUMPGROUND = 32.0f; // distance from ground to allow WJ
const float PM_WALLJUMPLIMIT = -180.f; // no walljump if Z vel below this
@@ -93,7 +82,7 @@ const float PM_WALLCLIP_WINDOW = 0.15f; // 0.4 - 0.25
const float PM_BTN_ATTACK = INPUT_BUTTON0;
const float PM_BTN_DOWN = INPUT_BUTTON8;// crouch key
const float PM_BTN_JUMP = INPUT_BUTTON2;// jump key
-const float PM_BTN_GRAB = INPUT_BUTTON6;// grab key
+const float PM_BTN_GRAB = INPUT_BUTTON4;// grab key
const float PM_BTN_WALK = INPUT_BUTTON7;// walk key
// misc
@@ -107,11 +96,9 @@ const float PM_PLANE_FLAT = 1.0f; // flat horizontal
const float PM_PLANE_GROUND = 0.7f; // above this is ONGROUND
const float PM_PLANE_VERTICAL = 0.0f; // straight up vertical
const vector PM_TELEDROP = '0 0 -64'; // drop teleporter exit to floor if
-#if defined(SSQC) // floor is within this distance
+ // floor is within this distance
const float PM_MOVEFLAGS = MOVE_NORMAL;
-#elif defined(CSQC)
-const float PM_MOVEFLAGS = MOVE_NORMAL; // is MOVE_LAGGED supported in CSQC?
-#endif
+#define PM_PHYSFPS 1/125
// water level
const float WATERLEVEL_NONE = 0;
@@ -158,7 +145,7 @@ typedef enumflags
PMF_UNUSED2,
PMF_UNUSED3,
PMF_UNUSED4 // 23rd flag
-} entity_pm_flags;
+} player_movement_flags;
// remove these flags when landing on ground -- CEV
const float PM_ONGROUNDFLAGS = PMF_ONSLOPE | PMF_CLIMB | PMF_PUSHED |
@@ -186,7 +173,6 @@ float(float maxspeed, float a, float c, float t) PM_MaxCircleGroundSpeed;
#if defined(CSQC) || defined (SSQC)
// PM_TRUNCATEVECTORTOEIGTH(vec)
-// PM_CHECKVELOCITY(vel)
float() PM_Nudge;
// PM_SETONGROUND_NOGROUND()
// PM_SETONGROUND_TRACEGROUND()
@@ -194,29 +180,28 @@ float() PM_Nudge;
// PM_SETONGROUND()
// PM_DANCEMOVE_ADDTOUCH(ent)
// PM_DANCEMOVE_DOTOUCH(ent)
-// PM_DANCEMOVE_STEP_DOWN(start_vel, end, j, k, FL)
-// PM_DANCEMOVE_STEP_FORWARD(start_vel, end, j, k, FL)
-// PM_DANCEMOVE_STEP_UP(start_vel, end, j, k, FL)
+// PM_DANCEMOVE_STEP_DOWN(startvel, end, j, k, FL)
+// PM_DANCEMOVE_STEP_FORWARD(startvel, end, j, k, FL)
+// PM_DANCEMOVE_STEP_UP(startvel, end, j, k, FL)
// PM_DANCEMOVE_AXIALNUDGE(plane)
// PM_DANCEMOVE_CLIP_INNER(v, p_a, p_b, p_c, k)
// PM_DANCEMOVE_CLIP(v, p_i, p_j, p_k, k)
// PM_DANCEMOVE_GROUNDIMPACT()
-// PM_DANCEMOVE(end, start_vel, i, j, k)
+void(float movetime) PM_DanceMove;
void() PM_CrouchStart;
void() PM_CrouchStop;
void() PM_CrouchSlideStart;
void() PM_CrouchSlideStop;
-void() PM_Jump;
+// PM_JUMP()
void() PM_WallClimb;
void() PM_WallJump;
void() PM_WallJumpCheck;
// PM_FRICTION(speed1, temp, friction, move_time)
// PM_ACCELERATE(dir, wish, speed1, newspeed, accel, move_time)
-// PM_AIRCONTROL(dir, pushdir, newspeed, move_time)
+// PM_AIRCONTROL(dir, pushdir, newspeed, turn, move_time)
// PM_MOVE_MOVETYPES_CATEGORIZEPOSITION()
// PM_MOVE_MOVETYPES_SETNOCLIPFLAGS()
// PM_MOVE_MOVETYPES_NOCLIPACCELERATE(scale, move_time)
-// PM_MOVE_MOVETYPES_SWIMPREMOVE_SSQC()
// PM_MOVE_MOVETYPES_SWIMPREMOVE(start, end, move_time)
// PM_MOVE_MOVETYPES_SWIMACCELERATE(move_time)
// PM_MOVE_MOVETYPES_WALKPREMOVE()
@@ -224,6 +209,7 @@ void() PM_WallJumpCheck;
// PM_MOVE_MOVETYPES_MANAGETIMER(adjust_time)
// PM_MOVE_PRE()
// PM_MOVE_MOVETYPES()
+// PM_MOVE_POST_FALLDAMAGE()
// PM_MOVE_POST()
#endif
@@ -236,7 +222,7 @@ void() PM_WallJumpCheck;
vector(vector vel, vector normal, float overbounce) PM_ClipVelocity =
{
// the same implementation used in Quake 3 -- CEV
- local float backoff = vel * normal;
+ var float backoff = vel * normal;
if (backoff < 0)
backoff *= overbounce;
@@ -280,16 +266,6 @@ float(float maxspeed, float a, float f, float t) PM_MaxCircleGroundSpeed =
/* } */
//----------------------------------------------------------------------
-// PM_CHECKVELOCITY - bound self.velocity to server maximums -- CEV
-//----------------------------------------------------------------------
-#define PM_CHECKVELOCITY(vel) \
-/* { */ \
- vel.x = bound (-PM_MAXVELOCITY, vel.x, PM_MAXVELOCITY); \
- vel.y = bound (-PM_MAXVELOCITY, vel.y, PM_MAXVELOCITY); \
- vel.z = bound (-PM_MAXVELOCITY, vel.z, PM_MAXVELOCITY); \
-/* } */
-
-//----------------------------------------------------------------------
// PM_Nudge
// from the GPL2 CSQCTest code that comes with FTEQW; may be called often
// to nudge player origin due to float/network precision errors -- CEV
@@ -341,9 +317,9 @@ float() PM_Nudge =
self.groundentity = __NULL__; \
self.groundnormal = '0 0 0'; \
self.flags &= ~FL_ONGROUND; \
- self.pm_flags = self.pm_flags - (self.pm_flags & PM_NOGROUNDFLAGS); \
+ self.moveflags = self.moveflags - (self.moveflags & PM_NOGROUNDFLAGS); \
/* don't crouchslide in air -- CEV */ \
- if (self.pm_flags & PMF_CROUCHSLIDE) \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
{ \
/* TODO CEV */ \
PM_CrouchSlideStop (); \
@@ -354,7 +330,7 @@ float() PM_Nudge =
#define PM_SETONGROUND_TRACEGROUND() \
/* { */ \
/* do a trace to check for ground -- CEV */ \
- if (self.pm_flags & PMF_ONMOVINGENT) \
+ if (self.moveflags & PMF_ONMOVINGENT) \
{ \
/* trace further when on a vertically moving ent -- CEV */ \
tracebox (self.origin, self.mins, self.maxs, \
@@ -362,8 +338,9 @@ float() PM_Nudge =
} \
else \
{ \
+ /* '0 0 0.25' works but '0 0 1' seems more reliable -- CEV */ \
tracebox (self.origin, self.mins, self.maxs, \
- self.origin - '0 0 0.25', PM_MOVEFLAGS, self); \
+ self.origin - '0 0 1', PM_MOVEFLAGS, self); \
} \
/* } */
@@ -379,7 +356,7 @@ float() PM_Nudge =
{ \
if (trace_ent.origin - trace_ent.origin_net) \
{ \
- self.pm_flags |= PMF_ONMOVINGENT; \
+ self.moveflags |= PMF_ONMOVINGENT; \
/*
dprint (sprintf("PM_SETONGROUND_ONMOVINGENT: found " \
" %s moving at %v\n", trace_ent.classname, \
@@ -387,9 +364,9 @@ float() PM_Nudge =
*/ \
} \
} \
- else if (self.pm_flags & PMF_ONMOVINGENT) \
+ else if (self.moveflags & PMF_ONMOVINGENT) \
{ \
- self.pm_flags &= ~PMF_ONMOVINGENT; \
+ self.moveflags &= ~PMF_ONMOVINGENT; \
} \
/* } */
#endif
@@ -415,11 +392,11 @@ float() PM_Nudge =
* holding crouch, we aren't already sliding, we're
* not in water, and we're going faster than run
* speed -- CEV */ \
- if (!(self.pm_flags & PMF_ONGROUND)) { \
- if (self.pm_flags & PMF_CROUCH_HELD) { \
- if (!(self.pm_flags & PMF_CROUCHSLIDE)) { \
- if (self.conlevel < WATERLEVEL_WAIST) { \
- if (speedc > PM_MAXSPEED) \
+ if (!(self.moveflags & PMF_ONGROUND)) { \
+ if (self.moveflags & PMF_CROUCH_HELD) { \
+ if (!(self.moveflags & PMF_CROUCHSLIDE)) { \
+ if (self.waterlevel < WATERLEVEL_WAIST) { \
+ if (self.speed > PM_MAXSPEED) \
{ \
PM_CrouchSlideStart (); \
} } } } } \
@@ -427,20 +404,20 @@ float() PM_Nudge =
self.groundentity = trace_ent; \
self.groundnormal = trace_plane_normal; \
/* now manage flags -- CEV */ \
- if (!(self.pm_flags & PMF_SLIDE_STEP)) \
+ if (!(self.moveflags & PMF_SLIDE_STEP)) \
{ \
self.flags |= FL_ONGROUND; \
- self.pm_flags |= PMF_ONGROUND; \
+ self.moveflags |= PMF_ONGROUND; \
} \
if (self.groundnormal.z < PM_PLANE_FLAT) \
- self.pm_flags |= PMF_ONRAMP; \
- else if (self.pm_flags & PMF_ONRAMP) \
- self.pm_flags &= ~PMF_ONRAMP; \
+ self.moveflags |= PMF_ONRAMP; \
+ else if (self.moveflags & PMF_ONRAMP) \
+ self.moveflags &= ~PMF_ONRAMP; \
if (trace_surfaceflagsf & Q3SURFACEFLAG_SLICK) \
/* on a slick/icy surface -- CEV */ \
- self.pm_flags |= PMF_ONSLICK; \
- self.pm_flags = self.pm_flags - \
- (self.pm_flags & PM_ONGROUNDFLAGS); \
+ self.moveflags |= PMF_ONSLICK; \
+ self.moveflags = self.moveflags - \
+ (self.moveflags & PM_ONGROUNDFLAGS); \
} \
else if (trace_plane_normal.z > PM_PLANE_VERTICAL) \
{ \
@@ -450,12 +427,12 @@ float() PM_Nudge =
self.groundnormal = '0 0 0'; \
/* now do flags -- CEV */ \
self.flags &= ~FL_ONGROUND; \
- self.pm_flags |= PMF_ONSLOPE; \
- self.pm_flags = self.pm_flags - \
- (self.pm_flags & PM_ONSLOPEFLAGS); \
- self.pm_timer = 0; \
+ self.moveflags |= PMF_ONSLOPE; \
+ self.moveflags = self.moveflags - \
+ (self.moveflags & PM_ONSLOPEFLAGS); \
+ self.movetimer = 0; \
/* don't crouchslide on a slope -- CEV */ \
- if (self.pm_flags & PMF_CROUCHSLIDE) \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
PM_CrouchSlideStop (); \
} \
else \
@@ -486,18 +463,15 @@ float() PM_Nudge =
//----------------------------------------------------------------------
#define PM_DANCEMOVE_ADDTOUCH(ent) \
/* { */ \
- if (ent) \
+ if (ent && ent.touch) \
{ \
- if (ent.touch) \
+ if (ent != touched_ent3 && \
+ ent != touched_ent2 && \
+ ent != touched_ent1) \
{ \
- if (ent != touched_ent3) { \
- if (ent != touched_ent2) { \
- if (ent != touched_ent1) \
- { \
- touched_ent3 = touched_ent2; \
- touched_ent2 = touched_ent1; \
- touched_ent1 = ent; \
- } } } \
+ touched_ent3 = touched_ent2; \
+ touched_ent2 = touched_ent1; \
+ touched_ent1 = ent; \
} \
} \
/* } */
@@ -505,21 +479,15 @@ float() PM_Nudge =
//----------------------------------------------------------------------
#define PM_DANCEMOVE_DOTOUCH(ent) \
/* { */ \
- if (ent) \
+ if (ent && ent.touch != __NULL__ && ent.touch != sub_null) \
{ \
- if (ent.touch != __NULL__) \
- { \
- if (ent.touch != sub_null) \
- { \
- stemp = self; \
- otemp = other; \
- other = self; \
- self = ent; \
- self.touch (); \
- self = stemp; \
- other = otemp; \
- } \
- } \
+ stemp = self; \
+ otemp = other; \
+ other = self; \
+ self = ent; \
+ self.touch (); \
+ self = stemp; \
+ other = otemp; \
} \
/* } */
@@ -534,7 +502,7 @@ float() PM_Nudge =
/* } */
//----------------------------------------------------------------------
-#define PM_DANCEMOVE_STEP_DOWN(start_vel, end, j, k, FL) \
+#define PM_DANCEMOVE_STEP_DOWN(startvel, end, j, k, FL) \
/* { */ \
/* third: move down; +1 to k is important -- CEV */ \
end = trace_endpos; \
@@ -600,49 +568,29 @@ float() PM_Nudge =
{ \
PM_DANCEMOVE_ADDTOUCH (trace_ent) \
} \
- /* plane2 = plane1 = '0 0 0'; */ \
- if (roof_plane) \
+ if (roof_plane && roof_plane != trace_plane_normal && \
+ roof_plane != plane1 && roof_plane != plane2) \
{ \
- if (roof_plane != trace_plane_normal) \
- { \
- if (roof_plane != plane1) \
- { \
- if (roof_plane != plane2) \
- { \
- plane2 = plane1; \
- plane1 = roof_plane; \
- } \
- } \
- } \
+ plane2 = plane1; \
+ plane1 = roof_plane; \
} \
- if (fwd_plane) \
+ if (fwd_plane && fwd_plane != trace_plane_normal && \
+ fwd_plane != plane1 && fwd_plane != plane2) \
{ \
- if (fwd_plane != trace_plane_normal) \
- { \
- if (fwd_plane != plane1) \
- { \
- if (fwd_plane != plane2) \
- { \
- plane2 = plane1; \
- plane1 = fwd_plane; \
- } \
- } \
- } \
+ plane2 = plane1; \
+ plane1 = fwd_plane; \
} \
- self.pm_flags |= PMF_STEPPED; \
- if (!(self.pm_flags & PMF_ONGROUND)) \
+ self.moveflags |= PMF_STEPPED; \
+ if (!(self.moveflags & PMF_ONGROUND) && startvel.z <= 0) \
{ \
- if (start_vel.z <= 0) \
- { \
- /* for stairjumps -- CEV */ \
- self.pm_flags |= PMF_AIRSTEPPED; \
- } \
+ /* for stairjumps -- CEV */ \
+ self.moveflags |= PMF_AIRSTEPPED; \
} \
} \
/* } */
//----------------------------------------------------------------------
-#define PM_DANCEMOVE_STEP_FORWARD(start_vel, end, j, k, FL) \
+#define PM_DANCEMOVE_STEP_FORWARD(startvel, end, j, k, FL) \
/* { */ \
/* second: move forward */ \
k = trace_endpos.z - self.origin.z; \
@@ -656,31 +604,32 @@ float() PM_Nudge =
/* if we hit the same plane we're trying to step over
* and we made no progress in the move then reject
* the step attempt -- CEV */ \
- if (trace_plane_normal == first_plane) \
+ if (trace_plane_normal == first_plane && \
+ fabs(self.origin.x - trace_endpos.x) < PM_FLMIN && \
+ fabs(self.origin.y - trace_endpos.y) < PM_FLMIN) \
{ \
- if (fabs(self.origin.x - trace_endpos.x) < PM_FLMIN) \
- { \
- if (fabs(self.origin.y - trace_endpos.y) < PM_FLMIN) \
- { \
- /* dprint (sprintf("PM_DANCEMOVE: B\n")); */ \
- goto PM_DanceMove_RejectStep3; \
- } \
- } \
+ /* dprint (sprintf("PM_DANCEMOVE: B\n")); */ \
+ goto PM_DanceMove_RejectStep3; \
} \
- local vector fwd_plane = '0 0 0'; \
- /* local vector save_pos = trace_endpos; */ \
+ var vector fwd_plane = '0 0 0'; \
+ /* var vector save_pos = trace_endpos; */ \
j -= j * trace_fraction; \
if (trace_fraction < 1.0f) \
{ \
PM_DANCEMOVE_ADDTOUCH (trace_ent) \
fwd_plane = trace_plane_normal; \
} \
- PM_DANCEMOVE_STEP_DOWN (start_vel, end, j, k, FL) \
+ PM_DANCEMOVE_STEP_DOWN (startvel, end, j, k, FL) \
/* } */
//----------------------------------------------------------------------
-#define PM_DANCEMOVE_STEP_UP(start_vel, end, j, k, FL) \
+#define PM_DANCEMOVE_STEP_UP(startvel, end, j, k, FL) \
/* { */ \
+ /* store ent and norm if we need to reject the step attempt -- CEV */ \
+ var vector first_plane = trace_plane_normal; \
+ var entity first_ent = trace_ent; \
+ var float first_frac = trace_fraction; \
+ j = time_left; \
/* first: move up */ \
trace_endpos.z += PM_STEPHEIGHT; \
tracebox (self.origin, self.mins, self.maxs, trace_endpos, FL, self); \
@@ -692,13 +641,13 @@ float() PM_Nudge =
trace_endpos - self.origin)); */ \
goto PM_DanceMove_RejectStep3; \
} \
- local vector roof_plane = '0 0 0'; \
+ var vector roof_plane = '0 0 0'; \
if (trace_fraction < 1.0f) \
{ \
PM_DANCEMOVE_ADDTOUCH (trace_ent) \
roof_plane = trace_plane_normal; \
} \
- PM_DANCEMOVE_STEP_FORWARD (start_vel, end, j, k, FL) \
+ PM_DANCEMOVE_STEP_FORWARD (startvel, end, j, k, FL) \
} \
else \
{ \
@@ -725,29 +674,25 @@ float() PM_Nudge =
//----------------------------------------------------------------------
#define PM_DANCEMOVE_CLIP_INNER(v, p_a, p_b, p_c, k) \
/* { */ \
- /* if plane_b is not plane_a and if velocity interacts -- CEV */ \
- if (p_b != p_a) \
+ /* if velocity interacts with plane_b -- CEV */ \
+ k = self.velocity * p_b; \
+ if (k < PM_PLANE_INTERACT) \
{ \
- k = self.velocity * p_b; \
- if (k < PM_PLANE_INTERACT) \
+ /* clip to plane_b -- CEV */ \
+ self.velocity -= p_b * k; \
+ /* test if move goes back into the first plane */ \
+ if (self.velocity * p_a < 0.0f) \
{ \
- /* clip to plane_b -- CEV */ \
- self.velocity -= p_b * k; \
- /* test if move goes back into the first plane */ \
- if (self.velocity * p_a < 0) \
+ /* slide along the crease -- CEV */ \
+ /* ("><" is crossproduct) -- CEV */ \
+ v = p_a >< p_b; \
+ self.velocity = v * (v * self.velocity); \
+ /* check if we interact with a 3rd plane */ \
+ if (self.velocity * p_c < 0) \
{ \
- /* slide along the crease -- CEV */ \
- /* ("><" is crossproduct) -- CEV */ \
- v = p_a >< p_b; \
- v = normalize (v); \
- self.velocity = v * (v * self.velocity); \
- /* check if we interact with a 3rd plane */ \
- if (self.velocity * p_c < 0) \
- { \
- /* stop when 3 planes interact */ \
- self.velocity = '0 0 0'; \
- break; \
- } \
+ /* stop when 3 planes interact */ \
+ self.velocity = '0 0 0'; \
+ break; \
} \
} \
} \
@@ -797,23 +742,15 @@ float() PM_Nudge =
// PM_DANCEMOVE_GROUNDIMPACT
// This macro is meant to be called from PM_DANCEMOVE -- CEV
//----------------------------------------------------------------------
-#ifdef SSQC
#define PM_DANCEMOVE_GROUNDIMPACT() \
/* { */ \
/* impact info (see player_postthink) -- CEV */ \
- if (!(self.pm_flags & PMF_ONGROUND)) { \
+ if (!(self.moveflags & PMF_ONGROUND)) { \
if (self.velocity.z < self.jump_flag) \
{ \
self.jump_flag = self.velocity.z; \
} } \
/* } */
-#endif
-
-#ifdef CSQC
-#define PM_DANCEMOVE_GROUNDIMPACT() \
-{ \
-}
-#endif
//----------------------------------------------------------------------
// PM_DANCEMOVE
@@ -828,153 +765,175 @@ float() PM_Nudge =
// in turn appears to be based on a similar function in the CSQCTest code
// that comes with FTEQW. -- CEV
//----------------------------------------------------------------------
-#define PM_DANCEMOVE(end, start_vel, i, j, k) \
-/* { */ \
- local float grav = 0; \
- if (self.conlevel < WATERLEVEL_WAIST) { \
- if (!(self.pm_flags & PMF_ONLADDER)) { \
- if (!(self.pm_flags & PMF_ONGROUND) || self.pm_flags & PMF_ONRAMP) \
- { \
- if (self.gravity) \
- grav = self.gravity; \
- else \
- grav = 1.0; \
- /* world_gravity is set in worldspawn() -- CEV */ \
- grav *= world_gravity * input_timelength; \
- /* Half now, half later. Apparently affects framerate
- * dependence. -- CEV */ \
- self.velocity.z -= grav * 0.5f; \
- } } } \
- if (self.velocity == '0 0 0') \
- /* we aren't moving so skip to clearing flags -- CEV */ \
- goto PM_DanceMove_ClearFlags2; \
- /* declare and initialize variables -- CEV */ \
- local vector plane1, plane2; \
- local float time_left = input_timelength; \
- local entity stemp, otemp, touched_ent1, touched_ent2, touched_ent3; \
- plane1 = plane2 = '0 0 0'; \
- i = j = k = 0; \
- start_vel = self.velocity; \
- stemp = otemp = touched_ent1 = touched_ent2 = touched_ent3 = __NULL__; \
+void(float move_time) PM_DanceMove =
+{
+ var float grav = 0;
+
+ if (self.waterlevel < WATERLEVEL_WAIST &&
+ !(self.moveflags & PMF_ONLADDER) &&
+ (!(self.moveflags & PMF_ONGROUND) ||
+ self.moveflags & PMF_ONRAMP))
+ {
+ if (self.gravity)
+ grav = self.gravity;
+ else
+ grav = 1.0;
+
+ /* world_gravity is set in worldspawn() -- CEV */
+ grav *= world_gravity * move_time;
+
+ /* Half now, half later. Apparently affects
+ * framerate dependence. -- CEV */
+ self.velocity.z -= grav * 0.5f;
+ }
+
+ if (self.velocity == '0 0 0')
+ /* we aren't moving so skip to clearing flags -- CEV */
+ goto PM_DanceMove_ClearFlags2;
+
+ /* declare and initialize variables -- CEV */
+ var vector end, plane1, plane2, startvel;
+ var float i, j, k;
+ var float time_left = move_time;
+ var entity stemp, otemp, touched_ent1, touched_ent2, touched_ent3;
+
+ plane1 = plane2 = '0 0 0';
+ startvel = self.velocity;
+ stemp = otemp = touched_ent1 = touched_ent2 = touched_ent3 = __NULL__;
+
+ /* slide along the groundplane if neccesary -- CEV */
+ if (self.groundnormal)
+ {
+ k = self.velocity * self.groundnormal;
+ if (k < PM_PLANE_INTERACT)
+ {
+ self.velocity -= self.groundnormal * k;
+ }
+ }
+
/* attempt at most 4 moves, stopping early if time_left runs out,
- * clipping velocity as we go -- CEV */ \
- for (i = 0; time_left > 0 && i < 4; i++) \
- { \
- /* set our destination & test the move -- CEV */ \
- end = self.origin + (self.velocity * time_left); \
- tracebox (self.origin, self.mins, self.maxs, end, \
- PM_MOVEFLAGS, self); \
- if (trace_allsolid && trace_startsolid) \
- { \
- /* self is in something else; attempt to nudge out */ \
- if (PM_Nudge()) \
- continue; \
- dprint (sprintf("PM_DANCEMOVE: trapped in a solid %s" \
- "! time %g\n", trace_ent.classname, time)); \
- break; \
- } \
- if (trace_fraction > 0) \
- /* accept the move -- CEV */ \
- self.origin = trace_endpos; \
- if (trace_fraction >= 1.0f) \
- /* no obstructions, made the whole move -- CEV */ \
- break; \
- /* save trace ent for later then reduce time_left -- CEV */ \
- PM_DANCEMOVE_ADDTOUCH (trace_ent) \
- time_left -= time_left * trace_fraction; \
+ * clipping velocity as we go -- CEV */
+ for (i = 0; time_left > 0 && i < 4; i++)
+ {
+ /* set our destination & test the move -- CEV */
+ end = self.origin + (self.velocity * time_left);
+ tracebox (self.origin, self.mins, self.maxs, end,
+ PM_MOVEFLAGS, self);
+
+ if (trace_allsolid && trace_startsolid)
+ {
+ /* self is in something else; attempt to nudge out */
+ if (PM_Nudge())
+ continue;
+ dprint (sprintf("PM_DANCEMOVE: trapped in a solid %s"
+ "! time %g\n", trace_ent.classname, time));
+ break;
+ }
+
+ if (trace_fraction > 0)
+ /* accept the move -- CEV */
+ self.origin = trace_endpos;
+
+ if (trace_fraction >= 1.0f)
+ /* no obstructions, made the whole move -- CEV */
+ break;
+
+ /* save trace ent for later then reduce time_left -- CEV */
+ PM_DANCEMOVE_ADDTOUCH (trace_ent)
+ time_left -= time_left * trace_fraction;
+
/* integrated StepSlideMove from Nuclide / CSQCTest
* only attempt to step if requested and there's time left
- * and we hit something like a vertical plane -- CEV */ \
- if (self.pm_flags & PMF_SLIDE_STEP) { \
- if (time_left > 0) { \
- if (trace_plane_normal.z <= PM_PLANE_GROUND) \
- { \
- /* store the entity and plane normal from above in
- * case we need to reject the step attempt -- CEV */ \
- local vector first_plane = trace_plane_normal; \
- local entity first_ent = trace_ent; \
- local float first_frac = trace_fraction; \
- j = time_left; \
+ * and we hit something like a vertical plane -- CEV */
+ if (self.moveflags & PMF_SLIDE_STEP && time_left > 0 &&
+ trace_plane_normal.z >= PM_PLANE_VERTICAL &&
+ trace_plane_normal.z <= PM_PLANE_GROUND)
+ {
/* this next macro starts a chain of macros that will
- * complete (or abandon) the step attempt -- CEV */ \
- PM_DANCEMOVE_STEP_UP (start_vel, end, j, k, \
- PM_MOVEFLAGS) \
- } } } \
- /* we've found a ground plane so call PM_SETONGROUND -- CEV */ \
- if (trace_plane_normal.z > PM_PLANE_GROUND) \
- { \
- PM_DANCEMOVE_GROUNDIMPACT () \
- PM_SETONGROUND () \
- } \
- /* check stored planes and clip velocity as needed -- CEV */ \
- PM_DANCEMOVE_CLIP (end, trace_plane_normal, plane1, plane2, k) \
- /* store current plane and plane1 for the next pass -- CEV */ \
- if (trace_plane_normal != plane1) { \
- if (trace_plane_normal != plane2) \
- { \
- plane2 = plane1; \
- plane1 = trace_plane_normal; \
- } } \
- /* stop if we've turned against original velocity -- CEV */ \
- if (self.velocity * start_vel <= 0) \
- self.velocity = '0 0 0'; \
- /* stop the loop if velocity is now zero -- CEV */ \
- if (self.velocity == '0 0 0') \
- break; \
- } \
- /* call touch () on any entities we've collided with -- CEV */ \
- PM_DANCEMOVE_DOTOUCH (touched_ent3) \
- PM_DANCEMOVE_DOTOUCH (touched_ent2) \
- PM_DANCEMOVE_DOTOUCH (touched_ent1) \
+ * complete (or abandon) the step attempt -- CEV */
+ PM_DANCEMOVE_STEP_UP (startvel, end, j, k, PM_MOVEFLAGS)
+ }
+
+ /* we've found a ground plane so call PM_SETONGROUND -- CEV */
+ if (trace_plane_normal.z > PM_PLANE_GROUND)
+ {
+ PM_DANCEMOVE_GROUNDIMPACT ()
+ PM_SETONGROUND ()
+ }
+
+ /* check stored planes and clip velocity as needed -- CEV */
+ PM_DANCEMOVE_CLIP (end, trace_plane_normal, plane1, plane2, k)
+
+ /* store current plane and plane1 for the next pass -- CEV */
+ if (trace_plane_normal != plane1 &&
+ trace_plane_normal != plane2 &&
+ trace_plane_normal != self.groundnormal)
+ {
+ plane2 = plane1;
+ plane1 = trace_plane_normal;
+ }
+
+ /* stop if we've turned against original velocity -- CEV */
+ if (self.velocity * startvel <= 0)
+ self.velocity = '0 0 0';
+
+ /* stop the loop if velocity is now zero -- CEV */
+ if (self.velocity == '0 0 0')
+ break;
+ }
+
+ /* call touch () on any entities we've collided with -- CEV */
+ PM_DANCEMOVE_DOTOUCH (touched_ent3)
+ PM_DANCEMOVE_DOTOUCH (touched_ent2)
+ PM_DANCEMOVE_DOTOUCH (touched_ent1)
+
/* if we're not onground and the timer is greater than
* PM_WALLCLIP_WINDOW (within 250ms of pressing jump)
- * then restore velocity (to skim past walls) -- CEV */ \
- if (!(self.pm_flags & PMF_ONGROUND)) { \
- if (self.pm_timer > PM_WALLCLIP_WINDOW) \
- { \
- j = start_vel.z; \
- k = self.velocity.z; \
- self.velocity = start_vel; \
- /* take min of vel_z so headbump doublejumps work -- CEV */ \
- if (fabs(j) > fabs(k)) \
- self.velocity.z = k; \
- else \
- self.velocity.z = j; \
- } } \
- /* final gravity check here -- CEV */ \
- if (grav) \
- self.velocity.z -= grav * 0.5f; \
+ * then restore velocity (to skim past walls) -- CEV */
+ if (!(self.moveflags & PMF_ONGROUND) &&
+ self.movetimer > PM_WALLCLIP_WINDOW)
+ {
+ j = startvel.z;
+ k = self.velocity.z;
+ self.velocity = startvel;
+ /* take min of vel_z so headbump doublejumps work -- CEV */
+ if (fabs(j) > fabs(k))
+ self.velocity.z = k;
+ else
+ self.velocity.z = j;
+ }
+
+ /* final gravity check here -- CEV */
+ if (grav)
+ self.velocity.z -= grav * 0.5f;
+
/* clip to the ground plane under certain complex conditions (this
- * is done to recreate / simulate Q3/CPM stair behavior) -- CEV */ \
- if (self.pm_timer > 0) { \
- if (self.velocity.z) { \
- if (self.groundnormal.z > PM_PLANE_GROUND) { \
- if (!(self.pm_flags & PMF_CROUCH_HELD)) { \
- if (!(self.pm_flags & PMF_WALK_HELD)) { \
- if (!(self.pm_flags & PMF_DOUBLEJUMPED)) \
- { \
- /*
- dprint (sprintf("PM_DANCEMOVE: glue %f\n", self.origin.z));
- */ \
- k = self.velocity * self.groundnormal; \
- self.velocity -= self.groundnormal * k; \
- } } } } } } \
+ * is done to recreate / simulate Q3/CPM stair behavior) -- CEV */
+ if (self.movetimer > 0 && self.velocity.z &&
+ self.groundnormal.z > PM_PLANE_GROUND &&
+ !(self.moveflags & PMF_DOUBLEJUMPED))
+ {
+ k = self.velocity * self.groundnormal;
+ self.velocity -= self.groundnormal * k;
+ }
+
/*
if (i > 0)
- dprint (sprintf("PM_DANCEMOVE: move complete, "
+ dprint (sprintf("PM_DanceMove: move complete, "
"i %g, time_left %g, velocity.z %g\n",
i, time_left, self.velocity.z));
- */ \
- PM_DanceMove_ClearFlags2: \
- /* clear slide hint flags -- CEV */ \
- self.pm_flags = self.pm_flags - (self.pm_flags & PM_SLIDEFLAGS); \
-/* } */
+ */
+
+ PM_DanceMove_ClearFlags2:
+ /* clear slide hint flags -- CEV */
+ self.moveflags = self.moveflags - (self.moveflags & PM_SLIDEFLAGS);
+};
//----------------------------------------------------------------------
void() PM_CrouchStart =
{
// crouch
- self.pm_flags |= PMF_CROUCHED;
+ self.moveflags |= PMF_CROUCHED;
setsize (self, PM_CROUCH_MIN, PM_CROUCH_MAX);
#ifdef CSQC
@@ -1000,7 +959,7 @@ void() PM_CrouchStop =
if (trace_startsolid == FALSE) {
if (trace_allsolid == FALSE)
{
- self.pm_flags &= ~PMF_CROUCHED;
+ self.moveflags &= ~PMF_CROUCHED;
setsize (self, PM_STAND_MIN, PM_STAND_MAX);
#ifdef CSQC
@@ -1008,7 +967,7 @@ void() PM_CrouchStop =
if (self.entnum == player_localentnum) {
if (self.view_ofs != PM_STAND_VIEWOFS)
{
- view_crouch_old = PM_CROUCH_VIEWOFS_z;
+ view_crouch_old = PM_CROUCH_VIEWOFS.z;
view_crouch_finished = time + PLAYER_CROUCH_SMOOTH;
} }
#endif
@@ -1026,21 +985,18 @@ void() PM_CrouchStop =
//----------------------------------------------------------------------
void() PM_CrouchSlideStart =
{
- #if 0
+ #ifdef DEBUG
dprint (sprintf("PM_CrouchSlideStart: lesgo %g, timer %g\n",
- self.velocity.z, self.pm_timer));
+ self.velocity.z, self.movetimer));
#endif
- if (self.pm_timer >= 0)
+ if (self.movetimer >= 0)
{
- #ifdef SSQC
- sound (self, CHAN_SLIDE, "cev/player/dive.ogg",
- 0.3, ATTN_FEET);
- #endif
- self.pm_timer = PM_CROUCHSLIDE_TIME * -1;
+ player_sound (snd_player_slide_00, TRUE);
+ self.movetimer = PM_CROUCHSLIDE_TIME * -1;
}
- self.pm_flags |= PMF_CROUCHSLIDE;
+ self.moveflags |= PMF_CROUCHSLIDE;
};
//----------------------------------------------------------------------
@@ -1048,131 +1004,150 @@ void() PM_CrouchSlideStart =
//----------------------------------------------------------------------
void() PM_CrouchSlideStop =
{
- self.pm_flags &= ~PMF_CROUCHSLIDE;
+ self.moveflags &= ~PMF_CROUCHSLIDE;
- #ifdef SSQC
- if (self.pm_timer >= 0)
- sound (self, CHAN_SLIDE, "misc/null.wav", 0.4, ATTN_FEET);
- #endif
+ if (self.movetimer >= 0)
+ player_sound (snd_player_slide_silent, TRUE);
};
//----------------------------------------------------------------------
-// PM_Jump
+// PM_JUMP
//----------------------------------------------------------------------
-void() PM_Jump =
-{
- // are we already waterjumping, or is jump being held?
- if (self.pm_flags & PMF_WATERJUMPED)
- return;
- if (self.pm_flags & PMF_JUMP_HELD)
- return;
-
- #ifdef SSQC
- local string wav = "";
- local float vol = 0;
- #endif
-
- // make sure we get at least jumpspeed upwards from the ground
- // plane by clipping velocity to it. necessary for rampjumps. -- CEV
- if (self.groundnormal.z > PM_PLANE_GROUND)
- if (self.velocity * self.groundnormal < 0)
- self.velocity -= self.groundnormal *
- (self.velocity * self.groundnormal);
-
- // this changes the behavior of downward ramps -- CEV
- if (self.velocity.z < 0)
- self.velocity.z = 0;
-
- if (self.pm_timer > 0)
- {
- // it may be useful in the future (for a tricks mode, etc)
- // to distinguish between different jump types -- CEV
- if (self.teleport_time > time - (PM_TELEJUMP_WINDOW + 0.2))
- {
- // a teleport jump: allow a larger (+0.2) window to
- // account for time to travel thru teleporter -- CEV
- // non-additive jump, though it shouldn't matter -- CEV
- self.velocity.z = PM_TELEJUMPSPEED;
- }
- else if (self.pm_flags & PMF_ONRAMP)
- {
- // the groundnormal is weird - a ramp - so we
- // want an additive doublejump here -- CEV
- self.velocity.z += PM_DOUBLEJUMPSPEED;
- }
- else
- {
- // flat ground, don't do an additive jump -- CEV
- self.velocity.z = PM_STAIRJUMPSPEED;
- }
-
- #ifdef SSQC
- vol = 0.9;
- wav = "player/plyrjmp8.wav";
- #endif
-
- // set the doublejump flag -- CEV
- self.pm_flags |= PMF_DOUBLEJUMPED;
- }
- else
- {
- // normal jump
- #ifdef SSQC
- local float r2 = rint (random() * 3);
- vol = 0.1;
- wav = sprintf ("cev/player/jump_0%g.ogg", r2 + 1);
- #endif
-
- if (self.pm_flags & PMF_ONRAMP)
- {
- // do an additive jump on non-flat ground -- CEV
- self.velocity.z += PM_JUMPSPEED;
- }
- else
- {
- // ignore the jump input if the player has stepped
- // up within the last frame (for CPM stairjumps)
- // -- CEV
- if (self.pm_flags & PMF_AIRSTEPPED)
- self.velocity.z = PM_JUMPSPEED;
- else if (self.pm_flags & PMF_CROUCH_HELD)
- self.velocity.z = PM_JUMPSPEED;
- else if (self.pm_flags & PMF_WALK_HELD)
- self.velocity.z = PM_JUMPSPEED;
- else if (!(self.pm_flags & PMF_STEPPED))
- self.velocity.z = PM_JUMPSPEED;
- #if 0
- else
- dprint (sprintf("PM_Jump: eating jump; %f\n",
- self.origin.z));
- #endif
- }
- }
-
- // manage flags -- CEV
- PM_SETONGROUND_NOGROUND ()
- self.pm_flags |= PMF_JUMP_HELD;
-
- if (self.pm_flags & PMF_CROUCHSLIDE)
- PM_CrouchSlideStop ();
-
- #ifdef SSQC
- // player jumping sound; moved into pmove from client.qc -- CEV
- if (wav != "")
- sound (self, CHAN_BODY, wav, vol, ATTN_NORM);
- player_footstep ();
- #if 0
- dprint (sprintf("PM_Jump: Z velocity %g, time %g\n",
- self.velocity.z, time));
- #endif
- #endif
-
- // timers for all jumps -- CEV
- if (self.pm_timer >= 0)
- {
- self.pm_timer = PM_DOUBLEJUMP_WINDOW;
- }
-};
+#define PM_JUMP() \
+/* { */ \
+ /* are we already waterjumping, or is jump being held? */ \
+ if (!(self.moveflags & PMF_WATERJUMPED) && \
+ !(self.moveflags & PMF_JUMP_HELD)) \
+ { \
+ var sound_info_t snd = snd_empty; \
+ /* make sure we get at least jumpspeed upwards from the
+ * ground plane by clipping velocity to it. necessary
+ * for rampjumps. -- CEV */ \
+ if (self.groundnormal.z > PM_PLANE_GROUND && \
+ self.velocity * self.groundnormal < 0) \
+ { \
+ self.velocity -= self.groundnormal * \
+ (self.velocity * self.groundnormal); \
+ } \
+ /* this changes the behavior of downward ramps -- CEV */ \
+ if (self.velocity.z < 0) \
+ self.velocity.z = 0; \
+ if (self.movetimer > 0) \
+ { \
+ /* speed boost based on time since last jump -- CEV */ \
+ /* first: scale amount -- CEV */ \
+ accel = (PM_DOUBLEJUMP_WINDOW - self.movetimer) * \
+ (1.0f / PM_DOUBLEJUMP_WINDOW); \
+ /* 2nd: scale * ideal circlejump -- CEV */ \
+ accel = PM_MAXSPEED + (accel * \
+ (PM_MAXBOOSTSPEED - PM_MAXSPEED)); \
+ /* only apply if it would increase speed -- CEV */ \
+ if (accel > self.speed && self.speed > PM_WALKSPEED) \
+ { \
+ /* don't apply boost to Z velocity -- CEV */ \
+ friction = self.velocity.z; \
+ self.velocity.z = 0; \
+ self.velocity = normalize (self.velocity); \
+ self.velocity *= accel; \
+ self.velocity.z = friction; \
+ friction = 0; \
+ } \
+ accel = 0; \
+ /* it may be useful in the future (for a tricks
+ * mode, etc) to distinguish between different
+ * jump types -- CEV */ \
+ if (self.teleport_time > time - \
+ (PM_TELEJUMP_WINDOW + 0.2)) \
+ { \
+ /* a teleport jump: allow a larger (+0.2)
+ * window to account for time to travel
+ * thru teleporter -- CEV */ \
+ self.velocity.z = PM_TELEJUMPSPEED; \
+ } \
+ else if (self.moveflags & PMF_ONRAMP) \
+ { \
+ /* the groundnormal is weird - a ramp - so we
+ * want an additive doublejump here -- CEV */ \
+ self.velocity.z += PM_DOUBLEJUMPSPEED; \
+ } \
+ else \
+ { \
+ /* flat ground, no additive jump -- CEV */ \
+ self.velocity.z = PM_STAIRJUMPSPEED; \
+ } \
+ snd = snd_player_jump_00; \
+ /* set the doublejump flag -- CEV */ \
+ self.moveflags |= PMF_DOUBLEJUMPED; \
+ } \
+ /*
+ else if (input_movevalues.y && input_movevalues.x == 0 && \
+ self.speed <= PM_SHORTJUMPTHRESH) \
+ { \
+ var float r1 = rint (random() * 3); \
+ switch (r1) \
+ { \
+ case 0: snd = snd_player_jump_01; break; \
+ case 1: snd = snd_player_jump_02; break; \
+ case 2: snd = snd_player_jump_03; break; \
+ case 3: snd = snd_player_jump_04; break; \
+ } \
+ self.velocity = wishdir * PM_SHORTJUMPXYSPEED; \
+ if (self.moveflags & PMF_ONRAMP) \
+ self.velocity.z += PM_SHORTJUMPSPEED; \
+ else \
+ self.velocity.z = PM_SHORTJUMPSPEED; \
+ } \
+ */ \
+ else \
+ { \
+ /* normal jump */ \
+ var float r2 = rint (random() * 3); \
+ switch (r2) \
+ { \
+ case 0: snd = snd_player_jump_01; break; \
+ case 1: snd = snd_player_jump_02; break; \
+ case 2: snd = snd_player_jump_03; break; \
+ case 3: snd = snd_player_jump_04; break; \
+ } \
+ if (self.moveflags & PMF_ONRAMP) \
+ { \
+ /* additive jump on non-flat ground -- CEV */ \
+ self.velocity.z += PM_JUMPSPEED; \
+ } \
+ else \
+ { \
+ /* ignore the jump input if the player has
+ * stepped up within the last frame (for
+ * CPM stairjumps) -- CEV */ \
+ if (self.moveflags & PMF_AIRSTEPPED) \
+ self.velocity.z = PM_JUMPSPEED; \
+ else if (!(self.moveflags & PMF_STEPPED)) \
+ self.velocity.z = PM_JUMPSPEED; \
+ /*
+ else \
+ dprint (sprintf("PM_Jump: eating " \
+ "jump; %f\n", self.origin.z)); \
+ */ \
+ } \
+ } \
+ /* manage flags -- CEV */ \
+ PM_SETONGROUND_NOGROUND () \
+ self.moveflags |= PMF_JUMP_HELD; \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
+ PM_CrouchSlideStop (); \
+ /* player jumping sound -- CEV */ \
+ if (snd.wav != snd_empty.wav) \
+ player_sound (snd, TRUE); \
+ player_footstep (); \
+ /*
+ dprint (sprintf("PM_Jump: Z vel %g, time %g\n", \
+ self.velocity.z, time)); \
+ */ \
+ /* timers for all jumps -- CEV */ \
+ if (self.movetimer >= 0) \
+ self.movetimer = PM_DOUBLEJUMP_WINDOW; \
+ } \
+/* } */
//----------------------------------------------------------------------
// PM_WallClimb -- climbing; checks performed in PM_WallJumpCheck -- CEV
@@ -1180,8 +1155,8 @@ void() PM_Jump =
void() PM_WallClimb =
{
// accelerate upwards toward a vertical ledge -- CEV
- local float grav;
- local float zspeed = self.velocity.z;
+ var float grav;
+ var float zspeed = self.velocity.z;
// counteract gravity with additional Z velocity -- CEV
if (self.gravity)
@@ -1194,14 +1169,14 @@ void() PM_WallClimb =
self.velocity *= PM_CLIMBSCALE;
self.velocity.z = bound (PM_CLIMBSPEEDMIN, zspeed, PM_CLIMBSPEEDMAX);
- // reset pm_timer so we don't stick to the floor -- CEV
- self.pm_flags |= PMF_CLIMB;
- self.pm_flags |= PMF_JUMP_HELD;
+ // reset movetimer so we don't stick to the floor -- CEV
+ self.moveflags |= PMF_CLIMB;
+ self.moveflags |= PMF_JUMP_HELD;
- if (self.pm_timer > 0)
- self.pm_timer = 0;
+ if (self.movetimer > 0)
+ self.movetimer = 0;
- #if 0
+ #ifdef DEBUG
dprint (sprintf("PM_WallClimb: vel.z %g\n", self.velocity.z));
#endif
};
@@ -1211,10 +1186,7 @@ void() PM_WallClimb =
//----------------------------------------------------------------------
void() PM_WallJump =
{
- #ifdef SSQC
- local float vol = 0;
- local string wav = "";
- #endif
+ var sound_info_t snd = snd_empty;
// bounce off the wall plane if Z velocity is positive -- CEV
// if we bounce off the wall plane when Z vel is negative it
@@ -1227,22 +1199,24 @@ void() PM_WallJump =
if (self.velocity.z > 0)
self.velocity += trace_plane_normal * PM_WALLJUMPFORCE;
- #ifdef SSQC
- if (self.pm_timer > 0)
+ if (self.movetimer > 0)
{
- vol = 0.9;
- wav = "player/plyrjmp8.wav";
+ snd = snd_player_jump_00;
}
else
{
- local float r = rint (random() * 3);
- vol = 0.2;
- wav = sprintf ("cev/player/jump_0%g.ogg", r + 1);
+ var float r3 = rint (random() * 3);
+ switch (r3)
+ {
+ case 0: snd = snd_player_jump_01; break;
+ case 1: snd = snd_player_jump_02; break;
+ case 2: snd = snd_player_jump_03; break;
+ case 3: snd = snd_player_jump_04; break;
+ }
}
- #endif
// additive if not falling -- CEV
- if (self.pm_timer > 0)
+ if (self.movetimer > 0)
{
if (self.velocity.z > 0)
self.velocity.z = max (PM_WALLJUMPDOUBLE,
@@ -1258,19 +1232,21 @@ void() PM_WallJump =
self.velocity.z = PM_WALLJUMPSPEED;
}
+ #ifdef DEBUG
+ dprint (sprintf("PM_WallJump: z vel %g\n", self.velocity.z));
+ #endif
+
// manage flags & fields -- CEV
- self.pm_flags |= PMF_JUMP_HELD;
- self.pm_flags |= PMF_WALLJUMPED;
+ self.moveflags |= PMF_JUMP_HELD;
+ self.moveflags |= PMF_WALLJUMPED;
+
+ if (self.movetimer > 0)
+ self.movetimer = 0;
- if (self.pm_timer > 0)
- self.pm_timer = 0;
+ if (snd.wav != snd_empty.wav)
+ player_sound (snd, TRUE);
- // server-side stuff
- #ifdef SSQC
player_footstep ();
- if (wav != "")
- sound (self, CHAN_BODY, wav, vol, ATTN_NORM);
- #endif
};
//----------------------------------------------------------------------
@@ -1279,9 +1255,9 @@ void() PM_WallJump =
void() PM_WallJumpCheck =
{
// are we in water, waterjumping, or falling too fast? -- CEV
- if (self.conlevel > WATERLEVEL_NONE)
+ if (self.waterlevel > WATERLEVEL_NONE)
return;
- if (self.pm_flags & PMF_WATERJUMPED)
+ if (self.moveflags & PMF_WATERJUMPED)
return;
if (self.velocity.z < PM_WALLJUMPLIMIT)
return;
@@ -1289,14 +1265,14 @@ void() PM_WallJumpCheck =
// are we within PM_WALLJUMPGROUND units of the floor? -- CEV
tracebox (self.origin, self.mins, self.maxs, self.origin - '0 0 64',
PM_MOVEFLAGS, self);
- local float grounddist = self.origin.z - trace_endpos.z;
+ var float grounddist = self.origin.z - trace_endpos.z;
if (grounddist <= PM_WALLJUMPGROUND)
if (trace_plane_normal.z > PM_PLANE_GROUND)
return;
- local float i, checks;
- local vector start, end;
- checks = (self.pm_flags & PMF_WALLJUMPED ? 1 : 4);
+ var float i, checks;
+ var vector start, end;
+ checks = (self.moveflags & PMF_WALLJUMPED ? 1 : 4);
start = end = self.origin;
for (i = 0; i < checks; i++)
@@ -1332,7 +1308,7 @@ void() PM_WallJumpCheck =
tracebox (start, PM_CROUCH_MIN, PM_CROUCH_MAX, end,
MOVE_NOMONSTERS | PM_MOVEFLAGS, self);
- #if 0
+ #ifdef DEBUG
dprint (sprintf("PM_WallJumpCheck: frac %g, norm.z %g, dist "
"%g\n", trace_fraction, trace_plane_normal.z,
vlen(self.origin - trace_endpos)));
@@ -1343,23 +1319,18 @@ void() PM_WallJumpCheck =
if (trace_plane_normal.z <= PM_PLANE_GROUND) {
if (trace_plane_normal.z >= PM_PLANE_VERTICAL)
{
- if (!(self.pm_flags & PMF_JUMP_HELD)) {
- if (!(self.pm_flags & PMF_WALLJUMPED)) {
- if (self.velocity * trace_plane_normal >= 0)
+ if (!(self.moveflags & PMF_JUMP_HELD)) {
+ if (!(self.moveflags & PMF_WALLJUMPED)) {
+ if (self.velocity * trace_plane_normal > 0)
{
// moving away from the wall, not holding
// jump, and haven't walljumped -- CEV
- #if 0
- dprint (sprintf("PM_WallJumpCheck: calling "
- "WallJump, grounddist %g\n",
- grounddist));
- #endif
PM_WallJump ();
break;
} } }
if (i == 0) {
- if (self.pm_flags & PMF_JUMP_HELD) {
+ if (self.moveflags & PMF_JUMP_HELD) {
if (self.speed <= PM_MAXSPEED) {
if (fabs(self.velocity.z) < 90.0f) {
if (grounddist > 42)
@@ -1369,7 +1340,7 @@ void() PM_WallJumpCheck =
// velocity and at least 43 units away from
// the ground; attempt to climb -- CEV
- local vector tpn_ang;
+ var vector tpn_ang;
tpn_ang = vectoangles (trace_plane_normal);
// must be facing the impacted surface -- CEV
@@ -1428,7 +1399,7 @@ void() PM_WallJumpCheck =
// player can't hold on to thin air -- CEV
// TODO CEV
- // self.pm_flags &= ~PMF_CLIMB;
+ // self.moveflags &= ~PMF_CLIMB;
}
};
@@ -1443,13 +1414,33 @@ void() PM_WallJumpCheck =
else \
{ \
/* calculate what their new speed should be & slow them */ \
- if (self.pm_timer > 0) \
+ if (self.movetimer > 0) \
temp = speed1; \
else if (speed1 < PM_STOPSPEED) \
temp = PM_STOPSPEED; \
else \
temp = speed1; \
- temp = speed1 - temp * friction * move_time; \
+ /* edge friction -- commented out currently -- CEV */ \
+ /* trace from Nuclide, file pmove_custom.qc -- CEV */ \
+ /*
+ if (self.moveflags & PMF_ONGROUND) \
+ { \
+ vec1 = self.origin + normalize(self.velocity) * \
+ 16 + [0, 0, 1] * self.mins.z; \
+ traceline (vec1, vec1 + [0, 0, -34], TRUE, self); \
+ if (trace_fraction == 1.0) \
+ temp *= friction * PM_EDGEFRICTION * move_time; \
+ else \
+ temp *= friction * move_time; \
+ temp = speed1 - temp; \
+ } \
+ else \
+ { \
+ */ \
+ temp = speed1 - temp * friction * move_time; \
+ /*
+ } \
+ */ \
if (temp <= 0) \
self.velocity = '0 0 0'; \
else \
@@ -1463,7 +1454,17 @@ void() PM_WallJumpCheck =
speed1 = wish - (self.velocity * dir); \
if (speed1 > 0) \
{ \
- newspeed = accel * move_time * wish; \
+ /* TODO CEV */ \
+ /* multiply by MAXSPEED instead of wish so we don't slow
+ * down while crouchwalking along a wall -- CEV */ \
+ if (self.velocity * dir < 0) \
+ { \
+ newspeed = accel * move_time * wish; \
+ } \
+ else \
+ { \
+ newspeed = accel * move_time * PM_MAXSPEED; \
+ } \
newspeed = min (newspeed, speed1); \
self.velocity += newspeed * dir; \
} \
@@ -1483,19 +1484,19 @@ void() PM_WallJumpCheck =
//
// arguments are: wishdir, vec1, float1, float2, move_time
//----------------------------------------------------------------------
-#define PM_AIRCONTROL(dir, pushdir, newspeed, move_time) \
+#define PM_AIRCONTROL(dir, pushdir, newspeed, turn, move_time) \
/* { */ \
/* self.velocity.z is already 0 -- CEV */ \
- speedc = vlen (self.velocity); \
+ self.speed = vlen (self.velocity); \
/* scale wishdir up to self.speed; cheers zweek, see
* https://www.youtube.com/watch?v=gRqoXy-0d84&t=1492s
* for more information -- CEV */ \
- pushdir = (dir * speedc) - self.velocity; \
- newspeed = PM_AIRACCELTURN * move_time * speedc; \
+ pushdir = (dir * self.speed) - self.velocity; \
+ newspeed = turn * move_time * self.speed; \
newspeed = min (newspeed, vlen(pushdir)); \
/*
dprint (sprintf("PM_AIRCONTROL: vlen pushdir %g, newspeed %g, " \
- "speedc %g\n", vlen(pushdir), newspeed, speedc)); \
+ "self.speed %g\n", vlen(pushdir), newspeed, self.speed)); \
*/ \
pushdir = normalize (pushdir); \
self.velocity += pushdir * newspeed; \
@@ -1507,50 +1508,31 @@ void() PM_WallJumpCheck =
//----------------------------------------------------------------------
#define PM_MOVE_MOVETYPES_CATEGORIZEPOSITION() \
/* { */ \
- /* if Z velocity is greater than 180 and we're not on a ramp or
- * a steep slope then assume we're not onground (an optimization
- * from Warsow / Warfork) -- CEV */ \
- if (self.velocity.z > 180) \
- { \
- if (self.pm_flags & PMF_ONRAMP) \
- { \
- PM_SETONGROUND_TRACEGROUND () \
- PM_SETONGROUND () \
- } \
- else if (self.pm_flags & PMF_ONSLOPE) \
- { \
- PM_SETONGROUND_TRACEGROUND () \
- PM_SETONGROUND () \
- } \
- else \
- { \
- PM_SETONGROUND_NOGROUND () \
- } \
- } \
- else \
- { \
- /* look for ground, manage flags & fields -- CEV */ \
- /* setting onground here before the acceleration functions
- * turns out to be faster (in my testing) than relying on
- * DanceMove to correctly track ground state -- CEV */ \
- PM_SETONGROUND_TRACEGROUND () \
- PM_SETONGROUND () \
- } \
+ /* look for ground, manage flags & fields -- CEV */ \
+ /* setting onground here before the acceleration functions
+ * turns out to be faster (in my testing) than relying on
+ * DanceMove to correctly track ground state -- CEV */ \
+ PM_SETONGROUND_TRACEGROUND () \
+ PM_SETONGROUND () \
/* set waterlevel and watertype -- CEV */ \
base_entity_positioncontents (self); \
/* don't crouchslide in water -- CEV */ \
- if (self.pm_flags & PMF_CROUCHSLIDE) { \
- if (self.pm_flags & PMF_ONGROUND) { \
- if (self.conlevel >= WATERLEVEL_WAIST) \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
{ \
- /* TODO CEV */ \
- PM_CrouchSlideStop (); \
- } } } \
+ if (self.moveflags & PMF_ONGROUND) \
+ { \
+ if (self.waterlevel >= WATERLEVEL_WAIST) \
+ { \
+ /* TODO CEV */ \
+ PM_CrouchSlideStop (); \
+ } \
+ } \
+ } \
/* can't be waterjumping if we're on ground */ \
- if (self.pm_flags & PMF_WATERJUMPED) { \
- if (self.conlevel == WATERLEVEL_NONE || self.pm_flags & PMF_ONGROUND) \
+ if (self.moveflags & PMF_WATERJUMPED) { \
+ if (self.waterlevel == WATERLEVEL_NONE || self.moveflags & PMF_ONGROUND)\
{ \
- self.pm_flags &= ~PMF_WATERJUMPED; \
+ self.moveflags &= ~PMF_WATERJUMPED; \
self.flags &= ~FL_WATERJUMP; \
} } \
/* } */
@@ -1563,19 +1545,19 @@ void() PM_WallJumpCheck =
self.groundentity = __NULL__; \
if (self.groundnormal != '0 0 0') \
self.groundnormal = '0 0 0'; \
- if (self.pm_flags & PMF_DOUBLEJUMPED) \
- self.pm_flags &= ~PMF_DOUBLEJUMPED; \
- if (self.pm_flags & PMF_WALLJUMPED) \
- self.pm_flags &= ~PMF_WALLJUMPED; \
- if (self.pm_flags & PMF_ONGROUND) \
- self.pm_flags &= ~PMF_ONGROUND; \
+ if (self.moveflags & PMF_DOUBLEJUMPED) \
+ self.moveflags &= ~PMF_DOUBLEJUMPED; \
+ if (self.moveflags & PMF_WALLJUMPED) \
+ self.moveflags &= ~PMF_WALLJUMPED; \
+ if (self.moveflags & PMF_ONGROUND) \
+ self.moveflags &= ~PMF_ONGROUND; \
if (self.flags & FL_ONGROUND) \
self.flags &= ~FL_ONGROUND; \
- if (self.pm_flags & PMF_PUSHED) \
- self.pm_flags &= ~PMF_PUSHED; \
- if (self.pm_flags & PMF_CLIMB) \
- self.pm_flags &= ~PMF_CLIMB; \
- /* self.pm_timer = 0; */ \
+ if (self.moveflags & PMF_PUSHED) \
+ self.moveflags &= ~PMF_PUSHED; \
+ if (self.moveflags & PMF_CLIMB) \
+ self.moveflags &= ~PMF_CLIMB; \
+ /* self.movetimer = 0; */ \
/* } */
//----------------------------------------------------------------------
@@ -1600,41 +1582,13 @@ void() PM_WallJumpCheck =
move_time) \
/* } */
-#ifdef SSQC
-//----------------------------------------------------------------------
-#define PM_MOVE_MOVETYPES_SWIMPREMOVE_SSQC() \
-/* { */ \
- /* functionality copied into pmove from client.qc -- CEV */ \
- if (self.conlevel >= WATERLEVEL_WAIST) { \
- if (self.conlevel >= WATERLEVEL_EYES) { \
- if (self.swim_time < time) \
- { \
- /* play swimming sound */ \
- self.swim_time = time + 1; \
- if (random() < 0.5) \
- sound (self, CHAN_BODY, "misc/water1.wav", \
- 0.6, ATTN_NORM); \
- else \
- sound (self, CHAN_BODY, "misc/water2.wav", \
- 0.6, ATTN_NORM); \
- } } } \
-/* } */
-#endif
-
-#ifdef CSQC
-//----------------------------------------------------------------------
-#define PM_MOVE_MOVETYPES_SWIMPREMOVE_SSQC() \
-{ \
-}
-#endif
-
//----------------------------------------------------------------------
// PM_MOVE_MOVETYPES_SWIMPREMOVE -- water jump, water wading sounds -- CEV
//----------------------------------------------------------------------
#define PM_MOVE_MOVETYPES_SWIMPREMOVE(start, end, move_time) \
/* { */ \
/* CheckWaterJump */ \
- if (self.conlevel == WATERLEVEL_WAIST) \
+ if (self.waterlevel == WATERLEVEL_WAIST) \
{ \
start = self.origin; \
start.z = start.z + 8; \
@@ -1652,19 +1606,30 @@ void() PM_WallJumpCheck =
{ \
/* open at eye level */ \
self.flags |= FL_WATERJUMP; \
- self.pm_flags |= PMF_WATERJUMPED; \
+ self.moveflags |= PMF_WATERJUMPED; \
self.flags |= FL_JUMPRELEASED; \
- self.pm_flags |= PMF_JUMP_HELD; \
+ self.moveflags |= PMF_JUMP_HELD; \
/* Z velocity was 225 */ \
self.velocity.z = PM_JUMPSPEED; \
} \
} \
} \
- PM_MOVE_MOVETYPES_SWIMPREMOVE_SSQC () \
- if (self.pm_flags & PMF_STEPPED) \
+ /* functionality copied into pmove from client.qc -- CEV */ \
+ if (self.waterlevel >= WATERLEVEL_WAIST) { \
+ if (self.waterlevel >= WATERLEVEL_EYES) { \
+ if (self.swim_time < time) \
{ \
- self.pm_flags &= ~PMF_STEPPED; \
- self.pm_flags &= ~PMF_AIRSTEPPED; \
+ /* play swimming sound */ \
+ self.swim_time = time + 1; \
+ if (random() < 0.5) \
+ player_sound (snd_player_water_01, TRUE); \
+ else \
+ player_sound (snd_player_water_02, TRUE); \
+ } } } \
+ if (self.moveflags & PMF_STEPPED) \
+ { \
+ self.moveflags &= ~PMF_STEPPED; \
+ self.moveflags &= ~PMF_AIRSTEPPED; \
} \
/* } */
@@ -1674,7 +1639,7 @@ void() PM_WallJumpCheck =
//----------------------------------------------------------------------
#define PM_MOVE_MOVETYPES_SWIMACCELERATE(move_time) \
/* { */ \
- if (!(self.pm_flags & PMF_WATERJUMPED)) \
+ if (!(self.moveflags & PMF_WATERJUMPED)) \
{ \
if (input_buttons & PM_BTN_JUMP) \
/* smartjump */ \
@@ -1689,7 +1654,7 @@ void() PM_WallJumpCheck =
wishspeed = vlen (wishvel); \
wishspeed = min (wishspeed, PM_WATERMAXSPEED); \
wishdir = normalize (wishvel); \
- if (!(self.pm_flags & PMF_WATERJUMPED)) \
+ if (!(self.moveflags & PMF_WATERJUMPED)) \
{ \
PM_FRICTION (speed1, temp, PM_WATERFRICTION, move_time) \
} \
@@ -1702,11 +1667,11 @@ void() PM_WallJumpCheck =
//----------------------------------------------------------------------
#define PM_MOVE_MOVETYPES_WALKPREMOVE() \
/* { */ \
- if (self.pm_flags & PMF_ONLADDER) \
+ if (self.moveflags & PMF_ONLADDER) \
{ \
- local float znew = fabs(self.velocity.z) + PM_CLIMBACCEL; \
+ var float znew = fabs(self.velocity.z) + PM_CLIMBACCEL; \
self.velocity *= PM_CLIMBSCALE; \
- speedc = vlen ([self.velocity.x, self.velocity.y, 0]); \
+ self.speed = vlen ([self.velocity.x, self.velocity.y, 0]); \
if (input_buttons & PM_BTN_JUMP || input_movevalues.z > 0) \
{ \
/* PlayerClimb -- johnfitz */ \
@@ -1722,23 +1687,23 @@ void() PM_WallJumpCheck =
else \
{ \
self.flags |= FL_JUMPRELEASED; \
- self.pm_flags &= ~PMF_JUMP_HELD; \
+ self.moveflags &= ~PMF_JUMP_HELD; \
self.velocity.z = 0; \
} \
- if (self.pm_flags & PMF_ONGROUND) \
+ if (self.moveflags & PMF_ONGROUND) \
{ \
PM_SETONGROUND_NOGROUND () \
} \
- /* self.pm_timer = 0; */ \
+ /* self.movetimer = 0; */ \
} \
else \
{ \
if (input_buttons & PM_BTN_JUMP) \
{ \
/* +jump was pressed */ \
- if (self.pm_flags & PMF_ONGROUND) \
+ if (self.moveflags & PMF_ONGROUND) \
{ \
- PM_Jump (); \
+ PM_JUMP () \
} \
else if (world_walljump) \
{ \
@@ -1748,89 +1713,18 @@ void() PM_WallJumpCheck =
else \
{ \
self.flags |= FL_JUMPRELEASED; \
- self.pm_flags &= ~PMF_JUMP_HELD; \
+ self.moveflags &= ~PMF_JUMP_HELD; \
} \
if (input_buttons & PM_BTN_DOWN && \
- !(self.pm_flags & PMF_CROUCHED)) \
+ !(self.moveflags & PMF_CROUCHED)) \
{ \
PM_CrouchStart (); \
} \
else if (!(input_buttons & PM_BTN_DOWN) && \
- self.pm_flags & PMF_CROUCHED) \
+ self.moveflags & PMF_CROUCHED) \
{ \
PM_CrouchStop (); \
} \
- if (self.pm_flags & PMF_STEPPED) \
- { \
- self.pm_flags &= ~PMF_STEPPED; \
- self.pm_flags &= ~PMF_AIRSTEPPED; \
- } \
- } \
- /* determine the user's requested movement direction / angle.
- * inspired by IsMoveInDirection from Nexuiz / Xonotic; this
- * is slow and could be improved -- CEV */ \
- if (wishspeed) \
- { \
- /* work out the requested movement direction -- CEV */ \
- if (input_movevalues.x == 0) \
- { \
- if (input_movevalues.y) \
- wishyaw = 90; \
- else \
- wishyaw = 0; \
- } \
- else \
- { \
- if (input_movevalues.y == 0) \
- { \
- wishyaw = 0; \
- } \
- else \
- { \
- wishyaw = atan2 (input_movevalues.y, \
- input_movevalues.x); \
- wishyaw *= M_RAD2DEG; \
- if (fabs(wishyaw) > 90) \
- { \
- if (wishyaw < 0) \
- wishyaw += 180; \
- else \
- wishyaw -= 180; \
- } \
- /* don't need left/right here -- CEV */ \
- if (wishyaw < 0) \
- wishyaw = fabs (wishyaw); \
- } \
- } \
- /*
- dprint (sprintf("PM_MOVE_MOVETYPES_WALKPREMOVE: wishyaw %g, " \
- "temp %g, time %g\n", wishyaw, temp, time)); \
- */ \
- /* test if the player is requesting movement perpendicular
- * to the direction they're currently moving in (+/- 30
- * degrees); if that's the case then alter wishyaw so the
- * checks below will do Q1 air accel -- CEV */ \
- if (wishyaw != 45) { \
- if (self.pm_flags & PMF_CROUCHSLIDE || \
- !(self.pm_flags & PMF_ONGROUND)) \
- { \
- temp = atan2 (self.velocity.y, self.velocity.x); \
- temp *= M_RAD2DEG; \
- temp = input_angles.y - temp; \
- temp = fabs (temp - 360.0f * rint(temp / 360.0f)); \
- if (wishyaw == 90) \
- { \
- if (temp > 60.0f) \
- if (temp < 120.0f) \
- wishyaw = 0; \
- } \
- else if (wishyaw == 0) \
- { \
- if (temp > 60.0f) \
- if (temp < 120.0f) \
- wishyaw = 90.0f; \
- } \
- } } \
} \
/* } */
@@ -1839,148 +1733,155 @@ void() PM_WallJumpCheck =
//----------------------------------------------------------------------
#define PM_MOVE_MOVETYPES_WALKACCELERATE(move_time) \
/* { */ \
- accel = friction = speed1 = temp = 0; \
+ accel = friction = speed1 = temp = turn = 0; \
/* priority and sequence of these checks is important -- CEV */ \
- if (self.pm_flags & PMF_ONGROUND) \
+ /* first: friction -- CEV */ \
+ if (self.moveflags & PMF_ONGROUND) \
{ \
- if (self.pm_flags & PMF_ONSLICK) \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
{ \
- /* ice physics; friction remains 0 -- CEV */ \
- if (wishspeed) \
- { \
- accel = PM_SLICKACCEL; \
- wishspeed = min (wishspeed, PM_MAXSPEED); \
- } \
- } \
- else if (self.pm_flags & PMF_CROUCHSLIDE) \
- { \
- /* movement while crouchsliding -- CEV */ \
/* water level adds extra friction -- CEV */ \
- friction = PM_SLIDEFRICTION + self.conlevel; \
- if (wishspeed) \
- { \
- if (wishyaw == 0) \
- { \
- accel = -PM_SLIDEACCELFWD; \
- } \
- else \
- { \
- accel = PM_SLIDEACCELSIDE; \
- } \
- wishspeed = min (wishspeed, PM_MAXSLIDESPEED); \
- } \
+ friction = PM_SLIDEFRICTION + self.waterlevel; \
} \
else \
{ \
- /* movement onground -- CEV */ \
- if (self.pm_flags & PMF_STEPPED) \
- /* changing the friction constant is sketchy;
- * it might help with navigating stairs */ \
+ if (self.moveflags & PMF_STEPPED) \
friction = PM_GROUNDFRICTION * 0.1f; \
else \
friction = PM_GROUNDFRICTION; \
- if (wishspeed) \
- { \
- if (self.pm_flags & PMF_CROUCHED) \
- temp = PM_CROUCHSPEED; \
- else if (self.pm_timer > 0) \
- /* go directly to PM_MAXWISHSPEED
- * for stairjumps -- CEV */ \
- temp = PM_MAXWISHSPEED; \
- else if (self.pm_flags & PMF_WALK_HELD) \
- temp = PM_WALKSPEED; \
- else \
- temp = PM_MAXSPEED; \
- wishspeed = min (wishspeed, temp); \
- if (self.pm_flags & PMF_STEPPED) \
- accel = PM_GROUNDACCEL * 0.1f; \
- else \
- accel = PM_GROUNDACCEL; \
- } \
} \
} \
- else if (self.pm_flags & PMF_ONSLOPE) \
+ /* second: accel & wishspeed limiting -- CEV */ \
+ if (wishspeed) \
{ \
- /* movement while surfing -- CEV */ \
- if (wishspeed) \
+ if ((!(self.moveflags & PMF_ONGROUND)) || \
+ self.moveflags & PMF_CROUCHSLIDE) \
{ \
- if (wishyaw == 90) \
+ /* movement in the air & crouchsliding -- CEV */ \
+ if (self.moveflags & PMF_CROUCHED) \
{ \
- /* Q1 air accel -- CEV */ \
- accel = PM_SURFACCELSIDE; \
- wishspeed = min (wishspeed, PM_MAXAIRSPEED); \
+ wishspeed *= PM_CROUCHSCALE; \
+ if (wishspeed > PM_CROUCHSPEED) \
+ wishspeed = PM_CROUCHSPEED; \
} \
else \
{ \
- /* Q3 accel -- CEV */ \
- accel = PM_SURFACCEL; \
- wishspeed = min (wishspeed, PM_MAXSPEED); \
+ if (wishspeed > PM_MAXSPEED) \
+ wishspeed = PM_MAXSPEED; \
+ } \
+ /* penalty when holding jump (PM_CmdScale) -- CEV */ \
+ if (self.moveflags & PMF_JUMP_HELD) \
+ { \
+ wishspeed *= (0.7f + (0.4f * (1 - \
+ (self.movetimer / \
+ PM_DOUBLEJUMP_WINDOW)))); \
} \
- } \
- } \
- else if (wishspeed) \
- { \
- /* movement in the air -- CEV */ \
- if (wishyaw == 0) \
- { \
- /* Doom 2016 / Eternal-ish air control -- CEV */ \
- if (self.pm_flags & PMF_CROUCHED) \
- wishspeed = min (wishspeed, PM_CROUCHSPEED); \
- else \
- wishspeed = min (wishspeed, PM_MAXSPEED); \
- if (wishvel * self.velocity < 0) \
- accel = -PM_AIRACCELBACK; \
- else \
- accel = -PM_AIRACCELFWD; \
- } \
- else \
- { \
/* Chovelyoukai / Lumia's "differential strafing" */ \
/* angle of the dot of wishdir and velocity -- CEV */ \
- temp = vlen (wishdir) * speedc; \
+ temp = vlen (wishdir) * self.speed; \
temp = acos (wishdir * self.velocity / temp); \
- temp *= M_RAD2DEG; \
- /* optimal angle for Q1 accel at curspeed -- CEV */ \
- /* approaches 90 deg as curspeed increases -- CEV */ \
- friction = acos (PM_MAXAIRSPEED / speedc); \
- friction *= M_RAD2DEG; \
- if (temp > friction) \
+ /* handle NaN -- CEV */ \
+ if (temp != temp) \
+ temp = 0; \
+ else \
+ temp *= M_RAD2DEG; \
+ /* optimal angle for Q1 accel at cur. speed -- CEV */ \
+ /* approaches 90 deg as speed increases -- CEV */ \
+ turn = acos (PM_MAXAIRSPEED / self.speed); \
+ /* it's important to *not* handle NaN here -- CEV */ \
+ turn *= M_RAD2DEG; \
+ if (temp > turn) \
{ \
/* Q1 style air acceleration */ \
- /* if we're below PM_MAXSPEED then nudge
- * velocity towards wishdir -- CEV */ \
- if (speedc < PM_MAXSPEED) \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
+ accel = PM_SLIDEACCELSIDE; \
+ else \
+ accel = PM_AIRACCELSIDE; \
+ if (wishspeed > PM_MAXAIRSPEED) \
+ wishspeed = PM_MAXAIRSPEED; \
+ turn = 0; \
+ } \
+ else \
+ { \
+ /* Q3 style air acceleration */ \
+ if (wishvel * self.velocity < 0) \
{ \
- accel = PM_AIRACCEL; \
- wishspeed = min (wishspeed, \
- PM_MAXSPEED); \
- PM_ACCELERATE (wishdir, wishspeed, \
- speed1, temp, accel, \
- move_time) \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
+ accel = PM_SLIDEACCELFWD; \
+ else \
+ accel = PM_AIRACCELBACK; \
+ turn = 0; \
+ } \
+ else \
+ { \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
+ accel = PM_SLIDEACCELFWD; \
+ else \
+ accel = PM_AIRACCELFWD; \
+ /* when holding +fwd/+back -- CEV */ \
+ if (input_movevalues.x && \
+ input_movevalues.y == 0) \
+ { \
+ /* +fwd air control -- CEV */ \
+ turn = PM_AIRACCELTURN; \
+ if (temp > 35.0f) \
+ { \
+ /* turn fades to 0
+ * between 35 and 45
+ * degrees -- CEV */ \
+ turn *= (1 + ((35.0 - \
+ temp)/10.0)); \
+ if (turn < 0) \
+ turn = 0; \
+ } \
+ } \
+ else \
+ { \
+ turn = 0; \
+ } \
} \
- accel = PM_AIRACCELSIDE; \
- /* this will work because MAXAIRSPEED is lower
- * than MAXSPEED -- CEV */ \
- wishspeed = min (wishspeed, PM_MAXAIRSPEED); \
+ } \
+ } \
+ else if (self.moveflags & PMF_ONSLOPE) \
+ { \
+ /* movement while surfing -- CEV */ \
+ accel = PM_SURFACCELSIDE; \
+ wishspeed = min (wishspeed, PM_MAXAIRSPEED); \
+ } \
+ else \
+ { \
+ /* onground -- CEV */ \
+ if (self.moveflags & PMF_ONSLICK) \
+ { \
+ /* ice physics -- CEV */ \
+ accel = PM_SLICKACCEL; \
+ if (wishspeed > PM_MAXSPEED) \
+ wishspeed = PM_MAXSPEED; \
} \
else \
{ \
- /* Q3 style air acceleration */ \
- accel = PM_AIRACCEL; \
- if (self.pm_flags & PMF_CROUCHED) \
- temp = PM_CROUCHSPEED; \
+ if (self.moveflags & PMF_CROUCHED) \
+ { \
+ wishspeed *= PM_CROUCHSCALE; \
+ if (wishspeed > PM_CROUCHSPEED) \
+ wishspeed = PM_CROUCHSPEED; \
+ } \
+ else if (self.moveflags & PMF_WALK_HELD) \
+ { \
+ wishspeed *= PM_WALKSCALE; \
+ if (wishspeed > PM_WALKSPEED) \
+ wishspeed = PM_WALKSPEED; \
+ } \
else \
- temp = PM_MAXSPEED; \
- wishspeed = min (wishspeed, temp); \
- if (self.pm_flags & PMF_JUMP_HELD) \
{ \
- wishspeed *= (0.7f + (0.4f * \
- (1 - (self.pm_timer / \
- PM_DOUBLEJUMP_WINDOW)))); \
+ if (wishspeed > PM_MAXSPEED) \
+ wishspeed = PM_MAXSPEED; \
} \
+ if (self.moveflags & PMF_STEPPED) \
+ accel = PM_GROUNDACCEL * 0.1f; \
+ else \
+ accel = PM_GROUNDACCEL; \
} \
- /* revert the borrowed friction var -- CEV */ \
- friction = 0; \
} \
} \
if (friction > 0) \
@@ -1994,54 +1895,43 @@ void() PM_WallJumpCheck =
PM_ACCELERATE (wishdir, wishspeed, speed1, temp, accel, \
move_time) \
} \
- else if (accel < 0) \
+ if (turn > 0) \
{ \
- /* +fwd air control -- CEV */ \
- accel *= -1; \
- /* accel if below wishspeed or we're slowing down -- CEV */ \
- if (speedc < wishspeed || accel == PM_AIRACCELBACK) \
- { \
- PM_ACCELERATE (wishdir, wishspeed, speed1, temp, \
- accel, move_time) \
- } \
- /* no control when braking -- CEV */ \
- if (accel != PM_AIRACCELBACK) \
- { \
- PM_AIRCONTROL (wishdir, vec1, speed1, move_time) \
- } \
+ /* +fwd air control; no control when braking -- CEV */ \
+ PM_AIRCONTROL (wishdir, vec1, speed1, turn, move_time) \
} \
/* } */
//----------------------------------------------------------------------
// PM_MOVE_MOVETYPES_MANAGETIMER
-// self.pm_timer is pos when jumping, neg when crouchsliding -- CEV
+// self.movetimer is pos when jumping, neg when crouchsliding -- CEV
//----------------------------------------------------------------------
#define PM_MOVE_MOVETYPES_MANAGETIMER(adjust_time) \
/* { */ \
- if (self.pm_timer) \
+ if (self.movetimer) \
{ \
- if (self.pm_timer < 0) \
+ if (self.movetimer < 0) \
{ \
- self.pm_timer += adjust_time; \
- if (self.pm_timer > 0) \
- self.pm_timer = 0; \
+ self.movetimer += adjust_time; \
+ if (self.movetimer > 0) \
+ self.movetimer = 0; \
} \
else \
{ \
- self.pm_timer -= adjust_time; \
- if (self.pm_timer < 0) \
- self.pm_timer = 0; \
+ self.movetimer -= adjust_time; \
+ if (self.movetimer < 0) \
+ self.movetimer = 0; \
} \
} \
- if (self.pm_flags & PMF_CROUCHSLIDE) \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
{ \
- if (self.pm_timer >= 0) \
+ if (self.movetimer >= 0) \
PM_CrouchSlideStop (); \
} \
- if (self.pm_flags & PMF_DOUBLEJUMPED) \
+ if (self.moveflags & PMF_DOUBLEJUMPED) \
{ \
- if (self.pm_timer <= 0) \
- self.pm_flags &= ~PMF_DOUBLEJUMPED; \
+ if (self.movetimer <= 0) \
+ self.moveflags &= ~PMF_DOUBLEJUMPED; \
} \
/* } */
@@ -2058,37 +1948,37 @@ void() PM_WallJumpCheck =
/* clear JUMP_HELD if it's set and the user isn't pressing jump */ \
if (!(input_buttons & PM_BTN_JUMP)) \
{ \
- if (self.pm_flags & PMF_JUMP_HELD) \
+ if (self.moveflags & PMF_JUMP_HELD) \
{ \
- self.pm_flags &= ~PMF_JUMP_HELD; \
+ self.moveflags &= ~PMF_JUMP_HELD; \
} \
} \
/* crouch key, crouchsliding -- CEV */ \
if (input_buttons & PM_BTN_DOWN) \
{ \
- self.pm_flags |= PMF_CROUCH_HELD; \
+ self.moveflags |= PMF_CROUCH_HELD; \
} \
else \
{ \
- self.pm_flags &= ~PMF_CROUCH_HELD; \
- if (self.pm_flags & PMF_CROUCHSLIDE) \
+ self.moveflags &= ~PMF_CROUCH_HELD; \
+ if (self.moveflags & PMF_CROUCHSLIDE) \
PM_CrouchSlideStop (); \
} \
/* walk key, walking -- CEV */ \
if (input_buttons & PM_BTN_WALK) \
{ \
- self.pm_flags |= PMF_WALK_HELD; \
+ self.moveflags |= PMF_WALK_HELD; \
} \
else \
{ \
- self.pm_flags &= ~PMF_WALK_HELD; \
+ self.moveflags &= ~PMF_WALK_HELD; \
} \
/* in case engine code has found ground -- CEV */ \
if (self.flags & FL_ONGROUND) \
{ \
- if (!(self.pm_flags & PMF_ONGROUND)) \
+ if (!(self.moveflags & PMF_ONGROUND)) \
{ \
- self.pm_flags |= PMF_ONGROUND; \
+ self.moveflags |= PMF_ONGROUND; \
} \
} \
/* } */
@@ -2098,13 +1988,12 @@ void() PM_WallJumpCheck =
//----------------------------------------------------------------------
#define PM_MOVE_MOVETYPES() \
/* { */ \
- local vector vec1, vec2, wishdir, wishvel; \
- local float accel, friction, speed1, speedc, temp, wishspeed, wishyaw; \
+ var vector vec1, vec2, wishdir, wishvel; \
+ var float accel, friction, speed1, temp, turn, wishspeed; \
vec1 = vec2 = wishdir = wishvel = '0 0 0'; \
- accel = friction = speed1 = temp = wishspeed = wishyaw = 0; \
- local float itl = input_timelength; \
- speedc = vlen ([self.velocity.x, self.velocity.y, 0]); \
- self.speed = speedc; \
+ accel = friction = speed1 = temp = turn = wishspeed = 0; \
+ var float itl = input_timelength; \
+ self.speed = vlen ([self.velocity.x, self.velocity.y, 0]); \
if (self.movetype == MOVETYPE_NOCLIP) \
{ \
PM_MOVE_MOVETYPES_SETNOCLIPFLAGS () \
@@ -2113,7 +2002,7 @@ void() PM_WallJumpCheck =
wishvel += v_right * input_movevalues.y; \
wishvel += v_up * input_movevalues.z; \
PM_MOVE_MOVETYPES_NOCLIPACCELERATE (itl) \
- /* we're noclipping so update origin directly -- CEV */ \
+ /* update origin directly -- CEV */ \
self.origin += self.velocity * itl; \
} \
else if (self.movetype == MOVETYPE_TOSS || \
@@ -2123,15 +2012,17 @@ void() PM_WallJumpCheck =
if (self.health <= 0) \
{ \
input_movevalues = '0 0 0'; \
+ input_buttons = 0; \
+ self.button2 = 0; \
} \
/* let the engine handle BOUNCE and TOSS -- CEV */ \
runstandardplayerphysics (self); \
- /* might as well copy ONGROUND state to pm_flags -- CEV */ \
+ /* might as well copy ONGROUND state to moveflags -- CEV */ \
if (self.flags & FL_ONGROUND) \
{ \
- if (!(self.pm_flags & PMF_ONGROUND)) \
+ if (!(self.moveflags & PMF_ONGROUND)) \
{ \
- self.pm_flags |= PMF_ONGROUND; \
+ self.moveflags |= PMF_ONGROUND; \
} \
} \
} \
@@ -2142,13 +2033,12 @@ void() PM_WallJumpCheck =
{ \
/* work out the properties of the player's position */ \
PM_MOVE_MOVETYPES_CATEGORIZEPOSITION () \
- if (self.conlevel < WATERLEVEL_WAIST) \
+ if (self.waterlevel < WATERLEVEL_WAIST) \
{ \
/* intended movement for walking/air accel */ \
/* only yaw matters here -- CEV */ \
makevectors (input_angles.y * '0 1 0'); \
- v_forward.z = 0; \
- v_right.z = 0; \
+ v_forward.z = v_right.z = 0; \
wishvel = v_forward * input_movevalues.x + \
v_right * input_movevalues.y; \
wishvel.z = 0; \
@@ -2158,7 +2048,7 @@ void() PM_WallJumpCheck =
PM_MOVE_MOVETYPES_WALKPREMOVE () \
/* don't factor in Z velocity when running
* ground/air accel functions -- CEV */ \
- local float zsave = self.velocity.z; \
+ var float zsave = self.velocity.z; \
self.velocity.z = 0; \
PM_MOVE_MOVETYPES_WALKACCELERATE (itl) \
self.velocity.z = zsave; \
@@ -2190,29 +2080,51 @@ void() PM_WallJumpCheck =
} \
/* step if nostep is false and we're not on a ladder... */ \
if (world_nostep == FALSE) { \
- if (!(self.pm_flags & PMF_ONLADDER)) \
+ if (!(self.moveflags & PMF_ONLADDER)) \
{ \
/* ... and either airstep is true or we're onground */ \
if (world_airstep == TRUE) \
- self.pm_flags |= PMF_SLIDE_STEP; \
- else if (self.pm_flags & PMF_ONGROUND) \
- self.pm_flags |= PMF_SLIDE_STEP; \
+ self.moveflags |= PMF_SLIDE_STEP; \
+ else if (self.moveflags & PMF_ONGROUND) \
+ self.moveflags |= PMF_SLIDE_STEP; \
} } \
+ /* clear stepped flags -- CEV */ \
+ if (self.moveflags & PMF_STEPPED) \
+ { \
+ self.moveflags &= ~PMF_STEPPED; \
+ self.moveflags &= ~PMF_AIRSTEPPED; \
+ } \
/* bound velocity to fixed server maximums -- CEV */ \
if (self.velocity != '0 0 0') \
{ \
- PM_CHECKVELOCITY (self.velocity) \
+ BASE_ENTITY_CHECKVELOCITY (self.velocity) \
} \
/* Do the move. Bounce, Rock, Skate, Roll -- CEV */ \
- PM_DANCEMOVE (vec1, vec2, accel, friction, temp) \
+ PM_DanceMove (itl); \
/* clear ladder flag -- CEV */ \
- if (self.pm_flags & PMF_ONLADDER) \
- self.pm_flags &= ~PMF_ONLADDER; \
+ if (self.moveflags & PMF_ONLADDER) \
+ self.moveflags &= ~PMF_ONLADDER; \
+ setorigin (self, self.origin); \
touchtriggers (self); \
base_entity_positioncontents (self); \
} \
/* } */
+#ifdef SSQC
+#define PM_MOVE_POST_FALLDAMAGE() \
+/* { */ \
+ self.deathtype = "falling"; \
+ t_damage2 (self, world, world, 5); \
+ self.deathtype = ""; \
+/* } */
+#endif
+
+#ifdef CSQC
+#define PM_MOVE_POST_FALLDAMAGE() \
+/* { */ \
+/* } */
+#endif
+
//----------------------------------------------------------------------
// PM_MOVE_POST -- handle any after-move operations -- CEV
//
@@ -2223,20 +2135,37 @@ void() PM_WallJumpCheck =
#define PM_MOVE_POST() \
/* { */ \
/* in case engine code has found ground -- CEV */ \
- if (self.pm_flags & PMF_ONGROUND) \
+ if (self.moveflags & PMF_ONGROUND) \
{ \
if (!(self.flags & FL_ONGROUND)) \
{ \
self.flags |= FL_ONGROUND; \
} \
} \
+ /* check to see if player landed and play landing sound */ \
+ if (self.jump_flag < -300 && self.health > 0) \
+ { \
+ if (self.watertype == CONTENT_WATER) \
+ { \
+ player_sound (snd_player_jumpwater, TRUE); \
+ } \
+ else if (self.jump_flag < -650) \
+ { \
+ PM_MOVE_POST_FALLDAMAGE () \
+ player_sound (snd_player_land_02, TRUE); \
+ } \
+ else \
+ { \
+ player_sound (snd_player_land_01, TRUE); \
+ } \
+ self.pain_finished = time + 0.5; \
+ self.jump_flag = 0; \
+ } \
if (self.velocity != '0 0 0') \
{ \
- PM_CHECKVELOCITY (self.velocity) \
+ BASE_ENTITY_CHECKVELOCITY (self.velocity) \
PM_TRUNCATEVECTORTOEIGTH (self.velocity) \
} \
self.speed = vlen ([self.velocity.x, self.velocity.y, 0]); \
- /* setorigin (self, self.origin); \
- self.oldorigin = self.origin; */ \
/* } */
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/bolt.qc
diff --git a/qc/projectiles/bolt.qc b/qc/projectiles/bolt.qc
index d64ce3b..74894d1 100644
--- a/qc/projectiles/bolt.qc
+++ b/qc/projectiles/bolt.qc
@@ -41,7 +41,7 @@ strip void() projectile_bolt;
if (self.takedamage)
self.takedamage = DAMAGE_NO;
- t_radiusdamage3 (self, self.owner, self.splash_damage,
+ t_radiusdamage3 (self, self.owner, self.dmg_splash,
100, BOLT_SPLASH_MINIMUM, other);
// BecomeExplosion
@@ -85,15 +85,13 @@ strip void() projectile_bolt;
if (other.takedamage == DAMAGE_AIM)
{
- t_damage2 (other, self, self.owner,
- self.direct_damage);
+ t_damage2 (other, self, self.owner, self.dmg);
projectile_bolt_explode ();
return;
}
// stop dead at whatever point we hit -- CEV
- sound (self, CHAN_WEAPON, "weapons/bounce.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenade_bounce)
self.movetype = MOVETYPE_NONE;
self.velocity = '0 0 0';
self.avelocity = '0 0 0';
@@ -108,8 +106,8 @@ strip void() projectile_bolt;
e.owner = src;
e.origin = src.origin;
// damage
- e.direct_damage = BOLT_DIRECT_DAMAGE;
- e.splash_damage = BOLT_SPLASH_DAMAGE;
+ e.dmg = BOLT_DIRECT_DAMAGE;
+ e.dmg_splash = BOLT_SPLASH_DAMAGE;
if (d)
{
@@ -136,10 +134,11 @@ strip void() projectile_bolt;
{
if (e.owner.classgroup & CG_MONSTER)
{
- if (e.owner.attack_elevation)
+ // was .attack_elevation -- CEV
+ if (e.owner.t_height)
{
local vector ang = e.owner.angles;
- ang_x = -e.owner.attack_elevation;
+ ang_x = -e.owner.t_height;
makevectors (ang);
e.velocity = v_forward * BOLT_SPEED +
crandom() * v_right * 10 +
@@ -153,7 +152,7 @@ strip void() projectile_bolt;
e.velocity_z = 200;
}
}
- else if (e.owner.v_angle_x)
+ else
{
makevectors (e.owner.v_angle);
e.velocity = v_forward * BOLT_SPEED +
@@ -161,12 +160,6 @@ strip void() projectile_bolt;
crandom() * v_right * 10 +
crandom() * v_up * 10;
}
- else
- {
- e.velocity = aim (e.owner, 10000);
- e.velocity *= BOLT_SPEED;
- e.velocity_z = 200;
- }
}
else
{
@@ -193,13 +186,12 @@ strip void() projectile_bolt;
if (!e.avelocity)
e.avelocity = '300 300 300';
- if (!e.splash_damage)
- e.splash_damage = BOLT_SPLASH_DAMAGE;
+ if (!e.dmg_splash)
+ e.dmg_splash = BOLT_SPLASH_DAMAGE;
// DOE multi grenade model but at half the size -- CEV
setmodel (e, "progs/mervup.mdl");
e.skin = 0;
- e.scale = 0.5;
setsize (e, BOLT_MINS, BOLT_MAXS);
setorigin (e, e.origin);
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/bullet.qc
diff --git a/qc/projectiles/bullet.qc b/qc/projectiles/bullet.qc
index 1b4e40a..3c8532e 100644
--- a/qc/projectiles/bullet.qc
+++ b/qc/projectiles/bullet.qc
@@ -8,7 +8,7 @@
const float BULLET_DIRECT_DAMAGE = 5; // id1 is 4
// bullets don't splash
-const float BULLET_SPEED = 2500.0f; // AD is 2000 units per for player
+const float BULLET_SPEED = 4000.0f; // AD is 2000 units per for player
const vector BULLET_MINS = '0 0 0'; // let's not change this -- CEV
const vector BULLET_MAXS = '0 0 0'; //
@@ -55,18 +55,18 @@ strip void() projectile_bullet;
// hit something that bleeds
if (other.takedamage)
{
- spawn_touchblood (self.direct_damage);
+ spawn_touchblood (self.dmg);
if (other.bulletcount)
{
// not the first one
- other.bulletcount += self.direct_damage;
+ other.bulletcount += self.dmg;
remove (self);
return;
}
// the first one...
- other.bulletcount = self.direct_damage;
+ other.bulletcount = self.dmg;
// stick around for a little while...
self.velocity = '0 0 0';
@@ -118,11 +118,8 @@ strip void() projectile_bullet;
// avelocity from AD is randomized; fixed for now
e.avelocity = '100 200 0';
- if (!e.proj_basespeed)
- e.proj_basespeed = BULLET_SPEED;
-
- if (!e.direct_damage)
- e.direct_damage = BULLET_DIRECT_DAMAGE;
+ if (!e.dmg)
+ e.dmg = BULLET_DIRECT_DAMAGE;
// AD projectile diamond model
setmodel (e, "progs/ad/proj_diam2.mdl");
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/fireball.qc
diff --git a/qc/projectiles/fireball.qc b/qc/projectiles/fireball.qc
index 1c76cef..f2331f8 100644
--- a/qc/projectiles/fireball.qc
+++ b/qc/projectiles/fireball.qc
@@ -28,7 +28,7 @@ strip void() projectile_fireball;
//--------------------------------------------------------------
void() projectile_fireball_touch =
{
- t_damage2 (other, self, self, self.direct_damage);
+ t_damage2 (other, self, self, self.dmg);
remove (self);
};
@@ -56,11 +56,8 @@ strip void() projectile_fireball;
e.touch = projectile_fireball_touch;
e.angles = vectoangles (e.velocity);
- if (!e.proj_basespeed)
- e.proj_basespeed = FIREBALL_SPEED;
-
- if (!e.direct_damage)
- e.direct_damage = FIREBALL_DIRECT_DAMAGE;
+ if (!e.dmg)
+ e.dmg = FIREBALL_DIRECT_DAMAGE;
setmodel (e, "progs/lavaball.mdl");
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/flak.qc
diff --git a/qc/projectiles/flak.qc b/qc/projectiles/flak.qc
index 051754f..becacf5 100644
--- a/qc/projectiles/flak.qc
+++ b/qc/projectiles/flak.qc
@@ -65,21 +65,20 @@ strip void() projectile_flak;
// hit something that bleeds
if (other.takedamage)
{
- spawn_touchblood (self.direct_damage);
+ spawn_touchblood (self.dmg);
if (other.spikecount)
{
// not the first one
- other.spikecount += self.direct_damage;
+ other.spikecount += self.dmg;
remove (self);
return;
}
- sound (self, CHAN_VOICE, "fish/bite.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_fish_bite)
// the first one...
- other.spikecount = self.direct_damage;
+ other.spikecount = self.dmg;
// stick around for a little while...
self.velocity = '0 0 0';
@@ -110,8 +109,8 @@ strip void() projectile_flak;
// gets weaker with each bounce.
// also stops them getting stuck in world.
- self.direct_damage = self.direct_damage - 5;
- if (self.direct_damage <= 0)
+ self.dmg = self.dmg - 5;
+ if (self.dmg <= 0)
{
remove (self);
return;
@@ -132,8 +131,6 @@ strip void() projectile_flak;
e.velocity = vel;
// parameters for homing
e.homing = src.homing;
- e.proj_speed_mod = src.proj_speed_mod;
- e.waitmin = src.waitmin;
// hack to tell FlakTouch this was spawned by an ogre
if (src.classtype == CT_MONSTER_OGRE)
e.spawnflags |= MONSTER_FLAK_OGRE;
@@ -156,19 +153,15 @@ strip void() projectile_flak;
e.flags = FL_NOSELECT;
e.angles = vectoangles (e.velocity);
- if (!e.proj_basespeed)
- e.proj_basespeed = FLAK_SPEED;
-
- if (!e.direct_damage)
- e.direct_damage = FLAK_DIRECT_DAMAGE;
+ if (!e.dmg)
+ e.dmg = FLAK_DIRECT_DAMAGE;
setmodel (e, "progs/spike.mdl");
e.skin = 0;
if (e.homing > 0)
{
- base_projectile_setup_homing (e,
- e.proj_basespeed * e.proj_speed_mod);
+ base_projectile_setup_homing (e, FLAK_SPEED);
}
else
{
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/grenade.qc
diff --git a/qc/projectiles/grenade.qc b/qc/projectiles/grenade.qc
index 2e78129..b38ce47 100644
--- a/qc/projectiles/grenade.qc
+++ b/qc/projectiles/grenade.qc
@@ -6,8 +6,8 @@
// constants
//======================================================================
-const float GRENADE_DIRECT_DAMAGE = 100;// direct damage; 100 is id1
-const float GRENADE_SPLASH_DAMAGE = 120;// splash damage; 120 is id1
+const float GRENADE_DIRECT_DAMAGE = 75; // 100 is id1 (40 for ogre)
+const float GRENADE_SPLASH_DAMAGE = 75; // 120 is id1
const float GRENADE_SPEED = 600; // id1 grenade speed is 600
const float GRENADE_HEALTH = 50; // explodes when dead
@@ -40,7 +40,7 @@ strip void() projectile_grenade;
return;
self.aflag |= PROJECTILE_DESTROYED;
- self.destroy = sub_nulldestroy;
+ self.th_destroy = sub_nulldestroy;
self.think = sub_null;
self.touch = sub_null;
projectile_grenade_think ();
@@ -52,7 +52,7 @@ strip void() projectile_grenade;
if (self.takedamage)
self.takedamage = DAMAGE_NO;
- t_radiusdamage2 (self, self.owner, self.splash_damage, other);
+ t_radiusdamage2 (self, self.owner, self.dmg_splash, other);
// BecomeExplosion
write_explosion (self.origin);
@@ -107,8 +107,7 @@ strip void() projectile_grenade;
// required because this is only for entities
// which are larger than monster_shambler -- iw
// dmg = this.direct_dmg + random() * 20;
- t_damage2 (other, self, self.owner,
- self.direct_damage);
+ t_damage2 (other, self, self.owner, self.dmg);
projectile_grenade_think ();
return;
}
@@ -120,8 +119,7 @@ strip void() projectile_grenade;
if (self.count < time)
{
// bounce sound
- sound (self, CHAN_WEAPON, "weapons/bounce.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenade_bounce)
}
self.count = time + 0.02;
@@ -137,8 +135,8 @@ strip void() projectile_grenade;
e.origin = org;
e.velocity = vel;
// damage
- e.direct_damage = GRENADE_DIRECT_DAMAGE;
- e.splash_damage = GRENADE_SPLASH_DAMAGE;
+ e.dmg = GRENADE_DIRECT_DAMAGE;
+ e.dmg_splash = GRENADE_SPLASH_DAMAGE;
projectile_grenade_init (e);
return e;
@@ -153,8 +151,9 @@ strip void() projectile_grenade;
e.classtype = CT_PROJECTILE_GRENADE;
e.movetype = MOVETYPE_BOUNCE;
e.solid = SOLID_BBOX;
- // e.destroy = projectile_grenade_destroy;
+ // e.th_destroy = projectile_grenade_destroy;
e.touch = projectile_grenade_touch;
+ e.stateflags |= STATE_PUSHABLE | STATE_TELEPORTABLE;
e.aflag |= PROJECTILE_EXPLOSIVE;
// e.health = GRENADE_HEALTH;
// e.takedamage = DAMAGE_YES;
@@ -163,15 +162,12 @@ strip void() projectile_grenade;
if (!e.avelocity)
e.avelocity = '300 300 300';
- if (!e.proj_basespeed)
- e.proj_basespeed = GRENADE_SPEED;
-
// default damage for player grenades -- CEV
- if (!e.direct_damage)
- e.direct_damage = GRENADE_DIRECT_DAMAGE;
+ if (!e.dmg)
+ e.dmg = GRENADE_DIRECT_DAMAGE;
- if (!e.splash_damage)
- e.splash_damage = GRENADE_SPLASH_DAMAGE;
+ if (!e.dmg_splash)
+ e.dmg_splash = GRENADE_SPLASH_DAMAGE;
setmodel (e, "progs/grenade.mdl");
e.skin = 0;
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/hknightspell.qc
diff --git a/qc/projectiles/hknightspell.qc b/qc/projectiles/hknightspell.qc
index 3adfcf4..85cf750 100644
--- a/qc/projectiles/hknightspell.qc
+++ b/qc/projectiles/hknightspell.qc
@@ -38,11 +38,10 @@ strip void() projectile_hknightspell;
e.enemy = src.enemy;
e.origin = org;
e.velocity = vel;
- e.projexpl = src.projexpl;
+ // was .projexpl -- CEV
+ e.style2 = src.style2;
// parameters for homing
e.homing = src.homing;
- e.proj_speed_mod = src.proj_speed_mod;
- e.waitmin = src.waitmin;
// unique to this magic missile
e.distance = offset;
@@ -62,23 +61,20 @@ strip void() projectile_hknightspell;
e.touch = base_projectile_touch;
e.angles = vectoangles (e.velocity);
- if (base_projectile_parse_projexpl(e.projexpl, e.distance))
+ if (base_projectile_parse_projexpl(e.style2, e.distance))
e.aflag |= PROJECTILE_EXPLOSIVE;
- if (!e.proj_basespeed)
- e.proj_basespeed = HKNSPELL_SPEED;
-
- if (!e.direct_damage)
+ if (!e.dmg)
if (e.aflag & PROJECTILE_EXPLOSIVE)
- e.direct_damage = HKNSPELL_EXPLOD_DAMAGE;
+ e.dmg = HKNSPELL_EXPLOD_DAMAGE;
else
- e.direct_damage = HKNSPELL_DIRECT_DAMAGE;
+ e.dmg = HKNSPELL_DIRECT_DAMAGE;
- if (!e.splash_damage)
+ if (!e.dmg_splash)
if (e.aflag & PROJECTILE_EXPLOSIVE)
- e.splash_damage = HKNSPELL_SPLASH_DAMAGE;
+ e.dmg_splash = HKNSPELL_SPLASH_DAMAGE;
else
- e.splash_damage = 0;
+ e.dmg_splash = 0;
// dumptruck_ds custom_mdls
if (e.aflag & PROJECTILE_EXPLOSIVE)
@@ -90,8 +86,7 @@ strip void() projectile_hknightspell;
if (e.homing > 0)
{
- base_projectile_setup_homing (e,
- e.proj_basespeed * e.proj_speed_mod);
+ base_projectile_setup_homing (e, HKNSPELL_SPEED);
}
else
{
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/laser.qc
diff --git a/qc/projectiles/laser.qc b/qc/projectiles/laser.qc
index f068eac..0c193b9 100644
--- a/qc/projectiles/laser.qc
+++ b/qc/projectiles/laser.qc
@@ -32,16 +32,13 @@ strip void() projectile_laser;
void() projectile_laser_touch =
{
// dumptruck_ds
- sound (self, CHAN_WEAPON, "enforcer/enfstop.wav",
- VOL_HIGH, ATTN_STATIC);
+ SOUND (self, snd_enforcer_fire_hit)
local vector org = self.origin - 8 * normalize (self.velocity);
if (other.health)
{
- spawn_blood (org, self.velocity * 0.2,
- self.direct_damage);
- t_damage2 (other, self, self.owner,
- self.direct_damage);
+ spawn_blood (org, self.velocity * 0.2, self.dmg);
+ t_damage2 (other, self, self.owner, self.dmg);
}
else
{
@@ -65,8 +62,6 @@ strip void() projectile_laser;
e.velocity = vel;
// parameters for homing
e.homing = src.homing;
- e.proj_speed_mod = src.proj_speed_mod;
- e.waitmin = src.waitmin;
projectile_laser_init (e);
return e;
@@ -85,19 +80,15 @@ strip void() projectile_laser;
e.effects = EF_DIMLIGHT;
e.angles = vectoangles (e.velocity);
- if (!e.proj_basespeed)
- e.proj_basespeed = LASER_SPEED;
-
- if (!e.direct_damage)
- e.direct_damage = LASER_DIRECT_DAMAGE;
+ if (!e.dmg)
+ e.dmg = LASER_DIRECT_DAMAGE;
setmodel (e, "progs/laser.mdl");
e.skin = 0;
if (e.homing > 0)
{
- base_projectile_setup_homing (e,
- e.proj_basespeed * e.proj_speed_mod);
+ base_projectile_setup_homing (e, LASER_SPEED);
}
else
{
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/lavaball.qc
diff --git a/qc/projectiles/lavaball.qc b/qc/projectiles/lavaball.qc
index 56ad607..1749cab 100644
--- a/qc/projectiles/lavaball.qc
+++ b/qc/projectiles/lavaball.qc
@@ -39,7 +39,7 @@ strip void() projectile_lavaball;
return;
self.aflag |= PROJECTILE_DESTROYED;
- self.destroy = sub_nulldestroy;
+ self.th_destroy = sub_nulldestroy;
self.think = sub_null;
self.touch = sub_null;
base_projectile_touch ();
@@ -53,11 +53,8 @@ strip void() projectile_lavaball;
e.enemy = src.enemy;
e.origin = org;
e.velocity = vel;
- e.avelocity = src.cust_avelocity;
// parameters for homing
e.homing = src.homing;
- e.proj_speed_mod = src.proj_speed_mod;
- e.waitmin = src.waitmin;
projectile_lavaball_init (e);
return e;
@@ -72,7 +69,7 @@ strip void() projectile_lavaball;
e.classtype = CT_PROJECTILE_LAVABALL;
e.movetype = MOVETYPE_FLYMISSILE;
e.solid = SOLID_BBOX;
- e.destroy = projectile_lavaball_destroy;
+ e.th_destroy = projectile_lavaball_destroy;
e.touch = base_projectile_touch;
e.aflag |= PROJECTILE_EXPLOSIVE;
e.health = LAVABALL_HEALTH;
@@ -83,22 +80,18 @@ strip void() projectile_lavaball;
if (!e.avelocity)
e.avelocity = '200 100 300';
- if (!e.proj_basespeed)
- e.proj_basespeed = LAVABALL_SPEED;
+ if (!e.dmg)
+ e.dmg = LAVABALL_DIRECT_DAMAGE;
- if (!e.direct_damage)
- e.direct_damage = LAVABALL_DIRECT_DAMAGE;
-
- if (!e.splash_damage)
- e.splash_damage = LAVABALL_SPLASH_DAMAGE;
+ if (!e.dmg_splash)
+ e.dmg_splash = LAVABALL_SPLASH_DAMAGE;
setmodel (e, "progs/lavaball.mdl");
e.skin = 0;
if (e.homing > 0)
{
- base_projectile_setup_homing (e,
- e.proj_basespeed * e.proj_speed_mod);
+ base_projectile_setup_homing (e, LAVABALL_SPEED);
}
else
{
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/multigrenade.qc
diff --git a/qc/projectiles/multigrenade.qc b/qc/projectiles/multigrenade.qc
index 3fbbd9f..6ed1b12 100644
--- a/qc/projectiles/multigrenade.qc
+++ b/qc/projectiles/multigrenade.qc
@@ -53,7 +53,7 @@ strip void() projectile_multigrenade;
// removed distinction between player and monster-fired
// minigrenades in favor of a fixed common damage -- CEV
- t_radiusdamage2 (self, self.owner, self.splash_damage, world);
+ t_radiusdamage2 (self, self.owner, self.dmg_splash, world);
// BecomeExplosion
write_explosion2 (self.origin);
@@ -88,8 +88,7 @@ strip void() projectile_multigrenade;
}
// bounce sound
- sound (self, CHAN_WEAPON, "weapons/bounce.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenade_bounce)
if (self.velocity == '0 0 0')
self.avelocity = '0 0 0';
};
@@ -103,7 +102,7 @@ strip void() projectile_multigrenade;
e.origin = org;
e.velocity = vel;
// damage
- e.splash_damage = MININADE_SPLASH_DAMAGE;
+ e.dmg_splash = MININADE_SPLASH_DAMAGE;
projectile_minigrenade_init (e);
return e;
@@ -126,12 +125,8 @@ strip void() projectile_multigrenade;
if (!e.avelocity)
e.avelocity = '300 300 300';
- // reuse grenade speed -- CEV
- // if (!e.proj_basespeed)
- // e.proj_basespeed = GRENADE_SPEED;
-
- if (!e.splash_damage)
- e.splash_damage = MININADE_SPLASH_DAMAGE;
+ if (!e.dmg_splash)
+ e.dmg_splash = MININADE_SPLASH_DAMAGE;
setmodel (e, "progs/mervup.mdl");
e.skin = 0;
@@ -160,7 +155,7 @@ strip void() projectile_multigrenade;
return;
self.aflag |= PROJECTILE_DESTROYED;
- self.destroy = sub_nulldestroy;
+ self.th_destroy = sub_nulldestroy;
self.think = sub_null;
self.touch = sub_null;
projectile_minigrenade_explode ();
@@ -223,8 +218,7 @@ strip void() projectile_multigrenade;
}
// bounce sound
- sound (self, CHAN_WEAPON, "weapons/bounce.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_weapon_grenade_bounce)
if (self.velocity == '0 0 0')
self.avelocity = '0 0 0';
};
@@ -238,7 +232,7 @@ strip void() projectile_multigrenade;
e.origin = org;
e.velocity = vel;
// damage
- e.splash_damage = MULTINADE_SPLASH_DAMAGE;
+ e.dmg_splash = MULTINADE_SPLASH_DAMAGE;
projectile_multigrenade_init (e);
return e;
@@ -253,9 +247,10 @@ strip void() projectile_multigrenade;
e.classtype = CT_PROJECTILE_MULTIGRENADE;
e.movetype = MOVETYPE_BOUNCE;
e.solid = SOLID_BBOX;
- // e.destroy = projectile_multigrenade_destroy;
+ // e.th_destroy = projectile_multigrenade_destroy;
e.think = projectile_multigrenade_think;
e.touch = projectile_multigrenade_touch;
+ e.stateflags |= STATE_PUSHABLE | STATE_TELEPORTABLE;
e.aflag |= PROJECTILE_EXPLOSIVE;
// e.health = MULTINADE_HEALTH;
// e.takedamage = DAMAGE_YES;
@@ -264,12 +259,8 @@ strip void() projectile_multigrenade;
if (!e.avelocity)
e.avelocity = '300 300 300';
- // reuse grenade speed -- CEV
- if (!e.proj_basespeed)
- e.proj_basespeed = GRENADE_SPEED;
-
- if (!e.splash_damage)
- e.splash_damage = MULTINADE_SPLASH_DAMAGE;
+ if (!e.dmg_splash)
+ e.dmg_splash = MULTINADE_SPLASH_DAMAGE;
setmodel (e, "progs/mervup.mdl");
e.skin = 0;
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/rocket.qc
diff --git a/qc/projectiles/rocket.qc b/qc/projectiles/rocket.qc
index 561e999..2a5f96b 100644
--- a/qc/projectiles/rocket.qc
+++ b/qc/projectiles/rocket.qc
@@ -23,8 +23,7 @@ const vector ROCKET_MAXS = '9 4 4';
// projectile_rocket
void(vector dir) projectile_rocket_destroy;
-entity(entity src, vector org, vector vel, optional float projspeed)
- spawn_projectile_rocket;
+entity(entity src, vector org, vector vel) spawn_projectile_rocket;
void(entity e) projectile_rocket_init;
strip void() projectile_rocket;
@@ -40,26 +39,22 @@ strip void() projectile_rocket;
return;
self.aflag |= PROJECTILE_DESTROYED;
- self.destroy = sub_nulldestroy;
+ self.th_destroy = sub_nulldestroy;
self.think = sub_null;
self.touch = sub_null;
base_projectile_touch ();
};
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, optional float projspeed)
- spawn_projectile_rocket =
+ entity(entity src, vector org, vector vel) spawn_projectile_rocket =
{
local entity e = spawn ();
e.owner = src;
e.origin = org;
e.velocity = vel;
// damage
- e.direct_damage = ROCKET_DIRECT_DAMAGE;
- e.splash_damage = ROCKET_SPLASH_DAMAGE;
- // speed
- e.proj_basespeed = projspeed;
- e.proj_speed_mod = src.proj_speed_mod;
+ e.dmg = ROCKET_DIRECT_DAMAGE;
+ e.dmg_splash = ROCKET_SPLASH_DAMAGE;
projectile_rocket_init (e);
return e;
@@ -74,20 +69,18 @@ strip void() projectile_rocket;
e.classtype = CT_PROJECTILE_ROCKET;
e.movetype = MOVETYPE_FLYMISSILE;
e.solid = SOLID_BBOX;
- // e.destroy = projectile_rocket_destroy;
+ // e.th_destroy = projectile_rocket_destroy;
+ e.stateflags |= STATE_TELEPORTABLE;
e.aflag |= PROJECTILE_EXPLOSIVE;
// e.health = ROCKET_HEALTH;
// e.takedamage = DAMAGE_YES;
e.angles = vectoangles (e.velocity);
- if (!e.proj_basespeed)
- e.proj_basespeed = ROCKET_SPEED;
+ if (!e.dmg)
+ e.dmg = ROCKET_DIRECT_DAMAGE;
- if (!e.direct_damage)
- e.direct_damage = ROCKET_DIRECT_DAMAGE;
-
- if (!e.splash_damage)
- e.splash_damage = ROCKET_SPLASH_DAMAGE;
+ if (!e.dmg_splash)
+ e.dmg_splash = ROCKET_SPLASH_DAMAGE;
setmodel (e, "progs/missile.mdl");
e.skin = 0;
@@ -95,8 +88,7 @@ strip void() projectile_rocket;
// homing & missile duration
if (e.homing > 0)
{
- base_projectile_setup_homing (e,
- e.proj_basespeed * e.proj_speed_mod);
+ base_projectile_setup_homing (e, ROCKET_SPEED);
}
else
{
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/spike.qc
diff --git a/qc/projectiles/spike.qc b/qc/projectiles/spike.qc
index f491645..220fb4c 100644
--- a/qc/projectiles/spike.qc
+++ b/qc/projectiles/spike.qc
@@ -21,8 +21,8 @@ const vector SPIKE_MAXS = '0 0 0'; //
//======================================================================
// projectile_spike
-entity(entity src, vector org, vector vel, optional float direct,
- optional float projspeed) spawn_projectile_spike;
+entity(entity src, vector org, vector vel, optional float direct)
+ spawn_projectile_spike;
void(entity e) projectile_spike_init;
strip void() projectile_spike;
@@ -32,20 +32,19 @@ strip void() projectile_spike;
// class projectile_spike: base_projectile
// {
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, optional float direct,
- optional float projspeed) spawn_projectile_spike =
+ entity(entity src, vector org, vector vel, optional float direct)
+ spawn_projectile_spike =
{
local entity e = spawn();
e.owner = src;
e.enemy = src.enemy;
e.origin = org;
e.velocity = vel;
- e.direct_damage = direct;
- e.projexpl = src.projexpl;
+ e.dmg = direct;
+ // was .projexpl -- CEV
+ e.style2 = src.style2;
// homing setup
e.homing = src.homing;
- e.proj_basespeed = projspeed;
- e.proj_speed_mod = src.proj_speed_mod;
projectile_spike_init (e);
return e;
@@ -61,30 +60,27 @@ strip void() projectile_spike;
e.movetype = MOVETYPE_FLYMISSILE;
e.solid = SOLID_BBOX;
e.touch = base_projectile_touch;
- if (base_projectile_parse_projexpl(e.projexpl, 0))
+ if (base_projectile_parse_projexpl(e.style2, 0))
e.aflag |= PROJECTILE_EXPLOSIVE;
e.angles = vectoangles (e.velocity);
- if (!e.proj_basespeed)
- e.proj_basespeed = SPIKE_SPEED;
-
- if (!e.direct_damage)
+ if (!e.dmg)
if (e.aflag & PROJECTILE_EXPLOSIVE)
- e.direct_damage = SPIKE_EXPLOD_DAMAGE;
+ e.dmg = SPIKE_EXPLOD_DAMAGE;
else
- e.direct_damage = SPIKE_NORMAL_DAMAGE;
+ e.dmg = SPIKE_NORMAL_DAMAGE;
- if (!e.splash_damage)
+ if (!e.dmg_splash)
if (e.aflag & PROJECTILE_EXPLOSIVE)
- e.splash_damage = SPIKE_SPLASH_DAMAGE;
+ e.dmg_splash = SPIKE_SPLASH_DAMAGE;
else
- e.splash_damage = 0;
+ e.dmg_splash = 0;
// this is kinda wonky -- CEV
- if (e.direct_damage == SPIKE_SUPER_DAMAGE)
+ if (e.dmg == SPIKE_SUPER_DAMAGE)
// supernail
setmodel (e, "progs/s_spike.mdl");
- else if (e.direct_damage == SPIKE_DUPER_DAMAGE)
+ else if (e.dmg == SPIKE_DUPER_DAMAGE)
// superdupernail
setmodel (e, "progs/lspike.mdl");
else
@@ -95,8 +91,7 @@ strip void() projectile_spike;
if (e.homing > 0)
{
- base_projectile_setup_homing (e,
- e.proj_basespeed * e.proj_speed_mod);
+ base_projectile_setup_homing (e, SPIKE_SPEED);
}
else
{
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/voreball.qc
diff --git a/qc/projectiles/voreball.qc b/qc/projectiles/voreball.qc
index 0fc6378..2a35416 100644
--- a/qc/projectiles/voreball.qc
+++ b/qc/projectiles/voreball.qc
@@ -22,8 +22,7 @@ const vector VOREBALL_MAXS = '16 16 16';
// projectile_voreball
void(vector dir) projectile_voreball_destroy;
void() projectile_voreball_touch;
-entity(entity src, vector org, vector vel, float basespeed)
- spawn_projectile_voreball;
+entity(entity src, vector org, vector vel, float t) spawn_projectile_voreball;
void(entity e) projectile_voreball_init;
strip void() projectile_voreball;
@@ -39,7 +38,7 @@ strip void() projectile_voreball;
return;
self.aflag |= PROJECTILE_DESTROYED;
- self.destroy = sub_nulldestroy;
+ self.th_destroy = sub_nulldestroy;
self.think = sub_null;
self.touch = sub_null;
projectile_voreball_touch ();
@@ -54,14 +53,13 @@ strip void() projectile_voreball;
return;
if (other.classtype == CT_MONSTER_ZOMBIE)
- t_damage2 (other, self, self, self.direct_damage);
+ t_damage2 (other, self, self, self.dmg);
if (self.takedamage)
self.takedamage = DAMAGE_NO;
- t_radiusdamage2 (self, self.owner, self.splash_damage, world);
- sound (self, CHAN_WEAPON, "weapons/r_exp3.wav",
- VOL_HIGH, ATTN_NORM);
+ t_radiusdamage2 (self, self.owner, self.dmg_splash, world);
+ SOUND (self, snd_weapon_rocket_explosion)
// BecomeExplosion
write_explosion (self.origin);
@@ -69,7 +67,7 @@ strip void() projectile_voreball;
};
//--------------------------------------------------------------
- entity(entity src, vector org, vector vel, float basespeed)
+ entity(entity src, vector org, vector vel, float turnspeed)
spawn_projectile_voreball =
{
local entity e = spawn ();
@@ -77,11 +75,9 @@ strip void() projectile_voreball;
e.enemy = src.enemy;
e.origin = org;
e.velocity = vel;
- e.avelocity = src.cust_avelocity;
// homing setup
e.homing = src.homing;
- e.proj_basespeed = basespeed;
- e.proj_speed_mod = src.proj_speed_mod;
+ e.speed2 = turnspeed;
projectile_voreball_init (e);
return e;
@@ -96,8 +92,9 @@ strip void() projectile_voreball;
e.classtype = CT_PROJECTILE_VOREBALL;
e.movetype = MOVETYPE_FLYMISSILE;
e.solid = SOLID_BBOX;
- // e.destroy = projectile_voreball_destroy;
+ // e.th_destroy = projectile_voreball_destroy;
e.touch = projectile_voreball_touch;
+ e.stateflags |= STATE_TELEPORTABLE;
e.aflag |= PROJECTILE_EXPLOSIVE;
// e.health = VOREBALL_HEALTH;
// e.takedamage = DAMAGE_YES;
@@ -107,22 +104,24 @@ strip void() projectile_voreball;
if (!e.avelocity)
e.avelocity = '300 300 300';
- if (!e.proj_basespeed)
- e.proj_basespeed = VOREBALL_SPEED;
+ if (!e.speed)
+ e.speed = VOREBALL_SPEED;
- if (!e.direct_damage)
- e.direct_damage = VOREBALL_DIRECT_DAMAGE;
+ if (!e.speed2)
+ e.speed2 = VOREBALL_SPEED;
- if (!e.splash_damage)
- e.splash_damage = VOREBALL_SPLASH_DAMAGE;
+ if (!e.dmg)
+ e.dmg = VOREBALL_DIRECT_DAMAGE;
+
+ if (!e.dmg_splash)
+ e.dmg_splash = VOREBALL_SPLASH_DAMAGE;
setmodel (e, "progs/v_spike.mdl");
e.skin = 0;
if (e.homing > 0)
{
- base_projectile_setup_homing (e,
- e.proj_basespeed * e.proj_speed_mod);
+ base_projectile_setup_homing (e, e.speed2);
}
else
{
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/wizardspell.qc
diff --git a/qc/projectiles/wizardspell.qc b/qc/projectiles/wizardspell.qc
index 051f995..51438f4 100644
--- a/qc/projectiles/wizardspell.qc
+++ b/qc/projectiles/wizardspell.qc
@@ -51,8 +51,8 @@ strip void() projectile_wizardspell;
{
if (other.takedamage)
{
- spawn_touchblood (self.direct_damage);
- t_damage2 (other, self, self.owner, self.direct_damage);
+ spawn_touchblood (self.dmg);
+ t_damage2 (other, self, self.owner, self.dmg);
}
else
{
@@ -75,13 +75,11 @@ strip void() projectile_wizardspell;
e.enemy = src.enemy;
e.origin = org;
e.velocity = vel;
- e.avelocity = src.cust_avelocity;
- e.proj_basespeed = src.proj_basespeed;
- e.proj_speed_mod = src.proj_speed_mod;
- e.projexpl = src.projexpl;
+ // was .projexpl -- CEV
+ e.style2 = src.style2;
// damage
- // e.direct_damage = direct;
- // e.splash_damage = splash;
+ // e.dmg = direct;
+ // e.dmg_splash = splash;
projectile_wizardmissile_init (e);
return e;
@@ -96,32 +94,28 @@ strip void() projectile_wizardspell;
e.classtype = CT_PROJECTILE_WIZARDMISSILE;
e.movetype = MOVETYPE_FLYMISSILE;
e.solid = SOLID_BBOX;
- if (base_projectile_parse_projexpl(e.projexpl, 0))
+ if (base_projectile_parse_projexpl(e.style2, 0))
e.aflag |= PROJECTILE_EXPLOSIVE;
e.angles = vectoangles (e.velocity);
- if (!e.proj_basespeed)
- e.proj_basespeed = WIZMIS_SPEED;
-
- if (!e.direct_damage)
+ if (!e.dmg)
if (e.aflag & PROJECTILE_EXPLOSIVE)
- e.direct_damage = WIZMIS_EXPLOD_DAMAGE;
+ e.dmg = WIZMIS_EXPLOD_DAMAGE;
else
- e.direct_damage = WIZMIS_DIRECT_DAMAGE;
+ e.dmg = WIZMIS_DIRECT_DAMAGE;
- if (!e.splash_damage)
+ if (!e.dmg_splash)
if (e.aflag & PROJECTILE_EXPLOSIVE)
- e.splash_damage = WIZMIS_EXPLOD_DAMAGE;
+ e.dmg_splash = WIZMIS_EXPLOD_DAMAGE;
else
- e.splash_damage = WIZMIS_SPLASH_DAMAGE;
+ e.dmg_splash = WIZMIS_SPLASH_DAMAGE;
setmodel (e, "progs/w_spike.mdl");
e.skin = 0;
if (e.homing > 0 || e.owner.homing > 0)
{
- base_projectile_setup_homing (e,
- self.proj_basespeed * self.proj_speed_mod);
+ base_projectile_setup_homing (e, WIZMIS_SPEED);
}
else
{
@@ -165,8 +159,7 @@ strip void() projectile_wizardspell;
self.movedir) - self.origin);
// SetSpeed (newmis, vec, projspeed);
- dir *= min (self.proj_basespeed * (self.proj_speed_mod ?
- self.proj_speed_mod : 1), world_maxvelocity);
+ dir *= WIZMIS_SPEED;
spawn_projectile_wizardmissile (
self.owner, self.origin, dir);
@@ -185,9 +178,8 @@ strip void() projectile_wizardspell;
e.enemy = src.enemy;
e.origin = org;
e.movedir = mdir;
- e.proj_basespeed = src.proj_basespeed;
- e.proj_speed_mod = src.proj_speed_mod;
- e.projexpl = src.projexpl;
+ // was .projexpl -- CEV
+ e.style2 = src.style2;
projectile_wizardspell_init (e);
@@ -204,9 +196,6 @@ strip void() projectile_wizardspell;
e.classtype = CT_TEMP_WIZARDSPELL;
e.think = projectile_wizardspell_think;
- if (!e.proj_basespeed)
- e.proj_basespeed = WIZMIS_SPEED;
-
setsize (e, '0 0 0', '0 0 0');
setorigin (e, e.origin);
};
Return to the top of this page or return to the overview of this repo.
Diff qc/projectiles/zombiechunk.qc
diff --git a/qc/projectiles/zombiechunk.qc b/qc/projectiles/zombiechunk.qc
index 221261b..b711791 100644
--- a/qc/projectiles/zombiechunk.qc
+++ b/qc/projectiles/zombiechunk.qc
@@ -39,16 +39,14 @@ strip void() projectile_zombiechunk;
if (other.takedamage)
{
// hardcoded 10 damage -- CEV
- t_damage2 (other, self, self.owner, self.direct_damage);
- sound (self, CHAN_WEAPON, "zombie/z_hit.wav",
- VOL_HIGH, ATTN_NORM);
+ t_damage2 (other, self, self.owner, self.dmg);
+ SOUND (self, snd_zombie_hit)
remove (self);
return;
}
// bounce sound
- sound (self, CHAN_WEAPON, "zombie/z_miss.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (self, snd_zombie_miss)
self.velocity = '0 0 0';
self.avelocity = '0 0 0';
self.touch = sub_remove;
@@ -62,9 +60,8 @@ strip void() projectile_zombiechunk;
e.owner = src;
e.origin = org;
e.velocity = vel;
- e.avelocity = src.cust_avelocity;
// damage
- e.direct_damage = ZCHUNK_DIRECT_DAMAGE;
+ e.dmg = ZCHUNK_DIRECT_DAMAGE;
projectile_zombiechunk_init (e);
return e;
@@ -85,11 +82,8 @@ strip void() projectile_zombiechunk;
if (!e.avelocity)
e.avelocity = '3000 1000 2000';
- if (!e.proj_basespeed)
- e.proj_basespeed = ZCHUNK_SPEED;
-
- if (!e.direct_damage)
- e.direct_damage = ZCHUNK_DIRECT_DAMAGE;
+ if (!e.dmg)
+ e.dmg = ZCHUNK_DIRECT_DAMAGE;
setmodel (e, "progs/zom_gib.mdl");
e.skin = 0;
Return to the top of this page or return to the overview of this repo.
Diff qc/sv_entry.qc
diff --git a/qc/sv_entry.qc b/qc/sv_entry.qc
index 1a2444f..2974ce4 100644
--- a/qc/sv_entry.qc
+++ b/qc/sv_entry.qc
@@ -119,7 +119,7 @@ void() NextLevel =
self.origin, "start");
}
- nextmap = t_level.map;
+ nextmap = t_level.mdl;
gameover = TRUE;
if (t_level.nextthink < time)
@@ -496,7 +496,7 @@ void() RestartLoopSounds =
if (e.spawnflags & 3 == 3)
{
// both "toggle" and "looped" need to be set
- if (e.state == 1)
+ if (!(e.stateflags & STATE_INACTIVE))
{
e.nextthink = time + 0.1;
e.think = RestartLoopSounds_think;
@@ -605,12 +605,12 @@ void() main =
precache_file ("gfx/p_multi.lmp");
// sounds loaded by C code
- precache_sound ("misc/menu1.wav");
- precache_sound ("misc/menu2.wav");
- precache_sound ("misc/menu3.wav");
+ precache_sound (snd_misc_menu1.wav);
+ precache_sound (snd_misc_menu2.wav);
+ precache_sound (snd_misc_menu3.wav);
- precache_sound ("ambience/water1.wav");
- precache_sound ("ambience/wind2.wav");
+ precache_sound (snd_amb_water1.wav);
+ precache_sound (snd_amb_wind2.wav);
// shareware
precache_file ("maps/start.bsp");
@@ -701,7 +701,7 @@ void() ClientDisconnect =
bprint (" left the game with ");
bprint (ftos(self.frags));
bprint (" frags\n");
- sound (self, CHAN_BODY, "player/tornoff2.wav", VOL_HIGH, ATTN_NONE);
+ SOUND (self, snd_player_tornoff2)
if (self.classtype == CT_PLAYER)
player_set_suicide_frame ();
@@ -754,14 +754,14 @@ void() SetNewParms =
parm4 = 0; // self.ammo_shells
parm8 = 1; // self.weapon
- parm11 = ITEM_SEQ_AXE; // self.inventory1
- parm12 = 0; // self.inventory2
- parm13 = 0; // self.inventory3
- parm14 = 0; // self.inventory4
- parm15 = 0; // self.inventory5
- parm16 = 0; // self.inventory6
- parm17 = 0; // self.inventory7
- parm18 = 0; // self.inventory8
+ parm11 = ITEM_SEQ_AXE; // self.item[0]
+ parm12 = 0; // self.item[1]
+ parm13 = 0; // self.item[2]
+ parm14 = 0; // self.item[3]
+ parm15 = 0; // self.item[4]
+ parm16 = 0; // self.item[5]
+ parm17 = 0; // self.item[6]
+ parm18 = 0; // self.item[7]
}
else
{
@@ -769,14 +769,14 @@ void() SetNewParms =
parm4 = 25; // self.ammo_shells
parm8 = 2; // self.weapon
- parm11 = ITEM_SEQ_AXE; // self.inventory1
- parm12 = ITEM_SEQ_SHOTGUN; // self.inventory2
- parm13 = 0; // self.inventory3
- parm14 = 0; // self.inventory4
- parm15 = 0; // self.inventory5
- parm16 = 0; // self.inventory6
- parm17 = 0; // self.inventory7
- parm18 = 0; // self.inventory8
+ parm11 = ITEM_SEQ_AXE; // self.item[0]
+ parm12 = ITEM_SEQ_SHOTGUN; // self.item[1]
+ parm13 = 0; // self.item[2]
+ parm14 = 0; // self.item[3]
+ parm15 = 0; // self.item[4]
+ parm16 = 0; // self.item[5]
+ parm17 = 0; // self.item[6]
+ parm18 = 0; // self.item[7]
}
};
@@ -812,14 +812,14 @@ void() SetChangeParms =
parm9 = self.armortype * 100;
// player inventory -- CEV
- parm11 = self.inventory1;
- parm12 = self.inventory2;
- parm13 = self.inventory3;
- parm14 = self.inventory4;
- parm15 = self.inventory5;
- parm16 = self.inventory6;
- parm17 = self.inventory7;
- parm18 = self.inventory8;
+ parm11 = self.item[0];
+ parm12 = self.item[1];
+ parm13 = self.item[2];
+ parm14 = self.item[3];
+ parm15 = self.item[4];
+ parm16 = self.item[5];
+ parm17 = self.item[6];
+ parm18 = self.item[7];
};
//----------------------------------------------------------------------
Return to the top of this page or return to the overview of this repo.
Diff qc/sv_progs.src
diff --git a/qc/sv_progs.src b/qc/sv_progs.src
index 2089bff..cd555a6 100644
--- a/qc/sv_progs.src
+++ b/qc/sv_progs.src
@@ -15,6 +15,7 @@ defs_fields.qc // id1 entvars_t
defs_builtins.qc // id1 / FTE builtin functions (& overrides)
defs_const.qc // id1 & pd3 common constants
defs_ctypes.qc // global class list
+defs_sounds.qc // global sound definitions
defs_items.qc // global item definitions
//----------------------------------------------------------------------
@@ -71,13 +72,12 @@ projectiles/zombiechunk.qc // id1 zombie flesh chunk (traditionally thrown)
//----------------------------------------------------------------------
items/ammo.qc // ammo; was in items.qc
items/armor.qc // armor; was in items.qc
-items/debris.qc // debris from breakables
-items/gore.qc // gore; was base_gore.qc; was elsewhere in id1
items/keys.qc // key pickups; contains items.qc and keydata.qc
items/health.qc // health; was in items.qc
+items/lights.qc // portable lights
items/powerups.qc // envirosuit, pent, ring, quad; was in items.qc
items/runes.qc // end-of-episode runes; was in items.qc
-items/walltorch.qc // id1 light_torch_small_walltorch
+items/throwables.qc // id1 heads & gibs, various debris
items/weapons.qc // weapon pickups; was in items.qc
items/backpacks.qc // backpack code; was in items.qc
@@ -127,6 +127,7 @@ func/episodegate.qc // was misc.qc -- CEV
func/explobox.qc // selections from Rubicon2 QC
func/fall.qc // Renny's original version
func/fall2.qc // Renny's improved version.
+func/hurt.qc // MG1 func_hurt
func/illusionary.qc // was misc.qc -- CEV
func/laser.qc // selections from Rubicon2 QC
func/monster_spawner.qc // "bot" creation code for func_monster_spawner
@@ -136,6 +137,7 @@ func/plat.qc // was plats.qc -- CEV
func/rotate.qc // from Hipnotic thanks RennyC; was rotate.qc
func/togglevisiblewall.qc // was misc.qc -- CEV
func/togglewall.qc // was hippart.qc -- CEV
+func/toss.qc // mg1 func_toss
func/train.qc // was plats.qc -- CEV
//----------------------------------------------------------------------
@@ -162,6 +164,7 @@ triggers/onlyregistered.qc // id1
triggers/push.qc // wind/push brushes, jumppads -- CEV
// triggers/remove.qc // was in hip_trig.qc; currently disabled -- CEV
triggers/relay.qc //
+triggers/repeater.qc // MG1 trigger_repeater -- CEV
triggers/secret.qc //
triggers/setcount.qc // target_setcount
triggers/setgravity.qc // was in hip_trig.qc
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/changelevel.qc
diff --git a/qc/triggers/changelevel.qc b/qc/triggers/changelevel.qc
index 3fc9ad6..ae64367 100644
--- a/qc/triggers/changelevel.qc
+++ b/qc/triggers/changelevel.qc
@@ -37,6 +37,7 @@ void() trigger_changelevel_think;
void() trigger_changelevel_touch;
void() trigger_changelevel_use;
entity(entity src, vector org, string m) spawn_trigger_changelevel;
+void(string key, string value) trigger_changelevel_init_field;
void(entity e) trigger_changelevel_init;
void() trigger_changelevel;
#endif
@@ -131,7 +132,7 @@ When the player touches this, he gets sent to the map listed in the "map" variab
bprint (" exited the level\n");
}
- nextmap = self.map;
+ nextmap = self.mdl;
sub_usetargets ();
if (deathmatch == 0)
@@ -167,15 +168,17 @@ When the player touches this, he gets sent to the map listed in the "map" variab
//--------------------------------------------------------------
void() trigger_changelevel_use =
{
- if (self.estate != STATE_ACTIVE)
+ // it's weird to toggle WAITING with INACTIVE here but it's
+ // what dt_exit_toggle did in PD3 so copy the behavior -- CEV
+ if (self.stateflags & STATE_INACTIVE)
{
- self.is_waiting = 0;
- self.estate = STATE_ACTIVE;
+ self.stateflags &= ~STATE_WAITING;
+ self.stateflags &= ~STATE_INACTIVE;
}
else
{
- self.is_waiting = 1;
- self.estate = STATE_INACTIVE;
+ self.stateflags |= STATE_WAITING;
+ self.stateflags |= STATE_INACTIVE;
}
};
@@ -185,13 +188,28 @@ When the player touches this, he gets sent to the map listed in the "map" variab
local entity e = spawn ();
e.owner = src;
e.origin = org;
- e.map = m;
+ e.mdl = m;
trigger_changelevel_init (e);
return e;
};
//--------------------------------------------------------------
+ void(string key, string value) trigger_changelevel_init_field =
+ {
+ switch (key)
+ {
+ case "is_waiting":
+ if (stof(value))
+ self.stateflags |= STATE_WAITING;
+ break;
+ case "map":
+ self.mdl = value;
+ break;
+ }
+ };
+
+ //--------------------------------------------------------------
void(entity e) trigger_changelevel_init =
{
e.classname = "trigger_changelevel";
@@ -202,11 +220,11 @@ When the player touches this, he gets sent to the map listed in the "map" variab
// dumptruck_ds
if (e.spawnflags & SPAWNFLAG_TRIGGER_CHANGELEVEL_EXITOFF)
- e.is_waiting = 1;
+ e.stateflags |= STATE_WAITING;
sub_checkwaiting (e);
- if (!e.map)
+ if (!e.mdl)
objerror ("changelevel trigger doesn't have map");
base_trigger_init (e);
@@ -217,10 +235,7 @@ When the player touches this, he gets sent to the map listed in the "map" variab
//--------------------------------------------------------------
void() trigger_changelevel =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (trigger_changelevel_init_field)
trigger_changelevel_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/changemusic.qc
diff --git a/qc/triggers/changemusic.qc b/qc/triggers/changemusic.qc
index 82d9427..7e23d5f 100644
--- a/qc/triggers/changemusic.qc
+++ b/qc/triggers/changemusic.qc
@@ -119,10 +119,7 @@ A trigger brush that changes the currently playing music track. The number of th
//--------------------------------------------------------------
void() trigger_changemusic =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_changemusic_init (self);
};
// };
@@ -178,10 +175,7 @@ NOTE: the track number uses the count key here but trigger_changemusic uses the
//--------------------------------------------------------------
void() trigger_cdtrack =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_cdtrack_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/changetarget.qc
diff --git a/qc/triggers/changetarget.qc b/qc/triggers/changetarget.qc
index 39132ab..343f498 100644
--- a/qc/triggers/changetarget.qc
+++ b/qc/triggers/changetarget.qc
@@ -31,7 +31,7 @@ cnt = target field to change, null defaults to target
//--------------------------------------------------------------
void() trigger_changetarget_use =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
for (entity e = world;
@@ -76,9 +76,14 @@ cnt = target field to change, null defaults to target
//--------------------------------------------------------------
void() trigger_changetarget =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
+
+ // support for MachineGames Dimension Of The Machine -- CEV
+ if (known_release == KNOWN_RELEASE_MG1)
+ {
+ self.message = self.killtarget;
+ self.killtarget = "";
+ }
trigger_changetarget_init (self);
};
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/counter.qc
diff --git a/qc/triggers/counter.qc b/qc/triggers/counter.qc
index 85de325..a74f8ff 100644
--- a/qc/triggers/counter.qc
+++ b/qc/triggers/counter.qc
@@ -36,6 +36,14 @@ void(entity e) trigger_counter_init;
void() trigger_counter;
#endif
+#ifdef SSQC
+// trigger_counter_timed
+void() trigger_counter_timed_think;
+void() trigger_counter_timed_use;
+void(entity e) trigger_counter_timed_init;
+void() trigger_counter_timed;
+#endif
+
//------------------------------------------------------------------------------
#ifdef SSQC
@@ -53,14 +61,14 @@ After the counter has been triggered "count" times (default 2), it will fire all
//--------------------------------------------------------------
void() trigger_counter_use =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
self.count -= 1;
if (self.count < 0)
return;
- if (self.count != 0)
+ if (self.count)
{
if (activator.classtype == CT_PLAYER &&
(!(self.spawnflags &
@@ -112,11 +120,101 @@ After the counter has been triggered "count" times (default 2), it will fire all
//--------------------------------------------------------------
void() trigger_counter =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_counter_init (self);
};
// };
#endif
+
+#ifdef SSQC
+/*QUAKED trigger_counter_timed (.5 .5 .5) ? nomessage message_all
+Acts as an intermediary for an action that takes multiple inputs.
+
+If nomessage is not set, t will print "1 more.. " etc when triggered and "sequence complete" when finished.
+
+After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself.
+*/
+//----------------------------------------------------------------------
+// class trigger_counter_timed: base_multiple
+// {
+ //--------------------------------------------------------------
+ void() trigger_counter_timed_think =
+ {
+ self.count = self.cnt;
+ };
+
+ //--------------------------------------------------------------
+ void() trigger_counter_timed_use =
+ {
+ self.count -= 1;
+
+ if (self.count < 0)
+ return;
+
+ self.nextthink = time + self.delay;
+
+ if (self.count)
+ {
+ if (activator.classtype == CT_PLAYER &&
+ (!(self.spawnflags &
+ SPAWNFLAG_TRIGGER_COUNTER_NOMESSAGE)))
+ {
+ if (self.count >= 4)
+ centerprint (activator,
+ "There are more to go...");
+ else if (self.count == 3)
+ centerprint (activator,
+ "Only 3 more to go...");
+ else if (self.count == 2)
+ centerprint (activator,
+ "Only 2 more to go...");
+ else
+ centerprint (activator,
+ "Only 1 more to go...");
+ }
+ return;
+ }
+
+ if (activator.classtype == CT_PLAYER && (!(self.spawnflags &
+ SPAWNFLAG_TRIGGER_COUNTER_NOMESSAGE)))
+ {
+ centerprint (activator, "Sequence completed!");
+ }
+
+ self.enemy = activator;
+ self.delay = 0;
+ self.nextthink = -1;
+ self.think = sub_null;
+ base_multiple_fire ();
+ base_entity_remove (self);
+ };
+
+ //--------------------------------------------------------------
+ void(entity e) trigger_counter_timed_init =
+ {
+ e.classname = "trigger_counter_timed";
+ e.classtype = CT_TRIGGER_COUNTER_TIMED;
+
+ e.wait = -1;
+ if (!e.count)
+ e.count = 2;
+
+ if (!e.delay)
+ e.delay = 2;
+
+ e.cnt = e.count;
+ e.think = trigger_counter_timed_think;
+ e.use = trigger_counter_timed_use;
+
+ // might need to be base_mapentity_init -- CEV
+ base_trigger_init (e);
+ };
+
+ //--------------------------------------------------------------
+ void() trigger_counter_timed =
+ {
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
+ trigger_counter_timed_init (self);
+ };
+// }
+#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/cvarset.qc
diff --git a/qc/triggers/cvarset.qc b/qc/triggers/cvarset.qc
index 980ecbf..a9c185e 100644
--- a/qc/triggers/cvarset.qc
+++ b/qc/triggers/cvarset.qc
@@ -85,10 +85,7 @@ sv_gravity, sv_friction, fov, and v_idlescale.
//--------------------------------------------------------------
void() trigger_cvarset =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_cvarset_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/everything.qc
diff --git a/qc/triggers/everything.qc b/qc/triggers/everything.qc
index 5192bb1..3600b15 100644
--- a/qc/triggers/everything.qc
+++ b/qc/triggers/everything.qc
@@ -24,7 +24,7 @@ void() trigger_everything;
//--------------------------------------------------------------
void() trigger_everything_touch =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
if (time < self.attack_finished)
@@ -52,10 +52,7 @@ void() trigger_everything;
//--------------------------------------------------------------
void() trigger_everything =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_everything_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/explosion.qc
diff --git a/qc/triggers/explosion.qc b/qc/triggers/explosion.qc
index b8ef444..4ea8488 100644
--- a/qc/triggers/explosion.qc
+++ b/qc/triggers/explosion.qc
@@ -85,10 +85,7 @@ void() trigger_explosion;
//--------------------------------------------------------------
void() trigger_explosion =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_explosion_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/filter.qc
diff --git a/qc/triggers/filter.qc b/qc/triggers/filter.qc
index d14d08c..4ae9821 100644
--- a/qc/triggers/filter.qc
+++ b/qc/triggers/filter.qc
@@ -96,9 +96,9 @@ void() trigger_filter;
//--------------------------------------------------------------
void() trigger_filter_use =
{
- self.state = 0;
+ self.moveflags = 0;
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
local entity targ;
@@ -128,12 +128,12 @@ void() trigger_filter;
{
case TRIGGER_FILTER_FIELD_STATE:
fieldtype = TRIGGER_FILTER_FIELDTYPE_FLOAT;
- targfloat = targ.state;
+ targfloat = targ.moveflags;
break;
case TRIGGER_FILTER_FIELD_ESTATE:
fieldtype = TRIGGER_FILTER_FIELDTYPE_FLOAT;
- targfloat = targ.estate;
+ targfloat = targ.stateflags;
break;
case TRIGGER_FILTER_FIELD_HEALTH:
@@ -270,7 +270,7 @@ void() trigger_filter;
if (result)
{
- self.state = 1;
+ self.moveflags = 1;
// relay activator as owner
if (activator.owner && self.spawnflags &
@@ -301,10 +301,7 @@ void() trigger_filter;
//--------------------------------------------------------------
void() trigger_filter =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_filter_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/fog.qc
diff --git a/qc/triggers/fog.qc b/qc/triggers/fog.qc
index 9b00c1a..ce29e67 100644
--- a/qc/triggers/fog.qc
+++ b/qc/triggers/fog.qc
@@ -42,7 +42,6 @@ typedef enumflags
} base_fog_spawnflags;
#endif
-
#ifdef SSQC
const float FOG_INTERVAL = 0.04166667; // 1/24;
#endif
@@ -52,9 +51,12 @@ const float FOG_INTERVAL = 0.04166667; // 1/24;
//======================================================================
#if defined(CSQC) || defined(SSQC)
-.vector fog_color, fog_color2; // progs_dump fog
-.float fog_density, fog_density2;
-.float skyfog_density, skyfog_density2;
+.vector fog_color; // progs_dump fog
+.vector fog_color2;
+.float fog_density;
+.float fog_density2;
+.float skyfog_density;
+.float skyfog_density2;
.entity fogblend_entity;
.string fog_info_entity; // MG1 fog
#endif
@@ -451,7 +453,7 @@ void(entity client, float sTo, float f) skyfog_blend_set_fraction =
else
{
self.nextthink = time + FOG_INTERVAL;
- if (self.state && self.speed)
+ if (self.aflag && self.speed)
f = 1 - (self.pain_finished - time) /
self.speed;
else if (self.speed2)
@@ -461,7 +463,7 @@ void(entity client, float sTo, float f) skyfog_blend_set_fraction =
f = 1;
}
- if (self.state)
+ if (self.aflag)
{
dTo = self.fog_density2;
cTo = self.fog_color2;
@@ -551,7 +553,7 @@ void(entity client, float sTo, float f) skyfog_blend_set_fraction =
local entity e = spawn ();
e.owner = own;
e.enemy = nme;
- // speed2 is used when state is 0
+ // speed2 is used when aflag is 0
e.speed2 = own.speed;
e.fog_color = own.fog_color;
e.fog_density = own.fog_density;
@@ -621,9 +623,9 @@ Activator's fog will be blended over time from start to end values.
return;
if (!(self.spawnflags & SPAWNFLAG_BASE_FOG_ONEWAY))
- self.state = 1 - self.state;
+ self.aflag = 1 - self.aflag;
- if (self.state)
+ if (self.aflag)
self.pain_finished = time + self.delay + self.speed;
else
self.pain_finished = time + self.delay + self.speed2;
@@ -690,12 +692,12 @@ Activator's fog will be blended over time from start to end values.
}
if (e.spawnflags & SPAWNFLAG_BASE_FOG_REVERSE)
- e.state = 1;
+ e.aflag = 1;
else
- e.state = 0;
+ e.aflag = 0;
if (e.spawnflags & SPAWNFLAG_BASE_FOG_ONEWAY)
- e.state = 1 - e.state;
+ e.aflag = 1 - e.aflag;
if (!e.speed)
e.speed = 1;
@@ -711,10 +713,7 @@ Activator's fog will be blended over time from start to end values.
//--------------------------------------------------------------
void() target_fogblend =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
target_fogblend_init (self);
};
// };
@@ -751,13 +750,13 @@ Acts as a smoothly blending portal between two zones of different fog. Sets the
//--------------------------------------------------------------
void() trigger_fogblend_touch =
{
- if (other.classtype != CT_PLAYER)
+ if (self.stateflags & STATE_INACTIVE)
return;
- if (other.health <= 0)
+ if (other.classtype != CT_PLAYER)
return;
- if (self.estate != STATE_ACTIVE)
+ if (other.health <= 0)
return;
// fix for only first client getting a fog change when
@@ -877,10 +876,7 @@ Acts as a smoothly blending portal between two zones of different fog. Sets the
//--------------------------------------------------------------
void() trigger_fogblend =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_fogblend_init (self);
};
// };
@@ -934,10 +930,12 @@ style: Which axis this trigger fades across. 0 = X, 1 = Y, 2 = Z
f = find (world, targetname, self.fog_info_entity);
if (f.classtype == CT_INFO_FOG)
{
+ #if 0
dprint (sprintf("trigger_fog_transition_"
"think: found info_fog, density "
"%g, color %v\n",
f.fog_density, f.fog_color));
+ #endif
self.fog_density = f.fog_density;
self.fog_color = f.fog_color;
}
@@ -954,10 +952,12 @@ style: Which axis this trigger fades across. 0 = X, 1 = Y, 2 = Z
t = find (world, targetname, self.target);
if (t.classtype == CT_INFO_FOG)
{
+ #if 0
dprint (sprintf("trigger_fog_transition_"
"think: found info_fog target, "
"density %g, color %v\n",
t.fog_density, t.fog_color));
+ #endif
self.fog_density2 = t.fog_density;
self.fog_color2 = t.fog_color;
}
@@ -996,10 +996,7 @@ style: Which axis this trigger fades across. 0 = X, 1 = Y, 2 = Z
//--------------------------------------------------------------
void() trigger_fog_transition =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_fog_transition_init (self);
};
// };
@@ -1021,7 +1018,7 @@ CAVEATS:
//--------------------------------------------------------------
void() trigger_fog_touch =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
if (!(other.flags & FL_CLIENT))
@@ -1057,9 +1054,11 @@ CAVEATS:
f = find (world, targetname, self.fog_info_entity);
if (f.classtype == CT_INFO_FOG)
{
+ #if 0
dprint (sprintf("trigger_fog_think_mg1: found "
"info_fog, density %g, color %v\n",
f.fog_density, f.fog_color));
+ #endif
self.fog_density = f.fog_density;
self.fog_color = f.fog_color;
}
@@ -1123,9 +1122,7 @@ CAVEATS:
//--------------------------------------------------------------
void() trigger_fog =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
// rewrite NOTOUCH spawnflag for MG1 fog entities -- CEV
if (known_release == KNOWN_RELEASE_MG1) {
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/heal.qc
diff --git a/qc/triggers/heal.qc b/qc/triggers/heal.qc
index 16acb2b..9b95ec2 100644
--- a/qc/triggers/heal.qc
+++ b/qc/triggers/heal.qc
@@ -102,7 +102,7 @@ message2 -- message to print when exhausted
//--------------------------------------------------------------
void() trigger_heal_touch =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
// from Copper -- dumptruck_ds
@@ -144,11 +144,14 @@ message2 -- message to print when exhausted
if ((other.takedamage) && (other.health < self.health_max))
{
if (self.noise != "")
+ {
sound (self, CHAN_AUTO, self.noise,
VOL_HIGH, ATTN_NORM);
+ }
else
- sound (self, CHAN_AUTO, "items/r_item1.wav",
- VOL_HIGH, ATTN_NORM);
+ {
+ SOUND (self, snd_item_health_rott)
+ }
local float calc_healing;
@@ -202,9 +205,10 @@ message2 -- message to print when exhausted
e.classtype = CT_TRIGGER_HEAL;
// play custom sound for healing if noise key exists
- precache_sound ("items/r_item1.wav");
- if (e.noise != "")
+ if (e.noise != __NULL__ && e.noise != "")
precache_sound (e.noise);
+ else
+ precache_sound (snd_item_health_rott.wav);
base_trigger_init (e);
@@ -248,10 +252,7 @@ message2 -- message to print when exhausted
//--------------------------------------------------------------
void() trigger_heal =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_heal_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/hurt.qc
diff --git a/qc/triggers/hurt.qc b/qc/triggers/hurt.qc
index 4003a02..10a63a7 100644
--- a/qc/triggers/hurt.qc
+++ b/qc/triggers/hurt.qc
@@ -6,10 +6,10 @@
// fields
//======================================================================
-#ifdef SSQC
+#if 0
// 1998-07-03 hurt_touch fix by Robert Field start
-.float hurt_together_time;
-.float hurt_nextthink;
+// .float hurt_together_time; // changed to .movetimer -- CEV
+// .float hurt_nextthink; // changed to .delay -- CEV
// 1998-07-03 hurt_touch fix by Robert Field end
#endif
@@ -50,21 +50,21 @@ defalt dmg = 5
e.nextthink = -1;
};
+ #if 0
//--------------------------------------------------------------
// 1998-07-03 hurt_touch fix by Robert Field start
- /*
void() trigger_hurt_on =
{
self.solid = SOLID_TRIGGER;
self.nextthink = -1;
};
- */
// 1998-07-03 hurt_touch fix by Robert Field end
+ #endif
//--------------------------------------------------------------
void() trigger_hurt_touch =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
// from Copper -- dumptruck_ds
@@ -73,19 +73,23 @@ defalt dmg = 5
if (other.takedamage && self.nextthink < time)
{
+ #if 0
// 1998-07-03 trigger_hurt_touch fix by Robert Field
- // self.solid = SOLID_NOT;
if (time != self.hurt_together_time)
if (time < self.hurt_nextthink)
return;
- // 1998-07-03 hurt_touch fix by Robert Field end
t_damage2 (other, self, self, self.dmg);
- // 1998-07-03 hurt_touch fix by Robert Field start
- // self.think = hurt_on;
- // self.nextthink = time + 1;
self.hurt_together_time = time;
self.hurt_nextthink = time + 1;
- // 1998-07-03 trigger_hurt_touch fix by Robert Field end
+ // 1998-07-03 trigger_hurt_touch fix by Robert Field end
+ #endif
+
+ if (time != self.movetimer)
+ if (time < self.delay)
+ return;
+ t_damage2 (other, self, self, self.dmg);
+ self.movetimer = time;
+ self.delay = time + 1;
}
return;
@@ -109,10 +113,7 @@ defalt dmg = 5
//--------------------------------------------------------------
void() trigger_hurt =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_hurt_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/ladder.qc
diff --git a/qc/triggers/ladder.qc b/qc/triggers/ladder.qc
index ab09ed6..54ff7af 100644
--- a/qc/triggers/ladder.qc
+++ b/qc/triggers/ladder.qc
@@ -3,28 +3,6 @@
//==============================================================================
//======================================================================
-// constants
-//======================================================================
-
-#if defined(CSQC) || defined(SSQC)
-//----------------------------------------------------------------------
-// trigger_ladder netflags; should be able to do this in 8 bits -- CEV
-//----------------------------------------------------------------------
-typedef enumflags
-{
- NETFLAG_TRIGGER_LADDER_STATE = NETFLAG_BASE_TRIGGER_STATE,
- NETFLAG_TRIGGER_LADDER_ESTATE = NETFLAG_BASE_TRIGGER_ESTATE,
- NETFLAG_TRIGGER_LADDER_SIZE,
- NETFLAG_TRIGGER_LADDER_ANGLES,
- NETFLAG_TRIGGER_LADDER_MOVEDIR
-} trigger_ladder_netflags;
-
-const float NETFLAG_TRIGGER_LADDER_FULLSEND = NETFLAG_TRIGGER_LADDER_SIZE |
- NETFLAG_TRIGGER_LADDER_ANGLES | NETFLAG_TRIGGER_LADDER_MOVEDIR |
- NETFLAG_TRIGGER_LADDER_ESTATE;
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -60,41 +38,22 @@ Keys:
{
local float netflags = ReadByte ();
- if (netflags & NETFLAG_TRIGGER_LADDER_STATE)
- self.state = ReadByte ();
-
- if (netflags & NETFLAG_TRIGGER_LADDER_ESTATE)
- self.estate = ReadByte ();
-
- if (netflags & NETFLAG_TRIGGER_LADDER_SIZE)
- {
- self.mins_x = ReadCoord ();
- self.mins_y = ReadCoord ();
- self.mins_z = ReadCoord ();
- self.maxs_x = ReadCoord ();
- self.maxs_y = ReadCoord ();
- self.maxs_z = ReadCoord ();
- }
+ BASE_TRIGGER_READSTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_READSIZE (NETFLAG_BASE_TRIGGER_SIZE)
+ BASE_TRIGGER_READMOVEDIR (NETFLAG_BASE_TRIGGER_MOVEDIR)
- if (netflags & NETFLAG_TRIGGER_LADDER_ANGLES)
+ if (netflags & NETFLAG_BASE_TRIGGER_RESERVED1)
{
self.angles_x = ReadAngle ();
self.angles_y = ReadAngle ();
self.angles_z = ReadAngle ();
}
- if (netflags & NETFLAG_TRIGGER_LADDER_MOVEDIR)
- {
- self.movedir_x = ReadAngle ();
- self.movedir_y = ReadAngle ();
- self.movedir_z = ReadAngle ();
- }
-
if (isnew)
trigger_ladder_init (self);
// make sure size is set -- CEV
- if (netflags & NETFLAG_TRIGGER_LADDER_SIZE)
+ if (netflags & NETFLAG_BASE_TRIGGER_SIZE)
setsize (self, self.mins, self.maxs);
};
#endif
@@ -103,41 +62,22 @@ Keys:
//--------------------------------------------------------------
float(entity to, float netflags) trigger_ladder_netsend =
{
- WriteByte (MSG_ENTITY, self.classtype);
+ BASE_ENTITY_WRITECLASSTYPE ()
- if (netflags > NETFLAG_TRIGGER_LADDER_FULLSEND)
- netflags = NETFLAG_TRIGGER_LADDER_FULLSEND;
+ if (netflags > NETFLAG_BASE_TRIGGER_FULLSEND)
+ netflags = NETFLAG_BASE_TRIGGER_FULLSEND;
WriteByte (MSG_ENTITY, netflags);
- if (netflags & NETFLAG_TRIGGER_LADDER_STATE)
- WriteByte (MSG_ENTITY, self.state);
+ BASE_TRIGGER_WRITESTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_WRITESIZE (NETFLAG_BASE_TRIGGER_SIZE)
+ BASE_TRIGGER_WRITEMOVEDIR (NETFLAG_BASE_TRIGGER_MOVEDIR)
- if (netflags & NETFLAG_TRIGGER_LADDER_ESTATE)
- WriteByte (MSG_ENTITY, self.estate);
-
- if (netflags & NETFLAG_TRIGGER_LADDER_SIZE)
+ if (netflags & NETFLAG_BASE_TRIGGER_RESERVED1)
{
- WriteCoord (MSG_ENTITY, self.mins_x);
- WriteCoord (MSG_ENTITY, self.mins_y);
- WriteCoord (MSG_ENTITY, self.mins_z);
- WriteCoord (MSG_ENTITY, self.maxs_x);
- WriteCoord (MSG_ENTITY, self.maxs_y);
- WriteCoord (MSG_ENTITY, self.maxs_z);
- }
-
- if (netflags & NETFLAG_TRIGGER_LADDER_ANGLES)
- {
- WriteAngle (MSG_ENTITY, self.angles_x);
- WriteAngle (MSG_ENTITY, self.angles_y);
- WriteAngle (MSG_ENTITY, self.angles_z);
- }
-
- if (netflags & NETFLAG_TRIGGER_LADDER_MOVEDIR)
- {
- WriteAngle (MSG_ENTITY, self.movedir_x);
- WriteAngle (MSG_ENTITY, self.movedir_y);
- WriteAngle (MSG_ENTITY, self.movedir_z);
+ WriteAngle (MSG_ENTITY, self.angles.x);
+ WriteAngle (MSG_ENTITY, self.angles.y);
+ WriteAngle (MSG_ENTITY, self.angles.z);
}
return TRUE;
@@ -150,6 +90,9 @@ Keys:
//--------------------------------------------------------------
void() trigger_ladder_touch =
{
+ if (self.stateflags & STATE_INACTIVE)
+ return;
+
// from Copper -- dumptruck_ds
if (sub_checkvalidtouch(other) == FALSE)
return;
@@ -180,7 +123,7 @@ Keys:
}
// changed to PMFLAGS -- CEV
- other.pm_flags |= PMF_ONLADDER;
+ other.moveflags |= PMF_ONLADDER;
};
#endif
@@ -212,7 +155,7 @@ Keys:
// trigger_ladder needs to be networked to the client. set
// our transmit function then full send the entity -- CEV
e.SendEntity = trigger_ladder_netsend;
- e.SendFlags |= NETFLAG_TRIGGER_LADDER_FULLSEND;
+ e.SendFlags |= NETFLAG_BASE_TRIGGER_FULLSEND;
#endif
};
#endif
@@ -221,10 +164,7 @@ Keys:
//--------------------------------------------------------------
void() trigger_ladder =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_ladder_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/look.qc
diff --git a/qc/triggers/look.qc b/qc/triggers/look.qc
index d25f2e8..3db908c 100644
--- a/qc/triggers/look.qc
+++ b/qc/triggers/look.qc
@@ -60,7 +60,7 @@ See manual for complete details. See pd_cutscenes sample map for example
traceline (player_offset,
(player_offset + (v_forward * self.speed)),
- FALSE, other);
+ FALSE, other);
if (trace_ent.targetname == self.target)
{
@@ -71,12 +71,25 @@ See manual for complete details. See pd_cutscenes sample map for example
self.use = trigger_look_use;
sub_usetargets ();
- if (self.noise != "")
- sound (self, CHAN_VOICE, self.noise,
- VOL_HIGH, ATTN_NORM);
- else
- sound (self, CHAN_VOICE, self.noise1,
- VOL_HIGH, ATTN_NORM);
+ if (self.noise != __NULL__ && self.noise != "")
+ {
+ sound (self, CHAN_VOICE, self.noise,
+ VOL_HIGH, ATTN_NORM);
+ }
+ else
+ {
+ local sound_info_t snd = snd_empty;
+
+ switch (self.sounds)
+ {
+ case 0: snd = snd_null; break;
+ case 1: snd = snd_misc_secret; break;
+ case 2: snd = snd_misc_talk; break;
+ case 3: snd = snd_misc_trigger1; break;
+ }
+
+ SOUND (self, snd)
+ }
// added wait
if (self.wait > 0)
@@ -106,23 +119,19 @@ See manual for complete details. See pd_cutscenes sample map for example
// play all the sounds available for a normal trigger
if (e.sounds == 0)
{
- precache_sound ("misc/null.wav");
- e.noise = "misc/null.wav";
+ precache_sound (snd_null.wav);
}
else if (e.sounds == 1)
{
- precache_sound ("misc/secret.wav");
- e.noise = "misc/secret.wav";
+ precache_sound (snd_misc_secret.wav);
}
else if (e.sounds == 2)
{
- precache_sound ("misc/talk.wav");
- e.noise = "misc/talk.wav";
+ precache_sound (snd_misc_talk.wav);
}
else if (e.sounds == 3)
{
- precache_sound ("misc/trigger1.wav");
- e.noise = "misc/trigger1.wav";
+ precache_sound (snd_misc_trigger1.wav);
}
else if (e.sounds == 4)
{
@@ -149,10 +158,7 @@ See manual for complete details. See pd_cutscenes sample map for example
//--------------------------------------------------------------
void() trigger_look =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_look_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/monsterface.qc
diff --git a/qc/triggers/monsterface.qc b/qc/triggers/monsterface.qc
index 9264897..1c22a8e 100644
--- a/qc/triggers/monsterface.qc
+++ b/qc/triggers/monsterface.qc
@@ -89,10 +89,7 @@ Keys:
//--------------------------------------------------------------
void() trigger_monsterface =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_monsterface_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/monsterjump.qc
diff --git a/qc/triggers/monsterjump.qc b/qc/triggers/monsterjump.qc
index af5c7d9..bb2d6d7 100644
--- a/qc/triggers/monsterjump.qc
+++ b/qc/triggers/monsterjump.qc
@@ -33,6 +33,7 @@ typedef enumflags
// trigger_monsterjump
void() trigger_monsterjump_touch;
void() trigger_monsterjump_use;
+void(string key, string value) trigger_monsterjump_init_field;
void(entity e) trigger_monsterjump_init;
void() trigger_monsterjump;
#endif
@@ -56,7 +57,7 @@ be targeted and toggled off and on.
//--------------------------------------------------------------
void() trigger_monsterjump_touch =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
if (other.flags &
@@ -72,7 +73,7 @@ be targeted and toggled off and on.
other.flags = other.flags - FL_ONGROUND;
- other.velocity_z = self.height;
+ other.velocity_z = self.t_height;
};
//--------------------------------------------------------------
@@ -80,12 +81,24 @@ be targeted and toggled off and on.
//--------------------------------------------------------------
void() trigger_monsterjump_use =
{
- // TODO CEV duplicating some code here between this and
- // trigger_push_custom
- if (self.estate != STATE_ACTIVE)
- self.estate = STATE_ACTIVE;
+ if (self.stateflags & STATE_INACTIVE)
+ self.stateflags &= ~STATE_INACTIVE;
else
- self.estate = STATE_INACTIVE;
+ self.stateflags |= STATE_INACTIVE;
+ };
+
+ void(string key, string value) trigger_monsterjump_init_field =
+ {
+ switch (key)
+ {
+ case "height":
+ self.t_height = stof (value);
+ break;
+ case "is_waiting":
+ if (stof(value))
+ self.stateflags |= STATE_WAITING;
+ break;
+ }
};
//--------------------------------------------------------------
@@ -98,12 +111,12 @@ be targeted and toggled off and on.
// dumptruck_ds
if (e.spawnflags & SPAWNFLAG_TRIGGER_MONSTERJUMP_STARTOFF)
- e.estate = STATE_INACTIVE;
+ e.stateflags |= STATE_INACTIVE;
if (!e.speed)
e.speed = 200;
- if (!e.height)
- e.height = 200;
+ if (!e.t_height)
+ e.t_height = 200;
if (e.angles == '0 0 0')
e.angles = '0 360 0';
@@ -114,10 +127,7 @@ be targeted and toggled off and on.
//--------------------------------------------------------------
void() trigger_monsterjump =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_monsterjump_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/multiple.qc
diff --git a/qc/triggers/multiple.qc b/qc/triggers/multiple.qc
index 2220537..1400230 100644
--- a/qc/triggers/multiple.qc
+++ b/qc/triggers/multiple.qc
@@ -101,9 +101,19 @@ void() trigger_once;
WriteByte (MSG_ALL, SVC_FOUNDSECRET);
}
- if (self.noise != "")
- sound (self, CHAN_VOICE, self.noise,
- VOL_HIGH, ATTN_NORM);
+ local sound_info_t snd = snd_empty;
+
+ switch (self.sounds)
+ {
+ case 1: snd = snd_misc_secret; break;
+ case 2: snd = snd_misc_talk; break;
+ case 3: snd = snd_misc_trigger1; break;
+ }
+
+ if (snd.wav != snd_empty.wav)
+ {
+ SOUND (self, snd)
+ }
// don't trigger again until reset
self.takedamage = DAMAGE_NO;
@@ -115,10 +125,9 @@ void() trigger_once;
{
self.think = base_multiple_think_wait;
self.nextthink = time + self.wait;
- if (self.spawnflags &
- SPAWNFLAG_BASE_MULTIPLE_TURNS_OFF)
+ if (self.spawnflags & SPAWNFLAG_BASE_MULTIPLE_TURNS_OFF)
{
- self.is_waiting = 1;
+ self.stateflags |= STATE_WAITING;
sub_checkwaiting (self);
}
}
@@ -140,7 +149,7 @@ void() trigger_once;
{
// Supa, restore health and do nothing if we're still
// waiting to be activated
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
{
self.health = self.max_health; // nyah nyah~!
self.takedamage = DAMAGE_YES;
@@ -160,17 +169,17 @@ void() trigger_once;
//--------------------------------------------------------------
void() base_multiple_touch =
{
- if (self.spawnflags & SPAWNFLAG_BASE_MULTIPLE_NOTOUCH)
+ if (self.stateflags & STATE_INACTIVE)
return;
if (other.classtype != CT_PLAYER)
return;
- // from Copper -- dumptruck_ds
- if (other.movetype == MOVETYPE_NOCLIP)
+ if (self.spawnflags & SPAWNFLAG_BASE_MULTIPLE_NOTOUCH)
return;
- if (self.estate != STATE_ACTIVE)
+ // from Copper -- dumptruck_ds
+ if (other.movetype == MOVETYPE_NOCLIP)
return;
// if the trigger has an angles field, check player's
@@ -200,20 +209,11 @@ void() trigger_once;
void(entity e) base_multiple_init =
{
if (e.sounds == 1)
- {
- precache_sound ("misc/secret.wav");
- e.noise = "misc/secret.wav";
- }
+ precache_sound (snd_misc_secret.wav);
else if (e.sounds == 2)
- {
- precache_sound ("misc/talk.wav");
- e.noise = "misc/talk.wav";
- }
+ precache_sound (snd_misc_talk.wav);
else if (e.sounds == 3)
- {
- precache_sound ("misc/trigger1.wav");
- e.noise = "misc/trigger1.wav";
- }
+ precache_sound (snd_misc_trigger1.wav);
if (!e.wait)
{
@@ -236,7 +236,7 @@ void() trigger_once;
objerror ("base_multiple_init: health "
"and notouch don't make sense\n");
e.max_health = e.health;
- e.destroy = base_multiple_destroy;
+ e.th_destroy = base_multiple_destroy;
e.takedamage = DAMAGE_YES;
// Don't block players -- CEV
// e.solid = SOLID_BBOX;
@@ -293,9 +293,7 @@ set "message" to text string
//--------------------------------------------------------------
void() trigger_multiple =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
// Dimension Of The Machine compat -- CEV
if (known_release == KNOWN_RELEASE_MG1 && self.spawnflags & 2)
@@ -341,9 +339,7 @@ set "message" to text string
//--------------------------------------------------------------
void() trigger_once =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
// Dimension Of The Machine compat -- CEV
if (known_release == KNOWN_RELEASE_MG1 && self.spawnflags & 2)
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/onlyregistered.qc
diff --git a/qc/triggers/onlyregistered.qc b/qc/triggers/onlyregistered.qc
index 208a6f5..ea7d291 100644
--- a/qc/triggers/onlyregistered.qc
+++ b/qc/triggers/onlyregistered.qc
@@ -48,8 +48,7 @@ Only fires if playing the registered version, otherwise prints the message
if (self.message != "")
{
centerprint (other, self.message);
- sound (other, CHAN_BODY, "misc/talk.wav",
- VOL_HIGH, ATTN_NORM);
+ SOUND (other, snd_misc_talk)
}
}
};
@@ -61,7 +60,7 @@ Only fires if playing the registered version, otherwise prints the message
e.classtype = CT_TRIGGER_ONLYREGISTERED;
e.touch = trigger_onlyregistered_touch;
- precache_sound ("misc/talk.wav");
+ precache_sound (snd_misc_talk.wav);
base_trigger_init (e);
sub_checkwaiting (e);
};
@@ -69,10 +68,7 @@ Only fires if playing the registered version, otherwise prints the message
//--------------------------------------------------------------
void() trigger_onlyregistered =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_onlyregistered_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/push.qc
diff --git a/qc/triggers/push.qc b/qc/triggers/push.qc
index c371cd7..e5d00ce 100644
--- a/qc/triggers/push.qc
+++ b/qc/triggers/push.qc
@@ -32,32 +32,11 @@ typedef enumflags
#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
-// trigger_push netflags -- CEV
-//----------------------------------------------------------------------
-typedef enumflags
-{
- NETFLAG_TRIGGER_PUSH_STATE = NETFLAG_BASE_TRIGGER_STATE,
- NETFLAG_TRIGGER_PUSH_ESTATE = NETFLAG_BASE_TRIGGER_ESTATE,
- NETFLAG_TRIGGER_PUSH_SIZE,
- NETFLAG_TRIGGER_PUSH_ANGLES,
- NETFLAG_TRIGGER_PUSH_MOVEDIR,
- NETFLAG_TRIGGER_PUSH_NEWORIGIN,
- NETFLAG_TRIGGER_PUSH_SPEED
-} trigger_push_netflags;
-
-const float NETFLAG_TRIGGER_PUSH_FULLSEND = NETFLAG_TRIGGER_PUSH_SIZE |
- NETFLAG_TRIGGER_PUSH_ANGLES | NETFLAG_TRIGGER_PUSH_MOVEDIR |
- NETFLAG_TRIGGER_PUSH_NEWORIGIN | NETFLAG_TRIGGER_PUSH_SPEED |
- NETFLAG_TRIGGER_PUSH_STATE | NETFLAG_TRIGGER_PUSH_ESTATE;
-#endif
-
-#if defined(CSQC) || defined(SSQC)
-//----------------------------------------------------------------------
typedef enum
{
- TRIGGER_PUSH_STATE_TARGETED = 1,
- TRIGGER_PUSH_STATE_ADDITIVE = 2
-} trigger_push_states;
+ TRIGGER_PUSH_FLAG_TARGETED = 1,
+ TRIGGER_PUSH_FLAG_ADDITIVE = 2
+} trigger_push_flags;
#endif
//======================================================================
@@ -176,37 +155,15 @@ vector(float a, float b, float c) solve_quadratic =
{
local float netflags = ReadByte ();
- if (netflags & NETFLAG_TRIGGER_PUSH_STATE)
- self.state = ReadByte ();
+ if (netflags & NETFLAG_BASE_TRIGGER_SPAWNFLAGS)
+ self.aflag = ReadByte ();
- if (netflags & NETFLAG_TRIGGER_PUSH_ESTATE)
- self.estate = ReadByte ();
+ BASE_TRIGGER_READSTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_READSIZE (NETFLAG_BASE_TRIGGER_SIZE)
+ BASE_TRIGGER_READMOVEDIR (NETFLAG_BASE_TRIGGER_MOVEDIR)
+ BASE_TRIGGER_READNEWORIGIN (NETFLAG_BASE_TRIGGER_NEWORIGIN)
- if (netflags & NETFLAG_TRIGGER_PUSH_SIZE)
- {
- self.mins_x = ReadCoord ();
- self.mins_y = ReadCoord ();
- self.mins_z = ReadCoord ();
- self.maxs_x = ReadCoord ();
- self.maxs_y = ReadCoord ();
- self.maxs_z = ReadCoord ();
- }
-
- if (netflags & NETFLAG_TRIGGER_PUSH_MOVEDIR)
- {
- self.movedir_x = ReadAngle ();
- self.movedir_y = ReadAngle ();
- self.movedir_z = ReadAngle ();
- }
-
- if (netflags & NETFLAG_TRIGGER_PUSH_NEWORIGIN)
- {
- self.neworigin_x = ReadCoord ();
- self.neworigin_y = ReadCoord ();
- self.neworigin_z = ReadCoord ();
- }
-
- if (netflags & NETFLAG_TRIGGER_PUSH_SPEED)
+ if (netflags & NETFLAG_BASE_TRIGGER_RESERVED1)
self.speed = ReadShort ();
if (isnew)
@@ -216,7 +173,7 @@ vector(float a, float b, float c) solve_quadratic =
trigger_push_custom_init (self);
// make sure size is set -- CEV
- if (netflags & NETFLAG_TRIGGER_PUSH_SIZE)
+ if (netflags & NETFLAG_BASE_TRIGGER_SIZE)
setsize (self, self.mins, self.maxs);
};
#endif
@@ -225,45 +182,23 @@ vector(float a, float b, float c) solve_quadratic =
//--------------------------------------------------------------
float(entity to, float netflags) base_trigger_push_netsend =
{
- WriteByte (MSG_ENTITY, self.classtype);
+ BASE_ENTITY_WRITECLASSTYPE ()
// restrict netflags so we can send it in one byte -- CEV
- if (netflags > NETFLAG_TRIGGER_PUSH_FULLSEND)
- netflags = NETFLAG_TRIGGER_PUSH_FULLSEND;
+ if (netflags > NETFLAG_BASE_TRIGGER_FULLSEND)
+ netflags = NETFLAG_BASE_TRIGGER_FULLSEND;
WriteByte (MSG_ENTITY, netflags);
- if (netflags & NETFLAG_TRIGGER_PUSH_STATE)
- WriteByte (MSG_ENTITY, self.state);
+ if (netflags & NETFLAG_BASE_TRIGGER_SPAWNFLAGS)
+ WriteByte (MSG_ENTITY, self.aflag);
- if (netflags & NETFLAG_TRIGGER_PUSH_ESTATE)
- WriteByte (MSG_ENTITY, self.estate);
+ BASE_TRIGGER_WRITESTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_WRITESIZE (NETFLAG_BASE_TRIGGER_SIZE)
+ BASE_TRIGGER_WRITEMOVEDIR (NETFLAG_BASE_TRIGGER_MOVEDIR)
+ BASE_TRIGGER_WRITENEWORIGIN (NETFLAG_BASE_TRIGGER_NEWORIGIN)
- if (netflags & NETFLAG_TRIGGER_PUSH_SIZE)
- {
- WriteCoord (MSG_ENTITY, self.mins_x);
- WriteCoord (MSG_ENTITY, self.mins_y);
- WriteCoord (MSG_ENTITY, self.mins_z);
- WriteCoord (MSG_ENTITY, self.maxs_x);
- WriteCoord (MSG_ENTITY, self.maxs_y);
- WriteCoord (MSG_ENTITY, self.maxs_z);
- }
-
- if (netflags & NETFLAG_TRIGGER_PUSH_MOVEDIR)
- {
- WriteAngle (MSG_ENTITY, self.movedir_x);
- WriteAngle (MSG_ENTITY, self.movedir_y);
- WriteAngle (MSG_ENTITY, self.movedir_z);
- }
-
- if (netflags & NETFLAG_TRIGGER_PUSH_NEWORIGIN)
- {
- WriteCoord (MSG_ENTITY, self.neworigin_x);
- WriteCoord (MSG_ENTITY, self.neworigin_y);
- WriteCoord (MSG_ENTITY, self.neworigin_z);
- }
-
- if (netflags & NETFLAG_TRIGGER_PUSH_SPEED)
+ if (netflags & NETFLAG_BASE_TRIGGER_RESERVED1)
WriteShort (MSG_ENTITY, self.speed);
return TRUE;
@@ -277,7 +212,7 @@ vector(float a, float b, float c) solve_quadratic =
if (self.enemy)
{
self.neworigin = self.enemy.origin;
- self.state |= TRIGGER_PUSH_STATE_TARGETED;
+ self.aflag |= TRIGGER_PUSH_FLAG_TARGETED;
}
else
{
@@ -293,14 +228,14 @@ vector(float a, float b, float c) solve_quadratic =
// make sure SendEntity and SendFlags are set so the client
// sees this entity -- CEV
self.SendEntity = base_trigger_push_netsend;
- self.SendFlags = NETFLAG_TRIGGER_PUSH_SIZE |
- NETFLAG_TRIGGER_PUSH_STATE |
- NETFLAG_TRIGGER_PUSH_ESTATE |
- NETFLAG_TRIGGER_PUSH_SPEED;
+ self.SendFlags = NETFLAG_BASE_TRIGGER_SIZE |
+ NETFLAG_BASE_TRIGGER_SPAWNFLAGS |
+ NETFLAG_BASE_TRIGGER_STATEFLAGS |
+ NETFLAG_BASE_TRIGGER_RESERVED1;
if (self.neworigin)
- self.SendFlags |= NETFLAG_TRIGGER_PUSH_NEWORIGIN;
+ self.SendFlags |= NETFLAG_BASE_TRIGGER_NEWORIGIN;
if (self.movedir)
- self.SendFlags |= NETFLAG_TRIGGER_PUSH_MOVEDIR;
+ self.SendFlags |= NETFLAG_BASE_TRIGGER_MOVEDIR;
// don't (shouldn't) need to call think anymore -- CEV
self.think = sub_null;
@@ -430,73 +365,62 @@ vector(float a, float b, float c) solve_quadratic =
//--------------------------------------------------------------
void() base_trigger_push_touch =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
// from Copper -- dumptruck_ds
if (other.movetype == MOVETYPE_NOCLIP)
return;
- if (other.classtype == CT_PROJECTILE_GRENADE)
- {
- if (self.state & TRIGGER_PUSH_STATE_TARGETED)
- other.velocity = self.movedir;
- else
- other.velocity = self.speed * self.movedir * 10;
- }
- else if (other.health > 0)
- {
- if (self.state & TRIGGER_PUSH_STATE_TARGETED)
- // jumppad style
- other.velocity = base_trigger_push_calcvel (
- other.origin, self.neworigin,
- self.height);
- else if (self.state & TRIGGER_PUSH_STATE_ADDITIVE)
- // MG1 additive push
- other.velocity = other.velocity + self.speed *
- self.movedir * 10 * frametime;
- else
- // regular
- other.velocity = self.speed * self.movedir * 10;
-
- #if 0
- dprint (sprintf("base_trigger_push_touch: "
- "moving player... self movedir %v, "
- "self speed %g, other vel %v\n",
- self.movedir, self.speed, other.velocity));
- #endif
+ if (!(other.stateflags & STATE_PUSHABLE))
+ return;
- if (other.classtype == CT_PLAYER)
- {
- // signal pmove that player has touched a
- // push brush -- CEV
- other.pm_flags |= PMF_PUSHED;
- other.pm_timer = 0;
+ if (self.aflag & TRIGGER_PUSH_FLAG_TARGETED)
+ // jumppad style
+ other.velocity = base_trigger_push_calcvel (
+ other.origin, self.neworigin,
+ self.t_height);
+ else if (self.aflag & TRIGGER_PUSH_FLAG_ADDITIVE)
+ // MG1 additive push
+ other.velocity = other.velocity + self.speed *
+ self.movedir * 10 * frametime;
+ else
+ // regular
+ other.velocity = self.speed * self.movedir * 10;
- #ifdef SSQC
- // carry on with normal push sound behavior
+ #if 0
+ dprint (sprintf("base_trigger_push_touch: "
+ "moving player... self movedir %v, "
+ "self speed %g, other vel %v\n",
+ self.movedir, self.speed, other.velocity));
+ #endif
+
+ if (other.classtype == CT_PLAYER)
+ {
+ // signal pmove that player has touched a
+ // push brush -- CEV
+ other.moveflags |= PMF_PUSHED;
+ other.movetimer = 0;
+
+ #ifdef SSQC
+ // carry on with normal push sound behavior
+ if (!(self.spawnflags & SPAWNFLAG_TRIGGER_PUSH_SILENT)
+ && other.fly_sound < time)
+ {
if (!(self.spawnflags &
- SPAWNFLAG_TRIGGER_PUSH_SILENT) &&
- other.fly_sound < time)
+ SPAWNFLAG_TRIGGER_PUSH_NOISE))
+ {
+ other.fly_sound = time + 1.5;
+ SOUND (other, snd_amb_windfly)
+ }
+ else
{
- if (!(self.spawnflags &
- SPAWNFLAG_TRIGGER_PUSH_NOISE))
- {
- other.fly_sound = time + 1.5;
- sound (other, CHAN_AUTO,
- "ambience/windfly.wav",
- VOL_HIGH, ATTN_NORM);
- }
- else
- {
- other.fly_sound = time + 1.5;
- sound (other, CHAN_AUTO,
- self.noise,
- VOL_HIGH, ATTN_NORM);
- }
+ other.fly_sound = time + 1.5;
+ sound (other, CHAN_AUTO, self.noise,
+ VOL_HIGH, ATTN_NORM);
}
- #endif
}
+ #endif
}
#ifdef SSQC
@@ -519,7 +443,11 @@ vector(float a, float b, float c) solve_quadratic =
switch (key)
{
case "height":
- self.height = stof (value);
+ self.t_height = stof (value);
+ break;
+ case "is_waiting":
+ if (stof(value))
+ self.stateflags |= STATE_WAITING;
break;
}
};
@@ -538,7 +466,10 @@ Pushes the player
/*
void() trigger_push_use =
{
- self.is_waiting = !self.is_waiting;
+ if (self.stateflags & STATE_WAITING)
+ self.stateflags &= ~STATE_WAITING;
+ else
+ self.stateflags |= STATE_WAITING;
}
*/
@@ -553,17 +484,17 @@ Pushes the player
base_trigger_init (e);
#ifdef SSQC
- precache_sound ("ambience/windfly.wav");
+ precache_sound (snd_amb_windfly.wav);
// TODO CEV should probably test this
if (e.spawnflags & SPAWNFLAG_TRIGGER_PUSH_STARTOFF ||
e.spawnflags & SPAWNFLAG_TRIGGER_PUSH_MGSTARTOFF)
{
- e.estate = STATE_INACTIVE;
+ e.stateflags |= STATE_INACTIVE;
}
if (e.spawnflags & SPAWNFLAG_TRIGGER_PUSH_ADDITIVE)
- self.state |= TRIGGER_PUSH_STATE_ADDITIVE;
+ e.aflag |= TRIGGER_PUSH_FLAG_ADDITIVE;
if (e.noise != "")
precache_sound (e.noise);
@@ -579,14 +510,13 @@ Pushes the player
if (!e.speed)
e.speed = 1000;
- e.SendEntity = base_trigger_push_netsend;
- e.SendFlags = NETFLAG_TRIGGER_PUSH_SIZE |
- NETFLAG_TRIGGER_PUSH_STATE |
- NETFLAG_TRIGGER_PUSH_ESTATE |
- NETFLAG_TRIGGER_PUSH_SPEED;
// don't need to send NEWORIGIN -- CEV
- if (e.movedir)
- e.SendFlags |= NETFLAG_TRIGGER_PUSH_MOVEDIR;
+ e.SendEntity = base_trigger_push_netsend;
+ e.SendFlags = NETFLAG_BASE_TRIGGER_SIZE |
+ NETFLAG_BASE_TRIGGER_SPAWNFLAGS |
+ NETFLAG_BASE_TRIGGER_STATEFLAGS |
+ NETFLAG_BASE_TRIGGER_RESERVED1 |
+ NETFLAG_BASE_TRIGGER_MOVEDIR;
}
sub_checkwaiting (e);
@@ -599,11 +529,7 @@ Pushes the player
void() trigger_push =
{
// read unprocessed fields as present in the map file -- CEV
- base_mapentity_init_spawndata (base_trigger_push_init_field);
-
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_push_init (self);
};
@@ -635,10 +561,12 @@ Adapted from Hipnotic's func_togglewall
//--------------------------------------------------------------
void() trigger_push_custom_use =
{
- if (self.estate != STATE_ACTIVE)
- self.estate = STATE_ACTIVE;
+ if (self.stateflags & STATE_INACTIVE)
+ self.stateflags &= ~STATE_INACTIVE;
else
- self.estate = STATE_INACTIVE;
+ self.stateflags |= STATE_INACTIVE;
+
+ self.SendFlags |= NETFLAG_BASE_TRIGGER_STATEFLAGS;
};
#endif
@@ -657,16 +585,16 @@ Adapted from Hipnotic's func_togglewall
base_trigger_init (e);
#ifdef SSQC
- precache_sound ("ambience/windfly.wav");
+ precache_sound (snd_amb_windfly.wav);
if (e.spawnflags & SPAWNFLAG_TRIGGER_PUSH_STARTOFF ||
e.spawnflags & SPAWNFLAG_TRIGGER_PUSH_MGSTARTOFF)
{
- e.estate = STATE_INACTIVE;
+ e.stateflags |= STATE_INACTIVE;
}
if (e.spawnflags & SPAWNFLAG_TRIGGER_PUSH_ADDITIVE)
- self.state |= TRIGGER_PUSH_STATE_ADDITIVE;
+ e.aflag |= TRIGGER_PUSH_FLAG_ADDITIVE;
if (e.noise != "")
precache_sound (e.noise);
@@ -682,14 +610,13 @@ Adapted from Hipnotic's func_togglewall
if (!e.speed)
e.speed = 1000;
- e.SendEntity = base_trigger_push_netsend;
- e.SendFlags = NETFLAG_TRIGGER_PUSH_SIZE |
- NETFLAG_TRIGGER_PUSH_STATE |
- NETFLAG_TRIGGER_PUSH_ESTATE |
- NETFLAG_TRIGGER_PUSH_SPEED;
// don't need to send NEWORIGIN -- CEV
- if (e.movedir)
- e.SendFlags |= NETFLAG_TRIGGER_PUSH_MOVEDIR;
+ e.SendEntity = base_trigger_push_netsend;
+ e.SendFlags = NETFLAG_BASE_TRIGGER_SIZE |
+ NETFLAG_BASE_TRIGGER_SPAWNFLAGS |
+ NETFLAG_BASE_TRIGGER_STATEFLAGS |
+ NETFLAG_BASE_TRIGGER_RESERVED1 |
+ NETFLAG_BASE_TRIGGER_MOVEDIR;
}
sub_checkwaiting (e);
@@ -701,10 +628,7 @@ Adapted from Hipnotic's func_togglewall
//--------------------------------------------------------------
void() trigger_push_custom =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_push_custom_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/relay.qc
diff --git a/qc/triggers/relay.qc b/qc/triggers/relay.qc
index 25d1b89..a296b1d 100644
--- a/qc/triggers/relay.qc
+++ b/qc/triggers/relay.qc
@@ -43,10 +43,7 @@ This fixed size trigger cannot be touched, it can only be fired by other events.
//-------------------------------------------------------------
void() trigger_relay =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_relay_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/repeater.qc
diff --git a/qc/triggers/repeater.qc b/qc/triggers/repeater.qc
new file mode 100644
index 0000000..d09d66e
--- /dev/null
+++ b/qc/triggers/repeater.qc
@@ -0,0 +1,105 @@
+//==============================================================================
+// trigger_repeater from MachineGames Dimension Of The Machine -- CEV
+//==============================================================================
+
+//======================================================================
+// constants
+//======================================================================
+
+#if defined(CSQC) || defined(SSQC)
+//----------------------------------------------------------------------
+// trigger_repeater spawnflags -- CEV
+//----------------------------------------------------------------------
+typedef enumflags
+{
+ SPAWNFLAG_TRIGGER_REPEATER_ON = 1
+ // SPAWNFLAG_NOT_ON_EASY = 256, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_NORMAL = 512,
+ // SPAWNFLAG_NOT_ON_HARD_OR_NIGHTMARE = 1024,
+ // SPAWNFLAG_NOT_IN_DEATHMATCH = 2048,
+ // SPAWNFLAG_NOT_IN_COOP = 4096,
+ // SPAWNFLAG_NOT_IN_SP = 8192,
+ // SPAWNFLAG_NOT_ON_SKILL2 = 32768, // see base_entities.qc -- CEV
+ // SPAWNFLAG_NOT_ON_SKILL3 = 65536, // see base_entities.qc -- CEV
+ // SPAWNFLAG_CENTERPRINTALL = 131072 // see base_entities.qc -- CEV
+} trigger_repeater_spawnflags;
+#endif
+
+//======================================================================
+// forward declarations
+//======================================================================
+
+#ifdef SSQC
+// trigger_repeater
+void() trigger_repeater_think;
+void() trigger_repeater_use;
+void(entity e) trigger_repeater_init;
+void() trigger_repeater;
+#endif
+
+//------------------------------------------------------------------------------
+
+#ifdef SSQC
+//----------------------------------------------------------------------
+// class trigger_repeater: base_trigger
+// {
+ //--------------------------------------------------------------
+ void() trigger_repeater_think =
+ {
+ sub_usetargets ();
+ self.nextthink = time + self.wait + (self.pausetime * random());
+ };
+
+ //--------------------------------------------------------------
+ void() trigger_repeater_use =
+ {
+ if (self.spawnflags & SPAWNFLAG_TRIGGER_REPEATER_ON)
+ {
+ // turn off
+ self.spawnflags &= ~SPAWNFLAG_TRIGGER_REPEATER_ON;
+ self.nextthink = 0;
+ self.think = sub_null;
+ }
+ else
+ {
+ // turn on
+ self.spawnflags |= SPAWNFLAG_TRIGGER_REPEATER_ON;
+ self.nextthink = time + self.wait +
+ (self.pausetime * random());
+ self.think = trigger_repeater_think;
+ }
+ };
+
+ //--------------------------------------------------------------
+ void(entity e) trigger_repeater_init =
+ {
+ e.classname = "trigger_repeater";
+ e.classtype = CT_TRIGGER_REPEATER;
+ base_trigger_init (e);
+
+ if (!self.wait)
+ self.wait = 1;
+
+ self.use = trigger_repeater_use;
+
+ if (self.spawnflags & SPAWNFLAG_TRIGGER_REPEATER_ON)
+ {
+ self.nextthink = time + self.wait +
+ (self.pausetime * random());
+ self.think = trigger_repeater_think;
+ }
+ else
+ {
+ self.nextthink = 0;
+ self.think = sub_null;
+ }
+ };
+
+ //--------------------------------------------------------------
+ void() trigger_repeater =
+ {
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
+ trigger_repeater_init (self);
+ };
+// }
+#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/secret.qc
diff --git a/qc/triggers/secret.qc b/qc/triggers/secret.qc
index 1286dc9..40675f7 100644
--- a/qc/triggers/secret.qc
+++ b/qc/triggers/secret.qc
@@ -40,27 +40,13 @@ set "message" to text string
if (!e.sounds)
e.sounds = 1;
- if (e.sounds == 1)
- {
- precache_sound ("misc/secret.wav");
- e.noise = "misc/secret.wav";
- }
- else if (e.sounds == 2)
- {
- precache_sound ("misc/talk.wav");
- e.noise = "misc/talk.wav";
- }
-
base_multiple_init (e);
};
//--------------------------------------------------------------
void() trigger_secret =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_secret_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/setcount.qc
diff --git a/qc/triggers/setcount.qc b/qc/triggers/setcount.qc
index 4172f32..69e6c4c 100644
--- a/qc/triggers/setcount.qc
+++ b/qc/triggers/setcount.qc
@@ -95,10 +95,7 @@ void() target_setcount;
//--------------------------------------------------------------
void() target_setcount =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
target_setcount_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/setgravity.qc
diff --git a/qc/triggers/setgravity.qc b/qc/triggers/setgravity.qc
index 1253bc2..5f374f3 100644
--- a/qc/triggers/setgravity.qc
+++ b/qc/triggers/setgravity.qc
@@ -33,23 +33,6 @@ typedef enumflags
} trigger_setgravity_spawnflags;
#endif
-#if defined(CSQC) || defined(SSQC)
-//----------------------------------------------------------------------
-// trigger_setgravity netflags -- CEV
-//----------------------------------------------------------------------
-typedef enumflags
-{
- NETFLAG_TRIGGER_SETGRAVITY_STATE = NETFLAG_BASE_TRIGGER_STATE,
- NETFLAG_TRIGGER_SETGRAVITY_ESTATE = NETFLAG_BASE_TRIGGER_ESTATE,
- NETFLAG_TRIGGER_SETGRAVITY_SIZE,
- NETFLAG_TRIGGER_SETGRAVITY_GRAVITY
-} trigger_setgravity_netflags;
-
-const float NETFLAG_TRIGGER_SETGRAVITY_FULLSEND =
- NETFLAG_TRIGGER_SETGRAVITY_STATE | NETFLAG_TRIGGER_SETGRAVITY_ESTATE |
- NETFLAG_TRIGGER_SETGRAVITY_SIZE | NETFLAG_TRIGGER_SETGRAVITY_GRAVITY;
-#endif
-
//======================================================================
// forward declarations
//======================================================================
@@ -108,29 +91,16 @@ set the gravity of a player
{
local float netflags = ReadByte ();
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_STATE)
- self.state = ReadByte ();
-
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_ESTATE)
- self.estate = ReadByte ();
+ BASE_TRIGGER_READSTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_READSIZE (NETFLAG_BASE_TRIGGER_SIZE)
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_SIZE)
- {
- self.mins_x = ReadCoord ();
- self.mins_y = ReadCoord ();
- self.mins_z = ReadCoord ();
- self.maxs_x = ReadCoord ();
- self.maxs_y = ReadCoord ();
- self.maxs_z = ReadCoord ();
- }
-
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_GRAVITY)
- self.gravity = ReadShort ();
+ if (netflags & NETFLAG_BASE_TRIGGER_RESERVED1)
+ self.gravity = ReadFloat ();
if (isnew)
trigger_setgravity_init (self);
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_SIZE)
+ if (netflags & NETFLAG_BASE_TRIGGER_SIZE)
setsize (self, self.mins, self.maxs);
};
#endif
@@ -139,31 +109,18 @@ set the gravity of a player
//--------------------------------------------------------------
float(entity to, float netflags) trigger_setgravity_netsend =
{
- WriteByte (MSG_ENTITY, self.classtype);
+ BASE_ENTITY_WRITECLASSTYPE ()
- if (netflags > NETFLAG_TRIGGER_SETGRAVITY_FULLSEND)
- netflags = NETFLAG_TRIGGER_SETGRAVITY_FULLSEND;
+ if (netflags > NETFLAG_BASE_TRIGGER_FULLSEND)
+ netflags = NETFLAG_BASE_TRIGGER_FULLSEND;
WriteByte (MSG_ENTITY, netflags);
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_STATE)
- WriteByte (MSG_ENTITY, self.state);
-
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_ESTATE)
- WriteByte (MSG_ENTITY, self.estate);
+ BASE_TRIGGER_WRITESTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_WRITESIZE (NETFLAG_BASE_TRIGGER_SIZE)
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_SIZE)
- {
- WriteCoord (MSG_ENTITY, self.mins_x);
- WriteCoord (MSG_ENTITY, self.mins_y);
- WriteCoord (MSG_ENTITY, self.mins_z);
- WriteCoord (MSG_ENTITY, self.maxs_x);
- WriteCoord (MSG_ENTITY, self.maxs_y);
- WriteCoord (MSG_ENTITY, self.maxs_z);
- }
-
- if (netflags & NETFLAG_TRIGGER_SETGRAVITY_GRAVITY)
- WriteShort (MSG_ENTITY, self.gravity);
+ if (netflags & NETFLAG_BASE_TRIGGER_RESERVED1)
+ WriteFloat (MSG_ENTITY, self.gravity);
return TRUE;
};
@@ -172,16 +129,11 @@ set the gravity of a player
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
// from Copper -- dumptruck_ds
+ // affects all entities, not just players -- CEV
//--------------------------------------------------------------
void() trigger_setgravity_touch =
{
- // This is commented out so that the changing gravity will
- // affect everything, if you don't want to use all affecting
- // gravity changes, then uncomment these two lines.
- // if (other.classtype != CT_PLAYER)
- // return;
-
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
local float grav;
@@ -207,12 +159,12 @@ set the gravity of a player
//--------------------------------------------------------------
void() trigger_setgravity_use =
{
- if (self.estate != STATE_ACTIVE)
- self.estate = STATE_ACTIVE;
+ if (self.stateflags & STATE_INACTIVE)
+ self.stateflags &= ~STATE_INACTIVE;
else
- self.estate = STATE_INACTIVE;
+ self.stateflags |= STATE_INACTIVE;
- self.SendFlags |= NETFLAG_TRIGGER_SETGRAVITY_ESTATE;
+ self.SendFlags |= NETFLAG_BASE_TRIGGER_STATEFLAGS;
};
#endif
@@ -227,8 +179,8 @@ set the gravity of a player
base_trigger_init (e);
#ifdef CSQC
- setorigin (e, e.origin);
setsize (e, e.mins, e.maxs);
+ setorigin (e, e.origin);
#endif
#ifdef SSQC
@@ -236,7 +188,7 @@ set the gravity of a player
// dumptruck_ds
if (e.spawnflags & SPAWNFLAG_TRIGGER_SETGRAVITY_STARTOFF)
- e.estate = STATE_INACTIVE;
+ e.stateflags |= STATE_INACTIVE;
if (!e.gravity)
e.gravity = -1;
@@ -246,7 +198,7 @@ set the gravity of a player
sub_checkwaiting (e);
e.SendEntity = trigger_setgravity_netsend;
- e.SendFlags = NETFLAG_TRIGGER_SETGRAVITY_FULLSEND;
+ e.SendFlags = NETFLAG_BASE_TRIGGER_FULLSEND;
#endif
};
#endif
@@ -255,10 +207,7 @@ set the gravity of a player
//--------------------------------------------------------------
void() trigger_setgravity =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_setgravity_init (self);
};
#endif
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/setskill.qc
diff --git a/qc/triggers/setskill.qc b/qc/triggers/setskill.qc
index 361de6d..6f66481 100644
--- a/qc/triggers/setskill.qc
+++ b/qc/triggers/setskill.qc
@@ -47,10 +47,7 @@ Only used on start map.
//--------------------------------------------------------------
void() trigger_setskill =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_setskill_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/setstate.qc
diff --git a/qc/triggers/setstate.qc b/qc/triggers/setstate.qc
index 0f2d94b..dd6d8fc 100644
--- a/qc/triggers/setstate.qc
+++ b/qc/triggers/setstate.qc
@@ -55,10 +55,7 @@ void() target_setstate;
//--------------------------------------------------------------
float(entity e) target_setstate_getestate =
{
- if (e.classtype == CT_FUNC_DOOR)
- return e.estate;
- else
- return e.estate;
+ return e.stateflags;
};
//--------------------------------------------------------------
@@ -68,7 +65,8 @@ void() target_setstate;
if (e.classtype == CT_FUNC_BUTTON)
{
- if (state == STATE_ACTIVE)
+ // TODO CEV
+ if (state == 0)
func_button_unlock (e, flags &
SPAWNFLAG_TARGET_SETSTATE_DONTRESETBTN);
else
@@ -79,19 +77,26 @@ void() target_setstate;
if (flags & SPAWNFLAG_TARGET_SETSTATE_CLOSEALLDOORS)
closealldoors = 1;
- if (state == STATE_ACTIVE)
+ // TODO CEV
+ if (state == 0)
func_door_estate_unlock (e, closealldoors);
else
func_door_estate_lock (e, closealldoors);
}
else
{
- e.estate = state;
+ // TODO CEV base_entity_changestate
+ e.stateflags = state;
+
+ // tell the client (if there's one listening) -- CEV
+ if (e.classgroup & CG_TRIGGER && e.SendEntity)
+ e.SendFlags |= NETFLAG_BASE_TRIGGER_STATEFLAGS;
}
if (e.classgroup & CG_TRIGGER)
{
- if (e.is_waiting > 0 && state == STATE_ACTIVE)
+ if (e.stateflags & STATE_WAITING &&
+ !(state & STATE_INACTIVE))
{
sub_runvoidas (e, sub_endwaiting);
}
@@ -117,12 +122,10 @@ void() target_setstate;
{
if (state == -1)
{
- if (target_setstate_getestate(t)==STATE_ACTIVE)
- target_setstate_setestate (t,
- STATE_INACTIVE, flags);
+ if (t.stateflags & STATE_INACTIVE)
+ target_setstate_setestate (t, 0, flags);
else
- target_setstate_setestate (t,
- STATE_ACTIVE, flags);
+ target_setstate_setestate (t, 1, flags);
}
else
{
@@ -187,10 +190,11 @@ void() target_setstate;
{
local float state;
+ // TODO CEV
if (self.style == 1)
- state = STATE_ACTIVE;
+ state = 0;
else if (self.style == 2)
- state = STATE_INACTIVE;
+ state = 1;
else
state = -1;
@@ -226,10 +230,7 @@ void() target_setstate;
//--------------------------------------------------------------
void() target_setstate =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
target_setstate_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/shake.qc
diff --git a/qc/triggers/shake.qc b/qc/triggers/shake.qc
index b2788a0..fb4b1cf 100644
--- a/qc/triggers/shake.qc
+++ b/qc/triggers/shake.qc
@@ -200,10 +200,7 @@ TRIGGER_SHAKE_VIEWONLY Shakes the view, but player movement is not affected
//--------------------------------------------------------------
void() trigger_shake =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_shake_init (self);
};
// };
@@ -329,10 +326,7 @@ dmg is the intensity of the shake
//--------------------------------------------------------------
void() trigger_screenshake =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_screenshake_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/take_weapon.qc
diff --git a/qc/triggers/take_weapon.qc b/qc/triggers/take_weapon.qc
index 0a6dad4..79fabae 100644
--- a/qc/triggers/take_weapon.qc
+++ b/qc/triggers/take_weapon.qc
@@ -43,22 +43,22 @@ Removes shotgun upon touch. You can also set "reset_items" in the worldspawn ent
base_multiple_fire ();
// TODO CEV currently only subtracts the SHOTGUN
- if (other.inventory1 == ITEM_SEQ_SHOTGUN)
- other.inventory1 = ITEM_SEQ_HANDS;
- if (other.inventory2 == ITEM_SEQ_SHOTGUN)
- other.inventory2 = ITEM_SEQ_HANDS;
- if (other.inventory3 == ITEM_SEQ_SHOTGUN)
- other.inventory3 = ITEM_SEQ_HANDS;
- if (other.inventory4 == ITEM_SEQ_SHOTGUN)
- other.inventory4 = ITEM_SEQ_HANDS;
- if (other.inventory5 == ITEM_SEQ_SHOTGUN)
- other.inventory5 = ITEM_SEQ_HANDS;
- if (other.inventory6 == ITEM_SEQ_SHOTGUN)
- other.inventory6 = ITEM_SEQ_HANDS;
- if (other.inventory7 == ITEM_SEQ_SHOTGUN)
- other.inventory7 = ITEM_SEQ_HANDS;
- if (other.inventory8 == ITEM_SEQ_SHOTGUN)
- other.inventory8 = ITEM_SEQ_HANDS;
+ if (other.item[0] == ITEM_SEQ_SHOTGUN)
+ other.item[0] = ITEM_SEQ_HANDS;
+ if (other.item[1] == ITEM_SEQ_SHOTGUN)
+ other.item[1] = ITEM_SEQ_HANDS;
+ if (other.item[2] == ITEM_SEQ_SHOTGUN)
+ other.item[2] = ITEM_SEQ_HANDS;
+ if (other.item[3] == ITEM_SEQ_SHOTGUN)
+ other.item[3] = ITEM_SEQ_HANDS;
+ if (other.item[4] == ITEM_SEQ_SHOTGUN)
+ other.item[4] = ITEM_SEQ_HANDS;
+ if (other.item[5] == ITEM_SEQ_SHOTGUN)
+ other.item[5] = ITEM_SEQ_HANDS;
+ if (other.item[6] == ITEM_SEQ_SHOTGUN)
+ other.item[6] = ITEM_SEQ_HANDS;
+ if (other.item[7] == ITEM_SEQ_SHOTGUN)
+ other.item[7] = ITEM_SEQ_HANDS;
// TODO CEV
/*
@@ -92,10 +92,7 @@ Removes shotgun upon touch. You can also set "reset_items" in the worldspawn ent
//--------------------------------------------------------------
void() trigger_take_weapon =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_take_weapon_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/teleport.qc
diff --git a/qc/triggers/teleport.qc b/qc/triggers/teleport.qc
index 5402db9..bff2d21 100644
--- a/qc/triggers/teleport.qc
+++ b/qc/triggers/teleport.qc
@@ -3,8 +3,6 @@
// -- dumptruck_ds
//==============================================================================
-// TODO CEV: redo the use of self.state as spawnflags for CSQC touch checks
-
//======================================================================
// constants
//======================================================================
@@ -33,24 +31,6 @@ typedef enumflags
} trigger_teleport_spawnflags;
#endif
-#if defined(CSQC) || defined(SSQC)
-//----------------------------------------------------------------------
-// trigger_teleport netflags -- CEV
-//----------------------------------------------------------------------
-typedef enumflags
-{
- NETFLAG_TRIGGER_TELEPORT_STATE = NETFLAG_BASE_TRIGGER_STATE,
- NETFLAG_TRIGGER_TELEPORT_ESTATE = NETFLAG_BASE_TRIGGER_ESTATE,
- NETFLAG_TRIGGER_TELEPORT_SIZE,
- NETFLAG_TRIGGER_TELEPORT_ANGLES,
- NETFLAG_TRIGGER_TELEPORT_NEWORIGIN
-} trigger_teleport_netflags;
-
-const float NETFLAG_TRIGGER_TELEPORT_FULLSEND = NETFLAG_TRIGGER_TELEPORT_SIZE |
- NETFLAG_TRIGGER_TELEPORT_ANGLES | NETFLAG_TRIGGER_TELEPORT_STATE |
- NETFLAG_TRIGGER_TELEPORT_ESTATE | NETFLAG_TRIGGER_TELEPORT_NEWORIGIN;
-#endif
-
//======================================================================
// forward declarations
//======================================================================
@@ -92,22 +72,22 @@ void() trigger_teleport;
//----------------------------------------------------------------------
void() spawn_tfog_think =
{
- local float v;
- local string tmpstr;
-
- v = random() * 5;
- if (v < 1)
- tmpstr = "misc/r_tele1.wav";
- else if (v < 2)
- tmpstr = "misc/r_tele2.wav";
- else if (v < 3)
- tmpstr = "misc/r_tele3.wav";
- else if (v < 4)
- tmpstr = "misc/r_tele4.wav";
+ local float f = random() * 5;
+ local sound_info_t snd = snd_empty;
+
+ if (f < 1)
+ snd = snd_misc_tele1;
+ else if (f < 2)
+ snd = snd_misc_tele2;
+ else if (f < 3)
+ snd = snd_misc_tele3;
+ else if (f < 4)
+ snd = snd_misc_tele4;
else
- tmpstr = "misc/r_tele5.wav";
+ snd = snd_misc_tele5;
- sound (self, CHAN_VOICE, tmpstr, VOL_HIGH, ATTN_NORM);
+ if (snd.wav != snd_empty.wav)
+ SOUND (self, snd)
remove (self);
};
@@ -255,42 +235,35 @@ ONLYMONSTER(16) will only teleport monsters
{
local float netflags = ReadByte ();
- if (netflags & NETFLAG_TRIGGER_TELEPORT_STATE)
- // TODO CEV fix use of state as spawnflags
- self.state = ReadFloat ();
-
- if (netflags & NETFLAG_TRIGGER_TELEPORT_ESTATE)
- self.estate = ReadByte ();
-
- if (netflags & NETFLAG_TRIGGER_TELEPORT_SIZE)
+ if (netflags & NETFLAG_BASE_TRIGGER_SPAWNFLAGS)
{
- self.mins_x = ReadCoord ();
- self.mins_y = ReadCoord ();
- self.mins_z = ReadCoord ();
- self.maxs_x = ReadCoord ();
- self.maxs_y = ReadCoord ();
- self.maxs_z = ReadCoord ();
- }
+ local float s0 = ReadByte ();
- if (netflags & NETFLAG_TRIGGER_TELEPORT_ANGLES)
- {
- self.mangle_x = ReadAngle ();
- self.mangle_y = ReadAngle ();
- self.mangle_z = ReadAngle ();
- }
+ if (s0 & SPAWNFLAG_TRIGGER_TELEPORT_ONLYPLAYER)
+ self.spawnflags |=
+ SPAWNFLAG_TRIGGER_TELEPORT_ONLYPLAYER;
+ else
+ self.spawnflags &=
+ ~SPAWNFLAG_TRIGGER_TELEPORT_ONLYPLAYER;
- if (netflags & NETFLAG_TRIGGER_TELEPORT_NEWORIGIN)
- {
- self.neworigin_x = ReadCoord ();
- self.neworigin_y = ReadCoord ();
- self.neworigin_z = ReadCoord ();
+ if (s0 & SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER)
+ self.spawnflags |=
+ SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER;
+ else
+ self.spawnflags &=
+ ~SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER;
}
+ BASE_TRIGGER_READSTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_READSIZE (NETFLAG_BASE_TRIGGER_SIZE)
+ BASE_TRIGGER_READMANGLE (NETFLAG_BASE_TRIGGER_MANGLE)
+ BASE_TRIGGER_READNEWORIGIN (NETFLAG_BASE_TRIGGER_NEWORIGIN)
+
if (isnew)
trigger_teleport_init (self);
// make sure size is set -- CEV
- if (netflags & NETFLAG_TRIGGER_TELEPORT_SIZE)
+ if (netflags & NETFLAG_BASE_TRIGGER_SIZE)
setsize (self, self.mins, self.maxs);
};
@@ -323,43 +296,36 @@ ONLYMONSTER(16) will only teleport monsters
//--------------------------------------------------------------
float(entity to, float netflags) trigger_teleport_netsend =
{
- WriteByte (MSG_ENTITY, self.classtype);
+ BASE_ENTITY_WRITECLASSTYPE ()
- if (netflags > 255)
- netflags = NETFLAG_TRIGGER_TELEPORT_FULLSEND;
+ if (netflags > NETFLAG_BASE_TRIGGER_FULLSEND)
+ netflags = NETFLAG_BASE_TRIGGER_FULLSEND;
WriteByte (MSG_ENTITY, netflags);
- if (netflags & NETFLAG_TRIGGER_TELEPORT_STATE)
- // TODO CEV fix use of state as spawnflags
- WriteFloat (MSG_ENTITY, self.state);
+ if (netflags & NETFLAG_BASE_TRIGGER_SPAWNFLAGS)
+ {
+ local float s0 = 0;
- if (netflags & NETFLAG_TRIGGER_TELEPORT_ESTATE)
- WriteByte (MSG_ENTITY, self.estate);
+ if (self.spawnflags &
+ SPAWNFLAG_TRIGGER_TELEPORT_ONLYPLAYER)
+ {
+ s0 |= SPAWNFLAG_TRIGGER_TELEPORT_ONLYPLAYER;
+ }
- if (netflags & NETFLAG_TRIGGER_TELEPORT_SIZE)
- {
- WriteCoord (MSG_ENTITY, self.mins_x);
- WriteCoord (MSG_ENTITY, self.mins_y);
- WriteCoord (MSG_ENTITY, self.mins_z);
- WriteCoord (MSG_ENTITY, self.maxs_x);
- WriteCoord (MSG_ENTITY, self.maxs_y);
- WriteCoord (MSG_ENTITY, self.maxs_z);
- }
+ if (self.spawnflags &
+ SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER)
+ {
+ s0 |= SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER;
+ }
- if (netflags & NETFLAG_TRIGGER_TELEPORT_ANGLES)
- {
- WriteAngle (MSG_ENTITY, self.mangle_x);
- WriteAngle (MSG_ENTITY, self.mangle_y);
- WriteAngle (MSG_ENTITY, self.mangle_z);
+ WriteByte (MSG_ENTITY, s0);
}
- if (netflags & NETFLAG_TRIGGER_TELEPORT_NEWORIGIN)
- {
- WriteCoord (MSG_ENTITY, self.neworigin_x);
- WriteCoord (MSG_ENTITY, self.neworigin_y);
- WriteCoord (MSG_ENTITY, self.neworigin_z);
- }
+ BASE_TRIGGER_WRITESTATEFLAGS (NETFLAG_BASE_TRIGGER_STATEFLAGS)
+ BASE_TRIGGER_WRITESIZE (NETFLAG_BASE_TRIGGER_SIZE)
+ BASE_TRIGGER_WRITEMANGLE (NETFLAG_BASE_TRIGGER_MANGLE)
+ BASE_TRIGGER_WRITENEWORIGIN (NETFLAG_BASE_TRIGGER_NEWORIGIN)
return TRUE;
};
@@ -399,7 +365,6 @@ ONLYMONSTER(16) will only teleport monsters
return spot;
};
- // end dumptruck_ds
//--------------------------------------------------------------
void() trigger_teleport_think_findtarget =
@@ -456,7 +421,7 @@ ONLYMONSTER(16) will only teleport monsters
self.neworigin = t.origin;
self.SendEntity = trigger_teleport_netsend;
- self.SendFlags = NETFLAG_TRIGGER_TELEPORT_FULLSEND;
+ self.SendFlags = NETFLAG_BASE_TRIGGER_FULLSEND;
// don't (shouldn't) need to call think anymore -- CEV
self.nextthink = -1;
@@ -466,9 +431,9 @@ ONLYMONSTER(16) will only teleport monsters
//--------------------------------------------------------------
void() trigger_teleport_use =
{
- // TODO CEV
self.nextthink = time + 0.2;
- self.estate = STATE_ACTIVE;
+ self.stateflags &= ~STATE_INACTIVE;
+ self.SendFlags |= NETFLAG_BASE_TRIGGER_STATEFLAGS;
// make sure even still objects get hit
force_retouch = 2;
self.think = sub_null;
@@ -483,44 +448,36 @@ ONLYMONSTER(16) will only teleport monsters
local vector org;
#endif
- if (self.estate != STATE_ACTIVE)
+ // is this trigger inactive? -- CEV
+ if (self.stateflags & STATE_INACTIVE)
return;
- /*
- if (self.targetname != "")
+ // Supa, is this trigger waiting to be activated?
+ if (self.stateflags & STATE_WAITING)
+ return;
+
+ if (other.classtype == CT_PLAYER)
{
- if (self.nextthink < time)
+ if (self.spawnflags &
+ SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER)
{
- // not fired yet
- dprint ("trigger_teleport_touch: not yet\n");
return;
}
}
- */
-
- // TODO CEV fix use of state as spawnflags
- if (self.state & SPAWNFLAG_TRIGGER_TELEPORT_ONLYPLAYER)
- {
- if (other.classtype != CT_PLAYER &&
- other.classtype != CT_PROJECTILE_GRENADE)
- return;
- }
-
- // is this going to work? dumptruck_ds
- if (self.state & SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER)
+ else
{
- if (other.classtype == CT_PLAYER)
+ if (self.spawnflags &
+ SPAWNFLAG_TRIGGER_TELEPORT_ONLYPLAYER)
+ {
return;
+ }
}
// from Copper -- dumptruck_ds
if (other.movetype == MOVETYPE_NOCLIP)
return;
- // Supa, is this trigger waiting to be activated?
- if (self.is_waiting == TRUE)
- return;
-
+ // TODO CEV
/*
// Special case
if (self.is_waiting != -1)
@@ -530,12 +487,9 @@ ONLYMONSTER(16) will only teleport monsters
return;
*/
- // only teleport living creatures (and projectiles)
- if (other.health <= 0 || (other.solid != SOLID_SLIDEBOX &&
- other.solid != SOLID_BBOX))
- {
+ // only teleport entities flagged as capable of it -- CEV
+ if (!(other.stateflags & STATE_TELEPORTABLE))
return;
- }
#ifdef SSQC
sub_usetargets ();
@@ -599,9 +553,9 @@ ONLYMONSTER(16) will only teleport monsters
// move the player and lock him down for a little while
if (!other.health)
{
- other.origin = self.neworigin;
- other.velocity = (v_forward * other.velocity_x) +
- (v_forward * other.velocity_y);
+ setorigin (other, self.neworigin);
+ other.angles = self.mangle;
+ other.velocity = v_forward * vlen (other.velocity);
return;
}
@@ -614,14 +568,6 @@ ONLYMONSTER(16) will only teleport monsters
// update view angles on the client side -- CEV
if (pmovecommandframe == clientcommandframe - 1)
{
- // TODO CEV
- /*
- dprint (sprintf("trigger_teleport_touch: "
- "updating angles at %g, tl %g; "
- "pmovecmdframe %g, clientcmdframe %g\n",
- time, input_timelength,
- pmovecommandframe, clientcommandframe));
- */
view_angles = self.mangle;
setproperty (VF_CL_VIEWANGLES, self.mangle);
}
@@ -643,19 +589,15 @@ ONLYMONSTER(16) will only teleport monsters
other.teleport_time = time + 0.7;
other.velocity = v_forward * PM_MAXSPEED;
}
-
- #ifdef SSQC
- if (self.spawnflags & SPAWNFLAG_TRIGGER_TELEPORT_ONLYMONSTER &&
- other.classtype != CT_PLAYER)
+ else
{
// turn this way immediately
other.fixangle = 1;
other.teleport_time = time + 0.7;
- other.velocity = v_forward * 300;
+ other.velocity = v_forward * PM_MAXSPEED;
if (other.flags & FL_ONGROUND)
- other.flags -= other.flags & FL_ONGROUND;
+ other.flags &= ~FL_ONGROUND;
}
- #endif
};
//--------------------------------------------------------------
@@ -684,24 +626,17 @@ ONLYMONSTER(16) will only teleport monsters
{
// schedule a think to find the destination -- CEV
if (self.targetname != "")
- e.estate = STATE_INACTIVE;
+ e.stateflags |= STATE_INACTIVE;
e.think = trigger_teleport_think_findtarget;
e.nextthink = time + 0.2 + (random() * 0.25);
}
if (!(e.spawnflags & SPAWNFLAG_TRIGGER_TELEPORT_SILENT))
{
- precache_sound ("ambience/hum1.wav");
- // volume was 0.5 -- CEV
- ambientsound ((e.mins + e.maxs) * 0.5,
- "ambience/hum1.wav", VOL_LOW, ATTN_STATIC);
+ precache_sound (snd_amb_telehum.wav);
+ AMBSOUND ((e.mins + e.maxs) * 0.5, snd_amb_telehum)
}
- // TODO CEV FIXME
- // copy spawnflags to state so the client will see it (and
- // touch() checks will work on both client and server) -- CEV
- e.state = e.spawnflags;
-
sub_checkwaiting (e);
#endif
};
@@ -711,12 +646,8 @@ ONLYMONSTER(16) will only teleport monsters
//--------------------------------------------------------------
void() trigger_teleport =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_teleport_init (self);
};
#endif
// };
-
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/textstory.qc
diff --git a/qc/triggers/textstory.qc b/qc/triggers/textstory.qc
index 85f57c9..925254b 100644
--- a/qc/triggers/textstory.qc
+++ b/qc/triggers/textstory.qc
@@ -26,6 +26,10 @@ typedef enumflags
} base_textstory_spawnflags;
#endif
+#ifdef SSQC
+const float BASE_TEXTSTORY_DEFAULT_FADE = 160;
+#endif
+
//======================================================================
// forward declarations
//======================================================================
@@ -34,6 +38,7 @@ typedef enumflags
// base_textstory
void(entity controller) base_textstory_hide;
void(entity controller) base_textstory_show;
+void(string key, string value) base_textstory_init_field;
#endif
#ifdef SSQC
@@ -52,12 +57,12 @@ void() target_textstory_helper_show;
entity(entity src, entity tgt, float nthink, float atkfinished)
spawn_target_textstory_helper;
void(entity e) target_textstory_helper_init;
-void() target_textstory_helper;
+strip void() target_textstory_helper;
#endif
#ifdef SSQC
// target_textstory
-void(entity tgt) target_textstory_spawn_helper;
+// void(entity tgt) target_textstory_spawn_helper;
void() target_textstory_use;
void(entity e) target_textstory_init;
void() target_textstory;
@@ -79,7 +84,7 @@ void() target_textstory;
if (!self.enemy || !(self.enemy.flags & FL_CLIENT))
return;
- self.enemy.suppressCenterPrint = FALSE;
+ self.enemy.stateflags &= ~STATE_SUPPRESSCENTERPRINT;
centerprint (self.enemy, "");
if (controller.noise2 != __NULL__ && controller.noise2 != "")
@@ -98,11 +103,11 @@ void() target_textstory;
if (!self.enemy || !(self.enemy.flags & FL_CLIENT))
return;
- self.enemy.suppressCenterPrint = TRUE;
+ self.enemy.stateflags |= STATE_SUPPRESSCENTERPRINT;
centerprint_builtin (self.enemy, controller.message);
- if (!self.state)
+ if (!(self.stateflags & STATE_INVISIBLE))
{
if (controller.noise1 != __NULL__ &&
controller.noise1 != "")
@@ -114,16 +119,27 @@ void() target_textstory;
if (!(controller.spawnflags &
SPAWNFLAG_BASE_TEXTSTORY_NOFADE))
{
- //custom fade amount --dumptruck_ds
- if (!self.fade_amt)
- csf_fade (self.enemy, 160, '0 0 0', 1);
- else
- csf_fade (self.enemy, self.fade_amt,
- '0 0 0', 1);
+ csf_fade (self.enemy, self.cnt, '0 0 0', 1);
}
}
- self.state = 1;
+ self.stateflags |= STATE_INVISIBLE;
+ };
+
+ //--------------------------------------------------------------
+ void(string key, string value) base_textstory_init_field =
+ {
+ switch (key)
+ {
+ case "fade_amt":
+ self.cnt = stof (value);
+ break;
+ case "is_waiting":
+ // rewrite is_waiting to a stateflag -- CEV
+ if (stof(value))
+ self.stateflags |= STATE_WAITING;
+ break;
+ }
};
// };
#endif
@@ -142,7 +158,7 @@ void() target_textstory;
base_textstory_hide (self);
self.enemy = world;
- self.state = 0;
+ self.stateflags &= ~STATE_INVISIBLE;
};
//--------------------------------------------------------------
@@ -159,14 +175,14 @@ void() target_textstory;
//--------------------------------------------------------------
void() trigger_textstory_touch =
{
- if (!(other.flags & FL_CLIENT))
+ if (self.stateflags & STATE_INACTIVE)
return;
- if (self.estate != STATE_ACTIVE)
+ if (!(other.flags & FL_CLIENT))
return;
// don't show message if another player is already triggering it
- if (other != self.enemy && self.state == 1)
+ if (other != self.enemy && self.stateflags & STATE_INVISIBLE)
return;
if (self.mangle && !is_in_angle (other.v_angle, self.mangle,
@@ -192,6 +208,10 @@ void() target_textstory;
e.touch = trigger_textstory_touch;
base_trigger_init (e);
+ // custom fade amount -- dumptruck_ds
+ if (!e.cnt)
+ e.cnt = BASE_TEXTSTORY_DEFAULT_FADE;
+
if (e.view_ofs == '0 0 0')
e.view_ofs = '90 90 0';
@@ -199,10 +219,10 @@ void() target_textstory;
e.mangle = normalize_angles180 (e.mangle);
if (e.noise1 == "")
- e.noise1 = "misc/talk.wav";
+ e.noise1 = snd_misc_talk.wav;
if (e.noise2 == "")
- e.noise2 = "misc/null.wav";
+ e.noise2 = snd_null.wav;
if (e.spawnflags & SPAWNFLAG_BASE_TEXTSTORY_SILENT)
{
@@ -222,10 +242,7 @@ void() target_textstory;
//--------------------------------------------------------------
void() trigger_textstory =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_textstory_init_field)
trigger_textstory_init (self);
};
// };
@@ -274,6 +291,7 @@ void() target_textstory;
e.enemy = tgt;
e.nextthink = nthink;
e.attack_finished = atkfinished;
+ e.cnt = src.cnt;
target_textstory_helper_init (e);
return e;
};
@@ -289,12 +307,8 @@ void() target_textstory;
};
//--------------------------------------------------------------
- void() target_textstory_helper =
+ strip void() target_textstory_helper =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
target_textstory_helper_init (self);
};
// };
@@ -307,20 +321,12 @@ void() target_textstory;
// class target_textstory: base_textstory
// {
//--------------------------------------------------------------
- // create the hidden object that'll show the actual message
- //--------------------------------------------------------------
- void(entity tgt) target_textstory_spawn_helper =
- {
- entity helper = spawn_target_textstory_helper (self, tgt,
- time + 0.1, time + self.wait);
- };
-
- //--------------------------------------------------------------
void() target_textstory_use =
{
- if (!(activator.flags & FL_CLIENT))
+ if (self.stateflags & STATE_INACTIVE)
return;
- if (self.estate != STATE_ACTIVE)
+
+ if (!(activator.flags & FL_CLIENT))
return;
local entity t;
@@ -330,13 +336,15 @@ void() target_textstory;
t = findfloat (world, classtype, CT_PLAYER);
while (t)
{
- target_textstory_spawn_helper (t);
+ spawn_target_textstory_helper (self, t,
+ time + 0.1, time + self.wait);
t = findfloat (t, classtype, CT_PLAYER);
}
}
else
{
- target_textstory_spawn_helper (activator);
+ spawn_target_textstory_helper (self, activator,
+ time + 0.1, time + self.wait);
}
};
@@ -347,11 +355,15 @@ void() target_textstory;
e.classtype = CT_TARGET_TEXTSTORY;
base_mapentity_init (e);
+ // custom fade amount -- dumptruck_ds
+ if (!e.cnt)
+ e.cnt = BASE_TEXTSTORY_DEFAULT_FADE;
+
if (e.noise1 == "")
- e.noise1 = "misc/talk.wav";
+ e.noise1 = snd_misc_talk.wav;
if (e.noise2 == "")
- e.noise2 = "misc/null.wav";
+ e.noise2 = snd_null.wav;
if (e.spawnflags & SPAWNFLAG_BASE_TEXTSTORY_SILENT) {
e.noise1 = "";
@@ -372,10 +384,7 @@ void() target_textstory;
//--------------------------------------------------------------
void() target_textstory =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_textstory_init_field)
target_textstory_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/usekey.qc
diff --git a/qc/triggers/usekey.qc b/qc/triggers/usekey.qc
index 0c10181..96b39a6 100644
--- a/qc/triggers/usekey.qc
+++ b/qc/triggers/usekey.qc
@@ -179,10 +179,7 @@ targets. Must be targeted at one or more entities.
//--------------------------------------------------------------
void() trigger_usekey =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_usekey_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/triggers/void.qc
diff --git a/qc/triggers/void.qc b/qc/triggers/void.qc
index a23f061..7edb6c0 100644
--- a/qc/triggers/void.qc
+++ b/qc/triggers/void.qc
@@ -55,7 +55,7 @@ Removes monsters, gibs, ammo, etc... also kills player.
//--------------------------------------------------------------
void() trigger_void_touch =
{
- if (self.estate != STATE_ACTIVE)
+ if (self.stateflags & STATE_INACTIVE)
return;
// entity has already been removed -- CEV
@@ -96,16 +96,11 @@ Removes monsters, gibs, ammo, etc... also kills player.
}
else if (other.classtype != CT_PLAYER)
{
- // remove projectiles -- CEV
if (other.classgroup & CG_PROJECTILE)
base_entity_remove (other);
-
- // remove corpses - gibs, heads, bodies -- CEV
- if (other.classgroup & CG_CORPSE)
+ else if (other.classgroup & CG_CORPSE)
base_entity_remove (other);
-
- // remove all items -- CEV
- if (other.classgroup & CG_ITEM)
+ else if (other.classgroup & CG_ITEM)
base_entity_remove (other);
}
@@ -125,10 +120,7 @@ Removes monsters, gibs, ammo, etc... also kills player.
//--------------------------------------------------------------
void() trigger_void =
{
- // new spawnflags for all entities -- iw
- if (SUB_Inhibit())
- return;
-
+ BASE_TRIGGER_PREINIT (base_trigger_init_field)
trigger_void_init (self);
};
// };
Return to the top of this page or return to the overview of this repo.
Diff qc/world.qc
diff --git a/qc/world.qc b/qc/world.qc
index 1696087..c57f9ee 100644
--- a/qc/world.qc
+++ b/qc/world.qc
@@ -50,14 +50,13 @@ typedef enum
//======================================================================
#ifdef SSQC
-entity debris_head;
entity bodyque_head;
entity lastspawn;
-float known_release; // unique ID for a release
nosave float *world_sounds; // via Spike fun times! nosave=noclobber
#endif
#if defined(CSQC) || defined(SSQC)
+float known_release; // unique ID for a release
float world_airstep; // latched cvars, reset on world spawn
float world_gravity;
float world_maxvelocity;
@@ -68,14 +67,6 @@ float world_clsidespeed;
#endif
//======================================================================
-// fields
-//======================================================================
-
-#if defined(CSQC) || defined(SSQC)
-.string map;
-#endif
-
-//======================================================================
// forward declarations
//======================================================================
@@ -84,6 +75,8 @@ void() world_latched_cvars;
#endif
#ifdef SSQC
void() world_weapon_precache;
+#endif
+#if defined(CSQC) || defined(SSQC)
void() world_detect_known_release;
float(vector offset) world_surface_type;
#endif
@@ -126,117 +119,120 @@ void() world_latched_cvars =
//----------------------------------------------------------------------
void() world_weapon_precache =
{
- precache_sound ("weapons/r_exp3.wav"); // rocket explosion
- precache_sound ("weapons/rocket1i.wav");// spike gun
- precache_sound ("weapons/sgun1.wav");
- precache_sound ("weapons/guncock.wav"); // player shotgun
- precache_sound ("weapons/ric1.wav"); // ricochet (used in c code)
- precache_sound ("weapons/ric2.wav"); // ricochet (used in c code)
- precache_sound ("weapons/ric3.wav"); // ricochet (used in c code)
- precache_sound ("weapons/spike2.wav"); // super spikes
- precache_sound ("weapons/tink1.wav"); // spikes tink (used in c code)
- precache_sound ("weapons/grenade.wav"); // grenade launcher
- precache_sound ("weapons/bounce.wav"); // grenade bounce
- precache_sound ("weapons/shotgn2.wav"); // super shotgun
+ precache_sound (snd_weapon_rocket_explosion.wav);// rocket explosion
+ precache_sound (snd_weapon_nailgun.wav);// spike gun
+ precache_sound (snd_weapon_rocketlauncher.wav);
+ precache_sound (snd_weapon_shotgun.wav);// player shotgun
+ precache_sound (snd_weapon_ric1.wav); // ricochet (used in c code)
+ precache_sound (snd_weapon_ric2.wav); // ricochet (used in c code)
+ precache_sound (snd_weapon_ric3.wav); // ricochet (used in c code)
+ precache_sound (snd_weapon_supernailgun.wav); // super spikes
+ precache_sound (snd_weapon_tink1.wav); // spikes tink (used in c code)
+ precache_sound (snd_weapon_grenadelauncher.wav); // grenade launcher
+ precache_sound (snd_weapon_grenade_bounce.wav); // grenade bounce
+ precache_sound (snd_weapon_supershotgun.wav); // super shotgun
// cev custom weapons precaches START
precache_sound ("cev/weapons/boltexpl.ogg");
- precache_sound ("cev/items/noammo.ogg");
+ precache_sound (snd_weapon_noammo.wav);
// dumptruck_ds mobot.qc precaches START
+ precache_model ("progs/gib1.mdl");
+ precache_model ("progs/gib2.mdl");
+ precache_model ("progs/gib3.mdl");
+ precache_sound (snd_player_udeath.wav); // gib death
+
+ // ogres
precache_model ("progs/ogre.mdl");
precache_model ("progs/h_ogre.mdl");
precache_model ("progs/grenade.mdl");
- precache_sound ("ogre/ogdrag.wav");
- precache_sound ("ogre/ogdth.wav");
- precache_sound ("ogre/ogidle.wav");
- precache_sound ("ogre/ogidle2.wav");
- precache_sound ("ogre/ogpain1.wav");
- precache_sound ("ogre/ogsawatk.wav");
- precache_sound ("ogre/ogwake.wav");
-
+ precache_sound (snd_ogre_drag.wav);
+ precache_sound (snd_ogre_death.wav);
+ precache_sound (snd_ogre_idle_01.wav);
+ precache_sound (snd_ogre_idle_02.wav);
+ precache_sound (snd_ogre_pain.wav);
+ precache_sound (snd_ogre_attack.wav);
+ precache_sound (snd_ogre_sight.wav);
+
+ // fiends
precache_model ("progs/demon.mdl");
precache_model ("progs/h_demon.mdl");
-
- precache_sound ("demon/ddeath.wav");
- precache_sound ("demon/dhit2.wav");
- precache_sound ("demon/djump.wav");
- precache_sound ("demon/dpain1.wav");
- precache_sound ("demon/idle1.wav");
- precache_sound ("demon/sight2.wav");
-
+ precache_sound (snd_demon1_death.wav);
+ precache_sound (snd_demon1_hit2.wav);
+ precache_sound (snd_demon1_jump.wav);
+ precache_sound (snd_demon1_pain.wav);
+ precache_sound (snd_demon1_idle1.wav);
+ precache_sound (snd_demon1_sight2.wav);
+
+ // enforcers
precache_model2 ("progs/enforcer.mdl");
precache_model2 ("progs/h_mega.mdl");
precache_model2 ("progs/laser.mdl");
precache_model2 ("progs/s_spike.mdl");
-
- precache_sound2 ("enforcer/death1.wav");
- precache_sound2 ("enforcer/enfire.wav");
- precache_sound2 ("enforcer/enfstop.wav");
- precache_sound2 ("enforcer/idle1.wav");
- precache_sound2 ("enforcer/pain1.wav");
- precache_sound2 ("enforcer/pain2.wav");
- precache_sound2 ("enforcer/sight1.wav");
- precache_sound2 ("enforcer/sight2.wav");
- precache_sound2 ("enforcer/sight3.wav");
- precache_sound2 ("enforcer/sight4.wav");
-
+ precache_sound2 (snd_enforcer_death.wav);
+ precache_sound2 (snd_enforcer_fire.wav);
+ precache_sound2 (snd_enforcer_fire_hit.wav);
+ precache_sound2 (snd_enforcer_idle.wav);
+ precache_sound2 (snd_enforcer_pain_01.wav);
+ precache_sound2 (snd_enforcer_pain_02.wav);
+ precache_sound2 (snd_enforcer_sight_01.wav);
+ precache_sound2 (snd_enforcer_sight_02.wav);
+ precache_sound2 (snd_enforcer_sight_03.wav);
+ precache_sound2 (snd_enforcer_sight_04.wav);
+
+ // army / grunts / soldiers
precache_model ("progs/soldier.mdl");
precache_model ("progs/h_guard.mdl");
-
- precache_model ("progs/gib1.mdl");
- precache_model ("progs/gib2.mdl");
- precache_model ("progs/gib3.mdl");
-
- precache_sound ("soldier/death1.wav");
- precache_sound ("soldier/idle.wav");
- precache_sound ("soldier/pain1.wav");
- precache_sound ("soldier/pain2.wav");
- precache_sound ("soldier/sattck1.wav");
- precache_sound ("soldier/sight1.wav");
- precache_sound ("player/udeath.wav"); // gib death
-
+ precache_sound (snd_army_death.wav);
+ precache_sound (snd_army_idle.wav);
+ precache_sound (snd_army_pain_01.wav);
+ precache_sound (snd_army_pain_02.wav);
+ precache_sound (snd_army_attack.wav);
+ precache_sound (snd_army_sight.wav);
+
+ // dogs
precache_model ("progs/h_dog.mdl");
precache_model ("progs/dog.mdl");
- precache_sound ("dog/dattack1.wav");
- precache_sound ("dog/ddeath.wav");
- precache_sound ("dog/dpain1.wav");
- precache_sound ("dog/dsight.wav");
- precache_sound ("dog/idle.wav");
+ precache_sound (snd_dog_attack1.wav);
+ precache_sound (snd_dog_death.wav);
+ precache_sound (snd_dog_pain.wav);
+ precache_sound (snd_dog_sight.wav);
+ precache_sound (snd_dog_idle.wav);
+ // scrags / wizards
precache_model ("progs/wizard.mdl");
precache_model ("progs/h_wizard.mdl");
precache_model ("progs/w_spike.mdl");
-
- precache_sound ("wizard/hit.wav"); // used by c code
- precache_sound ("wizard/wattack.wav");
- precache_sound ("wizard/wdeath.wav");
- precache_sound ("wizard/widle1.wav");
- precache_sound ("wizard/widle2.wav");
- precache_sound ("wizard/wpain.wav");
- precache_sound ("wizard/wsight.wav");
-
+ precache_sound (snd_wizard_hit.wav); // used by c code
+ precache_sound (snd_wizard_attack.wav);
+ precache_sound (snd_wizard_death.wav);
+ precache_sound (snd_wizard_idle_01.wav);
+ precache_sound (snd_wizard_idle_02.wav);
+ precache_sound (snd_wizard_pain.wav);
+ precache_sound (snd_wizard_sight.wav);
+
+ // shalrath / vores
precache_model2 ("progs/shalrath.mdl");
precache_model2 ("progs/h_shal.mdl");
precache_model2 ("progs/v_spike.mdl");
-
- precache_sound2 ("shalrath/attack.wav");
- precache_sound2 ("shalrath/attack2.wav");
- precache_sound2 ("shalrath/death.wav");
- precache_sound2 ("shalrath/idle.wav");
- precache_sound2 ("shalrath/pain.wav");
- precache_sound2 ("shalrath/sight.wav");
-
+ precache_sound2 (snd_shalrath_attack_01.wav);
+ precache_sound2 (snd_shalrath_attack_02.wav);
+ precache_sound2 (snd_shalrath_death.wav);
+ precache_sound2 (snd_shalrath_idle.wav);
+ precache_sound2 (snd_shalrath_pain.wav);
+ precache_sound2 (snd_shalrath_sight.wav);
+
+ // knights
precache_model ("progs/knight.mdl");
precache_model ("progs/h_knight.mdl");
-
- precache_sound ("knight/kdeath.wav");
- precache_sound ("knight/khurt.wav");
- precache_sound ("knight/ksight.wav");
- precache_sound ("knight/sword1.wav");
- precache_sound ("knight/sword2.wav");
- precache_sound ("knight/idle.wav");
-
+ precache_sound (snd_knight_death.wav);
+ precache_sound (snd_knight_pain.wav);
+ precache_sound (snd_knight_sight.wav);
+ precache_sound (snd_knight_sword_01.wav);
+ precache_sound (snd_knight_sword_02.wav);
+ precache_sound (snd_knight_idle.wav);
+
+ // death knights / hell knights
precache_model2 ("progs/hknight.mdl");
precache_model2 ("progs/k_spike.mdl");
precache_model2 ("progs/k_spike2.mdl");
@@ -244,56 +240,48 @@ void() world_weapon_precache =
precache_model2 ("progs/hknight.mdl");
precache_model2 ("progs/h_hellkn.mdl");
precache_model2 ("progs/k_spike.mdl");
-
- precache_sound2 ("hknight/attack1.wav");
- precache_sound2 ("hknight/death1.wav");
- precache_sound2 ("hknight/pain1.wav");
- precache_sound2 ("hknight/sight1.wav");
- precache_sound ("hknight/hit.wav"); // used by C code; don't sound2
- precache_sound2 ("hknight/slash1.wav");
- precache_sound2 ("hknight/idle.wav");
- precache_sound2 ("hknight/grunt.wav");
- precache_sound ("knight/sword1.wav");
- precache_sound ("knight/sword2.wav");
-
- precache_sound2 ("blob/death1.wav");
- precache_sound2 ("blob/hit1.wav");
- precache_sound2 ("blob/land1.wav");
- precache_sound2 ("blob/sight1.wav");
-
+ precache_sound2 (snd_hknight_attack.wav);
+ precache_sound2 (snd_hknight_death.wav);
+ precache_sound2 (snd_hknight_pain.wav);
+ precache_sound2 (snd_hknight_sight.wav);
+ precache_sound (snd_hknight_hit.wav); // used by C code; don't sound2
+ precache_sound2 (snd_hknight_slash.wav);
+ precache_sound2 (snd_hknight_idle.wav);
+ precache_sound2 (snd_hknight_grunt.wav);
+
+ // zombies
precache_model ("progs/zombie.mdl");
precache_model ("progs/h_zombie.mdl");
precache_model ("progs/zom_gib.mdl");
-
- precache_sound ("zombie/z_idle.wav");
- precache_sound ("zombie/z_idle1.wav");
- precache_sound ("zombie/z_shot1.wav");
- precache_sound ("zombie/z_gib.wav");
- precache_sound ("zombie/z_pain.wav");
- precache_sound ("zombie/z_pain1.wav");
- precache_sound ("zombie/z_fall.wav");
- precache_sound ("zombie/z_miss.wav");
- precache_sound ("zombie/z_hit.wav");
- precache_sound ("zombie/idle_w2.wav");
-
+ precache_sound (snd_zombie_idle_01.wav);
+ precache_sound (snd_zombie_idle_02.wav);
+ precache_sound (snd_zombie_shot.wav);
+ precache_sound (snd_zombie_gib.wav);
+ precache_sound (snd_zombie_pain_01.wav);
+ precache_sound (snd_zombie_pain_02.wav);
+ precache_sound (snd_zombie_fall.wav);
+ precache_sound (snd_zombie_miss.wav);
+ precache_sound (snd_zombie_hit.wav);
+ precache_sound (snd_zombie_idle_03.wav);
+
+ // shamblers
precache_model ("progs/shambler.mdl");
precache_model ("progs/s_light.mdl");
precache_model ("progs/h_shams.mdl");
precache_model ("progs/bolt.mdl");
-
- precache_sound ("shambler/sattck1.wav");
- precache_sound ("shambler/sboom.wav");
- precache_sound ("shambler/sdeath.wav");
- precache_sound ("shambler/shurt2.wav");
- precache_sound ("shambler/sidle.wav");
- precache_sound ("shambler/ssight.wav");
- precache_sound ("shambler/melee1.wav");
- precache_sound ("shambler/melee2.wav");
- precache_sound ("shambler/smack.wav");
+ precache_sound (snd_shambler_attack.wav);
+ precache_sound (snd_shambler_boom.wav);
+ precache_sound (snd_shambler_death.wav);
+ precache_sound (snd_shambler_pain.wav);
+ precache_sound (snd_shambler_idle.wav);
+ precache_sound (snd_shambler_sight.wav);
+ precache_sound (snd_shambler_melee_01.wav);
+ precache_sound (snd_shambler_melee_02.wav);
+ precache_sound (snd_shambler_smack.wav);
// dumptruck_ds mobot.qc END
// CEV fish bite sound
- precache_sound ("fish/bite.wav");
+ precache_sound (snd_fish_bite.wav);
// CEV minigrenade model
precache_model ("progs/mervup.mdl");
@@ -304,7 +292,9 @@ void() world_weapon_precache =
// CEV bullet projectile model from AD
precache_model ("progs/ad/proj_diam2.mdl");
};
+#endif
+#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
// DetectKnownRelease
// This detects whether the current map is from a known release for which
@@ -403,7 +393,8 @@ void() world_detect_known_release =
case "cpm25": case "cpm26": case "cpm27": case "cpm28":
case "cpm29": case "cpm30_b1": case "cpm32_b1": case "cpm33_b1":
case "cpmctf1": case "cpmctf2": case "cpmctf3":
- case "cpmctf4": case "cpmctf5":
+ case "cpmctf4": case "cpmctf5": case "hcmhxn10":
+ case "calendar":
known_release = KNOWN_RELEASE_CPMA;
release_name = "Challenge Pro Mode Arena";
break;
@@ -458,7 +449,7 @@ float(vector offset) world_surface_type =
if (known_release == KNOWN_RELEASE_NOT)
return SURFACE_UNKNOWN;
- if (self.pm_flags & PMF_WALLJUMPED)
+ if (self.moveflags & PMF_WALLJUMPED)
return SURFACE_UNKNOWN;
local string tex = "";
@@ -609,10 +600,10 @@ sky(string) : "Sky Texture" : : "Must have compatible skybox textures in gfx/en
*/
void() worldspawn =
{
- #ifdef SSQC
// check this map's filename & try to detect a release -- CEV
world_detect_known_release ();
+ #ifdef SSQC
// new spawnflags for all entities -- iw
InitNewSpawnflags ();
@@ -624,24 +615,6 @@ void() worldspawn =
lastspawn = world;
InitBodyQue ();
-
- // TODO CEV debris fading system FIXME
- local entity debris;
- local float debris_count = 0;
-
- debris = spawn ();
- debris.classname = "debris";
- debris.owner = debris;
- debris_head = debris;
-
- while (debris_count < 64)
- {
- debris = spawn ();
- debris.classname = "debris";
- debris.owner = debris_head.owner;
- debris_head.owner = debris;
- debris_count += 1;
- }
#endif
self.classname = "world";
@@ -677,122 +650,121 @@ void() worldspawn =
world_weapon_precache ();
// sounds used from C physics code
- precache_sound ("demon/dland2.wav"); // landing thud
- precache_sound ("misc/h2ohit1.wav"); // landing splash
+ precache_sound (snd_demon1_land.wav); // landing thud
+ precache_sound (snd_misc_h2ohit.wav); // landing splash
// setup precaches always needed
- precache_sound ("misc/null.wav"); // empty sound
- precache_sound ("items/itembk2.wav"); // item respawn sound
- precache_sound ("player/plyrjmp8.wav"); // player jump
- precache_sound ("player/land.wav"); // player landing
- precache_sound ("player/land2.wav"); // player hurt landing
- precache_sound ("player/drown1.wav"); // drowning pain
- precache_sound ("player/drown2.wav"); // drowning pain
- precache_sound ("player/gasp1.wav"); // gasping for air
- precache_sound ("player/gasp2.wav"); // taking breath
- precache_sound ("player/h2odeath.wav"); // drowning death
+ precache_sound (snd_null.wav); // empty sound
+ precache_sound (snd_player_jump_00.wav);// player jump
+ precache_sound (snd_player_land_01.wav);// player landing
+ precache_sound (snd_player_land_02.wav);// player hurt landing
+ precache_sound (snd_player_drown_01.wav); // drowning pain
+ precache_sound (snd_player_drown_02.wav); // drowning pain
+ precache_sound (snd_player_gasp_01.wav);// gasping for air
+ precache_sound (snd_player_gasp_02.wav);// taking breath
+ precache_sound (snd_player_h2odeath.wav); // drowning death
// player footstep sounds -- CEV
- precache_sound ("cev/player/dive.ogg");
- precache_sound ("cev/player/jump_01.ogg");
- precache_sound ("cev/player/jump_02.ogg");
- precache_sound ("cev/player/jump_03.ogg");
- precache_sound ("cev/player/jump_04.ogg");
- precache_sound ("cev/player/step_dirt_01.ogg");
- precache_sound ("cev/player/step_dirt_02.ogg");
- precache_sound ("cev/player/step_dirt_03.ogg");
- precache_sound ("cev/player/step_dirt_04.ogg");
- precache_sound ("cev/player/step_dirt_05.ogg");
- precache_sound ("cev/player/step_metal_01.ogg");
- precache_sound ("cev/player/step_metal_02.ogg");
- precache_sound ("cev/player/step_metal_03.ogg");
- precache_sound ("cev/player/step_metal_04.ogg");
- precache_sound ("cev/player/step_metal_05.ogg");
- precache_sound ("cev/player/step_metal_06.ogg");
- precache_sound ("cev/player/step_metal_07.ogg");
- precache_sound ("cev/player/step_metal_08.ogg");
- precache_sound ("cev/player/step_metal_09.ogg");
- precache_sound ("cev/player/step_stone_01.ogg");
- precache_sound ("cev/player/step_stone_02.ogg");
- precache_sound ("cev/player/step_stone_03.ogg");
- precache_sound ("cev/player/step_stone_04.ogg");
- precache_sound ("cev/player/step_stone_05.ogg");
- precache_sound ("cev/player/step_stone_06.ogg");
- precache_sound ("cev/player/step_water_01.ogg");
- precache_sound ("cev/player/step_water_02.ogg");
- precache_sound ("cev/player/step_water_03.ogg");
- precache_sound ("cev/player/step_water_04.ogg");
- precache_sound ("cev/player/step_wood_01.ogg");
- precache_sound ("cev/player/step_wood_02.ogg");
- precache_sound ("cev/player/step_wood_03.ogg");
- precache_sound ("cev/player/step_wood_04.ogg");
- precache_sound ("cev/player/wade_water_01.ogg");
- precache_sound ("cev/player/wade_water_02.ogg");
-
- precache_sound ("misc/talk.wav"); // talk
- precache_sound ("player/teledth1.wav"); // telefrag
- precache_sound ("misc/r_tele1.wav"); // teleport sounds
- precache_sound ("misc/r_tele2.wav");
- precache_sound ("misc/r_tele3.wav");
- precache_sound ("misc/r_tele4.wav");
- precache_sound ("misc/r_tele5.wav");
- precache_sound ("cev/items/ammo_pickup.ogg"); // ammo pick up
- precache_sound ("cev/items/backpack_pickup.ogg"); // backpack up
- precache_sound ("cev/items/weapon_pickup.ogg"); // weapon up
- precache_sound ("items/armor1.wav"); // armor up
- precache_sound ("weapons/lhit.wav"); // lightning
- precache_sound ("weapons/lstart.wav"); // lightning start
+ precache_sound (snd_player_slide_00.wav);
+ precache_sound (snd_player_jump_01.wav);
+ precache_sound (snd_player_jump_02.wav);
+ precache_sound (snd_player_jump_03.wav);
+ precache_sound (snd_player_jump_04.wav);
+ precache_sound (snd_player_stepdirt_01.wav);
+ precache_sound (snd_player_stepdirt_02.wav);
+ precache_sound (snd_player_stepdirt_03.wav);
+ precache_sound (snd_player_stepdirt_04.wav);
+ precache_sound (snd_player_stepdirt_05.wav);
+ precache_sound (snd_player_stepmetal_01.wav);
+ precache_sound (snd_player_stepmetal_02.wav);
+ precache_sound (snd_player_stepmetal_03.wav);
+ precache_sound (snd_player_stepmetal_04.wav);
+ precache_sound (snd_player_stepmetal_05.wav);
+ precache_sound (snd_player_stepmetal_06.wav);
+ precache_sound (snd_player_stepmetal_07.wav);
+ precache_sound (snd_player_stepmetal_08.wav);
+ precache_sound (snd_player_stepmetal_09.wav);
+ precache_sound (snd_player_stepstone_01.wav);
+ precache_sound (snd_player_stepstone_02.wav);
+ precache_sound (snd_player_stepstone_03.wav);
+ precache_sound (snd_player_stepstone_04.wav);
+ precache_sound (snd_player_stepstone_05.wav);
+ precache_sound (snd_player_stepstone_06.wav);
+ precache_sound (snd_player_stepwater_01.wav);
+ precache_sound (snd_player_stepwater_02.wav);
+ precache_sound (snd_player_stepwater_03.wav);
+ precache_sound (snd_player_stepwater_04.wav);
+ precache_sound (snd_player_stepwood_01.wav);
+ precache_sound (snd_player_stepwood_02.wav);
+ precache_sound (snd_player_stepwood_03.wav);
+ precache_sound (snd_player_stepwood_04.wav);
+ precache_sound (snd_player_wadewater_01.wav);
+ precache_sound (snd_player_wadewater_01.wav);
+
+ precache_sound (snd_misc_talk.wav); // talk
+ precache_sound (snd_player_teledeath.wav); // telefrag
+ precache_sound (snd_misc_tele1.wav); // teleport sounds
+ precache_sound (snd_misc_tele2.wav);
+ precache_sound (snd_misc_tele3.wav);
+ precache_sound (snd_misc_tele4.wav);
+ precache_sound (snd_misc_tele5.wav);
+ precache_sound (snd_item_ammo.wav); // ammo pick up
+ precache_sound (snd_item_backpack.wav); // backpack up
+ precache_sound (snd_item_weapon.wav); // weapon up
+ precache_sound (snd_item_armor.wav); // armor up
+ precache_sound (snd_weapon_lightning_start.wav); // lightning
+ precache_sound (snd_weapon_lightning_hit.wav); // lightning start
// iw -- fix powerup cheat sounds
// noticed this in Copper so why not? -- ds
// sounds used by cheats
- precache_sound ("items/suit2.wav"); // suit (finish)
- precache_sound ("items/protect2.wav"); // pent (finish)
- precache_sound ("items/protect3.wav"); // pent (protect)
- precache_sound ("items/inv2.wav"); // ring (finish)
- precache_sound ("items/inv3.wav"); // ring (idle)
- precache_sound ("items/damage2.wav"); // quad (finish)
- precache_sound ("items/damage3.wav"); // quad (attack)
+ precache_sound (snd_item_suit_off.wav); // suit (finish)
+ precache_sound (snd_item_pent_off.wav); // pent (finish)
+ precache_sound (snd_item_pent_prot.wav);// pent (protect)
+ precache_sound (snd_item_invis_off.wav);// ring (finish)
+ precache_sound (snd_item_invis_amb.wav);// ring (idle)
+ precache_sound (snd_item_quad_off.wav); // quad (finish)
+ precache_sound (snd_item_quad_dam.wav); // quad (attack)
// iw -- END
- precache_sound ("misc/power.wav"); // lightning for boss
+ precache_sound (snd_misc_power.wav); // lightning for boss
// player gib sounds
- precache_sound ("player/gib.wav"); // player gib sound
- precache_sound ("player/udeath.wav"); // player gib sound
- precache_sound ("player/tornoff2.wav"); // gib sound
+ precache_sound (snd_player_gib_01.wav); // player gib sound
+ precache_sound (snd_player_udeath.wav); // player gib sound
+ precache_sound (snd_player_tornoff2.wav); // gib sound
// player pain sounds
- precache_sound ("player/pain1.wav");
- precache_sound ("player/pain2.wav");
- precache_sound ("player/pain3.wav");
- precache_sound ("player/pain4.wav");
- precache_sound ("player/pain5.wav");
- precache_sound ("player/pain6.wav");
+ precache_sound (snd_player_pain_01.wav);
+ precache_sound (snd_player_pain_02.wav);
+ precache_sound (snd_player_pain_03.wav);
+ precache_sound (snd_player_pain_04.wav);
+ precache_sound (snd_player_pain_05.wav);
+ precache_sound (snd_player_pain_06.wav);
// player death sounds
- precache_sound ("player/death1.wav");
- precache_sound ("player/death2.wav");
- precache_sound ("player/death3.wav");
- precache_sound ("player/death4.wav");
- precache_sound ("player/death5.wav");
+ precache_sound (snd_player_death_01.wav);
+ precache_sound (snd_player_death_02.wav);
+ precache_sound (snd_player_death_03.wav);
+ precache_sound (snd_player_death_04.wav);
+ precache_sound (snd_player_death_05.wav);
// ax sounds
- precache_sound ("weapons/ax1.wav"); // ax swoosh
- precache_sound ("player/axhit1.wav"); // ax hit meat
- precache_sound ("player/axhit2.wav"); // ax hit world
+ precache_sound (snd_weapon_axe_swoosh.wav); // ax swoosh
+ precache_sound (snd_weapon_axe_hit_meat.wav); // ax hit meat
+ precache_sound (snd_weapon_axe_hit_world.wav); // ax hit world
- precache_sound ("player/h2ojump.wav"); // player jumping into water
- precache_sound ("player/slimbrn2.wav"); // player enter slime
- precache_sound ("player/inh2o.wav"); // player enter water
- precache_sound ("player/inlava.wav"); // player enter lava
- precache_sound ("misc/outwater.wav"); // leaving water sound
+ precache_sound (snd_player_jumpwater.wav);// player jumping into water
+ precache_sound (snd_player_inslime.wav);// player enter slime
+ precache_sound (snd_player_inwater.wav);// player enter water
+ precache_sound (snd_player_inlava.wav); // player enter lava
+ precache_sound (snd_misc_outwater.wav); // leaving water sound
- precache_sound ("player/lburn1.wav"); // lava burn
- precache_sound ("player/lburn2.wav"); // lava burn
+ precache_sound (snd_player_lavaburn_01.wav); // lava burn
+ precache_sound (snd_player_lavaburn_02.wav); // lava burn
- precache_sound ("misc/water1.wav"); // swimming
- precache_sound ("misc/water2.wav"); // swimming
+ precache_sound (snd_player_water_01.wav); // swimming
+ precache_sound (snd_player_water_02.wav); // swimming
precache_model ("progs/player.mdl");
// Invisible -- Drake -- dumptruck_ds
@@ -839,17 +811,17 @@ void() worldspawn =
// dumptruck_ds needed for DropStuff
precache_model ("progs/w_s_key.mdl");
precache_model ("progs/w_g_key.mdl");
- precache_sound ("misc/medkey.wav");
- precache_sound ("misc/runekey.wav");
+ precache_sound (snd_item_key_med.wav);
+ precache_sound (snd_item_key_rune.wav);
precache_model ("progs/m_s_key.mdl");
precache_model ("progs/m_g_key.mdl");
- precache_sound2 ("misc/basekey.wav");
+ precache_sound2 (snd_item_key_base.wav);
precache_model2 ("progs/b_s_key.mdl");
precache_model2 ("progs/b_g_key.mdl");
- precache_model ("progs/health/pd_vial.mdl"); // DropVial -- dumptruck_ds
- precache_sound ("items/r_item1.wav");
- precache_sound ("cev/items/shard_pickup.ogg");// DropShard -dumptruck_ds
- precache_sound ("cev/items/respawn.ogg"); // CEV
+ precache_model ("progs/h_mdls/pd_vial.mdl"); // DropVial -- dumptruck_ds
+ precache_sound (snd_item_health_rott.wav);
+ precache_sound (snd_item_shard.wav); // DropShard -dumptruck_ds
+ precache_sound (snd_item_respawn.wav); // CEV
precache_model ("progs/armshr.mdl");
// Setup light anim tables. 'a' is total darkness, 'z' is maxbright.
Return to the top of this page or return to the overview of this repo.