Добавлен , опубликован
Собственно тот знаменитый хак на память который нам радостно предоставил DracoL1ch, который позволяет нам больше не морочится с системами отлова урона, или вовсе узнать координаты курсора без стороннего по.
Для сохранения требуется: экспериментальная версия pjass.exe
Причём не все подходят, меньше всего проблем было с этой версией
В хаке присутствует только 1 пример на изменение белой атаки у героя, остальные готовые функции можно найти на:
Хайве
Гитхабе
Просто копируем саму функцию, все остальное для её работы есть в наработке и сохраняем.
Так же на хайве есть инструкция по созданию собственных функций для чтения\изменения данных в памяти игры.
`
ОЖИДАНИЕ РЕКЛАМЫ...
6
после использования SetAbilityUbertip может выдавать фатал, при очистке памяти.(в новой игре)
21
Из небольших любопытных наблюдений, мб кому пригодится.
Было сделано простое заклинание, временно снижающее базовую скорость перемещения цели до 0. Т. е. при касте на цель запоминается в реалку, какая была скорость перемещения, ставится 0 (даже -300 ставится, на всякий пожарный), а по истечении срока действия возвращается значение из реалки. Чтобы все работало, в константах еще стоит минимальная скорость боевой единицы 0.
Так вот интересный побочный эффект: если цель, когда на нее кастануть это "Сковывание", уже будет идти в каком-то направлении, то продолжит идти с прежней скоростью. Но вот если остановится хоть на мгновение, например, для атаки или каста, или попытается сменить направление движения - все, встанет вертеться на месте, как миленькая, пока спелл не кончится.
То есть тут значительное отличие от простой "сетки" ;) Не говоря уже о том, что под таким сковыванием можно все блинки юзать, а не только триггерные, и что снижение скорости цели может повлиять на эффекты некоторых заклинаний.
21
Поправочка-добавочка: скорость не режется ниже 1. В константах минимальная стоит 0, в триггере вообще приказано давать -300, а фактически получается 1 (измерено командой -ms). В остальном инфа справедливая.
32
ClotPh, Не удивительно, в движке встроены собственные проверки корректности скорости перемещения, так что даже мемхаком низя поднять скорость выше 522.
21
Если ломать дальше, то надо сильнее хакать, до этих проверок докапываться :D :D :D
А вообще -300 ставилось, кстати, потому, что хотелось заодно проверить, возможна ли отрицательная скорость перемещения (не пойдет ли юнит задом :D) Не пошел, а жалко, тоже фантазия ппц разыгрывалась, что бы можно было сделать... Хотя это офк и так можно сделать, но триггерно...
32
Увы скорость перемещения связана с частотой обновления кадров, тумана войны, видимости юнитов и поэтому там все не так просто.
Насколько помню лич долго бился с той же видимостью, карты путей у юнитов и видимость при большой скорости будут работать некорректно.
16
туман-то я давно умею мемхаком сам обновлять
недавно нашел и лимиты на мс
отрицательную скорость, кстати, не пробовал. но значения выше 550 могут приводить к небольшим затупкам из-за слишком большого шага юнита, вследствие чего ему приходится разворачиваться, чтобы попасть по чекпоинту (карты путей)
не, всё, что 0 или ниже, равно нулю, юнит встает
3
подскажите что делать, при сохранение вылетает 11 ошыбок
27
Vitalik8, читай в комментариях, что нужно делать.
И скачай jngp + pjass.exe. Если выскакивают ошибки даже с этим. То нужно, как пишут в комментах, еще выключить cJass. Мне помогло это.
И уметь правильно сохраняться (дважды и путь и название карты не дожно содержать кириллицы).
21
Если кому не впадлу - че там с ренджем атаки? Вроде что-то было, но при попытке поставить и использовать нихрена не делало (при этом дистанция получения приказа у препарируемого юнита на всякий пожарный в РО высокая ставилась).
Просто ну нет сейчас времени все самостоятельно переиспытывать, не сто рук и мозгов. А идеи классные (типа снайперского поля, медленно по чуть-чуть увеличивающего рендж атаки ренджевикам, пока в нем стоишь) подъезжают.
16
ClotPh:
уверен? у меня прекрасно работают все манипуляции с атакой
21
Хм... странно, действительно работает, ну, значит, в очередной раз личная наркомания...
2
Daniil18:
Drynwhyl, все сделал, но как саму проверку на конкретную клавишу сделать. Как узнать интегер этой кнопки?
я опять ретард, только спросил тут же нашел выход. Хочу сделать шутанчик с управлениями кнопками, тут надо будет париться с локал плеерами от десинков?
Я добавлял полноценную поддержку собственных пакетов, с примером управления WASD, там используется DLL для регистрации клавиш, а через JASS код прием и отправка любых пакетов включая нажатия клавиш и что угодно вообще. Сейчас появилась возможность отключать ненужные функции из моей DLL через JASS код для использовании в других картах.
Код устаревший на github / hive, там нет обработчика пакетов.
Был реализован в JASS коде прием и отправка пакетов с любыми данными, и обработка входящих пакетов, т.е локально можно вызвать отправку любых данных после чего у всех сработает триггер на прием с этими данными.
В новом коде был пример управления на WASD/CTRL/SPACE.
Но в игре существует ограничение на количество приказов, не знаю как его убрать. Если отправить в секунду где-то 30 пакетов, то игрок отправивший их не сможет ничего делать где-то несколько секунд.
6
Но в игре существует ограничение на количество приказов, не знаю как его убрать. Если отправить в секунду где-то 30 пакетов, то игрок отправивший их не сможет ничего делать где-то несколько секунд.
Лимит отрубается у хоста...
в ghost боте это реализуется вроде как
2
Нет, даже в локальной игре такой лимит есть.
Это скорее лимит на отправку чем на прием
Dracol1ch не обновлял код на github/hive по этому там нет кода на отправку и прием своих пакетов, может он обновит незнаю)
32
Alexander12:
Но в игре существует ограничение на количество приказов, не знаю как его убрать. Если отправить в секунду где-то 30 пакетов, то игрок отправивший их не сможет ничего делать где-то несколько секунд.
Лимит отрубается у хоста...
в ghost боте это реализуется вроде как
У хост игра почти что своя игра, для эмитации игрока и прочего, ему и game.dll ненужен, правда все зависит от самого бота и того кто его писал.
21
Есть герой Психопомпа.
Из-за его способностей происходит следующее:
  • Каждый раз, когда любой герой кастует любой спелл и его перезарядка больше 1, перезарядка первой абилы Психопомпы приравнивается к перезарядке этой скастованной абилы, а манакост - к перезарядке этой абилы, умноженной x3/x4/x5/x6/x7 по лвлу прокачки.
  • Каждый раз, когда любой герой кастует любой спелл не-предмета и его перезарядка больше 1, Психомомпа ресает ману в 4 * перезарядка скастованной способности * уровень этой своей способности.
  • Каждый раз, когда любой герой кастует любой спелл не-предмета и его перезарядка больше 1, Психомомпа ресает здоровье в перезарядка скастованной способности * уровень этой своей способности.
Иногда (НЕ после каждой игры, но иногда) по выходу из вара происходит фатал.
Есть предположения о причинах? Или это само по себе потому, что постоянно передрачивается перезарядка способности и ее манакост?
КСТАТИ. У абилы не 10 лвлов, а 5, это "предусмотрительный" ифзенэлс из другого триггера. Так что loop каждый раз пытается вписать по 5 манакостов и перезарядок в первом триггере на несуществующие уровни абилы. Мб в этом причина??? Но почему тогда фатал иногда есть, а иногда не? Ну это я в люб. случае исправлю потом, главное, не забыть.
Коды ниже (триги, вызывающие эти функции, реагируют на каст любой абилы любым героем)
function MadBreathParametersChange takes nothing returns nothing
local integer i = 11
local real newcd = GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()))
if (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ
loop
exitwhen i < 1
set i = i-1
call SetAbilityCD ('A27Q', i, newcd)
call SetAbilityManaCost('A27Q',i,R2I(GetAbilityCD('A27Q',i) * (2 + i)))
endloop
ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ - ЗАКРЫТО.
else
endif
endfunction
function DelicacyEffect takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27S', u5) >= 1 ) then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + 4 * GetUnitAbilityLevelSwapped('A27S',u5))
else
endif
endloop
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function PerceptionEffect takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ ЗДОРОВЬЕ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27T', u5) >= 1 ) then
call AddSpecialEffectTargetUnitBJ( "overhead", u5, "Psychopomp4.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call SetUnitState(u5, UNIT_STATE_LIFE, GetUnitState(u5, UNIT_STATE_LIFE) + GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) * GetUnitAbilityLevelSwapped('A27T',u5))
else
endif
endloop
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ ЗДОРОВЬЕ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
32
Функция установки видимости модели юнита в тумане войны
function SetAlwaysVisibleFlag takes unit u, boolean flag returns nothing
    local integer a = ConvertHandle( u )
    if a > 0 then
        if flag and not IsFlagBitSet( ReadMemory( a + 0x20 ), 0x10 )  then
            call WriteMemory( a + 0x20, ReadMemory( a + 0x20 ) + 0x10 )
        elseif IsFlagBitSet( ReadMemory( a + 0x20 ), 0x10 ) then
            call WriteMemory( a + 0x20, ReadMemory( a + 0x20 ) - 0x10 )
        endif
    endif
endfunction
При значении true модель юнита будет видна в тумане войны всегда, при false только если он будет обнаружен.
Не дает возможность выделить юнита, навести целевой навык и тому подобное.
Анимации юнита видны.
21
А что там про лимиты на мс, если не секрет? Ломаются глобально для всех или для конкретной единицы? Сразу рабочие функции увидеть реально?
16
и так и так, со своими недостатками каждый. функции нет рабочей, просто копал и знаю
21
Ну если будут и если не жалко будет, то спасибо скажу за выкладывание их сюда (хотя сейчас не самое важное).
5
ClotPh просил, выложу тут архив с MemoryHack, который я смог собрать. Если будет нужно, буду обновлять по возможности. Можно писать в лс, что поправить или добавить
30
Позицию курсора отловить возможно?
Ну или как-то эмулировать клик мышкой, тоже сойдёт?
32
Clamp:
Позицию курсора отловить возможно?
Ну или как-то эмулировать клик мышкой, тоже сойдёт?
Да, в начале темы было про это, кооринаты мыши ловить можно, но увы для сингла не очень, синхронизация не мгновенная.
21
Можно, но в том, что пока в опенсорсе на гитхабе, только локально, т. е. юзлесс в мультиплеере.
А в сингле-то спокойно, я с помощью GetMouseX и GetMouseY спокойно телепортирую ладдерного ловца духов в тест-карте туда, куда он змеек тыкает при их касте, или можно вообще юнита заставить за курсором скользить, только толку, если для мультиплеера так не сделаешь? Позиция мыши от каждого игрока отловится для него = десинк.
Все-таки мне кажется, что можно сделать
function GetMouseXOfPlayer takes player returns real
Просто самостоятельно мозги трещат, у меня где-то были попытки, чуть ли не в этом треде...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.