Files
Sun1602/Server/GameServer/Player.h
T
2022-10-26 12:25:11 +08:00

1187 lines
45 KiB
C++

// Player.h: interface for the Player class.
//
//////////////////////////////////////////////////////////////////////
#ifndef __GAMESERVER_PLAYER_H
#define __GAMESERVER_PLAYER_H
#pragma once
//==================================================================================================
// <INCLUDEs>
//
#include <Const.h>
#include <Struct.h>
#include <PacketStruct_CG.h>
#include <SCSlotContainer.h>
#include <SCPlayer.h>
#include <Timer.h>
#include <misc.h>
#include "../../SolarTrigger/TriggerMsg.h"
//
#include "Character.h"
#include "PlayerAttrForUpdate.h"
#include "VarMsg.h"
#include "ItemOwnFlag.h"
#include "PlayerEventManager.h" //Event정보들 이전
#include "WareInvenProtector.h"
#include "./FriendInvitation/InvitateFriendInfo.h" //친구 초대 이벤트
#include "CPetManager.h"
#include "EtherEmissionDevice.h"
#ifdef _NA_20100307_BETAKEY_SYSTEM
#include <BetaKey.h>
#endif
#ifdef _NA_003027_20111013_HONOR_SYSTEM
#include "HonorSystem/HonorManager.h"
#endif //_NA_003027_20111013_HONOR_SYSTEM
#ifdef _NA004034_20120102_POINT_WALLET_SYSTEM
#include "PointSystem/PointWalletManager.h"
#endif //_NA004034_20120102_POINT_WALLET_SYSTEM
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
#include <World/ChaosZoneSystem/BattleGroundPlayerInfo.h>
#ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH
#include "World/ChaosZoneSystem/GoldRushPlayerInfo.h"
#include "World/ChaosZoneSystem/ChaosZoneManager.h"
#endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH
#include "CharacterInfoExManager.h"
#ifdef _NA_006633_20130415_ADD_BATTLEGROUND_ASSIST
#include "World/ChaosZoneSystem/PlayerAssistMeter.h"
#endif //_NA_006633_20130415_ADD_BATTLEGROUND_ASSIST
#include "RatioManager.h" //_NA_000000_20130612_RANDOMIZER_CHANGE
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
#include "PlayerSpaInfo.h"
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
//==================================================================================================
//
//
#define __GAMESERVER_PLAYER_INL
#include "Player_NestedInfo.hxx"
#undef __GAMESERVER_PLAYER_INL
//
//
//==================================================================================================
class ChaosZone;
#ifdef _NA_008334_20150608_SONNENSCHEIN
class GameGuild;
#endif //_NA_008334_20150608_SONNENSCHEIN
//==================================================================================================
// <DECLARATIONs>
struct PLAYER_SUMMON_INFO
{
MONSTERCODE monster_code;
DWORD hp;
DWORD mp;
DWORD remained_time;
eSUMMON_COMMAND command;
SLOTCODE skill_code;
#ifdef _NA_007667_20141001_WITCHBLADE_SKILL
eSUMMON_TYPE summoned_type;
#endif //_NA_007667_20141001_WITCHBLADE_SKILL
PLAYER_SUMMON_INFO() :
monster_code(0), hp(0), mp(0), remained_time(0), command(eSUMMON_COMMAND_FOLLOW), skill_code(0)
#ifdef _NA_007667_20141001_WITCHBLADE_SKILL
,summoned_type(eSUMMON_NORMAL)
#endif //_NA_007667_20141001_WITCHBLADE_SKILL
{
}
};
typedef std::list<PLAYER_SUMMON_INFO*> PLAYER_SUMMON_INFO_LIST;
typedef PLAYER_SUMMON_INFO_LIST::iterator PLAYER_SUMMON_INFO_LIST_ITER;
//_KR_0_20091021_FIRENDINVITATION_EXTEND = {
typedef STLX_MAP<DWORD, DWORD64> RECALL_MSGBOX_TIME_MAP;
typedef RECALL_MSGBOX_TIME_MAP::iterator RECALL_MSGBOX_TIME_MAP_ITER;
typedef std::pair< DWORD, DWORD64> RECALL_MSGBOX_TIME_MAP_PAIR;
//}
//==================================================================================================
// <TYPE DEFINITIONS>
//
#define SNAPSHOT_LOG_CYCLE (1000*60*10) // 10분 단위 스냅 샷 남기기..
#define FATIGUE_LOG_CYCLE (1000*60*60) // 1시간 단위 피로도 남기기..
//==================================================================================================
// <PLAYER CLASS DEFINITION>
//
class Player : public Character//,
//public SCPlayer
{
private:
friend class PlayerManager;
friend class Village;
friend class Zone;
//friend class View; // (WAVERIX)(080528) - 구조 변경 과정에서 임시 접근 허용
friend class PlayerOperator;
enum
{
_DBP_UPDATE_CYCLE_DELAY = 1000*60*3, //< 임시 : 5분 딜레이 => 3분 딜레이로 줄임
REBIRTH_STEEL_MODE_TIME = 1000*5, // 부활시 5초간 강철모드..
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
DOMINATION_REBIRTH_STEEL_MODE_TIME = 0, // 점령전 부활시 0초간 강철모드
#else
DOMINATION_REBIRTH_STEEL_MODE_TIME = 1000*2, // 점령전 부활시 2초간 강철모드
#endif //_NA_006826_20130722_DOMINATION_RENEWAL
PLAYER_SKILL_COOLTIME_INIT_NUM = 30,
LOADING_STEEL_MODE_TIME = 1000*15, // 로딩시 15초간 강철모드
DOMINATION_LOADING_STEEL_MODE_TIME = 1000*7, // 점령전 로딩시 7초간 강철모드
};
//----------------------------------------------------------------------------------------------
//
//_NA_004035_20120227_COSTUME_ITEM
public:
// 코스튬 처리기
class CostumeHandler
{
friend class Player;
private:
explicit CostumeHandler(Player* const owner) :
owner_(owner),
is_applyed_option_(false)
#ifdef _RU_006860_20130806_COSTUME_PCBANG_EFFECT
,is_applyed_pcbang_option_(false)
#endif //_RU_006860_20130806_COSTUME_PCBANG_EFFECT
{
}
~CostumeHandler()
{
}
public:
// 코스튬 아이템을 사용한다.
bool Use(const SLOTCODE item_code, const POSTYPE item_pos);
bool Equipped(SCItemSlot& item_slot, const bool is_equipped);
// 캐릭터 정보 설정시 코스튬 정보를 설정한다.
void SetCostumeInfo();
// 옵션 적용 여부 플래그
inline bool GetIsApplyedOption() { return is_applyed_option_; }
#ifdef _RU_006860_20130806_COSTUME_PCBANG_EFFECT
// 피시방옵션이 적용중인 상태인지 확인한다.
inline bool GetIsApplyedPCBANGOption() { return is_applyed_pcbang_option_;}
#endif //_RU_006860_20130806_COSTUME_PCBANG_EFFECT
private:
CostumeHandler(const CostumeHandler&);
void operator=(const CostumeHandler&);
private:
void ApplyOption(SCItemSlot& item_slot, const bool is_add);
private:
Player* owner_;
bool is_applyed_option_;
#ifdef _RU_006860_20130806_COSTUME_PCBANG_EFFECT
bool is_applyed_pcbang_option_;
#endif //_RU_006860_20130806_COSTUME_PCBANG_EFFECT
};
public:
Player();
virtual ~Player();
virtual BOOL Init();
virtual void Release();
void Create(ServerSession* pServerSession, DWORD UserKey,
const TCHAR* pszID, const CHAR* pszIP, time_t LoginTime_t);
//void Destroy();
// CHANGES: f101115.3L, make an independent method
// for stable player closing process using shared data.
void CloseSharedTransactions();
//virtual BOOL Update(DWORD dwDeltaTick);
virtual BOOL Update(const util::ServerTimeInfoPerFrame* time_info_per_frame, BOOL bSectorUpdate);
virtual void Reuse() { Release(); }
// GM관련
// BOOL IsSuperPlayer();
BOOL IsDBCharState(eDBCHAR_STATE stat); // (UNUSED)
void SetDBCharState(eDBCHAR_STATE stat, WORD wMinutes = 0); //< wMinutes 블럭할 시간
// 최신 적용 데이터
//virtual BASE_PLAYERINFO* GetCharInfo();
// returns : encoded size
int GetPlayerRenderInfo(BOOLEAN is_player_render, PLAYER_RENDER_INFO_EX* OUT pack_info);
//----------------------------------------------------------------------------------------------
// below interfaces is extracted from the SCPlayer
ePLAYER_STATE GetState() const;
void SetState(ePLAYER_STATE player_state);
const BASE_PLAYERINFO* GetCharInfo() const;
BASE_PLAYERINFO* GetCharInfo();
void OnSetCharInfo();
void SetCharInfo(BASE_PLAYERINFO* char_info);
// removed an unused method because of the kind of a weapon can acquire from an equip container
//void SetWeaponKind(DWORD weapon_kind) { weapon_kind; }
DWORD GetWeaponKind() const;
// Item Cool Timer
void SetItemCoolTime(BOOL bPoolUse, DWORD cool_time_margin = 0);
void FreeItemCoolTime(BOOL bPoolUse);
util::Timer* GetItemCoolTimer(WORD wType); //{ return m_pItemCoolTimeHash->GetData(wType); };
void InitializeItemCooltime();
//
//----------------------------------------------------------------------------------------------
void SetBehave(ePLAYER_BEHAVE_STATE state);
ePLAYER_BEHAVE_STATE GetBehave() const;
void ResumeTimer();
void SuspendTimer();
//----------------------------------------------------------------------------------------------
// 월드설정 및 유저키
void SetStaticWorld(CWorldBase* pWorld);
void SetUserKey(DWORD dwUserKey);
DWORD GetUserKey() const;
const char* GetUserID() const;
void SetUserID(const char* pszID);
const char* GetUserIP() const;
void SetUserIP(const char* pszIP);
inline void SetLoginTime_t(time_t time);
inline time_t GetLoginTime_t() const;
inline void SetDebugInfoFlag(BYTE byFlag);
inline BYTE GetDebugInfoFlag() const;
//----------------------------------------------------------------------------------------------
// 패킷 Send 및 세션 관련
virtual BOOL SendPacket(MSG_BASE_FORWARD* pMsg, WORD wSize, BOOL bCompress = FALSE);
virtual BOOL SendExPacket(DWORD dwNumberOfMessages, BYTE** pMsg, WORD* pwSize);
virtual void SendPacketAround(MSG_BASE_FORWARD* pMsg, WORD wSize, BOOL bSendToMe = TRUE, GUILDGUID OtherGuildGuid = INVALID_GUILDGUID);
virtual void SendExPacketAround(DWORD dwNumberOfMessages, BYTE** pMsg, WORD* pwSize, BOOL bSendToMe = TRUE);
template< typename _MSGSUBTYPE >
inline void SendPacketForSync(const _MSGSUBTYPE* const pMsgSub);
private:
void SendPacketForSync_(const BYTE _TAG, WAR_TAG_V* const IN pMsg, const WORD wSize);
public:
BOOL SendToGameDBPServer(MSG_BASE_FORWARD* pMsg, WORD wSize);
BOOL SendToGuildServer(MSG_BASE_FORWARD* pMsg, WORD wSize);
void SetServerSession(ServerSession* pSession);
ServerSession* GetServerSession() const;
void ForceDisconnect(BYTE reason);
//----------------------------------------------------------------------------------------------
// 전투관련
// CHANGES, f100830.4L, replace an arguement block for a skill to a SkillInfo
RC::eBATTLE_RESULT CanNormalAttack(SkillInfo* preparing_skill_info_data);
RC::eBATTLE_RESULT CanStyleAttack(SkillInfo* preparing_skill_info_data);
virtual BOOL CanAttack();
virtual BOOL CanBeAttacked() const;
void SetAttackDelay(BYTE byAttackSequence, SLOTCODE StyleCode);
virtual BOOL OnResurrection(float fRecoverExp, float fRecoverHP, float fRecoverMP, Player *pHealer=NULL);
virtual void OnDead(); // 죽었을 때
virtual void OnAttack(Character *pTarget, SLOTCODE skillcode, DAMAGETYPE damage); // 공격할 때
protected:
virtual void _Damaged(DamageArgs* damage_arg);
#ifdef _NA_008132_20150316_MONDSCHEIN_TEXTLOG
virtual VOID _WriteMondschienLog(Character* attacker, SLOTCODE skill_code, DAMAGETYPE damage_value);
VOID _WriteMondschienLog_StatusList(Character* user);
BOOL _IsLogTargetUser(Character* user);
BOOL _IsLogTargetGuildUser(GUILDGUID guild_guid);
#endif //_NA_008132_20150316_MONDSCHEIN_TEXTLOG
#ifdef _NA_008706_20160229_TEXTLOG_PK
virtual VOID _WriteBattleMonitorLog(Character* attacker, SLOTCODE skill_code, DAMAGETYPE damage_value);
#endif //_NA_008706_20160229_TEXTLOG_PK
public:
virtual void ApplyPenalty();
void SetLastAttackSeq(BYTE byAttackSequence);
BYTE GetLastAttackSeq() const;
virtual eUSER_RELATION_TYPE IsFriend(Character* pTarget);
MovementChecker* GetMovementChecker();
nsSync::CSSyncTuner* GetSyncTuner();
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
VOID OnRecoverFP(PLAYERFP recoverFP);
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
//_NA_0_20091118_GAMEROOM_BATTLE_RESULT
virtual VOID OnRecover( INT recoverHP, INT recoverMP, INT recoverSD = 0, eRECOVER_TYPE recoverType = eRECOVER_TYPE_NORMAL, Character* pAttacker = NULL );
virtual void ForcedAttack(Character *pTarget);
virtual BOOL CanResurrection(Character *pTarget);
//----------------------------------------------------------------------------------------------
// 동작
virtual void SetActionDelay(DWORD delay);
DWORD GetActionDelay();
BOOL IsActionExpired();
BOOLEAN IsDoingAction() const;
//----------------------------------------------------------------------------------------------
// 위치 변화
virtual BOOL ExecuteThrust(BOOL bForcedMove, WzVector *pwvMoveDistance, WzVector &wvPosAfterThrust, float fMoveDistance, BOOL bDownAfterThrust=FALSE);
RC::ePORTAL_RESULT Portal(ePORTAL_TYPE ePortalType, FIELDCODE ToFieldCode, WzVector& vDestPos, POSTYPE atItemPos);
RC::ePORTAL_RESULT CanPortal();
BOOL ReCallPlayer(char const character_name[MAX_CHARNAME_LENGTH], const KEYTYPE room_key, FIELDCODE field_code, WzVector dest_pos,
ePORTAL_TYPE portal_type, POSTYPE item_pos, SLOTCODE item_code);
//----------------------------------------------------------------------------------------------
// 아이템 관련
RC::eITEM_RESULT CanUseItem(const BASE_ITEMINFO* pItemInfo); // (CHANGES) const
void ResetUseItem(WORD wCoolTimeType);
ItemManager* GetItemManager() const;
QuickManager* GetQuickManager() const;
BOOL CanUsePotion();
void UseHPPotion(int recoverHP, int iApplicationTime, int iPeriodicTime);
void UseMPPotion(int recoverMP, int iApplicationTime, int iPeriodicTime);
void StatPointUpItemUse();
SkillSlotManager* GetSkillSlotManager() const;
// _NA002217_100728_EP2_PERK_SYSTEM_
nsSkill::PerkManager* GetPerkManager() const;
// 파라미터(정보 설정 및 얻기)
#if !defined(_NA_002289_20110322_EQUIPMENTS_CALCULATOR_CHANGES_FOR_IMPROVEMENT)
bool IsRenderEquipItem(POSTYPE pos) const;
#endif
POSTYPE SerializeRenderEquipItemBaseInfo(EQUIP_ITEM_BASEINFO::data_type* const OUT result_slot_list) const;
void SerializeSkillTotalInfo(SKILL_TOTAL_INFO& rSkillInfo, eSERIALIZE eType );
BOOL SerializeInfoToDBProxy(eGUILDWAREHOUSE_UPDATE_FACTOR UpdateFactor = UPDATE_FACTOR_COMMON);
void CopyToCharInfo(PLAYERINFO_FOR_PACKET& rCharInfoOut);
const BASE_ITEMINFO* GetEquipItemInfo(eEQUIPCONTAINER_POS pos) const;
SCItemSlot* GetEquipItemSlot(eEQUIPCONTAINER_POS pos);
//_NA_000096_20100527_CHANGE_CHARACTER_APPEARANCE_SYSTEM
RC::eCHANGE_CHARACTER_APPEARANCE_RESULT ChangeCharacterAppearance(
CharacterAppearanceInfo& INOUT character_appearance); // 캐릭터 외모를 변경한다.
//==================================================================================================
// 파라미터
virtual Attributes& GetAttr();
virtual const Attributes& GetAttr() const;
// CHANGES: f110217.2L, added
PlayerAttributes& GetPlayerAttr();
const PlayerAttributes& GetPlayerAttr() const;
Player* GetPlayerOwner();
eCHAR_TYPE GetCharType() const; // extracted from the SCPlayer
LEVELTYPE GetLevel() const; // extracted from the SCPlayer
#ifdef _NA_002050_20110216_ADD_GENDER
BYTE GetGender() const;
#endif
// TODO : 하기 inline virtual method들은 연관관계를 생각해서 재 수정하자.
// Character에 들어가도 충분한 내용도 있고 그렇지 않는 것들도 있다.
virtual float GetNormalRangeBonus() const;
virtual float GetSkillRangeBonus() const;
virtual float GetSightRange() const;
virtual eARMOR_TYPE GetArmorType() const;
virtual eMELEE_TYPE GetMeleeType() const;
//virtual DWORD GetWeaponKind() const;
virtual eATTACK_TYPE GetWeaponBaseAttType() const;
virtual eATTACK_TYPE GetWeaponMagicalAttType() const;
virtual float GetAttackRange() const;
virtual EXPTYPE GetExp() const;
EXPTYPE GetNextExp() const;
EXPTYPE GetAccumExp(LEVELTYPE LV);
virtual DWORD GetHP() const;
virtual DWORD GetMP() const;
virtual DWORD GetSD() const;
virtual void SetSD(DWORD dwSD);
virtual float GetSDRatio() const;
virtual DWORD GetMaxSD() const;
virtual int GetRegenSD() const;
virtual float GetHPRatio() const;
virtual float GetMPRatio() const;
virtual DWORD GetMaxHP() const;
virtual DWORD GetMaxMP() const;
virtual const TCHAR* GetCharName() const;
virtual int GetRegenHP() const;
virtual int GetRegenMP() const;
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
PLAYERFP GetMaxFP() const;
PLAYERFP GetFP() const;
virtual BOOL ChkNeedFP(PLAYERFP fp_spend);
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
DWORD GetRemainStatPoint() const;
DWORD GetRemainSkillPoint() const;
MONEY GetMoney() const;
virtual int GetMPSpendIncValue() const;
virtual float GetMPSpendIncRatio() const;
float GetBonusMoneyRatio() const;
float GetBonusExpRatio() const;
float GetReflectDamageRatio() const;
// 제한처리를 위해서 : 캐릭터가 가진 기본 수치가 필요
short GetLimitStrength() const;
short GetLimitDexterity() const;
short GetLimitVitality() const;
short GetLimitSpirit() const;
short GetLimitInteligence() const;
short GetLimitExperty1() const;
short GetLimitExperty2() const;
// 스텟 제한 수치 감소
short GetDecreaseLimitStat() const;
virtual short GetStrength() const;
virtual short GetDexterity() const;
virtual short GetVitality() const;
virtual short GetSpirit() const;
virtual short GetInteligence() const;
virtual DWORD GetPhysicalAvoidValue() const;
virtual float GetPhysicalAttackSpeed() const;
virtual short GetExperty1() const;
virtual short GetExperty2() const;
SLOTCODE GetBaseSelectedStyle() const;
SLOTCODE GetSelectedStyle(); // 변신을 고려한 스타일
SLOTCODE SynchronizeStyleBasedOnWeapon(); // CHANGES: f110704.3L
virtual int GetMoveSpeedRatio() const;
virtual int GetAttSpeedRatio() const;
virtual void SetAttr(eATTR_TYPE eAttrType, eATTR_KIND eAttrKind, int iValue);
virtual void SetHP(DWORD dwHP);
virtual void SetMP(DWORD dwMP);
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
void SetFP(PLAYERFP fp);
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
//_NA_001231_20081216_ADD_OPTION_KIND
virtual int GetResistBadStatusRatio(WORD wStateID = eCHAR_STATE_INVALID);
virtual EXPTYPE AddExp(EXPTYPE exp, DWORD dwTargetObjKey=0, int iBonusRatio=0, BOOL bSendPacket=TRUE, eGAME_CONTENT_TYPE systemType = GAME_CONTENT_NORMAL);
virtual void UpdateCalcRecover(BOOL bHPUpdate, BOOL bMPUpdate, BOOL bSDUpdate);
//
enum
{
eMONEY_GENERNAL,
eMONEY_CIRCULATING,
eMONEY_GROUP,//그룹 보상 하임일경우 추가
};
BOOL CanPlusMoney(MONEY plus_money);
BOOL CanMinusMoney(MONEY minus_money);
BOOL PlusMoney(MONEY plus_money, int type = eMONEY_GENERNAL);
BOOL MinusMoney(MONEY minus_money, int type = eMONEY_GENERNAL);
// implemented by _NA_002399_20110323_MONEY_DISTRIBUTE_METHOD_CHANGE
BOOL PickMoney(MONEY nMoney, DWORD dwMonsterKey, Player* pOwner);
private:
void SetMoney(MONEY money);
public:
void SetBaseSelectedStyle(WORD wStyleCode);
// (REMOVE) (UNUSED)
//inline void SetVkrReloadCount(int iCount) { m_byVkrReloadCount = (BYTE)(max(0, iCount)); }
//inline BYTE GetVkrReloadCount() { return m_byVkrReloadCount; }
virtual DWORD IncreaseMP(DWORD dwIncrement);
virtual DWORD DecreaseMP(DWORD dwDecrement);
virtual DWORD IncreaseHP(DWORD dwIncrement);
virtual DWORD DecreaseHP(DWORD dwDecrement, int fLimitHP = 0);
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
PLAYERFP IncreaseFP(PLAYERFP valueFP);
PLAYERFP DecreaseFP(PLAYERFP valueFP);
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
void SaveStartLocation();
//WzVector GetStartVector(GameField* pField);
// 파라미터(변화)
BOOL CanSelectStat(eATTR_TYPE attrType) const;
DWORD SelectStat(eATTR_TYPE attrType, int iIncValue=1);
#ifdef _NA_0_20110216_STATUS_STAT_POINT_SIMULATION
// 힘,민첩,체력,지력,정신력
RC::eSTAT_POINT_RESULT ApplyStat(ushort* INOUT stat_point_array, uint array_count);
#endif
// 파라미터(GM 명령어 처리)
void LevelUp(DWORD dwPlusLevel);
void LevelDown(int nDownLevel);
void StatPointUp(int iBonusStat);
int GetStatPoint();
void SkillPointUp(int iBonusSkill);
int GetRemainSkillPoint();
// 추가적인 이동속도
void SetAddMoveSpeedRatio(float fRatio);
float GetAddMoveSpeedRatio() const;
// 스킬 관련
BOOL CheckRequireLv(SkillScriptInfo *pBaseSkillInfo);
bool CheckWeaponDefine(const SkillScriptInfo* const skill_script_info) const;
BOOL CheckRequireSkillStat(SkillScriptInfo *pBaseSkillInfo);
BOOL CheckNullSkillSlot(SCSkillSlot* pCurSkillSlot, SLOTCODE SkillCode);
RC::eSKILL_RESULT UseSkill(SkillInfo* pSInfo, BYTE byAttackPropensity);
BOOL CorrectPosition(WzVector& wvClientCurPos, WzVector& vResultCurPos);
virtual RC::eSKILL_RESULT CanUseSkillItem(SLOTCODE SkillCode, DWORD dwTargetKey = 0, BOOL bCoolTimerReset = TRUE);
RC::eSKILL_RESULT CanUseSummonSkill(SLOTCODE SkillCode, DWORD dwTargetKey = 0, BOOL bCoolTimerReset = TRUE);
#ifdef _NA_007667_20141001_WITCHBLADE_SKILL
RC::eSKILL_RESULT CanUseSkill(const SkillInfo* skill_info, BOOL bCoolTimerReset = TRUE);
void ProcessRisingForce();
#else
RC::eSKILL_RESULT CanUseSkill(SLOTCODE SkillCode, DWORD dwTargetKey = 0, BOOL bCoolTimerReset = TRUE);
#endif //_NA_007667_20141001_WITCHBLADE_SKILL
private:
RC::eSKILL_RESULT CanUseSkilltoTarget(SkillScriptInfo *pBaseSkillInfo, DWORD TargetKey);
public:
// CHANGES, f100824.7L, change an interface specification which is not inherited from a Character
bool CanApplyPassiveSkill(SLOTCODE skill_code);
SLOTCODE GetDefaultStyle(const CODETYPE weapon_code) const;
SLOTCODE GetPunchStyle() const;
RC::eSKILL_RESULT CheckSkillCondition(const SLOTCODE skill_code) const;
virtual BOOL CheckClassDefine(SLOTCODE SkillCode, BOOL bUseActiveSkill);
// 미션 퀘스트 관련
MissionManager* GetMissionManager() const;
QuestManager_Concrete* GetQuestManager() const;
IQuickStyleManager* GetStyleManager() const;
AchievementManager* GetACManager() const;
//----------------------------------------------------------------------------------------------
// 거래
void SetTradeContainer(TradeSlotContainer* pContainer);
TradeSlotContainer* GetTradeContainer() const;
//----------------------------------------------------------------------------------------------
// 개인 상점
void SetVendorContainer(VendorSlotContainer* pContainer);
VendorSlotContainer* GetVendorContainer() const;
void GetVendorRenderInfo(VENDOR_RENDER_INFO* OUT pRenderInfo);
void SetVendorPage(VendorPage* pVendorPage);
VendorPage* GetVendorPage() const;
//----------------------------------------------------------------------------------------------
// 창고
CWarehouseSlotContainer* GetWarehouseContainer() const;
CGuildWarehouseSlotContainer* GetGuildWarehouseContainer();
//----------------------------------------------------------------------------------------------
// 이벤트 인벤토리
EventInventorySlotContainer* GetEventSlotContainer() const;
//----------------------------------------------------------------------------------------------
// PVP
PVPInfo& GetPVPInfo() const;
CompetitionInfo& GetCompetitionInfo() const;
ChaoState& GetChaoState() const;
BOOL IsExpiredPlayer() const;
//친구 초대 이벤트, _KR_0_20091021_FIRENDINVITATION_EXTEND
InvitateFriendInfo& GetInvitateFriend() const;
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
AccumulatePoint* GetAccumulatePoint() const;
#endif
#ifdef _NA_20100307_BETAKEY_SYSTEM
BetaKeyInfo* const GetBetaKeyInfo();
void SetBetaKeyInfo(BETAKEY betakey);
#endif
#ifdef _NA_003027_20111013_HONOR_SYSTEM
HonorManager* GetHonorManager() const;
#endif //_NA_003027_20111013_HONOR_SYSTEM
#ifdef _NA004034_20120102_POINT_WALLET_SYSTEM
PointWalletManager* GetPointWalletManager() const
{
return point_wallet_manager_;
};
#endif //_NA004034_20120102_POINT_WALLET_SYSTEM
//_NA_004035_20120227_COSTUME_ITEM
Player::CostumeHandler& GetCostumeHandler()
{
return costume_handler_;
}
inline bool GetIsEquippedCostume() const
{
return char_info_.is_equipped_costume_;
}
inline SLOTCODE GetCostumeItemCode() const
{
return char_info_.costume_item_code_;
}
inline POSTYPE GetCostumeItemPos() const
{
return char_info_.costume_item_pos_;
}
#ifdef _NA_008610_20160104_ADD_DECORATECOSTUME
inline bool GetIsEquippedDecoCostume() const
{
return char_info_.is_equipped_decorate_costume_;
}
inline SLOTCODE GetDecoCostumeItemCode() const
{
return char_info_.decorate_costume_item_pos_;
}
inline POSTYPE GetDecoCostumeItemPos() const
{
return char_info_.decorate_costume_item_pos_;
}
#endif //_NA_008610_20160104_ADD_DECORATECOSTUME
//----------------------------------------------------------------------------------------------
// Battleground
bool IsThereBattleGroundZone() const; // 플레이어가 현재 있는 Zone이 배틀그라운드(전장)인지 체크 (true/false)
ChaosZoneType GetChaosZoneType() const;
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
inline BattleGroundPlayerInfo& GetBattleGroundPlayerInfo() const {
return *battle_ground_player_info_;
}
#ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH
inline GoldRushPlayerInfo& GetGoldRushPlayerInfo() const {
return *goldrush_playerinfo_;
}
#endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH
CharacterInfoExManager& GetExtraInfoManager() {
return extra_info_manager_;
};
#ifdef _NA_006633_20130415_ADD_BATTLEGROUND_ASSIST
inline PlayerAssistMeter* GetPlayerAssistMeter()
{
return player_assist_meter;
}
#endif //_NA_006633_20130415_ADD_BATTLEGROUND_ASSIST
#ifdef _NA_007086_20140318_MONSTERBOOK
MonsterBook& GetMonsterBook() {
return monster_book_;
}
#endif //_NA_007086_20140318_MONSTERBOOK
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
inline PlayerSpaInfo* GetPlayerSpaInfo()
{
return player_spa_info_;
}
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
//----------------------------------------------------------------------------------------------
// 플레이어가 현재 카오스존에 존재한다면, 현재 위치하고있는 Zone을 리턴
// 현재 카오스 존이 아니라면, NULL 리턴
ChaosZone* const GetCurrentChaosZone() const;
RandomManager* const GetRandomManager() const {
return random_manager_;
};
// PC방 유저인지 체크(GM체크 추가-성현창)
void SetReservedValue(DWORD dwReservedValue);
DWORD GetReservedValue() const;
BOOL CanApplyPCBangBenefit(BOOL bNationCheck);
void SetSts(BYTE bySts);
inline BYTE GetSts() const;
inline BOOL IsGMUser() const;
void SetPCRoomSts(BYTE bySts);
BYTE GetPCRoomSts() const;
CHARGUID GetCharGuid() const;
USERGUID GetUserGuid() const;
#ifdef _JP_0_20100723_GAMECHU_AUTHFLOW_
GAMECHUUSN GetGameChuUsn() const;
#endif
DWORD GetCharNameHash() const; // CHANGES: f110517.3L
GUILDGUID GetGuildGuid() const;
#ifdef _NA_008334_20150608_SONNENSCHEIN
GameGuild* GetGuild() const;
#endif //_NA_008334_20150608_SONNENSCHEIN
const char* GetGuildName() const;
BOOL IsGuildWarehouseRight() const;
void SetGuildWarehouseRight(BOOL IsRight);
BOOL GetGuildRenderInfo(GUILD_RENDER_INFO* OUT pRenderInfo, GUILDGUID other_guildIndex = 0) const;
// 클라이언트 렌더링 설정 옵션
BYTE GetHelmetOption() const;
void SetHelmetOption(BYTE byOption /* 1 bit 사용*/);
BYTE GetWingOption() const;
void SetWingOption(BYTE byOption /* 1 bit 사용*/);
#ifdef _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
BYTE GetCostumeOption() const;
void SetCostumeOption(BYTE byOption /* 1 bit 사용*/);
#endif // _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
// 피도로 관련
FatigueManager* GetFatigueManager() const;
//----------------------------------------------------------------------------------------------
// for GameField/Sector grid
// 필드 접속 및 나가기
virtual void OnEnterField(GameField& IN rField, const WzVector& IN rwzVec, int iAngle=-1);
virtual void OnLeaveField();
virtual void OnEnterSector();
virtual void OnEnterObject(const Sector& IN rSector);
virtual void OnEnterNeighbor(const Sector& IN rSector);
virtual void OnLeaveObject(const Sector& IN rSector);
virtual void OnLeaveNeighbor(const Sector& IN rSector);
// (CHANGES) (f100614.4L)
ns_trigger::TriggerPlayerLinkInGameSlots* GetTriggerLinks();
void _EnterEtcStatus();
void _LeaveEtcStatus();
void FirstGuildMemberEnter();
// 파라미터 관련
void SetExp(EXPTYPE exp);
void SetLevel(LEVELTYPE level);
void SetNextExp();
void FixLevel();
void OnLevelUp();
void OnLevelDown();
void OnAddExp(DWORD dwTargetObjKey, int iBonusRatio, BOOL bSendPacket, eGAME_CONTENT_TYPE systemType = GAME_CONTENT_NORMAL);
void NotifyGroupMoneyToPlayer(MONEY amountMoney);
IPlayerEventD& PlayerEvent();
sTransaction& EventTransaction(); // 이벤트 트랜잭션
// 이전마을 위치 저장.
void SetPreVillageMapCode(MAPCODE mapCode);
MAPCODE GetPreVillageMapCode();
//_NA_0_20100722_AUTO_SYSTEM
VOID SetlastReturnScroll();
RC::ePORTAL_RESULT MovelastReturnScroll();
// 시작시 나타날 맵 저장.
void SetStartMapCode(MAPCODE mapCode);
MAPCODE GetStartMapCode();
util::SimpleTimer& GetSnapShotLogTimer();
util::SimpleTimer& GetFatigueLogTimer();
util::SimpleTimer& GetLoadingCheckTimer();
STATE_GM_INFO& GetGMStateInfo();
void SerialzieStatusGMInfo(STATE_GM_INFO& INOUT rStateGMInfo, eSERIALIZE se);
void ApplyGMState();
ItemOwnFlag& GetItemOwnFlag();
WarehouseInventoryProtector& GetWarehouseInventoryProtector();
// (ADD)(20100318)(hukim)(STYLE) 위와 같은 경우 GetWarehouseInventoryProtector()=xxxx;
// 이런 코드가 기존에 작성되어 있는 경우 유효하게 된다. 따라서 호환성을 위해
// 상수 버전을 추가한다.
const WarehouseInventoryProtector& GetWarehouseInventoryProtector() const;
//Stat Init
void UpdateCharStat();
BOOL InitStat(BYTE eInitStat, WORD& OUT rDecreaseValue);
protected:
BOOL InitStatAKind(BYTE eInitStat, WORD& OUT DecreaseValue);
BOOL InitStatAll();
public:
#ifdef __NA_0_STAT_INIT_WHEN_100LEVEL_CHANGEUP
BOOL InitAllStatByChangeUp();
#endif
protected:
void InitBasicStatAll();
BOOL CanInitBasicStatAll();
void InitExpertyStatAll();
BOOL CanInitExpertyStatAll();
void InitPassiveStatAll();
#ifdef _NA_0_20100901_SKILLTREE_SYSTEM
void InitSkillStatAll();
#endif
public:
BOOL CheckValidStatPoint();
void RecoveryStatPoint();
BOOL GetCheckedStat() const;
private:
BOOL m_bCheckedStat;
public:
void SetFallDead(WzVector BeforeDeadPos);
RC::eSTATUS_RESULT RebirthFromFallDead();
//----------------------------------------------------------------------------------------------
protected:
void OnSendAllPlayersRenderInfoAllKinds(const Sector& IN rSector);
//----------------------------------------------------------------------------------------------
protected:
void OnSendAllMonsterInfo(const Sector& IN rSector);
void OnSendAllFieldItemInfo(const Sector& IN rSector);
//__NA001283_20090225_COLLECTION_USE
void OnSendAllFieldCollectionInfo(const Sector& IN rSector);
public:
void SendAllFieldCollectionInfo();
protected:
//{__NA_0_20090720_GUILD_RENDER_INFO_MODIFY
public:
void OnSendAllPlayersGuildRenderInfo(const Sector& IN rSector);
void OnSendAllPlayersGuildRenderInfoToNeighbor(const Sector& IN rSector);
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
public:
void OnSendAllPlayersSunRankingGradeInfo(const Sector& IN rSector);
void OnSendAllPlayersSunRankingGradeInfoToNeighbor(const Sector& IN rSector);
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
protected:
//}
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
public:
void SetPlayTime(WORD wPlayTime);
WORD GetPlayTime() const;
void SetOfflineTime(WORD wOfflineTime);
WORD GetOfflineTime() const;
void SetAge(BYTE byAge);
BYTE GetAge() const;
void SetRealNameAuth(BYTE byRealNameAuth);
BYTE GetRealNameAuth() const;
#endif //__CN_OO0510__FATIGUE_MATCHING_UPDATE
public:
enum eVERIFY_MAGICCODE { eVERIFY_MAGICCODE_INIT = 0xAABBCCDD, eVERIFY_MAGICCODE_RELEASE = 0xDEADBEEF, };
static Player* VerifyNRestoreTHIS(Player* pPlayer);
//----------------------------------------------------------------------
// 차단 관련
//----------------------------------------------------------------------
BOOL SetInterceptionOption(BYTE byType, BOOL bFlag);
BOOL GetInterceptionOption(BYTE byType);
BOOL& UnexpectedUserEnterRoom();
//__NA_S00015_20080828_NEW_HOPE_SHADOW
void InsertSummonInfo(PLAYER_SUMMON_INFO* pInfo);
void DestroySummonInfo();
void CallSummonMonster();
//end of shadow
//{__NA001336_090514_PARTY_NAVI_SUPPORT__
inline void NotifyChangedStatus(PlayerStatEvent::eFlag flag);
PlayerStatEvent::eFlag CheckChangedStatus(PlayerStatEvent::eFlag skip_flag);
void SendChangedStatus();
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
VOID RemoveDragonTransformStatus();
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
//}
// __KR_001355_20090608_GROUPINGSYSTEM_DATA = {
void SetGroupHighMemberInfo(eGROUP_STAT eHighMember );
void SetGroupLowMemberInfo(eGROUP_STAT eLowMember );
eGROUP_STAT GetGroupHighMemberInfo() const;
eGROUP_STAT GetGroupLowMemberInfo() const;
void GroupBonusAcceptForMoney(MONEY bonusMoney, MONEY addRatioMoney, eHEIM_ACQUISITION_TYPE eType);
void GroupBonusAcceptForEXP(EXPTYPE bonusEXP, EXPTYPE addRatioEXP, eEXP_ACQUISITION_TYPE eType);
// end of '__KR_001355_20090608_GROUPINGSYSTEM_DATA'
#if defined (_NA_20100420_CHANGE_SYSTEM_MEMO_LOGIC) || \
defined (_NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION)
PostManager* GetPostManager() const;
#endif
void Player_TransOff(); //_NA001385_20090924_DOMINATION_SHADOW 하이드 제어, 함수로 빼냄
// (CHANGES) (f100324.3L)
const nsSlot::InventoryConfig& inventory_config() const;
// update all inventory insert rule configures
// returns : if the result is succeeds, the requester has reflected inventory configurations
bool UpdateInventoryConfig(const nsSlot::InventoryConfig& configure);
// this has a different presentation from a complex riding casting
bool SetupEtherealizer(nsSlot::EtheriaImpl* result_instance);
// CHANGES: f110103.3L
ns_object::PlayerZoneTransaction* GetZoneTransactionInfo();
#pragma warning(push)
#pragma warning(disable : 4201)
//==============================================================================================
//
public:
enum
{
SENDINFO_ENTER_OBJECT = 0,
SENDINFO_PLAYER_RENDER = 0,
SENDINFO_PLAYER_EQUIP = 1,
SENDINFO_PLAYER_GUILDRENERINFO = 2,
SENDINFO_PLAYER_SPECIAL_RENDER = 3,
SENDINFO_ITEM_RENDER = 0,
SENDINFO_NPCS_MONSTER = 0,
SENDINFO_NPCS_SUMMONED = 1,
SENDINFO_NPCS_MAPNPC = 2,
SENDINFO_NPCS_TOTEMNPC = 3,
SENDINFO_NPCS_MERCHANTNPC = 4, //_NA_0_20100222_UNIT_TRIGGERS_REGEN
SENDINFO_GUILD_RENDER = 0,
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
SENDINFO_SUN_RANKING_GRADE = 0,
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
SENDINFO_MAX_BUFFER_SIZE = 5
};
static VarMsg2 m_VarMsg2[SENDINFO_MAX_BUFFER_SIZE];
//==============================================================================================
// <FIELD SECTION>
//
// - 플레이어의 메모리가 이상한 상태인지 체크하기 위한 코드
private:
int m_StartCheckCode;
int m_StartInitCode;
private:
//==============================================================================================
// Player Game Data
struct {
AchievementManager* m_pACManager;
QuestManager_Concrete* m_pQuestManager;
MissionManager* m_pMissionManager;
SlotManager* m_pSlotManager;
ItemManager* m_pItemManager;
QuickManager* m_pQuickManager;
//QuickStyleManager* m_pStyleManager;
FatigueManager* m_pFatigueManager;
SkillSlotManager * m_pSkillSlotManager;
nsSkill::PerkManager* perk_manager_; // _NA002217_100728_EP2_PERK_SYSTEM_
//----------------------------------------------------------------------
// 거래
//----------------------------------------------------------------------
TradeSlotContainer* m_pTradeSlotContainer;
//----------------------------------------------------------------------
// 개인 상점
//----------------------------------------------------------------------
VendorSlotContainer* m_pVendorSlotContainer;
VendorPage* m_pVendorPage;
//----------------------------------------------------------------------
// 이벤트 인벤토리
//----------------------------------------------------------------------
EventInventorySlotContainer* m_pEventSlotContainer;
//----------------------------------------------------------------------
// PVP
//----------------------------------------------------------------------
PVPInfo* m_pPVPInfo;
CompetitionInfo* m_pCompetitionInfo;
// 카오상태 관리
ChaoState* m_pChaoState;
//친구 초대 목록 관리, _KR_0_20091021_FIRENDINVITATION_EXTEND
InvitateFriendInfo* m_pInvitateFriend;
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
AccumulatePoint* m_pAccumulatePoint;
#endif
#ifdef _NA_20100307_BETAKEY_SYSTEM
BetaKeyInfo betakey_info_;
#endif
//시스템 쪽지 리뉴얼
#if defined (_NA_20100420_CHANGE_SYSTEM_MEMO_LOGIC) || \
defined (_NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION)
PostManager* m_PostManager;
#endif
#ifdef _NA_003027_20111013_HONOR_SYSTEM
HonorManager* honor_manager_;
#endif //_NA_003027_20111013_HONOR_SYSTEM
#ifdef _NA004034_20120102_POINT_WALLET_SYSTEM
PointWalletManager* point_wallet_manager_;
#endif //_NA004034_20120102_POINT_WALLET_SYSTEM
//_NA_004035_20120227_COSTUME_ITEM
CostumeHandler costume_handler_;
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
BattleGroundPlayerInfo* battle_ground_player_info_;
#ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH
GoldRushPlayerInfo* goldrush_playerinfo_;
#endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH
CharacterInfoExManager extra_info_manager_;
#ifdef _NA_006633_20130415_ADD_BATTLEGROUND_ASSIST
PlayerAssistMeter* player_assist_meter;
#endif //_NA_006633_20130415_ADD_BATTLEGROUND_ASSIST
RandomManager* random_manager_;
#ifdef _NA_007086_20140318_MONSTERBOOK
MonsterBook monster_book_;
#endif //_NA_007086_20140318_MONSTERBOOK
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
PlayerSpaInfo* player_spa_info_;
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
};
public:
__BOOL_PROPERTY(ForceAttack);
public:
//_NA_008706_20160229_TEXTLOG_PK
void KillPlayer(Player* pDeadPlayer, BOOL bSummoned = FALSE, DAMAGETYPE damage_value = 0);
RC::eBATTLE_RESULT ChkAttackPvP(Character* pTargetChar);
RC::eSKILL_RESULT ChkSkillPvP(Character* pTargetChar);
BOOL IsPvPAtt(WORD PTATroubld);
private:
util::Timer m_DBPUpdateTimer; ///< DBProxy로 데이터를 주기적으로 Update를 하기위한 타이머
BYTE m_byLastAttackSeq;
MovementChecker* m_pMovementChecker;
public:
#ifdef _NA_008012_20150130_RANKING_SYSTEM
__PTR_PROPERTY(RankingSystemCtl, RankingSystemCtl);
__ARRAY_PROPERTY(int, (MAX_MISSION_NUM+1), BestMissionTime); // 미션 타임 기록 정보
#endif // _NA_008012_20150130_RANKING_SYSTEM
__PTR_PROPERTY(WayPoint, WayPoint); // Waypoint
__PTR_PROPERTY(CharWayPoint, CharWayPoint); // CharWayPoint
// for debugging
private:
struct
{
DWORD m_dwLastSendTick;
DWORD m_dwSentSize;
BYTE m_byDebugInfoFlag; // 디버그정보 플래그(디버깅을 위해 클라이언트에 디버그정보 전송여부)
};
//////////////////////////////////////////////////////////////////////////
// Player Session Info
private:
struct {
ServerSession* m_pServerSession;
TCHAR m_pszUserID[ID_MAX_LEN+1];
CHAR m_pszUserIP[IP_MAX_LEN+1];
DWORD m_dwUserKey;
DWORD char_name_hash_; // CHANGES: f110517.3L
time_t m_LoginTime_t;
DWORD m_dwReservedValue; // 예약 (0:일반사용자, 나머지값은 PC방 접속자 UID)
BYTE m_bySts; // DB에 저장되는 유저 상태(100이상은 GM등급)
BOOL m_bGMUser; // GM 유저(GM 권한 등급은 m_bySts 참조-100부터)
BYTE m_PCRoomSts; // PC방 븍락상태
};
private:
EXPTYPE m_NextExp; // 다음 레벨의 시작경험치 : 레벨업 체크용으로 사용한다.
BOOL m_bExpiredPlayer; //< Release 되었는지 여부 (파괴됨,풀에반환됨) - not used
struct { // Action Delay Control fields for C/S Synchronize
util::Timer m_ActionTimer; // 스킬이나 일반 공격의 쿨타임 계산용 타이머
BOOLEAN m_bDoingAction; // 액션중인지 (스킬 액션)
};
ePLAYER_BEHAVE_STATE m_BehaveState;
ePLAYER_STATE player_state_; // f100827.4L
DWORD m_PlayerTitle;
float m_fAddMoveSpeedRatio; // 추가적인 이동속도 변화.. 1이면 현재상황 유지...
MAPCODE m_PreVillageMapCode; // 전마을 맵 코드, 현재 마을에 있으면 현재 마을 코드가 기록된다.
// f100827.4L, a detach inheritance relation from a SCPlayer
ns_object::PlayerAttributeLinker attributes_linker_;
BASE_PLAYERINFO char_info_; // f100827.4L
//_NA_0_20100722_AUTO_SYSTEM
MAPCODE m_lastReturnScrollMapCode; // 마지막 귀환 스크롤 사용 맵.
WzVector m_lastReturnScrollPos; // 마지막 귀환 스크롤 사용 위치.
util::SimpleTimer m_ShapShotLogTimer; // 스냅샷 로그 타이머.
util::SimpleTimer m_FatigueLogTimer; // 피로도 로그 타이머.
util::SimpleTimer m_LoadingCheckTimer; // 클라이언트의 맵등장 로딩시간을 체크한다.(그 시간이 비정상적으로 짧으면 어뷰징으로 간주)
// Attributes
private:
PlayerAttrForUpdate m_Attr;
// 길드
PLAYERKEY m_InvitationHostKey;
// 발키리 무기장전 남은회수(최대20발)
BYTE m_byVkrReloadCount;
IPlayerEventD m_PlayerEvent;
STATE_GM_INFO m_GMStateInfo; // GM 상태(투명, 무적, 속도)
ItemOwnFlag m_ItemOwnFlag;
WarehouseInventoryProtector m_WarehouseInventoryProtector;
public:
struct { //낙사 관련
BOOL m_bIsFallDead;
WzVector m_dwBeforeFallDeadPos;
};
private:
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
struct { //피로도 정보 관련
WORD m_wPlayTime;
WORD m_wOfflineTime;
BYTE m_byAge;
BYTE m_byRealNameAuth;
};
#endif
BOOL m_bUCUserEnterRoom;
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
public:
bool GetTotalEquipmentScore(int& out_total_item_score);
SunRankingPlayerInfo GetSunRankingPlayerInfo();
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
public:
CPetManager m_PetManager;
CEtherEmissionDevice m_EtherManager;
ns_object::SPECIAL_RENDER_EFFECT RENDER_EFFECT; // PROPERTY
private:
eSPECIAL_RENDER_EFFECT m_RenderEffect;
// 길드 창고를 오픈할 때마다 변경될수 있으므로
// 굳이 Player의 BaseInfo에 넣지 않았음
BOOL m_GuildWarehouseRight;
// _NA000109_100427_ITEM_CUSTOMIZING_CONTENTS_
// this has a different presentation from a complex riding casting
nsSlot::EtheriaControlOption etheria_control_option_;
public:
ISSQHandlerInGame SSQHandler; // PROPERTY
IPlayerRiderD Rider; // Property : __NA001390_090915_RIDING_SYSTEM__
IPlayerWingsD Wings; // CHANGES: f110315.2L, property '_NA001955_110210_WING_COSTUME'
// implemented by _KR_0_20091021_FIRENDINVITATION_EXTEND = {
// m_RecallMsgBoxTimeMap,
// SetInvitatedFriendRecallRequestTime,
// GetInvitatedFriendRecallRequestTime
private:
//추천친구에게 소환 요청한 시간을 보관한다.
RECALL_MSGBOX_TIME_MAP m_RecallMsgBoxTimeMap;
public:
VOID SetInvitatedFriendRecallRequestTime(DWORD FriendGUID, DWORD64 Recalltime);
DWORD64 GetInvitatedFriendRecallRequestTime(DWORD FriendGUID);
private:
PLAYER_SUMMON_INFO_LIST m_listPlayerSummonInfo;
// (WAVERIX) (NOTE) 이녀석...protected로 끝납니다. -.-;;;
__PTR_PROPERTY( CollectedList, CollectedList);
private:
PlayerStatEvent::eFlag m_PartyEvent;
ViewBoxCubic m_LastUpdatedPartyNaviPosBox; // 5x5
eGROUP_STAT m_eHighMember; //플레이어의 그룹 상위 멤버 상태
eGROUP_STAT m_eLowMember; //플레이어의 그룹 하위 멤버 상태
//ns_trigger::TriggerPlayerLinkInGame m_TriggerLink; //__NA000000_090613_TRIGGER_LOGIC_REARRANGE__
ns_trigger::TriggerPlayerLinkInGameSlots trigger_links_;
ns_object::PlayerZoneTransaction zone_transaction_info_; // CHANGES: f110103.3L
//
COOL_TIME_TABLE item_cool_time_table_;
//
// <WARNING> 이 필드는 항상 마지막에 놔둘 것.
// 플레이어의 메모리가 이상한 상태인지 체크하기 위한 코드
int m_EndCheckCode;
int m_EndInitCode;
#pragma warning(pop) // 4201
//
//
__DISABLE_COPY(Player);
friend class ns_object::PlayerAttributeLinker;
}; //
//
// <end Player>
//
//==================================================================================================
#define __GAMESERVER_PLAYER_INL
#include "./Player.inl"
#undef __GAMESERVER_PLAYER_INL
#endif //__GAMESERVER_PLAYER_H