Tubing GUIs is a framework for building Inventory GUIs easily.
It is build upon Tubing. So you need to build a Tubing plugin for this to work.
Look into the Tubing Setup before continuing here.
Setup
Begin by adding the Tubing GUI dependency
Copy < dependency >
< groupId >be.garagepoort.mcioc</ groupId >
< artifactId >tubing-bukkit-gui</ artifactId >
< version >${tubing.version}</ version >
< exclusions >
< exclusion >
< groupId >*</ groupId >
< artifactId >*</ artifactId >
</ exclusion >
</ exclusions >
</ dependency >
The basic GUI framework requires 3 main components. A GUI Controller , a TubingGui and the GuiActionService.
Resources
The below configuration is only needed if you are using tubing gui templates and the maven-resources-plugin.
It's best to exclude these files to prevent maven from injecting properties into the file.
Copy < plugins >
< plugin >
< artifactId >maven-resources-plugin</ artifactId >
< configuration >
< nonFilteredFileExtensions >
< nonFilteredFileExtension >ftl</ nonFilteredFileExtension >
</ nonFilteredFileExtensions >
</ configuration >
...
</ plugin >
</ plugins >
Example
config.yml
Copy tubing-example :
# When enabled, the message broadcasted will be send across the bungee network
broadcast-on-bungee : true
broadcast-prefix : "&C[BROADCAST] &6"
broadcast-messages :
- Restart in 10 minutes
- Restart in 5 minutes
- Restart in 1 minutes
- Network maintenance today
Gui Controller
The controller defines 2 actions. The message-select action will open the inventory which will show what message to broadcast.
Copy @ IocBean
@ GuiController
public class BroadcastGuiController {
@ ConfigProperty ( "tubing-example.broadcast-messages" )
private List < String > predefinedMessages;
private final BroadcastingService broadcastingService;
public BroadcastGuiController ( BroadcastingService broadcastingService) {
this . broadcastingService = broadcastingService;
}
@ GuiAction ( "broadcast/message-select" )
public GuiTemplate viewMessageSelect () {
HashMap < String , Object > params = new HashMap <>();
params . put ( "messages" , predefinedMessages);
return template( "gui/broadcast/message-select.ftl" , params) ;
}
@ GuiAction ( "broadcast/send-message" )
public void sendMessage ( Player player , @ GuiParam ( "message" ) String message) {
broadcastingService . broadcast (player , message);
}
}
Message select template
Copy <#assign URLEncoder=statics['java.net.URLEncoder']>
< TubingGui size = "54" id = "broadcast-message-select" >
< title class = "gui-title" >Select message to broadcast</ title >
<#list messages as message >
< GuiItem id = "broadcast-message-${message?index}"
class = "broadcast-message"
slot = "${message?index}"
material = "PAPER"
onLeftClick = "broadcast/send-message?message=${URLEncoder.encode(message)}" >
< name class = "item-name" >${message}</ name >
</ GuiItem >
</#list>
</ TubingGui >
Command
The broadcast command will open the select GUI if you do not provide it any argument.
We can call any GUI action using the GuiActionService.
Copy @ IocBean
@ IocCommandHandler ( "broadcast" )
public class BroadcastCmd implements CommandExecutor {
private final MessageService messageService;
private final BroadcastingService broadcastingService;
private final GuiActionService guiActionService;
public BroadcastCmd ( MessageService messageService , BroadcastingService broadcastingService , GuiActionService guiActionService) {
this . messageService = messageService;
this . broadcastingService = broadcastingService;
this . guiActionService = guiActionService;
}
@ Override
public boolean onCommand ( CommandSender sender , Command command , String alias , String [] args) {
try {
if ( args . length == 0 ) {
if (sender instanceof Player) {
guiActionService . executeAction ((Player) sender , "broadcast/message-select" );
return true ;
} else {
throw new BusinessException( "Invalid arguments given for broadcast. Must provide a message" ) ;
}
}
String message = JavaUtils . compileWords (args , 0 );
broadcastingService . broadcast (sender , message);
return true ;
} catch ( BusinessException e) {
messageService . sendMessage (sender , "&6[Broadcasts] &C" + e . getMessage ());
return false ;
}
}
}