Files
Leviathan/Client/Game/game/Main/SGameEffect.h
T
2026-06-01 12:46:52 +02:00

300 lines
8.2 KiB
C++

#pragma once
#include "K3DTypes.h"
#include "SGameAvatarEx.h"
class KViewportObject;
class KSeqModel;
namespace
{
enum EFFECT_FILE
{
EFFECT_START_FILE = 0,
EFFECT_MIDDLE_FILE,
EFFECT_END_FILE,
EFFECT_FILE_MAX,
};
};
class SGamePreLoad
{
public:
SGamePreLoad();
~SGamePreLoad();
void RequestThreadLoading( int nFXSet_ID, bool bNotCacheDelete = false );
void RequestThreadLoading( struct _SKILL_FX* pSkill_fx, bool bNotCacheDelete = false );
void Unload( struct _SKILL_FX* pSkill_fx );
protected:
void _loadFX( int nFXSet_ID, bool bNotCacheDelete );
void _unloadFX( int nFXSet_ID );
};
/** 게임상의 Effect
특정 위치에서 폭발
특정 위치 쫓아가기 */
//=============================================================================================================================
//New
class SGameEffectEx : public SGameObject
{
public:
enum
{
NORMAL_MODE = 0, ///< 기본 모드
STATE_MODE, ///< 상태 이상 모드
};
enum FX_PLAY_STATE
{
PLAY_NORAML = 0,
PLAY_LOOP,
PLAY_END,
};
SGameEffectEx( struct FX_DATA * pFX_data, struct _MOTION_FX_SET* pFX_SET );
~SGameEffectEx();
void SetOwner( AR_HANDLE owner ) { m_hOwner = owner; }
void SetCaster( AR_HANDLE caster ) { m_hCaster = caster; }
void setTarget(AR_HANDLE target) { m_target = target; } /// 2011.04.04 - prodongi
AR_HANDLE GetOwner() { return m_hOwner; }
void SetEffectID( int nEffectID ) { m_nEffectID = nEffectID; }
int GetEffectID() { return m_nEffectID; }
void PlayAnimation( DWORD time, int nAniType = SEQTYPE_NORMAL, float fPlayRate = 4.8f );
virtual bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
virtual bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetDirection( K3DVector &pos, K3DVector &target );
void SetParentMat( K3DMatrix *pParentMat, const K3DMatrix *pAttachtMat, const K3DMatrix* pEvpMat )
{
m_pParentMat = pParentMat;
m_pAttachMat = pAttachtMat;
m_pEvPointMatrix = pEvpMat;
}
void SetEventPointSequencer( class KEventPointSeq * pEvPointSeq );
bool IsPlaying();
bool IsEnd() { return m_bEnd; }
void SetMode( int nMode );
int GetMode() { return m_nMode; }
void SetEndTime( AR_TIME end_time ) { m_arEndTime = end_time; }
void ForceEnd() { SetEnd(); }
void IsLoopFx( bool bLoop )
{
if( bLoop )
m_nFxPlayState = PLAY_LOOP;
else if( m_nFxPlayState == PLAY_LOOP )
{
if( getStep() == STEP00 )
{
setStep(STEP01);
}
m_nFxPlayState = PLAY_END;
}
}
void IsWeaponEffectPos()
{
m_bIsWeaponEffectPos = true;
m_bIsDir = false;
}
unsigned short GetStateHandle() { return m_StateHandle; }
void SetStateHandle( unsigned short nStateHandle ) { m_StateHandle = nStateHandle; }
void SetTargetScale(float fSize, K3DMatrix & matTransform );
void SetScaleAdjust(float f) { m_fScaleAdjust = f; }
protected:
void SetEnd() { m_bEnd = true; }
void setSound( int nPlayRatio, const char *pSoundName, int nVol, bool bLoop, bool bSoundOption[SOUND_OP_MAX] );
void _processPlayAni( bool bIsEffect , int nIndex, int nNextIndex, int nNextStep, int nPlayAniType = SEQTYPE_NORMAL );
void procSyncTargetAdjustedScale(); /// 2011.04.04 타겟의 조정된 스케일 값과 동기화 - prodongi
enum
{
STEP00,
STEP01,
STEP02,
};
int getStep() { return m_nStep; }
void setStep( int nStep ) { m_nStep = nStep; }
AR_HANDLE m_hOwner;
AR_HANDLE m_hCaster;
AR_HANDLE m_target; /// 2011.04.04 타겟의 스케일이 변했을 때 체크하기 위해 추가함 - prodongi
bool m_bIsDir;
int m_nStep;
int m_nMode; ///< 기본 모드, 상태 이상 모드
int m_nEffectID;
bool m_bIsSound[EFFECT_FILE_MAX];
bool m_bIsEffect[EFFECT_FILE_MAX];
KSeqModel * m_pSeq; ///< Effect
bool m_bEnd;
bool m_bIsWeaponEffectPos;
FX_PLAY_STATE m_nFxPlayState;
int m_nSoundID;
std::string m_SoundName;
bool m_bIsSoundLoop;
_MOTION_FX_SET* m_pFX_SET;
struct FX_DATA* m_pFX_DATA;
const K3DMatrix *m_pEvPointMatrix; ///< 이벤트 매트릭스
const K3DMatrix *m_pAttachMat; ///< 뼈 매트릭스
K3DMatrix *m_pParentMat; ///< 부모 위치
K3DMatrix m_LocalMat;
K3DMatrix m_ResultMat;
// class KEventPointSeq * m_pEvPointSeq;
K3DMatrix m_DirectionMat;
DWORD m_dwTime;
AR_TIME m_arEndTime;
DWORD m_dwPlayTime;
int m_nCurAniType;
float m_fCurPlayRate;
unsigned short m_StateHandle; ///< 상태 이상 핸들
bool m_bTargetSize;
K3DMatrix m_matTransform;
std::string m_strEffectFileName[EFFECT_FILE_MAX];
std::string m_strSoundFileName[EFFECT_FILE_MAX];
float m_fScaleAdjust;
};
//=============================================================================================================================
//=============================================================================================================================
/// Old 정리 해서 삭제 시키자.
class SGameEffect : public SGameObject
{
public:
SGameEffect(AR_HANDLE owner=0, AR_HANDLE state_handle = 0, AR_TIME endtime = 0 );
virtual ~SGameEffect(void);
int GetEffectID() { return m_nEffectID; }
void SetEffectID( int nEffectID ) { m_nEffectID = nEffectID; }
void AddEffect( const char * pName );
void PlayAnimation( DWORD time, int nAniType = SEQTYPE_NORMAL, float fPlayRate = 4.8f );
virtual bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
virtual bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetOwner( AR_HANDLE hOwner );
void SetFlag( int nFlag ) { m_nFlag = nFlag; }
void SetDirection( K3DVector &pos, K3DVector &target );
void SetOwnerDirection( K3DMatrix* pParantMatrix, K3DVector* pDirection );
void SetParentMat( K3DMatrix *pParentMat, const K3DMatrix *pAttachtMat, const K3DMatrix* pEvpMat )
{
m_pParentMat = pParentMat;
m_pAttachMat = pAttachtMat;
m_pEvPointMatrix = pEvpMat;
}
void SetEndTime( AR_TIME arEndTime ) { m_arEndTime = arEndTime; }
void SetEnd() { m_bEnd = TRUE; }
bool IsPlaying();
BOOL IsEnd() { return m_bEnd; }
AR_HANDLE GetHandle() { return m_hOwner; }
unsigned short GetStateHandle() { return m_StateHandle; }
void SetStateHandle( unsigned short nStateHandle ) { m_StateHandle = nStateHandle; }
void SetEventPointSequencer( class KEventPointSeq * pEvPointSeq );
void SetTargetScale(float fSize, K3DMatrix & matTransform);
protected:
int m_nFlag;
BOOL m_bEnd;
AR_HANDLE m_hOwner; ///< 소유자
int m_nEffectID; ///< Effect ID, 삭제시 필요
unsigned short m_StateHandle; ///< 상태 이상 핸들
AR_TIME m_arEndTime; ///< 상태 이상 끝나는 시간
KSeqModel * m_pSeq; ///< Effect
K3DVector m_Pos; ///< 위치
K3DVector m_Target; ///< 타겟 위치
const K3DMatrix *m_pEvPointMatrix; ///< 이벤트 매트릭스
const K3DMatrix * m_pAttachMat; ///< 상대적인 위치(머리, 팔, 발 등등)
K3DMatrix * m_pParentMat; ///< 부모 위치
K3DVector * m_pOwnerDirection;
K3DMatrix m_LocalMat;
K3DMatrix m_ResultMat;
// class KEventPointSeq * m_pEvPointSeq;
K3DMatrix m_DirectionMat;
DWORD m_dwTime;
DWORD m_dwPlayTime;
int m_nCurAniType;
float m_fCurPlayRate;
DWORD m_dwPlayEndTime; ///< Play 가 끝난 시점
bool m_bIsOwnerDir;
bool m_bTargetSize;
K3DMatrix m_matTransform;
#ifndef NDEBUG
std::string m_strFileName;
#endif
};
//Play 방법 : 정상 한번, 거꾸로 한번,
//////////////////////////////////////////////////////////
/// 근접 공격 힛팅 이펙트
class SGameAttackEffect : public SGameObject
{
private:
KSeqModel * m_pSeq;
bool m_bTargetSize;
bool m_bEnd;
K3DMatrix m_ResultMat;
AR_HANDLE m_hCast;
AR_HANDLE m_hTarget;
public:
void SetEnd() { m_bEnd = true; }
public:
bool IsPlaying();
bool IsEnd() { return m_bEnd; }
public:
AR_HANDLE GetCastHandle() { return m_hCast; }
public:
virtual bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
virtual bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
public:
SGameAttackEffect();
virtual ~SGameAttackEffect();
};