Добавлен , опубликован
Собственно тот знаменитый хак на память который нам радостно предоставил DracoL1ch, который позволяет нам больше не морочится с системами отлова урона, или вовсе узнать координаты курсора без стороннего по.
Для сохранения требуется: экспериментальная версия pjass.exe
Причём не все подходят, меньше всего проблем было с этой версией
В хаке присутствует только 1 пример на изменение белой атаки у героя, остальные готовые функции можно найти на:
Хайве
Гитхабе
Просто копируем саму функцию, все остальное для её работы есть в наработке и сохраняем.
Так же на хайве есть инструкция по созданию собственных функций для чтения\изменения данных в памяти игры.
`
ОЖИДАНИЕ РЕКЛАМЫ...
21
DracoL1ch, ну песец, а на что я тогда трачу сегодняшний день =/
Может мне кто-нить тогда хоть посоветовать, как правдами и неправдами с мемхаком и без словить абилу и пропихнуть ее выучивание герою??? Мне нужно, чтобы он чужие абилы мог тырить и обязательно через выучивание, иначе будет ппц геморройная бд
просто у меня другие скиллы многие регают свои триггеры только через выучивание конкретно для выучившего
для оптимизации
т. е. если абилу просто дать, она ниче делать не будет
//////
так, тем временем у меня уже строка ловится и не фаталит (по "классическому" мемхаку уже, не люблю слово "старый", да, у меня там небольшая путаница с конвертхэндл функцией была, они ж для старого и нового мх разные, откат сделан).
1095263859
так, id2string все равно достает не понятно что, не равкод, а какие-то
\x00000041...
sic!!! Ну так или иначе прорыв.
ТАК. Ну вот для начала. Вот ДЕЙСТВУЮЩИЕ (!!!) функции для "классического" мемхака. Все-таки это какая-никакая, а победа ))) Равкод не отловить, но меняют абилу исправно.

function GetHeroAbilityFromList takes unit uHero, integer list returns integer
set LastConvertedHandle = ConvertHandle( uHero )
    
if IsUnitType( uHero, UNIT_TYPE_HERO ) and LastConvertedHandle > 1 and list > 0 then
return ReadMemory( ReadMemory( LastConvertedHandle + 496 ) + 240 + 4 * list )
endif

return 0
endfunction

function SetHeroAbilityFromList takes unit uHero, integer list, integer abi returns nothing
set LastConvertedHandle = ConvertHandle( uHero )
    
if IsUnitType( uHero, UNIT_TYPE_HERO ) and LastConvertedHandle > 1 and list > 0 then
 call WriteMemory( ReadMemory( LastConvertedHandle + 496 ) + 240 + 4 * list, abi )
endif

endfunction
//////////////
Теперь чо там про фаталы... Лично потестирую... Фаталы ведь ловились в "новом" мемхаке? Тупость, но может быть, это влияет?
А если я быстренько махну поле выучиваемых абил, сразу выучу одну и сразу обратно перепишу поле?
7
ClotPh:
quq_CCCP, так, минутку, то есть равкод я не откопаю?
Ок, сейчас хоть цифры попробую снова... жопа =/
если я тебя правильно понял, то тебе нужна библиотека Ascii
пример использования
local integer id = 'hfoo'
local string raw = A2S(id) // raw == "hfoo" (строка)
id = S2A(raw) // id == 'hfoo' (число)
16
ClotPh:
=~DracoL1ch, ну песец, а на что я тогда трачу сегодняшний день =/
я не вижу у тебя строк в указанном примере
21
Ige, спс.
Да в принципе нужно, но не очень, равкод я при выучивании могу поймать.
DracoL1ch, у меня с тобой десинхронизация какая-то
каких строк?
Мои функции выше безопасны?
Пока гоняю в тест-карте, проблем не обнаруживаю, поля исправно переписываются туда и обратно и абилы учатся
ОХ, лол. Хм. Ща Мегамен забрал чародейскую ауру ладдерного архимага, работает и бафф дает вроде нормальный, но почему-то визуально отображается как "доспехи веры". То ли это у меня импорт такой и уже забыто, то ли допереписывалось (это уже XX была геройская способность, которые были переписыванием полей одному герою впихнуты и все через выучивание). Но других побочных эффектов пока не видно.
Лол набор: выучены 4 все свои абилы (но там не отображаются пассивки, специально же расчет на то, что гер абилы тырит), от чародея крови астрал, огонь и феня и от архимага буран, дух воды и аура, вот аура уже даже благополучно на панель не влезла.
///////////
DracoL1ch, а, дошло!!! Т. е. ты говоришь не брать значения из строки при записи в поле?
Ок, не буду, прямо из одного поля в другое, да и не планировалось.
20
Будет ли десинк при выделении юнита игроком триггерно по случаю наличия зажатой конкретной клавиши (отлавливаемой мемхаком)? Действие то синхронизируемое.
16
очевидно, что работало раньше, работает и сейчас, выделения синхронизируются автоматически, так что проблемы не будет
31
в чём может быть проблема функции SetUnitBaseDamage...
создаю юнита сразу же устанавливаю случайный показатель к атаке..., но с определённым шансом я получаю фатал...
для теста создал простой триггер, который создаёт юнита каждые 0.1 секунды и изменяет ему атаку через эту ф-цию...
иногда вылетает фатал после 40 созданных юнитов, иногда после 150...
где я мог накосячить..?
Загруженные файлы
32
Андреич, юнита проверили?
Обязательно проверяйте входные аргументы.
31
quq_CCCP:
Андреич, юнита проверили?
Обязательно проверяйте входные аргументы.
ну да... юнит как бы не может быть мертв... так как изменение урона идёт один раз сразу после его создания...
31
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
20
Тут и смещение камеры для ботов и изменение статов мемхаком. Не знаю насколько стабильно работает первое, но второе следовало бы тестировать по отдельности. Поставь период таймера равный нулю и ограничь его использование тысячей раз в секунду, например. Такой стресс-тест покажет больше, имхо
21
*удалено, прошу извинить за невнимательность, тестовый триггер, ок
31
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.)
            }
38
Я бы порекомендовал выделить все магические числа, вычисления и адреса в константы/отдельные функции - так проще вносить правки и дебажить операции. А все SetHeroAbilityFromList и проверки входных данных можно оставить на более высоком слое абстракции.
31
всё ребята вопрос снят... извините за беспокойство...
у меня на карте просто мемхак спаян с RenderEdge_mini... видимо, где-то там ошибку допустил...
сейчас проверил на карте с одним только мемхаком, всё нормально работает...
21
Сорри за небольшой оффтоп, но переписывание и выучивание чужих абилок жёстко )
Там ща такие открытия ингейм, что ппц )
Например, если clawbfs.ucoz.ru/forum/3-1833-1 сворует у clawbfs.ucoz.ru/forum/3-216-1 способность clawbfs.ucoz.ru/Icons/TarPit/TarPit2.bmp (там станд морф друида ворона) и активирует, получится Смоляной Мегамен :D .
Он не сможет анморфнуться обратно, у него отрубается его активка, он навсегда теряет способность атаковать, чернеет и становится огненным, но при этом сохраняется нормальная скорость перемещения и свои пассивки + добавляется аура Смоляной Ямы в растечённом состоянии. Мутант, короче. В итоге вряд ли профитно (атаки ничто не заменит), но интересно :D
Чую, там еще немало открытий будет. Вообще там на многие морфы чужих абил изначально был фильтр поставлен, что нельзя, но не на все.
Ну это вообще морфы по принципу друида-медведя и друида-ворона так косят чужие. По-моему, морф типа метаморфозы иллидана должен норм работать, во всяком случае, в них у меня для аватаров - т. е. не совсем "своих" героев - исходная форма не переделывалась в большинстве случаев, а морф и анморф все равно проходил исправно.
А вообще это ржач все равно, Мегамен кидает крюк, Мегамен пускает волну пламени Рагнароса, Мегамен саммонит и собирает пчёл, Мегамен пускает ножницы Рюко Матой, где еще такого Мегамена встретишь )))
21
///////////////
//////////////
  1. Есть функция для поля уровня геройской способности, требуемого для ее изучения? (Ну там ульты требуют в доте обычно 6 уровня и обычные спеллы 1). Интересно читать и писать в это поле
  1. Напомните, кулдаун глобально я давно меняю заклинаниям, а есть возможность локально поменять действующий кулдаун только конкретному заклинанию конкретного героя? Не запустить, запустить-то понятно, что можно любой кулдаун, а именно чтобы вот у этого героя у фаерболла была перезарядка 2, а у всех остальных 8. (Прим. - ещё идея - это могло бы быть использовано как счётчик для чего-нибудь с любой скрытой спеллбучной 1уровневой способностью)
32
ClotPh, можно, но это несколько не очень, клонировать данные спелла и изменять, помню в начале ты жаловался что оно фаталило через раз.
Сделай лучше нулевой кулдаун, а стартом кулдауна делай нужный тебе кд. А так есть функции редактирования кулдауна, уже не помню фиксились ли их проблемы или нет.
16
function GetAbilityLevelRequired takes integer abil returns integer
	local integer a
	if abil!=0 then
		set a=GetAbilityDataDefByIdCaching(abil)
		if a>0 then
			return RMem(a+0x40)
		endif
	endif
	return 0
endfunction
21
quq_CCCP, да мне там не только для этого
я просто все думаю, есть ли возможность на юнита легко повесить счетчик без использования custom value, глобальных переменных и редактирования параметров объекта
просто мог бы быть у него некий спелл с перезарядкой вообще в спрятанном спеллбуке, перезарядка меняться и от нее считаться что-то другое
DracoL1ch, ага, спасибо
21
По поводу xgm.guru/p/wc3/196821
Есть по чтению и записи в строчки, редактирующие тип оружия у первой и второй атаки?
22
Обязятельно ли мемхак инизиализировать после 1 сек ??? или можно сразу инизиализация???
32
pro100master, по вашему желанию, просто нужно смотреть что к чему, там вроде юзаются бж переменные, нужно чтобы инит прошел после них, а не в самом майне, да и это защита от оптимизаторов, ибо если инитить как библиотеку, они вынесут все из инит функций в майн, могут быть проблемы с обрывом потока.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.