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

[Trigger] Math problem regarding Multiboard

Status
Not open for further replies.
Level 12
Joined
Mar 23, 2008
Messages
942
I was trying to make my multiboard show the kills and things like that, but I forgot to set a variable to what row is each player...

So I went to my multiboard trigger and start thinking....
But... I can't... I can't think a way to get something like

Multiboard_Spot[PlayerNumber] = RowX

The maim problem is that the players might not be like: 1, 2, 3, 4. They could be 1, 4, 5, 7, 8...
Edit: Now I also see that if player 3 is not playing and player 5 is, the game will crash...

And in my game Team 1 is: 1, 3, 5, 7, 9, 11
Team 2: 2, 4, 6, 8, 10, 12

Any help is appreciate!

  • Multiboard
    • Events
      • Time - Elapsed game time is 16.00 seconds
    • Conditions
    • Actions
      • Set Player_Count_team1 = (Number of players in (All players matching ((((Matching player) controller) Equal to User) and ((((Matching player) slot status) Equal to Is playing) and (((Matching player) is an ally of Player 1 (Red)) Equal to True)))))
      • Set Player_Count_team2 = (Number of players in (All players matching ((((Matching player) controller) Equal to User) and ((((Matching player) slot status) Equal to Is playing) and (((Matching player) is an ally of Player 2 (Blue)) Equal to True)))))
      • Multiboard - Create a multiboard with 5 columns and (5 + (Player_Count_team1 + Player_Count_team2)) rows, titled Anime Brawl
      • Multiboard - Set the text for (Last created multiboard) item in column 3, row 1 to (|cffff0000 + (Kill_Name + |r))
      • Multiboard - Set the text for (Last created multiboard) item in column 4, row 1 to (|cff0000ff + (Death_Name + |r))
      • Multiboard - Set the text for (Last created multiboard) item in column 5, row 1 to (|CFF949694 + (Assist_Name + |r))
      • Multiboard - Set the text for (Last created multiboard) item in column 1, row 2 to Team 1
      • Multiboard - Set the text for (Last created multiboard) item in column 1, row (3 + Player_Count_team1) to Team 2
      • Multiboard - Set the text for (Last created multiboard) item in column 1, row (4 + (Player_Count_team1 + Player_Count_team2)) to Time
      • Multiboard - Set the text for (Last created multiboard) item in column 1, row (5 + (Player_Count_team1 + Player_Count_team2)) to Game Mode
      • Multiboard - Set the text for (Last created multiboard) item in column 2, row (5 + (Player_Count_team1 + Player_Count_team2)) to Game_Mode
      • Multiboard - Set the text for (Last created multiboard) item in column 3, row (5 + (Player_Count_team1 + Player_Count_team2)) to (String(Game_Mode_Int))
      • Multiboard - Set the display style for (Last created multiboard) item in column 1, row 2 to Show text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 1, row (3 + Player_Count_team1) to Show text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 1, row (4 + (Player_Count_team1 + Player_Count_team2)) to Show text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 1, row (5 + (Player_Count_team1 + Player_Count_team2)) to Show text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 1, row 1 to Hide text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 2, row 1 to Hide text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 2, row 0 to Show text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 3, row 0 to Show text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 4, row 0 to Show text and Hide icons
      • Multiboard - Set the display style for (Last created multiboard) item in column 5, row 0 to Show text and Hide icons
      • Multiboard - Set the width for (Last created multiboard) item in column 1, row 0 to 8.00% of the total screen width
      • Multiboard - Set the width for (Last created multiboard) item in column 2, row 0 to 3.00% of the total screen width
      • Multiboard - Set the width for (Last created multiboard) item in column 3, row 0 to 3.20% of the total screen width
      • Multiboard - Set the width for (Last created multiboard) item in column 4, row 0 to 4.00% of the total screen width
      • Multiboard - Set the width for (Last created multiboard) item in column 5, row 0 to 3.50% of the total screen width
      • For each (Integer A) from 1 to Player_Count_team1, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Player_Count_team1 Greater than or equal to 1
            • Then - Actions
              • Multiboard - Set the text for (Last created multiboard) item in column 1, row ((Integer A) + 2) to (Player_Colors[((2 x (Integer A)) - 1)] + ((Name of (Player(((2 x (Integer A)) - 1)))) + |r))
            • Else - Actions
      • For each (Integer B) from 1 to Player_Count_team2, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Player_Count_team2 Greater than or equal to 1
            • Then - Actions
              • Multiboard - Set the text for (Last created multiboard) item in column 1, row ((Integer B) + (3 + Player_Count_team1)) to (Player_Colors[((Integer B) x 2)] + ((Name of (Player(((Integer B) x 2)))) + |r))
            • Else - Actions
      • Multiboard - Show (Last created multiboard)
 
Level 6
Joined
Sep 5, 2007
Messages
264
Honestly, you'd be better off doing this in JASS, each time you access a slot (row & column) on a Multiboard it creates a leak, that needs to be cleaned up.

