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

Model and Effects Viewer v3.7

CHA_Owner Presents

Model and Effects Viewer
Created by razor21, a.k.a gekigengar

Map Info


This is basically just a very advanced version of the "Epic Animation Viewer" and of course I got full permission to continue this system;

razor21 said:
if it needed the use of WEU to open it, i am not gonna update it to the main thread of my animation viewer, i want to keep the main map as simple as possible.

you have my permission to upload it,
But, you must include this complete PM on the page you uploaded.

i just want to keep it as simple as possible, having the need of WEU/any 3rd party completely defeats its whole purpose of simplicity in replacing the actor.

thanks for the dedication!
razor21, a.k.a gekigengar

Features


This system comes loaded with a ton of special features such as;
  • Easily view any model or effect in wc3.
  • Skip through effects using chat commands.
  • Loop unit animations while viewing them.
  • Adjust your camera anyway that you desire.
  • Easily add/remove any additional models or effects.
  • Even view attachments on a unit while using animations.

Testers/Viewers Included


These are the testers included so far;
  • Animations/Animation Names.
  • Sky Models/Sky Model Names and Raw Codes.
  • Terrain Tiles/Terrain Tile Names and Raw Codes.
  • Ubersplat Effects/Ubersplat Names and Raw Codes.
  • Lightning Effects/Lightning Names and Raw Codes.
  • Fade Filters/Fade Filter Names and Paths.
  • Weather Effects/Weather Effect Names and Raw Codes.
  • Attachment Models/Attachment Names and Paths.

vJASS Triggers


