Вопрос энтузиастам.
Стоит задача, определить в какой версии Warcraft III запущена карта. И если она запущена в актуальной версии (1.32+), то использовать новую функцию, появившуюся в этой версии. При этом код карты должен компилироваться и на старой (1.26) и на новой (1.32+) версиях.
Для определения версии я пока только придумал использовать следующий код, основанный на том, что раньше Siege Engine требовал 3 пищи, а сейчас 4 пищи:
//===========================================================================
//Узнаём версию игры
//===========================================================================
function IsOld126Version takes nothing returns boolean
	return GetFoodUsed('hmtt')==3 //Самоходная мортира (Siege Engine)
endfunction
Но баланс может поменяться в одной из будущих версий, это выглядит не надёжно.
Для вызова новых функций без потери успешной компиляции в старых версиях можно использовать функцию:
if not(IsOld126Version) then 
	call ExecuteFunc("BlzChangeMinimapTerrainTex")
endif
Но таким образом можно только запустить функции, которые не имеют аргументов.
Вопросы:
  1. Есть ли более надёжный способ узнать версию игры?
  2. Можно ли как-то использовать ExecuteFunc с аргументами?
  3. Можно ли включить в карту каким либо образом описание функции BlzChangeMinimapTerrainTex(string s) без полной подмены файла common.j?

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

Да. Вызвать новые функции можно. Вот здесь подробнее, как это сделать, на примере задачи по установке preview:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
23
4 года назад
0
бедняжка не мечтай чтобы 1 карта имела на 1.26 и 1.31+
0
22
4 года назад
0
pro100master:
бедняжка не мечтай чтобы 1 карта имела на 1.26 и 1.31+
Сделал уже xgm.guru/p/blog-makkad/northrend-rpg . Там много подобных костылей, но вроде всё удачно сшилось. Осталось только сделать Preview для 1.31+.
0
32
4 года назад
0
Способы есть и через BlzChangeMinimapTerrainTex вполне нормальный, но смысл всего происходящего, я не думаю что можно в карту 126 патча засунуть рефордж код и он заработает в рефордже, такое проверялось?
2
22
4 года назад
2
Bergi_Bear:
Способы есть и через BlzChangeMinimapTerrainTex вполне нормальный, но смысл всего происходящего, я не думаю что можно в карту 126 патча засунуть рефордж код и он заработает в рефордже, такое проверялось?
Да. Работает через ExecuteFunc.
0
32
4 года назад
0
makkad:
Да. Работает через ExecuteFunc.
А на каком этапе внедрение кода новых патчей происходит? Просто не могу понять как в этом экзекут помогает. Но верю...
Это довольно таки круто
0
22
4 года назад
0
Bergi_Bear:
makkad:
Да. Работает через ExecuteFunc.
А на каком этапе внедрение кода новых патчей происходит? Просто не могу понять как в этом экзекут помогает. Но верю...
Это довольно таки круто
Вроде ничего крутого.... наверное я что-то не то написал. В файлах рефорджа эти функции всегда были, и вот они и запускаются. В 1.26 этих функций нет, и к ним просто код карты просто не обращается.
Конечно, поменять файл миникарты через BlzChangeMinimapTerrainTex в 1.26 не получится. Но если ту же карту запустить в 1.32 то там это прокатит, если придумать как передать аргументы через ExecuteFunc. Функции без аргументов срабатывают.
Думаю, исследователь работу функций типа Preload. Они же работают в 1.26 и 1.32?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.