Code:
#ifndef __PARTY_H__
#define __PARTY_H__
#ifdef __CORESERVER
#include "Ar.h"
#include "projectcmn.h"
#endif // __CORESERVER
//#ifdef __WORLDSERVER
//#include "User.h"
//extern CUserMng g_UserMng;
//#endif // worldserver
#ifdef __PMA_PARTYFINDER
#include "WndPartyFinder.h"
#include "WndPartyFinder.cpp"
#endif
#include "mempooler.h"
#include <map>
// ¸ðµå(µ¥¹ÌÁö Áõ°¡, À¯´ÏÅ©, ÈÞ½Ä, ¾ÆÀÌÅÛ)
// 1, 2, 4, 8, 10, 12
#define PARTY_LINKATTACK_MODE 0 // ¸µÅ©¾îÅØ »óÅ : µ¥¹ÌÁö Áõ°¡
#define PARTY_FORTUNECIRCLE_MODE 1 // Æ÷Ãá¼*Ŭ »óÅ : À¯´ÏÅ© µå·ÓÈ®·ü
#define PARTY_STRETCHING_MODE 2 // ½ºÆ®·¹Äª »óÅ : ÈÞ½Ä 2¹è : ´ÜÀå ¾î½Ã½ºÆ® 3¹è
#define PARTY_GIFTBOX_MODE 3 // ±âÇÁÆ®¹Ú½º »óÅ : ¾ÆÀÌÅÛ ¾ç 2¹è
#if __VER >= 12 // __PARSKILL1001 //12Â÷ ÆÄ½ºÅ³ ¾ÆÀÌÅÛ ¼öÁ¤ world,core,neuz
#define PARTY_PARSKILL_MODE 4 // parskill »óÅ :´ÜÀå¿¡°Ô¼* ¸Ö¸®¶³¾îÁ®µµ »ç¿ë°¡´É
#define MAX_PARTYMODE 5
#else //__PARSKILL1001 //12Â÷ ÆÄ½ºÅ³ ¾ÆÀÌÅÛ ¼öÁ¤ world,core,neuz
#define MAX_PARTYMODE 4
#endif //__PARSKILL1001 //12Â÷ ÆÄ½ºÅ³ ¾ÆÀÌÅÛ ¼öÁ¤ world,core,neuz
#define PP_REMOVE 0
#define MAX_PTMEMBER_SIZE 15
#define MAX_PTMEMBER_SIZE_SPECIAL 8
#define PARTY_MAP_SEC 10
#define PARTY_MAP_LENGTH 10
#ifdef __PMA_PARTYFINDER
struct PARTYFINDER_LIST
{
u_long m_uPartyId; // ±Ø´Ü ID
TCHAR m_sParty[33]; // ±Ø´Ü ¸íĪ( ´Ü¸·±Ø´Ü : NO, ¼øÈ¸±Ø´Ü : YES )
int m_nSizeofMember; // ±Ø´Ü¿ø ¼ýÀÚ ( 2 ~ 8 )
LONG m_nLevel,m_nPoint; // ±Ø´Ü ·¹º§, °æÇèÄ¡, Æ÷ÀÎÆ®
u_long m_nLeaderId;
TCHAR m_sPartyList[33*MAX_PTMEMBER_SIZE_SPECIAL];
PARTYFINDER_LIST() {Init();};
~PARTYFINDER_LIST() {};
void Init() { memset( m_sParty, 0, sizeof(m_sParty) ); memset( m_sPartyList, 0, sizeof(m_sPartyList) ); m_nSizeofMember = m_nLevel = m_nPoint = m_nLeaderId = 0;};
};
#endif //__PMA_PARTYFINDER
class CParty;
extern CParty g_Party;
typedef struct _PartyMember // Ç÷¹ÀÌ¾î ¾ÆÀ̵𸸠°¡Áö°í ÀÖÀ½
{
u_long m_uPlayerId;
CTime m_tTime;
BOOL m_bRemove;
#if __VER < 11 // __SYS_PLAYER_DATA
LONG m_nLevel;
LONG m_nJob;
BYTE m_nSex;
TCHAR m_szName[20]; // ÇÑ±Û 8ÀÚ (¿µ¹® 16ÀÚ)
#endif // __SYS_PLAYER_DATA
#if defined( __WORLDSERVER ) || defined( __CLIENT )
D3DXVECTOR3 m_vPos;
#endif // defined( __WORLDSERVER ) || defined( __CLIENT )
_PartyMember()
{
m_uPlayerId = 0;
m_tTime = CTime::GetCurrentTime();
m_bRemove = FALSE;
#if __VER < 11 // __SYS_PLAYER_DATA
m_nLevel = m_nJob = 0;
m_szName[0] = '\0';
m_nSex = 0;
#endif // __SYS_PLAYER_DATA
#if defined( __WORLDSERVER ) || defined( __CLIENT )
m_vPos = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
#endif // #if defined( __WORLDSERVER ) || defined( __CLIENT )
}
} PartyMember, *PPartyMember;
class CParty
{
private:
public:
u_long m_uPartyId; // ±Ø´Ü ID
TCHAR m_sParty[33]; // ±Ø´Ü ¸íĪ( ´Ü¸·±Ø´Ü : NO, ¼øÈ¸±Ø´Ü : YES )
PartyMember m_aMember[MAX_PTMEMBER_SIZE]; // ÇѰ³ÀÇ ±Ø´ÜÀÇ ±Ø´Ü¿ø Á¤º¸
int m_nSizeofMember; // ±Ø´Ü¿ø ¼ýÀÚ ( 2 ~ 8 )
LONG m_nLevel, m_nExp, m_nPoint; // ±Ø´Ü ·¹º§, °æÇèÄ¡, Æ÷ÀÎÆ®
int m_nTroupsShareExp, m_nTroupeShareItem; // °æÇèÄ¡ ºÐ¹è¹æ½Ä, ¾ÆÀÌÅÛ ºÐ¹è¹æ½Ä
int m_nKindTroup; // ±Ø´Ü Á¾·ù : ´Ü¸·±Ø´Ü, ¼øÈ¸±Ø´Ü
int m_nReferens; // ±Ø´Ü¿¡ Æ÷ÇԵǾî ÀÖ´Â »óÅÂÀ϶§ °ÔÀÓ¿¡ ³ª°¬À»°æ¿ì 10ºÐÈÄ¿¡ Å»Åð °Ë»öÇÒ ÆÄƼ
int m_nModeTime[MAX_PARTYMODE]; // ¸ðµå ½Ã°£
int m_nGetItemPlayerId; // ¾ÆÀÌÅÛ ¾òÀº ij¸¯ÅÍ
u_long m_idDuelParty; // ÆÄƼ µà¾óÁßÀÌ¸é »ó´ë¹æ ÆÄƼÀÇ ID, ¾Æ´Ï¸é 0
#ifdef __WORLDSERVER
DWORD m_dwWorldId;
#endif // __WORLDSERVER
public:
#if !defined(__WORLDSERVER) && !defined(__CLIENT)
CRIT_SEC m_AddRemoveLock;
#endif
public:
// Constructions
CParty();
~CParty();
// Operations
void InitParty();
BOOL IsMember( u_long uPlayerId ) { return( FindMember( uPlayerId ) >= 0 ); }
int IsLeader( u_long uPlayerId ) { return( m_aMember[0].m_uPlayerId == uPlayerId ); }
int GetSizeofMember() { return m_nSizeofMember; }
int GetLevel() { return m_nLevel; }
int GetExp() { return m_nExp; }
int GetPoint() { return m_nPoint; }
u_long GetPlayerId( int i ) { return m_aMember[i].m_uPlayerId; }
#if defined( __WORLDSERVER ) || defined( __CLIENT )
D3DXVECTOR3 GetPos( int i ) { return m_aMember[i].m_vPos; }
void SetPos( int i, D3DXVECTOR3 vPos ) { m_aMember[i].m_vPos = vPos; }
#endif // #if defined( __WORLDSERVER ) || defined( __CLIENT )
#ifndef __CORESERVER
CMover* GetLeader( void );
#endif // __CORESERVER
// CUser *GetMember( int nIdx )
// {
// return g_UserMng.GetUserByPlayerID( m_aMember[nIdx].m_uPlayerId );
// }
void SetPartyId( u_long uPartyId ) { m_uPartyId = uPartyId ; }
#if __VER >= 11 // __SYS_PLAYER_DATA
BOOL NewMember( u_long uPlayerId );
#else // __SYS_PLAYER_DATA
BOOL NewMember( u_long uPlayerId, LONG nLevel, LONG nJob, BYTE nSex, LPSTR szName );
#endif // __SYS_PLAYER_DATA
BOOL DeleteMember( u_long uPlayerId );
#if !defined(__WORLDSERVER) && !defined(__CLIENT)
void Lock( void ) { m_AddRemoveLock.Enter(); }
void Unlock( void ) { m_AddRemoveLock.Leave(); }
#endif
void ChangeLeader( u_long uLeaderId );
void Serialize( CAr & ar );
void SwapPartyMember( int first, int Second );
#if __VER >= 12 // __JHMA_VER12_1 //12Â÷ ±Ø´ÜÀ¯·á¾ÆÀÌÅÛ
int GetPartyModeTime( int nMode );
void SetPartyMode( int nMode, DWORD dwSkillTime ,int nCachMode );
#else //12Â÷ ±Ø´ÜÀ¯·á¾ÆÀÌÅÛ
void SetPartyMode( int nMode, DWORD dwSkillTime );
#endif // //12Â÷ ±Ø´ÜÀ¯·á¾ÆÀÌÅÛ
void DoUsePartySkill( u_long uPartyId, u_long nLeaderid, int nSkill );
#ifdef __WORLDSERVER
void SetPartyLevel( CUser* pUser, DWORD dwLevel, DWORD dwPoint, DWORD dwExp );
void DoDuelPartyStart( CParty *pDst );
void DoDuelResult( CParty *pParty, BOOL bWin, int nAddFame, float fSubFameRatio );
void DoUsePartyReCall( u_long uPartyId, u_long nLeaderid, int nSkill );
void Replace( DWORD dwWorldId, D3DXVECTOR3 & vPos, BOOL bMasterAround );
void Replace( DWORD dwWorldId, LPCTSTR sKey );
BOOL ReplaceChkLv( int Lv );
void ReplaceLodestar( const CRect &rect );
#endif
void DoDuelPartyCancel( CParty* pDuelParty );
void GetPoint( int nTotalLevel, int nMemberSize, int nDeadLeavel );
// Attributes
int GetSize( void );
int FindMember( u_long uPlayerId );
private:
public:
#ifndef __VM_0820
#ifndef __MEM_TRACE
static MemPooler<CParty>* m_pPool;
void* operator new( size_t nSize ) { return CParty::m_pPool->Alloc(); }
void* operator new( size_t nSize, LPCSTR lpszFileName, int nLine ) { return CParty::m_pPool->Alloc(); }
void operator delete( void* lpMem ) { CParty::m_pPool->Free( (CParty*)lpMem ); }
void operator delete( void* lpMem, LPCSTR lpszFileName, int nLine ) { CParty::m_pPool->Free( (CParty*)lpMem ); }
#endif // __MEM_TRACE
#endif // __VM_0820
};
using namespace std;
typedef map< u_long, CParty*> C2PartyPtr;
typedef map<u_long, string> ULONG2STRING;
typedef map<string, u_long> STRING2ULONG;
class CPlayer;
class CPartyMng
{
private:
u_long m_id; // »õ·Î »ý¼ºµÇ´Â ÆÄƼ¿¡ ¼øÂ÷ÀûÀ¸·Î ¾ÆÀ̵𸦠ÇÒ´çÇϱâ À§ÇÑ º¯¼ö´Ù.
// CMapParty m_2Party;
// C2PartyPtr m_2PartyPtr;
#ifdef __WORLDSERVER
int m_nSecCount;
#endif // __WORLDSERVER
public:
#if !defined(__WORLDSERVER) && !defined(__CLIENT)
CRIT_SEC m_AddRemoveLock;
#endif
#ifdef __CORESERVER
EXPPARTY m_aExpParty[MAX_PARTYLEVEL];
#endif // __CORESERVER
ULONG2STRING m_2PartyNameLongPtr;
STRING2ULONG m_2PartyNameStringPtr;
public:
C2PartyPtr m_2PartyPtr; //__PMA_PARTYFINDER <--- normal ist es bei private oben definiert
// Constructions
CPartyMng();
~CPartyMng();
void Clear( void );
// Operations
u_long NewParty( u_long uLeaderId, LONG nLeaderLevel, LONG nLeaderJob, BYTE nLeaderSex, LPSTR szLeaderName, u_long uMemberId, LONG nMemberLevel, LONG nMemberJob, BYTE nMemberSex, LPSTR szMembername, u_long uPartyId = 0 );
BOOL DeleteParty( u_long uPartyId );
CParty* GetParty( u_long uPartyId );
#if !defined(__WORLDSERVER) && !defined(__CLIENT)
void Lock( void ) { m_AddRemoveLock.Enter(); }
void Unlock( void ) { m_AddRemoveLock.Leave(); }
#endif
void Serialize( CAr & ar );
// Attributs
int GetSize( void );
#ifdef __CORESERVER
public:
HANDLE m_hWorker;
HANDLE m_hCloseWorker;
public:
BOOL IsPartyNameId( u_long uidPlayer );
BOOL IsPartyName( const char* szPartyName );
LPCSTR GetPartyString( u_long uidPlayer );
u_long GetPartyID( const char* szPartyName );
void AddPartyName( u_long uidPlayer, const char* szPartyName );
BOOL CreateWorkers( void );
void CloseWorkers( void );
static UINT _Worker( LPVOID pParam );
void Worker( void );
void RemovePartyName( u_long uidPlayer, const char* szPartyName );
void AddConnection( CPlayer* pPlayer );
void RemoveConnection( CPlayer* pPlayer );
#endif // __CORESERVERE
#ifdef __WORLDSERVER
void PartyMapInfo( void );
#endif // __WORLDSERVER
};
#endif // _PARTY_H