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

[GUI] Scrolling hero selction

Level 3
Joined
Jun 23, 2008
Messages
22
1. Intro
2. General Preparation
3. Triggers
3.1 - Variables
3.2 - Start-up
3.3 - Cameras
3.4 - Scroll Up
3.5 - Scroll down
3.6 - Select
4. Tips



1.
There are 3 basic forms of hero selection - Tavern, circle of power, and click selection.

If you've ever played Azeroth Grand Prix, you'll know that this is a very different form of hero selection from the 3 listed above.

If you haven't played it, basically this system lets you use an ability to scroll through your options of heroes using only GUI and some patients.

NOTE: This system is created to work from 1-12 players with very few changes


2.
First off, create your heroes for your game, there are many great tutorials on this take your pick of them if you need one. My favorite

NOTE: every hero you have will add approximately 4 minutes depending on how fast you are at triggers

now create a selectable unit or hero (easier with a unit) and:
-remove attack
-remove damage
-remove sight radius
-add the editor suffix "(select)"

Copy this unit and paste it until you have the same amount of it as you do heroes and:
-change the model of each one to match a different hero each time.
-rename each one to the proper class (eg. paladin, berserker etc...)

Create 3 dummy abilities (Do not use the same one 3 times)

-take (I recommend) War Stomp, Thunder Clap and Blade storm

-Remove any art, damage, AEO, mana cost and cool down.

-change the name of them to "select", "up" and "down"

-Change the descriptions to match ability, something like
-"select current hero"
-"scroll downwards"
-"scroll upwards"

-change the select icon (I used "Attribute Bonus")

-change the down and up icons (I attached some files at the bottom or you can use your own)

-Change button positions
-Down: 0, 2
-Up: 0, 0
-Select: 0, 1

-Change hotkeys
-Up: W
-Select: S
-Down: X

-Give all three abilities to every "(select)" hero


I like camera objects, you don't need them for this but I like to just to keep it organised.

Create just one camera object and label it "Hero"
there, thats all, keep it default game view.

Create one small region for each player

-Name them "Red Hero" "Blue Hero" ect...

NOTE: there should be at least a space the same size as the region between each one.

Now, if you hate working in the object editor as much as I do, that was the worst part.


3.

3.1
You only need one variable for this to work
make a: unit array called "Hero"

3.2
The starting trigger

  • Start Hero
    • Events
      • Time - Elapsed game time is 0.00 seconds
    • Conditions
    • Actions
      • Camera - Apply Hero <gen> for Player 1 (Red) over 0.00 seconds
      • Camera - Apply Hero <gen> for Player 2 (Blue) over 0.00 seconds
      • Camera - Apply Hero <gen> for Player 3 (Teal) over 0.00 seconds
      • Camera - Apply Hero <gen> for Player 4 (Purple) over 0.00 seconds
      • -------- Continue for all players --------
      • Visibility - Create an initially Enabled visibility modifier for Player 1 (Red) emitting Visibility across Red Hero <gen>
      • Visibility - Create an initially Enabled visibility modifier for Player 2 (Blue) emitting Visibility across Blue Hero <gen>
      • Visibility - Create an initially Enabled visibility modifier for Player 3 (Teal) emitting Visibility across Teal Hero <gen>
      • Visibility - Create an initially Enabled visibility modifier for Player 4 (Purple) emitting Visibility across Purple Hero <gen>
      • -------- Continue for all players --------
      • Game - Set the time of day to 12.00
      • Game - Turn the day/night cycle Off
This locks the camera at the starting point, makes the hero select regions visible and makes it so it is always day (You can turn the cycle back on later)

SAME TRIGGER
  • Start Hero
    • Events
      • Time - Elapsed game time is 0.00 seconds
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Player 1 (Red) slot status) Equal to Is playing
        • Then - Actions
          • Unit - Create 1 Paladin for Player 1 (Red) at (Center of Red Hero <gen>) facing Default building facing degrees
          • Selection - Select (Last created unit) for Player 1 (Red)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Player 2 (Blue) slot status) Equal to Is playing
        • Then - Actions
          • Unit - Create 1 Paladin for Player 2 (Blue) at (Center of Blue Hero <gen>) facing Default building facing degrees
          • Selection - Select (Last created unit) for Player 2 (Blue)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Player 3 (Teal) slot status) Equal to Is playing
        • Then - Actions
          • Unit - Create 1 Paladin for Player 3 (Teal) at (Center of Teal Hero <gen>) facing Default building facing degrees
          • Selection - Select (Last created unit) for Player 3 (Teal)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Player 4 (Purple) slot status) Equal to Is playing
        • Then - Actions
          • Unit - Create 1 Paladin for Player 4 (Purple) at (Center of Purple Hero <gen>) facing Default building facing degrees
          • Selection - Select (Last created unit) for Player 4 (Purple)
        • Else - Actions
If the player is playing this creates a "(select)" hero for that player and automatically selects it.

Again to keep it organised, I used "if/then/else multiple functions"


Camera Effect

  • Start Hero Cam1
    • Events
      • Time - Elapsed game time is 0.00 seconds
      • Time - Every 5.00 seconds of game time
    • Conditions
    • Actions
      • Camera - Rotate camera 360.00 degrees around (Center of Red Hero <gen>) for Player 1 (Red) over 5.00 seconds
Very simple trigger, at the start and every 5 seconds, the camera rotates around the region.

