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

Spells & Systems Mini-Contest #16

Status
Not open for further replies.
Level 15
Joined
Dec 18, 2007
Messages
1,098
The buff text is Red? As in the name? That means you based the buff off a negative buff I believe, if you base it off stuff like Rejuvenation, it would be green (I assume).
Anyways, I was too lazy to update my spell, mainly because I don't really have any idea how to get my new idea working.
Also, I can't wait for Man-Eating Plant to claim some victims :)
 
Level 16
Joined
Feb 22, 2006
Messages
960
so, i reworked the script of my spell and made a bit more efficient :D

here it is :)

JASS:
//==================================================================================
//==================================================================================
//===============================ROOTING==v,1,2=====================================
//==================================================================================
//===============================BY==xD,Schurke=====================================
//==================================================================================
scope rooting initializer rootInt
//=========CONSTANTS===============
globals
    //Dummy Rawcode
    private constant integer dummyid = 'h000'
    
    //Ability/Buff Rawcodes
    private constant integer spellid = 'A000' 
    private constant integer dummyspellone = 'A002'
    private constant integer dummyspelltwo = 'A003' 
    private constant integer dummyspellthree = 'A004'    
    private constant integer dummyspellfour = 'A005'
    private constant integer buffraw = 'B000'
    private constant integer buffoneraw = 'B002'
    private constant integer bufftworaw = 'B003'
    private constant integer timedlife = 'BTLF'   
    
    //Modelpaths
    private constant string sfxstring = "Abilities\\Spells\\NightElf\\EntanglingRoots\\EntanglingRootsTarget.mdl"
    private constant string sfxstringtwo = "Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl"
    private constant string sfxstringthree = "Objects\\Spawnmodels\\Undead\\UndeadLargeDeathExplode\\UndeadLargeDeathExplode.mdl"
    
    //attachment strings
    private constant string handright = "hand right"
    private constant string handleft = "hand left"
    private constant string chest = "chest"
    private constant string head = "head"
    private constant string origin = "origin"
    
    //IssueOrder strings
    private constant string ent ="entanglingroots"
    private constant string roar ="roar"
    private constant string soul = "soulburn"
    private constant string ens = "ensnare"
    
    
    //Timer Interval
    private constant real Interval = 0.01
endglobals
//========END=CONSTANTS============

