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:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,194 @@
#ifndef _GUILD_H_
#define _GUILD_H_
#pragma once
#include <map>
#include <vector>
#include <Network/Packet/PacketStruct/GuildPacket.h>
#include <Community/Guild/GuildConstants.h>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CAggresiveCreature;
class CCharacter;
class CCell;
class CSession;
namespace Guild
{
// <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ɴ<EFBFBD>.
bool CheckGuildName(const char* szGuildName);
class CGuild
{
protected:
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƿ<EFBFBD><C6BF> <20>̿<EFBFBD><CCBF>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> public)
CGuild(void);
CGuild(unsigned long dwGID, unsigned char cNation, char* szName);
CGuild(GuildInfoDB& guildInfo);
friend class CGuildMgr;
public:
~CGuild(void);
public:
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾<EFBFBD> üũ<C3BC>ϰ<EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
// (TODO : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD> SERVER_ERROR.)
unsigned short SetMark(unsigned long dwSenderID, char *szMark);
bool SetLevel(unsigned long dwMaster, unsigned char cLevel);
bool SetRight(unsigned long dwMaster, GuildRight guildRight);
bool SetTitle(unsigned long dwSuperior, unsigned long dwFollower, unsigned char cTitle, unsigned short &wError);
bool JoinMember(unsigned long dwCID, unsigned char cTitle, unsigned short &wError);
bool JoinMemberDB(GuildMemberDB& guildMemberDB);
virtual bool JoinMember(MemberInfo& memberInfo);
bool TacticsMember(unsigned long dwCID, unsigned char cTitle, unsigned char cType, unsigned short &wError);
bool SetTacticsTitle(unsigned long dwSuperior, unsigned long dwFollower, unsigned short wCmd, unsigned char cTitle, unsigned char cType, unsigned short &wError);
bool SetTacticsTitle(unsigned long dwCID, unsigned char cTitle);
bool IsMember(unsigned long dwCID);
bool IsTacticsWaitMember(unsigned long dwCID);
bool KickMember(unsigned long dwSuperior, unsigned long dwFollower, unsigned short &wError);
bool KickTacticsMember(unsigned long dwSuperior, unsigned long dwFollower, unsigned short wCmd, unsigned short &wError);
bool LeaveTacticsMember(unsigned long dwCID, unsigned long dwReferenceID, unsigned short wCmd);
bool UpdateMemberInfo(unsigned long dwCID, unsigned long dwValue, unsigned char cCmd);
// <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾<EFBFBD> ó<><C3B3><EFBFBD>ϰ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>.
unsigned short SetMark(unsigned long dwSenderID, char *szMark, unsigned long dwGold);
bool SetLevel(unsigned char cLevel, unsigned long dwGold);
bool SetRight(GuildRight guildRight);
virtual bool SetTitle(unsigned long dwCID, unsigned char cTitle);
bool SetRelation(unsigned long dwTargetGID, unsigned char cRelationType, unsigned char cActorType=Guild::BY_MINE);
bool UpdateMemberInfo(unsigned long dwCID, MemberListInfo memberListInfo, MemberDetailInfo memberDetailInfo);
// -------------------------------------------------------------------------------------------
MemberInfo GetMaster(void);
unsigned char GetTitle(unsigned long dwCID);
const unsigned long GetGID(void) { return m_dwGID; }
const char* GetName(void) { return m_strName; }
const unsigned long GetFame(void) { return m_dwFame; }
const GuildRight& GetRight(void) { return m_GuildRight; }
const unsigned long GetGold(void) { return m_dwGold; }
const unsigned char GetCurrentAllMember(void) const; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
const unsigned char GetTotalMemberNum(void) const; // <20><EFBFBD><EBBAB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const unsigned char GetCurrentMemberNum(void) const; // <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><EBBAB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const unsigned char GetMemberNum(void) const; // <20><EFBFBD><EBBAB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const unsigned char GetTacticsNum(void) const; // <20><20><>
const float GetGuildBonus(unsigned char cRealmPoint, float fPercent = 5.0f); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
const unsigned char GetLoginMemberNum(void) const; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const unsigned char GetMaxMemberNum(void) const; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const unsigned char GetNation(void) const { return m_cInclination; }
const bool IsPeaceMode(void);
void SetGuildMiles(unsigned long dwGuildMiles);
const unsigned long GetGuildMiles() const { return m_dwGuildMiles; }
bool AddGold(unsigned long dwGold);
bool DeductGold(unsigned long dwGold);
void ReleaseGold(unsigned long dwGold);
bool AutoRouting(CAggresiveCreature* lpPickkingCreature, Item::CItem* lpItem, unsigned long& dwGold);
int GetNearMemberList(CCell *pCell, CCharacter **aryNearCharacterList);
void UpgradeMemberRespawnSpeedByEmblem(unsigned char cUpgradeType, unsigned char cUpgradeStep);
void DegradeMemberRespawnSpeedByEmblem();
unsigned char GetRelation(unsigned long dwGID, unsigned char cActorType=Guild::BY_MINE);
int GetNumOfRelation(unsigned char cRelationType, unsigned char cActorType=Guild::BY_MINE);
unsigned long GetRelationGID(unsigned char cRelationType, unsigned char cActorType=Guild::BY_MINE);
// Vincent - GetRelationGID() <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20>̻<EFBFBD> <20>Ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>Ѵ<EFBFBD>.!!
bool IsEnemyGuild(unsigned long dwGID);
bool InviteMember(unsigned long dwMember, unsigned long dwGuest, unsigned short &wError);
bool LeaveMember(unsigned long dwCID);
bool LogInOutMember(unsigned long dwCID, unsigned long dwServerID);
const GuildLargeInfoNode GetLargeInfo(unsigned char cIndexOfPage, unsigned short wRank, CGuild* lpRelationGuild);
bool SendGuildSafe(unsigned long dwCID, char* szCharName, unsigned char cCmd);
bool SendMemberList(CCharacter* lpCharacter, unsigned char cMemberType, unsigned char cSortCmd, unsigned char cPage);
void SendAllMember(const char* szPacket, unsigned long dwPacketSize, unsigned char cCMD_In);
void SendCurrentMember(const char* szPacket, unsigned long dwPacketSize, unsigned char cCMD_In);
bool SendHostilityList(CCharacter* lpCharacter, unsigned char cCurrentPage, unsigned char cPageState);
void ChangeMemberName(unsigned long dwCID, const char* szChangeName);
TIME* GetGuildPointTime(void) { return &m_tmGuildPoint; }
unsigned char GetGuildPointFlag(void) { return m_cGuildPointFlag; }
void SetGuildPointFlag(unsigned char cFlag) { m_cGuildPointFlag = cFlag; }
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޼ҵ<DEBC>
void SetGuildSafe(char cGuildSafe) { m_cGuildSafe = cGuildSafe; }
char GetGuildSafe() { return m_cGuildSafe; }
protected:
bool InsertRelation(unsigned long dwGID, unsigned long dwTargetGID, unsigned char cRelation);
void CalculateGuildFame(void);
// ------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
char m_cGuildSafe;
unsigned long m_dwGID; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
char m_strName[MAX_GUILD_NAME_LEN]; // <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>
char m_szMark[MAX_MARK_SIZE]; // <20><><EFBFBD><EFBFBD> <20><>ũ
unsigned char m_cInclination; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (Guild::Inclination <20><><EFBFBD><EFBFBD>)
unsigned char m_cLevel; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwFame; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwGold; // <20><><EFBFBD><EFBFBD> <20>ݰ<EFBFBD>
unsigned char m_cGuildPointFlag; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
TIME m_tmLastLogout; /* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE> <20>ð<EFBFBD>
(<28><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.) */
TIME m_tmCheckMember; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD>
TIME m_tmGMLastLogout; /* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE> <20>ð<EFBFBD>
(<28><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ȴ<EFBFBD>.) */
TIME m_tmChangeInclination; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> (24<32>ð<EFBFBD> <20>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.)
TIME m_tmGuildPoint; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>.
GuildRight m_GuildRight; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
MemberList m_MemberList; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RelationMap m_Relation[Guild::MAX_RELATION_ACTOR]; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> / <20>ٸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>ξ<EFBFBD><CEBE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwGuildMiles;
};
};
#endif

