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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
16
7 лет назад
2
очевидно, что работало раньше, работает и сейчас, выделения синхронизируются автоматически, так что проблемы не будет
0
30
0
в чём может быть проблема функции SetUnitBaseDamage...
создаю юнита сразу же устанавливаю случайный показатель к атаке..., но с определённым шансом я получаю фатал...
для теста создал простой триггер, который создаёт юнита каждые 0.1 секунды и изменяет ему атаку через эту ф-цию...
иногда вылетает фатал после 40 созданных юнитов, иногда после 150...
где я мог накосячить..?
Загруженные файлы
0
32
7 лет назад
0
Андреич, юнита проверили?
Обязательно проверяйте входные аргументы.
0
30
7 лет назад
Отредактирован Алексей Андреич
0
quq_CCCP:
Андреич, юнита проверили?
Обязательно проверяйте входные аргументы.
ну да... юнит как бы не может быть мертв... так как изменение урона идёт один раз сразу после его создания...
0
16
7 лет назад
0
Ну так покажи код-то, чего стесняешься?
0
23
7 лет назад
0
DracoL1ch, Они боится делить свои красоту кода =)
0
30
0
DracoL1ch:
Ну так покажи код-то, чего стесняешься?
собственно здесь можно посмотреть всё прямо в карте...
функция создающая юнита в процессе самой игры - spawnPlayerUnits() - находится в custom code...
отключённый "Безымянный триггер 001" - делал для теста... собственно тот триггер, что создаёт юнита каждые 0.1 сек...
где я допустил ошибку..?
на всякий выложу сюда...
code...
void spawnPlayerUnits(){
    for(int i=0;i<12;i++){
        if(GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and GetWidgetLife(PlayerUnit[i]) < 0.405){
            PlayerUnit[i]=CreateUnit(Player(i),RandomUnit[GetRandomInt(1,RandomUnitMax)],GetRandomReal((size-1)*-128,(size-1)*128.),GetRandomReal((size-1)*-128,(size-1)*128.),270.)
            PanCameraToForPlayer(Player(i),GetUnitX(PlayerUnit[i]),GetUnitY(PlayerUnit[i]))
            SetUnitScale(PlayerUnit[i],GetRandomReal(0.8,1.5),GetRandomReal(0.8,1.5),GetRandomReal(0.8,1.5))
            UnitAddAbility(PlayerUnit[i],'Asph')
            SetUnitColor(PlayerUnit[i],GetPlayerColor(Player(i)))
            SetUnitMoveSpeed(PlayerUnit[i],GetRandomReal(250.,300.))
            addBonus(PlayerUnit[i])
            UnitAddAbility(PlayerUnit[i],'AInv')
            SetUnitAbilityLevel(PlayerUnit[i],'AInv',GetRandomInt(1,7))
            //add attack
            SetUnitBaseDamage(PlayerUnit[i],GetRandomInt(0,100))
            //add armor
            real armorBonus=GetRandomReal(0.,5.)
            SetUnitArmor(PlayerUnit[i],armorBonus)
            
            //
            if(GetRandomReal(1.,100.)>10.){
                    SetUnitMaxMP(PlayerUnit[i],1.)
            }
            local real hpbonus = GetRandomReal(100.,1000.)
            SetUnitMaxHP(PlayerUnit[i],hpbonus)
            SetUnitState(PlayerUnit[i], UNIT_STATE_LIFE,hpbonus)
            SetUnitState(PlayerUnit[i], UNIT_STATE_MANA,3.)
            SelectUnitForPlayerSingle(PlayerUnit[i], Player(i))
        }
    }
}
тестовый триггер
int count=0
void Ta(){
timer t = GetExpiredTimer()
int tid = GetHandleId(t)
bj_lastCreatedUnit = LoadUnitHandle(gg_htb_HashData,tid,1)
SetUnitBaseDamage(bj_lastCreatedUnit,1)
DestroyTimer(t)
FlushChildHashtable(gg_htb_HashData,tid)
t=null
}
function Trig_____________________________________001_Actions takes nothing returns nothing
bj_lastCreatedUnit=CreateUnit(Player(1),RandomUnit[GetRandomInt(1,RandomUnitMax)],GetRandomReal((size-1)*-128,(size-1)*128.),GetRandomReal((size-1)*-128,(size-1)*128.),270.)
SetUnitBaseDamage(bj_lastCreatedUnit,0)

timer t=CreateTimer()
int tid = GetHandleId(t)

SetUnitArmor(bj_lastCreatedUnit,0.)
count++
BJDebugMsg(I2S(count))
SaveUnitHandle(gg_htb_HashData,tid,1,bj_lastCreatedUnit)
TimerStart(t,0.01,false,function Ta)
t=null
endfunction
===========================================================================
function InitTrig_____________________________________001 takes nothing returns nothing
set gg_trg_____________________________________001 = CreateTrigger( )
TriggerRegisterTimerEvent(gg_trg_____________________________________001,0.1,true)
call TriggerRegisterPlayerEventEndCinematic( gg_trg_____________________________________001, Player(0) )
call TriggerAddAction( gg_trg_____________________________________001, function Trig_____________________________________001_Actions )
endfunction
0
20
7 лет назад
0
Тут и смещение камеры для ботов и изменение статов мемхаком. Не знаю насколько стабильно работает первое, но второе следовало бы тестировать по отдельности. Поставь период таймера равный нулю и ограничь его использование тысячей раз в секунду, например. Такой стресс-тест покажет больше, имхо
0
21
7 лет назад
Отредактирован ClotPh
0
*удалено, прошу извинить за невнимательность, тестовый триггер, ок
0
30
0
Diaboliko:
Тут и смещение камеры для ботов и изменение статов мемхаком. Не знаю насколько стабильно работает первое, но второе следовало бы тестировать по отдельности. Поставь период таймера равный нулю и ограничь его использование тысячей раз в секунду, например. Такой стресс-тест покажет больше, имхо
до мемхака пользовался костылём через руну, повышающую белую атаку...
и как бы работало всё без фаталов...
со стресс тестом попробую...

потестил... в функцией изменения атаки вылетает сразу... потостил этот же цикл с функцией изменения брони... всё работает...
test...
...
for(count=0;count<1000;count++){
                BJDebugMsg(I2S(count))
                bj_lastCreatedUnit=CreateUnit(Player(1),RandomUnit[GetRandomInt(1,RandomUnitMax)],GetRandomReal((size-1)*-128,(size-1)*128.),GetRandomReal((size-1)*-128,(size-1)*128.),270.)
                //SetUnitBaseDamage(bj_lastCreatedUnit,0)
                SetUnitArmor(bj_lastCreatedUnit,0.)
            }
0
37
7 лет назад
0
Я бы порекомендовал выделить все магические числа, вычисления и адреса в константы/отдельные функции - так проще вносить правки и дебажить операции. А все SetHeroAbilityFromList и проверки входных данных можно оставить на более высоком слое абстракции.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.