21

» WarCraft 3 / [Мемхак] Функции для способностей.

Ну т. е. функцию CloneAbilityData надо переписанную потом будет просто вставить?
Ок, жду, спасибо.
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Ладно, спасибо... Пока выяснилось, что если CloneAbility не писать, карта просто не запускается (ну примерно этого и ожидалось).
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Господи, ну что там за лимит-то еще такой, подробнее можно?
Но все равно переместить CloneAbility не проблема, просто не вижу смысла из-за все-таки НЕ наиглавнейшей задачи в XXX-й раз изменять код (у ульта очень большой кд, он слишком часто юзаться не будет, даже с этим лимитом мифическим "сотен" там не наберется, если за одно использование пройдет 10 клонабилитей, + любая абила, на которую ульт уже воздействовал, клонабилити новых уже НЕ вызывает, т. к. по ифзенэлсу не проходит).
Фатал в основной карте происходит после ОДНОГО юза ульты и ОДНОГО увеличения ренджа (т. е. вызывается десять клонабилитей). Точнее, его достаточно, чтобы после выхода из вара был фатал. Все еще уверенность, что дело в этом "превышении лимита"?
Зачем вообще, еще раз, юзается функция клонабилити и что будет, если ее не юзать? Вот почему, например, в основном мемхаке есть функции, которые просто меняют параметры, а тут еще необходима вот эта клонабилити? Проконсультируйте, если не трудно.
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Ну код станет оптимальнее, ок, но не в этом же дело сейчас.
Все-таки мне кажется, что это из-за виджетайзера. Потому что он мне так уже уничтожал москитных даммиков, считая их "неиспользуемыми объектами", а мне потом разбираться, почему вместо файерболлов пустота летала.
Он, наверное, что-то там корежит в данных способностей при сжатии.
Потому что коды ведь одинаковые в тест-карте и в основной? (Если нет - пальцем на различия). А в тест-карте не фаталит, а в основной фаталит. А основная отличается:
  • Тем, что в ней дохрена всего;
  • Тем, что сжималась виджетайзером и оптимайзером.
Влияет ли первая причина? Вряд ли. Вывод...
***
Нде. Чушь какая-то. Дошло сейчас прогнать тест-карту через виджик и оптимайзер (т. е. протестировать так же, как основную) - нет фатала.
Оптимизация одинаковая. Код спелла одинаковый.
Одна карта фаталит вар после выхода из него, если спелл юзается, другая нет. Втф?
А что вообще будет, кстати, если клонабилити не писать?
Функция не подействует, код не скомпилируется или?...
замечание от GF RaiseD: 1.4 (злоупотребление форматированием) Существуют каты, блоки кода и форматирование.
21

» WarCraft 3 / Нужна модель? - Вам сюда!

Очень простое задание! Очень прошу! НЕ срочно!
Прошу переименовать все 4 модели в соответственно Puddle (для красной), BlackPuddle, GreenPuddle, WaterPuddle и все пути текстур для них и сами текстуры сделать начинающимися с этих слов.
Все закинуть в архив.
Самостоятельно делаю такое через W3ME v 1.07. Именно эта модель после попыток там поменять ей пути текстур бодается.
Так что кто умеет по-другому - сделайте, плз. Ради ничтожного % моделей осваивать параллельный способ желания совсем нет, лучше уж альтернативные выходы искать.
21

» WarCraft 3 / [Мемхак] Функции для способностей.

