FDG89K, я фиксировал цель при получении приказа у мечника, результат тот же)
Только я могу доработать ии, что пока за юнитом бегает толпа мечников, он будет бегать по карте гоняя за собой, пока юниты, которых не фокусят, будут продолжать их добивать. Мне перезаписать вечером?
Алсо, попробуй поставить 999999 магов против дриады и расскажи почему люди в миллион пищи проиграли ночным эльфам. Ты не задумывался а как люди выживали в Азероте против демонов, орков м нежити? Каждый раз, когла нежить подходила к базам людей, те не воевали, они просто отправляли вперёд одного палладина с божественным щитом, который пол минуты крутил пальцем у виска, а потом прожимал свиток возвращения. Враги умирали не от мечей, как на видосиках, а от ожидания и фейспалма
Я могу написать ии где эльфы заставят твоих пехотинцев сделать сосо огромному дубу горного великана и удобрить почву плодородных тайлов Калимдора)
Если ты реализуешь полный потенциал обеих стенок, то пехотинцы даже одного юнита не убьют, а сюда входит: кайт, распределение фокуса атаки, использование абилок рев омоложение таунт*, дриады накладывают сразу на всех яд по одной автоатаке, смещая потом фокус в одну цель, периодически обновляя яд. При кайте укрыться за щитом не позволит даже добежать до лучниц
Способность выполнена на UjAPI
на видео демонстрация с 100% шансом
инструкция по импорту
скопировать папку Initialization и вставить в свою карту, перекопировать нестандартное ро и вставить в свою карту
в триггере Melee Initialization настроить всё, что помечено комментарием, на своё усмотрение. остальное требует минимальных знаний джасса
код
Melee Initialization
library mylib
globals
constant hashtable H = InitHashtable( )
private constant group TempGroup = CreateGroup( )
endglobals
struct vector
real x
real y
real z
method length takes nothing returns real
return SquareRoot( x * x + y * y + z * z )
endmethod
method normalize takes nothing returns nothing
local real l = length( )
if l == 0.00 then
set l = 1.00
endif
set x = x / l
set y = y / l
set z = z / 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
return this
endmethod
endstruct
private struct mystruct
timer t
unit attacker
effect eff
effect eff1
real time
real timeMax
real lastYaw
vector array l[5]
vector last
endstruct
private function Move takes nothing returns nothing
local mystruct A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
local integer i = 0
local integer k = 0
local real array x
local real array y
local real array z
local real yaw
local unit u
set A.time = A.time + 0.03125 / A.timeMax
if A.time > 1.00 then
set A.time = 1.00
endif
loop
set x[k] = A.l[k].x
set y[k] = A.l[k].y
set z[k] = A.l[k].z
set k = k + 1
exitwhen k >= 5
endloop
set k = 0
loop
set i = 0
loop
set x[i] = ( 1.00 - A.time ) * x[i] + A.time * x[i + 1]
set y[i] = ( 1.00 - A.time ) * y[i] + A.time * y[i + 1]
set z[i] = ( 1.00 - A.time ) * z[i] + A.time * z[i + 1]
set i = i + 1
exitwhen i > 5 - k
endloop
set k = k + 1
exitwhen k >= 5 - 1
endloop
set yaw = Atan2( y[0] - A.last.y, x[0] - A.last.x )
call SetSpecialEffectPositionWithZ( A.eff, x[0], y[0], z[0] )
call SetSpecialEffectPositionWithZ( A.eff1, x[0], y[0], z[0] )
call SetSpecialEffectOrientation( A.eff, yaw * bj_RADTODEG, Atan2( z[0] - A.last.z, SquareRoot( ( x[0] - A.last.x ) * ( x[0] - A.last.x ) + ( y[0] - A.last.y ) * ( y[0] - A.last.y ) ) ) * bj_RADTODEG, ( yaw - A.lastYaw ) * bj_RADTODEG * 10.00 )
call SetSpecialEffectOrientation( A.eff1, yaw * bj_RADTODEG, Atan2( z[0] - A.last.z, SquareRoot( ( x[0] - A.last.x ) * ( x[0] - A.last.x ) + ( y[0] - A.last.y ) * ( y[0] - A.last.y ) ) ) * bj_RADTODEG, ( yaw - A.lastYaw ) * bj_RADTODEG * 10.00 )
call GroupEnumUnitsInRange( TempGroup, x[0], y[0], 250.00, null ) // радиус + макс коллизия юнитов (200)
loop
set u = FirstOfGroup( TempGroup )
exitwhen u == null
call GroupRemoveUnit( TempGroup, u )
if IsUnitInRangeXY( u, x[0], y[0], 50.00 ) then // радиус
if IsUnitAlive( u ) and IsUnitEnemy( u, GetOwningPlayer( A.attacker ) ) and not IsUnitType( u, UNIT_TYPE_FLYING ) then
set z[1] = GetUnitFlyHeight( u ) + GetAxisZ( GetUnitX( u ), GetUnitY( u ) )
if z[0] <= z[1] + 120.00 and z[0] >= z[1] - 120.00 then // ловля разницы по высоте между снарядом и потенциальной целью
call UnitDamageTarget( A.attacker, u, 20.00, false, false, null, null, null ) // урон
set A.time = 1.00
call GroupClear( TempGroup )
endif
endif
endif
endloop
if A.time >= 1.00 then
call PauseTimer( A.t )
call FlushChildHashtable( H, GetHandleId( A.t ) )
call DestroyTimer( A.t )
// эффект при уничтожении снаряда
set bj_lastCreatedEffect = AddSpecialEffect( "Abilities\\Spells\\Undead\\OrbOfDeath\\AnnihilationMissile.mdl", x[0], y[0] )
call SetSpecialEffectZ( bj_lastCreatedEffect, z[0] )
call DestroyEffect( bj_lastCreatedEffect )
//====
call DestroyEffect( A.eff )
call DestroyEffect( A.eff1 )
set i = 0
loop
call A.l[i].destroy( )
set i = i + 1
exitwhen i >= 5
endloop
call A.last.destroy( )
set A.t = null
set A.attacker = null
set A.eff = null
set A.eff1 = null
call A.destroy( )
else
set A.last.x = x[0]
set A.last.y = y[0]
set A.last.z = z[0]
set A.lastYaw = yaw
endif
endfunction
function Trig_Melee_Initialization_Actions takes nothing returns nothing
local mystruct A
local real x
local real y
local real xx
local real yy
local real d
local real a
local integer i
if GetRandomInt( 0, 100 ) <= 100 then // шанс
set x = GetUnitX( GetTriggerProjectileSource( ) )
set y = GetUnitY( GetTriggerProjectileSource( ) )
set xx = GetProjectileTargetX( GetTriggerProjectile( ) )
set yy = GetProjectileTargetY( GetTriggerProjectile( ) )
set d = SquareRoot( ( x - xx ) * ( x - xx ) + ( y - yy ) * ( y - yy ) )
set a = Atan2( yy - y, xx - x )
set i = 10 // количество снарядов
loop
exitwhen i <= 0
set i = i - 1
set A = mystruct.create( )
set A.t = CreateTimer( )
set A.attacker = GetTriggerProjectileSource( )
set A.l[0] = vector.create( x, y, GetAxisZ( x, y ) + GetUnitFlyHeight( A.attacker ) )
set A.l[4] = vector.create( xx + GetRandomReal( -50.00 - d * 0.10, 50.00 + d * 0.10 ), yy + GetRandomReal( -50.00 - d * 0.10, 50.00 + d * 0.10 ), 0.00 ) // разброс у конечной точки (50 минимум оффсет + дистанция * 0.10)
set A.l[4].z = GetAxisZ( A.l[4].x, A.l[4].y ) + GetRandomReal( 10.00, 30.00 )
// точки нестабильного полёта снарядов
set A.l[1] = vector.create( x + d * 0.25 * Cos( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), y + d * 0.25 * Sin( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), d * GetRandomReal( 0.05, 0.10 ) )
set A.l[1].z = A.l[1].z + ( A.l[4].z - A.l[0].z ) * 0.50
set A.l[2] = vector.create( x + d * 0.50 * Cos( a ) + GetRandomReal( -d * 0.50, d * 0.50 ), y + d * 0.40 * Sin( a ) + GetRandomReal( -d * 0.50, d * 0.50 ), d * GetRandomReal( 0.10, 0.20 ) )
set A.l[2].z = A.l[2].z + ( A.l[4].z - A.l[0].z ) * 0.50
set A.l[3] = vector.create( x + d * 0.75 * Cos( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), y + d * 0.50 * Sin( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), d * GetRandomReal( 0.02, 0.5 ) )
set A.l[3].z = A.l[3].z + ( A.l[4].z - A.l[0].z ) * 0.50
//======
set A.last = vector.create( x, y, A.l[0].z )
set A.lastYaw = a
set A.eff = AddSpecialEffect( "Abilities\\Weapons\\SentinelMissile\\SentinelMissile.mdl", A.l[0].x, A.l[0].y ) // модели снарядов
set A.eff1 = AddSpecialEffect( "Abilities\\Spells\\Undead\\DevourMagic\\DevourMagicBirthMissile.mdl", A.l[0].x, A.l[0].y )
call SetSpecialEffectAnimation( A.eff, "birth" )
call QueueSpecialEffectAnimation( A.eff, "stand" )
call SetSpecialEffectAnimation( A.eff1, "birth" )
call QueueSpecialEffectAnimation( A.eff1, "stand" )
set A.time = 0.00
set A.timeMax = d / GetRandomReal( 900.00, 1100.00 ) // скорость полёта снарядов (рандомная от 900 до 1100 )
call SaveInteger( H, GetHandleId( A.t ), 0, A )
call TimerStart( A.t, 0.03125, true, function Move )
endloop
endif
endfunction
//===========================================================================
function cond takes nothing returns boolean
return GetUnitAbilityLevel( GetTriggerProjectileSource( ), 'A000' ) > 0 // абилка пустышка у атакующего
endfunction
function InitTrig_Melee_Initialization takes nothing returns nothing
set gg_trg_Melee_Initialization = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_PROJECTILE_LAUNCH )
call TriggerAddCondition( gg_trg_Melee_Initialization, Condition( function cond ) )
call TriggerAddAction( gg_trg_Melee_Initialization, function Trig_Melee_Initialization_Actions )
endfunction
endlibrary
ShadowNinja, единственная сложность для меня это математические подсчёты, костыли тут вообще не при чём и их не будет, просто при ивенте получения урона проверить наличие абилки у атакующего и дальше pure mathematic, с которой я не дружу и потому трачу несколько часов на выдумывание формулы. хотя сейчас с наличием нейронок думаю это быстро должно решаться, просто спелл не самый интересный)0)09
я тоже с этим сталкивался и с этим походу ничего не сделать неважно как там перерассчитать границы, хоть на всю карту тыкни, если центр модели за пределами обзора, то модель не отображается, но судя по коммам, можно попробовать дать декорации (doodad) эту модельку и будет норм
ОТВЕЧАЮСПУСТЯГОДУРААААААААААААААААА (просто по компику в архивах копался, увидел карту и решил доделать-переделать, там фигня в принципе)
инструкция по импорту
скопировать папку Initialization и вставить в свою карту, перекопировать нестандартное ро и вставить в свою карту
в триггере Untitled Trigger 001 настроить всё, что помечено комментарием, на своё усмотрение, остальное требует минимальных знаний джасса
код
Untitled Trigger 001
function Create takes nothing returns nothing
local timer t = GetExpiredTimer( )
local integer i = GetHandleId( t )
local real time = LoadReal( udg_H, i, 4 ) - 0.01
local real d = LoadReal( udg_H, i, 2 )
local real dm = LoadReal( udg_H, i, 3 )
local real a = LoadReal( udg_H, i, 1 )
local real s = LoadReal( udg_H, i, 7 )
local real x = LoadReal( udg_H, i, 5 )
local real y = LoadReal( udg_H, i, 6 )
local real xx = x
local real yy = y
local real dd = 0.00
local unit u
local group g = LoadGroupHandle( udg_H, i, 9 )
local player p = LoadPlayerHandle( udg_H, i, 8 )
if d <= dm then
// создание луча
set bj_lastCreatedUnit = CreateUnit( p, 'u000', x + d * Cos( a ), y + d * Sin( a ), a * bj_RADTODEG )
call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
call SetUnitFlyHeight( bj_lastCreatedUnit, 50.00, 0.00 )
call GroupAddUnit( g, bj_lastCreatedUnit )
call SaveReal( udg_H, GetHandleId( bj_lastCreatedUnit ), 0, d )
call SetUnitScale( bj_lastCreatedUnit, 0.20, 0.20, 0.20 )
//=======
call SaveReal( udg_H, i, 2, d + s )
endif
loop
exitwhen dd >= d
set dd = dd + s
set xx = xx + s * Cos( a )
set yy = yy + s * Sin( a )
call GroupEnumUnitsInRange( udg_TempGroup, xx, yy, 250.00, null ) // радиус с учётом макс коллизии (+200.00)
loop
set u = FirstOfGroup( udg_TempGroup )
exitwhen u == null
call GroupRemoveUnit( udg_TempGroup, u )
if IsUnitInRangeXY( u, xx, yy, 50.00 ) then // радиус
if not IsUnitType( u, UNIT_TYPE_DEAD ) and IsUnitEnemy( u, p ) then
call UnitDamageTarget( LoadUnitHandle( udg_H, i, 0 ), u, 5.00, false, false, null, null, null ) // урон
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Orc\\Purge\\PurgeBuffTarget.mdl", u, "origin" ) ) // эффект при попадании
set d = dd
call SaveReal( udg_H, i, 2, d )
call GroupClear( udg_TempGroup )
set bj_groupAddGroupDest = udg_TempGroup_1
call ForGroup( g, function GroupAddGroupEnum )
loop
set u = FirstOfGroup( udg_TempGroup_1 )
exitwhen u == null
call GroupRemoveUnit( udg_TempGroup_1, u )
if LoadReal( udg_H, GetHandleId( u ), 0 ) >= d then
call KillUnit( u )
call RemoveSavedReal( udg_H, GetHandleId( u ), 0 )
call GroupRemoveUnit( g, u )
// эффект уничтожения луча если кто-то попался по пути
set bj_lastCreatedUnit = CreateUnit( p, 'u002', GetUnitX( u ), GetUnitY( u ), GetRandomReal( 0.00, 360.00 ) )
call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
call SetUnitFlyHeight( bj_lastCreatedUnit, 50.00, 0.00 )
call SetUnitScale( bj_lastCreatedUnit, 0.50, 0.50, 0.50 )
call SetUnitAnimation( bj_lastCreatedUnit, "death" )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.00 )
//============
endif
endloop
endif
endif
endloop
endloop
if time <= 0.00 then
call PauseTimer( t )
call DestroyTimer( t )
call FlushChildHashtable( udg_H, i )
loop
set u = FirstOfGroup( g )
exitwhen u == null
call GroupRemoveUnit( g, u )
call KillUnit( u )
// эффект при уничтожении луча
set bj_lastCreatedUnit = CreateUnit( p, 'u001', GetUnitX( u ), GetUnitY( u ), GetRandomReal( 0.00, 360.00 ) )
call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
call SetUnitFlyHeight( bj_lastCreatedUnit, 50.00, 0.00 )
call SetUnitScale( bj_lastCreatedUnit, 0.50, 0.50, 0.50 )
call SetUnitAnimation( bj_lastCreatedUnit, "death" )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
//=====
endloop
call DestroyGroup( g )
else
call SaveReal( udg_H, i, 4, time )
endif
set t = null
set g = null
endfunction
function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing
local timer t = CreateTimer( )
local integer i = GetHandleId( t )
local unit caster = GetTriggerUnit( )
local real x = GetUnitX( caster )
local real y = GetUnitY( caster )
local real xx = GetSpellTargetX( )
local real yy = GetSpellTargetY( )
local real a = Atan2( yy - y, xx - x )
call SaveUnitHandle( udg_H, i, 0, caster )
call SaveReal( udg_H, i, 1, a )
call SaveReal( udg_H, i, 2, 100.00 ) // дистанция от кастера
call SaveReal( udg_H, i, 3, 1100.00 ) // макс дистанция + дистанция от кастера
call SaveReal( udg_H, i, 4, 4.00 ) // время существования
call SaveReal( udg_H, i, 5, x )
call SaveReal( udg_H, i, 6, y )
call SaveReal( udg_H, i, 7, 20.00 ) // скорость полёта (время до макс длины = 1000.00 / 2000.00 (т.е. 20.00 / периодичность таймера) = 0.50 сек)
call SavePlayerHandle( udg_H, i, 8, GetOwningPlayer( caster ) )
call SaveGroupHandle( udg_H, i, 9, CreateGroup( ) )
call TimerStart( t, 0.01, true, function Create )
set t = null
set caster = null
endfunction
//===========================================================================
function Trig_Untitled_Trigger_001_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction
function InitTrig_Untitled_Trigger_001 takes nothing returns nothing
set gg_trg_Untitled_Trigger_001 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Untitled_Trigger_001, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Untitled_Trigger_001, Condition( function Trig_Untitled_Trigger_001_Conditions ) )
call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions )
endfunction
makkad, эффектами я занимался. С Драгонлором было бы ещё круче, потому что при взрыве видно низкополигональные мэши из-за огромного масштабирования + использования стандартных эффектов вара. И насчёт песни ты прав, она мало кому зайдёт, но я был именно ей вдохновлён и именно под неё у меня всё крутилось в голове ещё до того, как я попросил у Драгонлора сделать ландшафт с динозавриками)
по хорошему надо было бы просто заново поработать с камерами и спрятать много варкрафтовских проблем а-ля кривого освещения, внезапного пропадания/появление объектов в камере и резкого дергания юнитов при повороте во время бега, но я это понял уже на половину законченном эдите, когда уже не готов был заново всё переписывать и переснимать, ведь там в придачу не с первой съёмки все звуки и эффекты проигрывались и я сильно психовал с этого, пока не понял, что нужно просто несколько раз мапу перезапустить. Обожаю варкрафт, мня </3
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
» WarCraft 3 / Вопрос про то, как "вставлять" анимацию постройки в модель.…
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
Только я могу доработать ии, что пока за юнитом бегает толпа мечников, он будет бегать по карте гоняя за собой, пока юниты, которых не фокусят, будут продолжать их добивать. Мне перезаписать вечером?
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
» WarCraft 3 / Пак способностей - Corpse Collector
» WarCraft 3 / Пак способностей - Corpse Collector
» WarCraft 3 / Пак способностей - Corpse Collector
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
Ред. rsfghd
» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?
Если ты реализуешь полный потенциал обеих стенок, то пехотинцы даже одного юнита не убьют, а сюда входит: кайт, распределение фокуса атаки, использование абилок рев омоложение таунт*, дриады накладывают сразу на всех яд по одной автоатаке, смещая потом фокус в одну цель, периодически обновляя яд. При кайте укрыться за щитом не позволит даже добежать до лучниц
» WarCraft 3 / Частицы/Particles
пойду сам теперь делать открытый аналог
» WarCraft 3 / Способности и алгоритмы на заказ
» WarCraft 3 / Способности и алгоритмы на заказ
» Он вам не клоун! / Итоги 2024 и планы на 2025!
» WarCraft 3 / Заклинания на заказ
Заклинание готово!
на видео демонстрация с 100% шансом
в триггере Melee Initialization настроить всё, что помечено комментарием, на своё усмотрение. остальное требует минимальных знаний джасса
код
» WarCraft 3 / Заклинания на заказ
» WarCraft 3 / у меня есть моделика распира барагана почему то когда игрок…
» WarCraft 3 / Заклинания на заказ
» WarCraft 3 / Заклинания на заказ
Заклинание готово!
(просто по компику в архивах копался, увидел карту и решил доделать-переделать, там фигня в принципе)
в триггере Untitled Trigger 001 настроить всё, что помечено комментарием, на своё усмотрение, остальное требует минимальных знаний джасса
код
» WarCraft 3 / Метеор
» Блог им. rsfghd / Новый мусор, ура!
но впрочем спасибо что увлёкся, я поржал <3
» WarCraft 3 / Заклинания на заказ