890 lines
25 KiB
C++
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;
|
|
};
|