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>
This commit is contained in:
2543
Server/RylServerProject/RylGameLibrary/Community/party/Party.cpp
Normal file
2543
Server/RylServerProject/RylGameLibrary/Community/party/Party.cpp
Normal file
File diff suppressed because it is too large
Load Diff
276
Server/RylServerProject/RylGameLibrary/Community/party/Party.h
Normal file
276
Server/RylServerProject/RylGameLibrary/Community/party/Party.h
Normal file
@@ -0,0 +1,276 @@
|
||||
#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>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
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; }
|
||||
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
|
||||
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; }
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
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; }
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD> ȣ<><C8A3><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD>
|
||||
|
||||
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; // <20>ο<EFBFBD><CEBF><EFBFBD> <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD>
|
||||
|
||||
PartyTargetSet m_partyTargets; // <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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];
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
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:
|
||||
|
||||
// <20>ؿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
enum ForeignConst
|
||||
{
|
||||
ADDITIONAL_EXP_CAP_MIN_PARTY_MENMBER = 2, // <20>ּ<EFBFBD> 2<><32> <20>̻<EFBFBD><CCBB><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD> <20><>
|
||||
ADDITIONAL_EXP_CAP_PERCENTAGE = 40, // 40 % <20>߰<EFBFBD> Exp Cap <20><><EFBFBD>ʽ<EFBFBD>
|
||||
} ;
|
||||
|
||||
CCharacterParty(const PARTY& PartyInfo, bool bCreate);
|
||||
CCharacterParty();
|
||||
~CCharacterParty();
|
||||
|
||||
// <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
||||
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);
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD>Ʋ <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
|
||||
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);
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
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);
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
|
||||
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 <20><><EFBFBD><EFBFBD>
|
||||
|
||||
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<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
void SendMemberInfoNZone(const char* szPacket, unsigned long dwPacketSize, unsigned long dwSenderID, unsigned char cCMD_In);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>ӽ<EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool SendMemberInfoAllNZone(unsigned long dwCID);
|
||||
|
||||
// <20>αƿ<D7BE><C6BF>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
bool SendMemberInfoOutNZone(unsigned long dwCID, unsigned short wCmd);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>ֱ<EFBFBD><D6B1><EFBFBD> ȣ<><C8A3><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD> (<28><><EFBFBD>⼭<EFBFBD><E2BCAD> ij<><C4B3><EFBFBD><EFBFBD> <20><>ǥ <20><> <20><>Ÿ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>.)
|
||||
void UpdateData();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,260 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <Creature/CreatureManager.h>
|
||||
#include <Creature/Character/Character.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
|
||||
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
|
||||
#include <Network/Stream/SendStream.h>
|
||||
|
||||
#include "PartyMgr.h"
|
||||
|
||||
|
||||
CPartyMgr& CPartyMgr::GetInstance()
|
||||
{
|
||||
static CPartyMgr partyMgr;
|
||||
return partyMgr;
|
||||
}
|
||||
|
||||
|
||||
CPartyMgr::CPartyMgr()
|
||||
: m_tempUID(0)
|
||||
{
|
||||
m_PartyMap.clear();
|
||||
m_MemberFindPartyMap.clear();
|
||||
m_PartyFindMemberMap.clear();
|
||||
}
|
||||
|
||||
CPartyMgr::~CPartyMgr()
|
||||
{
|
||||
DestoryPartyList();
|
||||
}
|
||||
|
||||
|
||||
void CPartyMgr::DestoryPartyList()
|
||||
{
|
||||
// ERRLOG1(g_Log, "EDITH :%d <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", m_PartyMap.size());
|
||||
|
||||
for (PartyMap::iterator it = m_PartyMap.begin(); it != m_PartyMap.end(); ++it)
|
||||
{
|
||||
delete it->second;
|
||||
}
|
||||
|
||||
m_PartyMap.clear();
|
||||
|
||||
// edith 2008.05.29 <20><>Ƽ <20><> <20>ʱ<EFBFBD>ȭ <20>߰<EFBFBD>
|
||||
m_MemberFindPartyMap.clear();
|
||||
m_PartyFindMemberMap.clear();
|
||||
}
|
||||
|
||||
|
||||
void CPartyMgr::UpdatePartyData()
|
||||
{
|
||||
PartyMap::iterator pos = m_PartyMap.begin();
|
||||
PartyMap::iterator end = m_PartyMap.end();
|
||||
|
||||
for (; pos != end; ++pos)
|
||||
{
|
||||
pos->second->UpdateData();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CPartyMgr::RequestPartyInfoToDB(unsigned long dwLeaderCID, unsigned long dwPartyUID)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CPartyMgr::AddParty(CParty *pParty)
|
||||
{
|
||||
unsigned long dwPartyUID = pParty->GetUID();
|
||||
|
||||
PartyMap::iterator it = m_PartyMap.find(dwPartyUID);
|
||||
if (it != m_PartyMap.end()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// edith 2008.05.29 <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD>
|
||||
// m_PartyMap.insert(PartyMap::value_type(pParty->GetUID(), pParty)).second;
|
||||
|
||||
m_PartyMap.insert(PartyMap::value_type(pParty->GetUID(), pParty));
|
||||
return GetParty(dwPartyUID);
|
||||
}
|
||||
|
||||
|
||||
CParty* CPartyMgr::GetParty(unsigned long dwPartyUID)
|
||||
{
|
||||
PartyMap::iterator it = m_PartyMap.find(dwPartyUID);
|
||||
if (it == m_PartyMap.end()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return it->second;
|
||||
}
|
||||
|
||||
|
||||
bool CPartyMgr::DeleteParty(unsigned long dwPartyUID)
|
||||
{
|
||||
PartyMap::iterator it = m_PartyMap.find(dwPartyUID);
|
||||
if (it == m_PartyMap.end()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
delete it->second;
|
||||
m_PartyMap.erase(it);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CPartyMgr::AddFindPartyList(unsigned long dwCID)
|
||||
{
|
||||
MemberFindPartyMap::iterator it = m_MemberFindPartyMap.find(dwCID);
|
||||
if (it != m_MemberFindPartyMap.end()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CCharacter* pCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
|
||||
if (NULL == pCharacter) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return m_MemberFindPartyMap.insert(MemberFindPartyMap::value_type(dwCID, pCharacter)).second;
|
||||
}
|
||||
|
||||
|
||||
bool CPartyMgr::DeleteFindPartyList(unsigned long dwCID)
|
||||
{
|
||||
MemberFindPartyMap::iterator it = m_MemberFindPartyMap.find(dwCID);
|
||||
if (it == m_MemberFindPartyMap.end()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_MemberFindPartyMap.erase(it);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CPartyMgr::AddFindMemberList(unsigned long dwPartyUID)
|
||||
{
|
||||
PartyFindMemberMap::iterator it = m_PartyFindMemberMap.find(dwPartyUID);
|
||||
if (it != m_PartyFindMemberMap.end())
|
||||
{
|
||||
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ<EFBFBD><C6BC> ã<><C3A3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̹<EFBFBD> <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>߰<EFBFBD><DFB0>Ϸ<EFBFBD> <20>մϴ<D5B4>.", dwPartyUID);
|
||||
return false;
|
||||
}
|
||||
|
||||
CParty* pParty = CPartyMgr::GetInstance().GetParty(dwPartyUID);
|
||||
if (NULL == pParty)
|
||||
{
|
||||
ERRLOG1(g_Log, "PID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>Ƽ<EFBFBD>Դϴ<D4B4>.", dwPartyUID);
|
||||
return false;
|
||||
}
|
||||
|
||||
return m_PartyFindMemberMap.insert(PartyFindMemberMap::value_type(dwPartyUID, pParty)).second;
|
||||
}
|
||||
|
||||
|
||||
bool CPartyMgr::DeleteFindMemberList(unsigned long dwPartyUID)
|
||||
{
|
||||
PartyFindMemberMap::iterator it = m_PartyFindMemberMap.find(dwPartyUID);
|
||||
if (it == m_PartyFindMemberMap.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_PartyFindMemberMap.erase(it);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CPartyMgr::SendPartyFind(CCharacter* lpCharacter)
|
||||
{
|
||||
if (NULL != lpCharacter)
|
||||
{
|
||||
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
|
||||
if (NULL != lpDispatch)
|
||||
{
|
||||
const int MAX_BUFFER_SIZE = sizeof(MemberFindParty) * PktPFAck::MAX_LIST +
|
||||
sizeof(PartyFindMember) * PktPFAck::MAX_LIST + sizeof(PktPFAck);
|
||||
|
||||
char szBuffer[MAX_BUFFER_SIZE];
|
||||
char* lpBufferPos = szBuffer + sizeof(PktPFAck);
|
||||
PktPFAck* lpPktPFAck = reinterpret_cast<PktPFAck*>(szBuffer);
|
||||
|
||||
int nMemberFindPartyNum = 0;
|
||||
int nPartyFindMemberNum = 0;
|
||||
|
||||
const int nMyLevel = lpCharacter->GetStatus().m_nLevel;
|
||||
|
||||
for (MemberFindPartyMap::iterator it = m_MemberFindPartyMap.begin();
|
||||
it != m_MemberFindPartyMap.end() && nMemberFindPartyNum < PktPFAck::MAX_LIST; ++it)
|
||||
{
|
||||
CCharacter* lpEntryCharacter = it->second;
|
||||
|
||||
if (NULL != lpEntryCharacter)// && lpCharacter != lpEntryCharacter)
|
||||
{
|
||||
const int nEntryCharLevel = lpEntryCharacter->GetStatus().m_nLevel;
|
||||
|
||||
if (::abs(nEntryCharLevel - nMyLevel) <= PktPFAck::MAX_DIFF_LEVEL_VIEW &&
|
||||
EnemyCheck::EC_ENEMY != lpCharacter->IsEnemy(lpEntryCharacter))
|
||||
{
|
||||
MemberFindParty* lpEntryMemberFindParty = reinterpret_cast<MemberFindParty*>(lpBufferPos);
|
||||
|
||||
strncpy(lpEntryMemberFindParty->m_strName, lpEntryCharacter->GetCharacterName(), CHAR_INFOST::MAX_NAME_LEN);
|
||||
lpEntryMemberFindParty->m_cLevel= static_cast<unsigned char>(nEntryCharLevel);
|
||||
lpEntryMemberFindParty->m_cClass = static_cast<unsigned char>(lpEntryCharacter->GetClass());
|
||||
|
||||
lpBufferPos += sizeof(MemberFindParty);
|
||||
++nMemberFindPartyNum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (PartyFindMemberMap::iterator it = m_PartyFindMemberMap.begin();
|
||||
it != m_PartyFindMemberMap.end() && nPartyFindMemberNum < PktPFAck::MAX_LIST; ++it)
|
||||
{
|
||||
CParty* lpEntryParty = it->second;
|
||||
|
||||
// <20>ڱⰡ <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD>
|
||||
if (NULL != lpEntryParty ) // && !lpEntryParty->IsMember(lpCharacter->GetCID()))
|
||||
{
|
||||
const int nAverageLevel = lpEntryParty->GetLoggedMemberAverageLevel();
|
||||
|
||||
if (::abs(nAverageLevel - nMyLevel) <= PktPFAck::MAX_DIFF_LEVEL_VIEW)
|
||||
{
|
||||
PartyFindMember* lpEntryPartyFindMember = reinterpret_cast<PartyFindMember*>(lpBufferPos);
|
||||
|
||||
CCharacter* lpLeaderCharacter = CCreatureManager::GetInstance().GetCharacter(lpEntryParty->GetLeader());
|
||||
if (NULL != lpLeaderCharacter)
|
||||
{
|
||||
if (EnemyCheck::EC_ENEMY != lpCharacter->IsEnemy(lpLeaderCharacter))
|
||||
{
|
||||
strncpy(lpEntryPartyFindMember->m_strLeaderName,
|
||||
lpLeaderCharacter->GetCharacterName(), CHAR_INFOST::MAX_NAME_LEN);
|
||||
|
||||
lpEntryPartyFindMember->m_cAverageLevel = static_cast<unsigned char>(nAverageLevel);
|
||||
lpEntryPartyFindMember->m_cMemberNum = lpEntryParty->GetMemberNum();
|
||||
|
||||
lpBufferPos += sizeof(PartyFindMember);
|
||||
++nPartyFindMemberNum;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const unsigned short usPacketSize = static_cast<unsigned short>(sizeof(PktPFAck) +
|
||||
sizeof(MemberFindParty) * nMemberFindPartyNum + sizeof(PartyFindMember) * nPartyFindMemberNum);
|
||||
|
||||
lpPktPFAck->m_dwCharID = lpCharacter->GetCID();
|
||||
lpPktPFAck->m_cMemberFindPartyNum = nMemberFindPartyNum;
|
||||
lpPktPFAck->m_cPartyFindMemberNum = nPartyFindMemberNum;
|
||||
|
||||
lpDispatch->GetSendStream().WrapCompress(szBuffer, usPacketSize, CmdCharPartyFind, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
#ifndef _RYL_GAME_LIBRARY_PARTY_MGR_H_
|
||||
#define _RYL_GAME_LIBRARY_PARTY_MGR_H_
|
||||
|
||||
#include <Thread/Lock.h>
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
#include "Party.h"
|
||||
|
||||
class CPartyMgr
|
||||
{
|
||||
public:
|
||||
static CPartyMgr& GetInstance();
|
||||
|
||||
void DestoryPartyList();
|
||||
|
||||
bool RequestPartyInfoToDB(unsigned long dwLeaderCID, unsigned long dwPartyUID);
|
||||
|
||||
bool AddParty(CParty *pParty);
|
||||
CParty* GetParty(unsigned long dwPartyUID);
|
||||
bool DeleteParty(unsigned long dwPartyUID);
|
||||
|
||||
bool AddFindPartyList(unsigned long dwCID);
|
||||
bool DeleteFindPartyList(unsigned long dwCID);
|
||||
bool AddFindMemberList(unsigned long dwPartyUID);
|
||||
bool DeleteFindMemberList(unsigned long dwPartyUID);
|
||||
|
||||
unsigned long GetTempUID(void) { m_tempUID++; return m_tempUID; }
|
||||
|
||||
void SendPartyFind(CCharacter* pCharacter);
|
||||
|
||||
void UpdatePartyData();
|
||||
|
||||
protected:
|
||||
|
||||
CPartyMgr();
|
||||
~CPartyMgr();
|
||||
|
||||
typedef std::map<unsigned long, CParty*, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, CParty* > > > PartyMap;
|
||||
|
||||
typedef std::map<unsigned long, CCharacter*, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, CCharacter* > > > MemberFindPartyMap;
|
||||
|
||||
typedef std::map<unsigned long, CParty*, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, CParty* > > > PartyFindMemberMap;
|
||||
|
||||
PartyMap m_PartyMap;
|
||||
MemberFindPartyMap m_MemberFindPartyMap;
|
||||
PartyFindMemberMap m_PartyFindMemberMap;
|
||||
|
||||
unsigned long m_tempUID;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user