Мне как-то сомнительно просить помощь у кого-то за бесплатно, никогда такое обычно не делал
на сайте есть специальная тема для заклинаний на заказ, где любой желающий человек со свободным временем может за бесплатно сделать тебе способность с указанными тобой нуждами LAMLAN:
Но, если сделаешь, я конечно буду благодарен
ну тогда потом с тебя лайк, чуть позже сделаю, сегодня скину
Mikel 1990, как раз таки в разовых случаях это практически не имеет смысла, основная проблема могла бы возникнуть только в периодических событиях, банально движение даммика по точке с полярным смещением 0.01 таймером
LAMLAN, что из того гайда на Ютубе было не понятно? Как сделать муи?
Либо банально не знаешь что такое муи, раз уж решил описать эту проблему в таких подробностях
Поясняю муи - мультикаст абилок, когда её могут применить одновременно несколько юнитов
Описание комментатора выше завязано на джассе к сожалению, ибо упоминается привязка таймера. Исходя из видео, которые ты смотришь на данный момент, тебе нужен именно гуи вариант. Я сделаю чуть позже, если необходимо
Любой способ имеет право на существование если он не утекает и не багует, ты хочешь поддержки и одобрения своих действий или у тебя действительно что-то работает не так, как ты хотел?
library MyLib
globals
constant hashtable H = InitHashtable( )
constant group TempGroup = CreateGroup( )
constant location LFZ = Location( 0.00, 0.00 )
item TempItem = null
endglobals
native UnitAlive takes unit id returns boolean
function GetLocZ takes real x, real y returns real
call MoveLocation( LFZ, x, y )
return GetLocationZ( LFZ )
endfunction
struct vector
real x
real y
real z
method normalize takes nothing returns nothing
local real l = SquareRoot( x * x + y * y + z * z )
if l == 0.00 then
set l = 1.00
endif
set x = x * ( 1.00 / l )
set y = y * ( 1.00 / l )
set z = z * ( 1.00 / l )
endmethod
static method create takes real x, real y, real z returns thistype
local thistype this = thistype.allocate( )
set this.x = x
set this.y = y
set this.z = z
call this.normalize( )
return this
endmethod
endstruct
struct MyStruct
unit dummy
real x
real y
real z
real time
group g
vector v
endstruct
private function Move takes nothing returns nothing
local MyStruct A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
local real x
local real y
local real x1
local real y1
local real a
local boolean array b
local unit u
set A.x = A.x + 5.00 * A.v.x
set A.y = A.y + 5.00 * A.v.y
set A.z = A.z + 5.00 * A.v.z
call SetItemPosition( TempItem, A.x, A.y )
call SetItemVisible( TempItem, false )
set x = GetItemX( TempItem )
set y = GetItemY( TempItem )
if ( x - 1.00 > A.x or x + 1.00 < A.x ) or ( y - 1.00 > A.y or y + 1.00 < A.y ) then
set A.x = A.x - 5.00 * A.v.x
set A.y = A.y - 5.00 * A.v.y
set A.z = A.z - 5.00 * A.v.z
// right
set x = A.x + 5.00
set y = A.y
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[0] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
// left
set x = A.x - 5.00
set y = A.y
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[1] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
// up
set x = A.x
set y = A.y + 5.00
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[2] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
// down
set x = A.x
set y = A.y - 5.00
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[3] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
if b[0] or b[1] or b[2] or b[3] then
if b[0] or b[1] then
set A.v.x = -A.v.x
else
set A.v.y = -A.v.y
endif
else
set A.v.x = -A.v.x
set A.v.y = -A.v.y
endif
else // units
call GroupEnumUnitsInRange( TempGroup, A.x, A.y, 64.00, null )
call GroupRemoveUnit( TempGroup, A.dummy )
loop
set u = FirstOfGroup( TempGroup )
exitwhen u == null
call GroupRemoveUnit( TempGroup, u )
if not IsUnitInGroup( u, A.g ) and UnitAlive( u ) and GetUnitTypeId( u ) == 'hfoo' then
set x1 = GetUnitX( u )
set y1 = GetUnitY( u )
set a = Atan2( A.y - y1, A.x - x1 )
set bj_lastCreatedUnit = CreateUnit( Player( 0x00 ), 'u000', x1 + 24.00 * Cos( a ), y1 + 24.00 * Sin( a ), a * bj_RADTODEG )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
call SetUnitX( bj_lastCreatedUnit, x1 + 32.00 * Cos( a ) )
call SetUnitY( bj_lastCreatedUnit, y1 + 32.00 * Sin( a ) )
call SetUnitTimeScale( bj_lastCreatedUnit, 2.00 )
set a = a + ( a - ( Atan2( A.v.y, A.v.x ) - 180.00 * bj_DEGTORAD ) )
//set x = A.v.x
set A.v.x = Cos( a )//A.v.x * Cos( a ) - A.v.y * Sin( a )
set A.v.y = Sin( a )//A.v.y * Cos( a ) + x * Sin( a )
call GroupClear( A.g )
call GroupAddUnit( A.g, u )
set A.time = 0.25
endif
endloop
endif
set A.time = A.time - 0.01
if A.time == 0.00 then
call GroupClear( A.g )
endif
call SetUnitX( A.dummy, A.x )
call SetUnitY( A.dummy, A.y )
call SetUnitFlyHeight( A.dummy, A.z - GetLocZ( A.x, A.y ), 0.00 )
endfunction
function Nin_Actions takes nothing returns nothing
local timer t = CreateTimer( )
local MyStruct A = MyStruct.create( )
local unit u = GetTriggerUnit( )
local real x = GetSpellTargetX( )
local real y = GetSpellTargetY( )
local real z = GetLocZ( x, y )
set A.x = GetUnitX( u )
set A.y = GetUnitY( u )
set A.z = GetLocZ( A.x, A.y )
set A.v = vector.create( x - A.x, y - A.y, /*z - A.z*/0.00 )
set A.dummy = CreateUnit( GetOwningPlayer( u ), 'hfoo', A.x, A.y, Atan2( y - A.y, x - A.x ) * bj_RADTODEG )
call UnitAddAbility( A.dummy, 'Arav' )
set A.g = CreateGroup( )
call SaveInteger( H, GetHandleId( t ), 0, A )
call TimerStart( t, 0.01, true, function Move )
set u = null
set t = null
endfunction
endlibrary
//===========================================================================
function InitTrig_Nin takes nothing returns nothing
set gg_trg_Nin = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Nin, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( gg_trg_Nin, function Nin_Actions )
set TempItem = CreateItem( 'spsh', 0.00, 0.00 )
call SetItemVisible( TempItem, false )
endfunction
К сожалению в варкрафте нет одиночной способности для этого, самое близкое это стадо ящеров рексара, только они при столкновении исчезают
Придётся делать триггерный аналог, где ты должен двигать даммика периодическим таймером в сторону каста, проверяя всех вражеских живых юнитов вокруг, на которых можно будет применить в последствии даммикастом таргетную абилку "бросить нож"
Вообще, ты мог не искать, а попросить сделать способность в специальной для этого теме: Заклинания на заказ
я же правильно понимаю что "бросить нож" это таргетная способность у мэв с периодическим уроном?
Возможно, с течением времени, будет появляться информация о моих попытках, где я застрял
ну вот лично моя попытка
просто проверяю 4 стороны предметом на наличие квадратных карт путей, потом проверяю юнитов
пример ENAleksey не удалось разобрать, судя по всему там нормальный рикошет даже от всяких холмов, со всеми 3 координатами
код
library MyLib
globals
constant hashtable H = InitHashtable( )
constant group TempGroup = CreateGroup( )
constant location LFZ = Location( 0.00, 0.00 )
item TempItem = null
endglobals
native UnitAlive takes unit id returns boolean
function GetLocZ takes real x, real y returns real
call MoveLocation( LFZ, x, y )
return GetLocationZ( LFZ )
endfunction
struct vector
real x
real y
real z
method normalize takes nothing returns nothing
local real l = SquareRoot( x * x + y * y + z * z )
if l == 0.00 then
set l = 1.00
endif
set x = x * ( 1.00 / l )
set y = y * ( 1.00 / l )
set z = z * ( 1.00 / l )
endmethod
static method create takes real x, real y, real z returns thistype
local thistype this = thistype.allocate( )
set this.x = x
set this.y = y
set this.z = z
call this.normalize( )
return this
endmethod
endstruct
struct MyStruct
unit dummy
real x
real y
real z
real time
group g
vector v
endstruct
private function Move takes nothing returns nothing
local MyStruct A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
local real x
local real y
local real x1
local real y1
local real a
local boolean array b
local unit u
set A.x = A.x + 5.00 * A.v.x
set A.y = A.y + 5.00 * A.v.y
set A.z = A.z + 5.00 * A.v.z
call SetItemPosition( TempItem, A.x, A.y )
call SetItemVisible( TempItem, false )
set x = GetItemX( TempItem )
set y = GetItemY( TempItem )
if ( x - 1.00 > A.x or x + 1.00 < A.x ) or ( y - 1.00 > A.y or y + 1.00 < A.y ) then
set A.x = A.x - 5.00 * A.v.x
set A.y = A.y - 5.00 * A.v.y
set A.z = A.z - 5.00 * A.v.z
// right
set x = A.x + 5.00
set y = A.y
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[0] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
// left
set x = A.x - 5.00
set y = A.y
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[1] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
// up
set x = A.x
set y = A.y + 5.00
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[2] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
// down
set x = A.x
set y = A.y - 5.00
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
set x1 = GetItemX( TempItem )
set y1 = GetItemY( TempItem )
set b[3] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
if b[0] or b[1] or b[2] or b[3] then
if b[0] or b[1] then
set A.v.x = -A.v.x
else
set A.v.y = -A.v.y
endif
else
set A.v.x = -A.v.x
set A.v.y = -A.v.y
endif
else // units
call GroupEnumUnitsInRange( TempGroup, A.x, A.y, 64.00, null )
call GroupRemoveUnit( TempGroup, A.dummy )
loop
set u = FirstOfGroup( TempGroup )
exitwhen u == null
call GroupRemoveUnit( TempGroup, u )
if not IsUnitInGroup( u, A.g ) and UnitAlive( u ) and GetUnitTypeId( u ) == 'hfoo' then
set x1 = GetUnitX( u )
set y1 = GetUnitY( u )
set a = Atan2( y1 - A.y, x1 - A.x ) + bj_PI - Atan2( A.v.y, A.v.x )
set x = A.v.x
set A.v.x = x * Cos( a ) - A.v.y * Sin( a )
set A.v.y = A.v.y * Cos( a ) + x * Sin( a )
call GroupClear( A.g )
call GroupAddUnit( A.g, u )
set A.time = 0.25
endif
endloop
endif
set A.time = A.time - 0.01
if A.time == 0.00 then
call GroupClear( A.g )
endif
call SetUnitX( A.dummy, A.x )
call SetUnitY( A.dummy, A.y )
call SetUnitFlyHeight( A.dummy, A.z - GetLocZ( A.x, A.y ), 0.00 )
endfunction
function Nin_Actions takes nothing returns nothing
local timer t = CreateTimer( )
local MyStruct A = MyStruct.create( )
local unit u = GetTriggerUnit( )
local real x = GetSpellTargetX( )
local real y = GetSpellTargetY( )
local real z = GetLocZ( x, y )
set A.x = GetUnitX( u )
set A.y = GetUnitY( u )
set A.z = GetLocZ( A.x, A.y )
set A.v = vector.create( x - A.x, y - A.y, /*z - A.z*/0.00 )
set A.dummy = CreateUnit( GetOwningPlayer( u ), 'hfoo', A.x, A.y, Atan2( y - A.y, x - A.x ) * bj_RADTODEG )
call UnitAddAbility( A.dummy, 'Arav' )
set A.g = CreateGroup( )
call SaveInteger( H, GetHandleId( t ), 0, A )
call TimerStart( t, 0.01, true, function Move )
set u = null
set t = null
endfunction
endlibrary
//===========================================================================
function InitTrig_Nin takes nothing returns nothing
set gg_trg_Nin = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Nin, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( gg_trg_Nin, function Nin_Actions )
set TempItem = CreateItem( 'spsh', 0.00, 0.00 )
call SetItemVisible( TempItem, false )
endfunction
redfal, когда ты выбираешь юнитов в группе тебе не нужно потом через действие отдать юнитам в отряде какой-то приказ, при чём если я не ошибаюсь, там в комменте под функцией будет написано что нельзя приказать больше 12 юнитам
чтобы сделать то что ты хочешь нужно выбрать всех юнитов в группе и в цикл добавить действие юнит - приказ выбранному юниту атаковать
спам приказов глупо потому что юниты иногда будут дёргано себя вести, когда получают новый приказ, иногда атака прерывается из-за отдачи приказа и прочего, но чтобы поправить это нужно проверить какой приказ у юнита и кто является целью этого приказа
поиграли с человеком, мне захотелось минато выбрать
в общем закончить до разрушения всех строений мы не смогли, самое основное что не понравилось и сразу же отпугивает это рецепты, плохо сделано, фиг его знает где какой предмет искать, и то, обшастав все магазины некоторые предметы найти не удалось, соответственно рецепт в никуда, словно ты переименовал предмет, а на описание в рецептах забил
очень много активных предметов, может это из меня такой казуальный игрок, но предметы юзать крайне не удобно ибо они через нумпад либо мышкой
ульта минато разочаровала, просто +40 ловкости, в остальном кое-какие мультипликации делать можно, а-ля кунай за спину, телепорт, расенган и кинуть жабу
либо расенган, жаба кунай и телепорт, чтобы быстрее сократить дистанцию с противником после отбрасывания, да и в целом потенциал минато давления на карту очень высокий, когда есть возможность телепортироваться по линиям и к базе
спеллы мне кажется всё-таки стоит более красочными и интересными сделать, а файты возможно слегка удлинить, путём среза базового урона у способностей, потому что мана заканчивается так же быстро как и здоровье у противника, буквально 1 прокаст и остаётся либо на базу, либо автоатачить, не особо весело
попрактикуйся в спеллпаках, посмотри референсы от других людей
можешь продолжать делать, но пока уныленько, думаю у тебя на данный момент есть все нужные знания чтобы улучшить и переделать карту
» WarCraft 3 / Как сделать способность, без обязательной цели
LAMLAN:
» WarCraft 3 / Триггеры
» WarCraft 3 / Как сделать способность, без обязательной цели
Поясняю муи - мультикаст абилок, когда её могут применить одновременно несколько юнитов
Описание комментатора выше завязано на джассе к сожалению, ибо упоминается привязка таймера. Исходя из видео, которые ты смотришь на данный момент, тебе нужен именно гуи вариант. Я сделаю чуть позже, если необходимо
» WarCraft 3 / Триггеры
» WarCraft 3 / Триггеры
» WarCraft 3 / Триггеры
» WarCraft 3 / Рикошет как в варлоках
» WarCraft 3 / Рикошет как в варлоках
» WarCraft 3 / Как сделать способность, без обязательной цели
» WarCraft 3 / Как сделать способность, без обязательной цели
» WarCraft 3 / Кнопки. примеры создания кнопок
» WarCraft 3 / Конвертация модели
» WarCraft 3 / Как сделать способность, без обязательной цели
» WarCraft 3 / Как сделать способность, без обязательной цели
Придётся делать триггерный аналог, где ты должен двигать даммика периодическим таймером в сторону каста, проверяя всех вражеских живых юнитов вокруг, на которых можно будет применить в последствии даммикастом таргетную абилку "бросить нож"
Вообще, ты мог не искать, а попросить сделать способность в специальной для этого теме: Заклинания на заказ
» WarCraft 3 / Ауры для построек
» WarCraft 3 / Рикошет как в варлоках
пример ENAleksey не удалось разобрать, судя по всему там нормальный рикошет даже от всяких холмов, со всеми 3 координатами
» Blog Narberal Gamma / Дискорд канал и профиль ушел в один конец
» WarCraft 3 / Ауры для построек
» WarCraft 3 / Массовый импорт
» WarCraft 3 / Почему не работает код
https://www.xgm.guru/files/100/310203/comments/514341/leakDetect...
» WarCraft 3 / Обнуление урона в ивенте UNIT_DAMAGED
» WarCraft 3 / Order to attack почему не работает?
» WarCraft 3 / Order to attack почему не работает?
» WarCraft 3 / Order to attack почему не работает?
чтобы сделать то что ты хочешь нужно выбрать всех юнитов в группе и в цикл добавить действие юнит - приказ выбранному юниту атаковать
» WarCraft 3 / Naruto Bleach War v0.3a (Dota Mod)
в общем закончить до разрушения всех строений мы не смогли, самое основное что не понравилось и сразу же отпугивает это рецепты, плохо сделано, фиг его знает где какой предмет искать, и то, обшастав все магазины некоторые предметы найти не удалось, соответственно рецепт в никуда, словно ты переименовал предмет, а на описание в рецептах забил
очень много активных предметов, может это из меня такой казуальный игрок, но предметы юзать крайне не удобно ибо они через нумпад либо мышкой
ульта минато разочаровала, просто +40 ловкости, в остальном кое-какие мультипликации делать можно, а-ля кунай за спину, телепорт, расенган и кинуть жабу
либо расенган, жаба кунай и телепорт, чтобы быстрее сократить дистанцию с противником после отбрасывания, да и в целом потенциал минато давления на карту очень высокий, когда есть возможность телепортироваться по линиям и к базе
спеллы мне кажется всё-таки стоит более красочными и интересными сделать, а файты возможно слегка удлинить, путём среза базового урона у способностей, потому что мана заканчивается так же быстро как и здоровье у противника, буквально 1 прокаст и остаётся либо на базу, либо автоатачить, не особо весело
попрактикуйся в спеллпаках, посмотри референсы от других людей
можешь продолжать делать, но пока уныленько, думаю у тебя на данный момент есть все нужные знания чтобы улучшить и переделать карту