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

Arcane Explosion [vJASS]

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
  • Like
Reactions: Klingo
My spell does following:
it creates a circle of missile which fly around the caster in all directions
grabbing enemy units and bring them to the start coordinates of the missiles (the missiles fly back to the caster then)

JASS:
1.1:
- fixed 1 leak, now completely leakfree
- one little code improvement

Keywords:
arcane, explosion, star wars, bomb, imba, spell, cool, pow, itachi009, wow, diablo 2, game, warcraft, starcraft
Contents

Harry Potter Wizard War (Map)

Reviews
7 November 2015 Bribe: Rejecting due to the status of this resource being "needs fix" for years. 15:18, 16th Jan 2010 TriggerHappy: This is hardly vJass. You are only using the global block feature. Until you place it inside a scope and make...

Moderator

M

Moderator

7 November 2015
Bribe: Rejecting due to the status of this resource being "needs fix" for years.

15:18, 16th Jan 2010
TriggerHappy:

This is hardly vJass. You are only using the global block feature.
Until you place it inside a scope and make the members private, I won't do a full review.
 
Level 5
Joined
Dec 8, 2008
Messages
102
JASS:
//**********************************************************************************************
//**********************************************************************************************
//**********************************************************************************************
//****************   SPELL WRITTEN BY ITACHI009    *********************************************
//***************************    NN CREDITS BUT PLS DONT DELETE THE HEADER   *******************
//********************   SPELL IS MUI, LEAKLESS AND LAGLESS    *********************************
//**********************************************************************************************
//**********************************************************************************************
//**********************************************************************************************
//**********************************************************************************************


// you can change the CONSTANTS ONLY here in order to change the spell
// note: a constant is a line with the keyword "constant" in front of it :P

// the reason why i didnt made a scope is that it is unneeded :O, the names are clearly !
// and the names will never collide with other spells...


globals
    // SETUP
    constant integer ARCANE_EXPLOSION_ABILITY_ID = 'A003'
    constant real ARCANE_EXPLOSION_COLLISION_SIZE = 80
    constant real ARCANE_EXPLOSION_DISTANCE = 600
    constant integer ARCANE_EXPLOSION_MISSILE_AMOUNT = 40
    constant string ARCANE_EXPLOSION_MISSILE_ART = "Abilities\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl"
    constant integer ARCANE_EXPLOSION_MISSILE_ID = 'h001'
    constant real ARCANE_EXPLOSION_MISSILE_SPEED = 400
    constant real ARCANE_EXPLOSION_TIMEOUT = 0.02
    // ENDSETUP



    player ARCANE_EXPLOSION_ENUM_PLAYER
    boolexpr ARCANE_EXPLOSION_FILTER
    group ARCANE_EXPLOSION_GROUP
    group ARCANE_EXPLOSION_GROUP2
    hashtable ARCANE_EXPLOSION_TABLE
endglobals

constant function Arcane_Explosion_Conditions takes nothing returns boolean
    return GetSpellAbilityId(  ) == ARCANE_EXPLOSION_ABILITY_ID
endfunction

