2019-01-16 16:43:50 +00:00
|
|
|
/***
|
|
|
|
*
|
|
|
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
|
|
|
*
|
|
|
|
* See the file LICENSE attached with the sources for usage details.
|
|
|
|
*
|
|
|
|
****/
|
2017-06-21 19:07:23 +00:00
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
void Effect_CreateExplosion(vector vPos) {
|
2017-06-21 19:07:23 +00:00
|
|
|
#ifdef SSQC
|
2019-03-01 00:24:15 +00:00
|
|
|
Decals_PlaceScorch(vPos);
|
2019-03-01 14:30:18 +00:00
|
|
|
vPos[2] += 48;
|
|
|
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
|
|
|
WriteByte(MSG_MULTICAST, EV_EXPLOSION);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[2]);
|
|
|
|
msg_entity = self;
|
|
|
|
multicast(vPos, MULTICAST_PVS);
|
2017-06-21 19:07:23 +00:00
|
|
|
#else
|
2019-01-21 02:00:14 +00:00
|
|
|
sprite eExplosion = spawn(sprite);
|
2019-03-01 14:30:18 +00:00
|
|
|
setorigin(eExplosion, vPos);
|
|
|
|
setmodel(eExplosion, "sprites/fexplo.spr");
|
|
|
|
sound(eExplosion, CHAN_WEAPON, sprintf("weapons/explode%d.wav", floor(random() * 3) + 3), 1, ATTN_NORM);
|
2019-02-09 10:32:19 +00:00
|
|
|
|
2019-01-21 02:00:14 +00:00
|
|
|
//eExplosion.think = Effect_CreateExplosion_Animate;
|
2017-06-21 19:07:23 +00:00
|
|
|
eExplosion.effects = EF_ADDITIVE;
|
|
|
|
eExplosion.drawmask = MASK_ENGINE;
|
2019-03-01 14:30:18 +00:00
|
|
|
eExplosion.maxframe = modelframecount(eExplosion.modelindex);
|
2019-02-20 13:30:16 +00:00
|
|
|
eExplosion.loops = 0;
|
|
|
|
eExplosion.framerate = 20;
|
|
|
|
eExplosion.nextthink = time + 0.05f;
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
te_explosion(vPos);
|
2017-06-21 19:07:23 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
void Effect_CreateBlood(vector vPos, vector vAngle) {
|
2019-02-28 07:18:01 +00:00
|
|
|
#ifdef SSQC
|
2019-03-01 14:30:18 +00:00
|
|
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
|
|
|
WriteByte(MSG_MULTICAST, EV_BLOOD);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[2]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vAngle[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vAngle[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vAngle[2]);
|
2019-02-28 07:18:01 +00:00
|
|
|
msg_entity = self;
|
2019-03-01 14:30:18 +00:00
|
|
|
multicast(vPos, MULTICAST_PVS);
|
2019-02-28 07:18:01 +00:00
|
|
|
#else
|
|
|
|
sprite eBlood = spawn(sprite);
|
2019-03-01 14:30:18 +00:00
|
|
|
setorigin(eBlood, vPos);
|
|
|
|
setmodel(eBlood, "sprites/bloodspray.spr");
|
2019-02-28 07:18:01 +00:00
|
|
|
|
|
|
|
//eExplosion.think = Effect_CreateExplosion_Animate;
|
|
|
|
//eBlood.effects = EF_ADDITIVE;
|
|
|
|
eBlood.drawmask = MASK_ENGINE;
|
2019-03-01 14:30:18 +00:00
|
|
|
eBlood.maxframe = modelframecount(eBlood.modelindex);
|
2019-02-28 07:18:01 +00:00
|
|
|
eBlood.loops = 0;
|
|
|
|
eBlood.scale = 0.5f;
|
|
|
|
eBlood.colormod = [1,0,0];
|
|
|
|
eBlood.framerate = 20;
|
|
|
|
eBlood.nextthink = time + 0.05f;
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
sprite ePart = spawn(sprite);
|
|
|
|
setorigin(ePart, vPos);
|
2019-03-01 14:30:18 +00:00
|
|
|
setmodel(ePart, "sprites/blood.spr");
|
2019-02-28 07:18:01 +00:00
|
|
|
ePart.movetype = MOVETYPE_BOUNCE;
|
|
|
|
ePart.gravity = 0.5f;
|
|
|
|
ePart.scale = 0.5f;
|
|
|
|
ePart.drawmask = MASK_ENGINE;
|
|
|
|
ePart.maxframe = modelframecount(ePart.modelindex);
|
|
|
|
ePart.loops = 0;
|
|
|
|
ePart.colormod = [1,0,0];
|
|
|
|
ePart.framerate = 15;
|
|
|
|
ePart.nextthink = time + 0.1f;
|
|
|
|
ePart.velocity = randomvec() * 64;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
void Effect_CreateSpark(vector vPos, vector vAngle) {
|
2017-07-01 00:39:15 +00:00
|
|
|
#ifdef SSQC
|
2019-03-01 14:30:18 +00:00
|
|
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
|
|
|
WriteByte(MSG_MULTICAST, EV_SPARK);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[2]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vAngle[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vAngle[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vAngle[2]);
|
2017-07-01 00:39:15 +00:00
|
|
|
msg_entity = self;
|
2019-03-01 14:30:18 +00:00
|
|
|
multicast(vPos, MULTICAST_PVS);
|
2017-07-01 00:39:15 +00:00
|
|
|
#else
|
2019-03-01 14:30:18 +00:00
|
|
|
pointparticles(PARTICLE_SPARK, vPos, vAngle, 1);
|
|
|
|
pointsound(vPos, sprintf("buttons/spark%d.wav", floor(random() * 6) + 1), 1, ATTN_STATIC);
|
2017-07-01 00:39:15 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-01-19 04:50:25 +00:00
|
|
|
#ifdef CSTRIKE
|
2017-07-02 20:49:22 +00:00
|
|
|
#ifdef SSQC
|
2019-03-01 14:30:18 +00:00
|
|
|
void Effect_CreateFlash(entity eTarget) {
|
|
|
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
|
|
|
WriteByte(MSG_MULTICAST, EV_FLASH);
|
2017-07-02 20:49:22 +00:00
|
|
|
msg_entity = eTarget;
|
2019-03-01 14:30:18 +00:00
|
|
|
multicast([0,0,0], MULTICAST_ONE);
|
2017-07-02 20:49:22 +00:00
|
|
|
}
|
|
|
|
#endif
|
2019-01-19 04:50:25 +00:00
|
|
|
#endif
|
2017-07-02 20:49:22 +00:00
|
|
|
|
2019-01-19 04:50:25 +00:00
|
|
|
#ifdef CSTRIKE
|
2019-03-01 14:30:18 +00:00
|
|
|
void Effect_CreateSmoke(vector vPos) {
|
2017-07-02 20:49:22 +00:00
|
|
|
#ifdef SSQC
|
2019-03-01 14:30:18 +00:00
|
|
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
|
|
|
WriteByte(MSG_MULTICAST, EV_SMOKE);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[2]);
|
2017-07-02 20:49:22 +00:00
|
|
|
msg_entity = self;
|
2019-03-01 14:30:18 +00:00
|
|
|
multicast([0,0,0], MULTICAST_ALL);
|
2017-07-02 20:49:22 +00:00
|
|
|
#else
|
2019-03-01 14:30:18 +00:00
|
|
|
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?
|
2019-03-01 14:30:18 +00:00
|
|
|
if (self.skin < getstatf(STAT_GAMETIME)) {
|
|
|
|
remove(self);
|
2017-11-20 02:03:30 +00:00
|
|
|
}
|
2019-03-01 14:30:18 +00:00
|
|
|
if (self.frame <= 0) {
|
|
|
|
remove(self);
|
2017-07-02 20:49:22 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
pointparticles(PARTICLE_SMOKEGRENADE, self.origin, [0,0,0], 1);
|
2017-07-02 20:49:22 +00:00
|
|
|
self.frame--;
|
|
|
|
self.nextthink = time + 0.2f;
|
2019-03-01 14:30:18 +00:00
|
|
|
self.skin = getstatf(STAT_GAMETIME);
|
2017-07-02 20:49:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
entity eSmoke = spawn();
|
2019-03-01 14:30:18 +00:00
|
|
|
setorigin(eSmoke, vPos);
|
2017-07-02 20:49:22 +00:00
|
|
|
eSmoke.think = Effect_CreateSmoke_Think;
|
|
|
|
eSmoke.nextthink = time;
|
|
|
|
eSmoke.frame = 200;
|
2019-03-01 14:30:18 +00:00
|
|
|
eSmoke.skin = getstatf(STAT_GAMETIME);
|
2017-07-02 20:49:22 +00:00
|
|
|
#endif
|
|
|
|
}
|
2019-01-19 04:50:25 +00:00
|
|
|
#endif
|
2017-07-02 20:49:22 +00:00
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
void Effect_Impact(int iType, vector vPos, vector vNormal) {
|
2017-01-07 16:29:27 +00:00
|
|
|
#ifdef SSQC
|
2019-03-01 14:30:18 +00:00
|
|
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
|
|
|
WriteByte(MSG_MULTICAST, EV_IMPACT);
|
|
|
|
WriteByte(MSG_MULTICAST, (float)iType);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vPos[2]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vNormal[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vNormal[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vNormal[2]);
|
2017-01-07 16:29:27 +00:00
|
|
|
msg_entity = self;
|
2019-03-01 14:30:18 +00:00
|
|
|
multicast(vPos, MULTICAST_PVS);
|
2019-02-20 13:30:16 +00:00
|
|
|
|
|
|
|
switch (iType) {
|
|
|
|
case IMPACT_MELEE:
|
|
|
|
Decals_PlaceSmall(vPos);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
Decals_PlaceBig(vPos);
|
|
|
|
break;
|
|
|
|
}
|
2017-01-07 16:29:27 +00:00
|
|
|
#else
|
2019-02-20 13:30:16 +00:00
|
|
|
switch (iType) {
|
2017-01-07 16:29:27 +00:00
|
|
|
case IMPACT_MELEE:
|
2019-03-01 14:30:18 +00:00
|
|
|
/*pointparticles(DECAL_SHOT, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_PIECES_BLACK, vPos, vNormal, 1);*/
|
|
|
|
pointsound(vPos, "weapons/knife_hitwall1.wav", 1, ATTN_STATIC);
|
2019-02-20 13:30:16 +00:00
|
|
|
//Decals_PlaceSmall(vPos);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
|
|
|
case IMPACT_EXPLOSION:
|
|
|
|
break;
|
|
|
|
case IMPACT_GLASS:
|
2019-03-01 14:30:18 +00:00
|
|
|
//pointparticles(DECAL_GLASS, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_PIECES_BLACK, vPos, vNormal, 1);
|
2019-02-20 13:30:16 +00:00
|
|
|
//Decals_PlaceBig(vPos);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
|
|
|
case IMPACT_WOOD:
|
2019-03-01 14:30:18 +00:00
|
|
|
//pointparticles(DECAL_SHOT, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_SPARK, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_PIECES_BLACK, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_SMOKE_BROWN, vPos, vNormal, 1);
|
2019-02-20 13:30:16 +00:00
|
|
|
//Decals_PlaceBig(vPos);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
|
|
|
case IMPACT_METAL:
|
2019-03-01 14:30:18 +00:00
|
|
|
//pointparticles(DECAL_SHOT, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_SPARK, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_SPARK, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_PIECES_BLACK, vPos, vNormal, 1);
|
2019-02-20 13:30:16 +00:00
|
|
|
//Decals_PlaceBig(vPos);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
|
|
|
case IMPACT_FLESH:
|
2019-03-01 14:30:18 +00:00
|
|
|
pointparticles(PARTICLE_BLOOD, vPos, vNormal, 1);
|
2019-02-20 13:30:16 +00:00
|
|
|
//Decals_PlaceBig(vPos);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
|
|
|
case IMPACT_DEFAULT:
|
2019-03-01 14:30:18 +00:00
|
|
|
//pointparticles(DECAL_SHOT, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_SPARK, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_PIECES_BLACK, vPos, vNormal, 1);
|
|
|
|
pointparticles(PARTICLE_SMOKE_GREY, vPos, vNormal, 1);
|
2019-02-20 13:30:16 +00:00
|
|
|
//Decals_PlaceBig(vPos);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
switch (iType) {
|
2017-01-07 16:29:27 +00:00
|
|
|
case IMPACT_METAL:
|
2019-03-01 14:30:18 +00:00
|
|
|
pointsound(vPos, sprintf("weapons/ric_metal-%d.wav", floor((random() * 2) + 1)), 1, ATTN_STATIC);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
2017-01-08 15:12:02 +00:00
|
|
|
case IMPACT_FLESH:
|
|
|
|
break;
|
2017-01-07 16:29:27 +00:00
|
|
|
default:
|
2019-03-01 14:30:18 +00:00
|
|
|
pointsound(vPos, sprintf("weapons/ric%d.wav", floor((random() * 5) + 1)), 1, ATTN_STATIC);
|
2017-01-07 16:29:27 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
void Effect_BreakModel(vector vMins, vector vMaxs, vector vVel, float fStyle) {
|
2016-12-03 19:25:03 +00:00
|
|
|
#ifdef SSQC
|
2019-03-01 14:30:18 +00:00
|
|
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
|
|
|
WriteByte(MSG_MULTICAST, EV_MODELGIB);
|
|
|
|
WriteCoord(MSG_MULTICAST, vMins[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vMins[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vMins[2]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vMaxs[0]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vMaxs[1]);
|
|
|
|
WriteCoord(MSG_MULTICAST, vMaxs[2]);
|
|
|
|
WriteByte(MSG_MULTICAST, fStyle);
|
2016-12-03 19:25:03 +00:00
|
|
|
|
|
|
|
msg_entity = self;
|
2016-12-10 14:39:54 +00:00
|
|
|
|
|
|
|
vector vWorldPos;
|
2019-03-01 14:30:18 +00:00
|
|
|
vWorldPos[0] = vMins[0] + (0.5 * (vMaxs[0] - vMins[0]));
|
|
|
|
vWorldPos[1] = vMins[1] + (0.5 * (vMaxs[1] - vMins[1]));
|
|
|
|
vWorldPos[2] = vMins[2] + (0.5 * (vMaxs[2] - vMins[2]));
|
|
|
|
multicast(vWorldPos, MULTICAST_PVS);
|
2016-12-03 19:25:03 +00:00
|
|
|
#else
|
2019-03-01 14:30:18 +00:00
|
|
|
static void Effect_BreakModel_Remove(void) { remove(self) ; }
|
2016-12-04 01:27:15 +00:00
|
|
|
|
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
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
switch (fStyle) {
|
2016-12-04 01:27:15 +00:00
|
|
|
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;
|
2019-03-01 14:30:18 +00:00
|
|
|
vWorldPos[0] = vMins[0] + (0.5 * (vMaxs[0] - vMins[0]));
|
|
|
|
vWorldPos[1] = vMins[1] + (0.5 * (vMaxs[1] - vMins[1]));
|
|
|
|
vWorldPos[2] = vMins[2] + (0.5 * (vMaxs[2] - vMins[2]));
|
2017-01-10 18:24:45 +00:00
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
switch (fStyle) {
|
2017-01-10 18:24:45 +00:00
|
|
|
case MATERIAL_GLASS:
|
2019-03-01 14:30:18 +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:
|
2019-03-01 14:30:18 +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:
|
2019-03-01 14:30:18 +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:
|
2019-03-01 14:30:18 +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:
|
2019-03-01 14:30:18 +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:
|
2019-03-01 14:30:18 +00:00
|
|
|
pointsound(vWorldPos, "debris/bustceiling.wav", 1.0f, ATTN_NORM);
|
2017-01-10 18:24:45 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
while (fCount > 0) {
|
2016-12-03 19:25:03 +00:00
|
|
|
entity eGib = spawn();
|
2017-11-16 22:53:02 +00:00
|
|
|
eGib.classname = "gib";
|
2016-12-03 19:25:03 +00:00
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
vPos[0] = vMins[0] + (random() * (vMaxs[0] - vMins[0]));
|
|
|
|
vPos[1] = vMins[1] + (random() * (vMaxs[1] - vMins[1]));
|
|
|
|
vPos[2] = vMins[2] + (random() * (vMaxs[2] - vMins[2]));
|
2016-12-04 01:27:15 +00:00
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
setorigin(eGib, vPos);
|
|
|
|
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;
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
eGib.avelocity[0] = random()*600;
|
|
|
|
eGib.avelocity[1] = random()*600;
|
|
|
|
eGib.avelocity[2] = random()*600;
|
2016-12-04 01:27:15 +00:00
|
|
|
eGib.think = Effect_BreakModel_Remove;
|
|
|
|
eGib.nextthink = time + 10;
|
|
|
|
|
2019-03-01 14:30:18 +00:00
|
|
|
if ((fStyle == MATERIAL_GLASS) || (fStyle == MATERIAL_GLASS_UNBREAKABLE)) {
|
2016-12-04 01:27:15 +00:00
|
|
|
eGib.effects = EF_ADDITIVE;
|
|
|
|
eGib.alpha = 0.3;
|
|
|
|
}
|
2016-12-03 19:25:03 +00:00
|
|
|
|
|
|
|
fCount--;
|
|
|
|
eGib.drawmask = MASK_ENGINE;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
2018-12-07 19:03:07 +00:00
|
|
|
|
|
|
|
#ifdef CSQC
|
2019-02-20 13:30:16 +00:00
|
|
|
float Effect_Decal(void)
|
|
|
|
{
|
2019-03-01 14:30:18 +00:00
|
|
|
adddecal(self.classname, self.origin, self.mins, self.maxs, self.color, 1.0f);
|
|
|
|
addentity(self);
|
2018-12-07 19:03:07 +00:00
|
|
|
return PREDRAW_NEXT;
|
|
|
|
}
|
|
|
|
#endif
|