Там примитивный код, создается дамми юнит с моделью ледяного шара, и его двигают от лича к указанной цели, если дистанция между шаром и целью меньше N, то наносят урон цели (дамми каст ледяной звезды, урон по цели убран, оставлен только урон по области) ну и ищем в радиусе 500 еще одну цель, которой не является юнит которого мы ударили, ну и летим дальше.
function SH4 takes nothing returns boolean
local trigger t = GetTriggeringTrigger( )
local integer S5I = GetHandleId( t )
local unit P7I = ( LoadUnitHandle( HashData, ( S5I ), ( 2 ) ) )
local unit P8I = ( LoadUnitHandle( HashData, ( S5I ), ( 17 ) ) )
local unit WF3 = ( LoadUnitHandle( HashData, ( S5I ), ( 374 ) ) )
local integer SUI = ( LoadInteger( HashData, ( S5I ), ( 5 ) ) )
local integer SZ4 = ( LoadInteger( HashData, ( S5I ), ( 233 ) ) )
local integer MKO = ( LoadInteger( HashData, ( S5I ), ( 12 ) ) )
local real x = GetUnitX( WF3 )
local real y = GetUnitY( WF3 )
local real tx = GetUnitX( P8I )
local real ty = GetUnitY( P8I )
local real a = AngleBetweenCords( x,y,tx,ty )
local integer DT1 = ( LoadInteger( HashData, ( S5I ), ( 720 ) ) )
if DT1 > 0 then
call SaveInteger( HashData, ( S5I ), ( 720 ), DT1 - 1 )
set t = null
set P7I = null
set P8I = null
set WF3 = null
return false
endif
if DistBetweenCods( x, y, tx, ty ) > 20.00 then
call SetUnitFacing( WF3, a )
set x = PTI( x + 18.0 * Cos( a * bj_DEGTORAD ) )
set y = PUI( y + 18.0 * Sin( a * bj_DEGTORAD ) )
call SetUnitX( WF3, x )
call SetUnitY( WF3, y )
else
if not( IsUnitDead( P8I ) or IsUnitType( P8I, UNIT_TYPE_MAGIC_IMMUNE ) ) then
set tx = GetUnitX( P8I )
set ty = GetUnitY( P8I )
set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( P7I ), DUMMY, tx, ty, a )
call SetUnitPathing( bj_lastCreatedUnit, false )
call SetUnitX( bj_lastCreatedUnit, tx )
call SetUnitY( bj_lastCreatedUnit, ty )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
call UnitAddAbility( bj_lastCreatedUnit, 'A091' )
call SetUnitAbilityLevel( bj_lastCreatedUnit, 'A091', SUI )
if not IsUnitHasNegation(P8I) and IssueTargetOrder( bj_lastCreatedUnit, "frostnova", P8I ) then
call UnitDamageTarget( P7I, P8I, LoadReal( HashData, S5I, 3 ), false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS )
else
call KillUnit( bj_lastCreatedUnit )
endif
endif
if SZ4 > MKO then
call RemoveUnit( WF3 )
call FlushChildHashtable( HashData, ( S5I ) )
call S0I( t )
else
call GroupClear( bj_TempGroup )
set bj_groupEnumOwningPlayer = GetOwningPlayer( P7I )
call GroupEnumUnitsInRange( bj_TempGroup, tx, ty, 625.00, Condition( function Cond_EnemyVisibleNoVardVulAlive ) )
call GroupRemoveUnit( bj_TempGroup, P8I )
set P8I = GroupPickRandomUnit( bj_TempGroup )
if P8I == null then
call RemoveUnit( WF3 )
call FlushChildHashtable( HashData, ( S5I ) )
call S0I( t )
else
call SaveInteger( HashData, ( S5I ), ( 720 ), ( 10 ) )
call SaveInteger( HashData, ( S5I ), ( 233 ), ( SZ4 + 1 ) )
call SaveUnitHandle( HashData, ( S5I ), ( 17 ), ( P8I ) )
endif
endif
endif
set t = null
set P7I = null
set P8I = null
set WF3 = null
return false
endfunction
function Trig_ChainFrost_Actions takes nothing returns nothing
local unit P7I = GetTriggerUnit( )
local unit P8I = GetSpellTargetUnit( )
local integer SUI = GetUnitAbilityLevel( P7I, 'A05T' )
local integer MKO = 10
local trigger t = CreateTrigger( )
local integer S5I = GetHandleId( t )
local unit dummy= CreateUnit( GetOwningPlayer( P7I ), 'e009', GetUnitX( P7I ), GetUnitY( P7I ), GetUnitFacing( P7I ) )
call SetUnitPathing( dummy, false )
if GetSpellAbilityId( ) == 'A08H' then
set SUI = GetUnitAbilityLevel( P7I, 'A08H' ) + 1
set MKO = 100000
endif
call SaveUnitHandle( HashData, S5I , 2, P7I )
call SaveUnitHandle( HashData, S5I , 17, P8I )
call SaveUnitHandle( HashData, S5I , 374, dummy )
call SaveInteger( HashData, S5I , 5, ( SUI ) )
call SaveInteger( HashData, S5I , 233, ( 1 ) )
call SaveInteger( HashData, S5I , 12, ( MKO ) )
call SaveInteger( HashData, S5I , 720, ( 0 ) )
call SaveReal( HashData, S5I, 3, 190.00 + 90.00 * SUI )
call TriggerRegisterTimerEvent( t, 0.02, true )
call TriggerAddCondition( t, Condition( function SH4 ) )
set P7I = null
set P8I = null
set dummy = null
set t = null
endfunction
function Trig_ChainFrost_Conditions takes nothing returns boolean
if ( GetSpellAbilityId() == 'A05T' or GetSpellAbilityId()=='A08H' ) and not IsUnitHasNegation(GetSpellTargetUnit()) then
call Trig_ChainFrost_Actions( )
endif
return false
endfunction
function Register_ChainFrost takes nothing returns nothing
local trigger trg = CreateTrigger()
local integer nIndex = 1
call TriggerAddCondition( trg, Condition( function Trig_ChainFrost_Conditions ) )
loop
exitwhen nIndex > 11
if IsSlotPlayer(Player(nIndex))then
call TriggerRegisterPlayerUnitEvent( trg, Player(nIndex), EVENT_PLAYER_UNIT_SPELL_EFFECT, OnlyHero )
endif
set nIndex = nIndex + 1
endloop
set trg = null
endfunction
Вот как оно сделано у фрога, с небольшими доработками.
Отслеживать смерть техиники, и наносить урон. Вроде кстати у дирежаблей гоблинов была способность - парашутист, типа после крушения все получают головокружение и медленее двигаются некоторое время.
Как где, не видно? TriggerCondition, тут все в условиях написано.
Код Jass, собвственно все что надо таймер, дамми юнит с модлью кольца и группа, по малому периоду двигаем даммика за юнитом кастером и выбираем всех врагов вокруг, с каждым тиком таймера увеличиваем радиус поиска группы, тех кто уже попался отсеиваем, а тех кто попался впервые дамажим, замедление делается дамми юнитом кидающим ледяную звезду в себя, урон по площяди убран, только замедление.
Традиционные были без звука, это после добавили звук с цветом и прочее.
Пажитов насколько помню писал тетрис на компе где ни графики ни звука, разве что принтером шуршать можно. Так что музяку можно любую использовать, то что у нас в 90х китайцы продавали не есть каноничный вариант игры.
NTI - тупо CreateGroup, ну NSI - DestroyGroup
Если в карте нету GroupUtils (прекрасно гуглится на хайве).
Триггер меняем на таймер, но я скинул не для копипаста а для изучения, сложного в коде ничего нету.
function J9O takes nothing returns nothing
local unit P8I=GetEnumUnit()
local group JAO=ND0
local unit P7I=NE0
if IsUnitInGroup(P8I,JAO)==false then
call GroupAddUnit(JAO,P8I)
call IssueTargetOrder(NF0,"slow",P8I)
set JJI=true
call DamageTarget(P7I,P8I,1,200)
set JJI=false
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl",P8I,"origin"))
endif
set P8I=null
set JAO=null
set P7I=null
endfunction
function JBO takes nothing returns boolean
local trigger t=GetTriggeringTrigger()
local integer S5I=GetHandleId(t)
local unit P7I=(LoadUnitHandle(HashData,(S5I),(2)))
local unit I01=(LoadUnitHandle(HashData,(S5I),(19)))
local group JAO=(LoadGroupHandle(HashData,(S5I),(133)))
local real d
local real x
local real x0=GetUnitX(P7I)
local real y
local real y0=GetUnitY(P7I)
local group g=NTI()
local integer NPI=GetTriggerEvalCount(t)
local integer i
call SetUnitX(I01,GetUnitX(P7I))
call SetUnitY(I01,GetUnitY(P7I))
set ND0=JAO
set NE0=P7I
set NF0=(LoadUnitHandle(HashData,(S5I),(132)))
if GetTriggerEvalCount(t)>37 then
call KillUnit(I01)
call NSI(JAO)
call FlushChildHashtable(HashData,(S5I))
call S0I(t)
else
set d=NPI*21
set i=0
loop
exitwhen i>36
set x=x0+d*Cos(360*i/36*bj_DEGTORAD)
set y=y0+d*Sin(360*i/36*bj_DEGTORAD)
set GK=P7I
call GroupEnumUnitsInRange(g,x,y,150,Condition(function C81))
call ForGroup(g,function J9O)
set i=i+1
endloop
endif
call NSI(g)
set t=null
set I01=null
set JAO=null
set P7I=null
set g=null
return false
endfunction
function JCO takes nothing returns nothing
local unit SFI=GetTriggerUnit()
local real x=GetUnitX(SFI)
local real y=GetUnitY(SFI)
local group JAO=NTI()
local trigger t=CreateTrigger()
local integer S5I=GetHandleId(t)
local unit I01=CreateUnit(GetOwningPlayer(SFI),'h091',x,y,0)
local unit JDO=CreateUnit(GetOwningPlayer(SFI),'e00E',GetUnitX(SFI),GetUnitY(SFI),0)
call UnitAddAbility(JDO,'A0T0')
call SaveGroupHandle(HashData,(S5I),(133),(JAO))
call SaveUnitHandle(HashData,(S5I),(19),(I01))
call SaveUnitHandle(HashData,(S5I),(132),(JDO))
call SaveUnitHandle(HashData,(S5I),(2),(SFI))
call TriggerRegisterTimerEvent(t,0.06,true)
call TriggerAddCondition(t,Condition(function JBO))
set t=null
set JAO=null
set I01=null
set JDO=null
set SFI=null
endfunction
function JEO takes nothing returns nothing
if GetSpellAbilityId()=='A0T9' then
call JCO()
endif
endfunction
Мне вот интересно, а зачем?
Проблемы были лишь в Гуи говнокартах и дотах, где оптимизатор сливает все в одну функцию и начинаются обрывы, которые лечатся сверхпросто.
Но проще думать головой и не плодить сущности, инит нет надобности делать в мейне и разом, необходимые триггеры вовсе можно создавать во время игры, к примеру когда игрок выберет героя к котором эти триггеры относятся.
Ну я бы сделал по нормальному, через детект урона. Собственно все просто, задаем абилке труповозки эксгумация кд, там достаточно просто все в статьях есть, когда кд прошло, включаем триггер на атаку, при замахе на врага создаем еще 1 триггер, в котором ждем удара от врага, при удара неносим урон. Все просто.
Ну для начала не мешало бы избавится от гуи, и использовать как можно меньше разрушаймых декораций и блокираторов пути.
На больших картах из за них лагает, стоит удар грома юзнуть и 5 фпс на секунды 3 обеспечено.
Ну пасскоды как во всяких гоблинах, это самое простое.
Более сложное, это preload или мемхак, создавать на машине юзера файл с данными.
Ну и у лтд или доты, тупо отправка хостботу, который все сам делает, получает инфу хостбот анализируя пакеты синха геймкеша.
Для этого даже наработка есть, wc3mdd
SAND, Ну есть функция настройки цвета юнита и его прозначности, прозрачность в 0, и юнит полностью прозрачный, прозрачность как и цвет можно локально настроить для игрока, SetUnitVertexColor называется.
С иконкой там немного посложнее, в разделе нейтральное здание, сначала настраиваем альтернативную иконку для миникарты - call SetAltMinimapIcon( "UI\\Minimap\\Minimap-Tower" ), ну а потом для конкретного юнита прменяем функцией - call UnitSetUsesAltIcon(whichUnit, flag), ну так вот, иконки тоже можно локально настраивать, таким образом сделав незаметным на миникарте героя.
mifexiy, зачем? Есть триггер с событием, юнит отдал приказ - цель точка, приказ является move, юнитам отдавшим приказ - является крип ( в доте тупо проверка на абилку которая есть только у крипов идущих по линиям), то отдаем приказ атаковать в нужную точку, точку вычисляем исходя из области в которой сейчас юнит сидит. Все просто.
Постоянно отдавать приказ идти, в доте к примеру там проверка на приказ move, если крип отдал такой приказ, проверяется в какой области он находится, и отдается приказ идти в следующую область.
Да как и в доте 1, ептить. Просто инвиз, иконку на миникарте делаем прозрачной, как и саму модель юнита для врагов, поэтому даже на вардах юнитов то не видно.
Да, и судя по некоторым тредам, есть еще и в рефе. Хз конечно как и что, о дырах в виртуальной машинезнал один местный юзер, который молчал, но на хайве один человек взял и рассказал Драколичу об одном, найденым им простым вариантом - результат все мы знаем...
Но сколько людей, не пошло постить на форумы свои находки, авторы читов и программ типа кеев, маперов, улучшайзеров фпс. К слову они ни чуть не менее опасны чем мемхак, они написаны человеком который сидит за ником, за которым ничего нет, ты даже не знаешь в какой стране на самом деле живет этот человек и что он там написал, опенсурсы вам никто не дает.
Ну и как я уже писал, айкаплаунчер и прочие лаунчеры - написаны ни понять кем, у айкапа разработчиков выгнаных со скаднадалами уже десятки, так что вирусов боятся - сидеть оффлайн.
Кто хочет юзать мемхак для своей карты юзайте, вам ничего не угрожает, для тех кто видит на ирне что карта с мемхаком, гуглите инфу - если карта норм и автор её развивает, вирусы там не появятся, стрелять себе в ногу автор карты не будет.
Кстати забыл сказать, есть способы скрытия мемхака от тупых проверок, мемхак это всего лишь сломанный массив - а как и где его сломать не принципиально важно, все остальное мешура которая лишь дает API для работы, чеканье переменных как сделал айкап лечится сверх просто. Мемхак может быть в любом скрипте, а не только в J, т.е AI, PLD, начхать.Передать адрес массива можно геймкешем.
Ептить, ну при касте молотка создаешь на цель каста триггер с событием - юнит получает урон, урон ровно 0, и есть бафф стана, сразу бафф удаляешгь и все. Следом триггер, а так же добавляешь событие - время вышло, на примерное время за которое молоток долетит до юнита.
Разумеется все это на JASS делается, а не на гуях.
Отредактирован quq_CCCP
» WarCraft 3 / Ульт Лича из Доты
» WarCraft 3 / Возможно ли использовать более 16 разных тайлов на одной карте?
» WarCraft 3 / Транспорт наземный и урон
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
Код Jass, собвственно все что надо таймер, дамми юнит с модлью кольца и группа, по малому периоду двигаем даммика за юнитом кастером и выбираем всех врагов вокруг, с каждым тиком таймера увеличиваем радиус поиска группы, тех кто уже попался отсеиваем, а тех кто попался впервые дамажим, замедление делается дамми юнитом кидающим ледяную звезду в себя, урон по площяди убран, только замедление.
» WarCraft 3 / FRAMETRIS (тетрис на фреймах)
Пажитов насколько помню писал тетрис на компе где ни графики ни звука, разве что принтером шуршать можно. Так что музяку можно любую использовать, то что у нас в 90х китайцы продавали не есть каноничный вариант игры.
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
Если в карте нету GroupUtils (прекрасно гуглится на хайве).
Триггер меняем на таймер, но я скинул не для копипаста а для изучения, сложного в коде ничего нету.
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
Могу скинуть код, он там примитивный.
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)
Отредактирован quq_CCCP
» WarCraft 3 / Отследить количество играющих игроков
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)
Проблемы были лишь в Гуи говнокартах и дотах, где оптимизатор сливает все в одну функцию и начинаются обрывы, которые лечатся сверхпросто.
Но проще думать головой и не плодить сущности, инит нет надобности делать в мейне и разом, необходимые триггеры вовсе можно создавать во время игры, к примеру когда игрок выберет героя к котором эти триггеры относятся.
» WarCraft 3 / Золотая башня
» WarCraft 3 / Devistating Blow ( Фатальный удар )
» WarCraft 3 / Оптимизация карты
На больших картах из за них лагает, стоит удар грома юзнуть и 5 фпс на секунды 3 обеспечено.
» WarCraft 3 / Как сделать систему рейтинга? (BD sql)
» WarCraft 3 / Как сделать систему рейтинга? (BD sql)
Более сложное, это preload или мемхак, создавать на машине юзера файл с данными.
Ну и у лтд или доты, тупо отправка хостботу, который все сам делает, получает инфу хостбот анализируя пакеты синха геймкеша.
Для этого даже наработка есть, wc3mdd
» WarCraft 3 / Аналог Smoke of deceit из dota2
С иконкой там немного посложнее, в разделе нейтральное здание, сначала настраиваем альтернативную иконку для миникарты - call SetAltMinimapIcon( "UI\\Minimap\\Minimap-Tower" ), ну а потом для конкретного юнита прменяем функцией - call UnitSetUsesAltIcon(whichUnit, flag), ну так вот, иконки тоже можно локально настраивать, таким образом сделав незаметным на миникарте героя.
» WarCraft 3 / Юнит отходит при атаке
» WarCraft 3 / Аналог Smoke of deceit из dota2
» WarCraft 3 / Юнит отходит при атаке
» WarCraft 3 / Аналог Smoke of deceit из dota2
» WarCraft 3 / Опасен ли мемхак?
Но сколько людей, не пошло постить на форумы свои находки, авторы читов и программ типа кеев, маперов, улучшайзеров фпс. К слову они ни чуть не менее опасны чем мемхак, они написаны человеком который сидит за ником, за которым ничего нет, ты даже не знаешь в какой стране на самом деле живет этот человек и что он там написал, опенсурсы вам никто не дает.
Ну и как я уже писал, айкаплаунчер и прочие лаунчеры - написаны ни понять кем, у айкапа разработчиков выгнаных со скаднадалами уже десятки, так что вирусов боятся - сидеть оффлайн.
Кто хочет юзать мемхак для своей карты юзайте, вам ничего не угрожает, для тех кто видит на ирне что карта с мемхаком, гуглите инфу - если карта норм и автор её развивает, вирусы там не появятся, стрелять себе в ногу автор карты не будет.
» WarCraft 3 / Как отловить стан?
Разумеется все это на JASS делается, а не на гуях.
» WarCraft 3 / Как отловить стан?