function Arcane_Explosion_Targets_Allowed takes nothing returns boolean
    local unit filterUnit = GetFilterUnit(  )
    if GetUnitState( filterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( filterUnit, ARCANE_EXPLOSION_ENUM_PLAYER ) and not IsUnitType( filterUnit, UNIT_TYPE_FLYING ) then
        set filterUnit = null
        return true
    endif
    set filterUnit = null
    return false
endfunction

function Arcane_Explosion_Second_Loop takes nothing returns nothing
    local timer t = GetExpiredTimer(  )
    local integer parentKey = GetHandleId( t )
    local real x = LoadReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "x" ) )
    local real y = LoadReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "y" ) )
    local real distance = LoadReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "distance" ) ) - ARCANE_EXPLOSION_MISSILE_SPEED * ARCANE_EXPLOSION_TIMEOUT
    local unit array missile
    local unit target
    local real tx
    local real ty
    local real angle
    set bj_forLoopAIndex = 0
    loop
        set missile[bj_forLoopAIndex] = LoadUnitHandle( ARCANE_EXPLOSION_TABLE, parentKey, bj_forLoopAIndex )
        call SetUnitX( missile[bj_forLoopAIndex], x + distance * Cos( ( bj_forLoopAIndex * 360 / ARCANE_EXPLOSION_MISSILE_AMOUNT ) * bj_PI / 180 ) )
        call SetUnitY( missile[bj_forLoopAIndex], y + distance * Sin( ( bj_forLoopAIndex * 360 / ARCANE_EXPLOSION_MISSILE_AMOUNT ) * bj_PI / 180 ) )
        set missile[bj_forLoopAIndex] = null
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
        exitwhen bj_forLoopAIndex >= ARCANE_EXPLOSION_MISSILE_AMOUNT
    endloop
    set ARCANE_EXPLOSION_ENUM_PLAYER = LoadPlayerHandle( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "id" ) )
    call GroupEnumUnitsInRange( ARCANE_EXPLOSION_GROUP, x, y, distance + ARCANE_EXPLOSION_COLLISION_SIZE / 2, ARCANE_EXPLOSION_FILTER )
    call GroupEnumUnitsInRange( ARCANE_EXPLOSION_GROUP2, x, y, distance - ARCANE_EXPLOSION_COLLISION_SIZE / 2, ARCANE_EXPLOSION_FILTER )
    set bj_groupRemoveGroupDest = ARCANE_EXPLOSION_GROUP
    call ForGroup( ARCANE_EXPLOSION_GROUP2, function GroupRemoveGroupEnum )
    loop
        set target = FirstOfGroup( ARCANE_EXPLOSION_GROUP )
        exitwhen target == null
        set tx = GetUnitX( target )
        set ty = GetUnitY( target )
        set angle = Atan2( ty - y, tx - x )
        call SetUnitX( target, x + distance * Cos( angle ) )
        call SetUnitY( target, y + distance * Sin( angle ) )
        call GroupRemoveUnit( ARCANE_EXPLOSION_GROUP, target )
    endloop
    if distance <= 100 then
        call PauseTimer( t )
        call DestroyTimer( t )
        call FlushChildHashtable( ARCANE_EXPLOSION_TABLE, parentKey )
    else
        call SaveReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "distance" ), distance )
    endif
    set t = null
    set target = null
endfunction

function Arcane_Explosion_Loop takes nothing returns nothing
    local timer t = GetExpiredTimer(  )
    local integer parentKey = GetHandleId( t )
    local real x = LoadReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "x" ) )
    local real y = LoadReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "y" ) )
    local real distance = LoadReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "distance" ) ) + ARCANE_EXPLOSION_MISSILE_SPEED * ARCANE_EXPLOSION_TIMEOUT
    local unit array missile
    set bj_forLoopAIndex = 0
    loop
        set missile[bj_forLoopAIndex] = LoadUnitHandle( ARCANE_EXPLOSION_TABLE, parentKey, bj_forLoopAIndex )
        call SetUnitX( missile[bj_forLoopAIndex], x + distance * Cos( ( bj_forLoopAIndex * 360 / ARCANE_EXPLOSION_MISSILE_AMOUNT ) * bj_PI / 180 ) )
        call SetUnitY( missile[bj_forLoopAIndex], y + distance * Sin( ( bj_forLoopAIndex * 360 / ARCANE_EXPLOSION_MISSILE_AMOUNT ) * bj_PI / 180 ) )
        set missile[bj_forLoopAIndex] = null
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
        exitwhen bj_forLoopAIndex >= ARCANE_EXPLOSION_MISSILE_AMOUNT
    endloop
    if distance >= ARCANE_EXPLOSION_DISTANCE + 100 then
        call PauseTimer( t )
        call TimerStart( t, ARCANE_EXPLOSION_TIMEOUT, true, function Arcane_Explosion_Second_Loop )
    else
        call SaveReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "distance" ), distance )
    endif
    set t = null
endfunction

