DragonNest/Server/ServerCommon/DNGuildBase.h
2024-12-19 09:48:26 +08:00

182 lines
No EOL
7.5 KiB
C++

#pragma once
#include "Access.h"
#include "DNGuildSystem.h"
#include "DNDBConnection.h"
#include "DNMasterConnection.h"
#include "DNUserBase.h"
#include "BitSetEx1.hpp"
class CDNGuildSystem;
class CDNGuildBase
{
public:
CDNGuildBase();
virtual ~CDNGuildBase();
DWORD Open(CDNGuildSystem* pManager);
bool IsOpen() const {return m_bOpen;}
void Close();
void Release();
virtual void Reset();
// TGuild
void Set(const TGuild* pInfo);
bool IsSet() {return m_Info.IsSet();}
const TGuildUID& GetUID() {return m_Info.GuildView.GuildUID;}
// Access
CSyncLock* GetLock() const {return m_Access.GetLock();}
#if !defined( PRE_ADD_NODELETEGUILD )
void Attach();
void Detach();
void DisableAttach();
void DisableAttachNoLock();
void DetachWork();
bool IsAttach() const;
bool IsEnable() const;
DWORD GetAccessCount() const;
#endif
void ResetAccess(); // 액세스 재활성화
// INFO
const TGuild* GetInfo() const;
TGuild* SetInfo();
// UPDATE
void DoUpdate(DWORD CurTick);
#if defined(_DEBUG)
bool IsLock() const;
bool m_bSkipDisableOnDebugging; // 디버깅 중 길드 자원 해제 방지 여부
#endif // _DEBUG
void SetGuildInfoAuth(int pGuildRoleAuth[GUILDROLE_TYPE_CNT]) const;
void SetGuildInfoAuth(eGuildRoleType pGuildRoleType, int pGuildAuth);
void SetGuildInfoAuth(eGuildRoleType pGuildRoleType, eGuildAuthType pGuildAuthType);
void ResetGuildInfoAuth(eGuildRoleType pGuildRoleType, eGuildAuthType pGuildAuthType);
bool CheckGuildInfoAuth(eGuildRoleType pGuildRoleType, eGuildAuthType pGuildAuthType) const;
short GetGuildMemberSize() const;
// SEND
virtual void SendAddGuildMember(UINT nAccountDBID, INT64 nCharacterDBID, LPCWSTR lpwszCharacterName, TP_JOB nJob, char cLevel, __time64_t pJoinDate, TCommunityLocation* pLocation) = 0;
virtual void SendDelGuildMember(UINT nAccountDBID, INT64 nCharacterDBID, bool bIsExiled) = 0;
virtual void SendChangeGuildInfo(UINT nAccountDBID, INT64 nCharacterDBID, BYTE btGuildUpdate, int iInt1, int iInt2, int iInt3, int iInt4, INT64 biInt64, LPCWSTR pText) {};
virtual void SendChangeGuildMemberInfo(UINT nReqAccountDBID, INT64 nReqCharacterDBID, UINT nChgAccountDBID, INT64 nChgCharacterDBID, BYTE btGuildMemberUpdate, int iInt1, int iInt2, INT64 biInt64, LPCWSTR pText) = 0;
virtual void SendGuildChat(UINT nAccountDBID, INT64 nCharacterDBID, LPCWSTR lpwszChatMsg, short nLen) = 0;
#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
virtual void SendDoorsGuildChat(INT64 nCharacterDBID, LPCWSTR lpwszChatMsg, short nLen) = 0;
#endif //#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
virtual void SendChangeGuildName(const wchar_t* wszGuildName) = 0;
virtual void SendChangeGuildMark(const MAGuildChangeMark *pPacket) = 0;
virtual void SendExtendGuildWare(short wTotalSize) {};
virtual void SendGuildLevelUp(int nLevel) = 0;
virtual void SendUpdateGuildExp(BYTE cPointType, int nPointValue, int nGuildExp, INT64 biCharacterDBID = 0, int nMissionID = 0) = 0;
virtual void SendGuildRewardItem( TGuildRewardItem* GuildRewardItem ) = 0;
virtual void SendAddGuildRewardItem( TGuildRewardItem GuildRewardItem ) = 0;
virtual void SendExtendGuildSize(short nGuildSize) = 0;
// DB
virtual void ReqGetGuildWareInfo(bool bForceReq = false) {}
// RECV
virtual void RecvCsCloseGuildWare(CDNUserSession * pSession) {};
virtual void RecvApiOpenGuildWare(CDNUserSession * pSession) {};
virtual void RecvCsGetGuildWareHistory(CDNUserSession * pSession, CSGetGuildWareHistory *pPacket) {};
// RECV FROM DB
void DBRecv();
// UPDATE
void UpdateMember(TAGetGuildMember *pPacket);
void UpdateGuildExp(const MAUpdateGuildExp* pPacket);
virtual void UpdateWarInfoOnAllMember(short wScheduleID, BYTE cTeamColorCode) = 0;
virtual void UpdateGuildInfo(CDNUserSession* pSession, const TAChangeGuildInfo *pPacket) {}
virtual void UpdateMemberInfo(CDNUserSession* pSession, const TAChangeGuildMemberInfo *pPacket) {}
virtual void OpenWare(const TAGetGuildWareInfo* pPacket) {}
virtual void UpdateWareSize(CDNUserBase* pUserObject, short wSize) {}
// MEMEBER
bool AddMember(const TGuildMember* pGuildMember, TCommunityLocation* pLocation=NULL);
bool AddMemberAsync(const TGuildMember* pGuildMember, TCommunityLocation* pLocation=NULL);
void DelMember(INT64 nCharacterDBID);
void UpdateMemberLevel(INT64 nCharacterDBID, char cLevel);
void UpdateMemberName(INT64 nCharacterDBID, const WCHAR* wszName);
INT64 UpdateMemberCoin(INT64 nCharacterDBID, INT64 nMoveCoin, __time64_t tUseDate);
void ResetMemberWareVersion(INT64 nCharacterDBID);
bool IsMemberExist(INT64 nCharacterDBID, TGuildMember* pGuildMember = NULL) const;
bool IsMemberAddable() const;
int GetMemberCount() const;
void GetMemberList(std::vector <std::pair<UINT, INT64>, boost::pool_allocator<UINT>>& pList) const;
void SetMemberList(TGuildMember *GuildMember);
TGuildMember* GetMemberInfo(INT64 nCharacterDBID);
TGuildMember* GetMemberInfoAsync(INT64 nCharacterDBID);
// POINT
bool AddPoint(char cPointType, int nPointValue, INT64 biCharacterDBID = 0, int nMissionID = 0);
int GetExp() {return m_Info.iTotalGuildExp;}
CDNDBConnection* GetDBCon() {return m_pDBCon;};
BYTE GetDBThreadID() {return m_cDBThreadID;}
void ResetCheckEmpty() {m_bCheckEmpty = false;}
short GetWareSize() {return m_Info.wGuildWareSize;}
short GetLevel() {return m_Info.wGuildLevel;}
virtual void GuildWarReset();
inline short GetGuildWarScheduleID() { return m_wGuildWarScheduleID; };
inline void SetGuildWarScheduleID(short wScheduleID) { m_wGuildWarScheduleID = wScheduleID;};
bool IsEnrollGuildWar();
void SetGuildWarRewardResults(bool* pRewardResults );
void SetGuildWarRewardResultIndex(char cRewardType, bool bResult);
bool GetGuildWarRewardEnable(char cRewardType);
void SetGuildRewardItem(TGuildRewardItem* GuildRewardItem); // 길드보상아이템 적용 목록
void AddGuildRewardItem( int nItemID, __time64_t tExpireDate, TGuildRewardItem &GuildRewardItem, CDNUserSession* pSession = NULL ); // 길드보상아이템 구입 적용
TGuildRewardItem* GetGuildRewardItem(); // 길드보상아이템 적용 목록
void SetGuildMaster(TGuildMember *GuildMaster) { m_GuildMaster = GuildMaster;};
TGuildMember* GetGuildMaster() { return m_GuildMaster; };
void SetRecvAllMember( bool bAllRecv ) {m_bRecvAllMember = bAllRecv;}; // 길드원목록 다 받았는지 체크
bool GetRecvAllMember() {return m_bRecvAllMember;}; // 길드원목록 다 받았는지 체크
void CheckGuildInfo();
#if defined(PRE_ADD_GUILD_CONTRIBUTION)
bool IsAddGuildExp(char cPointType, int nPointValue, OUT int& nAddPoint, OUT int& nLimitPoint);
#endif // #if defined(PRE_ADD_GUILD_CONTRIBUTION)
protected:
virtual void SendGuildMemberLoginList(SCGuildMemberLoginList* pPacket) = 0;
virtual bool CheckGuildResource(TGuildMember* aGuildMemeber);
protected:
TGuild m_Info; // 길드정보
CDNDBConnection* m_pDBCon; // DB 커넥션
BYTE m_cDBThreadID; // DB 쓰레드아이디
std::map<INT64, TGuildMember> m_MapTotalMember; // 전체 길드원 정보 목록
CDNGuildSystem* m_pManager; // 관리자 객체
private:
bool UpdateMemberState(TGuildMember* aGuildMember);
private:
bool m_bOpen; // 길드객체 생성여부
CAccess m_Access; // 접근참조 관리
DWORD m_TickCheckMember; // 멤버체크
bool m_bCheckEmpty; // 자원해제 체크
short m_wGuildWarScheduleID; // 길드전 스케쥴ID
bool m_bRewardResults[GUILDWAR_REWARD_GUILD_MAX]; // 저장된 길드보상 결과
TGuildMember *m_GuildMaster; // 길드 마스터
bool m_bRecvAllMember;
};