private struct rootstruct
    unit caster //stores the caster
    unit target //stores the target
    real i = 0 //counter
    effect array sfx [5] //stores the effects
    timer t = CreateTimer()
    static method rootTimer takes nothing returns nothing
        local timer t = GetExpiredTimer() //timer
        local rootstruct Dat = GetHandleInt(t,"dat") //gets the struct
        local unit dummy //dummy var
        local effect sfx //non permanent special effect
        local unit u //for group reason
        local group g = CreateGroup() //for group reason
            set Dat.i = Dat.i + Interval //increases counter
            if GetUnitState(Dat.target,UNIT_STATE_LIFE) <= 0 then //part to check if the target is dead and if it's true, it will damage all nearby enemy units and roots them (loop is for goup selection etc.) also resets all things (struct,timer etc.)
                call PauseTimer(t)
                set sfx = AddSpecialEffect(sfxstringthree,GetUnitX(Dat.target),GetUnitY(Dat.target))
                call DestroyEffect(sfx)
                call GroupEnumUnitsInRange(g,GetUnitX(Dat.target),GetUnitY(Dat.target),200,null)
                loop
                    set u = FirstOfGroup(g)
                    exitwhen u == null
                    if IsUnitEnemy(u,GetOwningPlayer(Dat.caster)) and GetUnitState(u,UNIT_STATE_LIFE) > 0 and IsUnitType(u,UNIT_TYPE_STRUCTURE) != true then
                        call UnitDamageTarget(Dat.caster,u,I2R(GetRandomInt(50,150)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                        set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                        call UnitApplyTimedLife(dummy,timedlife,1)
                        call UnitAddAbility(dummy,dummyspellfour)
                        call SetUnitAbilityLevel(dummy,dummyspellfour,GetUnitAbilityLevel(Dat.caster,spellid))                    
                        call IssueTargetOrder(dummy,ent,u)
                        set sfx = AddSpecialEffectTarget(sfxstringtwo,u,chest)
                        call DestroyEffect(sfx)
                        call GroupRemoveUnit(g,u)
                    else
                        call GroupRemoveUnit(g,u)
                    endif
                endloop
                call DestroyGroup(g)
                call FlushHandleLocals(t)   
                call rootstruct.destroy(Dat)
                call DestroyTimer(t)
            elseif GetUnitAbilityLevel(Dat.target,buffraw) <= 0 then //only important if rooting was dispelled etc.
                call FlushHandleLocals(t) 
                call rootstruct.destroy(Dat)  
                call DestroyTimer(t)           
            elseif Dat.i == 1 then //effect for after 1 second (roots the hand and checks for a 33% chance if the target won't deal damage anymore)
                set Dat.sfx[1] = AddSpecialEffectTarget(sfxstring,Dat.target,handright)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,handleft)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,20*GetUnitAbilityLevel(Dat.caster,spellid),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                if GetRandomInt(1,3) == 1 then
                    set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                    call UnitAddAbility(dummy,dummyspellone)
                    call IssueImmediateOrder(dummy,roar)
                    call UnitApplyTimedLife(dummy,timedlife,1)
                endif
            elseif Dat.i == 2 then //not realy important part only damages and creates effect
                set Dat.sfx[2] = AddSpecialEffectTarget(sfxstring,Dat.target,handleft)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,handleft)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,20*GetUnitAbilityLevel(Dat.caster,spellid),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 3 then //effect for after 3 seconds (roots the head and checks for a 33% chance if the target won't cast spells anymore)
                set Dat.sfx[3] = AddSpecialEffectTarget(sfxstring,Dat.target,head)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,head)
                call DestroyEffect(sfx)            
                call UnitDamageTarget(Dat.caster,Dat.target,20*GetUnitAbilityLevel(Dat.caster,spellid),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                if GetRandomInt(1,3) == 1 then
                    set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                    call UnitAddAbility(dummy,dummyspelltwo)
                    call IssueTargetOrder(dummy,soul,Dat.target)
                    call UnitApplyTimedLife(dummy,timedlife,1)
                endif
            elseif Dat.i == 4 then //effect+damage and roots target to the ground
                set Dat.sfx[4] = AddSpecialEffectTarget(sfxstring,Dat.target,origin)    
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,origin)
                call DestroyEffect(sfx)            
                call UnitDamageTarget(Dat.caster,Dat.target,20*GetUnitAbilityLevel(Dat.caster,spellid),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                call UnitAddAbility(dummy,dummyspellthree)
                call IssueTargetOrder(dummy,ens,Dat.target)
                call UnitApplyTimedLife(dummy,timedlife,1)
            elseif Dat.i == 5 then //only damage
                call UnitDamageTarget(Dat.caster,Dat.target,20*GetUnitAbilityLevel(Dat.caster,spellid),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 6 then //only damage
                call UnitDamageTarget(Dat.caster,Dat.target,20*GetUnitAbilityLevel(Dat.caster,spellid),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 7 then //if target didn't die this resets everything for no leaks etc.
                call FlushHandleLocals(t)            
                call rootstruct.destroy(Dat)
            endif
        //setting all vars to null
        set dummy = null
        set t = null
        set sfx = null
        set u = null
    endmethod
    
    static method create takes unit u,unit t returns rootstruct //sets the caster and target
        local rootstruct Dat = rootstruct.allocate()
            set Dat.caster = u
            set Dat.target = t
            set Dat.sfx[0] = AddSpecialEffectTarget(sfxstring,Dat.target,"chest")
            call DestroyEffect(AddSpecialEffectTarget(sfxstringtwo,Dat.target,"chest"))
            call TimerStart(Dat.t,Interval,true,function rootstruct.rootTimer)
            call SetHandleInt(Dat.t,"dat",Dat)
            return Dat
    endmethod
    method onDestroy takes nothing returns nothing //remove leaks :D
        local integer i = 0
            call UnitRemoveAbility(.target,buffoneraw)
            call UnitRemoveAbility(.target,bufftworaw)
            set .caster = null
            set .target = null
            call DestroyTimer(.t)
            set .t = null
            loop
                exitwhen i >= 5
                call DestroyEffect(.sfx[i])
                set .sfx[i] = null
                set i = i + 1
            endloop
    endmethod
endstruct
//===============CONDITION/START=====================
private function rootCond takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local unit t = GetSpellTargetUnit()    
    local rootstruct Dat 
        if GetSpellAbilityId() == spellid then
           set Dat = rootstruct.create(u,t)
        endif
    set u = null
    set t = null
    return false
endfunction

//event part with preloading ;)
private function rootInt takes nothing returns nothing
    local trigger int = CreateTrigger()
    local integer index = 0
    local unit u
        loop
            call TriggerRegisterPlayerUnitEvent(int, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
        call TriggerAddCondition(int,Condition(function rootCond))
    set int = null
    //preload dummy etc
    set u = CreateUnit(Player(14),dummyid,9999999,9999999,0)
    call UnitAddAbility(u,dummyspellone)
    call UnitAddAbility(u,dummyspelltwo)
    call UnitAddAbility(u,dummyspellthree)
    call UnitAddAbility(u,dummyspellfour)
    call RemoveUnit(u)
    set u = null
    call Preload(sfxstring)
    call Preload(sfxstringtwo)
endfunction
endscope

tips for improvement would be nice ;)
 
Last edited:
Level 13
Joined
Mar 16, 2008
Messages
941
Don't know where you can find one, but think of the advantages.
A struct is like an huge array.
You have on struct where you can store a huge amount of data.
For example you save a missle, his caster, the skilllevel, the flyingangle and the distance in the struct. Now you just need to get the struct to read all the data, its the same like having a single variable for every stuff, but it's a lot easier to handle
 
Level 16
Joined
Feb 22, 2006
Messages
960
Could someone point me to a struct tutorial. What are the benefits of using them? The type of coding xD.Schurke is using. I'd like to learn this if there is a good reason for it. Seems kinda complicated though. Sorry for off topic post.

if you have JNGP then there is a JassHelperManual, there you can find some tips, if you mean that :)
 
Level 12
Joined
Apr 27, 2008
Messages
1,228
It is settled - tomorrow after my first examination in the university(starting at 9:00 probably ending at 9:30 because it is on basic programming :p ), I will go straight home and I will code something big :D Maybe I will have to spend a couple of hours in the toilet for inspiration. When I am in there, ideas seem to come faster ;)

And then I am off to climbing :p
 
Level 12
Joined
Aug 20, 2007
Messages
866
It is settled - tomorrow after my first examination in the university(starting at 9:00 probably ending at 9:30 because it is on basic programming :p ), I will go straight home and I will code something big :D Maybe I will have to spend a couple of hours in the toilet for inspiration. When I am in there, ideas seem to come faster ;)

