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 havn't received your rank award? Then please contact the administration.
    Dismiss Notice
  4. We have recently started the 16th edition of the Mini Mapping Contest. The theme is mini RPG. Do check it out and have fun.
    Dismiss Notice
  5. Dismiss Notice
  6. The Highway to Hell has been laid open. Come along and participate in the 5th Special Effect Contest.
    Dismiss Notice
  7. 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)