#include "Stdafx.h" #include "Util.h" #include "DNGuildSystem.h" #include "DNGameDataManager.h" #if defined(_VILLAGESERVER) #include "DNGuildVillage.h" extern TVillageConfig g_Config; #elif defined(_GAMESERVER) #include "DNGuildGame.h" extern TGameConfig g_Config; #endif // _GAMESERVER #if defined(_VILLAGESERVER) #include "DNGuildWarManager.h" #elif defined(_GAMESERVER) #include "DNMasterConnectionManager.h" #endif // #if defined(_VILLAGESERVER) CDNGuildSystem * g_pGuildManager = NULL; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////// PUBLIC FUNCTION ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CDNGuildSystem::CDNGuildSystem () { m_bOpen = FALSE; m_DefaultSize = GUILDSIZE_DEF; m_TickDoUpdate = 0; m_nResetWareHour = 4; // ±âº»°ª DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TSCHEDULE ); if (pSox) m_nResetWareHour = pSox->GetFieldFromLablePtr(CDNSchedule::ResetGuildWareLimit + 1, "_Hour")->GetInteger(); } CDNGuildSystem::~CDNGuildSystem () { } DWORD CDNGuildSystem::Open (DWORD dwSize) { for (DWORD i=0; iOpen (this); if (NOERROR != dwRetVal) DN_RETURN (dwRetVal); // ±æµåÀÚ¿ø Ç®¿¡ Ãß°¡ m_Pool.push (pGuild); // Àüü ±æµå¸ñ·Ï¿¡ Ãß°¡ m_MainList.push_back (pGuild); } // ±ÇÇÑ ÃʱâÈ­ InitAuth(); // ±æµå±âº» Àοø m_DefaultSize = GUILDSIZE_DEF; m_bOpen = true; return NOERROR; } void CDNGuildSystem::Close() { // Àüü ±æµåÀÚ¿ø ÇØÁ¦ std::vector>::iterator iter = m_MainList.begin (); for (; iter != m_MainList.end(); iter++) { CDNGuildBase* pGuild = (*iter); if (pGuild) pGuild->Close (); SAFE_DELETE (pGuild); } m_MainList.clear(); m_CurrList.clear(); m_DismList.clear(); while(!m_Pool.empty()) m_Pool.pop(); for (int iIndex = 0 ; GUILDROLE_TYPE_CNT > iIndex ; ++iIndex) { m_AuthBase[iIndex].Reset(); m_AuthPrmt[iIndex].Reset(); m_AuthRstt[iIndex].Reset(); } m_bOpen = false; m_TickDoUpdate = 0; } DWORD CDNGuildSystem::Release (CDNGuildBase* pGuild) { // ±æµå ÀÚ¿øÀ» ÂüÁ¶ÇÒ Á¤º¸¸¦ Àӽà º¹»ç const TGuildUID GuildUID = pGuild->GetUID(); // ±æµåÀÚ¿ø ÃʱâÈ­ pGuild->Reset (); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // µ¿±âÈ­ ½ÃÀÛ ScopeLock AutoLock (GetLock()); #if !defined(_FINAL_BUILD) std::map::iterator iter = m_CurrList.find(GuildUID); if (m_CurrList.end() == iter) { DN_ASSERT(0, "Invalid!"); } #endif // _FINAL_BUILD // ÇöÀ縮½ºÆ®¿¡¼­ »èÁ¦ÇÑ´Ù m_CurrList.erase (GuildUID); // ¸Þ¸ð¸®Ç®¿¡ ¹Ýȯ m_Pool.push (pGuild); return NOERROR; } CDNGuildBase* CDNGuildSystem::At (const TGuildUID pGuildUID) { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // µ¿±âÈ­ ½ÃÀÛ ScopeLock AutoLock (GetLock()); std::map::iterator iter = m_CurrList.find(pGuildUID); if (m_CurrList.end() == iter) return NULL; CDNGuildBase* pGuild = iter->second; // CDNGuildManager::Release(...) ¿¡¼­ CDNGuildBase ÃʱâÈ­ ÀÌÈÄ¿¡ ¹ÝȯÇϹǷΠŸÀÌ¹Ö ¹®Á¦·Î ÀÌ·± °æ¿ì°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ½ if (!pGuild->IsSet()) return NULL; if (pGuild->GetUID() != pGuildUID) return NULL; return pGuild; } const CDNGuildBase* CDNGuildSystem::At (const TGuildUID pGuildUID) const { return(static_cast(const_cast(this)->At(pGuildUID))); } CDNGuildBase* CDNGuildSystem::Get (const TGuild* pInfo) { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // µ¿±âÈ­ ½ÃÀÛ ScopeLock AutoLock (GetLock()); std::map::iterator iter = m_CurrList.find(pInfo->GuildView.GuildUID); if (iter != m_CurrList.end()) return (iter->second); CDNGuildBase* pGuild = NULL; // ¸Þ¸ð¸®Ç®¿¡ ÀÚ¿øÀÌ ¾øÀ» °æ¿ì if (m_Pool.empty()) { pGuild = CreateGuildInstance(); if (!pGuild) DN_RETURN (NULL); // ±æµå ÃʱâÈ­ DWORD dwRetVal = pGuild->Open (this); if (NOERROR != dwRetVal) DN_RETURN(NULL); // Àüü ±æµå¸ñ·Ï¿¡ Ãß°¡ m_MainList.push_back (pGuild); } else { pGuild = m_Pool.front (); if (!pGuild) DN_RETURN (NULL); m_Pool.pop (); } DN_ASSERT(NULL != pGuild, "Invalid!"); DN_ASSERT(pGuild->IsOpen(), "Invalid!"); DN_ASSERT(!pGuild->IsSet(), "Invalid!"); // ±âÁ¸¿¡ ¼¼ÆÃµÈ Á¤º¸°¡ ¾ø¾î¾ß ÇÔ DN_ASSERT(!pGuild->IsEnable(), "Invalid!"); // ¾×¼¼½º°¡ ºñȰ¼ºÈ­ »óÅÂÀ̾î¾ß ÇÔ pGuild->ResetAccess(); // ¾×¼¼½º ÀçȰ¼ºÈ­ pGuild->Set (pInfo); // ¿î¿ëÁßÀÎ ±æµå¸®½ºÆ®¿¡ Ãß°¡ std::pair::iterator, bool> RetVal = m_CurrList.insert(std::map::value_type(pInfo->GuildView.GuildUID, pGuild)); if (!RetVal.second) DN_RETURN(NULL); return pGuild; } void CDNGuildSystem::GetMainList (TVecGuilds& pList) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); ScopeLock AutoLock (GetLock()); std::copy(m_MainList.begin(), m_MainList.end(), std::back_inserter(pList)); } void CDNGuildSystem::GetCurrList (std::vector>& pList) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); ScopeLock AutoLock (GetLock()); std::map::iterator iter = m_CurrList.begin (); for (; iter != m_CurrList.end(); iter++) pList.push_back (iter->first); } bool CDNGuildSystem::AddDismiss (const TGuildUID pGuildUID) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); DN_ASSERT(pGuildUID.IsSet(), "Invalid!"); ScopeLock AutoLock (GetLock()); std::pair ::const_iterator, bool> aRetVal = m_DismList.insert (pGuildUID); if (!aRetVal.second) DN_RETURN (false); return true; } bool CDNGuildSystem::IsDismissExist (const TGuildUID pGuildUID) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); DN_ASSERT(pGuildUID.IsSet(), "Invalid!"); ScopeLock AutoLock (GetLock()); std::set::const_iterator iter = m_DismList.find (pGuildUID); if (iter != m_DismList.end ()) return true; return false; } void CDNGuildSystem::DoUpdate (DWORD CurTick) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); // Àüü ±æµå Á¤º¸°»½Å (10ÃÊ) if (GUILDMGRUPDTERM > GetTickTerm (m_TickDoUpdate, CurTick)) return; m_TickDoUpdate = CurTick; // º¹»çº»À» ¸¸µç´Ù std::vector , boost::pool_allocator> aList; { ScopeLock AutoLock (GetLock()); std::copy(m_CurrList.begin(), m_CurrList.end(), std::back_inserter(aList)); } // µî·ÏµÈ ±æµå°¡ ¾øÀ¸¸é ¸®ÅÏ if (aList.empty ()) return; // ±æµåÀ̺¥Æ®¿¡ ´ëÇØ ¾÷µ¥ÀÌÆ® std::vector , boost::pool_allocator>::iterator iter = aList.begin (); for (; iter != aList.end(); iter++) { const TGuildUID GuildUID = iter->first; DN_ASSERT(GuildUID.IsSet(), "Invalid!"); CDNGuildBase* pGuild = static_cast(iter->second); DN_ASSERT(NULL != pGuild, "Invalid!"); if (!pGuild) continue; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) continue; #endif if (!pGuild->IsSet ()) continue; pGuild->DoUpdate (CurTick); } } void CDNGuildSystem::OnRecvMaDismissGuild (const MADismissGuild *pPacket) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); DN_ASSERT(NULL != pPacket, "Invalid!"); #if defined(_WORK) DN_ASSERT(0 != pPacket->nManagedID, "Invalid!"); #endif // _WORK // ÀÚ½ÅÀÌ MA ¿¡ º¸³Â´ø ÆÐŶÀº ¼Û½Å ÀÌÀü¿¡ º» ¼­¹ö¿¡¼­ ¸ÕÀú 󸮵ǾúÀ½À» ÀüÁ¦·Î ÇϹǷΠÃß°¡·Î ó¸®ÇÏÁö ¾ÊÀ½ if (pPacket->nManagedID == g_Config.nManagedID) return; // ÀÌ¹Ì ÇØÃ¼µÈ ±æµåÀÎÁö È®ÀÎÇÑ´Ù. if (IsDismissExist (pPacket->GuildUID)) return; // ±æµå ÇØ»ê ¸ñ·Ï¿¡ µî·Ï AddDismiss (pPacket->GuildUID); CDNGuildBase* pGuild = At (pPacket->GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå ÀÚ¿ø ¹Ý³³ pGuild->DisableAttach (); #endif } bool CDNGuildSystem::PreRecvProcess (int nManagedID, TGuildUID pGuildUID, CDNGuildBase*& pGuild, bool bCheckManagdID) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); #if defined(_WORK) DN_ASSERT(0 != nManagedID, "Invalid!"); #endif // _WORK if (nManagedID == g_Config.nManagedID && bCheckManagdID) return false; if (IsDismissExist(pGuildUID)) return false; pGuild = At (pGuildUID); if (!pGuild) return false; return true; } void CDNGuildSystem::OnRecvMaAddGuildMember (const MAAddGuildMember *pPacket) { CDNGuildBase* pGuild = NULL; if (false == PreRecvProcess (pPacket->nManagedID, pPacket->GuildUID, pGuild)) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif //À§Ä¡Á¤º¸ TCommunityLocation Location; Location.Reset(); // ±æµå¿ø Á¤º¸ Ãß°¡ TGuildMember GuildMember; GuildMember.Set(pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->wszCharacterName, pPacket->nJob, pPacket->cLevel, GUILDROLE_TYPE_JUNIOR, pPacket->JoinDate); if (false == pGuild->AddMember(&GuildMember, &Location)) return; pGuild->SendAddGuildMember (pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->wszCharacterName, pPacket->nJob, pPacket->cLevel, pPacket->JoinDate, &Location); } // ±æµå¿ø Á¤º¸ Á¦°Å void CDNGuildSystem::OnRecvMaDelGuildMember (const MADelGuildMember *pPacket) { CDNGuildBase* pGuild = NULL; if (false == PreRecvProcess (pPacket->nManagedID, pPacket->GuildUID, pGuild)) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->SendDelGuildMember (pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->bIsExiled); // Á¦°ÅÇÒ ±æµå¿ø Æ÷ÇÔÇÏ¿© À§¿¡¼­ ¿ì¼± ÅëÁö ¸Þ½ÃÁö ºÎÅÍ º¸³¿, ´Ù¸¸ °ÔÀÓ¼­¹ö´Â ÇØ´ç »ç¿ëÀÚÀÇ ÀÛ¾÷ ½º·¹µå¿¡ µµ´Þ ÇßÀ» °æ¿ì´Â Áö¿¬»èÁ¦ÇÏ¿©µµ ÀÌ¹Ì Áö¿öÁø »óÅÂÀ̹ǷΠÀüü »ç¿ëÀÚ¸¦ ´ë»óÀ¸·Î ã¾Æ¾ß ÇÔ (20100210 b4nfter) pGuild->DelMember (pPacket->nCharacterDBID); } // ±æµåÁ¤º¸ º¯°æ void CDNGuildSystem::OnRecvMaChangeGuildInfo (const MAChangeGuildInfo *pPacket) { CDNGuildBase* pGuild = NULL; if (false == PreRecvProcess (pPacket->nManagedID, pPacket->GuildUID, pGuild)) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif switch (pPacket->btGuildUpdate) { // °øÁöº¯°æ case GUILDUPDATE_TYPE_NOTICE: MaChangeNotification (pGuild, pPacket); break; // Á÷±Þ ±ÇÇÑ º¯°æ case GUILDUPDATE_TYPE_ROLEAUTH: MaChangeRoleAuth (pGuild, pPacket); break; case GUILDUPDATE_TYPE_GUILDWAR : MaChangeGuildWarFinalInfo(pGuild, pPacket); break; #if defined( PRE_ADD_GUILD_EASYSYSTEM ) case GUILDUPDATE_TYPE_HOMEPAGE: MaChangeGuildHomePage(pGuild, pPacket); break; #endif default: break; } // ÇöÀç ¼­¹ö¿¡ Á¢¼Ó ÁßÀÎ ±æµå¿øµé¿¡°Ô Å뺸 pGuild->SendChangeGuildInfo (pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->btGuildUpdate, pPacket->Int1, pPacket->Int2, pPacket->Int3, pPacket->Int4, pPacket->Int64, pPacket->Text); } void CDNGuildSystem::OnRecvMaChangeGuildMemberInfo (const MAChangeGuildMemberInfo *pPacket) { DN_ASSERT(NULL != pPacket, "Invalid!"); CDNGuildBase* pGuild = NULL; if (false == PreRecvProcess (pPacket->nManagedID, pPacket->GuildUID, pGuild)) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif switch (pPacket->btGuildMemberUpdate) { // ÀÚ±â¼Ò°³ º¯°æ (±æµå¿øÀÚ½Å) case GUILDMEMBUPDATE_TYPE_INTRODUCE: MaModifyMembIntro (pGuild, pPacket); break; // Á÷±Þ º¯°æ case GUILDMEMBUPDATE_TYPE_ROLE: MaModifyTypeRole (pGuild, pPacket); break; // ±æµåÀå À§ÀÓ case GUILDMEMBUPDATE_TYPE_GUILDMASTER: MaDelegateGuildMaster (pGuild, pPacket); break; #ifdef PRE_ADD_CHANGEJOB_CASHITEM case GUILDMEMBUPDATE_TYPE_JOBCODE: MaModifyMembJob (pGuild, pPacket->nReqCharacterDBID, pPacket->Int1); break; #endif case GUILDMEMBUPDATE_TYPE_LOGINOUT: MaChangeConnectState(pGuild, pPacket); break; default: return; } pGuild->SendChangeGuildMemberInfo (pPacket->nReqAccountDBID, pPacket->nReqCharacterDBID, pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, pPacket->Int1, pPacket->Int2, pPacket->Int64, pPacket->Text); } void CDNGuildSystem::OnRecvMaGuildChat (const MAGuildChat *pPacket) { CDNGuildBase* pGuild = NULL; if (false == PreRecvProcess (pPacket->nManagedID, pPacket->GuildUID, pGuild, false)) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->SendGuildChat (pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->wszChatMsg, pPacket->nLen); } #ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT void CDNGuildSystem::OnRecvMaDoorsGuildChat(const MADoorsGuildChat *pPacket) { CDNGuildBase* pGuild = NULL; if (false == PreRecvProcess(pPacket->nManagedID, pPacket->GuildUID, pGuild, false)) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif if (pGuild->IsMemberExist(pPacket->nCharacterDBID, NULL)) { pGuild->SendDoorsGuildChat(pPacket->nCharacterDBID, pPacket->wszChatMsg, pPacket->nLen); return; } _DANGER_POINT_MSG(L"±æµåÀοøÀÌ ¾Æ´Ñµ¥ ¸ð¹ÙÀÏ¿¡¼­ ¸Þ¼¼Áö°¡ µé¾î¿Ô´Ù"); } #endif //#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT void CDNGuildSystem::OnRecvMaGuildChangeName(const MAGuildChangeName *pPacket) { // ÇØ´ç±æµå¸¦ ã´Â´Ù. if (!pPacket->GuildUID.IsSet()) return; CDNGuildBase* pGuild = this->At (pPacket->GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif _wcscpy( pGuild->SetInfo()->GuildView.wszGuildName, _countof(pGuild->SetInfo()->GuildView.wszGuildName), pPacket->wszGuildName, (int)wcslen(pPacket->wszGuildName) ); pGuild->SendChangeGuildName(pPacket->wszGuildName); } void CDNGuildSystem::OnRecvMaGuildChangeMark(const MAGuildChangeMark *pPacket) { // ÇØ´ç±æµå¸¦ ã´Â´Ù. if (!pPacket->GuildUID.IsSet()) return; CDNGuildBase* pGuild = this->At (pPacket->GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->SetInfo()->GuildView.wGuildMark = pPacket->wMark; pGuild->SetInfo()->GuildView.wGuildMarkBG = pPacket->wMarkBG; pGuild->SetInfo()->GuildView.wGuildMarkBorder = pPacket->wMarkBorder; pGuild->SendChangeGuildMark(pPacket); } void CDNGuildSystem::OnRecvMaGuildUpdateExp( const MAUpdateGuildExp* pPacket ) { // ÇØ´ç±æµå¸¦ ã´Â´Ù. if (!pPacket->GuildUID.IsSet()) return; CDNGuildBase* pGuild = this->At (pPacket->GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->UpdateGuildExp(pPacket); } void CDNGuildSystem::OnRecvMaEnrollGuildWar(const MAEnrollGuildWar *pPacket) { // ÇØ´ç±æµå¸¦ ã´Â´Ù. if (!pPacket->GuildUID.IsSet()) return; CDNGuildBase* pGuild = this->At (pPacket->GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->UpdateWarInfoOnAllMember(pPacket->wScheduleID, pPacket->cTeamColorCode); } void CDNGuildSystem::OnRecvMaMemberLevelUp (const MAGuildMemberLevelUp *pPacket) { CDNGuildBase* pGuild = NULL; if (false == PreRecvProcess (pPacket->nManagedID, pPacket->GuildUID, pGuild)) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->UpdateMemberLevel (pPacket->nCharacterDBID, pPacket->cLevel); } void CDNGuildSystem::OnRecvCsGetGuildInfo (CDNUserSession * pSession, const CSGetGuildInfo *pPacket) { const TGuildUID GuildUID = pSession->GetGuildSelfView().GuildUID; if (!GuildUID.IsSet()) return; CDNGuildBase* pGuild = this->At (GuildUID); if (pGuild) { // ±æµå Á¤º¸ ÀÖÀ½ #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif if( pGuild->GetRecvAllMember() == false ) return; // ±æµå¿ø¸ñ·Ï ´Ù ¹Þ¾Ò´ÂÁö üũ // ÆÐŶÀ» ±¸¼ºÇÑ´Ù pSession->SendGetGuildInfo(pGuild, ERROR_NONE); pSession->SendGetGuildMember(pGuild, ERROR_NONE); return; } if (IsDismissExist(GuildUID)) { // ±æµå°¡ ÀÌ¹Ì ÇØÃ¼ µÇ¾ú´Ù¸é ±æµå ½Ã°¢Á¤º¸¸¦ ÃʱâÈ­ÇÏ¿© ÁÖº¯ µ¿±âÈ­ pSession->ResetGuildSelfView (); return; } // P.S.> ±æµå Á¤º¸°¡ Á¸ÀçÇÏÁö ¾Ê´õ¶óµµ ¿©±â¿¡¼­´Â Àý´ë DB ·Î Á÷Á¢ È®ÀÎ ¿äûÀ» º¸³»¼­´Â ¾ÊµÊ (»ç¿ëÀÚ ·Î±×ÀÎ ½Ã 1ȸ ¹ß»ý) } void CDNGuildSystem::OnRecvCsGetGuildWareHistory (CDNUserSession * pSession, CSGetGuildWareHistory *pPacket) { // ÇØ´ç±æµå¸¦ ã´Â´Ù. const TGuildUID GuildUID = pSession->GetGuildSelfView().GuildUID; if (!GuildUID.IsSet()) return; CDNGuildBase* pGuild = this->At (GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif // ±æµåâ°í È÷½ºÅ丮 À̺¥Æ® ó¸® pGuild->RecvCsGetGuildWareHistory (pSession, pPacket); } void CDNGuildSystem::OnRecvCsCloseGuildWare (CDNUserSession * pSession) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); DN_ASSERT(NULL != pSession, "Invalid!"); // ÇØ´ç±æµå¸¦ ã´Â´Ù. const TGuildUID GuildUID = pSession->GetGuildSelfView().GuildUID; if (!GuildUID.IsSet()) return; CDNGuildBase* pGuild = this->At (GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif // ±æµåâ°í ¿­±â À̺¥Æ® ó¸® pGuild->RecvCsCloseGuildWare (pSession); } bool CDNGuildSystem::OnRecvApiOpenGuildWare (CDNUserSession * pSession) { DN_ASSERT(IsOpen(), "Not Opened!"); DN_ASSERT(!IsLock(), "Already Locked!"); DN_ASSERT(NULL != pSession, "Invalid!"); // ÇØ´ç±æµå¸¦ ã´Â´Ù. const TGuildUID GuildUID = pSession->GetGuildSelfView().GuildUID; if (!GuildUID.IsSet()) return false; CDNGuildBase* pGuild = this->At (GuildUID); if (!pGuild) return false; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return false; #endif // ±æµåâ°í ¿­±â À̺¥Æ® ó¸® pGuild->RecvApiOpenGuildWare (pSession); return true; } DWORD CDNGuildSystem::GetAuthBase (eGuildRoleType pGuildRoleType) const { DN_ASSERT(CHECK_LIMIT(pGuildRoleType, GUILDROLE_TYPE_CNT), "Invalid!"); return m_AuthBase[pGuildRoleType].GetRaw(); } DWORD CDNGuildSystem::GetAuthPrmt (eGuildRoleType pGuildRoleType) const { DN_ASSERT(CHECK_LIMIT(pGuildRoleType, GUILDROLE_TYPE_CNT), "Invalid!"); return m_AuthPrmt[pGuildRoleType].GetRaw(); } DWORD CDNGuildSystem::GetAuthRstt (eGuildRoleType pGuildRoleType) const { DN_ASSERT(CHECK_LIMIT(pGuildRoleType, GUILDROLE_TYPE_CNT), "Invalid!"); return m_AuthRstt[pGuildRoleType].GetRaw(); } const CBitSetEx1& CDNGuildSystem::RefAuthBase (eGuildRoleType pGuildRoleType) const { DN_ASSERT(CHECK_LIMIT(pGuildRoleType, GUILDROLE_TYPE_CNT), "Invalid!"); return m_AuthBase[pGuildRoleType]; } const CBitSetEx1& CDNGuildSystem::RefAuthPrmt (eGuildRoleType pGuildRoleType) const { DN_ASSERT(CHECK_LIMIT(pGuildRoleType, GUILDROLE_TYPE_CNT), "Invalid!"); return m_AuthPrmt[pGuildRoleType]; } const CBitSetEx1& CDNGuildSystem::RefAuthRstt (eGuildRoleType pGuildRoleType) const { DN_ASSERT(CHECK_LIMIT(pGuildRoleType, GUILDROLE_TYPE_CNT), "Invalid!"); return m_AuthRstt[pGuildRoleType]; } void CDNGuildSystem::SetAuthBase (int pGuildRoleAuth[GUILDROLE_TYPE_CNT]) const { DN_ASSERT(NULL != pGuildRoleAuth, "Invalid!"); for (int iIndex = 0 ; GUILDROLE_TYPE_CNT > iIndex ; ++iIndex) { pGuildRoleAuth[iIndex] |= GetAuthBase(static_cast(iIndex)); } } void CDNGuildSystem::SetAuthMust (int pGuildRoleAuth[GUILDROLE_TYPE_CNT]) const { DN_ASSERT(NULL != pGuildRoleAuth, "Invalid!"); for (int iIndex = 0 ; GUILDROLE_TYPE_CNT > iIndex ; ++iIndex) { pGuildRoleAuth[iIndex] |= GetAuthPrmt(static_cast(iIndex)); pGuildRoleAuth[iIndex] &= (~GetAuthRstt(static_cast(iIndex))); } } void CDNGuildSystem::SetRoleLimitation (TGuild* pDestInfo) { int wGuildRoleAuth [GUILDROLE_TYPE_CNT]; INT nRoleMaxItem[GUILDROLE_TYPE_CNT]; INT nRoleMaxCoin[GUILDROLE_TYPE_CNT]; memset(nRoleMaxItem, 0, sizeof(nRoleMaxItem)); memset(nRoleMaxCoin, 0, sizeof(nRoleMaxCoin)); SetAuthBase (wGuildRoleAuth); SetAuthMust (wGuildRoleAuth); #if defined( PRE_ADD_CHANGEGUILDROLE ) for (int i=GUILDROLE_TYPE_SENIOR; iwGuildRoleAuth[i] == -1 || pDestInfo->nRoleMaxItem[i] == -1 || pDestInfo->nRoleMaxCoin[i] == -1) { // ÆÐ½ºÇÑ´Ù. } else { // ±ÇÇÑ wGuildRoleAuth [i] = pDestInfo->wGuildRoleAuth[i]; // ¾ÆÀÌÅÛÁ¦ÇÑ nRoleMaxItem [i] = pDestInfo->nRoleMaxItem[i]; // ÄÚÀÎ Á¦ÇÑ nRoleMaxCoin [i] = pDestInfo->nRoleMaxCoin[i]; } } memcpy (pDestInfo->wGuildRoleAuth, wGuildRoleAuth, sizeof(pDestInfo->wGuildRoleAuth)); memcpy (pDestInfo->nRoleMaxItem, nRoleMaxItem, sizeof(pDestInfo->nRoleMaxItem)); memcpy (pDestInfo->nRoleMaxCoin, nRoleMaxCoin, sizeof(pDestInfo->nRoleMaxCoin)); } void CDNGuildSystem::UpdateGuildResource (TAGetGuildInfo *pPacket) { // ±æµå ±ÇÇÑ Àû¿ë this->SetAuthMust (pPacket->Info.wGuildRoleAuth); const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID); CDNGuildBase* pGuild = this->At (GuildUID); // ¿ªÇÒ ¼¼ÆÃ SetRoleLimitation (&pPacket->Info); // ±æµåÀÚ¿øÀÌ ¾ø´Â °æ¿ì (ÇØ´ç¼­¹ö¿¡ Á¢¼ÓÇϴ ù ±æµå¿øÀÏ °æ¿ì) if (!pGuild) { // ±æµåÀÚ¿øÀ» ¾ò¾î¿Â´Ù. pGuild = this->Get (&pPacket->Info); if (!pGuild) return; // ÇÒ´ç½ÇÆÐ #if defined(_VILLAGESERVER) pGuild->SetGuildWarScheduleID(g_pGuildWarManager->GetScheduleID()); // ¸¸¾à ¿ì½Â±æµå À̸é if( g_pGuildWarManager->GetPreWinGuildUID() == GuildUID ) { CDNGuildVillage* pGuildVillage = static_cast(pGuild); pGuildVillage->SendGuildWarPreWinGuild(true); } #elif defined(_GAMESERVER) pGuild->SetGuildWarScheduleID(g_pMasterConnectionManager->GetGuildWarScheduleID(pPacket->cWorldSetID)); #endif // #if defined(_VILLAGESERVER) } else // ±âÁ¸ ±æµåÀÚ¿øÀÌ ÀÖ´Â °æ¿ì pGuild->Set (&pPacket->Info); #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->ReqGetGuildWareInfo (); } void CDNGuildSystem::UpdateGuildMember (TAGetGuildMember *pPacket) { const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID); CDNGuildBase* pGuild = this->At (GuildUID); if(pGuild) { #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->UpdateMember (pPacket); } } void CDNGuildSystem::OpenGuildWare (const TAGetGuildWareInfo *pPacket) { const TGuildUID GuildUID (pPacket->cWorldSetID, pPacket->nGuildDBID); CDNGuildBase* pGuild = this->At (GuildUID); if (!pGuild) return; #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->OpenWare (pPacket); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////// PRIVATE FUNCTION ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CDNGuildSystem::MaChangeNotification (CDNGuildBase* pGuild, const MAChangeGuildInfo *pPacket) { _wcscpy(pGuild->SetInfo()->wszGuildNotice, _countof(pGuild->GetInfo()->wszGuildNotice), pPacket->Text, (int)wcslen(pPacket->Text)); } void CDNGuildSystem::MaChangeRoleAuth (CDNGuildBase* pGuild, const MAChangeGuildInfo *pPacket) { DN_ASSERT(CHECK_LIMIT(pPacket->Int1, GUILDROLE_TYPE_CNT), "Invalid!"); pGuild->SetInfo()->wGuildRoleAuth[pPacket->Int1] = static_cast(pPacket->Int2); pGuild->SetInfo()->nRoleMaxItem[pPacket->Int1] = static_cast(pPacket->Int3); pGuild->SetInfo()->nRoleMaxCoin[pPacket->Int1] = static_cast(pPacket->Int4); } void CDNGuildSystem::MaChangePoint (CDNGuildBase* pGuild, const MAChangeGuildInfo *pPacket) { pGuild->SetInfo()->iTotalGuildExp = static_cast(pPacket->Int2); pGuild->CheckGuildInfo(); } void CDNGuildSystem::MaChangeGuildWarFinalInfo(CDNGuildBase* pGuild, const MAChangeGuildInfo *pPacket) { pGuild->SetInfo()->nGuildWarFinalCount += pPacket->Int1; pGuild->SetInfo()->nGuildWarFinalWinCount += pPacket->Int2; } #if defined( PRE_ADD_GUILD_EASYSYSTEM ) void CDNGuildSystem::MaChangeGuildHomePage(CDNGuildBase* pGuild, const MAChangeGuildInfo *pPacket) { _wcscpy(pGuild->SetInfo()->wszGuildHomePage, _countof(pGuild->GetInfo()->wszGuildHomePage), pPacket->Text, (int)wcslen(pPacket->Text)); } #endif #ifdef PRE_ADD_CHANGEJOB_CASHITEM void CDNGuildSystem::MaModifyMembJob (CDNGuildBase* pGuild, INT64 nCharacterDBID, int nChangeJob) { TGuildMember* pGuildMember = NULL; ScopeLock AutoLock (pGuild->GetLock()); pGuildMember = pGuild->GetMemberInfoAsync (nCharacterDBID); if (pGuildMember) pGuildMember->nJob = nChangeJob; } #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CDNGuildSystem::MaModifyMembIntro (CDNGuildBase* pGuild, const MAChangeGuildMemberInfo* pPacket) { { ScopeLock AutoLock (pGuild->GetLock()); TGuildMember* pGuildMember = pGuild->GetMemberInfoAsync (pPacket->nReqCharacterDBID); if (pGuildMember) _wcscpy(pGuildMember->wszGuildMemberIntroduce, _countof(pGuildMember->wszGuildMemberIntroduce), pPacket->Text, (int)wcslen(pPacket->Text)); } } void CDNGuildSystem::MaModifyTypeRole (CDNGuildBase* pGuild, const MAChangeGuildMemberInfo* pPacket) { ScopeLock AutoLock (pGuild->GetLock()); TGuildMember* pGuildMember = pGuild->GetMemberInfoAsync (pPacket->nChgCharacterDBID); if (pGuildMember) pGuildMember->btGuildRole = static_cast(pPacket->Int1); } void CDNGuildSystem::MaDelegateGuildMaster (CDNGuildBase* pGuild, const MAChangeGuildMemberInfo* pPacket) { TGuildMember* pGuildMember = NULL; ScopeLock AutoLock (pGuild->GetLock()); // À§ÀÓ¹ÞÀº ÀÚ pGuildMember = pGuild->GetMemberInfoAsync (pPacket->nChgCharacterDBID); if (pGuildMember) { pGuildMember->btGuildRole = static_cast(GUILDROLE_TYPE_MASTER); pGuild->SetGuildMaster( pGuildMember ); } // ¿äûÇÑ ÀÚ (±âÁ¸¸¶½ºÅÍ) pGuildMember = pGuild->GetMemberInfoAsync (pPacket->nReqCharacterDBID); if (pGuildMember) pGuildMember->btGuildRole = static_cast(GUILDROLE_TYPE_SUBMASTER); } void CDNGuildSystem::MaChangeConnectState (CDNGuildBase* pGuild, const MAChangeGuildMemberInfo* pPacket) { ScopeLock AutoLock (pGuild->GetLock()); TGuildMember* pGuildMember = pGuild->GetMemberInfoAsync (pPacket->nChgCharacterDBID); if (!pGuildMember) return; //·Î±×¾Æ¿ô ó¸® switch(pPacket->Int1) { case _LOCATION_NONE: //·Î±× ¾Æ¿ô { pGuildMember->Location.Reset (); } break; case _LOCATION_MOVE: //·Î±×ÀÎ { pGuildMember->Location.cServerLocation = _LOCATION_MOVE; } break; default: { } break; } } void CDNGuildSystem::UpdateGuildRewardItem( TAGetGuildRewardItem *pGuildRewardItem ) { TGuildRewardItem RewardItemInfo[GUILDREWARDEFFECT_TYPE_CNT]; memset( RewardItemInfo, 0, sizeof(RewardItemInfo)); for(int i=0;inCount;i++) { TGuildRewardItemData* pItemData = g_pDataManager->GetGuildRewardItemData( pGuildRewardItem->RewardItemInfo[i].nItemID ); if(pItemData) { int nIndex = pItemData->nItemType; if( nIndex >= GUILDREWARDEFFECT_TYPE_CNT ) { continue; } RewardItemInfo[nIndex].nItemID = pGuildRewardItem->RewardItemInfo[i].nItemID; RewardItemInfo[nIndex].nItemType = pItemData->nItemType; RewardItemInfo[nIndex].nEffectValue = pItemData->nTypeParam1; #if defined( PRE_ADD_GUILDREWARDITEM ) RewardItemInfo[nIndex].nEffectValue2 = pItemData->nTypeParam2; #endif RewardItemInfo[nIndex].bEternity = pGuildRewardItem->RewardItemInfo[i].bEternity; RewardItemInfo[nIndex].m_tExpireDate = pGuildRewardItem->RewardItemInfo[i].m_tExpireDate; } } const TGuildUID GuildUID(pGuildRewardItem->cWorldSetID, pGuildRewardItem->nGuildDBID); CDNGuildBase* pGuild = this->At(GuildUID); if (!pGuild) { return; } #if !defined( PRE_ADD_NODELETEGUILD ) CDetachAutoEx AutoDetach(pGuild); if (FALSE == pGuild->IsEnable()) return; #endif pGuild->SetGuildRewardItem(RewardItemInfo); pGuild->SendGuildRewardItem(RewardItemInfo); } int CDNGuildSystem::BuyGuildRewardItem( CDNUserSession * pSession, int nItemID ) { int nRet = ERROR_NONE; #if defined( _VILLAGESERVER ) const TGuildUID GuildUID = pSession->GetGuildSelfView().GuildUID; if (!GuildUID.IsSet()) return ERROR_GUILD_NOTEXIST_GUILD; CDNGuildBase* pGuild = this->At (GuildUID); if (!pGuild) return ERROR_GUILD_NOTEXIST_GUILD; #if !defined( PRE_ADD_NODELETEGUILD ) // ±æµå°¡ Á¸ÀçÇÑ´Ù. CDetachAutoEx AutoDetach (pGuild); if (FALSE == pGuild->IsEnable()) return ERROR_GUILD_NOTEXIST_GUILD; #endif //±æµåº¸»ó¾ÆÀÌÅÛ ±¸ÀÔ TGuildRewardItemData* pGuildRewardItemData = g_pDataManager->GetGuildRewardItemData(nItemID) ; if(pGuildRewardItemData) { // Á¶°Ç üũ if( pGuildRewardItemData->nItemType >= GUILDREWARDEFFECT_TYPE_CNT ) { pSession->SendBuyGuildRewardItem(ERROR_ITEM_FAIL, 0); return ERROR_ITEM_FAIL; } if( pGuildRewardItemData->bCheckMaster ) { if(pSession->GetGuildSelfView().btGuildRole != GUILDROLE_TYPE_MASTER ) { pSession->SendBuyGuildRewardItem(ERROR_GUILD_ONLYAVAILABLE_GUILDMASTER, 0); return ERROR_GUILD_ONLYAVAILABLE_GUILDMASTER; } } if( pGuild->GetLevel() < pGuildRewardItemData->nNeedGuildLevel ) { pSession->SendBuyGuildRewardItem(ERROR_GUILD_LACKOFCOUNT_GUILDLEVEL, 0); return ERROR_GUILD_LACKOFCOUNT_GUILDLEVEL; } if( pGuildRewardItemData->nItemType == GUILDREWARDEFFECT_TYPE_MAXGUILDWARE ) { // ±æµå â°í ÃÖ´ëÅ©±â üũ TGuildRewardItemData* PrevGuildRewardItemData = g_pDataManager->GetGuildRewardItemData(pGuildRewardItemData->nCheckID); short nGuildWareSize = pGuild->GetWareSize(); int nExtendWareSize = pGuildRewardItemData->nTypeParam1; if(PrevGuildRewardItemData) { nExtendWareSize = nExtendWareSize - PrevGuildRewardItemData->nTypeParam1; } if( nGuildWareSize + nExtendWareSize > GUILD_WAREHOUSE_MAX) { pSession->SendBuyGuildRewardItem(ERROR_ALREADY_MAXGUILDWARE, 0); return ERROR_ALREADY_MAXGUILDWARE; } } if( pGuildRewardItemData->nItemType == GUILDREWARDEFFECT_TYPE_GUILDITEM || pGuildRewardItemData->nItemType == GUILDREWARDEFFECT_TYPE_MAKEGUILDMARK ) { // °ÔÀÓ Ä¡ÀåÇü ¾ÆÀÌÅÛ nRet = pSession->GetItem()->ProcessBuyPrivateGuildRewardItem( pGuildRewardItemData, 1 ); } else { // ±æµåÀüü È¿°ú nRet = pSession->GetItem()->ProcessBuyPublicGuildRewardItem( pGuild->GetGuildRewardItem(), pGuildRewardItemData, GuildUID.nDBID ); } } if(nRet != ERROR_NONE ) { pSession->SendBuyGuildRewardItem(nRet, 0); } #endif return nRet; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CDNGuildBase* CDNGuildSystem::CreateGuildInstance () { #ifdef _VILLAGESERVER return new CDNGuildVillage; #elif _GAMESERVER return new CDNGuildGame; #endif } #if defined(_DEBUG) bool CDNGuildSystem::IsLock() const { return(m_Lock.IsLock()); } #endif // _DEBUG void CDNGuildSystem::InitAuth () { for (int iIndex = 0 ; GUILDROLE_TYPE_CNT > iIndex ; ++iIndex) { m_AuthBase[iIndex].Reset(); m_AuthPrmt[iIndex].Reset(); m_AuthRstt[iIndex].Reset(); } // ÃÖÃÊ // GUILDROLE_TYPE_MASTER ±æµåÀå m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_EXILE, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_NOTICE, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_INVITE, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_BATTLE, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_SKILL, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_STOREITEM, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_TAKEITEM, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_WITHDRAW, 1); m_AuthBase[GUILDROLE_TYPE_MASTER].Set(GUILDAUTH_TYPE_HOMEPAGE, 1); // GUILDROLE_TYPE_SUBMASTER ±æµåºÎÀå m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_EXILE, 1); m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_NOTICE, 1); m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_INVITE, 1); m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_BATTLE, 1); m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_SKILL, 1); m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_STOREITEM, 1); m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_TAKEITEM, 1); m_AuthBase[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_WITHDRAW, 1); // GUILDROLE_TYPE_SENIOR ¼±ÀÓ±æµå¿ø m_AuthBase[GUILDROLE_TYPE_SENIOR].Set(GUILDAUTH_TYPE_INVITE, 1); m_AuthBase[GUILDROLE_TYPE_SENIOR].Set(GUILDAUTH_TYPE_SKILL, 1); m_AuthBase[GUILDROLE_TYPE_SENIOR].Set(GUILDAUTH_TYPE_STOREITEM, 1); m_AuthBase[GUILDROLE_TYPE_SENIOR].Set(GUILDAUTH_TYPE_TAKEITEM, 1); m_AuthBase[GUILDROLE_TYPE_SENIOR].Set(GUILDAUTH_TYPE_WITHDRAW, 1); // GUILDROLE_TYPE_REGULAR Á¤½Ä±æµå¿ø m_AuthBase[GUILDROLE_TYPE_REGULAR].Set(GUILDAUTH_TYPE_SKILL, 1); m_AuthBase[GUILDROLE_TYPE_REGULAR].Set(GUILDAUTH_TYPE_STOREITEM, 1); m_AuthBase[GUILDROLE_TYPE_REGULAR].Set(GUILDAUTH_TYPE_TAKEITEM, 1); // ºÒ°¡ // ±æµåºÎÀå #if !defined( PRE_ADD_CHANGEGUILDROLE ) m_AuthRstt[GUILDROLE_TYPE_SUBMASTER].Set(GUILDAUTH_TYPE_EXILE, 1); #endif // ¼±ÀÓ±æµå¿ø m_AuthRstt[GUILDROLE_TYPE_SENIOR].Set(GUILDAUTH_TYPE_EXILE, 1); // Á¤½Ä±æµå¿ø m_AuthRstt[GUILDROLE_TYPE_REGULAR].Set(GUILDAUTH_TYPE_EXILE, 1); m_AuthRstt[GUILDROLE_TYPE_REGULAR].Set(GUILDAUTH_TYPE_NOTICE, 1); m_AuthRstt[GUILDROLE_TYPE_REGULAR].Set(GUILDAUTH_TYPE_INVITE, 1); m_AuthRstt[GUILDROLE_TYPE_REGULAR].Set(GUILDAUTH_TYPE_BATTLE, 1); // ½ÅÀÔ±æµå¿ø m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_EXILE, 1); m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_NOTICE, 1); m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_INVITE, 1); m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_BATTLE, 1); m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_SKILL, 1); m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_STOREITEM, 1); m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_TAKEITEM, 1); m_AuthRstt[GUILDROLE_TYPE_JUNIOR].Set(GUILDAUTH_TYPE_WITHDRAW, 1); }