1. Are you planning to upload your awesome tool to Hive? Please review the rules here.
    July 9, 2018: The rules for the Tool Section have been revised. Please be sure to read the revisions.
    Dismiss Notice
  2. The Aftermath has been revealed for the 19th Terraining Contest! Be sure to check out the Results and see what came out of it.
    Dismiss Notice
  3. Melee Mapping Contest #3 - Results are out! Congratulate the winners and check plenty of new 4v4 melee maps designed for this competition!
    Dismiss Notice
  4. The winners of our cinematic soundtrack competition have been decided! Step by the Music Contest #11 - Results to check the entries and congratulate the winners!
    Dismiss Notice

Script Language Aligner (Jass, vJass, Zinc)

Submitted by The_Witcher
This bundle is marked as approved. It works and satisfies the submission rules.
@ first: This resource IS mine! I coded it and everything inside is made by me, The_Witcher!

Script Language Aligner

Have you ever hade a code with a bad indenting??
Moderators always complain about your lack of white space??
it's very difficult to look through a code that looks bad and it's very difficult to review one too!

Simply press the customizable hotkey and all code in the active window gets indented perfectly!
Of course you can always retrieve the original unindented code!

example:
Can you easily read this code?
Code (vJASS):
library DoorSystem initializer Init
    // Door system by The_Witcher
    //
// this system opens every instance of the registered doortypes when a units comes close
// if the unit moves away from the door it will close again

    globals
        //if this is true doors will only close on leave if there are no units in their range
        public boolean CLOSE_ONLY_WHEN_EMPTY = true
         // These are the standart animations for the doors in your map
        private constant string STANDART_OPEN_ANIMATION = "Death Alternate"
                private constant string STANDART_STAND_OPEN_ANIMATION = "Stand Alternate"
        private constant string STANDART_CLOSE_ANIMATION = "Birth"
            private constant string STANDART_STAND_CLOSE_ANIMATION = "stand"
    endglobals

    //Doors will only be triggered when the entering unit matches these conditions
            private function DoorEventConditions takes nothing returns boolean
        return not (IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD) or GetUnitTypeId(GetFilterUnit()) == 0 )
            endfunction

    //-----------Don't modify anything below this line---------

            globals
                private integer array doors
        private real array range
               private integer total
        private hashtable h
                private boolexpr filt
                    private boolexpr enter
        private integer i
        private group g
        private timer tim
    endglobals

            private function FilterFunc takes nothing returns boolean
        return GetDestructableTypeId(GetFilterDestructable()) == doors[i] and LoadBoolean(h,GetHandleId(GetFilterDestructable()),1) != true and LoadBoolean(h,GetHandleId(GetFilterDestructable()),2) != true
    endfunction
       
    private function DoorActions takes nothing returns nothing
                    local destructable d = LoadDestructableHandle(h,GetHandleId(GetTriggeringTrigger()),0)  
        if GetTriggerEventId()==EVENT_GAME_ENTER_REGION and not LoadBoolean(h,GetHandleId(d),0) then
    call KillDestructable(d)
call SaveBoolean(h,GetHandleId(d),0,true)
            call SetDestructableAnimation(d,LoadStr(h,GetDestructableTypeId(d),4))
    call QueueDestructableAnimation(d,LoadStr(h,GetDestructableTypeId(d),5))
        elseif GetTriggerEventId()==EVENT_GAME_LEAVE_REGION and LoadBoolean(h,GetHandleId(d),0) then
            if not CLOSE_ONLY_WHEN_EMPTY then
                call DestructableRestoreLife(d,GetDestructableMaxLife(d),true)
                call SaveBoolean(h,GetHandleId(d),0,false)
      call SetDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),6))
                call QueueDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),7))
            else
          call GroupClear(g)
                call GroupEnumUnitsInRect(g, LoadRectHandle(h,GetHandleId(d),3), enter)
                if FirstOfGroup(g) == null then
        call DestructableRestoreLife(d,GetDestructableMaxLife(d),true)
                    call SaveBoolean(h,GetHandleId(d),0,false)
               call SetDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),6))
             call QueueDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),7))
                endif
            endif
endif
set d = null
    endfunction

