16

» WarCraft 3 / Отмена приказа предмета

call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_ORDER)
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_POINT_ORDER)

if GetIssuedOrderId()>=ORDER_useslot1 and GetIssuedOrderId()<=ORDER_useslot6 then
call InterruptUnit(u)
endif
16

» WarCraft 3 / Хеш-таблица против обуза глобальных массивных переменных

Diaboliko:
массив удобнее ТОЛЬКО потому, что слегка быстрее
При использовании БД на массивах прозрачны действия движка(как реализован интерфейс работы с хт - одним близзам известно). Сразу ясно какой из вариантов реализации эффективнее
?? обычное дерево. что конкретно тебя смущает-то? неважно, что под капотом, если оно работает без ошибок
16

» WarCraft 3 / Система покупки и продажи предмета

вообще не понял, о чем речь во второй проблеме. нормализуй "абилки", "итемы" и т.п., а то кажется, что речь об одном, потом - о другом.
не встречался с багами при использовании динамических продаж юнитов. если слотов в магазе нет, а ты пытаешься добавить еще кого-то в продажу, то хз что там произойдет
16

» WarCraft 3 / Хеш-таблица против обуза глобальных массивных переменных

Steal nerves:
У обычных массивов от переменной, то там индекс не такой большой (от -8192 до 8192).
вообще-то отрицательных индексов у массивов нет, 0..8191
16

» WarCraft 3 / Хеш-таблица против обуза глобальных массивных переменных

в системах с 0.01 таймерами главный минус хештаблиц и глобалок - это системы с 0.01 таймерами.
такая частота не нужна в 99% случаев, а с оставшимся 1% наверняка работают те, кто такими вопросами не задается
хеш удобнее, потому что можно ложить данных по ключу = хендлу объекта, что гарантирует его созхранность. массив удобнее ТОЛЬКО потому, что слегка быстрее. если у тебя просадки фпс суровые - можешь попробовать массивы. если нет - используй хеш и будь счастлив.
ну а если ты работаешь в редакторе, есть какие-то структуры в псевдоязыке vjass, которые имитируют ту же хештаблицу на обычных массивах
16

» WarCraft 3 / Помогите пожалуйста разобраться с крашлогом.

изменение уровня способности у мертвого юнита. апгрейдом или триггерно, неважно. скорее всего, способность в спелбуке
проверь AGg0
16

» WarCraft 3 / [Мемхак] Функции для способностей.

дальность каста?
integer a=GetUnitAbility(u,id)
integer offset
integer lvl
if a>0 then
 set offset=RMem(a+0x54)
 set lvl=RMem(a+0x50)
 WMem(offset+0x74+0x68*lvl,SetRealIntoMemory(range))
endif
где RMem = readmemory, WMem = write
адреса НЕ деленные на 4, можешь сам разделить, если нужно
дальность лежит в offset+0x74+0x68*lvl и это real, поэтому нужно конвертить туда-сюда, если нужно складывать или что-то еще
16

» WarCraft 3 / [Мемхак] Функции для способностей.

с описаниями проблема. Почему-то редактирование строк может привести к спонтанным фаталам, и я не могу понять, в чем проблема. Даже создавая новые, игра будто кэширует длину старой, и в случае чего это может вылиться в вылет. Так что пока динамические описания я не использую, только по крайней необходимости.
изменение перезарядки ты можешь применять таймером через 0 после spell_effect, вручную регулируя конкретное время, нет нужды для этого данные менять, если не хочешь глобального эффекта
16

» WarCraft 3 / ID приказа при использовании предмета

нет, приказ ловится в момент отдачи и никак иначе
function msc_check_item_for_id takes unit u, integer o_id, integer it_id returns boolean
    set o_id = o_id - 852008
    if o_id>=0 and o_id<=5 then
     return GetItemTypeId ( UnitItemInSlot ( u, o_id ) ) == it_id
    endif
    return false
endfunction
оно тебе надо проверять, стоят ли проверки безопасности в функции?)
16

» WarCraft 3 / [Мемхак] Функции для способностей.

ну ты можешь напрямую со скиллом работать, не клонируя его, тогда он изменится у всех юнитов, кто с ним будет бегать. вопрос в том, ЧТО ты хочешь сделать. без клона вполне жить можно, я, например, меняю каст ренж только в моент приказа и до самого каста, в остальное время - сбрасываю на дефолт
16

» WarCraft 3 / Событие на получение урона

нет прям "чистого", все имеют какие-то проблемы. hero+magic Не бьет в иммун, универсальный режется резистом, енхансе д не бьет в астрал
16

» WarCraft 3 / (Memory Hack) 2 вопроса

всё, что лежит на гите, хотя бы тестировалось и как минимум работало в прошлом
16

» WarCraft 3 / [Мемхак] Функции для способностей.

у меня такого функционала не реализовано за ненадобностью, велосипед есть только у автора
16

» WarCraft 3 / (Memory Hack) 2 вопроса

а, я думал, ты хочешь узнать тип объекта по его адресу. конвертировать в джасс сложно, не минуту доставать, позже
globals
integer l__Int2Unit
integer pGetHandleIDStackCounter=GameDLL+0x3A8060//26
integer pConvertAddressToHandleId=GameDLL+0x430C80//26
endglobals
function setInt2Unit takes integer i returns nothing
set l__Int2Unit=i
return Prevents JassHelper from inlining this function
endfunction
function ConvertUnitAddressToHandleID takes integer address returns integer
local integer a=CallThisCallWith1Args(pGetHandleIDStackCounter,RMem(GameState))
return CallThisCallWith3Args(pConvertAddressToHandleId,a,address,0)
endfunction
function Typecast4 takes nothing returns nothing
local unit l__Int2Unit
endfunction
# +nosemanticerror
function I2Unit takes integer i returns unit
call setInt2Unit(ConvertUnitAddressToHandleID(i))
return l__Int2Unit
endfunction
не забудь уточнить, что ВСЕ используемые здесь адреса НЕ делены на 4, или умножай их сам, если делились. GameState вроде был разделен в паблике.
16

» WarCraft 3 / (Memory Hack) 2 вопроса

  1. можно, но сложно
тип данных пишется в vtable объекта
function GetAgentType takes handle h returns integer
returns code of the handle's type
+w3u for unit, +tmr for timer, +trg for trigger, +arg for region, etc
check the type you may need yourself, Im not gonna write down all of those
local integer func = RMem(RMem(ConvertHandle(h))+0x1C)
return RMem(func)/0x100+RMem(func+4)*0x1000000
endfunction
конвертация адреса в хендл, который затем конвертируется в объект - сложнее
  1. есть в публичном же, SetAbilityButtonX/Y
16

» WarCraft 3 / War3map.j до и после оптимизации?

ничем, кроме названий переменных. попробуй отключить морфинг имен
16

» WarCraft 3 / Нужно отловить widget (memory hack)

потому что с релиза прошло 4 месяца, а мне некогда чистить код для перезалива
16

» WarCraft 3 / Нужно отловить widget (memory hack)

его восстановить надо, у тебя разбодяженный делением на 4. сделай себе новую глобалку pGameClass24 = pGameClass2*4