function Arcane_Explosion_Actions takes nothing returns nothing
    local timer t = CreateTimer(  )
    local integer parentKey = GetHandleId( t )
    local unit caster = GetTriggerUnit(  )
    local player id = GetOwningPlayer( caster )
    local real x = GetUnitX( caster )
    local real y = GetUnitY( caster )
    local unit array missile
    set bj_forLoopAIndex = 0
    loop
        set missile[bj_forLoopAIndex] = CreateUnit( id, ARCANE_EXPLOSION_MISSILE_ID, x + 100 * Cos( bj_forLoopAIndex * 360 / ARCANE_EXPLOSION_MISSILE_AMOUNT ), y + 100 * Sin( bj_forLoopAIndex * 360 / ARCANE_EXPLOSION_MISSILE_AMOUNT ), bj_forLoopAIndex * 360 / ARCANE_EXPLOSION_MISSILE_AMOUNT )
        call AddSpecialEffectTarget( ARCANE_EXPLOSION_MISSILE_ART, missile[bj_forLoopAIndex], "origin" )
        call SaveUnitHandle( ARCANE_EXPLOSION_TABLE, parentKey, bj_forLoopAIndex, missile[bj_forLoopAIndex] )
        call UnitApplyTimedLife( missile[bj_forLoopAIndex], 'BTLF', ARCANE_EXPLOSION_DISTANCE / ARCANE_EXPLOSION_MISSILE_SPEED * 2 )
        set missile[bj_forLoopAIndex] = null
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
        exitwhen bj_forLoopAIndex >= ARCANE_EXPLOSION_MISSILE_AMOUNT
    endloop
    call SavePlayerHandle( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "id" ), id )
    call SaveReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "x" ), x )
    call SaveReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "y" ), y )
    call SaveReal( ARCANE_EXPLOSION_TABLE, parentKey, StringHash( "distance" ), 100 )
    call TimerStart( t, ARCANE_EXPLOSION_TIMEOUT, true, function Arcane_Explosion_Loop )
    set t = null
    set caster = null
endfunction

//===========================================================================
function InitTrig_Arcane_Explosion takes nothing returns nothing
    local trigger trg = CreateTrigger(  )
    set bj_forLoopAIndex = 0
    loop
        call TriggerRegisterPlayerUnitEvent( trg, Player( bj_forLoopAIndex ), EVENT_PLAYER_UNIT_SPELL_EFFECT, null )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
        exitwhen bj_forLoopAIndex == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition( trg, Condition( function Arcane_Explosion_Conditions ) )
    call TriggerAddAction( trg, function Arcane_Explosion_Actions )
    set ARCANE_EXPLOSION_FILTER = Condition( function Arcane_Explosion_Targets_Allowed )
    set ARCANE_EXPLOSION_GROUP = CreateGroup(  )
    set ARCANE_EXPLOSION_GROUP2 = CreateGroup(  )
    set ARCANE_EXPLOSION_TABLE = InitHashtable(  )
    call Preload( ARCANE_EXPLOSION_MISSILE_ART )
    call PreloadStart(  )
    set trg = null
endfunction
 
Last edited:
Level 25
Joined
Jun 5, 2008
Messages
2,572
Holy s*** dude, that syntax is bad.

I mean seriously make it inside a library:

JASS:
library ArcaneExplosion initializer Init

private function Actions takes nothing returns nothing
...
endfunctions

private function Init takes nothing returns nothing
...
endfunction

endlibrary

Also make stuff private and use TimerUtils for the timers so you don't cause so much leaks.

The conditions are pure GUI to JASS conversion.

The variables name should be less in length.
JASS:
local unit filterUnit = GetFilterUnit( )
If the check is false you never null this.

Also make stuff private by adding
JASS:
private
in front of them.

Also the code is messy and a pain to read.

On the last note if you use timerutils you should be able to make this spell MUI without hashtables.
 
Level 5
Joined
Dec 8, 2008
Messages
102
Holy s*** dude, that syntax is bad.

I mean seriously make it inside a library:

JASS:
library ArcaneExplosion initializer Init

private function Actions takes nothing returns nothing
...
endfunctions

private function Init takes nothing returns nothing
...
endfunction

endlibrary

Also make stuff private and use TimerUtils for the timers so you don't cause so much leaks.

The conditions are pure GUI to JASS conversion.

