this main triggerfunction H2I takes handle h returns integer
return h
return 0
endfunction
function GetTrue takes nothing returns boolean
return true
endfunction
constant function Dummy_Ability_Rawcode takes nothing returns integer
return 'A004' //CHANGE THIS - Abilities given to Dummies that aren't supposed to be hit by Spells
endfunction
constant function Dummy_Unit_Rawcode takes nothing returns integer
return 'h000' //CHANGE THIS
endfunction
constant function Dummy_Visibility_Rawcode takes nothing returns integer
return 'h001' //CHANGE THIS
endfunction
function Wait takes real duration returns nothing
local timer waitTimer
local real timeRemaining
if (duration > 0.00) then
set waitTimer = CreateTimer ()
call TimerStart (waitTimer,duration,false,null)
loop
set timeRemaining = TimerGetRemaining (waitTimer)
exitwhen timeRemaining <= 0.00
if (timeRemaining > 0.271828) then
call TriggerSleepAction (timeRemaining / 10.00)
else
call TriggerSleepAction (0.10)
endif
endloop
call PauseTimer (waitTimer)
call DestroyTimer (waitTimer)
endif
set waitTimer = null
endfunction
//########################################################################################
//## Handle Variables //##
//## By KaTTaNa //##
//## Requires the Global Game Cache Variable "HandleVars" (udg_HandleVars) //##
//########################################################################################
function HV_H2I takes handle h returns integer
return h
return 0
endfunction
function LocalVars takes nothing returns gamecache
if udg_HandleVars == null then
call FlushGameCache (udg_HandleVars)
set udg_HandleVars = InitGameCache ("jasslocalvars")
endif
return udg_HandleVars
endfunction
function SetHandleHandle takes handle subject, string name, handle value returns nothing
if value == null then
call FlushStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
else
call StoreInteger (LocalVars(),I2S(HV_H2I(subject)),name,HV_H2I(value))
endif
endfunction
function SetHandleInt takes handle subject, string name, integer value returns nothing
if value == null or value == 0 then
call FlushStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
else
call StoreInteger (LocalVars(),I2S(HV_H2I(subject)),name,value)
endif
endfunction
function SetHandleBoolean takes handle subject, string name, boolean value returns nothing
if value == null or value == false then
call FlushStoredBoolean (LocalVars(),I2S(HV_H2I(subject)),name)
else
call StoreBoolean (LocalVars(),I2S(HV_H2I(subject)),name,value)
endif
endfunction
function SetHandleReal takes handle subject, string name, real value returns nothing
if value == null or value == 0.00 then
call FlushStoredReal (LocalVars(),I2S(HV_H2I(subject)),name)
else
call StoreReal (LocalVars(),I2S(HV_H2I(subject)),name,value)
endif
endfunction
function SetHandleString takes handle subject, string name, string value returns nothing
if value == null or value == "" then
call FlushStoredString (LocalVars(),I2S(HV_H2I(subject)),name)
else
call StoreString (LocalVars(),I2S(HV_H2I(subject)),name,value)
endif
endfunction
function GetHandleHandle takes handle subject, string name returns handle
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function GetHandleInt takes handle subject, string name returns integer
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
endfunction
function GetHandleBoolean takes handle subject, string name returns boolean
return GetStoredBoolean (LocalVars(),I2S(HV_H2I(subject)),name)
endfunction
function GetHandleReal takes handle subject, string name returns real
return GetStoredReal (LocalVars(),I2S(HV_H2I(subject)),name)
endfunction
function GetHandleString takes handle subject, string name returns string
return GetStoredString (LocalVars(),I2S(HV_H2I(subject)),name)
endfunction
function GetHandleUnit takes handle subject, string name returns unit
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function GetHandleTimer takes handle subject, string name returns timer
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function GetHandleTrigger takes handle subject, string name returns trigger
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function GetHandleEffect takes handle subject, string name returns effect
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function GetHandleGroup takes handle subject, string name returns group
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function GetHandleLightning takes handle subject, string name returns lightning
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function GetHandleWidget takes handle subject, string name returns widget
return GetStoredInteger (LocalVars(),I2S(HV_H2I(subject)),name)
return null
endfunction
function FlushHandleLocals takes handle subject returns nothing
call FlushStoredMission (LocalVars(),I2S(HV_H2I(subject)))
endfunction
//##########################################################################################
this in map header
if you wan to test the map test it//*****************************************************************************************
//*****************************************************************************************
//** //**
//** Name : Dragons' Horde //**
//** Author : --Thanatos-- //**
//** //**
//*****************************************************************************************
//*****************************************************************************************
//** //**
//** Credits: KaTTaNa's Handle Vars //**
//** //**
//*****************************************************************************************
//*****************************************************************************************
//#########################################################################################
//#####################################configurations######################################
//## //##
constant function Dragons_Horde_Rawcode takes nothing returns integer //##
return 'A006' //##
endfunction //##
//## //##
constant function Dragons_Horde_LimitRawcode takes nothing returns integer //##
return 'A001' //##
endfunction //##
//## //##
constant function Dragons_Horde_BreathRawcode takes nothing returns integer //##
return 'A007' //##
endfunction //##
//## //##
constant function Dragons_Horde_DragonRawcode takes nothing returns integer //##
return 'h004' //##
endfunction //##
//## //##
constant function Dragons_Horde_Radius takes nothing returns real //##
return 700. //##
endfunction //##
//## //##
constant function Dragons_Horde_DragonSpeed takes nothing returns real //##
return 500. //##
endfunction //##
//## //##
constant function Dragons_Horde_DragonSpeedDist takes nothing returns real //##
return 150. //##
endfunction //##
//## //##
constant function Dragons_Horde_DragonRadius takes nothing returns real //##
return 200. //##
endfunction //##
//## //##
constant function Dragons_Horde_DragonRadiusDist takes nothing returns real //##
return 100. //##
endfunction //##
//## //##
constant function Dragons_Horde_DragonRadiusSpeed takes nothing returns real //##
return 20. //##
endfunction //##
//## //##
constant function Dragons_Horde_DragonRadiusSpeedDist takes nothing returns real //##
return 5. //##
endfunction //##
//## //##
constant function Dragons_Horde_TimerPeriod takes nothing returns real //##
return .04 //##
endfunction //##
//## //##
constant function Dragons_Horde_RegistryPeriod takes nothing returns real //##
return 2. //##
endfunction //##
//## //##
constant function Dragons_Horde_MaxDragons takes nothing returns integer //##
return 3 //##
endfunction //##
//## //##
constant function Dragons_Horde_DamagePoint takes nothing returns real //##
return .75 //##
endfunction //##
//## //##
constant function Dragons_Horde_Dragons takes integer level returns integer //##
if level == 0 then //##
return 0 //##
elseif level == 1 then //##
return 2 //##
elseif level == 2 then //##
return 2 //##
elseif level == 3 then //##
return 3 //##
elseif level == 4 then //##
return 3 //##
else //##
return level / 2 + 1 //##
endif //##
endfunction //##
//## //##
constant function Dragons_Horde_Cooldown takes integer level returns real //##
if level == 1 then //##
return 1.5 //##
elseif level == 2 then //##
return 1.5 //##
elseif level == 3 then //##
return 1.5 //##
elseif level == 4 then //##
return 1.5 //##
else //##
return 1.5 //##
endif //##
endfunction //##
//## //##
constant function Dragons_Horde_BirthEffect takes nothing returns string //##
return "Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl" //##
endfunction //##
//## //##
//#########################################################################################
//#########################################################################################
//***************************************conditions****************************************
//* //*
function Dragons_Horde_Conditions takes nothing returns boolean //*
//*
return GetSpellAbilityId () == Dragons_Horde_Rawcode () //*
//*
endfunction //*
//* //*
//*****************************************************************************************
//*************************************spell's script*************************************
function Dragons_Horde_Filter takes nothing returns boolean
local player owner = GetOwningPlayer (GetHandleUnit(GetExpiredTimer(),"caster"))
local unit target = GetFilterUnit ()
local boolean returnVal = false
if GetUnitAbilityLevel (target,Dummy_Ability_Rawcode()) <= 0 then
if IsUnitHidden (target) == false then
if GetWidgetLife (target) > .405 then
if IsUnitEnemy (target,owner) then
if IsUnitVisible (target,owner) then
if IsUnitType (target,UNIT_TYPE_STRUCTURE) == false then
if IsUnitType (target,UNIT_TYPE_MAGIC_IMMUNE) == false then
set returnVal = true
endif
endif
endif
endif
endif
endif
endif
set owner = null
set target = null
return returnVal
endfunction
//We know we hate BJ ^_^"
function Dragons_Horde_RandomUnit takes nothing returns nothing
set bj_groupRandomConsidered = bj_groupRandomConsidered + 1
if (GetRandomInt(1,bj_groupRandomConsidered) == 1) then
set bj_groupRandomCurrentPick = GetEnumUnit ()
endif
endfunction
function Dragons_Horde takes nothing returns nothing
local timer DhTimer = GetExpiredTimer ()
local unit caster = GetHandleUnit (DhTimer,"caster")
local integer level = GetUnitAbilityLevel (caster,Dragons_Horde_Rawcode())
local integer dragons = Dragons_Horde_Dragons (level)
local real cooldown = Dragons_Horde_Cooldown (level)
local player owner = GetOwningPlayer (caster)
local real castX = GetWidgetX (caster)
local real castY = GetWidgetY (caster)
local real drgnX
local real drgnY
local real targX
local real targY
local real nextX
local real nextY
local real angle
local real dist
local real Dist
local boolean Random
local real random
local real attack
local real spin
local boolean breath
local boolean Attack
local group targets
local unit target
local unit dummy
local unit eDragon
local integer lDragon = 0
local string lString
local integer maxDragon = Dragons_Horde_MaxDragons ()
local real period = Dragons_Horde_TimerPeriod ()
local real dmgPoint = Dragons_Horde_DamagePoint ()
local real radius = Dragons_Horde_Radius ()
local real drgnSpd = Dragons_Horde_DragonSpeed ()
local real drgnSpdDist = Dragons_Horde_DragonSpeedDist ()
local real drgnRad = Dragons_Horde_DragonRadius ()
local real drgnRadDist = Dragons_Horde_DragonRadiusDist ()
local real drgnRadSpd = Dragons_Horde_DragonRadiusSpeed ()
local real drgnRadSpdDist = Dragons_Horde_DragonRadiusSpeedDist ()
local real multiplier = period
local filterfunc DhFilter = Filter (function Dragons_Horde_Filter)
loop
set lDragon = lDragon + 1
exitwhen lDragon > maxDragon
set lString = I2S (lDragon)
set eDragon = GetHandleUnit (DhTimer,"dragon" + lString)
if lDragon > dragons or GetWidgetLife (caster) <= .405 then
call UnitApplyTimedLife (eDragon,'BTLF',.00001)
else
if GetWidgetLife (eDragon) <= .405 then
set random = GetRandomReal (drgnRad - drgnRadDist,drgnRad + drgnRadDist)
set angle = GetRandomReal (0.,360.)
set attack = 0.
set breath = false
set drgnX = castX + random * Cos (angle * (3.14159 / 180.))
set drgnY = castY + random * Sin (angle * (3.14159 / 180.))
set targX = 0.
set targY = 0.
set eDragon = CreateUnit (owner,Dragons_Horde_DragonRawcode(),drgnX,drgnY,angle + 90.)
call DestroyEffect (AddSpecialEffectTarget(Dragons_Horde_BirthEffect(),eDragon,"chest"))
call SetUnitAnimationByIndex (eDragon,0)
call SetUnitX (eDragon,drgnX)
call SetUnitY (eDragon,drgnY)
call SetHandleHandle (DhTimer,"dragon" + lString,eDragon)
call SetHandleReal (DhTimer,"dragondist" + lString,random )
call SetHandleReal (DhTimer,"dragonangle" + lString,angle )
call SetHandleReal (DhTimer,"dragoncool" + lString,attack )
call SetHandleBoolean (DhTimer,"dragondone" + lString,breath )
call SetHandleReal (DhTimer,"dragontargx" + lString,targX )
call SetHandleReal (DhTimer,"dragontargy" + lString,targY )
endif
set dist = GetHandleReal (DhTimer,"dragondist" + lString)
set angle = GetHandleReal (DhTimer,"dragonangle" + lString)
set attack = GetHandleReal (DhTimer,"dragoncool" + lString)
set breath = GetHandleBoolean (DhTimer,"dragondone" + lString)
set targX = GetHandleReal (DhTimer,"dragontargx" + lString)
set targY = GetHandleReal (DhTimer,"dragontargy" + lString)
set drgnX = GetWidgetX (eDragon)
set drgnY = GetWidgetY (eDragon)
set Attack = attack > 0. and attack <= dmgPoint
if Attack then
set multiplier = 0.
endif
set random = GetRandomReal (drgnSpd - drgnSpdDist,drgnSpd + drgnSpdDist)
set spin = random / (2. * 3.14159 * dist / 360.) * multiplier
set angle = angle + spin
loop
set random = GetRandomReal (drgnRadSpd - drgnRadSpdDist,drgnRadSpd + drgnRadSpdDist) * GetRandomReal (-1.,1.) * multiplier
set Dist = dist + random
exitwhen Dist <= drgnRad + drgnRadDist and Dist >= drgnRad - drgnRadDist
endloop
set dist = dist + random
set nextX = castX + dist * Cos (angle * (3.14159 / 180.))
set nextY = castY + dist * Sin (angle * (3.14159 / 180.))
set drgnX = nextX
set drgnY = nextY
call SetUnitX (eDragon,drgnX)
call SetUnitY (eDragon,drgnY)
call SetHandleReal (DhTimer,"dragondist" + lString,dist )
call SetHandleReal (DhTimer,"dragonangle" + lString,angle)
if Attack then
set angle = Atan2 (targY - drgnY,targX - drgnX) * (180. / 3.14159)
else
set angle = angle + 90.
endif
call SetUnitFacing (eDragon,angle)
if attack >= cooldown then
set attack = 0.
set breath = false
call SetHandleReal (DhTimer,"dragoncool" + lString,attack)
call SetHandleBoolean (DhTimer,"dragondone" + lString,breath)
elseif attack > 0. then
if attack >= dmgPoint and (breath == false) then
set breath = true
call SetHandleBoolean (DhTimer,"dragondone" + lString,breath)
set dummy = CreateUnit (owner,Dummy_Unit_Rawcode(),drgnX,drgnY,0.)
call UnitApplyTimedLife (dummy,'BTLF',1.)
call UnitAddAbility (dummy,Dragons_Horde_BreathRawcode())
call SetUnitAbilityLevel (dummy,Dragons_Horde_BreathRawcode(),level)
call IssuePointOrderById (dummy,852218,targX,targY)
call SetUnitAnimationByIndex (eDragon,0)
endif
set attack = attack + period
call SetHandleReal (DhTimer,"dragoncool" + lString,attack)
elseif attack == 0. then
set targets = CreateGroup ()
call GroupEnumUnitsInRange (targets,drgnX,drgnY,radius,Condition(function Dragons_Horde_Filter))
if FirstOfGroup (targets) != null then
set bj_groupRandomConsidered = 0
set bj_groupRandomCurrentPick = null
call ForGroup (targets,function Dragons_Horde_RandomUnit)
set target = bj_groupRandomCurrentPick //We know we hate BJ ^_^"
set targX = GetWidgetX (target)
set targY = GetWidgetY (target)
call SetHandleReal (DhTimer,"dragontargx" + lString,targX)
call SetHandleReal (DhTimer,"dragontargy" + lString,targY)
call SetUnitFacing (eDragon,Atan2(targY - drgnY,targX - drgnX) * (180. / 3.14159))
call SetUnitAnimationByIndex (eDragon,1)
set attack = attack + period
call SetHandleReal (DhTimer,"dragoncool" + lString,attack)
endif
call DestroyGroup (targets)
endif
set multiplier = period
endif
endloop
if caster == null then
call FlushHandleLocals (DhTimer)
call PauseTimer (DhTimer)
call DestroyTimer (DhTimer)
endif
set DhTimer = null
set caster = null
set eDragon = null
set owner = null
set targets = null
set target = null
set dummy = null
set eDragon = null
set DhFilter = null
endfunction
function Dragons_Horde_Register_Filter takes nothing returns boolean
local unit target = GetFilterUnit ()
local boolean returnVal = false
if GetUnitAbilityLevel (target,Dragons_Horde_Rawcode()) > 0 then
if GetUnitAbilityLevel (target,Dragons_Horde_LimitRawcode()) <= 0 then
set returnVal = true
endif
endif
set target = null
return returnVal
endfunction
function Dragons_Horde_Register takes nothing returns nothing
local timer DhTimer
local group regGroup = CreateGroup ()
local unit regUnit
local rect entire = GetWorldBounds ()
call GroupEnumUnitsInRect (regGroup,entire,Filter(function Dragons_Horde_Register_Filter))
loop
set regUnit = FirstOfGroup (regGroup)
exitwhen regUnit == null
call GroupRemoveUnit (regGroup,regUnit)
call UnitAddAbility (regUnit,Dragons_Horde_LimitRawcode())
call UnitMakeAbilityPermanent (regUnit,true,Dragons_Horde_LimitRawcode())
set DhTimer = CreateTimer ()
call SetHandleHandle (DhTimer,"caster",regUnit)
call TimerStart (DhTimer,Dragons_Horde_TimerPeriod(),true,function Dragons_Horde)
endloop
call DestroyGroup (regGroup)
call RemoveRect (entire)
set DhTimer = null
set regGroup = null
set regUnit = null
set entire = null
endfunction
//****************************************************************************************
//****************************************preloads*********************************************
//* //*
function Dragons_Horde_Preload takes nothing returns nothing //*
//*
local player neutral = Player (PLAYER_NEUTRAL_PASSIVE) //*
local unit tempUnit = CreateUnit (neutral,Dummy_Unit_Rawcode(),0.,0.,0.) //*
call DestroyEffect (AddSpecialEffectTarget(Dragons_Horde_BirthEffect(),tempUnit,"origin"))//*
call UnitAddAbility (tempUnit,Dragons_Horde_Rawcode()) //*
call UnitAddAbility (tempUnit,Dragons_Horde_LimitRawcode()) //*
call UnitAddAbility (tempUnit,Dragons_Horde_BreathRawcode()) //*
call RemoveUnit (tempUnit) //*
call RemoveUnit (CreateUnit(neutral,Dragons_Horde_DragonRawcode(),0.,0.,0.))//*
set neutral = null //*
set tempUnit = null //*
//*
endfunction //*
//* //*
//*********************************************************************************************
//===========================================================================
function InitTrig_Dragons_Horde takes nothing returns nothing
local integer playerId = 0
call Dragons_Horde_Preload ()
set gg_trg_Dragons_Horde = CreateTrigger ()
call TimerStart (CreateTimer(),Dragons_Horde_RegistryPeriod(),true,function Dragons_Horde_Register)
endfunction