private function RegisterEvents takes nothing returns nothing
local destructable d = GetEnumDestructable()
local trigger t = CreateTrigger()
local region g = CreateRegion()
local real x = GetDestructableX(d)
local real y = GetDestructableY(d)
local rect r = Rect(x-range[i], y-range[i], x+range[i], y+range[i])
call RegionAddRect(g,r)
call SaveBoolean(h,GetHandleId(d),0,false)
call SaveDestructableHandle(h,GetHandleId(t),0,d)
call SaveRectHandle(h,GetHandleId(d),3,r)
call SaveBoolean(h,GetHandleId(d),1,true)
call SaveStr(h,GetDestructableTypeId(d),4,STANDART_OPEN_ANIMATION)
call SaveStr(h,GetDestructableTypeId(d),5,STANDART_STAND_OPEN_ANIMATION)
call SaveStr(h,GetDestructableTypeId(d),6,STANDART_CLOSE_ANIMATION)
call SaveStr(h,GetDestructableTypeId(d),7,STANDART_STAND_CLOSE_ANIMATION)
call TriggerRegisterEnterRegion(t,g,enter)
call TriggerRegisterLeaveRegion(t,g,enter)
call TriggerAddAction(t,function DoorActions)
set t = null
set d = null
set r = null
set g = null
endfunction

            private function RescanAll takes nothing returns nothing
        set i = 0
        loop
    exitwhen i >= total
       call EnumDestructablesInRect(bj_mapInitialPlayableArea, filt, function RegisterEvents)
     set i = i + 1
        endloop
    endfunction

function OpenDoor takes destructable d, boolean flag returns nothing
call SaveBoolean(h,GetHandleId(h),0,flag)
endfunction

function ExcludeDoor takes destructable d, boolean flag returns nothing
call SaveBoolean(h,GetHandleId(h),2,flag)
endfunction
   
        function ChangeDoorTypeAnimations takes integer id, string openAnimation, string standOpenAnimation, string closeAnimation, string standCloseAnimation returns nothing
      call SaveStr(h,id,4,openAnimation)
        call SaveStr(h,id,5,standOpenAnimation)
    call SaveStr(h,id,6,closeAnimation)
        call SaveStr(h,id,7,standCloseAnimation)
    endfunction

        function AddDoorType takes integer id, real enterRange returns nothing
            set doors[total] = id
        set range[total] = enterRange
                    call SaveStr(h,id,4,STANDART_OPEN_ANIMATION)
        call SaveStr(h,id,5,STANDART_STAND_OPEN_ANIMATION)
            call SaveStr(h,id,6,STANDART_CLOSE_ANIMATION)
                call SaveStr(h,id,7,STANDART_STAND_CLOSE_ANIMATION)
            set total = total + 1
        call RescanAll()
        endfunction

  private function Init takes nothing returns nothing
                set h = InitHashtable()
        set total = 0
                set filt = Condition(function FilterFunc)
            set enter = Condition(function DoorEventConditions)
        set g = CreateGroup()
        set tim = CreateTimer()
        endfunction
       
            private function CatchNewDoors takes integer objectid, real x, real y, real face, real scale, integer variation returns nothing
                call TimerStart(tim,0.01,false,function RescanAll)
            endfunction
   
            private function CatchNewDoors2 takes integer objectid, real x, real y, real z, real face, real scale, integer variation returns nothing
                call TimerStart(tim,0.01,false,function RescanAll)
        endfunction
   
hook CreateDestructable CatchNewDoors
  hook CreateDestructableZ CatchNewDoors2

    endlibrary


Now i use my tool and this is what comes out (all options enabled):

Looks beautiful
Code (vJASS):
library DoorSystem initializer Init
    // Door system by The_Witcher
    //
