Warning Only PRO help requested with this spell
So I dont want to see replies like "omg JASS sucks use GUI" or anything like this
My problem is prison_spell1 and takeout_spell1 causes thread crash
Here spell goes
So I dont want to see replies like "omg JASS sucks use GUI" or anything like this
My problem is prison_spell1 and takeout_spell1 causes thread crash
Here spell goes
JASS:
globals
group udg_dummygroup_spell1
endglobals
constant function spellid_spell1 takes nothing returns integer
return 'A000' // Spell ID
endfunction
constant function shardspersecond_spell1 takes nothing returns integer
return 10 // shards per second
endfunction
constant function dummyunit_spell1 takes nothing returns integer
return 'u000' // dummy unit ID (locust)
endfunction
constant function dummyspellid_spell1 takes nothing returns integer
return 'A001' // ID of spell that casted to units like slow on hit
// Also level of this spell increases with level of main spell
endfunction
constant function dummyspellorder_spell1 takes nothing returns string
return "frostnova" // Order string of Dummy Spell
// type an invaild string for no spell
endfunction
constant function shardslows_spell1 takes nothing returns boolean
return true // Determines if Each shard does a slowing effect on enemies
endfunction
constant function spellslows_spell1 takes nothing returns boolean
return true // Determines if finishing strike_spell1 does slowing effect
endfunction
constant function destructableid_spell1 takes nothing returns integer
return 'IRic' // ID of destructable that makes prison
endfunction
constant function duration_spell1 takes nothing returns real
return 2.00 // How long the rain will continue
endfunction
constant function durationlevelfactor_spell1 takes nothing returns real
return 1.00 // Level Factor of rain duration
endfunction
constant function shardbasedamage_spell1 takes nothing returns real
return 50.00 // Base Damage of a Shard
endfunction
constant function shardlevelfactordamage_spell1 takes nothing returns real
return 25.00 // Level factor of Shard Damage
endfunction
constant function shardspellarea_spell1 takes nothing returns real
return 100.00 // Area of Effect which one shard has
endfunction
constant function shardspellarealevelfactor_spell1 takes nothing returns real
return 10.00 // Level factor of Area of Effect of one shard
endfunction
constant function spellarea_spell1 takes nothing returns real
return 300.00 // Area of Effect of Spell
endfunction
constant function spellarealevelfactor_spell1 takes nothing returns real
return 50.00 // Level Factor of AoE for spell
endfunction
constant function spellfinaldamage_spell1 takes nothing returns real
return 400.00 // Final Damage that spell does
endfunction
constant function spellfinaldamagelevelfactor_spell1 takes nothing returns real
return 100.00 // level factor of Final Damage that spell does
endfunction
constant function spellprisoncreate_spell1 takes nothing returns boolean
return true // Determines if spell creates a prison to block enemies inside it
endfunction
constant function spelltakealliesout_spell1 takes nothing returns boolean
return true // Determines if spell takes allies out of spell area
endfunction
constant function spelldamageallies_spell1 takes nothing returns boolean
return false // Determines if spell damages allies too
endfunction
constant function spellexplodetargets_spell1 takes nothing returns boolean
return true // Determines if spell kills enemies with exploding (like mortars do)
endfunction
function takeout_spell1 takes unit caster, real x, real y, integer s returns nothing
local unit u
local integer s
local real x2
local real y2
local real r = spellarea_spell1()+spellarealevelfactor_spell1()*s
local group g = CreateGroup()
call GroupEnumUnitsInRange(g,x,y,r,Filter(null))
loop
set u = FirstOfGroup(g )
exitwhen u == null
if IsUnitAlly(u,GetOwningPlayer(caster)) then
set x2 = GetUnitX(u )
set y2 = GetUnitY(u )
if x == x2 then
set x2 = x2+1
endif
if y == y2 then
set y2 = y2+1
endif
call SetUnitX(u,x+(r+50)*Cos(Atan((y2-y)/(x2-x))))
call SetUnitY(u,y+(r+50)*Sin(Atan((y2-y)/(x2-x))))
endif
call GroupRemoveUnit(g,u)
endloop
endfunction
function prison_spell1 takes real x,real y,integer s returns nothing
local destructable array des
local real dir
local integer a =0
local integer s
local real r = spellarea_spell1()+spellarealevelfactor_spell1()*s
loop
exitwhen a == R2I(r/10)
set des[a] = CreateDestructableLoc(destructableid_spell1(),Location(x+r*Cos((360/(r/10))*a),y+r*Sin((360/(r/10))*a)),0,1,0)
set a = a+1
endloop
call TriggerSleepAction(duration_spell1()+durationlevelfactor_spell1()*s)
set a = 0
loop
exitwhen a == R2I(r/10)
call KillDestructable(des[a])
set a = a+1
endloop
endfunction
function spellcaster_spell1 takes player owner, integer spell,integer level,string spellorder, unit target returns nothing
local unit caster
local real x
local real y
set x = GetUnitX(target)
set y = GetUnitY(target)
set caster = CreateUnitAtLoc(owner,dummyunit_spell1(),Location(x,y),bj_UNIT_FACING)
call UnitAddAbility(caster,spell)
call SetUnitAbilityLevel(caster,spell,level)
call IssueTargetOrder(caster,spellorder,target)
call UnitApplyTimedLife(caster,'BTLF',5)
set caster = null
set target = null
endfunction
function DamageArea_spell1 takes unit attacker, location point, real area, real damage,integer a returns nothing
local unit u
local group g = CreateGroup()
local player p = GetOwningPlayer(attacker)
call GroupEnumUnitsInRange(g,GetLocationX(point),GetLocationY(point),area,Filter(null))
loop
set u = FirstOfGroup(g)
exitwhen u == null
if IsUnitEnemy(u,p) and GetWidgetLife(u) > 0 and not (IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE) or IsUnitType(u,UNIT_TYPE_STRUCTURE)) then
if spellexplodetargets_spell1() then
call SetUnitExploded(u,true)
endif
call UnitDamageTarget(attacker,u,damage,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
if spellexplodetargets_spell1() then
call SetUnitExploded(u,false)
endif
call spellcaster_spell1(GetOwningPlayer(attacker),dummyspellid_spell1(),a,dummyspellorder_spell1(),u)
endif
if spelldamageallies_spell1() and IsUnitAlly(u,p) and GetWidgetLife(u) > 0 and not (IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE) or IsUnitType(u,UNIT_TYPE_STRUCTURE)) then
if spellexplodetargets_spell1() then
call SetUnitExploded(u,true)
endif
call UnitDamageTarget(attacker,u,damage,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
if spellexplodetargets_spell1() then
call SetUnitExploded(u,false)
call spellcaster_spell1(GetOwningPlayer(attacker),dummyspellid_spell1(),a,dummyspellorder_spell1(),u)
endif
endif
call GroupRemoveUnit(g,u)
endloop
call DestroyGroup(g)
set g = null
set p = null
set attacker = null
set point = null
endfunction
function strikeac_spell1 takes nothing returns nothing
local group g = CreateGroup()
local unit u
local location tar
local rect reg
local integer a
local effect e
local unit caster
call GroupAddGroup(udg_dummygroup_spell1,g)
loop
set u = FirstOfGroup(g)
exitwhen u == null
if GetUnitTypeId(u) == dummyunit_spell1() then
set a = GetUnitUserData(u)
set reg = RectFromCenterSizeBJ(GetUnitLoc(u), spellarea_spell1()+a*spellarealevelfactor_spell1()+100, spellarea_spell1()+a*spellarealevelfactor_spell1()+100)
set tar = GetRandomLocInRect(reg)
set e = AddSpecialEffect("Abilities\\Spells\\Human\\Blizzard\\BlizzardTarget.mdl",GetLocationX(tar),GetLocationY(tar))
set caster = CreateUnitAtLoc(GetOwningPlayer(u),dummyunit_spell1(),tar,bj_UNIT_FACING)
call SetUnitUserData(caster,a)
call UnitAddAbility(caster,'Abu2')
call IssueImmediateOrder(caster,"burrow")
set caster = null
call DamageArea_spell1(u,tar,shardspellarea_spell1()+a*shardspellarealevelfactor_spell1(),shardbasedamage_spell1()+shardlevelfactordamage_spell1()*a,a)
endif
call GroupRemoveUnit(g,u)
endloop
call DestroyGroup(g)
call DestroyEffect(e)
set g = null
call RemoveLocation(tar)
set tar = null
call RemoveRect(reg)
set reg = null
endfunction
function dummyac_spell1 takes nothing returns nothing
local unit dummyu
local unit caster = GetTriggerUnit()
local location pos = GetSpellTargetLoc()
local integer a = GetUnitAbilityLevel(caster,spellid_spell1())
if ( GetSpellAbilityId() == spellid_spell1() ) then
if spelltakealliesout_spell1() then
call takeout_spell1(caster,GetLocationX(pos),GetLocationY(pos),a)
endif
if spellprisoncreate_spell1() then
call prison_spell1(GetLocationX(pos),GetLocationY(pos),a)
else
set dummyu = CreateUnitAtLoc(GetOwningPlayer(caster),dummyunit_spell1(),pos,bj_UNIT_FACING)
call SetUnitUserData(dummyu,GetUnitAbilityLevel(caster,spellid_spell1()))
call GroupAddUnit(udg_dummygroup_spell1,dummyu)
call TriggerSleepAction(duration_spell1()+durationlevelfactor_spell1()*a)
endif
call TriggerSleepAction(0.5)
call DamageArea_spell1(dummyu,pos,spellarea_spell1()+spellarealevelfactor_spell1()*a,spellfinaldamage_spell1()+spellfinaldamagelevelfactor_spell1()*a,a)
call GroupRemoveUnit(udg_dummygroup_spell1,dummyu)
call KillUnit(dummyu)
set dummyu = null
call RemoveLocation(pos)
set caster = null
endif
endfunction
function damageac_spell1 takes nothing returns nothing
local unit u = GetTriggerUnit()
local integer a = GetUnitUserData(u)
local real x = GetUnitX(u)
local real y = GetUnitY(u)
if GetSpellAbilityId() == 'Abu2' then
call RemoveUnit(u)
call TriggerSleepAction(3.5)
call DamageArea_spell1(u,Location(x,y),shardspellarea_spell1()+a*shardspellarealevelfactor_spell1(),shardbasedamage_spell1()+shardlevelfactordamage_spell1()*a,a)
endif
endfunction
//===========================================================================
function InitTrig_Blizzard_Field takes nothing returns nothing
local trigger strike_spell1
local trigger dummy_spell1
local trigger damage_spell1
set dummy_spell1 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( dummy_spell1, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( dummy_spell1, function dummyac_spell1 )
set strike_spell1 = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( strike_spell1, 1/I2R(shardspersecond_spell1()) )
call TriggerAddAction( strike_spell1, function strikeac_spell1 )
set damage_spell1 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( damage_spell1, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddAction( damage_spell1, function damageac_spell1 )
endfunction
Last edited: