11.09.2016, 21:01
(
Последний раз редактировалось diclofoss; 11.09.2016 в 23:37.
)
Hello!
Found some issue. For Menu class there is no onSelectMenu function. This is not suitible to handle common MenuSelectedEvent and keep gamemode flow somewhere. Instad of this I created a class with static methods:
How to use:
In main gamemode class:
In somewhere where you need to create a menu (for example "skin shop"):
UPD: Dev team! Please validate my code, i think that synchronized can help the onSelectMenu for concurrent removing elements from arraylist
Found some issue. For Menu class there is no onSelectMenu function. This is not suitible to handle common MenuSelectedEvent and keep gamemode flow somewhere. Instad of this I created a class with static methods:
PHP код:
package ru.samp_net;
import java.util.ArrayList;
import java.util.List;
import net.gtaun.shoebill.event.menu.MenuSelectedEvent;
import net.gtaun.shoebill.object.Menu;
import net.gtaun.util.event.EventManager;
import net.gtaun.util.event.EventManagerNode;
/**
*
* @author Philipp Khlupin
*/
public class MenuController {
@FunctionalInterface
public static interface SelectMenuEvent {
public void onSelect(MenuSelectedEvent event);
}
private static EventManagerNode eventManagerNode;
private static List<Menu> menuList;
private static List<SelectMenuEvent> eventList;
public static void init(EventManager rootEventManager) {
eventManagerNode = rootEventManager.createChildNode();
menuList = new ArrayList<>();
eventList = new ArrayList<>();
setupEventHandlers();
}
public static void createMenuHandler(Menu menu, SelectMenuEvent event) {
menuList.add(menu);
eventList.add(event);
}
private static void setupEventHandlers() {
eventManagerNode.registerHandler(MenuSelectedEvent.class, (event) -> onSelectMenu(event));
}
public static void destroy() {
menuList.clear();
}
private static synchronized void onSelectMenu(MenuSelectedEvent event) {
SelectMenuEvent menuEvent;
for (int i = 0; i < menuList.size(); i++) {
if (event.getMenu().getId() == menuList.get(i).getId()) {
menuEvent = eventList.get(i);
menuEvent.onSelect(event);
menuList.remove(i);
eventList.remove(i);
return;
}
}
}
}
In main gamemode class:
PHP код:
protected void onEnable() throws Throwable {
EventManager eventManager = getEventManager();
//...
MenuController.init(eventManager);
//...
}
PHP код:
private void drawMenu(RolePlayer rolePlayer) {
Menu menu = SampObjectManager.get().createMenu("Choose skin", 1, 50.0f, 160.0f, 110.0f, 0.0f);
menu.setColumnHeader(0, "Choose skin");
menu.addItem(0, ">> Next");
menu.addItem(0, "<< Previous");
menu.addItem(0, "Done");
menu.show(rolePlayer.getPlayer());
MenuController.createMenuHandler(menu, (event) -> {
switch (event.getRow()) {
case 1:
// Show next skin
drawMenu(rolePlayer);
break;
case 2:
// Show previous skin
drawMenu(rolePlayer);
break;
default:
// Save changes
break;
}
});
}