/* ================ idBrittleFracture::ClientReceiveEvent ================ */ bool idBrittleFracture::ClientReceiveEvent( int event, int time, const idBitMsg &msg ) { idVec3 point, dir; switch( event ) { case EVENT_PROJECT_DECAL: { point[0] = msg.ReadFloat(); point[1] = msg.ReadFloat(); point[2] = msg.ReadFloat(); dir[0] = msg.ReadFloat(); dir[1] = msg.ReadFloat(); dir[2] = msg.ReadFloat(); ProjectDecal( point, dir, time, NULL ); return true; } case EVENT_SHATTER: { point[0] = msg.ReadFloat(); point[1] = msg.ReadFloat(); point[2] = msg.ReadFloat(); dir[0] = msg.ReadFloat(); dir[1] = msg.ReadFloat(); dir[2] = msg.ReadFloat(); Shatter( point, dir, time ); return true; } default: { return idEntity::ClientReceiveEvent( event, time, msg ); } } return false; }
/* ================ idBrittleFracture::AddDamageEffect ================ */ void idBrittleFracture::AddDamageEffect( const trace_t& collision, const idVec3& velocity, const char* damageDefName ) { if( !disableFracture ) { ProjectDecal( collision.c.point, collision.c.normal, gameLocal.time, damageDefName ); } }
void CProjectedDecal::StaticDecal( void ) { CBroadcastRecipientFilter initFilter; initFilter.MakeInitMessage(); ProjectDecal( initFilter ); SUB_Remove(); }
void CProjectedDecal::TriggerDecal ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { CBroadcastRecipientFilter filter; ProjectDecal( filter ); SetThink( &CProjectedDecal::SUB_Remove ); SetNextThink( gpGlobals->curtime + 0.1f ); }
/* ================ idBrittleFracture::Restore ================ */ void idBrittleFracture::Restore( idRestoreGame* savefile ) { savefile->ReadInt( health ); savefile->Read( &fl, sizeof( fl ) ); LittleBitField( &fl, sizeof( fl ) ); // setttings savefile->ReadMaterial( material ); savefile->ReadMaterial( decalMaterial ); savefile->ReadFloat( decalSize ); savefile->ReadFloat( maxShardArea ); savefile->ReadFloat( maxShatterRadius ); savefile->ReadFloat( minShatterRadius ); savefile->ReadFloat( linearVelocityScale ); savefile->ReadFloat( angularVelocityScale ); savefile->ReadFloat( shardMass ); savefile->ReadFloat( density ); savefile->ReadFloat( friction ); savefile->ReadFloat( bouncyness ); savefile->ReadString( fxFracture ); // state savefile->ReadBounds( bounds ); savefile->ReadBool( disableFracture ); savefile->ReadInt( lastRenderEntityUpdate ); savefile->ReadBool( changed ); savefile->ReadModel( defaultRenderModel ); // Reset all brittle Fractures so we can re-break them if necessary fl.takedamage = true; CreateFractures( defaultRenderModel ); FindNeighbours(); int numEvents = 0; bool resolveBreaks = false; savefile->ReadInt( numEvents ); for( int i = 0; i < numEvents; i++ ) { fractureEvent_s restoredEvent; savefile->ReadInt( restoredEvent.eventType ); savefile->ReadVec3( restoredEvent.point ); savefile->ReadVec3( restoredEvent.vector ); if( restoredEvent.eventType == EVENT_PROJECT_DECAL ) { ProjectDecal( restoredEvent.point, restoredEvent.vector, gameLocal.time, NULL ); } else { Shatter( restoredEvent.point, restoredEvent.vector, gameLocal.time ); } resolveBreaks = true; } // remove any dropped shards for( int i = 0; resolveBreaks && i < shards.Num(); i++ ) { if( shards[i]->droppedTime != -1 ) { RemoveShard( i ); i--; } } renderEntity.hModel = renderModelManager->AllocModel(); renderEntity.hModel->InitEmpty( brittleFracture_SnapshotName ); renderEntity.callback = idBrittleFracture::ModelCallback; renderEntity.noShadow = true; renderEntity.noSelfShadow = true; renderEntity.noDynamicInteractions = false; savefile->ReadBool( isXraySurface ); }