- Mesaj
- 1.409
- Çözümler
- 76
- Beğeni
- 5.638
- Puan
- 2.859
- Ticaret Puanı
- 0
oyunun efekt kodlarında bazı değişiklikler yaptım ve sizinlede paylaşmak istedim. öyle über süper bir güncelleme yapmadım ama emin olmak için sizede sorayım dedim.En büyük değişikliği RemoveAffect fonksiyonlarında yaptım bir yanlış hata ve öneriniz varsa yazarsanız güzel olur. (@okan4141)
char_affect.cpp:
CAffect* CHARACTER::FindAffect(DWORD dwType, BYTE bApply /*= APPLY_NONE*/) const
{
if (m_list_pkAffect.empty())
return nullptr;
for (CAffect* pkAffect : m_list_pkAffect)
{
if (!pkAffect)
continue;
if (pkAffect->dwType == dwType &&
(bApply == APPLY_NONE || bApply == pkAffect->bApplyOn))
{
return pkAffect;
}
}
return nullptr;
}
char_affect.cpp:
void CHARACTER::RefreshAffect()
{
for (CAffect* pkAff : m_list_pkAffect)
{
if (pkAff)
{
ComputeAffect(pkAff, true);
}
}
}
char_affect.cpp:
void CHARACTER::ClearAffect(bool bSave)
{
if (m_list_pkAffect.empty())
return;
const TAffectFlag afOld = m_afAffectFlag;
const WORD wMovSpd = GetPoint(POINT_MOV_SPEED);
const WORD wAttSpd = GetPoint(POINT_ATT_SPEED);
for (auto it = m_list_pkAffect.begin(); it != m_list_pkAffect.end(); )
{
CAffect* pkAff = *it;
if (!pkAff)
{
it = m_list_pkAffect.erase(it);
continue;
}
if (bSave)
{
if ( IS_NO_CLEAR_ON_DEATH_AFFECT(pkAff->dwType) || IS_NO_SAVE_AFFECT(pkAff->dwType) )
{
++it;
continue;
}
if (IsPC())
{
SendAffectRemovePacket(GetDesc(), GetPlayerID(), pkAff->dwType, pkAff->bApplyOn);
}
}
ComputeAffect(pkAff, false);
it = m_list_pkAffect.erase(it);
CAffect::Release(pkAff);
}
if (afOld != m_afAffectFlag ||
wMovSpd != GetPoint(POINT_MOV_SPEED) ||
wAttSpd != GetPoint(POINT_ATT_SPEED))
UpdatePacket();
CheckMaximumPoints();
if (m_list_pkAffect.empty())
event_cancel(&m_pkAffectEvent);
}
char_affect.cpp:
bool CHARACTER::RemoveAffect(CAffect * pkAff)
{
if (!pkAff)
return false;
// AFFECT_BUF_FIX
m_list_pkAffect.remove(pkAff);
// END_OF_AFFECT_BUF_FIX
ComputeAffect(pkAff, false);
if (AFFECT_REVIVE_INVISIBLE != pkAff->dwType)
ComputePoints();
else // @fixme110
UpdatePacket();
CheckMaximumPoints();
if (test_server)
sys_log(0, "AFFECT_REMOVE: %s (flag %u apply: %u)", GetName(), pkAff->dwFlag, pkAff->bApplyOn);
if (IsPC())
{
SendAffectRemovePacket(GetDesc(), GetPlayerID(), pkAff->dwType, pkAff->bApplyOn);
}
CAffect::Release(pkAff);
return true;
}
bool CHARACTER::RemoveAffect(DWORD dwType)
{
// CHAT_BLOCK
if (dwType == AFFECT_BLOCK_CHAT)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("äÆÃ ±İÁö°¡ Ç®·È½À´Ï´Ù."));
}
// END_OF_CHAT_BLOCK
if (m_list_pkAffect.empty())
return false;
bool flag = false;
bool flag_affect_revive_invisible = false;
for (auto it = m_list_pkAffect.begin(); it != m_list_pkAffect.end(); )
{
CAffect* pkAff = *it;
if (!pkAff)
{
it = m_list_pkAffect.erase(it);
continue;
}
if (pkAff->dwType == dwType)
{
it = m_list_pkAffect.erase(it);
ComputeAffect(pkAff, false);
if (AFFECT_REVIVE_INVISIBLE != pkAff->dwType)
flag_affect_revive_invisible = true;
if (test_server)
sys_log(0, "AFFECT_REMOVE: %s (flag %u apply: %u)", GetName(), pkAff->dwFlag, pkAff->bApplyOn);
if (IsPC())
{
SendAffectRemovePacket(GetDesc(), GetPlayerID(), pkAff->dwType, pkAff->bApplyOn);
}
CAffect::Release(pkAff);
flag = true;
}
else
{
++it;
}
}
if (flag)
{
if (flag_affect_revive_invisible)
ComputePoints();
else
UpdatePacket();
CheckMaximumPoints();
}
return flag;
}