#ifndef _RYL_GAME_LIBRARY_PARTY_H_ #define _RYL_GAME_LIBRARY_PARTY_H_ #include #include #include #include #include #include #include // Àü¹æ ÂüÁ¶ class CCell; class CCharacter; class CMonster; class CPacketBuffer; struct Position; namespace Item { class CItem; }; namespace Quest { struct QuestNode; }; #define PARTYLOG(x) (void*)0 /* #define PARTYLOG(x) x */ class CParty { protected: CParty(); CParty(const PARTY& PartyInfo); CPartySpellMgr m_PartySpellMgr; PARTY_EX m_Party; public: virtual ~CParty(); // ---------------------------------------------------------------------------------------- // interface CPartySpellMgr& GetPartySpellMgr() { return m_PartySpellMgr; } unsigned long GetUID(void) { return m_Party.m_dwPartyID; } void SetUID(unsigned long dwPartyID) { m_Party.m_dwPartyID = dwPartyID; } int GetMemberNum(void) { return m_Party.m_cMemberNum; } bool IsMember(unsigned long dwMemberCID); void ChangeName(unsigned long dwCID, const char* szChangedName); virtual bool Join(unsigned long dwSenderCID, unsigned long dwReferenceID, const char* strSenderName, unsigned short wMapIndex = 0) { return false; } virtual int Leave(unsigned long dwSenderCID, unsigned long dwReferenceID = 0, unsigned short wMapIndex = 0) { return 0; } virtual bool Destory(unsigned long dwSenderCID, unsigned long dwReferenceID) { return false; } virtual bool Login(unsigned long dwSenderCID, unsigned long dwReferenceID) { return false; } virtual bool ReLogin(CCharacter* llpCharacter) { return false; } virtual int Logout(unsigned long dwSenderCID, unsigned long dwReferenceID) { return 0; } virtual void PrepareLogout(unsigned long dwMemberID) { } void SetLeader(unsigned long dwLeaderCID) { m_Party.m_dwLeaderID = dwLeaderCID; } unsigned long GetLeader(void) { return m_Party.m_dwLeaderID; } bool IsLeader(unsigned long dwLeaderCID) { return (m_Party.m_dwLeaderID == dwLeaderCID) ? true : false; } // ÆÄƼ¿ø Á¤º¸ ¾÷µ¥ÀÌÆ® // bool UpdatePartyMemberInfo(unsigned long dwCID, unsigned long dwGID, unsigned short wClass, char cLevel, bool bAutoRouting); bool UpdatePartyMemberLevel(unsigned long dwCID, char cLevel); bool UpdatePartyMemberClass(unsigned long dwCID, unsigned short wClass); bool UpdatePartyMemberGuild(unsigned long dwCID, unsigned long dwGID); bool UpdatePartyMemberServer(unsigned long dwCID, unsigned long dwServerID); bool UpdatePartyMemberAutoRouting(unsigned long dwCID, bool bAutoRouting); virtual bool TransferLeader(unsigned long dwLeaderCID) { return false; } virtual unsigned char GetLoggedMemberAverageLevel(void) { return 0; } virtual bool AdjustAutoRouting(unsigned long dwTargetID, bool bSwitch) { return false; } // ---------------------------------------------------------------------------------------- // ÆÄƼ¿ø Àüü¿¡ ¿µÇâÀ» ÁÖ´Â ¸í·É virtual void MovePos(POS NewPos, char cZone, const bool bSitDown) { } virtual void MoveZone(POS NewPos, char Zone, char Channel) { } virtual bool AutoRouting(CAggresiveCreature* lpPickkingCreature, Item::CItem* lpItem, unsigned long& dwGold) { return false; } virtual bool Attack(AtType attackType, CAggresiveCreature** pDefenders, unsigned char* cDefenserJudges, CAggresiveCreature* lpOffencer, float fDistance, unsigned char cTargetType) { return false; } // -------------------------------------------------------------------------------------- // ÀÏÁ¤ÁÖ±â·Î È£ÃâµÇ´Â ÇÔ¼ö virtual void UpdateData() { }; }; class CMonsterParty : public CParty { public: typedef std::set, boost::fast_pool_allocator > PartyTargetSet; protected: CMonster* m_pMemberPointer[PARTY::MAX_MEM]; float m_fHelpRange; // ½Î¿ì°í ÀÖ´Â ÆÄƼ¿øÀ» µµ¿ÍÁÖ·¯ °¡´Â °Å¸® PartyTargetSet m_partyTargets; // ÆÄƼ¿øÀÌ ½Î¿ì°í ÀÖ´Â »ó´ëÀÇ CID public: CMonsterParty(const PARTY& PartyInfo, unsigned short wMapIndex = 0); CMonsterParty(); virtual ~CMonsterParty(); enum Const { DEFAULT_HELP_RANGE = 36, ERROR_OF_LEVEL_GAP = 10 }; PartyTargetSet& GetPartyTargetSet(void) { return m_partyTargets; } float GetHelpRange(void) { return m_fHelpRange; } unsigned short GetAvgLevel(void); unsigned short GetHighestLevel(void); int GetMemberTypeNum(void); bool Join(unsigned long dwSenderCID, unsigned long dwReferenceID = 0, const char* strSenderName = NULL, unsigned short wMapIndex = 0); int Leave(unsigned long dwSenderCID, unsigned long dwReferenceID = 0, unsigned short wMapIndex = 0); bool Destory(unsigned long dwSenderCID, unsigned long dwReferenceID); CMonster* GetMember(unsigned int nIndex) { if (nIndex < 0 || nIndex >= PARTY::MAX_MEM) return NULL; return m_pMemberPointer[nIndex]; } // ---------------------------------------------------------------------------------------- // ÆÄƼ¿ø Àüü¿¡ ¿µÇâÀ» ÁÖ´Â ¸í·É bool Attack(AtType attackType, CAggresiveCreature** pDefenders, unsigned char* cDefenserJudges, CAggresiveCreature* lpOffencer, float fDistance, unsigned char cTargetType); }; class CCharacterParty : public CParty { protected: CCharacter* m_pMemberPointer[PARTY::MAX_MEM]; bool m_bAutoRouting[PARTY::MAX_MEM]; CCharacterParty* m_pHostileParty; CCharacter* m_pFightingMember[PARTY::MAX_MEM]; PartyMemberData m_partyMemberData[PARTY::MAX_MEM]; void SendPartyCmdInfo(PktPC::PartyCmd Command, CCharacter *lpCharacter); void SendPartyCommand(PktPC::PartyCmd Command, const char *SenderName_In, unsigned long dwSenderCID, unsigned long ReceiverCID); static void SetUpdateFlag(PartyMemberData& partyMemberData, CCharacter& character, char*& szPacket, bool bUpdateForce); public: // ÇØ¿Ü ¼­¹ö¿¡¼­ »ç¿ëÇÏ´Â »ó¼ö enum ForeignConst { ADDITIONAL_EXP_CAP_MIN_PARTY_MENMBER = 2, // ÃÖ¼Ò 2¸í ÀÌ»óÀÇ ÆÄƼ¿øÀÌ ±Ùó¿¡ ÀÖÀ» ¶§ ADDITIONAL_EXP_CAP_PERCENTAGE = 40, // 40 % Ãß°¡ Exp Cap º¸³Ê½º } ; CCharacterParty(const PARTY& PartyInfo, bool bCreate); CCharacterParty(); ~CCharacterParty(); // ÆÄƼ¿øÁß ÈÞ¸ÕÀÇ ºñÀ²À» ¹ÝȯÇÑ´Ù. unsigned char GetRaceRate(void); bool Join(unsigned long dwSenderCID, unsigned long dwReferenceID, const char* strSenderName, unsigned short wMapIndex = 0); int Leave(unsigned long dwSenderCID, unsigned long dwReferenceID = 0, unsigned short wMapIndex = 0); bool Destory(unsigned long dwSenderCID, unsigned long dwReferenceID); bool Login(unsigned long dwSenderCID, unsigned long dwReferenceID); bool ReLogin(CCharacter* llpCharacter); int Logout(unsigned long dwSenderCID, unsigned long dwReferenceID); void PrepareLogout(unsigned long dwMemberID); bool TransferLeader(unsigned long dwLeaderCID); CCharacter** GetMemberPointerList(void) { return m_pMemberPointer; } unsigned char GetLoggedMemberAverageLevel(void); int GetNearMemberList(CCell *pCell, bool bAutoRouting, CCharacter **aryNearCharacterList, unsigned char &cHighestLevel); bool AdjustAutoRouting(unsigned long dwTargetID, bool bSwitch); // ---------------------------------------------------------------------------------------- // ÆÀ¹èƲ °ü·Ã ¸Þ¼Òµå CCharacterParty* GetHostileParty(void) { return m_pHostileParty; } bool StartTeamBattle(CCharacterParty* pHostileParty); int DropMember(CCharacter* pDropMember, PktDuC::DuelCmd eCmd); void EndTeamBattle(void); bool MakeTeamBattleInfo(char* szPacket, unsigned short& dwPacketSize, CCharacter* pChallenger, unsigned char cCmd); // ---------------------------------------------------------------------------------------- // ÆÄƼ¿ø Àüü¿¡ ¿µÇâÀ» ÁÖ´Â ¸í·É void MovePos(POS NewPos, char cZone, const bool bSitDown); void MoveZone(POS NewPos, char Zone, char Channel); bool AutoRouting(CAggresiveCreature* lpPickkingCreature, Item::CItem* lpItem, unsigned long& dwGold); bool Attack(AtType attackType, CAggresiveCreature** pDefenders, unsigned char* cDefenserJudges, CAggresiveCreature* lpOffencer, float fDistance, unsigned char cTargetType); // ---------------------------------------------------------------------------------------- // ÆÄƼ Äù½ºÆ® °ü·Ã ÇÔ¼ö bool StartQuest(Quest::QuestNode* lpQuestNode, const Position& CenterPos, unsigned long dwNPCID); bool CheckTrigger(unsigned long dwExceptCID, unsigned char cTriggerKind, unsigned long dwReferenceID, Position Pos, short wCount); void OperateTrigger(unsigned short wQuestID, unsigned char cPhase, unsigned char cTrigger, unsigned char cCount, Position Pos); // ---------------------------------------------------------------------------------------- // Send °ü·Ã void SendPartyInfo(CCharacter *lpCharacter); void SendAllLoggedMember(const char* szPacket, unsigned long dwPacketSize, unsigned long dwExclusion, unsigned char cCMD_In); void SendNotNearCellMember(const char* szPacket, unsigned long dwPacketSize, CCell* lpCell, unsigned char cCMD_In); void SendDivisionExp(CCharacter* lpCharacter, CAggresiveCreature* lpDeadCreature, unsigned long dwExp, int nStandardLevel); void SendDropMember(CCharacter* pDropMember, PktDuC::DuelCmd eCmd); void SendRecall(CCharacter* lpCaster); void SendAutoRouting(unsigned long dwCharID, unsigned short wItemID, unsigned char cCmd); void SendPartyAddress(unsigned long dwCharID, const SOCKADDR_IN& PublicAddress, const SOCKADDR_IN& PrivateAddress); void SendPartyMemberDataToDBAgent(unsigned long dwSenderID, unsigned long dwGID, unsigned short wClass, unsigned long dwServerID, char cLevel, const char* strSenderName, unsigned short usCmd); void SendDivisionFame(CCharacter* lpWinnerCharacter, CCharacter* lpLoserCharacter, unsigned char cCmd, unsigned char cAcquireAmount); // ij¸¯ÅÍ Á¤º¸°¡ ¾÷µ¥ÀÌÆ® µÇ¾úÀ» ¶§ ´Ù¸¥ Á¸¿¡ Àִ ij¸¯ÅÍ Á¤º¸¸¦ º¸³»´Â ÇÔ¼ö void SendMemberInfoNZone(const char* szPacket, unsigned long dwPacketSize, unsigned long dwSenderID, unsigned char cCMD_In); // ij¸¯ÅÍ Á¢¼Ó½Ã ´Ù¸¥ Á¸¿¡ Àִ ij¸¯ÅÍ Á¤º¸¸¦ º¸³»´Â ÇÔ¼ö bool SendMemberInfoAllNZone(unsigned long dwCID); // ·Î±×¾Æ¿ôÀ̳ª »èÁ¦ ¸Þ¼¼Áö¸¦ º¸³½´Ù. bool SendMemberInfoOutNZone(unsigned long dwCID, unsigned short wCmd); // ÀÏÁ¤ ÁÖ±â·Î È£ÃâµÇ´Â ÇÔ¼ö (¿©±â¼­´Â ij¸¯ÅÍ ÁÂÇ¥ ¹× ±âŸ µîÀÇ Á¤º¸¸¦ ¾÷µ¥ÀÌÆ® ÇØÁØ´Ù.) void UpdateData(); }; #endif