#pragma once #include #include #include #include #include #include #include "GameDBManager.h" #include "StructGold.h" #include "StructPlayer.h" class GuildManager { public: enum { MAX_GUILD_MEMBER = 200, PERMISSION_SET_TYPE_COUNT = 6, // 멤버 권한 등급 종류 수 }; enum _PERMISSION { PERMISSION_NONE = 0, // 권한 없음(길드 소속이 아니거나 권한 정보가 부여되지 않은 경우) PERMISSION_MEMBER_LEAST = 1, // 길드 멤버 권한 중 최소 권한 PERMISSION_MEMBER_MAX = 6, // 길드 멤버 권한 중 최대 권한 PERMISSION_LEADER = 7, // 길드장 권한 }; enum _PERMIT_REQUIRED_ACTION { PRA_SET_PERMISSION_NAME = 1 << 0, // 길드 권한 등급의 이름 변경 PRA_MEMBER_INVITE = 1 << 1, // 길드원 초대 PRA_MEMBER_KICK = 1 << 2, // 길드원 추방 PRA_GRANT_REVOKE_PERMISSION = 1 << 3, // 길드원 승급/강등 PRA_DUNGEON_MANAGEMENT = 1 << 4, // 던전 관리 PRA_REQUEST_DUNGEON_RAID = 1 << 5, // 던전 레이드 신청 PRA_ATTACK_TEAM_CREATE = 1 << 6, // 공격대 결성 PRA_ATTACK_TEAM_JOIN = 1 << 7, // 공격대 참가 PRA_NOTICE = 1 << 8, // 길드 공지 PRA_MEMBER_MEMO = 1 << 9, // 길드원 메모 작성/수정 PRA_ALLIANCE_MANAGEMENT = 1 << 10, // 길드 연합 관리(마스터 길드용) PRA_ALLIANCE_JOIN = 1 << 11, // 길드 연합 가입(길마 대행 연합 가입) PRA_ALLIANCE_LEAVE = 1 << 12, // 길드 연합 탈퇴(길마 대행 연합 탈퇴) PRA_UPDATE_GUILD_ICON = 1 << 13, // 길드 아이콘 변경 PRA_ADVERTISE_MANAGEMENT = 1 << 14, // 길드 광고 관리 PRA_BUFF = 1 << 15, }; enum _ADVERTISE_TYPE { ADV_TYPE_NONE = 0, // 광고 안 함 ADV_TYPE_LIST_ONLY = 1, // 길드 목록에만 공개 ADV_TYPE_NORMAL = 2, // 길드 목록 + 일반 광고 등록 ADV_TYPE_PREMIUM = 3 // 길드 목록 + 프리미엄 광고 등록 }; struct GuildMemberTag { bool bIsOnline; PlayerUID sid; int nLevel; // 오프라인 멤버 참조용 int nJobId; // 오프라인 멤버 참조용 char nPermission; std::string strMemo; int nPoint; int nTotalPoint; GuildMemberTag( PlayerUID _sid, int lv, int job, char permission, const char * pszMemo, int point, int totalPoint ) : sid( _sid ) , nLevel( lv ) , nJobId( job ) , nPermission( permission ) , bIsOnline( false ) , strMemo( pszMemo ) , nPoint( point ) , nTotalPoint( totalPoint ) { } }; struct GuildFunctor { virtual bool operator()( AR_HANDLE handle ) = 0; }; struct GuildMemberTagFunctor { virtual bool operator()( GuildMemberTag * pMemberTag ) = 0; }; struct GuildListFunctor { virtual bool operator()( int nGuildID, const char * szGuildName, const char * szGuildLeaderName, int nGuildLeaderLevel, int nGuildMemberCount, int nRaidDungeonID ) = 0; }; enum { DEFAULT_MAX_ALLIANCE_CNT = 3, }; struct GuildInfo; struct AllianceInfo { AllianceInfo() { nAllianceID = 0; nLeadGuildID = 0; nAlliancePassword = 0; nMaxAllianceCnt = 0; nNameChanged = 0; #ifdef _MEM_USAGE_DEBUG XSEH::IncreaseAllocCount( "AllianceInfo" ); #endif } ~AllianceInfo() { #ifdef _MEM_USAGE_DEBUG XSEH::DecreaseAllocCount( "AllianceInfo" ); #endif } int nAllianceID; int nLeadGuildID; std::string strAllianceName; int nAlliancePassword; int nMaxAllianceCnt; int nNameChanged; std::vector< GuildManager::GuildInfo * > vGuildList; }; struct GuildInfo { GuildInfo() { nGuildPassword = 0; nGuildId = 0; nLeaderSID = 0; nLeaderLevel = 0; nIconSize = 0; nBannerSize = 0; eAdvertiseType = ADV_TYPE_NONE; tAdvertiseEnd = 0; bRecruiting = false; nMinRecruitLevel = 0; nMaxRecruitLevel = 0; nNameChanged = 0; nDungeonId = 0; tDungeonBlockTime = 0; nChaos = 0; pAllianceInfo = NULL; tAllianceBlockTime = 0; nDonationPoint = 0; ::memset( aPermissionSet, 0, sizeof( aPermissionSet ) ); nGrade = 0; nPoint = 0; #ifdef _MEM_USAGE_DEBUG XSEH::IncreaseAllocCount( "GuildInfo" ); #endif } ~GuildInfo() { #ifdef _MEM_USAGE_DEBUG XSEH::DecreaseAllocCount( "GuildInfo" ); #endif } int nGuildPassword; int nGuildId; std::string strGuildName; std::string strNotice; std::string strURL; int nLeaderSID; int nLeaderLevel; std::string strIconFileName; // game015_0000005849_100326_111217.jpg 형식 - 서버명_길드SID(10자리)_년월일_시분초.jpg int nIconSize; std::string strBannerFileName; int nBannerSize; _ADVERTISE_TYPE eAdvertiseType; time_t tAdvertiseEnd; std::string strAdvertiseComment; bool bRecruiting; short nMinRecruitLevel; short nMaxRecruitLevel; int nNameChanged; int nDungeonId; time_t tDungeonBlockTime; StructGold nGold; int nChaos; std::vector< GuildMemberTag > vMemberNameList; std::vector< AR_HANDLE > vOnlineList; AllianceInfo * pAllianceInfo; time_t tAllianceBlockTime; int nDonationPoint; std::string aPermissionName[ PERMISSION_SET_TYPE_COUNT ]; int aPermissionSet[ PERMISSION_SET_TYPE_COUNT ]; int nGrade; int nPoint; }; static GuildManager & GetInstance(); bool Init(); bool DeInit(); int Buff( int nGuildID, int value, struct StructPlayer* pPtr ); int Donate( int nGuildID, int value, struct StructPlayer* pPtr ); int GetGuildID( const char *szGuildName ); void ForceChangeGuildName( int nGuildID, const char * szGuildName ); void ChangeGuildName( int nGuildID, const char * szGuildName, struct StructPlayer *pPtr ); void onChangeGuildName( int nGuildID, const char * szGuildName, struct StructPlayer *pPtr ); void onChangeGuildNameFailed( const int nGuildID ); bool TryMakeGuild( const char *szGuildName, StructPlayer * pLeader, const bool bEnrollInGuildList, const bool bRecruiting ); bool onInsertGuildSuccessed( GuildInfo* pInfo, AR_HANDLE hLeader ); void onInsertGuildFailed( GuildInfo* pInfo ); bool DestroyGuild( int nGuildID ); unsigned short IsDestroyableGuild( const int nGuildID ); const std::string GetGuildNotice( const int nGuildID ) const; const bool SetGuildNotice( const int nGuildID, const char * pszNotice ); const std::string GetGuildURL( const int nGuildID ) const; const bool SetGuildURL( const int nGuildID, const char * pszURL ); const int GetGuildGrade( const int nGuildID ) const; const int GetGuildPoint( const int nGuildID ) const; const bool SetGuildGradePoint( const int nGuildID, int nGrade, int nPoint ); bool SetRaidDungeonID( int nGuildID, int nDungeonID ); int GetRaidDungeonID( int nGuildID ); bool SetDungeonBlockTime( int nGuildID, time_t tDungeonBlockTime ); time_t GetDungeonBlockTime( int nGuildID ); int GetMemberCount( int nGuildID ); const std::string GetMemberMemo( const int nGuildID, const PlayerUID nPlayerUID ) const; const bool SetMemberMemo( const int nGuildID, const char * pszPlayerName, const char * pszMemo ); bool IsExistAlliance( const char * szName ); bool CreateAlliance( int nGuildID, const char * szName ); void ChangeAllianceName( int nAllianceID, const char * szNewName, StructPlayer *pPtr ); void onChangeAllianceName( int nAllianceID, const char * szNewName, StructPlayer *pPtr ); void onChangeAllianceNameFailed( const int nAllianceID ); bool AddToAlliance( int nAllianceID, int nGuildID ); bool LeaveAlliance( int nGuildID ); int GetAllianceID( int nGuildID ); int GetAllianceLeaderGuildID( int nAllianceID ); bool IsAllianceLeader( int nAllianceID, int nGuildID ); int GetAlliancePassword( int nAllianceID ); int GetMaxAllianceCount( int nAllianceID ); bool IncMaxAllianceCount( int nAllianceID ); int GetAllianceMemberGuildCount( int nAllianceID ); int GetAllianceMemberPlayerCount( int nAllianceID ); bool DestroyAlliance( int nAllianceID ); std::string GetAllianceName( int nAllianceID ); std::vector< int > GetAllianceMemberID( int nAllianceID ); bool SetGuildAllianceBlockTime( int nGuildID, time_t tAllianceBlockTime ); bool IsInGuildAllianceBlockTime( int nGuildID ); void OnChangeCharacterName( int nGuildID, const PlayerUID nPlayerUID, const char * szNewName ); void OnChangeCharacterLevel( int nGuildID, const PlayerUID nPlayerUID, const int nLevel ); void OnChangeCharacterJob( int nGuildID, const PlayerUID nPlayerUID, const int nJobId ); void LoadGuildIconInfo( int nGuildID ); void LoadGuildBannerInfo( int nGuildID ); void GiveTax( int nGuildID, const StructGold & nTax, int nChaos ); const StructGold GetTaxAmount( int nGuildID ); int GetTaxChaosAmount( int nGuildID ); const StructGold DrawTax( int nGuildID ); int DrawTaxChaos( int nGuildID, int nChaos ); bool GetMemberInfo( int nGuildID, const char* szPlayerName, GuildManager::GuildMemberTag * pMemberInfo ); int GetGuildPassword( int nGuildID ); std::string GetGuildName( int nGuildID ); bool SetGuildIconInfo( int nGuildID, const char * szIconFileName, int nIconSize ); const std::string GetGuildIconFileName( int nGuildID ) const; const int GetGuildIconSize( int nGuildID ) const; bool SetGuildBannerInfo( int nGuildID, const char * szBannerFileName, int nBannerSize ); const std::string GetGuildBannerFileName( int nGuildID ) const; const int GetGuildBannerSize( int nGuildID ) const; const _ADVERTISE_TYPE GetGuildAdvertiseType( const int nGuildID ) const; const time_t GetGuildAdvertiseEndTime( const int nGuildID ) const; const bool SetGuildAdvertise( const int nGuildID, const _ADVERTISE_TYPE eType, const time_t tEnd ); const std::string GetGuildAdvertiseComment( const int nGuildID ) const; const bool SetGuildAdvertiseComment( const int nGuildID, const char * pszComment ); const bool IsRecruitingGuild( const int nGuildID ) const; const bool SetGuildRecruiting( const int nGuildID, const bool bRecruiting, const short nMinRecruitLevel, const short nMaxRecruitLevel, const bool bSkipDBUpdate = false ); const bool IsLeader( int nGuildID, const PlayerUID nPlayerUID ) const; const bool IsMember( int nGuildID, const char *szPlayerName ) const; bool Promote( int nGuildID, struct StructPlayer *pPtr ); // 아래는 GM툴 용 강제 길마 변경(조건 검사 부분이 위의 Promote와 조금 다름 unsigned short Promote( const int nGuildID, const PlayerUID nNewLeaderUID ); const bool SetPermission( const int nGuildID, const char * szPlayerName, const char nPermission ); const char GetPermission( const int nGuildID, const char * szPlayerName ) const; const bool IsPermitted( const int nGuildID, const char nPermission, const _PERMIT_REQUIRED_ACTION ePRA ) const; void SetPermissionName( const int nGuildID, const char nPermission, const char * pszName ); const std::string GetPermissionName( const int nGuildID, const char nPermission ) const; void SetPermissionSet( const int nGuildID, const char nPermission, const int nPermissionSet ); const int GetPermissionSet( const int nGuildID, const char nPermission ) const; int GetMaxLevel( int nGuildID ); int GetMinLevel( int nGuildID ); int GetTotalLevel( int nGuildID ); const PlayerUID GetLeaderSID( const int nGuildID ); bool JoinGuild( int nGuildID, struct StructPlayer *pPtr ); bool LeaveGuild( int nGuildID, const char *szName ); bool onLogin( int nGuildID, struct StructPlayer *pPtr ); bool onLogout( int nGuildID, struct StructPlayer *pPtr ); size_t DoEachGuild( GuildListFunctor & _fo ); size_t DoEachAllianceGuild( int nAllianceID, GuildListFunctor & _fo ); size_t DoEachMember( int nGuildID, GuildFunctor & _fo ); size_t DoEachMemberTag( int nGuildID, GuildMemberTagFunctor & _fo ); void GetNearMember( struct StructPlayer *pPtr, AR_UNIT distance, std::vector< StructPlayer* > & vList ); void GetOfflineMember( int nGuildID, std::vector< GuildMemberTag > & vList ); bool IsExistGuild( const char *szGuildName ); bool AddGuildDonationPoint( const int nGuildID, const int nPoint ); void Push( GameDBManager::DBProc* pWork ); void onEndQuery(); const GuildInfo * getGuildInfo( const char *szGuildName ) const; GuildInfo * getGuildInfo( const char *szGuildName ); const GuildInfo * getGuildInfo( const int nGuildID ) const; GuildInfo * getGuildInfo( const int nGuildID ); inline XCriticalSection& GetLock() { return m_IntfLock; } GuildManager(); virtual ~GuildManager(); protected: void loadAllianceList(); void loadGuildMemberTagList(); int _getGuildMemberTagList( const int guild_id, std::vector< GuildManager::GuildMemberTag > & result ); int getUserIndexInGuild( const int guild_id, const PlayerUID user_sid ); void loadGuildList(); void finishLoading(); bool updateGuildInfo( int nGuildID, const char * szIconFileName, int nIconSize ); bool updateGuildBannerInfo( int nGuildID, const char * szBannerFileName, int nBannerSize ); AllianceInfo * makeAlliance( int nAllianceId, int nLeadGuildId, const char * szName, int nMaxAllianceCnt, int nNameChanged ); AllianceInfo * getAllianceInfo( int nAllianceId ); AllianceInfo * getAllianceInfo( const char * szName ); unsigned short isDestroyableGuild( GuildInfo *pInfo ); bool leaveGuild( GuildInfo *pInfo, const char *szName ); bool joinGuild( GuildInfo *pInfo, struct StructPlayer *pPtr ); bool destroyGuild( GuildInfo *pInfo ); GuildInfo * makeGuild( int nGuildID, const char *szGuildName, const char *szGuildNotice, const char *szGuildURL, const char *szIconFileName, int nIconSize, const char *szBannerFileName, int nBannerSize, _ADVERTISE_TYPE eAdvertiseType, const char *szAdvertiseComment, time_t tAdvertiseEnd, const bool bRecruiting, const short nMinRecruitLevel, const short nMaxRecruitLevel, const int name_changed, const int dungeon_id, const time_t dungeon_block_time, const StructGold & gold, const int chaos, time_t alliance_block_time, const int donation_point, const char * permission_name_1, const int permission_set_1, const char * permission_name_2, const int permission_set_2, const char * permission_name_3, const int permission_set_3, const char * permission_name_4, const int permission_set_4, const char * permission_name_5, const int permission_set_5, const char * permission_name_6, const int permission_set_6, int grade, int point ); GuildInfo* allocGuild( int nGuildID, const char *szGuildName, const char *szGuildNotice, const char *szGuildURL, const char *szIconFileName, int nIconSize, const char *szBannerFileName, int nBannerSize, _ADVERTISE_TYPE eAdvertiseType, const char *szAdvertiseComment, time_t tAdvertiseEnd, const bool bRecruiting, const short nMinRecruitLevel, const short nMaxRecruitLevel, const int name_changed, const int dungeon_id, const time_t dungeon_block_time, const StructGold & gold, const int chaos, time_t alliance_block_time, const int donation_point, const char * permission_name_1, const int permission_set_1, const char * permission_name_2, const int permission_set_2, const char * permission_name_3, const int permission_set_3, const char * permission_name_4, const int permission_set_4, const char * permission_name_5, const int permission_set_5, const char * permission_name_6, const int permission_set_6, int grade, int point ); bool registerGuild( GuildInfo* pInfo ); int allocGuildId(); int allocAllianceId(); size_t doEachMember( GuildInfo *pInfo, GuildFunctor & _fo ); size_t doEachMemberTag( GuildInfo *pInfo, GuildMemberTagFunctor & _fo ); bool signAsOnLine( GuildInfo *pInfo, struct StructPlayer *pPtr ); bool signAsOffLine( GuildInfo *pInfo, struct StructPlayer *pPtr ); volatile LONG m_nMaxGuildId; volatile LONG m_nMaxAllianceId; XCriticalSection m_QueryLock; mutable XCriticalSection m_IntfLock; KHash< GuildInfo*, hashPr_string_nocase > m_hshGuildName; KHash< GuildInfo*, hashPr_mod_int > m_hshGuildID; KHash< std::vector< GuildMemberTag > *, hashPr_mod_int > m_hshGuildMemberTagList; // 로딩에만 사용 std::vector< GuildInfo* > m_vGuildList; std::vector< AllianceInfo* > m_vAllianceList; std::list< GameDBManager::DBProc* > m_lQueryList; DBConnection m_DBConn; };