• 🏆 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!

Old Spell Giveaway

Status
Not open for further replies.
Days ago, I found this 3-year old resource of mine which I have forgotten to upload. I don't have things to do so I fixed it and now it works. The spell was inspired from Tank's Enchancted Fire Bolt and his another spell with spinning phoenix missile(forgot the name).

JASS:
//********************************************************************************************
//*
//*
//*                             SUPERNOVA version 1.0
//*
//*                           made by RADAMANTUS a.k.a ALMIA
//*
//*
//********************************************************************************************
//*
//* TOOLTIP:
//*
//* Summons a red star on the targeted point,the red star then explodes after 2 seconds
//* releasing 12 meteorites per layer outward the star's point.Each meteorite deals 15/30/45
//* damage and the explosion has 5 layers.Each layer has a distance of 100 x the layer number
//* from the star.
//*
//********************************************************************************************
//*
//* HOW TO IMPORT?
//*
//* 1)Import the dummy and its model
//* 2)Import the ability
//* 3)If you want,import the sun model
//* 4)Copy the code
//* 5)Create this variables:
//*   - udg_SN_Hash
//*   - udg_SN_Group
//*   - udg_SN_Loop
//* 6)Enjoy!
//*
//********************************************************************************************
//*
//* CREDITS
//*
//* - Vexorian for the dummy.mdx(also for Anitarf and Infrane)
//* - WILL THE ALMIGHTY for the sun model
//*
//********************************************************************************************
//* CONSTANT FUNCTIONS
//*
//* Configuration of the spell
//*
//********************************************************************************************

//Loop Value

constant function SN_Interval takes nothing returns real
    return 0.03125
endfunction

// Rawcode of the ability

constant function SN_Abil takes nothing returns integer
    return 'A000'
endfunction

//Rawcode of the dummy

constant function SN_Dummy takes nothing returns integer
    return 'h000'
endfunction

//Model of the star
//Credits to WILL THE ALMIGHTY for the model

constant function SN_Starmdl takes nothing returns string
    return "war3mapImported\\Sun.mdx"
endfunction

//Model of the meteorites

constant function SN_Meteormdl takes nothing returns string
    return "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl"
    //return "war3mapImported\\Sun.mdx"
endfunction

//Model of the ministars

constant function SN_Minimdl takes nothing returns string
    return "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl"
    //return "war3mapImported\\Sun.mdx"
endfunction

//Scale of the star

constant function SN_Starscale takes nothing returns real
    return 1.
endfunction

//Scale of the meteorites a.k.a segments

constant function SN_Meteorscale takes nothing returns real
    return 0.25
endfunction

//Scale of the mini-stars

constant function SN_Miniscale takes nothing returns real
    return 2.
endfunction

//Life Time of the Star

constant function SN_Duration takes nothing returns real
    return 2.
endfunction

//Flyheight of the Star

constant function SN_StarZ takes nothing returns real
    return 100.
endfunction

//FlyHeight of the mini-stars
constant function SN_MinistarZ takes nothing returns real
    return 100.
endfunction

//Damage done by the explosion

constant function SN_ExpDam takes nothing returns real
    return 15.
endfunction
//AoE of Damage

constant function SN_Radius takes nothing returns real
    return 150.
endfunction

//Number of segments per layer

constant function SN_SegPerLayer takes nothing returns integer
    return 12
endfunction

//Number of layers

constant function SN_Layer takes nothing returns integer
    return 5
endfunction

//Distance per layer

constant function SN_LayerThick takes nothing returns real
    return 100.
endfunction

//Height of the segment

constant function SN_ArcHeight takes nothing returns real
    return 1.
endfunction

//Speed of the segment to reach their locations

constant function SN_Speed takes nothing returns real
    return 250.
endfunction

//Number of mini-stars spinning the star

constant function SN_StarNo takes nothing returns integer
    return 12
endfunction

//Speed of the mini-stars spinning

constant function SN_SpinSpeed takes nothing returns real
    return 90.
endfunction

//Starting distance of the mini-stars

constant function SN_StartDist takes nothing returns real
    return 500.
endfunction

//Time for the mini-stars to spin

constant function SN_SpinTime takes nothing returns real
    return SN_Duration()
endfunction

//Explosion SFX of the Star

constant function SN_ExpSFX takes nothing returns string
    return "Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl"