The variables name should be less in length.
JASS:
local unit filterUnit = GetFilterUnit( )
If the check is false you never null this.

Also make stuff private by adding
JASS:
private
in front of them.

Also the code is messy and a pain to read.

On the last note if you use timerutils you should be able to make this spell MUI without hashtables.

sry but can just lol about this, i wrote that i DONT use libraries, its my decision, it changes NOTHING in efficiency. thank you, leak is fixed, will update tomorrow, private changes nothing in efficiency, that the code is messy is just your opinion, what does timerutils more than SaveInteger in a hashtable ?!? and the fact that i destroy timers is that i dont like timerutils and will add my own timer system next version (current timer system bugs cause of array )
 
Level 5
Joined
Dec 8, 2008
Messages
102
No, simply, no.
Having a standard (TimerUtils) is enough for every coder which does his job well, if everyone would reinvent the wheel we'd just get overloaded with those.

to make it more clearly it isnt a system, its more like the DIR
its an array of timers and at the beginning it loops through all created timers and takes the FIRST free one, just 2 functions in the spell are added and the timer problem is fixed instead of importing a whole library

and forgot kingz, they arent converted if you would look, the spell is
return
JASS:
GetSpellAbilityId....
is this converted ?
and :
JASS:
local unit filterUnit ...
since when does locals exist in GUI?

and why i should make the variable names shorter Oo i cant get it
 
Level 19
Joined
Feb 4, 2009
Messages
1,313
as far as I know the "private" stuff is not included in the normal WE
so I guess the JNGP will add some prefixes which won't interfere with the existing variables (probably)
the result would be the same

the speed advantage of using a global variable (bj_forLoopAIndex) instead of a local one is negligible considering the improved readability
however it changes nothing since people will just c&p this anyway

all the hassle about hashtables is useless anyway since the only way to get a significant speed incremental would be using arrays :p

and since I am new to JASS I'd like to know what scopes and librarys are good for :grin:
 
Level 5
Joined
Dec 8, 2008
Messages
102
as far as I know the "private" stuff is not included in the normal WE
so I guess the JNGP will add some prefixes which won't interfere with the existing variables (probably)
the result would be the same

the speed advantage of using a global variable (bj_forLoopAIndex) instead of a local one is negligible considering the improved readability
however it changes nothing since people will just c&p this anyway

all the hassle about hashtables is useless anyway since the only way to get a significant speed incremental would be using arrays :p

and since I am new to JASS I'd like to know what scopes and librarys are good for :grin:

pls give me some feedback^^ say the spell is shit or the spell is godlike, just say something xD a rate maybe?

i know what privates are used for, but my solution, just write arcane_explosion before the names, is 100000000% the same like what JNGP do, so its useless, i use the global cause then i dont need an extra line to declare an local integer^^ yeah i used arrays before, but i like it more if the spell is 100% leakfree and 80% efficient instead of 80% leakfree and 100$ efficient () so i use hashtables instead of globals, cause i cant clean a global array, i can just recycle it, but i can clean a hashtable to 100% ... and it doesnt matter in a normal map if you can use 160 or 200 missiles at the same time xD
 
Level 25
Joined
Jun 5, 2008
Messages
2,572
First of all if you would use libraries:
JASS:
    constant integer ARCANE_EXPLOSION_ABILITY_ID = 'A003' // the id of the spell, press "CTRL + D" and ull know what i mean
    constant real ARCANE_EXPLOSION_COLLISION_SIZE = 80 // the size of each missile to catch units
    constant real ARCANE_EXPLOSION_DISTANCE = 700 // the distance the missiles will travel forwars + backwards
    constant integer ARCANE_EXPLOSION_MISSILE_AMOUNT = 20 // dont overdo it with the number^^, 50 should be the max
    constant string ARCANE_EXPLOSION_MISSILE_ART = "Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl" // the path of the missile
    constant integer ARCANE_EXPLOSION_MISSILE_ID = 'h001'
constant real ARCANE_EXPLOSION_MISSILE_SPEED = 700 // it will travel this speed in both directions, forwars and rotation
    constant real ARCANE_EXPLOSION_TIMEOUT = 0.02 // 0.2 is highly recommended from my side, cause else it will look shabby, and with 10-20 missiles its no problem