And then I am off to climbing :p

That happens to me too. For some reason when I'm on the toilet, I am more imaginative. God knows why :confused:
 
Level 15
Joined
Dec 18, 2007
Messages
1,098
Yeah, finally decided to edit my spell :D
Anyway, the new spells are really good!
Spirit Ball's test map could be better :p I felt as if I was playing a campaign.
Forest Spirits is a good idea and I like it. And as people say, make the wisps go around the hero :)
Good Luck everyone!
 

Attachments

  • Spells&Systems Mini-Contest #16- Rejuvenation Dust.w3x
    39.5 KB · Views: 25
Level 23
Joined
Nov 29, 2006
Messages
2,482
Could someone point me to a struct tutorial. What are the benefits of using them? The type of coding xD.Schurke is using. I'd like to learn this if there is a good reason for it. Seems kinda complicated though. Sorry for off topic post.

There is one here which includes the basics of Jass - vJass as well:
World-Editor Tutorials Site
Or this one is great too:
JASS: Basics of Structs - The Helper Forums

And Zack1996, I think your spell is better now for sure... But it would look better if the floating text actually disappear north like the mana burn etc does.
You could just add
  • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
(where 64 is starting Z height and 90 is the angle it should disappear to: 90 degrees is towards north.)

And Justify, the poison effect appearing when exploding doesnt look that great in my opinion. May I suggest the Detonate Wisp model? You could always make that larger by a dummy unit sfx if you feel like it wouldnt be 'strong' enough.
 
Level 16
Joined
Feb 22, 2006
Messages
960
soo, i reworked the spell script again, added a bit more comments and deleted HandleVar system, now using TimerUtils
JASS:
//==================================================================================
//==================================================================================
//===============================ROOTING==v,1,4=====================================
//==================================================================================
//===============================BY==xD,Schurke=====================================
//==================================================================================
scope rooting initializer rootInt
//=========CONSTANTS===============
globals
    //Dummy Rawcode
    private constant integer dummyid = 'h000'
    
    //Ability/Buff Rawcodes
    private constant integer spellid = 'A000'  //The hero spell
    private constant integer dummyspellone = 'A002' //damage reduce
    private constant integer dummyspelltwo = 'A003'  //silence spell
    private constant integer dummyspellthree = 'A004'  //roots the target   
    private constant integer dummyspellfour = 'A005' //roots for all nearby enemy units
    private constant integer buffraw = 'B000' //normal herospell debuff
    private constant integer buffoneraw = 'B002' //damage reduce debuff
    private constant integer bufftworaw = 'B003' //silence debuff
    private constant integer timedlife = 'BTLF'   //timed life debuff
    
    //Modelpaths
    private constant string sfxstring = "Abilities\\Spells\\NightElf\\EntanglingRoots\\EntanglingRootsTarget.mdl" //root model
    private constant string sfxstringtwo = "Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl" //bloodeffect
    private constant string sfxstringthree = "Objects\\Spawnmodels\\Undead\\UndeadLargeDeathExplode\\UndeadLargeDeathExplode.mdl" //explode effect
    
    //attachment strings
    private constant string handright = "hand right"
    private constant string handleft = "hand left"
    private constant string chest = "chest"
    private constant string head = "head"
    private constant string origin = "origin"
    
    //IssueOrder strings
    private constant string ent ="entanglingroots"
    private constant string roar ="roar"
    private constant string soul = "soulburn"
    private constant string ens = "ensnare"
    
    
    //Timer Interval
    private constant real Interval = 0.01
endglobals

//function for damage
private function damage takes integer level returns real
    return I2R(20 * level)
