nuclide/Source/Shared/Effects.c

99 lines
2.8 KiB
C

/*
OpenCS Project
Copyright (C) 2015 Marco "eukara" Hladik
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.
*/
void Effect_BreakModel( vector vMins, vector vMaxs, vector vVel, float fStyle ) {
#ifdef SSQC
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
WriteByte( MSG_MULTICAST, EV_MODELGIB );
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);
WriteByte( MSG_MULTICAST, fStyle );
msg_entity = self;
multicast( '0 0 0', MULTICAST_PVS );
#else
static void Effect_BreakModel_Remove( void ) { remove( self ) ; }
float fCount = 20; // TODO: Generate gibcount based around size.
vector vPos;
string sModel = "";
switch ( fStyle ) {
case MATERIAL_GLASS:
case MATERIAL_GLASS_UNBREAKABLE:
sModel = "models/glassgibs.mdl";
break;
case MATERIAL_WOOD:
sModel = "models/woodgibs.mdl";
break;
case MATERIAL_METAL:
sModel = "models/metalplategibs.mdl";
break;
case MATERIAL_FLESH:
sModel = "models/fleshgibs.mdl";
break;
case MATERIAL_CINDER:
sModel = "models/cindergibs.mdl";
break;
case MATERIAL_TILE:
sModel = "models/ceilinggibs.mdl";
break;
case MATERIAL_COMPUTER:
sModel = "models/computergibs.mdl";
break;
case MATERIAL_ROCK:
sModel = "models/rockgibs.mdl";
break;
default:
sModel = "models/cindergibs.mdl";
}
while ( fCount > 0 ) {
entity eGib = spawn();
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 );
setmodel( eGib, sModel ); // Placeholder
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;
}
fCount--;
eGib.drawmask = MASK_ENGINE;
}
#endif
}