View File

@@ -0,0 +1,180 @@
#ifndef _GUILD_CONSTANTS_H_
#define _GUILD_CONSTANTS_H_
namespace Guild
{
enum Const
{
MAX_GUILD_NAME_LEN = 11, // <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
MAX_GUILD_NAME_FOR_DB = 20, // <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> (DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
MAX_MEMBER_NAME_LEN = 16, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>̿<EFBFBD> <20><><EFBFBD><EFBFBD>)
MAX_MARK_SIZE = 18 * 12 * 2 + 1, // <20><><EFBFBD><EFBFBD> <20><>ũ ũ<><C5A9> (18 * 12 ũ<><C5A9><EFBFBD><EFBFBD> 16<31><36>Ʈ Į<><C4AE><EFBFBD><EFBFBD> BMP <20><><EFBFBD><EFBFBD>, ù 1<><31><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ũ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
MAX_RIGHT_SIZE = 50, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü ũ<><C5A9>
MAX_MEMBER_NUM = 100, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> ũ<><C5A9> (<28><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>д<EFBFBD>.)
MAX_RELATION_NUM = 255, // <20><>ȣ/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ִ<EFBFBD> ũ<><C5A9><><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>д<EFBFBD>.)
MAX_HOSTILITY_APPLY_NUM = 49, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
MAX_HOSTILITY_NUM = 1, // <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20><>
MAX_ALERT_NUM = 1, // <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20><>
MAX_LEVEL = 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
CREATE_LEVEL = 30, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>Ǵ<EFBFBD> <20>ּ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CREATE_LEVEL_FOR_CHINA = 15, // (<28>߱<EFBFBD><DFB1><EFBFBD>) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>Ǵ<EFBFBD> <20>ּ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SET_MARK_GOLD = 5000000, // <20><>ũ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ݾ<EFBFBD>
FAME_LEAVE_PENALTY = 1000, // <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD>
MAX_SMALL_NODE_NUM = 500, // <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
MEMBER_INFO_UPDATE_COUNT = 10, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>ϴ<EFBFBD> Ÿ<>̹<EFBFBD>
DELETE_GUILD_MEMBER_NUM = 4, // <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ּ<EFBFBD> <20>ο<EFBFBD>
MINUTES_PER_HOUR = 60,
// <20>ؿ<EFBFBD><D8BF><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> Ż<><C5BB> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. (2005-06-13 by <20>ε<EFBFBD>)
LEAVE_WAIT_TIME = 0, // Ż<><C5BB> <20><><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
LEAVE_WAIT_TIME_FOR_CHINA = 10080, // (<28>߱<EFBFBD><DFB1><EFBFBD>) Ż<><C5BB> <20><><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
DELETE_GUILD_LOGOUT_TIME = 43200, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD> <20><><EFBFBD><20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
MEMBER_NUM_DELETE_TIME = 1440, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DELETE_GUILD_MEMBER_NUM <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
TRANFER_MASTER_TIME = 20160, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
CHANGE_INCLINATION_TIME = 1440, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
RELATION_WAIT_TIME = 1440, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (<28><><EFBFBD><EFBFBD> : <20><>)
/*
// Test : <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
LEAVE_WAIT_TIME_FOR_CHINA = 10, // (<28>߱<EFBFBD><DFB1><EFBFBD>) Ż<><C5BB> <20><><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
DELETE_GUILD_LOGOUT_TIME = 30, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD> <20><><EFBFBD><20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
MEMBER_NUM_DELETE_TIME = 15, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DELETE_GUILD_MEMBER_NUM <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
TRANFER_MASTER_TIME = 20, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
CHANGE_INCLINATION_TIME = 10, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱓ (<28><><EFBFBD><EFBFBD> : <20><>)
RELATION_WAIT_TIME = 1, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (<28><><EFBFBD><EFBFBD> : <20><>)
*/
MEMBER_WAIT_BIT = 0x80000000, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ϴ<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
TIME_GUILD_POINT = 30, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD>(<28>д<EFBFBD><D0B4><EFBFBD>).
TACTICE_JON_LEVEL = 1, // <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
TACTICS = 1, // <20>뺴.
TACTICS_WAIT = 2, // <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
};
enum Title
{
NONE = 0,
MASTER = 1, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MIDDLE_ADMIN = 2, // <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COMMON = 3, // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LEAVE_WAIT = 4, // Ż<><C5BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
JOIN_WAIT = 5, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MAX_TITLE = 6
};
enum MemberType
{
TYPE_MEMBER = 0, // <20><><EFBFBD><EFBFBD>
TYPE_TACTICS = 1 // <20>
};
enum GuildSort
{
GUILD_FAME = 0, // <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)
GUILD_NAME = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GUILD_HOSTILITY = 2, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GUILD_NEUTRALITY = 3, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GUILD_MINE = 4, // <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD>
GUILD_REQUEST = 5 // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û (<28><> <20>α<EFBFBD> <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û)
};
enum MemberSort
{
MEMBER_TITLE = 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MEMBER_CLASS = 1, // Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ
MEMBER_LEVEL = 2, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ
MEMBER_FAME = 3, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ
MEMBER_NAME = 4, // <20≯<EFBFBD><CCB8><EFBFBD> <20><>Ʈ
MEMBER_GOLD = 5, // <20><><EFBFBD><EFBFBD><EFBFBD>ݾ׺<DDBE> <20><>Ʈ
MEMBER_POSITION = 6, // <20><>ġ<EFBFBD><C4A1> <20><>Ʈ
MEMBER_JOIN_WAIT = 7, // <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD>
MEMBER_WAR_ON = 8, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ)
MEMBER_WAR_OFF = 9, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ)
TACTICS_JOIN_WAIT = 10, // <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD> <20>뺴 (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>)
TACTICS_ACTIVE = 11 // Ȱ<><C8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>뺴 (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>)
};
enum Relation
{
NEUTRALITY = 0, // <20>߸<EFBFBD> <20><><EFBFBD><EFBFBD>
HOSTILITY = 1, // <20><><EFBFBD><EFBFBD>
COUNTER_HOSTILITY = 2, // ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ALERT_HOSTILITY = 3, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
MINE = 4, // <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD>
TARGET_NEUTRALITY = 5, // A->B<><42><EFBFBD><20>ϸ<EFBFBD> DB<44><42><EFBFBD><EFBFBD> 1<><31> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>̻<EFBFBD><CCBB>¿<EFBFBD><C2BF><EFBFBD> <20>ǽ<EFBFBD><C7BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>
// <20>ش簪<D8B4><E7B0AA> 5<><35> <20>ٲ<EFBFBD><D9B2><EFBFBD>. 5<><35> <20>ٲ<EFBFBD><D9B2>ڿ<EFBFBD><DABF><EFBFBD> B<><42><EFBFBD><20><><EFBFBD><EFBFBD><EBBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ָ<EFBFBD>
// <20>̶<EFBFBD> DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><20>ȴ<EFBFBD>.
ALL_HOSTILITY = 6 // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
};
enum RelationActor
{
BY_MINE = 0, // <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
BY_TARGET = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
MAX_RELATION_ACTOR = 2
};
// <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
enum TimeUpdateType
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> CDBObject::UpdateGuildTime <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD>
LAST_LOGOUT = 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20>ð<EFBFBD>
MEMBER_NUM_DOWN = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 3<><33> <20><><EFBFBD>ϰ<EFBFBD> <20><> <20>ð<EFBFBD>
MASTER_LOGOUT = 2 // <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20>ð<EFBFBD>
};
enum ErrType
{
S_SUCCESS = 0,
// CGuild::SetTitle <20>Լ<EFBFBD><D4BC><EFBFBD>
E_NOT_MEMBER = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
E_DISSOLVE_GUILD = 2, // <20><><EFBFBD><EFBFBD> <20><>ü
E_NOT_CHANGE = 3, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
E_DB_ERROR = 4, // DB <20><><EFBFBD><EFBFBD>
E_NOT_TEMP_MASTER = 5 // <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
};
enum AddFameType
{
// CGuildDB::AddAllMemberFame, AddFriendGuildMemberFame, AddMemberFame <20>Լ<EFBFBD><D4BC><EFBFBD>
TYPE_VALUE = 0, // Fame <20><><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
TYPE_HALF = 1, // <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> 1/2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
TYPE_QUARTER = 2 // <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> 1/4<><34> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
};
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
enum MemberInfoUpdateType
{
// CGuild::UpdateMemberInfo <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD>
TYPE_LEVEL = 0,
TYPE_CLASS = 1,
TYPE_FAME = 2,
TYPE_GOLD = 3,
TYPE_WARFLAG = 4
};
const unsigned char ms_aryMaxMemberNum[MAX_LEVEL] = { 10, 20, 30, 40, 50 };
const unsigned long ms_arySetLevelFame[MAX_LEVEL] = { 0, 1000, 3000, 5000, 10000 };
const unsigned long ms_arySetLevelFameForUSA[MAX_LEVEL] = { 0, 400, 2000, 5000, 10000 };
const unsigned long ms_arySetLevelGold[MAX_LEVEL] = { 1000000, 5000000, 10000000, 50000000, 100000000 };
const unsigned long ms_arySetLevelGoldForChina[MAX_LEVEL] = { 100000, 5000000, 10000000, 50000000, 100000000 };
};
#endif