endfunction
//========END=CONSTANTS============
private struct rootstruct
    unit caster //stores the caster
    unit target //stores the target
    real i = 0 //counter
    effect array sfx [5] //stores the effects
    timer t = CreateTimer()
    static method rootTimer takes nothing returns nothing
        local rootstruct Dat = GetTimerData(GetExpiredTimer()) //gets the struct
        local unit dummy //dummy var
        local effect sfx //non permanent special effect
        local unit u //for group reason
        local group g = CreateGroup() //for group reason
            set Dat.i = Dat.i + Interval //increases counter
            if GetUnitState(Dat.target,UNIT_STATE_LIFE) <= 0 then //part to check if the target is dead and if it's true, it will damage all nearby enemy units and roots them (loop is for goup selection etc.) also resets all things (struct,timer etc.)
                set sfx = AddSpecialEffect(sfxstringthree,GetUnitX(Dat.target),GetUnitY(Dat.target))
                call DestroyEffect(sfx)
                call GroupEnumUnitsInRange(g,GetUnitX(Dat.target),GetUnitY(Dat.target),200,null)
                loop
                    set u = FirstOfGroup(g)
                    exitwhen u == null
                    if IsUnitEnemy(u,GetOwningPlayer(Dat.caster)) and GetUnitState(u,UNIT_STATE_LIFE) > 0 and IsUnitType(u,UNIT_TYPE_STRUCTURE) != true then
                        call UnitDamageTarget(Dat.caster,u,I2R(GetRandomInt(50,150)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                        set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                        call UnitApplyTimedLife(dummy,timedlife,1)
                        call UnitAddAbility(dummy,dummyspellfour)
                        call SetUnitAbilityLevel(dummy,dummyspellfour,GetUnitAbilityLevel(Dat.caster,spellid))                    
                        call IssueTargetOrder(dummy,ent,u)
                        set sfx = AddSpecialEffectTarget(sfxstringtwo,u,chest)
                        call DestroyEffect(sfx)
                        call GroupRemoveUnit(g,u)
                    else
                        call GroupRemoveUnit(g,u)
                    endif
                endloop
                call DestroyGroup(g) 
                call rootstruct.destroy(Dat)
            elseif GetUnitAbilityLevel(Dat.target,buffraw) <= 0 then //only important if rooting was dispelled etc.
                call rootstruct.destroy(Dat)           
            elseif Dat.i == 1 then //effect for after 1 second (roots the hand and checks for a 33% chance if the target won't deal damage anymore)
                set Dat.sfx[1] = AddSpecialEffectTarget(sfxstring,Dat.target,handright)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,handleft)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                if GetRandomInt(1,3) == 1 then
                    set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                    call UnitAddAbility(dummy,dummyspellone)
                    call IssueImmediateOrder(dummy,roar)
                    call UnitApplyTimedLife(dummy,timedlife,1)
                endif
            elseif Dat.i == 2 then //not realy important part only damages and creates effect
                set Dat.sfx[2] = AddSpecialEffectTarget(sfxstring,Dat.target,handleft)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,handleft)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 3 then //effect for after 3 seconds (roots the head and checks for a 33% chance if the target won't cast spells anymore)
                set Dat.sfx[3] = AddSpecialEffectTarget(sfxstring,Dat.target,head)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,head)
                call DestroyEffect(sfx)            
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                if GetRandomInt(1,3) == 1 then
                    set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                    call UnitAddAbility(dummy,dummyspelltwo)
                    call IssueTargetOrder(dummy,soul,Dat.target)
                    call UnitApplyTimedLife(dummy,timedlife,1)
                endif
            elseif Dat.i == 4 then //effect+damage and roots target to the ground
                set Dat.sfx[4] = AddSpecialEffectTarget(sfxstring,Dat.target,origin)    
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,origin)
                call DestroyEffect(sfx)            
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                call UnitAddAbility(dummy,dummyspellthree)
                call IssueTargetOrder(dummy,ens,Dat.target)
                call UnitApplyTimedLife(dummy,timedlife,1)
            elseif Dat.i == 5 then //only damage
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 6 then //only damage
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 7 then //if target didn't die this resets everything for no leaks etc.         
                call rootstruct.destroy(Dat)
            endif
        //setting all vars to null
        set dummy = null
        set sfx = null
        set u = null
    endmethod
    
    static method create takes unit u,unit t returns rootstruct //sets the caster and target
        local rootstruct Dat = rootstruct.allocate()
            set Dat.caster = u
            set Dat.target = t
            set Dat.sfx[0] = AddSpecialEffectTarget(sfxstring,Dat.target,"chest")
            call DestroyEffect(AddSpecialEffectTarget(sfxstringtwo,Dat.target,"chest"))
            call SetTimerData(Dat.t,integer(Dat))
            call TimerStart(Dat.t,Interval,true,function rootstruct.rootTimer)
            return Dat
    endmethod
    method onDestroy takes nothing returns nothing //remove leaks :D
        local integer i = 0
            call UnitRemoveAbility(.target,buffoneraw)
            call UnitRemoveAbility(.target,bufftworaw)
            set .caster = null
            set .target = null
            call DestroyTimer(.t)
            set .t = null
            loop
                exitwhen i >= 5
                call DestroyEffect(.sfx[i])
                set .sfx[i] = null
                set i = i + 1
            endloop
    endmethod
endstruct
//===============CONDITION/START=====================
private function rootCond takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local unit t = GetSpellTargetUnit()    
    local rootstruct Dat 
        if GetSpellAbilityId() == spellid then
           set Dat = rootstruct.create(u,t)
        endif
    set u = null
    set t = null
    return false
endfunction

//event part with preloading ;)
private function rootInt takes nothing returns nothing
    local trigger int = CreateTrigger()
    local integer index = 0
    local unit u
        loop
            call TriggerRegisterPlayerUnitEvent(int, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
        call TriggerAddCondition(int,Condition(function rootCond))
    set int = null
    //preload dummy etc
    set u = CreateUnit(Player(14),dummyid,9999999,9999999,0)
    call UnitAddAbility(u,dummyspellone)
    call UnitAddAbility(u,dummyspelltwo)
    call UnitAddAbility(u,dummyspellthree)
    call UnitAddAbility(u,dummyspellfour)
    call RemoveUnit(u)
    set u = null
    call Preload(sfxstring)
    call Preload(sfxstringtwo)
endfunction
endscope
 
Last edited:
Level 23
Joined
Nov 29, 2006
Messages
2,482
xD.Schurke, I love your code^^. Though are you sure you are using all the constants? Some of them is not really needed, but yeah, I got it why you are using them (the attaching strings and orders, for efficiency?) But I leave that judging to Poot :]
 
