карта - Nature's Call - Circle Defense
жанр - Tower Defence
автор - Darky27
Размер 1 МБ - www.epicwar.com/maps/331361
листфайл - 100%
запускается на патчах 1.14 - 1.21b, а на патче 1.26 не запускается
что нужно сделать, чтобы адаптировать под патч 1.26 ?
большая ли это вообще работа?
с чего надо начать? или там поменять пару параметров в нативках?

вот 4 ошибки из pjass:
pjass
:992: Cannot convert returned value from item to unit
:1073: Cannot convert returned value from integer to unit
:4936: Cannot convert returned value from unit to integer
:5082: Cannot convert returned value from integer to unit

function Trig_W2U takes item w returns unit
    return w
    return null //992
endfunction

function Trig_I2U takes integer i returns unit
    return i
    return null //1073
endfunction

function Trig_Nerubian_Tower_Unit takes unit u returns integer
    return u
    return 0 //4936
endfunction

function Trig_Kill_Tower_Unit takes integer i returns unit
    return i
    return null //5082
endfunction
занулил так: на 1.26 стало запускаться:

function Trig_W2U takes item w returns unit
//    return w
    return null //992
endfunction

function Trig_I2U takes integer i returns unit
//    return i
    return null //1073
endfunction

function Trig_Nerubian_Tower_Unit takes unit u returns integer
//    return u
    return 0 //4936
endfunction

function Trig_Kill_Tower_Unit takes integer i returns unit
//    return i
    return null //5082
endfunction
правильная ли это адаптация 4 функций под 1.26?

также есть баг (может есть и другие):
вышка Giant Pillar - Hurl Boulder - бросок камня (атака) - сломанная анимация кулдауна
на 1.14 - анимация кулдауна нормальная
на 1.21 - без фикса запускается - но даже в ней сломана анимация кулдауна
на 1.26 - без фикса не запускается
на 1.26 - после фикса запускается - но анимация сломана как в 1.21
видео 1.14 - анимация кулдауна работает как и задумано
видео 1.21 / 1.26 - анимация кулдауна не показывается

два вопроса:
  1. как правильно вылечить 4 ошибки pjass (выше по коду) (т.е. чтобы карта запускалась на 1.26 варике)
  2. как починить анимацию кулдауна?
весь код карты - pastebin.com/YyZxtgEZ

Поробовал поменять на хеш-таблицы и карта запустилась на рефордже (не знаю про 1.26, но скорее всего тоже будет работать). Менял все чере мпк редактор, ибо если менять редактор мира, в из карты выидывает с поражением, не стал с этим заморачиваться, да и через блокнот редактировать код в данном случае удобней. Кстати эта защита видимо забытые технологии древних. По крайней мере я ничего подобного не видел. Да и то что в карте есть такая защита и саму карту не прогоняли через оптимизаторы, говорит о том что она мега древняя. Ну это так отступление.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
30
Это не ошибки, а return bug, который пофиксили в 1.24. Посему нужно переписать ручками всё, что его использует.

Анимация кулдауна это уже совсем другой вопрос.
14
Посему нужно переписать ручками
какими 3 функциями заменить эти преобразования ниже?:
в статье о ретурн баге , описан только handle, который возвращает только integer, т.е. подойдет не для всех функций
takes item w returns unit
takes integer i returns unit
takes unit u returns integer -- тут return GetHandleId(u) ?
неужели в сети нет примера лечения карты с RB для разных типов преобразований?
нашел только www.hiveworkshop.com/threads/return-bug-fixed-for-more-than-h2i.... , но там ответ общий на хештейблах, без готового решения для всех разных пар
а тут в последнем коменте вообще предлагают заменить return bag на мемхак habr.com/ru/articles/148543 и www.hiveworkshop.com/threads/memory-hack.289508
30
host_pi, нужно посмотреть логику этих функций и переписать все вхождения на хэштаблицу.
27
nazarpunk, мне тоже интересна тема return bug. Вот есть функция, возьмем выше пример
 function Trig_W2U takes item w returns unit
    return w
    return null //992