View File

@@ -0,0 +1,739 @@
#include "stdafx.h"
#include <Utility/CheckSum/Crc32Static.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Stream/SendStream.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/WrapPacket.h>
#include <Creature/CreatureManager.h>
#include <Creature/Character/Character.h>
#include "GuildUtil.h"
#include "Guild.h"
#include "GuildMgr.h"
using namespace Guild;
CGuildMgr& CGuildMgr::GetInstance()
{
static CGuildMgr guildMgr;
return guildMgr;
}
CGuildMgr::CGuildMgr(void)
{
}
CGuildMgr::~CGuildMgr(void)
{
Destroy();
}
void CGuildMgr::Destroy(void)
{
std::for_each(m_GuildMap.begin(), m_GuildMap.end(), FnDeleteSecond());
m_GuildMap.clear();
m_GuildNameMap.clear();
}
bool CGuildMgr::CreateGuild(unsigned long dwMasterID, unsigned long dwGuildID, unsigned char cInclination, char* szGuildName)
{
CGuild* lpGuild = new CGuild(dwGuildID, cInclination, szGuildName);
if (false == m_GuildMap.insert(GuildMap::value_type(dwGuildID, lpGuild)).second)
{
delete lpGuild;
return false;
}
if (false == m_GuildNameMap.insert(GuildNameMap::value_type(std::string(szGuildName), lpGuild)).second)
{
m_GuildMap.erase(dwGuildID);
delete lpGuild;
return false;
}
PktCreateGuild pktCG;
pktCG.m_dwCID = 0;
pktCG.m_dwGID = dwGuildID;
pktCG.m_cInclination = cInclination;
::memcpy(pktCG.m_szGuildName, szGuildName, MAX_GUILD_NAME_LEN);
char* szPacket = reinterpret_cast<char *>(&pktCG);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktCreateGuild), CmdCreateGuild, 0, 0))
{
CCreatureManager::GetInstance().SendAllCharacter(szPacket, sizeof(PktCreateGuild), CmdCreateGuild);
}
return true;
}
bool CGuildMgr::GetMemberList(unsigned long dwGID, const MemberList* pMemberList)
{
GuildMap::iterator it = m_GuildMap.find(dwGID);
if (it == m_GuildMap.end())
{
return false;
}
CGuild* lpGuild = it->second;
if(lpGuild)
{
pMemberList = &lpGuild->m_MemberList;
return true;
}
return false;
}
bool CGuildMgr::DissolveGuild(unsigned long dwGID)
{
GuildMap::iterator it = m_GuildMap.find(dwGID);
if (it == m_GuildMap.end())
{
return false;
}
typedef std::vector<unsigned long> DissolveCIDList;
CGuild* lpGuild = it->second;
MemberList& memberList = lpGuild->m_MemberList;
MemberList::iterator member_pos = memberList.begin();
MemberList::iterator member_end = memberList.end();
DissolveCIDList dissolveList;
dissolveList.reserve(memberList.size());
while (member_pos != member_end)
{
dissolveList.push_back(member_pos->m_dwCID);
++member_pos;
}
DissolveCIDList::iterator dissolve_pos = dissolveList.begin();
DissolveCIDList::iterator dissolve_end = dissolveList.end();
while (dissolve_pos != dissolve_end)
{
lpGuild->LeaveMember(*dissolve_pos);
++dissolve_pos;
}
m_GuildNameMap.erase(lpGuild->m_strName);
m_GuildMap.erase(it);
delete lpGuild;
PktCreateGuild pktCG;
pktCG.m_dwGID = dwGID;
char* szPacket = reinterpret_cast<char*>(&pktCG);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktCreateGuild), CmdCreateGuild, 0, PktCreateGuild::FAIL_DISSOLVE_GUILD))
{
CCreatureManager::GetInstance().SendAllCharacter(szPacket, sizeof(PktCreateGuild), CmdCreateGuild);
}
return true;
}
CGuild* CGuildMgr::GetGuild(unsigned long dwGID)
{
GuildMap::iterator it = m_GuildMap.find(dwGID);
if (it == m_GuildMap.end()) { return NULL; }
return it->second;
}
CGuild* CGuildMgr::GetGuild(char* szName)
{
GuildNameMap::iterator it = m_GuildNameMap.find(szName);
if (it == m_GuildNameMap.end()) { return NULL; }
return it->second;
}
bool CGuildMgr::SetRelation(unsigned long dwGID, unsigned long dwTargetGID, unsigned char cRelationType)
{
CGuild* lpGuild = GetGuild(dwGID);
CGuild* lpTargetGuild = GetGuild(dwTargetGID);
if (NULL == lpGuild || NULL == lpTargetGuild) { return false; }
if(Guild::TARGET_NEUTRALITY == cRelationType)
{
if (!lpGuild->SetRelation(dwTargetGID, cRelationType, Guild::BY_TARGET))
{
return false;
}
if (!lpTargetGuild->SetRelation(dwGID, cRelationType, Guild::BY_MINE))
{
return false;
}
return true;
}
lpGuild->SetRelation(dwTargetGID, cRelationType, Guild::BY_MINE);
lpTargetGuild->SetRelation(dwGID, cRelationType, Guild::BY_TARGET);
return true;
}
bool CGuildMgr::SendGuildList(unsigned long dwCID, unsigned char cSortCmd, unsigned char cPage, unsigned char cNum, GuildCheckSumNode* lpNode)
{
PERFORMANCE_CHECK(FunctionTimingCheck);
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
if (NULL == lpCharacter)
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCID);
return false;
}
if (cNum > PktGuildList::MAX_NUM_PER_PAGE)
{
ERRLOG2(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD> <20><>û<EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d",
dwCID, cNum);
cNum = PktGuildList::MAX_NUM_PER_PAGE;
}
const int MAX_BUFFER = sizeof(PktGuildList) + PktGuildList::MAX_NUM_PER_PAGE * sizeof(GuildLargeInfoNode);
char szBuffer[MAX_BUFFER];
PktGuildList* lpPktGLAck = reinterpret_cast<PktGuildList *>(szBuffer);
GuildSmallInfoNode* lpSmallInfoNode = reinterpret_cast<GuildSmallInfoNode *>(lpPktGLAck + 1);
lpPktGLAck->m_dwCID = dwCID;
lpPktGLAck->m_cSortCmd = cSortCmd;
lpPktGLAck->m_cPage = cPage;
lpPktGLAck->m_cSmallNodeNum = 0;
lpPktGLAck->m_cLargeNodeNum = 0;
GuildLargeInfoNode aryCurrentInfoList[PktGuildList::MAX_NUM_PER_PAGE];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> GID<49><44> <20>˾Ƶд<C6B5>.
if (Guild::GUILD_REQUEST == cSortCmd)
{
for (int nIndex = 0; nIndex < cNum; ++nIndex)
{
aryCurrentInfoList[nIndex].m_dwGID = (lpNode + nIndex)->m_dwGID;
}
}
GetSortingPageList(lpCharacter, cSortCmd, cPage, aryCurrentInfoList);
int nClientIndex = 0;
int nServerIndex = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. (<28><><EFBFBD>κ<EFBFBD> <20><>ũ<EFBFBD><C5A9> <20><><EFBFBD><20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (Guild::GUILD_REQUEST != cSortCmd)
{
for (; nClientIndex < cNum && nServerIndex < PktGuildList::MAX_NUM_PER_PAGE; ++nClientIndex, ++nServerIndex)
{
unsigned long dwCheckSum = 0;
CCrc32Static::BufferCrc32(reinterpret_cast<const char *>(&aryCurrentInfoList[nServerIndex]),
sizeof(GuildSmallInfoNode), dwCheckSum);
if (NULL != lpNode)
{
if (lpNode->m_dwGID == aryCurrentInfoList[nServerIndex].m_dwGID)
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ʋ<><C6B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (lpNode->m_dwCheckSum != dwCheckSum)
{
*lpSmallInfoNode = static_cast<GuildSmallInfoNode>(aryCurrentInfoList[nServerIndex]);
++lpSmallInfoNode;
++lpPktGLAck->m_cSmallNodeNum;
}
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
aryCurrentInfoList[nServerIndex].m_dwGID = 0;
}
}
++lpNode;
}
}
GuildLargeInfoNode* lpLargeInfoNode = reinterpret_cast<GuildLargeInfoNode *>(lpSmallInfoNode);
for (nServerIndex = 0; nServerIndex < PktGuildList::MAX_NUM_PER_PAGE; ++nServerIndex)
{
if (0 != aryCurrentInfoList[nServerIndex].m_dwGID)
{
*lpLargeInfoNode = aryCurrentInfoList[nServerIndex];
++lpLargeInfoNode;
++lpPktGLAck->m_cLargeNodeNum;
}
}
unsigned char cSmallNodeNum = lpPktGLAck->m_cSmallNodeNum;
unsigned char cLargeNodeNum = lpPktGLAck->m_cLargeNodeNum;
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
CSendStream& SendStream = lpDispatch->GetSendStream();
return SendStream.WrapCompress(szBuffer, sizeof(PktGuildList) +
cSmallNodeNum * sizeof(GuildSmallInfoNode) + cLargeNodeNum * sizeof(GuildLargeInfoNode),
CmdGuildList, 0, 0);
}
return true;
}
bool CGuildMgr::SendGuildRelationInfo(unsigned long dwCID, unsigned long dwGID)
{
PERFORMANCE_CHECK(FunctionTimingCheck);
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
if (NULL == lpCharacter)
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCID);
return false;
}
CGuild* lpRequestGuild = GetGuild(dwGID);
if (NULL == lpRequestGuild)
{
ERRLOG1(g_Log, "GID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwGID);
return false;
}
const int MAX_BUFFER = sizeof(PktGuildRelationInfo) + Guild::MAX_RELATION_NUM * sizeof(GuildRelationInfoNode);
char szBuffer[MAX_BUFFER];
PktGuildRelationInfo* lpPktGRAck = reinterpret_cast<PktGuildRelationInfo *>(szBuffer);
GuildRelationInfoNode* lpRelationNode = reinterpret_cast<GuildRelationInfoNode *>(lpPktGRAck + 1);
lpPktGRAck->m_dwCID = dwCID;
lpPktGRAck->m_dwGID = dwGID;
lpPktGRAck->m_wNodeNum = 0;
CGuild* lpGuild = NULL;
GuildLargeInfoNode LargeInfo;
GuildMap::iterator itr = m_GuildMap.begin();
while (itr != m_GuildMap.end())
{
lpGuild = itr->second;
if (NULL != lpGuild)
{
LargeInfo = lpGuild->GetLargeInfo(0, 0, lpRequestGuild);
if (Guild::NEUTRALITY != LargeInfo.m_cRelationByMine ||
Guild::NEUTRALITY != LargeInfo.m_cRelationByTarget)
{
++lpPktGRAck->m_wNodeNum;
lpRelationNode->m_dwGID = LargeInfo.m_dwGID;
lpRelationNode->m_cRelationByMine = LargeInfo.m_cRelationByMine;
lpRelationNode->m_cRelationByTarget = LargeInfo.m_cRelationByTarget;
++lpRelationNode;
}
}
++itr;
}
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
CSendStream& SendStream = lpDispatch->GetSendStream();
return SendStream.WrapCompress(szBuffer, sizeof(PktGuildRelationInfo) +
lpPktGRAck->m_wNodeNum * sizeof(GuildRelationInfoNode),
CmdGuildRelationInfo, 0, 0);
}
return false;
}
bool CGuildMgr::GetSortingPageList(CCharacter* lpCharacter, unsigned char cSortCmd, unsigned char cPage,
GuildLargeInfoNode* aryCurrentInfoList)
{
CGuild* lpMyGuild = GetGuild(lpCharacter->GetGID());
unsigned short wStartOfPage = cPage * PktGuildList::MAX_NUM_PER_PAGE;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ
typedef std::pair<unsigned long, CGuild *> GuildPair;
unsigned short wGuildNum = static_cast<unsigned short>(m_GuildMap.size());
if (wGuildNum < wStartOfPage)
{
if (false == m_GuildMap.empty())
{
ERRLOG3(g_Log, "CID:0x%08x <20><>û <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d",
lpCharacter->GetCID(), wGuildNum, cPage);
}
for (unsigned char cIndex = 0; cIndex < PktGuildList::MAX_NUM_PER_PAGE; ++cIndex)
{
aryCurrentInfoList[cIndex].m_dwGID = 0;
}
return false;
}
std::vector<GuildPair> sortVector;
GuildPair NullPair(0, (Guild::CGuild*)NULL);
sortVector.reserve(wGuildNum);
sortVector.assign(wGuildNum, NullPair);
std::partial_sort_copy(m_GuildMap.begin(), m_GuildMap.end(), sortVector.begin(), sortVector.end(), CompareGuildFame());
if (true == sortVector.empty())
{
for (unsigned char cIndex = 0; cIndex < PktGuildList::MAX_NUM_PER_PAGE; ++cIndex)
{
aryCurrentInfoList[cIndex].m_dwGID = 0;
}
return true;
}
unsigned short wVectorSize = static_cast<unsigned short>(sortVector.size());
switch (cSortCmd)
{
case Guild::GUILD_FAME:
{
unsigned char cIndex = 0;
unsigned short wRank = wStartOfPage;
for (; cIndex < PktGuildList::MAX_NUM_PER_PAGE && wRank < wVectorSize; ++cIndex, ++wRank)
{
CGuild* lpGuild = GetGuild(sortVector[wRank].first);
if (NULL == lpGuild)
{
ERRLOG1(g_Log, "GID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><20><>Ʈ <20><><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", sortVector[wRank].first);
break;
}
aryCurrentInfoList[cIndex] = lpGuild->GetLargeInfo(cIndex, wRank + 1, lpMyGuild);
}
break;
}
case Guild::GUILD_NAME:
{
GuildNameMap::iterator it = m_GuildNameMap.begin();
std::advance(it, wStartOfPage);
for (unsigned char cIndex = 0; cIndex < PktGuildList::MAX_NUM_PER_PAGE && it != m_GuildNameMap.end();
++cIndex, ++it)
{
CGuild* lpGuild = it->second;
if (NULL == lpGuild) { break; }
for (unsigned short wRank = 0; wRank < wGuildNum; ++wRank)
{
if (sortVector[wRank].second == lpGuild)
{
aryCurrentInfoList[cIndex] = lpGuild->GetLargeInfo(cIndex, wRank + 1, lpMyGuild);
break;
}
}
}
break;
}
case Guild::GUILD_HOSTILITY:
{
if ( NULL != lpMyGuild )
{
unsigned short wGuildNum = static_cast<unsigned short>(m_GuildNameMap.size());
std::vector<unsigned long> sortVector;
sortVector.reserve(wGuildNum);
unsigned char cRelationByMine, cRelationByTarget ;
for (GuildNameMap::iterator it = m_GuildNameMap.begin(); it != m_GuildNameMap.end(); ++it)
{
CGuild* lpGuild = it->second;
if (NULL == lpGuild) { break; }
cRelationByMine = lpMyGuild->GetRelation( lpGuild->GetGID() ) ;
cRelationByTarget = lpGuild->GetRelation( lpMyGuild->GetGID() ) ;
if (Guild::HOSTILITY == cRelationByMine ||
Guild::ALERT_HOSTILITY == cRelationByMine ||
Guild::COUNTER_HOSTILITY == cRelationByMine ||
Guild::TARGET_NEUTRALITY == cRelationByMine ||
Guild::HOSTILITY == cRelationByTarget ||
Guild::ALERT_HOSTILITY == cRelationByTarget ||
Guild::COUNTER_HOSTILITY == cRelationByTarget ||
Guild::TARGET_NEUTRALITY == cRelationByTarget)
{
sortVector.push_back(lpGuild->GetGID());
}
}
if (true == sortVector.empty())
{
for (unsigned char cIndex = 0; cIndex < PktGuildList::MAX_NUM_PER_PAGE; ++cIndex)
{
aryCurrentInfoList[cIndex].m_dwGID = 0;
}
return true;
}
unsigned short wVectorSize = static_cast<unsigned short>(sortVector.size());
unsigned char cIndex = 0;
unsigned short wRank = wStartOfPage;
for (; cIndex < PktGuildList::MAX_NUM_PER_PAGE && wRank < wVectorSize; ++cIndex, ++wRank)
{
CGuild* lpGuild = GetGuild(sortVector[wRank]);
if (NULL == lpGuild)
{
ERRLOG1(g_Log, "GID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><20><>Ʈ <20><><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", sortVector[wRank]);
break;
}
aryCurrentInfoList[cIndex] = lpGuild->GetLargeInfo(cIndex, wRank + 1, lpMyGuild);
}
}
break;
}
case Guild::GUILD_NEUTRALITY:
{
if ( NULL != lpMyGuild )
{
unsigned short wGuildNum = static_cast<unsigned short>(m_GuildNameMap.size());
std::vector<unsigned long> sortVector;
sortVector.reserve(wGuildNum);
unsigned char cRelationByMine, cRelationByTarget ;
for (GuildNameMap::iterator it = m_GuildNameMap.begin(); it != m_GuildNameMap.end(); ++it)
{
CGuild* lpGuild = it->second;
if (NULL == lpGuild) { break; }
cRelationByMine = lpMyGuild->GetRelation( lpGuild->GetGID() ) ;
cRelationByTarget = lpGuild->GetRelation( lpMyGuild->GetGID() ) ;
if (Guild::NEUTRALITY == cRelationByMine && Guild::NEUTRALITY == cRelationByTarget)
{
sortVector.push_back(lpGuild->GetGID());
}
}
if (true == sortVector.empty())
{
for (unsigned char cIndex = 0; cIndex < PktGuildList::MAX_NUM_PER_PAGE; ++cIndex)
{
aryCurrentInfoList[cIndex].m_dwGID = 0;
}
return true;
}
unsigned short wVectorSize = static_cast<unsigned short>(sortVector.size());
unsigned char cIndex = 0;
unsigned short wRank = wStartOfPage;
for (; cIndex < PktGuildList::MAX_NUM_PER_PAGE && wRank < wVectorSize; ++cIndex, ++wRank)
{
CGuild* lpGuild = GetGuild(sortVector[wRank]);
if (NULL == lpGuild)
{
ERRLOG1(g_Log, "GID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><20><>Ʈ <20><><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", sortVector[wRank]);
break;
}
aryCurrentInfoList[cIndex] = lpGuild->GetLargeInfo(cIndex, wRank + 1, lpMyGuild);
}
}
break;
}
case Guild::GUILD_MINE:
{
if (NULL != lpMyGuild)
{
for (unsigned short wRank = 0; wRank < wGuildNum; ++wRank)
{
if (sortVector[wRank].second == lpMyGuild)
{
aryCurrentInfoList[0] = GuildLargeInfoNode(lpMyGuild->m_dwGID, 0, lpMyGuild->m_cInclination,
wRank + 1, lpMyGuild->m_dwFame, lpMyGuild->m_cLevel, lpMyGuild->GetCurrentMemberNum(),
lpMyGuild->GetMaster().m_strName, lpMyGuild->m_strName, lpMyGuild->m_szMark, MINE, MINE);
break;
}
}
}
break;
}
case Guild::GUILD_REQUEST:
{
for (unsigned char cIndex = 0; cIndex < PktGuildList::MAX_NUM_PER_PAGE; ++cIndex)
{
if (0 == aryCurrentInfoList[cIndex].m_dwGID) { break; }
GuildMap::iterator it = m_GuildMap.find(aryCurrentInfoList[cIndex].m_dwGID);
if (it == m_GuildMap.end())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. (<28><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
aryCurrentInfoList[cIndex].m_dwGID = 0;
continue;
}
CGuild* lpGuild = it->second;
if (NULL == lpGuild) { break; }
for (unsigned short wRank = 0; wRank < wGuildNum; ++wRank)
{
if (sortVector[wRank].second == lpGuild)
{
aryCurrentInfoList[cIndex] = lpGuild->GetLargeInfo(cIndex, wRank + 1, lpMyGuild);
break;
}
}
}
break;
}
default:
{
for (unsigned char cIndex = 0; cIndex < PktGuildList::MAX_NUM_PER_PAGE; ++cIndex)
{
aryCurrentInfoList[cIndex].m_dwGID = 0;
}
return false;
}
}
return true;
}
bool CGuildMgr::SerializeIn(char* lpBuffer_In, unsigned short wBufferSize_In, unsigned char cTotalMemberNum,
unsigned char cRelationByMineNum, unsigned char cRelationByTargetNum)
{
GuildInfoDB* lpGuildInfo = reinterpret_cast<GuildInfoDB *>(lpBuffer_In);
CGuild* lpGuild = new CGuild(*lpGuildInfo);
if (false == m_GuildMap.insert(GuildMap::value_type(lpGuild->GetGID(), lpGuild)).second)
{
delete lpGuild;
return false;
}
if (false == m_GuildNameMap.insert(GuildNameMap::value_type(std::string(lpGuild->GetName()), lpGuild)).second)
{
m_GuildMap.erase(lpGuild->GetGID());
delete lpGuild;
return false;
}
int nIndex = 0;
GuildMemberDB* lpGuildMember = reinterpret_cast<GuildMemberDB *>(lpGuildInfo + 1);
for (nIndex = 0; nIndex < cTotalMemberNum; ++nIndex, ++lpGuildMember)
{
lpGuild->JoinMemberDB(*lpGuildMember);
}
GuildRelationDB* lpGuildRelation = reinterpret_cast<GuildRelationDB*>(lpGuildMember);
for (nIndex = 0; nIndex < cRelationByMineNum + cRelationByTargetNum; ++nIndex, ++lpGuildRelation)
{
lpGuild->InsertRelation(lpGuildRelation->m_dwGID, lpGuildRelation->m_dwTargetGID, lpGuildRelation->m_cRelation);
}
return true;
}
bool CGuildMgr::SerializeOut(CGuild* lpGuild_In, char* lpBuffer_Out, unsigned short& wBufferSize_Out,
unsigned char& cTotalMemberNum, unsigned char& cRelationByMineNum, unsigned char& cRelationByTargetNum)
{
wBufferSize_Out = 0;
cTotalMemberNum = cRelationByMineNum = cRelationByTargetNum = 0;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GuildInfoDB* lpGuildInfoDB = reinterpret_cast<GuildInfoDB *>(lpBuffer_Out);
lpGuildInfoDB->m_dwGID = lpGuild_In->m_dwGID;
strncpy(lpGuildInfoDB->m_strName, lpGuild_In->m_strName, MAX_GUILD_NAME_LEN);
lpGuildInfoDB->m_cInclination = lpGuild_In->m_cInclination;
lpGuildInfoDB->m_cLevel = lpGuild_In->m_cLevel;
lpGuildInfoDB->m_dwFame = lpGuild_In->m_dwFame;
lpGuildInfoDB->m_dwGold = lpGuild_In->m_dwGold;
lpGuildInfoDB->m_tmLastLogout = lpGuild_In->m_tmLastLogout;
lpGuildInfoDB->m_tmCheckMember = lpGuild_In->m_tmCheckMember;
lpGuildInfoDB->m_tmGMLastLogout = lpGuild_In->m_tmGMLastLogout;
lpGuildInfoDB->m_tmChangeInclination = lpGuild_In->m_tmChangeInclination;
::memcpy(lpGuildInfoDB->m_szMark, lpGuild_In->m_szMark, MAX_MARK_SIZE);
::memcpy(lpGuildInfoDB->m_szRight, &lpGuild_In->m_GuildRight, sizeof(GuildRight));
wBufferSize_Out += sizeof(GuildInfoDB);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GuildMemberDB* lpGuildMemberDB = reinterpret_cast<GuildMemberDB *>(lpGuildInfoDB + 1);
for (MemberList::iterator MemberIt = lpGuild_In->m_MemberList.begin();
MemberIt != lpGuild_In->m_MemberList.end() && cTotalMemberNum < MAX_MEMBER_NUM;
++MemberIt, ++lpGuildMemberDB, ++cTotalMemberNum)
{
MemberInfo& memberInfo = *MemberIt;
lpGuildMemberDB->m_dwGID = lpGuild_In->m_dwGID;
lpGuildMemberDB->m_dwCID = memberInfo.m_dwCID;
strncpy(lpGuildMemberDB->m_strName, memberInfo.m_strName, MAX_MEMBER_NAME_LEN);
lpGuildMemberDB->m_dwRank = memberInfo.m_MemberListInfo.m_cRank;
lpGuildMemberDB->m_dwTitle = memberInfo.m_MemberListInfo.m_cTitle;
lpGuildMemberDB->m_cLevel = memberInfo.m_MemberListInfo.m_cLevel;
lpGuildMemberDB->m_wClass = memberInfo.m_MemberListInfo.m_cClass;
lpGuildMemberDB->m_cGuildWarFlag = memberInfo.m_MemberListInfo.m_cGuildWarFlag;
lpGuildMemberDB->m_dwFame = memberInfo.m_MemberDetailInfo.m_dwFame;
lpGuildMemberDB->m_dwGold = memberInfo.m_MemberDetailInfo.m_dwGold;
lpGuildMemberDB->m_LeaveGuildTime = memberInfo.m_LeaveGuildTime;
lpGuildMemberDB->m_cTactics = memberInfo.m_cTactics;
wBufferSize_Out += sizeof(GuildMemberDB);
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GuildRelationDB* lpGuildRelationDB = reinterpret_cast<GuildRelationDB *>(lpGuildMemberDB);
for (RelationMap::iterator itr = lpGuild_In->m_Relation[Guild::BY_MINE].begin();
itr != lpGuild_In->m_Relation[Guild::BY_MINE].end() && cRelationByMineNum < MAX_RELATION_NUM;
++itr, ++lpGuildRelationDB, ++cRelationByMineNum)
{
lpGuildRelationDB->m_dwGID = lpGuild_In->m_dwGID;
lpGuildRelationDB->m_dwTargetGID = itr->first;
lpGuildRelationDB->m_cRelation = itr->second;
wBufferSize_Out += sizeof(GuildRelationDB);
}
for (RelationMap::iterator itr = lpGuild_In->m_Relation[Guild::BY_TARGET].begin();
itr != lpGuild_In->m_Relation[Guild::BY_TARGET].end() && cRelationByTargetNum < MAX_RELATION_NUM;
++itr, ++lpGuildRelationDB, ++cRelationByTargetNum)
{
lpGuildRelationDB->m_dwGID = itr->first;
lpGuildRelationDB->m_dwTargetGID = lpGuild_In->m_dwGID;
lpGuildRelationDB->m_cRelation = itr->second;
wBufferSize_Out += sizeof(GuildRelationDB);
}
return true;
}

View File

@@ -0,0 +1,69 @@
#ifndef _GUILD_MGR_H_
#define _GUILD_MGR_H_
#pragma once
#include <string>
#include <Community/Guild/GuildStructure.h>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
struct GuildCheckSumNode;
struct GuildLargeInfoNode;
class CCharacter;
namespace Guild
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CGuild;
class CGuildMgr
{
public:
static CGuildMgr& GetInstance();
CGuildMgr(void);
~CGuildMgr(void);
bool Initialize(void);
void Destroy(void);
bool SerializeIn(char* lpBuffer_In, unsigned short wBufferSize_In,
unsigned char cTotalMemberNum, unsigned char cRelationByMineNum, unsigned char cRelationByTargetNum);
bool CreateGuild(unsigned long dwMasterID, unsigned long dwGuildID, unsigned char cInclination, char* szGuildName);
bool DissolveGuild(unsigned long dwGID);
CGuild* GetGuild(unsigned long dwGID);
CGuild* GetGuild(char* szName);
bool SetRelation(unsigned long dwGID, unsigned long dwTargetGID, unsigned char cRelationType);
void ProcessGuild(void);
bool SendGuildList(unsigned long dwCID, unsigned char cSortCmd, unsigned char cPage,
unsigned char cNum, GuildCheckSumNode* lpNode);
bool SendGuildRelationInfo(unsigned long dwCID, unsigned long dwGID);
bool GetMemberList(unsigned long dwGID, const MemberList* pMemberList);
protected:
bool GetSortingPageList(CCharacter* lpCharacter, unsigned char cSortCmd, unsigned char cPage,
GuildLargeInfoNode* aryCurrentInfoList);
bool SerializeOut(CGuild* lpGuild_In, char* lpBuffer_Out, unsigned short& wBufferSize_Out,
unsigned char& cTotalMemberNum, unsigned char& cRelationByMineNum, unsigned char& cRelationByTargetNum);
GuildMap m_GuildMap; // GID<49><44> <20>̿<EFBFBD><CCBF><EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD>
GuildNameMap m_GuildNameMap; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE>
private:
static CGuildMgr ms_this;
};
};
#endif

