Добавлен rsfghd,
опубликован
Дисклеймер!
Я полный нуб/лох/помойка в джассе (называйте как хотите), ничего толком не знаю и короче юзай способность на свой страх и риск. По возможности буду стараться оптимизировать это говно
Предложения по улучшению пишите в комменты
Я полный нуб/лох/помойка в джассе (называйте как хотите), ничего толком не знаю и короче юзай способность на свой страх и риск. По возможности буду стараться оптимизировать это говно
Предложения по улучшению пишите в комменты
Цель: точка или боевая единица
Тип: АОЕ урон
Суть: просто создаются взрывы по прямой линии, остальное можете прочитать в настройках
Подходит как для обычного юнита, так и для героя
Тип: АОЕ урон
Суть: просто создаются взрывы по прямой линии, остальное можете прочитать в настройках
Подходит как для обычного юнита, так и для героя
Текущие настройки:
- ID способности
- ID дамми-снаряда
- Базовый урон
- Доп. урон с уровнем
- Скейл урона от силы
- Скейл урона от ловкости
- Скейл урона от интеллекта
- вкл|выкл бонусы к характеристикам
- Радиус урона
- Дистанция между волнами
- Кол-во волн
- Доп. кол-во волн с уровнем
- Интервал волн
- Сила отбрасывания
- Время отбрасывания
- вкл|выкл отбрасывание
- Тип атаки
- Тип урона
- Тип оружия (звук)
- вкл|выкл эффекты при попадании
- Эффект при попадании
- Точка крепления эффекта
- Время удаления эффекта
- Номер свободной ячейки детского ключа для юнита
Код
scope MySc
globals
private constant integer AbilityID = 'A000' // ID способности
private constant integer DummyID = 'u000' // ID дамми-снаряда
private constant real Damage = 40 // Базовый урон
private constant real DamageLvl = 10 // Доп. урон с прокачкой умения
private constant real DamageScaleStr = 0.00 // Скейл урона от силы
private constant real DamageScaleAgi = 0.00 // Скейл урона от ловкости
private constant real DamageScaleInt = 1.00 // Скейл урона от интеллекта
private constant boolean IncludeBonuses = true // true|false - вкл|выкл бонусы к характеристикам
private constant real WaveRadius = 150 // Радиус урона
private constant real WaveDistance = 200 // Дистанция между волнами
private constant integer DamageWaves = 3 // Кол-во волн
private constant integer DamageWavesLvl = 1 // Доп. кол-во волн с прокачкой умения
private constant real WaveInterval = 0.10 // Интервал волн
private constant real WaveDiscarding = 3.50 // Сила отбрасывания
private constant real WaveDiscardingTime = 0.25 // Время отбрасывания
private constant boolean WaveDiscardingTF = true // true|false - вкл|выкл отбрасывание
private constant attacktype AttackType = ATTACK_TYPE_NORMAL // Тип атаки
private constant damagetype DamageType = DAMAGE_TYPE_NORMAL // Тип урона
private constant weapontype WeaponType = WEAPON_TYPE_WHOKNOWS // Тип оружия (звук)
private constant boolean EffectTF = false // true|false - вкл|выкл эффекты при попадании волны
private constant string Effect = "Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl" // Эффект при попадании волной
private constant string AttachPoint = "chest" // Точка крепления эффекта
private constant real EffectRemoveTime = 1.00 // Время удаления эффекта
private constant integer HI = 0 // Номер свободной ячейки детского ключа для юнита
private real TempReal = 0.
endglobals
//==========================================================================
private function IsUnitDead takes unit u returns boolean
return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
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()
set bj_lastCreatedEffect = LoadEffectHandle(udg_Hash,GetHandleId(t),0)
call DestroyEffect(bj_lastCreatedEffect)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call DestroyTimer(t)
set t = null
set bj_lastCreatedEffect = null
endfunction
private function move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local real a = LoadReal(udg_Hash,i,0)
local real a1 = LoadReal(udg_Hash,i,2)+0.01
local unit u = LoadUnitHandle(udg_Hash,i,1)
if a1 >= WaveDiscardingTime then
call PauseUnit(u,false)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,i)
call SaveInteger(udg_Hash,GetHandleId(u),HI,0)
else
call SetUnitX(u,GetUnitX(u)+WaveDiscarding*Cos(a))
call SetUnitY(u,GetUnitY(u)+WaveDiscarding*Sin(a))
call SaveReal(udg_Hash,i,2,a1)
endif
set t = null
set u = null
endfunction
private function dmgf takes nothing returns nothing
local timer t = null
local unit u = GetEnumUnit()
local real a = 0.
local real aa = 0.
call UnitDamageTarget(bj_lastCreatedUnit,u,TempReal,true,false,AttackType,DamageType,WeaponType)
if EffectTF == true then
set t = CreateTimer()
set bj_lastCreatedEffect = AddSpecialEffectTarget(Effect,u,AttachPoint)
call SaveEffectHandle(udg_Hash,GetHandleId(t),0,bj_lastCreatedEffect)
call TimerStart(t,EffectRemoveTime,false,function remeff)
set t = null
set bj_lastCreatedEffect = null
endif
if WaveDiscardingTF == true then
if LoadInteger(udg_Hash,GetHandleId(u),HI) == 0 then
set t = CreateTimer()
set a = Atan2(GetUnitY(u)-GetUnitY(bj_lastCreatedUnit),GetUnitX(u)-GetUnitX(bj_lastCreatedUnit))*bj_RADTODEG
set aa = GetUnitFacing(bj_lastCreatedUnit)
if a < 0 then
set a = a+360.
endif
if (aa < 180. and not(a > aa and a < aa + 180.)) or (aa > 180. and a > aa - 180. and a < aa) then
set aa = aa-90
else
set aa = aa+90
endif
call SaveReal(udg_Hash,GetHandleId(t),0,aa*bj_DEGTORAD)
call PauseUnit(u,true)
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u)
call TimerStart(t,0.01,true,function move)
set t = null
call SaveInteger(udg_Hash,GetHandleId(u),HI,1)
endif
endif
set u = null
endfunction
private function Waves takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local integer DW1 = LoadInteger(udg_Hash,i,2)+1
local real r = LoadReal(udg_Hash,i,4)+WaveDistance
local real a = LoadReal(udg_Hash,i,5)
local real x = LoadReal(udg_Hash,i,6)+r*Cos(a)
local real y = LoadReal(udg_Hash,i,7)+r*Sin(a)
local group g = null
if DW1 > LoadInteger(udg_Hash,i,1) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,i)
else
set bj_groupEnumOwningPlayer = LoadPlayerHandle(udg_Hash,i,3)
set TempReal = LoadReal(udg_Hash,i,0)
set g = CreateGroup()
set bj_lastCreatedUnit = CreateUnit(bj_groupEnumOwningPlayer,DummyID,x,y,a*bj_RADTODEG)
call GroupEnumUnitsInRange(g,x,y,WaveRadius,Condition(function filt))
call ForGroup(g,function dmgf)
call KillUnit(bj_lastCreatedUnit)
call GroupClear(g)
call DestroyGroup(g)
set g = null
set bj_lastCreatedUnit = null
set bj_groupEnumOwningPlayer = null
call SaveInteger(udg_Hash,i,2,DW1)
call SaveReal(udg_Hash,i,4,r)
endif
set t = null
endfunction
private function Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local timer t = CreateTimer()
local integer i = GetHandleId(t)
local integer lvl = GetUnitAbilityLevel(u,AbilityID)
local real x = GetUnitX(u)
local real y = GetUnitY(u)
call SaveReal(udg_Hash,i,0,Damage+(lvl*DamageLvl)+(GetHeroStr(u,IncludeBonuses)*DamageScaleStr)+(GetHeroAgi(u,IncludeBonuses)*DamageScaleAgi)+(GetHeroInt(u,IncludeBonuses)*DamageScaleInt))
call SaveReal(udg_Hash,i,4,0)
call SaveReal(udg_Hash,i,5,Atan2(GetSpellTargetY()-y,GetSpellTargetX()-x))
call SaveReal(udg_Hash,i,6,x)
call SaveReal(udg_Hash,i,7,y)
call SaveInteger(udg_Hash,i,1,DamageWaves+(lvl*DamageWavesLvl))
call SaveInteger(udg_Hash,i,2,0)
call SavePlayerHandle(udg_Hash,i,3,GetOwningPlayer(u))
call TimerStart(t,WaveInterval,true,function Waves)
set u = null
set t = null
endfunction
//===========================================================================
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == AbilityID
endfunction
function InitTrig_Phoenix takes nothing returns nothing
local trigger t = CreateTrigger()
local integer index = 0
loop
call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition(t,Condition(function Conditions))
call TriggerAddAction(t,function Actions)
set t = null
endfunction
endscope
В планах доработать, чтобы юнита не отталкивало в непроходимую местность, плавное отталкивание
Upd: Я в курсе что у некоторых могла возникнуть ошибка отсутствия функции в базе данных из-за кастом гуи, я конвертировал текст в код и теперь всё должно быть нормально, прошу прощения
Если при запуске карты через редактор тебя выбивает в главное меню, то просто нажми Ctrl+S в редакторе, если возникнет ошибка, пожалуйста, сделай скрин и пришли мне, если ошибки не будет, то после этого карта должна запустится
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
rsfghd
3 года назад
0
Исправил недочёт с кастом гуи
Чтобы оставить комментарий, пожалуйста, войдите на сайт.