Metin2 UB Fix - Iterator Invalidation in for_each_entity
Acest fix elimina un bug din functia for_each_entity, produs atunci cand un iterator este sters din m_set_entity si apoi incrementat de bucla for.
Problema apare deoarece erase(it) invalideaza iteratorul curent, iar executia continua cu ++it pe un iterator care nu mai este valid.
- elimina iterator invalidation;
- previne Undefined Behavior;
- curata entitatile invalide din m_set_entity;
- foloseste std::erase_if pentru eliminare sigura;
- foloseste std::ranges::for_each pentru iterarea entitatilor ramase;
- implementare bazata pe C++20.
*Link download / Code:
Cauta:
Code:
template <class _Func>
void for_each_entity(_Func & func)
{
itertype(m_set_entity) it = m_set_entity.begin();
for ( ; it != m_set_entity.end(); ++it) {
LPENTITY entity = *it;
// <Factor> Sanity check
if (entity->GetSectree() != this) {
sys_err("<Factor> SECTREE-ENTITY relationship mismatch");
m_set_entity.erase(it);
continue;
}
func(entity);
}
}Inlocuieste toata functia cu:


la acest mesaj și conținutul se va afișa automat.
