diff --git a/assets/Audio/closeMenu.ogg b/assets/Audio/closeMenu.ogg new file mode 100644 index 00000000..0851068a Binary files /dev/null and b/assets/Audio/closeMenu.ogg differ diff --git a/assets/Audio/inventoryGrabItem.ogg b/assets/Audio/inventoryGrabItem.ogg new file mode 100644 index 00000000..ca0333f7 Binary files /dev/null and b/assets/Audio/inventoryGrabItem.ogg differ diff --git a/assets/Audio/inventorySlotItem.ogg b/assets/Audio/inventorySlotItem.ogg new file mode 100644 index 00000000..5253aa28 Binary files /dev/null and b/assets/Audio/inventorySlotItem.ogg differ diff --git a/assets/Audio/openMenu.ogg b/assets/Audio/openMenu.ogg new file mode 100644 index 00000000..08783f59 Binary files /dev/null and b/assets/Audio/openMenu.ogg differ diff --git a/src/main/java/electrosphere/audio/AudioUtils.java b/src/main/java/electrosphere/audio/AudioUtils.java index f6fb9843..904142ab 100644 --- a/src/main/java/electrosphere/audio/AudioUtils.java +++ b/src/main/java/electrosphere/audio/AudioUtils.java @@ -2,6 +2,8 @@ package electrosphere.audio; import electrosphere.logger.LoggerInterface; import electrosphere.main.Globals; +import electrosphere.util.FileUtils; + import org.joml.Vector3f; /** @@ -25,5 +27,20 @@ public class AudioUtils { } return rVal; } + + public static AudioSource playAudio(String audioFile){ + AudioSource rVal = null; + AudioBuffer buffer = Globals.assetManager.fetchAudio(FileUtils.sanitizeFilePath(audioFile)); + if(buffer != null){ + rVal = new AudioSource(false,false); + rVal.setBuffer(buffer.getBufferId()); + rVal.setGain(Globals.audioEngine.getGain()); + rVal.setPosition(new Vector3f()); + rVal.play(); + } else { + LoggerInterface.loggerEngine.WARNING("Failed to start audio in playAudioAtLocation"); + } + return rVal; + } } diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index 49080ce2..7526e097 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -1,5 +1,6 @@ package electrosphere.controls; +import electrosphere.audio.AudioUtils; import electrosphere.controls.Control.ControlMethod; import electrosphere.controls.Control.ControlType; import electrosphere.entity.Entity; @@ -22,6 +23,7 @@ import electrosphere.main.Main; import electrosphere.menu.WindowStrings; import electrosphere.menu.WindowUtils; import electrosphere.menu.MenuGenerators; +import electrosphere.menu.MenuGeneratorsInventory; import electrosphere.renderer.ui.Window; import electrosphere.renderer.ui.events.ClickEvent; import electrosphere.renderer.ui.events.KeyboardEvent; @@ -735,10 +737,8 @@ public class ControlHandler { Globals.elementManager.focusFirstElement(); Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); Globals.controlHandler.showMouse(); - // Element mainMenu = MenuGenerators.createInGameMainMenu(); - // Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenu); - // MenuGenerators.makeMenuDrawable(mainMenu); - // Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); + //play sound effect + AudioUtils.playAudio("/Audio/openMenu.ogg"); }}); controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setRepeatTimeout(0.5f * Main.targetFrameRate); @@ -751,7 +751,7 @@ public class ControlHandler { if(InventoryUtils.hasNaturalInventory(Globals.playerEntity) && Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(InventoryUtils.getNaturalInventory(Globals.playerEntity).getId())) == null){ //create window UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerEntity); - Window mainMenuWindow = MenuGenerators.createNaturalInventoryMenu(inventory); + Window mainMenuWindow = MenuGeneratorsInventory.createNaturalInventoryMenu(inventory); //register Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow); //make visible @@ -759,6 +759,8 @@ public class ControlHandler { //controls Globals.controlHandler.setHandlerState(ControlsState.INVENTORY); Globals.controlHandler.showMouse(); + //play sound effect + AudioUtils.playAudio("/Audio/openMenu.ogg"); // Globals.openInventoriesCount++; } @@ -773,7 +775,7 @@ public class ControlHandler { controls.get(INPUT_CODE_CHARACTER_OPEN).setOnClick(new ControlMethod(){public void execute(){ if(InventoryUtils.hasEquipInventory(Globals.playerEntity) && Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER) == null){ //create window - Window mainMenuWindow = MenuGenerators.createCharacterInventoryMenu(InventoryUtils.getEquipInventory(Globals.playerEntity)); + Window mainMenuWindow = MenuGeneratorsInventory.createCharacterInventoryMenu(InventoryUtils.getEquipInventory(Globals.playerEntity)); //register Globals.elementManager.registerWindow(WindowStrings.WINDOW_CHARACTER, mainMenuWindow); //make visible @@ -781,6 +783,8 @@ public class ControlHandler { //controls Globals.controlHandler.setHandlerState(ControlsState.INVENTORY); Globals.controlHandler.showMouse(); + //play sound effect + AudioUtils.playAudio("/Audio/openMenu.ogg"); // Globals.openInventoriesCount++; } diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index 5bbea10a..cfeae8b7 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -373,6 +373,10 @@ public class Globals { Globals.assetManager.addAudioPathToQueue("/Audio/MenuBadOption.ogg"); Globals.assetManager.addAudioPathToQueue("/Audio/MenuChangeOption.ogg"); Globals.assetManager.addAudioPathToQueue("/Audio/MenuType.ogg"); + Globals.assetManager.addAudioPathToQueue("/Audio/inventoryGrabItem.ogg"); + Globals.assetManager.addAudioPathToQueue("/Audio/inventorySlotItem.ogg"); + Globals.assetManager.addAudioPathToQueue("/Audio/openMenu.ogg"); + Globals.assetManager.addAudioPathToQueue("/Audio/closeMenu.ogg"); } public static void initDefaultGraphicalResources(){ diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index 675f0561..ad6d13ad 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -197,7 +197,7 @@ public class Main { if(Globals.RUN_CLIENT){ Globals.audioEngine = new AudioEngine(); Globals.audioEngine.init(); - Globals.audioEngine.setGain(0.1f); + // Globals.audioEngine.setGain(0.1f); } //init default resources diff --git a/src/main/java/electrosphere/menu/MenuGenerators.java b/src/main/java/electrosphere/menu/MenuGenerators.java index d7462e4c..9f1e3d6c 100644 --- a/src/main/java/electrosphere/menu/MenuGenerators.java +++ b/src/main/java/electrosphere/menu/MenuGenerators.java @@ -491,7 +491,7 @@ public class MenuGenerators { //clear ui WindowUtils.cleanItemDraggingWindow(); String sourceWindowId = WindowUtils.getInventoryWindowID(inventory.getId()); - WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(inventory)); + WindowUtils.replaceWindow(sourceWindowId,MenuGeneratorsInventory.createNaturalInventoryMenu(inventory)); //null globals Globals.dragSourceInventory = null; Globals.draggedItem = null; @@ -503,7 +503,7 @@ public class MenuGenerators { //clear ui WindowUtils.cleanItemDraggingWindow(); String sourceWindowId = WindowStrings.WINDOW_CHARACTER; - WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createCharacterInventoryMenu(inventory)); + WindowUtils.replaceWindow(sourceWindowId,MenuGeneratorsInventory.createCharacterInventoryMenu(inventory)); //null globals Globals.dragSourceInventory = null; Globals.draggedItem = null; @@ -845,333 +845,6 @@ public class MenuGenerators { 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; - } + } diff --git a/src/main/java/electrosphere/menu/MenuGeneratorsInventory.java b/src/main/java/electrosphere/menu/MenuGeneratorsInventory.java new file mode 100644 index 00000000..8aa65085 --- /dev/null +++ b/src/main/java/electrosphere/menu/MenuGeneratorsInventory.java @@ -0,0 +1,373 @@ +package electrosphere.menu; + +import java.util.List; + +import electrosphere.audio.AudioUtils; +import electrosphere.controls.ControlHandler.ControlsState; +import electrosphere.entity.Entity; +import electrosphere.entity.EntityDataStrings; +import electrosphere.entity.state.equip.EquipState; +import electrosphere.entity.state.gravity.GravityUtils; +import electrosphere.entity.state.inventory.InventoryUtils; +import electrosphere.entity.state.inventory.RelationalInventoryState; +import electrosphere.entity.state.inventory.UnrelationalInventoryState; +import electrosphere.entity.types.item.ItemUtils; +import electrosphere.main.Globals; +import electrosphere.renderer.ui.DraggableElement.DragEventCallback; +import electrosphere.renderer.ui.elements.Div; +import electrosphere.renderer.ui.elements.ImagePanel; +import electrosphere.renderer.ui.elements.Label; +import electrosphere.renderer.ui.events.ClickEvent; +import electrosphere.renderer.ui.events.DragEvent; +import electrosphere.renderer.ui.events.NavigationEvent; +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; + +public class MenuGeneratorsInventory { + + 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(); + } + //play sound effect + AudioUtils.playAudio("/Audio/closeMenu.ogg"); + 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()), MenuGeneratorsInventory.createNaturalInventoryMenu(inventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGeneratorsInventory.createNaturalInventoryMenu(sourceInventory)); + } + } else { + //clear ui + WindowUtils.cleanItemDraggingWindow(); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGeneratorsInventory.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); + //play sound effect + AudioUtils.playAudio("/Audio/inventoryGrabItem.ogg"); + 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, MenuGeneratorsInventory.createCharacterInventoryMenu(sourceInventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGeneratorsInventory.createNaturalInventoryMenu(inventory)); + //play sound effect + AudioUtils.playAudio("Audio/inventorySlotItem.ogg"); + } + //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(); + } + //play sound effect + AudioUtils.playAudio("/Audio/closeMenu.ogg"); + 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, MenuGeneratorsInventory.createCharacterInventoryMenu(inventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGeneratorsInventory.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); + //play sound effect + AudioUtils.playAudio("Audio/inventoryGrabItem.ogg"); + 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); + //play sound effect + AudioUtils.playAudio("Audio/inventorySlotItem.ogg"); + } + //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, MenuGeneratorsInventory.createCharacterInventoryMenu(inventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGeneratorsInventory.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; + } + +}