#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ÀÇ °æ¿ì ÆÐ¹èÇßÀ» °æ¿ìº¸´Ù 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. ÇöÀç À¯ÀúÀÇ Á÷Ã¥ÀÌ ÇöÀç ±æµåµî±Þ¿¡ µî·ÏµÇ¾î ÀÖ´Â °ÍÀÎÁö üũÇÑ´Ù. 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; // ¼­ºê ¸¶½ºÅÍ¿Í ±º»ç¿¡°Ô¸¸ À§ÀÓµÈ ±ÇÇÑÀÌ Á¸ÀçÇÑ´Ù. 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. ÇöÀç ±º´Ü â¼³ °³¼ö¸¦ üũÇÏ¿© â¼³ °¡´ÉÇÑÁö È®ÀÎÇÑ´Ù. GuildRankInfo* pRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( pGuild->GetGuildGrade() ); 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ÀÇ Á¤º¸¸¦ °¡Áö°í ¿Â´Ù. GuildRankInfo* pRankInfo = GuildRankInfoParser::Instance()->FindGuildRankInfo( eGUILD_GRADE_LEGION ); 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; } //±æµåÃÊ´ë°¡ °¡´ÉÇѰ¡? 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¿¡¼­ ÇØÁÖÀÚ.. ¿©±â¼­´Â ÇØ´ç ±æµå¿¡ ±æµå¿øÀÎÁö¸¸ üũÇÑ´Ù. // ±× Àü¿¡ °ÔÀÓ¼­¹ö¿¡¼­ ÇØ´ç ij¸¯ÅÍ¿¡ ´ëÇÑ ±æµå üũ¸¦ ÇÏ°í ¿©±â ¿Â´Ù. 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¿¡¼­ ÇØÁÖÀÚ.. ¿©±â¼­´Â ÇØ´ç ±æµå¿¡ ±æµå¿øÀÎÁö¸¸ üũÇÑ´Ù. // ±× Àü¿¡ °ÔÀÓ¼­¹ö¿¡¼­ ÇØ´ç ij¸¯ÅÍ¿¡ ´ëÇÑ ±æµå üũ¸¦ ÇÏ°í ¿©±â ¿Â´Ù. 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; // ij¸¯ÅͰ¡ ¼ÒÀ¯ÇÑ 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 ); } }