/
Так и не понятно...
Только что с игры на основной карте НЕ за Райза - фатала после выхода из игры нет.
Тест-карта с Райзом (проюзаны все его активные абилы, всем проставлен безлим рендж через ульту) - фатала после выхода из игры нет.
Основная карта, пикается Райз, вводится -lvlup, юзается его ульта и за ней любая абила, чтобы дать ей безлим рендж. Все, после выхода из игры (хоть немедленно, хоть когда) - однозначный фатал.
Дело не "в любой абиле" - точно были вот ща проюзаны все абилы без ульты и все нормально. Точно что-то связано с ультой, а она выше...
В чём прикол, не понятно. Даже равкоды абил абсолютно одинаковые... В основной карте гораздо больше кода, РО, ланда и вообще всего, но при чем тут это?
Мля, ну, может, код в основной карте чем-то отличается от вышенаписанного и это я идентифицировать не могу? Вот в основной
/
function UnlimitedAbility takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
local unit u5= GetTriggerUnit()
local unit u6= GetSpellTargetUnit()
local integer a= GetUnitAbility(u5 , GetSpellAbilityId())
local integer i= 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ
if ( u6 != null ) and UnitHasBuffBJ(u5, 'B0H6') == true then
loop
exitwhen i > 10
set i=i + 1
call CloneAbilityData(a)
if GetAbilityDataHeroRng(a , i) < 99999 then
call SetAbilityDataHeroRng(a , i , 99999)
call UnitRemoveAbilityBJ('A27A', u5)
call UnitRemoveBuffBJ('B0H6', u5)
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
set u5=null
set u6=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Unlimited2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t= GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash, GetHandleId(t), 2)
local unit u6=LoadUnitHandle(udg_Hash, GetHandleId(t), 1)
local trigger heroadded=LoadTriggerHandle(udg_Hash, GetHandleId(t), 20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash, GetHandleId(t), 21)
local integer i=LoadInteger(udg_Hash, GetHandleId(t), 3)
local real r=LoadReal(udg_Hash, GetHandleId(t), 4)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
set i=i + 1
call SaveInteger(udg_Hash, GetHandleId(t), 3, i)
if ( i == 100 ) or ( i == 200 ) or ( i == 300 ) or ( i == 400 ) or ( i == 500 ) or ( i == 600 ) or ( i == 700 ) or ( i == 800 ) or ( i == 900 ) or ( i == 1000 ) then
call AddSpecialEffectTargetUnitBJ("chest", u6, "Irrespective4.mdl")
call ConditionalTriggerExecute(gg_trg_destroyspeceffect)
call SetUnitManaBJ(u6, ( GetUnitStateSwap(UNIT_STATE_MANA, u6) + r ))
call SetUnitLifeBJ(u6, ( GetUnitStateSwap(UNIT_STATE_LIFE, u6) + r ))
else
endif
if i > 1000 or ( GetUnitAbilityLevelSwapped('A27A', u6) == 0 ) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
call UnitRemoveAbilityBJ('A27A', u6)
call UnitRemoveBuffBJ('B0H6', u6)
call TriggerRemoveAction(heroadded, heroaction)
call DestroyTrigger(heroadded)
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
set t=null
set u5=null
set u6=null
set heroadded=null
set heroaction=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Unlimited takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t= CreateTimer()
local unit u5= GetTriggerUnit()
local unit u6= GetSpellTargetUnit()
local trigger heroadded
local triggeraction heroaction
local real r
local integer i= 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetSpellAbilityId() == 'A278' ) then
set r=30 * ( GetUnitAbilityLevelSwapped('A278', u5) )
call UnitAddAbilityBJ('A27A', u6)
call UnitMakeAbilityPermanent(u6, true, 'A27A')
set heroadded=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(heroadded, EVENT_PLAYER_UNIT_SPELL_EFFECT)
set heroaction=TriggerAddAction(heroadded, function UnlimitedAbility)
call SaveUnitHandle(udg_Hash, GetHandleId(t), 2, u5)
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u6)
call SaveReal(udg_Hash, GetHandleId(t), 4, r)
call SaveInteger(udg_Hash, GetHandleId(t), 3, i)
call SaveTriggerHandle(udg_Hash, GetHandleId(t), 20, heroadded)
call SaveTriggerActionHandle(udg_Hash, GetHandleId(t), 21, heroaction)
call TimerStart(t, 0.01, true, function Unlimited2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
set t=null
set u5=null
set u6=null
set heroadded=null
set heroaction=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
/
АГА! Появилась наконец идея... Основная-то карта через виджетайзер проходит!!!
А там абилы жмутся!!!
Может быть, что из-за этого?! И чо тогда - абилы не жать или с фаталом смириться?
WarCraft III Widgetizer 1.9 - мб снять галочку с Abilities? Но насколько тогда ухудшится скорость игры и загрузки? На размер-то пофигу...
21

» WarCraft 3 / Кулдаун на способность

Если отслеживанием без мемхака, то еще важно не забыть учитывать всякие рефрешероподобные абилки - после их применения сразу засчитывать все кулдауны у того, кому рефрешнуло, готовыми.
Можно, например, при каждом рефреше накидывать на того, кому он произведен, способность-маркер-пустышку "этому сейчас рефрешнуло", во всех своих отслеживающих таймерах проверять ее наличие у юнита, если она есть - сразу делать "достижение нуля" и удалять ее (т. к. свою функцию выполнила).
Хотя во избежание багов еще такую абилу-пустышку тогда надо удалять при каждом ПРИМЕНЕНИИ способности, а таймер-счетчик должен быть с малым периодом...
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Да, на 99% уверенность, что дело в избыточном клонировании. Основную карту уже сейчас переоткрывать времени нет, но после проверки в дополнительной (клонировалась только одна абилка, у которой рендж фактически был увеличен) вар НЕ сфаталил при выходе. Все понятно, ок, потом разберемся.
***
Нет. Все равно фаталит в основной карте.
В тест-карте не фаталило.
Если играть в основную карту без героя с этой абилой - не фаталит.
У этого героя еще из того, что не используется ни у кого больше, в другом спелле юзается AddUnitMPRegen из основного мемхака, но крайне сомнительно, что дело в ней...
Текущий код (еще исправлено отсутствие проверки баффа, жесткая ошибка, теперь способность ДЕЙСТВИТЕЛЬНО работает правильно - в чем она ЖЕСТОКО косила раньше, пусть интересующиеся юзеры разберутся сами, но в основной карте фаталит).
PS Ниже я Клон в принципе не могу поставить, проблема-то в том, что для вызова GetAbilityDataHeroRng УЖЕ надо абилку склонировать.
***********
function UnlimitedAbility takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ
if (u6 != null) and UnitHasBuffBJ(u5,'B0H6') == true then
loop
exitwhen i > 10
set i = i+1
call CloneAbilityData(a)
if GetAbilityDataHeroRng(a, i) < 99999 then
call SetAbilityDataHeroRng(a,i,99999)
call UnitRemoveAbilityBJ( 'A27A', u5 )
call UnitRemoveBuffBJ( 'B0H6', u5 )
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Unlimited2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t),21)
local integer i=LoadInteger(udg_Hash,GetHandleId(t),3)
local real r=LoadReal(udg_Hash,GetHandleId(t),4)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
set i = i + 1
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
if (i==100) or (i==200) or (i==300) or (i==400) or (i==500) or (i==600) or (i==700) or (i==800) or (i==900) or (i==1000) then
call AddSpecialEffectTargetUnitBJ( "chest", u6, "Irrespective4.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call SetUnitManaBJ( u6, ( GetUnitStateSwap(UNIT_STATE_MANA, u6) + r ) )
call SetUnitLifeBJ( u6, ( GetUnitStateSwap(UNIT_STATE_LIFE, u6) + r ) )
else
endif
if i > 1000 or (GetUnitAbilityLevelSwapped('A27A',u6) == 0) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call UnitRemoveAbilityBJ( 'A27A', u6 )
call UnitRemoveBuffBJ( 'B0H6', u6 )
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Unlimited takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local trigger heroadded
local triggeraction heroaction
local real r
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetSpellAbilityId() == 'A278' ) then
set r = 30 * (GetUnitAbilityLevelSwapped('A278',u5))
call UnitAddAbilityBJ( 'A27A', u6 )
call UnitMakeAbilityPermanent (u6, true, 'A27A')
set heroadded=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(heroadded, EVENT_PLAYER_UNIT_SPELL_EFFECT)
set heroaction = TriggerAddAction(heroadded,function UnlimitedAbility)
call SaveUnitHandle(udg_Hash,GetHandleId(t),2,u5)
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u6)
call SaveReal(udg_Hash,GetHandleId(t),4,r)
call SaveInteger (udg_Hash,GetHandleId(t),3,i)
call SaveTriggerHandle(udg_Hash,GetHandleId(t),20,heroadded)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t),21,heroaction)
call TimerStart (t, 0.01, true, function Unlimited2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Ага, спасибо. Занесу под ифзенэлс, в любом случае так правильнее будет.
Дело только в этом? Вообще у кого-нибудь еще сабж фаталил подобным образом?
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Код рассчитан на то, чтобы менять рендж в принципе любой таргетабл-юнит абилити.
Да вот весь код, это изначально бафф, который накидывается на цель и отхиливает ей хп и ману, но это чтобы было.
А основная суть баффа - что если под ним скастовать любую таргетабл-юнит абилити, то она у кастера становится с анлимитед каст ренджем (на все уровни).
Тут из-за "предусмотрительности" на всякий случай прописано вплоть до 10 уровней (хотя на деле у абил практически никогда больше 5 не бывает, а у предметных вообще 1).
Мб в этом дело?
Тогда надо еще макс. лвл абилы узнавать и специально рендж продрючивать только на существующее число лвлов?

НО опять же - с глобальными изменениями кулдаунов таких траблов не было.
Вот весь код спелла (юнит для функции регистрируется при изучении заклинания). Все действует, "дагоны" с анлимитед каст ренджем рулят, "шаклы расты" тоже. Но фаталит.
***************************************
function UnlimitedAbility takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call CloneAbilityData(a)
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ
if (u6 != null) then
loop
exitwhen i > 10
set i = i+1
if GetAbilityDataHeroRng(a, i) < 99999 then
call SetAbilityDataHeroRng(a,i,99999)
call UnitRemoveAbilityBJ( 'A27A', u5 )
call UnitRemoveBuffBJ( 'B0H6', u5 )
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Unlimited2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t),21)
local integer i=LoadInteger(udg_Hash,GetHandleId(t),3)
local real r=LoadReal(udg_Hash,GetHandleId(t),4)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
set i = i + 1
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
if (i==100) or (i==200) or (i==300) or (i==400) or (i==500) or (i==600) or (i==700) or (i==800) or (i==900) or (i==1000) then
call AddSpecialEffectTargetUnitBJ( "chest", u6, "Irrespective4.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call SetUnitManaBJ( u6, ( GetUnitStateSwap(UNIT_STATE_MANA, u6) + r ) )
call SetUnitLifeBJ( u6, ( GetUnitStateSwap(UNIT_STATE_LIFE, u6) + r ) )
else
endif
if i > 1000 or (GetUnitAbilityLevelSwapped('A27A',u6) == 0) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call UnitRemoveAbilityBJ( 'A27A', u6 )
call UnitRemoveBuffBJ( 'B0H6', u6 )
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Unlimited takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local trigger heroadded
local triggeraction heroaction
local real r
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetSpellAbilityId() == 'A278' ) then
set r = 30 * (GetUnitAbilityLevelSwapped('A278',u5))
call UnitAddAbilityBJ( 'A27A', u6 )
call UnitMakeAbilityPermanent (u6, true, 'A27A')
set heroadded=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(heroadded, EVENT_PLAYER_UNIT_SPELL_EFFECT)
set heroaction = TriggerAddAction(heroadded,function UnlimitedAbility)
call SaveUnitHandle(udg_Hash,GetHandleId(t),2,u5)
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u6)
call SaveReal(udg_Hash,GetHandleId(t),4,r)
call SaveInteger (udg_Hash,GetHandleId(t),3,i)
call SaveTriggerHandle(udg_Hash,GetHandleId(t),20,heroadded)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t),21,heroaction)
call TimerStart (t, 0.01, true, function Unlimited2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Короче, было лишних многобукаф, основная суть следующая:
  • Если в игре заюзать изменение ренджа абилки (во всяком случае, до 99999), то после выхода из вара за просмотром реплея такой игры или участием в ней будет сообщение про фатал еррор. Не смертельно и даже не то чтобы неприятно, но просто факт.
  • Такая абилка становится какой-то особенной, "отделенной" - не подвергается по крайней мере некоторым изменениям, которые должны глобально влиять на все такие абилки всех таких юнитов.
21

» WarCraft 3 / Доставание war3map.j через mpq, изменение и вшивание обратно

Если карта открывается 50 минут и надо менять только код, то редактировать war3map.j , очевидно, в разы быстрее, а уж в случае ошибок можно будет и в карту полезть (но как раз в блокноте писать уже и приятнее и ошибки маловероятны, это насчёт того, кто что знает и кто чего не знает).
Открывать интересно именно свою карту, чужие не особенно и вопрос не про это был.
Ну, ятп, неприятных побочных эффектов нет, спасибо.
21

» WarCraft 3 / Какая функция отвечает за получение дальности атаки?

Вообще в мемхаке есть же.
Но новички в картостроительстве, большинство серверов и отчасти последний патч варкрафта в мемхак не понимают.
21

» WarCraft 3 / Хак на память Warcraft3

Хм... странно, действительно работает, ну, значит, в очередной раз личная наркомания...
21

» WarCraft 3 / Хак на память Warcraft3

Если кому не впадлу - че там с ренджем атаки? Вроде что-то было, но при попытке поставить и использовать нихрена не делало (при этом дистанция получения приказа у препарируемого юнита на всякий пожарный в РО высокая ставилась).
Просто ну нет сейчас времени все самостоятельно переиспытывать, не сто рук и мозгов. А идеи классные (типа снайперского поля, медленно по чуть-чуть увеличивающего рендж атаки ренджевикам, пока в нем стоишь) подъезжают.
21

» WarCraft 3 / Как дать юниту возможность райткликать на дерево?

Можно дать абилу на съедение деревьев от горных великанов. Тогда появится возможность райткликать на дерево, а когда он будет пытаться кастануть абилу на дерево, сиречь съесть его (макс. расстояние каста настраивается) - отменять каст (тогда дерево останется стоять на месте и ничего ему не будет), триггерно запускать свой прыжок. Тогда кулдаун абилы не пойдет, но его, ятп, можно будет пустить через мемхак.
Манки кинг доты 2 весёлый, да.
21

» WarCraft 3 / Мигалка у баффов перед исчезновением

Зачем аура выносливости, если есть аура торнадо? То же самое, только спеллбуков не надо, т. к. иконка не отображается. Правда, там по умолчанию красный цвет описания баффа, а для положительного эффекта логичнее зеленый, но цветотег один раз поставить и дальше копипастить явно проще, чем спеллбуки давать и блочить.
Насчет моргания хз, тоже будет интересно узнать.
21

» WarCraft 3 / Как повысить уровень способности в НЕ героя?

Все должно действовать, постоянно именно так и делаю. Триггер в студию.
P. S. Только одна оговорка: на всякий случай будет лучше, если способность, даваемая даммику, заранее будет присутствовать у какого-нибудь юнита на карте (можно нейтрального и/или не способного её скастануть), иначе иногда не исключены ситуации, когда даммик просто не кастует добавленную ему способность вообще (зависимость определить не удалось, абсолютно в одной и той же уже сохраненной и оптимизированной карте может кастовать, а может не кастовать - если не стал кастовать эту абилу в первый раз, то и всю игру - т. е. весь конкретный запуск конкретно этой карты - уже не станет, но добавлением абилы заранее нейтральному зданию, т. е. прелоадом, лечится надёжно).
21

» WarCraft 3 / Meat Hook

Опен доту открой и посмотри, да и на хайве и до фига где вроде было хуков в свободном доступе.
21

» WarCraft 3 / Хак на память Warcraft3

Если ломать дальше, то надо сильнее хакать, до этих проверок докапываться :D :D :D
А вообще -300 ставилось, кстати, потому, что хотелось заодно проверить, возможна ли отрицательная скорость перемещения (не пойдет ли юнит задом :D) Не пошел, а жалко, тоже фантазия ппц разыгрывалась, что бы можно было сделать... Хотя это офк и так можно сделать, но триггерно...