JASS:
library FirstInitialization initializer Init

    // Setting up global declarations
    globals
        boolean LoopingCommand
        boolean ShowBoard
        boolean array ArrowKey
        camerasetup Camera
        effect array TempEffect
        integer CamMode
        integer NewTerrainType
        integer SystemInUse
        integer TerrainType
        integer array Index
        integer array MinIndex
        integer array MaxIndex
        integer array TerrainChoice
        integer array WeatherChoice
        lightning TempLightning = null
        real XofActor
        real YofActor
        real NewYofActor
        real FinalYofActor
        real array CamSetting
        string array AnimationName
        string array AnimationNameA
        string array BootsChoiceLeft
        string array BootsChoiceRight
        string array BootsName
        string array BracersChoiceLeft
        string array BracersChoiceRight
        string array BracersName
        string array CameraModeName
        string array ChestChoice
        string array ChestName
        string array FadeChoice
        string array FadeName
        string array HelmetChoice
        string array HelmetName
        string array LightningChoice
        string array LightningName
        string array Line
        string array ShieldChoice
        string array ShieldName
        string array SkyChoice
        string array SkyName
        string array SwordChoice
        string array SwordName
        string array TerrainName
        string array UbersplatChoice
        string array UbersplatName
        string array WeatherName
        trigger Looping
        unit array Actor
        unit array ControlPanel
        BoardEx Board
    endglobals
    // --------------------------------------------

    private function InitActionsFirst takes nothing returns nothing
 
        // Terrain Tile Name Changer
        set Index[0] = 0
        set TerrainName[0] = "None"
        set TerrainName[1] = "('Ldrt') Lordaeron Summer Dirt (cliff)"
        set TerrainName[2] = "('Ldro') Lordaeron Summer Rough Dirt"
        set TerrainName[3] = "('Ldrg') Lordaeron Summer Grassy Dirt"
        set TerrainName[4] = "('Lrok') Lordaeron Summer Rock"
        set TerrainName[5] = "('Lgrs') Lordaeron Summer Grass (cliff)"
        set TerrainName[6] = "('Lgrd') Lordaeron Summer Dark Grass"
        set TerrainName[7] = "('Fdrt') Lordaeron Fall Dirt (cliff)"
        set TerrainName[8] = "('Fdro') Lordaeron Fall Rough Dirt"
        // --------------------------------------------
 
        // Terrain Tile Index Changer
        set TerrainChoice[1] = 'Ldrt'
        set TerrainChoice[2] = 'Ldro'
        set TerrainChoice[3] = 'Ldrg'
        set TerrainChoice[4] = 'Lrok'
        set TerrainChoice[5] = 'Lgrs'
        set TerrainChoice[6] = 'Lgrd'
        set TerrainChoice[7] = 'Fdrt'
        set TerrainChoice[8] = 'Fdro'
        // Terrain Tile Max and Min Index
        set MinIndex[0] = 0
        set MaxIndex[0] = 8
        // --------------------------------------------
 
        // Ubersplat Name Changer
        set Index[1] = 0
        set UbersplatName[0] = "None"
        set UbersplatName[1] = "(\"LSDS\") Lordaeron Summer Plain Dirt Small"
        set UbersplatName[2] = "(\"LSDM\") Lordaeron Summer Plain Dirt Medium"
        set UbersplatName[3] = "(\"LSDL\") Lordaeron Summer Plain Dirt Large"
        set UbersplatName[4] = "(\"HCRT\") Human Crater"
        set UbersplatName[5] = "(\"UDSU\") Undead Uber Splat"
        set UbersplatName[6] = "(\"DNCS\") Death Neutral City Building Small"
        set UbersplatName[7] = "(\"HMTP\") Human Mass Teleport"
        set UbersplatName[8] = "(\"SCTP\") Scroll Of Town Portal"
        set UbersplatName[9] = "(\"AMRC\") Amulet Of Recall"
        set UbersplatName[10] = "(\"DRKC\") Dark Conversion"
        set UbersplatName[11] = "(\"DOSB\") Death Orc Small Building"
        set UbersplatName[12] = "(\"DOMB\") Death Orc Medium Building"
        set UbersplatName[13] = "(\"DOLB\") Death Orc Large Building"
        set UbersplatName[14] = "(\"DHSB\") Death Human Small Building"
        set UbersplatName[15] = "(\"DHMB\") Death Human Medium Building"
        set UbersplatName[16] = "(\"DHLB\") Death Human Large Building"
        set UbersplatName[17] = "(\"DUSB\") Death Undead Small Building"
        set UbersplatName[18] = "(\"DUMB\") Death Undead Medium Building"
        set UbersplatName[19] = "(\"DULB\") Death Undead Large Building"
        set UbersplatName[20] = "(\"DNSB\") Death NightElf Small Building"
        set UbersplatName[21] = "(\"DNMB\") Death NightElf Medium Building"
        set UbersplatName[22] = "(\"DNSA\") Death NightElf Small Ancient"
        set UbersplatName[23] = "(\"DNMA\") Death NightElf Medium Ancient"
        set UbersplatName[24] = "(\"HSMA\") Human Small Building"
        set UbersplatName[25] = "(\"HMED\") Human Medium Building"
        set UbersplatName[26] = "(\"HLAR\") Human Large Building"
        set UbersplatName[27] = "(\"OSMA\") Orc Small Building"
        set UbersplatName[28] = "(\"OMED\") Orc Medium Building"
        set UbersplatName[29] = "(\"OLAR\") Orc Large Building"
        set UbersplatName[30] = "(\"USMA\") Undead Small Building"
        set UbersplatName[31] = "(\"UMED\") Undead Medium Building"
        set UbersplatName[32] = "(\"ULAR\") Undead Large Building"
        set UbersplatName[33] = "(\"ESMA\") NightElf Small Ancient"
        set UbersplatName[34] = "(\"EMDA\") NightElf Medium Ancient"
        set UbersplatName[35] = "(\"ESMB\") NightElf Small Building"
        set UbersplatName[36] = "(\"EMDB\") NightElf Medium Building"
        set UbersplatName[37] = "(\"HTOW\") Town Hall"
        set UbersplatName[38] = "(\"HCAS\") Castle"
        set UbersplatName[39] = "(\"NGOL\") Goldmine"
        set UbersplatName[40] = "(\"THND\") Thunder Clap"
        set UbersplatName[41] = "(\"NDGS\") Demon Gate"
        set UbersplatName[42] = "(\"CLTS\") Thorny Shield"
        set UbersplatName[43] = "(\"HFS1\") Human Flame Strike 1"
        set UbersplatName[44] = "(\"HFS2\") Human Flame Strike 2"
        set UbersplatName[45] = "(\"USBR\") Burrow"
        set UbersplatName[46] = "(\"NLAR\") Naga Large Building"
        set UbersplatName[47] = "(\"NMED\") Naga Medium Building"
        set UbersplatName[48] = "(\"DPSW\") Dark Portal SW"
        set UbersplatName[49] = "(\"DPSE\") Dark Portal SE"
        set UbersplatName[50] = "(\"NVOL\") Volcano"
        set UbersplatName[51] = "(\"NVCR\") Volcano Crater"
        // --------------------------------------------
 
        // Ubersplat Index Changer
        set UbersplatChoice[1] = "LSDS"
        set UbersplatChoice[2] = "LSDM"
        set UbersplatChoice[3] = "LSDL"
        set UbersplatChoice[4] = "HCRT"
        set UbersplatChoice[5] = "UDSU"
        set UbersplatChoice[6] = "DNCS"
        set UbersplatChoice[7] = "HMTP"
        set UbersplatChoice[8] = "SCTP"
        set UbersplatChoice[9] = "AMRC"
        set UbersplatChoice[10] = "DRKC"
        set UbersplatChoice[11] = "DOSB"
        set UbersplatChoice[12] = "DOMB"
        set UbersplatChoice[13] = "DOLB"
        set UbersplatChoice[14] = "DHSB"
        set UbersplatChoice[15] = "DHMB"
        set UbersplatChoice[16] = "DHLB"
        set UbersplatChoice[17] = "DUSB"
        set UbersplatChoice[18] = "DUMB"
        set UbersplatChoice[19] = "DULB"
        set UbersplatChoice[20] = "DNSB"
        set UbersplatChoice[21] = "DNMB"
        set UbersplatChoice[22] = "DNSA"
        set UbersplatChoice[23] = "DNMA"
        set UbersplatChoice[24] = "HSMA"
        set UbersplatChoice[25] = "HMED"
        set UbersplatChoice[26] = "HLAR"
        set UbersplatChoice[27] = "OSMA"
        set UbersplatChoice[28] = "OMED"
        set UbersplatChoice[29] = "OLAR"
        set UbersplatChoice[30] = "USMA"
        set UbersplatChoice[31] = "UMED"
        set UbersplatChoice[32] = "ULAR"
        set UbersplatChoice[33] = "ESMA"
        set UbersplatChoice[34] = "EMDA"
        set UbersplatChoice[35] = "ESMB"
        set UbersplatChoice[36] = "EMDB"
        set UbersplatChoice[37] = "HTOW"
        set UbersplatChoice[38] = "HCAS"
        set UbersplatChoice[39] = "NGOL"
        set UbersplatChoice[40] = "THND"
        set UbersplatChoice[41] = "NDGS"
        set UbersplatChoice[42] = "CLTS"
        set UbersplatChoice[43] = "HFS1"
        set UbersplatChoice[44] = "HFS2"
        set UbersplatChoice[45] = "USBR"
        set UbersplatChoice[46] = "NLAR"
        set UbersplatChoice[47] = "NMED"
        set UbersplatChoice[48] = "DPSW"
        set UbersplatChoice[49] = "DPSE"
        set UbersplatChoice[50] = "NVOL"
        set UbersplatChoice[51] = "NVCR"
        // Ubersplat Max and Min Index
        set MinIndex[1] = 0
        set MaxIndex[1] = 51
        // --------------------------------------------
 
        // Lightning Name Changer
        set Index[2] = 0
        set LightningName[0] = "None"
        set LightningName[1] = "(\"CLPB\") Chain Lightning - Primary"
        set LightningName[2] = "(\"CLSB\") Chain Lightning - Secondary"
        set LightningName[3] = "(\"DRAB\") Drain"
        set LightningName[4] = "(\"DRAL\") Drain Life"
        set LightningName[5] = "(\"DRAM\") Drain Mana"
        set LightningName[6] = "(\"AFOD\") Finger of Death"
        set LightningName[7] = "(\"FORK\") Forked Lightning"
        set LightningName[8] = "(\"HWPB\") Healing Wave - Primary"
        set LightningName[9] = "(\"HWSB\") Healing Wave - Secondary"
        set LightningName[10] = "(\"CHIM\") Lightning Attack"
        set LightningName[11] = "(\"LEAS\") Magic Leash"
        set LightningName[12] = "(\"MBUR\") Mana Burn"
        set LightningName[13] = "(\"MFPB\") Mana Flare"
        set LightningName[14] = "(\"SPLK\") Spirit Link"
        // --------------------------------------------
 
        // Lightning Index Changer
        set LightningChoice[1] = "CLPB"
        set LightningChoice[2] = "CLSB"
        set LightningChoice[3] = "DRAB"
        set LightningChoice[4] = "DRAL"
        set LightningChoice[5] = "DRAM"
        set LightningChoice[6] = "AFOD"
        set LightningChoice[7] = "FORK"
        set LightningChoice[8] = "HWPB"
        set LightningChoice[9] = "HWSB"
        set LightningChoice[10] = "CHIM"
        set LightningChoice[11] = "LEAS"
        set LightningChoice[12] = "MBUR"
        set LightningChoice[13] = "MFPB"
        set LightningChoice[14] = "SPLK"
        // Lightning Max and Min Index
        set MinIndex[2] = 0
        set MaxIndex[2] = 14
        // --------------------------------------------
 
        // Fade Filter Name Changer
        set Index[3] = 0
        set FadeName[0] = "None"
        set FadeName[1] = "White Mask"
        set FadeName[2] = "Black Mask"
        set FadeName[3] = "Haze Filter"
        set FadeName[4] = "Ground Fog"
        set FadeName[5] = "Haze And Fog"
        set FadeName[6] = "Diagonal Slash"
        set FadeName[7] = "Dream"
        set FadeName[8] = "Scope"
        set FadeName[9] = "Pow!"
        set FadeName[10] = "Splatt!"
        set FadeName[11] = "Panda-n-Cub"
        // --------------------------------------------
 
        // Fade Filter Index Changer
        set FadeChoice[1] = "ReplaceableTextures\\CameraMasks\\White_mask.blp"
        set FadeChoice[2] = "ReplaceableTextures\\CameraMasks\\Black_mask.blp"
        set FadeChoice[3] = "ReplaceableTextures\\CameraMasks\\HazeFilter_mask.blp"
        set FadeChoice[4] = "ReplaceableTextures\\CameraMasks\\GroundFog_mask.blp"
        set FadeChoice[5] = "ReplaceableTextures\\CameraMasks\\HazeAndFogFilter_Mask.blp"
        set FadeChoice[6] = "ReplaceableTextures\\CameraMasks\\DiagonalSlash_mask.blp"
        set FadeChoice[7] = "ReplaceableTextures\\CameraMasks\\DreamFilter_Mask.blp"
        set FadeChoice[8] = "ReplaceableTextures\\CameraMasks\\Scope_Mask.blp"
        set FadeChoice[9] = "ReplaceableTextures\\CameraMasks\\SpecialPowMask.blp"
        set FadeChoice[10] = "ReplaceableTextures\\CameraMasks\\SpecialSplatMask.blp"
        set FadeChoice[11] = "ReplaceableTextures\\CameraMasks\\Panda-n-Cub.blp"
        // Fade Filter Max and Min Index
        set MinIndex[3] = 0
        set MaxIndex[3] = 11
        // --------------------------------------------
 
        // Sky Name Changer
        set Index[4] = 0
        set SkyName[0] = "None"
        set SkyName[1] = "Blizzard Sky"
        set SkyName[2] = "Dalaran Sky"
        set SkyName[3] = "Felwood Sky"
        set SkyName[4] = "Fogged Sky"
        set SkyName[5] = "Generic Sky"
        set SkyName[6] = "Lordaeron Fall Sky"
        set SkyName[7] = "Lordaeron Summer Sky"
        set SkyName[8] = "Lordaeron Winter Sky"
        set SkyName[9] = "Lordaeron Winter Sky (Bright Green)"
        set SkyName[10] = "Lordaeron Winter Sky (Pink)"
        set SkyName[11] = "Lordaeron Winter Sky (Purple)"
        set SkyName[12] = "Lordaeron Winter Sky (Red)"
        set SkyName[13] = "Lordaeron Winter Sky (Yellow)"
        set SkyName[14] = "Outland Sky"
        // --------------------------------------------
 
        // Sky Index Changer
        set SkyChoice[1] = "Environment\\Sky\\BlizzardSky\\BlizzardSky.mdl"
        set SkyChoice[2] = "Environment\\Sky\\DalaranSky\\DalaranSky.mdl"
        set SkyChoice[3] = "Environment\\Sky\\FelwoodSky\\FelwoodSky.mdl"
        set SkyChoice[4] = "Environment\\Sky\\FoggedSky\\FoggedSky.mdl"
        set SkyChoice[5] = "Environment\\Sky\\Sky\\SkyLight.mdl"
        set SkyChoice[6] = "Environment\\Sky\\LordaeronFallSky\\LordaeronFallSky.mdl"
        set SkyChoice[7] = "Environment\\Sky\\LordaeronSummerSky\\LordaeronSummerSky.mdl"
        set SkyChoice[8] = "Environment\\Sky\\LordaeronWinterSky\\LordaeronWinterSky.mdl"
        set SkyChoice[9] = "Environment\\Sky\\LordaeronWinterSkyBrightGreen\\LordaeronWinterSkyBrightGreen.mdl"
        set SkyChoice[10] = "Environment\\Sky\\LordaeronWinterSkyPink\\LordaeronWinterSkyPink.mdl"
        set SkyChoice[11] = "Environment\\Sky\\LordaeronWinterSkyPurple\\LordaeronWinterSkyPurple.mdl"
        set SkyChoice[12] = "Environment\\Sky\\LordaeronWinterSkyRed\\LordaeronWinterSkyRed.mdl"
        set SkyChoice[13] = "Environment\\Sky\\LordaeronWinterSkyYellow\\LordaeronWinterSkyYellow.mdl"
        set SkyChoice[14] = "Environment\\Sky\\Outland_Sky\\Outland_Sky.mdl"
        // Sky Max and Min Index
        set MinIndex[4] = 0
        set MaxIndex[4] = 14
        // --------------------------------------------
 
        // Weather Name Changer
        set Index[5] = 0
        set WeatherName[0] = "None"
        set WeatherName[1] = "('RAhr') Ashenvale Rain (Heavy)"
        set WeatherName[2] = "('RAlr') Ashenvale Rain (Light)"
        set WeatherName[3] = "('MEds') Dalaran Shield"
        set WeatherName[4] = "('FDbh') Dungeon Blue Fog (Heavy)"
        set WeatherName[5] = "('FDbl') Dungeon Blue Fog (Light)"
        set WeatherName[6] = "('FDgh') Dungeon Green Fog (Heavy)"
        set WeatherName[7] = "('FDgl') Dungeon Green Fog (Light)"
        set WeatherName[8] = "('FDrh') Dungeon Red Fog (Heavy)"
        set WeatherName[9] = "('FDrl') Dungeon Red Fog (Light)"
        set WeatherName[10] = "('FDwh') Dungeon White Fog (Heavy)"
        set WeatherName[11] = "('FDwl') Dungeon White Fog (Light)"
        set WeatherName[12] = "('RLhr') Lordaeron Rain (Heavy)"
        set WeatherName[13] = "('RLlr') Lordaeron Rain (Light)"
        set WeatherName[14] = "('SNbs') Northrend Blizzard"
        set WeatherName[15] = "('SNhs') Northrend Snow (Heavy)"
        set WeatherName[16] = "('SNls') Northrend Snow (Light)"
        set WeatherName[17] = "('WOcw') Outland Wind (Heavy)"
        set WeatherName[18] = "('WOlw') Outland Wind (Light)"
        set WeatherName[19] = "('LRaa') Rays Of Light"
        set WeatherName[20] = "('LRma') Rays Of Moonlight"
        set WeatherName[21] = "('WNcw') Wind (Heavy)"
        // --------------------------------------------
 
        // Weather Index Changer
        set WeatherChoice[1]='RAhr'
        set WeatherChoice[2]='RAlr'
        set WeatherChoice[3]='MEds'
        set WeatherChoice[4]='FDbh'
        set WeatherChoice[5]='FDbl'
        set WeatherChoice[6]='FDgh'
        set WeatherChoice[7]='FDgl'
        set WeatherChoice[8]='FDrh'
        set WeatherChoice[9]='FDrl'
        set WeatherChoice[10]='FDwh'
        set WeatherChoice[11]='FDwl'
        set WeatherChoice[12]='RLhr'
        set WeatherChoice[13]='RLlr'
        set WeatherChoice[14]='SNbs'
        set WeatherChoice[15]='SNhs'
        set WeatherChoice[16]='SNls'
        set WeatherChoice[17]='WOcw'
        set WeatherChoice[18]='WOlw'
        set WeatherChoice[19]='LRaa'
        set WeatherChoice[20]='LRma'
        set WeatherChoice[21]='WNcw'
        // Weather Max and Min Index
        set MinIndex[5] = 0
        set MaxIndex[5] = 21
        // --------------------------------------------
     
        // Animation Name Changer
        set Index[6] = 0
        set AnimationName[0] = "Stand - 1"
        set AnimationName[1] = "Stand - 2"
        set AnimationName[2] = "Stand - 3"
        set AnimationName[3] = "Stand - 4"
        set AnimationName[4] = "Attack - 1"
        set AnimationName[5] = "Stand Work - 1"
        set AnimationName[6] = "Walk"
        set AnimationName[7] = "Death - 1"
        set AnimationName[8] = "Decay Flesh"
        set AnimationName[9] = "Decay Bone"
        set AnimationName[10] = "Stand Ready"
        set AnimationName[11] = "Stand Flesh First"
        set AnimationName[12] = "Stand Flesh Second"
        set AnimationName[13] = "Attack Morph - 1"
        set AnimationName[14] = "Attack Morph - 2"
        set AnimationName[15] = "Attack Morph - 3"
        set AnimationName[16] = "Attack Morph - 4"
        set AnimationName[17] = "Attack Morph - 5"
        set AnimationName[18] = "Attack Morph - 6"
        set AnimationName[19] = "Attack Morph - 7"
        set AnimationName[20] = "Attack Morph - 8"
        set AnimationName[21] = "Attack Morph - 9"
        set AnimationName[22] = "Attack Morph - 10"
        set AnimationName[23] = "Attack Morph - 11"
        set AnimationName[24] = "Attack Morph - 12"
        set AnimationName[25] = "Attack Morph - 13"
        set AnimationName[26] = "Attack Morph - 14"
        set AnimationName[27] = "Attack Morph - 15"
        set AnimationName[28] = "Attack Morph - 16"
        set AnimationName[29] = "Attack Morph - 17"
        set AnimationName[30] = "Attack Morph - 18"
        set AnimationName[31] = "Attack Morph - 19"
        set AnimationName[32] = "Attack Morph - 20"
        set AnimationName[33] = "Attack Morph - 21"
        set AnimationName[34] = "Attack Morph - 22"
        set AnimationName[35] = "Attack Morph - 23"
        set AnimationName[36] = "Attack Morph - 24"
        set AnimationName[37] = "Attack Morph - 25"
        set AnimationName[38] = "Attack Morph - 26"
        set AnimationName[39] = "Attack Morph - 27"
        set AnimationName[40] = "Attack Morph - 28"
        set AnimationName[41] = "Attack Morph - 29"
        set AnimationName[42] = "Attack Morph - 30"
        set AnimationName[43] = "Attack - 2"
        set AnimationName[44] = "Attack - 3"
        set AnimationName[45] = "Attack - 4"
        set AnimationName[46] = "Attack - 5"
        set AnimationName[47] = "Attack - 6"
        set AnimationName[48] = "Attack - 7"
        set AnimationName[49] = "Attack - 8"
        set AnimationName[50] = "Attack - 9"
        set AnimationName[51] = "Attack - 10"
        set AnimationName[52] = "Attack - 11"
        set AnimationName[53] = "Attack - 12"
        set AnimationName[54] = "Attack - 13"
        set AnimationName[55] = "Attack - 14"
        set AnimationName[56] = "Attack - 15"
        set AnimationName[57] = "Attack Alternate - 1"
        set AnimationName[58] = "Attack Alternate - 2"
        set AnimationName[59] = "Attack Alternate - 3"
        set AnimationName[60] = "Attack Alternate - 4"
        set AnimationName[61] = "Attack Alternate - 5"
        set AnimationName[62] = "Attack Alternate - 6"
        set AnimationName[63] = "Attack Alternate - 7"
        set AnimationName[64] = "Attack Alternate - 8"
        set AnimationName[65] = "Attack Alternate - 9"
        set AnimationName[66] = "Stand Hit - 1"
        set AnimationName[67] = "Stand Hit - 2"
        set AnimationName[68] = "Stand Hit - 3"
        set AnimationName[69] = "Stand Hit - 4"
        set AnimationName[70] = "Stand Hit - 5"
        set AnimationName[71] = "Stand Hit - 6"
        set AnimationName[72] = "Stand Hit - 7"
        set AnimationName[73] = "Stand Hit - 8"
        set AnimationName[74] = "Stand Hit - 9"
        set AnimationName[75] = "Stand Hit - 10"
        set AnimationName[76] = "Stand Hit - 11"
        set AnimationName[77] = "Stand Hit - 12"
        set AnimationName[78] = "Stand Hit - 13"
        set AnimationName[79] = "Stand Victory - 1"
        set AnimationName[80] = "Stand Victory - 2"
        set AnimationName[81] = "Stand Victory - 3"
        set AnimationName[82] = "Stand Victory - 4"
        set AnimationName[83] = "Stand Victory - 5"
        set AnimationName[84] = "Stand Victory - 6"
        set AnimationName[85] = "Stand Victory - 7"
        set AnimationName[86] = "Stand Victory - 9"
        set AnimationName[87] = "Stand Victory - 10"
        set AnimationName[88] = "Stand Victory - 11"
        set AnimationName[89] = "Stand Victory - 12"
        set AnimationName[90] = "Stand Victory - 13"
        set AnimationName[91] = "Walk Gold"
        set AnimationName[92] = "Stand Gold"
        set AnimationName[93] = "Attack Gold - 1"
        set AnimationName[94] = "Attack Gold - 2"
        set AnimationName[95] = "Walk Lumber"
        set AnimationName[96] = "Stand Lumber"
        set AnimationName[97] = "Attack Lumber - 1"
        set AnimationName[98] = "Stand Victory - 14"
        set AnimationName[99] = "Stand Victory - 15"
        set AnimationName[100] = "Stand Victory - 16"
        set AnimationName[101] = "Stand Victory - 17"
        set AnimationName[102] = "Attack Lumber - 2"
        set AnimationName[103] = "Stand Victory - 18"
        set AnimationName[104] = "Stand Victory - 19"
        set AnimationName[105] = "Stand Victory - 20"
        set AnimationName[106] = "Stand Victory - 21"
        set AnimationName[107] = "Stand Defend - 1"
        set AnimationName[108] = "Stand Defend - 2"
        set AnimationName[109] = "Stand Defend - 3"
        set AnimationName[110] = "Stand Defend - 4"
        set AnimationName[111] = "Stand Defend - 5"
        set AnimationName[112] = "Walk Defend"
        set AnimationName[113] = "Attack Defend - 1"
        set AnimationName[114] = "Attack Defend - 2"
        set AnimationName[115] = "Stand Victory - 22"
        set AnimationName[116] = "Stand Victory - 23"
        set AnimationName[117] = "Stand Work - 2"
        set AnimationName[118] = "Attack Throw - 1"
        set AnimationName[119] = "Attack Throw - 2"
        set AnimationName[120] = "Attack Throw - 3"
        set AnimationName[121] = "Attack Throw - 4"
        set AnimationName[122] = "Attack Throw - 5"
        set AnimationName[123] = "Attack Throw - 6"
        set AnimationName[124] = "Attack Throw - 7"
        set AnimationName[125] = "Stand Victory - 24"
        set AnimationName[126] = "Stand Victory - 25"
        set AnimationName[127] = "Stand Victory - 26"
        set AnimationName[128] = "Stand Victory - 27"
        set AnimationName[129] = "Stand Victory - 28"
        set AnimationName[130] = "Stand Victory - 29"
        set AnimationName[131] = "Stand Victory - 30"
        set AnimationName[132] = "Stand Victory - 31"
        set AnimationName[133] = "Stand Victory - 32"
        set AnimationName[134] = "Stand Victory - 33"
        set AnimationName[135] = "Stand Victory - 34"
        set AnimationName[136] = "Stand Victory - 35"
        set AnimationName[137] = "Stand Victory - 36"
        set AnimationName[138] = "Stand Victory - 37"
        set AnimationName[139] = "Stand Victory - 38"
        set AnimationName[140] = "Stand Victory - 39"
        set AnimationName[141] = "Stand Victory - 40"
        set AnimationName[142] = "Walk Upgrade"
        set AnimationName[143] = "Stand Upgrade"
        set AnimationName[144] = "Attack Upgrade - 1"
        set AnimationName[145] = "Attack Upgrade - 2"
        set AnimationName[146] = "Attack Upgrade - 3"
        set AnimationName[147] = "Attack Upgrade - 4"
        set AnimationName[148] = "Death Upgrade"
        set AnimationName[149] = "Stand Victory - 41"
        set AnimationName[150] = "Stand Victory - 42"
        set AnimationName[151] = "Stand Victory - 43"
        set AnimationName[152] = "Stand Victory - 44"
        set AnimationName[153] = "Stand Victory - 45"
        set AnimationName[154] = "Stand Victory - 46"
        set AnimationName[155] = "Stand Victory - 47"
        set AnimationName[156] = "Stand Victory - 48"
        set AnimationName[157] = "Stand Victory - 49"
        set AnimationName[158] = "Stand Victory - 50"
        set AnimationName[159] = "Stand Victory - 51"
        set AnimationName[160] = "Stand Victory - 52"
        set AnimationName[161] = "Stand Victory - 53"
        set AnimationName[162] = "Stand Victory - 54"
        set AnimationName[163] = "Stand Victory - 55"
        set AnimationName[164] = "Stand Victory - 56"
        set AnimationName[165] = "Stand Victory - 57"
        set AnimationName[166] = "Stand Victory - 58"
        set AnimationName[167] = "Stand Victory - 59"
        set AnimationName[168] = "Stand Victory - 60"
        set AnimationName[169] = "Stand Victory - 61"
        set AnimationName[170] = "Stand Victory - 62"
        set AnimationName[171] = "Stand Victory - 63"
        set AnimationName[172] = "Stand Victory - 64"
        set AnimationName[173] = "Stand Victory - 65"
        set AnimationName[174] = "Stand Victory - 66"
        set AnimationName[175] = "Stand Victory - 67"
        set AnimationName[176] = "Stand Victory - 68"
        set AnimationName[177] = "Stand Victory - 69"
        set AnimationName[178] = "Stand Victory - 70"
        set AnimationName[179] = "Stand Victory - 71"
        set AnimationName[180] = "Stand Victory - 72"
        set AnimationName[181] = "Stand Victory - 73"
        set AnimationName[182] = "Stand Victory - 74"
        set AnimationName[183] = "Stand Victory - 75"
        set AnimationName[184] = "Stand Victory - 76"
        set AnimationName[185] = "Death - 2"
        set AnimationName[186] = "Death - 3"
        set AnimationName[187] = "Flesh - 1"
        set AnimationName[188] = "Walk Victory - 1"
        set AnimationName[189] = "Walk Victory - 2"
        set AnimationName[190] = "Death - 4"
        set AnimationName[191] = "Stand Victory - 77"
        set AnimationName[192] = "Stand Victory - 78"
        set AnimationName[193] = "Stand Victory - 79"
        set AnimationName[194] = "Stand Victory - 80"
        set AnimationName[195] = "Stand Victory - 81"
        set AnimationName[196] = "Stand Victory - 82"
        set AnimationName[197] = "Stand Victory - 83"
        set AnimationName[198] = "Stand Victory - 84"
        set AnimationName[199] = "Stand Victory - 85"
        set AnimationName[200] = "Stand Victory - 86"
        set AnimationName[201] = "Walk Victory - 3"
        set AnimationName[202] = "Stand Victory - 87"
        set AnimationName[203] = "Stand Victory - 88"
        set AnimationName[204] = "Stand Victory - 89"
        set AnimationName[205] = "Stand Victory - 90"
        set AnimationName[206] = "Stand Victory - 91"
        set AnimationName[207] = "Stand Victory - 92"
        set AnimationName[208] = "Stand Victory - 93"
        set AnimationName[209] = "Flesh - 2"
        set AnimationName[210] = "Flesh - 3"
        set AnimationName[211] = "Flesh - 4"
        set AnimationName[212] = "Flesh - 5"
        set AnimationName[213] = "Flesh - 6"
        set AnimationName[214] = "Flesh - 7"
        set AnimationName[215] = "Flesh - 8"
        set AnimationName[216] = "Flesh - 9"
        set AnimationName[217] = "Flesh - 10"
        set AnimationName[218] = "Flesh - 11"
        set AnimationName[219] = "Stand Flesh - 1"
        set AnimationName[220] = "Walk Flesh - 1"
        set AnimationName[221] = "Death Flesh - 1"
        set AnimationName[222] = "Attack Flesh - 1"
        set AnimationName[223] = "Attack Flesh - 2"
        set AnimationName[224] = "Stand Spin First - 1"
        set AnimationName[225] = "Attack Spin First - 1"
        set AnimationName[226] = "Attack Spin First - 2"
        set AnimationName[227] = "Attack Spin First - 3"
        set AnimationName[228] = "Attack Spin First - 4"
        set AnimationName[229] = "Attack Spin First Spell - 1"
        set AnimationName[230] = "Attack Spin First Spell - 2"
        set AnimationName[231] = "Attack Spin First Spell Slam - 1"
        set AnimationName[232] = "Walk Spin Second - 1"
        set AnimationName[233] = "Stand Spin Second - 1"
        set AnimationName[234] = "Stand Spin Morph First - 1"
        set AnimationName[235] = "Stand Spin Morph Second - 1"
        set AnimationName[236] = "Attack Spin Second - 1"
        set AnimationName[237] = "Attack Spin Second - 2"
        set AnimationName[238] = "Attack Second Spell Slam - 1"
        set AnimationName[239] = "Death Spin Second"
        set AnimationName[240] = "Stand Victory - 94"
        set AnimationName[241] = "Stand Victory - 95"
        set AnimationName[242] = "Stand Victory - 96"
        set AnimationName[243] = "Stand Victory - 97"
        set AnimationName[244] = "Stand Victory - 98"
        set AnimationName[245] = "Walk Victory - 4"
        set AnimationName[246] = "Stand Victory - 99"
        set AnimationName[247] = "Stand Victory - 100"
        set AnimationName[248] = "Stand Victory - 101"
        set AnimationName[249] = "Stand Victory - 102"
        set AnimationName[250] = "Stand Victory - 103"
        set AnimationName[251] = "Stand Victory - 104"
        set AnimationName[252] = "Stand Victory - 105"
        set AnimationName[253] = "Stand Victory - 106"
        set AnimationName[254] = "Stand Victory - 107"
        // This is to set up the Maximum and Minimum Animation Index Range.
        set MinIndex[6] = 0
        set MaxIndex[6] = 254
        // --------------------------------------------
 
    endfunction

    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger(  )
        call TriggerRegisterTimerEvent( t, 0.01, false)
        call TriggerAddAction( t, function InitActionsFirst )
        set t = null
    endfunction