View File

@@ -0,0 +1,78 @@
#ifndef _GUILD_STRUCTURE_H_
#define _GUILD_STRUCTURE_H_
#include <map>
#include <vector>
#include <Community/Guild/GuildConstants.h>
namespace Guild
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CGuild;
struct MemberListInfo
{
unsigned char m_cRank; // <20><><EFBFBD><EFBFBD> (<28><> <20><><EFBFBD><EFBFBD><E5B3BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD>͸<EFBFBD> 0<><30><EFBFBD><EFBFBD> <20>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
unsigned char m_cTitle; // <20><><EFBFBD><EFBFBD> (Guild::Title<6C><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
unsigned char m_cLevel; // <20><><EFBFBD><EFBFBD>
unsigned char m_cClass; // Ŭ<><C5AC><EFBFBD><EFBFBD>
unsigned char m_cGuildWarFlag; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> (Creature::WarFlag<61><67> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
MemberListInfo()
: m_cRank(0), m_cTitle(0), m_cLevel(0), m_cClass(0), m_cGuildWarFlag(0)
{ }
MemberListInfo(unsigned char cRank, unsigned char cTitle, unsigned char cLevel, unsigned char cClass, unsigned char cGuildWarFlag)
: m_cRank(cRank), m_cTitle(cTitle), m_cLevel(cLevel), m_cClass(cClass), m_cGuildWarFlag(cGuildWarFlag)
{ }
};
struct MemberDetailInfo
{
unsigned long m_dwFame;
unsigned long m_dwGold;
MemberDetailInfo()
: m_dwFame(0), m_dwGold(0)
{ }
MemberDetailInfo(unsigned long dwFame, unsigned long dwGold)
: m_dwFame(dwFame), m_dwGold(dwGold)
{ }
};
struct MemberInfo
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwCID;
char m_strName[MAX_MEMBER_NAME_LEN];
// <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwServerID;
TIME m_LeaveGuildTime;
unsigned char m_cUpdateCount;
unsigned char m_cTactics;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ)
MemberListInfo m_MemberListInfo;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> Ƚ<><C8BD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ)
MemberDetailInfo m_MemberDetailInfo;
MemberInfo()
: m_dwCID(0), m_dwServerID(0), m_cUpdateCount(0), m_cTactics(0), m_MemberListInfo(), m_MemberDetailInfo()
{
std::fill_n(m_strName, int(MAX_MEMBER_NAME_LEN), 0);
::memset(&m_LeaveGuildTime, 0, sizeof(TIME));
}
};
typedef std::map<unsigned long, CGuild *> GuildMap;
typedef std::map<std::string, CGuild *> GuildNameMap;
typedef std::vector<MemberInfo> MemberList;
typedef std::map<unsigned long, unsigned char> RelationMap; // <GID, cRelation>
};
#endif