// this system opens every instance of the registered doortypes when a units comes close
// if the unit moves away from the door it will close again

    globals
        //if this is true doors will only close on leave if there are no units in their range
        public boolean CLOSE_ONLY_WHEN_EMPTY = true
         // These are the standart animations for the doors in your map
        private constant string STANDART_OPEN_ANIMATION = "Death Alternate"
        private constant string STANDART_STAND_OPEN_ANIMATION = "Stand Alternate"
        private constant string STANDART_CLOSE_ANIMATION = "Birth"
        private constant string STANDART_STAND_CLOSE_ANIMATION = "stand"
    endglobals

    //Doors will only be triggered when the entering unit matches these conditions
    private function DoorEventConditions takes nothing returns boolean
        return not (IsUnitType(GetFilterUnit(), UNIT_TYPE_DEAD) or GetUnitTypeId(GetFilterUnit()) == 0 )
    endfunction

    //-----------Don't modify anything below this line---------

    globals
        private integer array doors
        private real array range
        private integer total
        private hashtable h
        private boolexpr filt
        private boolexpr enter
        private integer i
        private group g
        private timer tim
    endglobals

    private function FilterFunc takes nothing returns boolean
        return GetDestructableTypeId(GetFilterDestructable()) == doors[i] and LoadBoolean(h, GetHandleId(GetFilterDestructable()), 1) != true and LoadBoolean(h, GetHandleId(GetFilterDestructable()), 2) != true
    endfunction
       
    private function DoorActions takes nothing returns nothing
        local destructable d = LoadDestructableHandle(h, GetHandleId(GetTriggeringTrigger()), 0)
        if GetTriggerEventId() == EVENT_GAME_ENTER_REGION and not LoadBoolean(h, GetHandleId(d), 0) then
            call KillDestructable(d)
            call SaveBoolean(h, GetHandleId(d), 0, true)
            call SetDestructableAnimation(d, LoadStr(h, GetDestructableTypeId(d), 4))
            call QueueDestructableAnimation(d, LoadStr(h, GetDestructableTypeId(d), 5))
        elseif GetTriggerEventId() == EVENT_GAME_LEAVE_REGION and LoadBoolean(h, GetHandleId(d), 0) then
            if not CLOSE_ONLY_WHEN_EMPTY then
                call DestructableRestoreLife(d, GetDestructableMaxLife(d), true)
                call SaveBoolean(h, GetHandleId(d), 0, false)
                call SetDestructableAnimation(d, LoadStr(h, GetDestructableTypeId(d), 6))
                call QueueDestructableAnimation(d, LoadStr(h, GetDestructableTypeId(d), 7))
            else
                call GroupClear(g)
                call GroupEnumUnitsInRect(g, LoadRectHandle(h, GetHandleId(d), 3), enter)
                if FirstOfGroup(g) == null then
                    call DestructableRestoreLife(d, GetDestructableMaxLife(d), true)
                    call SaveBoolean(h, GetHandleId(d), 0, false)
                    call SetDestructableAnimation(d, LoadStr(h, GetDestructableTypeId(d), 6))
                    call QueueDestructableAnimation(d, LoadStr(h, GetDestructableTypeId(d), 7))
                endif
            endif
        endif
        set d = null
    endfunction

    private function RegisterEvents takes nothing returns nothing
        local destructable d = GetEnumDestructable()
        local trigger t = CreateTrigger()
        local region g = CreateRegion()
        local real x = GetDestructableX(d)
        local real y = GetDestructableY(d)
        local rect r = Rect(x - range[i], y - range[i], x + range[i], y + range[i])
        call RegionAddRect(g, r)
        call SaveBoolean(h, GetHandleId(d), 0, false)
        call SaveDestructableHandle(h, GetHandleId(t), 0, d)
        call SaveRectHandle(h, GetHandleId(d), 3, r)
        call SaveBoolean(h, GetHandleId(d), 1, true)
        call SaveStr(h, GetDestructableTypeId(d), 4, STANDART_OPEN_ANIMATION)
        call SaveStr(h, GetDestructableTypeId(d), 5, STANDART_STAND_OPEN_ANIMATION)
        call SaveStr(h, GetDestructableTypeId(d), 6, STANDART_CLOSE_ANIMATION)
        call SaveStr(h, GetDestructableTypeId(d), 7, STANDART_STAND_CLOSE_ANIMATION)
        call TriggerRegisterEnterRegion(t, g, enter)
        call TriggerRegisterLeaveRegion(t, g, enter)
        call TriggerAddAction(t, function DoorActions)
        set t = null
        set d = null
        set r = null
        set g = null
    endfunction

    private function RescanAll takes nothing returns nothing
        set i = 0
        loop
            exitwhen i >= total
            call EnumDestructablesInRect(bj_mapInitialPlayableArea, filt, function RegisterEvents)
            set i = i + 1
        endloop
    endfunction

    function OpenDoor takes destructable d, boolean flag returns nothing
        call SaveBoolean(h, GetHandleId(h), 0, flag)
    endfunction

    function ExcludeDoor takes destructable d, boolean flag returns nothing
        call SaveBoolean(h, GetHandleId(h), 2, flag)
    endfunction
   
    function ChangeDoorTypeAnimations takes integer id, string openAnimation, string standOpenAnimation, string closeAnimation, string standCloseAnimation returns nothing
        call SaveStr(h, id, 4, openAnimation)
        call SaveStr(h, id, 5, standOpenAnimation)
        call SaveStr(h, id, 6, closeAnimation)
        call SaveStr(h, id, 7, standCloseAnimation)
    endfunction

    function AddDoorType takes integer id, real enterRange returns nothing
        set doors[total] = id
        set range[total] = enterRange
        call SaveStr(h, id, 4, STANDART_OPEN_ANIMATION)
        call SaveStr(h, id, 5, STANDART_STAND_OPEN_ANIMATION)
        call SaveStr(h, id, 6, STANDART_CLOSE_ANIMATION)
        call SaveStr(h, id, 7, STANDART_STAND_CLOSE_ANIMATION)
        set total = total + 1
        call RescanAll()
    endfunction

    private function Init takes nothing returns nothing
        set h = InitHashtable()
        set total = 0
        set filt = Condition(function FilterFunc)
        set enter = Condition(function DoorEventConditions)
        set g = CreateGroup()
        set tim = CreateTimer()
    endfunction
       
    private function CatchNewDoors takes integer objectid, real x, real y, real face, real scale, integer variation returns nothing
        call TimerStart(tim, 0.01, false, function RescanAll)
    endfunction
   
    private function CatchNewDoors2 takes integer objectid, real x, real y, real z, real face, real scale, integer variation returns nothing
        call TimerStart(tim, 0.01, false, function RescanAll)
    endfunction
   
    hook CreateDestructable CatchNewDoors
    hook CreateDestructableZ CatchNewDoors2

