CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
1695 lines
52 KiB
C++
1695 lines
52 KiB
C++
#include "StdAfx.h"
|
|
|
|
#include <Struct.h>
|
|
#include <GuildServer.h>
|
|
#include "GuildManager.h"
|
|
#include "GuildMember.h"
|
|
#include "Guild.h"
|
|
#include "PacketStruct_GZ.h"
|
|
|
|
#include <GuildRightInfoParser.h>
|
|
#include <MaxGuildMemberInfoParser.h>
|
|
|
|
#include "GuildSmallContentEntry.h"
|
|
|
|
GuildManager g_GuildManager;
|
|
GuildManager::GuildManager(void)
|
|
{
|
|
m_GuildHash.Initialize( _MAX_GUILD_POOL_NUM );
|
|
m_GuildNameMap.clear();
|
|
}
|
|
|
|
GuildManager::~GuildManager(void)
|
|
{
|
|
}
|
|
|
|
// <070114, waverix>
|
|
// ????? ???? ?????? ??????? ???? ???? ?? ???.
|
|
// ???? ?? ???? ???? ??????? ServerFrame ????? ??? ?? ??? ????? ?????? ????.
|
|
#include <Sessions/DBProxyServerSession.h>
|
|
|
|
BOOL GuildManager::IsConnectedDBProxy()
|
|
{
|
|
DBProxyServerSession* pDBPServer = GuildServer::GetMainFrame()->ConnectSessions.SessionDBProxy();
|
|
if( pDBPServer && pDBPServer->IsConnected() )
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
RC::eGUILD_RESULT GuildManager::ChangeGuildNotice( DWORD dwKey, GUILDGUID GuildGuid, TCHAR *ptszNotice )
|
|
{
|
|
if( !IsConnectedDBProxy() ) return RC::RC_GUILD_CANNOT_CHANGEPOSITION_STATE;
|
|
Guild * pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_FAILED;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
// ?????
|
|
RC::eGUILD_RESULT GuildManager::CanRankUp( GUILDGUID GuildGuid, CHARGUID OperCharGuid, OUT GuildRankInfo& RankInfo )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??????? ???? ??????? ?????? ????? ??..
|
|
if( !CheckRight(GuildGuid,OperCharGuid,eGUILD_RIGHTS_RANKUP) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ??? ???? ??? ?????? ??????? ?? ????.
|
|
if(eGUILD_DELCHK_DESTROY_WAIT == pGuild->CheckGuildDeleteState())
|
|
return RC::RC_GUILD_DELCHK_DESTROY_WAIT;;
|
|
|
|
return pGuild->CanRankUp( RankInfo );
|
|
}
|
|
|
|
|
|
VOID GuildManager::RankUpGuild( GUILDGUID GuildGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::RankUpGuild] ??????? ???? ???? ?????. GuildGuid = %u", GuildGuid );
|
|
return;
|
|
}
|
|
|
|
pGuild->RankUp();
|
|
}
|
|
|
|
VOID GuildManager::SetGuildTransaction( GUILDGUID GuildGuid, eGUILD_TRANSACTION tran )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::SetGuildTransaction] Caution!!! ?????? ???? GuildGuid?? ????.. Guid = %d", GuildGuid );
|
|
return;
|
|
}
|
|
}
|
|
|
|
BOOL GuildManager::IsGuildTransaction( GUILDGUID GuildGuid, eGUILD_TRANSACTION trans )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
|
|
//??? ??? ????? ?? ????? ??? ????. ???? ???? ?????? ?????? ???????.
|
|
if(!pGuild) return TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ???? ???? ???
|
|
VOID GuildManager::OnChangeNoticeGuild( BOOL bSuccess, GUILDGUID GuildGuid, TCHAR * OUT ptszChangedNotice )
|
|
{
|
|
Guild *pGuild = FindGuild( GuildGuid );
|
|
ASSERT(pGuild);
|
|
}
|
|
|
|
|
|
// #???? ??????? ????#
|
|
RC::eGUILD_RESULT GuildManager::ChangeChaoState( GUILDGUID GuildGuid, CHARGUID CharGuid, BYTE byChaoState )
|
|
{
|
|
Guild *pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild )
|
|
{
|
|
return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
}
|
|
|
|
GuildMember *pMember = pGuild->FindMember( CharGuid );
|
|
|
|
if( !pMember )
|
|
{
|
|
return RC::RC_GUILD_FAILED;
|
|
}
|
|
|
|
pMember->SetChaoState( byChaoState );
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
|
|
VOID GuildManager::DisplayGuildInfo()
|
|
{
|
|
}
|
|
|
|
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
|
|
RC::eGUILD_RESULT GuildManager::ChuntingPVPResult(GUILDGUID WinGuildGuid, GUILDGUID LoseGuildGuid, GUILDGUID DisGuildGuid)
|
|
{
|
|
Guild *pWinGuild = FindGuild( WinGuildGuid );
|
|
if( !pWinGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
CHUNTING_PVP_INFO *pWinPVPInfo = pWinGuild->GetChuntingPVPInfo();
|
|
|
|
Guild *pLoseGuild = NULL;
|
|
if( DisGuildGuid ) pLoseGuild = FindGuild( DisGuildGuid );
|
|
else pLoseGuild = FindGuild( LoseGuildGuid );
|
|
if( !pLoseGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
CHUNTING_PVP_INFO *pLosePVPInfo = pLoseGuild->GetChuntingPVPInfo();
|
|
|
|
// ??? ????
|
|
float fWinGuildWinRatio = 1 / ( 1.0f + pow( 10.0f, (pLosePVPInfo->m_CHuntingPVPPoint-pWinPVPInfo->m_CHuntingPVPPoint) / 400.0f ) );
|
|
float fLoseGuildWinRatio = 1 / ( 1.0f + pow( 10.0f, (pWinPVPInfo->m_CHuntingPVPPoint-pLosePVPInfo->m_CHuntingPVPPoint) / 400.0f ) );
|
|
|
|
// ???? K ????
|
|
int WinGuildK = 0, LoseGuildK = 0;
|
|
int PVPPointDiff = pWinPVPInfo->m_CHuntingPVPPoint-pLosePVPInfo->m_CHuntingPVPPoint;
|
|
if( PVPPointDiff >= 400 ) WinGuildK = 0;
|
|
else if( pWinPVPInfo->m_CHuntingPVPPoint >= 2400 ) WinGuildK = 20;
|
|
else if( pWinPVPInfo->m_CHuntingTotCount < 30 ) WinGuildK = 50;
|
|
else WinGuildK = 30;
|
|
|
|
if( PVPPointDiff >= 400 ) LoseGuildK = 0;
|
|
else if( pLosePVPInfo->m_CHuntingPVPPoint >= 2400 ) LoseGuildK = 20;
|
|
else if( pLosePVPInfo->m_CHuntingTotCount < 30 ) LoseGuildK = 50;
|
|
else LoseGuildK = 30;
|
|
|
|
// ????????? ???????.
|
|
if( DisGuildGuid )
|
|
{
|
|
// Dis?? ??? ???????? ???X?? 2?? ?????????.
|
|
pLosePVPInfo->m_CHuntingPVPPoint -= (int)( LoseGuildK * fLoseGuildWinRatio * 2 );
|
|
pLosePVPInfo->m_CHuntingPVPPoint = max( 0, pLosePVPInfo->m_CHuntingPVPPoint );
|
|
|
|
// ?????? ???????.
|
|
pWinPVPInfo->m_CHuntingTotCount++;
|
|
pLosePVPInfo->m_CHuntingTotCount++;
|
|
pLosePVPInfo->m_CHuntingDisCount++;
|
|
}
|
|
else
|
|
{
|
|
pWinPVPInfo->m_CHuntingPVPPoint += (int)( WinGuildK * ( 1 - fWinGuildWinRatio ) );
|
|
pLosePVPInfo->m_CHuntingPVPPoint -= (int)( LoseGuildK * fLoseGuildWinRatio );
|
|
pLosePVPInfo->m_CHuntingPVPPoint = max( 0, pLosePVPInfo->m_CHuntingPVPPoint );
|
|
|
|
// ?????? ???????.
|
|
pWinPVPInfo->m_CHuntingTotCount++;
|
|
pWinPVPInfo->m_CHuntingVCount++;
|
|
pLosePVPInfo->m_CHuntingTotCount++;
|
|
pLosePVPInfo->m_CHuntingLCount++;
|
|
}
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
#endif
|
|
|
|
//??? ??? ????
|
|
BOOL GuildManager::ChangeMemberDuty( GUILDGUID GuildGuid, CHARGUID TargetCharGuid, eGUILD_DUTY eDuty)
|
|
{
|
|
//???? ?????? ???? DB?? ??? ?????? ?????? ??????? ????? ?????. ???? ?????? ???????? ???.
|
|
//DB???? ?? ???? ???? ????? --;; ??? ????.
|
|
Guild* pGuild = FindGuild(GuildGuid);
|
|
if( !pGuild )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::ChangeMemberDuty] Caution!, Guild Not Found = %d", GuildGuid );
|
|
return FALSE;
|
|
}
|
|
|
|
return pGuild->SetMemberDuty( TargetCharGuid, eDuty );
|
|
}
|
|
|
|
GuildMember* GuildManager::FindGuildMemberByName( GUILDGUID GuildGuid, TCHAR* pszMemberName )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild) return NULL;
|
|
|
|
return pGuild->FindMemberByCharName( pszMemberName );
|
|
}
|
|
|
|
GuildMember* GuildManager::FindGuildMember( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild) return NULL;
|
|
|
|
return pGuild->FindMember( CharGuid );
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanChangeDuty( GUILDGUID GuildGuid, CHARGUID OperGuid, CHARGUID TargetGuid, eGUILD_DUTY ChangeDuty )
|
|
{
|
|
//0. GUID ??
|
|
if( OperGuid == TargetGuid )
|
|
return RC::RC_GUILD_CANNOT_COMMAND_MYSELF;
|
|
|
|
//1. ??????? ??? ???????? ???? ???? ??? ???? ??.
|
|
Guild* pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild) return RC::RC_GUILD_INVALID_STATE;
|
|
|
|
GuildMember* pOper = pGuild->FindMember( OperGuid );
|
|
if( !pOper ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
GuildMember* pTarget = pGuild->FindMember( TargetGuid );
|
|
if( !pTarget ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//2. ??????? ???? ??????? ?????? ????? ??..
|
|
if( !CheckRight( GuildGuid, OperGuid, eGUILD_RIGHTS_CHANGE_DUTY ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//3. ??? ?????? ???? ???? ??? ??
|
|
if( ChangeDuty == pTarget->GetDuty() )
|
|
return RC::RC_GUILD_CANNOT_CHANGE_DUTY_BECAUSE_SAME_DUTY;
|
|
|
|
//9. ????????? ????? ????????? ????? ????? ?????? ?? ????.( ????? ???? ???? ???? ??? ???. )
|
|
if( pOper->GetDuty() >= pTarget->GetDuty() )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//10. ?????? ???? ??????? ???? ?? ?? ????.
|
|
if( pOper->GetDuty() >= ChangeDuty )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//4. ??????? ?????? ?????? ?? ????? ?? ???? ?????.
|
|
if( ChangeDuty == eGUILD_DUTY_MASTER || ChangeDuty == eGUILD_DUTY_COMMANDER )
|
|
return RC::RC_GUILD_CHANGE_MEMBER_DUTY_FAILED;
|
|
|
|
//5. ????????? ????? ????? ??????? ???. ??? ???? ???? ????????? ???? ????.
|
|
// ???? ????? ???? ??? ????? ???.
|
|
if( ChangeDuty == eGUILD_DUTY_SUBMASTER || ChangeDuty == eGUILD_DUTY_STRATEGIST )
|
|
{
|
|
if( pGuild->IsExistMemberDuty( ChangeDuty, 0 ) )
|
|
return RC::RC_GUILD_ALREADY_EXIST_DUTY;
|
|
|
|
if( pTarget->GetCorpsNumber() != 0 )
|
|
return RC::RC_GUILD_CHANGE_MEMBER_DUTY_FAILED;
|
|
}
|
|
|
|
//?????????? ???????? ???? ?????? ?????? ???.
|
|
if( pOper->GetDuty() == eGUILD_DUTY_COMMANDER || pOper->GetDuty() == eGUILD_DUTY_CAMP_LEADER )
|
|
{
|
|
BYTE byOperCorpsNum = pOper->GetCorpsNumber();
|
|
|
|
// ?????? ?????? ????? ???? ?????? or ?????? ?????.???? ???????? ????? ????? ?????? ????? ???.
|
|
if( byOperCorpsNum != pTarget->GetCorpsNumber() )
|
|
return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
// ????????? ?????????, ???????? ???????? ?????.
|
|
if( byOperCorpsNum == 0 )
|
|
return RC::RC_GUILD_INVALID_DUTY_IN_BASE_CORPS;
|
|
|
|
// ???? ????????? ??.
|
|
GuildCorps* pOperCorps = pGuild->FindCorps( byOperCorpsNum );
|
|
if( !pOperCorps ) return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
// ????? ?????? ????? ??????? ???? ??? ???.
|
|
if( !pOperCorps->FindMember( pTarget->GetCharGuid() ) )
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
}
|
|
|
|
// ??? ??????? ??????? ???? ?????? ??? ???? ?????? ???? ???? [8/5/2009 lst1024]
|
|
// ?????? ???? ?? ??? ???
|
|
|
|
if( ChangeDuty == eGUILD_DUTY_CAMP_LEADER || ChangeDuty == eGUILD_DUTY_CAMP_SOLDIER )
|
|
{
|
|
BYTE byOperCorpsNum = pTarget->GetCorpsNumber();
|
|
|
|
// ????????? ????????? ????.
|
|
if( byOperCorpsNum == 0 )
|
|
return RC::RC_GUILD_NOT_EXIST_REAR_CAMP;
|
|
|
|
// ???? ????????? ??.
|
|
GuildCorps* pOperCorps = pGuild->FindCorps( byOperCorpsNum );
|
|
if( !pOperCorps )
|
|
return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
// ????????? ???????? ?????? ???? ????????? ???? ??? ???? ???.
|
|
if( !pOperCorps->IsExistRearCamp() )
|
|
return RC::RC_GUILD_NOT_EXIST_REAR_CAMP;
|
|
|
|
// ??????? ?????????? ?????? ???? ????? ??????????? ???.
|
|
if( pTarget->GetDuty() != eGUILD_DUTY_REGULAR_SOLDIER )
|
|
return RC::RC_GUILD_NOT_SOLDIER;
|
|
}
|
|
|
|
// ???? ???? ??... 16???? ???? ??? ???????? ???????? ?????.
|
|
if( ChangeDuty == eGUILD_DUTY_CAMP_SOLDIER )
|
|
{
|
|
if( pTarget->GetLevel() >= 16 )
|
|
return RC::RC_GUILD_CANT_CHANGE_CAMP_SOLDIER_BY_LEVEL;
|
|
}
|
|
|
|
// ???? ?????? ????????? ??????? ?? ?? ???.
|
|
if( ChangeDuty == eGUILD_DUTY_CAMP_SOLDIER )
|
|
{
|
|
if( pOper->GetDuty() != eGUILD_DUTY_COMMANDER && pOper->GetDuty() != eGUILD_DUTY_CAMP_LEADER )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
}
|
|
|
|
//???? ?? ???.
|
|
if( pGuild->IsFullCorpsMemberByDuty( pTarget->GetCorpsNumber(), ChangeDuty ) )
|
|
return RC::RC_GUILD_CANNOT_CHANGE_DUTY_BECAUSE_FULL_MEMEBER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
//??? ?????? ??? ?????? ?????? ?? ????? ?????.
|
|
BOOL GuildManager::CheckRight( GUILDGUID GuildGuid, CHARGUID CharGuid, eGUILD_RIGHTS Right )
|
|
{
|
|
//???? ?????? ??????????
|
|
// 1) ??? ???? ??? ?????? ?????( ???????? )
|
|
// 2) ?????? ???????? ?????? ????? ??? ?????? ????? ??.
|
|
// - ?????? ????? ???? ??? ???? ?????? ????? ??.
|
|
// - ???????? ????? ?????? ????? ??.( ????? ?????? ????????? ?????? ??????? ???. ?????? + ??)
|
|
// ???? ???? ?????? ???? ?????, ????? ???? ???? ?????.
|
|
// - ?????? ????? ???? ?????? ????? ??.
|
|
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild) return FALSE;
|
|
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return FALSE;
|
|
|
|
//1. ???? ?????? ???? ??? ???? ?????? ?????.
|
|
if( !GuildRightInfoParser::Instance()->CheckGradeRight( Right, pGuild->GetGuildGrade() ) )
|
|
return FALSE;
|
|
|
|
//2. ???? ?????? ????? ???? ?????? ????? ??? ?????? ?????.
|
|
#ifdef _NA_003923_20120130_GUILD_RENEWAL
|
|
const GuildRankInfo* pGuildRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( pGuild->GetGuildGrade() );
|
|
if( !pGuildRankInfo )
|
|
return FALSE;
|
|
#else
|
|
GuildRankInfo* pGuildRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( pGuild->GetGuildGrade() );
|
|
if( !pGuildRankInfo )
|
|
return FALSE;
|
|
|
|
GUILD_DUTY_USE_INFO* pDutyUseInfo = pGuildRankInfo->Find( pMember->GetDuty() );
|
|
if( !pDutyUseInfo || !pDutyUseInfo->m_bUse )
|
|
return FALSE;
|
|
#endif
|
|
|
|
// ???? ??????? ???????? ????? ?????? ???????.
|
|
if( pMember->GetDuty() == eGUILD_DUTY_SUBMASTER || pMember->GetDuty() == eGUILD_DUTY_STRATEGIST )
|
|
{
|
|
//3. ???????? ??????? ?????? ????? ??.
|
|
if( pMember->CheckDelegateRight( Right ) )
|
|
return TRUE;
|
|
}
|
|
|
|
//3. ??????? ?????? ?????? ?????? ??? ????? ?????? ????? ?????.
|
|
if( !GuildRightInfoParser::Instance()->CheckDutyRight( Right, pMember->GetDuty() ) )
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID GuildManager::GetCharName( GUILDGUID GuildGuid, CHARGUID CharGuid, OUT TCHAR* pszCharName, IN BYTE byBufSize )
|
|
{
|
|
if( byBufSize == 0 ) return;
|
|
pszCharName[0] = '\0';
|
|
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild) return;
|
|
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if(!pMember) return;
|
|
|
|
strncpy( pszCharName, pMember->GetCharName(), byBufSize );
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::IsDelegateChar( GUILDGUID GuildGuid, CHARGUID TargetGuid )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::IsDelegateChar] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
}
|
|
|
|
GuildMember* pMember = pGuild->FindMember( TargetGuid );
|
|
if(!pMember)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::IsDelegateChar] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
}
|
|
|
|
if( !CheckDelegatedRight( pMember->GetDuty() ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT_TARGET_USER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::IsDelegateChar( GUILDGUID GuildGuid, TCHAR* pszTargetCharName )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::IsDelegateChar] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
}
|
|
|
|
GuildMember* pMember = pGuild->FindMemberByCharName( pszTargetCharName );
|
|
if(!pMember)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::IsDelegateChar] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
}
|
|
|
|
if( !CheckDelegatedRight( pMember->GetDuty() ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT_TARGET_USER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
BOOL GuildManager::CheckDelegatedRight( const eGUILD_DUTY& Duty )
|
|
{
|
|
// ?????????? ?????????, ???????? ?? ?? ???.
|
|
if( Duty == eGUILD_DUTY_SUBMASTER || Duty == eGUILD_DUTY_STRATEGIST )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
VOID GuildManager::GetDelegateRight( GUILDGUID GuildGuid, TCHAR* pszTargetCharName, OUT GUILD_RIGHT_USE_INFO* pDelegateRight )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::IsDelegateChar] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return;
|
|
}
|
|
|
|
GuildMember* pMember = pGuild->FindMemberByCharName( pszTargetCharName );
|
|
if(!pMember)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::IsDelegateChar] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return;
|
|
}
|
|
|
|
pMember->GetDelegateRight( pDelegateRight );
|
|
}
|
|
|
|
BOOL GuildManager::IsDelegateRight( const GUILD_RIGHT_USE_INFO* pRightInfo )
|
|
{
|
|
for( int i = 0; i < MAX_GUILD_DELEGATE_RIGHT; i++ )
|
|
{
|
|
switch( pRightInfo[i].m_Right )
|
|
{
|
|
case eGUILD_RIGHTS_GUILD_MARK:
|
|
break;
|
|
case eGUILD_RIGHTS_RANKUP:
|
|
break;
|
|
case eGUILD_RIGHTS_RELATION:
|
|
break;
|
|
case eGUILD_RIGHTS_SEIGE_WARFARE :
|
|
break;
|
|
case eGUILD_RIGHTS_UP2GP:
|
|
break;
|
|
case eGUILD_RIGHTS_USE_UPGP:
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
VOID GuildManager::ChangeDelegateRight( GUILDGUID GuildGuid, CHARGUID TargetGuid, GUILD_RIGHT_USE_INFO* pDelegateRight )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager:CanDelegateRight] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return;
|
|
}
|
|
|
|
GuildMember* pTargetMember = pGuild->FindMember( TargetGuid );
|
|
if( !pTargetMember )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager:CanDelegateRight] Caution!!! Guild Not Found GuidMeber = %d", TargetGuid );
|
|
return;
|
|
}
|
|
|
|
if( !pDelegateRight )
|
|
return;
|
|
|
|
pTargetMember->SetDelegateRight( pDelegateRight );
|
|
|
|
GUILDLOG->LogDelegation(pGuild, pTargetMember, pDelegateRight->m_Right);
|
|
}
|
|
|
|
BOOL GuildManager::ChangeMaster( GUILDGUID GuildGuid, CHARGUID OldMasterCharGuid, CHARGUID NewMasterCharGuid, INT64 nMasterChangeTime )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild)
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager:ChangeMaster] Caution!!! Guild Not Found Guid = %d", GuildGuid );
|
|
return FALSE;
|
|
}
|
|
|
|
GuildMember* pOldMaster = pGuild->FindMember( OldMasterCharGuid );
|
|
if( !pOldMaster )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager:ChangeMaster] Caution!!! Guild Not Found GuidMeber = %d", OldMasterCharGuid );
|
|
return FALSE;
|
|
}
|
|
|
|
GuildMember* pNewMaster = pGuild->FindMember( NewMasterCharGuid );
|
|
if( !pNewMaster )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager:ChangeMaster] Caution!!! Guild Not Found GuidMeber = %d", NewMasterCharGuid );
|
|
return FALSE;
|
|
}
|
|
|
|
//1. ?????? ??????? ?????? ???, ?????? ???????? ????? ??????? ???????
|
|
const eGUILD_DUTY prev_duty_of_new_master = pNewMaster->GetDuty();
|
|
pOldMaster->SetDuty( eGUILD_DUTY_REGULAR_SOLDIER );
|
|
pNewMaster->SetDuty( eGUILD_DUTY_MASTER );
|
|
|
|
//2. ????? ?????? ??? ???? ?????.
|
|
pOldMaster->InitDelegateRight();
|
|
pNewMaster->InitDelegateRight();
|
|
|
|
//?????? ??????? ???? ???????
|
|
pGuild->SetMasterChangeTime( nMasterChangeTime );
|
|
|
|
// ???????? ???? ???? ??? ??? ???? ???? ???
|
|
GUILDLOG->LogDutyChange(pGuild, pOldMaster, eGUILD_DUTY_MASTER);
|
|
GUILDLOG->LogDutyChange(pGuild, pNewMaster, prev_duty_of_new_master);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanChangeMaster( GUILDGUID GuildGuid, CHARGUID OldMasterCharGuid , TCHAR* pszNewMasterName )
|
|
{
|
|
//1. ??? ????? ??
|
|
Guild* pGuild = g_GuildManager.FindGuild( GuildGuid );
|
|
if( !pGuild )
|
|
return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ??? ??????? ??
|
|
GuildMember* pMaster = pGuild->FindMember( OldMasterCharGuid );
|
|
if( !pMaster ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
GuildMember* pNewMaster = pGuild->FindMemberByCharName( pszNewMasterName );
|
|
if( !pNewMaster ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
// ??? ?? ( ??????? ???? ????. )
|
|
if( pMaster->GetDuty() != eGUILD_DUTY_MASTER || pMaster->GetCorpsNumber() != 0 )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ??? ?????? ???? ??????? ??? ????
|
|
if( pNewMaster->GetDuty() == eGUILD_DUTY_MASTER )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ?????? ???? ????.
|
|
if( pNewMaster->GetCorpsNumber() != 0 )
|
|
return RC::RC_GUILD_NOT_BASE_CORPS;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanRightDelegate( GUILDGUID GuildGuid, CHARGUID OperCharGuid, TCHAR* pszTargetCharName, const GUILD_RIGHT_USE_INFO* pRightInfo )
|
|
{
|
|
//1. ??? ????? ??
|
|
Guild* pGuild = g_GuildManager.FindGuild( GuildGuid );
|
|
if( !pGuild )
|
|
return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
//2. ??????? ????? ??????.
|
|
GuildMember* pTargetMember = pGuild->FindMemberByCharName( pszTargetCharName );
|
|
if( !pTargetMember )
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//3. ????? ?????? ??????? ?????? ??? ??????? ?????.
|
|
if( !g_GuildManager.CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_DELEGATION_RIGHT ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//4. ???????????? ???????? ????? ??.
|
|
RC::eGUILD_RESULT rc = g_GuildManager.IsDelegateChar( GuildGuid, pTargetMember->GetCharGuid() );
|
|
if( rc != RC::RC_GUILD_SUCCESS )
|
|
return rc;
|
|
|
|
//4. ???? ????????? ??????? ????? ??????????? ??.
|
|
if( !g_GuildManager.IsDelegateRight( pRightInfo ) )
|
|
return RC::RC_GUILD_INVALID_DELEGATE_RIGHT;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
CHARGUID GuildManager::FindRightMember(GUILDGUID GuildGuid, eGUILD_DUTY eDUTY)
|
|
{
|
|
Guild* pGuild = g_GuildManager.FindGuild( GuildGuid );
|
|
if(pGuild)
|
|
{
|
|
GuildMember* Member = pGuild->FindMemberByDuty(eDUTY);
|
|
if(Member && Member->IsLogIn()) return Member->GetCharGuid();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ??? ???? ????
|
|
RC::eGUILD_RESULT GuildManager::CreateCorps( GUILDGUID GuildGuid, BYTE byCorpsNum, CHARGUID TargetCharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildCorps* pCorps = pGuild->CreateCorps( byCorpsNum );
|
|
if( !pCorps ) return RC::RC_GUILD_CREATE_CORPS_FAILED;
|
|
|
|
//?????? ???
|
|
RC::eGUILD_RESULT rc = g_GuildManager.ChangeCommander( GuildGuid, byCorpsNum, TargetCharGuid );
|
|
if( rc != RC::RC_GUILD_SUCCESS )
|
|
return rc;
|
|
|
|
if(GuildMember* pCommander = g_GuildManager.FindGuildMember(GuildGuid, TargetCharGuid))
|
|
{
|
|
GUILDLOG->LogCorpsCreation(pGuild, pCommander, byCorpsNum);
|
|
}
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanCreateCorps( GUILDGUID GuildGuid, CHARGUID OperCharGuid, const TCHAR* pszTargetCharName, OUT BYTE& byCorpsNum )
|
|
{
|
|
// ??????..
|
|
//1. ??? ????? ??
|
|
Guild* pGuild = g_GuildManager.FindGuild( GuildGuid );
|
|
if( !pGuild )
|
|
return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
//2. ??????? ?????? ???????? ?????? ??? ??????? ?????.
|
|
if( !g_GuildManager.CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_CREATE_CORPS ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//3. ???? ???? ??? ?????? ????? ??? ???????? ??????.
|
|
#ifdef _NA_003923_20120130_GUILD_RENEWAL
|
|
const GuildRankInfo* pRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( pGuild->GetGuildGrade() );
|
|
#else
|
|
GuildRankInfo* pRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( pGuild->GetGuildGrade() );
|
|
#endif
|
|
if( !pRankInfo )
|
|
return RC::RC_GUILD_NOT_FOUND_GUILD_INFO_FOR_GRADE;
|
|
|
|
byCorpsNum = pGuild->GetEmptyCorpsNumBySequence();
|
|
if( byCorpsNum == 0 )
|
|
return RC::RC_GUILD_CORPS_NUM_OVERFLOW;
|
|
|
|
// ???????? ?? ????? ???? ??? ??????? ??????.
|
|
GuildMember* pTargetMember = pGuild->FindMemberByCharName( pszTargetCharName );
|
|
if( !pTargetMember )
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
// ?????? ?? ????? ???? ???????? ??
|
|
if( pTargetMember->GetCorpsNumber() != 0 )
|
|
return RC::RC_GUILD_NOT_BASE_CORPS;
|
|
|
|
// ?????? ?? ????? ?????????? ??.
|
|
if( pTargetMember->GetDuty() != eGUILD_DUTY_REGULAR_SOLDIER )
|
|
return RC::RC_GUILD_NOT_SOLDIER;
|
|
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanDestoryCorps( GUILDGUID GuildGuid, CHARGUID OperCharGuid, BYTE byCorpsNum )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//1. ???? ??????? ????.
|
|
if( byCorpsNum == 0 )
|
|
return RC::RC_GUILD_INVALID_FUNCTION_IN_BASE_CORPS;
|
|
|
|
//2. ??????.
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_DISMISS_CORPS ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
GuildCorps* pCorps = pGuild->FindCorps( byCorpsNum );
|
|
if( !pCorps ) return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
// ???? ??? ????
|
|
// 1. ??????? ?????? ????? ???.
|
|
if( pCorps->GetMemberCount() > 0 )
|
|
return RC::RC_GUILD_EXIST_MEMBER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::DestoryCorps( GUILDGUID GuildGuid, BYTE byCorpsNum, CHARGUID operCharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
pGuild->DestroyCorps( byCorpsNum );
|
|
|
|
GuildMember* pMember = pGuild->FindMember(operCharGuid);
|
|
if (pMember)
|
|
{
|
|
GUILDLOG->LogCorpsBreakUp(pGuild, pMember, byCorpsNum);
|
|
}
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanBeCommander( GUILDGUID GuildGuid, CHARGUID CommanderCharGuid )
|
|
{
|
|
Guild* pGuild = g_GuildManager.FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pMember = pGuild->FindMember( CommanderCharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//??? ????? ???????? ???? ??? ????.
|
|
if( pMember->GetDuty() != eGUILD_DUTY_REGULAR_SOLDIER )
|
|
return RC::RC_GUILD_MEMBER_NOT_SOLDIER;
|
|
|
|
//??? ????? ?????? ???? ?????.
|
|
if( pMember->GetCorpsNumber() != 0 ) //?????? ????..
|
|
return RC::RC_GUILD_MEMBER_NOT_HEAD_CORPS;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanCreateGuild( CHARGUID MasterCharGuid, LEVELTYPE MasterLV )
|
|
{
|
|
// ?????? ??? ????? ??????? ??????? ????, DB???? ?? ????? ???.
|
|
|
|
//1. ???? ??? ???? ??? ????? ??
|
|
//GuildMember* pMember = FindMember( MasterCharGuid );
|
|
//if( pMember )
|
|
// return RC::RC_GUILD_ALREADY_GUILD_MEMBER;
|
|
|
|
//2. ???????? Legion?? ?????? ?????? ????.
|
|
#ifdef _NA_003923_20120130_GUILD_RENEWAL
|
|
const GuildRankInfo* pRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( eGUILD_GRADE_LEGION );
|
|
#else
|
|
GuildRankInfo* pRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( eGUILD_GRADE_LEGION );
|
|
#endif
|
|
if( !pRankInfo )
|
|
return RC::RC_GUILD_NOT_FOUND_GUILD_INFO_FOR_GRADE;
|
|
|
|
//3. ???????? ???? ??
|
|
if( MasterLV < CREATE_GUILD_LIMIT_LEVEL )
|
|
return RC::RC_GUILD_CANNOT_CREAT_LEVEL_STATE;
|
|
|
|
//4. ????/??????? ?? ??? ????... ??? ?????? ???? ??? ????. ??????????? ???? ?? ??? ????.
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CreateGuild( GUILDGUID GuildGuid, const TCHAR* tszGuildName, BYTE byCorpsNum, CHARGUID MasterCharGuid,
|
|
const TCHAR* tszMasterCharName, eGUILD_DUTY MasterDuty, BYTE byMasterClass, LEVELTYPE MasterLevel, BYTE byMasterChaoState,
|
|
INT64 nGuildPanaltyTime, INT64 nDestroyRequestTime, INT64 nMasterChangeTime )
|
|
{
|
|
if( FindGuild( GuildGuid ) )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::CreateGuild] Error! GuildGuid = %u", GuildGuid );
|
|
return RC::RC_GUILD_ALREADY_EXIST_GUILD;
|
|
}
|
|
|
|
Guild* pGuild = Guild::ALLOC();
|
|
pGuild->InitializeGuild();
|
|
pGuild->CreateGuild( GuildGuid, tszGuildName, byCorpsNum, MasterCharGuid, tszMasterCharName, MasterDuty, byMasterClass, MasterLevel,
|
|
byMasterChaoState, nGuildPanaltyTime, nDestroyRequestTime, nMasterChangeTime );
|
|
AddGuild( pGuild, pGuild->GetGuildGuid() );
|
|
AddGuildName(pGuild->GetGuildName(), pGuild->GetGuildGuid());
|
|
|
|
GUILDLOG->LogGuildCreation(pGuild);
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
GuildMember* GuildManager::FindMaster( GUILDGUID GuildGuid )
|
|
{
|
|
Guild * pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return NULL;
|
|
|
|
return pGuild->FindMaster();
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanDestroyGuild( GUILDGUID GuildGuid, CHARGUID OperCharGuid )
|
|
{
|
|
Guild * pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
//??? ????? ????????? ?? ?? ???.
|
|
GuildMember* pMaster = pGuild->FindMaster();
|
|
if( !pMaster ) return RC::RC_GUILD_CURRENT_NONE_MASTER;
|
|
|
|
if( pMaster->GetCharGuid() != OperCharGuid )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ??? ???? ??? ?????? Destroy?? ?? ????.
|
|
if(eGUILD_DELCHK_DESTROY_WAIT == pGuild->CheckGuildDeleteState())
|
|
return RC::RC_GUILD_DELCHK_DESTROY_WAIT;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
VOID GuildManager::DestroyGuild( GUILDGUID GuildGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return;
|
|
|
|
GUILDLOG->LogGuildBreakUpCompleted(pGuild);
|
|
|
|
pGuild->Destroy();
|
|
|
|
RemoveGuild( GuildGuid );
|
|
RemoveGuildName(pGuild->GetGuildName());
|
|
m_GuildPenaltyMgr.erase(GuildGuid);
|
|
Guild::FREE( pGuild );
|
|
}
|
|
|
|
BYTE GuildManager::GetEmptyCommanderInfo( GUILDGUID GuildGuid, OUT BYTE* pEmptyCommanderInfo )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return 0;
|
|
|
|
return pGuild->GetEmptyCommanderInfo( pEmptyCommanderInfo );
|
|
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanChangeCommander( GUILDGUID GuildGuid, CHARGUID OperCharGuid, const TCHAR* tszMasterCharName, BYTE byCorpsNum )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
//???? ?????? ???????? ????.
|
|
if( byCorpsNum == 0 )
|
|
return RC::RC_GUILD_INVALID_DUTY_IN_BASE_CORPS;
|
|
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember )
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_CHANGE_DUTY ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
GuildMember* pTargetMember = pGuild->FindMemberByCharName( tszMasterCharName );
|
|
if( !pTargetMember )
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//???? ?????? ???????? ?????? ?????? ???? ?????.
|
|
GuildCorps* pCorps = pGuild->FindCorps( byCorpsNum );
|
|
if( !pCorps ) //?????? ???????? ?????.
|
|
return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
if( pCorps->FindCommander() ) //??? ???????? ???????..
|
|
return RC::RC_GUILD_ALREADY_EXIST_COMMANDER;
|
|
|
|
// ???? ?????? ??????? ???? ????? ????????? ????.
|
|
if( pTargetMember->GetDuty() == eGUILD_DUTY_COMMANDER )
|
|
return RC::RC_GUILD_CANT_CHANGE_COMMANDER_BECAUSE_COMMANDER;
|
|
|
|
//???????? 1?????? ?????? ?? ?????.
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::ChangeCommander( GUILDGUID GuildGuid, BYTE byCorpsNum, CHARGUID CommanderGuid)
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildCorps* pCorps = pGuild->FindCorps( byCorpsNum );
|
|
if( !pCorps ) return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
GuildMember* pCommander = pGuild->FindMember( CommanderGuid );
|
|
if( !pCommander ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//1. ?????? ????.
|
|
RC::eGUILD_RESULT rt =pGuild->ChangeCorps( CommanderGuid, byCorpsNum );
|
|
if( rt != RC::RC_GUILD_SUCCESS )
|
|
return rt;
|
|
|
|
//2. ????? ???? ???
|
|
pCommander->SetDuty( eGUILD_DUTY_COMMANDER );
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
// ???? ????
|
|
RC::eGUILD_RESULT GuildManager::CanChangeCorps( GUILDGUID GuildGuid, CHARGUID OperCharGuid, const TCHAR* tszMasterCharName, BYTE byCorpsNum )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
GuildMember* pTargetMember = pGuild->FindMemberByCharName( tszMasterCharName );
|
|
if( !pTargetMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
// ?????? ?????? ??? ?? ( ???? ?????? ???? ???. )
|
|
if( pTargetMember->GetDuty() != eGUILD_DUTY_REGULAR_SOLDIER )
|
|
return RC::RC_GUILD_NOT_SOLDIER;
|
|
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_CHANGE_CORPS ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//????????? ????? ???? ????????? ???? ????? ?????? ????. )
|
|
if( pTargetMember->GetCorpsNumber() == byCorpsNum )
|
|
return RC::RC_GUILD_CANNOT_CHANGE_CORPS_BECAUSE_SAME_CORPS;
|
|
|
|
//???? ????????? ?????? ?????? ??????? ???.
|
|
if( !pGuild->FindCorps( pTargetMember->GetCorpsNumber() ) )
|
|
return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
GuildCorps* pTargetCorps = pGuild->FindCorps( byCorpsNum );
|
|
if( !pTargetCorps ) return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
//???? ?? ???.
|
|
if( pGuild->IsFullCorpsMemberByDuty( byCorpsNum, pTargetMember->GetDuty() ) )
|
|
return RC::RC_GUILD_CORPS_FULL_MEMBER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
//????? ????
|
|
RC::eGUILD_RESULT GuildManager::ChangeCorps( GUILDGUID GuildGuid, CHARGUID TargetCharGuid, BYTE byCorpsNum )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
return pGuild->ChangeCorps( TargetCharGuid, byCorpsNum );
|
|
}
|
|
|
|
//???? ???? ??? ????
|
|
RC::eGUILD_RESULT GuildManager::CanCreateRearCamp( GUILDGUID GuildGuid, CHARGUID OperCharGuid, const TCHAR* pszTargetCharName, OUT BYTE& byCorpsNum )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
//??? ???
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//1. ??????.
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_CREATE_CAMP ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//2. ???????? ???
|
|
GuildCorps* pCorps = pGuild->FindCorps( pOperMember->GetCorpsNumber() );
|
|
if( !pCorps ) return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
//3. ?????? ?? ???? ???? ???????? ???.
|
|
GuildMember* pTargetMember = pCorps->FindMember( pszTargetCharName );
|
|
if( !pTargetMember ) return RC::RC_GUILD_NOT_CORPS_MEMBER;
|
|
|
|
//4. ????? ?????????? ???..
|
|
if( pOperMember->GetDuty() != eGUILD_DUTY_COMMANDER )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//5. ??????? ?????????? ???.
|
|
if( pTargetMember->GetDuty() != eGUILD_DUTY_REGULAR_SOLDIER )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//6. ???? ????????? ????? ??.
|
|
if( pCorps->IsExistRearCamp() )
|
|
return RC::RC_GUILD_ALREADY_EXIST_REAR_CAMP;
|
|
|
|
//?????? ????..
|
|
byCorpsNum = pOperMember->GetCorpsNumber();
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CreateRearCamp( GUILDGUID GuildGuid, BYTE byCorpsNum, CHARGUID TargetCharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
if( !pGuild->CreateRearCamp( byCorpsNum ) )
|
|
return RC::RC_GUILD_FAILED;
|
|
|
|
//1. ????? ???????
|
|
RC::eGUILD_RESULT rc = ChangeCorps( GuildGuid, TargetCharGuid, byCorpsNum );
|
|
if( rc != RC::RC_GUILD_SUCCESS )
|
|
return rc;
|
|
|
|
//2. ????? ???????( ?????? )
|
|
GuildMember* pMember = FindGuildMember( GuildGuid, TargetCharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
pMember->SetDuty( eGUILD_DUTY_CAMP_LEADER );
|
|
|
|
GUILDLOG->LogCampCreation(pGuild, pMember, byCorpsNum);
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
// ???? ????? ????????? ?? ?? ??????? ???????? ??? ?????? ??????,
|
|
// ????? ???? ??? ???????? ?? ?? ???????? ???.
|
|
// ????? ???????? ????.
|
|
RC::eGUILD_RESULT GuildManager::CanDestroyRearCamp( GUILDGUID GuildGuid, CHARGUID OperCharGuid, BYTE byCorpsNum )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//1. ???? ??????? ????.
|
|
if( byCorpsNum == 0 )
|
|
return RC::RC_GUILD_INVALID_FUNCTION_IN_BASE_CORPS;
|
|
|
|
//2. ??????.
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_DISMISS_CAMP ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ?????? ??? ????
|
|
// 1. ????????? ?????? ????? ???.
|
|
GuildCorps* pCorps = pGuild->FindCorps( byCorpsNum );
|
|
if( !pCorps ) return RC::RC_GUILD_CORPS_NOT_FOUND;
|
|
|
|
// ???? ???????? ????? ??.
|
|
if( pCorps->IsExistRearCamp() == FALSE )
|
|
return RC::RC_GUILD_NOT_EXIST_REAR_CAMP;
|
|
|
|
// ???????? ?????? ????.
|
|
if( pCorps->GetMemberCountByDuty( eGUILD_DUTY_CAMP_LEADER ) > 0 )
|
|
return RC::RC_GUILD_EXIST_MEMBER;
|
|
|
|
// ?????? ?????? ????.
|
|
if( pCorps->GetMemberCountByDuty( eGUILD_DUTY_CAMP_SOLDIER ) > 0 )
|
|
return RC::RC_GUILD_EXIST_MEMBER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::DestroyRearCamp( GUILDGUID GuildGuid, BYTE byCorpsNum, CHARGUID operCharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
if( !pGuild->DestroyRearCamp( byCorpsNum ) )
|
|
return RC::RC_GUILD_FAILED;
|
|
|
|
GuildMember* pMember = pGuild->FindMember(operCharGuid);
|
|
if (pMember)
|
|
{
|
|
GUILDLOG->LogCampBreakUp(pGuild, pMember, byCorpsNum);
|
|
}
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
//??????N ????????
|
|
RC::eGUILD_RESULT GuildManager::CanInviteGuild( const GUILDGUID GuildGuid, const CHARGUID OperCharGuid, const CHARGUID TargetCharGuid, const LEVELTYPE TargetLevel )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ?????? .
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_JOIN ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ??? ???? ??? ?????? Join?? ?? ????.
|
|
if(eGUILD_DELCHK_DESTROY_WAIT == pGuild->CheckGuildDeleteState())
|
|
return RC::RC_GUILD_DELCHK_DESTROY_WAIT;
|
|
|
|
//??? ???? ??????? ?????? ??? ??? ????????
|
|
if(!GuildSmallContentsEntry::GuildPenalty::CheckGuildPenaltyTime(pGuild))
|
|
return RC::RC_GUILD_WITHDRAW_PENALTY_TIME;
|
|
|
|
// TODO : ???? ??????? ??..????? DB?????? ????? ????
|
|
|
|
// ??? ????? ??? ??????? ???????? ?????.
|
|
// ??? ??? ??? ???? ?????? DB???? ??????.. ?????? ??? ??? ?????????? ?????.
|
|
// ?? ???? ??????????? ??? ??????? ???? ??? ???? ??? ???? ????.
|
|
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
GuildMember* pTargetMember = pGuild->FindMember( TargetCharGuid );
|
|
if( pTargetMember ) return RC::RC_GUILD_ALREADY_GUILD_MEMBER;
|
|
|
|
//?????????? ?????????,
|
|
eGUILD_DUTY Duty = eGUILD_DUTY_REGULAR_SOLDIER;
|
|
if( pOperMember->GetDuty() == eGUILD_DUTY_CAMP_LEADER )
|
|
{
|
|
if( TargetLevel >= 16 )
|
|
return RC::RC_GUILD_CANNOT_JOIN_CAMP_SOLDERY_BY_LEVEL;
|
|
|
|
Duty = eGUILD_DUTY_CAMP_SOLDIER;
|
|
}
|
|
|
|
//3. ???????( ?????????? ???? ?????????, ????????? ???? ????? ??????????. )
|
|
BYTE byCorpsNum = 0;
|
|
if( pOperMember->GetDuty() == eGUILD_DUTY_CAMP_LEADER || pOperMember->GetDuty() == eGUILD_DUTY_COMMANDER )
|
|
byCorpsNum = pOperMember->GetCorpsNumber();
|
|
|
|
//???? ?? ???.
|
|
if( pGuild->IsFullCorpsMemberByDuty( byCorpsNum, Duty ) )
|
|
return RC::RC_GUILD_CORPS_FULL_MEMBER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanJoinGuild( const GUILDGUID& GuildGuid, const CHARGUID& OperCharGuid, const CHARGUID& TargetCharGuid, const LEVELTYPE& TargetLevel, OUT eGUILD_DUTY& Duty, OUT BYTE& byCorpsNum )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ?????? .
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_JOIN ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ??? ???? ??? ?????? Join?? ?? ????.
|
|
if(eGUILD_DELCHK_DESTROY_WAIT == pGuild->CheckGuildDeleteState())
|
|
return RC::RC_GUILD_DELCHK_DESTROY_WAIT;
|
|
|
|
if(!GuildSmallContentsEntry::GuildPenalty::CheckGuildPenaltyTime(pGuild))
|
|
return RC::RC_GUILD_KICK_PENALTY_TIME;
|
|
|
|
// ??? ????? ??? ??????? ???????? ?????.
|
|
// ??? ??? ??? ???? ?????? DB???? ??????.. ?????? ??? ??? ?????????? ?????.
|
|
// ?? ???? ??????????? ??? ??????? ???? ??? ???? ??? ???? ????.
|
|
GuildMember* pTargetMember = pGuild->FindMember( TargetCharGuid );
|
|
if( pTargetMember ) return RC::RC_GUILD_ALREADY_GUILD_MEMBER;
|
|
|
|
//2. ??????? ????? ???????.
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//?????????? ?????????,
|
|
Duty = eGUILD_DUTY_REGULAR_SOLDIER;
|
|
if( pOperMember->GetDuty() == eGUILD_DUTY_CAMP_LEADER )
|
|
{
|
|
if( TargetLevel >= 16 )
|
|
return RC::RC_GUILD_CANNOT_JOIN_CAMP_SOLDERY_BY_LEVEL;
|
|
|
|
Duty = eGUILD_DUTY_CAMP_SOLDIER;
|
|
}
|
|
|
|
//3. ???????( ?????????? ???? ?????????, ????????? ???? ????? ??????????. )
|
|
byCorpsNum = 0;
|
|
if( pOperMember->GetDuty() == eGUILD_DUTY_CAMP_LEADER || pOperMember->GetDuty() == eGUILD_DUTY_COMMANDER )
|
|
byCorpsNum = pOperMember->GetCorpsNumber();
|
|
|
|
//???? ?? ???.
|
|
if( pGuild->IsFullCorpsMemberByDuty( byCorpsNum, Duty ) )
|
|
return RC::RC_GUILD_CORPS_FULL_MEMBER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::JoinGuild( GUILDGUID GuildGuid, BYTE byCorpsNum, CHARGUID CharGuid,
|
|
const TCHAR* tszCharName, eGUILD_DUTY Duty, BYTE byClass, LEVELTYPE Level, BYTE byChaoState )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
RC::eGUILD_RESULT result = pGuild->JoinGuild( byCorpsNum, CharGuid, tszCharName, Duty, byClass, Level, byChaoState );
|
|
if(RC::RC_GUILD_SUCCESS == result)
|
|
{
|
|
GUILDLOG->LogMemberJoin(pGuild, CharGuid, tszCharName);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
// #??????#
|
|
RC::eGUILD_RESULT GuildManager::CanLeaveGuild( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ???? ??? ?????? ????? ?? ????.
|
|
if(eGUILD_DELCHK_DESTROY_WAIT == pGuild->CheckGuildDeleteState())
|
|
return RC::RC_GUILD_DELCHK_DESTROY_WAIT;
|
|
|
|
//1. ??? ????? ????????
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//2. ??? ????? ??????? ?????? ???? ??? ???????.
|
|
GuildMember* pMaster = pGuild->FindMaster();
|
|
if( !pMaster ) return RC::RC_GUILD_CURRENT_NONE_MASTER;
|
|
|
|
if( pMember->GetCharGuid() == pMaster->GetCharGuid() )
|
|
return RC::RC_GUILD_CANNOT_LEAVE_MASTER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::LeaveGuild( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
//1. ??? ????? ????????
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
GUILDLOG->LogMemberLeave(pGuild, pMember);
|
|
|
|
//DestroyMember?? ??? ????? ???? ?????? ??????????
|
|
pGuild->DestroyMember( CharGuid );
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanKickMember( GUILDGUID GuildGuid, CHARGUID OperCharGuid, TCHAR* ptszCharName )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ???? ??? ?????? Kick ?? ?? ????.
|
|
if(eGUILD_DELCHK_DESTROY_WAIT == pGuild->CheckGuildDeleteState())
|
|
return RC::RC_GUILD_DELCHK_DESTROY_WAIT;
|
|
|
|
// ?????? .
|
|
if( !CheckRight( GuildGuid, OperCharGuid, eGUILD_RIGHTS_KICK ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pOperMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
GuildMember* pTargetMember = pGuild->FindMemberByCharName( ptszCharName );
|
|
if( !pTargetMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
// ??? ????? ????? ?? ????.
|
|
if( pOperMember->GetCharGuid() == pTargetMember->GetCharGuid() )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
//????????? ????????? ?????? ?? ????.
|
|
if( pOperMember->GetDuty() > pTargetMember->GetDuty() )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
if( pTargetMember->GetDuty() == eGUILD_DUTY_MASTER )
|
|
return RC::RC_GUILD_CANNOT_LEAVE_MASTER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
// #?????#
|
|
RC::eGUILD_RESULT GuildManager::KickMember( GUILDGUID GuildGuid, CHARGUID OperCharGuid, CHARGUID TargetCharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pOperMember = pGuild->FindMember( OperCharGuid );
|
|
if ( !pOperMember ) { return RC::RC_GUILD_NOT_GUILD_MEMBER; }
|
|
|
|
GuildMember* pTargetMember = pGuild->FindMember( TargetCharGuid );
|
|
if( !pTargetMember ) { return RC::RC_GUILD_NOT_GUILD_MEMBER; }
|
|
|
|
GUILDLOG->LogMemberKickOut(pGuild, pOperMember, pTargetMember);
|
|
|
|
//DestroyMember?? ??? ????? ???? ?????? ??????????
|
|
pGuild->DestroyMember( TargetCharGuid );
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
//Serialize
|
|
BOOL GuildManager::SerializeBaseGuildInfo( GUILDGUID GuildGuid, INOUT BASE_GUILD_INFO& info, eSERIALIZE se )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SerializeBaseGuildInfo( info, se );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL GuildManager::SerializeGameGuildInfo( GUILDGUID GuildGuid, INOUT GAME_GUILD_INFO& info, eSERIALIZE se )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SerializeGameGuildInfo( info, se );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL GuildManager::SerializeGuildInfo( GUILDGUID GuildGuid, INOUT GUILD_INFO& info, eSERIALIZE se )
|
|
{
|
|
if( se == SERIALIZE_LOAD )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SerializeGuildInfo( info, se );
|
|
}
|
|
else
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild )
|
|
{
|
|
Guild* pNewGuild = Guild::ALLOC();
|
|
pNewGuild->InitializeGuild();
|
|
pNewGuild->SerializeGuildInfo( info, se );
|
|
AddGuild( pNewGuild, pNewGuild->GetGuildGuid() );
|
|
AddGuildName(pNewGuild->GetGuildName(), pNewGuild->GetGuildGuid());
|
|
}
|
|
else
|
|
{
|
|
pGuild->SerializeGuildInfo( info, se );
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL GuildManager::SerializeCorpsInfo( GUILDGUID GuildGuid, INOUT GUILD_CORPS_TOTAL_INFO& info, eSERIALIZE se )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SerializeCorpsInfo( info, se );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL GuildManager::SerializeBaseMemberTotalInfo( GUILDGUID GuildGuid, INOUT INOUT BASE_GUILD_MEMBER_TOTAL_INFO& info, eSERIALIZE se )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SerializeBaseMemberTotalInfo( info, se );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL GuildManager::SerializeMemberTotalInfo( GUILDGUID GuildGuid, INOUT INOUT GUILD_MEMBER_TOTAL_INFO& info, eSERIALIZE se )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SerializeMemberTotalInfo( info, se );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL GuildManager::SerializeServerMemberTotalInfo( GUILDGUID GuildGuid, INOUT SERVER_GUILD_MEMBER_TOTAL_INFO& info, eSERIALIZE se )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SerializeServerMemberTotalInfo( info, se );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL GuildManager::GetGuildBaseMemberInfo( GUILDGUID GuildGuid, CHARGUID CharGuid, OUT BASE_GUILD_MEMBER_INFO& info )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
return pGuild->GetBaseMemberInfo( CharGuid, info );
|
|
}
|
|
|
|
BOOL GuildManager::GetGuildMemberInfo( GUILDGUID GuildGuid, CHARGUID CharGuid, OUT GUILD_MEMBER_INFO& info )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
return pGuild->GetMemberInfo( CharGuid, info );
|
|
}
|
|
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanLogin( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ??????? ??? ??????? ??????.
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
if( pMember->IsLogIn() == TRUE )
|
|
return RC::RC_GUILD_ALREADY_LOGIN_MEMBER;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanMoveServer( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ??????? ??? ??????? ??????.
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
if( pMember->IsLogIn() == FALSE )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::CanLogin] ??? ?????? ???? ?????? ?????? ???? ??????? ????? ???. GuildGuid = %u, CharGuid = %u", GuildGuid, CharGuid );
|
|
}
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
|
|
RC::eGUILD_RESULT GuildManager::Login( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ??????? ??? ??????? ??????.
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
pMember->SetLogin( TRUE );
|
|
pMember->SetTotalInfoReqCnt( 0 );
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::Logout( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ??????? ??? ??????? ??????.
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
pMember->SetLogin( FALSE );
|
|
pMember->SetTotalInfoReqCnt( 0 );
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
// UP/GP ???
|
|
// NowUP : ???? ????? UP
|
|
// ResultUP : ????? UP
|
|
// ResultGP : ????? GP
|
|
RC::eGUILD_RESULT GuildManager::CanConvertUP2GP( GUILDGUID GuildGuid, CHARGUID OperGuid, GPTYPE ConverGP )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ??????? ??? ??????? ??????.
|
|
GuildMember* pMember = pGuild->FindMember( OperGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
// ?????? ????? ?????.
|
|
// ?????? .
|
|
if( !CheckRight( GuildGuid, OperGuid, eGUILD_RIGHTS_UP2GP ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
if( ConverGP*GUILD_UP2GP_RATE > pGuild->GetGuildUP() )
|
|
return RC::RC_GUILD_NOT_ENOUGH_UP;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
BOOL GuildManager::SetPoint( GUILDGUID GuildGuid, GPTYPE gp, UPTYPE up )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->SetGuildGP( gp );
|
|
pGuild->SetGuildUP( up );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanDonateUP( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
// ??? ??????? ??? ??????? ??????.
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
if( !CheckRight( GuildGuid, CharGuid, eGUILD_RIGHTS_DONATEUP ) )
|
|
return RC::RC_GUILD_HAVE_NOT_RIGHT;
|
|
|
|
// ??????? ?????? UP?? ??????????? ?????? ????.
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::DonateUP( GUILDGUID GuildGuid, UPTYPE TotalUP, CHARGUID CharGuid, UPTYPE DonateUP )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
GUILDLOG->LogUPDonation(pGuild, pMember, DonateUP, TotalUP);
|
|
|
|
pGuild->SetGuildUP( TotalUP );
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::LevelUpMember( GUILDGUID GuildGuid, CHARGUID CharGuid, LEVELTYPE Level )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
if( pMember->GetLevel() >= Level )
|
|
return RC::RC_GUILD_CANNOT_LEVELUP;
|
|
|
|
pMember->SetLevel( Level );
|
|
|
|
if( Level >= 31 && pMember->GetDuty() == eGUILD_DUTY_CAMP_SOLDIER )
|
|
return RC::RC_GUILD_KICK_GUILD_BY_LEVELUP;
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
BOOL GuildManager::GetWorldGuildInfo( GUILDGUID GuildGuid, OUT WORLD_GUILD_INFO& info )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return FALSE;
|
|
|
|
pGuild->GetWorldGuildInfo( info );
|
|
return TRUE;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanRequestTotalInfo( GUILDGUID GuildGuid, CHARGUID CharGuid )
|
|
{
|
|
Guild* pGuild = FindGuild( GuildGuid );
|
|
if( !pGuild ) return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
GuildMember* pMember = pGuild->FindMember( CharGuid );
|
|
if( !pMember ) return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
//???? ???? ????? 3? ??????..
|
|
if( pMember->GetTotalInfoReqCnt() > 3 )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "[GuildManager::CanRequestTotalInfo] 3? ??? ???TOTAL???? ?????. GuildGuid = %u, CharGuid = %u, CharName = %s",
|
|
GuildGuid, CharGuid, pMember->GetCharName() );
|
|
return RC::RC_GUILD_OVER_TOTALINFO_REQ_CNT;
|
|
}
|
|
|
|
pMember->SetTotalInfoReqCnt( pMember->GetTotalInfoReqCnt() + 1 );
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
VOID GuildManager::SetGuildNotice( GUILDGUID GuildGuid, const TCHAR* pszNotice )
|
|
{
|
|
Guild* pGuild = g_GuildManager.FindGuild( GuildGuid );
|
|
if( !pGuild ) return;
|
|
|
|
pGuild->SetGuildNotice( pszNotice );
|
|
|
|
}
|
|
|
|
VOID GuildManager::AddGuildName(std::string name, GUILDGUID idx)
|
|
{
|
|
m_GuildNameMap[name] = idx;
|
|
}
|
|
|
|
VOID GuildManager::RemoveGuildName(std::string guild_name)
|
|
{
|
|
GUILD_NAME_HASH::iterator it = m_GuildNameMap.find(guild_name);
|
|
if (it != m_GuildNameMap.end())
|
|
m_GuildNameMap.erase(it);
|
|
}
|
|
|
|
Guild* GuildManager::FindGuildName(std::string guild_name)
|
|
{
|
|
GUILDGUID guild_index(0);
|
|
GUILD_NAME_HASH::const_iterator it = m_GuildNameMap.find(guild_name);
|
|
if (it != m_GuildNameMap.end())
|
|
{
|
|
guild_index = it->second;
|
|
}
|
|
|
|
return FindGuild(guild_index );
|
|
}
|
|
|
|
GUILDGUID GuildManager::GetGuildGuidByGuildName(std::string guild_name)
|
|
{
|
|
GUILDGUID guild_index(0);
|
|
GUILD_NAME_HASH::const_iterator it = m_GuildNameMap.find(guild_name);
|
|
if (it != m_GuildNameMap.end())
|
|
{
|
|
guild_index = it->second;
|
|
}
|
|
|
|
return guild_index ;
|
|
}
|
|
|
|
CHARGUID GuildManager::GetGuildMasterByGuildName(std::string guild_name)
|
|
{
|
|
GUILDGUID guild_index(0);
|
|
GUILD_NAME_HASH::const_iterator it = m_GuildNameMap.find(guild_name);
|
|
if (it != m_GuildNameMap.end())
|
|
guild_index = it->second;
|
|
|
|
CHARGUID guild_master_index(0);
|
|
Guild* pGuild = FindGuild(guild_index);
|
|
if(pGuild)
|
|
{
|
|
GuildMember* pMember = pGuild->FindMaster();
|
|
if(pMember && pMember->IsLogIn())
|
|
{
|
|
guild_master_index = pMember->GetCharGuid();
|
|
}
|
|
}
|
|
|
|
return guild_master_index;
|
|
}
|
|
|
|
RC::eGUILD_RESULT GuildManager::CanChangeGuildName( GUILDGUID GuildGuid, CHARGUID OperCharGuid )
|
|
{
|
|
Guild *pGuild = FindGuild(GuildGuid);
|
|
if(!pGuild)
|
|
return RC::RC_GUILD_NOT_EXIST_GUILD;
|
|
|
|
if(GuildSmallContentsEntry::GuildPenalty::IsGuildDestroyWaitState(GuildGuid))
|
|
return RC::RC_GUILD_DELCHK_DESTROY_WAIT;
|
|
|
|
if( OperCharGuid != 0 ) //INVALID_CHARGUID
|
|
{// ??? ??????? ???? ????. (???????? ????????)
|
|
GuildMember* pMember = pGuild->FindMember( OperCharGuid );
|
|
if( !pMember )
|
|
return RC::RC_GUILD_NOT_GUILD_MEMBER;
|
|
|
|
if( eGUILD_DUTY_MASTER != pMember->GetDuty() )
|
|
return RC::RC_GUILD_NAME_CHANGE_CANNOT_GRADE;
|
|
}
|
|
|
|
return RC::RC_GUILD_SUCCESS;
|
|
}
|
|
|
|
VOID GuildManager::ChangeGuildName( GUILDGUID guid, const TCHAR* pszGuildName )
|
|
{
|
|
// ???? ??? ?????? ?????? ????.
|
|
// ??? ?????? ??????? ??????? ?????? ????? ???? ???? ?????, ??? ?????? ????.
|
|
// ??? ???? ???? ??? ???? ???? ????? ???.
|
|
Guild* pGuild = FindGuild(guid);
|
|
if( !pGuild )
|
|
return;
|
|
|
|
RemoveGuildName( pGuild->GetGuildName() );
|
|
pGuild->ChangeGuildName( pszGuildName );
|
|
AddGuildName( pGuild->GetGuildName(), pGuild->GetGuildGuid() );
|
|
|
|
|
|
// ??? ???? ??? ??? ???? ??? ?????????? ????.
|
|
STLX_VECTOR<GUILDGUID> vGuildGuid;
|
|
if( 0 == pGuild->GetRelationGuid(vGuildGuid) )
|
|
return;
|
|
|
|
STLX_VECTOR<GUILDGUID>::iterator it = vGuildGuid.begin();
|
|
for( ; it != vGuildGuid.end() ; ++it )
|
|
{
|
|
Guild* pGuild = FindGuild( *it );
|
|
if( pGuild )
|
|
pGuild->GetRelationEntry()->ChangeGuildName( guid, pszGuildName );
|
|
}
|
|
}
|
|
|