NOTE: Must make one for every player


Use The "Scroll up" ability

  • Scroll Up
    • Events
      • Unit - A unit Begins casting an ability
    • Conditions
      • (Ability being cast) Equal to Scroll Up
a unit casts scroll up

SAME TRIGGER

  • Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
      • If - Conditions
        • (Unit-type of (Triggering unit)) Equal to Paladin
      • Then - Actions
        • Unit - Replace (Triggering unit) with a Archmage using The old unit's relative life and mana
        • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
        • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
      • Else - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
      • If - Conditions
        • (Unit-type of (Triggering unit)) Equal to Archmage
      • Then - Actions
        • Unit - Replace (Triggering unit) with a Mountain King using The old unit's relative life and mana
        • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
        • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
      • Else - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
      • If - Conditions
        • (Unit-type of (Triggering unit)) Equal to Mountain King
      • Then - Actions
        • Unit - Replace (Triggering unit) with a Blood Mage using The old unit's relative life and mana
        • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
        • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
      • Else - Actions
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
      • If - Conditions
        • (Unit-type of (Triggering unit)) Equal to Blood Mage
      • Then - Actions
        • Unit - Replace (Triggering unit) with a Paladin using The old unit's relative life and mana
        • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
        • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
      • Else - Actions

This one requires a bit more explanation

You must establish an order for your heroes. Mine Goes

1. Paladin
2. Archmage
3. Mountain King
4. Blood Mage

(Obviously you'd replace them with your own)
NOTE: those are all "(Select)" units

So if a paladin uses "Scroll up" it will go to a mage, if a mage uses it, it will go to mountain king and mountain king to blood mage.

for "scroll down" the order would be reverse:

1. Blood Mage
2. Mountain King
3. Archmage
4. Paladin

When the ability is cast it will replace the current unit with the next one in line and then select it.

The set variable is not necessary but will not hurt anything, that was a mistake I made when I made this system a long time ago.


So scroll down would simply be like this

  • Scroll Down
    • Events
      • Unit - A unit Begins casting an ability
    • Conditions
      • (Ability being cast) Equal to Scroll Down
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Paladin
        • Then - Actions
          • Unit - Replace (Triggering unit) with a Blood Mage using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Archmage
        • Then - Actions
          • Unit - Replace (Triggering unit) with a Paladin using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Mountain King
        • Then - Actions
          • Unit - Replace (Triggering unit) with a Archmage using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Blood Mage
        • Then - Actions
          • Unit - Replace (Triggering unit) with a Mountain King using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Selection - Select Hero[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit))
        • Else - Actions
If you don't get it re-read the "Scroll up" explanation


okay, final trigger:

Select hero

  • Select Hero
    • Events
      • Unit - A unit Begins casting an ability
    • Conditions
      • (Ability being cast) Equal to Select Hero
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Paladin
        • Then - Actions
          • Unit - Replace Hero[(Player number of (Owner of (Triggering unit)))] with a Paladin (Real) using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Camera - Reset camera for (Owner of (Triggering unit)) to standard game-view over 0.00 seconds
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Archmage
        • Then - Actions
          • Unit - Replace Hero[(Player number of (Owner of (Triggering unit)))] with a Archmage (Real) using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Camera - Reset camera for (Owner of (Triggering unit)) to standard game-view over 0.00 seconds
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Mountain King
        • Then - Actions
          • Unit - Replace Hero[(Player number of (Owner of (Triggering unit)))] with a Mountain King (Real) using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Camera - Reset camera for (Owner of (Triggering unit)) to standard game-view over 0.00 seconds
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of (Triggering unit)) Equal to Blood Mage
        • Then - Actions
          • Unit - Replace Hero[(Player number of (Owner of (Triggering unit)))] with a Blood Mage (Real) using The old unit's relative life and mana
          • Set Hero[(Player number of (Owner of (Triggering unit)))] = (Last replaced unit)
          • Camera - Reset camera for (Owner of (Triggering unit)) to standard game-view over 0.00 seconds
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Owner of (Triggering unit)) Equal to Player 1 (Red)
        • Then - Actions
          • Trigger - Turn off Start Hero Cam1 <gen>
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Owner of (Triggering unit)) Equal to Player 2 (Blue)
        • Then - Actions
          • Trigger - Turn off Start Hero Cam2 <gen>
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Owner of (Triggering unit)) Equal to Player 3 (Teal)
        • Then - Actions
          • Trigger - Turn off Start Hero Cam3 <gen>
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Owner of (Triggering unit)) Equal to Player 4 (Purple)
        • Then - Actions
          • Trigger - Turn off Start Hero Cam4 <gen>
            • Else - Actions
This trigger is simple but repetitive

When a paladin casts select it will make a "(real)" paladin

same goes for all heroes

once the hero is created it will set the variable to the hero you picked making the rest of your game possible.

the other functions simply return the camera back to standard depending on who selected the hero.



4.
My favorite hero tutorial

If you want to make your own Icons use this

this system works best with hero arenas

occasional bugs occur, pm me with anything you didn't understand and I
might edit my tutorial

I am not on often so be patient

Thanks for reading!
 

Attachments

  • Up.tga
    16 KB · Views: 32
  • Down.tga
    16 KB · Views: 36
  • Hero Scroll System.w3x
    59.4 KB · Views: 30
Last edited:
Top