package electrosphere.menu; import electrosphere.auth.AuthenticationManager; import electrosphere.controls.ControlHandler.ControlsState; import electrosphere.engine.LoadingThread; import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityUtils; import electrosphere.entity.state.equip.EquipState; import electrosphere.entity.state.gravity.GravityUtils; import electrosphere.entity.state.gravity.GravityTree.GravityTreeState; import electrosphere.entity.state.inventory.InventoryUtils; import electrosphere.entity.state.inventory.RelationalInventoryState; import electrosphere.entity.state.inventory.UnrelationalInventoryState; import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.types.item.ItemUtils; import electrosphere.game.data.creature.type.CreatureType; import electrosphere.game.data.creature.type.visualattribute.VisualAttribute; import electrosphere.game.server.saves.SaveUtils; import electrosphere.main.Globals; import electrosphere.main.Main; import electrosphere.net.NetUtils; import electrosphere.renderer.Model; import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.actor.Actor; import electrosphere.renderer.actor.ActorStaticMorph; import electrosphere.renderer.ui.ClickableElement; import electrosphere.renderer.ui.DrawableElement; import electrosphere.renderer.ui.Element; import electrosphere.renderer.ui.FocusableElement; import electrosphere.renderer.ui.WidgetUtils; import electrosphere.renderer.ui.Window; import electrosphere.renderer.ui.ClickableElement.ClickEventCallback; import electrosphere.renderer.ui.DraggableElement.DragEventCallback; import electrosphere.renderer.ui.FocusableElement.FocusEventCallback; import electrosphere.renderer.ui.NavigableElement.NavigationEventCallback; import electrosphere.renderer.ui.ValueElement.ValueChangeEventCallback; import electrosphere.renderer.ui.elements.Button; import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.ImagePanel; import electrosphere.renderer.ui.elements.Label; import electrosphere.renderer.ui.elements.ScrollableContainer; import electrosphere.renderer.ui.elements.Slider; import electrosphere.renderer.ui.elements.TextInput; import electrosphere.renderer.ui.events.ClickEvent; import electrosphere.renderer.ui.events.DragEvent; import electrosphere.renderer.ui.events.FocusEvent; import electrosphere.renderer.ui.events.NavigationEvent; import electrosphere.renderer.ui.events.ValueChangeEvent; import electrosphere.renderer.ui.form.FormElement; import java.util.List; import javax.management.relation.Relation; import org.joml.Vector3f; /** * * @author amaterasu */ public class MenuGenerators { public static Element createTitleMenu(){ FormElement rVal = new FormElement(); //label (title) Label titleLabel = new Label(100,150,1.0f); titleLabel.setText("ORPG"); rVal.addChild(titleLabel); //button (multiplayer) Button singleplayerButton = new Button(); Label singleplayerLabel = new Label(100,275,1.0f); singleplayerLabel.setText("Singleplayer"); singleplayerButton.addChild(singleplayerLabel); rVal.addChild(singleplayerButton); singleplayerButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME); Globals.loadingThreadsList.add(clientThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = true; clientThread.start(); return false; }}); //button (multiplayer) Button multiplayerButton = new Button(); Label multiplayerLabel = new Label(100,350,1.0f); multiplayerLabel.setText("Multiplayer"); multiplayerButton.addChild(multiplayerLabel); rVal.addChild(multiplayerButton); multiplayerButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createMultiplayerMenu()); return false; }}); //button (arena) Button arenaButton = new Button(); Label arenaLabel = new Label(100,425,1.0f); arenaLabel.setText("Arena"); arenaButton.addChild(arenaLabel); rVal.addChild(arenaButton); arenaButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ LoadingThread serverThread = new LoadingThread(LoadingThread.LOAD_ARENA); Globals.loadingThreadsList.add(serverThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = true; serverThread.start(); WindowUtils.replaceMainMenuContents(MenuGeneratorsArena.createArenaHostLoginMenu()); return false; }}); //button (options) Button optionsButton = new Button(); Label optionsLabel = new Label(100,500,1.0f); optionsLabel.setText("Options"); optionsButton.addChild(optionsLabel); rVal.addChild(optionsButton); optionsButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createOptionsMainMenu()); return false; }}); //button (ui testing) Button uiTestingButton = new Button(); Label uiTestingLabel = new Label(100,575,1.0f); uiTestingLabel.setText("UI Testing"); uiTestingButton.addChild(uiTestingLabel); rVal.addChild(uiTestingButton); uiTestingButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createUITestMenu()); return false; }}); return rVal; } //Used when we're displaying loading window to make main menu invisible public static Element createEmptyMainMenu(){ Div rVal = new Div(); return rVal; } public static Element createWorldSelectMenu(){ FormElement rVal = new FormElement(); // int screenTop = Globals.WINDOW_HEIGHT - 150; List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; for(String saveName : saveNames){ if(!saveName.startsWith(".")){ //button (select save) Button selectButton = new Button(); Label selectLabel = new Label(100,125 + verticalPosition,1.0f); selectLabel.setText(saveName.toUpperCase()); selectButton.addChild(selectLabel); rVal.addChild(selectButton); selectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ if(SaveUtils.worldHasSave(saveName.toLowerCase())){ LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_CHARACTER_SERVER); Globals.loadingThreadsList.add(clientThread); LoadingThread serverThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME); Globals.loadingThreadsList.add(serverThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = true; clientThread.start(); serverThread.start(); } else { Globals.currentSaveName = saveName.toLowerCase(); SaveUtils.loadTerrainAndCreateWorldData(); WindowUtils.replaceMainMenuContents(MenuGenerators.createSaveCreationMenu()); } return false; }}); verticalPosition = verticalPosition + 75; } } //button (create) Button createButton = new Button(); Label createLabel = new Label(100,125 + verticalPosition + 200,1.0f); createLabel.setText("Create World"); createButton.addChild(createLabel); rVal.addChild(createButton); createButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldCreationMenu()); return false; }}); return rVal; } public static Element createWorldCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; // List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; //TODO: add text input to name world //button (create) Button createButton = new Button(); Label createLabel = new Label(100,screenTop + verticalPosition,1.0f); createLabel.setText("Not implemented"); createButton.addChild(createLabel); rVal.addChild(createButton); createButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldCreationMenu()); return false; }}); return rVal; } public static Element createSaveCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //button (save) Button saveButton = new Button(); Label saveLabel = new Label(100,screenTop + 125,1.0f); saveLabel.setText("Save"); saveButton.addChild(saveLabel); rVal.addChild(saveButton); saveButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ SaveUtils.saveWorldDataToSave(Globals.currentSaveName); WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldSelectMenu()); return false; }}); //button (cancel) Button cancelButton = new Button(); Label cancelLabel = new Label(100,screenTop + 200,1.0f); cancelLabel.setText("Cancel"); cancelButton.addChild(cancelLabel); rVal.addChild(cancelButton); saveButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldSelectMenu()); return false; }}); return rVal; } public static Element createCharacterCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; // List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; //TODO: add text input to name world //button (create) Button createButton = new Button(); Label createLabel = new Label(100,screenTop + verticalPosition,1.0f); createLabel.setText("Create World"); createButton.addChild(createLabel); rVal.addChild(createButton); return rVal; } public static Element createFinalizeSaveCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; // List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; //TODO: add text input to name world //button (create) Button createButton = new Button(); Label createLabel = new Label(100,screenTop + verticalPosition,1.0f); createLabel.setText("Create World"); createButton.addChild(createLabel); rVal.addChild(createButton); return rVal; } public static Element createMultiplayerMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //button (host) Button hostButton = new Button(); Label hostLabel = new Label(100,screenTop + 125,1.0f); hostLabel.setText("Host"); hostButton.addChild(hostLabel); rVal.addChild(hostButton); hostButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_CHARACTER_SERVER); Globals.loadingThreadsList.add(clientThread); LoadingThread serverThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME); Globals.loadingThreadsList.add(serverThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = true; clientThread.start(); serverThread.start(); return false; }}); //button (join) Button joinButton = new Button(); Label joinLabel = new Label(100,screenTop + 200,1.0f); joinLabel.setText("Join"); joinButton.addChild(joinLabel); rVal.addChild(joinButton); joinButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createIPMenu()); return false; }}); //button (back) Button connectButton = new Button(); Label connectLabel = new Label(100,screenTop + 275,1.0f); connectLabel.setText("Back"); connectButton.addChild(connectLabel); rVal.addChild(connectButton); connectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createTitleMenu()); return false; }}); return rVal; } public static Element createIPMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //label (address) Label addressLabel = new Label(100,screenTop + 50,1.0f); addressLabel.setText("IP Address"); rVal.addChild(addressLabel); //text entry (address) TextInput addressInput = new TextInput(100,screenTop + 125,1.0f); addressInput.setText(NetUtils.getAddress()); rVal.addChild(addressInput); //label (port) Label portLabel = new Label(100,screenTop + 200,1.0f); portLabel.setText("Port"); rVal.addChild(portLabel); //text entry (port) TextInput portInput = new TextInput(100,screenTop + 275,1.0f); portInput.setText(NetUtils.getPort() + ""); rVal.addChild(portInput); //label (address) Label usernameLabel = new Label(100,screenTop + 350,1.0f); usernameLabel.setText("Username"); rVal.addChild(usernameLabel); //text entry (address) TextInput usernameInput = new TextInput(100,screenTop + 425,1.0f); usernameInput.setText(""); rVal.addChild(usernameInput); //label (port) Label passwordLabel = new Label(100,screenTop + 500,1.0f); passwordLabel.setText("Password"); rVal.addChild(passwordLabel); //text entry (port) TextInput passwordInput = new TextInput(100,screenTop + 575,1.0f); passwordInput.setText(""); rVal.addChild(passwordInput); //button (connect) Button connectButton = new Button(); Label connectLabel = new Label(100,screenTop + 650,1.0f); connectLabel.setText("Connect"); connectButton.addChild(connectLabel); rVal.addChild(connectButton); connectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ NetUtils.setAddress(addressInput.getText()); NetUtils.setPort(Integer.parseInt(portInput.getText())); Globals.clientUsername = usernameInput.getText(); Globals.clientPassword = AuthenticationManager.getHashedString(passwordInput.getText()); LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_CHARACTER_SERVER); Globals.loadingThreadsList.add(clientThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = false; clientThread.start(); return false; }}); //button (back) Button backButton = new Button(); Label backLabel = new Label(100,screenTop + 725,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); rVal.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createMultiplayerMenu()); return false; }}); return rVal; } public static Element createOptionsMainMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //label (options) Label optionsLabel = new Label(100,screenTop + 50,1.0f); optionsLabel.setText("Options"); rVal.addChild(optionsLabel); //button (back) Button backButton = new Button(); Label backLabel = new Label(100,screenTop + 275,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); rVal.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createTitleMenu()); return false; }}); return rVal; } public static Element createUITestMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //button (back) Button backButton = new Button(); Label backLabel = new Label(100,screenTop + 275,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); rVal.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createTitleMenu()); return false; }}); //slider test Slider slider = new Slider(0, 0, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); rVal.addChild(slider); // slider = new Slider(0, 100, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 200, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 300, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 400, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 500, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 600, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 700, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 800, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 900, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); return rVal; } public static Element worldItemDropCaptureWindow(){ Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); Div div = new Div(); div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ if(Globals.draggedItem != null){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory; //drop item InventoryUtils.attemptEjectItem(Globals.playerEntity,Globals.draggedItem); //clear ui WindowUtils.cleanItemDraggingWindow(); String sourceWindowId = WindowUtils.getInventoryWindowID(inventory.getId()); WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(inventory)); //null globals Globals.dragSourceInventory = null; Globals.draggedItem = null; return false; } else if(Globals.dragSourceInventory instanceof RelationalInventoryState){ RelationalInventoryState inventory = (RelationalInventoryState) Globals.dragSourceInventory; //drop item InventoryUtils.attemptEjectItem(Globals.playerEntity,Globals.draggedItem); //clear ui WindowUtils.cleanItemDraggingWindow(); String sourceWindowId = WindowStrings.WINDOW_CHARACTER; WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createCharacterInventoryMenu(inventory)); //null globals Globals.dragSourceInventory = null; Globals.draggedItem = null; return false; } } return true; }}); div.setPositionX(0); div.setPositionY(0); div.setWidth(Globals.WINDOW_WIDTH); div.setHeight(Globals.WINDOW_HEIGHT); rVal.addChild(div); return rVal; } public static Window createInGameMainMenu(){ // int screenTop = Globals.WINDOW_HEIGHT - 150; int width = 500; int height = 500; Window rVal = new Window(0,0,width,height); // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; Div div = new Div(); rVal.addChild(div); div.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); Globals.controlHandler.hideMouse(); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); div.addChild(imagePanel); //label 1 (back) Button backButton = new Button(); Label backLabel = new Label(100,50,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); div.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); Globals.controlHandler.hideMouse(); return false; }}); //label 2 (quit) Button quitButton = new Button(); Label quitLabel = new Label(100,150,1.0f); quitLabel.setText("Quit"); quitButton.addChild(quitLabel); div.addChild(quitButton); quitButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ Main.running = false; return false; }}); //checking macro data is a poor man's check for whether we're arena or full gamemode if(Globals.server != null && Globals.macroData == null){ //label 3 (debug) Button debugButton = new Button(); Label debugLabel = new Label(100,250,1.0f); debugLabel.setText("Debug"); debugButton.addChild(debugLabel); div.addChild(debugButton); debugButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu()); return false; }}); } return rVal; } public static Window createInGameDebugMainMenu(){ // int screenTop = Globals.WINDOW_HEIGHT - 150; int width = 500; int height = 500; float fontSize = 0.4f; Window rVal = new Window(0,0,width,height); // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; // Div div = new Div(); // div.setPositionX(0); // div.setPositionY(0); // div.setWidth(500); // div.setHeight(500); ScrollableContainer scrollable = new ScrollableContainer(0, 0, width, height); rVal.addChild(scrollable); // scrollable.addChild(div); rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameMainMenu()); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height + 1000,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); scrollable.addChild(imagePanel); //label 1 (back) Button backButton = new Button(); Label backLabel = new Label(100,50,fontSize); backLabel.setText("Back"); backButton.addChild(backLabel); scrollable.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameMainMenu()); return false; }}); //text entry (port) TextInput modelDebugInput = new TextInput(100,150,fontSize); scrollable.addChild(modelDebugInput); modelDebugInput.setText("Model path goes here"); //label 3 (load model and debug) Button debugModelButton = new Button(); Label debugModelLabel = new Label(100,250,fontSize); debugModelLabel.setText("Print Model Debug Info"); debugModelButton.addChild(debugModelLabel); scrollable.addChild(debugModelButton); debugModelButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Model targetModel = null; if((targetModel = Globals.assetManager.fetchModel(modelDebugInput.getText())) != null){ targetModel.describeHighLevel(); } else { Globals.assetManager.addModelPathToQueue(modelDebugInput.getText()); Globals.assetManager.loadAssetsInQueue(); if((targetModel = Globals.assetManager.fetchModel(modelDebugInput.getText())) != null){ targetModel.describeHighLevel(); } } return false; }}); //label 4 (reload all shaders) Button reloadShaderButton = new Button(); Label reloadShaderLabel = new Label(100,350,fontSize); reloadShaderLabel.setText("Reload all shaders"); reloadShaderButton.addChild(reloadShaderLabel); scrollable.addChild(reloadShaderButton); reloadShaderButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.assetManager.forceReloadAllShaders(); return false; }}); //reload all models Button reloadModelButton = new Button(); Label reloadModelLabel = new Label(100,450,fontSize); reloadModelLabel.setText("Reload all models"); reloadModelButton.addChild(reloadModelLabel); scrollable.addChild(reloadModelButton); reloadModelButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.assetManager.forceReloadAllModels(); return false; }}); //disable drawing player character Button toggleDrawPlayerButton = new Button(); Label toggleDrawPlayerLabel = new Label(100,550,fontSize); toggleDrawPlayerLabel.setText("Toggle draw character"); toggleDrawPlayerButton.addChild(toggleDrawPlayerLabel); scrollable.addChild(toggleDrawPlayerButton); toggleDrawPlayerButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; if(Globals.playerEntity != null){ if(Globals.playerEntity.containsKey(EntityDataStrings.DATA_STRING_DRAW)){ boolean draw = (boolean)Globals.playerEntity.getData(EntityDataStrings.DATA_STRING_DRAW); Globals.playerEntity.putData(EntityDataStrings.DATA_STRING_DRAW, !draw); } if(Globals.playerEntity.containsKey(EntityDataStrings.DRAW_CAST_SHADOW)){ boolean drawShadow = (boolean)Globals.playerEntity.getData(EntityDataStrings.DRAW_CAST_SHADOW); Globals.playerEntity.putData(EntityDataStrings.DRAW_CAST_SHADOW, !drawShadow); } } return false; }}); //pull up character editor Button characterSliderMenuButton = new Button(); Label characterSliderMenuLabel = new Label(100,650,fontSize); characterSliderMenuLabel.setText("Character slider menu"); characterSliderMenuButton.addChild(characterSliderMenuLabel); scrollable.addChild(characterSliderMenuButton); characterSliderMenuButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameCharacterSliderMenu()); return false; }}); for(int i = 0; i < 5; i++){ Button someButton = new Button(); Label someLabel = new Label(100,750 + i * 100,fontSize); someLabel.setText("aaaaaa" + i); someButton.addChild(someLabel); scrollable.addChild(someButton); someButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; return false; }}); } //label (switch framebuffer) Button switchFramebufferButton = new Button(); Label switchFramebufferLabel = new Label(100,1250,fontSize); switchFramebufferLabel.setText("Switch Active Framebuffer"); switchFramebufferButton.addChild(switchFramebufferLabel); scrollable.addChild(switchFramebufferButton); switchFramebufferButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; RenderingEngine.incrementOutputFramebuffer(); return false; }}); //label (toggle draw collision spheres) Button toggleCollisionSpheresButton = new Button(); Label toggleCollisionSpheresLabel = new Label(100,1350,fontSize); toggleCollisionSpheresLabel.setText("Toggle draw collision spheres"); toggleCollisionSpheresButton.addChild(toggleCollisionSpheresLabel); scrollable.addChild(toggleCollisionSpheresButton); toggleCollisionSpheresButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawCollisionSpheres(!Globals.userSettings.graphicsDebugDrawCollisionSpheres()); return false; }}); //label (toggle draw physics objects) Button togglePhysicsObjectsButton = new Button(); Label togglePhysicsObjectsLabel = new Label(100,1450,fontSize); togglePhysicsObjectsLabel.setText("Toggle draw physics objects"); togglePhysicsObjectsButton.addChild(togglePhysicsObjectsLabel); scrollable.addChild(togglePhysicsObjectsButton); togglePhysicsObjectsButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawPhysicsObjects(!Globals.userSettings.graphicsDebugDrawPhysicsObjects()); return false; }}); //label (toggle draw movement vectors) Button toggleMovementVectorsButton = new Button(); Label toggleMovementVectorsLabel = new Label(100,1550,fontSize); toggleMovementVectorsLabel.setText("Toggle draw movement vectors"); toggleMovementVectorsButton.addChild(toggleMovementVectorsLabel); scrollable.addChild(toggleMovementVectorsButton); toggleMovementVectorsButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawMovementVectors(!Globals.userSettings.graphicsDebugDrawMovementVectors()); return false; }}); //label (toggle draw navmesh) Button toggleNavmeshButton = new Button(); Label toggleNavmeshLabel = new Label(100,1650,fontSize); toggleNavmeshLabel.setText("Toggle draw navmesh"); toggleNavmeshButton.addChild(toggleNavmeshLabel); scrollable.addChild(toggleNavmeshButton); toggleNavmeshButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawNavmesh(!Globals.userSettings.graphicsDebugDrawNavmesh()); return false; }}); return rVal; } public static Window createInGameCharacterSliderMenu(){ int width = 500; int height = 500; float fontSize = 0.4f; Window rVal = new Window(0,0,width,height); // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; // Div div = new Div(); // div.setPositionX(0); // div.setPositionY(0); // div.setWidth(500); // div.setHeight(500); ScrollableContainer scrollable = new ScrollableContainer(0, 0, width, height); rVal.addChild(scrollable); // scrollable.addChild(div); rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu()); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height + 1000,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); scrollable.addChild(imagePanel); //label 1 (back) Button backButton = new Button(); Label backLabel = new Label(200,50,fontSize); backLabel.setText("Back"); backButton.addChild(backLabel); scrollable.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu()); return false; }}); Entity playerEntity = Globals.playerEntity; Actor playerActor = EntityUtils.getActor(playerEntity); ActorStaticMorph staticMorph = playerActor.getStaticMorph(); CreatureType playeCreatureType = Globals.gameConfigCurrent.getCreatureTypeLoader().getCreature(CreatureUtils.getType(playerEntity)); int offset = 0; for(VisualAttribute attribute : playeCreatureType.getVisualAttributes()){ int posY = offset * 350 + 100; if(attribute.getType().equals("bone")){ Slider attributeSlider = new Slider(50,posY,400,100,new Vector3f(0.1f,0.1f,0.1f),new Vector3f(1.0f,0,0)); attributeSlider.setOnValueChangeCallback(new ValueChangeEventCallback() {public void execute(ValueChangeEvent event) { float value = event.getAsFloat(); float minVal = attribute.getMinValue(); float range = attribute.getMaxValue() - minVal; float actualValue = minVal + range * value; staticMorph.updateValue(attribute.getSubtype(), attribute.getPrimaryBone(), event.getAsFloat()); if(attribute.getMirrorBone() != null){ staticMorph.updateValue(attribute.getSubtype(), attribute.getMirrorBone(), event.getAsFloat()); } }}); scrollable.addChild(attributeSlider); } } return rVal; } public static Window createNaturalInventoryMenu(UnrelationalInventoryState inventory){ int width = 500; int height = 500; Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); Div div = new Div(); rVal.addChild(div); rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())), false); Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId())); // Globals.openInventoriesCount--; if(Globals.openInventoriesCount == 0){ Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); Globals.controlHandler.hideMouse(); } return false; }}); div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ if(Globals.draggedItem != null){ if(Globals.dragSourceInventory != inventory){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory; //transfer item sourceInventory.removeItem(Globals.draggedItem); inventory.addItem(Globals.draggedItem); //null out global state Globals.dragSourceInventory = null; Globals.draggedItem = null; //clear item container ui WindowUtils.cleanItemDraggingWindow(); //rerender both inventories //re-render inventory WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); //re-render inventory WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); } } else { //clear ui WindowUtils.cleanItemDraggingWindow(); //re-render inventory WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); } return false; } return true; }}); div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){ WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_INVENTORY); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); div.addChild(imagePanel); //label 1 (inventory) Label inventoryLabel = new Label(10,10,1.0f); inventoryLabel.setText("INVENTORY"); div.addChild(inventoryLabel); int columns = 8; int columnWidth = 60; int rowHeight = 60; for(int i = 0; i < inventory.getCapacity(); i++){ String texturePath = "Textures/icons/itemIconEmpty.png"; boolean hasItem = false; if(i < inventory.getItems().size()){ Entity currentItem = inventory.getItems().get(i); //get texture path from item texturePath = ItemUtils.getItemIcon(currentItem); //flag that this isn't an empty slot hasItem = true; } if(!Globals.assetManager.hasLoadedTexture(texturePath)){ Globals.assetManager.addTexturePathtoQueue(texturePath); } int posX = (10 + i % columns * columnWidth); int posY = 60 + (i / columns * rowHeight); int panelWidth = 50; int panelHeight = 50; ImagePanel panel = new ImagePanel(posX,posY,panelWidth,panelHeight,texturePath); if(hasItem == true){ int itemId = i; panel.setOnDragStart(new DragEventCallback() {public boolean execute(DragEvent event){ // System.out.println("Drag start"); Globals.dragSourceInventory = inventory; Globals.draggedItem = inventory.getItems().get(itemId); div.removeChild(panel); WindowUtils.pushItemIconToItemWindow(panel); return false; }}); panel.setOnDrag(new DragEventCallback() {public boolean execute(DragEvent event){ // System.out.println("Drag"); panel.setPositionX(event.getCurrentX() - panelWidth / 2); panel.setPositionY(event.getCurrentY() - panelHeight / 2); return false; }}); } else { panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ if(Globals.dragSourceInventory instanceof RelationalInventoryState){ RelationalInventoryState sourceInventory = (RelationalInventoryState) Globals.dragSourceInventory; Entity item = Globals.draggedItem; //destroy real world item if(ItemUtils.getRealWorldEntity(item) != null){ System.out.println("Destroy real world item"); ItemUtils.destroyInWorldItem(ItemUtils.getRealWorldEntity(item)); } //eject from equip state InventoryUtils.attemptDestroyItem(Globals.playerEntity,item); //add to unrelational sourceInventory.tryRemoveItem(item); inventory.addItem(item); //update ui Globals.dragSourceInventory = null; Globals.draggedItem = null; //clear item container ui WindowUtils.cleanItemDraggingWindow(); //rerender both inventories //re-render inventory WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterInventoryMenu(sourceInventory)); //re-render inventory WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); } //now the fun begins :) //if transfer item // remove item from current inventory // place item in new inventory // trigger recreation of the menu //if drop item // remove item from current inventory // create item in world in front of character // trigger recreation of the menu //if neither of above // replace item icon position to origin // System.out.println("Release drag"); return false; }}); } // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); div.addChild(panel); } return rVal; } public static Window createCharacterInventoryMenu(RelationalInventoryState inventory){ // int screenTop = Globals.WINDOW_HEIGHT - 150; int width = 500; int height = 500; // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); Div div = new Div(); div.setPositionX(1000); rVal.addChild(div); rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER), false); Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_CHARACTER); // Globals.openInventoriesCount--; if(Globals.openInventoriesCount == 0){ Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); Globals.controlHandler.hideMouse(); } return false; }}); div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ if(Globals.draggedItem != null){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory; //null out global state Globals.dragSourceInventory = null; Globals.draggedItem = null; //clear item container ui WindowUtils.cleanItemDraggingWindow(); //rerender both inventories //re-render inventory WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterInventoryMenu(inventory)); //re-render inventory WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); } return false; } return true; }}); div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){ WindowUtils.focusWindow(WindowStrings.WINDOW_CHARACTER); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(1000,0,width,height,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); div.addChild(imagePanel); //label 1 (inventory) Label inventoryLabel = new Label(1010,10,1.0f); inventoryLabel.setText("CHARACTER"); div.addChild(inventoryLabel); // int columns = 8; // int columnWidth = 60; // int rowHeight = 60; int slotSpacing = 30; List slots = inventory.getSlots(); int numSlots = slots.size(); // int numRows = (numSlots / 2) + (numSlots % 2 == 1 ? 1 : 0); int incrementer = 0; for(int i = 0; i < numSlots; i++){ String texturePath = "Textures/icons/itemIconEmpty.png"; boolean hasItem = false; if(inventory.getItemSlot(slots.get(i)) != null){ Entity currentItem = inventory.getItemSlot(slots.get(i)); //get texture path from item texturePath = ItemUtils.getItemIcon(currentItem); //flag that this isn't an empty slot hasItem = true; } if(!Globals.assetManager.hasLoadedTexture(texturePath)){ Globals.assetManager.addTexturePathtoQueue(texturePath); } int panelWidth = 50; int panelHeight = 50; int posX = 1000 + 20; if((incrementer % 2) == 1){ posX = posX + 400; } int posY = 60 + (i / 2 * (panelHeight + slotSpacing)); ImagePanel panel = new ImagePanel(posX,posY,panelWidth,panelHeight,texturePath); if(hasItem == true){ int itemId = i; panel.setOnDragStart(new DragEventCallback() {public boolean execute(DragEvent event){ // System.out.println("Drag start"); Globals.dragSourceInventory = inventory; Globals.draggedItem = inventory.getItemSlot(slots.get(itemId)); div.removeChild(panel); WindowUtils.pushItemIconToItemWindow(panel); return false; }}); panel.setOnDrag(new DragEventCallback() {public boolean execute(DragEvent event){ // System.out.println("Drag"); panel.setPositionX(event.getCurrentX() - panelWidth / 2); panel.setPositionY(event.getCurrentY() - panelHeight / 2); return false; }}); } else { int itemId = i; panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ // panel.setPositionX(posX); // panel.setPositionY(posY); if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState) Globals.dragSourceInventory; Entity item = Globals.draggedItem; if(inventory.canEquipItemToSlot(item, slots.get(itemId))){ //transfer item sourceInventory.removeItem(item); inventory.addItem(slots.get(itemId), item); //hydrate inventory item Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item)); //bind in world with in inventory ItemUtils.setRealWorldEntity(item, inWorldItem); //fire equip event to equip state EquipState equipState = (EquipState)Globals.playerEntity.getData(EntityDataStrings.EQUIP_STATE); equipState.attemptEquip(inWorldItem,inventory.getEquipPointFromSlot(slots.get(itemId))); GravityUtils.attemptDeactivateGravity(inWorldItem); } //update ui Globals.dragSourceInventory = null; Globals.draggedItem = null; //clear item container ui WindowUtils.cleanItemDraggingWindow(); //rerender both inventories //re-render inventory WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterInventoryMenu(inventory)); //re-render inventory WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); } //now the fun begins :) //if transfer item // remove item from current inventory // place item in new inventory // trigger recreation of the menu //if drop item // remove item from current inventory // create item in world in front of character // trigger recreation of the menu //if neither of above // replace item icon position to origin // System.out.println("Release drag"); //rebuild inventory windows return false; }}); } div.addChild(panel); //create the slot text posX = 1000 + 80; if((incrementer % 2) == 1){ posX = posX + 190; } posY = posY + 15; Label slotText = new Label(posX, posY, 0.4f); slotText.setText(slots.get(i)); div.addChild(slotText); incrementer++; } return rVal; } }