Level 23
Joined
Nov 29, 2006
Messages
2,482
Aha I see... I really like it now:] But perhaps the units should be immobile one second faster. But that is due to the great amount of vines. Eh, what I mean is that it has pretty many vines 1 second before it is rooted^^. So based on that...:p
 
Level 16
Joined
Feb 22, 2006
Messages
960
hehe, let's say those vines need a place to expand and thats the ground! :D, but may i change it:p

Edit: Had to change something with TimerUtils usage (Thanks to Hanky)

JASS:
//==================================================================================
//==================================================================================
//===============================ROOTING==v.1.5=====================================
//==================================================================================
//===============================BY==xD.Schurke=====================================
//==================================================================================
scope rooting initializer rootInt
//=========CONSTANTS===============
globals
    //Dummy Rawcode
    private constant integer dummyid = 'h000' //change to you map specific dummy rawcode

    //Ability/Buff Rawcodes
    private constant integer spellid = 'A000' //The hero spell
    private constant integer dummyspellone = 'A002' //damage reduce must be roar with negative value
    private constant integer dummyspelltwo = 'A003' //silence spell must be soulburn with 0 damage
    private constant integer dummyspellthree = 'A004' //roots the target ensnare
    private constant integer dummyspellfour = 'A005' //roots for all nearby enemy units
    private constant integer buffraw = 'B000' //normal herospell debuff (debuff of 'A000')
    private constant integer buffoneraw = 'B002' //damage reduce debuff (debuff of 'A002)
    private constant integer bufftworaw = 'B003' //silence debuff (debuff of 'A003')
    private constant integer timedlife = 'BTLF' //timed life debuff Don't change

    //Modelpaths
    private constant string sfxstring = "Abilities\\Spells\\NightElf\\EntanglingRoots\\EntanglingRootsTarget.mdl" //root model change for a new model
    private constant string sfxstringtwo = "Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl" //bloodeffect
    private constant string sfxstringthree = "Objects\\Spawnmodels\\Undead\\UndeadLargeDeathExplode\\UndeadLargeDeathExplode.mdl" //explode effect

    //attachment strings shouldn't be changed
    private constant string handright = "hand right"
    private constant string handleft = "hand left"
    private constant string chest = "chest"
    private constant string head = "head"
    private constant string origin = "origin"

    //IssueOrder strings shouldn't be changed
    private constant string ent ="entanglingroots"
    private constant string roar ="roar"
    private constant string soul = "soulburn"
    private constant string ens = "ensnare"


    //Timer Interval
    private constant real Interval = 0.01
endglobals

//function for damage change the number to have more/less damage
private function damage takes integer level returns real
    return I2R(20 * level)
