void CFuncWall :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { if( IsLockedByMaster( pActivator )) return; if( ShouldToggle( useType )) { if( GetState() == STATE_ON ) TurnOff(); else TurnOn(); // LRC (support generic switchable texlight) if( m_iStyle >= 32 ) { if( pev->frame ) LIGHT_STYLE( m_iStyle, "z" ); else LIGHT_STYLE( m_iStyle, "a" ); } else if( m_iStyle <= -32 ) { if( pev->frame ) LIGHT_STYLE( -m_iStyle, "a" ); else LIGHT_STYLE( -m_iStyle, "z" ); } } }
void CWallHealth::Recharge(void) { EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM); m_iJuice = gSkillData.healthchargerCapacity; pev->frame = 0; //LRC if (m_iStyle >= 32) LIGHT_STYLE(m_iStyle, "a"); else if (m_iStyle <= -32) LIGHT_STYLE(-m_iStyle, "z"); SetThink(&CWallHealth::SUB_DoNothing); }
void CBreakable::Spawn( void ) { Precache( ); if ( FBitSet( pev->spawnflags, SF_BREAK_TRIGGER_ONLY ) ) pev->takedamage = DAMAGE_NO; else pev->takedamage = DAMAGE_YES; if (m_iClass) //LRC - might these additions cause problems? { pev->flags |= FL_MONSTER; pev->view_ofs = (pev->maxs + pev->mins) / 2; } if (m_iszWhenHit) //LRC - locus trigger { m_pHitProxy = GetClassPtr( (CPointEntity*)NULL ); } pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; m_angle = pev->angles.y; pev->angles.y = 0; m_iInitialHealth = pev->health; m_iInitialRenderAmt = pev->renderamt; m_iInitialRenderMode = pev->rendermode; // HACK: matGlass can receive decals, we need the client to know about this // so use class to store the material flag if ( m_Material == matGlass ) { pev->playerclass = 1; } SET_MODEL(ENT(pev), STRING(pev->model) );//set size and link into world. SetTouch(&CBreakable:: BreakTouch ); SetUse(&CBreakable:: BreakUse ); if ( FBitSet( pev->spawnflags, SF_BREAK_TRIGGER_ONLY ) ) // Only break on trigger SetTouch( NULL ); // Flag unbreakable glass as "worldbrush" so it will block ALL tracelines if ( !IsBreakable() && pev->rendermode != kRenderNormal ) pev->flags |= FL_WORLDBRUSH; if (m_iStyle >= 32) LIGHT_STYLE(m_iStyle, "z"); else if (m_iStyle <= -32) LIGHT_STYLE(-m_iStyle, "a"); }
void CFuncLight :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { m_hActivator = pActivator; if( IsLockedByMaster( )) return; if( m_iState == STATE_DEAD ) return; // lamp is broken if( useType == USE_TOGGLE ) { if( m_iState == STATE_OFF ) useType = USE_ON; else useType = USE_OFF; } if( useType == USE_ON ) { if( m_flDelay ) { // make flickering delay m_iState = STATE_TURN_ON; LIGHT_STYLE( m_iStyle, "mmamammmmammamamaaamammma" ); pev->frame = 0; // light texture is on SetThink( Flicker ); SetNextThink( m_flDelay ); } else { // instant enable m_iState = STATE_ON; LIGHT_STYLE( m_iStyle, "k" ); pev->frame = 0; // light texture is on UTIL_FireTargets( pev->target, this, this, USE_ON ); } } else if( useType == USE_OFF ) { LIGHT_STYLE( m_iStyle, "a" ); UTIL_FireTargets( pev->target, this, this, USE_OFF ); pev->frame = 1;// light texture is off m_iState = STATE_OFF; } else if( useType == USE_SET ) { // a script die (dramatic effect) Die(); } }
void CFuncWall :: Spawn( void ) { pev->angles = g_vecZero; pev->movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything pev->solid = SOLID_BSP; SET_MODEL( ENT(pev), STRING(pev->model) ); // If it can't move/go away, it's really part of the world if (!m_pMoveWith) //LRC pev->flags |= FL_WORLDBRUSH; //LRC if (m_iStyle >= 32) LIGHT_STYLE(m_iStyle, "a"); else if (m_iStyle <= -32) LIGHT_STYLE(-m_iStyle, "z"); }
void CWallHealth::Spawn() { Precache(); pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; UTIL_SetOrigin(this, pev->origin); // set size and link into world UTIL_SetSize(pev, pev->mins, pev->maxs); SET_MODEL(ENT(pev), STRING(pev->model)); m_iJuice = gSkillData.healthchargerCapacity; pev->frame = 0; //LRC if (m_iStyle >= 32) LIGHT_STYLE(m_iStyle, "a"); else if (m_iStyle <= -32) LIGHT_STYLE(-m_iStyle, "z"); }
void CLight :: SetStyle ( int iszPattern ) { if (m_iStyle < 32) // if it's using a global style, don't change it return; m_iszCurrentStyle = iszPattern; LIGHT_STYLE(m_iStyle, (char *)STRING( iszPattern )); }
void CLight :: Spawn( void ) { if (FStringNull(pev->targetname)) { // inert light REMOVE_ENTITY(ENT(pev)); return; } if (m_iStyle >= 32) { // CHANGE_METHOD(ENT(pev), em_use, light_use); if (FBitSet(pev->spawnflags, SF_LIGHT_START_OFF)) LIGHT_STYLE(m_iStyle, "a"); else if (m_iszPattern) LIGHT_STYLE(m_iStyle, (char *)STRING( m_iszPattern )); else LIGHT_STYLE(m_iStyle, "m"); } }
void CLight::__MAKE_VHOOK(Restart)() { if (m_iStyle >= 32) { if (m_iStartedOff) { pev->spawnflags |= SF_LIGHT_START_OFF; LIGHT_STYLE(m_iStyle, "a"); } else { pev->spawnflags &= ~SF_LIGHT_START_OFF; if (m_iszPattern) LIGHT_STYLE(m_iStyle, (char *)STRING(m_iszPattern)); else LIGHT_STYLE(m_iStyle, "m"); } } }
void CFuncWall :: Spawn( void ) { pev->flags |= FL_WORLDBRUSH; pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; m_iState = STATE_OFF; SetLocalAngles( g_vecZero ); SET_MODEL( edict(), GetModel() ); // LRC (support generic switchable texlight) if( m_iStyle >= 32 ) LIGHT_STYLE( m_iStyle, "a" ); else if( m_iStyle <= -32 ) LIGHT_STYLE( -m_iStyle, "z" ); if( m_hParent != NULL || FClassnameIs( pev, "func_wall_toggle" )) m_pUserData = WorldPhysic->CreateKinematicBodyFromEntity( this ); else m_pUserData = WorldPhysic->CreateStaticBodyFromEntity( this ); }
void CFuncWall :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { if ( ShouldToggle( useType, (int)(pev->frame)) ) { pev->frame = 1 - pev->frame; if (m_iStyle >= 32) { if (pev->frame) LIGHT_STYLE(m_iStyle, "z"); else LIGHT_STYLE(m_iStyle, "a"); } else if (m_iStyle <= -32) { if (pev->frame) LIGHT_STYLE(-m_iStyle, "a"); else LIGHT_STYLE(-m_iStyle, "z"); } } }
void CLight::__MAKE_VHOOK(Spawn)() { // inert light if (FStringNull(pev->targetname)) { REMOVE_ENTITY(ENT(pev)); return; } m_iStartedOff = (pev->spawnflags & SF_LIGHT_START_OFF) != 0; if (m_iStyle >= 32) { if (pev->spawnflags & SF_LIGHT_START_OFF) LIGHT_STYLE(m_iStyle, "a"); else if (m_iszPattern) LIGHT_STYLE(m_iStyle, (char *)STRING(m_iszPattern)); else LIGHT_STYLE(m_iStyle, "m"); } }
void CLight :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { if (m_iStyle >= 32) { if ( !ShouldToggle( useType, !FBitSet(pev->spawnflags, SF_LIGHT_START_OFF) ) ) return; if (FBitSet(pev->spawnflags, SF_LIGHT_START_OFF)) { if (m_iszPattern) LIGHT_STYLE(m_iStyle, (char *)STRING( m_iszPattern )); else LIGHT_STYLE(m_iStyle, "m"); ClearBits(pev->spawnflags, SF_LIGHT_START_OFF); } else { LIGHT_STYLE(m_iStyle, "a"); SetBits(pev->spawnflags, SF_LIGHT_START_OFF); } } }
void CFuncLight :: Flicker( void ) { if( m_iState == STATE_TURN_ON ) { LIGHT_STYLE( m_iStyle, "k" ); UTIL_FireTargets( pev->target, this, this, USE_ON ); m_iState = STATE_ON; DontThink(); return; } if( m_iFlickerMode == 1 ) { pev->frame = 1; LIGHT_STYLE( m_iStyle, "a" ); SetThink( NULL ); return; } if( m_iFlickerMode == 2 ) { switch( RANDOM_LONG( 0, 3 )) { case 0: LIGHT_STYLE( m_iStyle, "abcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); break; case 1: LIGHT_STYLE( m_iStyle, "acaaabaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); break; case 2: LIGHT_STYLE( m_iStyle, "aaafbaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); break; case 3: LIGHT_STYLE( m_iStyle, "aaaaaaaaaaaaagaaaaaaaaacaaaacaaaa" ); break; } m_flNextFlickerTime = RANDOM_FLOAT( 0.5f, 10.0f ); UTIL_Sparks( m_vecLastDmgPoint ); switch( RANDOM_LONG( 0, 2 )) { case 0: EMIT_SOUND( edict(), CHAN_VOICE, "buttons/spark1.wav", 0.4, ATTN_IDLE ); break; case 1: EMIT_SOUND( edict(), CHAN_VOICE, "buttons/spark2.wav", 0.3, ATTN_IDLE ); break; case 2: EMIT_SOUND( edict(), CHAN_VOICE, "buttons/spark3.wav", 0.35, ATTN_IDLE ); break; } if( m_flNextFlickerTime > 6.5f ) m_iFlickerMode = 1; // stop sparking } SetNextThink( m_flNextFlickerTime ); }
void CFuncLight :: Die( void ) { // lamp is random choose die style if( m_iState == STATE_OFF ) { pev->frame = 1; // light texture is off LIGHT_STYLE( m_iStyle, "a" ); DontThink(); } else { // simple randomization m_iFlickerMode = RANDOM_LONG( 1, 2 ); SetThink( Flicker ); SetNextThink( 0.1f + RANDOM_LONG( 0.1f, 0.2f )); } m_iState = STATE_DEAD; pev->health = 0; pev->takedamage = DAMAGE_NO; UTIL_FireTargets( pev->target, this, this, USE_OFF ); switch( RANDOM_LONG( 0, 1 )) { case 0: EMIT_SOUND( edict(), CHAN_VOICE, "debris/bustglass1.wav", 0.7, ATTN_IDLE ); break; case 1: EMIT_SOUND( edict(), CHAN_VOICE, "debris/bustglass2.wav", 0.8, ATTN_IDLE ); break; } Vector vecSpot = GetAbsOrigin() + (pev->mins + pev->maxs) * 0.5f; MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot ); WRITE_BYTE( TE_BREAKMODEL ); WRITE_COORD( vecSpot.x ); WRITE_COORD( vecSpot.y ); WRITE_COORD( vecSpot.z ); WRITE_COORD( pev->size.x ); WRITE_COORD( pev->size.y ); WRITE_COORD( pev->size.z ); WRITE_COORD( 0 ); WRITE_COORD( 0 ); WRITE_COORD( 0 ); WRITE_BYTE( 10 ); WRITE_SHORT( m_idShard ); WRITE_BYTE( 0 ); WRITE_BYTE( 25 ); WRITE_BYTE( BREAK_GLASS ); MESSAGE_END(); }
void CLight::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { if (m_iStyle >= 32) { if (!ShouldToggle(useType, !(pev->spawnflags & SF_LIGHT_START_OFF))) return; if (pev->spawnflags & SF_LIGHT_START_OFF) { if (m_iszPattern) LIGHT_STYLE(m_iStyle, (char *)STRING(m_iszPattern)); else LIGHT_STYLE(m_iStyle, "m"); pev->spawnflags &= ~SF_LIGHT_START_OFF; } else { LIGHT_STYLE(m_iStyle, "a"); pev->spawnflags |= SF_LIGHT_START_OFF; } } }
void CWallHealth::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Make sure that we have a caller if (!pActivator) return; // if it's not a player, ignore if (!pActivator->IsPlayer()) return; // if there is no juice left, turn it off if (m_iJuice <= 0) { pev->frame = 1; //LRC if (m_iStyle >= 32) LIGHT_STYLE(m_iStyle, "z"); else if (m_iStyle <= -32) LIGHT_STYLE(-m_iStyle, "a"); Off(); } CBasePlayer *pPlayer = (CBasePlayer *)pActivator; // if the player doesn't have the suit, or there is no juice left, make the deny noise if ((m_iJuice <= 0) || (!(pPlayer->m_iHideHUD & ITEM_SUIT))) { if (m_flSoundTime <= gpGlobals->time) { m_flSoundTime = gpGlobals->time + 0.62; EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshotno1.wav", 1.0, ATTN_NORM); } return; } SetNextThink(0.25); SetThink(&CWallHealth::Off); // Time to recharge yet? if (m_flNextCharge >= gpGlobals->time) return; // Play the on sound or the looping charging sound if (!m_iOn) { m_iOn++; EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM); m_flSoundTime = 0.56 + gpGlobals->time; } if ((m_iOn == 1) && (m_flSoundTime <= gpGlobals->time)) { m_iOn++; EMIT_SOUND(ENT(pev), CHAN_STATIC, "items/medcharge4.wav", 1.0, ATTN_NORM); } // charge the player if (pActivator->TakeHealth(1, DMG_GENERIC)) { m_iJuice--; } // govern the rate of charge m_flNextCharge = gpGlobals->time + 0.1; }
void CWorld :: Precache( void ) { //LRC - set up the world lists g_pWorld = this; m_pAssistLink = NULL; m_pFirstAlias = NULL; // ALERT(at_console, "Clearing AssistList\n"); g_pLastSpawn = NULL; #if 1 CVAR_SET_STRING("sv_gravity", "800"); // 67ft/sec CVAR_SET_STRING("sv_stepsize", "18"); #else CVAR_SET_STRING("sv_gravity", "384"); // 32ft/sec CVAR_SET_STRING("sv_stepsize", "24"); #endif CVAR_SET_STRING("room_type", "0");// clear DSP // Set up game rules if (g_pGameRules) { delete g_pGameRules; } g_pGameRules = InstallGameRules( ); //!!!UNDONE why is there so much Spawn code in the Precache function? I'll just keep it here ///!!!LATER - do we want a sound ent in deathmatch? (sjb) //pSoundEnt = CBaseEntity::Create( "soundent", g_vecZero, g_vecZero, edict() ); pSoundEnt = GetClassPtr( ( CSoundEnt *)NULL ); pSoundEnt->Spawn(); if ( !pSoundEnt ) { ALERT ( at_debug, "**COULD NOT CREATE SOUNDENT**\n" ); } InitBodyQue(); // init sentence group playback stuff from sentences.txt. // ok to call this multiple times, calls after first are ignored. SENTENCEG_Init(); // init texture type array from materials.txt TEXTURETYPE_Init(); // the area based ambient sounds MUST be the first precache_sounds // player precaches W_Precache (); // get weapon precaches ClientPrecache(); // sounds used from C physics code PRECACHE_SOUND("common/null.wav"); // clears sound channels PRECACHE_SOUND( "items/suitchargeok1.wav" );//!!! temporary sound for respawning weapons. PRECACHE_SOUND( "items/gunpickup2.wav" );// player picks up a gun. PRECACHE_SOUND( "common/bodydrop3.wav" );// dead bodies hitting the ground (animation events) PRECACHE_SOUND( "common/bodydrop4.wav" ); g_Language = (int)CVAR_GET_FLOAT( "sv_language" ); if ( g_Language == LANGUAGE_GERMAN ) { PRECACHE_MODEL( "models/germangibs.mdl" ); } else { PRECACHE_MODEL( "models/hgibs.mdl" ); PRECACHE_MODEL( "models/agibs.mdl" ); } PRECACHE_SOUND ("weapons/ric1.wav"); PRECACHE_SOUND ("weapons/ric2.wav"); PRECACHE_SOUND ("weapons/ric3.wav"); PRECACHE_SOUND ("weapons/ric4.wav"); PRECACHE_SOUND ("weapons/ric5.wav"); PRECACHE_MODEL( "sprites/null.spr" ); //LRC // // Setup light animation tables. 'a' is total darkness, 'z' is maxbright. // int i; // 0 normal for (i = 0; i <= 13; i++) { LIGHT_STYLE(i, (char*)STRING(GetStdLightStyle(i))); } // styles 32-62 are assigned by the light program for switchable lights // 63 testing LIGHT_STYLE(63, "a"); for (i = 0; i < ARRAYSIZE(gDecals); i++ ) gDecals[i].index = DECAL_INDEX( gDecals[i].name ); // init the WorldGraph. WorldGraph.InitGraph(); // make sure the .NOD file is newer than the .BSP file. if ( !WorldGraph.CheckNODFile ( ( char * )STRING( gpGlobals->mapname ) ) ) {// NOD file is not present, or is older than the BSP file. WorldGraph.AllocNodes (); } else {// Load the node graph for this level if ( !WorldGraph.FLoadGraph ( (char *)STRING( gpGlobals->mapname ) ) ) {// couldn't load, so alloc and prepare to build a graph. ALERT ( at_debug, "*Error opening .NOD file\n" ); WorldGraph.AllocNodes (); } else { ALERT ( at_debug, "\n*Graph Loaded!\n" ); } } if ( pev->speed > 0 ) CVAR_SET_FLOAT( "sv_zmax", pev->speed ); else CVAR_SET_FLOAT( "sv_zmax", 4096 ); if ( pev->netname ) { ALERT( at_aiconsole, "Chapter title: %s\n", STRING(pev->netname) ); CBaseEntity *pEntity = CBaseEntity::Create( "env_message", g_vecZero, g_vecZero, NULL ); if ( pEntity ) { pEntity->SetThink(&CWorld::SUB_CallUseToggle ); pEntity->pev->message = pev->netname; pev->netname = 0; pEntity->SetNextThink( 0.3 ); pEntity->pev->spawnflags = SF_MESSAGE_ONCE; } } if ( pev->spawnflags & SF_WORLD_DARK ) CVAR_SET_FLOAT( "v_dark", 1.0 ); else CVAR_SET_FLOAT( "v_dark", 0.0 ); if ( pev->spawnflags & SF_WORLD_TITLE ) gDisplayTitle = TRUE; // display the game title if this key is set else gDisplayTitle = FALSE; if ( pev->spawnflags & SF_WORLD_FORCETEAM ) { CVAR_SET_FLOAT( "mp_defaultteam", 1 ); } else { CVAR_SET_FLOAT( "mp_defaultteam", 0 ); } }
static qboolean GL_LightPoint( vec3_t origin, vec3_t color ) { bsp_t *bsp = gl_static.world.cache; mface_t *surf; int s, t, i; byte *lightmap; byte *b1, *b2, *b3, *b4; int fracu, fracv; int w1, w2, w3, w4; byte temp[3]; int smax, tmax, size; lightstyle_t *style; vec3_t point; if( !bsp || !bsp->lightmap ) { return qfalse; } point[0] = origin[0]; point[1] = origin[1]; point[2] = origin[2] - 8192; surf = BSP_LightPoint( bsp->nodes, origin, point, &s, &t ); if( !surf ) { return qfalse; } fracu = s & 15; fracv = t & 15; w1 = ( 16 - fracu ) * ( 16 - fracv ); w2 = fracu * ( 16 - fracv ); w3 = fracu * fracv; w4 = ( 16 - fracu ) * fracv; s >>= 4; t >>= 4; smax = S_MAX( surf ); tmax = T_MAX( surf ); size = smax * tmax * 3; VectorClear( color ); lightmap = surf->lightmap; for( i = 0; i < surf->numstyles; i++ ) { b1 = &lightmap[3 * ( ( t + 0 ) * smax + ( s + 0 ) )]; b2 = &lightmap[3 * ( ( t + 0 ) * smax + ( s + 1 ) )]; b3 = &lightmap[3 * ( ( t + 1 ) * smax + ( s + 1 ) )]; b4 = &lightmap[3 * ( ( t + 1 ) * smax + ( s + 0 ) )]; temp[0] = ( w1 * b1[0] + w2 * b2[0] + w3 * b3[0] + w4 * b4[0] ) >> 8; temp[1] = ( w1 * b1[1] + w2 * b2[1] + w3 * b3[1] + w4 * b4[1] ) >> 8; temp[2] = ( w1 * b1[2] + w2 * b2[2] + w3 * b3[2] + w4 * b4[2] ) >> 8; style = LIGHT_STYLE( surf, i ); color[0] += temp[0] * style->rgb[0]; color[1] += temp[1] * style->rgb[1]; color[2] += temp[2] * style->rgb[2]; lightmap += size; } GL_AdjustColor( color ); return qtrue; }
void CWorld :: Precache( void ) { g_pLastSpawn = NULL; CVAR_SET_STRING("sv_gravity", "800"); // 67ft/sec CVAR_SET_STRING("sv_stepsize", "18"); CVAR_SET_STRING("room_type", "0"); // clear DSP // Create all the arenas for (int i = 0; i < MAX_ARENAS; i++) { g_pArenaList[i] = GetClassPtr( ( CDiscArena *)NULL ); g_pArenaList[i]->Spawn(); } // Set up game rules if (g_pGameRules) { delete g_pGameRules; } g_pGameRules = InstallGameRules( ); //!!!UNDONE why is there so much Spawn code in the Precache function? I'll just keep it here ///!!!LATER - do we want a sound ent in deathmatch? (sjb) //pSoundEnt = CBaseEntity::Create( "soundent", g_vecZero, g_vecZero, edict() ); pSoundEnt = GetClassPtr( ( CSoundEnt *)NULL ); pSoundEnt->Spawn(); if ( !pSoundEnt ) { ALERT ( at_console, "**COULD NOT CREATE SOUNDENT**\n" ); } InitBodyQue(); // init sentence group playback stuff from sentences.txt. // ok to call this multiple times, calls after first are ignored. SENTENCEG_Init(); // init texture type array from materials.txt TEXTURETYPE_Init(); // the area based ambient sounds MUST be the first precache_sounds // player precaches W_Precache (); // get weapon precaches ClientPrecache(); // sounds used from C physics code PRECACHE_SOUND("common/null.wav"); // clears sound channels PRECACHE_SOUND( "items/suitchargeok1.wav" );//!!! temporary sound for respawning weapons. PRECACHE_SOUND( "items/gunpickup2.wav" );// player picks up a gun. PRECACHE_SOUND( "common/bodydrop3.wav" );// dead bodies hitting the ground (animation events) PRECACHE_SOUND( "common/bodydrop4.wav" ); PRECACHE_SOUND( "r_tele1.wav" ); // respawn sound PRECACHE_SOUND( "scream1.wav" ); // falling scream sound PRECACHE_SOUND( "scream2.wav" ); // falling scream sound PRECACHE_SOUND( "scream3.wav" ); // falling scream sound PRECACHE_SOUND( "decap.wav" ); // decapitation sound PRECACHE_SOUND( "shatter.wav" ); // freeze decapitation sound PRECACHE_MODEL( "models/head.mdl" ); // head g_Language = (int)CVAR_GET_FLOAT( "sv_language" ); if ( g_Language == LANGUAGE_GERMAN ) { PRECACHE_MODEL( "models/germangibs.mdl" ); } else { PRECACHE_MODEL( "models/hgibs.mdl" ); PRECACHE_MODEL( "models/agibs.mdl" ); } PRECACHE_SOUND ("weapons/ric1.wav"); PRECACHE_SOUND ("weapons/ric2.wav"); PRECACHE_SOUND ("weapons/ric3.wav"); PRECACHE_SOUND ("weapons/ric4.wav"); PRECACHE_SOUND ("weapons/ric5.wav"); // // Setup light animation tables. 'a' is total darkness, 'z' is maxbright. // // 0 normal LIGHT_STYLE(0, "m"); // 1 FLICKER (first variety) LIGHT_STYLE(1, "mmnmmommommnonmmonqnmmo"); // 2 SLOW STRONG PULSE LIGHT_STYLE(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba"); // 3 CANDLE (first variety) LIGHT_STYLE(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg"); // 4 FAST STROBE LIGHT_STYLE(4, "mamamamamama"); // 5 GENTLE PULSE 1 LIGHT_STYLE(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj"); // 6 FLICKER (second variety) LIGHT_STYLE(6, "nmonqnmomnmomomno"); // 7 CANDLE (second variety) LIGHT_STYLE(7, "mmmaaaabcdefgmmmmaaaammmaamm"); // 8 CANDLE (third variety) LIGHT_STYLE(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa"); // 9 SLOW STROBE (fourth variety) LIGHT_STYLE(9, "aaaaaaaazzzzzzzz"); // 10 FLUORESCENT FLICKER LIGHT_STYLE(10, "mmamammmmammamamaaamammma"); // 11 SLOW PULSE NOT FADE TO BLACK LIGHT_STYLE(11, "abcdefghijklmnopqrrqponmlkjihgfedcba"); // 12 UNDERWATER LIGHT MUTATION // this light only distorts the lightmap - no contribution // is made to the brightness of affected surfaces LIGHT_STYLE(12, "mmnnmmnnnmmnn"); // styles 32-62 are assigned by the light program for switchable lights // 63 testing LIGHT_STYLE(63, "a"); for ( i = 0; i < ARRAYSIZE(gDecals); i++ ) gDecals[i].index = DECAL_INDEX( gDecals[i].name ); // init the WorldGraph. WorldGraph.InitGraph(); // make sure the .NOD file is newer than the .BSP file. if ( !WorldGraph.CheckNODFile ( ( char * )STRING( gpGlobals->mapname ) ) ) {// NOD file is not present, or is older than the BSP file. WorldGraph.AllocNodes (); } else {// Load the node graph for this level if ( !WorldGraph.FLoadGraph ( (char *)STRING( gpGlobals->mapname ) ) ) {// couldn't load, so alloc and prepare to build a graph. ALERT ( at_console, "*Error opening .NOD file\n" ); WorldGraph.AllocNodes (); } else { ALERT ( at_console, "\n*Graph Loaded!\n" ); } } if ( pev->speed > 0 ) CVAR_SET_FLOAT( "sv_zmax", pev->speed ); else CVAR_SET_FLOAT( "sv_zmax", 4096 ); if ( pev->netname ) { ALERT( at_aiconsole, "Chapter title: %s\n", STRING(pev->netname) ); CBaseEntity *pEntity = CBaseEntity::Create( "env_message", g_vecZero, g_vecZero, NULL ); if ( pEntity ) { pEntity->SetThink( SUB_CallUseToggle ); pEntity->pev->message = pev->netname; pev->netname = 0; pEntity->pev->nextthink = gpGlobals->time + 0.3; pEntity->pev->spawnflags = SF_MESSAGE_ONCE; } } if ( pev->spawnflags & SF_WORLD_DARK ) CVAR_SET_FLOAT( "v_dark", 1.0 ); else CVAR_SET_FLOAT( "v_dark", 0.0 ); if ( pev->spawnflags & SF_WORLD_TITLE ) gDisplayTitle = TRUE; // display the game title if this key is set else gDisplayTitle = FALSE; if ( pev->spawnflags & SF_WORLD_FORCETEAM ) { CVAR_SET_FLOAT( "mp_defaultteam", 1 ); } else { CVAR_SET_FLOAT( "mp_defaultteam", 0 ); } // Discwar if ( g_iPlayersPerTeam < 1 ) g_iPlayersPerTeam = CVAR_GET_FLOAT("rc_playersperteam"); }
void CBreakable::Die( void ) { Vector vecSpot;// shard origin Vector vecVelocity;// shard velocity CBaseEntity *pEntity = NULL; char cFlag = 0; int pitch; float fvol; pitch = 95 + RANDOM_LONG(0,29); if (pitch > 97 && pitch < 103) pitch = 100; // The more negative pev->health, the louder // the sound should be. fvol = RANDOM_FLOAT(0.85, 1.0) + (fabs(pev->health) / 100.0); if (fvol > 1.0) fvol = 1.0; switch (m_Material) { case matGlass: switch ( RANDOM_LONG(0,1) ) { case 0: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustglass1.wav", fvol, ATTN_NORM, 0, pitch); break; case 1: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustglass2.wav", fvol, ATTN_NORM, 0, pitch); break; } cFlag = BREAK_GLASS; break; case matWood: switch ( RANDOM_LONG(0,1) ) { case 0: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustcrate1.wav", fvol, ATTN_NORM, 0, pitch); break; case 1: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustcrate2.wav", fvol, ATTN_NORM, 0, pitch); break; } cFlag = BREAK_WOOD; break; case matComputer: case matMetal: switch ( RANDOM_LONG(0,1) ) { case 0: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustmetal1.wav", fvol, ATTN_NORM, 0, pitch); break; case 1: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustmetal2.wav", fvol, ATTN_NORM, 0, pitch); break; } cFlag = BREAK_METAL; break; case matFlesh: switch ( RANDOM_LONG(0,1) ) { case 0: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustflesh1.wav", fvol, ATTN_NORM, 0, pitch); break; case 1: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustflesh2.wav", fvol, ATTN_NORM, 0, pitch); break; } cFlag = BREAK_FLESH; break; case matRocks: case matCinderBlock: switch ( RANDOM_LONG(0,1) ) { case 0: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustconcrete1.wav", fvol, ATTN_NORM, 0, pitch); break; case 1: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustconcrete2.wav", fvol, ATTN_NORM, 0, pitch); break; } cFlag = BREAK_CONCRETE; break; case matCeilingTile: EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "debris/bustceiling.wav", fvol, ATTN_NORM, 0, pitch); break; } if (m_Explosion == expDirected) vecVelocity = g_vecAttackDir * 200; else { vecVelocity.x = 0; vecVelocity.y = 0; vecVelocity.z = 0; } vecSpot = pev->origin + (pev->mins + pev->maxs) * 0.5; MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot ); WRITE_BYTE( TE_BREAKMODEL); // position WRITE_COORD( vecSpot.x ); WRITE_COORD( vecSpot.y ); WRITE_COORD( vecSpot.z ); // size WRITE_COORD( pev->size.x); WRITE_COORD( pev->size.y); WRITE_COORD( pev->size.z); // velocity WRITE_COORD( vecVelocity.x ); WRITE_COORD( vecVelocity.y ); WRITE_COORD( vecVelocity.z ); // randomization WRITE_BYTE( 10 ); // Model WRITE_SHORT( m_idShard ); //model id# // # of shards WRITE_BYTE( 0 ); // let client decide // duration WRITE_BYTE( 25 );// 2.5 seconds // flags WRITE_BYTE( cFlag ); MESSAGE_END(); float size = pev->size.x; if ( size < pev->size.y ) size = pev->size.y; if ( size < pev->size.z ) size = pev->size.z; // !!! HACK This should work! // Build a box above the entity that looks like an 8 pixel high sheet Vector mins = pev->absmin; Vector maxs = pev->absmax; mins.z = pev->absmax.z; maxs.z += 8; // BUGBUG -- can only find 256 entities on a breakable -- should be enough CBaseEntity *pList[256]; int count = UTIL_EntitiesInBox( pList, 256, mins, maxs, FL_ONGROUND ); if ( count ) { for ( int i = 0; i < count; i++ ) { ClearBits( pList[i]->pev->flags, FL_ONGROUND ); pList[i]->pev->groundentity = NULL; } } // If I'm getting removed, don't fire something that could fire myself if (!m_iRespawnTime) pev->targetname = 0; pev->solid = SOLID_NOT; pev->effects |= EF_NODRAW; pev->takedamage = DAMAGE_NO; if (m_iStyle >= 32) LIGHT_STYLE(m_iStyle, "a"); else if (m_iStyle <= -32) LIGHT_STYLE(-m_iStyle, "z"); // Fire targets on break SUB_UseTargets( NULL, USE_TOGGLE, 0 ); if (m_iRespawnTime == -1) { // ALERT(at_debug,"Waiting for respawn trigger\n"); SetUse(&CBreakable:: RespawnUse ); } else if (m_iRespawnTime) { // ALERT(at_debug,"Respawning in %d secs\n",m_iRespawnTime); SetThink(&CBreakable:: RespawnThink ); SetNextThink( m_iRespawnTime ); } else { // ALERT(at_debug,"No respawn\n"); //tidy up if (m_pHitProxy) { m_pHitProxy->SetThink(&CBreakable::SUB_Remove ); m_pHitProxy->SetNextThink( 0.1 ); m_pHitProxy = NULL; } SetThink(&CBreakable::SUB_Remove ); SetNextThink( 0.1 ); // ALERT(at_console, "Set SUB_Remove\n"); } if ( m_iszSpawnObject ) CBaseEntity::Create( (char *)STRING(m_iszSpawnObject), VecBModelOrigin(pev), pev->angles, edict() ); if ( Explodable() ) { ExplosionCreate( Center(), pev->angles, edict(), ExplosionMagnitude(), TRUE ); } }