• Check out the results of the Techtree Contest #19!
  • Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.
  • Create a void inspired texture for Warcraft 3 and enter Hive's 34th Texturing Contest: Void! Click here to enter!
  • The Hive's 22nd Icon Contest: Creep Abilities is now concluded, time to vote for your favourite set of icons! Click here to vote!

[1.35+] GrapesOfWath's Extended GUI

GrapesOfWath

Sound Reviewer
Level 19
Joined
Mar 31, 2012
Messages
308

(MOST RECENT FILES HERE)

Hey guys, attached, I have files that you can use locally to make your GUI triggering experience better.

How to use:​

As these are modified game files, you need to enable "local files" to use them. Follow this tutorial to do so. After that, drop these files in your install directory, under the folder path:
Code:
_retail_/UI
_retail_/replaceabletextures/worldeditui (for the icons)

What does it do?​

Triggerdata.txt is the main ingredient here, this file has been organized so that 99.999% of all actions are grouped together by category. This file also adds functions to GUI, including, but not limited to: memory cleanup functions (remove location/region, destroy group/force), enable user control, change minimap image, item pool manipulation (including item pool variables), order queue natives, getlocalplayer (for conditions), etc. etc.
I have also added (LEAKS) to the end of a lot of functions that cause leaks

I do plan to organize more stuff and add more functions later, but I figured I'd share this now, as it is very useful to us GUI users.

IMPORTANT:​

If you have other people that you send your map to to work on, they must have these files as well if you use any of the new functions added, otherwise they will be replaced with Error lines on load. These files do not cause any issues with online play, and maps created with the assistance of these files can be played by people that do not have them.

