Serious-Engine/Sources/EntitiesMP/EffectMarker.es
2016-03-11 18:20:51 -06:00

380 lines
13 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
611
%{
#include "StdH.h"
#include "EntitiesMP/Effector.h"
#include "EntitiesMP/BackgroundViewer.h"
#include "EntitiesMP/WorldSettingsController.h"
%}
uses "EntitiesMP/Marker";
uses "EntitiesMP/BasicEffects";
enum EffectMarkerType {
0 EMT_NONE "None", // no FX
1 EMT_PLAYER_APPEAR "Player appear", // effect of player appearing
2 EMT_APPEARING_BIG_BLUE_FLARE "Appear big blue flare", // appear big blue flare
3 EMT_BLEND_MODELS "Blend two models", // blend between two models
4 EMT_DISAPPEAR_MODEL "Disappear model", // disappear model
5 EMT_APPEAR_MODEL "Appear model", // appear model
6 EMT_HIDE_ENTITY "Hide entity", // hide entity
7 EMT_SHOW_ENTITY "Show entity", // show entity
8 EMT_SHAKE_IT_BABY "Shake it baby", // earth quaker
9 EMT_APPEAR_DISAPPEAR "Appear or Disappear model", // appear/disappear model
10 EMT_SET_PLACEMENT "Teleport", // teleport entity
11 EMT_SET_PARENT "Set parent", // set parent
12 EMT_CLEAR_PARENT "Clear parent", // clear parent
13 EMT_BASIC_EFFECT "Basic effect", // spawn basic effect
14 EMT_GLARE "Glare", // glare screen
};
%{
extern void CBasicEffect_OnPrecache(CDLLEntityClass *pdec, INDEX iUser);
%}
class CEffectMarker: CMarker
{
name "Effect Marker";
thumbnail "Thumbnails\\EffectMarker.tbn";
properties:
1 enum EffectMarkerType m_emtType "Effect type" 'Y' = EMT_NONE, // type of effect
2 CEntityPointer m_penModel "FX Entity 1" 'E', // model holder used in this effect
3 FLOAT m_tmEffectLife "FX Life time" 'L' = 10.0f, // life time of this effect
4 CEntityPointer m_penModel2 "FX Entity 2" 'R', // second model holder used in this effect
5 CEntityPointer m_penEffector, // ptr to spawned effector
6 FLOAT m_fShakeFalloff "Shake fall off" = 250.0f, // ShakeFalloff
7 FLOAT m_fShakeFade "Shake fade" = 3.0f, // ShakeFade
8 FLOAT m_fShakeIntensityY "Shake intensity Y" = 0.1f, // ShakeIntensityY
9 FLOAT m_fShakeFrequencyY "Shake frequency Y" = 5.0f, // ShakeFrequencyY
10 FLOAT m_fShakeIntensityB "Shake intensity B" = 2.5f, // ShakeIntensityB
11 FLOAT m_fShakeFrequencyB "Shake frequency B" = 7.2f, // ShakeFrequencyB
12 FLOAT m_fShakeIntensityZ "Shake intensity Z" = 0.0f, // ShakeIntensityZ
13 FLOAT m_fShakeFrequencyZ "Shake frequency Z" = 5.0f, // ShakeFrequencyZ
20 enum BasicEffectType m_betType "Basic effect type" 'P' = BET_ROCKET, // type of basic effect
21 FLOAT m_fStretch "Stretch" 'S' = 1.0f,
22 COLOR m_colColor "FX color" 'C' = COLOR(C_WHITE|CT_TRANSPARENT),
components:
1 model MODEL_MARKER "Models\\Editor\\Axis.mdl",
2 texture TEXTURE_MARKER "Models\\Editor\\Vector.tex",
3 class CLASS_EFFECTOR "Classes\\Effector.ecl",
4 class CLASS_BASIC_EFFECT "Classes\\BasicEffect.ecl",
functions:
void Precache(void)
{
switch(m_betType)
{
case EMT_BASIC_EFFECT:
CDLLEntityClass *pdec = &CBasicEffect_DLLClass;
// precache
CBasicEffect_OnPrecache(pdec, m_emtType);
break;
}
}
// Validate offered target for one property
BOOL IsTargetValid(SLONG slPropertyOffset, CEntity *penTarget)
{
if(penTarget==NULL)
{
return FALSE;
}
// if should be modelobject
if( slPropertyOffset==offsetof(CEffectMarker, m_penModel) ||
slPropertyOffset==offsetof(CEffectMarker, m_penModel2) )
{
return IsOfClass(penTarget, "ModelHolder2");
}
return TRUE;
}
/* Handle an event, return false if the event is not handled. */
BOOL HandleEvent(const CEntityEvent &ee)
{
if (ee.ee_slEvent==EVENTCODE_ETrigger)
{
switch(m_emtType)
{
case EMT_SET_PLACEMENT:
{
if(m_penModel!=NULL && m_penModel2!=NULL)
{
m_penModel->Teleport(m_penModel2->GetPlacement(), FALSE);
}
break;
}
case EMT_SET_PARENT:
{
if(m_penModel!=NULL && m_penModel2!=NULL)
{
m_penModel->SetParent(m_penModel2);
}
break;
}
case EMT_CLEAR_PARENT:
{
if(m_penModel!=NULL)
{
m_penModel->SetParent(NULL);
}
break;
}
case EMT_SHAKE_IT_BABY:
{
// ---------- Apply shake
CWorldSettingsController *pwsc = NULL;
// obtain bcg viewer
CBackgroundViewer *penBcgViewer = (CBackgroundViewer *) GetWorld()->GetBackgroundViewer();
if( penBcgViewer!=NULL && penBcgViewer->m_penWorldSettingsController!=NULL)
{
pwsc = (CWorldSettingsController *) &*penBcgViewer->m_penWorldSettingsController;
pwsc->m_tmShakeStarted = _pTimer->CurrentTick();
pwsc->m_vShakePos = GetPlacement().pl_PositionVector;
pwsc->m_fShakeFalloff = m_fShakeFalloff;
pwsc->m_fShakeFade = m_fShakeFade;
pwsc->m_fShakeIntensityZ = m_fShakeIntensityZ;
pwsc->m_tmShakeFrequencyZ = m_fShakeFrequencyZ;
pwsc->m_fShakeIntensityY = m_fShakeIntensityY;
pwsc->m_tmShakeFrequencyY = m_fShakeFrequencyY;
pwsc->m_fShakeIntensityB = m_fShakeIntensityB;
pwsc->m_tmShakeFrequencyB = m_fShakeFrequencyB;
pwsc->m_bShakeFadeIn = FALSE;
}
break;
}
case EMT_HIDE_ENTITY:
{
if( m_penTarget!=NULL)
{
m_penTarget->SetFlags(m_penTarget->GetFlags()|ENF_HIDDEN);
}
break;
}
case EMT_SHOW_ENTITY:
{
if( m_penTarget!=NULL)
{
m_penTarget->SetFlags(m_penTarget->GetFlags()&~ENF_HIDDEN);
}
break;
}
case EMT_PLAYER_APPEAR:
if( m_penModel!=NULL && IsOfClass(m_penModel, "ModelHolder2") )
{
CModelObject *pmo = m_penModel->GetModelObject();
if( pmo != NULL)
{
// spawn effect
CPlacement3D plFX= m_penModel->GetPlacement();
CEntity *penFX = CreateEntity( plFX, CLASS_EFFECTOR);
ESpawnEffector eSpawnFX;
eSpawnFX.tmLifeTime = m_tmEffectLife;
eSpawnFX.eetType = ET_PORTAL_LIGHTNING;
eSpawnFX.penModel = m_penModel;
penFX->Initialize( eSpawnFX);
}
}
break;
case EMT_APPEARING_BIG_BLUE_FLARE:
{
// spawn effect
CPlacement3D plFX= GetPlacement();
CEntity *penFX = CreateEntity( plFX, CLASS_EFFECTOR);
ESpawnEffector eSpawnFX;
eSpawnFX.tmLifeTime = m_tmEffectLife;
eSpawnFX.fSize = 1.0f;
eSpawnFX.eetType = ET_SIZING_BIG_BLUE_FLARE;
penFX->Initialize( eSpawnFX);
break;
}
case EMT_BLEND_MODELS:
if(m_penModel!=NULL && IsOfClass(m_penModel, "ModelHolder2") &&
m_penModel2!=NULL && IsOfClass(m_penModel2, "ModelHolder2") )
{
if( m_penEffector == NULL)
{
CModelObject *pmo1 = m_penModel->GetModelObject();
CModelObject *pmo2 = m_penModel2->GetModelObject();
if( pmo1 != NULL && pmo2 != NULL)
{
// spawn effect
CPlacement3D plFX= m_penModel->GetPlacement();
CEntity *penFX = CreateEntity( plFX, CLASS_EFFECTOR);
ESpawnEffector eSpawnFX;
eSpawnFX.tmLifeTime = m_tmEffectLife;
eSpawnFX.eetType = ET_MORPH_MODELS;
eSpawnFX.penModel = m_penModel;
eSpawnFX.penModel2 = m_penModel2;
penFX->Initialize( eSpawnFX);
m_penEffector = penFX;
}
}
else
{
m_penEffector->SendEvent(ETrigger());
}
}
break;
case EMT_DISAPPEAR_MODEL:
if(m_penModel!=NULL && IsOfClass(m_penModel, "ModelHolder2"))
{
if( m_penEffector == NULL)
{
CModelObject *pmo = m_penModel->GetModelObject();
if( pmo != NULL)
{
// spawn effect
CPlacement3D plFX= m_penModel->GetPlacement();
CEntity *penFX = CreateEntity( plFX, CLASS_EFFECTOR);
ESpawnEffector eSpawnFX;
eSpawnFX.tmLifeTime = m_tmEffectLife;
eSpawnFX.eetType = ET_DISAPPEAR_MODEL;
eSpawnFX.penModel = m_penModel;
penFX->Initialize( eSpawnFX);
m_penEffector = penFX;
}
}
else
{
m_penEffector->SendEvent(ETrigger());
}
}
break;
case EMT_APPEAR_MODEL:
if(m_penModel!=NULL && IsOfClass(m_penModel, "ModelHolder2"))
{
if( m_penEffector == NULL)
{
CModelObject *pmo = m_penModel->GetModelObject();
if( pmo != NULL)
{
// spawn effect
CPlacement3D plFX= m_penModel->GetPlacement();
CEntity *penFX = CreateEntity( plFX, CLASS_EFFECTOR);
ESpawnEffector eSpawnFX;
eSpawnFX.tmLifeTime = m_tmEffectLife;
eSpawnFX.eetType = ET_APPEAR_MODEL;
eSpawnFX.penModel = m_penModel;
penFX->Initialize( eSpawnFX);
m_penEffector = penFX;
}
}
else
{
m_penEffector->SendEvent(ETrigger());
}
}
break;
case EMT_BASIC_EFFECT:
{
// spawn effect
CPlacement3D plEffect = GetPlacement();
CEntityPointer penEffect = CreateEntity(plEffect, CLASS_BASIC_EFFECT);
ESpawnEffect eSpawnEffect;
eSpawnEffect.colMuliplier = C_WHITE|CT_OPAQUE;
eSpawnEffect.betType = m_betType;
eSpawnEffect.vStretch = FLOAT3D(m_fStretch,m_fStretch,m_fStretch);
penEffect->Initialize(eSpawnEffect);
}
break;
case EMT_GLARE:
CWorldSettingsController *pwsc = GetWSC(this);
if (pwsc!=NULL)
{
pwsc->m_colGlade=m_colColor;
pwsc->m_tmGlaringStarted = _pTimer->CurrentTick();
pwsc->m_tmGlaringEnded = pwsc->m_tmGlaringStarted+m_tmEffectLife,
pwsc->m_fGlaringFadeInRatio = 0.2f;
pwsc->m_fGlaringFadeOutRatio = 0.7f;
}
break;
}
}
else if (ee.ee_slEvent==EVENTCODE_EActivate)
{
switch(m_emtType)
{
case EMT_APPEAR_DISAPPEAR:
if(m_penModel!=NULL && IsOfClass(m_penModel, "ModelHolder2"))
{
CModelObject *pmo = m_penModel->GetModelObject();
if( pmo != NULL)
{
// spawn effect
CPlacement3D plFX= m_penModel->GetPlacement();
CEntity *penFX = CreateEntity( plFX, CLASS_EFFECTOR);
ESpawnEffector eSpawnFX;
eSpawnFX.tmLifeTime = m_tmEffectLife;
eSpawnFX.eetType = ET_APPEAR_MODEL_NOW;
eSpawnFX.penModel = m_penModel;
penFX->Initialize( eSpawnFX);
m_penEffector = penFX;
}
}
break;
}
}
else if (ee.ee_slEvent==EVENTCODE_EDeactivate)
{
switch(m_emtType)
{
case EMT_APPEAR_DISAPPEAR:
if(m_penModel!=NULL && IsOfClass(m_penModel, "ModelHolder2"))
{
CModelObject *pmo = m_penModel->GetModelObject();
if( pmo != NULL)
{
// spawn effect
CPlacement3D plFX= m_penModel->GetPlacement();
CEntity *penFX = CreateEntity( plFX, CLASS_EFFECTOR);
ESpawnEffector eSpawnFX;
eSpawnFX.tmLifeTime = m_tmEffectLife;
eSpawnFX.eetType = ET_DISAPPEAR_MODEL_NOW;
eSpawnFX.penModel = m_penModel;
penFX->Initialize( eSpawnFX);
m_penEffector = penFX;
}
}
break;
}
}
return FALSE;
}
procedures:
Main()
{
// init model
InitAsEditorModel();
SetPhysicsFlags(EPF_MODEL_IMMATERIAL);
SetCollisionFlags(ECF_IMMATERIAL);
// set appearance
SetModel(MODEL_MARKER);
SetModelMainTexture(TEXTURE_MARKER);
// reset entity ptr
m_penEffector = NULL;
return;
}
};