#ifndef _CCHARACTER_H_ #define _CCHARACTER_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "CharacterClass.h" #include #include #include #include // Àü¹æ ÂüÁ¶ class CChatPacket; class CGameClientDispatch; struct GiveItemInfo; namespace Broadcast2nd { class CSerializeCharacterData; }; namespace Item { class CItem; class CEquipment; class CUseItem; struct ItemPos; }; namespace BattleInclination { void SetCharData(CCreature& creature, BattleInclination::CharData& charData, bool bSetRideArmsInfo = false); void SetRelationData(CCreature& ownerCreature, CCreature& targetCreature, BattleInclination::RelationData& relationData); }; namespace RealmSkill { void RealmInchantAdd(CCharacter* lpCharacter); void RealmInchantRemove(CCharacter* lpCharacter); }; class CCharacter : public CAggresiveCreature { public: // DBÁß°è¿¡¼­ Å×À̺í·Î Àо TempInvenÀ¸·Î ÁÖ¾îÁø ¾ÆÀÌÅÛÀÇ CreationID¸¦ ÀúÀåÇÑ´Ù. typedef std::vector GivenItemList; enum Const { LOGOUT_PULSE = 5, LOGOUT_COUNT = 5, DBUPDATE_PULSE = 10, DBUPDATE_COUNT = 180, BATTLE_GROUND_PULSE = 600, RESPAWN_PULSE = 100, // 10 ÃÊ MELEE_ATTACK_RANGE = 10, // ij¸¯ÅÍÀÇ ±ÙÁ¢ °ø°Ý Á¦ÇÑ °Å¸® RANGE_ATTACK_RANGE = 50 // ij¸¯ÅÍÀÇ ¿ø°Å¸® °ø°Ý Á¦ÇÑ °Å¸® }; enum OperationFlag { CHAR_INFO_LOADED = ( 1 << 0), CHAR_ZONE_MOVED = ( 1 << 1), MOVEZONE_PROCESSED = ( 1 << 2), SERVERZONE_PROCESSED = ( 1 << 3) }; enum DURABILITY_DECRESE_PERCENTAGE { // edith ¾ÆÀÌÅÛÀÇ ³»±¸µµ ·£´ý°ª WEAPON_DURABILITY_DECRESE_PERCENTAGE = 100, // 200 ARMOUR_DURABILITY_DECRESE_PERCENTAGE = 25, // 50 SHIELD_DURABILITY_DECRESE_PERCENTAGE = 10, // 20 STARTAXDURABILITY = 10, // ÃÖ´ë ³»±¸µµ °¨¼ÒÆø ½ÃÀÛ°ª DOWNMAXDURABILITY = 10 // ÃÖ´ë ³»±¸µµ °¨¼ÒÆø }; enum DURABILITY_DECRESE_PERSENT { DURABILITY_DECREASE_PERSENT_BY_MONSTER = 20, DURABILITY_DECREASE_PERSENT_BY_SUICIDE = 3 }; enum LAST_DEAD_TYPE { DEAD_BY_NONE, DEAD_BY_SUICIDE, DEAD_BY_MONSTER, DEAD_BY_CHARACTER }; enum RESPAWN_HP_MP_RECOVERY_PERCENTAGE { TOWN_RECOVERY_PERCENTAGE = 25, FORTRESS_RECOVERY_PERCENTAGE = 50, RESURRECTION_RECOVERY_PERCENTAGE = 75 }; bool Initialize(CGameClientDispatch* lpGameClientDispatch); // ÃʱâÈ­ // -------------------------------------------------------------------------------------------- // ij¸¯ÅÍ ·Î±×Àνà ó¸®µÉ ºÎºÐµé -------------------------------------------------------------- void PrepareLogin(void); bool Login(void); // ij¸¯ÅÍ Á¤º¸°¡ ij¸¯ÅÍ Å×ÀÌºí¿¡ ·ÎµåµÊ(·Î±×ÀÎÇÔ) bool IsLogined(void) { return IsOperationFlagSet(CHAR_INFO_LOADED); } // -------------------------------------------------------------------------------------------- // ij¸¯ÅÍ ·Î±×¾Æ¿ô½Ã ó¸®µÉ ºÎºÐµé ------------------------------------------------------------ inline void ResetLogoutCount(void) { m_nLogoutCount = LOGOUT_COUNT; } inline bool StillAlive(void) { return --m_nLogoutCount >= 0; } inline void SetDBUpdateCount(LONG nDBUpdateCount) { m_nDBUpdateCount = nDBUpdateCount; } // ij¸¯Å͸¦ ¸Ê¿¡¼­ ·Î±×¾Æ¿ô½Ã۰í, µ¥ÀÌÅ͸¦ DB·Î º¸³½´Ù. bool Logout(DBUpdateData::UpdateType eUpdateType = DBUpdateData::LOGOUT); // -------------------------------------------------------------------------------------------- // ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® - CharacterDataUpdate.cpp ------------------------------------------- bool GetCharacterInfo(char* pBuffer, int* nBufferSize_InOut, unsigned short* lpUpdateLen); bool SetCharacterInfo(char* pBuffer, unsigned short usUpdateLen[DBUpdateData::MAX_UPDATE_DB]); bool DBUpdate(DBUpdateData::UpdateType eUpdateType); bool DBUpdateForce(DBUpdateData::UpdateType eUpdateType) { m_nDBUpdateCount = -1; return DBUpdate(DBUpdateData::UPDATE); } bool MoveZoneProcess(unsigned long dwServerID); bool ItemDump(char* pBuffer, int* nBufferSize_InOut) const; // -------------------------------------------------------------------------------------------- // ¾ÆÀÌÅÛ, µ· À̵¿ ¹× »ç¿ë °ü·Ã ¸Þ¼Òµå - CharacterItem.cpp ------------------------------------ inline unsigned long GetGold(void) const { return m_DBData.m_Info.Gold; } unsigned long GetGold(unsigned char cPos); bool AddGold(unsigned long dwGold, bool bNotice); bool DeductGold(unsigned long dwGold, bool bNotice); bool MoveGold(unsigned long dwGold, unsigned char cSrcPos, unsigned char cDstPos, unsigned short& usError); // µ· ¿Å±â±â bool DeductMileage(unsigned long dwMileage, bool bNotice); bool MoveItem(const TakeType takeType, bool bChk = true); // ¾ÆÀÌÅÛ À̵¿ ¹× ½ºÅà bool SwapItem(const TakeType SrcType, const TakeType DstType); // ¾ÆÀÌÅÛ À§Ä¡ ½º¿Ò Item::CItem* SplitItem(const TakeType takeType); // ¾ÆÀÌÅÛ °³¼ö ³ª´©±â bool Pickup(Item::CItem* lpItem, Item::ItemPos dstPos); // ¾ÆÀÌÅÛ Áý±â Item::CItem* Drop(Item::ItemPos SrcPos, unsigned char cNum); // ¾ÆÀÌÅÛ ¹ö¸®±â // ¾ÆÀÌÅÛÀ» Àκ¥Å丮¿¡ ³Ö¾îÁØ´Ù. (ÀÚ¸®°¡ ¾øÀ¸¸é Àӽà Àκ¥Å丮¿¡ ³Ö´Â´Ù.) bool GiveItem(Item::CItem* lpItem); bool TestItem(Item::CItem* lpItem); // ¾ÆÀÌÅÛÀ» ³ÖÀ» ¼ö ÀÖ´ÂÁö üũÇÑ´Ù. bool UseLottery(unsigned short usItemID); bool UseCashItem(unsigned long dwSender, unsigned long dwReceiver, Item::ItemPos itemPos, unsigned short wCashType, unsigned short& wError); bool UseStartKit(unsigned short wObjectType, unsigned short& wError); bool CheckItemRuneSkill(Item::ItemPos SrcPos, Item::ItemPos DstPos, bool bChk); // ¾ÆÀÌÅÛ À̵¿½Ã ·é ¼Ó¼º üũ const Broadcast2nd::CNetworkEquipGrade GetNetworkEquipGrade(void); // ÀÌÆåÆ®¸¦ À§ÇÑ Àåºñ ±×·¹À̵å Á¤º¸ // -------------------------------------------------------------------------------------------- // ij¸¯ÅÍ Àκ¥Å丮 °ü·Ã(¾ÆÀÌÅÛ Get, Set, Reset) - CharacterInventoryItem.cpp ------------------ public: Item::CItem* GetItem(Item::ItemPos SrcPos); bool SetItem(Item::ItemPos SrcPos, Item::CItem* lpItemBase); bool RemoveItem(Item::ItemPos SrcPos); // -------------------------------------------------------------------------------------------- // ¾ÆÀÌÅÛ ÆÈ°í »ç°í ¼ö¸®ÇÏ´Â ¸Þ¼­µå - CharacterTradeItem.cpp ---------------------------------- unsigned long RepairItem(const unsigned long dwNPCID, Item::ItemPos itemPos, unsigned short& wError); unsigned long RepairAllItem(const unsigned long dwNPCID, unsigned short& wError); Item::CItem* SellToCharacter(CCharacter *lpCustomer, unsigned short wKindItem, TakeType takeType, Item::CItem* lpRequestItem, unsigned long &dwPrice, unsigned short wCouponID, unsigned short &usError); // -------------------------------------------------------------------------------------------- // ½ºÅ×ÀÌÅͽº °ü·Ã ¸Þ¼Òµå - CharacterStatus.cpp ----------------------------------------------- // ´É·ÂÄ¡ ¹× ½ºÅ×ÀÌÅͽº µ¥ÀÌÅ͸¦ DBData¿¡¼­ Àо Àç°è»ê. HP, MP°¡ FullÀÌ µÈ´Ù. bool CalculateStatusData(bool bFullHPandMP); bool CalculateAbility(const SKILL& skill); // ¾îºô¸®Æ¼ÀÇ Á¤º¸¸¦ °»½ÅÇÑ´Ù. bool ChangeClass(unsigned char cClassType); // CClass ÂüÁ¶ bool IncrementExp(unsigned long dwExp); // ·¹º§¾÷ »óȲÀÌ µÇ¸é ·¹º§¾÷ÇÑ´Ù. bool GetHuntingExp(CAggresiveCreature* lpDeadCreature, unsigned long dwExp, unsigned char cMemberNum); unsigned short AddState(unsigned char Type_In, ChState& ChState_Out); bool StateRedistribution(ChState& State); // ½ºÅÈÀ» ÇØ´ç Ŭ·¡½ºÀÇ Ã³À½ »óÅ·Πµ¹¸®´Â ÇÔ¼ö bool StatusRetrain(ChState& State, Item::ItemPos InvenPos); // ½ºÅÈÀ» ÀÏÁ¤·® µ¹·Á¹Þ´Â 󸮸¦ ÇÏ´Â ÇÔ¼ö (¸Á°¢ÀÇ µ¹ »ç¿ë) bool ChangeWeaponAndShield(unsigned char cSelect); // ¹«±â ¹Ù²Ù±â bool ChangeRide(unsigned char cSelect); // ¸» Ÿ±â ³»¸®±â bool CalculateEquipDurability(unsigned short wAttackType); unsigned char GetCurrentDurability(unsigned char cEquipmentIndex); bool CalculateAllEquipDurability(unsigned char cDecreasePersent); // HP¿Í MP¸¦ RegenÇÑ´Ù. Ãß°¡ °ªÀÌ 0ÀÎ °æ¿ì´Â ±âº» °ªÀ¸·Î RegenÇÑ´Ù. virtual bool RegenHPAndMP(unsigned short usAdditionalHP, unsigned short usAdditionalMP, bool bAddDefaultRegenValue); // Admin ¸í·ÉÀ¸·Î ·¹º§À» ´Ù¿î ½Ãų¶§ »ç¿ëÇÏ´Â ÇÔ¼ö (·¹º§ 1ÀÇ Ãʱâ Ŭ·¡½º·Î ¸¸µé¾î ¹ö¸°´Ù.) bool InitLevel1Char(unsigned char cClassType); bool CheckRenameWarrant(Item::ItemPos InvenPos, bool bItemAccept); // -------------------------------------------------------------------------------------------- // ÀüÅõ °ü·Ã ¸Þ¼Òµå - CharacterFight.cpp ------------------------------------------------------ virtual const int CalculateFixLevelGap(CAggresiveCreature *pDefender); void Casting(AtType attackType, AtNode& attackNode); bool AttackCID(AtType attackType, AtNode& attackNode, unsigned short& wError); bool Attack(AtType attackType, unsigned char cDefenderNum, CAggresiveCreature** pDefenders, unsigned char* cDefenserJudges, unsigned short* wDefenderMPHeal); bool AttackUsingBow(unsigned short wType); bool UseAmmo(Item::CUseItem* pUseItem); virtual bool Dead(CAggresiveCreature* pOffencer); bool Respawn(unsigned char cType = 0, const Position& Pos = Position::Position()); bool AutoRespawn(void); // ¹èƲ ±×¶ó¿îµå¿¡¼­ ÃÊ·¾ Á¸ÀÇ À§Ä¡·Î ÀÚµ¿ ¸®½ºÆù bool IsPeaceMode(void); EnemyCheck::EnemyType IsEnemy(CCreature* lpTarget, unsigned char* lpResult = NULL); void SendAttackedToParty(unsigned long dwAttackerID, AtType atType, unsigned short wDamage, unsigned char cDefenserJudge, unsigned short wMPHeal); char GetEliteBonus(void); char GetCaste(void); void CalculateFame(CCharacter* lpWinnerCharacter); // -------------------------------------------------------------------------------------------- // ½ºÅ³ °ü·Ã ¸Þ¼Òµå - CharacterSkill.cpp ------------------------------------------------------ unsigned short ReadSkill(SKILLSLOT SkillSlot, unsigned short wSkillID, unsigned short wSkillLockCount); bool RedistributionSkill(void); bool CalculateMaxSkillSlot(void); bool SkillCreate(Item::CUseItem* pUseItem); bool SkillErase(unsigned char Index_In, Item::ItemPos InvenPos); bool SkillLock(unsigned char Index_In); bool SkillUnLock(unsigned char Index_In, Item::ItemPos* InvenPos, bool b_SkillFifthUnlock = false); bool SkillFifthLock(unsigned short wSKilID); bool SkillFifthUnlock(unsigned short wSKilID); virtual bool HasSkill(unsigned short usSkillType, unsigned char cLockCount, unsigned char cLevel); short GetSkillLockCount(unsigned short usSkillType); short GetSkillLevel(unsigned short usSkillType); short GetSkillSlotIndex(unsigned short usSkillType); bool AddWorldWeaponEnchant(CAggresiveCreature* lpWeapon, unsigned char cNation); bool ClearWorldWeaponEnchant(void); void CheckSkillVaild(void); bool AbilityCreate(Item::CUseItem* pUseItem); bool AbilityErase(unsigned char Index_In, Item::ItemPos InvenPos); // -------------------------------------------------------------------------------------------- // Äü½½·Ô °ü·Ã ¸Þ¼Òµå - CharacterQuickSlot.cpp ------------------------------------------------ void UpdateQuickSlotSkill(SKILLSLOT Slot); bool MoveQuickSlot(const TakeType takeType, const unsigned short usSkillID, unsigned char cLockCount, unsigned char cSkillLevel); // -------------------------------------------------------------------------------------------- // ij¸¯ÅÍ ÄÁÆ®·Ñ °ü·Ã ¸Þ¼Òµå - CharacterControl.cpp ------------------------------------------- bool DropItem(unsigned short usProtoTypeID, unsigned char cNum); bool MovePos(Position Pos, char cZone, const bool bSitDown); bool MoveZone(POS NewPos, char cZone, char Channel); bool Kill(CAggresiveCreature* lpAttacker); bool NotifyInfo(unsigned long dwAdminCID); bool DuelInit(unsigned char cCmd); // ±æµåÀü, ±¹°¡Àü¿¡ ÇØ´çÇÏ´Â Á¸À¸·Î À̵¿ void MoveToGuildWarZone(); void MoveToRealmWarZone(); // -------------------------------------------------------------------------------------------- // ij¸¯ÅÍ Äù½ºÆ® °ü·Ã ¸Þ¼Òµå - CharacterQuest.cpp --------------------------------------------- bool CheckQuest(Quest::QuestNode* lpQuestNode, unsigned short& wError); bool HasQuest(unsigned short wQuestID); bool GiveQuest(Quest::QuestNode* lpQuestNode); bool StartPhase(unsigned short wQuestID, unsigned char cPhase); bool CancelQuest(unsigned short wQuestID, bool bFinished = false); void CheckTrigger(unsigned char cTriggerKind, unsigned long dwReferenceID, Position Pos, short wCount); unsigned short OperateTrigger(unsigned short wQuestID, unsigned char cPhase, unsigned char cTrigger, unsigned char cCount, Position Pos, unsigned char cType = 0); void PendingQuest(Quest::TriggerMsg* pTriggerMsg); //---------------------------------------------------------------------------------------------- // Ä£±¸ Á¤º¸ ¾÷µ¥ÀÌÆ® void FriendInfoUpdate(unsigned long dwUID, unsigned long dwCID, unsigned long dwGID, unsigned short wClass, char cLevel, unsigned long dwServerID); private: Quest::ErrorCode ExecuteEvent(Quest::ExecutingQuest executingQuest, const Quest::TriggerNode* triggerNode, Position Pos); void EventEnd(unsigned short wQuestID, bool bSave); void EventAward(unsigned long dwExp, unsigned long dwGold, unsigned long dwFame, unsigned long dwMileage); public: // ½ºÅ³ °ü·Ã // void SkillClear(); bool ClearGarbage(vector& vecItemGarbage, unsigned char cCmd); bool HasExecutingQuest(unsigned short wQuestID); bool HasHistoryQuest(unsigned short wQuestID); bool InsertHistoryQuest(unsigned short wQuestID); bool DeleteHistoryQuest(unsigned short wQuestID); virtual void CalculateStatusByQuest(void); // -------------------------------------------------------------------------------------------- // ¼¼¼Ç °ü·Ã ¸Þ¼Òµå ------------------------------------------------------------------------- CGameClientDispatch* GetDispatcher(void) { return m_lpGameClientDispatch; } void SetDispatcher(CGameClientDispatch* lpGameClientDispatch); // -------------------------------------------------------------------------------------------- // ±âŸ ¸Þ¼Òµå ------------------------------------------------------------------------------- bool GetCharacterView(CHAR_VIEW& charView); // TODO : AggresiveCreature·Î ¿Ã¸®°í GetNameÀ¸·Î ¼öÁ¤ÇսôÙ. (Creature·Î ¿Ã·Áµµ ÁÁ°í...) const char* GetCharacterName() const { return m_DBData.m_Info.Name; } void SetCharacterName(const char* szName) { strncpy(m_DBData.m_Info.Name, szName, CHAR_INFOST::MAX_NAME_LEN); m_DBData.m_Info.Name[CHAR_INFOST::MAX_NAME_LEN - 1] = 0; } const char* GetAccountName() const { return m_szAccountName; } void SetAccountName(const char* szAccountName) { strncpy(m_szAccountName, szAccountName, CHAR_INFOST::MAX_ACCOUNT_LEN); m_szAccountName[CHAR_INFOST::MAX_ACCOUNT_LEN - 1] = 0; } bool BindPositionToNPC(const unsigned long dwNPCID); // ¸®½ºÆù À§Ä¡¸¦ NPCÀ§Ä¡¿¡ ¹ÙÀεù bool ControlOption(const RejectOption Reject, bool bLogin); // °¢Á¾ ¿É¼Ç Á¶Á¤ void UpgradeRespawnSpeedByEmblem(unsigned char cUpgradeType, unsigned char cUpgradeStep); void DegradeRespawnSpeedByEmblem(); virtual unsigned long GetUID(void) const { return m_dwUID; } char GetConsumeMPCount(void) { return m_cConsumeMPCount; } unsigned short GetClass(void) { return m_DBData.m_Info.Class; } unsigned char GetLevel(void) { return m_DBData.m_Info.Level; } CClass::RaceType GetRace(void) { return static_cast(m_DBData.m_Info.Race); } unsigned char GetNation(void) const; // WORK_LIST 2.4 °èÁ¤ ±¹ÀûÀ» °ÔÀÓ¼­¹öÀÇ Ä³¸¯ÅͰ¡ °¡Áöµµ·Ï ±¸Çö void SetNation(unsigned char cNation) { m_cAccountNation = cNation; } unsigned long GetPID(void) const { return m_DBData.m_Info.PID; } void SetPID(unsigned long dwPID); unsigned long GetGID(void) const { return m_DBData.m_Info.GID; } void SetGID(unsigned long dwGID); unsigned char GetHair(void) { return m_DBData.m_Info.Hair; } unsigned char GetFace(void) { return m_DBData.m_Info.Face; } unsigned char GetSex(void) { return m_DBData.m_Info.Sex; } // 0 : ³²ÀÚ, 1 : ¿©ÀÚ unsigned char GetHand(void) { return m_cHandPos; } unsigned char GetRide(void) { return m_cRidePos; } ChState GetState(void); const SKILL& GetSkill(void) { return m_DBData.m_Skill; } const unsigned long GetFame(void) { return m_DBData.m_Info.Fame; } void SetFame(unsigned long dwFame); const unsigned long GetMileage(void) { return m_DBData.m_Info.Mileage; } void SetMileage(unsigned long dwMileage) { m_DBData.m_Info.Mileage = dwMileage; } bool IsAdmin(void) const { return (0 < m_DBData.m_cAdminLevel); } unsigned char GetAdminLevel() const { return m_DBData.m_cAdminLevel; } void SetAdminLevel(unsigned char cAdminLevel) { m_DBData.m_cAdminLevel = cAdminLevel; } bool IsRideArms(void) const { return (0 != m_dwRideArmsCID); } unsigned long GetRideArmsCID(void) const { return m_dwRideArmsCID; } void Ride(unsigned long dwArmsID) { m_dwRideArmsCID = dwArmsID; } void GetOff(void) { m_dwRideArmsCID = 0; } void SetProtectGateCID(unsigned long dwCID) { m_dwProtectGateCID = dwCID; } const RejectOption& GetRejectOption(void) { return m_RejectOption; } CAggresiveCreature* GetDuelOpponent(void) { return m_FightInfo.m_pDuelOpponent; } bool SetDuelOpponent(CCharacter* pCharacter); CMonster* GetSummonee(void) { return m_lpSummonee; } void SetSummonee(CMonster* lpSummonee) { m_lpSummonee = lpSummonee; } bool CanShout(void) const; void Shouted(void); unsigned long GetLastTime() const { return m_dwLastTime; } CFriendList& GetFriendList(void) { return m_friendList; } CBanList& GetBanList(void) { return m_banList; } inline void SaveToDBData(); inline Item::CItemContainer* GetItemContainer(unsigned char cPos); Item::CInventoryContainer& GetInventory(void) { return m_Inventory; } Item::CEquipmentsContainer& GetEquipments(void) { return m_Equipments; } Item::CListContainer& GetExtra(void) { return m_ExtraSpace; } Item::CExchangeContainer& GetExchange(void) { return m_Exchange; } Item::CDepositContainer& GetDeposit(void) { return m_Deposit; } Item::CCharacterShopContainer& GetStall(void) { return m_Stall; } Item::CTempInvenContainer& GetTempInven(void) { return m_TempInven; } // DBÁß°è¼­¹öÀÇ ¿äûÀ¸·Î ¾ÆÀÌÅÛÀ» ÀÓ½ÃÀκ¥¿¡ ³Ö¾îÁØ´Ù. bool GiveItemByDBAgentRequest(GiveItemInfo& giveItemInfo); inline unsigned short* GetHistoryQuest(void) { return m_wHistoryQuest; } inline Quest::ExecutingQuest* GetExecutingQuest(void) { return m_ExecutingQuest; } const FightStatus& GetEtcTypeStatus(Creature::StatusType eType) { return m_EtcTypeStatus[eType]; } Broadcast2nd::CSerializeCharacterData& GetSerializeData(void) { return m_SerializeCharacterData; } friend class Skill::CFunctions; void SetOperationFlag(OperationFlag eOperationFlag) { m_cOperationFlags |= eOperationFlag; } void ResetOperationFlag(OperationFlag eOperationFlag) { m_cOperationFlags &= ~eOperationFlag; } bool IsOperationFlagSet(OperationFlag eOperationFlag) { return 0 != (m_cOperationFlags & eOperationFlag); } unsigned long GetLastMoveUpdateTime(void) const { return m_dwLastUpdateExTime; } void SetLastMoveUpdateTime(unsigned long dwLastUpdateTime) { m_dwLastUpdateExTime = dwLastUpdateTime; } unsigned char GetMoveUpdateCount(void) const { return m_cMoveUpdateExCount; } void IncrementMoveUpdateCount(void) { ++m_cMoveUpdateExCount; } bool IsChatBan(void) const { return m_bChatBan; } void SetChatBan(bool bBan) { m_bChatBan = bBan; } void SetGMModelFlag(unsigned char cGMModelFlag) { m_cGMModelFlag = cGMModelFlag; } unsigned char GetGMModelFlag() { return m_cGMModelFlag; } unsigned char GetNameChangeCount() const { return m_cNameChangeCount; } void SetNameChangeCount(unsigned char cNameChangeCount) { m_cNameChangeCount = cNameChangeCount; } unsigned char GetRealmWarFlag() const { return m_cRealmWarFlag; } unsigned char GetGuildWarFlag() const { return m_cGuildWarFlag; } void SetRealmWarFlag(unsigned char cFlag) { m_cRealmWarFlag = cFlag; } void SetGuildWarFlag(unsigned char cFlag); unsigned char GetTacticsFlag() const { return m_cTactics; } void SetTacticsFlag(unsigned char cTactics) { m_cTactics = cTactics; } // ±¹°¡ ÀüÀï °øÇåÈÆÀå Æ÷ÀÎÆ®. virtual unsigned char GetRealmPoint() { return m_cRealmPoint; } void SetRealmPoint(unsigned char cRealmPoint) { m_cRealmPoint = cRealmPoint; } int GetMagicChancePoint() { // ¸ÅÂù Æ÷ÀÎÆ® °è»óÇϴ°÷ int iMCPoint = 0; // edtih 2009.06.20 ·é¿¡ÀÇÇÑ ¸ÅÁ÷Âù½º°ª Ãß°¡ iMCPoint = (int)m_EquipStatus.m_fLuckResistRate; // if(GetRealmPoint() > 0) // iMCPoint = GetRealmPoint()*5; // ·¤¸§Æ÷ÀÎÆ®´Â 1°³´ç 5ÆÛ¼¾Æ®¾¿ // ¸ÅÂù¿¡ ½ºÆ¿Çڵ尡 ¹ÌÄ¡´Â ¿µÇâ. if(GetEnchantInfo().GetFlag(Skill::SpellID::StealHand)) { // 3-0ºÎÅÍ 1·¡º§´ç 1ÆÛ¼¾Æ®¾¿ ¸ÅÂù±â´É Ãß°¡ int iLevel = GetEnchantLevel(Skill::SpellID::StealHand)-12; if(iLevel > 0) iMCPoint += iLevel; } return iMCPoint; } void SetPlayTime(unsigned int dwPlayTime) { m_StartTime = CTime::GetCurrentTime(); m_dwPlayTime = dwPlayTime; } unsigned int GetPlayTime() { return m_dwPlayTime; } void SetPremiumService(long lPremiumTime, int iPremiumType) { // ÇÁ¸®¹Ì¾ö ŸÀÓ ³²Àº ½Ã°£ m_StartPremiumTime = CTime::GetCurrentTime(); m_lPremiumTime = lPremiumTime; m_iPremiumType = iPremiumType; } long GetPremiumTime() { return m_lPremiumTime; } int GetPremiumType() { return m_iPremiumType; } float GetPremiumPt() { if(m_iPremiumType == 1) return 0.5f; else if(m_iPremiumType == 2) return 0.3f; return 0.0f; } bool CheckPremiumTime() { if(m_lPremiumTime == 0) return false; CTime nowTime = CTime::GetCurrentTime(); CTimeSpan tm(m_StartPremiumTime.GetDay(), m_StartPremiumTime.GetHour(), m_StartPremiumTime.GetMinute(), m_StartPremiumTime.GetSecond()); CTime tmPrev = nowTime-tm; int iTime = (tmPrev.GetHour()*60)+tmPrev.GetMinute(); // iTime = m_lPremiumTime-iTime; if(iTime <= 0) { m_iPremiumType = 0; m_lPremiumTime = 0; return false; } return true; } float GetAwardPer() { float fEventAdd = 0.0f; if (CGameTimeMgr::GetInstance().GetCurrentEventTime() == GameTime::EVENT_All20) fEventAdd = 0.2f; else if (CGameTimeMgr::GetInstance().GetCurrentEventTime() == GameTime::EVENT_All50) fEventAdd = 0.5f; if(GameRYL::CHINA != CServerSetup::GetInstance().GetNationType()) return 1.0f+fEventAdd; if(m_dwPlayTime == 0) return 1.0f+fEventAdd; CTime nowTime = CTime::GetCurrentTime(); CTimeSpan tm(m_StartTime.GetDay(), m_StartTime.GetHour(), m_StartTime.GetMinute(), m_StartTime.GetSecond()); CTime tmPrev = nowTime-tm; int iTime = (tmPrev.GetHour()*60)+tmPrev.GetMinute(); iTime += m_dwPlayTime; /* // Å×½ºÆ®¸¦ À§ÇØ Ç÷¹ÀÌŸÀ½À» ¾à°£ ¹Ù²ãÁØ´Ù. if(iTime <= 2) { return 1.0f; } else if(2 < iTime && iTime <= 4) { return 0.5f; } */ if(iTime <= 180) { return 1.0f; } else if(180 < iTime && iTime <= 300) { return 0.5f; } return 0.0f; } // ±³È¯ °ü·Ã ¸Þ¼Òµå. unsigned long GetExchangeID() const { return m_dwExchangeID; } void SetExchangeID(unsigned long dwExchangeID) { m_dwExchangeID = dwExchangeID; } SPELL GetSpell() { return m_DBData.m_Spell; } void SetSpell(SPELL spell) { m_DBData.m_Spell = spell; } void SaveSpell(BOOL bDead = FALSE); // ±æµå °ü·Ã ¸Þ¼Òµå void SetGuildSafe(char cGuildSafe) { m_cGuildSafe = cGuildSafe; } char GetGuildSafe() { return m_cGuildSafe; } void SetDead(BOOL bDead) { m_bDead = bDead; } BOOL IsDead() { return m_bDead; } void SetRealmWarBuffer(BOOL bEnable) { m_bRealmWarBuffer = bEnable; } BOOL IsRealmWarBuffer() { return m_bRealmWarBuffer; } // ¸®½ºÆù Ÿ¿î Á¤º¸ ¾ÆÀ̵ð void SetRespawnTownID(unsigned long dwTownID) { m_dwRespawnTownID = dwTownID; } unsigned long GetRespawnTownID() const { return m_dwRespawnTownID; } void SetAdminAbilityPoint(int point) { m_iAdminAbilityPoint = point; } int GetAbilityPoint() { return m_iAbilityPoint; } int GetUseAbilityPoint() { return m_iUseAbilityPoint; } void UpdateUseAbilityPoint(); unsigned short GetAbilityValue(int nAbilityType) { if(nAbilityType >= Skill::Type::MAX_ABILITY_TYPE ) return 0; return m_AbilityValue[nAbilityType]; } CCharacter(unsigned long dwCID, unsigned long dwSessionID); virtual ~CCharacter(); protected: enum { MAX_USING_MASTERY = 2, // µ¿½Ã¿¡ ÃÖ´ë·Î Àû¿ë °¡´ÉÇÑ ¸¶½ºÅ͸®¼ö PAD_BYTE = 3 // byte alignment ¸¦ ¸ÂÃß±â À§ÇÑ ¹è¿­ÀÇ Å©±â }; CharacterFightInfo m_FightInfo; // µà¾ó Á¤º¸ // PeaceModeInfo m_PeaceMode; // ¹ÝÀü ¸ðµå Á¤º¸ Item::CInventoryContainer m_Inventory; // Àκ¥Å丮 Item::CEquipmentsContainer m_Equipments; // Àåºñ Item::CListContainer m_ExtraSpace; // Ãß°¡ °ø°£ Item::CExchangeContainer m_Exchange; // ±³È¯Ã¢ Item::CDepositContainer m_Deposit; // â°í Item::CCharacterShopContainer m_Stall; // ³ëÁ¡»ó Item::CTempInvenContainer m_TempInven; // Àӽà Àκ¥Å丮 GivenItemList m_GivenItemList; // DBÁß°è·ÎºÎÅÍ ¹ÞÀº ¾ÆÀÌÅÛµéÀÇ CreationID CFriendList m_friendList; // Ä£±¸ ¸®½ºÆ® CBanList m_banList; // °ÅºÎ ¸®½ºÆ® unsigned short m_wHistoryQuest[Quest::MAX_HISTORY_QUEST]; // ¼öÇà ¿Ï·áÇÑ Äù½ºÆ® Quest::ExecutingQuest m_ExecutingQuest[Quest::MAX_EXECUTING_QUEST]; // ¼öÇàÁßÀÎ Äù½ºÆ® CharacterDBData m_DBData; // DB¿¡¼­ ÀÐ¾î ¿À´Â µ¥ÀÌÅÍ RejectOption m_RejectOption; // °¢Á¾ °ÅºÎ ¿É¼Ç FightStatus m_EtcTypeStatus[Creature::MAX_STATUS_TYPE]; // Ư¼öÇÑ °æ¿ì¿¡ »ç¿ëµÇ´Â ½ºÅȵé unsigned long m_dwUID; // À¯Àú ID unsigned long m_dwSessionID; // ¼¼¼Ç ID - DB¿¡ ¾÷µ¥ÀÌÆ®ÇÒ ¶§ ¾²ÀδÙ. unsigned long m_dwLastShoutTime; // ¸¶Áö¸·À¸·Î ¿ÜÄ£ ½Ã°£ unsigned long m_dwLastSendPartyAttackInfoTime; // ¸¶Áö¸·À¸·Î ÆÄƼ¿ø¿¡°Ô °ø°Ý´çÇß´Ù´Â Á¤º¸¸¦ º¸³½ ½Ã°£ int m_nLogoutCount; // ·Î±×¾Æ¿ô½Ã±îÁö ³²Àº Ä«¿îÆ® ¼ö ÀúÀå (0 ÀÌÇϰ¡ µÉ ¼ö ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã signed·Î!) int m_nDBUpdateCount; // DB Update¶§±îÁö ³²Àº Ä«¿îÆ® ¼ö ÀúÀå (0 ÀÌÇϰ¡ µÉ ¼ö ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã signed·Î!) unsigned long m_dwExchangeID; // ±³È¯ÇÒ À¯Àú ID. unsigned char m_cGMModelFlag; // GM ¸ðµ¨·Î º¯°æ üũ. CGameClientDispatch* m_lpGameClientDispatch; CMonster* m_lpSummonee; unsigned long m_dwLastUpdateExTime; // ¸¶Áö¸· À̵¿ ¾÷µ¥ÀÌÆ® ½Ã°£ unsigned long m_dwRideArmsCID; // Ÿ°í ÀÖ´Â °ø¼º°ü·Ã º´±âÀÇ CID unsigned long m_dwProtectGateCID; // ¼º¹®¸·±â¸¦ Çϰí ÀÖ´Â ¼º¹®ÀÇ CID unsigned long m_dwRespawnSpeed; // ¸®½ºÆù ¼Óµµ (pulse »ç¿ë) LAST_DEAD_TYPE m_eLastDeadType; // ¸¶Áö¸·¿¡ ¾î¶»°Ô Á×¾ú´ÂÁö üũ Broadcast2nd::CSerializeCharacterData m_SerializeCharacterData; // ij¸¯ÅÍ µ¥ÀÌÅÍ º¸°ü ¹× º¯°æµÈ µ¥ÀÌÅÍ º¸°ü char m_szAccountName[CHAR_INFOST::MAX_ACCOUNT_LEN]; char m_cUsingMastery[MAX_USING_MASTERY]; // Àû¿ëÁßÀÎ ¸¶½ºÅ͸® Á¾·ù char m_cConsumeMPCount; // MP ¼Ò¸ð±îÁö ³²Àº Ä«¿îÆ® ¼ö ÀúÀå char m_cOperationFlags; // °¢Á¾ 󸮰¡ ¿Ï·áµÇ¾ú´ÂÁö¸¦ °Ë»çÇÏ´Â ·çƾ char m_cHandPos; // HandPos char m_cRidePos; // Ride Pos char m_cMoveUpdateExCount; // À̵¿ ¾÷µ¥ÀÌÆ® Count bool m_bChatBan; // äÆÃ ±ÝÁö unsigned char m_cNameChangeCount; // À̸§ ¹Ù²Ü ¼ö Àִ ȸ¼ö unsigned char m_cGuildWarFlag; // ±æµå ÀüÀï Âü¿© Ç÷¡±× unsigned char m_cRealmWarFlag; // ±¹°¡ Àüì Âü¿© Ç÷¡±× unsigned char m_cTactics; // ¿ëº´ Ç÷¹±×. char m_cGuildSafe; // edith 2008.03.15 ±æµå ÀÔÃâ±Ý °ü·Ã Ç÷¡½º unsigned char m_cRealmPoint; // ±¹°¡ ÀüÀï °øÇåÈÆÀå Æ÷ÀÎÆ®. unsigned int m_dwPlayTime; // Áß±¹ÆÇÀ» À§ÇÑ °ÔÀÓ ¿¬¼Ó Ç÷¹À̽ð£. CTime m_StartTime; long m_lPremiumTime; // ÇÁ¸®¹Ì¾ö ¼­ºñ½º int m_iPremiumType; CTime m_StartPremiumTime; BOOL m_bDead; BOOL m_bRealmWarBuffer; unsigned long m_dwRespawnTownID; // WORK_LIST 2.4 °èÁ¤ ±¹ÀûÀ» °ÔÀÓ¼­¹öÀÇ Ä³¸¯ÅͰ¡ °¡Áöµµ·Ï ±¸Çö unsigned char m_cAccountNation; // °èÁ¤ ±¹Àû char m_bPadding[PAD_BYTE]; // 4Byte Alignment¸¦ ¸ÂÃß±â À§ÇÑ µµ±¸ // edith 2009.10.22 ¾îºô¸®Æ¼ ÀÛ¾÷Áß.. int m_iAbilityPoint; int m_iUseAbilityPoint; int m_iAdminAbilityPoint; // ¾îµå¹ÎÀÌ ÀÓ½ÃÀûÀ¸·Î ÁÖ´Â Æ÷ÀÎÆ® (±âº» 0, °ªÀº ÀúÀåµÇÁö ¾ÊÀ½) // edith 2009.11.10 ¾îºô¸®Æ¼ ´É·ÂÄ¡ Á¦¾î unsigned short m_AbilityValue[Skill::Type::MAX_ABILITY_TYPE]; }; inline void CCharacter::SaveToDBData() { m_DBData.m_Info.Exp = m_CreatureStatus.m_nExp; m_DBData.m_Info.Level = m_CreatureStatus.m_nLevel; m_DBData.m_Info.HP = m_CreatureStatus.m_nNowHP; m_DBData.m_Info.MP = m_CreatureStatus.m_nNowMP; m_DBData.m_Pos.LastPoint.fPointX = m_CurrentPos.m_fPointX; m_DBData.m_Pos.LastPoint.fPointY = m_CurrentPos.m_fPointY; m_DBData.m_Pos.LastPoint.fPointZ = m_CurrentPos.m_fPointZ; } inline Item::CItemContainer* CCharacter::GetItemContainer(unsigned char cPos) { switch(cPos) { case TakeType::TS_EQUIP: return &m_Equipments; case TakeType::TS_INVEN: return &m_Inventory; case TakeType::TS_TEMP: return &m_ExtraSpace; case TakeType::TS_EXTRA: return &m_ExtraSpace; case TakeType::TS_EXCHANGE: return &m_Exchange; case TakeType::TS_DEPOSIT: return &m_Deposit; case TakeType::TS_STALL: return &m_Stall; case TakeType::TS_TEMPINVEN: return &m_TempInven; } return NULL; } #endif