Added custom GLSL with support for the new gl_fake16bit, gl_affinemodels
Added support for respawns of map entities Started redoing hostages... they don't have any animations right now. Don't be surprised. Moved most/if-not-all CS specific entities into their own class files
This commit is contained in:
parent
4f9e8c2a75
commit
4621358ffd
49 changed files with 1057 additions and 2904 deletions
|
@ -1,116 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
ambient_generic
|
|
||||||
|
|
||||||
The ambient_generic allows you to play a specific sound.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
Name (targetname) - Property used to identify entities.
|
|
||||||
WAV name (message) - This is the path/filename of the .wav file.
|
|
||||||
Volume (health) - Volume of the sound. Range: 0-10.
|
|
||||||
Dynamic Presets (preset) - Various effects that can be applied to the sound:
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
Play Everywhere (1) - Sound will be heard in the entire level.
|
|
||||||
Small Radius (2) - Sound range is about 800 units at max volume.
|
|
||||||
Medium Radius (4) - Sound range is about 1250 units at max volume.
|
|
||||||
Large Radius (8) - Sound range is about 2000 units at max volume.
|
|
||||||
Start Silent (16) - Checking this means the entity must be triggered to work.
|
|
||||||
Not Toggled (32) - Older FGDs show this as Not Looped.
|
|
||||||
Makes the entity interpret each call as "turn on" instead of "toggle state".
|
|
||||||
Must be left unchecked for looping sound files.
|
|
||||||
Note that actual looping depends purely on cue points defined in the .wav file (see notes).
|
|
||||||
*/
|
|
||||||
void ambient_generic( void ) {
|
|
||||||
static float ambient_generic_send( entity ePEnt, float fChanged ) {
|
|
||||||
WriteByte( MSG_ENTITY, ENT_AMBIENTSOUND );
|
|
||||||
WriteCoord( MSG_ENTITY, self.origin_x );
|
|
||||||
WriteCoord( MSG_ENTITY, self.origin_y );
|
|
||||||
WriteCoord( MSG_ENTITY, self.origin_z );
|
|
||||||
WriteString( MSG_ENTITY, self.message );
|
|
||||||
WriteFloat( MSG_ENTITY, self.health );
|
|
||||||
WriteByte( MSG_ENTITY, self.style );
|
|
||||||
WriteByte( MSG_ENTITY, self.loop );
|
|
||||||
WriteByte( MSG_ENTITY, self.lforate );
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
static void ambient_generic_use( void ) {
|
|
||||||
sound( self, CHAN_VOICE, self.message, self.health, self.style, self.pitch );
|
|
||||||
}
|
|
||||||
static void ambient_generic_useloop( void ) {
|
|
||||||
if ( self.state == TRUE ) {
|
|
||||||
self.message = "common/null.wav";
|
|
||||||
self.SendFlags = 128;
|
|
||||||
self.state = FALSE;
|
|
||||||
} else {
|
|
||||||
self.message = self.noise;
|
|
||||||
self.SendFlags = 128;
|
|
||||||
self.state = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void ambient_generic_respawn( void ) {
|
|
||||||
// If we are supposed to be looping, but have stopped playing... make sure we do again
|
|
||||||
if( !( self.spawnflags & 32 ) && ( self.state == FALSE ) ) {
|
|
||||||
ambient_generic_useloop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
precache_sound( self.message );
|
|
||||||
setorigin( self, self.origin );
|
|
||||||
self.health = self.health / 10;
|
|
||||||
|
|
||||||
if ( self.spawnflags & 1 ) {
|
|
||||||
self.style = ATTN_NONE;
|
|
||||||
} else if ( self.spawnflags & 2 ) {
|
|
||||||
self.style = ATTN_IDLE;
|
|
||||||
} else if ( self.spawnflags & 4 ) {
|
|
||||||
self.style = ATTN_STATIC;
|
|
||||||
} else if ( self.spawnflags & 8 ) {
|
|
||||||
self.style = ATTN_NORM;
|
|
||||||
} else {
|
|
||||||
self.style = ATTN_STATIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.spawnflags & 32 ) {
|
|
||||||
self.loop = FALSE;
|
|
||||||
} else {
|
|
||||||
self.loop = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( self.spawnflags & 16 ) {
|
|
||||||
self.vUse = ambient_generic_use;
|
|
||||||
} else {
|
|
||||||
self.noise = self.message; // Needed later for resuming
|
|
||||||
self.pvsflags = PVSF_NOREMOVE | PVSF_IGNOREPVS;
|
|
||||||
self.vUse = ambient_generic_useloop;
|
|
||||||
self.SendEntity = ambient_generic_send;
|
|
||||||
self.state = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Entities_InitRespawnable( ambient_generic_respawn );
|
|
||||||
}
|
|
|
@ -136,10 +136,6 @@ void TraceAttack_FireBullets( int iShots, vector vPos );
|
||||||
void Damage_Radius( vector vOrigin, entity eAttacker, float fDamage, float fRadius, int iCheckClip );
|
void Damage_Radius( vector vOrigin, entity eAttacker, float fDamage, float fRadius, int iCheckClip );
|
||||||
void Damage_Apply( entity eTarget, entity eAttacker, int iDamage, vector vHitPos, int iSkipArmor );
|
void Damage_Apply( entity eTarget, entity eAttacker, int iDamage, vector vHitPos, int iSkipArmor );
|
||||||
|
|
||||||
void Entities_UseTargets( void );
|
|
||||||
void Entities_InitRespawnable( void() vRespawnFunc );
|
|
||||||
void Entities_Respawn( void );
|
|
||||||
|
|
||||||
void Ammo_AutoFill(float fWeapon);
|
void Ammo_AutoFill(float fWeapon);
|
||||||
void Ammo_BuyPrimary(void);
|
void Ammo_BuyPrimary(void);
|
||||||
void Ammo_BuySecondary(void);
|
void Ammo_BuySecondary(void);
|
||||||
|
|
|
@ -24,11 +24,6 @@
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// GoldSrc-Rendermode Fields
|
|
||||||
.vector rendercolor;
|
|
||||||
.float rendermode;
|
|
||||||
.float renderamt;
|
|
||||||
.float alpha;
|
|
||||||
|
|
||||||
// All about +use
|
// All about +use
|
||||||
.void(void) vUse;
|
.void(void) vUse;
|
||||||
|
@ -78,24 +73,11 @@
|
||||||
|
|
||||||
/* Map Entity Specific Fields /*
|
/* Map Entity Specific Fields /*
|
||||||
* They used to be in their respective files, but there is not much point */
|
* They used to be in their respective files, but there is not much point */
|
||||||
|
|
||||||
/* ambient_generic */
|
|
||||||
.float pitch;
|
|
||||||
.float loop;
|
|
||||||
.float lforate;
|
|
||||||
|
|
||||||
/* armoury_entity */
|
/* armoury_entity */
|
||||||
.float item;
|
.float item;
|
||||||
.float count;
|
.float count;
|
||||||
|
|
||||||
/* hostage_entity */
|
|
||||||
.entity eTargetPoint;
|
|
||||||
.entity eLastCreated;
|
|
||||||
.int iHasBeenUsed;
|
|
||||||
|
|
||||||
/* env_sprite */
|
|
||||||
.float framerate;
|
|
||||||
|
|
||||||
/* env_explosion */
|
/* env_explosion */
|
||||||
.int iMagnitude;
|
.int iMagnitude;
|
||||||
|
|
||||||
|
|
|
@ -6,57 +6,7 @@
|
||||||
*
|
*
|
||||||
****/
|
****/
|
||||||
|
|
||||||
enum {
|
|
||||||
HOSTAGE_IDLE,
|
|
||||||
HOSTAGE_WALK,
|
|
||||||
HOSTAGE_RUN
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
HOSA_WALK,
|
|
||||||
HOSA_WALKSCARED,
|
|
||||||
HOSA_RUN,
|
|
||||||
HOSA_RUNSCARED,
|
|
||||||
HOSA_RUNLOOK,
|
|
||||||
HOSA_180LEFT,
|
|
||||||
HOSA_180RIGHT,
|
|
||||||
HOSA_FLINCH,
|
|
||||||
HOSA_PAIN,
|
|
||||||
HOSA_PAINLEFT,
|
|
||||||
HOSA_PAINRIGHT,
|
|
||||||
HOSA_PAINLEGLEFT,
|
|
||||||
HOSA_PAINLEGRIGHT,
|
|
||||||
HOSA_IDLE1,
|
|
||||||
HOSA_IDLE2,
|
|
||||||
HOSA_IDLE3,
|
|
||||||
HOSA_IDLE4,
|
|
||||||
HOSA_IDLE5,
|
|
||||||
HOSA_IDLE6,
|
|
||||||
HOSA_SCARED_END,
|
|
||||||
HOSA_SCARED1,
|
|
||||||
HOSA_SCARED2,
|
|
||||||
HOSA_SCARED3,
|
|
||||||
HOSA_SCARED4,
|
|
||||||
HOSA_PANIC,
|
|
||||||
HOSA_FEAR1,
|
|
||||||
HOSA_FEAR2,
|
|
||||||
HOSA_CRY,
|
|
||||||
HOSA_SCI1,
|
|
||||||
HOSA_SCI2,
|
|
||||||
HOSA_SCI3,
|
|
||||||
HOSA_DIE_SIMPLE,
|
|
||||||
HOSA_DIE_FORWARD1,
|
|
||||||
HOSA_DIE_FORWARD2,
|
|
||||||
HOSA_DIE_BACKWARD,
|
|
||||||
HOSA_DIE_HEADSHOT,
|
|
||||||
HOSA_DIE_GUTSHOT,
|
|
||||||
HOSA_LYING1,
|
|
||||||
HOSA_LYING2,
|
|
||||||
HOSA_DEADSIT,
|
|
||||||
HOSA_DEADTABLE1,
|
|
||||||
HOSA_DEADTABLE2,
|
|
||||||
HOSA_DEADTABLE3
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
|
@ -132,23 +82,7 @@ hostage_use
|
||||||
Whenever a hostage is 'used'
|
Whenever a hostage is 'used'
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void hostage_use(void) {
|
|
||||||
if (eActivator.team == TEAM_CT) {
|
|
||||||
if ((self.eUser == world)) {
|
|
||||||
// Only give cash to the CT for using it for the first time
|
|
||||||
if (self.iHasBeenUsed == FALSE) {
|
|
||||||
Money_AddMoney(eActivator, 150);
|
|
||||||
sound(self, CHAN_VOICE, sprintf("hostage/hos%d.wav", random(1, 6)), 1.0, ATTN_IDLE);
|
|
||||||
self.iHasBeenUsed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.eUser = eActivator;
|
|
||||||
self.eTargetPoint = self.eUser;
|
|
||||||
} else {
|
|
||||||
self.eUser = world;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
|
|
|
@ -1,275 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
GOLDSRC-RENDERMODE STUFF
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
enum {
|
|
||||||
RENDERMODE_NORMAL = 0,
|
|
||||||
RENDERMODE_COLOR,
|
|
||||||
RENDERMODE_TEXTURE,
|
|
||||||
RENDERMODE_GLOW,
|
|
||||||
RENDERMODE_SOLID,
|
|
||||||
RENDERMODE_ADDITIVE
|
|
||||||
};
|
|
||||||
|
|
||||||
void Entities_RenderSetup( void ) {
|
|
||||||
// GoldSrc-Rendermode support
|
|
||||||
if ( self.rendermode != RENDERMODE_NORMAL ) {
|
|
||||||
self.alpha = ( self.renderamt / 255 );
|
|
||||||
self.colormod = self.rendercolor;
|
|
||||||
|
|
||||||
if( self.alpha == 0 ) {
|
|
||||||
self.alpha = 0.0001;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.rendermode == RENDERMODE_ADDITIVE ) {
|
|
||||||
self.effects = EF_ADDITIVE;
|
|
||||||
} else if ( self.rendermode == RENDERMODE_GLOW ) {
|
|
||||||
self.effects = EF_ADDITIVE | EF_FULLBRIGHT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_UseTargets
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_UseTargets( void ) {
|
|
||||||
entity eFind = findchain( targetname, self.target );
|
|
||||||
|
|
||||||
entity eOld = self;
|
|
||||||
while ( eFind ) {
|
|
||||||
self = eFind;
|
|
||||||
dprint( sprintf( "Triggering %s %s\n", self.classname, self.targetname ) );
|
|
||||||
|
|
||||||
// Make sure we really do have a target...
|
|
||||||
if ( self.vUse != __NULL__ ) {
|
|
||||||
self.vUse();
|
|
||||||
}
|
|
||||||
|
|
||||||
eFind = eFind.chain;
|
|
||||||
}
|
|
||||||
self = eOld;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_UseTargets_Delay
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_UseTargets_Delay( float fDelay ) {
|
|
||||||
static void Entities_UseTargets_Delay_Think( void ) {
|
|
||||||
entity eOld = self;
|
|
||||||
self = self.owner;
|
|
||||||
Entities_UseTargets();
|
|
||||||
remove( eOld );
|
|
||||||
}
|
|
||||||
|
|
||||||
entity eTimer = spawn();
|
|
||||||
eTimer.owner = self;
|
|
||||||
eTimer.think = Entities_UseTargets_Delay_Think;
|
|
||||||
eTimer.nextthink = time + fDelay;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_InitRespawnable
|
|
||||||
|
|
||||||
Called
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_InitRespawnable( void() vRespawnFunc ) {
|
|
||||||
self.sOldModel = self.model;
|
|
||||||
self.fOldSolid = self.solid;
|
|
||||||
self.fOldHealth = self.health;
|
|
||||||
self.vOldOrigin = self.origin;
|
|
||||||
self.vOldAngle = self.angles;
|
|
||||||
self.vRespawn = vRespawnFunc;
|
|
||||||
self.vOldUse = self.vUse;
|
|
||||||
self.fRespawns = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Entities_Respawn( void ) {
|
|
||||||
self.model = self.sOldModel;
|
|
||||||
self.solid = self.fOldSolid;
|
|
||||||
self.health = self.fOldHealth;
|
|
||||||
self.origin = self.vOldOrigin;
|
|
||||||
self.angles = self.vOldAngle;
|
|
||||||
self.vUse = self.vOldUse;
|
|
||||||
Entities_RenderSetup();
|
|
||||||
self.vRespawn();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_Remove
|
|
||||||
|
|
||||||
Technically, it doesn't remove everything
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_Remove( void ) {
|
|
||||||
if ( self.fRespawns == TRUE ) {
|
|
||||||
setorigin( self, self.vOldOrigin );
|
|
||||||
self.solid = SOLID_NOT;
|
|
||||||
self.model = 0;
|
|
||||||
} else {
|
|
||||||
remove( self );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_SetMovedir
|
|
||||||
|
|
||||||
Returns the movement direction based on angles
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_SetMovementDirection( void )
|
|
||||||
{
|
|
||||||
if ( self.angles == '0 -1 0' ) {
|
|
||||||
self.movedir = '0 0 1';
|
|
||||||
} else if ( self.angles == '0 -2 0' ) {
|
|
||||||
self.movedir = '0 0 -1';
|
|
||||||
} else {
|
|
||||||
makevectors( self.angles );
|
|
||||||
self.movedir = v_forward;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_InitTrigger
|
|
||||||
|
|
||||||
Prepares an entity to have the properties of a TRIGGER
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_InitTrigger( void ) {
|
|
||||||
if ( self.angles != '0 0 0' ) {
|
|
||||||
Entities_SetMovementDirection();
|
|
||||||
}
|
|
||||||
self.solid = SOLID_TRIGGER;
|
|
||||||
setmodel ( self, self.model );
|
|
||||||
self.movetype = MOVETYPE_NONE;
|
|
||||||
self.modelindex = 0;
|
|
||||||
self.model = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_MoveToDestination_End
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
.vector vFinalDestination;
|
|
||||||
.void() vThinkMove;
|
|
||||||
void Entities_MoveToDestination_End( void ) {
|
|
||||||
setorigin( self, self.vFinalDestination );
|
|
||||||
self.velocity = '0 0 0';
|
|
||||||
self.nextthink = -1;
|
|
||||||
self.vThinkMove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_MoveToDestination
|
|
||||||
|
|
||||||
Sets velocity of an ent to move to a destination at the desired speed
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_MoveToDestination(vector vDestination, float fMoveSpeed, void() func) {
|
|
||||||
local vector vPositionDifference;
|
|
||||||
local float fTravelLength, fTravelTime;
|
|
||||||
|
|
||||||
if ( !fMoveSpeed ) {
|
|
||||||
objerror("No speed defined for moving entity! Will not divide by zero.");
|
|
||||||
}
|
|
||||||
|
|
||||||
self.vThinkMove = func;
|
|
||||||
self.vFinalDestination = vDestination;
|
|
||||||
self.think = Entities_MoveToDestination_End;
|
|
||||||
|
|
||||||
if ( vDestination == self.origin ) {
|
|
||||||
self.velocity = '0 0 0';
|
|
||||||
self.nextthink = ( self.ltime + 0.1 );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vPositionDifference = ( vDestination - self.origin );
|
|
||||||
fTravelLength = vlen( vPositionDifference );
|
|
||||||
fTravelTime = ( fTravelLength / fMoveSpeed );
|
|
||||||
|
|
||||||
if ( fTravelTime < 0.1 ) {
|
|
||||||
self.velocity = '0 0 0';
|
|
||||||
self.nextthink = self.ltime + 0.1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.nextthink = ( self.ltime + fTravelTime );
|
|
||||||
self.velocity = ( vPositionDifference * ( 1 / fTravelTime ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_CalcAngleMoveDone
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
.vector vFinalAngle;
|
|
||||||
void Entities_RotateToDestination_End( void ) {
|
|
||||||
self.angles = self.vFinalAngle;
|
|
||||||
self.avelocity = '0 0 0';
|
|
||||||
self.nextthink = -1;
|
|
||||||
self.vThinkMove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Entities_RotateToDestination
|
|
||||||
|
|
||||||
Rotate to a given destination at a given pace
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void Entities_RotateToDestination( vector vDestinationAngle, float fTravelSpeed, void() func ) {
|
|
||||||
local vector vAngleDifference;
|
|
||||||
local float fTravelLength, fTravelTime;
|
|
||||||
|
|
||||||
if ( !fTravelSpeed ) {
|
|
||||||
objerror("No speed defined for moving entity! Will not divide by zero.");
|
|
||||||
}
|
|
||||||
|
|
||||||
vAngleDifference = ( vDestinationAngle - self.angles );
|
|
||||||
fTravelLength = vlen( vAngleDifference );
|
|
||||||
fTravelTime = ( fTravelLength / fTravelSpeed );
|
|
||||||
self.nextthink = ( self.ltime + fTravelTime );
|
|
||||||
self.avelocity = ( vAngleDifference * ( 1 / fTravelTime ) );
|
|
||||||
self.vFinalAngle = vDestinationAngle;
|
|
||||||
self.vThinkMove = func;
|
|
||||||
self.think = Entities_RotateToDestination_End;
|
|
||||||
}
|
|
|
@ -1,260 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
cycler_sprite
|
|
||||||
|
|
||||||
This entity lets you display and cycle through the animation of a sprite (or a model, engine doesn't care).
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
Name (targetname) - Property used to identify entities.
|
|
||||||
Pitch Yaw Roll (angles) - Sets the pitch (up / down), yaw (left / right) and roll (bank) respectively. The compass in WorldCraft / Hammer corresponds to Yaw. The settings are not always (or not all) used.
|
|
||||||
Sprite (model) - A sprite must be specified here (sprites/spritename.spr).
|
|
||||||
Frames per second (framerate) - Framerate the sprite will run at if animated.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void cycler_sprite( void ) {
|
|
||||||
static void cycler_sprite_respawn( void ) {
|
|
||||||
// Find something to do here...
|
|
||||||
}
|
|
||||||
|
|
||||||
precache_model( self.model );
|
|
||||||
setmodel( self, self.model );
|
|
||||||
|
|
||||||
Entities_RenderSetup();
|
|
||||||
Entities_InitRespawnable( cycler_sprite_respawn );
|
|
||||||
self.vUse = cycler_sprite_respawn;
|
|
||||||
}
|
|
||||||
|
|
||||||
void env_glow( void ) {
|
|
||||||
cycler_sprite();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
env_sprite
|
|
||||||
|
|
||||||
This entity lets you display and cycle through the animation of a sprite.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
Name (targetname) - Property used to identify entities.
|
|
||||||
Pitch Yaw Roll (angles) - Sets the pitch (up / down), yaw (left / right) and roll (bank) respectively. The compass in WorldCraft / Hammer corresponds to Yaw. The settings are not always (or not all) used.
|
|
||||||
Sprite (model) - A sprite must be specified here (sprites/spritename.spr).
|
|
||||||
Frames per second (framerate) - Framerate the sprite will run at if animated.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void env_sprite( void ) {
|
|
||||||
static float env_sprite_send( entity ePEnt, float fChanged ) {
|
|
||||||
WriteByte( MSG_ENTITY, ENT_SPRITE ); // Identifier
|
|
||||||
WriteCoord( MSG_ENTITY, self.origin_x );
|
|
||||||
WriteCoord( MSG_ENTITY, self.origin_y );
|
|
||||||
WriteCoord( MSG_ENTITY, self.origin_z );
|
|
||||||
WriteFloat( MSG_ENTITY, self.modelindex );
|
|
||||||
WriteFloat( MSG_ENTITY, self.framerate );
|
|
||||||
WriteFloat( MSG_ENTITY, self.scale );
|
|
||||||
WriteFloat( MSG_ENTITY, self.alpha );
|
|
||||||
WriteFloat( MSG_ENTITY, self.effects );
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
static void env_sprite_use( void ) {
|
|
||||||
}
|
|
||||||
|
|
||||||
precache_model( self.model );
|
|
||||||
setmodel( self, self.model );
|
|
||||||
setorigin( self, self.origin );
|
|
||||||
Entities_RenderSetup();
|
|
||||||
self.pvsflags = PVSF_NOREMOVE | PVSF_IGNOREPVS;
|
|
||||||
self.SendEntity = env_sprite_send;
|
|
||||||
self.vUse = env_sprite_use;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
env_render
|
|
||||||
|
|
||||||
This entity allows you to change the rendering properties
|
|
||||||
of most of the visible entities in the game (monsters, func_walls etc.), while the map is running.
|
|
||||||
The four render properties of the env_render will be copied to its target.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
Name (targetname) - Property used to identify entities.
|
|
||||||
Target (target) - When an entity is activated, it triggers the entity with the name specified by Target.
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
No Renderfx (1) - Render FX will not be copied.
|
|
||||||
No Renderamt (2) - Render Amount will not be copied.
|
|
||||||
No Rendermode (4) - Render Mode will not be copied.
|
|
||||||
No Rendercolor (8) - Render Color will not be copied.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Use this entity to fake situations that would be impossible for the game engine,
|
|
||||||
such as apparently binding multiple entities together (e.g. a moving doorhandle on a rotating door).
|
|
||||||
With a bit of careful setup, it is possible to let the the doorhandle move first,
|
|
||||||
then become invisible, then let the door move (with a static doorhandle attached).
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SF_NORENDERFX 1
|
|
||||||
#define SF_NORENDERAMT 2
|
|
||||||
#define SF_NORENDERMODE 4
|
|
||||||
#define SF_NORENDERCOLOR 8
|
|
||||||
|
|
||||||
void env_render( void ) {
|
|
||||||
static void env_render_use( void ) {
|
|
||||||
entity eFind = findchain( targetname, self.target );
|
|
||||||
|
|
||||||
while ( eFind ) {
|
|
||||||
if ( !( self.spawnflags & SF_NORENDERMODE ) ) {
|
|
||||||
eFind.rendermode = self.rendermode;
|
|
||||||
}
|
|
||||||
if ( !( self.spawnflags & SF_NORENDERCOLOR ) ) {
|
|
||||||
eFind.colormod = self.colormod;
|
|
||||||
}
|
|
||||||
eFind.alpha = self.alpha;
|
|
||||||
eFind = eFind.chain;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.colormod = self.rendercolor;
|
|
||||||
|
|
||||||
Entities_RenderSetup();
|
|
||||||
self.vUse = env_render_use;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
env_explosion
|
|
||||||
|
|
||||||
This entity creates any combination of fireball,
|
|
||||||
smoke, sparks, decals and sound, also known as an explosion.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
Name (targetname) - Property used to identify entities.
|
|
||||||
Magnitude (iMagnitude) - The size of the explosion. 100 is average.
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
No Damage (1) - Explosion won't cause any damage.
|
|
||||||
Repeatable (2) - Entity can be triggered more than once.
|
|
||||||
No Fireball (4) - There is no orange fireball. It won't look much like an explosion...
|
|
||||||
No Smoke (8) - Creates a pollution-free explosion.
|
|
||||||
No Decals (16) - No scorch marks are left behind.
|
|
||||||
No Sparks (32) - No sparks fly out.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
It's possible to create a similar effect with a combination of other entities,
|
|
||||||
but it wouldn't be much fun, so this quick and easy one is here instead!
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
|
|
||||||
enumflags {
|
|
||||||
ENVEXPLO_NODAMAGE,
|
|
||||||
ENVEXPLO_REPEATABLE,
|
|
||||||
ENVEXPLO_NOBALL,
|
|
||||||
ENVEXPLO_NOSMOKE,
|
|
||||||
ENVEXPLO_NODECAL,
|
|
||||||
ENVEXPLO_NOSPARKS
|
|
||||||
};
|
|
||||||
|
|
||||||
void env_explosion( void ) {
|
|
||||||
static void env_explosion_use( void ) {
|
|
||||||
Effect_CreateExplosion( self.origin );
|
|
||||||
|
|
||||||
if ( !( self.spawnflags & ENVEXPLO_NODAMAGE ) ) {
|
|
||||||
Damage_Radius( self.origin, self, 500, self.iMagnitude, TRUE );
|
|
||||||
}
|
|
||||||
if ( !( self.spawnflags & ENVEXPLO_REPEATABLE ) ) {
|
|
||||||
self.vUse = __NULL__;
|
|
||||||
remove( self );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.vUse = env_explosion_use;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
env_spark
|
|
||||||
|
|
||||||
Produces an electrical spark effect.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
Name (targetname) - Property used to identify entities.
|
|
||||||
Pitch Yaw Roll (angles) - Sets the angles respectively.
|
|
||||||
Max Delay (MaxDelay) - Maximum delay between sparks.
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
Toggle (32)
|
|
||||||
Start On (64)
|
|
||||||
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
According to the fieldname MaxDelay, it is probably going to use
|
|
||||||
a random number to create a delay between the individual sparks.
|
|
||||||
I have no idea why they didn't just reuse the delay field.
|
|
||||||
We may never know.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
#define SPARK_TOGGLE 32
|
|
||||||
#define SPARK_ON 64
|
|
||||||
|
|
||||||
void env_spark( void ) {
|
|
||||||
static void env_spark_fire( void ) {
|
|
||||||
Effect_CreateSpark( self.origin, self.angles );
|
|
||||||
}
|
|
||||||
static void env_spark_think( void ) {
|
|
||||||
env_spark_fire();
|
|
||||||
self.nextthink = time + ( random() * self.MaxDelay );
|
|
||||||
}
|
|
||||||
static void env_spark_use( void ) {
|
|
||||||
if ( self.spawnflags & SPARK_TOGGLE ) {
|
|
||||||
if ( self.think != __NULL__ ) {
|
|
||||||
self.think = __NULL__;
|
|
||||||
self.nextthink = 0;
|
|
||||||
} else {
|
|
||||||
self.think = env_spark_think;
|
|
||||||
self.nextthink = time + ( random() * self.MaxDelay );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
env_spark_fire();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void env_spark_respawn( void ) {
|
|
||||||
if ( self.MaxDelay <= 0 ) {
|
|
||||||
self.MaxDelay = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.spawnflags & SPARK_TOGGLE ) {
|
|
||||||
if ( self.spawnflags & SPARK_ON ) {
|
|
||||||
self.think = env_spark_think;
|
|
||||||
self.nextthink = time + ( random() * self.MaxDelay );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.vUse = env_spark_use;
|
|
||||||
Entities_InitRespawnable( env_spark_respawn );
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_bomb_target_touch
|
|
||||||
|
|
||||||
Only for Ts, will give feedback whenever they are able to plant a bomb
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_bomb_target_touch( void ) {
|
|
||||||
if ( iBombPlanted == TRUE ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( ( other.classname == "player" ) && ( other.team == TEAM_T ) ) {
|
|
||||||
other.fInBombZone = TRUE; // Note: this will be cleared every frame inside SV_RunClientCommand
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_bomb_target
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_bomb_target( void ) {
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
self.movetype = MOVETYPE_NONE;
|
|
||||||
self.solid = SOLID_TRIGGER;
|
|
||||||
setmodel( self, self.model );
|
|
||||||
self.model = 0;
|
|
||||||
self.touch = func_bomb_target_touch;
|
|
||||||
|
|
||||||
iBombZones++;
|
|
||||||
}
|
|
|
@ -1,172 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Entity information from http://twhl.info/wiki.php?id=164
|
|
||||||
/*
|
|
||||||
|
|
||||||
Flags
|
|
||||||
|
|
||||||
Only Trigger (1) - Entity can only be activated (broken) by being triggered.
|
|
||||||
Touch (2) - Brush will break on touch.
|
|
||||||
Pressure (4) - Brush will break when pressured (e.g. player walking on it).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SF_TRIGGER 1
|
|
||||||
#define SF_TOUCH 2
|
|
||||||
#define SF_PRESSURE 4
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_breakable_pain
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_breakable_pain( int iNull ) {
|
|
||||||
switch ( self.material ) {
|
|
||||||
case MATERIAL_GLASS:
|
|
||||||
case MATERIAL_COMPUTER:
|
|
||||||
case MATERIAL_GLASS_UNBREAKABLE:
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/glass%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
|
||||||
break;
|
|
||||||
case MATERIAL_WOOD:
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/wood%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
|
||||||
break;
|
|
||||||
case MATERIAL_METAL:
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/metal%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
|
||||||
break;
|
|
||||||
case MATERIAL_FLESH:
|
|
||||||
float fRand = floor( random( 1, 8 ) );
|
|
||||||
if ( fRand == 4 ) { // sigh
|
|
||||||
fRand = 5;
|
|
||||||
}
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/flesh%d.wav", fRand ), 1.0, ATTN_NORM );
|
|
||||||
break;
|
|
||||||
case MATERIAL_CINDER:
|
|
||||||
case MATERIAL_ROCK:
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/concrete%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_breakable_die
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_breakable_die( int iNull ) {
|
|
||||||
// Make sure this is dead
|
|
||||||
if ( self.vUse == __NULL__ ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.health = 0;
|
|
||||||
self.vUse = __NULL__;
|
|
||||||
Effect_BreakModel( self.absmin, self.absmax, self.velocity, self.material );
|
|
||||||
Entities_UseTargets();
|
|
||||||
Entities_Remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_breakable_use
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_breakable_use( void ) {
|
|
||||||
func_breakable_die( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_breakable_touch
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_breakable_touch( void ) {
|
|
||||||
static void func_breakable_touch_NULL( void ) { }
|
|
||||||
|
|
||||||
if( other.classname != "player" ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.spawnflags & SF_TOUCH ) {
|
|
||||||
int fDamage = (float)(vlen( self.velocity ) * 0.01f );
|
|
||||||
|
|
||||||
if ( fDamage >= self.health ) {
|
|
||||||
self.touch = func_breakable_touch_NULL;
|
|
||||||
Damage_Apply( self, other, fDamage, self.absmin, FALSE );
|
|
||||||
|
|
||||||
if ( ( self.material == MATERIAL_GLASS ) || ( self.material == MATERIAL_COMPUTER ) ) {
|
|
||||||
Damage_Apply( other, self, fDamage / 4, other.origin, FALSE );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( self.spawnflags & SF_PRESSURE ) && ( other.absmin_z >= self.maxs_z - 2 ) ) {
|
|
||||||
self.think = func_breakable_use;
|
|
||||||
|
|
||||||
if ( self.delay == 0 ) {
|
|
||||||
self.delay = 0.1f;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.nextthink = self.ltime + self.delay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_breakable_respawn
|
|
||||||
|
|
||||||
Respawns the breakable entity
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_breakable_respawn( void ) {
|
|
||||||
if ( self.spawnflags & SF_TRIGGER ) {
|
|
||||||
self.takedamage = DAMAGE_NO;
|
|
||||||
} else {
|
|
||||||
self.takedamage = DAMAGE_YES;
|
|
||||||
self.vPain = func_breakable_pain;
|
|
||||||
self.vDeath = func_breakable_die;
|
|
||||||
self.iBleeds = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( self.spawnflags & SF_TOUCH ) || ( self.spawnflags & SF_PRESSURE ) ) {
|
|
||||||
self.touch = func_breakable_touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.vUse = func_breakable_use;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_breakable
|
|
||||||
|
|
||||||
Entry function for the brushes that can die etc.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_breakable( void ) {
|
|
||||||
func_wall();
|
|
||||||
func_breakable_respawn();
|
|
||||||
|
|
||||||
Entities_InitRespawnable( func_breakable_respawn );
|
|
||||||
}
|
|
|
@ -1,312 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SF_BTT_NOMOVE 1
|
|
||||||
#define SF_BTT_TOGGLE 32
|
|
||||||
#define SF_BTT_TOUCH_ONLY 256
|
|
||||||
|
|
||||||
void() FuncButton_MoveAway;
|
|
||||||
void() FuncButton_MoveBack;
|
|
||||||
void() FuncButton_Touch;
|
|
||||||
|
|
||||||
enum {
|
|
||||||
STATE_RAISED = 0,
|
|
||||||
STATE_LOWERED,
|
|
||||||
STATE_UP,
|
|
||||||
STATE_DOWN
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
FRAME_OFF,
|
|
||||||
FRAME_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
.float speed;
|
|
||||||
.float lip;
|
|
||||||
.float dmg;
|
|
||||||
.float state;
|
|
||||||
.vector pos1, pos2;
|
|
||||||
|
|
||||||
// Not all that customizable... but better than QUAKE.
|
|
||||||
.float movesnd;
|
|
||||||
.float stopsnd;
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_PrecacheSounds
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_PrecacheSounds( void ) {
|
|
||||||
switch( self.sounds ) {
|
|
||||||
case 0:
|
|
||||||
// if you ever wondered why a silent button sounded a bit noisey... it's because this one kinda blows
|
|
||||||
self.noise = "common/null.wav";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
self.noise = "buttons/button1.wav";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
self.noise = "buttons/button2.wav";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
self.noise = "buttons/button3.wav";
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
self.noise = "buttons/button4.wav";
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
self.noise = "buttons/button5.wav";
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
self.noise = "buttons/button6.wav";
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
self.noise = "buttons/button7.wav";
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
self.noise = "buttons/button8.wav";
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
self.noise = "buttons/button9.wav";
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
self.noise = "buttons/button10.wav";
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
self.noise = "buttons/button11.wav";
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
self.noise = "buttons/latchlocked1.wav";
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
self.noise = "buttons/latchunlocked1.wav";
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
self.noise = "buttons/lightswitch2.wav";
|
|
||||||
break;
|
|
||||||
case 21:
|
|
||||||
self.noise = "buttons/lever1.wav";
|
|
||||||
break;
|
|
||||||
case 22:
|
|
||||||
self.noise = "buttons/lever2.wav";
|
|
||||||
break;
|
|
||||||
case 23:
|
|
||||||
self.noise = "buttons/lever3.wav";
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
self.noise = "buttons/lever4.wav";
|
|
||||||
break;
|
|
||||||
case 25:
|
|
||||||
self.noise = "buttons/lever5.wav";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
self.noise = "buttons/button9.wav";
|
|
||||||
}
|
|
||||||
|
|
||||||
precache_sound( self.noise );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_Arrived
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_Arrived( void ) {
|
|
||||||
self.state = STATE_RAISED;
|
|
||||||
|
|
||||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
|
||||||
self.touch = FuncButton_Touch;
|
|
||||||
}
|
|
||||||
if ( self.spawnflags & SF_BTT_TOGGLE ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.wait != -1 ) {
|
|
||||||
self.think = FuncButton_MoveBack;
|
|
||||||
self.nextthink = ( self.ltime + self.wait );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_Returned
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_Returned( void ) {
|
|
||||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
|
||||||
self.touch = FuncButton_Touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_LOWERED;
|
|
||||||
self.frame = FRAME_OFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_MoveBack
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_MoveBack( void ) {
|
|
||||||
|
|
||||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
|
||||||
self.touch = __NULL__;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_DOWN;
|
|
||||||
|
|
||||||
if ( self.pos2 != self.pos1 ) {
|
|
||||||
Entities_MoveToDestination ( self.pos1, self.speed, FuncButton_Returned );
|
|
||||||
} else {
|
|
||||||
FuncButton_Returned();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_MoveAway
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_MoveAway( void ) {
|
|
||||||
if ( self.state == STATE_UP ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.state == STATE_RAISED ) {
|
|
||||||
self.nextthink = ( self.ltime + self.wait );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_UP;
|
|
||||||
|
|
||||||
if ( self.pos2 != self.pos1 ) {
|
|
||||||
Entities_MoveToDestination ( self.pos2, self.speed, FuncButton_Arrived );
|
|
||||||
} else {
|
|
||||||
FuncButton_Arrived();
|
|
||||||
}
|
|
||||||
|
|
||||||
self.frame = FRAME_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_Trigger
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_Trigger( void ) {
|
|
||||||
if ( self.fAttackFinished > time ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self.fAttackFinished = time + self.wait;
|
|
||||||
|
|
||||||
if ( ( self.state == STATE_UP ) || ( self.state == STATE_RAISED ) ){
|
|
||||||
if ( self.wait != -1 ) {
|
|
||||||
FuncButton_MoveBack();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sound( self, CHAN_VOICE, self.noise, 1.0, ATTN_NORM );
|
|
||||||
FuncButton_MoveAway();
|
|
||||||
|
|
||||||
if ( self.delay ) {
|
|
||||||
Entities_UseTargets_Delay( self.delay );
|
|
||||||
} else {
|
|
||||||
Entities_UseTargets();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_Touch
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_Touch( void ) {
|
|
||||||
if ( other.classname == "player" ) {
|
|
||||||
FuncButton_Trigger();
|
|
||||||
|
|
||||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
|
||||||
self.touch = __NULL__;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncButton_Blocked
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncButton_Blocked( void ) {
|
|
||||||
if ( self.dmg ) {
|
|
||||||
Damage_Apply( other, self, self.dmg, other.origin, FALSE );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.wait >= 0 ) {
|
|
||||||
if ( self.state == STATE_DOWN ) {
|
|
||||||
FuncButton_MoveAway ();
|
|
||||||
} else {
|
|
||||||
FuncButton_MoveBack ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
func_button
|
|
||||||
|
|
||||||
Spawn function of a moving door entity
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void func_button( void ) {
|
|
||||||
FuncButton_PrecacheSounds();
|
|
||||||
Entities_SetMovementDirection();
|
|
||||||
self.solid = SOLID_BSP;
|
|
||||||
self.movetype = MOVETYPE_PUSH;
|
|
||||||
setorigin( self, self.origin );
|
|
||||||
setmodel( self, self.model );
|
|
||||||
|
|
||||||
self.blocked = FuncButton_Blocked;
|
|
||||||
self.vUse = FuncButton_Trigger;
|
|
||||||
|
|
||||||
if ( !self.speed ) {
|
|
||||||
self.speed = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.spawnflags & SF_BTT_TOUCH_ONLY ) {
|
|
||||||
self.touch = FuncButton_Touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.iUsable = TRUE;
|
|
||||||
self.pos1 = self.origin;
|
|
||||||
|
|
||||||
if ( self.spawnflags & SF_BTT_NOMOVE ) {
|
|
||||||
self.pos2 = self.pos1;
|
|
||||||
} else {
|
|
||||||
self.pos2 = ( self.pos1 + self.movedir * ( fabs( self.movedir * self.size ) - self.lip ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_LOWERED;
|
|
||||||
Entities_RenderSetup();
|
|
||||||
}
|
|
|
@ -1,283 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_door Spawnflags
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
|
|
||||||
void() FuncDoor_MoveAway;
|
|
||||||
void() FuncDoor_MoveBack;
|
|
||||||
void() FuncDoor_Touch;
|
|
||||||
|
|
||||||
// TODO: Finish these
|
|
||||||
#define SF_MOV_OPEN 1
|
|
||||||
#define SF_MOV_UNLINK 4
|
|
||||||
#define SF_MOV_PASSABLE 8
|
|
||||||
#define SF_MOV_TOGGLE 32
|
|
||||||
#define SF_MOV_USE 256
|
|
||||||
|
|
||||||
enum {
|
|
||||||
STATE_RAISED = 0,
|
|
||||||
STATE_LOWERED,
|
|
||||||
STATE_UP,
|
|
||||||
STATE_DOWN
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_PrecacheSounds
|
|
||||||
|
|
||||||
CS/HL have a lot of door sounds...
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_PrecacheSounds( void ) {
|
|
||||||
|
|
||||||
if( self.movesnd > 0 && self.movesnd <= 10 ) {
|
|
||||||
precache_sound( sprintf( "doors/doormove%d.wav", self.movesnd ) );
|
|
||||||
} else {
|
|
||||||
precache_sound( "common/null.wav" );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( self.stopsnd > 0 && self.stopsnd <= 8 ) {
|
|
||||||
precache_sound( sprintf( "doors/doorstop%d.wav", self.stopsnd ) );
|
|
||||||
} else {
|
|
||||||
precache_sound( "common/null.wav" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_Arrived
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_Arrived( void ) {
|
|
||||||
self.state = STATE_RAISED;
|
|
||||||
|
|
||||||
if( self.stopsnd > 0 && self.stopsnd <= 8 ) {
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "doors/doorstop%d.wav", self.stopsnd ), 1.0, ATTN_NORM );
|
|
||||||
} else {
|
|
||||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( self.spawnflags & SF_MOV_USE ) ) {
|
|
||||||
self.touch = FuncDoor_Touch;
|
|
||||||
}
|
|
||||||
if ( self.wait < 0 ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !( self.spawnflags & SF_MOV_TOGGLE ) ) {
|
|
||||||
self.think = FuncDoor_MoveBack;
|
|
||||||
self.nextthink = ( self.ltime + self.wait );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_Returned
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_Returned( void ) {
|
|
||||||
|
|
||||||
if( self.stopsnd > 0 && self.stopsnd <= 8 ) {
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "doors/doorstop%d.wav", self.stopsnd ), 1.0, ATTN_NORM );
|
|
||||||
} else {
|
|
||||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( self.spawnflags & SF_MOV_USE ) ) {
|
|
||||||
self.touch = FuncDoor_Touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_LOWERED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_MoveBack
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_MoveBack( void ) {
|
|
||||||
|
|
||||||
if( self.movesnd > 0 && self.movesnd <= 10 ) {
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
|
||||||
} else {
|
|
||||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( self.spawnflags & SF_MOV_USE ) ) {
|
|
||||||
self.touch = __NULL__;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_DOWN;
|
|
||||||
Entities_MoveToDestination ( self.pos1, self.speed, FuncDoor_Returned );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_MoveAway
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_MoveAway( void ) {
|
|
||||||
if ( self.state == STATE_UP ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( self.movesnd > 0 && self.movesnd <= 10 ) {
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
|
||||||
} else {
|
|
||||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !( self.spawnflags & SF_MOV_TOGGLE ) ) {
|
|
||||||
if ( self.state == STATE_RAISED ) {
|
|
||||||
self.nextthink = ( self.ltime + self.wait );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_UP;
|
|
||||||
Entities_MoveToDestination ( self.pos2, self.speed, FuncDoor_Arrived );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_Trigger
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_Trigger( void ) {
|
|
||||||
if ( self.fAttackFinished > self.ltime ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self.fAttackFinished = self.ltime + self.wait;
|
|
||||||
|
|
||||||
// Only trigger stuff when we are done moving
|
|
||||||
if ( ( self.state == STATE_RAISED ) || ( self.state == STATE_LOWERED ) ) {
|
|
||||||
if ( self.delay > 0 ) {
|
|
||||||
Entities_UseTargets_Delay( self.delay );
|
|
||||||
} else {
|
|
||||||
Entities_UseTargets();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( self.state == STATE_UP ) || ( self.state == STATE_RAISED ) ){
|
|
||||||
FuncDoor_MoveBack();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FuncDoor_MoveAway();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_Touch
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_Touch( void ) {
|
|
||||||
if ( self.spawnflags & SF_MOV_TOGGLE ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( other.movetype == MOVETYPE_WALK ) {
|
|
||||||
if ( other.absmin_z <= self.maxs_z - 2 ) {
|
|
||||||
FuncDoor_Trigger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
FuncDoor_Blocked
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void FuncDoor_Blocked( void ) {
|
|
||||||
if( self.dmg ) {
|
|
||||||
Damage_Apply( other, self, self.dmg, other.origin, FALSE );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.wait >= 0 ) {
|
|
||||||
if ( self.state == STATE_DOWN ) {
|
|
||||||
FuncDoor_MoveAway ();
|
|
||||||
} else {
|
|
||||||
FuncDoor_MoveBack ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
func_door
|
|
||||||
|
|
||||||
Spawn function of a moving door entity
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
void func_door( void ) {
|
|
||||||
static void func_door_respawn( void ) {
|
|
||||||
self.solid = SOLID_BSP;
|
|
||||||
self.movetype = MOVETYPE_PUSH;
|
|
||||||
setorigin( self, self.origin );
|
|
||||||
setmodel( self, self.model );
|
|
||||||
|
|
||||||
self.blocked = FuncDoor_Blocked;
|
|
||||||
self.vUse = FuncDoor_Trigger;
|
|
||||||
|
|
||||||
if ( self.wait == -1 ) {
|
|
||||||
self.spawnflags = self.spawnflags | SF_MOV_TOGGLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !self.speed ) {
|
|
||||||
self.speed = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !self.dmg ) {
|
|
||||||
self.dmg = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.spawnflags & SF_MOV_USE ) {
|
|
||||||
self.iUsable = TRUE;
|
|
||||||
} else {
|
|
||||||
self.touch = FuncDoor_Touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_LOWERED;
|
|
||||||
self.pos1 = self.origin;
|
|
||||||
self.pos2 = ( self.pos1 + self.movedir * ( fabs( self.movedir * self.size ) - self.lip ) );
|
|
||||||
|
|
||||||
if ( self.spawnflags & SF_MOV_OPEN ) {
|
|
||||||
setorigin( self, self.pos2 );
|
|
||||||
self.pos2 = self.pos1;
|
|
||||||
self.pos1 = self.origin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FuncDoor_PrecacheSounds();
|
|
||||||
Entities_SetMovementDirection();
|
|
||||||
func_door_respawn();
|
|
||||||
Entities_InitRespawnable( func_door_respawn );
|
|
||||||
Entities_RenderSetup();
|
|
||||||
}
|
|
|
@ -1,275 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_door_rotating Spawnflags
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
|
|
||||||
enumflags {
|
|
||||||
SF_ROT_OPEN,
|
|
||||||
SF_ROT_REVERSE,
|
|
||||||
SF_ROT_UNLINK,
|
|
||||||
SF_ROT_ONEWAY,
|
|
||||||
SF_ROT_TOGGLE,
|
|
||||||
SF_ROT_XAXIS,
|
|
||||||
SF_ROT_YAXIS,
|
|
||||||
SF_ROT_USE
|
|
||||||
};
|
|
||||||
|
|
||||||
void FuncDoorRotate_RotateAway( void );
|
|
||||||
void FuncDoorRotate_RotateBack( void );
|
|
||||||
void FuncDoorRotate_Touch( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
FuncDoorRotate_Arrived
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void FuncDoorRotate_Arrived( void ) {
|
|
||||||
self.state = STATE_RAISED;
|
|
||||||
|
|
||||||
if( self.stopsnd > 0 && self.stopsnd <= 8 ) {
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "doors/doorstop%d.wav", self.stopsnd ), 1.0, ATTN_NORM );
|
|
||||||
} else {
|
|
||||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !(self.spawnflags & SF_ROT_USE) ) {
|
|
||||||
self.touch = FuncDoorRotate_Touch;
|
|
||||||
}
|
|
||||||
if ( self.wait < 0 ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.think = FuncDoorRotate_RotateBack;
|
|
||||||
self.nextthink = ( self.ltime + self.wait );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
FuncDoorRotate_Returned
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void FuncDoorRotate_Returned( void ) {
|
|
||||||
if ( !(self.spawnflags & SF_ROT_USE) ) {
|
|
||||||
self.touch = FuncDoorRotate_Touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_LOWERED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
FuncDoorRotate_RotateBack
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void FuncDoorRotate_RotateBack( void ) {
|
|
||||||
|
|
||||||
if ( self.movesnd > 0 && self.movesnd <= 10 ) {
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
|
||||||
} else {
|
|
||||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !(self.spawnflags & SF_ROT_USE) ) {
|
|
||||||
self.touch = __NULL__;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_DOWN;
|
|
||||||
Entities_RotateToDestination( self.pos1, self.speed, FuncDoorRotate_Returned );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
FuncDoorRotate_Away
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void FuncDoorRotate_RotateAway( void ) {
|
|
||||||
float fDirection = 1.0;
|
|
||||||
|
|
||||||
if ( self.state == STATE_UP ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.movesnd > 0 && self.movesnd <= 10 ) {
|
|
||||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
|
||||||
} else {
|
|
||||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.state == STATE_RAISED ) {
|
|
||||||
self.nextthink = ( self.ltime + self.wait );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_UP;
|
|
||||||
|
|
||||||
if ( !( self.spawnflags & SF_ROT_ONEWAY ) ) {
|
|
||||||
vector vDifference = eActivator.origin - self.origin;
|
|
||||||
vector vAngles = eActivator.angles;
|
|
||||||
vAngles_x = vAngles_z = 0;
|
|
||||||
|
|
||||||
makevectors( vAngles );
|
|
||||||
|
|
||||||
vector vNext = ( eActivator.origin + ( v_forward * 10 ) ) - self.origin;
|
|
||||||
|
|
||||||
if ( ( ( vDifference_x * vNext_y ) - ( vDifference_y * vNext_x ) ) < 0 ) {
|
|
||||||
fDirection = -1.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Entities_RotateToDestination( self.pos2 * fDirection, self.speed, FuncDoorRotate_Arrived );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
brush_rotate_trigger - What happens when you +use the brush or trigger it
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void FuncDoorRotate_Trigger( void ) {
|
|
||||||
if ( self.fAttackFinished > time ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self.fAttackFinished = time + self.wait;
|
|
||||||
|
|
||||||
if ( ( self.state == STATE_UP ) || ( self.state == STATE_RAISED ) ) {
|
|
||||||
FuncDoorRotate_RotateBack();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FuncDoorRotate_RotateAway();
|
|
||||||
|
|
||||||
if ( self.delay ) {
|
|
||||||
Entities_UseTargets_Delay( self.delay );
|
|
||||||
} else {
|
|
||||||
Entities_UseTargets();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
FuncDoorRotate_Touch
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void FuncDoorRotate_Touch( void ) {
|
|
||||||
if ( self.spawnflags & SF_ROT_TOGGLE ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( other.movetype == MOVETYPE_WALK ) {
|
|
||||||
if ( other.absmin_z <= self.maxs_z - 2 ) {
|
|
||||||
eActivator = other;
|
|
||||||
FuncDoorRotate_Trigger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
FuncDoorRotate_Blocked
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void FuncDoorRotate_Blocked( void ) {
|
|
||||||
if ( self.dmg ) {
|
|
||||||
Damage_Apply( other, self, self.dmg, other.origin, FALSE );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.wait >= 0 ) {
|
|
||||||
if ( self.state == STATE_DOWN ) {
|
|
||||||
FuncDoorRotate_RotateAway ();
|
|
||||||
} else {
|
|
||||||
FuncDoorRotate_RotateBack ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
BrushRotate
|
|
||||||
|
|
||||||
Brush entity that rotates into a specific direction.
|
|
||||||
Has the ability to trigger an object once touched, used or triggered otherwise.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_door_rotating( void ) {
|
|
||||||
static void func_door_rotating_respawn( void ) {
|
|
||||||
self.solid = SOLID_BSP;
|
|
||||||
self.movetype = MOVETYPE_PUSH;
|
|
||||||
setorigin( self, self.origin );
|
|
||||||
setmodel( self, self.model );
|
|
||||||
|
|
||||||
self.blocked = FuncDoorRotate_Blocked;
|
|
||||||
self.vUse = FuncDoorRotate_Trigger;
|
|
||||||
|
|
||||||
if ( self.spawnflags & SF_ROT_USE ) {
|
|
||||||
self.iUsable = TRUE;
|
|
||||||
} else {
|
|
||||||
self.touch = FuncDoorRotate_Touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !self.speed ) {
|
|
||||||
self.speed = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.wait == 0 ) {
|
|
||||||
self.wait = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.state = STATE_LOWERED;
|
|
||||||
self.pos1 = self.angles;
|
|
||||||
|
|
||||||
// Only do Y
|
|
||||||
if ( self.spawnflags & SF_ROT_XAXIS ) {
|
|
||||||
self.pos2_y = self.pos1_y + self.distance;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only do X
|
|
||||||
if ( self.spawnflags & SF_ROT_YAXIS ) {
|
|
||||||
self.pos2_x = self.pos1_x + self.distance;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// only do Y by default
|
|
||||||
if ( !( self.spawnflags & SF_ROT_YAXIS ) && !( self.spawnflags & SF_ROT_XAXIS ) ) {
|
|
||||||
self.pos2_y = self.pos1_y + self.distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.spawnflags & SF_ROT_OPEN ) {
|
|
||||||
vector vTemp = self.pos2;
|
|
||||||
self.pos2 = self.pos1;
|
|
||||||
self.pos1 = vTemp;
|
|
||||||
self.angles = self.pos1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FuncDoor_PrecacheSounds();
|
|
||||||
Entities_SetMovementDirection();
|
|
||||||
func_door_rotating_respawn();
|
|
||||||
Entities_InitRespawnable( func_door_rotating_respawn );
|
|
||||||
Entities_RenderSetup();
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
TODO: This gamemode is odd about balancing, right now the last surviving terrorist
|
|
||||||
will decide the match. Still have to think about what rules to set up.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_escapezone_touch
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_escapezone_touch( void ) {
|
|
||||||
if ( ( other.classname == "player" ) && ( other.team == TEAM_T ) ) {
|
|
||||||
entity eOld = self;
|
|
||||||
self = other;
|
|
||||||
|
|
||||||
Spawn_MakeSpectator();
|
|
||||||
self.classname = "player";
|
|
||||||
forceinfokey( self, "*dead", "0" );
|
|
||||||
self.health = 0;
|
|
||||||
Rules_CountPlayers();
|
|
||||||
self = eOld;
|
|
||||||
|
|
||||||
if ( iAlivePlayers_T == 0 ) {
|
|
||||||
Rules_RoundOver( TEAM_T, 2500, FALSE );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_escapezone
|
|
||||||
|
|
||||||
Entry function for the terrorist escape zone
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_escapezone( void ) {
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
self.movetype = MOVETYPE_NONE;
|
|
||||||
self.solid = SOLID_TRIGGER;
|
|
||||||
|
|
||||||
if ( self.model ) {
|
|
||||||
setmodel( self, self.model );
|
|
||||||
} else {
|
|
||||||
setsize( self, self.mins, self.maxs );
|
|
||||||
}
|
|
||||||
|
|
||||||
self.model = 0;
|
|
||||||
self.touch = func_escapezone_touch;
|
|
||||||
|
|
||||||
iEscapeZones++;
|
|
||||||
}
|
|
|
@ -1,114 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_hostage_rescue_touch
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_hostage_rescue_touch( void ) {
|
|
||||||
if ( ( other.classname == "player" ) && ( other.team == TEAM_CT ) ) {
|
|
||||||
other.fInHostageZone = TRUE; // Note: this will be cleared every frame inside SV_RunClientCommand
|
|
||||||
} else if ( other.classname == "hostage_entity" ) {
|
|
||||||
if ( self.solid == SOLID_NOT ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Radio_BroadcastMessage( RADIO_RESCUED );
|
|
||||||
iHostagesRescued++;
|
|
||||||
|
|
||||||
Money_AddMoney( other.eUser, 1000 );
|
|
||||||
Money_QueTeamReward( TEAM_CT, 800 );
|
|
||||||
|
|
||||||
if ( other.eTargetPoint != other.eUser ) {
|
|
||||||
remove( other.eTargetPoint );
|
|
||||||
}
|
|
||||||
|
|
||||||
other.eTargetPoint = other.eUser = world;
|
|
||||||
|
|
||||||
entity eOld = self;
|
|
||||||
self = other;
|
|
||||||
Entities_Remove();
|
|
||||||
self = eOld;
|
|
||||||
|
|
||||||
if ( iHostagesRescued >= iHostagesMax ) {
|
|
||||||
// TODO: Broadcast_Print: All Hostages have been rescued!
|
|
||||||
Rules_RoundOver( TEAM_CT, 0, FALSE );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_hostage_rescue
|
|
||||||
|
|
||||||
Entry function for the rescue area-markings.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_hostage_rescue( void ) {
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
self.movetype = MOVETYPE_NONE;
|
|
||||||
self.solid = SOLID_TRIGGER;
|
|
||||||
|
|
||||||
if ( self.model ) {
|
|
||||||
setmodel( self, self.model );
|
|
||||||
} else {
|
|
||||||
setsize( self, self.mins, self.maxs );
|
|
||||||
}
|
|
||||||
|
|
||||||
self.model = 0;
|
|
||||||
self.touch = func_hostage_rescue_touch;
|
|
||||||
|
|
||||||
iRescueZones++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void info_hostage_rescue( void ) {
|
|
||||||
self.mins = '-128 -128 -36';
|
|
||||||
self.maxs = '128 128 36';
|
|
||||||
func_hostage_rescue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
Game_CreateRescueZones
|
|
||||||
|
|
||||||
Called by StartFrame if we somehow got no rescue zones
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void Game_CreateRescueZones( void ) {
|
|
||||||
entity eFind = findchain( classname, "info_player_start" );
|
|
||||||
|
|
||||||
while ( eFind ) {
|
|
||||||
entity eRescueZone = spawn();
|
|
||||||
setorigin( eRescueZone, eFind.origin );
|
|
||||||
|
|
||||||
entity eOld = self;
|
|
||||||
self = eRescueZone;
|
|
||||||
info_hostage_rescue();
|
|
||||||
self = eOld;
|
|
||||||
eFind = eFind.chain;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,104 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Uncomment this once FTEs engine ladder is fixed?
|
|
||||||
//#define FTE_LADDER
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_ladder_sound
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_ladder_sound( entity target ) {
|
|
||||||
if ( ( target.velocity_z == 0 ) || ( target.fStepTime > time ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
float vStep = target.velocity_z;
|
|
||||||
|
|
||||||
if ( vStep < 0 ) {
|
|
||||||
vStep *= -1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
float fForce = vStep;
|
|
||||||
float fDelay = clamp( 0.1, 1 / ( fForce / 90 ), 1 );
|
|
||||||
|
|
||||||
sound( target, CHAN_BODY, sprintf( "player/pl_ladder%d.wav", floor( random() * 4 ) + 1 ), 0.5, ATTN_IDLE );
|
|
||||||
target.fStepTime = ( time + fDelay );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_ladder_touch
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_ladder_touch( void ) {
|
|
||||||
if ( other.classname != "player" ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef FTE_LADDER
|
|
||||||
vector vPlayerVector;
|
|
||||||
makevectors( other.v_angle );
|
|
||||||
vPlayerVector = v_forward;
|
|
||||||
vPlayerVector = ( vPlayerVector * 240 );
|
|
||||||
|
|
||||||
if ( other.movement_x > 0 ) {
|
|
||||||
other.velocity = vPlayerVector;
|
|
||||||
} else {
|
|
||||||
other.velocity = '0 0 0';
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
func_ladder_sound( other );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_ladder
|
|
||||||
|
|
||||||
A trigger like brush that allows you to 'climb' up or down
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_ladder( void ) {
|
|
||||||
precache_sound( "player/pl_ladder1.wav" );
|
|
||||||
precache_sound( "player/pl_ladder2.wav" );
|
|
||||||
precache_sound( "player/pl_ladder3.wav" );
|
|
||||||
precache_sound( "player/pl_ladder4.wav" );
|
|
||||||
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
self.movetype = MOVETYPE_NONE;
|
|
||||||
self.solid = SOLID_TRIGGER;
|
|
||||||
setmodel( self, self.model );
|
|
||||||
self.model = 0;
|
|
||||||
|
|
||||||
#ifdef FTE_LADDER
|
|
||||||
self.skin = CONTENT_LADDER;
|
|
||||||
self.alpha = 0.001;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
self.touch = func_ladder_touch;
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_pushable
|
|
||||||
|
|
||||||
Entry function for the brushes that players can push.
|
|
||||||
Pushables are an extension of breakables, so they mostly
|
|
||||||
explain themselves.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_pushable( void ) {
|
|
||||||
static void func_pushable_touch( void ) {
|
|
||||||
if ( other.classname == "player" ) {
|
|
||||||
func_breakable_touch();
|
|
||||||
|
|
||||||
if ( other.absmin_z <= self.maxs_z - 2 ) {
|
|
||||||
self.movedir = other.movement;
|
|
||||||
self.v_angle = other.angles;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void func_pushable_use( void ) {
|
|
||||||
if ( eActivator.classname != "player" ) {
|
|
||||||
if ( self.health > 0 ) {
|
|
||||||
func_breakable_use();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.movedir = eActivator.movement;
|
|
||||||
self.v_angle = eActivator.angles;
|
|
||||||
}
|
|
||||||
static void func_pushable_physics( void ) {
|
|
||||||
input_movevalues = [ self.movedir_x * 100, self.movedir_y * 100, 0 ];
|
|
||||||
input_impulse = input_buttons = 0;
|
|
||||||
input_angles = self.v_angle;
|
|
||||||
input_timelength = frametime;
|
|
||||||
self.movedir = '0 0 0';
|
|
||||||
|
|
||||||
runstandardplayerphysics( self );
|
|
||||||
}
|
|
||||||
static void func_pushable_respawn( void ) {
|
|
||||||
self.takedamage = DAMAGE_YES;
|
|
||||||
self.solid = SOLID_SLIDEBOX;
|
|
||||||
self.movetype = MOVETYPE_WALK;
|
|
||||||
self.customphysics = func_pushable_physics;
|
|
||||||
self.touch = func_pushable_touch;
|
|
||||||
self.vUse = func_pushable_use;
|
|
||||||
self.vPain = func_breakable_pain;
|
|
||||||
self.vDeath = func_breakable_die;
|
|
||||||
self.iBleeds = FALSE;
|
|
||||||
self.iUsable = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
func_wall();
|
|
||||||
func_pushable_respawn();
|
|
||||||
|
|
||||||
Entities_InitRespawnable( func_pushable_respawn );
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
func_vip_safetyzone_touch
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_vip_safetyzone_touch( void ) {
|
|
||||||
if ( ( other.classname == "player" ) && ( other.team == TEAM_VIP ) ) {
|
|
||||||
Rules_RoundOver( TEAM_CT, 2500, FALSE );
|
|
||||||
|
|
||||||
entity eOld = self;
|
|
||||||
self = other;
|
|
||||||
|
|
||||||
Spawn_MakeSpectator();
|
|
||||||
self.classname = "player";
|
|
||||||
self.team = TEAM_CT;
|
|
||||||
forceinfokey( self, "*dead", "0" );
|
|
||||||
iAlivePlayers_CT--;
|
|
||||||
|
|
||||||
self = eOld;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_vip_safetyzone
|
|
||||||
|
|
||||||
Entry function for the VIP escape zone
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_vip_safetyzone( void ) {
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
self.movetype = MOVETYPE_NONE;
|
|
||||||
self.solid = SOLID_TRIGGER;
|
|
||||||
|
|
||||||
if ( self.model ) {
|
|
||||||
setmodel( self, self.model );
|
|
||||||
} else {
|
|
||||||
setsize( self, self.mins, self.maxs );
|
|
||||||
}
|
|
||||||
|
|
||||||
self.model = 0;
|
|
||||||
self.touch = func_vip_safetyzone_touch;
|
|
||||||
iVIPZones++;
|
|
||||||
}
|
|
|
@ -1,188 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016-2018 Marco "eukara" Hladik
|
|
||||||
|
|
||||||
MIT LICENSE
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.entity eDriver;
|
|
||||||
.entity eVehicle;
|
|
||||||
|
|
||||||
.float height;
|
|
||||||
|
|
||||||
enum {
|
|
||||||
STATE_REVERSE = -1,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_GEAR1,
|
|
||||||
STATE_GEAR2,
|
|
||||||
STATE_GEAR3
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_vehicle
|
|
||||||
|
|
||||||
The function that creates life
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_vehicle_physics( void ) {
|
|
||||||
if ( self.eDriver ) {
|
|
||||||
// Input, gears
|
|
||||||
if ( self.fAttackFinished < time ) {
|
|
||||||
if ( self.eDriver.movement_x > 0 ) {
|
|
||||||
self.state++;
|
|
||||||
if ( self.state > STATE_GEAR3 ) {
|
|
||||||
self.state = STATE_GEAR3;
|
|
||||||
}
|
|
||||||
} else if ( self.eDriver.movement_x < 0 ) {
|
|
||||||
self.state--;
|
|
||||||
if ( self.state < STATE_REVERSE ) {
|
|
||||||
self.state = STATE_REVERSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.fAttackFinished = time + 0.25f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( self.eDriver.movement_y > 0 ) {
|
|
||||||
self.angles_y -= frametime * 100;
|
|
||||||
} else if ( self.eDriver.movement_y < 0 ) {
|
|
||||||
self.angles_y += frametime * 100;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Figure out the next position
|
|
||||||
makevectors( self.angles + self.v_angle );
|
|
||||||
tracebox( self.origin, self.mins, self.maxs, self.origin + ( ( v_forward * ( 100 * self.state ) ) * frametime ), FALSE, self );
|
|
||||||
setorigin( self, self.origin + ( ( v_forward * ( 100 * self.state ) ) * frametime ) );
|
|
||||||
|
|
||||||
// Update driver position as well
|
|
||||||
if ( self.eDriver ) {
|
|
||||||
setorigin( self.eDriver, self.eDriver.origin + ( ( v_forward * ( 100 * self.state ) ) * frametime ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_vehicle
|
|
||||||
|
|
||||||
The function that creates life
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_vehicle( void ) {
|
|
||||||
static void func_vehicle_setup( void ) {
|
|
||||||
entity eStop1 = find( world, targetname, self.target );
|
|
||||||
bprint( sprintf( "self.origin: %v targetpos: %v\n", self.origin, eStop1.origin ) );
|
|
||||||
setorigin( self, eStop1.origin );
|
|
||||||
|
|
||||||
|
|
||||||
entity eStop2 = find( world, targetname, eStop1.target );
|
|
||||||
self.v_angle = vectoangles( eStop2.origin - self.origin );
|
|
||||||
bprint( sprintf( "self.origin: %v target2pos: %v & angles: %v\n", self.origin, eStop2.origin, self.v_angle ) );
|
|
||||||
setorigin( self, self.origin + [ 0, 0, self.height ] );
|
|
||||||
}
|
|
||||||
static void func_vehicle_use( void ) {
|
|
||||||
bprint( "Used!\n" );
|
|
||||||
if ( self.eDriver ) {
|
|
||||||
if ( self.eDriver != eActivator ) {
|
|
||||||
// Someone else is using it, don't let him
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
// Unassign driver
|
|
||||||
self.eDriver = __NULL__;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.eDriver = eActivator;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void func_vehicle_respawn( void ) {
|
|
||||||
func_vehicle_setup();
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
}
|
|
||||||
|
|
||||||
self.solid = SOLID_BSP;
|
|
||||||
self.customphysics = func_vehicle_physics;
|
|
||||||
|
|
||||||
self.iUsable = TRUE;
|
|
||||||
self.vUse = func_vehicle_use;
|
|
||||||
|
|
||||||
setmodel( self, self.model );
|
|
||||||
Entities_RenderSetup();
|
|
||||||
|
|
||||||
Entities_InitRespawnable( func_vehicle_respawn );
|
|
||||||
}
|
|
||||||
|
|
||||||
void path_track( void ) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
SPAWN: func_vehiclecontrols
|
|
||||||
|
|
||||||
The function that enables life
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
/*void func_vehiclecontrols2( void ) {
|
|
||||||
static void func_vehiclecontrols_setup( void ) {
|
|
||||||
if ( !self.target ) {
|
|
||||||
objerror( "func_vehiclecontrols without func_vehicle" );
|
|
||||||
}
|
|
||||||
|
|
||||||
self.owner = find( world, targetname, self.target );
|
|
||||||
|
|
||||||
if ( !self.owner ) {
|
|
||||||
objerror( "func_vehiclecontrols' target cannot be found" );
|
|
||||||
} else {
|
|
||||||
self.owner.owner = self;
|
|
||||||
}
|
|
||||||
self.owner.vControlPos = self.owner.origin - self.origin;
|
|
||||||
}
|
|
||||||
static void func_vehiclecontrols_respawn( void ) {
|
|
||||||
self.angles = '0 0 0';
|
|
||||||
}
|
|
||||||
static void func_vehiclecontrols_use( void ) {
|
|
||||||
bprint( "Used!\n" );
|
|
||||||
if ( self.owner.eDriver ) {
|
|
||||||
if ( self.owner.eDriver != eActivator ) {
|
|
||||||
// Someone else is using it, don't let him
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
// Unassign driver
|
|
||||||
self.owner.eDriver == __NULL__;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.owner.eDriver = eActivator;
|
|
||||||
self.owner.vPlayerPos = self.owner.origin - eActivator.origin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.solid = SOLID_BSP;
|
|
||||||
self.iUsable = TRUE;
|
|
||||||
self.vUse = func_vehiclecontrols_use;
|
|
||||||
setmodel( self, self.model );
|
|
||||||
Entities_RenderSetup();
|
|
||||||
Entities_InitRespawnable( func_vehiclecontrols_respawn );
|
|
||||||
self.think = func_vehiclecontrols_setup;
|
|
||||||
self.nextthink = time + 0.1f;
|
|
||||||
}*/
|
|
|
@ -180,7 +180,7 @@ void Player_UseDown( void ) {
|
||||||
vSource = self.origin + self.view_ofs;
|
vSource = self.origin + self.view_ofs;
|
||||||
traceline ( vSource, vSource + ( v_forward * 64 ), FALSE, self);
|
traceline ( vSource, vSource + ( v_forward * 64 ), FALSE, self);
|
||||||
|
|
||||||
if (trace_ent.gflags & GF_USABLE) {
|
if (trace_ent.PlayerUse) {
|
||||||
if ( ( trace_ent.classname != "c4bomb" ) && ( trace_ent.classname != "func_pushable" ) ) {
|
if ( ( trace_ent.classname != "c4bomb" ) && ( trace_ent.classname != "func_pushable" ) ) {
|
||||||
self.flags = ( self.flags - FL_USERELEASED );
|
self.flags = ( self.flags - FL_USERELEASED );
|
||||||
sound( self, CHAN_ITEM, "common/wpn_select.wav", 0.25, ATTN_IDLE );
|
sound( self, CHAN_ITEM, "common/wpn_select.wav", 0.25, ATTN_IDLE );
|
||||||
|
|
|
@ -194,15 +194,15 @@ void Rules_Restart( int iWipe ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Respawn all the entities
|
// Respawn all the entities
|
||||||
for ( entity eFind = world; ( eFind = findfloat( eFind, fRespawns, TRUE ) ); ) {
|
for (entity a = world; (a = findfloat(a, gflags, GF_CANRESPAWN));) {
|
||||||
self = eFind;
|
CBaseEntity caw = (CBaseEntity)a;
|
||||||
Entities_Respawn();
|
caw.Respawn();
|
||||||
}
|
}
|
||||||
|
|
||||||
self = eOld;
|
self = eOld;
|
||||||
|
|
||||||
Timer_Begin( autocvar_mp_freezetime, GAME_FREEZE );
|
Timer_Begin( autocvar_mp_freezetime, GAME_FREEZE );
|
||||||
Money_ResetTeamReward();
|
Money_ResetTeamReward();
|
||||||
fDefuseProgress = 0;
|
fDefuseProgress = 0;
|
||||||
|
|
35
Source/Server/func_bomb_target.cpp
Executable file
35
Source/Server/func_bomb_target.cpp
Executable file
|
@ -0,0 +1,35 @@
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
class func_bomb_target
|
||||||
|
{
|
||||||
|
void() func_bomb_target;
|
||||||
|
virtual void() touch;
|
||||||
|
};
|
||||||
|
|
||||||
|
void func_bomb_target::touch(void)
|
||||||
|
{
|
||||||
|
if (iBombPlanted == TRUE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This will be cleared every frame inside SV_RunClientCommand */
|
||||||
|
if ((other.classname == "player") && (other.team == TEAM_T)) {
|
||||||
|
other.fInBombZone = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_bomb_target::func_bomb_target(void)
|
||||||
|
{
|
||||||
|
angles = [0,0,0];
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
solid = SOLID_TRIGGER;
|
||||||
|
setmodel(this, model);
|
||||||
|
model = 0;
|
||||||
|
iBombZones++;
|
||||||
|
}
|
|
@ -24,52 +24,48 @@
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
class func_buyzone
|
||||||
=================
|
{
|
||||||
func_buyzone_touch
|
void() func_buyzone;
|
||||||
=================
|
virtual void() touch;
|
||||||
*/
|
};
|
||||||
void func_buyzone_touch( void ) {
|
|
||||||
if( ( other.classname == "player" ) && ( other.team == self.team ) ) {
|
void func_buyzone::touch(void)
|
||||||
other.fInBuyZone = TRUE; // Note: this will be cleared every frame inside SV_RunClientCommand
|
{
|
||||||
|
/* This will be cleared every frame inside SV_RunClientCommand */
|
||||||
|
if((other.classname == "player" ) && (other.team == self.team)) {
|
||||||
|
other.fInBuyZone = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void func_buyzone::func_buyzone(void)
|
||||||
=================
|
{
|
||||||
SPAWN: func_buyzone
|
if (autocvar_fcs_knifeonly == TRUE) {
|
||||||
|
|
||||||
Entry function for the buyzone area-markings.
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void func_buyzone( void ) {
|
|
||||||
if ( autocvar_fcs_knifeonly == TRUE ) {
|
|
||||||
remove( self );
|
remove( self );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( autocvar_fcs_swapteams == TRUE ) {
|
if (autocvar_fcs_swapteams == TRUE) {
|
||||||
if (self.team == TEAM_T) {
|
if (team == TEAM_T) {
|
||||||
self.team = TEAM_CT;
|
team = TEAM_CT;
|
||||||
} else if (self.team == TEAM_CT) {
|
} else if (team == TEAM_CT) {
|
||||||
self.team = TEAM_T;
|
team = TEAM_T;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.angles = '0 0 0';
|
angles = '0 0 0';
|
||||||
self.movetype = MOVETYPE_NONE;
|
movetype = MOVETYPE_NONE;
|
||||||
self.solid = SOLID_TRIGGER;
|
solid = SOLID_TRIGGER;
|
||||||
|
|
||||||
if ( self.model ) {
|
if (model) {
|
||||||
setmodel( self, self.model );
|
setmodel(this, model);
|
||||||
} else {
|
} else {
|
||||||
self.mins = '-128 -128 -36';
|
mins = '-128 -128 -36';
|
||||||
self.maxs = '128 128 36';
|
maxs = '128 128 36';
|
||||||
setsize( self, self.mins, self.maxs );
|
setsize(this, mins, maxs);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.model = 0;
|
model = 0;
|
||||||
self.touch = func_buyzone_touch;
|
|
||||||
iBuyZones++;
|
iBuyZones++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +91,7 @@ void Game_CreateBuyZones( void ) {
|
||||||
entity eBuyZoneT = spawn();
|
entity eBuyZoneT = spawn();
|
||||||
setorigin( eBuyZoneT, eFind.origin );
|
setorigin( eBuyZoneT, eFind.origin );
|
||||||
self = eBuyZoneT;
|
self = eBuyZoneT;
|
||||||
func_buyzone();
|
spawnfunc_func_buyzone();
|
||||||
self.team = TEAM_T;
|
self.team = TEAM_T;
|
||||||
|
|
||||||
eFind = eFind.chain;
|
eFind = eFind.chain;
|
||||||
|
@ -111,7 +107,7 @@ void Game_CreateBuyZones( void ) {
|
||||||
entity eBuyZoneCT = spawn();
|
entity eBuyZoneCT = spawn();
|
||||||
setorigin( eBuyZoneCT, eFind.origin );
|
setorigin( eBuyZoneCT, eFind.origin );
|
||||||
self = eBuyZoneCT;
|
self = eBuyZoneCT;
|
||||||
func_buyzone();
|
spawnfunc_func_buyzone();
|
||||||
self.team = TEAM_CT;
|
self.team = TEAM_CT;
|
||||||
|
|
||||||
eFind = eFind.chain;
|
eFind = eFind.chain;
|
70
Source/Server/func_escapezone.cpp
Normal file
70
Source/Server/func_escapezone.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TODO: This gamemode is odd about balancing, right now the last surviving terrorist
|
||||||
|
will decide the match. Still have to think about what rules to set up.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class func_escapezone
|
||||||
|
{
|
||||||
|
void() func_escapezone;
|
||||||
|
virtual void() touch;
|
||||||
|
};
|
||||||
|
|
||||||
|
void Escape_Touch(entity targ)
|
||||||
|
{
|
||||||
|
entity eOld = self;
|
||||||
|
self = targ;
|
||||||
|
Spawn_MakeSpectator();
|
||||||
|
self.classname = "player";
|
||||||
|
forceinfokey( self, "*dead", "0" );
|
||||||
|
self.health = 0;
|
||||||
|
Rules_CountPlayers();
|
||||||
|
self = eOld;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
func_escapezone_touch
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void func_escapezone::touch(void)
|
||||||
|
{
|
||||||
|
if ((other.classname == "player") && (other.team == TEAM_T)) {
|
||||||
|
Escape_Touch(other);
|
||||||
|
|
||||||
|
if (iAlivePlayers_T == 0) {
|
||||||
|
Rules_RoundOver(TEAM_T, 2500, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
SPAWN: func_escapezone
|
||||||
|
|
||||||
|
Entry function for the terrorist escape zone
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void func_escapezone::func_escapezone(void)
|
||||||
|
{
|
||||||
|
angles = [0,0,0];
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
solid = SOLID_TRIGGER;
|
||||||
|
|
||||||
|
if ( model ) {
|
||||||
|
setmodel( self, model );
|
||||||
|
} else {
|
||||||
|
setsize( self, mins, maxs );
|
||||||
|
}
|
||||||
|
|
||||||
|
model = 0;
|
||||||
|
iEscapeZones++;
|
||||||
|
}
|
58
Source/Server/func_hostage_rescue.cpp
Normal file
58
Source/Server/func_hostage_rescue.cpp
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
class func_hostage_rescue
|
||||||
|
{
|
||||||
|
void() func_hostage_rescue;
|
||||||
|
virtual void() touch;
|
||||||
|
};
|
||||||
|
|
||||||
|
void func_hostage_rescue::touch(void)
|
||||||
|
{
|
||||||
|
if ((other.classname == "player" ) && ( other.team == TEAM_CT )) {
|
||||||
|
/* This will be cleared every frame inside SV_RunClientCommand */
|
||||||
|
other.fInHostageZone = TRUE;
|
||||||
|
} else if (other.classname == "hostage_entity") {
|
||||||
|
hostage_entity hosty = (hostage_entity)other;
|
||||||
|
if (solid == SOLID_NOT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Radio_BroadcastMessage(RADIO_RESCUED);
|
||||||
|
iHostagesRescued++;
|
||||||
|
|
||||||
|
Money_AddMoney(hosty.m_eUser, 1000);
|
||||||
|
Money_QueTeamReward(TEAM_CT, 800);
|
||||||
|
|
||||||
|
CBaseEntity targa = (CBaseEntity)other;
|
||||||
|
targa.Hide();
|
||||||
|
|
||||||
|
if (iHostagesRescued >= iHostagesMax) {
|
||||||
|
// TODO: Broadcast_Print: All Hostages have been rescued!
|
||||||
|
Rules_RoundOver(TEAM_CT, 0, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_hostage_rescue::func_hostage_rescue( void )
|
||||||
|
{
|
||||||
|
angles = '0 0 0';
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
solid = SOLID_TRIGGER;
|
||||||
|
|
||||||
|
if (model) {
|
||||||
|
setmodel(this, model);
|
||||||
|
} else {
|
||||||
|
mins = '-128 -128 -36';
|
||||||
|
maxs = '128 128 36';
|
||||||
|
setsize(this, mins, maxs);
|
||||||
|
}
|
||||||
|
model = 0;
|
||||||
|
|
||||||
|
iRescueZones++;
|
||||||
|
}
|
50
Source/Server/func_vip_safetyzone.cpp
Normal file
50
Source/Server/func_vip_safetyzone.cpp
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
class func_vip_safetyzone
|
||||||
|
{
|
||||||
|
void() func_vip_safetyzone;
|
||||||
|
virtual void() touch;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Hack! Make this better? */
|
||||||
|
void VIP_Rescue(entity targ)
|
||||||
|
{
|
||||||
|
entity eOld = self;
|
||||||
|
self = other;
|
||||||
|
Spawn_MakeSpectator();
|
||||||
|
self.classname = "player";
|
||||||
|
self.team = TEAM_CT;
|
||||||
|
forceinfokey(self, "*dead", "0");
|
||||||
|
iAlivePlayers_CT--;
|
||||||
|
self = eOld;
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_vip_safetyzone::touch(void)
|
||||||
|
{
|
||||||
|
if ((other.classname == "player") && (other.team == TEAM_VIP)) {
|
||||||
|
Rules_RoundOver(TEAM_CT, 2500, FALSE);
|
||||||
|
VIP_Rescue(other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_vip_safetyzone::func_vip_safetyzone(void)
|
||||||
|
{
|
||||||
|
angles = '0 0 0';
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
solid = SOLID_TRIGGER;
|
||||||
|
|
||||||
|
if (model) {
|
||||||
|
setmodel(this, model);
|
||||||
|
} else {
|
||||||
|
setsize(this, mins, maxs);
|
||||||
|
}
|
||||||
|
|
||||||
|
model = 0;
|
||||||
|
iVIPZones++;
|
||||||
|
}
|
187
Source/Server/hostage_entity.cpp
Normal file
187
Source/Server/hostage_entity.cpp
Normal file
|
@ -0,0 +1,187 @@
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
enum {
|
||||||
|
HOSTAGE_IDLE,
|
||||||
|
HOSTAGE_WALK,
|
||||||
|
HOSTAGE_RUN
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
HOSA_WALK,
|
||||||
|
HOSA_WALKSCARED,
|
||||||
|
HOSA_RUN,
|
||||||
|
HOSA_RUNSCARED,
|
||||||
|
HOSA_RUNLOOK,
|
||||||
|
HOSA_180LEFT,
|
||||||
|
HOSA_180RIGHT,
|
||||||
|
HOSA_FLINCH,
|
||||||
|
HOSA_PAIN,
|
||||||
|
HOSA_PAINLEFT,
|
||||||
|
HOSA_PAINRIGHT,
|
||||||
|
HOSA_PAINLEGLEFT,
|
||||||
|
HOSA_PAINLEGRIGHT,
|
||||||
|
HOSA_IDLE1,
|
||||||
|
HOSA_IDLE2,
|
||||||
|
HOSA_IDLE3,
|
||||||
|
HOSA_IDLE4,
|
||||||
|
HOSA_IDLE5,
|
||||||
|
HOSA_IDLE6,
|
||||||
|
HOSA_SCARED_END,
|
||||||
|
HOSA_SCARED1,
|
||||||
|
HOSA_SCARED2,
|
||||||
|
HOSA_SCARED3,
|
||||||
|
HOSA_SCARED4,
|
||||||
|
HOSA_PANIC,
|
||||||
|
HOSA_FEAR1,
|
||||||
|
HOSA_FEAR2,
|
||||||
|
HOSA_CRY,
|
||||||
|
HOSA_SCI1,
|
||||||
|
HOSA_SCI2,
|
||||||
|
HOSA_SCI3,
|
||||||
|
HOSA_DIE_SIMPLE,
|
||||||
|
HOSA_DIE_FORWARD1,
|
||||||
|
HOSA_DIE_FORWARD2,
|
||||||
|
HOSA_DIE_BACKWARD,
|
||||||
|
HOSA_DIE_HEADSHOT,
|
||||||
|
HOSA_DIE_GUTSHOT,
|
||||||
|
HOSA_LYING1,
|
||||||
|
HOSA_LYING2,
|
||||||
|
HOSA_DEADSIT,
|
||||||
|
HOSA_DEADTABLE1,
|
||||||
|
HOSA_DEADTABLE2,
|
||||||
|
HOSA_DEADTABLE3
|
||||||
|
};
|
||||||
|
|
||||||
|
class hostage_entity:CBaseEntity
|
||||||
|
{
|
||||||
|
entity m_eUser;
|
||||||
|
int m_iUsed;
|
||||||
|
void() hostage_entity;
|
||||||
|
|
||||||
|
virtual void() Hide;
|
||||||
|
virtual void() Respawn;
|
||||||
|
virtual void() PlayerUse;
|
||||||
|
virtual void(int) vPain;
|
||||||
|
virtual void(int) vDeath;
|
||||||
|
virtual void() Physics;
|
||||||
|
};
|
||||||
|
|
||||||
|
void hostage_entity::Physics(void)
|
||||||
|
{
|
||||||
|
input_movevalues = [0,0,0];
|
||||||
|
input_impulse = 0;
|
||||||
|
input_buttons = 0;
|
||||||
|
if (m_eUser!= world) {
|
||||||
|
vector enda = vectoangles(m_eUser.origin - origin);
|
||||||
|
enda[0] = 0;
|
||||||
|
enda[1] = Math_FixDelta(enda[1]);
|
||||||
|
enda[2] = 0;
|
||||||
|
v_angle = enda;
|
||||||
|
|
||||||
|
if (vlen(m_eUser.origin - origin) > 128) {
|
||||||
|
input_movevalues[0] = 240;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input_timelength = frametime;
|
||||||
|
input_angles = v_angle;
|
||||||
|
movetype = MOVETYPE_WALK;
|
||||||
|
|
||||||
|
runstandardplayerphysics(this);
|
||||||
|
Footsteps_Update();
|
||||||
|
|
||||||
|
angles = v_angle;
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void hostage_entity::PlayerUse(void)
|
||||||
|
{
|
||||||
|
if (eActivator.team == TEAM_CT) {
|
||||||
|
if ((m_eUser == world)) {
|
||||||
|
// Only give cash to the CT for using it for the first time
|
||||||
|
if (m_iUsed == FALSE) {
|
||||||
|
Money_AddMoney(eActivator, 150);
|
||||||
|
sound(this, CHAN_VOICE, sprintf("hostage/hos%d.wav", random(1, 6)), 1.0, ATTN_IDLE);
|
||||||
|
m_iUsed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_eUser = eActivator;
|
||||||
|
} else {
|
||||||
|
m_eUser = world;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void hostage_entity::vPain(int iHitBody)
|
||||||
|
{
|
||||||
|
frame = HOSA_FLINCH + floor(random(0, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
void hostage_entity::vDeath(int iHitBody)
|
||||||
|
{
|
||||||
|
Radio_BroadcastMessage(RADIO_HOSDOWN);
|
||||||
|
frame = HOSA_DIE_SIMPLE + floor(random(0, 6));
|
||||||
|
|
||||||
|
solid = SOLID_NOT;
|
||||||
|
takedamage = DAMAGE_NO;
|
||||||
|
customphysics = Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void hostage_entity::Hide(void)
|
||||||
|
{
|
||||||
|
setmodel(this, "");
|
||||||
|
m_eUser = world;
|
||||||
|
solid = SOLID_NOT;
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
customphysics = __NULL__;
|
||||||
|
}
|
||||||
|
|
||||||
|
void hostage_entity::Respawn(void)
|
||||||
|
{
|
||||||
|
v_angle[0] = Math_FixDelta(m_oldAngle[0]);
|
||||||
|
v_angle[1] = Math_FixDelta(m_oldAngle[1]);
|
||||||
|
v_angle[2] = Math_FixDelta(m_oldAngle[2]);
|
||||||
|
|
||||||
|
setorigin(this, m_oldOrigin);
|
||||||
|
angles = v_angle;
|
||||||
|
solid = SOLID_SLIDEBOX;
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
setmodel(this, m_oldModel);
|
||||||
|
setsize(this, VEC_HULL_MIN + [0,0,36], VEC_HULL_MAX + [0,0,36]);
|
||||||
|
|
||||||
|
m_eUser = world;
|
||||||
|
iBleeds = TRUE;
|
||||||
|
takedamage = DAMAGE_YES;
|
||||||
|
style = HOSTAGE_IDLE;
|
||||||
|
customphysics = Physics;
|
||||||
|
|
||||||
|
frame = HOSA_IDLE1;
|
||||||
|
health = 100;
|
||||||
|
velocity = [0,0,0];
|
||||||
|
m_iUsed = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void hostage_entity::hostage_entity(void)
|
||||||
|
{
|
||||||
|
// Path hack, FIXME do it a better way
|
||||||
|
if (model == "/models/hostage.mdl") {
|
||||||
|
model = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!model) {
|
||||||
|
model = "models/hostage.mdl";
|
||||||
|
}
|
||||||
|
|
||||||
|
CBaseEntity::CBaseEntity();
|
||||||
|
|
||||||
|
precache_model(m_oldModel);
|
||||||
|
setmodel(this, m_oldModel);
|
||||||
|
iHostagesMax = iHostagesMax + 1;
|
||||||
|
Respawn();
|
||||||
|
}
|
33
Source/Server/info_hostage_rescue.cpp
Normal file
33
Source/Server/info_hostage_rescue.cpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
void info_hostage_rescue(void)
|
||||||
|
{
|
||||||
|
spawnfunc_func_hostage_rescue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Game_CreateRescueZones
|
||||||
|
|
||||||
|
Called by StartFrame if we somehow got no rescue zones
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void Game_CreateRescueZones(void)
|
||||||
|
{
|
||||||
|
entity a;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (a = world; (a = find(a, classname, "info_player_start"));) {
|
||||||
|
func_hostage_rescue zone = spawn(func_hostage_rescue);
|
||||||
|
setorigin(zone, a.origin);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
print(sprintf("Game: Created %i func_hostage_rescue\n", count));
|
||||||
|
}
|
|
@ -48,7 +48,10 @@ Money.c
|
||||||
../Shared/spraylogo.cpp
|
../Shared/spraylogo.cpp
|
||||||
../Shared/pmove.c
|
../Shared/pmove.c
|
||||||
|
|
||||||
|
hostage_entity.cpp
|
||||||
|
func_hostage_rescue.cpp
|
||||||
|
info_hostage_rescue.cpp
|
||||||
|
func_vip_safetyzone.cpp
|
||||||
info_map_parameters.cpp
|
info_map_parameters.cpp
|
||||||
|
|
||||||
Vox.c
|
Vox.c
|
||||||
|
@ -58,16 +61,9 @@ TraceAttack.c
|
||||||
Rules.c
|
Rules.c
|
||||||
Timer.c
|
Timer.c
|
||||||
|
|
||||||
EntHostage.c
|
func_bomb_target.cpp
|
||||||
|
func_buyzone.cpp
|
||||||
Entities.c
|
func_escapezone.cpp
|
||||||
FuncHostageRescue.c
|
|
||||||
FuncEscapeZone.c
|
|
||||||
FuncBombTarget.c
|
|
||||||
FuncBuyZone.c
|
|
||||||
FuncVIPSafetyZone.c
|
|
||||||
|
|
||||||
ArmouryEntity.c
|
|
||||||
|
|
||||||
Bot/Bot.h
|
Bot/Bot.h
|
||||||
Bot/Way.c
|
Bot/Way.c
|
||||||
|
|
|
@ -114,7 +114,7 @@ static void WeaponC4BOMB_Think( void ) {
|
||||||
if ( ( eBombChain.classname == "func_bomb_target" ) ) {
|
if ( ( eBombChain.classname == "func_bomb_target" ) ) {
|
||||||
entity eOld = self;
|
entity eOld = self;
|
||||||
self = eBombChain;
|
self = eBombChain;
|
||||||
Entities_UseTargets();
|
//Entities_UseTargets();
|
||||||
self = eOld;
|
self = eOld;
|
||||||
}
|
}
|
||||||
eBombChain = eBombChain.chain;
|
eBombChain = eBombChain.chain;
|
||||||
|
@ -160,7 +160,6 @@ void WeaponC4BOMB_Drop( vector vBombPos, vector vNormal ) {
|
||||||
|
|
||||||
eBomb.customphysics = WeaponC4BOMB_Think;
|
eBomb.customphysics = WeaponC4BOMB_Think;
|
||||||
eBomb.fAttackFinished = time + autocvar_mp_c4timer;
|
eBomb.fAttackFinished = time + autocvar_mp_c4timer;
|
||||||
eBomb.gflags = GF_USABLE;
|
|
||||||
eBomb.PlayerUse = WeaponC4BOMB_Use;
|
eBomb.PlayerUse = WeaponC4BOMB_Use;
|
||||||
eBomb.owner = self;
|
eBomb.owner = self;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 2000-2019, Vera Visions. All rights reserved.
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
*
|
*
|
||||||
****/
|
****/
|
||||||
|
|
||||||
|
|
|
@ -28,14 +28,25 @@ Notes
|
||||||
class cycler:CBaseEntity
|
class cycler:CBaseEntity
|
||||||
{
|
{
|
||||||
void() cycler;
|
void() cycler;
|
||||||
|
virtual void(entity, int, int) vPain;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void cycler::vPain(entity attacker, int type, int damage)
|
||||||
|
{
|
||||||
|
if (frame >= modelframecount(modelindex)) {
|
||||||
|
frame = 0;
|
||||||
|
} else {
|
||||||
|
frame += 1;
|
||||||
|
}
|
||||||
|
health = 9999;
|
||||||
|
}
|
||||||
|
|
||||||
void cycler::cycler(void)
|
void cycler::cycler(void)
|
||||||
{
|
{
|
||||||
precache_model(model);
|
|
||||||
CBaseEntity::CBaseEntity();
|
CBaseEntity::CBaseEntity();
|
||||||
setmodel(this, model);
|
precache_model(m_oldModel);
|
||||||
|
setmodel(this, m_oldModel);
|
||||||
solid = SOLID_BBOX;
|
solid = SOLID_BBOX;
|
||||||
|
takedamage = DAMAGE_YES;
|
||||||
|
health = 9999;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
27
Source/gs-entbase/server/cycler_sprite.cpp
Normal file
27
Source/gs-entbase/server/cycler_sprite.cpp
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
||||||
|
*
|
||||||
|
* See the file LICENSE attached with the sources for usage details.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
/* https://twhl.info/wiki/page/cycler_sprite_(Half-Life) */
|
||||||
|
|
||||||
|
enumflags
|
||||||
|
{
|
||||||
|
ENVS_STARTON,
|
||||||
|
ENVS_PLAYONCE
|
||||||
|
};
|
||||||
|
|
||||||
|
class cycler_sprite:CBaseEntity
|
||||||
|
{
|
||||||
|
void() cycler_sprite;
|
||||||
|
};
|
||||||
|
|
||||||
|
void cycler_sprite::cycler_sprite(void)
|
||||||
|
{
|
||||||
|
CBaseEntity::CBaseEntity();
|
||||||
|
precache_model(m_oldModel);
|
||||||
|
Respawn();
|
||||||
|
}
|
|
@ -12,21 +12,11 @@
|
||||||
|
|
||||||
enumflags
|
enumflags
|
||||||
{
|
{
|
||||||
GF_USABLE,
|
|
||||||
GF_CANRESPAWN,
|
GF_CANRESPAWN,
|
||||||
GF_CANBLEED,
|
|
||||||
GF_USE_RELEASED,
|
GF_USE_RELEASED,
|
||||||
GF_BUFF_BLEED,
|
|
||||||
GF_BUFF_COMPUSURE,
|
|
||||||
GF_BUFF_WILLPOWER,
|
|
||||||
GF_CARRIES_FLAG,
|
|
||||||
GF_IN_VEHICLE,
|
GF_IN_VEHICLE,
|
||||||
GF_IS_HEALING,
|
|
||||||
GF_FROZEN,
|
GF_FROZEN,
|
||||||
GF_TORCH,
|
GF_SEMI_TOGGLED
|
||||||
GF_SEMI_TOGGLED,
|
|
||||||
GF_BLOCKING,
|
|
||||||
GF_BOT_POI
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void Effect_CreateSpark(vector pos, vector ang);
|
void Effect_CreateSpark(vector pos, vector ang);
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*
|
*
|
||||||
****/
|
****/
|
||||||
|
|
||||||
/* https://twhl.info/wiki/page/env_sprite_(Half-Life) */
|
/* https://twhl.info/wiki/page/env_glow_(Half-Life) */
|
||||||
|
|
||||||
enumflags
|
enumflags
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,6 +17,11 @@ enumflags
|
||||||
class env_sprite:CBaseTrigger
|
class env_sprite:CBaseTrigger
|
||||||
{
|
{
|
||||||
int m_iToggled;
|
int m_iToggled;
|
||||||
|
float m_flFramerate;
|
||||||
|
float m_flScale;
|
||||||
|
float m_flAlpha;
|
||||||
|
float m_flEffects;
|
||||||
|
|
||||||
void() env_sprite;
|
void() env_sprite;
|
||||||
virtual void() Trigger;
|
virtual void() Trigger;
|
||||||
virtual float(entity, float) Network;
|
virtual float(entity, float) Network;
|
||||||
|
@ -33,24 +38,27 @@ float env_sprite::Network(entity pvsent, float flags)
|
||||||
WriteCoord(MSG_ENTITY, origin_y);
|
WriteCoord(MSG_ENTITY, origin_y);
|
||||||
WriteCoord(MSG_ENTITY, origin_z);
|
WriteCoord(MSG_ENTITY, origin_z);
|
||||||
WriteFloat(MSG_ENTITY, modelindex);
|
WriteFloat(MSG_ENTITY, modelindex);
|
||||||
WriteFloat(MSG_ENTITY, framerate);
|
WriteFloat(MSG_ENTITY, m_flFramerate);
|
||||||
WriteFloat(MSG_ENTITY, scale);
|
WriteFloat(MSG_ENTITY, m_flScale);
|
||||||
WriteFloat(MSG_ENTITY, alpha);
|
WriteFloat(MSG_ENTITY, m_flAlpha);
|
||||||
WriteFloat(MSG_ENTITY, effects);
|
WriteFloat(MSG_ENTITY, effects);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void env_sprite::NetworkOnce(void)
|
void env_sprite::NetworkOnce(void)
|
||||||
{
|
{
|
||||||
|
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
||||||
WriteByte(MSG_ENTITY, EV_SPRITE);
|
WriteByte(MSG_ENTITY, EV_SPRITE);
|
||||||
WriteCoord(MSG_ENTITY, origin_x);
|
WriteCoord(MSG_ENTITY, origin_x);
|
||||||
WriteCoord(MSG_ENTITY, origin_y);
|
WriteCoord(MSG_ENTITY, origin_y);
|
||||||
WriteCoord(MSG_ENTITY, origin_z);
|
WriteCoord(MSG_ENTITY, origin_z);
|
||||||
WriteFloat(MSG_ENTITY, modelindex);
|
WriteFloat(MSG_ENTITY, modelindex);
|
||||||
WriteFloat(MSG_ENTITY, framerate);
|
WriteFloat(MSG_ENTITY, m_flFramerate);
|
||||||
WriteFloat(MSG_ENTITY, scale);
|
WriteFloat(MSG_ENTITY, m_flScale);
|
||||||
WriteFloat(MSG_ENTITY, alpha);
|
WriteFloat(MSG_ENTITY, m_flAlpha);
|
||||||
WriteFloat(MSG_ENTITY, effects);
|
WriteFloat(MSG_ENTITY, effects);
|
||||||
|
msg_entity = this;
|
||||||
|
multicast( origin, MULTICAST_PVS );
|
||||||
}
|
}
|
||||||
|
|
||||||
void env_sprite::Trigger(void)
|
void env_sprite::Trigger(void)
|
||||||
|
@ -65,6 +73,22 @@ void env_sprite::Trigger(void)
|
||||||
|
|
||||||
void env_sprite::env_sprite(void)
|
void env_sprite::env_sprite(void)
|
||||||
{
|
{
|
||||||
|
for (int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2) {
|
||||||
|
switch ( argv( i ) ) {
|
||||||
|
case "framerate":
|
||||||
|
m_flFramerate = stof(argv(i + 1));
|
||||||
|
break;
|
||||||
|
case "scale":
|
||||||
|
m_flScale = stof(argv(i + 1));
|
||||||
|
break;
|
||||||
|
case "alpha":
|
||||||
|
m_flAlpha = stof(argv(i + 1));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CBaseTrigger::CBaseTrigger();
|
CBaseTrigger::CBaseTrigger();
|
||||||
precache_model(m_oldModel);
|
precache_model(m_oldModel);
|
||||||
Respawn();
|
Respawn();
|
||||||
|
|
|
@ -20,7 +20,7 @@ enumflags
|
||||||
SF_PRESSURE
|
SF_PRESSURE
|
||||||
};
|
};
|
||||||
|
|
||||||
class func_breakable : CBaseTrigger
|
class func_breakable:CBaseTrigger
|
||||||
{
|
{
|
||||||
float m_iMaterial;
|
float m_iMaterial;
|
||||||
float m_flDelay;
|
float m_flDelay;
|
||||||
|
@ -33,70 +33,70 @@ class func_breakable : CBaseTrigger
|
||||||
virtual void() Trigger;
|
virtual void() Trigger;
|
||||||
virtual void() PlayerTouch;
|
virtual void() PlayerTouch;
|
||||||
/*virtual void() PressureDeath;*/
|
/*virtual void() PressureDeath;*/
|
||||||
virtual void( entity eAttacker, int iType, int iDamage ) vPain;
|
virtual void(entity eAttacker, int iType, int iDamage) vPain;
|
||||||
virtual void( entity eAttacker, int iType, int iDamage ) vDeath;
|
virtual void(entity eAttacker, int iType, int iDamage) vDeath;
|
||||||
};
|
};
|
||||||
|
|
||||||
void func_breakable :: vPain ( entity attacker, int type, int damage )
|
void func_breakable::vPain (entity attacker, int type, int damage)
|
||||||
{
|
{
|
||||||
if (spawnflags & SF_TRIGGER) {
|
if (spawnflags & SF_TRIGGER) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serverkeyfloat("*bspversion") != 30) {
|
if (serverkeyfloat("*bspversion") != 30) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch ( m_iMaterial ) {
|
|
||||||
|
switch (m_iMaterial) {
|
||||||
case MATERIAL_GLASS:
|
case MATERIAL_GLASS:
|
||||||
case MATERIAL_COMPUTER:
|
case MATERIAL_COMPUTER:
|
||||||
case MATERIAL_GLASS_UNBREAKABLE:
|
case MATERIAL_GLASS_UNBREAKABLE:
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/glass%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
sound(self, CHAN_VOICE, sprintf("debris/glass%d.wav", random(1, 4)), 1.0, ATTN_NORM);
|
||||||
break;
|
break;
|
||||||
case MATERIAL_WOOD:
|
case MATERIAL_WOOD:
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/wood%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
sound(self, CHAN_VOICE, sprintf("debris/wood%d.wav", random(1, 4)), 1.0, ATTN_NORM);
|
||||||
break;
|
break;
|
||||||
case MATERIAL_METAL:
|
case MATERIAL_METAL:
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/metal%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
sound(self, CHAN_VOICE, sprintf("debris/metal%d.wav", random(1, 4)), 1.0, ATTN_NORM);
|
||||||
break;
|
break;
|
||||||
case MATERIAL_FLESH:
|
case MATERIAL_FLESH:
|
||||||
float fRand = floor( random( 1, 8 ) );
|
float fRand = floor(random(1, 8));
|
||||||
/* There never was a flesh4.wav */
|
/* There never was a flesh4.wav */
|
||||||
if ( fRand == 4 ) {
|
if (fRand == 4) {
|
||||||
fRand = 5;
|
fRand = 5;
|
||||||
}
|
}
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/flesh%d.wav", fRand ), 1.0, ATTN_NORM );
|
sound(self, CHAN_VOICE, sprintf("debris/flesh%d.wav", fRand), 1.0, ATTN_NORM);
|
||||||
break;
|
break;
|
||||||
case MATERIAL_CINDER:
|
case MATERIAL_CINDER:
|
||||||
case MATERIAL_ROCK:
|
case MATERIAL_ROCK:
|
||||||
sound( self, CHAN_VOICE, sprintf( "debris/concrete%d.wav", random( 1, 4 ) ), 1.0, ATTN_NORM );
|
sound(self, CHAN_VOICE, sprintf("debris/concrete%d.wav", random(1, 4)), 1.0, ATTN_NORM);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_breakable :: vDeath ( entity attacker, int type, int damage )
|
void func_breakable::vDeath (entity attacker, int type, int damage)
|
||||||
{
|
{
|
||||||
if (m_iMaterial == MATERIAL_GLASS_UNBREAKABLE) {
|
if (m_iMaterial == MATERIAL_GLASS_UNBREAKABLE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
health = 0;
|
health = 0;
|
||||||
Effect_BreakModel( absmin, absmax, '0 0 0', m_iMaterial );
|
Effect_BreakModel(absmin, absmax, '0 0 0', m_iMaterial);
|
||||||
CBaseTrigger::UseTargets();
|
CBaseTrigger::UseTargets();
|
||||||
CBaseEntity::Hide();
|
CBaseEntity::Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_breakable :: Trigger ( void )
|
void func_breakable::Trigger(void)
|
||||||
{
|
{
|
||||||
func_breakable::vDeath( world, 0, 0 );
|
func_breakable::vDeath(world, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void func_breakable :: PressureDeath ( void )
|
/*void func_breakable::PressureDeath(void)
|
||||||
{
|
{
|
||||||
func_breakable::vDeath(m_pressAttacker, m_pressType, m_pressDamage);
|
func_breakable::vDeath(m_pressAttacker, m_pressType, m_pressDamage);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
void func_breakable :: PlayerTouch ( void )
|
void func_breakable::PlayerTouch(void)
|
||||||
{
|
{
|
||||||
if ( other.classname == classname ) {
|
if (other.classname == classname) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ void func_breakable :: PlayerTouch ( void )
|
||||||
|
|
||||||
if (fDamage >= health) {
|
if (fDamage >= health) {
|
||||||
touch = __NULL__;
|
touch = __NULL__;
|
||||||
Damage_Apply( this, other, fDamage, absmin, FALSE );
|
Damage_Apply(this, other, fDamage, absmin, FALSE);
|
||||||
|
|
||||||
if ((m_iMaterial == MATERIAL_GLASS) || (m_iMaterial == MATERIAL_COMPUTER)) {
|
if ((m_iMaterial == MATERIAL_GLASS) || (m_iMaterial == MATERIAL_COMPUTER)) {
|
||||||
Damage_Apply(other, this, fDamage / 4, other.origin, FALSE);
|
Damage_Apply(other, this, fDamage / 4, other.origin, FALSE);
|
||||||
|
@ -126,14 +126,18 @@ void func_breakable :: PlayerTouch ( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void func_breakable :: Respawn ( void )
|
void func_breakable::Respawn(void)
|
||||||
{
|
{
|
||||||
setorigin(this, m_oldOrigin);
|
precache_model(m_oldModel);
|
||||||
|
angles = [0,0,0];
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
solid = SOLID_BSP;
|
||||||
setmodel(this, m_oldModel);
|
setmodel(this, m_oldModel);
|
||||||
|
setorigin(this, m_oldOrigin);
|
||||||
touch = PlayerTouch;
|
touch = PlayerTouch;
|
||||||
think = __NULL__;
|
think = __NULL__;
|
||||||
|
|
||||||
if ( spawnflags & SF_TRIGGER ) {
|
if (spawnflags & SF_TRIGGER) {
|
||||||
takedamage = DAMAGE_NO;
|
takedamage = DAMAGE_NO;
|
||||||
} else {
|
} else {
|
||||||
takedamage = DAMAGE_YES;
|
takedamage = DAMAGE_YES;
|
||||||
|
@ -141,28 +145,23 @@ void func_breakable :: Respawn ( void )
|
||||||
|
|
||||||
health = m_oldHealth;
|
health = m_oldHealth;
|
||||||
|
|
||||||
if ( !health ) {
|
if (!health) {
|
||||||
health = 15;
|
health = 15;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_breakable :: func_breakable( void )
|
void func_breakable::func_breakable(void)
|
||||||
{
|
{
|
||||||
precache_model( model );
|
|
||||||
angles = [0,0,0];
|
|
||||||
movetype = MOVETYPE_NONE;
|
|
||||||
solid = SOLID_BSP;
|
|
||||||
setmodel( this, model );
|
|
||||||
CBaseEntity::CBaseEntity();
|
CBaseEntity::CBaseEntity();
|
||||||
func_breakable::Respawn();
|
func_breakable::Respawn();
|
||||||
|
|
||||||
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
|
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
|
||||||
switch ( argv( i ) ) {
|
switch (argv(i)) {
|
||||||
case "material":
|
case "material":
|
||||||
m_iMaterial = stof( argv( i + 1 ) );
|
m_iMaterial = stof(argv(i + 1));
|
||||||
break;
|
break;
|
||||||
case "delay":
|
case "delay":
|
||||||
m_flDelay = stof( argv( i + 1 ) );
|
m_flDelay = stof(argv(i + 1));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -25,7 +25,7 @@ enum
|
||||||
FRAME_ON
|
FRAME_ON
|
||||||
};
|
};
|
||||||
|
|
||||||
class func_button : CBaseTrigger
|
class func_button:CBaseTrigger
|
||||||
{
|
{
|
||||||
float m_flSpeed;
|
float m_flSpeed;
|
||||||
float m_flLip;
|
float m_flLip;
|
||||||
|
@ -39,9 +39,11 @@ class func_button : CBaseTrigger
|
||||||
string m_strNoise;
|
string m_strNoise;
|
||||||
float m_flWait;
|
float m_flWait;
|
||||||
float m_flDelay;
|
float m_flDelay;
|
||||||
|
vector m_vecMoveDir;
|
||||||
virtual void() m_pMove = 0;
|
virtual void() m_pMove = 0;
|
||||||
|
|
||||||
virtual void() Precache;
|
virtual void() Precache;
|
||||||
|
virtual void() Respawn;
|
||||||
virtual void() Arrived;
|
virtual void() Arrived;
|
||||||
virtual void() Returned;
|
virtual void() Returned;
|
||||||
virtual void() MoveBack;
|
virtual void() MoveBack;
|
||||||
|
@ -49,17 +51,17 @@ class func_button : CBaseTrigger
|
||||||
virtual void() Touch;
|
virtual void() Touch;
|
||||||
virtual void() Blocked;
|
virtual void() Blocked;
|
||||||
virtual void() Trigger;
|
virtual void() Trigger;
|
||||||
virtual void() PlayerUse;
|
virtual void() Use;
|
||||||
|
|
||||||
virtual void() SetMovementDirection;
|
virtual void() SetMovementDirection;
|
||||||
virtual void(vector vdest, void() func) MoveToDestination;
|
virtual void(vector vdest, void() func) MoveToDestination;
|
||||||
virtual void() MoveToDestination_End;
|
virtual void() MoveToDestination_End;
|
||||||
};
|
};
|
||||||
|
|
||||||
void func_button :: Precache( void )
|
void func_button::Precache(void)
|
||||||
{
|
{
|
||||||
precache_model( model );
|
precache_model(model);
|
||||||
switch( m_iSounds ) {
|
switch(m_iSounds) {
|
||||||
case 0:
|
case 0:
|
||||||
m_strNoise = "common/null.wav";
|
m_strNoise = "common/null.wav";
|
||||||
break;
|
break;
|
||||||
|
@ -124,29 +126,29 @@ void func_button :: Precache( void )
|
||||||
m_strNoise = "buttons/button9.wav";
|
m_strNoise = "buttons/button9.wav";
|
||||||
}
|
}
|
||||||
|
|
||||||
precache_sound( m_strNoise );
|
precache_sound(m_strNoise);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: Arrived( void )
|
void func_button::Arrived(void)
|
||||||
{
|
{
|
||||||
m_iState = STATE_RAISED;
|
m_iState = STATE_RAISED;
|
||||||
|
|
||||||
if ( !( spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {
|
||||||
touch = Touch;
|
touch = Touch;
|
||||||
}
|
}
|
||||||
if ( spawnflags & SF_BTT_TOGGLE ) {
|
if (spawnflags & SF_BTT_TOGGLE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_flWait != -1 ) {
|
if (m_flWait != -1) {
|
||||||
think = MoveBack;
|
think = MoveBack;
|
||||||
nextthink = ( ltime + m_flWait );
|
nextthink = (ltime + m_flWait);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: Returned( void )
|
void func_button::Returned(void)
|
||||||
{
|
{
|
||||||
if ( !( spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {
|
||||||
touch = Touch;
|
touch = Touch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,36 +156,36 @@ void func_button :: Returned( void )
|
||||||
frame = FRAME_OFF;
|
frame = FRAME_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: MoveBack( void )
|
void func_button::MoveBack(void)
|
||||||
{
|
{
|
||||||
if ( !( spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {
|
||||||
touch = __NULL__;
|
touch = __NULL__;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_iState = STATE_DOWN;
|
m_iState = STATE_DOWN;
|
||||||
|
|
||||||
if ( m_vecPos2 != m_vecPos1 ) {
|
if (m_vecPos2 != m_vecPos1) {
|
||||||
func_button::MoveToDestination ( m_vecPos1, Returned );
|
func_button::MoveToDestination (m_vecPos1, Returned);
|
||||||
} else {
|
} else {
|
||||||
func_button::Returned();
|
func_button::Returned();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: MoveAway( void )
|
void func_button::MoveAway(void)
|
||||||
{
|
{
|
||||||
if ( m_iState == STATE_UP ) {
|
if (m_iState == STATE_UP) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_iState == STATE_RAISED ) {
|
if (m_iState == STATE_RAISED) {
|
||||||
nextthink = ( ltime + m_flWait );
|
nextthink = (ltime + m_flWait);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_iState = STATE_UP;
|
m_iState = STATE_UP;
|
||||||
|
|
||||||
if ( m_vecPos2 != m_vecPos1 ) {
|
if (m_vecPos2 != m_vecPos1) {
|
||||||
func_button::MoveToDestination( m_vecPos2, Arrived );
|
func_button::MoveToDestination(m_vecPos2, Arrived);
|
||||||
} else {
|
} else {
|
||||||
func_button::Arrived();
|
func_button::Arrived();
|
||||||
}
|
}
|
||||||
|
@ -191,61 +193,61 @@ void func_button :: MoveAway( void )
|
||||||
frame = FRAME_ON;
|
frame = FRAME_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: Trigger( void )
|
void func_button::Trigger(void)
|
||||||
{
|
{
|
||||||
if ( m_flNextTrigger > time ) {
|
if (m_flNextTrigger > time) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_flNextTrigger = time + m_flWait;
|
m_flNextTrigger = time + m_flWait;
|
||||||
|
|
||||||
if ( ( m_iState == STATE_UP ) || ( m_iState == STATE_RAISED ) ){
|
if ((m_iState == STATE_UP) || (m_iState == STATE_RAISED)){
|
||||||
if ( m_flWait != -1 ) {
|
if (m_flWait != -1) {
|
||||||
func_button::MoveBack();
|
func_button::MoveBack();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sound( this, CHAN_VOICE, m_strNoise, 1.0, ATTN_NORM );
|
sound(this, CHAN_VOICE, m_strNoise, 1.0, ATTN_NORM);
|
||||||
func_button::MoveAway();
|
func_button::MoveAway();
|
||||||
|
|
||||||
if ( m_flDelay ) {
|
if (m_flDelay) {
|
||||||
#ifdef GS_DEVELOPER
|
#ifdef GS_DEVELOPER
|
||||||
dprint( sprintf( "func_button: Delayed trigger of `%s`\n", m_strTarget ) );
|
dprint(sprintf("func_button: Delayed trigger of `%s`\n", m_strTarget));
|
||||||
#endif
|
#endif
|
||||||
CBaseTrigger::UseTargets_Delay( m_flDelay );
|
CBaseTrigger::UseTargets_Delay(m_flDelay);
|
||||||
} else {
|
} else {
|
||||||
#ifdef GS_DEVELOPER
|
#ifdef GS_DEVELOPER
|
||||||
print( sprintf( "func_button: Normal trigger of `%s`\n", m_strTarget ) );
|
print(sprintf("func_button: Normal trigger of `%s`\n", m_strTarget));
|
||||||
#endif
|
#endif
|
||||||
CBaseTrigger::UseTargets();
|
CBaseTrigger::UseTargets();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: Touch( void )
|
void func_button::Touch(void)
|
||||||
{
|
{
|
||||||
if ( other.movetype == MOVETYPE_WALK ) {
|
if (other.movetype == MOVETYPE_WALK) {
|
||||||
func_button::Trigger();
|
func_button::Trigger();
|
||||||
|
|
||||||
if ( !( spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {
|
||||||
touch = __NULL__;
|
touch = __NULL__;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: PlayerUse ( void )
|
void func_button::Use(void)
|
||||||
{
|
{
|
||||||
Trigger();
|
Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: Blocked( void )
|
void func_button::Blocked(void)
|
||||||
{
|
{
|
||||||
if ( m_iDamage ) {
|
if (m_iDamage) {
|
||||||
//Damage_Apply( other, this, dmg, other.origin, FALSE );
|
//Damage_Apply(other, this, dmg, other.origin, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_flWait >= 0 ) {
|
if (m_flWait >= 0) {
|
||||||
if ( m_iState == STATE_DOWN ) {
|
if (m_iState == STATE_DOWN) {
|
||||||
func_button::MoveAway ();
|
func_button::MoveAway ();
|
||||||
} else {
|
} else {
|
||||||
func_button::MoveBack ();
|
func_button::MoveBack ();
|
||||||
|
@ -253,114 +255,121 @@ void func_button :: Blocked( void )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: SetMovementDirection( void )
|
void func_button::SetMovementDirection(void)
|
||||||
{
|
{
|
||||||
if ( angles == '0 -1 0' ) {
|
if (m_oldAngle == '0 -1 0') {
|
||||||
movedir = '0 0 1';
|
m_vecMoveDir = '0 0 1';
|
||||||
} else if ( angles == '0 -2 0' ) {
|
} else if (m_oldAngle == '0 -2 0') {
|
||||||
movedir = '0 0 -1';
|
m_vecMoveDir = '0 0 -1';
|
||||||
} else {
|
} else {
|
||||||
makevectors( angles );
|
makevectors(m_oldAngle);
|
||||||
movedir = v_forward;
|
m_vecMoveDir = v_forward;
|
||||||
}
|
}
|
||||||
|
|
||||||
angles = '0 0 0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: MoveToDestination_End( void )
|
void func_button::MoveToDestination_End(void)
|
||||||
{
|
{
|
||||||
setorigin( this, m_vecDest );
|
setorigin(this, m_vecDest);
|
||||||
velocity = '0 0 0';
|
velocity = [0,0,0];
|
||||||
nextthink = -1;
|
nextthink = -1;
|
||||||
m_pMove();
|
m_pMove();
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: MoveToDestination( vector vDestination, void() func )
|
void func_button::MoveToDestination(vector vDestination, void() func)
|
||||||
{
|
{
|
||||||
vector vecDifference;
|
vector vecDifference;
|
||||||
float flTravel, fTravelTime;
|
float flTravel, fTravelTime;
|
||||||
|
|
||||||
if ( !m_flSpeed ) {
|
if (!m_flSpeed) {
|
||||||
objerror( "No speed defined for moving entity! Will not divide by zero." );
|
objerror("No speed defined for moving entity! Will not divide by zero.");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pMove = func;
|
m_pMove = func;
|
||||||
m_vecDest = vDestination;
|
m_vecDest = vDestination;
|
||||||
think = MoveToDestination_End;
|
think = MoveToDestination_End;
|
||||||
|
|
||||||
if ( vDestination == origin ) {
|
if (vDestination == origin) {
|
||||||
velocity = '0 0 0';
|
velocity = '0 0 0';
|
||||||
nextthink = ( ltime + 0.1 );
|
nextthink = (ltime + 0.1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vecDifference = ( vDestination - origin );
|
vecDifference = (vDestination - origin);
|
||||||
flTravel = vlen( vecDifference );
|
flTravel = vlen(vecDifference);
|
||||||
fTravelTime = ( flTravel / m_flSpeed );
|
fTravelTime = (flTravel / m_flSpeed);
|
||||||
|
|
||||||
if ( fTravelTime < 0.1 ) {
|
if (fTravelTime < 0.1) {
|
||||||
velocity = '0 0 0';
|
velocity = '0 0 0';
|
||||||
nextthink = ltime + 0.1;
|
nextthink = ltime + 0.1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
nextthink = ( ltime + fTravelTime );
|
nextthink = (ltime + fTravelTime);
|
||||||
velocity = ( vecDifference * ( 1 / fTravelTime ) );
|
velocity = (vecDifference * (1 / fTravelTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_button :: func_button( void )
|
void func_button::Respawn(void)
|
||||||
{
|
{
|
||||||
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
|
func_button::SetMovementDirection();
|
||||||
switch ( argv( i ) ) {
|
|
||||||
|
solid = SOLID_BSP;
|
||||||
|
movetype = MOVETYPE_PUSH;
|
||||||
|
setorigin(this, m_oldOrigin);
|
||||||
|
setmodel(this, m_oldModel);
|
||||||
|
blocked = Blocked;
|
||||||
|
velocity = [0,0,0];
|
||||||
|
nextthink = -1;
|
||||||
|
|
||||||
|
if (!m_flSpeed) {
|
||||||
|
m_flSpeed = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spawnflags & SF_BTT_TOUCH_ONLY) {
|
||||||
|
touch = Touch;
|
||||||
|
PlayerUse = __NULL__;
|
||||||
|
} else {
|
||||||
|
touch = __NULL__;
|
||||||
|
PlayerUse = Use;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_vecPos1 = m_oldOrigin;
|
||||||
|
|
||||||
|
if (spawnflags & SF_BTT_NOMOVE) {
|
||||||
|
m_vecPos2 = m_vecPos1;
|
||||||
|
} else {
|
||||||
|
m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_iState = STATE_LOWERED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_button::func_button(void)
|
||||||
|
{
|
||||||
|
func_button::Precache();
|
||||||
|
CBaseTrigger::CBaseTrigger();
|
||||||
|
|
||||||
|
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
|
||||||
|
switch (argv(i)) {
|
||||||
case "speed":
|
case "speed":
|
||||||
m_flSpeed = stof( argv( i + 1 ) );
|
m_flSpeed = stof(argv(i + 1));
|
||||||
break;
|
break;
|
||||||
case "lip":
|
case "lip":
|
||||||
m_flLip = stof( argv( i + 1 ) );
|
m_flLip = stof(argv(i + 1));
|
||||||
break;
|
break;
|
||||||
case "sounds":
|
case "sounds":
|
||||||
m_iSounds = stoi( argv( i + 1 ) );
|
m_iSounds = stoi(argv(i + 1));
|
||||||
break;
|
break;
|
||||||
case "wait":
|
case "wait":
|
||||||
m_flWait = stof( argv( i + 1 ) );
|
m_flWait = stof(argv(i + 1));
|
||||||
break;
|
break;
|
||||||
case "delay":
|
case "delay":
|
||||||
m_flDelay = stof( argv( i + 1 ) );
|
m_flDelay = stof(argv(i + 1));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func_button::Precache();
|
func_button::Respawn();
|
||||||
func_button::SetMovementDirection();
|
angles = [0,0,0];
|
||||||
CBaseTrigger::CBaseTrigger();
|
|
||||||
|
|
||||||
solid = SOLID_BSP;
|
|
||||||
movetype = MOVETYPE_PUSH;
|
|
||||||
setorigin( this, origin );
|
|
||||||
setmodel( this, model );
|
|
||||||
blocked = Blocked;
|
|
||||||
|
|
||||||
if ( !m_flSpeed ) {
|
|
||||||
m_flSpeed = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( spawnflags & SF_BTT_TOUCH_ONLY ) {
|
|
||||||
touch = Touch;
|
|
||||||
gflags -= gflags & GF_USABLE;
|
|
||||||
} else {
|
|
||||||
touch = __NULL__;
|
|
||||||
gflags |= GF_USABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_vecPos1 = origin;
|
|
||||||
|
|
||||||
if (spawnflags & SF_BTT_NOMOVE) {
|
|
||||||
m_vecPos2 = m_vecPos1;
|
|
||||||
} else {
|
|
||||||
m_vecPos2 = ( m_vecPos1 + movedir * ( fabs( movedir * size ) - m_flLip ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_iState = STATE_LOWERED;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ enum
|
||||||
STATE_DOWN
|
STATE_DOWN
|
||||||
};
|
};
|
||||||
|
|
||||||
class func_door : CBaseTrigger
|
class func_door:CBaseTrigger
|
||||||
{
|
{
|
||||||
vector m_vecPos1;
|
vector m_vecPos1;
|
||||||
vector m_vecPos2;
|
vector m_vecPos2;
|
||||||
|
@ -50,11 +50,11 @@ class func_door : CBaseTrigger
|
||||||
virtual void() Trigger;
|
virtual void() Trigger;
|
||||||
virtual void() Blocked;
|
virtual void() Blocked;
|
||||||
virtual void() Touch;
|
virtual void() Touch;
|
||||||
virtual void() PlayerUse;
|
virtual void() Use;
|
||||||
virtual void() m_pMove = 0;
|
virtual void() m_pMove = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
void func_door :: Precache (void)
|
void func_door::Precache(void)
|
||||||
{
|
{
|
||||||
if(m_iMoveSnd > 0 && m_iMoveSnd <= 10) {
|
if(m_iMoveSnd > 0 && m_iMoveSnd <= 10) {
|
||||||
precache_sound(sprintf("doors/doormove%i.wav", m_iMoveSnd));
|
precache_sound(sprintf("doors/doormove%i.wav", m_iMoveSnd));
|
||||||
|
@ -69,13 +69,13 @@ void func_door :: Precache (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: PlayerUse (void)
|
void func_door::Use(void)
|
||||||
{
|
{
|
||||||
eActivator.gflags &= ~GF_USE_RELEASED;
|
eActivator.gflags &= ~GF_USE_RELEASED;
|
||||||
Trigger();
|
Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: Arrived (void)
|
void func_door::Arrived(void)
|
||||||
{
|
{
|
||||||
m_iState = STATE_RAISED;
|
m_iState = STATE_RAISED;
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ void func_door :: Arrived (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: Returned (void)
|
void func_door::Returned(void)
|
||||||
{
|
{
|
||||||
if(m_iStopSnd > 0 && m_iStopSnd <= 8) {
|
if(m_iStopSnd > 0 && m_iStopSnd <= 8) {
|
||||||
sound(self, CHAN_VOICE, sprintf("doors/doorstop%i.wav", m_iStopSnd), 1.0, ATTN_NORM);
|
sound(self, CHAN_VOICE, sprintf("doors/doorstop%i.wav", m_iStopSnd), 1.0, ATTN_NORM);
|
||||||
|
@ -113,7 +113,7 @@ void func_door :: Returned (void)
|
||||||
m_iState = STATE_LOWERED;
|
m_iState = STATE_LOWERED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: MoveBack (void)
|
void func_door::MoveBack(void)
|
||||||
{
|
{
|
||||||
if(m_iMoveSnd > 0 && m_iMoveSnd <= 10) {
|
if(m_iMoveSnd > 0 && m_iMoveSnd <= 10) {
|
||||||
sound(self, CHAN_VOICE, sprintf("doors/doormove%i.wav", m_iMoveSnd), 1.0, ATTN_NORM);
|
sound(self, CHAN_VOICE, sprintf("doors/doormove%i.wav", m_iMoveSnd), 1.0, ATTN_NORM);
|
||||||
|
@ -129,7 +129,7 @@ void func_door :: MoveBack (void)
|
||||||
MoveToDestination(m_vecPos1, Returned);
|
MoveToDestination(m_vecPos1, Returned);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: MoveAway (void)
|
void func_door::MoveAway(void)
|
||||||
{
|
{
|
||||||
if (m_iState == STATE_UP) {
|
if (m_iState == STATE_UP) {
|
||||||
return;
|
return;
|
||||||
|
@ -152,7 +152,7 @@ void func_door :: MoveAway (void)
|
||||||
MoveToDestination(m_vecPos2, Arrived);
|
MoveToDestination(m_vecPos2, Arrived);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: Trigger (void)
|
void func_door::Trigger(void)
|
||||||
{
|
{
|
||||||
if (m_flNextTrigger > ltime) {
|
if (m_flNextTrigger > ltime) {
|
||||||
if (!(spawnflags & SF_MOV_TOGGLE)) {
|
if (!(spawnflags & SF_MOV_TOGGLE)) {
|
||||||
|
@ -184,7 +184,7 @@ void func_door :: Trigger (void)
|
||||||
MoveAway();
|
MoveAway();
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: Touch (void)
|
void func_door::Touch(void)
|
||||||
{
|
{
|
||||||
if (spawnflags & SF_MOV_TOGGLE) {
|
if (spawnflags & SF_MOV_TOGGLE) {
|
||||||
return;
|
return;
|
||||||
|
@ -201,7 +201,7 @@ void func_door :: Touch (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: Blocked (void)
|
void func_door::Blocked(void)
|
||||||
{
|
{
|
||||||
if(m_iDamage) {
|
if(m_iDamage) {
|
||||||
//Damage_Apply(other, self, dmg, other.origin, FALSE);
|
//Damage_Apply(other, self, dmg, other.origin, FALSE);
|
||||||
|
@ -216,13 +216,69 @@ void func_door :: Blocked (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void func_door::SetMovementDirection(void)
|
||||||
void func_door :: Respawn (void)
|
|
||||||
{
|
{
|
||||||
|
if (angles == [0,-1,0]) {
|
||||||
|
m_vecMoveDir = [0,0,1];
|
||||||
|
} else if (angles == [0,-2,0]) {
|
||||||
|
m_vecMoveDir = [0,0,-1];
|
||||||
|
} else {
|
||||||
|
makevectors(angles);
|
||||||
|
m_vecMoveDir = v_forward;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_door::MoveToDestination_End(void)
|
||||||
|
{
|
||||||
|
setorigin(this, m_vecDest);
|
||||||
|
velocity = [0,0,0];
|
||||||
|
nextthink = -1;
|
||||||
|
m_pMove();
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_door::MoveToDestination(vector vDestination, void() func)
|
||||||
|
{
|
||||||
|
vector vecDifference;
|
||||||
|
float flTravel;
|
||||||
|
float fTravelTime;
|
||||||
|
|
||||||
|
if (!m_flSpeed) {
|
||||||
|
objerror("func_door: No speed defined!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pMove = func;
|
||||||
|
m_vecDest = vDestination;
|
||||||
|
think = MoveToDestination_End;
|
||||||
|
|
||||||
|
if (vDestination == origin) {
|
||||||
|
velocity = [0,0,0];
|
||||||
|
nextthink = (ltime + 0.1f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vecDifference = (vDestination - origin);
|
||||||
|
flTravel = vlen(vecDifference);
|
||||||
|
fTravelTime = (flTravel / m_flSpeed);
|
||||||
|
|
||||||
|
if (fTravelTime < 0.1) {
|
||||||
|
velocity = [0,0,0];
|
||||||
|
nextthink = ltime + 0.1f;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nextthink = (ltime + fTravelTime);
|
||||||
|
velocity = (vecDifference * (1 / fTravelTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_door::Respawn(void)
|
||||||
|
{
|
||||||
|
func_door::SetMovementDirection();
|
||||||
|
|
||||||
solid = SOLID_BSP;
|
solid = SOLID_BSP;
|
||||||
movetype = MOVETYPE_PUSH;
|
movetype = MOVETYPE_PUSH;
|
||||||
setorigin(this, origin);
|
setorigin(this, m_oldOrigin);
|
||||||
setmodel(this, model);
|
setmodel(this, m_oldModel);
|
||||||
|
|
||||||
blocked = Blocked;
|
blocked = Blocked;
|
||||||
//Use = Trigger;
|
//Use = Trigger;
|
||||||
|
@ -241,81 +297,24 @@ void func_door :: Respawn (void)
|
||||||
|
|
||||||
if (spawnflags & SF_MOV_USE) {
|
if (spawnflags & SF_MOV_USE) {
|
||||||
touch = __NULL__;
|
touch = __NULL__;
|
||||||
gflags |= GF_USABLE;
|
PlayerUse = Use;
|
||||||
} else {
|
} else {
|
||||||
touch = Touch;
|
touch = Touch;
|
||||||
gflags -= gflags & GF_USABLE;
|
PlayerUse = __NULL__;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_iState = STATE_LOWERED;
|
m_iState = STATE_LOWERED;
|
||||||
m_vecPos1 = origin;
|
m_vecPos1 = m_oldOrigin;
|
||||||
m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip));
|
m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip));
|
||||||
|
|
||||||
if (spawnflags & SF_MOV_OPEN) {
|
if (spawnflags & SF_MOV_OPEN) {
|
||||||
setorigin(this, m_vecPos2);
|
setorigin(this, m_vecPos2);
|
||||||
m_vecPos2 = m_vecPos1;
|
m_vecPos2 = m_vecPos1;
|
||||||
m_vecPos1 = origin;
|
m_vecPos1 = m_oldOrigin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door :: SetMovementDirection (void)
|
void func_door::func_door(void)
|
||||||
{
|
|
||||||
if (angles == [0,-1,0]) {
|
|
||||||
m_vecMoveDir = [0,0,1];
|
|
||||||
} else if (angles == [0,-2,0]) {
|
|
||||||
m_vecMoveDir = [0,0,-1];
|
|
||||||
} else {
|
|
||||||
makevectors(angles);
|
|
||||||
m_vecMoveDir = v_forward;
|
|
||||||
}
|
|
||||||
|
|
||||||
angles = [0,0,0];
|
|
||||||
}
|
|
||||||
|
|
||||||
void func_door :: MoveToDestination_End (void)
|
|
||||||
{
|
|
||||||
setorigin(this, m_vecDest);
|
|
||||||
velocity = [0,0,0];
|
|
||||||
nextthink = -1;
|
|
||||||
m_pMove();
|
|
||||||
}
|
|
||||||
|
|
||||||
void func_door :: MoveToDestination (vector vDestination, void() func)
|
|
||||||
{
|
|
||||||
vector vecDifference;
|
|
||||||
float flTravel;
|
|
||||||
float fTravelTime;
|
|
||||||
|
|
||||||
if (!m_flSpeed) {
|
|
||||||
objerror("func_door: No speed defined!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_pMove = func;
|
|
||||||
m_vecDest = vDestination;
|
|
||||||
think = MoveToDestination_End;
|
|
||||||
|
|
||||||
if (vDestination == origin) {
|
|
||||||
velocity = '0 0 0';
|
|
||||||
nextthink = (ltime + 0.1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vecDifference = (vDestination - origin);
|
|
||||||
flTravel = vlen(vecDifference);
|
|
||||||
fTravelTime = (flTravel / m_flSpeed);
|
|
||||||
|
|
||||||
if (fTravelTime < 0.1) {
|
|
||||||
velocity = '0 0 0';
|
|
||||||
nextthink = ltime + 0.1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nextthink = (ltime + fTravelTime);
|
|
||||||
velocity = (vecDifference * (1 / fTravelTime));
|
|
||||||
}
|
|
||||||
|
|
||||||
void func_door :: func_door (void)
|
|
||||||
{
|
{
|
||||||
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
|
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
|
||||||
switch (argv(i)) {
|
switch (argv(i)) {
|
||||||
|
@ -342,10 +341,11 @@ void func_door :: func_door (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func_door::Precache();
|
|
||||||
func_door::SetMovementDirection();
|
|
||||||
func_door::Respawn();
|
|
||||||
CBaseTrigger::CBaseTrigger();
|
CBaseTrigger::CBaseTrigger();
|
||||||
|
func_door::Precache();
|
||||||
|
func_door::Respawn();
|
||||||
|
|
||||||
|
angles = [0,0,0];
|
||||||
|
|
||||||
if (m_strTargetName) {
|
if (m_strTargetName) {
|
||||||
m_iLocked = TRUE;
|
m_iLocked = TRUE;
|
||||||
|
|
|
@ -37,32 +37,33 @@ class func_door_rotating:CBaseTrigger
|
||||||
virtual void() m_pMove = 0;
|
virtual void() m_pMove = 0;
|
||||||
|
|
||||||
void() func_door_rotating;
|
void() func_door_rotating;
|
||||||
|
virtual void() Respawn;
|
||||||
virtual void() Precache;
|
virtual void() Precache;
|
||||||
virtual void() Arrived;
|
virtual void() Arrived;
|
||||||
virtual void() Returned;
|
virtual void() Returned;
|
||||||
virtual void() RotateBack;
|
virtual void() RotateBack;
|
||||||
virtual void() RotateAway;
|
virtual void() RotateAway;
|
||||||
virtual void() Trigger;
|
virtual void() Trigger;
|
||||||
virtual void() PlayerUse;
|
virtual void() Use;
|
||||||
virtual void() Touch;
|
virtual void() Touch;
|
||||||
virtual void() Blocked;
|
virtual void() Blocked;
|
||||||
virtual void() SetMovementDirection;
|
virtual void() SetMovementDirection;
|
||||||
virtual void( vector angle, void() func ) RotateToDestination;
|
virtual void(vector angle, void() func) RotateToDestination;
|
||||||
virtual void() RotateToDestination_End;
|
virtual void() RotateToDestination_End;
|
||||||
};
|
};
|
||||||
|
|
||||||
void func_door_rotating::Precache(void)
|
void func_door_rotating::Precache(void)
|
||||||
{
|
{
|
||||||
if ( m_iMoveSnd > 0 && m_iMoveSnd <= 10 ) {
|
if (m_iMoveSnd > 0 && m_iMoveSnd <= 10) {
|
||||||
precache_sound( sprintf( "doors/doormove%i.wav", m_iMoveSnd ) );
|
precache_sound(sprintf("doors/doormove%i.wav", m_iMoveSnd));
|
||||||
} else {
|
} else {
|
||||||
precache_sound( "common/null.wav" );
|
precache_sound("common/null.wav");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_iStopSnd > 0 && m_iStopSnd <= 8 ) {
|
if (m_iStopSnd > 0 && m_iStopSnd <= 8) {
|
||||||
precache_sound( sprintf( "doors/doorstop%i.wav", m_iStopSnd ) );
|
precache_sound(sprintf("doors/doorstop%i.wav", m_iStopSnd));
|
||||||
} else {
|
} else {
|
||||||
precache_sound( "common/null.wav" );
|
precache_sound("common/null.wav");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,26 +71,26 @@ void func_door_rotating::Arrived(void)
|
||||||
{
|
{
|
||||||
m_iState = STATE_RAISED;
|
m_iState = STATE_RAISED;
|
||||||
|
|
||||||
if ( m_iStopSnd > 0 && m_iStopSnd <= 8 ) {
|
if (m_iStopSnd > 0 && m_iStopSnd <= 8) {
|
||||||
sound( this, CHAN_VOICE, sprintf( "doors/doorstop%i.wav", m_iStopSnd ), 1.0, ATTN_NORM );
|
sound(this, CHAN_VOICE, sprintf("doors/doorstop%i.wav", m_iStopSnd), 1.0, ATTN_NORM);
|
||||||
} else {
|
} else {
|
||||||
sound( this, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
sound(this, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !(spawnflags & SF_ROT_USE) ) {
|
if (!(spawnflags & SF_ROT_USE)) {
|
||||||
touch = Touch;
|
touch = Touch;
|
||||||
}
|
}
|
||||||
if ( m_flWait < 0 ) {
|
if (m_flWait < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
think = RotateBack;
|
think = RotateBack;
|
||||||
nextthink = ( ltime + m_flWait );
|
nextthink = (ltime + m_flWait);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door_rotating::Returned(void)
|
void func_door_rotating::Returned(void)
|
||||||
{
|
{
|
||||||
if ( !(spawnflags & SF_ROT_USE) ) {
|
if (!(spawnflags & SF_ROT_USE)) {
|
||||||
touch = Touch;
|
touch = Touch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,84 +99,84 @@ void func_door_rotating::Returned(void)
|
||||||
|
|
||||||
void func_door_rotating::RotateBack(void)
|
void func_door_rotating::RotateBack(void)
|
||||||
{
|
{
|
||||||
if ( m_iMoveSnd > 0 && m_iMoveSnd <= 10 ) {
|
if (m_iMoveSnd > 0 && m_iMoveSnd <= 10) {
|
||||||
sound( this, CHAN_VOICE, sprintf( "doors/doormove%i.wav", m_iMoveSnd ), 1.0, ATTN_NORM );
|
sound(this, CHAN_VOICE, sprintf("doors/doormove%i.wav", m_iMoveSnd), 1.0, ATTN_NORM);
|
||||||
} else {
|
} else {
|
||||||
sound( this, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
sound(this, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !(spawnflags & SF_ROT_USE) ) {
|
if (!(spawnflags & SF_ROT_USE)) {
|
||||||
touch = __NULL__;
|
touch = __NULL__;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_iState = STATE_DOWN;
|
m_iState = STATE_DOWN;
|
||||||
RotateToDestination( m_vecPos1, Returned );
|
RotateToDestination(m_vecPos1, Returned);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door_rotating::RotateAway(void)
|
void func_door_rotating::RotateAway(void)
|
||||||
{
|
{
|
||||||
float fDirection = 1.0;
|
float fDirection = 1.0;
|
||||||
|
|
||||||
if ( m_iState == STATE_UP ) {
|
if (m_iState == STATE_UP) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_iMoveSnd > 0 && m_iMoveSnd <= 10 ) {
|
if (m_iMoveSnd > 0 && m_iMoveSnd <= 10) {
|
||||||
sound( this, CHAN_VOICE, sprintf( "doors/doormove%i.wav", m_iMoveSnd ), 1.0, ATTN_NORM );
|
sound(this, CHAN_VOICE, sprintf("doors/doormove%i.wav", m_iMoveSnd), 1.0, ATTN_NORM);
|
||||||
} else {
|
} else {
|
||||||
sound( this, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
sound(this, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_iState == STATE_RAISED ) {
|
if (m_iState == STATE_RAISED) {
|
||||||
nextthink = ( ltime + m_flWait );
|
nextthink = (ltime + m_flWait);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_iState = STATE_UP;
|
m_iState = STATE_UP;
|
||||||
|
|
||||||
if ( !( spawnflags & SF_ROT_ONEWAY ) ) {
|
if (!(spawnflags & SF_ROT_ONEWAY)) {
|
||||||
vector vDifference = eActivator.origin - origin;
|
vector vDifference = eActivator.origin - origin;
|
||||||
vector vAngles = eActivator.angles;
|
vector vAngles = eActivator.angles;
|
||||||
vAngles[0] = vAngles[2] = 0;
|
vAngles[0] = vAngles[2] = 0;
|
||||||
|
|
||||||
makevectors( vAngles );
|
makevectors(vAngles);
|
||||||
vector vNext = ( eActivator.origin + ( v_forward * 10 ) ) - origin;
|
vector vNext = (eActivator.origin + (v_forward * 10)) - origin;
|
||||||
|
|
||||||
if ( ( ( vDifference[0] * vNext[1] ) - ( vDifference[1] * vNext[0] ) ) < 0 ) {
|
if (((vDifference[0] * vNext[1]) - (vDifference[1] * vNext[0])) < 0) {
|
||||||
fDirection = -1.0f;
|
fDirection = -1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RotateToDestination( m_vecPos2 * fDirection, Arrived );
|
RotateToDestination(m_vecPos2 * fDirection, Arrived);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door_rotating::Trigger(void)
|
void func_door_rotating::Trigger(void)
|
||||||
{
|
{
|
||||||
if ( m_flNextAction > time ) {
|
if (m_flNextAction > time) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_flNextAction = time + m_flWait;
|
m_flNextAction = time + m_flWait;
|
||||||
|
|
||||||
if ( ( m_iState == STATE_UP ) || ( m_iState == STATE_RAISED ) ) {
|
if ((m_iState == STATE_UP) || (m_iState == STATE_RAISED)) {
|
||||||
RotateBack();
|
RotateBack();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RotateAway();
|
RotateAway();
|
||||||
|
|
||||||
if ( m_flDelay ) {
|
if (m_flDelay) {
|
||||||
#ifdef GS_DEVELOPER
|
#ifdef GS_DEVELOPER
|
||||||
print( sprintf( "func_door_rotating: Delayed trigger of `%s`\n", m_strTarget ) );
|
print(sprintf("func_door_rotating: Delayed trigger of `%s`\n", m_strTarget));
|
||||||
#endif
|
#endif
|
||||||
CBaseTrigger::UseTargets_Delay( m_flDelay );
|
CBaseTrigger::UseTargets_Delay(m_flDelay);
|
||||||
} else {
|
} else {
|
||||||
#ifdef GS_DEVELOPER
|
#ifdef GS_DEVELOPER
|
||||||
print( sprintf( "func_door_rotating: Normal trigger of `%s`\n", m_strTarget ) );
|
print(sprintf("func_door_rotating: Normal trigger of `%s`\n", m_strTarget));
|
||||||
#endif
|
#endif
|
||||||
CBaseTrigger::UseTargets();
|
CBaseTrigger::UseTargets();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door_rotating::PlayerUse(void)
|
void func_door_rotating::Use(void)
|
||||||
{
|
{
|
||||||
eActivator.gflags &= ~GF_USE_RELEASED;
|
eActivator.gflags &= ~GF_USE_RELEASED;
|
||||||
Trigger();
|
Trigger();
|
||||||
|
@ -183,12 +184,12 @@ void func_door_rotating::PlayerUse(void)
|
||||||
|
|
||||||
void func_door_rotating::Touch(void)
|
void func_door_rotating::Touch(void)
|
||||||
{
|
{
|
||||||
if ( spawnflags & SF_ROT_USE ) {
|
if (spawnflags & SF_ROT_USE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( other.movetype == MOVETYPE_WALK ) {
|
if (other.movetype == MOVETYPE_WALK) {
|
||||||
if ( other.absmin[2] <= maxs[2] - 2 ) {
|
if (other.absmin[2] <= maxs[2] - 2) {
|
||||||
eActivator = other;
|
eActivator = other;
|
||||||
Trigger();
|
Trigger();
|
||||||
}
|
}
|
||||||
|
@ -198,69 +199,34 @@ void func_door_rotating::Touch(void)
|
||||||
|
|
||||||
void func_door_rotating::Blocked(void)
|
void func_door_rotating::Blocked(void)
|
||||||
{
|
{
|
||||||
if ( m_iDamage ) {
|
if (m_iDamage) {
|
||||||
Damage_Apply( other, this, m_iDamage, other.origin, FALSE );
|
Damage_Apply(other, this, m_iDamage, other.origin, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_flWait >= 0 ) {
|
if (m_flWait >= 0) {
|
||||||
if ( m_iState == STATE_DOWN ) {
|
if (m_iState == STATE_DOWN) {
|
||||||
RotateAway ();
|
RotateAway();
|
||||||
} else {
|
} else {
|
||||||
RotateBack ();
|
RotateBack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door_rotating::Respawn(void)
|
|
||||||
{
|
|
||||||
solid = SOLID_BSP;
|
|
||||||
movetype = MOVETYPE_PUSH;
|
|
||||||
setorigin( this, origin );
|
|
||||||
setmodel( this, model );
|
|
||||||
|
|
||||||
blocked = Blocked;
|
|
||||||
use = Trigger;
|
|
||||||
|
|
||||||
if ( spawnflags & SF_ROT_USE ) {
|
|
||||||
touch = __NULL__;
|
|
||||||
gflags |= GF_USABLE;
|
|
||||||
} else {
|
|
||||||
touch = Touch;
|
|
||||||
gflags -= gflags & GF_USABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !m_flSpeed ) {
|
|
||||||
m_flSpeed = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_iState = STATE_LOWERED;
|
|
||||||
m_vecPos1 = angles;
|
|
||||||
m_vecPos2 = angles + m_vecMoveDir * m_flDistance;
|
|
||||||
|
|
||||||
if ( spawnflags & SF_ROT_OPEN ) {
|
|
||||||
vector vTemp = m_vecPos2;
|
|
||||||
m_vecPos2 = m_vecPos1;
|
|
||||||
m_vecPos1 = vTemp;
|
|
||||||
angles = m_vecPos1;
|
|
||||||
movedir = movedir * -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void func_door_rotating::SetMovementDirection(void)
|
void func_door_rotating::SetMovementDirection(void)
|
||||||
{
|
{
|
||||||
if ( spawnflags & SF_ROT_ZAXIS ) {
|
if (spawnflags & SF_ROT_ZAXIS) {
|
||||||
m_vecMoveDir = '0 0 1';
|
m_vecMoveDir = [0,0,1];
|
||||||
} else if ( spawnflags & SF_ROT_XAXIS ) {
|
} else if (spawnflags & SF_ROT_XAXIS) {
|
||||||
m_vecMoveDir = '1 0 0';
|
m_vecMoveDir = [1,0,0];
|
||||||
} else {
|
} else {
|
||||||
m_vecMoveDir = '0 1 0';
|
m_vecMoveDir = [0,1,0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door_rotating::RotateToDestination_End(void)
|
void func_door_rotating::RotateToDestination_End(void)
|
||||||
{
|
{
|
||||||
angles = m_vecDest;
|
angles = m_vecDest;
|
||||||
avelocity = '0 0 0';
|
avelocity = [0,0,0];
|
||||||
nextthink = -1;
|
nextthink = -1;
|
||||||
m_pMove();
|
m_pMove();
|
||||||
}
|
}
|
||||||
|
@ -270,61 +236,100 @@ void func_door_rotating::RotateToDestination(vector vDestinationAngle, void() fu
|
||||||
vector vecAngleDifference;
|
vector vecAngleDifference;
|
||||||
float flTravelLength, flTravelTime;
|
float flTravelLength, flTravelTime;
|
||||||
|
|
||||||
if ( !m_flSpeed ) {
|
if (!m_flSpeed) {
|
||||||
objerror( "No speed defined for moving entity! Will not divide by zero." );
|
objerror("No speed defined for moving entity! Will not divide by zero.");
|
||||||
}
|
}
|
||||||
vecAngleDifference = ( vDestinationAngle - angles );
|
vecAngleDifference = (vDestinationAngle - angles);
|
||||||
flTravelLength = vlen( vecAngleDifference );
|
flTravelLength = vlen(vecAngleDifference);
|
||||||
flTravelTime = ( flTravelLength / m_flSpeed );
|
flTravelTime = (flTravelLength / m_flSpeed);
|
||||||
avelocity = ( vecAngleDifference * ( 1 / flTravelTime ) );
|
avelocity = (vecAngleDifference * (1 / flTravelTime));
|
||||||
m_vecDest = vDestinationAngle;
|
m_vecDest = vDestinationAngle;
|
||||||
m_pMove = func;
|
m_pMove = func;
|
||||||
think = RotateToDestination_End;
|
think = RotateToDestination_End;
|
||||||
nextthink = ( ltime + flTravelTime );
|
nextthink = (ltime + flTravelTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void func_door_rotating::Respawn(void)
|
||||||
|
{
|
||||||
|
func_door_rotating::SetMovementDirection();
|
||||||
|
|
||||||
|
if (!m_flSpeed) {
|
||||||
|
m_flSpeed = 100;
|
||||||
|
}
|
||||||
|
if (!m_flLip) {
|
||||||
|
m_flLip = 90;
|
||||||
|
}
|
||||||
|
if (!m_flDelay) {
|
||||||
|
m_flDelay = 4;
|
||||||
|
}
|
||||||
|
if (!m_flDistance) {
|
||||||
|
m_flDistance = 90;
|
||||||
|
}
|
||||||
|
|
||||||
|
solid = SOLID_BSP;
|
||||||
|
movetype = MOVETYPE_PUSH;
|
||||||
|
setorigin(this, m_oldOrigin);
|
||||||
|
setmodel(this, m_oldModel);
|
||||||
|
think = __NULL__;
|
||||||
|
nextthink = -1;
|
||||||
|
m_pMove = 0;
|
||||||
|
avelocity = [0,0,0];
|
||||||
|
|
||||||
|
blocked = Blocked;
|
||||||
|
|
||||||
|
if (spawnflags & SF_ROT_USE) {
|
||||||
|
touch = __NULL__;
|
||||||
|
PlayerUse = Use;
|
||||||
|
} else {
|
||||||
|
touch = Touch;
|
||||||
|
PlayerUse = __NULL__;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_iState = STATE_LOWERED;
|
||||||
|
m_vecPos1 = m_oldAngle;
|
||||||
|
m_vecPos2 = m_oldAngle + m_vecMoveDir * m_flDistance;
|
||||||
|
|
||||||
|
if (spawnflags & SF_ROT_OPEN) {
|
||||||
|
vector vTemp = m_vecPos2;
|
||||||
|
m_vecPos2 = m_vecPos1;
|
||||||
|
m_vecPos1 = vTemp;
|
||||||
|
//m_vecMoveDir = m_vecMoveDir * -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
angles = m_vecPos1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_door_rotating::func_door_rotating(void)
|
void func_door_rotating::func_door_rotating(void)
|
||||||
{
|
{
|
||||||
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
|
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
|
||||||
switch ( argv( i ) ) {
|
switch (argv(i)) {
|
||||||
case "speed":
|
case "speed":
|
||||||
m_flSpeed = stof( argv( i + 1 ) );
|
m_flSpeed = stof(argv(i+1));
|
||||||
break;
|
break;
|
||||||
case "lip":
|
case "lip":
|
||||||
m_flLip = stof( argv( i + 1 ) );
|
m_flLip = stof(argv(i+1));
|
||||||
break;
|
break;
|
||||||
case "movesnd":
|
case "movesnd":
|
||||||
m_iMoveSnd = stoi( argv( i + 1 ) );
|
m_iMoveSnd = stoi(argv(i+1));
|
||||||
break;
|
break;
|
||||||
case "stopsnd":
|
case "stopsnd":
|
||||||
m_iStopSnd = stoi( argv( i + 1 ) );
|
m_iStopSnd = stoi(argv(i+1));
|
||||||
break;
|
break;
|
||||||
case "distance":
|
case "distance":
|
||||||
m_flDistance = stof( argv( i + 1 ) );
|
m_flDistance = stof(argv(i+1));
|
||||||
break;
|
break;
|
||||||
case "delay":
|
case "delay":
|
||||||
m_flDelay = stof( argv( i + 1 ) );
|
m_flDelay = stof(argv(i+1));
|
||||||
|
break;
|
||||||
|
case "dmg":
|
||||||
|
m_iDamage = stoi(argv(i+1));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !m_flSpeed ) {
|
|
||||||
m_flSpeed = 100;
|
|
||||||
}
|
|
||||||
if ( !m_flLip ) {
|
|
||||||
m_flLip = 90;
|
|
||||||
}
|
|
||||||
if ( !m_flDelay ) {
|
|
||||||
m_flDelay = 4;
|
|
||||||
}
|
|
||||||
if ( !m_flDistance ) {
|
|
||||||
m_flDistance = 90;
|
|
||||||
}
|
|
||||||
|
|
||||||
func_door_rotating::Precache();
|
func_door_rotating::Precache();
|
||||||
CBaseEntity::CBaseEntity();
|
CBaseEntity::CBaseEntity();
|
||||||
func_door_rotating::SetMovementDirection();
|
|
||||||
func_door_rotating::Respawn();
|
func_door_rotating::Respawn();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ class func_healthcharger:CBaseTrigger
|
||||||
|
|
||||||
void func_healthcharger::PlayerUse(void)
|
void func_healthcharger::PlayerUse(void)
|
||||||
{
|
{
|
||||||
eActivator.flags = (eActivator.flags - FL_USERELEASED);
|
eActivator.gflags &= ~GF_USE_RELEASED;
|
||||||
|
|
||||||
if (m_flDelay > time) {
|
if (m_flDelay > time) {
|
||||||
return;
|
return;
|
||||||
|
@ -32,5 +32,4 @@ void func_healthcharger::func_healthcharger(void)
|
||||||
movetype = MOVETYPE_PUSH;
|
movetype = MOVETYPE_PUSH;
|
||||||
setorigin(this, origin);
|
setorigin(this, origin);
|
||||||
setmodel(this, model);
|
setmodel(this, model);
|
||||||
gflags = GF_USABLE;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ class func_recharge:CBaseTrigger
|
||||||
|
|
||||||
void func_recharge::PlayerUse(void)
|
void func_recharge::PlayerUse(void)
|
||||||
{
|
{
|
||||||
eActivator.flags = (eActivator.flags - FL_USERELEASED);
|
eActivator.gflags &= ~GF_USE_RELEASED;
|
||||||
|
|
||||||
if (m_flDelay > time) {
|
if (m_flDelay > time) {
|
||||||
return;
|
return;
|
||||||
|
@ -32,5 +32,4 @@ void func_recharge::func_recharge(void)
|
||||||
movetype = MOVETYPE_PUSH;
|
movetype = MOVETYPE_PUSH;
|
||||||
setorigin(this, origin);
|
setorigin(this, origin);
|
||||||
setmodel(this, model);
|
setmodel(this, model);
|
||||||
gflags = GF_USABLE;
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
36
freecs/glsl/default2d.glsl
Normal file
36
freecs/glsl/default2d.glsl
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
!!ver 100-450
|
||||||
|
!!samps 1
|
||||||
|
!!cvardf gl_fake16bit=0
|
||||||
|
|
||||||
|
//this shader is present for support for gles/gl3core contexts
|
||||||
|
//it is single-texture-with-vertex-colours, and doesn't do anything special.
|
||||||
|
//beware that a few things use this, including apparently fonts and bloom rescaling.
|
||||||
|
//its really not meant to do anything special.
|
||||||
|
|
||||||
|
varying vec2 tc;
|
||||||
|
varying vec4 vc;
|
||||||
|
|
||||||
|
#ifdef VERTEX_SHADER
|
||||||
|
attribute vec2 v_texcoord;
|
||||||
|
attribute vec4 v_colour;
|
||||||
|
void main ()
|
||||||
|
{
|
||||||
|
tc = v_texcoord;
|
||||||
|
vc = v_colour;
|
||||||
|
gl_Position = ftetransform();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef FRAGMENT_SHADER
|
||||||
|
void main ()
|
||||||
|
{
|
||||||
|
vec4 f = vc;
|
||||||
|
#ifdef PREMUL
|
||||||
|
f.rgb *= f.a;
|
||||||
|
#endif
|
||||||
|
f *= texture2D(s_t0, tc);
|
||||||
|
#if gl_fake16bit == 1
|
||||||
|
f.rgb = floor(f.rgb * vec3(32,64,32))/vec3(32,64,32);
|
||||||
|
#endif
|
||||||
|
gl_FragColor = f;
|
||||||
|
}
|
||||||
|
#endif
|
21
freecs/glsl/defaultfill.glsl
Normal file
21
freecs/glsl/defaultfill.glsl
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
!!ver 100-450
|
||||||
|
!!cvardf gl_fake16bit=0
|
||||||
|
|
||||||
|
#ifdef VERTEX_SHADER
|
||||||
|
attribute vec4 v_colour;
|
||||||
|
varying vec4 vc;
|
||||||
|
|
||||||
|
void main ()
|
||||||
|
{
|
||||||
|
vc = v_colour;
|
||||||
|
gl_Position = ftetransform();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FRAGMENT_SHADER
|
||||||
|
varying vec4 vc;
|
||||||
|
void main ()
|
||||||
|
{
|
||||||
|
gl_FragColor = vc;
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -1,27 +1,45 @@
|
||||||
!!ver 120
|
!!ver 130
|
||||||
!!permu FRAMEBLEND
|
!!permu FRAMEBLEND
|
||||||
!!permu SKELETAL
|
!!permu SKELETAL
|
||||||
!!permu FOG
|
!!permu FOG
|
||||||
!!samps diffuse
|
!!samps diffuse
|
||||||
|
!!cvardf gl_affinemodels=0
|
||||||
|
!!cvardf gl_fake16bit=0
|
||||||
|
|
||||||
#include "sys/defs.h"
|
#include "sys/defs.h"
|
||||||
|
|
||||||
varying vec2 tex_c;
|
#if gl_affinemodels == 1
|
||||||
|
#define affine noperspective
|
||||||
|
#else
|
||||||
|
#define affine
|
||||||
|
#endif
|
||||||
|
|
||||||
|
affine varying vec2 tex_c;
|
||||||
varying vec3 light;
|
varying vec3 light;
|
||||||
|
|
||||||
#ifdef VERTEX_SHADER
|
#ifdef VERTEX_SHADER
|
||||||
#include "sys/skeletal.h"
|
#include "sys/skeletal.h"
|
||||||
|
|
||||||
float hl( vec3 normal, vec3 dir ) {
|
/*float hl( vec3 normal, vec3 dir ) {
|
||||||
return ( dot( normal, dir ) * 0.5 ) + 0.5;
|
return ( dot( normal, dir ) * 0.5 ) + 0.5;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
vec3 n, s, t, w;
|
vec3 n, s, t, w;
|
||||||
gl_Position = skeletaltransform_wnst(w,n,s,t);
|
gl_Position = skeletaltransform_wnst(w,n,s,t);
|
||||||
tex_c = v_texcoord;
|
tex_c = v_texcoord;
|
||||||
light = e_light_ambient + ( e_light_mul * hl( n, e_light_dir ) );
|
light = e_light_ambient + ( e_light_mul * dot( n, e_light_dir ) );
|
||||||
|
|
||||||
|
if (light.r > 1.0f) {
|
||||||
|
light.r = 1.0f;
|
||||||
|
}
|
||||||
|
if (light.g > 1.0f) {
|
||||||
|
light.g = 1.0f;
|
||||||
|
}
|
||||||
|
if (light.b > 1.0f) {
|
||||||
|
light.b = 1.0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -29,8 +47,12 @@ varying vec3 light;
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
vec4 diffuse_f = texture2D( s_diffuse, tex_c );
|
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
|
||||||
diffuse_f.rgb *= light;
|
diffuse_f.rgb *= light;
|
||||||
|
diffuse_f *= e_colourident;
|
||||||
|
#if gl_fake16bit == 1
|
||||||
|
diffuse_f.rgb = floor(diffuse_f.rgb * vec3(32,64,32))/vec3(32,64,32);
|
||||||
|
#endif
|
||||||
gl_FragColor = diffuse_f * e_colourident;
|
gl_FragColor = diffuse_f * e_colourident;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
!!ver 110
|
!!ver 110
|
||||||
!!permu FOG
|
!!permu FOG
|
||||||
!!samps reflectcube
|
!!samps reflectcube
|
||||||
|
!!cvardf gl_fake16bit=0
|
||||||
|
|
||||||
#include "sys/defs.h"
|
#include "sys/defs.h"
|
||||||
#include "sys/fog.h"
|
#include "sys/fog.h"
|
||||||
|
@ -18,6 +19,9 @@ void main ()
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
vec4 skybox = textureCube(s_reflectcube, pos);
|
vec4 skybox = textureCube(s_reflectcube, pos);
|
||||||
|
#if gl_fake16bit == 1
|
||||||
|
skybox.rgb = floor(skybox.rgb * vec3(32,64,32))/vec3(32,64,32);
|
||||||
|
#endif
|
||||||
gl_FragColor = vec4(fog3(skybox.rgb), 1.0);
|
gl_FragColor = vec4(fog3(skybox.rgb), 1.0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
42
freecs/glsl/defaultsprite.glsl
Normal file
42
freecs/glsl/defaultsprite.glsl
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
!!permu FOG
|
||||||
|
!!samps 1
|
||||||
|
!!cvardf gl_fake16bit=0
|
||||||
|
//used by both particles and sprites.
|
||||||
|
//note the fog blending mode is all that differs from defaultadditivesprite
|
||||||
|
|
||||||
|
#include "sys/fog.h"
|
||||||
|
#ifdef VERTEX_SHADER
|
||||||
|
attribute vec2 v_texcoord;
|
||||||
|
attribute vec4 v_colour;
|
||||||
|
varying vec2 tc;
|
||||||
|
varying vec4 vc;
|
||||||
|
void main ()
|
||||||
|
{
|
||||||
|
tc = v_texcoord;
|
||||||
|
vc = v_colour;
|
||||||
|
gl_Position = ftetransform();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef FRAGMENT_SHADER
|
||||||
|
varying vec2 tc;
|
||||||
|
varying vec4 vc;
|
||||||
|
uniform vec4 e_colourident;
|
||||||
|
uniform vec4 e_vlscale;
|
||||||
|
void main ()
|
||||||
|
{
|
||||||
|
vec4 col = texture2D(s_t0, tc);
|
||||||
|
|
||||||
|
#ifdef MASK
|
||||||
|
if (col.a < float(MASK))
|
||||||
|
discard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
col = fog4blend(col * vc * e_colourident * e_vlscale);
|
||||||
|
|
||||||
|
#if gl_fake16bit == 1
|
||||||
|
col.rgb = floor(col.rgb * vec3(32,64,32))/vec3(32,64,32);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gl_FragColor = col;
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -1,5 +1,6 @@
|
||||||
!!ver 110
|
!!ver 110
|
||||||
!!samps diffuse lightmap
|
!!samps diffuse lightmap
|
||||||
|
!!cvardf gl_fake16bit=0
|
||||||
|
|
||||||
#include "sys/defs.h"
|
#include "sys/defs.h"
|
||||||
|
|
||||||
|
@ -18,15 +19,29 @@ varying vec2 lm_c;
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
void main ( void )
|
void main ( void )
|
||||||
{
|
{
|
||||||
vec4 diffuse_f = texture2D( s_diffuse, tex_c );
|
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
|
||||||
|
vec3 light = texture2D(s_lightmap, lm_c).rgb;
|
||||||
|
|
||||||
|
if (light.r > 1.0f) {
|
||||||
|
light.r = 1.0f;
|
||||||
|
}
|
||||||
|
if (light.g > 1.0f) {
|
||||||
|
light.g = 1.0f;
|
||||||
|
}
|
||||||
|
if (light.b > 1.0f) {
|
||||||
|
light.b = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if ( diffuse_f.a < 0.5 ) {
|
if (diffuse_f.a < 0.5) {
|
||||||
discard;
|
discard;
|
||||||
}
|
}
|
||||||
|
|
||||||
diffuse_f.rgb *= texture2D( s_lightmap, lm_c ).rgb * e_lmscale.rgb;
|
diffuse_f.rgb *= light.rgb;
|
||||||
diffuse_f *= e_colourident;
|
diffuse_f *= e_colourident;
|
||||||
|
|
||||||
|
#if gl_fake16bit == 1
|
||||||
|
diffuse_f.rgb = floor(diffuse_f.rgb * vec3(32,64,32))/vec3(32,64,32);
|
||||||
|
#endif
|
||||||
gl_FragColor = diffuse_f;
|
gl_FragColor = diffuse_f;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
BIN
freecs/menu.dat
BIN
freecs/menu.dat
Binary file not shown.
BIN
freecs/progs.dat
BIN
freecs/progs.dat
Binary file not shown.
Loading…
Reference in a new issue