Добавлен Pavell
По этой статье решил внедрить пару рефорджевских фич через прелоад файлы, а конкретно следующее:
Открыть
globals
constant integer bj_PLAYER_NEUTRAL_EXTRA = GetBJPlayerNeutralExtra()
endglobals
function PreloadFiles takes nothing returns nothing
call SaveGameCheckpoint(GetPlayerName(Player(bj_PLAYER_NEUTRAL_EXTRA)), true)
endfunction
В карте вызов данного файла происходит следующим образом:
Открыть
function Is132OrNewer takes nothing returns boolean
return GetLocalizedString("REFORGED") != "REFORGED"
endfunction
function ReforgedSaveGameCheckpoint takes string fileName returns nothing
local string temp = GetPlayerName(Player(bj_PLAYER_NEUTRAL_EXTRA))
if Is132OrNewer() then
call SetPlayerName(Playerbj_PLAYER_NEUTRAL_EXTRA), fileName)
call BJDebugMsg(GetPlayerName(Player(bj_PLAYER_NEUTRAL_EXTRA)))
call Preloader("ReforgedStuff\\ReforgedCheckpoint.pld")
call SetPlayerName(Player(bj_PLAYER_NEUTRAL_EXTRA), temp)
endif
endfunction
Ну и соответственно вызов:
call ReforgedSaveGameCheckpoint("Savetest")
При попытке вызова функции из прелоада игра крашится. Стал копать в чем дело, сделал вывод текста на экран внутри прелоад файла - оказалось, что строка почему-то пустая (то есть, проблема не в самой функции чекпоинта, она работает нормально, если просто указать конкретную строку), хотя перед вызовом прелоадера все выводится нормально. Пробовал получение строки и через GetUnitName и BlzGetAbilityTooltip, всегда на экран выводится (null). Есть ощущение, что по какой-то причине прелоад файлы не воспринимают строки. Отсюда вопрос - можно ли вообще и если да, то как передать строку в прелоад файл из карты?
Принятый ответ
Из-за того, что нативки возвращают строки в виде индексов из таблицы строк главного потока карты, все прочие потоки, не являющиеся дочерними ему, например те, что исполняют прелоад скрипты или ИИ, не могут получить результат от нативок с таким типом. Индекс не будет подходить для их таблицы строк.
Будет получена случайная строка или произойдет выход за границы таблицы с печальным концом.
Получение строк в результате вызова нативок работает лишь в главном потоке.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
Показать
makkad
2 года
0
Показать
В статье в примерах строки используются (для задание путей миникарты, иконок и прочее). Так что строки прелоад воспринимает, по крайней мере как аргументы функций.
Где-то ещё проблема. Может как раз с обращением к глобальным переменным.
В крайнем случае, строки можно преобразовывать в инт и обратно.
2
Показать
IceFog
2 года
2
Показать
https://xgm.guru/p/wc3/jass-vm-internals:
Получение строк в результате вызова нативок работает лишь в главном потоке.
Принятый ответ
1
Показать
Pavell
2 года
1
Показать
IceFog:
Получается, это ограничение движка и через главный поток строку никак не прокинуть? Жаль, выходит возможности прелоада ограничены.
В принципе, в моем случае мне помог Preload Exploit, я просто прописал нужную мне строку через него и все отлично сработало, но из-за особенностей рефы такую строку в принципе можно сгенерировать лишь единожды за игровую сессию (пока не выйдешь с карты и не зайдешь вновь), что в других случаях также может быть серьезным ограничением. Можно, конечно, генерировать каждый раз новое название файла, но забивать ПК пользователя подобными файлами тоже такое себе...
Если кому-то вдруг будет интересно, мое итоговое решение:
Открыть
Чтобы оставить комментарий, пожалуйста, войдите на сайт.