forked from metin2/server
163 lines
4.3 KiB
C
163 lines
4.3 KiB
C
|
#ifndef __HEADER_PET_SYSTEM__
|
|||
|
#define __HEADER_PET_SYSTEM__
|
|||
|
|
|||
|
|
|||
|
class CHARACTER;
|
|||
|
|
|||
|
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20>ɷ<EFBFBD>ġ? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ģ<>е<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>... <20><>ġ
|
|||
|
struct SPetAbility
|
|||
|
{
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*/
|
|||
|
class CPetActor //: public CHARACTER
|
|||
|
{
|
|||
|
public:
|
|||
|
enum EPetOptions
|
|||
|
{
|
|||
|
EPetOption_Followable = 1 << 0,
|
|||
|
EPetOption_Mountable = 1 << 1,
|
|||
|
EPetOption_Summonable = 1 << 2,
|
|||
|
EPetOption_Combatable = 1 << 3,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
protected:
|
|||
|
friend class CPetSystem;
|
|||
|
|
|||
|
CPetActor(LPCHARACTER owner, DWORD vnum, DWORD options = EPetOption_Followable | EPetOption_Summonable);
|
|||
|
// CPetActor(LPCHARACTER owner, DWORD vnum, const SPetAbility& petAbility, DWORD options = EPetOption_Followable | EPetOption_Summonable);
|
|||
|
|
|||
|
virtual ~CPetActor();
|
|||
|
|
|||
|
virtual bool Update(DWORD deltaTime);
|
|||
|
|
|||
|
protected:
|
|||
|
virtual bool _UpdateFollowAI(); ///< <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٴϴ<D9B4> AI ó<><C3B3>
|
|||
|
virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< <20><><EFBFBD><EFBFBD> <20><>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> ȥ<><C8A5> <20><><EFBFBD><EFBFBD> AI ó<><C3B3>
|
|||
|
|
|||
|
/// @TODO
|
|||
|
//virtual bool _UpdateCombatAI();
|
|||
|
|
|||
|
private:
|
|||
|
bool Follow(float fMinDistance = 50.f);
|
|||
|
|
|||
|
public:
|
|||
|
LPCHARACTER GetCharacter() const { return m_pkChar; }
|
|||
|
LPCHARACTER GetOwner() const { return m_pkOwner; }
|
|||
|
DWORD GetVID() const { return m_dwVID; }
|
|||
|
DWORD GetVnum() const { return m_dwVnum; }
|
|||
|
|
|||
|
bool HasOption(EPetOptions option) const { return m_dwOptions & option; }
|
|||
|
|
|||
|
void SetName(const char* petName);
|
|||
|
|
|||
|
bool Mount();
|
|||
|
void Unmount();
|
|||
|
|
|||
|
DWORD Summon(const char* petName, LPITEM pSummonItem, bool bSpawnFar = false);
|
|||
|
void Unsummon();
|
|||
|
|
|||
|
bool IsSummoned() const { return 0 != m_pkChar; }
|
|||
|
void SetSummonItem (LPITEM pItem);
|
|||
|
DWORD GetSummonItemVID () { return m_dwSummonItemVID; }
|
|||
|
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20>ŵδ<C5B5> <20>Լ<EFBFBD>.
|
|||
|
// <20>̰<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
|||
|
// POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED<45><44> PointChange()<29><> <20>Լ<EFBFBD><D4BC><EFBFBD> <20>Ἥ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҿ<EFBFBD><D2BF><EFBFBD> <20><><EFBFBD>°<EFBFBD>,
|
|||
|
// PointChange() <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD> ComputePoints()<29><> <20>ϸ<EFBFBD> <20>ϴ<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ǰ<EFBFBD>,
|
|||
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ComputePoints()<29><> <20>θ<EFBFBD><CEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> POINT<4E><54> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´ٴ<C2B4> <20>Ŵ<EFBFBD>.
|
|||
|
// <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> ComputePoints() <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> petsystem->RefreshBuff()<29><> <20>θ<EFBFBD><CEB8><EFBFBD><EFBFBD><EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD>,
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ClearBuff()<29><> <20>θ<EFBFBD><CEB8><EFBFBD>, ComputePoints<74><73> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
|||
|
void GiveBuff();
|
|||
|
void ClearBuff();
|
|||
|
|
|||
|
private:
|
|||
|
DWORD m_dwVnum;
|
|||
|
DWORD m_dwVID;
|
|||
|
DWORD m_dwOptions;
|
|||
|
DWORD m_dwLastActionTime;
|
|||
|
DWORD m_dwSummonItemVID;
|
|||
|
DWORD m_dwSummonItemVnum;
|
|||
|
|
|||
|
short m_originalMoveSpeed;
|
|||
|
|
|||
|
std::string m_name;
|
|||
|
|
|||
|
LPCHARACTER m_pkChar; // Instance of pet(CHARACTER)
|
|||
|
LPCHARACTER m_pkOwner;
|
|||
|
|
|||
|
// SPetAbility m_petAbility; // <20>ɷ<EFBFBD>ġ
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
*/
|
|||
|
class CPetSystem
|
|||
|
{
|
|||
|
public:
|
|||
|
typedef boost::unordered_map<DWORD, CPetActor*> TPetActorMap; /// <VNUM, PetActor> map. (<28><> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> vnum<75><6D> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..??)
|
|||
|
|
|||
|
public:
|
|||
|
CPetSystem(LPCHARACTER owner);
|
|||
|
virtual ~CPetSystem();
|
|||
|
|
|||
|
CPetActor* GetByVID(DWORD vid) const;
|
|||
|
CPetActor* GetByVnum(DWORD vnum) const;
|
|||
|
|
|||
|
bool Update(DWORD deltaTime);
|
|||
|
void Destroy();
|
|||
|
|
|||
|
size_t CountSummoned() const; ///< <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF>(<28><>üȭ <20><> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD>) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
public:
|
|||
|
void SetUpdatePeriod(DWORD ms);
|
|||
|
|
|||
|
CPetActor* Summon(DWORD mobVnum, LPITEM pSummonItem, const char* petName, bool bSpawnFar, DWORD options = CPetActor::EPetOption_Followable | CPetActor::EPetOption_Summonable);
|
|||
|
|
|||
|
void Unsummon(DWORD mobVnum, bool bDeleteFromList = false);
|
|||
|
void Unsummon(CPetActor* petActor, bool bDeleteFromList = false);
|
|||
|
|
|||
|
// TODO: <20><>¥ <20><> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. (ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...)
|
|||
|
CPetActor* AddPet(DWORD mobVnum, const char* petName, const SPetAbility& ability, DWORD options = CPetActor::EPetOption_Followable | CPetActor::EPetOption_Summonable | CPetActor::EPetOption_Combatable);
|
|||
|
|
|||
|
void DeletePet(DWORD mobVnum);
|
|||
|
void DeletePet(CPetActor* petActor);
|
|||
|
void RefreshBuff();
|
|||
|
|
|||
|
private:
|
|||
|
TPetActorMap m_petActorMap;
|
|||
|
LPCHARACTER m_pkOwner; ///< <20><> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> Owner
|
|||
|
DWORD m_dwUpdatePeriod; ///< <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ֱ<EFBFBD> (ms<6D><73><EFBFBD><EFBFBD>)
|
|||
|
DWORD m_dwLastUpdateTime;
|
|||
|
LPEVENT m_pkPetSystemUpdateEvent;
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
// Summon Pet
|
|||
|
CPetSystem* petSystem = mainChar->GetPetSystem();
|
|||
|
CPetActor* petActor = petSystem->Summon(~~~);
|
|||
|
|
|||
|
DWORD petVID = petActor->GetVID();
|
|||
|
if (0 == petActor)
|
|||
|
{
|
|||
|
ERROR_LOG(...)
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
// Unsummon Pet
|
|||
|
petSystem->Unsummon(petVID);
|
|||
|
|
|||
|
// Mount Pet
|
|||
|
petActor->Mount()..
|
|||
|
|
|||
|
|
|||
|
CPetActor::Update(...)
|
|||
|
{
|
|||
|
// AI : Follow, actions, etc...
|
|||
|
}
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif //__HEADER_PET_SYSTEM__
|