client/GameLib/ActorInstance.h

890 lines
25 KiB
C++

#pragma once
// class CActorInstance
// Note : 캐릭터의 Lighting, Local Point Light, Weapon Trace 등의 효과와 콤보 데이타, 사운드 데이타,
// 모션 데이타 들을 추상적, 총체적으로 관리하는 개별 매니저가 될 것이다.
#include "FlyTarget.h"
#include "RaceData.h"
#include "RaceMotionData.h"
#include "PhysicsObject.h"
#include "ActorInstanceInterface.h"
#include "Interface.h"
//#include "../eterGrnLib/ThingInstance.h"
class CItemData;
class CWeaponTrace;
class IFlyEventHandler;
class CSpeedTreeWrapper;
class IMobProto : public CSingleton<IMobProto>
{
public:
IMobProto() {}
virtual ~IMobProto() {}
virtual bool FindRaceType(UINT eRace, UINT* puType);
};
class CActorInstance : public IActorInstance, public IFlyTargetableObject
{
public:
class IEventHandler
{
public:
static IEventHandler* GetEmptyPtr();
public:
struct SState
{
TPixelPosition kPPosSelf;
FLOAT fAdvRotSelf;
};
public:
IEventHandler() {}
virtual ~IEventHandler() {}
virtual void OnSyncing(const SState& c_rkState) = 0;
virtual void OnWaiting(const SState& c_rkState) = 0;
virtual void OnMoving(const SState& c_rkState) = 0;
virtual void OnMove(const SState& c_rkState) = 0;
virtual void OnStop(const SState& c_rkState) = 0;
virtual void OnWarp(const SState& c_rkState) = 0;
virtual void OnSetAffect(UINT uAffect) = 0;
virtual void OnResetAffect(UINT uAffect) = 0;
virtual void OnClearAffects() = 0;
virtual void OnAttack(const SState& c_rkState, WORD wMotionIndex) = 0;
virtual void OnUseSkill(const SState& c_rkState, UINT uMotSkill, UINT uMotLoopCount) = 0;
virtual void OnHit(UINT uSkill, CActorInstance& rkActorVictim, BOOL isSendPacket) = 0;
virtual void OnChangeShape() = 0;
};
// 2004.07.05.myevan.궁신탄영 맵에 끼이는 문제해결
private:
static IBackground& GetBackground();
public:
static bool IsDirLine();
public:
enum EType
{
TYPE_ENEMY,
TYPE_NPC,
TYPE_STONE,
TYPE_WARP,
TYPE_DOOR,
TYPE_BUILDING,
TYPE_PC,
TYPE_POLY,
TYPE_HORSE,
TYPE_GOTO,
TYPE_OBJECT, // Only For Client
};
enum ERenderMode
{
RENDER_MODE_NORMAL,
RENDER_MODE_BLEND,
RENDER_MODE_ADD,
RENDER_MODE_MODULATE,
};
/////////////////////////////////////////////////////////////////////////////////////
// Motion Queueing System
enum EMotionPushType
{
MOTION_TYPE_NONE,
MOTION_TYPE_ONCE,
MOTION_TYPE_LOOP,
};
typedef struct SReservingMotionNode
{
EMotionPushType iMotionType;
float fStartTime;
float fBlendTime;
float fDuration;
float fSpeedRatio;
DWORD dwMotionKey;
} TReservingMotionNode;
struct SCurrentMotionNode
{
EMotionPushType iMotionType;
DWORD dwMotionKey;
DWORD dwcurFrame;
DWORD dwFrameCount;
float fStartTime;
float fEndTime;
float fSpeedRatio;
int iLoopCount;
UINT uSkill;
};
typedef std::deque<TReservingMotionNode> TMotionDeque;
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// Motion Event
typedef struct SMotionEventInstance
{
int iType;
int iMotionEventIndex;
float fStartingTime;
const CRaceMotionData::TMotionEventData * c_pMotionData;
} TMotionEventInstance;
typedef std::list<TMotionEventInstance> TMotionEventInstanceList;
typedef TMotionEventInstanceList::iterator TMotionEventInstanceListIterator;
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// For Collision Detection
typedef struct SCollisionPointInstance
{
const NRaceData::TCollisionData * c_pCollisionData;
BOOL isAttached;
DWORD dwModelIndex;
DWORD dwBoneIndex;
CDynamicSphereInstanceVector SphereInstanceVector;
} TCollisionPointInstance;
typedef std::list<TCollisionPointInstance> TCollisionPointInstanceList;
typedef TCollisionPointInstanceList::iterator TCollisionPointInstanceListIterator;
typedef std::map<CActorInstance*, float> THittedInstanceMap;
typedef std::map<const NRaceData::THitData *, THittedInstanceMap> THitDataMap;
struct SSplashArea
{
BOOL isEnableHitProcess;
UINT uSkill;
MOTION_KEY MotionKey;
float fDisappearingTime;
const CRaceMotionData::TMotionAttackingEventData * c_pAttackingEvent;
CDynamicSphereInstanceVector SphereInstanceVector;
THittedInstanceMap HittedInstanceMap;
};
typedef struct SHittingData
{
BYTE byAttackingType;
DWORD dwMotionKey;
BYTE byEventIndex;
} THittingData;
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// For Attaching
enum EAttachEffect
{
EFFECT_LIFE_NORMAL,
EFFECT_LIFE_INFINITE,
EFFECT_LIFE_WITH_MOTION,
};
struct TAttachingEffect
{
DWORD dwEffectIndex;
int iBoneIndex;
DWORD dwModelIndex;
D3DXMATRIX matTranslation;
BOOL isAttaching;
int iLifeType;
DWORD dwEndTime;
};
/////////////////////////////////////////////////////////////////////////////////////
public:
static void ShowDirectionLine(bool isVisible);
static void DestroySystem();
public:
CActorInstance();
virtual ~CActorInstance();
// 20041201.myevan.인스턴스베이스용 함수
void INSTANCEBASE_Transform();
void INSTANCEBASE_Deform();
void Destroy();
void Move();
void Stop(float fBlendingTime=0.15f);
void SetMainInstance();
void SetParalysis(bool isParalysis);
void SetFaint(bool isFaint);
void SetSleep(bool isSleep);
void SetResistFallen(bool isResistFallen);
void SetAttackSpeed(float fAtkSpd);
void SetMoveSpeed(float fMovSpd);
void SetMaterialAlpha(DWORD dwAlpha);
void SetMaterialColor(DWORD dwColor);
void SetEventHandler(IEventHandler* pkEventHandler);
bool SetRace(DWORD eRace);
void SetHair(DWORD eHair);
void SetVirtualID(DWORD dwVID);
void SetShape(DWORD eShape, float fSpecular=0.0f);
void ChangeMaterial(const char * c_szFileName);
public:
void SetComboType(WORD wComboType);
DWORD GetRace();
DWORD GetVirtualID();
UINT GetActorType() const;
void SetActorType(UINT eType);
bool CanAct();
bool CanMove();
bool CanAttack();
bool CanUseSkill();
bool IsPC();
bool IsNPC();
bool IsEnemy();
bool IsStone();
bool IsWarp();
bool IsGoto();
bool IsObject();
bool IsDoor();
bool IsPoly();
bool IsBuilding();
bool IsHandMode();
bool IsBowMode();
bool IsTwoHandMode();
void AttachWeapon(DWORD dwItemIndex,DWORD dwParentPartIndex = CRaceData::PART_MAIN, DWORD dwPartIndex = CRaceData::PART_WEAPON);
void AttachWeapon(DWORD dwParentPartIndex, DWORD dwPartIndex, CItemData * pItemData);
void RefreshActorInstance();
DWORD GetPartItemID(DWORD dwPartIndex);
// Attach Effect
BOOL GetAttachingBoneName(DWORD dwPartIndex, const char ** c_szBoneName);
void UpdateAttachingInstances();
void DettachEffect(DWORD dwEID);
DWORD AttachEffectByName(DWORD dwParentPartIndex, const char * c_pszBoneName, const char * c_pszEffectFileName);
DWORD AttachEffectByID(DWORD dwParentPartIndex, const char * c_pszBoneName, DWORD dwEffectID, const D3DXVECTOR3 * c_pv3Position = NULL);
DWORD AttachSmokeEffect(DWORD eSmoke);
/////////////////////////////////////////////////////////////////////////////////////
// Motion Queueing System
void SetMotionMode(int iMotionMode); // FIXME : 모드의 시간차 적용이 가능하게끔 한다.
int GetMotionMode();
void SetLoopMotion(DWORD dwMotion, float fBlendTime = 0.1f, float fSpeedRatio=1.0f);
bool InterceptOnceMotion(DWORD dwMotion, float fBlendTime = 0.1f, UINT uSkill=0, float fSpeedRatio=1.0f);
bool InterceptLoopMotion(DWORD dwMotion, float fBlendTime = 0.1f);
bool PushOnceMotion(DWORD dwMotion, float fBlendTime = 0.1f, float fSpeedRatio=1.0f); // FIXME : 모드의 시간차 적용이 가능하게끔 한다.
bool PushLoopMotion(DWORD dwMotion, float fBlendTime = 0.1f, float fSpeedRatio=1.0f); // FIXME : 모드의 시간차 적용이 가능하게끔 한다.
void SetMotionLoopCount(int iCount);
bool IsPushing();
BOOL isLock();
BOOL IsUsingSkill();
BOOL CanCheckAttacking();
BOOL CanCancelSkill();
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// Collison Detection
bool CreateCollisionInstancePiece(DWORD dwAttachingModelIndex, const NRaceData::TAttachingData * c_pAttachingData, TCollisionPointInstance * pPointInstance);
void UpdatePointInstance();
void UpdatePointInstance(TCollisionPointInstance * pPointInstance);
bool CheckCollisionDetection(const CDynamicSphereInstanceVector * c_pAttackingSphereVector, D3DXVECTOR3 * pv3Position);
// Collision Detection Checking
virtual bool TestCollisionWithDynamicSphere(const CDynamicSphereInstance & dsi);
void UpdateAdvancingPointInstance();
BOOL IsClickableDistanceDestInstance(CActorInstance & rkInstDst, float fDistance);
bool AvoidObject(const CGraphicObjectInstance& c_rkBGObj);
bool IsBlockObject(const CGraphicObjectInstance& c_rkBGObj);
void BlockMovement();
/////////////////////////////////////////////////////////////////////////////////////
protected:
BOOL __TestObjectCollision(const CGraphicObjectInstance * c_pObjectInstance);
public:
BOOL TestActorCollision(CActorInstance & rVictim );
BOOL TestPhysicsBlendingCollision(CActorInstance & rVictim);
BOOL AttackingProcess(CActorInstance & rVictim);
void PreAttack();
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// Battle
// Input
// 하위로 옮길 가능성이 있는 코드들
// 네트웍 연동시 전투 관련은 플레이어를 제외하곤 단순히 Showing Type이기 때문에
// 조건 검사가 필요 없다.
void InputNormalAttackCommand(float fDirRot); // Process input - Only used by player's character
bool InputComboAttackCommand(float fDirRot); // Process input - Only used by player's character
// Command
BOOL isAttacking();
BOOL isNormalAttacking();
BOOL isComboAttacking();
BOOL IsSplashAttacking();
BOOL IsUsingMovingSkill();
BOOL IsActEmotion();
DWORD GetComboIndex();
float GetAttackingElapsedTime();
void SetBlendingPosition(const TPixelPosition & c_rPosition, float fBlendingTime = 1.0f);
void ResetBlendingPosition();
void GetBlendingPosition(TPixelPosition * pPosition);
BOOL NormalAttack(float fDirRot, float fBlendTime = 0.1f);
BOOL ComboAttack(DWORD wMotionIndex, float fDirRot, float fBlendTime = 0.1f);
void Revive();
BOOL IsSleep();
BOOL IsParalysis();
BOOL IsFaint();
BOOL IsResistFallen();
BOOL IsWaiting();
BOOL IsMoving();
BOOL IsDead();
BOOL IsStun();
BOOL IsAttacked();
BOOL IsDamage();
BOOL IsKnockDown();
void SetWalkMode();
void SetRunMode();
void Stun();
void Die();
void DieEnd();
void SetBattleHitEffect(DWORD dwID);
void SetBattleAttachEffect(DWORD dwID);
MOTION_KEY GetNormalAttackIndex();
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// Position
const D3DXVECTOR3& GetMovementVectorRef();
const D3DXVECTOR3& GetPositionVectorRef();
void SetCurPixelPosition(const TPixelPosition& c_rkPPosCur);
void NEW_SetAtkPixelPosition(const TPixelPosition& c_rkPPosAtk);
void NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosSrc);
void NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst);
void NEW_SetDstPixelPositionZ(float z);
const TPixelPosition& NEW_GetAtkPixelPositionRef();
const TPixelPosition& NEW_GetCurPixelPositionRef();
const TPixelPosition& NEW_GetSrcPixelPositionRef();
const TPixelPosition& NEW_GetDstPixelPositionRef();
const TPixelPosition& NEW_GetLastPixelPositionRef();
void GetPixelPosition(TPixelPosition * pPixelPosition);
void SetPixelPosition(const TPixelPosition& c_rPixelPos);
// Rotation Command
void LookAt(float fDirRot);
void LookAt(float fx, float fy);
void LookAt(CActorInstance * pInstance);
void LookWith(CActorInstance * pInstance);
void LookAtFromXY(float x, float y, CActorInstance * pDestInstance);
void SetReachScale(float fScale);
void SetOwner(DWORD dwOwnerVID);
float GetRotation();
float GetTargetRotation();
float GetAdvancingRotation();
float GetRotatingTime();
void SetRotation(float fRot);
void SetXYRotation(float fRotX, float fRotY);
void BlendRotation(float fRot, float fBlendTime);
void SetAdvancingRotation(float fRot);
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void MotionEventProcess();
void MotionEventProcess(DWORD dwcurTime, int iIndex, const CRaceMotionData::TMotionEventData * c_pData);
void SoundEventProcess(BOOL bCheckFrequency);
/////////////////////////////////////////////////////////////////////////////////////
////
// Rendering Functions - Temporary Place
BOOL IsMovement();
void RestoreRenderMode();
void BeginDiffuseRender();
void EndDiffuseRender();
void BeginOpacityRender();
void EndOpacityRender();
void BeginBlendRender();
void EndBlendRender();
void SetBlendRenderMode();
void SetAlphaValue(float fAlpha);
float GetAlphaValue();
void BlendAlphaValue(float fDstAlpha, float fDuration);
void SetSpecularInfo(BOOL bEnable, int iPart, float fAlpha);
void SetSpecularInfoForce(BOOL bEnable, int iPart, float fAlpha);
void BeginAddRender();
void EndAddRender();
void SetAddRenderMode();
void SetAddColor(const D3DXCOLOR & c_rColor);
void BeginModulateRender();
void EndModulateRender();
void SetModulateRenderMode();
void SetRenderMode(int iRenderMode);
void RenderTrace();
void RenderCollisionData();
void RenderToShadowMap();
protected:
void __AdjustCollisionMovement(const CGraphicObjectInstance * c_pGraphicObjectInstance);
public:
void AdjustDynamicCollisionMovement(const CActorInstance * c_pActorInstance);
// Weapon Trace
void SetWeaponTraceTexture(const char * szTextureName);
void UseTextureWeaponTrace();
void UseAlphaWeaponTrace();
// ETC
void UpdateAttribute();
bool IntersectDefendingSphere();
float GetHeight();
void ShowAllAttachingEffect();
void HideAllAttachingEffect();
void ClearAttachingEffect();
// Fishing
bool CanFishing();
BOOL IsFishing();
void SetFishingPosition(D3DXVECTOR3 & rv3Position);
// Flying Methods
// As a Flying Target
public:
virtual D3DXVECTOR3 OnGetFlyTargetPosition();
void OnShootDamage();
// As a Shooter
// NOTE : target and target position are exclusive
public:
void ClearFlyTarget();
bool IsFlyTargetObject();
void AddFlyTarget(const CFlyTarget & cr_FlyTarget);
void SetFlyTarget(const CFlyTarget & cr_FlyTarget);
void LookAtFlyTarget();
float GetFlyTargetDistance();
void ClearFlyEventHandler();
void SetFlyEventHandler(IFlyEventHandler * pHandler);
// 2004. 07. 07. [levites] - 스킬 사용중 타겟이 바뀌는 문제 해결을 위한 코드
bool CanChangeTarget();
protected:
IFlyEventHandler * m_pFlyEventHandler;
public:
void MountHorse(CActorInstance * pkHorse);
void HORSE_MotionProcess(BOOL isPC);
void MotionProcess(BOOL isPC);
void RotationProcess();
void PhysicsProcess();
void ComboProcess();
void TransformProcess();
void AccumulationMovement();
void ShakeProcess();
void TraceProcess();
void __MotionEventProcess(BOOL isPC);
void __AccumulationMovement(float fRot);
BOOL __SplashAttackProcess(CActorInstance & rVictim);
BOOL __NormalAttackProcess(CActorInstance & rVictim);
bool __CanInputNormalAttackCommand();
private:
void __Shake(DWORD dwDuration);
protected:
CFlyTarget m_kFlyTarget;
CFlyTarget m_kBackupFlyTarget;
std::deque<CFlyTarget> m_kQue_kFlyTarget;
protected:
bool __IsInSplashTime();
void OnUpdate();
void OnRender();
BOOL isValidAttacking();
void ReservingMotionProcess();
void CurrentMotionProcess();
MOTION_KEY GetRandomMotionKey(MOTION_KEY dwMotionKey);
float GetLastMotionTime(float fBlendTime); // NOTE : 자동으로 BlendTime만큼을 앞당긴 시간을 리턴
float GetMotionDuration(DWORD dwMotionKey);
bool InterceptMotion(EMotionPushType iMotionType, WORD wMotion, float fBlendTime = 0.1f, UINT uSkill=0, float fSpeedRatio=1.0f);
void PushMotion(EMotionPushType iMotionType, DWORD dwMotionKey, float fBlendTime, float fSpeedRatio=1.0f);
void ProcessMotionEventEffectEvent(const CRaceMotionData::TMotionEventData * c_pData);
void ProcessMotionEventEffectToTargetEvent(const CRaceMotionData::TMotionEventData * c_pData);
void ProcessMotionEventSpecialAttacking(int iMotionEventIndex, const CRaceMotionData::TMotionEventData * c_pData);
void ProcessMotionEventSound(const CRaceMotionData::TMotionEventData * c_pData);
void ProcessMotionEventFly(const CRaceMotionData::TMotionEventData * c_pData);
void ProcessMotionEventWarp(const CRaceMotionData::TMotionEventData * c_pData);
void AddMovement(float fx, float fy, float fz);
bool __IsLeftHandWeapon(DWORD type);
bool __IsRightHandWeapon(DWORD type);
bool __IsWeaponTrace(DWORD weaponType);
protected:
void __InitializeMovement();
protected:
void __Initialize();
void __ClearAttachingEffect();
float __GetOwnerTime();
DWORD __GetOwnerVID();
bool __CanPushDestActor(CActorInstance& rkActorDst);
protected:
void __RunNextCombo();
void __ClearCombo();
void __OnEndCombo();
void __ProcessDataAttackSuccess(const NRaceData::TAttackData & c_rAttackData, CActorInstance & rVictim, const D3DXVECTOR3 & c_rv3Position, UINT uiSkill = 0, BOOL isSendPacket = TRUE);
void __ProcessMotionEventAttackSuccess(DWORD dwMotionKey, BYTE byEventIndex, CActorInstance & rVictim);
void __ProcessMotionAttackSuccess(DWORD dwMotionKey, CActorInstance & rVictim);
void __HitStone(CActorInstance& rVictim);
void __HitGood(CActorInstance& rVictim);
void __HitGreate(CActorInstance& rVictim);
void __PushDirect(CActorInstance & rVictim);
void __PushCircle(CActorInstance & rVictim);
bool __isInvisible();
void __SetFallingDirection(float fx, float fy);
protected:
struct SSetMotionData
{
MOTION_KEY dwMotKey;
float fSpeedRatio;
float fBlendTime;
int iLoopCount;
UINT uSkill;
SSetMotionData()
{
iLoopCount=0;
dwMotKey=0;
fSpeedRatio=1.0f;
fBlendTime=0.0f;
uSkill=0;
}
};
protected:
float __GetAttackSpeed();
DWORD __SetMotion(const SSetMotionData& c_rkSetMotData, DWORD dwRandMotKey=0); // 모션 데이터 설정
void __ClearMotion();
bool __BindMotionData(DWORD dwMotionKey); // 모션 데이터를 바인딩
void __ClearHittedActorInstanceMap(); // 때려진 액터 인스턴스 맵을 지운다
UINT __GetMotionType(); // 모션 타입 얻기
bool __IsNeedFlyTargetMotion(); // FlyTarget 이 필요한 모션인가?
bool __HasMotionFlyEvent(); // 무언가를 쏘는가?
bool __IsWaitMotion(); // 대기 모션 인가?
bool __IsMoveMotion(); // 이동 모션 인가?
bool __IsAttackMotion(); // 공격 모션 인가?
bool __IsComboAttackMotion(); // 콤보 공격 모션 인가?
bool __IsDamageMotion(); // 데미지 모션인가?
bool __IsKnockDownMotion(); // 넉다운 모션인가?
bool __IsDieMotion(); // 사망 모션 인가?
bool __IsStandUpMotion(); // 일어서기 모션인가?
bool __IsMountingHorse();
bool __CanAttack(); // 공격 할수 있는가?
bool __CanNextComboAttack(); // 다음 콤보 어택이 가능한가?
bool __IsComboAttacking(); // 콤보 공격중인가?
void __CancelComboAttack(); // 콤보 공격 취소
WORD __GetCurrentMotionIndex();
DWORD __GetCurrentMotionKey();
int __GetLoopCount();
WORD __GetCurrentComboType();
void __ShowEvent();
void __HideEvent();
BOOL __IsHiding();
BOOL __IsMovingSkill(WORD wSkillNumber);
float __GetReachScale();
void __CreateAttributeInstance(CAttributeData * pData);
bool __IsFlyTargetPC();
bool __IsSameFlyTarget(CActorInstance * pInstance);
D3DXVECTOR3 __GetFlyTargetPosition();
protected:
void __DestroyWeaponTrace(); // 무기 잔상을 제거한다
void __ShowWeaponTrace(); // 무기 잔상을 보인다
void __HideWeaponTrace(); // 무기 잔상을 감춘다
protected:
// collision data
void OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector);
void OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance);
bool OnGetObjectHeight(float fX, float fY, float * pfHeight);
protected:
/////////////////////////////////////////////////////////////////////////////////////
// Motion Queueing System
TMotionDeque m_MotionDeque;
SCurrentMotionNode m_kCurMotNode;
WORD m_wcurMotionMode;
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// For Collision Detection
TCollisionPointInstanceList m_BodyPointInstanceList;
TCollisionPointInstanceList m_DefendingPointInstanceList;
SSplashArea m_kSplashArea; // TODO : 복수에 대한 고려를 해야한다 - [levites]
CAttributeInstance * m_pAttributeInstance;
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
// For Battle System
std::vector<CWeaponTrace*> m_WeaponTraceVector;
CPhysicsObject m_PhysicsObject;
DWORD m_dwcurComboIndex;
DWORD m_eActorType;
DWORD m_eRace;
DWORD m_eShape;
DWORD m_eHair;
BOOL m_isPreInput;
BOOL m_isNextPreInput;
DWORD m_dwcurComboBackMotionIndex;
WORD m_wcurComboType;
float m_fAtkDirRot;
CRaceData* m_pkCurRaceData;
CRaceMotionData* m_pkCurRaceMotionData;
// Defender
float m_fInvisibleTime;
BOOL m_isHiding;
// TODO : State로 통합 시킬 수 있는지 고려해 볼것
BOOL m_isResistFallen;
BOOL m_isSleep;
BOOL m_isFaint;
BOOL m_isParalysis;
BOOL m_isStun;
BOOL m_isRealDead;
BOOL m_isWalking;
BOOL m_isMain;
// Effect
DWORD m_dwBattleHitEffectID;
DWORD m_dwBattleAttachEffectID;
/////////////////////////////////////////////////////////////////////////////////////
// Fishing
D3DXVECTOR3 m_v3FishingPosition;
int m_iFishingEffectID;
// Position
float m_x;
float m_y;
float m_z;
D3DXVECTOR3 m_v3Pos;
D3DXVECTOR3 m_v3Movement;
BOOL m_bNeedUpdateCollision;
DWORD m_dwShakeTime;
float m_fReachScale;
float m_fMovSpd;
float m_fAtkSpd;
// Rotation
float m_fcurRotation;
float m_rotBegin;
float m_rotEnd;
float m_rotEndTime;
float m_rotBeginTime;
float m_rotBlendTime;
float m_fAdvancingRotation;
float m_rotX;
float m_rotY;
float m_fOwnerBaseTime;
// Rendering
int m_iRenderMode;
D3DXCOLOR m_AddColor;
float m_fAlphaValue;
// Part
DWORD m_adwPartItemID[CRaceData::PART_MAX_NUM];
// Attached Effect
std::list<TAttachingEffect> m_AttachingEffectList;
bool m_bEffectInitialized;
// material color
DWORD m_dwMtrlColor;
DWORD m_dwMtrlAlpha;
TPixelPosition m_kPPosCur;
TPixelPosition m_kPPosSrc;
TPixelPosition m_kPPosDst;
TPixelPosition m_kPPosAtk;
TPixelPosition m_kPPosLast;
THitDataMap m_HitDataMap;
CActorInstance * m_pkHorse;
CSpeedTreeWrapper * m_pkTree;
protected:
DWORD m_dwSelfVID;
DWORD m_dwOwnerVID;
protected:
void __InitializeStateData();
void __InitializeMotionData();
void __InitializeRotationData();
void __InitializePositionData();
public: // InstanceBase 통합전 임시로 public
IEventHandler* __GetEventHandlerPtr();
IEventHandler& __GetEventHandlerRef();
void __OnSyncing();
void __OnWaiting();
void __OnMoving();
void __OnMove();
void __OnStop();
void __OnWarp();
void __OnClearAffects();
void __OnSetAffect(UINT uAffect);
void __OnResetAffect(UINT uAffect);
void __OnAttack(WORD wMotionIndex);
void __OnUseSkill(UINT uMotSkill, UINT uLoopCount, bool isMoving);
protected:
void __OnHit(UINT uSkill, CActorInstance& rkInstVictm, BOOL isSendPacket);
public:
void EnableSkipCollision();
void DisableSkipCollision();
bool CanSkipCollision();
protected:
void __InitializeCollisionData();
bool m_canSkipCollision;
protected:
struct SBlendAlpha
{
float m_fBaseTime;
float m_fBaseAlpha;
float m_fDuration;
float m_fDstAlpha;
DWORD m_iOldRenderMode;
bool m_isBlending;
} m_kBlendAlpha;
void __BlendAlpha_Initialize();
void __BlendAlpha_Apply(float fDstAlpha, float fDuration);
void __BlendAlpha_Update();
void __BlendAlpha_UpdateFadeIn();
void __BlendAlpha_UpdateFadeOut();
void __BlendAlpha_UpdateComplete();
float __BlendAlpha_GetElapsedTime();
void __Push(int x, int y);
public:
void TEMP_Push(int x, int y);
bool __IsSyncing();
void __CreateTree(const char * c_szFileName);
void __DestroyTree();
void __SetTreePosition(float fx, float fy, float fz);
protected:
IEventHandler* m_pkEventHandler;
protected:
static bool ms_isDirLine;
};