1. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  2. Updated Resource Submission Rules: All model & skin resource submissions must now include an in-game screenshot. This is to help speed up the moderation process and to show how the model and/or texture looks like from the in-game camera.
    Dismiss Notice
  3. DID YOU KNOW - That you can unlock new rank icons by posting on the forums or winning contests? Click here to customize your rank or read our User Rank Policy to see a list of ranks that you can unlock. Have you won a contest and still haven't received your rank award? Then please contact the administration.
    Dismiss Notice
  4. Rubbed the right way, the genie is out of its lamp! The 12th Concept Art Contest Results have been announced.
    Dismiss Notice
  5. Race against the odds and Reforge, Don't Refund. The 14th Techtree Contest has begun!
    Dismiss Notice
  6. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Trigger Viewer

Re'ammin's Child.w3x
Variables
Re'ammin's Child
ReAmmins Child
Test
RegisterPlayerUnitEvent
Test
Enter map-specific custom script code below. This text will be included in the map script after variables are declared and before any trigger code.

		
Name Type Is Array Initial Value
native UnitAlive takes unit id returns boolean//Remove this if you already had one
//! zinc
    library ReAmminsChild
    /*-----------------------------------------------------------------------------------/
    /-    v1.0.2
    /-       JC Helas
    /-
    /-   Description:
    /-       Releases sa tons of lightning ball that will spread
    /-       above and attack near enemy.
    /-
    /-   How to Import:
    /-       1. Goto File>Preferences>General
    /-       2. Mark check the "Automatically create unknown varaibles while pasting data.
    /-       3. Copy the imported dummy.mdx and the custom locust object
    /-       4. Then copy the folder and paste on your map.
    /-
    /-    The spell does not require any libraries.
    /-
    /-----------------------------------------------------------------------------------*/

    {
        private
        {
            /*- Determine the ability ID of Re'ammin's Child -*/
            constant integer SPELL_ID = 'A000'                                            ;
            /*- Determine the dummy id -*/
            constant integer DUM_ID   = 'u000'                                            ;
            /*- Determine the base amount of balls -*/
            constant integer BALL_AMT = 13                                                ;
            /*- Determine the addtional amount of balls  per level -*/
            constant integer BALL_AMTL= 2                                                 ;
            /*- Determine the base duration of balls -*/
            constant real BALL_DUR    = 10.0                                              ;
            /*- Determine the addtional duration of balls per level -*/
            constant real BALL_DURLVL = 5.0                                               ;
            /*- Determine the base attack interval of balls -*/
            constant real BALL_INTER  = 1.25                                              ;
            /*- Determine the deductional attack interval of balls per level -*/
            constant real BALL_INTERLV= 0.125                                             ;
            /*- Determine the minimum damage of balls -*/
            constant real DAMAGE_MIN  = 30.0                                              ;
            /*- Determine the maximum damage of balls -*/
            constant real DAMAGE_MAX  = 75.0                                              ;
            /*- Determine the additonal damage of ball by caster int percent -*/
            constant real DAMAGE_INT  = 15.0                                              ;
            /*- Determine the duration of lightnings -*/
            constant real LIGHTNING_D = 0.25                                              ;
            /*- Determine the affect of area per lightning strike as well as the drop impact -*/
            constant real DAMAGE_AOE  = 100.0                                             ;
            /*- Determine the search target of each balls -*/
            constant real SEARCH_AOE  = 300.0                                             ;
            /*- Determine the speed of balls to there distination -*/
            constant real SPEED       = 5.0                                               ;
            /*- Determine the speed  of dropping balls -*/
            constant real SPEED_DROP  = 15.0                                              ;
            /*- Determine the maximum distance of some balls may traveled -*/
            constant real DISTANCE    = 300.0                                             ;
            /*- Determine the minimum height of each ball may post -*/
            constant real MIN_Z       = 100.0                                             ;
            /*- Determine the maximum height of each ball may post -*/
            constant real MAX_Z       = 700.0                                             ;
            /*- Determine the starting size of balls -*/
            constant real MIN_SIZE    = 0.10                                              ;
            /*- Determine the maximum size of balls -*/
            constant real MAX_SIZE    = 2.0                                               ;
            /*- Determine the starting distance of ball to caster -*/
            constant real SUMMON_DIST = 50.0                                              ;
            /*- Determine the attack type of each damage -*/
            constant attacktype A_TYPE= ATTACK_TYPE_MAGIC                                 ;
            /*- Determine the damage type of each damage -*/
            constant damagetype D_TYPE= DAMAGE_TYPE_NORMAL                                ;
            /*- Determine the owner of dummies -*/
            constant player DUM_OWNER = Player(PLAYER_NEUTRAL_PASSIVE)                    ;
            /*- Determine the model attachment of ball model to dummy -*/
            constant string BALL_ATCH = "origin"                                          ;
            /*- Determine the model of balls -*/
            constant string BALL_MODEL= "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl";
            /*- Determine the effect for the caster upon using the spell -*/
            constant string CASTER_FX = "Abilities\\Spells\\Orc\\Purge\\PurgeBuffTarget.mdl";
            /*- Determine the lightning scar effect -*/
            constant string GROUND_FX = "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl";
            /*- Determine the type of lightning -*/
            constant string LIGHTNING = "CLPB"                                            ;
           
            struct data
            {
                player owner;
                unit caster,dummy;
                real angle,rate,speed,dur,interval,inte,dx,dy,dist,z,dmgint;
                effect fx;
                lightning l;
            }
           
            struct lightningdata
            {
                lightning l;
                real d;
            }
           
            constant real periodic=0.031250;
            constant group grp=CreateGroup();
            constant timer tmr=CreateTimer();
            integer ix=0;
            integer ic[];
            data link=0;
           
            constant timer ltmr=CreateTimer();
            integer lix=0;
            integer lic[];
           
            //! textmacro Destroy takes NAME,IX,IC,THIS,TMR
            function Destroy$NAME$(integer i) -> integer
            {
                $THIS$ this=$IC$[i];
                $THIS$.destroy(this);
                $IC$[i]=$IC$[$IX$];
                $IX$=$IX$-1;
                if($IX$==0)
                {
                    PauseTimer($TMR$);
                }
                return i-1;
            }
            //! endtextmacro
            //! textmacro Create takes NAME,IX,IC,THIS,TMR,CODE
            function Create$NAME$() -> $THIS$
            {
                $THIS$ this=$THIS$.create();
                $IX$+=1;
                $IC$[$IX$]=this;
                if($IX$==1)
                {
                    TimerStart($TMR$,periodic,true,$CODE$);
                }
                return this;
            }
            //! endtextmacro
           
            function onFilter(unit t,player p) -> boolean
            {
                return UnitAlive(t) &&
                !IsUnitType(t,UNIT_TYPE_MAGIC_IMMUNE) &&
                !IsUnitType(t,UNIT_TYPE_STRUCTURE) &&
                !IsUnitAlly(t,p);
            }
            //! runtextmacro Destroy("Light","lix","lic","lightningdata","ltmr")
            function onLightningLoop()
            {
                integer i=1;
                real r;
                lightningdata this;
                while(i<=lix)
                {
                    this=lic[i];
                    this.d=this.d-periodic;
                    if(this.d>0)
                    {
                        r=(1.0/LIGHTNING_D)*this.d;
                        SetLightningColor(this.l,r,r,r,r);
                    }
                    else
                    {
                        i=DestroyLight(i);
                    }
                    i+=1;
                }
            }
            //! runtextmacro Create("Light","lix","lic","lightningdata","ltmr","function onLightningLoop")
            function onLightning(lightning l,real d)
            {
                lightningdata this=CreateLight();
                this.l=l;
                this.d=d;
            }
            //! runtextmacro Destroy("Data","ix","ic","data","tmr")
            function onLoop()
            {
                data this;
                integer i=1;
                real x,y,s,sin;
                unit t;
                while(i<=ix)
                {
                    this=ic[i];
                    x=this.dx;
                    y=this.dy;
                    if(this.rate<100.0)
                    {
                        this.rate=this.rate+this.speed;
                        sin=Sin(((90.0/100.0)*this.rate)*bj_DEGTORAD);
                        s=(sin*MAX_SIZE);
                        x=x+(sin*this.dist)*Cos(this.angle*bj_DEGTORAD);
                        y=y+(sin*this.dist)*Sin(this.angle*bj_DEGTORAD);
                        SetUnitFlyHeight(this.dummy,sin*this.z,0.0);
                        SetUnitScale(this.dummy,s,s,s);
                        SetUnitX(this.dummy,x);
                        SetUnitY(this.dummy,y);
                    }
                    else
                    {
                        this.dur=this.dur-periodic;
                        if(this.dur>0.0)
                        {
                            this.inte=this.inte-periodic;
                            if(this.inte<=0)
                            {
                                this.inte=this.interval;
                                link=this;
                                GroupEnumUnitsInRange(grp,x,y,SEARCH_AOE,Filter(function()
                                {
                                    unit t=GetFilterUnit();
                                    real x,y;
                                    if(onFilter(t,link.owner))
                                    {
                                        x=GetUnitX(t);y=GetUnitY(t);
                                        UnitDamagePoint(link.caster,0.0,DAMAGE_AOE,x,y,GetRandomReal(DAMAGE_MIN,DAMAGE_MAX)+link.dmgint,true,true,A_TYPE,D_TYPE,null);
                                        DestroyEffect(AddSpecialEffect(GROUND_FX,x,y));
                                        MoveLightningEx(link.l,false,GetUnitX(link.dummy),GetUnitY(link.dummy),GetUnitFlyHeight(link.dummy),x,y,GetUnitFlyHeight(t));
                                        onLightning(link.l,LIGHTNING_D);
                                        GroupClear(grp);
                                    }
                                }));
                                GroupClear(grp);
                            }
                        }
                        else
                        {
                            this.z=this.z-SPEED_DROP;
                            SetUnitFlyHeight(this.dummy,this.z,0.0);
                            if(this.z<=0.0)
                            {
                                x=GetUnitX(this.dummy);y=GetUnitY(this.dummy);
                                link=this;
                                GroupEnumUnitsInRange(grp,x,y,DAMAGE_AOE,Filter(function()
                                {
                                    unit t=GetFilterUnit();
                                    if(onFilter(t,link.owner))
                                    {
                                        UnitDamageTarget(link.caster,t,GetRandomReal(DAMAGE_MIN,DAMAGE_MAX)+link.dmgint,true,true,A_TYPE,D_TYPE,null);
                                    }
                                }));
                                DestroyEffect(AddSpecialEffect(GROUND_FX,x,y));
                                GroupClear(grp);
                                DestroyEffect(this.fx);
                                DestroyLightning(this.l);
                                KillUnit(this.dummy);
                                this.caster=null;
                                this.dummy=null;
                                this.owner=null;
                                i=DestroyData(i);
                            }
                        }
                    }
                    i+=1;
                }
            }
            //! runtextmacro Create("Data","ix","ic","data","tmr","function onLoop")
            function onCast() -> boolean
            {
                unit u;
                player p;
                real x1,y1,x2,y2,a,d,inter,dmg;
                integer i,lvl;
                data this;
                if(GetSpellAbilityId()==SPELL_ID)
                {
                    u=GetTriggerUnit();
                    p=GetOwningPlayer(u);
                    lvl=GetUnitAbilityLevel(u,SPELL_ID);
                    i=BALL_AMT+(BALL_AMTL*lvl);
                    d=BALL_DUR+(BALL_DURLVL*lvl);
                    inter=BALL_INTER-(BALL_INTERLV*lvl);
                    if(IsUnitType(u,UNIT_TYPE_HERO))
                    {
                        dmg=(GetHeroInt(u,true)/100.0)*DAMAGE_INT;
                    }
                    else
                    {
                        dmg=DAMAGE_INT;
                    }
                    x1=GetUnitX(u);
                    y1=GetUnitY(u);
                    DestroyEffect(AddSpecialEffectTarget(CASTER_FX,u,BALL_ATCH));
                    a=360.0/i;
                    while(i>0)
                    {
                        x2=x1+SUMMON_DIST*Cos((a*i)*bj_DEGTORAD);
                        y2=y1+SUMMON_DIST*Sin((a*i)*bj_DEGTORAD);
                        this=CreateData();
                        this.dx=x2;
                        this.dy=y2;
                        this.dur=d;
                        this.rate=0.0;
                        this.dmgint=dmg;
                        this.interval=inter;
                        this.inte=GetRandomReal(0.125,inter);
                        this.speed=(100.0/DISTANCE)*SPEED;
                        this.angle=a*i;
                        this.caster=u;
                        this.owner=p;
                        this.dummy=CreateUnit(DUM_OWNER,DUM_ID,x2,y2,a*i);
                        this.fx=AddSpecialEffectTarget(BALL_MODEL,this.dummy,BALL_ATCH);
                        this.l=AddLightningEx(LIGHTNING,false,0,0,0,0,0,0);
                        SetLightningColor(this.l,1,1,1,0);
                        SetUnitScale(this.dummy,MIN_SIZE,MIN_SIZE,MIN_SIZE);
                        UnitAddAbility(this.dummy,'Amrf');UnitRemoveAbility(this.dummy,'Amrf');
                        this.dist=GetRandomReal(1.0,DISTANCE);
                        this.z=GetRandomReal(MIN_Z,MAX_Z);
                        i-=1;
                    }
                    u=null;
                }
                return false;
            }
           
            function onInit()
            {
                trigger t=CreateTrigger();
                integer i=0;
                while(i<=11)
                {
                    TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null);
                    i+=1;
                }
                TriggerAddCondition(t,Filter(function onCast));
                t=null;
            }
        }
    }
   