endfunction

//Explosion SFX of the segments

constant function SN_SegSFX takes nothing returns string
    return "Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl"
endfunction

//Creation SFX of the mini-stars

constant function SN_SpawnSFX takes nothing returns string
    return "Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl"
endfunction
//********************************************************************************************
//*
//*                                   END OF CONFIGURATION
//*
//********************************************************************************************
//*
//*                                FORMULAS AND OTHER FUNCTIONS
//*
//********************************************************************************************

//Get Speed of the Segments

function SN_GetSegmentSpeed takes integer lvl returns real
    return SN_Speed() * SN_Interval()
endfunction

//Get Spin Speed of the mini-stars

function SN_GetSpinSpeed takes integer lvl returns real
    return SN_SpinSpeed() * SN_Interval()
endfunction

//Get Speed of the mini-stars

function SN_GetStarSpeed takes integer lvl returns real
    return  (SN_StartDist() / SN_SpinTime()) * SN_Interval()
endfunction

//Get Damage

function SN_GetDamage takes integer lvl returns real
    return SN_ExpDam() * I2R(lvl)
endfunction

//Get Parabola

function SN_GetParabola takes real d , real t returns real
    return ((( 4 * (SN_ArcHeight() * d) ) / d ) * (( d - t ) * ( t / d )))
endfunction

//Get Ability Level

function SN_GetLevel takes unit u returns integer
    return GetUnitAbilityLevel(u,SN_Abil())
endfunction

//Get Angle

function SN_GetAngle takes integer i returns real
    return (360 / I2R(SN_SegPerLayer())) * I2R(i)
endfunction

//Get Distance of Segment

function SN_GetDist takes integer i returns real
    return SN_LayerThick() * I2R(i)
endfunction

//AttackType and DamageType

function SN_AtkTyp takes nothing returns attacktype
    return ATTACK_TYPE_CHAOS
endfunction
function SN_DmgTyp takes nothing returns damagetype
    return DAMAGE_TYPE_DIVINE
endfunction

//********************************************************************************************
//*
//*                           UTILITIES FUNCTIONS
//*
//********************************************************************************************

//Move Dummies

function SN_Move takes unit u , real x , real y returns nothing
    call SetUnitX(u,x)
    call SetUnitY(u,y)
endfunction

//Move Segment

function SN_MoveSegment takes unit u , real dist , real angle returns nothing
    local real x = GetUnitX(u) + dist * Cos(angle * bj_DEGTORAD)
    local real y = GetUnitY(u) + dist * Sin(angle * bj_DEGTORAD)
    call SN_Move(u,x,y)
endfunction

//Move Stars

function SN_MoveStars takes unit u , unit c , real dist , real angle returns nothing
    local real x = GetUnitX(c) + dist * Cos(angle * bj_DEGTORAD)
    local real y = GetUnitY(c) + dist * Sin(angle * bj_DEGTORAD)
    call SetUnitFacing(u, angle + 90)
    call SN_Move(u,x,y)
endfunction

//Create Segments

function SN_CreateSegment takes player p,real x,real y,real angle returns unit
    set bj_lastCreatedUnit = CreateUnit(p,SN_Dummy(),x,y,angle)
    call SetUnitScale(bj_lastCreatedUnit,SN_Meteorscale(),0,0)
    return bj_lastCreatedUnit
endfunction

//Create mini-stars

function SN_CreateMinistar takes player p ,real x,real y,real angle returns unit
    set bj_lastCreatedUnit = CreateUnit(p,SN_Dummy(),x,y,angle + 90)
    call SetUnitFlyHeight(bj_lastCreatedUnit,SN_MinistarZ(),0)
    call SetUnitScale(bj_lastCreatedUnit,SN_Miniscale(),0,0)
    return bj_lastCreatedUnit
endfunction

//Creation of Segments for Loop