To use the GetUnitGoldCost, GetUnitWoodCost, UnitAlive, and GetUnitBuildTime functions, this code must be present in your map header
JASS:
native GetUnitGoldCost takes integer unitid returns integer
native GetUnitWoodCost takes integer unitid returns integer
native UnitAlive takes unit id returns boolean
native GetUnitBuildTime takes integer unitid returns integer
OR
Lua:
//! endusercode
native GetUnitGoldCost takes integer unitid returns integer
native GetUnitWoodCost takes integer unitid returns integer
native UnitAlive takes unit id returns boolean
native GetUnitBuildTime takes integer unitid returns integer
//! beginusercode

  • Tauren, Dead, and Giant types for IsUnitType comparisons
  • RemoveLocation, RemoveRect, DestroyGroup, DestroyForce
  • SetUnitAnimationByIndex
  • EnableUserUI
  • BlzChangeMinimapTerrainTex (sets minimap image)
  • DisplayTextToPlayer (for displaying text to 1 player without having to worry about player group leaks)
  • Itempool and Unitpool manipulation (GUI Itempool/Unitpool variables, Destroy Itempool/Unitpool, Add Item/Unit Type to pool, Remove Item/Unit Type from pool, Place Random Item/Unit)
  • CreateUnitAtLoc (creates 1 unit at a location, doesn't set bj_lastCreatedUnit though)
  • Order queue natives (except for the "instant" ones because I have no idea what those are for)
  • GetUnitGoldCost and GetUnitWoodCost (although these do still need to be defined in your map header if you're using jass)
  • BlzGroupUnitAt (gets unit from group at specified index)
  • GetTriggerDestructible
  • GetLocalPlayer
  • All frame natives
  • BlzDecPlayerTechResearched
  • AddPlayerTechResearched
  • BlzDisplayChatMessage
  • BlzEnableCursor
  • BlzGetUnitAbilityByIndex
  • BlzGetAbilityId
  • BlzGetAnimName
  • BlzGetPlayerTownHallCount
  • BlzGetSpecialEffectScale
  • Cheat
  • ConvertPlayerColor
  • CripplePlayer
  • DisplayLoadDialog
  • EnableUserControl
  • FirstOfGroup
  • GetPlayerTypedUnitCount
  • GetUnitX
  • GetUnitY
  • IsUnitLoaded
  • IssueTargetOrderById
  • IssuePointOrderByIdLoc
  • IssueImmediateOrderById
  • BlzPauseUnitEx
  • GetLocationZ
  • SetUnitX, SetUnitY
  • UnitAlive
  • GetUnitBuildTime
  • GetTriggerWidget
 

Attachments

Last edited:
Today, I have finished adding all frame natives to GUI! I have also reordered some of the new functions I added in order to keep workflow closer to what it's been all these years, and I added the function to decrease the level of researched tech. Enjoy! Special thanks to the maintainers of the Jass documentation guide at wc3modding.info as well as @Tasyen, @TriggerHappy, and @Wrda for helping me understand frame stuff (I'm still not 100% how it all works lol but it's all here!)
 

Attachments

Last edited:
revision 4:
-Fixed BlzChangeMinimapTerrainTextHint
-Added Desync warnings to BlzFrameGetName/Value
-Added a warning to Comment about usage of percent signs
-Added DoNothingHint to make people feel bad for using DoNothing
-Added AddPlayerTechResearched, BlzDisplayChatMessage, BlzEnableCursor, BlzGetUnitAbilityByIndex, BlzGetAbilityId, BlzGetAnimName, BlzGetPlayerTownHallCount, BlzGetSpecialEffectScale, BlzGetUnitOrderCount, BlzUnitClearOrders, BlzUnitForceStopOrder, Cheat, ConvertPlayerColor, CripplePlayer, DisplayLoadDialog, EnableUserControl, FirstOfGroup, GetPlayerTypedUnitCount, GetUnitX, GetUnitY, IsUnitLoaded, IssueTargetOrderById, IssuePointOrderByIdLoc, IssueImmediateOrderById
Also added actions-frames.blp, an icon for the Frames category, which goes in
Code:
_retail_\replaceabletextures\worldeditui
 

Attachments

I would suggest to make Itempool be created on default for globals, like groups & dialogs do.
itempool should use itemcode not integer, don't want to type in rawCodes as decnumber.

You might add shopping functions somthing quite nice, but lacking in GUI:
BuyUnitForPlayer=0,player,unit,unitcode
_BuyUnitForPlayer_Defaults=Player00,GetTriggerUnit,hfoo
_BuyUnitForPlayer_Category=TC_NEUTRALBUILDING
_BuyUnitForPlayer_ScriptName=IssueNeutralImmediateOrderById

BuyItemForPlayer=0,player,unit,itemcode
_BuyItemForPlayer_Defaults=Player00,GetTriggerUnit,bgst
_BuyItemForPlayer_Category=TC_NEUTRALBUILDING
_BuyItemForPlayer_ScriptName=IssueNeutralImmediateOrderById

I once added presets that were missing in my opinion, the none melee races, bj_isSinglePlayer, bj_dncIsDaytime, triggerNull, ...

RaceNage=0,race,ConvertRace(11),WESTRING_UE_UNITRACE_NAGA
RaceCommoner=0,race,ConvertRace(9),WESTRING_UE_UNITRACE_COMMONER
RaceCreep=0,race,ConvertRace(8),WESTRING_UE_UNITRACE_CREEPS
RaceCritters=0,race,ConvertRace(10),WESTRING_UE_UNITRACE_CRITTERS
RaceOther=0,race,RACE_OTHER,WESTRING_UE_UNITRACE_OTHER
RaceUnknown=0,race,null,WESTRING_UE_UNITRACE_UNKNOWN
 
Pretty neat stuff. I skimmed over everything and didn't see BlzPauseUnitEx(), is that in the list?

Also, did this get fixed?
  • Set VariableSet
And other weird grammatical errors like that?
no and no, but can add those into revision 5
I would suggest to make Itempool be created on default for globals, like groups & dialogs do.
itempool should use itemcode not integer, don't want to type in rawCodes as decnumber.

You might add shopping functions somthing quite nice, but lacking in GUI:
BuyUnitForPlayer=0,player,unit,unitcode
_BuyUnitForPlayer_Defaults=Player00,GetTriggerUnit,hfoo
_BuyUnitForPlayer_Category=TC_NEUTRALBUILDING
_BuyUnitForPlayer_ScriptName=IssueNeutralImmediateOrderById

BuyItemForPlayer=0,player,unit,itemcode
_BuyItemForPlayer_Defaults=Player00,GetTriggerUnit,bgst
_BuyItemForPlayer_Category=TC_NEUTRALBUILDING
_BuyItemForPlayer_ScriptName=IssueNeutralImmediateOrderById

I once added presets that were missing in my opinion, the none melee races, bj_isSinglePlayer, bj_dncIsDaytime, triggerNull, ...

RaceNage=0,race,ConvertRace(11),WESTRING_UE_UNITRACE_NAGA
RaceCommoner=0,race,ConvertRace(9),WESTRING_UE_UNITRACE_COMMONER
RaceCreep=0,race,ConvertRace(8),WESTRING_UE_UNITRACE_CREEPS
RaceCritters=0,race,ConvertRace(10),WESTRING_UE_UNITRACE_CRITTERS
RaceOther=0,race,RACE_OTHER,WESTRING_UE_UNITRACE_OTHER
RaceUnknown=0,race,null,WESTRING_UE_UNITRACE_UNKNOWN
thanks for the suggestions bb <3
 
rev5
-Itempool now uses itemcode instead of integer
-Fixed Set VariableSet typo
-Added more race presets (naga, commoner, critters, creep, other, unknown) (thanks, tasyen)
-Added BlzPauseUnitEx, IssueNeutralImmediateOrderById (buys units/items from shops)
-Fixed some bugs with BlzCreateFrame and BlzCreateSimpleFrame (mistyped function names)
-Itempools are now initialized by default as global variables
-Added Target Flag integer presets to make setting a unit's Targets Allowed fields easier

this is the same actions-frames.blp as rev4, just uploading it again for ease of access.
 

Attachments

rev6
-Added a way to use custom scripted if conditions in GUI
-Added order id presets (integer based) and changed all order id based functions to use order id rather than normal integer

actions-frames.blp is still the same, just included for ease of access
 

Attachments

Last edited:
rev7
-Added a category for memory cleanup actions so I could give them a cute lil icon
-Fixed a typo somewhere (I think it was start ability cooldown?)
-Added Smart to order id presets list
-Changed TOC File argument from string to anyfile
-Fixed a typo that broke GameEventCustomUIFrame
actions-frames is still the same, and actions-cleanup goes in the same folder

also, here's a little sneak peak of the future of my GUI modding project:
1680751096564.png
 

Attachments

Wonder if there's a way to darken editor's windows instead of being eye blindingly white.
if you mean the world editor, not without being much better at programming than I am

if you mean the thing in my screenshot, there definitely is, but that’ll come after I get everything working
 
That's great! But can you add custom code as an option for every return type of functions like you can with the good old JNGP?
Like in the picture below. It converts to:
JASS:
call CreateNUnitsAtLoc(              (JASS CODE),                                     (JASS CODE),                     (JASS CODE),                       (JASS CODE),                        (JASS CODE) )
Various spacings were used to differentiate between custom code of different types in JNGP TriggerData patch. I am not sure it is necessary.
1683183471105.png
 
That's great! But can you add custom code as an option for every return type of functions like you can with the good old JNGP?
Like in the picture below. It converts to:
JASS:
call CreateNUnitsAtLoc(              (JASS CODE),                                     (JASS CODE),                     (JASS CODE),                       (JASS CODE),                        (JASS CODE) )
Various spacings were used to differentiate between custom code of different types in JNGP TriggerData patch. I am not sure it is necessary.
View attachment 432904
this is a possibility, sure

also an update on the GuiGui application: there's currently a bug with visual studio that causes the designer to freeze when a treeview is present in a tabpage so my hands are tied on development at the moment :(
 
Code:
rev8
-Fixed a typo in TriggerRegisterUnitInRangeSimple's entries (Limits line was input as a second Defaults line)
-A few other minor fixes (honestly don't remember where lol)
-Fixed BlzPauseUnitEx arguments (accidentally had them swapped)
-Changed DisplayTextToPlayer and DisplayTimedTextToPlayer default to Player 1
-Moved Custom Script conditions below Buff Comparison to preserve workflow
-Added GetLocationZ
 

Attachments

Code:
rev9
-Added SetUnitX, SetUnitY, UnitAlive, and GetUnitBuildTime
-Fixed "intger" typo in BlzSetAbilityIntegerField arguments list
-Fixed a broken argument (red value) in PingMinimapLocForForceEx
-Alphabetized categories for all function call types (except for returns handle because that's kinda not possible)
-Added WESTRINGs for Text Justify presets so they don't all show up blank anymore
 

Attachments

I use it with lua maps with no problems 🤔
Suppose it depends on how much content is in a map when it crashes... Tried using the first frame action on an empty map and it only disabled the trigger.
mhmhm.png


Reminds me of when one had to be careful with gui hashtables a long time ago.
 
rev10
-Fixed a typo that caused blzcreateframe to not be usable
-Added Unitpool natives
 

Attachments

1698116288475.png

found a workaround for the treeview thing and have made great strides, GuiGui might actually be ready soon 🥳

This is not needed in Lua, it's erased. Blizzard's hidden jass2lua transpiler

Good job and great idea. I hope for some translation solution in the future.
it's not needed to use those in raw script, but for GUI, you will get an error without it
 
Last edited:
Code:
rev11
-Gave frameevents westrings oops lol
-BlzChangeMinimapTerrainTex now uses imagefile for its argument instead of string
-Added Widget Dies event
-Added GetTriggerWidget

widget dies and gettriggerwidget both say item here rather than widget, haven't tested but @TriggerHappy suggested this as a way to check when an item dies
 

Attachments

Widget is a finnicky type, probably a leftover from times before item, unit, doodads existed as types. It is more generic and harder to work with BECAUSE it's a different types and there's no easy way to typecast in Jass. Only either downcasting or upcasting is still possible.
 
Code:
rev12
-Added CreateGroup to function calls list
-Added TimerStart
-Added Multiboard functions that take MultiboardItem to avoid leaks
-Added null presets for Player Group, Item Type, Destructable Type, and Trigger
 

Attachments

This is not needed in Lua, it's erased. Blizzard's hidden jass2lua transpiler

Good job and great idea. I hope for some translation solution in the future.
going back to this, what did you mean by “translation solution”?

im little confused can someone please tell me how can i reduce UI size using this?
I’m not necessarily a triggering wizard so idk what exactly you have to do, but the Frames category has all you need for that
 
This extended GUI allowed me to continue working when baseline editor failed me, as far as I can tell it is a must have for anyone who plans to work in GUI.
Also offers a bunch of appreciable tooltips which are useful esp for newer users.

Very naice
 
Would be nice if you added this to the main post in the description. (for the editor icons) - since the post specifies the retail/UI
retail\replaceabletextures\worldeditui
(As well as adding all the latest updated files to the main post in the attachments)

I also don't quite understand the Display the text to Single Player.
Why there are some coordinates , while when displaying the usual text for all players doesn't have any.
Screenshot_76.png
Screenshot_74.png
 
Last edited:
Would be nice if you added this to the main post in the description. (for the editor icons) - since the post specifies the retail/UI

(As well as adding all the latest updated files to the main post in the attachments)

I also don't quite understand the Display the text to Single Player.
Why there are some coordinates , while when displaying the usual text for all players doesn't have any.
View attachment 485502View attachment 485501
done. the coordinates there are screen coordinates, which iirc are also used by some frame natives. they let you put the text wherever you want, rather than just the default bottom left corner position.
 
Code:
rev13
-Added CreateTimer
-Added CreateTimerDialog
-Added No Ability preset
-Added Longer Real to function calls list (it's just a custom script box)
-Added Wand Of Illusion and SkillMenu to list of order id presets
-Sorted real, item class, player score, order id, origin frame, and frame event presets alphabetically
 

Attachments

Code:
rev14
-Added OSKey Events (partial implementation, a-z,0-9,arrow keys,space,tab,return,ctrl,shift,alt,f1-12)
-Added a duplicate of Image - Create that uses imagefile instead of string for the file path
-Added AddSpecialEffect (creates special effect at x/y coordinates) (works as action and function call)
 

Attachments

Code:
rev15
-added ExecuteFunc
-enabled code, oskeytype, framepointtype, originframetype, and unitpool global variables
-added damagetype and weapontype conditions
 

Attachments

Code:
rev15
-added ExecuteFunc
-enabled code, oskeytype, framepointtype, originframetype, and unitpool global variables
-added damagetype and weapontype conditions
Just a suggestion, I think it would be nicer to present each new update as a complete package in a single folder.

That way, users would just need to unzip and replace the existing folder. If you add new files or make changes, everything would go straight into the correct subfolders, and the user would still only have to replace one main folder.
 

Attachments

Just a suggestion, I think it would be nicer to present each new update as a complete package in a single folder.
done
Code:
rev16
-enabled region global variables, added region natives, and changed all default references to regions to "rect", as they are actually rects
 

Attachments

Code:
rev17
-Fixed BlzSetUnitAttackCooldown limits to be 0 and 1 instead of 1 and 2 (this function is 0 indexed)
-Added the new Max Fly Height unit real field
-Updated worldeditstrings.txt to include the new 2.0.3 strings
 

Attachments

I want to suggest few new functions (if something like this is possible)
  • New Event: Any Player Enters a chat string
  • New Event: Unit enters any region
  • New Condition: Entered Region check

  • Untitled Trigger 001
    • Events
      • Player - Player 1 (Red) types a chat message containing -save as An exact match
      • Player - Player 2 (Blue) types a chat message containing -save as An exact match
    • Conditions
    • Actions
Because, atm, if we want to make GUI triggers when all players have to enter a command we have to do it manually or via add event action.
(Same for the work with Regions)
 
I want to suggest few new functions (if something like this is possible)
  • New Event: Any Player Enters a chat string
  • New Event: Unit enters any region
  • New Condition: Entered Region check

  • Untitled Trigger 001
    • Events
      • Player - Player 1 (Red) types a chat message containing -save as An exact match
      • Player - Player 2 (Blue) types a chat message containing -save as An exact match
    • Conditions
    • Actions
Because, atm, if we want to make GUI triggers when all players have to enter a command we have to do it manually or via add event action.
(Same for the work with Regions)
if the functions already exist, then sure, but I’m not sure if any of these do. I can check though.
 
I want to suggest few new functions (if something like this is possible)
  • New Event: Any Player Enters a chat string
  • New Event: Unit enters any region
  • New Condition: Entered Region check

  • Untitled Trigger 001
    • Events
      • Player - Player 1 (Red) types a chat message containing -save as An exact match
      • Player - Player 2 (Blue) types a chat message containing -save as An exact match
    • Conditions
    • Actions
Because, atm, if we want to make GUI triggers when all players have to enter a command we have to do it manually or via add event action.
(Same for the work with Regions)
as it would turn out, the region check is the only one of these that exists, and it is already in the files
 
Back
Top