endlibrary


//Code indented using The_Witcher's Script language Aligner
//Download the newest version and report bugs at www.hiveworkshop.com


NOTE: works for the languages Jass, vJass and Zinc.

Updates
v.1.1: added support for static ifs, changed UI
v.1.2: major code changes, removed pascal support (since it has its own aligner), support for constant functions and crap code without spaces like ' if(s==2)then'
v.1.3: added support for modules
v.2.0: rewrote the whole code: no more bugs regardin static, private, constant etc. prefixes, option to recover old code (in case the program fails), option to format spaces
v.2.1: added support for strings like "-n" which became " - n" before, added support for /* and */, fixed a bug regarding the "private" and "static" combination, changed default options
v.3.0: rewrote a lot of the code! added zinc support and fixed "operator x=" bug
v.3.1: fixed a small bug, fixed interface bug, fixed "i = - 1" bug so it becomes "i = -1" now
v.3.2: added hotkey ctrl + [yourHotkey] to automatically indent


Keywords:
script, code, language, vJass, jass, zinc, delphi, help, structure, align, warcraft, indent
Contents

Script Language Aligner (Jass, vJass, Zinc) (Binary)

Reviews
Moderator
18:51 October 1, 2012: Magtheridon96: Approved. 4/5 for being a life-saver when I find someone with terrible code indentation.
  1. 18:51 October 1, 2012:
    Magtheridon96:

    Approved.
    4/5 for being a life-saver when I find someone with terrible code indentation.
     
  2. The_Witcher

    The_Witcher

    Joined:
    Dec 29, 2008
    Messages:
    229
    Resources:
    13
    Tools:
    1
    Spells:
    12
    Resources:
    13
    Please tell me what you think about it and report bugs etc. to me by PM!

    tool supports english and german language (automatic detection)
     
  3. Adiktuz

    Adiktuz

    Joined:
    Oct 16, 2008
    Messages:
    9,674
    Resources:
    23
    Models:
    2
    Packs:
    1
    Maps:
    1
    Spells:
    16
    Tutorials:
    1
    JASS:
    2
    Resources:
    23
    oh, pretty cool... especially for those who are lazy to properly indent their codes. ^_^

    I'll be using this for some codes on my map which has bad aligning. ^_^
     
  4. hell gate

    hell gate

    Joined:
    Nov 23, 2008
    Messages:
    477
    Resources:
    10
    Models:
    1
    Spells:
    9
    Resources:
    10
    hehe nice :)
    made with visual studio?
     
  5. Cokemonkey11

    Cokemonkey11

    Wurst Reviewer

    Joined:
    May 9, 2006
    Messages:
    3,153
    Resources:
    18
    Tools:
    1
    Maps:
    5
    Spells:
    3
    Tutorials:
    2
    JASS:
    7
    Resources:
    18
    Very awesome, will help with reading other's code.

    5*
     
  6. Kercyn

    Kercyn

    Joined:
    Feb 14, 2009
    Messages:
    850
    Resources:
    0
    Resources:
    0
    A handy tool. Could really help those too lazy to indent their their code, as Adictuz said :)
     
  7. PurgeandFire

    PurgeandFire

    Code Moderator

    Joined:
    Nov 11, 2006
    Messages:
    7,418
    Resources:
    18
    Icons:
    1
    Spells:
    4
    Tutorials:
    9
    JASS:
    4
    Resources:
    18
    Great tool. :) I believe Bob666 made something similar (as well as JASSCraft), but I don't think it works with vJass so this tool is definitely good. It works fine without any bugs as far as I've checked.
     
  8. Miss_Foxy

    Miss_Foxy

    Joined:
    Oct 15, 2008
    Messages:
    2,821
    Resources:
    0
    Resources:
    0
    This is nice, simple and sweet.
     
  9. Raven0

    Raven0

    Joined:
    Oct 16, 2010
    Messages:
    878
    Resources:
    2
    Maps:
    2
    Resources:
    2
    epic ^-^
     
  10. Teldrassil

    Teldrassil

    Joined:
    Feb 7, 2005
    Messages:
    402
    Resources:
    6
    Maps:
    6
    Resources:
    6
    Very nice and useful, glad to see you're still making such great stuff Witcher :)

    I'm all for coding convenience.
     
  11. naitsirk

    naitsirk

    Joined:
    Jan 24, 2009
    Messages:
    570
    Resources:
    0
    Resources:
    0
    What language is it scripted in, and could I get the code to look at it and learn it? (If it's C# or C++, or JAVA)
     
  12. CeDiL

    CeDiL

    Joined:
    Jan 23, 2008
    Messages:
    301
    Resources:
    3
    Models:
    1
    Icons:
    1
    Maps:
    1
    Resources:
    3
    Indeed as said, this is great. Good job.
     
  13. Sorceress

    Sorceress

    Joined:
    Jul 28, 2009
    Messages:
    1,023
    Resources:
    1
    Template:
    1
    Resources:
    1
    ▄██████████████▄▐█▄▄▄▄█▌
    ██████▌▄▌▄▐▐▌███▌▀▀██▀▀
    ████▄█▌▄▌▄▐▐▌▀███▄▄█▌
    ▄▄▄▄▄██████████████▀

    Noooo, jkjk.
    Could be Very useful for alot of people.
    Nice one!
     
  14. Garfield1337

    Garfield1337

    Joined:
    Jul 6, 2009
    Messages:
    1,806
    Resources:
    4
    Maps:
    1
    Spells:
    3
    Resources:
    4
    This is surely useful,not only if you're lazy,but you can write code faster without indenting and use this tool to align it :3
     
  15. DoctorGester

    DoctorGester

    Joined:
    Dec 6, 2009
    Messages:
    75
    Resources:
    3
    Maps:
    2
    JASS:
    1
    Resources:
    3
    Very useful.
     
  16. ToS-Master

    ToS-Master

    Joined:
    Aug 27, 2008
    Messages:
    17
    Resources:
    0
    Resources:
    0
    Good job. Good job. I like it.
     
  17. Axarion

    Axarion

    Joined:
    Sep 30, 2009
    Messages:
    675
    Resources:
    1
    Spells:
    1
    Resources:
    1
    I tested this out and it can become really useful especially if you want to add another if and would need to align 50 lines :p I found 1 single bug until now: If you have a function interface it indents everything below it what does kind of suck :(
     
  18. Magtheridon96

    Magtheridon96

    Joined:
    Dec 12, 2008
    Messages:
    6,005
    Resources:
    26
    Maps:
    1
    Spells:
    8
    Tutorials:
    7
    JASS:
    10
    Resources:
    26
    Would it work if the code you want to align looked like this:

    Code (vJASS):
    function bla takes nothing returns booleanif x=y thenreturn trueendifendfunction


    This is the kind of code you would find in the war3map.j of any map (protected or not i think ;p)
     
  19. hell gate

    hell gate

    Joined:
    Nov 23, 2008
    Messages:
    477
    Resources:
    10
    Models:
    1
    Spells:
    9
    Resources:
    10
    no i also tryed to do some kind of that but it's not that easy (and also not fast) because you have (i think) to make a loop of num of chars ^ 2 or even more

    Edit: btw: HAAAAAX :D