Значит есть такая задумка, мне нужно чтобы функция ExportAndInjectDLL для подгрузки dll карту из первой версии мемхака (см. RenderEdge) заработала во второй версии мемхака (см. Детект урона на мемхаке).
Я полностью проследил весь путь по каждой библиотеке и это ужасно... есть много общих функций, которые внутри совсем другие, поэтому вижу только 2 пути решения:
  1. Разобраться как подгружать dll на второй версии мемхака, к сожалению никакой инфы так и не нашел
  2. Переименовать ручками все функции, чтобы 2 мемхака заработали на одной карте, вот во второй способ я более верю, но это очень большой объём и высоки шансы что вообще я просто всё запорю.
Поэтому решил собрать как можно больше инфы и получить ответы на след вопросы:
  1. Как быстро обфусцировать код, сохранив его работоспособным и убрать конфликты
  2. Подгрузить dll способом второго мемхака
  3. И каким иным способом мне добиться работоспособности обоих версий мемхака одновременно?
  4. Если всё вышеперчисленное НЕВОЗМОЖНО!, то всё таки мне нужны советы, как вручную без ошибок правильно переименовать все функции в коде, пока что в голове только проскакивают варианты это разложение всех библиотек в 1 файл в блокноте и через CTRL+F сразу находить и переименовывать всё что вижу....

Ну содержимое у restore само собой разное, в детекте урона новый хук на выход, вам нужна функция загрузки библиотеки?
Это же дело над:

function LoadLibrary takes string nDllName returns integer
    if pLoadLibraryA == 0 then
        set pLoadLibraryA = GetModuleProcAddress("Kernel32.dll", "LoadLibraryA" )
    endif
    if pLoadLibraryA != 0 then
        return CallStdcallWith1Args(pLoadLibraryA,GetStringAddress(nDllName))
    endif
 
    return 0
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
че-то действительно, поле вроде бы и отображает активную атаку, но не является её определителем, т.е. менять его бесполезно. ок, тогда пока нет решения на мх
ответ
Реализовал через второй вариант:
Дальше пришла в голову другая идея. Думаю, можно сделать с помощью ремонта зданий Альянса: на месте смерти героя создаётся здание с моделью креста со здоровьем 1/100 ед., а союзные герои ремонтируя крест будут повышать её здоровье, получается некая иллюзия прогресс бара. И если спрятать способность ремонта с помощью функции HideAbilityButton( ) из мемхака, то будет ли она срабатывать при нажатии на ПКМ? Также, как отловить момент полного ремонта здания? С помощью таймера проверять процент здоровья каждые доли секунды?
раскрыть
scope HeroRevive initializer Initialization


    struct herorevive
        private                    unit           dyingUnit
        private                    unit           reincarnate
        private                    real           life

        private                    thistype       prev
        private                    thistype       next

        public   static  constant  trigger        trig    =  CreateTrigger( )
        public   static  constant  timer          period  =  CreateTimer( )


        private static method iterate takes nothing returns nothing
            local  thistype  this  =  thistype( 0 ).next

            loop
                exitwhen ( this == 0 )

                if ( GetWidgetLife( this.reincarnate ) > this.life ) then
                    set  this.life  =  GetWidgetLife( this.reincarnate )

                elseif ( GetWidgetLife( this.reincarnate ) >= GetUnitState( this.reincarnate, UNIT_STATE_MAX_LIFE ) ) then
                    call ReviveHero( this.dyingUnit, GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), true )
                    call RemoveUnit( this.reincarnate )

                    set  this.reincarnate  =  null
                    set  this.life         =  0.0

                    set  this.prev.next    =  this.next
                    set  this.next.prev    =  this.prev

                    if ( thistype( 0 ).next == 0 ) then
                        call PauseTimer( thistype.period )
                    endif

                    call thistype.deallocate( this )

                elseif ( GetWidgetLife( this.reincarnate ) <= this.life ) then
                    set  this.life  =  1.0
                    call SetWidgetLife( this.reincarnate, this.life )
                endif

                set this = this.next

            endloop
        endmethod


        public static method actions takes nothing returns nothing
            local  thistype  this  =  thistype.allocate( )

            set  this.next         =  0
            set  this.prev         =  thistype( 0 ).prev
            set  this.next.prev    =  this
            set  this.prev.next    =  this

            set  this.dyingUnit    =  GetDyingUnit( )
            set  this.reincarnate  =  CreateUnit( GetOwningPlayer( this.dyingUnit ), 'h003', GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), 0.0 )
            set  this.life         =  1.0

            call SetUnitPathing( this.reincarnate, false )
            call SetWidgetLife( this.reincarnate, this.life )

            if ( this.prev == 0 ) then
                call TimerStart( thistype.period, 0.10, true, function thistype.iterate )
            endif
        endmethod


        public static constant method conditions takes nothing returns boolean
            return IsUnitType( GetDyingUnit( ), UNIT_TYPE_HERO )
        endmethod


    endstruct


    public function Initialization takes nothing returns nothing
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH, null )
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH, null )
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH, null )
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH, null )

        call TriggerAddCondition( herorevive.trig, Condition( function herorevive.conditions ) )
        call TriggerAddAction( herorevive.trig, function herorevive.actions )
    endfunction


