dosinabox / g2nr_unofficial_update

Исходники скриптов, релизы, хотфиксы и тестовые версии неофициального обновления для игры "Готика 2: Ночь Ворона".
https://worldofplayers.ru/threads/36817
The Unlicense
13 stars 1 forks source link

Push(): stack overflow!!! #309

Closed dosinabox closed 3 years ago

dosinabox commented 3 years ago
[F] 01:41 Fatal:-1 C:     zCPar_DataStack :: Push(): stack overflow!!! .... <zParser_Symbol.cpp,#1513>

enter_addonworld_firsttime_trigger_func() -> B_KillNpc(PIR_1370_Addon_Angus) -> B_ClearRuneInv()

dosinabox commented 3 years ago

Перегрузка стека операторов. Проще всего спровоцировать рекурсивным вызовов функции. Также если вызываются очень емкие функции друг за другом.

// небезопасный код. Количество итераций может
// быть больше, чем может вместить в  себя стек
func void Loop() {
    if(...)
        ...
        Loop();
};

// ---------------------------------------------------------------------------------
// Нежелательно, если вызовы больших функций идут
// последовательно, потому что каждая процедура
// дописывает на стек новые данные, которые
// полностью выгружаются при завершении их работы
func void func1() {
    ...
};

func void func2() {
    func1();
};

func void func3() {
    func2();
};

func void func4() {
    func3();
};

// ---------------------------------------------------------------------------------
// Правильнее так, потому что перед вызовом следующим
// вызовом будет выгружаться стек от старого хлама
func void Caller() {
    func1();
    func2();
    func3();
    func4();
    ...
};
dosinabox commented 3 years ago

Исправлено переносом некоторых B_KillNpc() из enter_addonworld_firsttime_trigger_func() в startup_addon_part_adanostemple_01():

B_KillNpc(BDT_10400_Addon_DeadBandit);
B_KillNpc(BDT_10401_Addon_DeadBandit);
B_KillNpc(Stoneguardian_MineDead1);
B_KillNpc(Stoneguardian_MineDead2);
B_KillNpc(Stoneguardian_MineDead3);
B_KillNpc(Stoneguardian_MineDead4);
Kor-Angar commented 3 years ago

и рабов мёртвых тоже надо

dosinabox commented 3 years ago

Пока нет, потому что тогда перегрузка может просто перейти в другое место. Стоит иметь в виду на будущее.

Kor-Angar commented 3 years ago

как дальновиден оказался ElderGamer убивающий НПС через расписание ;-) https://github.com/Kor-Angar/G2_NotR_Kor_Angar/issues/3