//! endzinc
//TESH.scrollpos=24
//TESH.alwaysfold=0
/**************************************************************
*
*   RegisterPlayerUnitEvent
*   v5.1.0.1
*   By Magtheridon96
*
*   I would like to give a special thanks to Bribe, azlier
*   and BBQ for improving this library. For modularity, it only
*   supports player unit events.
*
*   Functions passed to RegisterPlayerUnitEvent must either
*   return a boolean (false) or nothing. (Which is a Pro)
*
*   Warning:
*   --------
*
*       - Don't use TriggerSleepAction inside registered code.
*       - Don't destroy a trigger unless you really know what you're doing.
*
*   API:
*   ----
*
*       - function RegisterPlayerUnitEvent takes playerunitevent whichEvent, code whichFunction returns nothing
*           - Registers code that will execute when an event fires.
*       - function RegisterPlayerUnitEventForPlayer takes playerunitevent whichEvent, code whichFunction, player whichPlayer returns nothing
*           - Registers code that will execute when an event fires for a certain player.
*       - function GetPlayerUnitEventTrigger takes playerunitevent whichEvent returns trigger
*           - Returns the trigger corresponding to ALL functions of a playerunitevent.
*
**************************************************************/

library RegisterPlayerUnitEvent // Special Thanks to Bribe and azlier
    globals
        private trigger array t
    endglobals
   
    function RegisterPlayerUnitEvent takes playerunitevent p, code c returns nothing
        local integer i = GetHandleId(p)
        local integer k = 15
        if t[i] == null then
            set t[i] = CreateTrigger()
            loop
                call TriggerRegisterPlayerUnitEvent(t[i], Player(k), p, null)
                exitwhen k == 0
                set k = k - 1
            endloop
        endif
        call TriggerAddCondition(t[i], Filter(c))
    endfunction
   
    function RegisterPlayerUnitEventForPlayer takes playerunitevent p, code c, player pl returns nothing
        local integer i = 16 * GetHandleId(p) + GetPlayerId(pl)
        if t[i] == null then
            set t[i] = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(t[i], pl, p, null)
        endif
        call TriggerAddCondition(t[i], Filter(c))
    endfunction
   
    function GetPlayerUnitEventTrigger takes playerunitevent p returns trigger
        return t[GetHandleId(p)]
    endfunction
