Добавлен , опубликован
Дисклеймер!
Я полный нуб/лох/помойка в джассе (называйте как хотите), ничего толком не знаю и короче юзай способность на свой страх и риск. По возможности буду стараться оптимизировать это говно
Некоторые могут вспомнить предыдущий мой пост с фениксом (хотя кого я обманываю)
Короче, новый высер от меня:
Цель: Мгновенное (нет цели)
Тип: АОЕ урон
Суть: вылетают волны во все стороны и наносят урон
Подходит как для обычного юнита, так и для героя
Видос с картой в комментах
Текущие настройки:
  • ID способности
  • ID дамми юнита волны
  • Базовое кол-во волн
  • Доп. кол-во волн при прокачке умения
  • Дистанция от применяющего юнита
  • Дистанция полёта волн
  • Доп. дистанция полёта волн с прокачкой умения
  • Скорость полёта волны
  • Базовый урон волн
  • Доп. урон волн с прокачкой умения
  • Радиус урона волны
  • Скейлы от силы
  • Скейлы от ловкости
  • Скейлы от интеллекта
  • true|false - вкл|выкл. бонусы к характеристикам
  • Тип атаки
  • Тип урона
  • Тип оружия (звук)
  • Эффект при попадании волной
  • Точка крепления эффекта
  • Время удаления эффекта
Код
scope MySc
define
private udg_Hash = название Название твоей хэш-таблицы (если название не совпадает с udg_Hash - разкомменти и впиши свою хэш-таблицу)
private TrigName = Spell Название триггера
private TrigEvent = EVENT_PLAYER_UNIT_SPELL_EFFECT Тип события юнита-кастера
private AbilityID = 'A000' ID способности
private UnitID = 'u000' ID дамми юнита волны
private Waves = 12 Базовое кол-во волн
private WavesLvl = 6 Доп. кол-во волн при прокачке умения
private WavesDistanceCast = 50.00 Дистанция от применяющего юнита
private WavesDistance = 350.00 Дистанция полёта волн
private WavesDistanceLvl = 150.00 Доп. дистанция полёта волн с прокачкой умения
private WavesSpeed = 15.00 Скорость полёта волны
private Timer = 0.03 Периодичность таймера
private WavesDamage = 80 Урон волн
private WavesDamageLvl = 20 Доп. урон волн с прокачкой умения
private WavesDamageRadius = 60 Радиус урона волны
private WavesDamageScaleStr = 0.50 Скейлы от силы
private WavesDamageScaleAgi = 1.00 Скейлы от ловкости
private WavesDamageScaleInt = 0.00 Скейлы от интеллекта
private Bonuses = true true|false - вкл|выкл. бонусы к характеристикам
private AttackType = ATTACK_TYPE_NORMAL Тип атаки
private DamageType = DAMAGE_TYPE_NORMAL Тип урона
private WeaponType = WEAPON_TYPE_METAL_MEDIUM_SLICE Тип оружия (звук)
private WavesEffect = "Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl" Эффект при попадании волной
private WavesAttachPoint = "chest" Точка крепления эффекта
private WavesEffectRemoveTime = 0.50 Время удаления эффекта
enddefine
globals
private group g3 = CreateGroup()
endglobals
===================================================================================
private function IsUnitDead takes unit u returns boolean
return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction
private function CopyGroup takes group g returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(g,function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
private function filt takes nothing returns boolean
set bj_lastReplacedUnit = GetFilterUnit()
return not IsUnitDead(bj_lastReplacedUnit) and IsUnitEnemy(bj_lastReplacedUnit,bj_groupEnumOwningPlayer) and not IsUnitType(bj_lastReplacedUnit,UNIT_TYPE_STRUCTURE)
endfunction
private function remeff takes nothing returns nothing
local timer t = GetExpiredTimer()
call DestroyEffect(LoadEffectHandle(udg_Hash,GetHandleId(t),0))
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call DestroyTimer(t)
set t = null
endfunction
private function kill takes nothing returns nothing
call KillUnit(GetEnumUnit())
endfunction
private function mk takes nothing returns nothing
local unit u = GetEnumUnit()
call SetUnitX(u,GetUnitX(u)+WavesSpeed*Cos(GetUnitFacing(u)*bj_DEGTORAD))
call SetUnitY(u,GetUnitY(u)+WavesSpeed*Sin(GetUnitFacing(u)*bj_DEGTORAD))
set u = null
endfunction
private function move takes nothing returns nothing
local timer t = GetExpiredTimer()
local timer tt = null
local integer h = GetHandleId(t)
local unit u = null
local unit u1 = null
local group g = LoadGroupHandle(udg_Hash,h,0)
local group g1 = LoadGroupHandle(udg_Hash,h,1)
local group g2 = CopyGroup(g)
local real d = LoadReal(udg_Hash,h,2)-WavesSpeed

call ForGroup(g2,function mk)
loop
set u = FirstOfGroup(g2)
exitwhen u == null
if IsUnitDead(u) then
call GroupRemoveUnit(g,u)
else
set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
call GroupEnumUnitsInRange(g3,GetUnitX(u),GetUnitY(u),WavesDamageRadius,Condition(function filt))
set bj_groupEnumOwningPlayer = null
loop
set u1 = FirstOfGroup(g3)
exitwhen u1 == null
if not IsUnitInGroup(u1,g1) then
call GroupAddUnit(g1,u1)
call UnitDamageTarget(u,u1,LoadReal(udg_Hash,h,3),false,false,AttackType,DamageType,WeaponType)

set tt = CreateTimer()
call SaveEffectHandle(udg_Hash,GetHandleId(tt),0,AddSpecialEffectTarget(WavesEffect,u1,WavesAttachPoint))
call TimerStart(tt,WavesEffectRemoveTime,false,function remeff)
set tt = null
endif
call GroupRemoveUnit(g3,u1)
set u1 = null
endloop
endif

call GroupRemoveUnit(g2,u)
set u = null
endloop

if d <= 0 then
call ForGroup(g,function kill)
call GroupClear(g)
call DestroyGroup(g)
call GroupClear(g1)
call DestroyGroup(g1)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,h)
else
call SaveReal(udg_Hash,h,2,d)
endif

