Добавлен Drulia_san
Путем отладки мне удалось найти функцию из-за которой мои герои внезапно удаляются. Ниже приведен код функции в которой это происходит - DummyDealExtraDamage и на всякий случай сверху вставлю функцию отложенного удаления юнита.
Отладка показывает что именно эта функция пытается удалить героя на месте вызова DelayedUnitRemove, хотя туда отчетливо подается dummy и только, причем дамми который был создан пару строчек назад. Как туда мог попасть герой - не понятно.
Баг проявляется отнюдь не всегда, в 1 из 15 случаев примерно. И не у всех персонажей, использующих DummyDealExtraDamage.
Есть какие-то предположения?
Отладка показывает что именно эта функция пытается удалить героя на месте вызова DelayedUnitRemove, хотя туда отчетливо подается dummy и только, причем дамми который был создан пару строчек назад. Как туда мог попасть герой - не понятно.
Баг проявляется отнюдь не всегда, в 1 из 15 случаев примерно. И не у всех персонажей, использующих DummyDealExtraDamage.
Есть какие-то предположения?
void DelayedUnitRemove(unit u, float time, string fname, string moduleName)
{
if (time == 0.00)
{
RemoveUnit_s(u, fname, moduleName);
u = null;
return;
}
timer t = CreateTimer();
SaveUnitHandle(g_Hashtable, GetHandleId(t), T_UNIT, u);
SaveStr(g_Hashtable, GetHandleId(t), T_UNIT+1, fname);
SaveStr(g_Hashtable, GetHandleId(t), T_UNIT+2, moduleName);
TimerStart(t, time, false, lambda void ()
{
timer t = GetExpiredTimer();
unit u = LoadUnitHandle(g_Hashtable, GetHandleId(t), T_UNIT);
string fname = LoadStr(g_Hashtable, GetHandleId(t), T_UNIT+1);
string moduleName = LoadStr(g_Hashtable, GetHandleId(t), T_UNIT+2);
RemoveUnit_s(u, fname, moduleName);
DestroyTimer(t);
u = null;
t = null;
});
t = null;
u = null;
}
void DummyDealExtraDamage(unit src, unit target, float dmg, int school, bool canBeReturned)
{
if (IsUnitDummy(src))
{
src = GetDummyOwningUnit(src);
DummyDealExtraDamage(src, target, dmg, school, canBeReturned);
src = null;
target = null;
return;
}
location loc = GetUnitLoc(src);
unit dummy = CreateDummy(GetOwningPlayer(src), src, loc);
SetDummyExtraDamage(dummy);
if (!canBeReturned)
{
SetDummyReturnDamage(dummy);
}
DummyDealDamage(dummy, target, dmg, school);
DelayedUnitRemove(dummy, 0.2, "DummyDealExtraDamage", "Dummy");
RemoveLocation(loc);
loc = null;
dummy = null;
src = null;
target = null;
}
Принятый ответ
Точно больше 100500 утечек нет? Эт хз как же надо было забить хт чтобы такое приключилось?
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован PT153
Аргументы функций обнулять не нужно.
Отредактирован Drulia_san
T_UNIT = 159
Я проверил, нигде нет этого названия. Я не копипастил лишнее, баг именно в этой функции.