По этой статье решил внедрить пару рефорджевских фич через прелоад файлы, а конкретно следующее:
Открыть
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). Есть ощущение, что по какой-то причине прелоад файлы не воспринимают строки. Отсюда вопрос - можно ли вообще и если да, то как передать строку в прелоад файл из карты?

Из-за того, что нативки возвращают строки в виде индексов из таблицы строк главного потока карты, все прочие потоки, не являющиеся дочерними ему, например те, что исполняют прелоад скрипты или ИИ, не могут получить результат от нативок с таким типом. Индекс не будет подходить для их таблицы строк.
Будет получена случайная строка или произойдет выход за границы таблицы с печальным концом.
Получение строк в результате вызова нативок работает лишь в главном потоке.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
В статье в примерах строки используются (для задание путей миникарты, иконок и прочее). Так что строки прелоад воспринимает, по крайней мере как аргументы функций.
Где-то ещё проблема. Может как раз с обращением к глобальным переменным.

В крайнем случае, строки можно преобразовывать в инт и обратно.
19
Из-за того, что нативки возвращают строки в виде индексов из таблицы строк главного потока карты, все прочие потоки, не являющиеся дочерними ему, например те, что исполняют прелоад скрипты или ИИ, не могут получить результат от нативок с таким типом. Индекс не будет подходить для их таблицы строк.
Будет получена случайная строка или произойдет выход за границы таблицы с печальным концом.
Получение строк в результате вызова нативок работает лишь в главном потоке.
Принятый ответ
15
Получение строк в результате вызова нативок работает лишь в главном потоке.
Получается, это ограничение движка и через главный поток строку никак не прокинуть? Жаль, выходит возможности прелоада ограничены.
В принципе, в моем случае мне помог Preload Exploit, я просто прописал нужную мне строку через него и все отлично сработало, но из-за особенностей рефы такую строку в принципе можно сгенерировать лишь единожды за игровую сессию (пока не выйдешь с карты и не зайдешь вновь), что в других случаях также может быть серьезным ограничением. Можно, конечно, генерировать каждый раз новое название файла, но забивать ПК пользователя подобными файлами тоже такое себе...
Если кому-то вдруг будет интересно, мое итоговое решение:
Открыть
function ReforgedSaveGameCheckpoint takes string fileName returns nothing
    local string exploitCode
    if Is132OrNewer() then
        set exploitCode = "\")\n "
        set exploitCode = exploitCode + "call SaveGameCheckpoint(\"" + fileName + "\", true)"
        set exploitCode = exploitCode + "\n //"
        call PreloadGenClear()
        call Preload(exploitCode)
        call PreloadGenEnd("AotC\\ReforgedCheckpoint.pld")
        call Preloader("AotC\\ReforgedCheckpoint.pld")
    endif
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.