/* ==================================================================== * ÆÄ ÀÏ : * ¸ñ Àû : * ÀÛ ¼º ÀÚ : Á¤¼º´ë * ÀÛ ¼º ÀÏ : 2006.08.29 * * Ãß°¡³»¿ë : * Ãß°¡³¯Â¥ ÀÛ¾÷ÀÚ Ãß°¡³»¿ë * 2006.08.29 Á¤¼º´ë »ý¼º * * ÁÖÀÇ»çÇ× : * =================================================================== */ #pragma once #include "GameSrvDefines.h" #include "BaseObject.h" #include "Player_Common.h" #include "Npc_Common.h" #include "Stage_Common.h" #include "trade_common.h" #include "Tarot_Common.h" #include "Quest_Common.h" #include "Chat_Common.h" #include "Party_Common.h" #include "RangeCheck.h" #include "ItemBillPool.h" #include "ItemGetPool.h" #include "ItemCountPool.h" #include "CooltimePool.h" #include "ThemeUserPool.h" #include "SQLGameStmt.h" // PLAYER DBUPDATE FLAG const int PLAYER_DBUPDATE_ERROR = 0; const int PLAYER_DBUPDATE_PROCESS = 1; const int PLAYER_DBUPDATE_LEVELUP = 2; const int PLAYER_DBUPDATE_LEVELCHEAT = 3; const int PLAYER_DBUPDATE_SKILLUP = 4; const int PLAYER_DBUPDATE_SKILLCHEAT = 5; const int PLAYER_DBUPDATE_SKILLADD = 6; const int PLAYER_DBUPDATE_SKILLRESET = 7; const int PLAYER_DBUPDATE_POINTPLUS = 8; const int PLAYER_DBUPDATE_LOGOUT = 9; const int PLAYER_DBUPDATE_EXPRECOVER = 10; const int PLAYER_DBUPDATE_LOGIN = 11; /// ÃßÀû ÆÛÁüÀ§Ä¡ ÃÖ´ë°ª/Á߽ɰª const int FOLLOW_POS_MAX = 9; const int FOLLOW_POS_CENTER = 4; /// ½ºÅ³ Æ÷ÀÎÆ® Áõ°¡ ¼öÄ¡ const unsigned char SKILL_LEVELUP_POINT = 2; /// ÀÏÁ¤½Ã°£ ÀϰýÀúÀå ½Ã°£ const unsigned long BATCH_SAVE_TIME = 15 * MINUTE; /// ¸Ê À̵¿ ·£´ý ÁÂÇ¥ üũ °£°Ý const unsigned long MAP_RANGE_CHECK_RING = 5; /// pc¹æ ¾È°É¸°¹öÇÁ Àç½Ãµµ ½Ã°£ const unsigned long INFLUENE_PCBANG_NEXT_ADDTIME = 3 * SECOND; // ij½¬ ¹öÇÁ ÁÖ±âÀûÀ¸·Î ÀúÀå½Ã°£ const unsigned long INFLUENCE_CASH_NEXT_SAVETIME = 10 * MINUTE; /// GMÀ̺¥Æ® ¹öÇÁ Àç½Ãµµ ½Ã°£ const unsigned long INFLUENCE_GMEVENT_NEXT_ADDTIME = 3 * SECOND; struct MAKESKILL_SELECT; struct MAKESKILL_INSERT; struct sGMEventInfo; enum eREQUEST_REJECTION { eREQREJCT_NONE, /// ¿äû °ÅÀý »óÅ ¾øÀ½(¿äû¼ö¶ô) eREQREJCT_GAMEFINISH, /// °ÔÀÓ Á¾·á »óÅ eREQREJCT_DUELWAIT, /// °áÅõ ¿äû ´ë±â »óÅ eREQREJCT_DUELPLAY, /// °áÅõ »óÅ eREQREJCT_EXCHANGE, /// °Å·¡ »óÅ eREQREJCT_PARTY, /// ÆÄƼ »óÅ eREQREJCT_GUILD, /// ±æµå »óÅ eREQREJCT_THEME, /// Å׸¶ »óÅ }; enum ePLAYER_PARTYSTATE { ePARTY_NONE, /// ÆÄƼ ¾øÀ½ ePARTY_COMPLETE, /// ÆÄƼÁß ePARTY_SENDJOIN, /// ÆÄƼ¿ø ÃÊ´ëÁß ePARTY_RECVJOIN, /// ÆÄƼÃÊ´ë ¹Þ´ÂÁß }; enum XCOPY_INVENTORY_OPT { XCOPY_INVENTORY_ALL = 0, XCOPY_INVENTORY_COUNT, XCOPY_INVENTORY_SWAP, }; // ¹æ¾î±¸ ¼¼Æ® Á¶ÇÕ #define ARMOR_SETS_NONE 0x0000 #define ARMOR_SETS_ROBES 0x0001 #define ARMOR_SETS_LIGHT 0x0002 #define ARMOR_SETS_HEAVY 0x0004 enum eCHANGESTATE_OPTION { eCHANGESTATEOPTION_NONE = 0, eCHANGESTATEOPTION_RESURRECTION, eCHANGESTATEOPTION_RUSH, }; // ÆÇ¸Å¾ÆÀÌÅÛ ±¸Á¶Ã¼ struct StallSellItem { eStallSellItemStatus status; // »óÅ TB_INVENTORY* inventory; // Àκ¥Å丮 ÂüÁ¶ unsigned long price; // °¡°Ý(°³´ç) }; struct sGameOption { union { struct { bool showGauge : 1; // bool showBubble : 1; // bool showHeroNameCard : 1; // bool showHeroTotal : 1; // bool showPlayerNameCard : 1; // bool showPlayerTotal : 1; // bool showNPCNameCard : 1; // bool showMonsterNameCard : 1; // bool showHelmet : 1; // bool showTip : 1; // bool rejectionTrade : 1; // bool rejectionDuel : 1; // bool rejectionWhisper : 1; // bool rejectionParty : 1; // bool rejectionFriend : 1; // bool rejectionPvP : 1; // bool autoSendTwitterMsg : 1; // } option1; long optionData1; }; }; class cPlayer : public cBaseObject { public: cPlayer(); ~cPlayer(); void* operator new ( size_t n ); void operator delete ( void* ptr, size_t n ); /// °¢Á¾ µ¥ÀÌÅÍ ÃʱâÈ­ bool Init( unsigned long connectionIdx, unsigned long playerIdx, unsigned long money, unsigned long deposit ); /// Ç÷¹ÀÌ¾î ¾÷µ¥ÀÌÆ® ÇÁ·Î¼¼½º void Update( unsigned long elapsedTime, unsigned long accumTime ); /// inline functions unsigned long GetConnectionIdx ( ) { return mConnectionIdx; } sPlayerInfo* GetPlayerInfo ( ) { return &mPlayerInfo; } sPlayerExrInfo* GetExrInfo ( ) { return &mPlayerExrInfo; } sHeroInfo* GetHeroInfo ( ) { return &mHeroInfo; } wchar_t* GetUserID ( ) { return NULL; } wchar_t* GetName ( ) { return mPlayerInfo.strName; } char GetRace ( ) { return mPlayerInfo.Race; } char GetGender ( ) { return mPlayerInfo.Gender; } eWEAPON_STATE GetWeaponState ( ) { return mPlayerWeaponState; } void SetName ( wchar_t* name ); void SetRace ( char race ); void SetGender ( char gender ); short GetBagEnd ( ) { return mHeroInfo.BagEnd; } unsigned short GetWearEnd ( ) { return mHeroInfo.WearEnd; } void SetStaticFaceIndex( unsigned long faceIdx ); /// 070607 PKH Ç÷¹ÀÌ¾î »ýÁ¸ À¯¹« ¼ÂÆÃ bool GetStateDie( ) { return mPlayerExrInfo.mState == eOBJECT_STATE_DIE; } /// 070115 PKH Á÷¾÷ ePLAYER_JOB GetJob() { return mPlayerInfo.Job; } void SetJob(ePLAYER_JOB job, unsigned long* skillList, unsigned char skillListCnt ); /// °æÇèÄ¡ ½Àµæ ¹× ·¹º§¾÷ void AddExp( unsigned long addExp, bool addOption, bool expRecover ); void AddSxp( unsigned long addSxp, bool addOption ); void AddPartyExp( unsigned long addExp, bool addOption, bool expRecover, unsigned long addBaseExp, unsigned long addPartyExp ); void AddPartySxp( unsigned long addSxp, bool addOption, unsigned long addBaseSxp, unsigned long addPartySxp ); unsigned char GetLevel( ) { return mPlayerInfo.Level; } bool LevelUp( unsigned char addLevel, unsigned long totalExp, bool isCheat ); unsigned char GetSkillLevel() { return mHeroInfo.SkillLevel; } bool SkillLevelUp( unsigned char addLevel, unsigned long totalSxp, bool isCheat ); /// 070807 PKH HPÃÊ±â ¼ÂÆÃ void InitHP( unsigned long HP ); void InitMP( unsigned long MP ); /// 070807 PKH HP/MP°ªÀ» ¾Ë·ÁÁÜ unsigned long GetHP() { return mPlayerExrInfo.RestHP; } unsigned long GetMP() { return mPlayerExrInfo.RestMP; } /// 070807 PKH HP°¨¼Ò unsigned long HPDamage( sObject attacker, unsigned long damage, bool *die, bool msgSend, bool cri = false ); void HPUse( unsigned long useValue, bool msgSend ); /// 070807 PKH ¼ø½Ä°£¿¡ HPÁõ°¡ void HPHeal( unsigned long hp, bool msgSend, sObject healer, long distressPoint, eTAKEDAMAGE_TYPE type ); bool SendHPHeal( ); void SendMaxHP(); /// 070807 PKH mpó¸® void MPDamage( unsigned long mp, bool msgSend ); void MPUse( unsigned long useValue, bool msgSend ); void MPHeal( unsigned long mp, bool msgSend ); bool SendMPHeal( ); void SendMaxMP(); inline unsigned int GetRaceGender(){return (mPlayerInfo.Race*eGENDER_MAX + mPlayerInfo.Gender);} void SetMoveReq( char protocol, NiPoint2 startPos, NiPoint2 destPos, unsigned long clientTime, float range, sObject targetInfo, NiPoint2 targetPos ); /// 061208 PKH Ç÷¹À̾î À̵¿ ¸ñÀûÁö ¼³Á¤ void SetMoveTargetPos( float x, float y ); float GetMoveTargetPosX( ) { return mGotoX; } float GetMoveTargetPosY( ) { return mGotoY; } char IsMovePossible( NiPoint2 startPos, NiPoint2 goalPos ); bool IsClientMovePossible( NiPoint2 clientPos, NiPoint2 goalPos ); bool IsPushPullPossible( NiPoint2 startPos, NiPoint2 goalPos ); void SetRangeTarget( float tPosX, float tPosY, sObject& tInfo, float range ); void InitRangeTarget() { mRange = 0.0f; } void SetClientMoveReq( NiPoint2 targetPos ,NiPoint2 clientPos, bool key ); void CalcClientMoveDeff( unsigned long endTime ); /// ¿ÀºêÁ§Æ®ÀÇ °Å¸® üũ ¼öÁ¤ °Å¸® - Àû¿ë ¹üÀ§ float GetFixedObjectSize() { return mFixedObjectSize; } void CalcFixedObjectSize( short sizePer ); unsigned short GetFixedObjectSizePer() { return mPlayerExrInfo.mFixedObjectSizePer; } /// ¸ó½ºÅÍ ¿ÜÇü º¯½Å unsigned long GetChgMonsterIdx() { return mPlayerExrInfo.mChgMonsterIdx; } void SetChgMonster( unsigned long infObjectIdx, unsigned long monsterIdx ); void EndChgMonster(); bool MonsterPrecedeAttackPass(); /// ¸ó½ºÅÍ ¼±°ø°Ë»ç½Ã Åë°ú üũ /// ¼¼·Â Ä£¹Ðµµ/Æ÷ÀÎÆ® void SetForceType( unsigned char forceType, bool msgSend = true ); unsigned char GetForceType() { return mPlayerExrInfo.mForceType; } unsigned long FirePointPlus( unsigned long firePoint, bool msgSend = true ); unsigned long FireFriendlyPlus( unsigned long fireFriendly, bool msgSend = true ); unsigned long WaterPointPlus( unsigned long waterPoint, bool msgSend = true ); unsigned long WaterFriendlyPlus( unsigned long waterFriendly, bool msgSend = true ); unsigned long WindPointPlus( unsigned long windPoint, bool msgSend = true ); unsigned long WindFriendlyPlus( unsigned long windFriendly, bool msgSend = true ); unsigned long EarthPointPlus( unsigned long earthPoint, bool msgSend = true ); unsigned long EarthFriendlyPlus( unsigned long earthFriendly, bool msgSend = true ); void ForcePointDBUpdate(); public: /// ½ºÅÝ void InitStatus2() { memset( &mStatus2, 0 , sizeof(mStatus2) ); } const sStatus1* GetStatus1() { return &mStatus1; } void SetStatus1( ePLAYER_STATUS statusBase, float value ); const sStatus1* GetStatus1Plus() { return &mStatus1Plus; } void SetStatus1Plus( ePLAYER_STATUS statusBasePlus, float value ); const sStatus1* GetStatus1Per() { return &mStatus1Per; } void SetStatus1Per( ePLAYER_STATUS statusBasePer, float value ); float* GetPointerStatus2Plus() { return mStatus2Plus; } float* GetPointerStatus2Per() { return mStatus2Per; } float GetStatus2Plus( ePLAYER_STATUS_EXT extStatus ); float GetStatus2Per( ePLAYER_STATUS_EXT extStatus ); const sStatus2* GetStatus2() { return &mStatus2; } void SetStatus2( ePLAYER_STATUS_EXT extStatus, float value ); const sStatusEtc* GetStatusEtc() { return &mStatusEtc; } void SetStatusEtc( ePLAYER_STATUS_EXT_ADD statusAdd, float value ); void SetOriHPMax( unsigned long maxHP ) { mOriMaxHP = maxHP; } unsigned long GetOriHPMax() { return mOriMaxHP; } void SetOriMPMax( unsigned long maxMP ) { mOriMaxMP = maxMP; } unsigned long GetOriMPMax() { return mOriMaxMP; } /// MP ¼Ò¸ð·® Áõ°¡/°¨¼Ò È¿°ú unsigned long CalcUseMPExt( unsigned long originUseMP ); /// ij½ºÆÃ ½Ã°£ Áõ°¡/°¨¼Ò È¿°ú unsigned long CalcCastingExt( unsigned long originCastingTime ); //const sDamageCalc* GetDamagecalc() { return &mDamageCalc; } //void SetDamageCalc( ePLAYER_STATUS_DAMAGE statusDamage, unsigned long value ); /// ¼ø°£ ¾²°í »ç¶óÁö´Â ½ºÅ³È¿°ú(µ¥¹ÌÁö) °è»ê //void CalcInstantSkill( unsigned long statusType1, unsigned long value1, unsigned long statusType2, unsigned long value2 ); bool AttackSuccess( sObject target, unsigned long attributeType, short accuracyValue, unsigned long instantSuccess, unsigned long instantSuccessPer ); bool CriticalSuccess( sObject target, unsigned long attributeType, unsigned short criticalValue, unsigned long instantCri, unsigned long instantCriPer ); unsigned long DamageCalc( sObject target, unsigned long skillIdx, unsigned long attributeType, unsigned long rangeType, unsigned long skillDamage, unsigned long skillDamagePer,bool isIgnoreDefence, float addTotalDamage, float addPerTotalDamage ); /// ´Ù¸¥ °è»ê°ú ´Ù¸£°Ô µµÆ®µ¥¹ÌÁö´Â °ø°ÝÀÚ°¡¾ø¾îµµ °è»êÀ» ÇØ¾ßµÇ±â¶§¹®¿¡ ±âÁذ´Ã¼°¡ Ÿ°Ù°´Ã¼´Ù!! unsigned long DotDamageCalc( unsigned char attackerType, unsigned char attackerLv, unsigned long attackMin, unsigned long attackMax, unsigned char dotType, unsigned long skillDamage, unsigned long skillDamagePer, unsigned long totalTime, unsigned long dotTime ); unsigned long HealCalc( sObject target, long skillHealPlus, long skillHealPer, bool applyHP ); unsigned long DotHealCalc( sObject target, long infHealPlus, long infHealPer, unsigned long heal, unsigned long dotTotalTime, unsigned long dotTime ); unsigned long ConditionOdd( sObject target, long influenceRate, unsigned long skillClassIdx ); unsigned long GetMaxHP() { return mPlayerExrInfo.MaxHP; } unsigned long GetMaxMP() { return mPlayerExrInfo.MaxMP; } unsigned short GetMoveSpeed( ); unsigned short GetMoveUpdateSpeed( unsigned long accumTime ); float CalcStatusSkillRange( float skillRange, eRANGETYPE mRangeType, bool IsNormalAttack ); /// 070215 PKH Àåºñ ÀÔÃâ·Â sPlayerWeaponInfo* GetWeaponInfo( ) { return &mPlayerWeaponInfo; } sPlayerWearInfo* GetWearInfo ( ) { return &mPlayerWearInfo; } /// PlayerÀÇ »óÅ Á¤º¸ unsigned int GetState() { return mPlayerExrInfo.mState; } bool IsChangeState( unsigned int newState, eCHANGESTATE_OPTION option = eCHANGESTATEOPTION_NONE ); bool ChangeState( unsigned int newState, eCHANGESTATE_OPTION option = eCHANGESTATEOPTION_NONE ); /// ¼­¹ö ¼Ë´Ù¿î½Ã »óÅ ¾È¹Ù²î´Â°Íµé °­Á¦·Î ¹Ù²ã¹ö¸°´Ù. void ShutdownChangeState(); /// ÆÄƼ »óÅ void SetPartyState( ePLAYER_PARTYSTATE state ) { mPartyState = state; } ePLAYER_PARTYSTATE GetPartyState() { return mPartyState; } /// ÆòÈ­/ÀüÅõ »óÅ void SetStateIdle( unsigned char stateIdle ) { mPlayerExrInfo.mStateIdle = stateIdle; } void SetStateStop( unsigned char stateStop ) { mPlayerExrInfo.mStateStop = stateStop; } unsigned char GetStateStop() { return mPlayerExrInfo.mStateStop; } /// 070628 PKH ÇöÀç ´ëÈ­ÁßÀÎ npcidx unsigned long GetNpcIdx() { return mNpcIdx; } void SetNpcIdx( unsigned long npcIdx ) { mNpcIdx = npcIdx; } /// 070702 PKH Ç÷¹ÀÌ¾î ºÎȰ void Resurrection( unsigned long resurrectionType ); bool SkillResurrection(); /// ½ºÅ³ ºÎȰ void PvPResurrection( bool timeCheck = true ); int TutorialResurrection( ULONG_PTR socketContext ); /// Àû´ë ¸®½ºÆ®¿¡ Æ÷ÇÔÇÑ ¸ó½ºÅÍ void AddTargetingMonster( unsigned long monsterIdx ); void DelTargetingMonster( unsigned long monsterIdx ); void ClearTargetingMonster(); void DietargetingMonster(); void GetTargetingMonster( tHashSet& monsterSet ); /// Ç÷¹À̾ ÈúÀ» ¹ÞÀº °æ¿ì ¸ó½ºÅÍ¿¡ °ø°Ý Æ÷ÀÎÆ® µî·Ï void HealAttackToMonster( unsigned long healerIdx, unsigned long heal, long distressPoint, eTAKEDAMAGE_TYPE type ); /// È¿°ú //bool AddInfluence( unsigned long /*uniqueIdx*/, unsigned long /*influenceClassIdx*/ ); bool AddInfluence( cInfluenceObject* pInf ); tHashSet* GetInfluenceSet() { return &mInfluenceSet; } void DeleteInfluence( unsigned long influenceIdx ); void ReleaseInfluenceSet( bool logOut ); void DieDeleteInfluence(); void GameInInfApply(); void InfluenceProcessStart(); void InfluenceProcessStop(); /// Á¾·á½Ã È¿°ú Áߺ¹ ÀúÀåÀ» ¸·±âÀ§ÇØ updatecomplete ÀÌÈÄ¿¡´Â ÀúÀåÀ» ¸øÇÏ°Ô ÇÑ´Ù. void SetInfNoSave() { mInfNoSave = true; } /// updatecomplete ÁøÇàÁß ÀÌÀü ÀúÀå ¸í·ÉÀÌ ÀÖ¾ú´ÂÁö üũ - ³¡³¯¶§±îÁö ´ë±â bool IsCashInfSave() { return mIsCashInfSave == true || mIsCashInfCycleSave == true ? true : false; } /// ij½Ã È¿°ú ½ÃÀÛ ³¡ ½ÃÁ¡¿¡ ÀúÀå Ç÷¡±× void SetCashInfSave( bool save ) { mIsCashInfSave = save; } /// ij½Ã È¿°ú Áß°£ÀúÀå Ç÷¡±× void SetCashInfSaveCycle( bool save ) { mIsCashInfCycleSave = save; } bool IsParentEqual( unsigned long parentUniqueIdx ); bool IsInfluenceHave( unsigned long influenceIdx ); void SkillResurrectionHP( unsigned long HP ); void SkillResurrectionMP( unsigned long MP ); void AddActInfluence( unsigned long actIdx ); void ClearActInfluence(); tHashMap* GetActInfluenceMap() { return &mActInfluenceMap; } /// SkillPoint unsigned short GetSkillPoint() { return mHeroInfo.SkillPointRemain; } unsigned short GetSkillTotalPoint() { return mHeroInfo.SkillPointTotal; } unsigned short GetJobUsedSkillPoint( unsigned char jobstep ); bool SkillPointMinus( unsigned short minusSP ); void SkillPointMinusRestore( unsigned short minusSP ); bool SkillPointPlus( unsigned short plusSP ); /// ½ºÅ³ ÃʱâÈ­ int SkillResetReq( unsigned short itemSlotNum ); void SetSkillReset( TB_CHARACTER_SKILL* pSkill, long cnt ); void SendSkillPoint(); /// Å׸¶ Á¤º¸ ÃʱâÈ­(ij½Ã) int ThemeResetReq( unsigned short itemSlotNum, unsigned short themeNum, unsigned char themeMode ); /// 080619 KCJ ¸ÊÀ̵¿ ¿äû. bool IsMapChange ( ) { return mMapChange; } void MapChange ( bool boolean ) { mMapChange = boolean; } bool MapChange( unsigned long posIdx ); bool CheatMapChange( unsigned short mapNumber, float x, float y ); bool IsItemMapChange( unsigned long posIdx ); bool ItemMapChange( unsigned long posIdx, unsigned long useItemIdx ); char UserPortalMapChange( unsigned long userPortalIdx ); bool CashItemMapChange( unsigned short mapNumber, float x, float y, unsigned long useItemIdx ); // Æ©Å丮¾ó Á¤º¸ ¼¼ÆÃ bool IsTutorialMode() { return (GetMapDataNumber() == MAP_TUTORIAL); } int GetTutorialMode() { return mTutorialModeIndex; } void SetTutorialMode( int modeIndex, bool send = true ); bool MapChangeByTutorial( unsigned long posIdx ); // ±âº»¸ÊÀ¸·Î µ¹¾Æ°£´Ù bool GMMapChangeByTutorial( unsigned short mapNum, float x, float y ); // ±âº»¸ÊÀ¸·Î µ¹¾Æ°£´Ù void SetMapNum0Save( bool save ) { mMapNum0Save = save; } bool IsMapNum0Save() { return mMapNum0Save; } ////////////////////////////////////////////////////////////////////////// /// Àδø(ä³Î) À̵¿ °ü·Ã bool IsInDunJoin() { return mIsInDunJoin; } void SetInDunJoin( bool inJunJoin ) { mIsInDunJoin = inJunJoin; } unsigned short GetMapDataNumber( ) { return (mIsInDunJoin == true) ? mInDunMapDataNum : mMapNumber; } unsigned short GetRoomDataNumber( ) { return (mIsInDunJoin == true) ? mMapNumber : 0; } bool InDunMapChange( unsigned short mapNumber, unsigned short mapDataNumber, float x, float y ); void ApplyReturnGameSrv() { mMapNumber = mGameSrvReturnMapNum; mObjectPos = mGameSrvReturnPos; } /// Å׸¶ °ü·Ã void CalcThemeReturnGameSrv( unsigned short beforeMapNumber, float beforePosX, float beforePosY, bool isAuto ); /// pvp °ü·Ã void CalcPvPReturnGameSrv( unsigned short beforeMapNumber, float beforePosX, float beforePosY ); void ChannelMovePvPWait( long pvpGoCid, unsigned long waitTime ); bool CheckPvPJoin(); void PvPOut(); void AutoPvPOut(); unsigned long GetPvPDMIdx() { return mPvPDMIdx; } void SetPvPDMTeam( unsigned char teamType ) { mPlayerExrInfo.mPvPDMTeamType = teamType; } unsigned long GetPvPDMTeam() { return mPlayerExrInfo.mPvPDMTeamType; } bool SendPvPTeamChat( char* msg, int length ); void SetPvPJoinAryPos( unsigned long aryPos ) { mPvPJoinAryPos = aryPos; } unsigned long GetPvPJoinAryPos() { return mPvPJoinAryPos; } ////////////////////////////////////////////////////////////////////////// /// /// 071025 PKH ¸ÊÀ̵¿ À§Ä¡. void SetMapTargetPos( sTargetPos targetPos ) { mMapTargetPos = targetPos; } void ApplyMapTargetPos( ); /// ¸ó½ºÅͰ¡ ÃßÀûÇÏ´Â ºñÁß ÇÕ bool MonsterImportancePlus( unsigned char importance ); void MonsterImportanceMinus( unsigned char importance ); long GetMonsterImportance() { return mMonsterImportance; } void MoveStop() { mGotoX = GetXPos(); mGotoY = GetYPos(); mRange = 0.0f; } void MoveStopReq( MSG_REQ_MOVE_STOP* pmsg, char reqProtocol, char resProtocol ); /// ½ºÅÝ º¯°æ°ª Ŭ¶óÀÌ¾ðÆ®¿¡ Àü¼Û void SendMoveSpeed(); /// À̵¿ ¼Óµµ void SendAttackSpeed(); /// °ø°Ý ¼Óµµ void SendPlayerSize(); /// ij¸¯ÅÍ Å©±â void SetGameIn(); void SetGameOut() { mGameIn = false; } bool GetGameIn() { return mGameIn; } bool IsGameFinish(); /// updatecomplete¿¡¼­ Á¤»ó Á¾·á ÃÖÁ¾ üũ void CalcNatureRecovery(); /// ij¸¯ÅÍ Ã³À½ Á¢¼Ó½Ã ½ºÅÝ °è»êÀÌÈÄ¿¡ Àû¿ëÇÒ hp mp°ª void SetInitRestHP(); void SetInitRestMP(); void ApplyInitRest(); /// À̵¿¿ÀÂ÷ ÃʱâÈ­ void ClearMoveSyncCalc() { mServerMoveTime = 0; mClientMoveDefTime = 0; mClientMovePlusMinus = 0; } /// »ýȰ ½ºÅ³ void SetCommunitySkill( unsigned long communitySkillIdx); /// ¸ó½ºÅͰ¡ Ç÷¹À̾ ÃßÀûÇÏ´Â À§Ä¡ unsigned char SelectFollowPos( unsigned char followPos ); void UnSelectFollowPos( unsigned char followPos ); /// 2Â÷»óÅ bool IsRequestRejection(); unsigned long GetRequestRejection() { return mIsRequestRejection; } void StartRequestRejection( eREQUEST_REJECTION IsRequestRejection ); void EndRequestRejection( eREQUEST_REJECTION IsRequestRejection ); // void EndRequestRejectionAll(); // Àüü Ãë¼Ò ó¸® /// °æÇèÄ¡ Ç϶ô unsigned long ExpDown( float minimum, float maximum ); /// Ç÷¹À̾î Á¤º¸ DB ÀúÀå bool DBUpdate( bool updateComplete, int updateFlag ); bool IsDbUpdate() { return mIsDbUpdate; } void PauseDBUpdate() { mIsDbUpdate = true; } void EndDBUpdate() { mIsDbUpdate = false; } /// ¸ó½ºÅÍ º¯½Å½Ã ÄðŸÀÓ Ã³¸® bool IsChgMonCoolTimeEnd( eMONSTERATTACK_TYPE type ); void UpdateChgMonCoolTime( eMONSTERATTACK_TYPE type ); void SendCoolTimeChgMon(); /*--------------- °áÅõ ---------------*/ /// °áÅõ °íÀ¯¹øÈ£ unsigned long GetDuelIdx() { return mDuelIdx; } void SetDuelIdx( unsigned long duelIdx ); /// °áÅõ ´ë»óÀÚ ±â·Ï void SetDuelPlayerIdx( unsigned long playerIdx, bool IsAttacker ) { mDuelPlayerIdx = playerIdx; mIsDuelRequester = IsAttacker; } unsigned long GetDuelPlayerIdx() { return mDuelPlayerIdx; } /// º»ÀÎÀÌ ³ª°£°æ¿ì ´ë»óÀÚ¿Í °áÅõ °ü·Ã ó¸® void DuelEnd(); /// ¿¬½Â ±â·Ï void SetDuelWin() { ++mDuelStraightWin; } void ClearDuelWin() { mDuelStraightWin = 0; } unsigned long GetDuelWin() { return mDuelStraightWin; } /// °áÅõ Á¾·áÈÄ °áÅõ¿¡ »ç¿ëµÈ µð¹öÇÁ Á¦°Å void DuelEndDebuffClear( unsigned long enemyIdx ); /// pvp Á¾·áÈÄ µð¹öÇÁ Á¦°Å void PvPEndDebuffClear(); /// ¹ÞÀº µ¥¹ÌÁö·Î pvp ½ºÄÚ¾î °è»ê void AddTakeDamage( sObject attacker, unsigned long damage, long distressPoint, eTAKEDAMAGE_TYPE type ); /// °ø°Ý °¡´É À¯¹« bool IsAttack( unsigned long targetIdx ); /*--------------- »óÅ ÀÌ»ó ---------------*/ void SetStateOddity( long* pOddity ); unsigned long GetStateOddity( eODDITYTYPE oddityType ) { return mODDITY[oddityType]; } bool IsCantSkill( unsigned long attributeType ); bool IsCantMove() { return mODDITY[eODDITYTYPE_CANTMOVE] != 0 || mODDITY[eODDITYTYPE_SLEEP] != 0 || mODDITY[eODDITYTYPE_STUN] != 0; } /// Ÿ°Ù ÇØÁ¦ void MonsterInTargeting( tArray* targetAry, float range ); /// °¢ Á÷¾÷´ç »ç¿ëÇÑ SP ÀúÀå void UpdateJobUsedSP(); void StatusCalc(); unsigned long GetGatheringIdx() { return mGatheringIdx; } void SetGatheringIdx( unsigned long gatheringIdx ) { mGatheringIdx = gatheringIdx; } bool CancelGathering( unsigned long gatheringIdx ); /// Á¦Á¶½ºÅ³ unsigned char AddMakeSkill( unsigned short itemSlotNum ); void SetMakeSkill( MAKESKILL_INSERT* pInsert ); unsigned char ReqDelMakeSkill( unsigned char makeSkill ); void DelMakeSkill( unsigned char makeSkillIdx ); unsigned char AddRecipe( unsigned short itemSlotNum ); void SetRecipe( unsigned char makeSkill, unsigned long recipeIdx ); void SetRecipeGroup( sRecipeGroupInfo* groupInfo, unsigned long cnt ); bool InitMakeSkill( MAKESKILL_SELECT* pMakeSkill ); void SendMsgRecipeList(); bool IsMakeSkill( unsigned char makeSkillIdx ); int ItemMixReq( unsigned char makeSkill, unsigned long mixRecipeIdx, unsigned short makeCnt ); /// Ŭ¶óÀÌ¾ðÆ®¿¡¼­ Á¶ÇÕ ¿äû - ÇÁ·Î¼¼½º ÁøÇà¿©ºÎ üũ int ItemMix( sMakeSkillScript* script ); /// ¾ÆÀÌÅÛ Á¶ÇÕ void ItemMixEnd(); void ItemMixCancel(); /// Á¶ÇÕ Ãë¼Ò void ItemMixForceCancel(); /// »óÅÂÀÌ»óÀ¸·ÎÀÎÇÑ °­Á¦ Ãë¼Ò bool SaveRecipeCoolTime( RECIPE_COOLTIME* skillCoolTime ); void MakeSkillExpPlus( sMakeSkill* pMakeSkill, sMakeSkillScript* Recipe ); /// Å»°Í void SetVehicle( unsigned long infObjectIdx, unsigned long vehicleIdx ); void ArightVehicle( bool sendMsg, bool sendHero ); bool IsVehicle() { return mPlayerExrInfo.mVehicleIdx != 0 ? true : false; } /// Ŭ¶óÀÌ¾ðÆ®¿¡¼­ Å»°Í Á¾·á ¿äû¿Â ó¸® void EndVehicleClient( bool sendSync ); /// Å»°Í °ü·Ã ¾ÆÀÌÅÛ »óÅ º¯°æ½Ã Å»°Í Á¾·á ó¸® void EndVehicleItem( unsigned long skillClassIdx ); void SetSkillPushPull( unsigned short type, cBaseObject* pAttacker, unsigned long range ); bool IsSkillPushPull() { return GetState() == eOBJECT_STATE_PUSHPULL; } NiPoint2 SetSkillRush( cBaseObject* pTarget, bool blink, unsigned long skillIdx, unsigned char skillStep ); unsigned long GetRushAfterSkillIdx() { return mCheckRushSkillIdx; } unsigned char GetRushAfterSkillStep() { return mCheckRushSkillStep; } void SetDoorPushPull( sDoorInfo* pInfo ); /// Á¡ÇÁ void Jump(); void SetJumpTime(); unsigned long GetJumpEndTime() { return mJumpEndTime; } void SetThemePartyDB( bool themePartyDb ) { mThemePartyDb = themePartyDb; } bool GetThemePartyDB() { return mThemePartyDb; } void SetThemeRoomIdx( unsigned long roomIdx ) { mThemeRoomIdx = roomIdx; } unsigned long GetThemeRoomIdx() { return mThemeRoomIdx; } void SetThemeModeIdx( unsigned char modeIdx ) { mThemeMode = modeIdx; } unsigned long GetThemeModeIdx() { return mThemeMode; } ThemeUserRoot* GetThemeUserRoot ( ) { return &mThemeUserRoot; } PerThemeUser* SearchThemeUser ( long cid ); bool IsThemeUser ( long cid ); void AddThemeUser ( THEME_USER* table, long rowCount ); bool SaveThemeUser ( long cid ); void SendThemeInfo ( ); void SendThemeExpireTime( ); /// ¸é¿ª È¿°ú ó¸® void ClearImmune() { mImmuneBuffSet.Clear(); mImmuneDebuffSet.Clear(); mImmuneKindSet.Clear(); } void AddImmuneApplyType( unsigned char InfluenceType, unsigned short applyType ); void AddImmuneKind( unsigned long infKind ); bool IsImmuneApplyType( unsigned char InfluenceType, unsigned long applyType ); bool IsImmuneApplyAll( unsigned long applyType ); bool IsImmuneKind( unsigned long infKind ); /// ½ºÅ³»ç¿ë Ä«¿îÆ® - ½ºÇǵåÇÙ void SkillReqCntPlus() { ++mSkillReqCnt; } void SkillSuccessCntPlus() { ++mSkillSuccessCnt; } void SkillCoolTimeFailPlus() { ++mSkillCoolTimeFail; } void MonSkillReqCntPlus() { ++mMonSkillReqCnt; } void MonSkillSuccessCntPlus() { ++mMonSkillSuccessCnt; } void MonSkillCoolTimeFailPlus() { ++mMonSkillCoolTimeFail; } void SetUserPortal( unsigned long userPortalIdx ); void SetSkillLastAttack( sObject attacker, unsigned char kind ) { mSkillLastAttack = attacker; mSkillLastKind = kind; } sObject GetSkillLastAttack() { return mSkillLastAttack; } unsigned char GetSkillLastKind() { return (unsigned char)mSkillLastKind; } void CalcDirection( float targetX, float targetY ); float GetDirection() { return mDirection; } unsigned long CalcChangeMPDamage( unsigned char attributeType, unsigned long damage, bool applyHP ); unsigned long CalcGuard( unsigned char attributeType, unsigned long damage ); bool CalcCashExpGuard( unsigned long* pInfIdx, unsigned char* leftCnt ); bool GetVehicleAttack() { return mVehicleAttack; } void SetExpRecoverEndTime( TIMESTAMP_STRUCT endTime ) { mExpRecoverEndTime = endTime; } protected: sPlayerInfo mPlayerInfo; sPlayerExrInfo mPlayerExrInfo; sPlayerWeaponInfo mPlayerWeaponInfo; sPlayerWearInfo mPlayerWearInfo; sHeroInfo mHeroInfo; typedef tArray cAry; typedef tArray cLongAry; typedef tHashSet cHashSet; /// ½ºÅÝ1 ±âº»°ª sStatus1 mStatus1; /// ½ºÅÝ1 +°ª sStatus1 mStatus1Plus; sStatus1 mStatus1Per; /// ½ºÅÝ2 +°ª float mStatus2Plus[ePLAYER_STATUS_EXT_MAX]; /// ½ºÅÝ2 %°ª float mStatus2Per[ePLAYER_STATUS_EXT_MAX]; /// ½ºÅÝ2 ÃÖÁ¾°ª sStatus2 mStatus2; /// ½ºÅÝ¿Ü ½ºÅÝ sStatusEtc mStatusEtc; /// µ¥¹ÌÁö °è»ê¿ë ¼ø°£È¿°ú º¯¼ö //sDamageCalc mDamageCalc; // unsigned long mOriMaxHP; /// mp % ¼Ò¸ð½Ã °è»êµÉ ¼öÄ¡ unsigned long mOriMaxMP; eWEAPON_STATE mPlayerWeaponState; unsigned long mConnectionIdx; /// 061208 PKH À̵¿½Ã ¸ñÀûÁö ÁÂÇ¥ float mGotoX; float mGotoY; /// À̵¿ ¸í·ÉÀÌ µé¾î¿ÔÀ»½Ã ¸ñÀûÁö°¡ ¸ø°¡´Â À§Ä¡¸é ¸ÕÀú Ŭ¶óÀÌ¾ðÆ®°¡ ¼­ÀÖ´ø À§Ä¡·Î À̵¿½ÃŰ´Ù°¡ ¸ñÀûÁö·Î /// À̵¿À» Çϱ⠽ÃÀÛÇϴµ¥ ±× ¸ñÀûÁö À§Ä¡ º¯¼öÀÓ NiPoint2 mReadyGotoPos; bool mIsMoveMsg; sMoveMsg mMoveMsg; /// float mRange; NiPoint2 mRangeTargetPos; sObject mRangeTarget; ePLAYER_PARTYSTATE mPartyState; bool mIsGuildAddReq; // ±æµå Ãʴ븦 Çϰí ÀÖ´ÂÁö ¿©ºÎ /// 070628 PKH ÇöÀç ´ëÈ­ÁßÀÎ npcidx unsigned long mNpcIdx; typedef tHashSet cSkillInfluenceSet; cSkillInfluenceSet mInfluenceSet; typedef tHashMap cActInfluenceMap; cActInfluenceMap mActInfluenceMap; typedef tArray cJobUsedSpArr; cJobUsedSpArr mJobUsedSpArr; typedef tHashSet cTargetingMonsterSet; cTargetingMonsterSet mTargetingMonsterSet; typedef tHashSet cHashSet; cHashSet mImmuneKindSet; /// ¸é¿ª È¿°úÁ¾·ù ¸ñ·Ï cHashSet mImmuneBuffSet; /// ¸é¿ª Àû¿ëÈ¿°ú°ª ¸ñ·Ï cHashSet mImmuneDebuffSet; /// ¸é¿ª Àû¿ëÈ¿°ú°ª ¸ñ·Ï /// ºÎȰ bool mIsSkillResurrection; unsigned long mSkillResurrectionHP; unsigned long mSkillResurrectionMP; /// 080619 KCJ ¸ÊÀ̵¿ ¿äû. bool mMapChange; sTargetPos mMapTargetPos; /// óÀ½ Á¢¼Ó½Ã ¸Ê¹øÈ£°¡ 0Àΰæ¿ì ÀúÀåÇÑ´Ù. bool mMapNum0Save; /// Àδø °ü·Ã ¸ÊÀ̵¿ Á¤º¸ bool mIsInDunJoin; unsigned short mGameSrvReturnMapNum; /// Àδø¿¡¼­ °ÔÀÓ¼­¹ö·Î º¹±Í½Ã À§Ä¡ NiPoint2 mGameSrvReturnPos; /// ¿ÀºêÁ§Æ®ÀÇ °Å¸® üũ ¼öÁ¤ °Å¸® - Àû¿ë ¹üÀ§ float mFixedObjectSize; /// Ç÷¹À̾ ÂѾƿÀ´Â ¸ó½ºÅÍÀÇ ºñÁß ÇÕ°è long mMonsterImportance; /// °ÔÀÓ ¾È¿¡ µé¾î °¬´ÂÁö ±â·Ï bool mGameIn; /// ÀÚ¿¬ ȸº¹ ´ÙÀ½ Àû¿ë ½Ã°£ unsigned long mNextRecoveryTime; /// ij¸¯ÅÍ Ã³À½ Á¢¼Ó½Ã ½ºÅÝ °è»êÀÌÈÄ¿¡ Àû¿ëÇÒ hp mp°ª unsigned long mInitRestHP; unsigned long mInitRestMP; /// »ýȰ ½ºÅ³ Á¾·á½Ã°£ float mCommunitySkillEndTime; /// ¹æÇâ°ª float mDirection; /// ÃßÀû ÆÛÁüÀ§Ä¡ ÀÚ¸® ¼±Á¤°ª bool mFollowPos[FOLLOW_POS_MAX]; cRangeCheck mRangeCheck; /// ¿äûÀ» ¹ÞÀ»¼ö ¾ø´Â »óÅ eREQUEST_REJECTION mIsRequestRejection; unsigned long mRequestCharacterIndex; // ¿äûÀÚ À妽º /// °áÅõ unsigned long mDuelIdx; /// °íÀ¯¹øÈ£ unsigned long mDuelPlayerIdx; /// °áÅõ ´ë»óÀÚ bool mIsDuelRequester; /// º»ÀÎÀÌ °áÅõ ¿äûÀÚÀÎÁö ±¸ºÐ unsigned long mDuelStraightWin; /// °áÅõ ¿¬½Â Ä«¿îÆ® unsigned long mBatchSaveTime; long mODDITY[eODDITYTYPE_MAX]; eCHEAT_SPEEDUP mCheatSpeedUp; unsigned long mChgMonCoolTime[eMONSTERATTACK_MAX]; unsigned long mChannelPvPMoveTime; long mChannelPvPGoCid; unsigned long mPvPDMIdx; unsigned long mPvPDieTime; unsigned long mPvPDieEndTime; unsigned short mInDunMapDataNum; unsigned long mPvPJoinAryPos; unsigned long mGatheringIdx; /// Á¦Á¶ ½ºÅ³ & ÇÏÀ§ ·¹½ÃÇÇ typedef tHashMap cRecipeGroup; cRecipeGroup mRecipeGroup1; /// Á¦Á¶½ºÅ³ÀÇ ·¹½ÃÇÇ±×·ì º¸À¯¸ñ·Ï cRecipeGroup mRecipeGroup2; /// »ç¿ë ÁßÀÎ Á¶ÇÕ ±â¼ú unsigned long mItemMixEndTime; /// Á¶ÇÕ ¿Ï·á ½Ã°£ unsigned char mMixMakeSkill; unsigned long mMixRecipeIdx; unsigned long mMixCnt; // ¾ÆÀÌÅÛ °­È­ unsigned long mItemEnhanceEndTime; /// °­È­ ¿Ï·á ½Ã°£ unsigned short mEnhanceSlot1; /// °­È­ ¾ÆÀÌÅÛ unsigned short mEnhanceSlot2; /// °­È­ Ä«µå unsigned short mEnhanceSlot3; /// °­È­ º¸È£ Ä«µå unsigned long mChgMonsterInfIdx; /// ¸ó½ºÅÍ º¯½Å È¿°ú °íÀ¯ ¹øÈ£ unsigned long mVehicleInfIdx; /// Å»°Í È¿°ú °íÀ¯¹øÈ£ /// Ŭ¶óÀÌ¾ðÆ®¿¡ ¼­¹öÀ§Ä¡¸¦ Ç¥½ÃÇØÁÖ´Â Å×½ºÆ®ÄÚµåÀÇ ¸Þ¼¼Áö¹ß¼Û ´ÙÀ½½Ã°£ unsigned long mServerPosTime; /// À̵¿ÁÂÇ¥ ¿ÀÂ÷À²°è»ê unsigned long mServerMoveTime; long mClientMoveDefTime; char mClientMovePlusMinus; bool mKeyboardMove; unsigned long mJumpEndTime; unsigned long mJumpTime; unsigned long mJumpMoveSpeedDownEndTime; unsigned long mJumpSpeedState; bool mThemePartyDb; unsigned long mThemeRoomIdx; char mThemeMode; ThemeUserRoot mThemeUserRoot; // Æ©Å丮¾ó Á¤º¸ int mTutorialModeIndex; /// ½ºÅ³ »ç¿ë ¼º°ø ½ÇÆÐ Ƚ¼ö - ½ºÇǵåÇÙ Ä«¿îÆ® unsigned long mGameInTime; unsigned long mSkillReqCnt; unsigned long mSkillSuccessCnt; unsigned long mSkillCoolTimeFail; unsigned long mMonSkillReqCnt; unsigned long mMonSkillSuccessCnt; unsigned long mMonSkillCoolTimeFail; unsigned long mUserPortalIdx; sObject mSkillLastAttack; unsigned char mSkillLastKind; /// eDAMAGE_KIND /// cLongAry mGuardAry; /// cLongAry mChangeMPDamageAry; /// cLongAry mDeleteTypeDamagedAry; bool mInfNoSave; bool mVehicleAttack; /// dbupdate È£ÃâÀü ½×¿©ÀÖ´Â °æÇèÄ¡·® unsigned long mWaitSaveExp; /// ¼Õ½ÇµÈ°æÇèÄ¡ º¹±¸ °¡´É½Ã°£ TIMESTAMP_STRUCT mExpRecoverEndTime; unsigned long mPcBangNextCheckTime; /// pc¹æ ¹öÇÁÁß °É·Á¾ß Çϴµ¥ ¸ø°É¸®°í ´ë±âÁßÀÎ È¿°ú cHashSet mReadyPcInfSet; /// GMÀ̺¥Æ® ¹öÇÁÁß °É·Á¾ß Çϴµ¥ ¸ø°É¸®°í ´ë±âÁßÀÎ È¿°ú cGMEventList mReadyGMEventList; unsigned long mGMEventNextCheckTime; /// »èÁ¦ ´ë±âÁßÀÎ GM À̺¥Æ® ¹öÇÁ cGMEventList mReadyDelGMEventList; unsigned long mGMEventDelNextCheckTime; unsigned long mCashInfNextSaveTime; bool mIsCashInfSave; bool mIsCashInfCycleSave; unsigned long mCheckRushSkillIdx; unsigned char mCheckRushSkillStep; /// ½ºÅ³ »ç¿ëÁ¶°Ç üũ¸¦ À§ÇÑ º¸À¯ÁßÀÎ ¹öÇÁ/µð¹öÇÁ ¸Ê. Ű °ªÀº ApplyValueType(È¿°ú Àû¿ë ŸÀÔ) ÀÌ´Ù. //typedef tHashSet cHashSet; typedef tHashMap cApplyValueTypeMap; cApplyValueTypeMap mBuffmap; cApplyValueTypeMap mDeBuffmap; // ¼ÒÁö±Ý¾× & ¿¹Ä¡±Ý¾× °ü·Ã º¯¼öÁ¤ÀÇ. private: unsigned long mMoney; unsigned long mDeposit; // ¼ÒÁö±Ý¾× & ¿¹Ä¡±Ý¾× °ü·Ã ¸Þ¼Òµå. public: unsigned long GetMoney ( ) { return mMoney; } bool IsAddMoney ( long money ); long AddMoney ( sObject object, long money, bool save=true ); bool SaveMoney ( sObject object, unsigned long befor, unsigned long after, long money ); bool SendMoney ( sObject object, long addMoney=0 ); unsigned long GetDeposit ( ) { return mDeposit; } long AddDeposit ( sObject object, long deposit ); bool SaveDeposit ( sObject object, unsigned long befor, unsigned long after, long deposit ); bool SendDeposit ( sObject object, long addDeposit=0 ); void NpcDeposit ( MSG_REQ_NPC_DEPOSIT* msg ); void NpcWithdraw ( MSG_REQ_NPC_WITHDRAW* msg ); // Æ÷ÀÎÆ® °ü·Ã ¸Þ¼Òµå. public: unsigned long GetTarotPoint ( ) { return mHeroInfo.TarotPoint; } long AddTarotPoint ( long point ); bool SaveTarotPoint ( long point ); bool SendTarotPoint ( long point ); unsigned long GetPvPPoint ( unsigned char forceType ); long AddPvPPoint ( long point, unsigned char forceType ); bool SendPvPPoint ( long point, unsigned char forceType ); private: bool mIsDbUpdate; /// ij¸¯ÅÍ ±âº»Á¤º¸ dbÀúÀåÁß Ç÷¡±× // ¾ÆÀÌÅÛ & Àκ¥Å丮 °ü·Ã º¯¼öÁ¤ÀÇ. private: union // Database Flag - Inventory { struct { bool insert : 1; // »ý¼º.(¿î¿µÀÚ¸¸ °¡´É). bool remove : 1; // »èÁ¦. bool use : 1; // »ç¿ë. bool swap : 1; // À̵¿Áß ±³È¯(¿¹¿ÜÀûÀÎ À̵¿). bool move : 1; // À̵¿. bool except : 1; // À̵¿Áß À̵¿(¿¹¿ÜÀûÀÎ À̵¿). bool merge : 1; // À̵¿Áß º´ÇÕ(¿¹¿ÜÀûÀÎ À̵¿). bool divide : 1; // ³ª´©±â. bool move2 : 1; // À̵¿(Àκ¥<>â°í Àü¿ë). bool enhanced : 1; // °­È­. bool disjoint : 1; // ºÐÇØ. bool putCard : 1; // Ä«µåÀåÂø bool change : 1; // üÀÎÁö(±³È¯). bool sell : 1; // ÆÇ¸Å. bool buy : 1; // ±¸¸Å. bool get : 1; // Áݱâ. bool reward : 1; // º¸»ó. bool take : 1; // ȸ¼ö. bool collect : 1; // Ä÷º¼ÇºÏ. bool exchange : 1; // °Å·¡. bool stallSellGet : 1; // ±¸¸Å(³ëÁ¡). bool itemMix : 1; // ¾ÆÀÌÅÛÁ¶ÇÕ. bool skillReset : 1; // ½ºÅ³ ÃʱâÈ­. bool agentInsert : 1; // ¾ÆÀÌÅÛ ÆÇ¸Å´ëÇà(µî·Ï). bool agentDelete : 1; // ¾ÆÀÌÅÛ ÆÇ¸Å´ëÇà(»èÁ¦). bool agentUpdate : 1; // ¾ÆÀÌÅÛ ÆÇ¸Å´ëÇà(±¸¸Å). bool postInsert : 1; // ¿ìÆí º¸³»±â. bool postUpdate : 1; // ¿ìÆí ÷ºÎ¹Þ±â. bool cash : 1; // ij½Ã¾ÆÀÌÅÛ ¹°Ç°¼ö·É bool seal : 1; // ÀÎÁõ bool itemBill : 1; // ¾ÆÀÌÅÛ ºô bool themeReset : 1; // Å׸¶ ÃʱâÈ­ } mInventoryDb; long mInventoryDatabase; }; TB_INVENTORY mInventory[ LEN_INVENTORY ]; eItemActiveWeapon mItemActiveWeapon; bool mItemChange; unsigned short mItemWeight; bool mXCopyComplete; // ¾ÆÀÌÅÛÀÌ db °»½Å ¿Ï·áÈÄ Ç÷¡±× sEquipAbility mEquipAbility; unsigned short mArmorSets; DWORD mItemEnhancedSeed; DWORD mItemChangeSeed; ItemBillRoot mItemBillRoot; bool mItemBillStart; ItemGetRoot mItemGetRoot; ItemCountRoot mItemCountRoot; CooltimeRoot mCooltimeRoot; // ¾ÆÀÌÅÛ & Àκ¥Å丮 °ü·Ã ¸Þ¼Òµå. public: long InventoryDatabase ( ) { return mInventoryDatabase; } bool IsInventory ( TB_INVENTORY* inventory ); bool IsInventoryRange ( unsigned short number ); bool IsInventoryBag ( unsigned short number ); bool IsInventoryEquip ( unsigned short number ); bool IsInventoryQuest ( unsigned short number ); bool IsInventoryWarehouse ( unsigned short number ); bool IsInventoryCollect ( unsigned short number ); bool IsInventoryCash ( unsigned short number ); bool IsInventoryMove ( unsigned short number1, unsigned short number2, short* except, int& depth ); bool IsInventoryMerge ( TB_ITEM_DEFINE* itemDefine, TB_INVENTORY* inventory1, TB_INVENTORY* inventory2 ); bool IsInventorySeal ( TB_ITEM_DEFINE* itemDefine, TB_INVENTORY* inventory ); bool IsInventorySeal ( TB_INVENTORY* inventory ); bool IsInventoryMegaphone ( long inventoryIdx ); bool SetInvenLimit ( TB_ITEM_DEFINE* itemDefine, CHARACTER_INVEN_SIZE* invenSize ); short GetEmptyBagNumber ( short number=INVENTORY_BAG_BEGIN ); short GetEmptyQuestNumber ( short number=INVENTORY_QUEST_BEGIN ); void InventorySwap ( unsigned short number1, unsigned short number2 ); void InventoryMove ( unsigned short number1, unsigned short number2 ); void InventoryExcept ( unsigned short number1, unsigned short number2 ); bool IsItemLimit ( long itemDefineIdx ); bool IsItemExchange ( TB_ITEM_DEFINE* itemDefine, TB_INVENTORY* inventory ); bool IsMaxInventory ( TB_ITEM_DEFINE* itemDefine, long count ); bool IsMaxInventory ( sQuestItem* items, unsigned int rowCount ); long GetItemSumCount ( long itemDefineIndex ); short GetItemCount ( long itemDefineIndex ); bool IsItem ( long itemDefineIndex ); bool IsItemIdx ( long inventoryIdx ); bool IsItemUse ( long itemDefineIndex, unsigned short count=1 ); bool ItemUse ( long itemDefineIndex, unsigned short count=1 ); long IsItemMapChange ( short number, long itemDefineIndex, bool isCash, long itemAbilityInfluence ); long IsItemVehicle ( short number, long itemDefineIndex, long itemAbilityInfluence ); bool ItemUseMapChange ( long inventoryIdx ); void ItemUseCashMapChange ( long inventoryIdx ); bool SendItemUse ( TB_INVENTORY* inventory ); unsigned int IsItemReward ( long inventoryIdx, eDisjointItem* items, int maxCount ); unsigned int IsItemReward ( sQuestItem* items, int maxCount, short slotBegin, short slotEnd ); unsigned int IsItemTake ( sQuestItem* items, int maxCount ); unsigned int GetQuestItemCount ( long itemDefineIndex, int maxCount ); void SetActiveWeapon ( eItemActiveWeapon activeWeapone ) { mItemActiveWeapon = activeWeapone; } eItemActiveWeapon GetActiveWeapon ( ) { return mItemActiveWeapon; } void EquipItems ( ); void CalcItemWeight ( ); unsigned short GetItemWeight ( ) { return mItemWeight; } void AddEquipAbility ( short opt, short value ); void AddEquipAbility ( TB_ITEM_ABILITY* itemAbility ); void AddEquipEnhanced ( TB_ITEM_ENHANCED* itemEnhanced, BYTE enhanced ); void AddEquipCards ( TB_INVENTORY* inventory ); sEquipAbility* GetEquipAbility ( ) { return &mEquipAbility; } void ResetArmorSets ( ); unsigned short GetArmorSets ( ) { return mArmorSets; } ItemBillRoot* GetItemBillRoot ( ) { return &mItemBillRoot; } ItemGetRoot* GetItemGetRoot ( ) { return &mItemGetRoot; } ItemCountRoot* GetItemCountRoot ( ) { return &mItemCountRoot; } CooltimeRoot* GetCooltimeRoot ( ) { return &mCooltimeRoot; } void AddCooltime ( TB_INVENTORY_COOLTIME* table ); PerItemBill* AddItemBill ( TB_ITEM_BILL* table ); bool SaveItemBill ( long itemBillIdx, long elapsed, long before, long after, long inventoryIdx ); bool UpdateItemBill ( ); void StartItemBill ( ); void StopItemBill ( ); bool CheckInventory ( long itemDefineIndex, int itemCount ); TB_INVENTORY* XCopyInventory ( TB_INVENTORY* destination, TB_INVENTORY* source, XCOPY_INVENTORY_OPT opt=XCOPY_INVENTORY_ALL ); TB_INVENTORY* XCopyInventory ( TB_INVENTORY* inventory, XCOPY_INVENTORY_OPT opt=XCOPY_INVENTORY_ALL ); TB_INVENTORY* SelectInventory ( short number=MIN_INVENTORY ); TB_INVENTORY* SelectInventoryIdx ( long idx, short begin, short end ); bool FindFirstInventory ( TB_ITEM_DEFINE* itemDefine, short* number, short remainCount, short* pcvValue, bool overlap ); bool FindNextInventory ( TB_ITEM_DEFINE* itemDefine, short* number, short remainCount, short* pcvValue, bool overlap ); TB_INVENTORY* CreateInventory ( TB_ITEM_DEFINE* itemDefine, short number, short count, short* pcbValue ); TB_INVENTORY* CreateInventory ( long itemDefineIndex, short number, short count, short* pcbValue ); short UpdateInventory ( TB_INVENTORY* inventory, short count ); short UpdateInventory ( short number, short count ); bool RemoveInventory ( TB_INVENTORY* inventory ); bool RemoveInventory ( short number ); void ItemInsInventory ( ULONG_PTR socketContext, MSG_REQ_CHEAT_MAKE* msg ); void ItemInsInventory ( ULONG_PTR socketContext, MSG_REQ_CHEAT_MAKE_ITEMS* msg ); void ItemMovInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_MOV_INVENTORY* msg ); void ItemUseInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_USE_INVENTORY* msg ); void ItemDelInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_DEL_INVENTORY* msg ); void ItemSwiInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_SWI_INVENTORY* msg ); void ItemDivideInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_DIVIDE_INVENTORY* msg ); void ItemMov2Inventory ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_MOV2_INVENTORY* msg ); void ItemDisjointInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_DISJOINT_INVENTORY* msg ); void ItemPutCardInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_PUT_CARD_INVENTORY* msg ); void ItemChangeInventory ( ULONG_PTR socketContext, MSG_REQ_ITEM_CHANGE_INVENTORY* msg ); void ItemCashInventory ( ULONG_PTR socketContext ); void ItemSell ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_SELL* msg ); void ItemBuy ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_BUY* msg ); void ItemCollect ( ULONG_PTR socketContext, MSG_REQ_ITEM_COLLECT* msg ); void ItemCollectChange ( ULONG_PTR socketContext, MSG_REQ_COLLECT_CARD_CHANGE* msg ); void ItemObtEvent ( ULONG_PTR socketContext, BYTE cbtUser, BYTE obtUser, BYTE fourGamer ); int IsItemEnhanced ( unsigned short equip, unsigned short card, unsigned short safeCard, int* rateType ); void ItemEnhancedStart ( MSG_REQ_ITEM_ENHANCED_START* msg ); void ItemEnhancedEnd (); void ItemEnhancedCancel ( ); void ItemEnhancedForceCancel ( ); // °­Á¦ Ãë¼Ò( »óÅÂÀÌ»óµî ) void ItemLicense ( ULONG_PTR socketContext, MSG_REQ_ITEM_LICENSE* msg ); void ItemSummonPost ( ULONG_PTR socketContext, MSG_REQ_TRADE_POST_SUMMON_OPEN* msg ); void ItemSummonAgent ( ULONG_PTR socketContext, MSG_REQ_TRADE_AGENT_SUMMON_OPEN* msg ); void ItemSummonWareHouse ( ULONG_PTR socketContext, MSG_REQ_ITEM_WAREHOUSE_SUMMON_OPEN* msg ); void ItemNpcEvent ( ULONG_PTR socketContext, unsigned long eventIndex ); bool SendInventory ( ULONG_PTR socketContext ); bool SendInventoryCooltime ( ULONG_PTR socketContext ); bool SendInventoryCash ( ULONG_PTR socketContext ); bool SetWearInfoWithSendMsg ( eWEAR_TYPE type, unsigned long itemDefineIndex ); bool SetCosWearInfoWithSendMsg( eWEAR_TYPE type, unsigned long itemDefineIndex ); void SendCosWearInfo ( eWEAR_TYPE type, unsigned long itemDefineIndex ); bool SetCosAccInfoWithSendMsg ( eCOSTUME_LINK type, unsigned long itemDefineIndex ); void SetWeaponInfoWithSendMsg ( TB_INVENTORY* left, TB_INVENTORY* right ); void SetInventoryEquip ( sInventory* sInventory, unsigned long* count ); // Callback °ü·Ã ¸Þ¼Òµå - Inventory & Item. bool CbItemBillDel ( ULONG_PTR socketContext, ITEM_BILL_REMOVE* remove, u_long requestResult ); void CbInventoryInsert ( ULONG_PTR socketContext, INVENTORY_INSERT* inventoryInsert, u_long requestResult ); void CbInventoryRemove ( ULONG_PTR socketContext, INVENTORY_REMOVE* inventoryRemove, u_long requestResult ); void CbInventoryUse ( ULONG_PTR socketContext, INVENTORY_USE* inventoryUse, u_long requestResult ); void CbInventorySwap ( ULONG_PTR socketContext, INVENTORY_SWAP* inventorySwap, u_long requestResult ); void CbInventoryMove ( ULONG_PTR socketContext, INVENTORY_MOVE* inventoryMove, u_long requestResult ); void CbInventoryExcept ( ULONG_PTR socketContext, INVENTORY_EXCEPT* inventoryExcept, u_long requestResult ); void CbInventoryMerge ( ULONG_PTR socketContext, INVENTORY_MERGE* inventoryMerge, u_long requestResult ); void CbInventoryDivide ( ULONG_PTR socketContext, INVENTORY_DIVIDE* inventoryDivide, u_long requestResult ); void CbInventoryMove2 ( ULONG_PTR socketContext, INVENTORY_MOVE2* inventoryMove2, u_long requestResult ); void CbInventoryEnhanced ( ULONG_PTR socketContext, INVENTORY_ENHANCED* inventoryEnhanced, u_long requestResult ); void CbInventoryDisjoint ( ULONG_PTR socketContext, INVENTORY_DISJOINT* inventoryDisjoint, u_long requestResult ); void CbInventoryPutCard ( ULONG_PTR socketContext, INVENTORY_PUT_CARD* inventoryPutCard, u_long requestResult ); void CbInventoryChange ( ULONG_PTR socketContext, INVENTORY_CHANGE* inventoryChange, u_long requestResult ); void CbInventorySeal ( ULONG_PTR socketContext, INVENTORY_SEAL* inventorySeal, u_long requestResult ); void CbInventoryCashSelect ( ULONG_PTR socketContext, INVENTORY_SELECT* inventorySelect, u_long requestResult ); void CbItemSell ( ULONG_PTR socketContext, ITEM_SELL* itemSell, u_long requestResult ); void CbItemBuy ( ULONG_PTR socketContext, ITEM_BUY* itemBuy, u_long requestResult ); void CbItemCollect ( ULONG_PTR socketContext, ITEM_COLLECT* itemCollect, u_long requestResult ); void CbItemCollectChange ( ULONG_PTR socketContext, ITEM_COLLECT_CHANGE* itemCollect, u_long requestResult ); void CbItemGet ( ULONG_PTR socketContext, ITEM_GET* itemGet, u_long requestResult ); void CbItemGetQuest ( ULONG_PTR socketContext, ITEM_GET* itemGet, u_long requestResult ); void CbItemPartyGive ( ULONG_PTR socketContext, ITEM_PARTY_GIVE* itemPartyGive, u_long requestResult ); void CbItemUse ( ULONG_PTR socketContext, ITEM_USE* itemUse, u_long requestResult ); void CbItemObtEvent ( ULONG_PTR socketContext, ITEM_OBT_EVENT* itemEvent, u_long requestResult ); void CbExchangeEnd ( TB_INVENTORY* table, unsigned long rowCount, u_long requestResult ); void CbStallSellGet ( ULONG_PTR socketContext, STALL_SELL_GET* stallSellGet, u_long requestResult ); void CbCharacterSkillreset ( ULONG_PTR socketContext, CHARACTER_SKILL_RESET* characterSkillReset, u_long requestResult ); void CbInventoryReward ( ); void CbInventoryTake ( ); void CbCharacterThemeReset ( ULONG_PTR socketContext, CHARACTER_THEME_RESET* characterThemeReset, u_long requestResult ); void CbCharacterGMThemeReset ( CHARACTER_GM_THEME_RESET* characterThemeReset ); bool CbInventoryItemMix ( ); bool CbInventoryEnhanced ( ); void CbItemSummonPost ( ULONG_PTR socketContext, ITEM_SUMMON_POST* summonPost, u_long requestResult ); void CbItemSummonAgent ( ULONG_PTR socketContext, ITEM_SUMMON_AGENT* summonAgent, u_long requestResult ); void CbItemSummonWareHouse ( ULONG_PTR socketContext, ITEM_SUMMON_WAREHOUSE* summonWare, u_long requestResult ); void CbItemNpcEvent ( ULONG_PTR socketContext, ITEM_NPC_EVENT* npcEvent, u_long requestResult ); // ¾ÆÀÌÅÛÁݱ⠰ü·Ã º¯¼öÁ¤ÀÇ. private: bool mItemGetOpen; unsigned long mItemGetIdx; int mItemGetCount; sItemData mItemGetData[ MAX_ITEMS ]; // ¾ÆÀÌÅÛÁݱ⠰ü·Ã ¸Þ¼Òµå. public: void ItemGetOpen ( MSG_REQ_ITEM_GET_OPEN* msg ); void ItemGetClose ( MSG_REQ_ITEM_GET_CLOSE* msg ); void ItemGetClose ( ); void ItemGet ( MSG_REQ_ITEM_GET* msg ); int ItemPartyGive ( MSG_REQ_ITEM_PARTY_GIVE* msg ); int ItemPartyTake ( TB_ITEM_DEFINE* takeItem, short count, unsigned long giveCharacterIdx ); unsigned short ItemGetAutoPush ( unsigned long itemDefineIndex, unsigned short count ); bool ItemGetAutoEnd ( bool apply ); bool ItemGetQuest ( unsigned long itemDefineIndex, unsigned short count ); // ¾ÆÀÌÅÛÁݱ⠰ü·Ã ¸Þ¼Òµå. private: bool SendItemGetOpen ( cBaseObject* baseObject ); bool SendItemGetClose ( ); bool SendItemGetLeave ( cBaseObject* baseObject ); bool SendItemGatheringOpen ( cBaseObject* baseObject ); // °Å·¡ °ü·Ã º¯¼öÁ¤ÀÇ. private: eItemExchangeStatus mExchangeStatus; sObject mExchangeTarget; unsigned long mExchangeItems; unsigned long mExchangeMoney; // °Å·¡ °ü·Ã ¸Þ¼Òµå. public: eItemExchangeStatus GetExchangeStatus ( ) { return mExchangeStatus; } long GetExchangeMoney ( ) { return mExchangeMoney; } void ExchangeAsk ( MSG_REQ_ITEM_EXCHANGE_ASK* msg ); void ExchangeAsk ( sObject object ); void ExchangeReply ( MSG_REQ_ITEM_EXCHANGE_REP* msg ); void ExchangeReply ( BYTE type ); void ExchangeReplySyn ( BYTE type, int error ); void ExchangeAdd ( MSG_REQ_ITEM_EXCHANGE_ADD* msg ); void ExchangeAdd ( TB_INVENTORY* inventory ); void ExchangeAdd ( unsigned long money ); void ExchangeDel ( MSG_REQ_ITEM_EXCHANGE_DEL* msg ); void ExchangeDel ( TB_INVENTORY* inventory ); void ExchangeOk ( MSG_REQ_ITEM_EXCHANGE_OK* msg ); void ExchangeRetry ( MSG_REQ_ITEM_EXCHANGE_RETRY* msg ); void ExchangeRetry ( ); void ExchangeCancel ( MSG_REQ_ITEM_EXCHANGE_CANCEL* msg ); void ExchangeCancel ( bool sendme = true ); void ExchangeClear ( ); void ExchangeEnd ( ) { mInventoryDb.exchange = true; } void ExchangeEnd ( MSG_REQ_ITEM_EXCHANGE_END* msg ); bool SendMsgResExchange ( char category, char protocol, int error ); bool SendMsgResExchangeEnd ( TB_INVENTORY* table, unsigned long rowCount ); // ³ëÁ¡ °ü·Ã º¯¼öÁ¤ÀÇ. private: // ³ëÁ¡ ¾ÆÀÌÅÛ(ITEM) bool mStallSell; wchar_t mStallSellTitle[ MAX_STALL_TITLE_LEN ]; StallSellItem mStallSellItems[ MAX_STALL_ITEM ]; unsigned long mStallSellItemOffset; unsigned long mStallSellGuests[ MAX_STALL_GUEST ]; unsigned long mStallSellGuestOffset; // ³ëÁ¡ °Ô½ºÆ®(GUEST) sObject mStallSellOwner; // ³ëÁ¡ °ü·Ã ¸Þ¼Òµå. public: bool IsStallSellOpen ( ) { return mStallSell; } void StallSellOpen ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_OPEN* msg ); void StallSellClose ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_CLOSE* msg ); void StallSellOpenDie ( ); void StallSellOpenShutdown ( bool shutdown=false ); void StallSellUseDie ( ); void StallSellUseShutdown ( bool shutdown=false ); StallSellItem* GetStallSellItem ( TB_INVENTORY* inventory, long price ); StallSellItem* GetStallSellItem ( TB_INVENTORY* inventory ); bool ReleaseStallSellItem ( StallSellItem* stallSellItem ); void ClearStallSellItem ( ); bool GetStallSellGuest ( unsigned long characterIdx ); bool ReleaseStallSellGuest ( unsigned long characterIdx ); void ReleaseStallSellAllGuests( ); void StallSellRename ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_RENAME* msg ); void StallSellAdd ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_ADD* msg ); void StallSellDel ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_DEL* msg ); void StallSellMod ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_MOD* msg ); void StallSellJoin ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_JOIN* msg ); void StallSellJoin ( cPlayer* player ); void StallSellLeave ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_LEAVE* msg ); bool StallSellLeave ( cPlayer* player ); void StallSellLeave ( int error ); void StallSellGet ( ULONG_PTR socketContext, MSG_REQ_ITEM_STALL_SELL_GET* msg ); bool SendMsgResStallSell ( char category, char protocol, int error ); void SendMsgSynStallSell ( char category, char protocol, TB_INVENTORY* inventory, long price ); // ÆÇ¸Å´ëÇà °ü·Ã º¯¼öÁ¤ÀÇ. public: bool mItemAgentCheck; unsigned long mItemAgentNextCheck; // ÆÇ¸Å´ëÇà °ü·Ã ¸Þ¼Òµå. public: void SetItemAgentCheck ( long nextCheck ); bool ItemAgentPageOpen ( ULONG_PTR socketContext, long startPage ); void ItemAgentAdd ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_AGENT_ADD* msg ); void ItemAgentDel ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_AGENT_DEL* msg ); void ItemAgentGet ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_AGENT_GET* msg ); void CbItemAgentCheck ( ITEM_AGENT_CHECK* check ); void CbItemAgentAdd ( ULONG_PTR socketContext, ITEM_AGENT_INSERT* insert, u_long requestResult ); void CbItemAgentDel ( ULONG_PTR socketContext, ITEM_AGENT_DELETE* del, u_long requestResult ); void CbItemAgentGet ( ULONG_PTR socketContext, ITEM_AGENT_UPDATE* update, u_long requestResult ); //bool ItemAgentSearch ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_AGENT_SEARCH* msg ); //bool ItemAgentSearchName ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_AGENT_SEARCH_NAME* msg ); bool ItemAgentSearchType ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_AGENT_SEARCH_TYPE* msg ); bool ItemAgentSearchAll ( ULONG_PTR socketContext, MSG_REQ_NPC_ITEM_AGENT_SEARCH_ALL* msg ); // ¿ìÆí °ü·Ã º¯¼öÁ¤ÀÇ. public: bool mPostCheck; unsigned long mPostNextCheck; // ¿ìÆí °ü·Ã ¸Þ¼Òµå. public: void SetPostCheck ( long nextCheck ); bool PostOpen ( ULONG_PTR socketContext, long startPage=1 ); bool PostOpen ( ULONG_PTR socketContext, MSG_REQ_CHAT_POST_OPEN* msg ); void PostClose ( ULONG_PTR socketContext, MSG_REQ_CHAT_POST_CLOSE* msg ); void PostRead ( ULONG_PTR socketContext, MSG_REQ_CHAT_POST_READ* msg ); void PostWrite ( ULONG_PTR socketContext, MSG_REQ_CHAT_POST_WRITE* msg ); void PostDownload ( ULONG_PTR socketContext, MSG_REQ_CHAT_POST_DOWNLOAD* msg ); void PostDelete ( ULONG_PTR socketContext, MSG_REQ_CHAT_POST_DELETE* msg ); void SendPostSelect( ULONG_PTR socketContext, long startPage, long endPage, long noneRead, POST_RESULT* postResult, long postCount ); void CbPostCheck ( POST_CHECK* check ); void CbPostRead ( POST_UPDATE_STATUS* status ); void CbPostWrite ( ULONG_PTR socketContext, POST_INSERT* insert ); void CbPostDownload ( ULONG_PTR socketContext, POST_UPDATE* update ); // Ÿ·Î °ü·Ã º¯¼öÁ¤ÀÇ. private: wchar_t mTarotTitle[ MAX_TAROT_TITLE ]; unsigned long mTarotPrice; unsigned short mTarotUserCount; short mTarotItemCount; bool mTarotCloseReserved; unsigned long mTarotGuests[ MAX_TAROT_GUEST ]; int mTarotGuestOffset; unsigned long mTarotReaderIdx; TB_INVENTORY* mTarotCards[ MAX_TAROT_CARDS ]; TB_INVENTORY* mSpread[ MAX_SPREAD ]; int mSpreadOffset; unsigned long mTarotResultIndex; unsigned long mTarotResultValue; // Àӽà npc Ÿ·Ô ÀúÀå¼Ò unsigned long mTempNpcTarotCards[ MAX_TAROT_CARDS ]; // Ÿ·Î °ü·Ã ¸Þ¼Òµå - Ÿ·Î´Â Reader¿Í Seeker·Î ±¸ºÐ. public: void SetTarotResultIndex ( long index ) { mTarotResultIndex=index; } void SetTarotResultValue ( long value ) { mTarotResultValue=value; } wchar_t* GetTarotTitle ( ) { return mTarotTitle; } unsigned long GetTarotPrice ( ) { return mTarotPrice; } bool IsTarotReaderClose ( ); bool IsTarotCloseReserved ( ) { return mTarotCloseReserved; } void TarotReaderReady ( ULONG_PTR socketContext, MSG_REQ_TAROT_READER_READY* msg ); void TarotReaderOpen ( ULONG_PTR socketContext, MSG_REQ_TAROT_READER_OPEN* msg ); void TarotReaderClose ( ULONG_PTR socketContext, MSG_REQ_TAROT_READER_CLOSE* msg ); void TarotReaderClose ( int error ); bool GetTarotGuest ( unsigned long characterIdx ); bool ReleaseTarotGuest ( unsigned long characterIdx ); void ReleaseTarotAllGuests ( ); bool GetTarotCards ( TB_INVENTORY* inventory[], short begin ); void GetSpreads ( TB_INVENTORY* inventory[], short begin, int& offset ); short GetTarotItemCount ( ) { return mTarotItemCount; } void UseTarotCard ( sObject object, long money, long itemDefineIndex ); void TarotSeekerOpen ( ULONG_PTR socketContext, MSG_REQ_TAROT_SEEKER_OPEN* msg ); void TarotSeekerClose ( ULONG_PTR socketContext, MSG_REQ_TAROT_SEEKER_CLOSE* msg ); void TarotSeekerJoin ( ULONG_PTR socketContext, MSG_REQ_TAROT_SEEKER_JOIN* msg ); void TarotSeekerResult ( ULONG_PTR socketContext, MSG_REQ_TAROT_SEEKER_RESULT* msg ); void TarotSeekerAccept ( ULONG_PTR socketContext, MSG_REQ_TAROT_SEEKER_ACCEPT* msg ); void TarotTutorialSeekerJoin (); void TarotTutorialSeekerResult( ULONG_PTR socketContext, MSG_REQ_TAROT_TUTORIAL_SEEKER_RESULT* msg ); void TarotTutorialSeekerAccept( ULONG_PTR socketContext ); int TarotSelfJoin ( ULONG_PTR socketContext, MSG_REQ_TAROT_SELF_JOIN* msg ); int TarotSelfResult ( ULONG_PTR socketContext, MSG_REQ_TAROT_SELF_RESULT* msg ); int TarotSelfAccept ( ULONG_PTR socketContext ); void TarotReaderDie ( ); void TarotSeekerDie ( ); void TarotReaderShutdown ( bool shutdown=false ); void TarotSeekerShutdown ( bool shutdown=false ); bool SendMsgResTarot ( char category, char protocol, int error ); bool SendTarotReaderJoin ( wchar_t* seekerName ); bool SendTarotReaderLeave ( wchar_t* seekerName ); bool SendTarotStoreOpen ( wchar_t* readerName, wchar_t* tarotTitle, unsigned long price ); bool SendTarotStoreJoin ( wchar_t* tarotTitle, unsigned long price ); // Äù½ºÆ® °ü·Ã µ¥ÀÌÅÍ private: /// °³ÀÎ º¸À¯ Äù½ºÆ® TB_QUEST_PROGRESS mQuest[ MAX_KEEPQUEST ]; /// ¿Ï·áµÈ Äù½ºÆ® ¸ñ·Ï ( º¸»ó±îÁö ) typedef tHashSet cCompleteQuestSet; cCompleteQuestSet mCompleteQuestSet; /// ¿Ï·áµÈ Äù½ºÆ® ±×·ì ¸ñ·Ï typedef tHashSet cCompleteGroupQuestSet; cCompleteGroupQuestSet mCompleteGroupQuestSet; /// ¸¸±âÀÏ Äù½ºÆ® ¸ñ·Ï typedef tHashMap cValidQuestMap; cValidQuestMap mValidQuestMap; /// ¸¸±âÀÏ Äù½ºÆ® ±×·ì ¸ñ·Ï typedef tHashSet cValidGroupQuestSet; cValidGroupQuestSet mValidGroupQuestSet; // Äù½ºÆ® °ü·Ã ¸Þ¼Òµå public: TB_QUEST_PROGRESS* GetQuest ( int number ); bool SendQuest ( ULONG_PTR socketContext ); bool SaveQuestProgress ( ULONG_PTR socketContext ); /// DB ¿¡ Äù½ºÆ® ÁøÇàÁ¤º¸ °»½Å bool SendDefaultReward ( unsigned long questIdx, unsigned long* skillList, unsigned char skillListCnt ); bool SendRewardBuff ( unsigned long buffIdx ); bool SendLimitPenalty ( unsigned long questIdx, bool gameIn = false ); /// Á¦¾à»çÇ× °É±â bool SendFailPenalty ( unsigned long questIdx ); /// ½ÇÆÐ·Î ÀÎÇÑ ÆÐ³ÎƼ bool SendEndPenalty ( unsigned long questIdx ); /// Äù½ºÆ® Á¾·á½ÃÀÇ Ã³¸® /// Äù½ºÆ® ÁøÇà °Ë»ç ( targetIdx : ¸ó½ºÅÍ, npc Á¾·ùÀ妽º ) void UpdateDutyHunt ( unsigned int classIdx, unsigned long playerIdx ); void UpdateDutyItem ( ); void UpdateDutyActiveSkill ( unsigned int classIdx, unsigned long skillIndex ); void UpdateDutyPVP ( unsigned char pvptype, bool win ); void UpdateDutyTutorial ( eDutyType dutyType ); bool IsEquipQuestItem ( unsigned long questIdx ); /// Äù½ºÆ®ÁøÇà ¾ÆÀÌÅÛÀ» Âø¿ëÇϰí ÀÖ´ÂÁö °Ë»ç int IsRegistQuest ( eQUESTADD_TYPE type, unsigned long questIdx, unsigned long npcIdx ); /// ½Å±Ô°¡´ÉÇÑ Äù½ºÆ®ÀÎÁö °Ë»ç int IsUseQuestItem ( unsigned int number, unsigned long& questIdx ); /// ÀÇ·Ú¾ÆÀÌÅÛÀ» »ç¿ëÇÒ¼ö ÀÖ´ÂÁö üũ bool QuestMapChange ( unsigned long posIdx ); bool IsCompleteGathering ( unsigned long questIndex ); int IsKeepQuest ( int arrIdx, unsigned long questIdx ); /// º¸À¯ÁßÀÎ Äù½ºÆ®ÀÎÁö °Ë»ç int IsKeepQuest ( unsigned long questIdx ); int IsKeepGroupQuest ( unsigned long questIdx ); /// ÇØ´ç Äù½ºÆ®¿Í µ¿ÀÏÇÑ ±×·ìÀÇ Äù½ºÆ® º¸À¯Áß °Ë»ç bool IsCompleteQuest ( unsigned long questIdx, bool checkGroup = true ); /// ¿ÏÀü ¿Ï·áÇÑ Äù½ºÆ®ÀÎÁö °Ë»ç bool AddCompleteQuest ( unsigned long questIdx ); /// ¿ÏÀüÈ÷ ¿Ï·áÇÑ Äù½ºÆ® ¸ñ·Ï int FindEmptyQuest ( ); void ClearQuestList ( ); void ClearCompleteList ( ); void DeleteQuest ( int arrIdx ); unsigned int GetDropItemCount ( unsigned int arrIdx, unsigned long itemIdx ); /// ¸ó½ºÅÍ µå¶ø¿¡ ÇÊ¿äÇÑ ¾ÆÀÌÅÛ °¹¼ö ¸®ÅÏ bool AddValidQuest ( long questIdx, TIMESTAMP_STRUCT valid ); bool IsValidEndQuest ( long questIdx ); /// ¸¸±âÀÏÀÌ Áö³­ Äù½ºÆ®ÀÎÁö °Ë»ç(Áï ¶Ç ¹ÞÀ»¼ö ÀÖ´ÂÁö °Ë»ç) void ClearValidQuestList ( ); int SaveQuestInsert ( ULONG_PTR socketContext, unsigned long characterIdx, unsigned long questIdx ); int SaveQuestInsertByItem ( ULONG_PTR socketContext, unsigned long characterIdx, unsigned long questIndex, unsigned short number ); int SaveQuestComplete ( ULONG_PTR socketContext, MSG_REQ_NPC_QUEST_COMPLETE* msg, unsigned long dbIdx ); int SaveQuestReward ( ULONG_PTR socketContext, MSG_REQ_NPC_QUEST_REWARD* msg, unsigned long dbIdx ); bool SaveQuestDelete ( ULONG_PTR socketContext, MSG_REQ_QUEST_DEL* msg, unsigned long dbIdx ); bool SaveQuestDeleteAuto ( ULONG_PTR socketContext, MSG_REQ_QUEST_DELAUTO* msg, unsigned long dbIdx ); bool SendNewQuestList ( ); bool SendEventQuestList ( short eventtype ); /// ÀÏÁ¤ À̺¥Æ®¿¡ µû¸¥ ½Å±Ô Äù½ºÆ® // Ä¿¹Â´ÏƼ ¸Þ¼Òµå - Ä£±¸. private: TB_FRIEND mFriends[ MAX_FRIEND ]; // Ä£±¸ DB »ç¿ë bool mFriendUseDB; bool mFriendSend; public: void ClearFriends ( ); TB_FRIEND* SelectFriend ( short offset=0 ); bool UpdateFriend ( ); void SendFriendList ( ULONG_PTR socketContext ); void SendFriendConnect ( BYTE connect ); void PostFriendConnect ( BYTE connect ); void SyncFriendConnect ( long characterIdx, char level, unsigned long job, unsigned short mapnum, BYTE connect, DWORD channelNum ); void SetFriendUseDB ( bool flag ) { mFriendUseDB = flag; } bool GetFriendUseDB () { return mFriendUseDB; } void SetFriendSend ( bool enable ) { mFriendSend = enable; } bool GetFriendSend ( ) { return mFriendSend; } // ÀÚµ¿»ç³É ½Å°í °ü·Ã º¯¼öÁ¤ÀÇ. public: time_t mTrialTime; // ÀÚµ¿»ç³É ½Å°í Àç»ç¿ë ½Ã°£ time_t mTrialRejectTime; // ÀÚµ¿»ç³É ½Å°í °ÅºÎ ½Ã°£ bool mAutoPlayer; // ¿ÀÅä ÆÇÁ¤ ¿©ºÎ bool mAutoTrial; // ÀÚµ¿»ç³É ½Å°í »óÅ unsigned long mTrialAnswerTime; // ½ÉÆÇ ½Ã°£ unsigned char mTrialAnswerCount; // Á¤´ä ÀԷ Ƚ¼ö unsigned char mCaptchaCount; // ĸÂ÷ À̹ÌÁö »õ·Î°íħ Ƚ¼ö unsigned long mTrialMemberIdx; // ½Å°íÀÚ unsigned long mLastAttackTime; // ¸¶Áö¸· ¸ó½ºÅÍ °ø°Ý ½Ã°£ wchar_t mCaptchaName[MAX_TRIAL_ANSWER_LEN + 1]; // ½ÉÆÇ Á¤´ä - ĸÂ÷ À̹ÌÁö À̸§ // ÀÚµ¿»ç³É ½Å°í °ü·Ã ¸Þ¼Òµå. public: time_t GetTrialTime() { return mTrialTime; } time_t GetTrialRejectTime() { return mTrialRejectTime; } void SetTrialTime ( time_t trial ) { mTrialTime = trial; } void SetTrialRejectTime ( time_t reject ) { mTrialRejectTime = reject; } unsigned long GetTrialMemberIdx() { return mTrialMemberIdx; } bool IsAutoPlayer() { return mAutoPlayer; } bool IsAutoTrial() { return mAutoTrial; } bool IsAutoTrial ( bool bTrial ) { return mAutoTrial = bTrial;} void SetCaptchaName ( wchar_t* name ) { ::wcsncpy( mCaptchaName, name, MAX_TRIAL_ANSWER_LEN ); } void CaptChaCountDown() { --mCaptchaCount; } unsigned char GetCaptChaCount() { return mCaptchaCount; } unsigned char GetTrialAnswerCount() { return mTrialAnswerCount; } unsigned long GetLastAttackTime() { return mLastAttackTime; } unsigned long SetLastAttackTime ( unsigned long attack ) { return mLastAttackTime = attack; } int TrialOpenReq ( ULONG_PTR socketContext, BYTE slevel, cPlayer* pTarget ); int TrialAnswer ( ULONG_PTR socketContext, wchar_t* answer ); void TrialStart ( unsigned long trialPlayerIdx, wchar_t* answer ); void TrialEnd ( bool bAuto=false ); void SendTrialReqResult ( ULONG_PTR socketContext, int error, cPlayer* pTarget ); // ¿ÀÅäÆÇÁ¤½Ã Á¦ÇÑ Ã³¸® void AutoLimit ( ); // ³×Æ®¿öÅ© °ü·Ã ¸Þ¼Òµå. public: bool SendPlayerInfo ( char category, char protocol, ULONG_PTR socketContext, unsigned char inDunType ); bool SendSightIn ( char category, char protocol, unsigned long connectionIdx ); bool SendSightOut ( char category, char protocol, unsigned long connectionIdx ); bool SendBuff ( char protocol, unsigned long connectionIdx ); bool SendHeroInfo(); /// ġƮ protected: bool mCheatHideMode; bool mCheatUndeadMode; unsigned long mCheatChatDuration; unsigned long mCheatChatAccumTime; unsigned long mCheatStopDuration; public: bool SetCheatHideMode ( bool hide ); bool GetCheatHideMode ( ) const; void SetCheatUndeadMode ( bool undead ); void CheatRecover ( ); void CheatRebirth ( ); void CheatStop ( unsigned long duration ); void CheatCancelStop ( ); void SetCheatSpeedUp ( unsigned long speedUp ); void CalcCheatSpeedUp ( ); /// ȣΰü¸® private: /// Ç÷¹À̾ ¼ÒÀ¯ÇÑ È£Äª ¸Ê typedef tPointerHashSet cHaveTitleSet; cHaveTitleSet mHaveTitleSet; /// ȣĪ ¼ÂÆÃÀ¸·Î ÀÎÇØ Àû¿ëµÈ È¿°úÀÇ °íÀ¯ À妽º( È¿°ú»èÁ¦¸¦ À§ÇØ ÀúÀå ) unsigned long mTitleUniqIndex; public: bool SendHaveTitleList ( ULONG_PTR socketContext ); /// º¸À¯ ȣĪ ¸ñ·Ï send void SendHaveTitle ( unsigned long titleIdx ); /// º¸À¯ ȣĪ send void ClearHaveTitleList ( ); /// º¸À¯ ȣĪ ¸ñ·Ï ÃʱâÈ­ bool AddHaveTitle ( unsigned long titleIdx ); /// º¸À¯ ȣĪ Ãß°¡ bool IsHaveTitle( unsigned long titleIdx ); bool InitTitle ( ); bool ChangeTitle ( unsigned long titleIdx ); /// ÇöÀç ȣĪÀ¸·Î ¼³Á¤ unsigned long GetTitleIndex ( ) { return mPlayerExrInfo.mTitleIndex; } unsigned long GetTitleInfIdx ( ) { return mTitleUniqIndex; } public: void SetPartyIndex ( unsigned long idx ); unsigned long GetPartyIndex ( ) { return mPlayerExrInfo.mPartyIndex; } void GetPartyUserData ( sPartyUserData* data ); void SendPartyDiceStart ( ); void SendPartyAddoneSyn ( sPartyUserData* userData ); void SendPartyOutSyn ( unsigned long playerIdx ); void SendPartyThrowSyn ( unsigned long playerIdx ); void SendPartyLeaderSyn ( unsigned long leaderIdx ); void SendPartyDivideType ( char type ); void SendPartyDataSyn ( unsigned long connectionIdx ); void SendPartyDataLevelSyn ( unsigned long connectionIdx ); void SendPartyDataLevelSyn ( unsigned long playerIdx, unsigned char level ); void SendPartyMapchangeSyn ( unsigned long connectionIdx ); void SendPartyMapchangeSyn ( unsigned long playerIdx, short map, short room, DWORD channelnum ); void SendPartyDeleteSyn ( ); public: void SetPartyUnionIndex ( unsigned long idx ); unsigned long GetPartyUnionIndex ( ) {return mPlayerExrInfo.mPartyUnionIndex; } public: void SetGuildAddReq ( bool set ) { mIsGuildAddReq = set; } bool IsGuildAddReq ( ) { return mIsGuildAddReq; } /// ±æµå ÃÊ´ëÇϰí ÀÖ´ÂÁö ¿©ºÎ bool ChangeGuild ( unsigned long guildIndex, char position ); void ChangeGuildPosition ( char position ); void ChangeGuildMarkRegistDate ( ); unsigned long GetGuildIndex() { return mPlayerExrInfo.mGuildIndex; } unsigned char GetGuildPosition() { return mPlayerExrInfo.mGuildPosition; } // void SendGuildConnectSyn ( unsigned long characterIdx, BYTE connect, DWORD channelNum ); void GetGuildUserData ( sGuildConnect* data ); private: /// ¿É¼Ç °ª sGameOption mOptionData1; public: void SetOptionData ( long option ) { mOptionData1.optionData1 = option; } sGameOption* GetOptionData ( ) { return &mOptionData1; } private: /// NPC Á¡Áý ÀÌ¿ë TIMESTAMP_STRUCT mFortuneThru[5]; public: TIMESTAMP_STRUCT* GetFortuneThru( int i ); bool SaveFortuneData( ULONG_PTR socketContext ); bool SendInitTodayWord( ); bool ChangeTodayWord( ULONG_PTR socketContext, wchar_t* word, unsigned long color ); public: // PC ¹æ ºô¸µ ¸Þ¼Òµå Á¤ÀÇ void Pg_Game_Start ( char* User_Status, char* Bill_Method, char* Bill_Expire, long Bill_Remain ); void Pg_User_Alert ( long Packet_Result, char* Bill_Method, long Bill_Remain ); void Pg_Billing_Auth ( char* User_Status, char* Bill_Method, char* Bill_Expire, long Bill_Remain ); void Pg_Client_Move ( char* User_Status ); void Pg_Close ( ); /// ÆäÀÌ·¹ÅÍ ºô¸µ void BP_Start(); void BP_End(); void BP_ItemGive(); public: // GM À̺¥Æ® ¸Þ¼Òµå Á¤ÀÇ void AddAllGMEvent ( ); void AddGMEvent ( sGMEventInfo eventInfo ); void DelGMEvent ( unsigned long DBIndex, unsigned long influenceIdx ); public: // ºí·Ï °ü·Ã º¯¼ö Á¤ÀÇ bool mBlockApply; time_t mBlockValidThru; public: // ºí·Ï °ü·Ã ¸Þ¼Òµå Á¤ÀÇ bool IsBlock ( ); bool SetBlock ( bool apply, unsigned long second ); public: // ij¸¯ÅͰ¡ °¡Áö°í ÀÖ´Â buff/debuff ¸ñ·Ï üũ bool IsHaveApplyBuffType( unsigned short applyValueType ); bool IsHaveApplyDeBuffType( unsigned short applyValueType ); public: // ij¸¯ÅÍ À̺¥Æ® °ü·Ã ¸Þ¼Òµå. bool PostCharacterEvent ( char category, LPCTSTR format, ... ); }; inline void cPlayer::SetName( wchar_t* name ) { ::wcsncpy( mPlayerInfo.strName, name, MAX_NAME_SIZE ); mPlayerInfo.strName[MAX_NAME_SIZE] = 0; } inline void cPlayer::SetRace( char race ) { mPlayerInfo.Race = race; } inline void cPlayer::SetGender( char gender ) { mPlayerInfo.Gender = gender; } inline void cPlayer::SetStaticFaceIndex( unsigned long faceIdx ) { mPlayerInfo.HeadInfo[eHEAD_FACE_STATIC] = faceIdx; } inline void cPlayer::SetRangeTarget( float tPosX, float tPosY, sObject& tInfo, float range ) { mRange = range; mRangeTargetPos = NiPoint2(tPosX, tPosY); mRangeTarget = tInfo; } inline bool cPlayer::MonsterImportancePlus( unsigned char importance ) { if( mMonsterImportance + importance > 100 ) { //printf("\n 100 < importancePlus [%d]\n", mMonsterImportance + importance ); return false; } //printf("\n mMonsterImportance[%d] + ", mMonsterImportance ); mMonsterImportance = mMonsterImportance + importance; //printf("importance[%d] = MonsterImportancePlus[%d] \n", importance, mMonsterImportance ); return true; } inline void cPlayer::MonsterImportanceMinus( unsigned char importance ) { if( mMonsterImportance - importance < 0 ) { //printf("\n 0 > importancePlus [%d]\n", mMonsterImportance - importance ); mMonsterImportance = 0; return; } //printf("\n mMonsterImportance[%d] - ", mMonsterImportance ); mMonsterImportance = mMonsterImportance - importance; //printf("importance[%d] = MonsterImportancePlus[%d] \n", importance, mMonsterImportance); } inline void cPlayer::ApplyMapTargetPos( ) { mMapNumber = mMapTargetPos.mMapNumber; mGotoX = mObjectPos.x = mMapTargetPos.mPosX; mGotoY = mObjectPos.y = mMapTargetPos.mPosY; mDirection = mMapTargetPos.mRotAngle; } inline bool cPlayer::IsInventory(TB_INVENTORY* inventory) { if ( inventory != NULL ) return ((inventory->idx > 0) && (inventory->count > 0)); return false; } inline bool cPlayer::IsInventoryRange(unsigned short number) { if( number <= MAX_VALID_INVENTORY ) { if( number > mHeroInfo.WearEnd && number <= INVENTORY_WEAR_END ) return false; if( number > mHeroInfo.BagEnd && number <= INVENTORY_BAG_END ) return false; if( number > mHeroInfo.WareHouseEnd && number <= INVENTORY_WAREHOUSE_END ) return false; return true; } return false; } inline bool cPlayer::IsInventoryBag(unsigned short number) { return !(number < INVENTORY_BAG_BEGIN || number > mHeroInfo.BagEnd); } inline bool cPlayer::IsInventoryEquip(unsigned short number) { if( number <= INVENTORY_EQUIP_END) { if( number > mHeroInfo.WearEnd && number <= INVENTORY_WEAR_END ) return false; return true; } return false; } inline bool cPlayer::IsInventoryQuest(unsigned short number) { return !(number < INVENTORY_QUEST_BEGIN || number > INVENTORY_QUEST_END); } inline bool cPlayer::IsInventoryWarehouse(unsigned short number) { return !(number < INVENTORY_WAREHOUSE_BEGIN || number > mHeroInfo.WareHouseEnd); } inline bool cPlayer::IsInventoryCollect(unsigned short number) { return !(number < INVENTORY_COLLECTION_BEGIN || number > INVENTORY_COLLECTION_END); } inline bool cPlayer::IsInventoryCash(unsigned short number) { return !(number < INVENTORY_CASH_ITEM_BEGIN || number > INVENTORY_CASH_ITEM_END); } inline TB_INVENTORY* cPlayer::SelectInventory(short number) { return (number < MIN_INVENTORY || number > MAX_INVENTORY) ? (NULL) : (mInventory + number); } inline TIMESTAMP_STRUCT* cPlayer::GetFortuneThru( int i ) { return ( i >= 0 && i < 5 ) ? mFortuneThru + i : NULL; } /// ¹è¿­ À妽º·Î °¡Á®¿À±â inline TB_QUEST_PROGRESS* cPlayer::GetQuest( int number ) { return (number < 0 || number > MAX_KEEPQUEST ) ? (NULL) : (mQuest + number); } inline void cPlayer::ClearQuestList() { memset( mQuest, 0, sizeof(mQuest) ); } inline void cPlayer::ClearCompleteList() { mCompleteQuestSet.Clear(); mCompleteGroupQuestSet.Clear(); } inline void cPlayer::ClearValidQuestList() { mValidQuestMap.Clear(); mValidGroupQuestSet.Clear(); } /// ġƮ inline bool cPlayer::GetCheatHideMode() const { return mCheatHideMode; } inline void cPlayer::SetCheatUndeadMode( bool mode ) { mCheatUndeadMode = mode; } //inline //void cPlayer::SetCheatWatch( bool mode ) //{ // mCheatWatch = mode; //}