function SN_CreateSegments takes player p ,real x,real y,integer lvl returns nothing
    local integer i = 0
    local integer i2 = 0
    local real angle
    local real distance
    local unit u
    local integer ukey
    loop
        set i = i + 1
        set angle = SN_GetAngle(i)
        
        set i2 = 0
        loop
            set i2 = i2 + 1
            set distance = SN_GetDist(i2)
            set u = SN_CreateSegment(p,x,y,angle)
            set ukey = GetHandleId(u)
            call UnitAddAbility(u,SN_Abil())
            call SetUnitAbilityLevel(u,SN_Abil(),lvl)
            call SaveReal(udg_SN_Hash,ukey,3,angle)
            call SaveReal(udg_SN_Hash,ukey,2,distance)
            call SaveInteger(udg_SN_Hash,ukey,0,2)
            call SaveEffectHandle(udg_SN_Hash,ukey,1,AddSpecialEffectTarget(SN_Meteormdl(),u,"origin"))
            call GroupAddUnit(udg_SN_Group,u)
            exitwhen i2 == SN_Layer()
        endloop
        exitwhen i == SN_SegPerLayer()
    endloop
    set u = null
endfunction

//Creation of Ministars in Loop

function SN_CreateMinistars takes unit o,player p,real x,real y returns nothing
    local integer i = 0
    local unit u
    local real x2
    local real y2
    local integer ukey
    local real angle
    loop
        set i = i + 1
        set angle = SN_GetAngle(i)
        set x2 = x + SN_StartDist() * Cos(angle * bj_DEGTORAD)
        set y2 = y + SN_StartDist() * Sin(angle * bj_DEGTORAD)
        set u = SN_CreateMinistar(p,x2,y2,angle)
        set ukey = GetHandleId(u)
        call SaveReal(udg_SN_Hash, ukey, 2, SN_StartDist())
        call SaveReal(udg_SN_Hash,ukey,3,angle)
        call SaveUnitHandle(udg_SN_Hash,ukey,6,o)
        call SaveInteger(udg_SN_Hash,ukey,0,3)
        call SaveEffectHandle(udg_SN_Hash,ukey,1,AddSpecialEffectTarget(SN_Minimdl(),u,"origin"))
        call GroupAddUnit(udg_SN_Group,u)
        call DestroyEffect(AddSpecialEffect(SN_SpawnSFX(),x,y))
        exitwhen i == SN_StarNo()
    endloop
    set u = null
endfunction

//Filters

//Filter Enemy

function SN_FilterUnit takes unit u ,player p returns boolean
    return IsUnitEnemy(u,p) and not (IsUnitType(u,UNIT_TYPE_DEAD) or IsUnitType(u,UNIT_TYPE_STRUCTURE) or IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE))
endfunction


//********************************************************************************************
//*
//*                          SPELL FUNCTIONS
//*
//********************************************************************************************

//For Group function

function SN_ForGroup takes nothing returns nothing
    local unit u = GetEnumUnit()
    local integer ukey = GetHandleId(u)

    local player p
    local real angle 
    local real duration
    local real travelled
    local real dist 
    local unit o
    local integer groupid
    local integer lvl
    local real damage
    local effect model
    
    local real x
    local real y
    local real x2
    local real y2
    local group g = CreateGroup()
    local unit e
    local real speed
    
    //Set variables
    set groupid = LoadInteger(udg_SN_Hash,ukey,0)
    set dist = LoadReal(udg_SN_Hash,ukey,2)
    set angle = LoadReal(udg_SN_Hash,ukey,3)
    set duration = LoadReal(udg_SN_Hash,ukey,4)
    set travelled = LoadReal(udg_SN_Hash,ukey,5)
    set model = LoadEffectHandle(udg_SN_Hash,ukey,1)
    
    set o = LoadUnitHandle(udg_SN_Hash, ukey, 6)
    
    set p = GetOwningPlayer(u)
    set x = GetUnitX(u)
    set y = GetUnitY(u)
    
    set lvl = SN_GetLevel(u)
    //Filter group id
    
    //For Star
    if groupid == 1 then
        if duration < SN_Duration() then
            call SaveReal(udg_SN_Hash,ukey,4,duration + SN_Interval())
        else
            call SN_CreateSegments(p,x,y,lvl)
            call DestroyEffect(AddSpecialEffect(SN_ExpSFX(),x,y))
            call DestroyEffect(model)
            call FlushChildHashtable(udg_SN_Hash,ukey)
            call GroupRemoveUnit(udg_SN_Group,u)
            call KillUnit(u)
        endif
    //For Segment
    
    elseif groupid == 2 then
        set speed = SN_GetSegmentSpeed(lvl)
        if travelled < dist then
            call SN_MoveSegment(u,speed,angle)
            call SetUnitFlyHeight(u,SN_GetParabola(dist,travelled),0)
            call SaveReal(udg_SN_Hash,ukey,5,travelled + speed)
        else
            set damage = SN_GetDamage(lvl)
            call GroupEnumUnitsInRange(g,x,y,SN_Radius(),null)
            loop
                set e =FirstOfGroup(g)
                exitwhen e == null
                if SN_FilterUnit(e,p) then
                    call UnitDamageTarget(u,e,damage,false,false,SN_AtkTyp(),SN_DmgTyp(),null)
                endif
                call GroupRemoveUnit(g,e)
            endloop
            call DestroyEffect(AddSpecialEffect(SN_SegSFX(),x,y))
            call DestroyEffect(model)
            call FlushChildHashtable(udg_SN_Hash,ukey)
            call GroupRemoveUnit(udg_SN_Group,u)
            call KillUnit(u)
        endif
    
    //For Ministar
    elseif groupid == 3 then
        set x2 = GetUnitX(o)
        set y2 = GetUnitY(o)
        set dist = SquareRoot((x2 - x) * (x2 - x) + (y2 - y) * (y2 - y))
        if dist > 32 and o != null then
            set angle = angle + SN_GetSpinSpeed(lvl)
            call SN_MoveStars(u,o,dist - SN_GetStarSpeed(lvl),angle)
            call SaveReal(udg_SN_Hash,ukey,3,angle)
        else
            call DestroyEffect(model)
            call FlushChildHashtable(udg_SN_Hash,ukey)
            call GroupRemoveUnit(udg_SN_Group,u)
            call KillUnit(u)
        endif
    endif
    
    //Clean
    set u = null
    set g = null
    set model = null
    set p = null
    set o = null

