• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Blood Frenzy v1.5d

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

BLOOD FRENZY


Credits

Systems
-Nestharus
-Magtheridon96
-Bribe

Requires

Systems
-CTL
-World Bounds
-RegisterPlayerUnit
-SpelEffectEvent

Changelogs

v1.0
-Upload
v1.1
-Fix Indexting
v1.2
-A little fix
v1.3
-Fix ability description
v1.4
-Fix some triggers
v1.5
-Remove configure boolean
-Add configure description
-Add periodic condion, if target dead end the periodic
-Remove caster collision
-Remove the action, null target and caster
-Arrange the ITE of periodic
-Change caster moving by x and y
v1.5c
-Enhance Performance
-Change to vJass
v1.5d
-Prevent enter out bounds
-Fix z


JASS:
scope BloodFrenzy
        /*************************************************************************************************************
        *   v1.5d
        *       by JC Helas
        *
        *   Description:
        *       Execute a series of lightening-fast at attack on a single target.
        *
        *   Requires:
        *       CTL and WorldBounds - Nestharus
        *       RegisterPlayerUnit - Magtheridon96
        *       SpelEffectEvent - Bribe
        *
        *   How to Import:
        *       - Open File\Preferences and enable "Automatically creates unknown variables while pasting trigger data".
        *       - Copy This Folder.
        *       - And dont forget to copy the objects.
        *       - Then Done!!!
        *    
        ************************************************************************************************************/
    globals
        /********************************************************/
        /*                                                      */
        /*                  CONFIGURES                          */
        /*                                                      */
        /********************************************************/
        /* Determine the ability ID of spell.                   */
        /* In getting the data of an ability at object editor   */
        /* you have to press CTRL+D and simply click back to    */
        /* return on normal view.                               */
        private constant integer    ABILITY_ID           = 'A000'
        /********************************************************/
        /* Determine the base amount of slash.                  */
        /* Each slash has random angle also but if the target   */
        /* caster will change target if an enemy is near        */
        /* but if no one, then the series will stop.            */
        private constant integer    SLASH_BASE           = 3
        /********************************************************/
        /* Determine the additional amount of slash per level.  */
        /* Each level of ability will increase the slash amount */
        /* by this integer. BASE + ( THIS * Level of Ability )  */
        private constant integer    SLASH_LVL            = 2
        /********************************************************/
        /* Determine the base amount of damage.                 */
        /* Damage happens when in each slash ends.              */
        private constant real       DAMAGE_BASE          = 25.0
        /********************************************************/
        /* Determine the additional amount damage per level.    */
        /* Each level of ability will increase the amount of    */
        /* damage by this real. BASE + ( THIS * LEVEL )         */
        private constant real       DAMAGE_LVL           = 25.0
        /********************************************************/
        /* Determine the forward speed of caster.               */
        /* This must lower than DISTANCE_START or else the spell*/
        /* will play unpleasing, im very sorry if im not able   */
        /* to change this into matrix.                          */
        private constant real       SPEED_FORWARD        = 50.0
        /********************************************************/
        /* Determine the starting distance of caster to target  */
        /* per slash.                                           */
        private constant real       DISTANCE_START       = 300.0
        /********************************************************/
        /* Determine the distance search of enemy when target   */
        /* is dead.                                             */
        private constant real       NEXT_TARGET_SEARCH   = 600.0
        /********************************************************/
        /* Determine the default alpha of caster.               */
        /* This will be the alpha vertex of caster after        */
        /* finishing a series.                                  */
        private constant integer    CASTER_APLHA_DEFAULT = 255
        /********************************************************/
        /* Determine the starting alpha of caster               */
        /* in each slash.                                       */
        private constant integer    CASTER_APLHA_START   = 255
        /********************************************************/
        /* Determine the ending alpha of caster in each slash.  */
        private constant integer    CASTER_APLHA_END     = 0
        /********************************************************/
        /* Determine the animation of caster in each slash.     */
        /* In order to get the unit index move you have         */
        /* test them with the native function which is          */
        /* SetUnitAnimationByIndex(WhichUnit,Index of Animation)*/
        private constant integer    SLASH_ANIMATION_INDEX= 6
        /********************************************************/
        /* Determine the animation speed of caster              */
        /* in each slash.                                       */
        private constant real       SLASH_ANIMATION_SPEED= 2.5
        /********************************************************/
        /* Determine the attack type of damaging                */
        /* in all slash.                                        */
        private constant attacktype ATTACK_TYPE          = ATTACK_TYPE_NORMAL
        /********************************************************/
        /* Determine the damage type of damaging                */
        /* in all slash.                                        */
        private constant damagetype DAMAGE_TYPE          = DAMAGE_TYPE_NORMAL
        /********************************************************/
        /* Determine the weapon type of damaging                */
        /* in all slash.                                        */
        private constant weapontype WEAPON_TYPE          = null
        /********************************************************/
        /* Determine the hit effect for target                  */
        /* in each slash.                                       */
        private constant string     HIT_EFFECT           = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl"
        /********************************************************/
        /* Determine the HIT_EFFECT attachment location         */
        /* for target.                                          */
        private constant string     TARGET_ATTACH        = "origin"
        /********************************************************/
        /* Determine the effect for caster                      */
        /* in each slash.                                       */
        private constant string     CASTER_EFFECT        = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl"
        /********************************************************/
        /* Determine the CASTER_EFFECT attachement location     */
        /* for caster.                                          */
        private constant string     CASTER_ATTACH        = "origin"
        /********************************************************/
        /* Determine the type of lightning.                     */
        private constant string     LIGHTNIG_TYPE        = "CLPB"
        /*                                                      */
        /*             END OF CONFIGURES                        */
        /*                                                      */
        /********************************************************/
    endglobals
   
    native UnitAlive takes unit u returns boolean
   
    private function Slash takes integer lvl returns integer
        return SLASH_BASE+(SLASH_LVL*lvl)
    endfunction
   
    private function Damage takes integer lvl returns real
        return DAMAGE_BASE+(DAMAGE_LVL*lvl)
    endfunction
   
    private function Filter takes unit t,player p returns boolean
        return UnitAlive(t) and not(IsUnitType(t,UNIT_TYPE_MAGIC_IMMUNE)) and not(IsUnitType(t,UNIT_TYPE_STRUCTURE)) and not(IsUnitAlly(t,p))
    endfunction
   
    private function Fly takes unit u returns boolean
        return UnitAddAbility(u,'Amrf') and UnitRemoveAbility(u,'Amrf')
    endfunction
   
    private function CheckXY takes real x,real y returns boolean
        return x<WorldBounds.maxX and x>WorldBounds.minX and y<WorldBounds.maxY and y>WorldBounds.minY
    endfunction
   
    private struct spell
        integer count
        player owner
        lightning l
        unit caster
        unit target
        real angle
        real dist
        real dmg
        real xs
        real ys
        real zs
       
        static constant real pendist=DISTANCE_START*2
        static constant group grp=CreateGroup()
        static integer ix=0
        static integer array ic
        implement CTL
            local integer i=1
            local real rate
            local real xc
            local real yc
            local real xt
            local real yt
            local real z
        implement CTLExpire
            loop
                exitwhen i>ix
                set this=ic[i]
                if count>0 and UnitAlive(caster) and target!=null then
                    set xt=GetUnitX(target)
                    set yt=GetUnitY(target)
                    if dist<pendist then
                        set dist=dist+SPEED_FORWARD
                        set rate=(1.0/pendist)*dist
                        set xc=xt-DISTANCE_START*Cos(angle*bj_DEGTORAD)
                        set yc=yt-DISTANCE_START*Sin(angle*bj_DEGTORAD)
                        set xc=xc+dist*Cos(angle*bj_DEGTORAD)
                        set yc=yc+dist*Sin(angle*bj_DEGTORAD)
                        set z=GetUnitFlyHeight(target)
                        if CheckXY(xc,yc) then
                            call SetUnitX(caster,xc)
                            call SetUnitY(caster,yc)
                        endif
                        call SetUnitFacing(caster,angle)
                        call SetUnitFlyHeight(caster,z,0.0)
                        call SetUnitVertexColor(caster,255,255,255,R2I(CASTER_APLHA_START*(1.0-rate))+CASTER_APLHA_END)
                        if dist<=DISTANCE_START then
                            call MoveLightningEx(l,false,xc,yc,z,xt,yt,z)
                            call SetLightningColor(l,1,1,1,1-(rate*2.0))
                        endif
                    else
                        call UnitDamageTarget(caster,target,dmg,true,true,ATTACK_TYPE,DAMAGE_TYPE,WEAPON_TYPE)
                        call DestroyEffect(AddSpecialEffectTarget(CASTER_EFFECT,caster,CASTER_ATTACH))
                        call DestroyEffect(AddSpecialEffectTarget(HIT_EFFECT,target,TARGET_ATTACH))
                        call SetUnitAnimationByIndex(caster,SLASH_ANIMATION_INDEX)
                        set angle=angle+GetRandomReal(-180.0,180.0)
                        if angle<0 then
                            set angle=angle+360.0
                        endif
                        set dist=0.0
                        set count=count-1
                        if count>0 and not(UnitAlive(target)) then
                            call GroupEnumUnitsInRange(grp,xt,yt,NEXT_TARGET_SEARCH,null)
                            loop
                                set target=FirstOfGroup(grp)
                                exitwhen target==null or Filter(target,owner)
                                call GroupRemoveUnit(grp,target)
                            endloop
                            call GroupClear(grp)
                            if target==null then
                                set count=0
                            elseif GetUnitFlyHeight(target)>0.0 and Fly(caster) then
                            endif
                        endif
                    endif
                else
                    call SetUnitVertexColor(caster,255,255,255,CASTER_APLHA_DEFAULT)
                    call SetUnitPosition(caster,xs,ys)
                    call SetUnitFlyHeight(caster,zs,0)
                    call SetUnitTimeScale(caster,1.0)
                    call SetUnitPathing(caster,true)
                    call DestroyLightning(l)
                    set i=DeIndex(i)
                endif
                set i=i+1
            endloop
        implement CTLEnd
       
        private static method DeIndex takes integer i returns integer
            local spell this=ic[i]
            call destroy()
            set ic[i]=ic[ix]
            set ix=ix-1
            return i-1
        endmethod
       
        private static method Index takes nothing returns spell
            local spell this=create()
            set ix=ix+1
            set ic[ix]=this
            return this
        endmethod
       
        private static method onCast takes nothing returns nothing
            local spell this
            local unit t=GetSpellTargetUnit()
            local unit c=GetTriggerUnit()
            local player p=GetOwningPlayer(c)
            local integer lvl
            local real z
            if Filter(t,p) then
                set lvl=GetUnitAbilityLevel(c,ABILITY_ID)
                set this=Index()
                set caster=c
                set target=t
                set owner=p
                set angle=GetRandomReal(0.0,360.0)
                set dist=0.0
                set xs=GetUnitX(c)
                set ys=GetUnitY(c)
                set zs=GetUnitFlyHeight(c)
                set z=GetUnitFlyHeight(t)
                set count=Slash(lvl)
                set dmg=Damage(lvl)
                set l=AddLightningEx(LIGHTNIG_TYPE,false,xs,ys,zs,GetUnitX(target),GetUnitY(target),z)
                call DestroyEffect(AddSpecialEffectTarget(CASTER_EFFECT,caster,CASTER_ATTACH))
                call SetUnitAnimationByIndex(caster,SLASH_ANIMATION_INDEX)
                call SetUnitTimeScale(caster,SLASH_ANIMATION_SPEED)
                call SetUnitPathing(caster,false)
                if z>0.0 and Fly(c) then
                endif
            endif
        endmethod
       
        private static method onInit takes nothing returns nothing
            call RegisterSpellEffectEvent(ABILITY_ID,function thistype.onCast)
        endmethod
    endstruct
endscope
Previews
Contents

Blood Frenzy v1.5d (Map)

A somewhat spastic spazzle of lightning suddenly strikes unsuspecting fools, the lot of them. In his fury, the
caster cannot help but to lash out at the world, imaginary blood and guts spilling out as the caster lunges his body
towards his unwitting victims.

Derived from the original concept that also inspired the modern Omnislash (and its variants) in MOBAs, this spell
will surely be a zappy inclusion to a slew of heroes and units alike, especially agile blademasters and lightning-based
spell casters.
 
Top