Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Версия Warcraft:
1.26 и ниже
Собственно тот знаменитый хак на память который нам радостно предоставил DracoL1ch, который позволяет нам больше не морочится с системами отлова урона, или вовсе узнать координаты курсора без стороннего по.
Для сохранения требуется: экспериментальная версия pjass.exe
Причём не все подходят, меньше всего проблем было с этой версией
В хаке присутствует только 1 пример на изменение белой атаки у героя, остальные готовые функции можно найти на:
Хайве
Гитхабе
Просто копируем саму функцию, все остальное для её работы есть в наработке и сохраняем.
Так же на хайве есть инструкция по созданию собственных функций для чтения\изменения данных в памяти игры.

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
20
7 лет назад
2
Не припоминаю чтобы кто-то говорил об этом, но дабы AdicParser не крашился, попутно удаляя все комментарии (что приводит к удалению директив pjass) и конфликту с хаком, после "//! nocjass" должна быть хотя бы одна пустая строчка(возможно одна пустая строчка в конце всего юзерского кода, я без понятия.).
Для приложения следующая версия компилится нормально (см. приложение)
Загруженные файлы
2
5
7 лет назад
2
Всем привет. Обновил хак, теперь при сохранении показывает 4 ошибки: Index missing for array variable l__bytecode, как лечить?
set i=RMem((l__bytecode)) INLINED!!
0
32
7 лет назад
0
pjass какой? Вначале темы прикреплен нужный.
2
5
7 лет назад
2
Как раз таки он и стоит
0
32
7 лет назад
0
Ну не знаю, у меня все сохраняется и работает. Попробуйте дважды сохранить карту и запустить, мб баг.
2
5
7 лет назад
Отредактирован l_Avenger_l
2
Проблема решилась установкой вот этой версии JNGP: xgm.guru/p/wc3/jassnewgenpack-r
0
20
7 лет назад
0
Я тут добрался до
function AddUnitMovespeedBonus takes unit u, real r returns nothing
И обнаружил что этот бонус подвержен погрешности как и прочие вычисления с флоатом. Операции нужно производить с числами определенной точности(хотя мне кажется что 0.0900000 будет воспринято как 0.09) или где-то прячется нативная функция округления MS'а?
0
32
7 лет назад
0
Diaboliko, там же тупо ресстояние за тик таймера, лич его правил на прямую, но тогда юнит начинает бегать во круг точки т.к расстояние за тик таймера слишком большое, юниту кажется что он не может дойти до точки. Там и стоит проверка, до миллионных же никто не будет рассчитывать дистанцию.
0
20
7 лет назад
0
quq_CCCP:
Diaboliko, там же тупо ресстояние за тик таймера, лич его правил на прямую, но тогда юнит начинает бегать во круг точки т.к расстояние за тик таймера слишком большое, юниту кажется что он не может дойти до точки. Там и стоит проверка, до миллионных же никто не будет рассчитывать дистанцию.
Ты путаешь с
function SetUnitCurrentMSper32 takes integer convertedHandle, real r returns nothing
0
32
7 лет назад
0
Diaboliko, ну а бонус это тоже дистанция. Там наверняка деление на тик таймера и проверка на мин. значение
0
20
7 лет назад
Отредактирован Diaboliko
0
quq_CCCP:
Diaboliko, ну а бонус это тоже дистанция. Там наверняка деление на тик таймера и проверка на мин. значение
Я не понимаю куда ты клонишь. Бонус - аддитивно стакающаяся величина, даваемая тем же Безумием или Аурой Выносливости.
Код, которым пытался вычислить число знаков после запятой самого бонуса
globals
    constant real arginc = 0.10001
    constant real argexit = 0.90009
endglobals

function xxx takes nothing returns boolean
    local real r
        set  r = arginc
        loop
            exitwhen r == argexit
            call AddUnitMSBonus(gg_unit_uaco_0002, r)
            set  r = r + arginc
        endloop
        set  r = -arginc
        loop
            exitwhen r == -argexit
            call AddUnitMSBonus(gg_unit_uaco_0002, r)
            set  r = r -arginc
        endloop
    return false
endfunction

function Trig_zxcxc_Actions takes nothing returns nothing
    local real r
    local integer i = 0
    local trigger t = CreateTrigger()
        call TriggerAddCondition( t, Condition(function xxx))
        call BJDebugMsg(R2S(GetUnitMoveSpeed(gg_unit_uaco_0002)))
        loop
            call TriggerEvaluate(t)
        exitwhen i == 1000
        set  i = i + 1
        endloop
        call BJDebugMsg(R2S(GetUnitMoveSpeed(gg_unit_uaco_0002)))
    set  t = null
    return
endfunction

//===========================================================================
function InitTrig_zxcxc takes nothing returns nothing
    set gg_trg_zxcxc = CreateTrigger()
    call TriggerRegisterTimerEvent( gg_trg_zxcxc, 3., false )
    call TriggerAddAction( gg_trg_zxcxc, function Trig_zxcxc_Actions )
endfunction
Для чисел с N числом знаков после запятой выдал следующие значения конечного MS(начальный = 220)
8 (0.10000001) - 219.475
7 (0.1000001) - 219.685
6 (0.100001) - 219.685
5 (0.10001) - 219.475
Как к этому относиться - не представляю.
А протестив на 0.111... и 0.999... получилось
8 - 219.685
7 - 219.685
6 - 219.580
5 - 219.475
4 - 219.475
3 - 219.685
2 - 219.475
1 - 219.475
Так что без округления, по-видимому, не обойтись.
Я ведь верно понимаю что
I2R(R2I(currentBonus * 10^x))*10^-x
корректно "округляет" число до знака x после запятой?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.