View File

@@ -0,0 +1,174 @@
#ifndef _GUILD_UTIL_H_
#define _GUILD_UTIL_H_
#include "GuildMgr.h"
#include "Guild.h"
namespace Guild
{
struct FnDeleteSecond
{
template<typename PairType>
bool operator() (PairType& pair)
{
if (NULL != pair.second)
{
delete pair.second;
}
return true;
}
};
struct IsCurrentMember
{
bool operator () (const MemberInfo& first) const
{
unsigned char cTitle = first.m_MemberListInfo.m_cTitle;
return (JOIN_WAIT != cTitle && 0 == first.m_cTactics);
}
};
struct IsCurrentLoginMember
{
bool operator () (const MemberInfo& first) const
{
return (0 != first.m_dwServerID);
}
};
struct IsTacticsMember
{
bool operator () (const MemberInfo& first) const
{
return (0 != first.m_cTactics);
}
};
struct IsNotTacticsMember
{
bool operator () (const MemberInfo& first) const
{
return (0 == first.m_cTactics);
}
};
struct SumMemberFame
{
unsigned long operator () (const unsigned long init, const MemberInfo& first) const
{
return ((true == IsCurrentMember()(first)) ? init + first.m_MemberDetailInfo.m_dwFame : init);
}
};
struct CompareGuildFame
{
bool operator () (const GuildMap::value_type& lhs, const GuildMap::value_type& rhs) const
{
return lhs.second->GetFame() > rhs.second->GetFame();
}
};
struct CompareMemberName
{
bool operator () (const MemberInfo& lhs, const MemberInfo& rhs) const
{
return std::string(lhs.m_strName) < std::string(rhs.m_strName);
}
};
struct CompareMemberTitle
{
bool operator () (const MemberInfo& lhs, const MemberInfo& rhs) const
{
if (lhs.m_MemberListInfo.m_cTitle == rhs.m_MemberListInfo.m_cTitle)
{
return CompareMemberName()(lhs, rhs);
}
return lhs.m_MemberListInfo.m_cTitle < rhs.m_MemberListInfo.m_cTitle;
}
};
struct CompareMemberClass
{
bool operator () (const MemberInfo& lhs, const MemberInfo& rhs) const
{
if (lhs.m_MemberListInfo.m_cClass == rhs.m_MemberListInfo.m_cClass)
{
return CompareMemberName()(lhs, rhs);
}
return lhs.m_MemberListInfo.m_cClass < rhs.m_MemberListInfo.m_cClass;
}
};
struct CompareMemberLevel
{
bool operator () (const MemberInfo& lhs, const MemberInfo& rhs) const
{
if (lhs.m_MemberListInfo.m_cLevel == rhs.m_MemberListInfo.m_cLevel)
{
return CompareMemberName()(lhs, rhs);
}
return lhs.m_MemberListInfo.m_cLevel > rhs.m_MemberListInfo.m_cLevel;
}
};
struct CompareMemberFame
{
bool operator () (const MemberInfo& lhs, const MemberInfo& rhs) const
{
if (lhs.m_MemberDetailInfo.m_dwFame == rhs.m_MemberDetailInfo.m_dwFame)
{
return CompareMemberName()(lhs, rhs);
}
return lhs.m_MemberDetailInfo.m_dwFame > rhs.m_MemberDetailInfo.m_dwFame;
}
};
struct CompareMemberGold
{
bool operator () (const MemberInfo& lhs, const MemberInfo& rhs) const
{
if (lhs.m_MemberDetailInfo.m_dwGold == rhs.m_MemberDetailInfo.m_dwGold)
{
return CompareMemberName()(lhs, rhs);
}
return lhs.m_MemberDetailInfo.m_dwGold > rhs.m_MemberDetailInfo.m_dwGold;
}
};
struct CompareMemberPosition
{
bool operator () (const MemberInfo& lhs, const MemberInfo& rhs) const
{
if (lhs.m_dwServerID == rhs.m_dwServerID)
{
return CompareMemberName()(lhs, rhs);
}
return lhs.m_dwServerID < rhs.m_dwServerID;
}
};
struct CompareRelation
{
bool operator () (const GuildHostilityInfoNode& lhs, const GuildHostilityInfoNode& rhs) const
{
if (lhs.m_cRelationType == rhs.m_cRelationType)
{
return std::string(lhs.m_szName) < std::string(rhs.m_szName);
}
return lhs.m_cRelationType > rhs.m_cRelationType;
}
};
}
#endif

File diff suppressed because it is too large Load Diff

View 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

View File

@@ -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);
}
}
}

View File

@@ -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