Files
Client/Server/RylServerProject/RylGameLibrary/Community/party/Party.h
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

277 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _RYL_GAME_LIBRARY_PARTY_H_
#define _RYL_GAME_LIBRARY_PARTY_H_
#include <set>
#include <boost/pool/pool_alloc.hpp>
#include <DB/DBdefine.h>
#include <Skill/Spell/PartySpellMgr.h>
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
#include <Network/Packet/PacketStruct/CharAttackPacket.h>
#include <Network/Packet/PacketStruct/PartyPacket.h>
// Àü¹æ ÂüÁ¶
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<unsigned long, std::less<unsigned long>,
boost::fast_pool_allocator<unsigned long> > 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