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

Script Language Aligner (Jass, vJass, Zinc)

@ 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:
JASS:
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):

JASS:
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.

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
18:51 October 1, 2012: Magtheridon96: Approved. 4/5 for being a life-saver when I find someone with terrible code indentation.
Could you fix this:

set i = -1
->
set i = - 1

- 1 is ugly :p
You'd just have to detect if the following characters are before it:
"="
"(" - excluding ")"
","

Also, you only need to add spaces so the code looks like this:

call function(param, param, param)
not
call function ( param , param , param )

:p

fixed! but this: call function ( param , param , param ) never happens! only if you added the space before the comma
 
Level 2
Joined
Dec 3, 2019
Messages
11
request to add:

1 - spaces around commas --- replace asd(a,b,c,d) not to asd( a,b,c,d ) but to asd( a , b , c , d)
2 - spaces around arrays --- replace m[1] to m [ 1 ]
3 - spaces between function and bracket --- replace call func(a) to call func (a)
 
Top