Files
Leviathan/Client/Game/game/Player/SGameLocalPet.h
T
2026-06-01 12:46:52 +02:00

74 lines
3.6 KiB
Objective-C

// sonador 10.2.1 팻 시스템 구현
#pragma once
#include "SGamePet.h"
#include <deque>
/**------------------------------------------------------------------
@class SGameLocalPet
@brief Avatar class for local player's pet
@author sonador
-------------------------------------------------------------------*/
class SGameLocalPet : public SGamePet
{
public:
enum DISTANCE_TYPE
{
DISTANCE_3 = 3 * GameRule::DEFAULT_UNIT_SIZE,
DISTANCE_15 = 15 * GameRule::DEFAULT_UNIT_SIZE,
DISTANCE_50 = 50 * GameRule::DEFAULT_UNIT_SIZE,
DISTANCE_150 = 150 * GameRule::DEFAULT_UNIT_SIZE,
};
SGameLocalPet( int nPetID );
virtual ~SGameLocalPet();
virtual void Destroy(); /// 2010.10.13 - prodongi
virtual bool Process( DWORD time, unsigned long procBitSet = 0 ); ///< process local pet
virtual void OnInput( class SGameInput* input ); ///< process game input data
virtual void ReqTakeItem( AR_HANDLE handle ); ///< process to acquire item
virtual void ReqMove( AR_HANDLE handle, const ArPosition& target, bool speedSync = true, bool chase = false ); ///< process moving request
/// 2010.10.14 - prodongi
virtual void ReqCast( AR_HANDLE target, int skillID, int skillLv, K3DVector const& targetPos ); ///< process casting request
virtual void ReqCancelAction(); ///< process canceling action request
virtual void CmdIdle(); ///< (스크립트 대응)Idle 명령: 소환자와의 거리 검사 후 이동여부 결정
virtual void CmdMove(); ///< (스크립트 대응)Move 명령: 이동
virtual void InputCmd_MoveToFitPosition( bool syncWithMasterPlayer = false, bool immediately = false ); ///< locate pet at the best position
virtual void SetAutoPickItemMode( bool activate ) { m_bPickItemMode = activate; } ///< 팻 자동 줍기 모드 설정 {2.1.2.4.3}
virtual bool IsAutoPickItemMode() { return m_bPickItemMode; } ///< 팻 자동 줍기 모드 활성화 여부 {2.1.2.4.3}
virtual void SetAutoPickItemDistanceByMeter( float meter ); ///< 팻 자동 줍기 거리 설정( meter ) {2.1.2.4.3}
void DeleteItemFromIgnoreQueue(AR_HANDLE id);
private:
// internal method
virtual const char* getClassName() { return "SGamePet"; } ///< for type identification
bool GetFitPosition( K3DVector& out ); ///< find fit position
AR_UNIT GetSize( SGameObject* object ); ///< calculate object's real radius
bool HasStateHeld(); ///< 현재 HOLD 된 상태인가?
bool IsFarFrom( SGameAvatarEx* Target, DISTANCE_TYPE Type ); ///< 아바타와의 거리를 점검
void UpdateStateByScript(); ///< 현재 스테이트 설정에 따라 스크립트 호출
// member variables
DWORD m_dwUpdateTime; ///< time value for update
DWORD m_dwFindDetour; ///< time value for rarely finding path
DWORD m_dwFindDetourTick; ///< time interval for rarely finding path
DWORD m_dwBeginScriptTime; ///< 스크립트 호출 주기 검사 시작 값
DWORD m_dwCallScriptTime; ///< 스크립트 호출 주기
AR_UNIT m_arMySize; ///< size of this pet
bool m_bPickItemMode; ///< 자동 아이템 줍기
float m_fPickItemDistance; ///< 자동 아이템 줍기 가능 거리 // sonador #2.1.2.4.3 팻 조작 UI 연동
K3DVector m_vMasterLastPos; // 주인님 마지막 좌표
struct IgnoredItem
{
DWORD m_dwIgnoredTime;
DWORD m_dwLastAttemptedTime;
AR_HANDLE m_hItem;
int m_nTryCount;
};
DWORD m_dwCurrentTime;
DWORD m_dwItemPickCommandTime;
std::deque<IgnoredItem> m_queueIgnoredItems; ///< 자동 아이템 줍기 기능 관련 - 못 줍는 아이템의 경우 무시한다. 10분유지
};