/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */ 352 %{ #include "StdH.h" #include "ModelsMP/CutSequences/CrateBus/CrateBus.h" #include "ModelsMP/Enemies/Mental/Mental.h" %} uses "EntitiesMP/SpawnerProjectile"; uses "EntitiesMP/EnemyBase"; uses "EntitiesMP/BasicEffects"; %{ INDEX _aiLeftAnimations[] = { MENTAL_ANIM_LEFTWAVE01, MENTAL_ANIM_LEFTWAVE02, MENTAL_ANIM_LEFTWAVE03, MENTAL_ANIM_LEFTWAVE04, MENTAL_ANIM_LEFTWAVE05, MENTAL_ANIM_LEFTWAVE06 }; INDEX _aiRightAnimations[] = { MENTAL_ANIM_RIGHTWAVE01, MENTAL_ANIM_RIGHTWAVE02, MENTAL_ANIM_RIGHTWAVE03, MENTAL_ANIM_RIGHTWAVE04, MENTAL_ANIM_RIGHTWAVE05, MENTAL_ANIM_RIGHTWAVE06, MENTAL_ANIM_RIGHTWAVE07, MENTAL_ANIM_RIGHTWAVE08 }; CAutoPrecacheSound m_aps; CAutoPrecacheTexture m_apt; #define CT_BIGHEADS 24 %} class CCrateBus: CMovableModelEntity { name "CrateBus"; thumbnail "Thumbnails\\Mental.tbn"; features "IsTargetable", "HasName", "IsImportant"; properties: 1 BOOL m_bActive "Active" = TRUE, 2 FLOAT m_fExplosionStretch "Explosion Stretch" 'E' = 1.0f, 3 FLOAT m_tmDeath = 0.0f, 4 CTString m_strName "Name" 'N' = "Crate bus", 5 INDEX m_ctMentals=0, 6 BOOL m_bShowTrail=FALSE, 7 FLOAT m_fStretch "Stretch" 'S' = 1.0f, 11 CTFileName m_fnmHeadTex01 "Head texture 01" 'H' = CTString(""), 12 CTFileName m_fnmHeadTex02 "Head texture 02" = CTString(""), 13 CTFileName m_fnmHeadTex03 "Head texture 03" = CTString(""), 14 CTFileName m_fnmHeadTex04 "Head texture 04" = CTString(""), 15 CTFileName m_fnmHeadTex05 "Head texture 05" = CTString(""), 16 CTFileName m_fnmHeadTex06 "Head texture 06" = CTString(""), 17 CTFileName m_fnmHeadTex07 "Head texture 07" = CTString(""), 18 CTFileName m_fnmHeadTex08 "Head texture 08" = CTString(""), 19 CTFileName m_fnmHeadTex09 "Head texture 09" = CTString(""), 20 CTFileName m_fnmHeadTex10 "Head texture 10" = CTString(""), 21 CTFileName m_fnmHeadTex11 "Head texture 11" = CTString(""), 22 CTFileName m_fnmHeadTex12 "Head texture 12" = CTString(""), 23 CTFileName m_fnmHeadTex13 "Head texture 13" = CTString(""), 24 CTFileName m_fnmHeadTex14 "Head texture 14" = CTString(""), 25 CTFileName m_fnmHeadTex15 "Head texture 15" = CTString(""), 26 CTFileName m_fnmHeadTex16 "Head texture 16" = CTString(""), 27 CTFileName m_fnmHeadTex17 "Head texture 17" = CTString(""), 28 CTFileName m_fnmHeadTex18 "Head texture 18" = CTString(""), 29 CTFileName m_fnmHeadTex19 "Head texture 19" = CTString(""), 30 CTFileName m_fnmHeadTex20 "Head texture 20" = CTString(""), 31 CTFileName m_fnmHeadTex21 "Head texture 21" = CTString(""), 32 CTFileName m_fnmHeadTex22 "Head texture 22" = CTString(""), 33 CTFileName m_fnmHeadTex23 "Head texture 23" = CTString(""), 34 CTFileName m_fnmHeadTex24 "Head texture 24" = CTString(""), components: 1 class CLASS_BASIC_EFFECT "Classes\\BasicEffect.ecl", 2 class CLASS_PROJECTILE "Classes\\Projectile.ecl", 3 class CLASS_SPAWNER_PROJECTILE "Classes\\SpawnerProjectile.ecl", // ************** DATA ************** 10 model MODEL_MENTAL "ModelsMP\\Enemies\\Mental\\Mental.mdl", 11 texture TEXTURE_MENTAL "ModelsMP\\Enemies\\Mental\\Mental.tex", 12 model MODEL_CRATE_BUS "ModelsMP\\CutSequences\\CrateBus\\CrateBus.mdl", 13 texture TEXTURE_CRATE_BUS "ModelsMP\\CutSequences\\CrateBus\\CrateBus.tex", 14 model MODEL_HEAD "ModelsMP\\Enemies\\Mental\\Head.mdl", 15 texture TEXTURE_HEAD "ModelsMP\\Enemies\\Mental\\Head.tex", functions: void Precache(void) { PrecacheClass(CLASS_BASIC_EFFECT, BET_BOMB); PrecacheTexture(TEXTURE_HEAD); }; void AddRiders() { GetModelObject()->RemoveAllAttachmentModels(); for( INDEX i=0; iGetAttachmentModel(CRATEBUS_ATTACHMENT_1+i); if( pamoMental==NULL) { continue; } CModelObject &moMental=pamoMental->amo_moModelObject; AddAttachmentToModel(this, moMental, MENTAL_ATTACHMENT_HEAD, MODEL_HEAD, TEXTURE_HEAD, 0, 0, 0); CAttachmentModelObject *pamoHead = moMental.GetAttachmentModel(MENTAL_ATTACHMENT_HEAD); if (pamoHead==NULL) { continue; } CTFileName fnm=(&m_fnmHeadTex01)[i]; if (fnm!="") { // try to try { pamoHead->amo_moModelObject.mo_toTexture.SetData_t(fnm); } // if anything failed catch (char *strError) { // report error CPrintF("%s\n", strError); } } INDEX iRndLeft=IRnd()%(sizeof(_aiLeftAnimations)/sizeof(INDEX)); INDEX iRndRight=IRnd()%(sizeof(_aiRightAnimations)/sizeof(INDEX)); if(i&1) { moMental.PlayAnim(_aiRightAnimations[iRndRight], AOF_LOOPING); } else { moMental.PlayAnim(_aiLeftAnimations[iRndLeft], AOF_LOOPING); } FLOAT tmOffsetPhase=-FRnd()*10.0f; moMental.OffsetPhase(tmOffsetPhase); } } // particles void RenderParticles(void) { CEntity *penParent=GetParent(); if( m_bShowTrail && penParent!=NULL) { Particles_AfterBurner( penParent, 0.0f, 0.5f); //Particles_RocketTrail(penParent, 25.0f); } } void SpawnExplosion(INDEX iCharacter, FLOAT fAddY, FLOAT fSize) { FLOAT3D vOffset=FLOAT3D(0,0,0); // spawn explosion if(iCharacter>=0) { CAttachmentModelObject *pamo = GetModelObject()->GetAttachmentModel(iCharacter); if( pamo==NULL && fAddY>=0) {return;} GetModelObject()->RemoveAttachmentModel(iCharacter); m_ctMentals--; // character pos INDEX iX=iCharacter%2; INDEX iZ=iCharacter/2; vOffset=FLOAT3D(-1.0f+iX*2.0f, 3.0f+(FRnd())*1.0f+fAddY, -14.5f+iZ*2.8f)*m_fStretch; } else { // rnd pos vOffset=FLOAT3D( (FRnd()-0.5f)*4.0f, 3.0f+(FRnd())*1.0f+fAddY, (FRnd()-0.5f)*36.0f)*m_fStretch; } CPlacement3D plExplosion = GetPlacement(); plExplosion.pl_PositionVector=plExplosion.pl_PositionVector+vOffset; CEntityPointer penExplosion = CreateEntity(plExplosion, CLASS_BASIC_EFFECT); ESpawnEffect eSpawnEffect; eSpawnEffect.colMuliplier = C_WHITE|CT_OPAQUE; eSpawnEffect.betType = BET_BOMB; eSpawnEffect.vStretch = FLOAT3D(m_fExplosionStretch,m_fExplosionStretch,m_fExplosionStretch); penExplosion->Initialize(eSpawnEffect); // explosion debris eSpawnEffect.betType = BET_EXPLOSION_DEBRIS; CEntityPointer penExplosionDebris = CreateEntity(plExplosion, CLASS_BASIC_EFFECT); penExplosionDebris->Initialize(eSpawnEffect); // explosion smoke eSpawnEffect.betType = BET_EXPLOSION_SMOKE; CEntityPointer penExplosionSmoke = CreateEntity(plExplosion, CLASS_BASIC_EFFECT); penExplosionSmoke->Initialize(eSpawnEffect); } CPlacement3D GetLerpedPlacement(void) const { return CEntity::GetLerpedPlacement(); // we never move anyway, so let's be able to be parented } procedures: Die() { // for each child of this entity {FOREACHINLIST(CEntity, en_lnInParent, en_lhChildren, itenChild) { // send it destruction event itenChild->SendEvent(ERangeModelDestruction()); }} /* m_tmDeath=_pTimer->CurrentTick(); m_ctMentals=TEXTURE_HEAD20-TEXTURE_HEAD01; while((_pTimer->CurrentTick()0)) { autowait(_pTimer->TickQuantum); SpawnExplosion(IRnd()%(TEXTURE_HEAD20-TEXTURE_HEAD01),0,1); if(IRnd()%1) { SpawnExplosion(-1,0,1);} if(IRnd()%1) {SpawnExplosion(IRnd()%(TEXTURE_HEAD20-TEXTURE_HEAD01),0,1);} if(IRnd()%1) { SpawnExplosion(-1,0,1);} } */ for(INDEX iChar=0; iCharCreateEntity_t( CPlacement3D(vPos, ANGLE3D(0,0,0)), CTFILENAME("Classes\\Debris.ecl")); // prepare parameters ESpawnDebris eSpawn; eSpawn.bImmaterialASAP=FALSE; eSpawn.fDustStretch=4.0f; eSpawn.bCustomShading=FALSE; eSpawn.colDebris = C_WHITE|CT_OPAQUE; eSpawn.Eeibt = EIBT_FLESH; eSpawn.dptParticles = DPT_AFTERBURNER; eSpawn.betStain = BET_BLOODSTAINGROW; eSpawn.pmd = GetModelDataForComponent(MODEL_HEAD); eSpawn.ptd = GetTextureDataForComponent(TEXTURE_HEAD); eSpawn.ptdRefl = NULL; eSpawn.ptdSpec = NULL; eSpawn.ptdBump = NULL; eSpawn.iModelAnim = 0; eSpawn.fSize = m_fStretch; eSpawn.vStretch = FLOAT3D(1,1,1); eSpawn.penFallFXPapa=NULL; // initialize it penDebris->Initialize(eSpawn); // speed it up FLOAT3D vSpeed = FLOAT3D( FRnd()-0.5f, 0.25f+FRnd()*0.75f, FRnd()-0.5f)*60.0f; FLOAT3D vRot = FLOAT3D( FRnd()-0.5f, FRnd()-0.5f, FRnd()-0.5f)*200.0f; ((CMovableEntity&)*penDebris).LaunchAsFreeProjectile( vSpeed, NULL); ((CMovableEntity&)*penDebris).SetDesiredRotation( vRot); GetModelObject()->RemoveAttachmentModel(iChar); } {for(INDEX iChar=0; iCharStretchModel( FLOAT3D(m_fStretch,m_fStretch,m_fStretch)); ModelChangeNotify(); autowait(0.1f); CEntity *penParent=GetParent(); if( penParent!=NULL) { //Particles_RocketTrail_Prepare(penParent); Particles_AfterBurner_Prepare(penParent); } wait() { // on the beginning on(EBegin): { resume; } // activate/deactivate shows/hides model on (EActivate): { SwitchToModel(); m_bActive = TRUE; resume; } on (EDeactivate): { SwitchToEditorModel(); m_bActive = FALSE; resume; } on (EEnvironmentStart): { m_bShowTrail=TRUE; resume; } // when dead on(EStop): { jump Die(); resume; } otherwise(): { resume; } }; }; };