djcev.com

//

Git Repos / fte_dogmode / qc / base_trigger.qc

Last update to this file was on 2025-08-13 at 05:20.

Show base_trigger.qc

//==============================================================================
// base_trigger.qc -- trigger base class
//==============================================================================

//======================================================================
// constants
//======================================================================

#if defined(CSQC) || defined(SSQC)
//----------------------------------------------------------------------
// base_trigger netflags -- CEV
// STATE needed for endwaiting & needs to be the same in child classes -- CEV
//----------------------------------------------------------------------
typedef enumflags
{
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

//======================================================================
// forward declarations
//======================================================================

// 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;
#endif
#ifdef SSQC
strip void() base_trigger;
#endif

//------------------------------------------------------------------------------

//----------------------------------------------------------------------
// 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
//==============================================================

#ifdef SSQC
//--------------------------------------------------------------
void(entity e) sub_checkwaiting =
{
if (!(e.stateflags & STATE_WAITING))
return;

if (known_release == KNOWN_RELEASE_MG1)
// MG1 compat -- CEV
return;

// store current use to swap later
e.use1 = e.use;
e.use = sub_endwaiting;
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_STATEFLAGS;
};

//--------------------------------------------------------------
void() sub_endwaiting =
{
self.stateflags &= ~STATE_WAITING;
self.stateflags &= ~STATE_INACTIVE;

if (self.use == sub_endwaiting)
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_STATEFLAGS;
};
#endif

//==============================================================
// 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
// PM: The point trigger version of InitTrigger.
//--------------------------------------------------------------
void(entity e) base_trigger_point_init =
{
local vector v1, v2;

v1 = e.origin;
v2 = v1 + e.mangle;
e.model = "";
setorigin (e, '0 0 0');

// Calls 'setmodel', so do first.
base_trigger_init (e);

// Calling 'setmodel' resets entity size.
setsize (e, v1, v2);
};

//--------------------------------------------------------------
// InitTrigger
//--------------------------------------------------------------
void(entity e) base_trigger_init =
{
base_mapentity_init (e);

e.classgroup |= CG_TRIGGER;

e.solid = SOLID_TRIGGER;

#ifdef SSQC
// trigger angles are used for one-way touches. An angle of
// 0 is assumed to mean no restrictions, so use a yaw of 360
// instead.
if (e.angles != '0 0 0')
sub_setmovedir (e);

// set size and link into world
setmodel (e, e.model);
e.movetype = MOVETYPE_NONE;
e.modelindex = 0;
e.model = "";
#endif
};
#endif

#ifdef SSQC
//--------------------------------------------------------------
strip void() base_trigger =
{
base_trigger_init (self);
};
// };
#endif

Return to the top of this page or return to the overview of this repo.

Log base_trigger.qc

Return to the top of this page or return to the overview of this repo.