endscope
Вот только если спрятать кнопку через HideAbilityButton( ), то способность ремонта зданий исчезает и не работает через ПКМ.
ответ
RMem/WMem - вторая версия, есть еще третья и, скорее всего, последняя
function SetAbilityStringParam2 takes integer id, integer off, string newVal, integer lvl returns boolean
	local integer k=GetAbilityUIDefCaching(id)
	if k < 1 then
		return false
	endif
	set k=k+off
	set k=RMem(k)
	if k>0 then
		set k=k+lvl*4-4
		call AddNewOffsetToRestoreFast(k)
		call WMem(k,GetStringAddress(newVal))
		return true
	endif
	return false
endfunction
по аналогии легко сделать
ответ
Правильный ответ ДА и он здесь xgm.guru/p/renderedge/memoryhack?postid=408475#comment190
ответ
Steal nerves:
тема абилки с зарядами. что-то код с мем хаком плодят разный
я эту фишку тестил. там по факту, значение меняется. Но визуально нет (не отрисовывается).

22
зачем 2 мемхак когда они все схожы просто копируй код который вам нужны.
33
pro100master, видимо кто-то не в теме, а потом спрашиваете, за что тебе минусы кидают
32
Внутренне устройсво функций изменено для надежности, Readmemory на RMem и так далее.
22
я взял Render а код от драколич соединил итог 1 мемхак...
33
Вот объединенные карты в одной
А вот весь код из рендера какая-то 1000 строк
ха
Разумеется карта не даёт сохранится нормально, ибо тут дублирующиеся библиотеки (эх, если бы только они), + дублирующиеся да с разным содержание
pro100master, у нас как бы quq_CCCP, обладает последним нормальным мемхаком, а код Лича равняется 2016 году
Мне стоит заморочиться, или это провал?, просто тут много часовая работа, ну думаю что я за полчаса все замены сделаю....
Загруженные файлы
22
Bergi_Bear, давно и так стоял.
Bergi_Bear, там адрес не меняют а лишь функционалов перенести и все!
Загруженные файлы
32
Ну содержимое у restore само собой разное, в детекте урона новый хук на выход, вам нужна функция загрузки библиотеки?
Это же дело над:

function LoadLibrary takes string nDllName returns integer
    if pLoadLibraryA == 0 then
        set pLoadLibraryA = GetModuleProcAddress("Kernel32.dll", "LoadLibraryA" )
    endif
    if pLoadLibraryA != 0 then
        return CallStdcallWith1Args(pLoadLibraryA,GetStringAddress(nDllName))
    endif
 
    return 0
