#include "StdAfx.h" #include #include #include "GuildManager.h" #include "GuildMember.h" #include "Guild.h" #include "PacketStruct_GZ.h" #include #include #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 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 vGuildGuid; if( 0 == pGuild->GetRelationGuid(vGuildGuid) ) return; STLX_VECTOR::iterator it = vGuildGuid.begin(); for( ; it != vGuildGuid.end() ; ++it ) { Guild* pGuild = FindGuild( *it ); if( pGuild ) pGuild->GetRelationEntry()->ChangeGuildName( guid, pszGuildName ); } }