/*** * * Copyright (c) 1996-2001, Valve LLC. All rights reserved. * * This product contains software technology licensed from Id * Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. * All Rights Reserved. * * This source code contains proprietary and confidential information of * Valve LLC and its suppliers. Access to this code is restricted to * persons who have executed a written SDK license with Valve. Any access, * use or distribution of this code by or to any unlicensed person is illegal. * ****/ #include "extdll.h" #include "util.h" #include "cbase.h" #include "monsters.h" #include "schedule.h" #include "nodes.h" #include "effects.h" #include "decals.h" #include "soundent.h" #include "game.h" #include "flame.h" #include "weapons.h" #include "gamerules.h" LINK_ENTITY_TO_CLASS( einar_flame, CEinarFlameRocket ); CEinarFlameRocket *CEinarFlameRocket::FlameCreate( const Vector &pOrigin, const Vector &pAngles, edict_t *pevOwner ) { // Create a new entity with CEinarFlameRocket private data CEinarFlameRocket *pFlame = GetClassPtr( (CEinarFlameRocket *)NULL ); UTIL_SetOrigin( pFlame->pev, pOrigin ); pFlame->pev->angles = pAngles; pFlame->pev->owner = pevOwner; pFlame->Spawn(); return pFlame; } void CEinarFlameRocket::Spawn() { Precache(); pev->movetype = MOVETYPE_FLY; pev->solid = SOLID_BBOX; pev->rendermode = kRenderTransTexture; pev->renderamt = 0; pev->effects |= EF_DIMLIGHT; SET_MODEL( ENT( pev ), "sprites/fthrow.spr" ); UTIL_SetSize( pev, g_vecZero, g_vecZero ); UTIL_SetOrigin( pev, pev->origin ); pev->classname = MAKE_STRING( "einar_flame" ); pev->speed = g_pGameRules->IsMultiplayer() ? 500 : 400; SetTouch( &CEinarFlameRocket::FlameTouch ); SetThink( &CBaseEntity::SUB_Remove ); pev->nextthink = gpGlobals->time + 1.1f; UTIL_MakeVectors( pev->angles ); pev->velocity = gpGlobals->v_forward * pev->speed; pev->gravity = 0; int ownerIndex = 0; if (pev->owner && (pev->owner->v.flags & FL_CLIENT)) { ownerIndex = ENTINDEX(pev->owner); } MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE( TE_PROJECTILE ); WRITE_COORD( pev->origin.x ); WRITE_COORD( pev->origin.y ); WRITE_COORD( pev->origin.z ); WRITE_COORD( pev->velocity.x ); WRITE_COORD( pev->velocity.y ); WRITE_COORD( pev->velocity.z ); WRITE_SHORT( pev->modelindex ); WRITE_BYTE( 1 ); WRITE_BYTE( ownerIndex ); MESSAGE_END(); } void CEinarFlameRocket::FlameTouch( CBaseEntity *pOther ) { if( pev->watertype != CONTENT_WATER && pOther->pev->takedamage ) { TraceResult tr = UTIL_GetGlobalTrace(); entvars_t *pevOwner; if( pev->owner != 0 ) { pevOwner = &pev->owner->v; } else { pevOwner = 0; } pev->dmg = g_pGameRules->IsMultiplayer() ? gSkillData.plrDmgEgonWide : ( gSkillData.plrDmgEgonNarrow * 1.5f ); pev->dmg *= 2.0f; ClearMultiDamage(); pOther->TraceAttack(pevOwner, pev->dmg, pev->velocity.Normalize(), &tr, DMG_BURN ); ApplyMultiDamage( pevOwner, pevOwner ); } pev->solid = SOLID_NOT; pev->takedamage = 0; pev->velocity = g_vecZero; pev->deadflag = DEAD_DEAD; UTIL_Remove( this ); } void CEinarFlameRocket::Precache() { PRECACHE_MODEL( "sprites/fthrow.spr" ); }