It uses MultiboardGetItem(multiboard, row, column) to get a slot, which returns a multiboarditem type variable, that allows access to a given slot. These multiboarditem variables aren't automatically cleaned by Wc3, so you have to manually do it... hence, JASS would be best for this.

I could write a trigger for you, but you'd have to wait a couple of days for it, the real world beckons :p
 
Level 4
Joined
Nov 23, 2007
Messages
113
Not sure if you figured this out yet but you might consider something like this.

As Lord_Bones points out this is much easier in Jass. I don't really work with the trigger editor so hopefully you can just convert this over or just copy it to your main map script and create the variables for it and use it. Just as a side note, this would be a lot less code in vJass if you are thinking of working you way through Jass.

Anyway, you can create the following global variables (I've tried to use the names the GUI creates so you can copy the code if you want).


JASS:
integer			array	udg_mbPlayerRows
integer			array udg_mbTeamRows
integer			array udg_mbTeams
integer			array udg_mbTeamPlayerCount
integer			array udg_mbPlayers

integer			udg_mbTeamCount			= 0

Then use something like the following code:
JASS:
//===========================================================================
function IsPlaying takes integer whichPlayer returns boolean
   return (GetPlayerSlotState(Player(whichPlayer)) == PLAYER_SLOT_STATE_PLAYING)
endfunction

//===========================================================================
function MbSetItemVal takes multiboard mb, integer row, integer col, string val returns nothing
   local multiboarditem mbitem = MultiboardGetItem(mb, row, col)
   call MultiboardSetItemValue(mbitem, val)
   call MultiboardReleaseItem(mbitem)
   set mbitem = null
endfunction

//===========================================================================
// Draws the multiboard team/player titles and stores the rows at which they
// were displayed
//===========================================================================
function MbSetPlayerRows takes nothing returns integer
   local integer     teamIndex
   local integer     playerIndex
   local integer     playerCount
   local integer     row
   local integer     arrayOffset

   set udg_mbTeamCount = 0
   set teamIndex = 0
   // start team/player row just below first title row
   set row = 1
   loop
      exitwhen teamIndex >= 12
      set playerIndex = 0
      set playerCount = 0
      set arrayOffset = teamIndex * 12
      loop
         exitwhen playerIndex >= 12
         if ( IsPlaying(playerIndex) ) then
            if ( GetPlayerTeam(Player(playerIndex)) == teamIndex ) then
               if ( playerCount == 0 ) then
                  // current team has at least 1 player - add to udg_mbTeams array
                  // Save team index in sequencial order
                  set udg_mbTeams[udg_mbTeamCount] = teamIndex
                  // Save team row
                  set udg_mbTeamRows[teamIndex]    = row
                  set udg_mbTeamCount = udg_mbTeamCount + 1
                  // row reserved for team name, start players of team on next row
                  set row = row + 1
               endif
               // Save player index in sequential order for his team
               set udg_mbPlayers[arrayOffset + playerCount] = playerIndex
               // add player row to array, offest by team index
               set udg_mbPlayerRows[playerIndex] = row
               set row = row + 1
               set playerCount = playerCount + 1
            endif
         endif
         set playerIndex = playerIndex + 1
      endloop
      if ( playerCount > 0 ) then
         set udg_mbTeamPlayerCount[teamIndex] = playerCount
      endif
      set teamIndex = teamIndex + 1
   endloop
   // return rowcount for multiboard SetRowCount()
   return row
endfunction

//===========================================================================
function MbDrawPlayerTitles takes multiboard mb returns nothing
   local integer              t = 0
   local integer              p
   local integer              teamIndex
   local integer              playerIndex

   loop
      
      exitwhen t >= udg_mbTeamCount
      
       set teamIndex = udg_mbTeams[t]
      call MbSetItemVal(mb, udg_mbTeamRows[teamIndex], 0, "Team " + I2S(teamIndex+1))
//    call BJDebugMsg("Team " + I2S(teamIndex+1))
      set p = 0
      
      loop
         exitwhen p >= udg_mbTeamPlayerCount[teamIndex]
         
         set playerIndex = udg_mbPlayers[teamIndex * 12 + p]
//       call BJDebugMsg(GetPlayerName(Player(playerIndex)))
         call MbSetItemVal(mb, udg_mbPlayerRows[playerIndex], 0, GetPlayerName(Player(playerIndex)))
         set p = p + 1
         
      endloop
      set t = t + 1
   
   endloop
endfunction

//===========================================================================
function MbGetPlayerRow takes player p returns integer
   return udg_mbPlayerRows[GetPlayerId(p)]
endfunction

//===========================================================================
function MbGetPlayerTeamRow takes player p returns integer
   return udg_mbTeamRows[GetPlayerTeam(p)]
endfunction

You can then call the MbSetPlayerRows() function prior to setting up your multiboard, use MbDrawPlayerTitles() to draw the team/player titles, then the last two functions to obtain the team/player rows to display data.

Hope that helps (I know it ain't pretty but I only had time to plug something here to hopefully get you started).

Edit: Sorry, I can't get the jass code to line up with either tabs or spaces so some of it is out of whack. :/
 
Status
Not open for further replies.
Top