2016-12-03 19:25:03 +00:00
|
|
|
/*
|
2017-04-30 23:21:49 +00:00
|
|
|
FreeCS Project
|
2017-01-07 20:18:15 +00:00
|
|
|
Copyright (C) 2016, 2017 Marco "eukara" Hladik
|
2016-12-03 19:25:03 +00:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
2017-06-21 19:07:23 +00:00
|
|
|
|
2017-11-22 21:34:09 +00:00
|
|
|
|
|
|
|
#ifdef SSQC
|
|
|
|
void Effect_RemoveSpray( entity eOwner ) {
|
|
|
|
for ( entity eFind = world; ( eFind = find( eFind, classname, "spray" ) ); ) {
|
|
|
|
if ( eFind.owner == self ) {
|
|
|
|
remove( eFind );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Effect_Spraypaint( void ) {
|
|
|
|
static float Effect_Spraypaint_Send( entity ePVSEnt, float fChanged ) {
|
|
|
|
WriteByte( MSG_ENTITY, ENT_SPRAY );
|
|
|
|
WriteCoord( MSG_ENTITY, self.origin_x );
|
|
|
|
WriteCoord( MSG_ENTITY, self.origin_y );
|
|
|
|
WriteCoord( MSG_ENTITY, self.origin_z );
|
|
|
|
WriteCoord( MSG_ENTITY, self.angles_x );
|
|
|
|
WriteCoord( MSG_ENTITY, self.angles_y );
|
|
|
|
WriteCoord( MSG_ENTITY, self.angles_z );
|
|
|
|
WriteByte( MSG_ENTITY, num_for_edict( self.owner ) );
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
vector vSrc;
|
|
|
|
vector vEnd;
|
|
|
|
makevectors( self.v_angle );
|
|
|
|
|
|
|
|
if ( self.health <= 0 ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Effect_RemoveSpray( self );
|
|
|
|
|
|
|
|
vSrc = self.origin + self.view_ofs;
|
|
|
|
vEnd = vSrc + v_forward * 128;
|
|
|
|
traceline( vSrc, vEnd, 0, self );
|
|
|
|
|
|
|
|
// Found a wall
|
|
|
|
if ( trace_fraction != 1.0f ) {
|
|
|
|
entity eSpray = spawn();
|
|
|
|
eSpray.classname = "spray";
|
|
|
|
eSpray.owner = self;
|
|
|
|
eSpray.solid = SOLID_NOT;
|
|
|
|
setorigin( eSpray, trace_endpos );
|
|
|
|
|
|
|
|
// Align it
|
2017-12-01 19:02:58 +00:00
|
|
|
vector vSprayAngles = self.v_angle;
|
2017-11-22 21:34:09 +00:00
|
|
|
vSprayAngles_x *= -1;
|
|
|
|
makevectors( vSprayAngles );
|
2017-12-01 19:02:58 +00:00
|
|
|
|
2017-11-22 21:34:09 +00:00
|
|
|
vector vCoplanar = v_forward - ( v_forward * trace_plane_normal ) * trace_plane_normal;
|
2017-12-01 19:02:58 +00:00
|
|
|
|
|
|
|
centerprint( self, sprintf( "Coplanar: %f %f %f\n", vCoplanar_x, vCoplanar_y, vCoplanar_z ) );
|
|
|
|
|
|
|
|
if ( trace_plane_normal_z == 0 ) {
|
|
|
|
vCoplanar = '0 0 1';
|
|
|
|
}
|
|
|
|
|
2017-11-22 21:34:09 +00:00
|
|
|
eSpray.angles = vectoangles( vCoplanar, trace_plane_normal );
|
|
|
|
|
|
|
|
eSpray.SendEntity = Effect_Spraypaint_Send;
|
|
|
|
eSpray.SendFlags = 1;
|
|
|
|
sound( self, CHAN_VOICE, "player/sprayer.wav", 1.0, ATTN_NORM );
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
float Effect_Spraypaint( void ) {
|
|
|
|
makevectors( self.angles );
|
|
|
|
// Temporary string, will getinfo from player later
|
2017-12-01 19:02:58 +00:00
|
|
|
adddecal( self.classname, self.origin, v_up / 32, v_forward / 32, '1 0 0', 1.0f );
|
2017-11-22 21:34:09 +00:00
|
|
|
addentity( self );
|
|
|
|
return PREDRAW_NEXT;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-21 19:07:23 +00:00
|
|
|
void Effect_CreateExplosion( vector vPos ) {
|
|
|
|
#ifdef SSQC
|
|
|
|
vPos_z += 48;
|
|
|
|
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
|
|
|
WriteByte( MSG_MULTICAST, EV_EXPLOSION );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_x );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_y );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_z );
|
|
|
|
msg_entity = self;
|
|
|
|
multicast( vPos, MULTICAST_PVS );
|
|
|
|
#else
|
2017-06-23 07:23:24 +00:00
|
|
|
|
2017-06-21 19:07:23 +00:00
|
|
|
static void Effect_CreateExplosion_Animate( void ) {
|
|
|
|
if ( self.frame >= self.maxframe ) {
|
|
|
|
remove( self );
|
|
|
|
} else {
|
|
|
|
self.frame += 1;
|
|
|
|
}
|
|
|
|
self.nextthink = time + 0.05f;
|
|
|
|
}
|
|
|
|
|
|
|
|
entity eExplosion = spawn();
|
|
|
|
setorigin( eExplosion, vPos );
|
|
|
|
setmodel( eExplosion, "sprites/fexplo.spr" );
|
2017-06-23 07:23:24 +00:00
|
|
|
sound( eExplosion, CHAN_WEAPON, sprintf( "weapons/explode%d.wav", floor( random() * 3 ) + 3 ), 1, ATTN_NORM );
|
2017-06-21 19:07:23 +00:00
|
|
|
|
|
|
|
eExplosion.think = Effect_CreateExplosion_Animate;
|
|
|
|
eExplosion.nextthink = time + 0.05f;
|
|
|
|
eExplosion.effects = EF_ADDITIVE;
|
|
|
|
eExplosion.drawmask = MASK_ENGINE;
|
|
|
|
eExplosion.maxframe = modelframecount( eExplosion.modelindex );
|
2017-06-23 07:23:24 +00:00
|
|
|
|
|
|
|
te_explosion( vPos );
|
2017-06-21 19:07:23 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2017-07-01 00:39:15 +00:00
|
|
|
void Effect_CreateSpark( vector vPos, vector vAngle ) {
|
|
|
|
#ifdef SSQC
|
|
|
|
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
|
|
|
WriteByte( MSG_MULTICAST, EV_SPARK );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_x );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_y );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_z );
|
|
|
|
WriteCoord( MSG_MULTICAST, vAngle_x );
|
|
|
|
WriteCoord( MSG_MULTICAST, vAngle_y );
|
|
|
|
WriteCoord( MSG_MULTICAST, vAngle_z );
|
|
|
|
msg_entity = self;
|
|
|
|
multicast( vPos, MULTICAST_PVS );
|
|
|
|
#else
|
|
|
|
pointparticles( PARTICLE_SPARK, vPos, vAngle, 1 );
|
|
|
|
pointsound( vPos, sprintf( "buttons/spark%d.wav", floor( random() * 6 ) + 1 ), 1, ATTN_STATIC );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2017-07-02 20:49:22 +00:00
|
|
|
#ifdef SSQC
|
|
|
|
void Effect_CreateFlash( entity eTarget ) {
|
|
|
|
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
|
|
|
WriteByte( MSG_MULTICAST, EV_FLASH );
|
|
|
|
msg_entity = eTarget;
|
|
|
|
multicast( '0 0 0', MULTICAST_ONE );
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void Effect_CreateSmoke( vector vPos ) {
|
|
|
|
#ifdef SSQC
|
|
|
|
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
|
|
|
WriteByte( MSG_MULTICAST, EV_SMOKE );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_x );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_y );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_z );
|
|
|
|
msg_entity = self;
|
|
|
|
multicast( '0 0 0', MULTICAST_ALL );
|
|
|
|
#else
|
|
|
|
static void Effect_CreateSmoke_Think( void ) {
|
2017-11-20 02:03:30 +00:00
|
|
|
// HACK: This should only ever happen when rounds restart!
|
|
|
|
// Any way this can go wrong?
|
|
|
|
if ( self.skin < getstatf( STAT_GAMETIME ) ) {
|
|
|
|
remove( self );
|
|
|
|
}
|
2017-07-02 20:49:22 +00:00
|
|
|
if ( self.frame <= 0 ) {
|
|
|
|
remove( self );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
pointparticles( PARTICLE_SMOKEGRENADE, self.origin, '0 0 0', 1 );
|
|
|
|
self.frame--;
|
|
|
|
self.nextthink = time + 0.2f;
|
2017-11-20 02:03:30 +00:00
|
|
|
self.skin = getstatf( STAT_GAMETIME );
|
2017-07-02 20:49:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
entity eSmoke = spawn();
|
|
|
|
setorigin( eSmoke, vPos );
|
|
|
|
eSmoke.think = Effect_CreateSmoke_Think;
|
|
|
|
eSmoke.nextthink = time;
|
|
|
|
eSmoke.frame = 200;
|
2017-11-20 02:03:30 +00:00
|
|
|
eSmoke.skin = getstatf( STAT_GAMETIME );
|
2017-07-02 20:49:22 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-12-10 14:25:16 +00:00
|
|
|
#ifdef CSQC
|
|
|
|
.float framerate;
|
|
|
|
void Effect_AnimatedSprite( vector vPos, float fIndex, float fFPS, float fScale, float fAlpha, float fEffects ) {
|
|
|
|
static void Effect_AnimatedSprite_Animate( void ) {
|
|
|
|
if( self.frame >= self.maxframe ) {
|
|
|
|
self.frame = 0;
|
|
|
|
} else {
|
|
|
|
self.frame += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
self.nextthink = time + ( 1 / self.framerate );
|
|
|
|
}
|
|
|
|
self.modelindex = fIndex;
|
|
|
|
setorigin( self, vPos );
|
|
|
|
self.scale = fScale;
|
|
|
|
self.alpha = fAlpha;
|
|
|
|
self.effects = fEffects;
|
|
|
|
self.framerate = fFPS;
|
|
|
|
self.think = Effect_AnimatedSprite_Animate;
|
|
|
|
self.drawmask = MASK_ENGINE;
|
|
|
|
self.nextthink = time + ( 1 / self.framerate );
|
2016-12-17 12:55:18 +00:00
|
|
|
self.maxframe = modelframecount( self.modelindex );
|
2016-12-10 14:25:16 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2017-01-07 16:29:27 +00:00
|
|
|
void Effect_Impact( int iType, vector vPos, vector vNormal ) {
|
|
|
|
#ifdef SSQC
|
|
|
|
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
|
|
|
WriteByte( MSG_MULTICAST, EV_IMPACT );
|
|
|
|
WriteByte( MSG_MULTICAST, (float)iType );
|
2017-06-25 22:04:06 +00:00
|
|
|
WriteCoord( MSG_MULTICAST, vPos_x );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_y );
|
|
|
|
WriteCoord( MSG_MULTICAST, vPos_z );
|
|
|
|
WriteCoord( MSG_MULTICAST, vNormal_x );
|
|
|
|
WriteCoord( MSG_MULTICAST, vNormal_y );
|
|
|
|
WriteCoord( MSG_MULTICAST, vNormal_z );
|
2017-01-07 16:29:27 +00:00
|
|
|
msg_entity = self;
|
|
|
|
multicast( vPos, MULTICAST_PVS );
|
|
|
|
#else
|
|
|
|
switch ( iType ) {
|
|
|
|
case IMPACT_MELEE:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointparticles( DECAL_SHOT, vPos, vNormal, 1 );
|
2017-01-07 16:29:27 +00:00
|
|
|
pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 );
|
|
|
|
pointsound( vPos, "weapons/knife_hitwall1.wav", 1, ATTN_STATIC );
|
|
|
|
break;
|
|
|
|
case IMPACT_EXPLOSION:
|
|
|
|
break;
|
|
|
|
case IMPACT_GLASS:
|
2017-01-15 19:56:58 +00:00
|
|
|
pointparticles( DECAL_GLASS, vPos, vNormal, 1 );
|
2017-01-07 16:29:27 +00:00
|
|
|
pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 );
|
|
|
|
break;
|
|
|
|
case IMPACT_WOOD:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointparticles( DECAL_SHOT, vPos, vNormal, 1 );
|
2017-01-07 16:29:27 +00:00
|
|
|
pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 );
|
|
|
|
pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 );
|
|
|
|
pointparticles( PARTICLE_SMOKE_BROWN, vPos, vNormal, 1 );
|
|
|
|
break;
|
|
|
|
case IMPACT_METAL:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointparticles( DECAL_SHOT, vPos, vNormal, 1 );
|
2017-01-07 16:29:27 +00:00
|
|
|
pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 );
|
|
|
|
pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 );
|
|
|
|
pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 );
|
|
|
|
break;
|
|
|
|
case IMPACT_FLESH:
|
|
|
|
pointparticles( PARTICLE_BLOOD, vPos, vNormal, 1 );
|
|
|
|
break;
|
|
|
|
case IMPACT_DEFAULT:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointparticles( DECAL_SHOT, vPos, vNormal, 1 );
|
2017-01-07 16:29:27 +00:00
|
|
|
pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 );
|
|
|
|
pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 );
|
|
|
|
pointparticles( PARTICLE_SMOKE_GREY, vPos, vNormal, 1 );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ( iType ) {
|
|
|
|
case IMPACT_METAL:
|
|
|
|
pointsound( vPos, sprintf( "weapons/ric_metal-%d.wav", floor( ( random() * 2 ) + 1 ) ), 1, ATTN_STATIC );
|
|
|
|
break;
|
2017-01-08 15:12:02 +00:00
|
|
|
case IMPACT_FLESH:
|
|
|
|
break;
|
2017-01-07 16:29:27 +00:00
|
|
|
default:
|
|
|
|
pointsound( vPos, sprintf( "weapons/ric%d.wav", floor( ( random() * 5 ) + 1 ) ), 1, ATTN_STATIC );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-12-04 01:27:15 +00:00
|
|
|
void Effect_BreakModel( vector vMins, vector vMaxs, vector vVel, float fStyle ) {
|
2016-12-03 19:25:03 +00:00
|
|
|
#ifdef SSQC
|
|
|
|
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
|
|
|
WriteByte( MSG_MULTICAST, EV_MODELGIB );
|
2016-12-04 01:27:15 +00:00
|
|
|
WriteCoord( MSG_MULTICAST, vMins_x);
|
|
|
|
WriteCoord( MSG_MULTICAST, vMins_y);
|
|
|
|
WriteCoord( MSG_MULTICAST, vMins_z);
|
|
|
|
WriteCoord( MSG_MULTICAST, vMaxs_x);
|
|
|
|
WriteCoord( MSG_MULTICAST, vMaxs_y);
|
|
|
|
WriteCoord( MSG_MULTICAST, vMaxs_z);
|
2016-12-03 19:25:03 +00:00
|
|
|
WriteByte( MSG_MULTICAST, fStyle );
|
|
|
|
|
|
|
|
msg_entity = self;
|
2016-12-10 14:39:54 +00:00
|
|
|
|
|
|
|
vector vWorldPos;
|
|
|
|
vWorldPos_x = vMins_x + ( 0.5 * ( vMaxs_x - vMins_x ) );
|
|
|
|
vWorldPos_y = vMins_y + ( 0.5 * ( vMaxs_y - vMins_y ) );
|
|
|
|
vWorldPos_z = vMins_z + ( 0.5 * ( vMaxs_z - vMins_z ) );
|
|
|
|
multicast( vWorldPos, MULTICAST_PVS );
|
2016-12-03 19:25:03 +00:00
|
|
|
#else
|
2016-12-04 01:27:15 +00:00
|
|
|
static void Effect_BreakModel_Remove( void ) { remove( self ) ; }
|
|
|
|
|
2016-12-10 14:25:16 +00:00
|
|
|
float fModelCount;
|
2016-12-04 01:27:15 +00:00
|
|
|
vector vPos;
|
|
|
|
string sModel = "";
|
2017-01-14 15:00:31 +00:00
|
|
|
float fCount = 20;
|
2016-12-04 01:27:15 +00:00
|
|
|
|
|
|
|
switch ( fStyle ) {
|
|
|
|
case MATERIAL_GLASS:
|
|
|
|
case MATERIAL_GLASS_UNBREAKABLE:
|
|
|
|
sModel = "models/glassgibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 8;
|
2016-12-04 01:27:15 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_WOOD:
|
|
|
|
sModel = "models/woodgibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 3;
|
2016-12-04 01:27:15 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_METAL:
|
|
|
|
sModel = "models/metalplategibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 13;
|
2016-12-04 01:27:15 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_FLESH:
|
2016-12-04 14:04:30 +00:00
|
|
|
sModel = "models/fleshgibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 4;
|
2016-12-04 01:27:15 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_TILE:
|
|
|
|
sModel = "models/ceilinggibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 4;
|
2016-12-04 01:27:15 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_COMPUTER:
|
|
|
|
sModel = "models/computergibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 15;
|
2016-12-04 01:27:15 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_ROCK:
|
|
|
|
sModel = "models/rockgibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 3;
|
2016-12-04 01:27:15 +00:00
|
|
|
break;
|
|
|
|
default:
|
2016-12-10 14:25:16 +00:00
|
|
|
case MATERIAL_CINDER:
|
2016-12-04 01:27:15 +00:00
|
|
|
sModel = "models/cindergibs.mdl";
|
2016-12-10 14:25:16 +00:00
|
|
|
fModelCount = 9;
|
|
|
|
break;
|
2016-12-04 01:27:15 +00:00
|
|
|
}
|
2016-12-03 19:25:03 +00:00
|
|
|
|
2017-01-14 15:00:31 +00:00
|
|
|
vector vWorldPos;
|
|
|
|
vWorldPos_x = vMins_x + ( 0.5 * ( vMaxs_x - vMins_x ) );
|
|
|
|
vWorldPos_y = vMins_y + ( 0.5 * ( vMaxs_y - vMins_y ) );
|
|
|
|
vWorldPos_z = vMins_z + ( 0.5 * ( vMaxs_z - vMins_z ) );
|
2017-01-10 18:24:45 +00:00
|
|
|
|
|
|
|
switch ( fStyle ) {
|
|
|
|
case MATERIAL_GLASS:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointsound( vWorldPos, sprintf( "debris/bustglass%d.wav", random( 1, 4 ) ), 1.0f, ATTN_NORM );
|
2017-01-10 18:24:45 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_WOOD:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointsound( vWorldPos, sprintf( "debris/bustcrate%d.wav", random( 1, 4 ) ), 1.0f, ATTN_NORM );
|
2017-01-10 18:24:45 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_METAL:
|
|
|
|
case MATERIAL_COMPUTER:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointsound( vWorldPos, sprintf( "debris/bustmetal%d.wav", random( 1, 3 ) ), 1.0f, ATTN_NORM );
|
2017-01-10 18:24:45 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_FLESH:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointsound( vWorldPos, sprintf( "debris/bustflesh%d.wav", random( 1, 3 ) ), 1.0f, ATTN_NORM );
|
2017-01-10 18:24:45 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_CINDER:
|
|
|
|
case MATERIAL_ROCK:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointsound( vWorldPos, sprintf( "debris/bustconcrete%d.wav", random( 1, 4 ) ), 1.0f, ATTN_NORM );
|
2017-01-10 18:24:45 +00:00
|
|
|
break;
|
|
|
|
case MATERIAL_TILE:
|
2017-01-14 15:00:31 +00:00
|
|
|
pointsound( vWorldPos, "debris/bustceiling.wav", 1.0f, ATTN_NORM );
|
2017-01-10 18:24:45 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2016-12-03 19:25:03 +00:00
|
|
|
while ( fCount > 0 ) {
|
|
|
|
entity eGib = spawn();
|
2017-11-16 22:53:02 +00:00
|
|
|
eGib.classname = "gib";
|
2016-12-03 19:25:03 +00:00
|
|
|
|
2016-12-04 01:27:15 +00:00
|
|
|
vPos_x = vMins_x + ( random() * ( vMaxs_x - vMins_x ) );
|
|
|
|
vPos_y = vMins_y + ( random() * ( vMaxs_y - vMins_y ) );
|
|
|
|
vPos_z = vMins_z + ( random() * ( vMaxs_z - vMins_z ) );
|
|
|
|
|
|
|
|
setorigin( eGib, vPos );
|
2016-12-10 14:25:16 +00:00
|
|
|
setmodel( eGib, sModel );
|
|
|
|
setcustomskin( eGib, "", sprintf( "geomset 0 %f\n", random( 1, fModelCount + 1 ) ) );
|
2016-12-04 01:27:15 +00:00
|
|
|
eGib.movetype = MOVETYPE_BOUNCE;
|
|
|
|
eGib.solid = SOLID_NOT;
|
|
|
|
|
|
|
|
eGib.avelocity_x = random()*600;
|
|
|
|
eGib.avelocity_y = random()*600;
|
|
|
|
eGib.avelocity_z = random()*600;
|
|
|
|
eGib.think = Effect_BreakModel_Remove;
|
|
|
|
eGib.nextthink = time + 10;
|
|
|
|
|
|
|
|
if ( ( fStyle == MATERIAL_GLASS ) || ( fStyle == MATERIAL_GLASS_UNBREAKABLE ) ) {
|
|
|
|
eGib.effects = EF_ADDITIVE;
|
|
|
|
eGib.alpha = 0.3;
|
|
|
|
}
|
2016-12-03 19:25:03 +00:00
|
|
|
|
|
|
|
fCount--;
|
|
|
|
eGib.drawmask = MASK_ENGINE;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|