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

836 lines
25 KiB
C++

#pragma once
//
#include "K3DTypes.h"
#include <Windows.h>
#include "SGameObject.h"
#include "SkillBase.h"
//#include <string>
////////////////////////////////////////////////////////////////////////////
/// SGameAction
class SGameAction : public SGameObject
{
public:
enum ENUM_STEP
{
STEP_00, STEP_01, STEP_02, STEP_03, STEP_04,
STEP_05, STEP_06, STEP_07, STEP_08, STEP_09,
STEP_10,
STEP_MAX,
};
SGameAction();
virtual ~SGameAction();
virtual bool IsEnd() { return m_bIsEnd; }
void SetEnd( bool bIsEnd ){ m_bIsEnd = bIsEnd; }
int GetStep() { return m_nStep; }
bool CheckTime( DWORD time )
{
if( m_dwFxTimeOver == 0 )
m_dwFxTimeOver = time;
if( time - m_dwFxTimeOver < 30000 )
return false;
return true;
};
virtual bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
virtual bool Render( unsigned long uRenderBitVector, class KViewportObject** ppViewportList, int nViewportCount );
virtual void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx ){};
virtual void InitFx( struct SMSG_ATTACK* pMsg ){};
virtual void SetResultIndex( int iResultIndex ){};
void DefProcess();
bool CheckAttacker();
bool CheckTarget();
virtual void SetMultiAttackInfo( bool bMultiAttack ) { m_bMultiAttack = bMultiAttack; }
void (*think)(int *self);
protected:
bool (SGameAction::*Function_Step[STEP_MAX])();
virtual bool Step01();
virtual bool Step02();
virtual bool Step03();
virtual bool Step04();
virtual bool Step05();
virtual bool Step06();
virtual bool Step07();
virtual bool Step08();
virtual bool Step09();
virtual bool Step10();
/// 2011.03.23 - prodongi
virtual void setCurChainResultIndex(int /*index*/) {};
void MakeChainDamage(struct _SKILL_FX* pSkillFx, SkillResult const& result, int skillId, char skillLevel, AR_HANDLE hCaster, AR_HANDLE hTarget, AR_HANDLE chainCaster);
void SetStep( ENUM_STEP nStep ) { m_nStep = nStep; }
void GetMatrixSet( class SGameAvatarEx * pCaster, class SGameAvatarEx * pTarget, int nFxPos );
/// 순간 위치
void GetFxPos( K3DMatrix &Out, class SGameAvatarEx * pAvatar );
const K3DMatrix* GetBoneFxMat( class SGameAvatarEx * pAvatar, int iFxPos );
void GetParentFXMat( class SGameAvatarEx * pAvatar, int iFxPos );
void GetResultMat( K3DMatrix &Out, const K3DMatrix* ParentMat, const K3DMatrix* EvPointMat, const K3DMatrix* EvPointAttachMat );
void GetFanShape();
/// 중간 파일을 플레이 할지 결정
void PlayMiddleAnimation( SGameAvatarEx* pCaster, class KSeqForm* pSeq, struct _MOTION_FX_SET* pMoFxSet );
void PlaySoundFx( SGameAvatarEx* pCaster, const char* pFileName, _MOTION_FX_SET* pFxSetInfo, K3DVector* vPosition, bool bLoop = false );
bool GetSkillFx( struct SMSG_SKILL_EVENT* pMsg );
void MakeDamage( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
void MakeDamageAbsorbe( SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
void MakeAbsorbe( SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool CheckDamage( const struct SMSG_DAMAGE* pDamage );
void RunScript( const struct SMSG_DAMAGE* pDamage );
void AddFxData( const AR_HANDLE & owner, const AR_HANDLE & attack, const AR_HANDLE & target, const int & nFX_ID, const int & nFX_pos );
bool AbsorberFlyingStyle01( KSeqForm* pSeq );
bool AbsorberFlyingStyle02( KSeqForm* pSeq );
bool AbsorberFlyingStyle03( KSeqForm* pSeq );
void ShootingFlyingStyle();
K3DMatrix GetParabolaPos( float fIncrease );
void calsAcc();
void SetFxData();
bool CheckNowState( class SGameAvatarEx* pAvatar );
void GetSpeed();
void GetFlyingTime( const K3DVector* pSrc, const K3DVector* pDst );
float RandomNumber(float fMin, float fMax);
K3DVector RandomNumber(K3DVector vMin, K3DVector vMax);
void SetDamageDisplayName( struct SMSG_DAMAGE* pDamage, SGameAvatarEx* pCaster, SGameAvatarEx* pTarget);
void SendSkillDamage( SGameAvatarEx* pAvatar, AR_HANDLE caster, AR_HANDLE target, SMSG_DAMAGE* pDamage );
std::vector< SMSG_DAMAGE * > m_DamageList; ///< 한방에 여러 타겟용
SMSG_DAMAGE* m_pDamage; ///< 한방에 한 타겟용
DWORD m_dwOldTime; ///< 전 시간
DWORD m_dwTime; ///< 현재 시간
DWORD m_dwStartTime; ///< 시작 시간
DWORD m_dwEndTime; ///< 끝날 시간
DWORD m_dwDelayTime; ///< 지연 시간
//Process
bool m_bIsEnd; ///< 끝?
ENUM_STEP m_nStep; ///< 단계
float m_fVisibility; ///< 투명도
K3DVector m_startvelocity;///< 단위(타겟포스-현재위치)
K3DVector m_velocity; ///< 단위(타겟포스-현재위치)
float m_acc; ///< 가속도
K3DVector m_SrcPos;
K3DVector m_DstPos;
const K3DMatrix* m_pCastMat; ///< 시전자의 위치
const K3DMatrix* m_pCastBoneMat; ///< 발사체가 발사될 위치나 흡수돼야될 위치
const K3DMatrix* m_pCasterAttachMat;
const K3DMatrix* m_pTargetMat; ///< 대상의 위치
const K3DMatrix* m_pTargetBoneMat; ///< 대상에 발사체가 도달할 위치나 흡수체가 생성돼야할 위치
const K3DMatrix* m_pTargetAttachMat;
K3DMatrix m_Matrix;
int m_nFxPos; ///< 효과 위치 인덱스
short m_iPlayStep;
float m_fLength;
//비행 관련 변수들
float m_fGravity;
float m_fOldDot;
int m_iFlyingStyle;
BYTE m_btFlyingState;
K3DVector m_vFrontNBackDir;
K3DVector m_vLeftNRightDir;
struct _SKILL_FX* m_pSkill_FX;
//GameObject
AR_HANDLE m_caster;
AR_HANDLE m_target;
class SGameAvatarEx * m_pAttack; ///< 시전자
class SGameAvatarEx * m_pTarget; ///< 대상
//Render
class KSeqForm* m_pCast; ///< 캐스트
class KSeqForm* m_pThrow; ///< 발사체
class KSeqForm* m_pExplosion; ///< 폭발
class KSeqForm* m_pReThrow; ///< 역발사체
class KSeqForm* m_pSubStageHit; ///< 부가 히트 FX
class KSeqForm* m_pSubStageFire; ///< 부가 발동 FX
struct _MOTION_FX_SET* m_pCastFxSet;
struct _MOTION_FX_SET* m_pThrowFxSet;
struct _MOTION_FX_SET* m_pExplosionFxSet;
struct _MOTION_FX_SET* m_pReThrowFxSet;
struct _MOTION_FX_SET* m_pSubStageHitFxSet;
struct _MOTION_FX_SET* m_pSubStageFireFxSet;
DWORD m_dwAddHitDelayTime; ///< 부가 히트FX 출력 딜레이
DWORD m_dwAddFireDelayTime; ///< 부가 발똥FX 출력 딜레이
int m_nFxSubHitPos;
int m_nFxSubFirePos;
std::string m_strSound; ///< 사운드 파일 이름 StopSound용
int m_iSoundIndex; ///< 사운드 파일 인덱스 StopSound용
DWORD m_dwFxTimeOver; ///< 시간이 초과됐지만 끝나지 않는 이펙트들을 끝낸다
int m_iResultIndex;
std::vector< struct SkillResult* > m_vHPMPSPSkillResult;
float m_fFlyingTime;
float m_fDistance;
float m_fSpeed;
bool m_bMultiAttack;
float m_fParabolaDir;
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Fire Mng - 데미지 수 만큼의 덩어리 제어
class SFireActMng : public SGameAction
{
public:
SFireActMng( struct SMSG_SKILL_EVENT * pMsg, SGameObject * pMsgHandler );
SFireActMng( struct SMSG_ATTACK * pMsg, SGameObject * pMsgHandler );
SFireActMng( SGameAction* pGameAction, struct SMSG_SKILL_EVENT * pMsg, SGameObject * pMsgHandler );
virtual ~SFireActMng();
virtual bool IsEnd();
virtual bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
virtual bool Render( unsigned long uRenderBitVector, class KViewportObject** ppViewportList, int nViewportCount );
protected:
std::vector< SGameAction* > m_pFireList;
std::queue < SGameAction* > m_pReadyList;
DWORD m_nInterval; ///< 간격
int m_nCount; ///< 제어할 갯수
int m_nTotalCount; ///< 전체 수
};
////////////////////////////////////////////////////////////////////////////
class SActionRecall : public SGameAction
{
public:
SActionRecall(){};
virtual ~SActionRecall(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
};
////////////////////////////////////////////////////////////////////////////
class SActionReverseRecall : public SGameAction
{
public:
SActionReverseRecall(){};
virtual ~SActionReverseRecall(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
};
////////////////////////////////////////////////////////////////////////////
class SActionAttkWeapon : public SGameAction
{
public:
SActionAttkWeapon(){};
virtual ~SActionAttkWeapon(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
};
////////////////////////////////////////////////////////////////////////////
class SActionAttkShield : public SGameAction
{
public:
SActionAttkShield(){};
virtual ~SActionAttkShield(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
};
////////////////////////////////////////////////////////////////////////////
class SActionMultiAttkWeapon : public SGameAction
{
public:
SActionMultiAttkWeapon(){};
virtual ~SActionMultiAttkWeapon(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
};
////////////////////////////////////////////////////////////////////////////
class SActionAboveTwoAttk : public SGameAction
{
public:
SActionAboveTwoAttk(){};
virtual ~SActionAboveTwoAttk(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
};
////////////////////////////////////////////////////////////////////////////
class SActionAttkAbsorber : public SGameAction
{
public:
SActionAttkAbsorber(){};
virtual ~SActionAttkAbsorber(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
bool Step03();
bool Step04();
bool Step05();
bool Step06();
bool Step07();
};
////////////////////////////////////////////////////////////////////////////
class SActionChargeAttk : public SGameAction
{
public:
SActionChargeAttk(){};
virtual ~SActionChargeAttk(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
float m_fKnockBackSpeed;
K3DVector m_vKnockBackPosition;
int m_nEndFireMotionID;
};
////////////////////////////////////////////////////////////////////////////
class SActionShootBow : public SGameAction
{
public:
SActionShootBow();
virtual ~SActionShootBow();
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
void InitFx( struct SMSG_ATTACK* pMsg );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
protected:
bool m_bNormalBow;
};
////////////////////////////////////////////////////////////////////////////
class SActionShootStrongBow : public SGameAction
{
public:
SActionShootStrongBow(){};
virtual ~SActionShootStrongBow(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
protected:
float m_fKnockBackSpeed;
K3DVector m_vKnockBackPosition;
bool m_bKnockBack;
};
////////////////////////////////////////////////////////////////////////////
class SActionShootAbsorberBow : public SGameAction
{
public:
SActionShootAbsorberBow(){};
virtual ~SActionShootAbsorberBow(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
bool Step04();
bool Step05();
bool Step06();
bool Step07();
bool Step08();
};
////////////////////////////////////////////////////////////////////////////
class SActionSelfSkill : public SGameAction
{
public:
SActionSelfSkill(){};
virtual ~SActionSelfSkill(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
protected:
};
////////////////////////////////////////////////////////////////////////////
class SActionThrowSkill : public SGameAction
{
public:
SActionThrowSkill(){};
virtual ~SActionThrowSkill(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
private:
bool m_bMultiThrow;
};
////////////////////////////////////////////////////////////////////////////
class SActionThrowSkillDelay : public SGameAction
{
public:
SActionThrowSkillDelay(){};
virtual ~SActionThrowSkillDelay(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
private:
bool m_bMultiThrow;
float m_fHittingDelay;
};
////////////////////////////////////////////////////////////////////////////
class SActionThrowAbsorberSkill : public SGameAction
{
public:
SActionThrowAbsorberSkill(){};
virtual ~SActionThrowAbsorberSkill();
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
bool Step04();
bool Step05();
bool Step06();
bool Step07();
bool Step08();
};
////////////////////////////////////////////////////////////////////////////
class SActionCreatureAbsorberSkill : public SGameAction
{
public:
SActionCreatureAbsorberSkill(){};
virtual ~SActionCreatureAbsorberSkill(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
bool Step03();
bool Step04();
bool Step05();
bool Step06();
bool Step07();
bool Step08();
};
////////////////////////////////////////////////////////////////////////////
class SActionThrowWideAreaSkill : public SGameAction
{
public:
SActionThrowWideAreaSkill(){};
virtual ~SActionThrowWideAreaSkill();
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
private:
struct TARGET_DATA_LIST
{
TARGET_DATA_LIST()
{
pDamage = NULL;
bDmgProcessing = true;
bSubFireProcessing = true;
bSubHitProcessing = true;
hTarget = 0;
}
struct SMSG_DAMAGE* pDamage; ///< 주소만 참조한다
bool bDmgProcessing;
bool bSubFireProcessing;
bool bSubHitProcessing;
AR_HANDLE hTarget;
};
std::vector< TARGET_DATA_LIST > m_vTargetList;
};
////////////////////////////////////////////////////////////////////////////
class SActionThrowWideAreaMultiSkill : public SGameAction
{
public:
SActionThrowWideAreaMultiSkill(){};
virtual ~SActionThrowWideAreaMultiSkill();
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
private:
struct TARGET_DATA_LIST
{
TARGET_DATA_LIST()
{
pDamage = NULL;
bDmgProcessing = true;
bSubFireProcessing = true;
bSubHitProcessing = true;
hTarget = 0;
}
struct SMSG_DAMAGE* pDamage; ///< 주소만 참조한다
bool bDmgProcessing;
bool bSubFireProcessing;
bool bSubHitProcessing;
AR_HANDLE hTarget;
};
std::vector< TARGET_DATA_LIST > m_vTargetList;
DWORD m_dwHitDelay;
DWORD m_dwStartHitTime;
int m_nTargetCnt;
int m_nCasterFxID;
};
////////////////////////////////////////////////////////////////////////////
class SActionFireMissle : public SGameAction
{
public:
SActionFireMissle(){};
virtual ~SActionFireMissle(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
bool Step04();
};
////////////////////////////////////////////////////////////////////////////
class SActionFireMultiMissle : public SGameAction
{
public:
SActionFireMultiMissle(){};
virtual ~SActionFireMultiMissle(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
bool Step04();
};
////////////////////////////////////////////////////////////////////////////
class SActionFirePenetratedMissle : public SGameAction
{
public:
SActionFirePenetratedMissle();
virtual ~SActionFirePenetratedMissle();
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
bool Step03();
protected:
struct TARGET_DATA_LIST
{
TARGET_DATA_LIST()
{
fOldLength = 0.0f;
pDamage = NULL;
}
struct SMSG_DAMAGE* pDamage; ///< 주소만 참조한다
float fOldLength;
};
std::vector< TARGET_DATA_LIST > m_vTargetList;
};
/// 2011.03.23 - prodongi
class SActionFireChainMissile : public SGameAction
{
public:
SActionFireChainMissile(){};
virtual ~SActionFireChainMissile(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
bool Step04();
protected:
void setSkillEvent(struct SMSG_SKILL_EVENT const* msg);
virtual void setCurChainResultIndex(int index);
void setNextChainResultIndex();
/// startIndex를 시작으로 한 skill result의 hFrom, hTarget이 유효한 skill result index를 찾는다
int findValidHandle(int startIndex, bool caster);
protected:
struct sSkillEvent
{
unsigned short m_id;
char m_level;
AR_HANDLE m_chainCaster;
std::vector<SkillResult> m_result;
};
int m_resultIndex;
sSkillEvent m_skillEvent;
bool m_readyNextResult;
};
////////////////////////////////////////////////////////////////////////////
class SActionLastingWideAreaSkill : public SGameAction
{
public:
SActionLastingWideAreaSkill(){};
virtual ~SActionLastingWideAreaSkill(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
bool Step03();
};
////////////////////////////////////////////////////////////////////////////
class SActionWorkingSkill : public SGameAction
{
public:
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
public:
SActionWorkingSkill() {};
virtual ~SActionWorkingSkill() {};
};
/// PathEffect 테스트용 스킬
class SActionPfxTest1 : public SGameAction
{
public:
SActionPfxTest1(){};
virtual ~SActionPfxTest1(){};
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
void SetResultIndex( int iResultIndex ) { m_iResultIndex = iResultIndex; };
bool Step01();
bool Step02();
};
////////////////////////////////////////////////////////////////////////////
class SActionLightningFx : public SGameAction
{
private:
class SGameLightningFx* m_pLightningFx;
public:
SActionLightningFx();
virtual ~SActionLightningFx();
public:
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
};
////////////////////////////////////////////////////////////////////////////
class SActionHealingWaveFx : public SGameAction
{
private:
class SGameHealingWaveFx* m_pHealingWaveFx;
public:
SActionHealingWaveFx();
virtual ~SActionHealingWaveFx();
public:
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
};
////////////////////////////////////////////////////////////////////////////
class SActionBlessingHammer : public SGameAction
{
private:
float m_fHammerZOffSet;
float m_fHammerDistance;
float m_fHammerZRotation;
DWORD m_dwZRotationTime;
DWORD m_dwOldZRotationTime;
float m_fHammerXRotation;
DWORD m_dwXRotationTime;
DWORD m_dwOldXRotationTime;
DWORD m_dwHammerTime;
DWORD m_dwOldHammerTime;
float m_fMovingDistance;
K3DVector m_vPosition;
K3DMatrix m_matParent;
public:
SActionBlessingHammer();
virtual ~SActionBlessingHammer();
public:
void InitFx( struct SMSG_SKILL_EVENT* pMsg, struct _SKILL_FX* pSkillFx );
bool Process( DWORD dwTime, unsigned long uProcessBitVector=0 );
bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewportList, int nViewportCount );
bool Step01();
bool Step02();
bool Step03();
};