1. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  2. Head to the 33rd Modeling Contest Poll and drink to your heart's desire.
    Dismiss Notice
  3. Choose your means of doom in the 17th Mini Mapping Contest Poll.
    Dismiss Notice
  4. A slave to two rhythms, the 22nd Terraining Contest is here.
    Dismiss Notice
  5. The heavens smile on the old faithful. The 16th Techtree Contest has begun.
    Dismiss Notice
  6. The die is cast - the 6th Melee Mapping Contest results have been announced. Onward to the Hive Cup!
    Dismiss Notice
  7. The glory of the 20th Icon Contest is yours for the taking!
    Dismiss Notice
  8. 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.

Re`ammin's Child v1.0.1

Submitted by JC Helas
This bundle is marked as pending. It has not been reviewed by a staff member yet.

Re'ammin's Child



Credits


Requires


Changelogs


Code

Code (vJASS):

native UnitAlive takes unit id returns boolean//Remove this if you already had one
//! zinc
    library ReAmminsChild
    /*-----------------------------------------------------------------------------------/
    /-    v1.0.1
    /-       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
 

Previews
Contents

Re'ammin's Child v1.0.1 (Map)