endfunction
//========END=CONSTANTS============
private struct rootstruct
    unit caster //stores the caster
    unit target //stores the target
    real i = 0 //counter
    effect array sfx [5] //stores the effects
    timer t
    static method rootTimer takes nothing returns nothing
        local rootstruct Dat = GetTimerData(GetExpiredTimer()) //gets the struct
        local unit dummy //dummy var
        local effect sfx //non permanent special effect
        local unit u //for group reason
        local group g = CreateGroup() //for group reason
            set Dat.i = Dat.i + Interval //increases counter
            if GetUnitState(Dat.target,UNIT_STATE_LIFE) <= 0 then //part to check if the target is dead and if it's true, it will damage all nearby enemy units and roots them (loop is for goup selection etc.) also resets all things (struct,timer etc.)
                set sfx = AddSpecialEffect(sfxstringthree,GetUnitX(Dat.target),GetUnitY(Dat.target))
                call DestroyEffect(sfx)
                call GroupEnumUnitsInRange(g,GetUnitX(Dat.target),GetUnitY(Dat.target),200,null)
                loop
                    set u = FirstOfGroup(g)
                    exitwhen u == null
                    if IsUnitEnemy(u,GetOwningPlayer(Dat.caster)) and GetUnitState(u,UNIT_STATE_LIFE) > 0 and IsUnitType(u,UNIT_TYPE_STRUCTURE) != true then
                        call UnitDamageTarget(Dat.caster,u,I2R(GetRandomInt(50,150)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                        set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                        call UnitApplyTimedLife(dummy,timedlife,1)
                        call UnitAddAbility(dummy,dummyspellfour)
                        call SetUnitAbilityLevel(dummy,dummyspellfour,GetUnitAbilityLevel(Dat.caster,spellid))
                        call IssueTargetOrder(dummy,ent,u)
                        set sfx = AddSpecialEffectTarget(sfxstringtwo,u,chest)
                        call DestroyEffect(sfx)
                        call GroupRemoveUnit(g,u)
                    else
                        call GroupRemoveUnit(g,u)
                    endif
                endloop
                call DestroyGroup(g)
                call rootstruct.destroy(Dat)
            elseif GetUnitAbilityLevel(Dat.target,buffraw) <= 0 then //only important if rooting was dispelled etc.
                call rootstruct.destroy(Dat)
            elseif Dat.i == 1 then //effect for after 1 second (roots the hand and checks for a 33% chance if the target won't deal damage anymore)
                set Dat.sfx[1] = AddSpecialEffectTarget(sfxstring,Dat.target,handright)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,handleft)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                if GetRandomInt(1,3) == 1 then
                    set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                    call UnitAddAbility(dummy,dummyspellone)
                    call IssueImmediateOrder(dummy,roar)
                    call UnitApplyTimedLife(dummy,timedlife,1)
                endif
            elseif Dat.i == 2 then //not realy important part only damages and creates effect
                set Dat.sfx[2] = AddSpecialEffectTarget(sfxstring,Dat.target,handleft)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,handleft)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 3 then //effect for after 3 seconds (roots the head and checks for a 33% chance if the target won't cast spells anymore)
                set Dat.sfx[3] = AddSpecialEffectTarget(sfxstring,Dat.target,head)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,head)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                if GetRandomInt(1,3) == 1 then
                    set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                    call UnitAddAbility(dummy,dummyspelltwo)
                    call IssueTargetOrder(dummy,soul,Dat.target)
                    call UnitApplyTimedLife(dummy,timedlife,1)
                endif
            elseif Dat.i == 4 then //effect+damage and roots target to the ground
                set Dat.sfx[4] = AddSpecialEffectTarget(sfxstring,Dat.target,origin)
                set sfx = AddSpecialEffectTarget(sfxstringtwo,Dat.target,origin)
                call DestroyEffect(sfx)
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                set dummy = CreateUnit(GetOwningPlayer(Dat.caster),dummyid,GetUnitX(Dat.target),GetUnitY(Dat.target),0)
                call UnitAddAbility(dummy,dummyspellthree)
                call IssueTargetOrder(dummy,ens,Dat.target)
                call UnitApplyTimedLife(dummy,timedlife,1)
            elseif Dat.i == 5 then //only damage
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 6 then //only damage
                call UnitDamageTarget(Dat.caster,Dat.target,damage(GetUnitAbilityLevel(Dat.caster,spellid)),false,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
            elseif Dat.i == 7 then //if target didn't die this resets everything for no leaks etc.
                call rootstruct.destroy(Dat)
            endif
        //setting all vars to null
        set dummy = null
        set sfx = null
        set u = null
    endmethod

    static method create takes unit u,unit t returns rootstruct //sets the caster and target
        local rootstruct Dat = rootstruct.allocate()
            set Dat.caster = u
            set Dat.target = t
            set Dat.t = NewTimer()
            set Dat.sfx[0] = AddSpecialEffectTarget(sfxstring,Dat.target,"chest")
            call DestroyEffect(AddSpecialEffectTarget(sfxstringtwo,Dat.target,"chest"))
            call SetTimerData(Dat.t,integer(Dat))
            call TimerStart(Dat.t,Interval,true,function rootstruct.rootTimer)
            return Dat
    endmethod
    method onDestroy takes nothing returns nothing //remove leaks :D
        local integer i = 0
            call UnitRemoveAbility(.target,buffoneraw)
            call UnitRemoveAbility(.target,bufftworaw)
            set .caster = null
            set .target = null
            call ReleaseTimer(.t)
            set .t = null
            loop
                exitwhen i >= 5
                call DestroyEffect(.sfx[i])
                set .sfx[i] = null
                set i = i + 1
            endloop
    endmethod
endstruct
//===============CONDITION/START=====================
private function rootCond takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local unit t = GetSpellTargetUnit()
    local rootstruct Dat
        if GetSpellAbilityId() == spellid then
           set Dat = rootstruct.create(u,t)
        endif
    set u = null
    set t = null
    return false
endfunction

//event part with preloading ;)
private function rootInt takes nothing returns nothing
    local trigger int = CreateTrigger()
    local integer index = 0
    local unit u
        loop
            call TriggerRegisterPlayerUnitEvent(int, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
        call TriggerAddCondition(int,Condition(function rootCond))
    set int = null
    //preload dummy etc
    set u = CreateUnit(Player(14),dummyid,9999999,9999999,0)
    call UnitAddAbility(u,dummyspellone)
    call UnitAddAbility(u,dummyspelltwo)
    call UnitAddAbility(u,dummyspellthree)
    call UnitAddAbility(u,dummyspellfour)
    call RemoveUnit(u)
    set u = null
    call Preload(sfxstring)
    call Preload(sfxstringtwo)
endfunction
endscope
 

Attachments

  • Spells_Systems_Mini_Contest_16_xDSchurke.w3x
    35.9 KB · Views: 39
Last edited:
Level 13
Joined
May 11, 2008
Messages
1,198
Level 23
Joined
Nov 29, 2006
Messages
2,482
all in all you should rework your code ;)

lol^^

---
I am getting stressed at the moment. Not only is my school taking up too much time for me but also I have to study through the weekend :/. Also I mixture with some coding yesderday evening for 3 hours, but didnt get a smooth insect swarm spell...
I will probably do a 'shield' like spell. I know its not the most creative and best option, but nah, it would be fun to participate this time even though I wouldn't win =)
 
Level 5
Joined
Jun 25, 2008
Messages
118
so i think im gonna have to pull out, my spell won't work for unobvious reasons, even tried getting help in a request thread and ive had very few replies and nobody who has replied can find the problem, also got course work to do so i dont have time to mess around with it unless i know the exact problem. If anyone can see the problem then gimme a shout otherwise i think im out (rhymes lol).

JASS:
scope BeeSwarm initializer Init

//=========================Bee Swarm by BlackShogun==========================//
//=================================Setup=====================================//

//spell rawcode
private constant function BeeSwarmRawCode takes nothing returns integer
    return 'A000'
endfunction

//dummy unit rawcode
private constant function BeeSwarmModel takes nothing returns integer
    return 'h000'
endfunction

//dummy unit model
private constant function BeeSwarmSFX takes nothing returns string
    return "Abilities\\Weapons\\CryptFiendMissile\\CryptFiendMissile.mdl"
endfunction

//base damage per second
private function BeeSwarmBaseDPS takes integer lvl returns real
    return 5.0*lvl
endfunction

//increase in damage per second for every second the target is moving
private function BeeSwarmIncDPS takes integer lvl returns real
    return 0.5*lvl
endfunction

//decrease in damage per second for every second the target is moving
private constant function BeeSwarmDecDPS takes nothing returns real
    return 0.5
endfunction

//duration of spell
private constant function BeeSwarmDur takes nothing returns real
    return 20.0
endfunction

//the movement and effects interval
private constant function BeeSwarmInterval takes nothing returns real
    return 0.03
endfunction

//distance moved by projectile each interval
private constant function BeeSwarmDist takes nothing returns real
    return 15.0
endfunction

//===============================EndSetup====================================//
//==================NOTE: DO NOT EDIT ANYTHING BEYOND HERE===================//

struct BeeSwarm_Data
    unit cast
    unit targ
    unit u
    real x
    real y
    real dmg
    real time
    effect sfx
endstruct

globals
    private timer t = CreateTimer()
    private BeeSwarm_Data array ar
    private integer total = 0
endglobals

private function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == BeeSwarmRawCode()
endfunction

private function Effects takes nothing returns nothing
    local BeeSwarm_Data dat
    local integer i=0
    local real x1
    local real y1
    local real x2
    local real y2
    local real a
    local real mx
    local real my
    local integer lvl
    
    loop
        exitwhen i>=total
        set dat=ar[i]
        set x1=GetUnitX(dat.u)
        set y1=GetUnitY(dat.u)
        set x2=GetUnitX(dat.targ)
        set y2=GetUnitY(dat.targ)
        set a=Atan2(y2-y1, x2-x1)
        set mx=BeeSwarmDist()*Cos(a)
        set my=BeeSwarmDist()*Sin(a)
        set lvl=GetUnitAbilityLevel(dat.cast, BeeSwarmRawCode())
        
        if not IsUnitInRange(dat.u, dat.targ, 50) then
            call SetUnitX(dat.u, x1+mx)
            call SetUnitY(dat.u, y1+my)
            call SetUnitFacing(dat.u, 57.29583*a)
        endif
        
        if IsUnitInRange(dat.u, dat.targ, 50) and (not IsUnitType(dat.targ, UNIT_TYPE_DEAD)) then
            call SetUnitX(dat.u, x2)
            call SetUnitY(dat.u, y2)
            call UnitDamageTarget(dat.cast, dat.targ, (BeeSwarmBaseDPS(lvl)*BeeSwarmInterval())+dat.dmg, true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
            if dat.x!=null then
                if IsUnitInRangeXY(dat.targ, dat.x, dat.y, 5) then
                    set dat.dmg=dat.dmg-(BeeSwarmDecDPS()*BeeSwarmInterval())
                else
                    set dat.dmg=dat.dmg+(BeeSwarmIncDPS(lvl)*BeeSwarmInterval())
                endif
            endif
            set dat.x=x2
            set dat.y=y2
        endif
        
        if (BeeSwarmBaseDPS(lvl)+dat.dmg<=0) or (dat.time>=BeeSwarmDur()) or (IsUnitInRange(dat.u, dat.targ, 50) and IsUnitType(dat.targ, UNIT_TYPE_DEAD)) then
            call DestroyEffect(dat.sfx)
            call RemoveUnit(dat.u)
            set ar[i]=ar[total-1]
            set total=total-1
            call dat.destroy()
        endif
        
        set dat.time=dat.time+(1*BeeSwarmInterval())
        set i=i+1
    endloop
    
    if total==0 then
        call PauseTimer(t)
    endif
endfunction

private function Actions takes nothing returns BeeSwarm_Data
    local BeeSwarm_Data dat=BeeSwarm_Data.create()
    local player p
    
    set dat.cast=GetTriggerUnit()
    set p = GetOwningPlayer(dat.cast)
    set dat.targ=GetSpellTargetUnit()
    set dat.u=CreateUnit(p, BeeSwarmModel(), GetUnitX(dat.cast), GetUnitY(dat.cast), 57.29583*Atan2(GetUnitY(dat.targ)-GetUnitY(dat.cast), GetUnitX(dat.targ)-GetUnitX(dat.cast)))
    set dat.sfx=AddSpecialEffectTarget(BeeSwarmSFX(), dat.u, "chest")
    set dat.dmg=0
    set dat.time=0
    set p=null
    
    if total==0 then
        call TimerStart(t, BeeSwarmInterval(), true, function Effects)
    endif
    
    set total=total+1
    set ar[total-1]=dat
    
    return dat
endfunction

private function Init takes nothing returns nothing
    local trigger T = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(T, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddAction(T, function Actions)
    call TriggerAddCondition(T, Condition(function Conditions))
endfunction

endscope
 

Attachments

  • Bee Swarm.w3x
    24.2 KB · Views: 30
Level 13
Joined
Mar 16, 2008
Messages
941
Whoops, fixed a bug with the grow duration and added a constant for the maximum size :)

Poisonous Mushroom:
Summons an invisible and invulnurable Poisonous Mushroom at target location. The mushroom will start growing over a period of 30 seconds. Maximum of 10 mushroom, while the 11. causes the 1. to explode.

Detonate:
Causes the next mushroom to explode after 0.5 seconds

Exploding mushrooms deal damage in an area, both depending on the duration spent growing. After 0.5 seconds the exploded mushroom causes the next mushroom to explode, and so on.

Nearly any value in the spell is configurable, also stuff like the chainreaction can be turned off.
 

Attachments

  • Spells & Systems Contest #16 Justify.w3x
    53.6 KB · Views: 35
Level 17
Joined
Jan 21, 2007
Messages
2,013
Graaah! I still haven't found out what i am going to do!

Earthliving Weapon
Enchants the users weapon with power from nature, giving it the power to leech seed an enemy unit. The Leech Seed will leech the very life from the target, regenerating nearby allied units by distributing the life leeched equally. Damage Leeched increases with level.
I am thinking of making this ability, but i'm not too sure. Oh, it's a permanent ability. I like those :wink:
 
Last edited:
Level 6
Joined
Mar 15, 2005
Messages
112
ok ok replacing BJs. I'm just new to JASS and all. A month ago I didn't even know what a local was. I'll make it a habbit to use natives. Was planning on adding something big to this but couldn't get it working in time. A summon unit made up of many units(rock models). Manually animated to cast my spell. Think I'll keep working on it after the contest for the spell section. Thanks for the suggestions and comments. Wounder if JonNny is gonna get his spell done in time.
 
Level 6
Joined
Mar 15, 2005
Messages
112
Justify you spell is great but it seems very powerful (maybe these creeps are just weak). I'd make the mushrooms grow much slower if I were to use this in a map. I think you should be able to detonate the mushrooms from further away. I liked how you can't place mushrooms too close to each other. Your hotkey for detonate doesn't work for "S". If you want to use "S" you must change the hotkey for stop in game interface. What is affected by level increases? Was to lazy to level it up =P. Other then that, I really like it.
 
Level 23
Joined
Nov 29, 2006
Messages
2,482
Hmm... I finally got some decent coding done :D
Im making a shield which is absorbing damage and returns the damage dealt as 'small missiles' moving towards the attacking unit. It may not be the best but its better than nothing. Here is how the shield looks so far. (note, Paladin is just a test unit atm, also note that i have the lowest quality and resolution on my pc :_:)
 

Attachments

  • test.PNG
    test.PNG
    107.1 KB · Views: 103
Level 30
Joined
Dec 6, 2007
Messages
2,228
Hmm... I finally got some decent coding done :D
Im making a shield which is absorbing damage and returns the damage dealt as 'small missiles' moving towards the attacking unit. It may not be the best but its better than nothing. Here is how the shield looks so far. (note, Paladin is just a test unit atm, also note that i have the lowest quality and resolution on my pc :_:)

It definitely looks very nice, but i´m afraid it doesn´t fit with the theme (?).
Simply using green missiles doesn´t represent nature.
 
Level 23
Joined
Nov 29, 2006
Messages
2,482
Meh, it would fit the theme, somehow... But yeah, the 'result' may not be, but hopefully the sfx'es will. Maybe it gives a little more 'feeling' if I change the hero as I said...

Also, It is better than nothing isnt it... But I totally see your point. I just couldnt find out my spell idea in time :/
 
Level 23
Joined
Nov 29, 2006
Messages
2,482
Are you referring to your signature, the knockback system?

Well, the rules are saying:
All work should be done by the contestant and original to this contest, started after the contest started.
however it also says:
You may use utilities (that do small jobs), but no large do-it-for-you systems.
Examples of utilities:

* Local Handle Variables
* CSCache
* Armor Detection System
* Vector System


Examples of large do-it-for-you systems:

* Particle System
* Caster System
You would probably need to ask Poot if you are unsure of the system (what kind of system is it?), if it is counting as a Large System or not.

Edit: Berz, yeah, or some kind of venom =) But still, it reflects damage taken by any attacker/damage type and shoots the damage as a beam damaging units in the way with the same damage. or that is what I though of. If I have time I will add some more things indeed.
 
Level 23
Joined
Nov 29, 2006
Messages
2,482
Well, if you made it after the contest started, dont bother asking. Its your work, and its done within the time frame and then you are allowed.

Edit: Berz If you didnt notice yet I made a reply on the previous post^^
 
Level 30
Joined
Dec 6, 2007
Messages
2,228
Edit:
I am allowed to use my system, so the Magical Birds [Nature] v.1.11 (KBS) is my entry. I removed the other version from this post to prevent misunderstandings. Enjoy.
Good luck everyone, we got some really nice spells here.
 

Attachments

  • Magical Birds [Nature] v.1.11 (KBS).w3x
    57.4 KB · Views: 97
Last edited:
Status
Not open for further replies.
Top