Could be:
JASS:
    private constant integer ABILITY_ID = 'A003' // the id of the spell, press "CTRL + D" and ull know what i mean
    private constant real COLLISION_SIZE = 80 // the size of each missile to catch units
    private constant real DISTANCE = 700 // the distance the missiles will travel forwars + backwards
    private constant integer MISSILE_AMOUNT = 20 // dont overdo it with the number^^, 50 should be the max
    private constant string MISSILE_ART = "Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl" // the path of the missile
    private constant integer MISSILE_ID = 'h001'
    private constant real MISSILE_SPEED = 700 // it will travel this speed in both directions, forwars and rotation
    private constant real TIMEOUT = 0.02 // 0.2 is highly recommended from my side, cause else it will look shabby, and with 10-20 missiles its no problem

2nd there is no Jvass only vJASS.

3rd if you pull out things like new timer systems that do the same TimerUtils does the only thing that changes is that moderators put this on hold until you use TimerUtils, it is a Standard.

4th this is converted since every single jasser won't pull out these functions like this:
JASS:
GetFilterUnit( )
All normal jassers write their filters not convert GUI ones:
JASS:
GetFilterUnit()

The white spaces prove you converted, it is nothing bad but at least remove the white spaces.

5th God damn this is jass use local integers not BJ integers A and B.

6th exitwhen is put on loop start not end

7th Arcane_Explosion_*name* functions just look bad i mean if you would just use private functions and libraries everyone would be able to look @ the code without that much excess of letters.

8th are you kidding me? You inline bj_DEGTORAD? I mean wtf? Use radians, no discussion there.

9th The reason normal people use libraries is to prevent the following:
JASS:
set ARCANE_EXPLOSION_TABLE = null

For example anyone could just do that since the ARCANE_EXPLOSION_TABLE isn't private.
If it would be private no one could access it outside the library.

Hope i made myself clear about my opinion and what i think should be changed inside the spell, if you like it fine, if you don't fine again.

EDIT:

If you want this to be in real vJASS then you should make a struct inside a scope/library.
 
Level 5
Joined
Dec 8, 2008
Messages
102
First of all if you would use libraries:
JASS:
    constant integer ARCANE_EXPLOSION_ABILITY_ID = 'A003' // the id of the spell, press "CTRL + D" and ull know what i mean
    constant real ARCANE_EXPLOSION_COLLISION_SIZE = 80 // the size of each missile to catch units
    constant real ARCANE_EXPLOSION_DISTANCE = 700 // the distance the missiles will travel forwars + backwards
    constant integer ARCANE_EXPLOSION_MISSILE_AMOUNT = 20 // dont overdo it with the number^^, 50 should be the max
    constant string ARCANE_EXPLOSION_MISSILE_ART = "Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl" // the path of the missile
    constant integer ARCANE_EXPLOSION_MISSILE_ID = 'h001'
constant real ARCANE_EXPLOSION_MISSILE_SPEED = 700 // it will travel this speed in both directions, forwars and rotation
    constant real ARCANE_EXPLOSION_TIMEOUT = 0.02 // 0.2 is highly recommended from my side, cause else it will look shabby, and with 10-20 missiles its no problem
Could be:
JASS:
    private constant integer ABILITY_ID = 'A003' // the id of the spell, press "CTRL + D" and ull know what i mean
    private constant real COLLISION_SIZE = 80 // the size of each missile to catch units
    private constant real DISTANCE = 700 // the distance the missiles will travel forwars + backwards
    private constant integer MISSILE_AMOUNT = 20 // dont overdo it with the number^^, 50 should be the max
    private constant string MISSILE_ART = "Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl" // the path of the missile
    private constant integer MISSILE_ID = 'h001'
    private constant real MISSILE_SPEED = 700 // it will travel this speed in both directions, forwars and rotation
    private constant real TIMEOUT = 0.02 // 0.2 is highly recommended from my side, cause else it will look shabby, and with 10-20 missiles its no problem

2nd there is no Jvass only vJASS.