endfunction
//Periodic

function SN_Periodic takes nothing returns nothing
    call ForGroup(udg_SN_Group,function SN_ForGroup)
endfunction

//Cast
function SN_Cast takes nothing returns boolean
    local real x
    local real y
    local player p
    local unit u
    local integer ukey
    local integer lvl
    local unit c
    
    if GetSpellAbilityId() == SN_Abil() then
        set c = GetTriggerUnit()
        set p = GetTriggerPlayer()
        set lvl = SN_GetLevel(c)
        set x = GetSpellTargetX()
        set y = GetSpellTargetY()
        set u = CreateUnit(p,SN_Dummy(),x,y,0)
        call SetUnitFlyHeight(u,SN_StarZ(),0)
        call SetUnitScale(u,SN_Starscale(),0,0)
        set ukey = GetHandleId(u)
        call SaveInteger(udg_SN_Hash,ukey,0,1)
        call SaveEffectHandle(udg_SN_Hash,ukey,1,AddSpecialEffectTarget(SN_Starmdl(),u,"origin"))
        call UnitAddAbility(u,SN_Abil())
        call SetUnitAbilityLevel(u,SN_Abil(),lvl)
        call GroupAddUnit(udg_SN_Group,u)
        call SN_CreateMinistars(u,p,x,y)
    endif
    set u = null
    return false
endfunction

//Initialization
function InitTrig_SuperNova takes nothing returns nothing
    set gg_trg_SuperNova = CreateTrigger()
    set udg_SN_Loop = CreateTrigger()
    set udg_SN_Hash = InitHashtable()
    set udg_SN_Group = CreateGroup()
    call TriggerAddCondition(gg_trg_SuperNova,Filter(function SN_Cast))
    call TriggerRegisterAnyUnitEventBJ(gg_trg_SuperNova,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerRegisterTimerEventPeriodic(udg_SN_Loop,SN_Interval())
    call TriggerAddAction(udg_SN_Loop,function SN_Periodic)
endfunction

attachment.php

I'm now giving this away, credit me ofc.

You can upload it, tho If the moderator rejects it because of it's old spell structure(it uses ForGroup :V) then i'm not the one to fix it :D

[edit]
Seriously, I like that Chain Saw effect. I don't know why I discover such odd special effects in warcraft :V (like my other spell with a drilling effect)
 

Attachments

  • SuperNova v1.0.w3x
    29.4 KB · Views: 42
  • giveaway.png
    giveaway.png
    1.8 MB · Views: 113
Status
Not open for further replies.
Top