Добавлен

Небольшое вступление

Этот ресурс я создаю больше для себя, чтобы разложить по полочкам всю найденную информацию и больше к ней не возвращаться когда у меня снова появится очередная навязчивая идея это сделать.
И начну я как всегда с конца

Итог

В одном из 132 патчей Близы поменяли preload каким он был ранее, а конкретно содержимое папки CustomMapData загружается 1 раз во время старта карта в память или в кэш, и новые файлы, которые будут созданы через Preload и PreloadGenEnd не будут доступны к прочтению, как и изменение их содержимого, так и полное удаление.
Я очень хочу быть не прав в этом и хочу ошибаться, и чтобы всё работало на самом деле, а виноваты были лишь мой кривые руки.

А что бы это дало?

Ведь 1 раз сейв код можно загрузить, save-load рпгшки работают, что ещё надо?
А как вам это? (если кто ещё не видел)
Так как ссылка уже была на xgm, то выкладываю без разрешения автора Doc (не смотря на то что доступ только по ссылке)
Видео дадируется 19 годом, так же есть такая же инфа на хайве, от апреля 20 года, о том что это не работает никто не писал, потому что никто и не делал. Я не супермен и не передовик первопроходец, мне все вещи даются тяжело, но я врубился тоже и постараюсь рассказать своими словами.

Принцип работы

  1. Lua функция load не вырезана и доступна
---@overload fun(chunk:fun():string):any
---@param chunk fun():string
---@param chunkname string
---@param mode string
---@param env any
function load(chunk, chunkname, mode, env) end
Таким образом можно сделать вот так
local text="print('Hello XGM')"
load(text, "", 't')
и мы выполним код из текстовой строки
  1. BlzSetAbilityTooltip ('Agyv', "Не имеет ограничений на число символов, можно даже делать перенос строк, главное соблюдать правила не противоречащие языку jass, например не использовать двойные кавычки при передаче текстовых аргументов, там условий больше, но я не проверял" , 0)
  2. Таким образом достаточно вот такого вот прелоад файла:
function PreloadFiles takes nothing returns nothing
    call BlzSetAbilityTooltip ('Agyv', "print('XGM')", 0)
endfunction
Чтобы вот такой вот код из 3 строчек:
Preloader("Путь до прелоад файла")
local text = BlzGetAbilityTooltip(FourCC('Agyv'), 0)
load(text, "", 't')
Напечатал нам на экран слово XGM
Также выполнение более тяжело кода типа такого прекрасно работает:
function PreloadFiles takes nothing returns nothing

call BlzSetAbilityTooltip ('Agyv', "    TimerStart(CreateTimer(), 1, true, function()
		 print(7777)
    end)" , 0)

endfunction
Запустит таймер который будет выводить 7777 каждую секунду.

Всё прекрасно, и что же у меня не работает тогда?

Теперь я возьму поменяю содержимое прелоад файла на print(8888), сохраню его званого вызову Preloader заново загружу через load и к сожалению ничего не поменяться, второй таймер не будет выводить 8888 каждую секунду, оно ломается по причинам описанным выше.
Далее бы надо было помещать весь наш код в прелоад файл, и можно было бы повторить то что сделал Doc на виде + исходники на русском, проблему с передачей кода на автомате я бы решил, на хайве есть как и готовые решения и сам бы написал, через отлов изменений или просто апдейтить каждую секунду.

Применение

Неужели ещё не ясно? HotReload экономит кучу времени ибо с выходом 132 патча, загрузка теста карты даже в SD графике, увеличилась до 15 секунд, 131 патч работал на тех же космических скоростях что и 126 варкрафт т.е. 2-3 секунды.
Лично мне нужно это было лишь для 1 вещи
раскрыть
Поднять свою самооценку, сделав то, что сделал Doc на видео
Просто повысить скорость разработки, пока остальные тыкают гуи менюшки, я даже варкрафт не перезапускаю для написания кода, но в итоге я провалился.
раскрыть
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился
Провалился

Принятый ответ

Он кладет это дело в память после preloader`а Можно код изменять напрямую в озу.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
7
4 года назад
3
Он кладет это дело в память после preloader`а Можно код изменять напрямую в озу.
Загруженные файлы
Принятый ответ
0
32
4 года назад
0
Zetox, ну про память да, мы вчера выяснили, но лесть в память это уже другая история
0
7
4 года назад
0
Кстати говоря, можно же добавлять мелкие фиксы в карту, через preload, переопределяя старые функции новыми.
function MyRandomFunction()
    print("OLD")
end

function InitData()
    local text="MyRandomFunction = function() print(\"New\") end"
    local InitFunction = load(text, "", 't')
    InitFunction();
    MyRandomFunction();
end
А в твоем случае, вижу только одно решение, создать внешнюю программу, которая будет искать нужную строку в памяти, а затем синхронизировать ее с твоим файлом.
3 комментария удалено
1
6
1 год назад
1
Старая идея, но покою не дает и мне :)
Про 1.32 остается подтвердить: каждый preload файл загружается только ЕДИНОЖДЫ за карту.
1.33, если кто еще не в курсе и будет читать, сломал у прелоадов все, что только можно. Файл загружается ЕДИНОЖДЫ за все время запуска игры. Поэтому автоматический save/load не работает - он на каждом старте карты ожидал обновленные данные из preload.
Впрочем, и то и другое обходится одним путем: при каждом сохранении генерировать другое имя файла, допустим codefile_version_123 - и карта будет подгружать версию 123. После следующего сохранения _124 и т.п. Со стороны карты решается например горячей клавишей, по которой увеличивается версия и грузится последний файл. Осталось эту идею только воплотить.
1
32
1 год назад
1
Lasto4ka, ну я так делал, но что-то потом пошло не так, не вспомню
Чтобы оставить комментарий, пожалуйста, войдите на сайт.