endfunction
Принятый ответ
33
quq_CCCP, 10 плюсов этому господину!
оно!, всё работает спасибо большое!!!
33
DreamUI чтобы выводить показатели регена маны и хп, скорости движение и скорости атаки (реальные числа вместо высокая/очень высокая)
Это больше не хак, а лишь плагин на интерфейс, теперь его функционал могут получить не только его обладатели , но ещё и обладатели карты
Загруженные файлы
32
Похоже на дота хелпер лича, а есть скрины как работает?
32
Ну почти как дота хелпер, там вроде на полоске опыта был реген хп.
33
Дота хелпер, по моему ещё магическое сопротивление показывает, у лича на сайте на скринах видел, а может и в игре, но мне очень нравится этот плагин привык уж к нему, а в сларках моих очень нужно знать текущий показатель регена себя и врага, поэтому человеку без него тяжелее играть
32
Bergi_Bear, ну а че в рендер едже другие функци запуска длл, если честно чето еще ни 1 длл не запускал, хотя в карте мемхак есть давно.
33
а есть где то в свободном доступе дотахелпер в ввиде dll? ну по такому принципу можно ещё манабары и Keytowasd подгрузить, больше не видел ничего годного
32
Bergi_Bear, есть, щяс скину.
Bergi_Bear, вот исходник
Автор не лич, поэтому вопросы к нему не уместны, либа настроена на доту и фишки доты, к примеру борьба с читерским софтом для доты.
33
quq_CCCP, Ну это я видел, вещь весьма тяжелая для понимания как с ней работать, но как она ведёт себя в игре - вполне всё ясно
32
Bergi_Bear, её настраивать под себя надо, у тебя же не дота. Ну кто у нас в С++ шарит, проси собрать нужные модули.
Готовую дотахелпер - можно скачать из доты лича, стоит запустить его карту - он появится в тебя в папке с варом.
33
Да я посмотрел,.. мне в принципе ничего и не надо из дота хелпера, мб разве только манабары, корректно работающие с широким экраном
33
Неее, Dream не мой, он просто с инета в формате mixtype идёт
32
Ну мб авторам кинешь ссылки на исходники длтахелпера и дополнят резистом к магии и еще чем?
А кстати вот
function LibFeaturesFullEnable takes nothing returns nothing
call EnableLibFeatures(LIB_Feature_AttackSpeed+LIB_Feature_MoveSpeed+LIB_Feature_ItemText+LIB_Feature_UnitHP_MP+LIB_Feature_CUSTOM_FPS_INFO+LIB_Feature_COOLDOWNFIX+LIB_Feature_MANABAR+LIB_Feature_HPBAR+LIB_Feature_Widescreen+LIB_Feature_MutePlayer+LIB_Feature_AllySkillViewer+LIB_Feature_ClickHelper)
endfunction
constant integer LIB_Feature_AttackSpeed=0x1
constant integer LIB_Feature_MoveSpeed=0x2
constant integer LIB_Feature_ItemText=0x4
constant integer LIB_Feature_UnitHP_MP=0x8
constant integer LIB_Feature_CUSTOM_FPS_INFO=0x10
constant integer LIB_Feature_COOLDOWNFIX=0x20
constant integer LIB_Feature_MANABAR=0x40
constant integer LIB_Feature_HPBAR=0x80
constant integer LIB_Feature_FileHelper=0x100
constant integer LIB_Feature_Widescreen=0x200
constant integer LIB_Feature_MutePlayer=0x400
constant integer LIB_Feature_AllySkillViewer=0x800
constant integer LIB_Feature_ClickHelper=0x1000function DisableLibFeatures takes integer flags returns nothing
if pDisableFeatures == 0 then 
set pDisableFeatures = GetModuleProcAddress(EXTRADLLNAME, "DisableFeatures")
endif
if pDisableFeatures != 0 then
call CallStdCallWith1Args(pDisableFeatures,flags)
endif
endfunction

function EnableLibFeatures takes integer flags returns nothing
if pEnableFeatures == 0 then 
set pEnableFeatures = GetModuleProcAddress(EXTRADLLNAME, "EnableFeatures")
endif
if pEnableFeatures != 0 then
call CallStdCallWith1Args(pEnableFeatures,flags)
endif
endfunction
Код для управления и настроек дотахелпера.
33
Ахтунг! quq_CCCP:
Ну содержимое у restore само собой разное, в детекте урона новый хук на выход, вам нужна функция загрузки библиотеки?
Это же дело над:

function LoadLibrary takes string nDllName returns integer
    if pLoadLibraryA == 0 then
        set pLoadLibraryA = GetModuleProcAddress("Kernel32.dll", "LoadLibraryA" )
    endif
    if pLoadLibraryA != 0 then
        return CallStdcallWith1Args(pLoadLibraryA,GetStringAddress(nDllName))
    endif
 
    return 0
endfunction
Не работает, он подгружает dll только из корня игры, а надо чтобы из импорта из карты =(, просто у меня одна копия dll оказывается затерялась, поэтому показалось, что работает =(
function ExportDllFromMpqAndInjectToWarcraft takes string source, string dest returns nothing
    call ExportFileFromMpq(source,dest)
    call LoadLibrary(dest)
endfunction
А что вот это у нас такое? какой путь надо использовать? мб в комбинации с первым вариантом должно работать
Пока *опа горела, вроде получилось, воткнул ExportFileFromMpq, где source и dest одно и тоже, добавил глобалку set pExportFromMpq = GameDLL + 0x702C50,
И получается наш файл навсегда оказался в коревой папке с варом
а там и до exe/bat не далеко, аяяяй конечно я этого делать не буду
Чтобы оставить комментарий, пожалуйста, войдите на сайт.