3rd if you pull out things like new timer systems that do the same TimerUtils does the only thing that changes is that moderators put this on hold until you use TimerUtils, it is a Standard.

4th this is converted since every single jasser won't pull out these functions like this:
JASS:
GetFilterUnit( )
All normal jassers write their filters not convert GUI ones:
JASS:
GetFilterUnit()

The white spaces prove you converted, it is nothing bad but at least remove the white spaces.

5th God damn this is jass use local integers not BJ integers A and B.

6th exitwhen is put on loop start not end

7th Arcane_Explosion_*name* functions just look bad i mean if you would just use private functions and libraries everyone would be able to look @ the code without that much excess of letters.

8th are you kidding me? You inline bj_DEGTORAD? I mean wtf? Use radians, no discussion there.

9th The reason normal people use libraries is to prevent the following:
JASS:
set ARCANE_EXPLOSION_TABLE = null

For example anyone could just do that since the ARCANE_EXPLOSION_TABLE isn't private.
If it would be private no one could access it outside the library.

Hope i made myself clear about my opinion and what i think should be changed inside the spell, if you like it fine, if you don't fine again.

EDIT:

If you want this to be in real vJASS then you should make a struct inside a scope/library.

well, then:

1) it changes nothing if its private, it will just change the names -.- rate the efficiency, nothing else

2) sry spelling mistake

3) i do not pull out new systems... just an timer array inside the spell, exactly the same when using structs, only with an array and with hashtables

4) look CLOSELY at the whole code, you might notice somethng, its my style to make space after ( and before ), so i dont write DestroyTimer(t) but i write DestroyTimer( t )

5) it doesnt change anything if i use a local instead of a, cause thats the only reason why a even exists :O

6) why should i put it on start? if you tell me i can change it

7) i say it now the last time, its the same, and thats my style

8) sry at this point i dont get what you mean :O

9) why should someone null this? ^^ my argumentation would be then: i cant prevent people to write in the spell actions into the library ...TABLE = null ^^

hope i made my point of view more clearly and sry for missunderstanding me :O
 
Level 5
Joined
Dec 8, 2008
Messages
102
Oh well your style is chaotic, and hard to read then.

You should understand that when you submit a spell it should be for public, therefore it should not be so hard to read cause of lots of text.

You inlined bj_DEGTORAD: bj_PI / 180

i think ... if someone needs to download the spell he or she will not be able to change the code in a correct way ... so i made a header which is well documentated, all variables are clear

and i still dont get it^^
why is it bad to inline the function bj_DEGTORAD? its better to call the function itself and take the returned value :O
 
Level 5
Joined
Dec 8, 2008
Messages
102
ARCANE_EXPLOSION_MISSILE_AMOUNT, this variable is the problem :D
if its for example 10, the calculations will be 360 / ARCANE_EXPLOSION_MISSILE_AM...
this would return 36 in this case, and this needs to be converted to radians... i really dont know how to use radians without converting to degrees before with this variable^^
and i dont think that + / - / * / / operators will change anything in efficiency^^

fixed the leak, improved the code, wait for a mediator to check it :O

EDIT: removed the rotating thing cause of a weird bug ... check that today, update tomorrow
 
Level 17
Joined
Sep 8, 2007
Messages
994
OMG ... please, stop being so bullish and just use libraries and/or scopes, god damnit.
You act like a child not wanting to eat its broccoli -.-

Oh and btw, it supports efficiency indeed. Everything making the code safer increases the efficiency. With scopes and libraries you have less danger giving a global/function/etc. an already existing name by adding the keyword public/private to it than without. As user, I wouldn't use this due the too dangerous code.
 
Level 5
Joined
Dec 8, 2008
Messages
102
OMG ... please, stop being so bullish and just use libraries and/or scopes, god damnit.
You act like a child not wanting to eat its broccoli -.-

Oh and btw, it supports efficiency indeed. Everything making the code safer increases the efficiency. With scopes and libraries you have less danger giving a global/function/etc. an already existing name by adding the keyword public/private to it than without. As user, I wouldn't use this due the too dangerous code.

well i made it as jass spell originally but i like the blizlike global header from vJass which is very userfriendly
 
Top