При использовании БД на массивах прозрачны действия движка(как реализован интерфейс работы с хт - одним близзам известно). Сразу ясно какой из вариантов реализации эффективнее
?? обычное дерево. что конкретно тебя смущает-то? неважно, что под капотом, если оно работает без ошибок
вообще не понял, о чем речь во второй проблеме. нормализуй "абилки", "итемы" и т.п., а то кажется, что речь об одном, потом - о другом.
не встречался с багами при использовании динамических продаж юнитов. если слотов в магазе нет, а ты пытаешься добавить еще кого-то в продажу, то хз что там произойдет
в системах с 0.01 таймерами главный минус хештаблиц и глобалок - это системы с 0.01 таймерами.
такая частота не нужна в 99% случаев, а с оставшимся 1% наверняка работают те, кто такими вопросами не задается
хеш удобнее, потому что можно ложить данных по ключу = хендлу объекта, что гарантирует его созхранность. массив удобнее ТОЛЬКО потому, что слегка быстрее. если у тебя просадки фпс суровые - можешь попробовать массивы. если нет - используй хеш и будь счастлив.
ну а если ты работаешь в редакторе, есть какие-то структуры в псевдоязыке vjass, которые имитируют ту же хештаблицу на обычных массивах
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, поэтому нужно конвертить туда-сюда, если нужно складывать или что-то еще
с описаниями проблема. Почему-то редактирование строк может привести к спонтанным фаталам, и я не могу понять, в чем проблема. Даже создавая новые, игра будто кэширует длину старой, и в случае чего это может вылиться в вылет. Так что пока динамические описания я не использую, только по крайней необходимости.
изменение перезарядки ты можешь применять таймером через 0 после spell_effect, вручную регулируя конкретное время, нет нужды для этого данные менять, если не хочешь глобального эффекта
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
оно тебе надо проверять, стоят ли проверки безопасности в функции?)
ну ты можешь напрямую со скиллом работать, не клонируя его, тогда он изменится у всех юнитов, кто с ним будет бегать. вопрос в том, ЧТО ты хочешь сделать. без клона вполне жить можно, я, например, меняю каст ренж только в моент приказа и до самого каста, в остальное время - сбрасываю на дефолт
а, я думал, ты хочешь узнать тип объекта по его адресу. конвертировать в джасс сложно, не минуту доставать, позже
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 вроде был разделен в паблике.
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
конвертация адреса в хендл, который затем конвертируется в объект - сложнее
Ред. DracoL1ch
» WarCraft 3 / Отмена приказа предмета
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
» WarCraft 3 / Хеш-таблица против обуза глобальных массивных переменных
» WarCraft 3 / Система покупки и продажи предмета
не встречался с багами при использовании динамических продаж юнитов. если слотов в магазе нет, а ты пытаешься добавить еще кого-то в продажу, то хз что там произойдет
» WarCraft 3 / Хеш-таблица против обуза глобальных массивных переменных
» WarCraft 3 / Хеш-таблица против обуза глобальных массивных переменных
такая частота не нужна в 99% случаев, а с оставшимся 1% наверняка работают те, кто такими вопросами не задается
хеш удобнее, потому что можно ложить данных по ключу = хендлу объекта, что гарантирует его созхранность. массив удобнее ТОЛЬКО потому, что слегка быстрее. если у тебя просадки фпс суровые - можешь попробовать массивы. если нет - используй хеш и будь счастлив.
ну а если ты работаешь в редакторе, есть какие-то структуры в псевдоязыке vjass, которые имитируют ту же хештаблицу на обычных массивах
» WarCraft 3 / [Мемхак] Функции для способностей.
» WarCraft 3 / Помогите пожалуйста разобраться с крашлогом.
проверь AGg0
» WarCraft 3 / Как сохранить перезарядку при удалении спэлла.
» WarCraft 3 / [Мемхак] Функции для способностей.
range = желаемывй ренж
» WarCraft 3 / [Мемхак] Функции для способностей.
адреса НЕ деленные на 4, можешь сам разделить, если нужно
дальность лежит в offset+0x74+0x68*lvl и это real, поэтому нужно конвертить туда-сюда, если нужно складывать или что-то еще
» WarCraft 3 / [Мемхак] Функции для способностей.
» WarCraft 3 / ID приказа при использовании предмета
» WarCraft 3 / [Мемхак] Функции для способностей.
» WarCraft 3 / Событие на получение урона
» WarCraft 3 / Абилки которые можно кастовать сквозь стан
ISSUED_*_ORDER
» WarCraft 3 / Цвет построек в очереди на строительство
» WarCraft 3 / (Memory Hack) 2 вопроса
» WarCraft 3 / [Мемхак] Функции для способностей.
» WarCraft 3 / Не убегающий юнит, но с безмолвием.
» WarCraft 3 / (Memory Hack) 2 вопроса
globals
integer l__Int2Unit
integer pGetHandleIDStackCounter=GameDLL+0x3A8060//26
integer pConvertAddressToHandleId=GameDLL+0x430C80//26
endglobals
set l__Int2Unit=i
return Prevents JassHelper from inlining this function
endfunction
local integer a=CallThisCallWith1Args(pGetHandleIDStackCounter,RMem(GameState))
return CallThisCallWith3Args(pConvertAddressToHandleId,a,address,0)
endfunction
local unit l__Int2Unit
endfunction
function I2Unit takes integer i returns unit
call setInt2Unit(ConvertUnitAddressToHandleID(i))
return l__Int2Unit
endfunction
» WarCraft 3 / (Memory Hack) 2 вопроса
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
» WarCraft 3 / War3map.j до и после оптимизации?
» WarCraft 3 / Нужно отловить widget (memory hack)
» WarCraft 3 / Нужно отловить widget (memory hack)
» WarCraft 3 / Нужно отловить widget (memory hack)