// sonador 10.2.1 팻 시스템 구현 #pragma once #include "SGamePet.h" #include /**------------------------------------------------------------------ @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 m_queueIgnoredItems; ///< 자동 아이템 줍기 기능 관련 - 못 줍는 아이템의 경우 무시한다. 10분유지 };