call DestroyGroup(g2)
call GroupClear(g3)
set t = null
set g = null
set g1 = null
set g2 = null
endfunction
private function Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local timer t = CreateTimer()
local integer h = GetHandleId(t)
local integer lvl = GetUnitAbilityLevel(u,AbilityID)
local integer i = 0
local real ii = Waves+(WavesLvl*lvl)
local real a = 0.
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local group g = CreateGroup()

loop
exitwhen i == ii
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(u),UnitID,x+WavesDistanceCast*Cos(a*bj_DEGTORAD),y+WavesDistanceCast*Sin(a*bj_DEGTORAD),a)
call GroupAddUnit(g,bj_lastCreatedUnit)
set bj_lastCreatedUnit = null
set i = i+1
set a = a+(360/ii)
endloop

call SaveGroupHandle(udg_Hash,h,0,g)
call SaveGroupHandle(udg_Hash,h,1,CreateGroup())
call SaveReal(udg_Hash,h,2,WavesDistance+(WavesDistanceLvl*lvl))
call SaveReal(udg_Hash,h,3,WavesDamage+(WavesDamageLvl*lvl)+(GetHeroStr(u,Bonuses)*WavesDamageScaleStr)+(GetHeroAgi(u,Bonuses)*WavesDamageScaleAgi)+(GetHeroInt(u,Bonuses)*WavesDamageScaleInt))
call TimerStart(t,Timer,true,function move)

set u = null
set t = null
set g = null
endfunction
===========================================================================
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == AbilityID
endfunction
function InitTrig_##TrigName takes nothing returns nothing
local integer index = 0
set gg_trg_##TrigName = CreateTrigger()
loop
call TriggerRegisterPlayerUnitEvent(gg_trg_##TrigName,Player(index),TrigEvent,null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition(gg_trg_##TrigName,Condition(function Conditions))
call TriggerAddAction(gg_trg_##TrigName,function Actions)
endfunction
endscope
Планирую добавить кровотечение (периодический урон), возврат волн обратно к точке каста | к кастующему юниту, а так же, чтобы волны не вылетали за карту 13.01.2021
Мои знания джасса как были на самом дне, так и остались, я тупо стою на месте и не могу продвинуться вперёд, как же это задолбало
Upd: Я в курсе что у некоторых могла возникнуть ошибка отсутствия функции в базе данных из-за кастом гуи, я конвертировал текст в код и теперь всё должно быть нормально, прошу прощения
Upd: 13.01.2021 - чутка переделал и поправил кое-какие косяки. Оптимизировал, но всё ещё говно, можно намного лучше, знания не позволяют.
Если при запуске карты тебя выбивает в главное меню, то просто нажми Ctrl+S в редакторе, если возникнет ошибка, пожалуйста, сделай скрин и пришли мне, если ошибки не будет, то после этого карта должна запустится
`
ОЖИДАНИЕ РЕКЛАМЫ...