endlibrary
//TESH.scrollpos=60
//TESH.alwaysfold=0
struct test
    private static constant integer Creeps_Amount = 5
    private static constant real Revive_Duration = 2.0
    private static constant real Periodic = 0.031250
    private static constant timer tmr = CreateTimer()
    private static integer ix = 0
    private static integer array ic
    private unit u
    private real d
    private static method onLoop takes nothing returns nothing
        local thistype this
        local integer i=1
        local real x
        local real y
        local real a
        loop
            exitwhen i>ix
            set this=ic[i]
            set d=d-Periodic
            if d<=0.0 then
                set x=GetStartLocationX(0)
                set y=GetStartLocationY(0)
                if IsUnitType(u,UNIT_TYPE_HERO) then
                    call ReviveHero(u,x,y,true)
                else
                    set a=GetRandomReal(0,360)
                    call CreateUnit(GetOwningPlayer(u),GetUnitTypeId(u),x+800*Cos(a*bj_DEGTORAD),y+800*Sin(a*bj_DEGTORAD),a)
                    call RemoveUnit(u)
                endif
                set u=null
                call deallocate()
                set ic[i]=ic[ix]
                set ix=ix-1
                set i=i-1
                if ix==0 then
                    call PauseTimer(tmr)
                endif
            endif
            set i=i+1
        endloop
    endmethod
    private static method onDeath takes nothing returns nothing
        local thistype this
        local unit u=GetTriggerUnit()
        if GetUnitAbilityLevel(u,'Aloc')==0 and not IsUnitType(u,UNIT_TYPE_SUMMONED) then
            set this=allocate()
            set ix=ix+1
            set ic[ix]=this
            set .u=u
            set d=Revive_Duration
            if ix==1 then
                call TimerStart(tmr,Periodic,true,function thistype.onLoop)
            endif
        endif
    endmethod
    private static method onInit takes nothing returns nothing
        local real x=GetStartLocationX(0)
        local real y=GetStartLocationY(0)
        local integer i=1
        local player p=Player(0)
        call CreateUnit(p,'Hblm',x,y,GetRandomReal(0,360))
        call CreateItem('ciri',x,y)
        set p=Player(PLAYER_NEUTRAL_AGGRESSIVE)
        loop
            exitwhen i>Creeps_Amount
            call CreateItem('ciri',x,y)
            call CreateUnit(p,ChooseRandomCreep(GetRandomInt(1,5)),x+800*Cos(0*bj_DEGTORAD),y+800*Sin(0*bj_DEGTORAD),GetRandomReal(1,360))
            call CreateUnit(p,ChooseRandomCreep(GetRandomInt(1,5)),x+800*Cos(90*bj_DEGTORAD),y+800*Sin(90*bj_DEGTORAD),GetRandomReal(1,360))
            call CreateUnit(p,ChooseRandomCreep(GetRandomInt(1,5)),x+800*Cos(180*bj_DEGTORAD),y+800*Sin(180*bj_DEGTORAD),GetRandomReal(1,360))
            call CreateUnit(p,ChooseRandomCreep(GetRandomInt(1,5)),x+800*Cos(270*bj_DEGTORAD),y+800*Sin(270*bj_DEGTORAD),GetRandomReal(1,360))
            set i=i+1
        endloop
        call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_DEATH,function thistype.onDeath)
        set p=null
    endmethod
endstruct