endlibrary
JASS:
scope SecondInitialization initializer Init

    private function InitActionsSecond takes nothing returns nothing

        // Creating local variables
        local quest q
        local integer i = 0
        local integer ie = 15
        // --------------------------------------------
     
        // Animation Name Changer
        set Index[7] = 0
        set AnimationNameA[0] = "Stand"
        set AnimationNameA[1] = "Stand - 2"
        set AnimationNameA[2] = "Stand - 3"
        set AnimationNameA[3] = "Stand - 4"
        set AnimationNameA[4] = "Attack"
        set AnimationNameA[5] = "Stand Work"
        set AnimationNameA[6] = "Walk"
        set AnimationNameA[7] = "Death"
        set AnimationNameA[8] = "Decay Flesh"
        set AnimationNameA[9] = "Decay Bone"
        set AnimationNameA[10] = "Stand Ready"
        set AnimationNameA[11] = "Stand Flesh First"
        set AnimationNameA[12] = "Stand Flesh Second"
        // This is to set up the Maximum and Minimum Animation Index Range.
        set MinIndex[7] = 0
        set MaxIndex[7] = 12
        // --------------------------------------------
     
        // Helmet Name Changer
        set Index[8] = 0
        set HelmetName[0] = "None"
        set HelmetName[1] = "Bronze Helmet"
        set HelmetName[2] = "Metal Helmet"
        set HelmetName[3] = "Bone Helmet"
        // --------------------------------------------
     
        // Helmet Choice Changer
        set HelmetChoice[1] = "war3mapImported\\Bronze Helmet.mdx"
        set HelmetChoice[2] = "war3mapImported\\White_Helm_Tier3_Portrait.mdx"
        set HelmetChoice[3] = "war3mapImported\\BoneHelmet.mdx"
        // This is to set up the Maximum and Minimum Index Range.
        set MinIndex[8] = 0
        set MaxIndex[8] = 3
        // --------------------------------------------
     
        // Chest Name Changer
        set Index[9] = 0
        set ChestName[0] = "None"
        set ChestName[1] = "Bronze Chestplate"
        set ChestName[2] = "Metal Heavy Armor"
        set ChestName[3] = "Bone Armor"
        // --------------------------------------------
     
        // Chest Choice Changer
        set ChestChoice[1] = "war3mapImported\\Bronze Chestplate.mdx"
        set ChestChoice[2] = "war3mapImported\\White_HeavyArmour_Tier3_Portrait.mdx"
        set ChestChoice[3] = "war3mapImported\\BoneArmorWhite2.mdx"
        // This is to set up the Maximum and Minimum Index Range.
        set MinIndex[9] = 0
        set MaxIndex[9] = 3
        // --------------------------------------------
     
        // Sword Name Changer
        set Index[10] = 0
        set SwordName[0] = "None"
        set SwordName[1] = "Bronze Broadsword"
        set SwordName[2] = "Ripper Sword"
        set SwordName[3] = "Bone Axe"
        // --------------------------------------------
     
        // Sword Choice Changer
        set SwordChoice[1] = "war3mapImported\\Bronze Broadsword.mdx"
        set SwordChoice[2] = "war3mapImported\\Ripper Sword.mdx"
        set SwordChoice[3] = "war3mapImported\\boneaxe9.mdx"
        // This is to set up the Maximum and Minimum Index Range.
        set MinIndex[10] = 0
        set MaxIndex[10] = 3
        // --------------------------------------------
     
        // Shield Name Changer
        set Index[11] = 0
        set ShieldName[0] = "None"
        set ShieldName[1] = "Bronze Buckler"
        set ShieldName[2] = "Metal Shield"
        set ShieldName[3] = "Bone Spiked Shield"
        // --------------------------------------------
     
        // Shield Choice Changer
        set ShieldChoice[1] = "war3mapImported\\Bronze Buckler.mdx"
        set ShieldChoice[2] = "war3mapImported\\Metal_Shield_Tier3_Portrait.mdx"
        set ShieldChoice[3] = "war3mapImported\\bonespikedshield.mdx"
        // This is to set up the Maximum and Minimum Index Range.
        set MinIndex[11] = 0
        set MaxIndex[11] = 3
        // --------------------------------------------
     
        // Boots Name Changer
        set Index[12] = 0
        set BootsName[0] = "None"
        set BootsName[1] = "Bronze Boots"
        set BootsName[2] = "Metal Boots"
        set BootsName[3] = "N/A"
        // --------------------------------------------
     
        // Boots Choice Changer
        set BootsChoiceLeft[1] = "war3mapImported\\Bronze Boots - Left.mdx"
        set BootsChoiceRight[1] = "war3mapImported\\Bronze Boots.mdx"
        set BootsChoiceLeft[2] = "war3mapImported\\MetalBoots_T3_byAstarothZion_LeftFoot.mdx"
        set BootsChoiceRight[2] = "war3mapImported\\MetalBoots_T3_byAstarothZion.mdx"
        set BootsChoiceLeft[3] = ""
        set BootsChoiceRight[3] = ""
        // This is to set up the Maximum and Minimum Index Range.
        set MinIndex[12] = 0
        set MaxIndex[12] = 3
        // --------------------------------------------
     
        // Bracers Name Changer
        set Index[13] = 0
        set BracersName[0] = "None"
        set BracersName[1] = "Bronze Bracers"
        set BracersName[2] = "Metal Guantlets"
        set BracersName[3] = "N/A"
        // --------------------------------------------
     
        // Bracers Choice Changer
        set BracersChoiceLeft[1] = "war3mapImported\\Bronze Bracer Left.mdx"
        set BracersChoiceRight[1] = "war3mapImported\\Bronze Bracers.mdx"
        set BracersChoiceLeft[2] = "war3mapImported\\Guantlet_Metal_Tier3_Portrait.mdx"
        set BracersChoiceRight[2] = "war3mapImported\\Guantlet_Metal_Tier3.mdx"
        set BracersChoiceLeft[3] = ""
        set BracersChoiceRight[3] = ""
        // This is to set up the Maximum and Minimum Index Range.
        set MinIndex[13] = 0
        set MaxIndex[13] = 3
        // --------------------------------------------
     
        // Setting the initial camera
        set Camera = CreateCameraSetup()
        set CamSetting[0] = 325.00
        set CamSetting[1] = 1900.00
        set CamSetting[2] = 0
        set CamSetting[3] = 0
        set CamSetting[4] = 200.00
        set CamSetting[5] = 10000.00
        set CamSetting[6] = 350.00
        set CamMode = 0
        // --------------------------------------------
     
        // Camera Mode Maker
        set CameraModeName[0] = "Normal"
        set CameraModeName[1] = "Roll"
        set CameraModeName[2] = "Zoom"
        // --------------------------------------------
     
        // Do Not Change This
        set Actor[0] = CreateUnit(Player(0), 'h001', 130.00, -240.00, 0)
        set Actor[1] = CreateUnit(Player(0), 'h000', 1540.00, 2280.00, 0)
        call SetUnitFacing(Actor[0], 180.00)
        call SetUnitFacing(Actor[1], 180.00)
        set ControlPanel[0] = CreateUnit(Player(0), 'H002', 1540.00, 2280.00, 0)
        set ControlPanel[1] = CreateUnit(Player(0), 'H003', 1540.00, 2280.00, 0)
        set ControlPanel[2] = CreateUnit(Player(0), 'H004', 1540.00, 2280.00, 0)
        set ControlPanel[3] = CreateUnit(Player(0), 'H005', 1540.00, 2280.00, 0)
        call SetCameraTargetController(Actor[0], 0, 0, false)
        call ClearSelection()
        call SelectUnit(ControlPanel[0], true)
        set XofActor = GetUnitX(Actor[0])
        set YofActor = GetUnitY(Actor[0])
        set NewYofActor = YofActor - 350.00
        set FinalYofActor = YofActor + 350.00
        set TerrainType = GetTerrainType(XofActor, YofActor)
        set NewTerrainType = GetTerrainType(XofActor, FinalYofActor)
        set SystemInUse = 0
        set ShowBoard = true
        set LoopingCommand = false
        set ArrowKey[0] = false
        set ArrowKey[1] = false
        set ArrowKey[2] = false
        set ArrowKey[3] = false
        // --------------------------------------------
     
        // Camera Setup and Display
        call CameraSetupSetField(Camera,CAMERA_FIELD_ANGLE_OF_ATTACK,CamSetting[0],0)
        call CameraSetupSetField(Camera,CAMERA_FIELD_TARGET_DISTANCE,CamSetting[1],0)
        call CameraSetupSetField(Camera,CAMERA_FIELD_ROLL,CamSetting[2],0)
        call CameraSetupSetField(Camera,CAMERA_FIELD_ROTATION,CamSetting[3],0)
        call CameraSetupSetField(Camera,CAMERA_FIELD_ZOFFSET,CamSetting[4],0)
        call CameraSetupSetField(Camera,CAMERA_FIELD_FARZ,CamSetting[5],0)
        call CameraSetupSetField(Camera,CAMERA_FIELD_FIELD_OF_VIEW,CamSetting[6],0)
        set Line[0] = "---------- C a m e r a ----------"
        set Line[1] = ( "Camera Mode : " + "Normal" )
        set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
        set Line[3] = ( "Angle of Attack : " + R2S(CamSetting[0]) )
        set Line[4] = ( "Rotation : " + R2S(CamSetting[3]) )
        set Line[5] = ( "Cam Height : " + R2S(CamSetting[4]) )
        set Line[6] = ( "Roll : " + R2S(CamSetting[2]) )
        set Line[7] = "---------- M o d e l s ----------"
        set Line[8] = ( "Unit Animations : " + ( ( "(" + ( "0" + ") " ) ) + "Stand - 1" ) )
        set Line[9] = ( "Weather Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
        set Line[10] = ( "Sky Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
        set Line[11] = ( "Fade Filters : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
        set Line[12] = ( "Lightning Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
        set Line[13] = ( "Ubersplat Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
        set Line[14] = ( "Terrain Tiles : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
        // --------------------------------------------
     
        // Multiboard Setup and Display
        set Board = Board.create(ie,1,true,true)
        call Board.setTitle("Effects Tester - (Looping is : OFF)")
        call Board.setAllWidth(0.28)
        call Board.display(false,true)
        loop
            exitwhen i > ie
            call Board.setText(i,0,Line[i])
            if i == 0 then
                call Board.setIcon(i,0,"ReplaceableTextures\\CommandButtons\\BTN_NormCamera.blp")
            elseif i == 7 then
                call Board.setIcon(i,0,"ReplaceableTextures\\CommandButtons\\BTNAltarOfKings.blp")
            else
                call Board.setIcon(i,0,"ReplaceableTextures\\PassiveButtons\\PASBTNStatUp.blp")
            endif
            set i = i + 1
        endloop
        // --------------------------------------------
     
        // First optional quest
        set q = CreateQuest()
       call QuestSetTitle(q, "Effects Tester")
        call QuestSetDescription(q, "You can now make animations loop with the following commands;

                                    -loop ### (Loops every x amount of seconds entered), -loop off

                                    You can jump through all of the different numbers by using these commands;

                                    -animation ###, -weather ##, -sky ##, -filter ##, -lightning ##, -ubersplat ##, -terrain #

                                    You can also switch to the attachment tester and back at any time simply by typing;
                                 
                                    -attachments, -effects (effects tester being the initial multiboard)")
        call QuestSetIconPath(q, "ReplaceableTextures\\CommandButtons\\BTNSell.blp")
        call QuestSetRequired(q, false)
        call QuestSetDiscovered(q, true)
        call QuestSetCompleted(q, false)
     
        // Nulling quest variable
        set q = null
        // --------------------------------------------
     
        // Second optional quest
        set q = CreateQuest()
       call QuestSetTitle(q, "Attachments Tester")
        call QuestSetDescription(q, "You can now make animations loop with the following commands;

                                    -loop ### (Loops every x amount of seconds entered), -loop off

                                    You can jump through all of the different numbers by using these commands;

                                    -animation #, -helmet #, -chest #, -sword #, -shield #, -boots #, -bracers #

                                    You can also switch to the attachment tester and back at any time simply by typing;
                                 
                                    -attachments, -effects (effects tester being the initial multiboard)")
        call QuestSetIconPath(q, "ReplaceableTextures\\CommandButtons\\BTNDustOfAppearance.blp")
        call QuestSetRequired(q, false)
        call QuestSetDiscovered(q, true)
        call QuestSetCompleted(q, false)
     
        // Nulling quest variable
        set q = null
        // --------------------------------------------
     
        // First required quest
        set q = CreateQuest()
        call QuestSetTitle(q, "Credits")
        call QuestSetDescription(q, "-Blood Raven (Bronze Armor Pack)
                                    -InfernalTater (Bone Equipment)
                                    -Astaroth Zion (Attachment Pack)
                                    -IcemanBo (for his help with coding)
                                    -Mckill2009 (BoardEx (multiboard wrapper))
                                    -Graber (for his Villager 255 Animations)
                                    -Supermj (for his White Grid)
                                    -Rysnt11 (for modifying the white grid (added Alpha))
                                    -Razor21 a.k.a gekigengar (for making the map)
                                    -Darkdeathknight (for his camera icon pack)
                                    -CHA_Owner (for greatly improving this system)")
        call QuestSetIconPath(q, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn.blp")
        call QuestSetRequired(q, true)
        call QuestSetDiscovered(q, true)
        call QuestSetCompleted(q, false)
     
        // Nulling quest variable
        set q = null
        // --------------------------------------------
     
        // Other settings and setup
        call SetUnitAnimationByIndex(Actor[0], Index[6])
        call SetFloatGameState(GAME_STATE_TIME_OF_DAY, 12.00)
        call SuspendTimeOfDay(true)
        set bj_useDawnDuskSounds = false
        call FogEnable(false)
        call FogMaskEnable(false)
        // --------------------------------------------
 
    endfunction
 
    function ResetMultiboard takes nothing returns nothing
 
        if SystemInUse == 0 then
            // Reset Animation
            set Index[6] = 0
            call SetUnitAnimationByIndex(Actor[0], Index[6])
            set Line[8] = ( "Unit Animations : " + ( ( "(" + ( "0" + ") " ) ) + "Stand - 1" ) )
            call Board.setText(8,0,Line[8])
            // --------------------------------------------
     
            // Reset Weather
            set Index[5] = 0
            call RemoveWeatherEffect( bj_lastCreatedWeatherEffect )
            set Line[9] = ( "Weather Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(9,0,Line[9])
            // --------------------------------------------
     
            // Reset Sky
            set Index[4] = 0
            call SetSkyModel( null )
            set Line[10] = ( "Sky Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(10,0,Line[10])
            // --------------------------------------------
     
            // Reset Fade Filter
            set Index[3] = 0
            if (bj_cineFadeContinueTimer != null) then
                call DestroyTimer(bj_cineFadeContinueTimer)
            elseif (bj_cineFadeFinishTimer != null) then
                call DestroyTimer(bj_cineFadeFinishTimer)
            endif
            set bj_cineFadeFinishTimer = null
            call DisplayCineFilter(false)
            set Line[11] = ( "Fade Filters : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(11,0,Line[11])
            // --------------------------------------------
     
            // Reset Lightning
            set Index[2] = 0
            call DestroyLightning( TempLightning )
            set Line[12] = ( "Lightning Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(12,0,Line[12])
            // --------------------------------------------
     
            // Reset Ubersplat
            set Index[1] = 0
            call DestroyUbersplat( bj_lastCreatedUbersplat )
            set Line[13] = ( "Ubersplat Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(13,0,Line[13])
            // --------------------------------------------
     
            // Reset Terrain
            set Index[0] = 0
            call SetTerrainType(XofActor, NewYofActor, TerrainType, 0, 1, 0)
            set Line[14] = ( "Terrain Tiles : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(14,0,Line[14])
            // --------------------------------------------
        elseif SystemInUse == 1 then
            // Reset Animation
            set Index[7] = 0
            call SetUnitAnimationByIndex(Actor[1], Index[7])
            set Line[8] = ( "Unit Animations : " + ( ( "(" + ( "0" + ") " ) ) + "Stand" ) )
            call Board.setText(8,0,Line[8])
            // --------------------------------------------
     
            // Reset Helmet
            set Index[8] = 0
            call DestroyEffect(TempEffect[0])
            set Line[9] = ( "Helmet Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(9,0,Line[9])
            // --------------------------------------------
     
            // Reset Chest
            set Index[9] = 0
            call DestroyEffect(TempEffect[1])
            set Line[10] = ( "Chest Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(10,0,Line[10])
            // --------------------------------------------
     
            // Reset Sword
            set Index[10] = 0
            call DestroyEffect(TempEffect[2])
            set Line[11] = ( "Sword Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(11,0,Line[11])
            // --------------------------------------------
     
            // Reset Shield
            set Index[11] = 0
            call DestroyEffect(TempEffect[3])
            set Line[12] = ( "Shield Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(12,0,Line[12])
            // --------------------------------------------
     
            // Reset Boots
            set Index[12] = 0
            call DestroyEffect(TempEffect[4])
            call DestroyEffect(TempEffect[5])
            set Line[13] = ( "Boot Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(13,0,Line[13])
            // --------------------------------------------
     
            // Reset Bracers
            set Index[13] = 0
            call DestroyEffect(TempEffect[6])
            call DestroyEffect(TempEffect[7])
            set Line[14] = ( "Bracer Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
            call Board.setText(14,0,Line[14])
            // --------------------------------------------
        endif
     
    endfunction
 
    private function FinishFade takes nothing returns nothing
        set bj_cineFadeFinishTimer = null
        call DisplayCineFilter(false)
    endfunction
 
    // call RunFade( fade out/in, texture )
    function RunFade takes integer f, string s returns nothing
        if (bj_cineFadeContinueTimer != null) then
            call DestroyTimer(bj_cineFadeContinueTimer)
        elseif (bj_cineFadeFinishTimer != null) then
            call DestroyTimer(bj_cineFadeFinishTimer)
        endif
        if (f == bj_CINEFADETYPE_FADEOUT) then
            // Fade out to the requested color.
            call SetCineFilterTexture(s)
            call SetCineFilterBlendMode(BLEND_MODE_BLEND)
            call SetCineFilterTexMapFlags(TEXMAP_FLAG_NONE)
            call SetCineFilterStartUV(0, 0, 1, 1)
            call SetCineFilterEndUV(0, 0, 1, 1)
            call SetCineFilterStartColor(255, 255, 255, 0)
            call SetCineFilterEndColor(255, 255, 255, 255)
            call SetCineFilterDuration(2.00)
            call DisplayCineFilter(true)
        elseif (f == bj_CINEFADETYPE_FADEIN) then
            // Fade in from the requested color.
            call SetCineFilterTexture(s)
            call SetCineFilterBlendMode(BLEND_MODE_BLEND)
            call SetCineFilterTexMapFlags(TEXMAP_FLAG_NONE)
            call SetCineFilterStartUV(0, 0, 1, 1)
            call SetCineFilterEndUV(0, 0, 1, 1)
            call SetCineFilterStartColor(255, 255, 255, 255)
            call SetCineFilterEndColor(255, 255, 255, 0)
            call SetCineFilterDuration(2.00)
            call DisplayCineFilter(true)
            set bj_cineFadeFinishTimer = CreateTimer()
            call TimerStart(bj_cineFadeFinishTimer, 1.00, false, function FinishFade)
        endif
    endfunction

    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger(  )
        call TriggerRegisterTimerEvent( t, 0.02, false)
        call TriggerAddAction( t, function InitActionsSecond )
        set t = null
    endfunction

endscope
JASS:
scope CameraSystem initializer Init

    private function CameraActions takes nothing returns nothing
 
        // Creating local variables
        local integer i = 0
        // --------------------------------------------
 
        if ArrowKey[0] == true then
            if CamMode == 0 then
                set CamSetting[0] = ( CamSetting[0] - 1 )
                if CamSetting[0] < 0.00 then
                    set CamSetting[0] = ( CamSetting[0] + 360.00 )
                endif
                set Line[3] = ( "Angle of Attack : " + R2S(CamSetting[0]) )
                call Board.setText(3,0,Line[3])
            elseif CamMode == 1 then
                set CamSetting[4] = ( CamSetting[4] + 3.00 )
                if CamSetting[4] >= 4000.00 then
                    set CamSetting[4] = 4000.00
                endif
                set Line[5] = ( "Cam Height : " + R2S(CamSetting[4]) )
                call Board.setText(5,0,Line[5])
            elseif CamMode == 2 then
                set CamSetting[1] = ( CamSetting[1] - 30.00 )
                if CamSetting[1] <= 300.00 then
                    set CamSetting[1] = 300.00
                endif
                set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
                call Board.setText(2,0,Line[2])
            endif
        endif
        if ArrowKey[1] == true then
            if CamMode == 0 then
                set CamSetting[0] = ( CamSetting[0] + 1 )
                if CamSetting[0] >= 360.00 then
                    set CamSetting[0] = ( CamSetting[0] - 360.00 )
                endif
                set Line[3] = ( "Angle of Attack : " + R2S(CamSetting[0]) )
                call Board.setText(3,0,Line[3])
            elseif CamMode == 1 then
                set CamSetting[4] = ( CamSetting[4] - 3.00 )
                if CamSetting[4] <= -2000.00 then
                    set CamSetting[4] = -2000.00
                endif
                set Line[5] = ( "Cam Height : " + R2S(CamSetting[4]) )
                call Board.setText(5,0,Line[5])
            elseif CamMode == 2 then
                set CamSetting[1] = ( CamSetting[1] + 30.00 )
                if CamSetting[1] >= 3000.00 then
                    set CamSetting[1] = 3000.00
                endif
                set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
                call Board.setText(2,0,Line[2])
            endif
        endif
        if ArrowKey[2] == true then
            if CamMode == 0 then
                set CamSetting[3] = ( CamSetting[3] - 1 )
                if CamSetting[3] < 0.00 then
                    set CamSetting[3] = ( CamSetting[3] + 360.00 )
                endif
                set Line[4] = ( "Rotation : " + R2S(CamSetting[3]) )
                call Board.setText(4,0,Line[4])
            elseif CamMode == 1 then
                set CamSetting[2] = ( CamSetting[2] - 1 )
                if CamSetting[2] < 0.00 then
                    set CamSetting[2] = ( CamSetting[2] + 360.00 )
                endif
                set Line[6] = ( "Roll : " + R2S(CamSetting[2]) )
                call Board.setText(6,0,Line[6])
            elseif CamMode == 2 then
                set CamSetting[1] = 300.00
                set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
                call Board.setText(2,0,Line[2])
            endif
        endif
        if ArrowKey[3] == true then
            if CamMode == 0 then
                set CamSetting[3] = ( CamSetting[3] + 1 )
                if CamSetting[3] >= 360.00 then
                    set CamSetting[3] = ( CamSetting[3] - 360.00 )
                endif
                set Line[4] = ( "Rotation : " + R2S(CamSetting[3]) )
                call Board.setText(4,0,Line[4])
            elseif CamMode == 1 then
                set CamSetting[2] = ( CamSetting[2] + 1 )
                if CamSetting[2] >= 360.00 then
                    set CamSetting[2] = ( CamSetting[2] - 360.00 )
                endif
                set Line[6] = ( "Roll : " + R2S(CamSetting[2]) )
                call Board.setText(6,0,Line[6])
            elseif CamMode == 2 then
                set CamSetting[1] = 3000.00
                set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
                call Board.setText(2,0,Line[2])
            endif
        endif
        call SetCameraField(CAMERA_FIELD_FARZ, CamSetting[5], 0)
        call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, CamSetting[1], 0)
        call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, CamSetting[0], 0)
        call SetCameraField(CAMERA_FIELD_ROTATION, CamSetting[3], 0)
        call SetCameraField(CAMERA_FIELD_ZOFFSET, CamSetting[4], 0)
        call SetCameraField(CAMERA_FIELD_ROLL, CamSetting[2], 0)
        loop
            exitwhen i > 3
            if (GetUnitAbilityLevel(ControlPanel[i], 'BEim') > 0) == true then
                set CamSetting[3] = ( CamSetting[3] + 1.00 )
                if CamSetting[3] >= 360.00 then
                    set CamSetting[3] = ( CamSetting[3] - 360.00 )
                endif
                set Line[4] = ( "Rotation : " + R2S(CamSetting[3]) )
                call Board.setText(4,0,Line[4])
            endif
            set i = i + 1
        endloop
 
    endfunction

    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger(  )
        call TriggerRegisterTimerEvent( t, 0.03, true)
        call TriggerAddAction( t, function CameraActions )
        set t = null
    endfunction

endscope
JASS:
scope CameraController initializer Init

    private function ControllerActions takes nothing returns nothing

        // Creating local variables
        local eventid id = GetTriggerEventId()
        // --------------------------------------------
 
        // Up Arrow Key Pressed
        if id == EVENT_PLAYER_ARROW_UP_DOWN then
            set ArrowKey[0] = true
        // Up Arrow Key Released
        elseif id == EVENT_PLAYER_ARROW_UP_UP then
            set ArrowKey[0] = false
        // Down Arrow Key Pressed
        elseif id == EVENT_PLAYER_ARROW_DOWN_DOWN then
            set ArrowKey[1] = true
        // Down Arrow Key Released
        elseif id == EVENT_PLAYER_ARROW_DOWN_UP then
            set ArrowKey[1] = false
        // Left Arrow Key Pressed
        elseif id == EVENT_PLAYER_ARROW_LEFT_DOWN then
            set ArrowKey[2] = true
        // Left Arrow Key Released
        elseif id == EVENT_PLAYER_ARROW_LEFT_UP then
            set ArrowKey[2] = false
        // Right Arrow Key Pressed
        elseif id == EVENT_PLAYER_ARROW_RIGHT_DOWN then
            set ArrowKey[3] = true
        // Right Arrow Key Released
        elseif id == EVENT_PLAYER_ARROW_RIGHT_UP then
            set ArrowKey[3] = false
        // Esc Key Used
        elseif id == EVENT_PLAYER_END_CINEMATIC then
            // Camera Setup and Display
            set CamSetting[0] = CameraSetupGetField(Camera, CAMERA_FIELD_ANGLE_OF_ATTACK)
            set CamSetting[1] = CameraSetupGetField(Camera, CAMERA_FIELD_TARGET_DISTANCE)
            set CamSetting[2] = CameraSetupGetField(Camera, CAMERA_FIELD_ROLL)
            set CamSetting[3] = CameraSetupGetField(Camera, CAMERA_FIELD_ROTATION)
            set CamSetting[4] = CameraSetupGetField(Camera, CAMERA_FIELD_ZOFFSET)
            set CamSetting[5] = CameraSetupGetField(Camera, CAMERA_FIELD_FARZ)
            set CamMode = 0
            set Line[1] = ( "Camera Mode : " + "Normal" )
            set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
            set Line[3] = ( "Angle of Attack : " + R2S(CamSetting[0]) )
            set Line[4] = ( "Rotation : " + R2S(CamSetting[3]) )
            set Line[5] = ( "Cam Height : " + R2S(CamSetting[4]) )
            set Line[6] = ( "Roll : " + R2S(CamSetting[2]) )
            call Board.setText(1,0,Line[1])
            call Board.setText(2,0,Line[2])
            call Board.setText(3,0,Line[3])
            call Board.setText(4,0,Line[4])
            call Board.setText(5,0,Line[5])
            call Board.setText(6,0,Line[6])
            // --------------------------------------------
        endif
     
        // Nulling the eventid variable
        set id = null
 
    endfunction

    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger(  )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_UP_DOWN )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_UP_UP )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_DOWN_DOWN )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_DOWN_UP )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_RIGHT_DOWN )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_RIGHT_UP )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_LEFT_DOWN )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_ARROW_LEFT_UP )
        call TriggerRegisterPlayerEvent( t, Player(0), EVENT_PLAYER_END_CINEMATIC)
        call TriggerAddAction( t, function ControllerActions )
        set t = null
    endfunction

endscope
JASS:
scope SkippingNumbers initializer Init

    private function LoopAnimation takes nothing returns nothing
        if SystemInUse == 0 then
            call SetUnitAnimationByIndex( Actor[0], Index[6] )
        elseif SystemInUse == 1 then
            call SetUnitAnimationByIndex( Actor[1], Index[7] )
        endif
    endfunction

    private function SkippingActions takes nothing returns nothing
 
        // Creating local variables
        local string s = GetEventPlayerChatString()
        local integer a = StringLength(s)
        local integer i = 0
        local integer ie = 15
        // --------------------------------------------

        if SubString(s, 0, 11) == "-animation " then
            if SystemInUse == 0 then
                set Index[6] = S2I(SubString(s, 11, a))
                if Index[6] > MaxIndex[6] then
                    set Index[6] = MinIndex[6]
                elseif Index[6] < MinIndex[6] then
                    set Index[6] = MaxIndex[6]
                endif
                set Line[8] = ( "Unit Animations : " + ( ( "(" + ( I2S(Index[6]) + ") " ) ) + AnimationName[Index[6]] ) )
                call SetUnitAnimationByIndex(Actor[0], Index[6])
                call Board.setText(8,0,Line[8])
            else
                set Index[7] = S2I(SubString(s, 11, a))
                if Index[7] > MaxIndex[7] then
                    set Index[7] = MinIndex[7]
                elseif Index[7] < MinIndex[7] then
                    set Index[7] = MaxIndex[7]
                endif
                set Line[8] = ( "Unit Animations : " + ( ( "(" + ( I2S(Index[7]) + ") " ) ) + AnimationNameA[Index[7]] ) )
                call SetUnitAnimationByIndex(Actor[1], Index[7])
                call Board.setText(8,0,Line[8])
            endif
        elseif SubString( s, 0, 6) == "-loop " and LoopingCommand == false then
            set LoopingCommand = true
            if SystemInUse == 0 then
                call Board.setTitle("Effects Tester - (Looping is : ON)")
            elseif SystemInUse == 1 then
                call Board.setTitle("Attachments Tester - (Looping is : ON)")
            endif
            set Looping = CreateTrigger()
            call TriggerRegisterTimerEvent( Looping, S2R(SubString( s, 6, a)), true )
            call TriggerAddAction( Looping, function LoopAnimation )
        elseif s == "-loop off" and LoopingCommand == true then
            set LoopingCommand = false
            if SystemInUse == 0 then
                call Board.setTitle("Effects Tester - (Looping is : OFF)")
            elseif SystemInUse == 1 then
                call Board.setTitle("Attachments Tester - (Looping is : OFF)")
            endif
            call DestroyTrigger( Looping )
            set Looping = null
        elseif SystemInUse == 0 then
            if SubString(s, 0, 9) == "-weather " then
                set Index[5] = S2I(SubString(s, 9, a))
                if Index[5] > MaxIndex[5] then
                    set Index[5] = MinIndex[5]
                elseif Index[5] < MinIndex[5] then
                    set Index[5] = MaxIndex[5]
                endif
                call RemoveWeatherEffect( bj_lastCreatedWeatherEffect )
                if Index[5] != MinIndex[5] then
                    set bj_lastCreatedWeatherEffect = AddWeatherEffect(gg_rct_Map_Area, WeatherChoice[Index[5]])
                    call EnableWeatherEffect( bj_lastCreatedWeatherEffect, true )
                endif
                set Line[9] = ( "Weather Effects : " + ( ( "(" + ( I2S(Index[5]) + ") " ) ) + WeatherName[Index[5]] ) )
                call Board.setText(9,0,Line[9])
            elseif SubString(s, 0, 5) == "-sky " then
                set Index[4] = S2I(SubString(s, 5, a))
                if Index[4] > MaxIndex[4] then
                    set Index[4] = MinIndex[4]
                elseif Index[4] < MinIndex[4] then
                    set Index[4] = MaxIndex[4]
                endif
                if Index[4] != MinIndex[4] then
                    call SetSkyModel(SkyChoice[Index[4]])
                else
                    call SetSkyModel( null )
                endif
                set Line[10] = ( "Sky Models : " + ( ( "(" + ( I2S(Index[4]) + ") " ) ) + SkyName[Index[4]] ) )
                call Board.setText(10,0,Line[10])
            elseif SubString(s, 0, 8) == "-filter " then
                set Index[3] = S2I(SubString(s, 8, a))
                if Index[3] > MaxIndex[3] then
                    set Index[3] = MinIndex[3]
                elseif Index[3] < MinIndex[3] then
                    set Index[3] = MaxIndex[3]
                endif
                if (bj_cineFadeContinueTimer != null) then
                    call DestroyTimer(bj_cineFadeContinueTimer)
                elseif (bj_cineFadeFinishTimer != null) then
                    call DestroyTimer(bj_cineFadeFinishTimer)
                endif
                set bj_cineFadeFinishTimer = null
                call DisplayCineFilter(false)
                if Index[3] != MinIndex[3] then
                    call RunFade( 1, FadeChoice[Index[3]] )
                endif
                set Line[11] = ( "Fade Filters : " + ( ( "(" + ( I2S(Index[3]) + ") " ) ) + FadeName[Index[3]] ) )
                call Board.setText(11,0,Line[11])
            elseif SubString(s, 0, 11) == "-lightning " then
                set Index[2] = S2I(SubString(s, 11, a))
                if Index[2] > MaxIndex[2] then
                    set Index[2] = MinIndex[2]
                elseif Index[2] < MinIndex[2] then
                    set Index[2] = MaxIndex[2]
                endif
                call DestroyLightning( TempLightning )
                if Index[2] != MinIndex[2] then
                    set TempLightning = AddLightningEx(LightningChoice[Index[2]], true, 128.500, -12.000, 400, 128.500, -516.00, 400)
                endif
                set Line[12] = ( "Lightning Effects : " + ( ( "(" + ( I2S(Index[2]) + ") " ) ) + LightningName[Index[2]] ) )
                call Board.setText(12,0,Line[12])
            elseif SubString(s, 0, 11) == "-ubersplat " then
                set Index[1] = S2I(SubString(s, 11, a))
                if Index[1] > MaxIndex[1] then
                    set Index[1] = MinIndex[1]
                elseif Index[1] < MinIndex[1] then
                    set Index[1] = MaxIndex[1]
                endif
                call DestroyUbersplat( bj_lastCreatedUbersplat )
                if Index[1] != MinIndex[1] then
                    set bj_lastCreatedUbersplat = CreateUbersplat(XofActor, FinalYofActor, UbersplatChoice[Index[1]], 255, 255, 255, 255, true, true)
                    call SetUbersplatRenderAlways( bj_lastCreatedUbersplat, true )
                    call ShowUbersplat( bj_lastCreatedUbersplat, true )
                endif
                set Line[13] = ( "Ubersplat Effects : " + ( ( "(" + ( I2S(Index[1]) + ") " ) ) + UbersplatName[Index[1]] ) )
                call Board.setText(13,0,Line[13])
            elseif SubString(s, 0, 9) == "-terrain " then
                set Index[0] = S2I(SubString(s, 9, a))
                if Index[0] > MaxIndex[0] then
                    set Index[0] = MinIndex[0]
                elseif Index[0] < MinIndex[0] then
                    set Index[0] = MaxIndex[0]
                endif
                if Index[0] != MinIndex[0] then
                    call SetTerrainType( XofActor, NewYofActor, TerrainChoice[Index[0]], 0, 1, 0 )
                else
                    call SetTerrainType( XofActor, NewYofActor, NewTerrainType, 0, 1, 0 )
                endif
                set Line[14] = ( "Terrain Tiles : " + ( ( "(" + ( I2S(Index[0]) + ") " ) ) + TerrainName[Index[0]] ) )
                call Board.setText(14,0,Line[14])
            elseif s == "-attachments" then
                // Hiding previous multiboard and control panels
                call ResetMultiboard()
                call SetUnitPosition(Actor[0], 1540.00, 2280.00)
                set SystemInUse = 1
                call SetUnitPosition(Actor[1], 130.00, -240.00)
                call SetCameraTargetController(Actor[1], 0, 0, false)
                call ClearSelection()
                call SelectUnit(ControlPanel[2], true)
                // --------------------------------------------
     
                // Camera Setup and Display
                set CamSetting[0] = CameraSetupGetField(Camera, CAMERA_FIELD_ANGLE_OF_ATTACK)
                set CamSetting[1] = CameraSetupGetField(Camera, CAMERA_FIELD_TARGET_DISTANCE)
                set CamSetting[2] = CameraSetupGetField(Camera, CAMERA_FIELD_ROLL)
                set CamSetting[3] = CameraSetupGetField(Camera, CAMERA_FIELD_ROTATION)
                set CamSetting[4] = CameraSetupGetField(Camera, CAMERA_FIELD_ZOFFSET)
                set CamSetting[5] = CameraSetupGetField(Camera, CAMERA_FIELD_FARZ)
                set CamMode = 0
                set Line[0] = "---------- C a m e r a ----------"
                set Line[1] = ( "Camera Mode : " + "Normal" )
                set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
                set Line[3] = ( "Angle of Attack : " + R2S(CamSetting[0]) )
                set Line[4] = ( "Rotation : " + R2S(CamSetting[3]) )
                set Line[5] = ( "Cam Height : " + R2S(CamSetting[4]) )
                set Line[6] = ( "Roll : " + R2S(CamSetting[2]) )
                set Line[7] = "---------- M o d e l s ----------"
                set Line[8] = ( "Unit Animations : " + ( ( "(" + ( "0" + ") " ) ) + "Stand" ) )
                set Line[9] = ( "Helmet Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[10] = ( "Chest Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[11] = ( "Sword Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[12] = ( "Shield Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[13] = ( "Boot Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[14] = ( "Bracer Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                // --------------------------------------------
 
                // Multiboard Setup and Display
                call Board.setTitle("Attachments Tester - (Looping is : OFF)")
                call Board.setAllWidth(0.28)
                loop
                    exitwhen i > ie
                    call Board.setText(i,0,Line[i])
                    if i == 0 then
                        call Board.setIcon(i,0,"ReplaceableTextures\\CommandButtons\\BTN_NormCamera.blp")
                    elseif i == 7 then
                        call Board.setIcon(i,0,"ReplaceableTextures\\CommandButtons\\BTNAltarOfKings.blp")
                    else
                        call Board.setIcon(i,0,"ReplaceableTextures\\PassiveButtons\\PASBTNStatUp.blp")
                    endif
                    set i = i + 1
                endloop
                // --------------------------------------------
            endif
        elseif SystemInUse == 1 then
            if SubString(s, 0, 8) == "-helmet " then
                set Index[8] = S2I(SubString(s, 8, a))
                if Index[8] > MaxIndex[8] then
                    set Index[8] = MinIndex[8]
                elseif Index[8] < MinIndex[8] then
                    set Index[8] = MaxIndex[8]
                endif
                call DestroyEffect(TempEffect[0])
                if Index[8] != MinIndex[8] then
                    set TempEffect[0] = AddSpecialEffectTarget(HelmetChoice[Index[8]], Actor[1], "head")
                endif
                set Line[9] = ( "Helmet Models : " + ( ( "(" + ( I2S(Index[8]) + ") " ) ) + HelmetName[Index[8]] ) )
                call Board.setText(9,0,Line[9])
            elseif SubString(s, 0, 7) == "-chest " then
                set Index[9] = S2I(SubString(s, 7, a))
                if Index[9] > MaxIndex[9] then
                    set Index[9] = MinIndex[9]
                elseif Index[9] < MinIndex[9] then
                    set Index[9] = MaxIndex[9]
                endif
                call DestroyEffect(TempEffect[1])
                if Index[9] != MinIndex[9] then
                    set TempEffect[1] = AddSpecialEffectTarget(ChestChoice[Index[9]], Actor[1], "chest")
                endif
                set Line[10] = ( "Chest Models : " + ( ( "(" + ( I2S(Index[9]) + ") " ) ) + ChestName[Index[9]] ) )
                call Board.setText(10,0,Line[10])
            elseif SubString(s, 0, 7) == "-sword " then
                set Index[10] = S2I(SubString(s, 7, a))
                if Index[10] > MaxIndex[10] then
                    set Index[10] = MinIndex[10]
                elseif Index[10] < MinIndex[10] then
                    set Index[10] = MaxIndex[10]
                endif
                call DestroyEffect(TempEffect[2])
                if Index[10] != MinIndex[10] then
                    set TempEffect[2] = AddSpecialEffectTarget(SwordChoice[Index[10]], Actor[1], "hand, right")
                endif
                set Line[11] = ( "Sword Models : " + ( ( "(" + ( I2S(Index[10]) + ") " ) ) + SwordName[Index[10]] ) )
                call Board.setText(11,0,Line[11])
            elseif SubString(s, 0, 8) == "-shield " then
                set Index[11] = S2I(SubString(s, 8, a))
                if Index[11] > MaxIndex[11] then
                    set Index[11] = MinIndex[11]
                elseif Index[11] < MinIndex[11] then
                    set Index[11] = MaxIndex[11]
                endif
                call DestroyEffect(TempEffect[3])
                if Index[11] != MinIndex[11] then
                    set TempEffect[3] = AddSpecialEffectTarget(ShieldChoice[Index[11]], Actor[1], "hand, left")
                endif
                set Line[12] = ( "Shield Models : " + ( ( "(" + ( I2S(Index[11]) + ") " ) ) + ShieldName[Index[11]] ) )
                call Board.setText(12,0,Line[12])
            elseif SubString(s, 0, 7) == "-boots " then
                set Index[12] = S2I(SubString(s, 7, a))
                if Index[12] > MaxIndex[12] then
                    set Index[12] = MinIndex[12]
                elseif Index[12] < MinIndex[12] then
                    set Index[12] = MaxIndex[12]
                endif
                call DestroyEffect(TempEffect[4])
                call DestroyEffect(TempEffect[5])
                if Index[12] != MinIndex[12] then
                    set TempEffect[4] = AddSpecialEffectTarget(BootsChoiceLeft[Index[12]], Actor[1], "foot, left")
                    set TempEffect[5] = AddSpecialEffectTarget(BootsChoiceRight[Index[12]], Actor[1], "foot, right")
                endif
                set Line[13] = ( "Boot Models : " + ( ( "(" + ( I2S(Index[12]) + ") " ) ) + BootsName[Index[12]] ) )
                call Board.setText(13,0,Line[13])
            elseif SubString(s, 0, 9) == "-bracers " then
                set Index[13] = S2I(SubString(s, 9, a))
                if Index[13] > MaxIndex[13] then
                    set Index[13] = MinIndex[13]
                elseif Index[13] < MinIndex[13] then
                    set Index[13] = MaxIndex[13]
                endif
                call DestroyEffect(TempEffect[6])
                call DestroyEffect(TempEffect[7])
                if Index[13] != MinIndex[13] then
                    set TempEffect[6] = AddSpecialEffectTarget(BracersChoiceLeft[Index[13]], Actor[1], "hand, left")
                    set TempEffect[7] = AddSpecialEffectTarget(BracersChoiceRight[Index[13]], Actor[1], "hand, right")
                endif
                set Line[14] = ( "Bracer Models : " + ( ( "(" + ( I2S(Index[13]) + ") " ) ) + BracersName[Index[13]] ) )
                call Board.setText(14,0,Line[14])
            elseif s == "-effects" then
                // Hiding previous multiboard and control panels
                call ResetMultiboard()
                call SetUnitPosition(Actor[1], 1540.00, 2280.00)
                set SystemInUse = 0
                call SetUnitPosition(Actor[0], 130.00, -240.00)
                call SetCameraTargetController(Actor[0], 0, 0, false)
                call ClearSelection()
                call SelectUnit(ControlPanel[0], true)
                // --------------------------------------------
     
                // Camera Setup and Display
                set CamSetting[0] = CameraSetupGetField(Camera, CAMERA_FIELD_ANGLE_OF_ATTACK)
                set CamSetting[1] = CameraSetupGetField(Camera, CAMERA_FIELD_TARGET_DISTANCE)
                set CamSetting[2] = CameraSetupGetField(Camera, CAMERA_FIELD_ROLL)
                set CamSetting[3] = CameraSetupGetField(Camera, CAMERA_FIELD_ROTATION)
                set CamSetting[4] = CameraSetupGetField(Camera, CAMERA_FIELD_ZOFFSET)
                set CamSetting[5] = CameraSetupGetField(Camera, CAMERA_FIELD_FARZ)
                set CamMode = 0
                set Line[0] = "---------- C a m e r a ----------"
                set Line[1] = ( "Camera Mode : " + "Normal" )
                set Line[2] = ( "Distance : " + R2S(CamSetting[1]) )
                set Line[3] = ( "Angle of Attack : " + R2S(CamSetting[0]) )
                set Line[4] = ( "Rotation : " + R2S(CamSetting[3]) )
                set Line[5] = ( "Cam Height : " + R2S(CamSetting[4]) )
                set Line[6] = ( "Roll : " + R2S(CamSetting[2]) )
                set Line[7] = "---------- M o d e l s ----------"
                set Line[8] = ( "Unit Animations : " + ( ( "(" + ( "0" + ") " ) ) + "Stand - 1" ) )
                set Line[9] = ( "Weather Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[10] = ( "Sky Models : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[11] = ( "Fade Filters : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[12] = ( "Lightning Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[13] = ( "Ubersplat Effects : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                set Line[14] = ( "Terrain Tiles : " + ( ( "(" + ( "0" + ") " ) ) + "None" ) )
                // --------------------------------------------
 
                // Multiboard Setup and Display
                call Board.setTitle("Effects Tester - (Looping is : OFF)")
                call Board.setAllWidth(0.28)
                loop
                    exitwhen i > ie
                    call Board.setText(i,0,Line[i])
                    if i == 0 then
                        call Board.setIcon(i,0,"ReplaceableTextures\\CommandButtons\\BTN_NormCamera.blp")
                    elseif i == 7 then
                        call Board.setIcon(i,0,"ReplaceableTextures\\CommandButtons\\BTNAltarOfKings.blp")
                    else
                        call Board.setIcon(i,0,"ReplaceableTextures\\PassiveButtons\\PASBTNStatUp.blp")
                    endif
                    set i = i + 1
                endloop
                // --------------------------------------------
            endif
        endif
     
        // Nulling the string variable
        set s = null
        // --------------------------------------------
 
    endfunction

    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger(  )
        call TriggerRegisterPlayerChatEvent( t, Player(0), "", false )
        call TriggerAddAction( t, function SkippingActions )
        set t = null
    endfunction

endscope
JASS:
scope ControlPanel initializer Init

    private function ControlPanelActions takes nothing returns nothing
 
        // Creating local variables
        local unit u = GetTriggerUnit()
        local integer uid = GetUnitTypeId(u)
        local integer aid = GetSpellAbilityId()
        // --------------------------------------------

        // Why Begins Casting an Ability? So that you could browse between animations a lot faster.
        call IssueImmediateOrder( u, "stop" )
        // Whats with the Stop? to prevent the Control Panel from casting anything.
        if aid == 'A004' then
            set CamMode = ( CamMode + 1 )
            if CamMode > 2 then
                set CamMode = 0
            endif
            set Line[1] = ( "Camera Mode : " + CameraModeName[CamMode] )
            call Board.setText(1,0,Line[1])
        elseif aid == 'A001' or aid == 'A000' then
            if uid == 'H002' or uid == 'H003' then
                if aid == 'A001' then
                    set Index[6] = ( Index[6] + 1 )
                else
                    set Index[6] = ( Index[6] - 1 )
                endif
                if Index[6] > MaxIndex[6] then
                    set Index[6] = MinIndex[6]
                elseif Index[6] < MinIndex[6] then
                    set Index[6] = MaxIndex[6]
                endif
                set Line[8] = ( "Unit Animations : " + ( ( "(" + ( I2S(Index[6]) + ") " ) ) + AnimationName[Index[6]] ) )
                call SetUnitAnimationByIndex(Actor[0], Index[6])
                call Board.setText(8,0,Line[8])
            else
                if aid == 'A001' then
                    set Index[7] = ( Index[7] + 1 )
                else
                    set Index[7] = ( Index[7] - 1 )
                endif
                if Index[7] > MaxIndex[7] then
                    set Index[7] = MinIndex[7]
                elseif Index[7] < MinIndex[7] then
                    set Index[7] = MaxIndex[7]
                endif
                set Line[8] = ( "Unit Animations : " + ( ( "(" + ( I2S(Index[7]) + ") " ) ) + AnimationNameA[Index[7]] ) )
                call SetUnitAnimationByIndex(Actor[1], Index[7])
                call Board.setText(8,0,Line[8])
            endif
        elseif aid == 'A006' or aid == 'A007' then
            if aid == 'A006' then
                set Index[5] = ( Index[5] + 1 )
            else
                set Index[5] = ( Index[5] - 1 )
            endif
            if Index[5] > MaxIndex[5] then
                set Index[5] = MinIndex[5]
            elseif Index[5] < MinIndex[5] then
                set Index[5] = MaxIndex[5]
            endif
            call RemoveWeatherEffect( bj_lastCreatedWeatherEffect )
            if Index[5] != MinIndex[5] then
                set bj_lastCreatedWeatherEffect = AddWeatherEffect(gg_rct_Map_Area, WeatherChoice[Index[5]])
                call EnableWeatherEffect( bj_lastCreatedWeatherEffect, true )
            endif
            set Line[9] = ( "Weather Effects : " + ( ( "(" + ( I2S(Index[5]) + ") " ) ) + WeatherName[Index[5]] ) )
            call Board.setText(9,0,Line[9])
        elseif aid == 'A00B' or aid == 'A00A' then
            if aid == 'A00B' then
                set Index[4] = ( Index[4] + 1 )
            else
                set Index[4] = ( Index[4] - 1 )
            endif
            if Index[4] > MaxIndex[4] then
                set Index[4] = MinIndex[4]
            elseif Index[4] < MinIndex[4] then
                set Index[4] = MaxIndex[4]
            endif
            if Index[4] != MinIndex[4] then
                call SetSkyModel(SkyChoice[Index[4]])
            else
                call SetSkyModel( null )
            endif
            set Line[10] = ( "Sky Models : " + ( ( "(" + ( I2S(Index[4]) + ") " ) ) + SkyName[Index[4]] ) )
            call Board.setText(10,0,Line[10])
        elseif aid == 'A00E' or aid == 'A00F' then
            if aid == 'A00E' then
                set Index[3] = ( Index[3] + 1 )
            else
                set Index[3] = ( Index[3] - 1 )
            endif
            if Index[3] > MaxIndex[3] then
                set Index[3] = MinIndex[3]
            elseif Index[3] < MinIndex[3] then
                set Index[3] = MaxIndex[3]
            endif
            if (bj_cineFadeContinueTimer != null) then
                call DestroyTimer(bj_cineFadeContinueTimer)
            elseif (bj_cineFadeFinishTimer != null) then
                call DestroyTimer(bj_cineFadeFinishTimer)
            endif
            set bj_cineFadeFinishTimer = null
            call DisplayCineFilter(false)
            if Index[3] != MinIndex[3] then
                call RunFade( 1, FadeChoice[Index[3]] )
            endif
            set Line[11] = ( "Fade Filters : " + ( ( "(" + ( I2S(Index[3]) + ") " ) ) + FadeName[Index[3]] ) )
            call Board.setText(11,0,Line[11])
        elseif aid == 'A00G' or aid == 'A00H' then
            if aid == 'A00G' then
                set Index[2] = ( Index[2] + 1 )
            else
                set Index[2] = ( Index[2] - 1 )
            endif
            if Index[2] > MaxIndex[2] then
                set Index[2] = MinIndex[2]
            elseif Index[2] < MinIndex[2] then
                set Index[2] = MaxIndex[2]
            endif
            call DestroyLightning( TempLightning )
            if Index[2] != MinIndex[2] then
                set TempLightning = AddLightningEx(LightningChoice[Index[2]], true, 128.500, -12.000, 400, 128.500, -516.00, 400)
            endif
            set Line[12] = ( "Lightning Effects : " + ( ( "(" + ( I2S(Index[2]) + ") " ) ) + LightningName[Index[2]] ) )
            call Board.setText(12,0,Line[12])
        elseif aid == 'A00I' or aid == 'A00J' then
            if aid == 'A00I' then
                set Index[1] = ( Index[1] + 1 )
            else
                set Index[1] = ( Index[1] - 1 )
            endif
            if Index[1] > MaxIndex[1] then
                set Index[1] = MinIndex[1]
            elseif Index[1] < MinIndex[1] then
                set Index[1] = MaxIndex[1]
            endif
            call DestroyUbersplat( bj_lastCreatedUbersplat )
            if Index[1] != MinIndex[1] then
                set bj_lastCreatedUbersplat = CreateUbersplat(XofActor, FinalYofActor, UbersplatChoice[Index[1]], 255, 255, 255, 255, true, true)
                call SetUbersplatRenderAlways( bj_lastCreatedUbersplat, true )
                call ShowUbersplat( bj_lastCreatedUbersplat, true )
            endif
            set Line[13] = ( "Ubersplat Effects : " + ( ( "(" + ( I2S(Index[1]) + ") " ) ) + UbersplatName[Index[1]] ) )
            call Board.setText(13,0,Line[13])
        elseif aid == 'A00L' or aid == 'A00K' then
            if aid == 'A00L' then
                set Index[0] = ( Index[0] + 1 )
            else
                set Index[0] = ( Index[0] - 1 )
            endif
            if Index[0] > MaxIndex[0] then
                set Index[0] = MinIndex[0]
            elseif Index[0] < MinIndex[0] then
                set Index[0] = MaxIndex[0]
            endif
            if Index[0] != MinIndex[0] then
                call SetTerrainType( XofActor, NewYofActor, TerrainChoice[Index[0]], 0, 1, 0 )
            else
                call SetTerrainType( XofActor, NewYofActor, NewTerrainType, 0, 1, 0 )
            endif
            set Line[14] = ( "Terrain Tiles : " + ( ( "(" + ( I2S(Index[0]) + ") " ) ) + TerrainName[Index[0]] ) )
            call Board.setText(14,0,Line[14])
        elseif aid == 'A008' then
            if ShowBoard == true then
                set ShowBoard = false
                call Board.display(true,false)
            else
                set ShowBoard = true
                call Board.display(false,true)
            endif
        elseif aid == 'A002' then
            call ResetMultiboard()
        elseif aid == 'A00C' then
            if uid == 'H002' or uid == 'H003' then
                call ClearSelection()
                call SelectUnit(ControlPanel[1], true)
            else
                call ClearSelection()
                call SelectUnit(ControlPanel[3], true)
            endif
        elseif aid == 'A00D' then
            if uid == 'H002' or uid == 'H003' then
                call ClearSelection()
                call SelectUnit(ControlPanel[0], true)
            else
                call ClearSelection()
                call SelectUnit(ControlPanel[2], true)
            endif
        elseif aid == 'A00N' or aid == 'A00O' then
            if aid == 'A00N' then
                set Index[8] = ( Index[8] + 1 )
            else
                set Index[8] = ( Index[8] - 1 )
            endif
            if Index[8] > MaxIndex[8] then
                set Index[8] = MinIndex[8]
            elseif Index[8] < MinIndex[8] then
                set Index[8] = MaxIndex[8]
            endif
            call DestroyEffect(TempEffect[0])
            if Index[8] != MinIndex[8] then
                set TempEffect[0] = AddSpecialEffectTarget(HelmetChoice[Index[8]], Actor[1], "head")
            endif
            set Line[9] = ( "Helmet Models : " + ( ( "(" + ( I2S(Index[8]) + ") " ) ) + HelmetName[Index[8]] ) )
            call Board.setText(9,0,Line[9])
        elseif aid == 'A00M' or aid == 'A003' then
            if aid == 'A00M' then
                set Index[9] = ( Index[9] + 1 )
            else
                set Index[9] = ( Index[9] - 1 )
            endif
            if Index[9] > MaxIndex[9] then
                set Index[9] = MinIndex[9]
            elseif Index[9] < MinIndex[9] then
                set Index[9] = MaxIndex[9]
            endif
            call DestroyEffect(TempEffect[1])
            if Index[9] != MinIndex[9] then
                set TempEffect[1] = AddSpecialEffectTarget(ChestChoice[Index[9]], Actor[1], "chest")
            endif
            set Line[10] = ( "Chest Models : " + ( ( "(" + ( I2S(Index[9]) + ") " ) ) + ChestName[Index[9]] ) )
            call Board.setText(10,0,Line[10])
        elseif aid == 'A00P' or aid == 'A00Q' then
            if aid == 'A00P' then
                set Index[10] = ( Index[10] + 1 )
            else
                set Index[10] = ( Index[10] - 1 )
            endif
            if Index[10] > MaxIndex[10] then
                set Index[10] = MinIndex[10]
            elseif Index[10] < MinIndex[10] then
                set Index[10] = MaxIndex[10]
            endif
            call DestroyEffect(TempEffect[2])
            if Index[10] != MinIndex[10] then
                set TempEffect[2] = AddSpecialEffectTarget(SwordChoice[Index[10]], Actor[1], "hand, right")
            endif
            set Line[11] = ( "Sword Models : " + ( ( "(" + ( I2S(Index[10]) + ") " ) ) + SwordName[Index[10]] ) )
            call Board.setText(11,0,Line[11])
        elseif aid == 'A00R' or aid == 'A00S' then
            if aid == 'A00R' then
                set Index[11] = ( Index[11] + 1 )
            else
                set Index[11] = ( Index[11] - 1 )
            endif
            if Index[11] > MaxIndex[11] then
                set Index[11] = MinIndex[11]
            elseif Index[11] < MinIndex[11] then
                set Index[11] = MaxIndex[11]
            endif
            call DestroyEffect(TempEffect[3])
            if Index[11] != MinIndex[11] then
                set TempEffect[3] = AddSpecialEffectTarget(ShieldChoice[Index[11]], Actor[1], "hand, left")
            endif
            set Line[12] = ( "Shield Models : " + ( ( "(" + ( I2S(Index[11]) + ") " ) ) + ShieldName[Index[11]] ) )
            call Board.setText(12,0,Line[12])
        elseif aid == 'A00T' or aid == 'A00U' then
            if aid == 'A00T' then
                set Index[12] = ( Index[12] + 1 )
            else
                set Index[12] = ( Index[12] - 1 )
            endif
            if Index[12] > MaxIndex[12] then
                set Index[12] = MinIndex[12]
            elseif Index[12] < MinIndex[12] then
                set Index[12] = MaxIndex[12]
            endif
            call DestroyEffect(TempEffect[4])
            call DestroyEffect(TempEffect[5])
            if Index[12] != MinIndex[12] then
                set TempEffect[4] = AddSpecialEffectTarget(BootsChoiceLeft[Index[12]], Actor[1], "foot, left")
                set TempEffect[5] = AddSpecialEffectTarget(BootsChoiceRight[Index[12]], Actor[1], "foot, right")
            endif
            set Line[13] = ( "Boot Models : " + ( ( "(" + ( I2S(Index[12]) + ") " ) ) + BootsName[Index[12]] ) )
            call Board.setText(13,0,Line[13])
        elseif aid == 'A00V' or aid == 'A00W' then
            if aid == 'A00V' then
                set Index[13] = ( Index[13] + 1 )
            else
                set Index[13] = ( Index[13] - 1 )
            endif
            if Index[13] > MaxIndex[13] then
                set Index[13] = MinIndex[13]
            elseif Index[13] < MinIndex[13] then
                set Index[13] = MaxIndex[13]
            endif
            call DestroyEffect(TempEffect[6])
            call DestroyEffect(TempEffect[7])
            if Index[13] != MinIndex[13] then
                set TempEffect[6] = AddSpecialEffectTarget(BracersChoiceLeft[Index[13]], Actor[1], "hand, left")
                set TempEffect[7] = AddSpecialEffectTarget(BracersChoiceRight[Index[13]], Actor[1], "hand, right")
            endif
            set Line[14] = ( "Bracer Models : " + ( ( "(" + ( I2S(Index[13]) + ") " ) ) + BracersName[Index[13]] ) )
            call Board.setText(14,0,Line[14])
        endif
     
        // Nulling the variables
        set u = null
        // --------------------------------------------
 
    endfunction

    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger(  )
        call TriggerRegisterPlayerUnitEvent( t, Player(0), EVENT_PLAYER_UNIT_SPELL_CAST, null)
        call TriggerAddAction( t, function ControlPanelActions )
        set t = null
    endfunction

endscope
Change Log



  • Rewrote entire system into vJASS.
  • Fixed all previous glitches and issues.
  • Removed multiple triggers and combined others.
  • Added more content with much, much more to come.


  • Greatly improved all coding.
  • Separated initialization triggers.
  • Improved descriptions, comments, and readability.
  • Added more content with much, much more to come.


  • Finished completely improving the coding.
  • Fixed hopefully the last few bugs and glitches that occured.
  • Improved descriptions, comments, and readability yet again.
  • Inserted the new multiboard wrapper to get rid of BJs.
  • Changed the way the multiboard setup was done to be more efficient.
  • Added more content with much, much more to come.


  • Coding has been completely reworked once again for efficiency.
  • Fixed the multiboard glitch having to do with minimizing.
  • Improved descriptions, comments, and readability yet again.
  • Finished the multiboard wrappers and are now completely functioning.
  • Started separating the initialization triggers for readability.
  • Big changes made to global variables greatly reducing calls.
  • Added more content with much, much more to come.


  • Terrain tiles reduced to 8 due to WC3 limits.
  • Commands and credits now fully up to date.
  • Fixed camera system so controls are no longer inverted.
  • Resized multiboard to be slightly smaller now.
  • Got rid of all udg_ variables now all listed as globals.
  • Recoded camera system for vJASS camera objects.
  • Fixed glitch regarding camera system updating text.
  • Fixed glitch with lightnings not getting correctly destroyed.



  • Redone camera system to check keys individually.
  • Condensed initialization triggers and rearranged them.
  • Added the other 154 animation names to system.


  • Made system more modular for later updates.
  • Finished making the attachment tester fully functional.
  • Rewrote chat commands system for better efficiency.
  • Added new model to better view the attachments.
  • Changed a bunch of icons and descriptions to better fit.
  • Added 2 additional attachment sets as examples for new system.


  • System is now fully functional on new patches.
  • Special effects and attachments are now destroyed immediately.

Credits


Special Thanks:

  • IcemanBo - Coding Improvements
  • Mckill2009 - BoardEx (multiboard wrapper)
  • Blood Raven - Bronze Armor Pack
  • InfernalTater - Bone Equipment
  • Astaroth Zion - Attachment Pack
  • Graber - Villager 255 Animations
  • Supermj - White Grid
  • Rysnt11 - Modified White Grid Added Alpha
  • Darkdeathknight - Camera Icon Pack

Author's Notes


  • Make sure all of your WC3 visual settings are on high due to ubersplats and other special effects not displaying otherwise!
  • Terrain tiles are now limited to 8 in example due to the WC3 hardcoded terrain tile limit being 16.
  • Attachments have a slight delay when removing due to death animations within the models themselves not the system. <<< SOLVED
  • To solve the above issue with attachments goto your gameplay constants and set your Decay Time (sec) - Effects to 0 then the attachments will be correctly removed without model editing.
Map Description Template Created by -Kobas-
Find more here: Map Description - Templates

Contents

Model and Effects Viewer v3.7 (Map)

Reviews
17:07, 3rd Dec 2012 Magtheridon96: This utility is alright. Well done.

Moderator

M

Moderator

17:07, 3rd Dec 2012
Magtheridon96: This utility is alright.
Well done.
 
Level 12
Joined
Feb 11, 2008
Messages
809
*Subscribing*

This system is not based completely on performance its more of just an easier way to go through different models and effects and view them easily.

With that being said i am still fixing all leaks as i go along and performance stays on my mind.
 
Level 7
Joined
Jan 28, 2012
Messages
266
  • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 1
    • Then - Actions
    • Environment - Set sky to Blizzard Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 2
    • Then - Actions
    • Environment - Set sky to Dalaran Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 3
    • Then - Actions
    • Environment - Set sky to Felwood Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 4
    • Then - Actions
    • Environment - Set sky to Fogged Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 5
    • Then - Actions
    • Environment - Set sky to Generic Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 6
    • Then - Actions
    • Environment - Set sky to Lordaeron Fall Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 7
    • Then - Actions
    • Environment - Set sky to Lordaeron Summer Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 8
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 9
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Bright Green)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 10
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Pink)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 11
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Purple)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 12
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Red)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 13
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Yellow)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 14
    • Then - Actions
you should use arrays instead of all of these ifs, reasons 1 it would be faster, 2 it would shorten your code 3 it would make it more readable.
you should really do this for all of your long strings of if's
 
Level 12
Joined
Feb 11, 2008
Messages
809
  • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 1
    • Then - Actions
    • Environment - Set sky to Blizzard Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 2
    • Then - Actions
    • Environment - Set sky to Dalaran Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 3
    • Then - Actions
    • Environment - Set sky to Felwood Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 4
    • Then - Actions
    • Environment - Set sky to Fogged Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 5
    • Then - Actions
    • Environment - Set sky to Generic Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 6
    • Then - Actions
    • Environment - Set sky to Lordaeron Fall Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 7
    • Then - Actions
    • Environment - Set sky to Lordaeron Summer Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 8
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 9
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Bright Green)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 10
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Pink)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 11
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Purple)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 12
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Red)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 13
    • Then - Actions
    • Environment - Set sky to Lordaeron Winter Sky (Yellow)
    • Else - Actions
    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
    • SkyIndex Equal to (==) 14
    • Then - Actions
you should use arrays instead of all of these ifs, reasons 1 it would be faster, 2 it would shorten your code 3 it would make it more readable.
you should really do this for all of your long strings of if's

What do you mean by using arrays instead of if/then/elses give me an example please and ill get to it.
 
Level 18
Joined
Oct 17, 2012
Messages
818
What do you mean by using arrays instead of if/then/elses give me an example please and ill get to it.

  • Skipping Numbers
    • Events
      • Player - Player 1 (Red) types a chat message containing <Empty String> as An exact match
    • Conditions
      • (Substring((Entered chat string), 1, 5)) Equal to -sky
    • Actions
      • Set SkyIndex[1] = Fogged Sky
      • Set SkyIndex[2] = Felwood Sky
      • Set SkyIndex[3] = Blizzard Sky
      • Environment - Set sky to SkyIndex[(Substring((Entered chat string), 6, 11))]
This is basically what Ender means.
 
Level 16
Joined
Aug 20, 2009
Messages
1,552
Lol, fail is fail Radamantus.

Haha anyway I love Razor's system really useful for lazy people, will check this one,

Thanks ! xD

This one needs WEU, which kinda differ from what i wanted it to be,

Simple and Easy, but Epic!.

but this one has Tons of new cool functions!,

I am subscribing to this, hope you get approved!

btw, thats one heck of a gigantically long trigger o.o!
 
Level 12
Joined
Feb 11, 2008
Messages
809
Still working on next big update heres some things to expect;

- adding a lot more terrain tiles to the list possibly all of them
- redid all if/then/elses i could and replaced them with variables
- ALL leaks will be completely taken care of
- working on some new features that are really cool

if anybody has any suggestions please tell me and ill get on it.

EDIT*

New version is up please let me know of any more changes or suggestions.
 
Last edited:
Level 12
Joined
Feb 11, 2008
Messages
809
New version with massive changes coming soon just have to fix 1 last glitch with fade filters!

EDIT*

new version is now up hopefully everything is completely fixed and is working great so i am now focusing on adding more features, the rest of the terrain tiles, the rest of the animation names, and some new commands!
 
Last edited:
Level 14
Joined
Aug 8, 2010
Messages
1,021
Uh... why i can't open the test map? I am with 1.24e (or 1.24a, i am not sure about the letter) version of War3 (i think). I tried with the original WE but i got an error. Then i tried with Jass New Gen and still nothing happened.
The problem is not when i click "Test Map", it's when i open it. I can't get to see the code in the editor.
 
Level 12
Joined
Feb 11, 2008
Messages
809
Ok it is now official i have been using this system a lot here lately for a map im making to see what effects and lightnings i wanted to use and was not pleased with its current state, so i am now doing a complete rewrite of this system in vJASS, adding all left out material and unfinished animation names, and have already fixed 4 annoying glitches with the next update!
 
Level 12
Joined
Feb 11, 2008
Messages
809
Version 3.0

System has been completely rewrote and do not worry about all the BJs and the inefficient coding its being fixed as we speak.

This version is released since its all been converted and all previous issues and glitches have been fixed!

Next version all coding will be completely fixed as efficient as possible with any other bugs/issues that may occur fixed.

Then final version will include ALL models, animations, etc. that have not already been added plus a few other features i have in mind!
 
Level 12
Joined
Feb 11, 2008
Messages
809
Version 3.1

Triggers have been greatly reworked and are much more efficient now.

initializations have been separated for both readability and efficiency!

Next version will include multiboard wrappers for the BJs that are left plus more content.


EDIT*


Version 3.2

Lots of changes made including new multiboard wrapper finished check changelog!
 
Last edited:
Level 12
Joined
Feb 11, 2008
Messages
809
Version 3.3

Check the change-log for a complete list of changes made!

This version was a complete rewrite in order to prepare the system for all the new features that i will be adding over the next couple of updates!

Even includes a sneak peak at the attachment tester WIP it is still very unfinished but is functional to take a look at.
 
Is the cam changing reversed on purpose? For me personaly, it's a bit unintuitive. :p
It's cool, but why exacltly one needs lightnings around, ubersplat, terrain, filters, when testing a model?
On a side note, there's a hardcoded terrain type limit "16", which means you sadly have more different terrain tiles at one map, even with triggers. Once a type is used, it's meant as registered.
 
Last edited:
Level 12
Joined
Feb 11, 2008
Messages
809
Is the cam changing reversed on purpose? For me personaly, it's a bit unintuitive. :p
It's cool, but why exacltly one needs lightnings around, ubersplat, terrain, filters, when testing a model?
On a side note, there's a hardcoded terrain type limit "16", which means you sadly have more different terrain tiles at one map, even with triggers. Once a type is used, it's meant as registered.

1. ok not sure what u meant by cam changing reversed? are you talking about backwards left right controls with arrow keys?

2. this viewer is a all in one so instead of a bunch of different lightning testers and animation viewers and such this will cover it all no problem.

3. checking into the hardcoded terrain type limit never heard of it before thanks for the response!
 
Level 12
Joined
Feb 11, 2008
Messages
809
yea i can easily reverse it if thats more convenient, i will probably go ahead and do that for next version.

and yep you are 100% correct about terrain tile limit well looks like i have to reduce it down to just 16 different variations then let the user change it as they see fit.

EDIT*

1. terrain tile limit is now fixed for next version which sucks because people dont get to view all of them at once but nothing we can do about it.

2. fixed camera system inversion for next version so now right = right and left = left.

EDIT**

Version 3.4

check change-log for any/all updates for this version and enjoy the new smoother system!
 
Last edited:
Few code notes.

Initialization Triggers


"FirstInitialization" , etc, is a too genric name. A library name should be specified to the system, so it never comes in name conflict.

Declared globals are not private and not public, which means they can come easily in a name conflict with normal variables by the user.
Example, the user might not use the name "Index" anymore, as it's integer array Index is already declared.
To change it I guess it's recommended to use the public, so you need the library name as prefix to reference the wanted variable.

Just a minor efficieny thing; a timer could be used to run the delayed init.

Why only 8 terrain tiles now instead of 16? ;D :)

JASS:
    set AnimationName[100] = "Stand Victory - 16"
    // This is to set up the Maximum and Minimum Animation Index Range.
    set MinIndex[6] = 0
    set MaxIndex[6] = 254
why it's set to 254, when it's indexed up to 100?

function ResetMultiboard takes nothing returns nothing
function RunFade takes integer f, string s returns nothing
^should become a public function. (name conflict)

I'm curious if there is a logical reason to seperate initilization functions into different scopes/library.

Camera System

It would be more "real" if all cases are checked, so each key checked as standalone, instead of using "else if".
Because it would result in pressing "right" + "left" in a "do nothing", as now, one key will get ignored, and not necessary the last pressed one,
but just the one that comes later in the "else if" structure.

Camera System

It would be more "real" if all cases are checked, so each key checked as standalone, instead of using "else if".
 
Level 12
Joined
Feb 11, 2008
Messages
809
Few code notes.

Initialization Triggers


"FirstInitialization" , etc, is a too genric name. A library name should be specified to the system, so it never comes in name conflict.

Declared globals are not private and not public, which means they can come easily in a name conflict with normal variables by the user.
Example, the user might not use the name "Index" anymore, as it's integer array Index is already declared.
To change it I guess it's recommended to use the public, so you need the library name as prefix to reference the wanted variable.

Just a minor efficieny thing; a timer could be used to run the delayed init.

Why only 8 terrain tiles now instead of 16? ;D :)

JASS:
    set AnimationName[100] = "Stand Victory - 16"
    // This is to set up the Maximum and Minimum Animation Index Range.
    set MinIndex[6] = 0
    set MaxIndex[6] = 254
why it's set to 254, when it's indexed up to 100?

function ResetMultiboard takes nothing returns nothing
function RunFade takes integer f, string s returns nothing
^should become a public function. (name conflict)

I'm curious if there is a logical reason to seperate initilization functions into different scopes/library.

Camera System

It would be more "real" if all cases are checked, so each key checked as standalone, instead of using "else if".
Because it would result in pressing "right" + "left" in a "do nothing", as now, one key will get ignored, and not necessary the last pressed one,
but just the one that comes later in the "else if" structure.

Camera System

It would be more "real" if all cases are checked, so each key checked as standalone, instead of using "else if".

Thanks for the response!

1. reason for the terrain tiles being 8 is that at 10 it was still glitching and starting to repeat i guess because of the terrain tiles already used on the actual testmap.

2. i am checking into the camera system thing, yea i noticed once before the when you give it multiple commands it just ignores one.

3. the animation index is set to 254 due to that unit having that many animations the animation names only goto 100 because i havnt got to type out all the rest yet. (caught me lol)

4. only separated initialization triggers for readability because i had someone complain they were too long if you would like i will combine all 3 into 1 and change trigger name.

5. checking into the
JASS:
public
variables and ill let you know how it goes!
 
Level 12
Joined
Feb 11, 2008
Messages
809
I just realized, that the library will probably never come in combination, so never in touch with other code libraries, etc, as the template makes maybe only sense in this demo map. So the naming conflicts are (still) pretty good habit, but not such essential to change, like for other submissions, I believe. : )

Appreciate that i was wondering same thing since this isnt going to be imported this is strictly for showing the user the models and effects as examples not for real time use.

EDIT*

Also your opinion should i go ahead and combine all the init triggers into 1 if so ill do that and then start on camera system
 
If I don't see logical sense to seperate them, I would only seperate them myself, if they are really, really big. (bigger than one is currently here) -- but I wouldn't recommend you to do that if you feel more comfortable with 3 "small" inits if you think you lose readability / maintainability. Those aspects are still more worth than a bit performance, etc. : )
 
Level 12
Joined
Feb 11, 2008
Messages
809
If I don't see logical sense to seperate them, I would only seperate them myself, if they are really, really big. (bigger than one is currently here) -- but I wouldn't recommend you to do that if you feel more comfortable with 3 "small" inits if you think you lose readability / maintainability. Those aspects are still more worth than a bit performance, etc. : )

okay for now ill condense down to just 2 slightly bigger triggers because theres a whole lot more content coming and there going to be big.

EDIT*

Ok progress so far;

1. initialization triggers condensed down to just 2 and rearranged to be more copacetic.

2. camera system redone and now checks each arrow key individually so commands are not ignored.

3. currently working on finishing the other 154 animation names then should be ready for next release.

EDIT**

Version 3.5

check change-log for complete list of changes!

now with everything fixed i am starting back progress on the attachment tester!

EDIT***

Version 3.6

check change-log for complete list of changes!

attachment tester is now fully functional with multiple examples of how to use!
 
Last edited:
Level 12
Joined
Feb 11, 2008
Messages
809
Version 3.7

check change-log for complete list of changes!

attachments now get destroyed immediately when changing from one set to another.

EDIT*

IF there is no bugs or glitches found in this version and everything continues to work smoothly this will probably be the last version unless a request is made for something to be added.

I would also like some feedback if anyone is still active please.
 
Last edited:
Level 16
Joined
Aug 20, 2009
Messages
1,552
Version 3.7

check change-log for complete list of changes!

attachments now get destroyed immediately when changing from one set to another.

EDIT*

IF there is no bugs or glitches found in this version and everything continues to work smoothly this will probably be the last version unless a request is made for something to be added.

I would also like some feedback if anyone is still active please.

Its been 6 years, and this is still being updated? :eek::eek:

Hahah, a lot happened since then, things come and go,
some people enters my life and some passed away,
new hobbies and interesting events arise, and old things gets forgotten,
but this is the longest thing I didn't expect to persists since then! :D:D:D
 
Level 16
Joined
Aug 20, 2009
Messages
1,552
haha its too good to just let it go and im one of the few believers that blizzard will eventually get warcraft 3 back on track after these issues they have been having get lined out.

btw great to see your still around man!

I recently jumped back to see 1.29, and I am loving the mouse events!
These are so much fun to play with, I'd like to definitely see it implemented in my map :D:D:D
 
Level 12
Joined
Feb 11, 2008
Messages
809
I recently jumped back to see 1.29, and I am loving the mouse events!
These are so much fun to play with, I'd like to definitely see it implemented in my map :D:D:D

yea i would wait until blizzard finishes lining them out but i agree im really hype about these updates.

right now any mouse events will override arrow key events so unless you dont use any arrow keys at all mouse events are not good right now.

they are susposed to fix that in the next version so they can work in sync though then FPS in wc3 might actually be possible haha!

EDIT*

btw just checked out your map it actually looks really cool man might give it a try!
 
Last edited:
Top