//TESH.scrollpos=0
//TESH.alwaysfold=0
Name | Type | is_array | initial_value |
doomHealCaster | unit | Yes | |
doomHealDecrease | real | Yes | |
doomHealDecreaseBase | real | No | |
doomHealDecreasePerLvl | real | No | |
doomHealEffect | string | No | |
doomHealEffectAttachment | string | No | |
doomHealEffectTarget | effect | Yes | |
doomHealGroup | group | No | |
doomHealHeal | real | Yes | |
doomHealHealBase | real | No | |
doomHealHealPerLvl | real | No | |
doomHealInterval | integer | Yes | |
doomHealIntervalBase | integer | No | |
doomHealIntervalCounter | integer | Yes | |
doomHealIntervalPerLvl | integer | No | |
doomHealLength | integer | Yes | |
doomHealLengthBase | integer | No | |
doomHealLengthCounter | integer | Yes | |
doomHealLengthPerLvl | integer | No | |
doomHealMaxIndex | integer | No | |
doomHealRadiusBase | real | No | |
doomHealRadiusPerLvl | real | No | |
doomHealSpellId | integer | No | |
doomHealTarget | unit | Yes | |
doomHealTimer | timer | No | |
tempCaster | unit | No | |
tempGroup | group | No | |
tempTarget | unit | No |
//TESH.scrollpos=0
//TESH.alwaysfold=0
// Doom Heal Spell made by deathismyfriend
// version 1.0.5
function DoomHealDamageLoop takes nothing returns nothing
local integer L = 1
local integer m = udg_doomHealMaxIndex
loop
exitwhen L > m
set udg_doomHealIntervalCounter[ L] = udg_doomHealIntervalCounter[ L] + 1
if udg_doomHealIntervalCounter[ L] == udg_doomHealInterval[ L] then
set udg_doomHealIntervalCounter[ L] = 0
call SetWidgetLife( udg_doomHealTarget[ L], GetWidgetLife( udg_doomHealTarget[ L]) + udg_doomHealHeal[ L])
set udg_doomHealHeal[ L] = udg_doomHealHeal[ L] - udg_doomHealDecrease[ L]
endif
set udg_doomHealLengthCounter[ L] = udg_doomHealLengthCounter[ L] + 1
if udg_doomHealLengthCounter[ L] == udg_doomHealLength[ L] or IsUnitType( udg_doomHealTarget[ L], UNIT_TYPE_DEAD) or GetUnitTypeId( udg_doomHealTarget[ L]) == 0 then
set udg_doomHealInterval[ L] = udg_doomHealInterval[ m]
set udg_doomHealLength[ m] = udg_doomHealLength[ m]
set udg_doomHealHeal[ L] = udg_doomHealHeal[ m]
set udg_doomHealDecrease[ L] = udg_doomHealDecrease[ m]
set udg_doomHealIntervalCounter[ L] = udg_doomHealIntervalCounter[ m]
set udg_doomHealLengthCounter[ L] = udg_doomHealLengthCounter[ m]
set udg_doomHealTarget[ L] = udg_doomHealTarget[ m]
set udg_doomHealTarget[ m] = null
call DestroyEffect( udg_doomHealEffectTarget[ L])
set udg_doomHealEffectTarget[ L] = udg_doomHealEffectTarget[ m]
set udg_doomHealEffectTarget[ m] = null
set m = m - 1
set udg_doomHealMaxIndex = m
set L = L - 1
endif
set L = L + 1
endloop
endfunction
function DoomHealSetup takes nothing returns nothing
local unit c = GetTriggerUnit()
local unit u
local integer m = udg_doomHealMaxIndex
local integer p = GetPlayerId( GetTriggerPlayer())
local integer abiLvl = GetUnitAbilityLevel( c, udg_doomHealSpellId)
local integer interval = udg_doomHealIntervalBase - ( abiLvl * udg_doomHealIntervalPerLvl)
local integer length = udg_doomHealLengthBase - ( abiLvl * udg_doomHealLengthPerLvl)
local real heal = udg_doomHealHealBase - ( abiLvl * udg_doomHealHealPerLvl)
local real x = GetUnitX( c)
local real y = GetUnitY( c)
local real r = udg_doomHealRadiusBase - ( abiLvl * udg_doomHealRadiusPerLvl)
local real decrease = udg_doomHealDecreaseBase - ( abiLvl * udg_doomHealDecreasePerLvl)
call GroupEnumUnitsInRange( udg_doomHealGroup, x, y, r, null)
loop
set u = FirstOfGroup( udg_doomHealGroup)
exitwhen u == null
if DoomHealFilterUnits( u, c) then
set m = m + 1
set udg_doomHealInterval[ m] = interval
set udg_doomHealLength[ m] = length
set udg_doomHealHeal[ m] = heal
set udg_doomHealDecrease[ m] = decrease
set udg_doomHealIntervalCounter[ m] = 0
set udg_doomHealLengthCounter[ m] = 0
set udg_doomHealTarget[ m] = u
set udg_doomHealEffectTarget[ m] = AddSpecialEffectTarget( udg_doomHealEffect, u, udg_doomHealEffectAttachment)
if m == 1 then
call TimerStart( udg_doomHealTimer, 0.031250000, true, function DoomHealDamageLoop)
endif
endif
call GroupRemoveUnit( udg_doomHealGroup, u)
endloop
set udg_doomHealMaxIndex = m
set c = null
endfunction
function DoomHealCastConditions takes nothing returns boolean
if GetSpellAbilityId() == udg_doomHealSpellId then
call DoomHealSetup()
endif
return false
endfunction
//===========================================================================
function InitTrig_DoomHeal_Cast takes nothing returns nothing
local trigger t = CreateTrigger()
set udg_doomHealTimer = CreateTimer()
set udg_doomHealGroup = CreateGroup()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition( t, Condition( function DoomHealCastConditions))
set t = null
endfunction
//TESH.scrollpos=10
//TESH.alwaysfold=0
library Alloc
module Alloc
private static integer array recycler
private static integer instanceCount = 0
debug private static boolean enabled = true
static method allocate takes nothing returns thistype
local thistype this = recycler[0]
debug if (not enabled) then
debug return 1/0
debug endif
if (this == 0) then
debug if (instanceCount == 8191) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"OVERFLOW")
debug set enabled = false
debug set this = 1/0
debug endif
set this = instanceCount + 1
set instanceCount = this
else
set recycler[0] = recycler[this]
endif
debug set recycler[this] = -1
return this
endmethod
method deallocate takes nothing returns nothing
debug if (not enabled) then
debug set this = 1/0
debug endif
debug if (recycler[this] != -1) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"ATTEMPT TO DEALLOCATE NULL STRUCT INSTANCE")
debug set enabled = false
debug set this = 1/0
debug endif
set recycler[this] = recycler[0]
set recycler[0] = this
endmethod
endmodule
endlibrary
//TESH.scrollpos=144
//TESH.alwaysfold=0
library DoomHeal
// Doom Heal Spell made by deathismyfriend
// Alloc by Nestharus can be found here. http://www.hiveworkshop.com/forums/jass-resources-412/snippet-alloc-alternative-221493/
// vJass version 1.0.5
globals
// These are the base values that u can set.
// Here u set the heal interval base. For every second u need 32. So 5 seconds is 160.
private integer intervalBase = 160
// Here u set the max time for it to end. For every second u need 32. So 5 seconds is 160.
private integer lengthBase = 1920
// This is the damage base. Every interval
private real healBase = 50.00
// This is the radius base
private real radiusBase = 500.00
// this is the base value that allows u to decrease or increase the amount of health u heal per interval.
// Example: the amount it heals at lvl 1 is 200. and u want it to decrease by 20. type in 20 in the variable. This does 200 first time. 180 the next interval 160 the third interval and so on
private real decreaseBase = 5.00
// ----------------------------------------------------------------------------------------------------
// These are the values that get added to the base per lvl that u can set.
// Here u set the heal interval per lvl. If u want the time to decrease set it to a positive number. If u want the interval to increase set it to a negative value
private integer intervalPerLvl = 0
// Here u set the max time for it to end per lvl. For every second u need 32. So 5 seconds is 160.
private integer lengthPerLvl = 0
// This is the damage per lvl. Every interval
private real healPerLvl = 0.00
// This is the radius per lvl
private real radiusPerLvl = 0.00
// this is the base value that allows u to decrease or increase the amount of health u heal per interval.
// Example: the amount it heals at lvl 1 is 200. and u want it to decrease by 20. type in 20 in the variable. This does 200 first time. 180 the next interval 160 the third interval and so on
private real decreasePerLvl = 0.00
// ----------------------------------------------------------------------------------------------------
// These are the other values that u can change
// set the effect that shows on the units getting healed.
private constant string EFFECT = "Abilities\\Spells\\Other\\Doom\\DoomTarget.mdl"
// set the attachment point for the unit
private string EFFECT_ATTACHMENT = "origin"
// Set the spell id here
private integer SPELL_ID = 'A000'
//Dont change the next couple of things
private integer maxIndex = 0
private integer array structIndex
private timer tmr = CreateTimer()
private group grp = CreateGroup()
endglobals
private struct doomHeal extends array
implement Alloc
private real decrease
private effect effectTarget
private real heal
private integer interval
private integer intervalCounter
private integer length
private integer lengthCounter
private unit target
// You can add the conditions you want the spell to follow here.
private static method filterUnits takes unit u, unit c, integer p returns boolean
if IsUnitOwnedByPlayer( u, Player(p)) and not IsUnitType( u, UNIT_TYPE_STRUCTURE) and u != c /*
*/ and not IsUnitType( u, UNIT_TYPE_DEAD) and GetUnitTypeId( u) != 0 then
return true
endif
return false
endmethod
private static method create takes real dec, real hl, integer inter, integer lgth, unit u returns thistype
local thistype this = thistype.allocate()
set maxIndex = maxIndex + 1
set this.interval = inter
set this.length = lgth
set this.heal = hl
set this.decrease = dec
set this.intervalCounter = 0
set this.lengthCounter = 0
set this.target = u
set this.effectTarget = AddSpecialEffectTarget( EFFECT, u, EFFECT_ATTACHMENT)
return this
endmethod
private method destroy takes nothing returns nothing
set this.target = null
call DestroyEffect( this.effectTarget)
set this.effectTarget = null
call this.deallocate()
endmethod
private static method damageLoop takes nothing returns nothing
local thistype this
local integer L = 1
loop
exitwhen L > maxIndex
set this = structIndex[ L]
set this.intervalCounter = this.intervalCounter + 1
if this.intervalCounter == this.interval then
set this.intervalCounter = 0
call SetWidgetLife( this.target, GetWidgetLife( this.target) + this.heal)
set this.heal = this.heal - this.decrease
endif
set this.lengthCounter = this.lengthCounter + 1
if this.lengthCounter == this.length or IsUnitType( this.target, UNIT_TYPE_DEAD) or GetUnitTypeId( this.target) == 0 then
call this.destroy()
set structIndex[ L] = structIndex[ maxIndex]
set maxIndex = maxIndex - 1
if maxIndex == 0 then
call PauseTimer( tmr)
endif
endif
set L = L + 1
endloop
endmethod
private static method setup takes nothing returns nothing
local thistype this
local unit c = GetTriggerUnit()
local unit u
local integer p = GetPlayerId( GetTriggerPlayer())
local integer abiLvl = GetUnitAbilityLevel( c, SPELL_ID)
local integer inter = intervalBase - ( abiLvl * intervalPerLvl)
local integer lgth = lengthBase - ( abiLvl * lengthPerLvl)
local real hl = healBase - ( abiLvl * healPerLvl)
local real x = GetUnitX( c)
local real y = GetUnitY( c)
local real r = radiusBase - ( abiLvl * radiusPerLvl)
local real dec = decreaseBase - ( abiLvl * decreasePerLvl)
call GroupEnumUnitsInRange( grp, x, y, r, null)
loop
set u = FirstOfGroup( grp)
exitwhen u == null
if thistype.filterUnits(u, c, p) then
set this = thistype.create( dec, hl, inter, lgth, u)
set structIndex[ maxIndex] = this
if maxIndex == 1 then
call TimerStart( tmr, 0.031250000, true, function thistype.damageLoop)
endif
endif
call GroupRemoveUnit( grp, u)
endloop
set c = null
endmethod
private static method castConditions takes nothing returns boolean
if GetSpellAbilityId() == SPELL_ID then
call setup()
endif
return false
endmethod
//===========================================================================
private static method onInit takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition( t, Condition( function thistype.castConditions))
set t = null
endmethod
endstruct
endlibrary
/*
[hidden="Changelog"]
version 1.0.5
[indent]fixed destroy method[/indent]
version 1.0.4
[indent]fixed minor mistakes.[/indent]
version 1.0.3
[indent]fixed things suggested.[/indent]
version 1.0.2
[indent]fixed the things suggested.
Did not change the multiple constant functions as i believe its nicer when everything is in the globals block[/indent]
version 1.0.0.1
[indent]made some fixes to code.
made the code easier to read[/indent]
version 1.0.0.0
[indent]first version released[/indent]
[/hidden]
*/