Files
2022-10-26 12:25:11 +08:00

178 lines
4.7 KiB
C++

#pragma once
struct sRiderInfo;
class ObjectAniEventController;
enum RiderParts
{
RP_BASE, //탈것기본모형
RP_BODY, //갑옷
RP_BOOTS, //부츠
RP_HELM, //투구
RP_COUNT,
};
class Rider : public ObjectAniEventController
{
public:
Rider( void );
virtual ~Rider( void );
//라이더 생성
virtual BOOL Create(DWORD dwRiderIndex, Player* master_ptr, BOOL summon_effect);
//리소스해제
virtual void Destroy( void );
//------------------------------------------------------------------------------
//! Qualifier: 애니메이션설정
//! Parameter: WzID wzID : 애니메이션 코드
//! Parameter: BOOL bLoop : loop 여부
//! Parameter: BOOL bRestart : bLoop == TRUE 이면 무조건 bRestart = FALSE로 셋팅됨
//------------------------------------------------------------------------------
void SetAnimation(WzID wzID, BOOL bLoop = FALSE, BOOL bRestart = TRUE);
//애니메이션계산
virtual void AnimateUnit(Player* master_ptr);
//애니메이션 프레임계산
virtual BOOL Process(DWORD dwTick, Player* master_ptr);
//랜더:Display용
virtual BOOL Render( St_RenderCommand *pCommand);
//랜더
virtual BOOL Render();
//라이더복사(주인공탈것용)
void CopyRider(Rider *pRider, bool is_with_parts = true);
//라이더복사(슬롯에서탈것용)
void CopyRiderBody(DWORD dwRiderIndex, Player* master_ptr);
//변환(위치,회전)
void Transform(CWzUnitDraw* pMaster);
//베이스파츠(라이더몸통)
CWzUnitDraw* GetRenderPart(){return m_ppRenderPart[RP_BASE];}
//라이더파츠(라이더파츠)
inline CWzUnitDraw* GetRenderPart(int iIndex);
//위치.회전.크기
void SetScale(WzVector vScale);
void SetPosition(WzVector *pPos) { if(GetRenderPart()) GetRenderPart()->SetPosition(*pPos);}
void SetRotation(const WzVector* normal_axis, float master_angle);
void SetForceLod(int iLod);
//파츠 장착.탈착.서브타입(왁싱)
void AttachRiderPart(int nIdx, DWORD dwItemCode);
//------------------------------------------------------------------------------
//! Returns: void
//! Qualifier: z-base 값옷 부터
//! Parameter: int nIdx
//! 0 = 갑옷
//! 1 = 부츠
//! 2 = 투구
//------------------------------------------------------------------------------
void DetachRiderPart(int nIdx);
void DetachPart(const RiderParts& rider_parts);
void SetSubtype(int nPartIdx,int nSubType);
void SetColor(WzColor color){m_Color=color;}
void EnableFunction(BOOL bFlag);
char GetAniMapping(){return m_Animaping;}
DWORD GetRiderIndex(){return m_dwRiderIndex;}
WzVector* GetLinkPos(){return &m_vLinkPos;}
bool RefreshApperRider(Player* master_ptr);
//! 탈것이 날기 생태인지
bool is_spread() { return is_spread_; }
void set_spread(bool val) { is_spread_ = val; }
bool is_possible_fly();
WzID current_animation() const { return current_animation_; }
void set_current_animation(WzID val) { current_animation_ = val; }
private:
// 소환이펙트 유무
DWORD effect_code() const { return effect_code_; }
void set_effect_code(DWORD val) { effect_code_ = val; }
// 보간상태
bool is_interpoate() const { return is_interpoate_; }
void set_is_interpoate(bool val) { is_interpoate_ = val; }
// 보간축
WzVector& interpolate_axis(){ return interpolate_axis_; }
void set_interpolate_axis(const WzVector& val) { interpolate_axis_ = val; }
// 이전 노말축
WzVector& prev_axis(){ return prev_axis_; }
void set_prev_axis(const WzVector& val) { prev_axis_ = val; }
// 이전 각도
float prev_angle() const { return prev_angle_; }
void set_prev_angle(float val) { prev_angle_ = val; }
// 회전행렬
WzMatrix& rotate_matrix(){ return rotate_matrix_; }
//라이더 맵핑정보
char m_Animaping;
//라이더인덱스
DWORD m_dwRiderIndex;
//링크본노드번호
int m_iLinkNode;
//컬러
WzColor m_Color;
//라이더파츠정보
CWzUnitDraw* m_ppRenderPart[RP_COUNT];
//링크위치
WzVector m_vLinkPos;
//지형에 붙이기위한 정보
//생성시체크함수
BOOL m_bSetInterpolate;
//현재 애니메이션 아이디
WzID current_animation_;
//메인파츠 리소스코드
DWORD body_skin_;
//생성시 이펙트코드
DWORD effect_code_;
//회전.축보간(회전)
float prev_angle_;
WzMatrix rotate_matrix_;
bool is_interpoate_;
WzVector prev_axis_;
WzVector interpolate_axis_;
//! 탈것이 날개를 폈는지.
bool is_spread_;
};
//라이더파츠값만
CWzUnitDraw* Rider::GetRenderPart(int iIndex)
{
if(iIndex==RP_BASE)
{
return NULL;
}
if(iIndex>=RP_COUNT)
{
return NULL;
}
else
{
return m_ppRenderPart[iIndex];
}
}