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

216 lines
6.2 KiB
C++

#pragma once
//------------------------------------------------------------------------------
/**
펫 클래스
@author 광수
@since 08.03.06
@remarks 09.08.11(소스정리)
-
*/
#include "Character.h"
struct sPet_Script_Info;
class uiPetGauge;
#define C_PET_MAX_GAUGE 100
enum ePET_NAME_STATE
{
NAME_DEFAULT =0, //펫이름(기본)
NAME_DRAW, //펫이름지정
NAME_UNDRAW, //펫이름안그림
};
typedef struct _PET_EFFECT_PARAM
{
HANDLE hEffect; //루프이펙트(포만감하락.친밀도맥스)핸들
ePET_EFFECT eEffectType;
}PET_EFFECT_PARAM;
// PET DATA
struct PET_DATA
{
DWORD dwIndex; //펫인덱스
BOOL bEffect; //루프이펙트활성화
ePET_NAME_STATE ePetName; //펫네임상태(활성.비활성)
BOOL bHeroPet; //주인공펫이냐?
BOOL bFlyOnHead; //머리위떠다니는펫
BYTE byFullness; //펫포만감수치
BYTE byIntimacy; //펫친밀도수치
BOOL bPetLock; //펫강제멈춤상태
BOOL bCharacterScene; //캐릭터씬이냐?
HANDLE hInstanceEffect; //인스턴스이펙트(단발이펙트지만 이펙트가길어서 위치보정위해핸들보유)
//emoticon관련변수
BOOL bMaxIntimacyFlag; //친밀도맥스이펙트발동flag
BOOL bLowFullnessFlag; //포만감부족이펙트발동flag
DWORD dwMaxIntimacyTime; //친밀도이펙랜덤발동타임1
DWORD dwMaxIntimacyOldTime; //친밀도이펙랜덤발동타임2
DWORD dwLowFullnessTime; //포만감이펙랜덤발동타임1
DWORD dwLowFullnessOldTime; //포만감이펙랜덤발동타임2
BOOL bPetNameHide; //이펙트안그리기flag
ePET_EFFECT eOldEffectType; //-보정:이전인스턴스이펙트가 어떤타입이냐?(연속생성방지위해)
DWORD dwPetBoringCnt; //펫5분대기타임
WzVector vOldPosition; //펫이전위치
PET_EFFECT_PARAM PetEffectParam; //펫루프이펙트구조체
DWORD dwIdlePetTime; //주인공 대기타임
DWORD dwIdlePetOldTime; //주인공 대기카운트
DWORD dwMasterObjKey; //펫주인의 오브젝트키값
BYTE byMoveGaugeUI; //고정petui
BYTE byHideState; //펫하이드상태인지
BASE_NPCINFO m_NPCInfo;
sPet_Script_Info* pet_script_ptr_;
};
class Pet : public Character
{
public:
Pet( void );
virtual ~Pet( void );
virtual BOOL Create( DWORD dwObjectKey, DWORD dwID = 0 );
virtual void Destroy( void );
virtual BOOL Process( DWORD dwTick );
void RenderInfo();
virtual BOOL Render();
virtual void AnimateUnit();
void SetFullness(BYTE byValue){m_Pet.byFullness=byValue;}
void SetIntimacy(BYTE byValue){m_Pet.byIntimacy=byValue;}
void RefreshPetName();
void RenderPetName();
virtual void StartExtraEffect();
void SetStatePetHide(BYTE byHide);
HANDLE CreateInstanceEffect(ePET_EFFECT eType,WzVector vPos);
void CreateInstanceEffect(ePET_EFFECT eType);
BASE_NPCINFO * GetMonsterInfo(){return &m_Pet.m_NPCInfo;}
virtual WzID GetCurrentMoveAnimation();
virtual WzID GetCurrentIdleAnimation();
void UpdateMeshHeight();
//순수가상합수재정의:pet에서는 안씀
virtual WzID GetCurrentAttackAnimation(){return 0;}
virtual WzID GetCurrentDeathAnimation(){return 0;}
virtual WzID GetCurrentDamageAnimation(BOOL bRight,BOOL bCritical){return 0;}
virtual void SetExp(EXPTYPE dwExp){}
virtual EXPTYPE GetExp(){return 0;}
virtual EXPTYPE GetNextExp(){return 0;}
virtual void SetLevel(LEVELTYPE LV){}
virtual LEVELTYPE GetLevel(){return 0;}
virtual DWORD GetMaxHP(){return 0;}
virtual DWORD GetMaxMP(){return 0;}
private:
//process
void ProcessEmoticon(DWORD dwTick);
WzID GetPetEffectCode(ePET_EFFECT eType);
void AddMotionEffect(ePET_EFFECT eType,float fScaleSize=0.7f);
void UpdatePetEffectPos();
void DestroyEffect();
//위치관련
WzVector GetPetBoundingVolume();
float GetWarpDistance();
float GetFollowDistance();
float GetStopPositon();
float GetDistanceMaster(WzVector vPos);
WzVector GetBasePostion();
//행동.게이지
void ProcessPetUnit(DWORD dwTick);
void RenderPetGauge();
//액션
void FollowAction();
void BaseAction(DWORD dwTick);
void WrapAction();
public:
//외부인터페이스
Player* GetMasterObject();
void UpdatePetAttributes(BOOL bHero = TRUE);
inline void DestroyPetEffect(){CreateInstanceEffect(E_DESTORY,GetPosition());}
void PetEatAction();
void InitPetMonster(DWORD dwMaserKey,WORD wPetIndex);
void RefreshEffect();
void SetModifyPosition(float fAngle,float fDistance);
void SetPetLock(BOOL bLock);
void SetSubType(BYTE subtype);
bool RefreshApperPet(Player* master_ptr);
PET_DATA* GetPet() { return &m_Pet; }
private:
PET_DATA m_Pet;
uiPetGauge* pet_dialog() { return pet_dialog_; }
uiPetGauge* pet_dialog_;
};
//------------------------------------------------------------------------------
/**
*/
inline float Pet::GetWarpDistance()
{
return 15.f;
}
//------------------------------------------------------------------------------
/**
*/
inline float Pet::GetFollowDistance()
{
return ((m_Pet.bFlyOnHead) ? (1.3f):(2.5f));
}
//------------------------------------------------------------------------------
/**
*/
inline float Pet::GetStopPositon()
{
return (m_Pet.bFlyOnHead ? 0.0f:1.3f);
}
//------------------------------------------------------------------------------
/**
*/
inline WzID Pet::GetCurrentIdleAnimation()
{
WzID animationID = StrToWzID("N001");
return animationID;
}
//------------------------------------------------------------------------------
/**
*/
inline WzID Pet::GetCurrentMoveAnimation()
{
WzID animationID = StrToWzID("N004");
return animationID;
}
//------------------------------------------------------------------------------
/**
*/
inline WzID Pet::GetPetEffectCode(ePET_EFFECT eType)
{
switch(eType)
{
case E_BORING: return StrToWzID("R025"); //5분대기
case E_OWNER_LVUP: return StrToWzID("R035"); //주인랩업
case E_OWNER_DEATH: return StrToWzID("R040"); //주인죽음
case E_DECREASE_INTIMACY: return StrToWzID("R045"); //친밀도하락
case E_AUTO_PICK_ITEM: return StrToWzID("R050"); //아이템자동줍기
case E_EAT: return StrToWzID("R015"); //먹이섭취
case E_WARP: return StrToWzID("k470"); //워프이펙트
case E_DESTORY: return StrToWzID("R006"); //소환해제
case E_MIN_FULLNESS: return StrToWzID("R000"); //포만감 min
case E_MAX_INTIMACY: return StrToWzID("R002"); //친밀도 max
default:return 0;
}
}