#include "stdafx.h" #include #include "Spell.h" #include "Affected.h" #include "PartySpellMgr.h" #include #include CPartySpellMgr::CPartySpellMgr() : m_dwMemberNum(0), m_lpOwnerParty(0) { std::fill_n(&m_pPartyMember[0], int(MAX_MEMBER), reinterpret_cast(0)); } CPartySpellMgr::~CPartySpellMgr() { ClearMember(); } bool CPartySpellMgr::AddMember(CAggresiveCreature* lpNewMember) { if (m_dwMemberNum < MAX_MEMBER && NULL != lpNewMember) { // ¸â¹ö°¡ ÀÖ´ÂÁö »ìÇÉ´Ù. ÀÖÀ¸¸é Áñ. CAggresiveCreature** ppBegin = m_pPartyMember; CAggresiveCreature** ppPastEnd = m_pPartyMember + m_dwMemberNum; for (;ppBegin != ppPastEnd; ++ppBegin) { if(lpNewMember == (*ppBegin)) { LogChantBug(lpNewMember, m_lpOwnerParty, "¸â¹ö Ãß°¡¿¡ ½ÇÆÐÇß½À´Ï´Ù. ¸â¹ö°¡ ÀÌ¹Ì ÀÖ½À´Ï´Ù.", LOG_FFLCHANT); return false; } } CAffectedSpell& newAffectedInfo = lpNewMember->GetSpellMgr().GetAffectedInfo(); ppBegin = m_pPartyMember; ppPastEnd = m_pPartyMember + m_dwMemberNum; for (;ppBegin != ppPastEnd; ++ppBegin) { // ÇöÀç ij¸¯ÅͰ¡ °¡Áö°í ÀÖ´Â ÁÖ¹®¿¡, »õ·Î¿î ij¸¯Å͸¦ Ãß°¡½ÃÅ´. CAggresiveCreature* lpOldMember = (*ppBegin); CAffectedSpell& memberAffectedInfo = lpOldMember->GetSpellMgr().GetAffectedInfo(); memberAffectedInfo.ApplyPartyChant(lpNewMember); // »õ·Î ³ÖÀ¸·Á´Â ij¸¯ÅͰ¡ °¡Áö°í ÀÖ´Â ÁÖ¹®¿¡, ÇöÀç ij¸¯Å͵éÀ» Ãß°¡½ÃÅ´. newAffectedInfo.ApplyPartyChant(lpOldMember); } m_pPartyMember[m_dwMemberNum] = lpNewMember; ++m_dwMemberNum; LogChantBug(lpNewMember, m_lpOwnerParty, "¸â¹ö Ãß°¡¿¡ ¼º°øÇß½À´Ï´Ù", LOG_FFLCHANT); return true; } return false; } bool CPartySpellMgr::RemoveMember(CAggresiveCreature* lpRemoveMember) { CAggresiveCreature** ppBegin = m_pPartyMember; CAggresiveCreature** ppPastEnd = m_pPartyMember + m_dwMemberNum; // Á¦°ÅÇÏ·Á´Â ¸â¹ö¸¦ °Ë»öÇÑ´Ù. for (;ppBegin != ppPastEnd; ++ppBegin) { if (0 != lpRemoveMember && (*ppBegin) == lpRemoveMember) { // ¸â¹ö Á¦°Å. std::copy(ppBegin + 1, ppPastEnd, ppBegin); --m_dwMemberNum; // ¸â¹ö Á¦°ÅÇÑ ÈÄ¿¡, 0À¸·Î ä¿î´Ù. m_pPartyMember[m_dwMemberNum] = 0; CAffectedSpell& removeAffectedInfo = lpRemoveMember->GetSpellMgr().GetAffectedInfo(); ppBegin = m_pPartyMember; ppPastEnd = m_pPartyMember + m_dwMemberNum; for (; ppBegin != ppPastEnd; ++ppBegin) { CAggresiveCreature* lpOldMember = (*ppBegin); // Á¦°ÅÇÏ·Á´Â ¸â¹ö¿¡°Ô¼­, ´Ù¸¥ ¸â¹öµéÀÌ Caster·Î ÀÖ´Â Chant¸¦ ÀüºÎ Áö¿î´Ù. removeAffectedInfo.RemoveChantByCaster(lpOldMember); // ´Ù¸¥ ¸â¹öµé¿¡°Ô¼­, Áö¿ì·Á°í ÇÏ´Â ¸â¹ö°¡ Caster·Î ÀÖ´Â Chant¸¦ ÀüºÎ Áö¿î´Ù. CAffectedSpell& memberAffectedInfo = lpOldMember->GetSpellMgr().GetAffectedInfo(); memberAffectedInfo.RemoveChantByCaster(lpRemoveMember); } LogChantBug(lpRemoveMember, m_lpOwnerParty, "¸â¹ö Á¦°Å¿¡ ¼º°øÇß½À´Ï´Ù", LOG_FFLCHANT); return true; } } return false; } void CPartySpellMgr::ClearMember() { CAggresiveCreature** ppExternalBegin = m_pPartyMember; CAggresiveCreature** ppPastEnd = m_pPartyMember + m_dwMemberNum; for (; ppExternalBegin != ppPastEnd; ++ppExternalBegin) { CAffectedSpell& memberAffectedInfo = (*ppExternalBegin)->GetSpellMgr().GetAffectedInfo(); CAggresiveCreature** ppInternalBegin = m_pPartyMember; for (; ppInternalBegin != ppPastEnd; ++ppInternalBegin) { if (*ppInternalBegin != *ppExternalBegin) { memberAffectedInfo.RemoveChantByCaster(*ppInternalBegin); } } } std::fill_n(&m_pPartyMember[0], int(MAX_MEMBER), reinterpret_cast(0)); m_dwMemberNum = 0; LogChantBug(0, m_lpOwnerParty, "¸â¹ö ÀüºÎ Á¦°Å¿¡ ¼º°øÇß½À´Ï´Ù", LOG_FFLCHANT); } void CPartySpellMgr::AddAffectedToAllMember(CSpell* pSpell, unsigned short wMapIndex) { CAggresiveCreature** ppBegin = m_pPartyMember; CAggresiveCreature** ppPastEnd = m_pPartyMember + m_dwMemberNum; unsigned short wError = CSpell::NO_ENCHANT_ERROR; for (;ppBegin != ppPastEnd; ++ppBegin) { CAggresiveCreature* lpCreature = (*ppBegin); if (0 == lpCreature || lpCreature->GetMapIndex() != wMapIndex) { // Creature°¡ NULLÀ̰ųª ¸ÊÀÌ ´Ù¸£¸é ¹«È¿ continue; } if (lpCreature->GetEnchantInfo().GetFlag(Skill::SpellID::Hide)) { // Creature°¡ ¼û¾î ÀÖÀ¸¸é ¹«È¿ continue; } if (0 == pSpell->GetCaster() || EnemyCheck::EC_FRIEND != pSpell->GetCaster()->IsEnemy(lpCreature)) { // ½ÃÀüÀÚ°¡ ¾ø°Å³ª, ½ÃÀüÀÚ°¡ ¾Æ±ºÀÌ ¾Æ´Ï¸é ¹«È¿ continue; } pSpell->AddAffected(*ppBegin, wError); } } // æƮ °ü·Ã ¹ö±× ·Î±×¸¦ Âï´Â´Ù. ¹®Á¦ ÇØ°áÈÄ ³ªÁß¿¡ ÀüºÎ Á¦°ÅÇÑ´Ù. void LogChantBug(CAggresiveCreature* lpCreature, CParty* lpParty, const char* szMessage, const char* lpRtn, const char* lpFileName, int nLine) { if(0 == CServerSetup::GetInstance().GetServerGroup() && 0 != szMessage && 0 != lpParty) { if(0 != lpCreature) { // Å×¼·À̰í. Creature°¡ Á¦´ë·Î ¼¼ÆÃµÇ¾úÀ» ¶§¸¸ Âï´Â´Ù. g_Log.DetailLog(LOG_DETAIL, lpRtn, lpFileName, nLine, "CID:0x%08x(0x%08x)/PID:0x%08x(0x%08x)/ChantBug - %s", lpCreature->GetCID(), lpCreature, lpParty->GetUID(), lpParty, szMessage); } else { g_Log.DetailLog(LOG_DETAIL, lpRtn, lpFileName, nLine, "PID:0x%08x(0x%08x)/ChantBug - %s", lpParty->GetUID(), lpParty, szMessage); } } }