endfunction
Вот, есть у нас в аргументах итем item w, он возвращает w, если не пуст. То есть возвращает unit, т.е. w становится unit. Я не понимаю логику там хэндл или что.. я понимаю, что это конверт. Но для чего это нужно было превращать из итема в юнита итд
30
МрачныйВорон, я не застал rb, так что нужно смотреть по контексту.
6
Функция Trig_W2U , к слову, вообще не используется в карте. Просто удали её.
14
нужно смотреть по контексту.
вот весь код карты pastebin.com/YyZxtgEZ
карта кста полностью открывается в обычном редакторе
половина триггеров сделана на GUI, а половина - кодом
Функция Trig_W2U , к слову, вообще не используется в карте. Просто удали её.
да, итого осталось:
function Trig_I2U takes integer i returns unit -- 6 применений по коду
function Trig_Kill_Tower_Unit takes integer i returns unit -- 1 применение по коду
во всех 7 применениях примерный код одинаковый -- Trig_I2U(GetUnitUserData(u))
в этой теме есть пост
Alex_Hell:
GetUnitUserData() возвращает int, а не UNIT, нужно сделать так:
return All[GetUnitUserData(u)]
т.е. чем заменить конструкцию (integer -> unit)(GetUnitUserData(u)) ?
т.е. какая нативка возвращает юнита от GetUnitUserData(u) ?
решение приведёт к релизу новой хорошей TD карты для всего 1.26 сообщества, в которую многие и не играли ни разу
или вообще может переписать GetUnitUserData(u) на GetHandleId(u) или вообще u лол
кек, ведь можно заменить:
local unit worker = Trig_I2U(GetUnitUserData(u))
на
local unit worker = u
верно?
пойду пробовать тада
Загруженные файлы
6
Не знаю насколько это работоспособно, но попробуй заменить так:
globals
    hashtable ht = InitHashtable()
endglobals

function Trig_I2U takes integer i returns unit
    return LoadUnitHandle(ht, 0, i)
endfunction

function Trig_Nerubian_Tower_Unit takes unit u returns integer
    local integer id = GetHandleId(u)
    call SaveUnitHandle(ht, 0, id, u)
    return id 
endfunction

function Trig_Kill_Tower_Unit takes integer i returns unit
    return LoadUnitHandle(ht, 0, i)
endfunction
30
Итак, сморти function Trig_I2U, береёт юнита из юзердаты. Посему нужно все 14 вхождений SetUnitUserData заменить на хт, ну а Trig_I2U переделать на LoadUnitHandle. Trig_Kill_Tower_Unit делает то же самое, это тупо одинаковые функции.
6
Поробовал поменять на хеш-таблицы и карта запустилась на рефордже (не знаю про 1.26, но скорее всего тоже будет работать). Менял все чере мпк редактор, ибо если менять редактор мира, в из карты выидывает с поражением, не стал с этим заморачиваться, да и через блокнот редактировать код в данном случае удобней. Кстати эта защита видимо забытые технологии древних. По крайней мере я ничего подобного не видел. Да и то что в карте есть такая защита и саму карту не прогоняли через оптимизаторы, говорит о том что она мега древняя. Ну это так отступление.
Загруженные файлы
Принятый ответ
30
говорит о том что она мега древняя.
Наличие rb об этом тоже как-бы намекает. Особенно, малое количество вхождений rb функций. Есть чувство, что чисто гуишную карту просто стали перепиливать на жассе и потом забили.
14
протестировать работу 4 функций можно так:
Trig_W2U --- проверка: не требуется
Trig_I2U --- проверка: продажа вышки другому игроку - CancelSellRequest Trig_Worker_Stats_Group Trig_Buy_Tower_Player_Actions Trig_Itemify_Tower_Actions Trig_Sell_Tower_Actions Trig_Sell_Tower_Player_Actions
Trig_Nerubian_Tower_Unit --- проверка: хз - Trig_Build_Tower_Timer_Actions - Trig_U2I [BaHeK] - строка call SetUnitUserData( udg_ConstructionBuilding[playernum], Trig_Nerubian_Tower_Unit (udg_ConstructionWorker[playernum]) )
Trig_Kill_Tower_Unit --- проверка: килы в мультиборде - Trig_Kill_Tower_Actions - Trig_I2U [BaHeK]
кек, ведь можно заменить local unit worker = Trig_I2U(GetUnitUserData(u)) на local unit worker = u
сработало только для килов, остальные функции не стали работать, что говорит о неправильном способе решения
Поробовал поменять на хеш-таблицы и карта запустилась
ты красава
релиз тут xgm.guru/p/wc3/NCCD126
14
итоговый короткий код от BaHeK
конвертация return bug для UNIT <-> INTEGER
globals
    hashtable ht = InitHashtable()
endglobals

function Trig_U2I takes unit u returns integer
    local integer id = GetHandleId(u)
    call SaveUnitHandle(ht, 0, id, u)
    return id
endfunction

function Trig_I2U takes integer i returns unit
    return LoadUnitHandle(ht, 0, i)
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.