antibiotik
Житель форума
Дата регистрации : Mar 2012
Проживает : (void)
Сообщений : 151
Рейтинг
[кратко]
Пользователи:
-6.4 (5 )
Нарушения:
0.0 (? )
Сообщения:
0.0 (Метки )
Регистрация:
8.3
А не поможете реализовать огонь с помощью партиклей?
Вот на всякий случай изначальный код:
C++ Source Code:
12 #define FIRE_SPRITE_NAME "particles/fire.aur"
13 #define BURNIND_SOUND_NAME "ambience/burning1.wav"
15 // must match definition in modelgen.h
22 // TODO: shorten these?
36 class CPropExplosion : public CGrenade
39 void Precache( void );
40 int BloodColor( void ) { return DONT_BLEED; };
42 void EXPORT PropThink( void );
45 void StartExplode( void );
47 float CalculationSpriteScale( );
49 void KeyValue( KeyValueData *pkvd );
51 virtual int Save( CSave &save );
52 virtual int Restore( CRestore &restore );
54 static TYPEDESCRIPTION m_SaveData[];
56 string_t m_iszParentName;
60 float m_explosiontime;
65 LINK_ENTITY_TO_CLASS( prop_explosion, CPropExplosion );
67 TYPEDESCRIPTION CPropExplosion::m_SaveData[] =
69 DEFINE_FIELD( CPropExplosion, m_startHealth, FIELD_INTEGER ),
70 DEFINE_FIELD( CPropExplosion, m_firetime, FIELD_FLOAT ),
71 DEFINE_FIELD( CPropExplosion, m_explosiontime, FIELD_FLOAT ),
72 DEFINE_FIELD( CPropExplosion, m_dmgradius, FIELD_FLOAT ),
73 DEFINE_FIELD( CPropExplosion, m_isfire, FIELD_INTEGER ),
76 IMPLEMENT_SAVERESTORE( CPropExplosion, CGrenade );
78 void CPropExplosion :: KeyValue( KeyValueData *pkvd )
80 if (FStrEq(pkvd->szKeyName, "health" ))//skin is used for content type
82 m_startHealth = atoi(pkvd->szValue);
83 pkvd->fHandled = TRUE;
85 else if (FStrEq(pkvd->szKeyName, "firetime" ))
87 m_firetime = atof(pkvd->szValue);
88 pkvd->fHandled = TRUE;
90 else if (FStrEq(pkvd->szKeyName, "damageradius" ))
92 m_dmgradius = atof(pkvd->szValue);
93 pkvd->fHandled = TRUE;
96 CGrenade::KeyValue( pkvd );
99 void CPropExplosion :: Spawn( void )
103 pev->movetype = MOVETYPE_FLY;
104 pev->solid = SOLID_BBOX;
106 SET_MODEL( ENT(pev), STRING(pev->model) );
111 ExtractBbox( pev->sequence, mins, maxs );
113 UTIL_SetSize(pev, mins, maxs ); //Whi it is not using for other entities ?
114 UTIL_SetOrigin(this , pev->origin );
116 DROP_TO_FLOOR( edict() );
118 pev->nextthink = gpGlobals->time + 0.1;
120 // SetTouch( PropTouch ); //maybe later
121 SetThink( PropThink );
123 //If not defined, add standart value
141 pev->flags |= FL_MONSTER;
142 pev->takedamage = DAMAGE_YES;
143 pev->health = m_startHealth;
147 void CPropExplosion::Precache( void )
149 PRECACHE_MODEL((char *)STRING(pev->model));
150 PRECACHE_MODEL( FIRE_SPRITE_NAME );
151 PRECACHE_SOUND( BURNIND_SOUND_NAME );
154 void CPropExplosion::PropThink( void )
156 if ( pev->health < m_startHealth )
160 m_explosiontime = gpGlobals->time + m_firetime;
164 if ( m_explosiontime < gpGlobals->time )
175 pev->nextthink = gpGlobals->time + 0.1;
178 void CPropExplosion::RunFire( void )
182 CSprite *pSprite = CSprite::SpriteCreate( FIRE_SPRITE_NAME, pev->origin, TRUE );
184 pSprite->AnimateAndDie( m_firetime );
185 pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation );
186 pSprite->SetScale( CalculationSpriteScale() );
188 EMIT_SOUND(ENT(pev), CHAN_WEAPON, BURNIND_SOUND_NAME, 1, ATTN_NORM);
194 void CPropExplosion::StartExplode( void )
196 STOP_SOUND( ENT(pev), CHAN_WEAPON, BURNIND_SOUND_NAME );
198 UTIL_ScreenShake( pev->origin, 16, 200, 5, m_dmgradius );
200 ExplosionCreate( pev->origin, pev->angles, edict(), (int )m_dmgradius, true );
205 float CPropExplosion::CalculationSpriteScale( )
207 dsprite_t *szSprite = NULL;
215 szSprite = (dsprite_t *)g_engfuncs.pfnLoadFileForMe( FIRE_SPRITE_NAME, NULL );
219 ALERT( at_aiconsole,"Couldn't open fire sprites !\n" );
224 SpriteX = szSprite->width;
225 SpriteY = szSprite->height;
227 g_engfuncs.pfnFreeFile( szSprite );
232 ExtractBbox( pev->sequence, mins, maxs );
234 ModelX = maxs.x - mins.x;
235 ModelY = maxs.z - mins.z;
237 float FullSprSizeX = ModelX * 3; //pixel to unit ~ 2 ???
238 float FullSprSizeY = ModelY * 3;
240 float ScaleX = FullSprSizeX / SpriteX;
241 float ScaleY = FullSprSizeY / SpriteY;
243 float Averagescale = ( ScaleX + ScaleY ) / 2;
247 ALERT( at_console, "Sprite: x = %f, y = %f\n", SpriteX, SpriteY );
248 ALERT( at_console, "Model: x = %f, y = %f\n", ModelX, ModelY );
250 ALERT( at_console, "Full Sprite size: x = %f, y = %f\n", SpriteX * Averagescale, SpriteY * Averagescale );
251 ALERT( at_console, "Scale: x = %f, y = %f\n", ScaleX, ScaleY );
252 ALERT( at_console, "Average Scale: %f", Averagescale );
Сообщить модератору | IP: Записан
Сообщение: 99479