From 1e13c55f1ff80b062e28d3e350e99561e7be5c11 Mon Sep 17 00:00:00 2001 From: austin Date: Tue, 17 Sep 2024 17:22:38 -0400 Subject: [PATCH] inventory menu fixes and work --- docs/src/progress/renderertodo.md | 1 + .../components/EquipmentInventoryPanel.java | 297 +++++++++--------- .../ui/components/NaturalInventoryPanel.java | 2 + .../ui/components/PlayerInventoryWindow.java | 8 +- 4 files changed, 157 insertions(+), 151 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 181eb7d7..09988719 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -779,6 +779,7 @@ Fix equipped item packet not being sent to creature's player Component-ify natural and equip inventory menus Post Processing Pipeline w/ blur Blur on open inventory/main menu in game +Remove legacy UI handling of positioning -- entirely reliant on yoga now (09/17/2024) Framebuffer position drilling diff --git a/src/main/java/electrosphere/renderer/ui/components/EquipmentInventoryPanel.java b/src/main/java/electrosphere/renderer/ui/components/EquipmentInventoryPanel.java index 8c0ff1f9..48d065ae 100644 --- a/src/main/java/electrosphere/renderer/ui/components/EquipmentInventoryPanel.java +++ b/src/main/java/electrosphere/renderer/ui/components/EquipmentInventoryPanel.java @@ -4,6 +4,7 @@ import java.util.List; import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType; import electrosphere.engine.Globals; +import electrosphere.engine.signal.Signal.SignalType; import electrosphere.entity.Entity; import electrosphere.entity.state.equip.ClientEquipState; import electrosphere.entity.state.inventory.InventoryUtils; @@ -19,6 +20,7 @@ import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.ImagePanel; import electrosphere.renderer.ui.elements.Label; import electrosphere.renderer.ui.elementtypes.ClickableElement.ClickEventCallback; +import electrosphere.renderer.ui.elementtypes.ContainerElement.YogaAlignment; import electrosphere.renderer.ui.elementtypes.ContainerElement; import electrosphere.renderer.ui.elementtypes.DraggableElement.DragEventCallback; import electrosphere.renderer.ui.elementtypes.Element; @@ -80,167 +82,168 @@ public class EquipmentInventoryPanel { 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(); - EquipPoint equipPoint = null; - // int numRows = (numSlots / 2) + (numSlots % 2 == 1 ? 1 : 0); + { + Div leftSlots = Div.createCol(); + leftSlots.setFlexGrow(1); + Div rightSlots = Div.createCol(); + rightSlots.setFlexGrow(1); + rightSlots.setAlignItems(YogaAlignment.End); - int incrementer = 0; - for(int i = 0; i < numSlots; i++){ - String texturePath = "Textures/ui/uiFrame1.png"; - boolean hasItem = false; - String slotId = slots.get(i); - equipPoint = inventory.getEquipPointFromSlot(slotId); - if(!equipPoint.isCombinedPoint()){ - if(inventory.getItemSlot(slotId) != null){ - Entity currentItem = inventory.getItemSlot(slotId); - //get texture path from item - texturePath = ItemUtils.getItemIcon(currentItem); - //flag that this isn't an empty slot - hasItem = true; - } else if(inventory.getCombinedPoint(slotId) != null && inventory.hasItemInSlot(inventory.getCombinedPoint(slotId).getEquipPointId())){ - Entity currentItem = inventory.getItemSlot(inventory.getCombinedPoint(slotId).getEquipPointId()); - //get texture path from item - texturePath = ItemUtils.getItemIcon(currentItem); - //flag that this isn't an empty slot - hasItem = true; - equipPoint = inventory.getCombinedPoint(slotId); - slotId = equipPoint.getEquipPointId(); - } - if(!Globals.assetManager.hasLoadedTexture(texturePath)){ - Globals.assetManager.addTexturePathtoQueue(texturePath); - } - int panelWidth = 50; - int panelHeight = 50; - int posX = 20; - if((incrementer % 2) == 1){ - posX = posX + 400; - } - int posXf = posX; - int posY = 60 + (i / 2 * (panelHeight + slotSpacing)); - int posYf = posY; - int itemPosX = posX; - int itemPosY = posY; - ImagePanel panel = ImagePanel.createImagePanelAbsolute(posX,posY,panelWidth,panelHeight,texturePath); - if(hasItem == true){ - //literally just here to get around finality of variable within callback - String finalSlotId = slotId; - panel.setOnDragStart(new DragEventCallback() { - public boolean execute(DragEvent event){ - LoggerInterface.loggerUI.DEBUG("Drag start"); - Globals.dragSourceInventory = inventory; - Globals.draggedItem = inventory.getItemSlot(finalSlotId); - ContainerElement container = (ContainerElement)panel.getParent(); - container.removeChild(panel); - WindowUtils.pushItemIconToItemWindow(panel); - //add a dummy icon in place of the existing one - dummyPanel = ImagePanel.createImagePanelAbsolute(posXf,posYf,panelWidth,panelHeight,"Textures/ui/uiFrame1.png"); - container.addChild(dummyPanel); - //play sound effect - if(Globals.virtualAudioSourceManager != null){ - Globals.virtualAudioSourceManager.createVirtualAudioSource("/Audio/inventoryGrabItem.ogg", VirtualAudioSourceType.UI, false); - } - 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; - }}); - panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ - if(panel.getParent() != div){ - if(panel.getParent() != null){ + List slots = inventory.getSlots(); + EquipPoint equipPoint = null; + + for(int i = 0; i < slots.size(); i++){ + Div colContainer = i % 2 == 0 ? leftSlots : rightSlots; + boolean endAlign = i % 2 == 1; + String texturePath = "Textures/ui/uiFrame1.png"; + boolean hasItem = false; + String slotId = slots.get(i); + equipPoint = inventory.getEquipPointFromSlot(slotId); + if(!equipPoint.isCombinedPoint()){ + if(inventory.getItemSlot(slotId) != null){ + Entity currentItem = inventory.getItemSlot(slotId); + //get texture path from item + texturePath = ItemUtils.getItemIcon(currentItem); + //flag that this isn't an empty slot + hasItem = true; + } else if(inventory.getCombinedPoint(slotId) != null && inventory.hasItemInSlot(inventory.getCombinedPoint(slotId).getEquipPointId())){ + Entity currentItem = inventory.getItemSlot(inventory.getCombinedPoint(slotId).getEquipPointId()); + //get texture path from item + texturePath = ItemUtils.getItemIcon(currentItem); + //flag that this isn't an empty slot + hasItem = true; + equipPoint = inventory.getCombinedPoint(slotId); + slotId = equipPoint.getEquipPointId(); + } + if(!Globals.assetManager.hasLoadedTexture(texturePath)){ + Globals.assetManager.addTexturePathtoQueue(texturePath); + } + int panelWidth = 50; + int panelHeight = 50; + ImagePanel panel = ImagePanel.createImagePanel(texturePath); + panel.setWidth(50); + panel.setHeight(50); + if(endAlign){ + panel.setAlignSelf(YogaAlignment.End); + } + if(hasItem == true){ + //literally just here to get around finality of variable within callback + String finalSlotId = slotId; + panel.setOnDragStart(new DragEventCallback() { + public boolean execute(DragEvent event){ + LoggerInterface.loggerUI.DEBUG("Drag start"); + Globals.dragSourceInventory = inventory; + Globals.draggedItem = inventory.getItemSlot(finalSlotId); ContainerElement container = (ContainerElement)panel.getParent(); container.removeChild(panel); - } - Globals.elementService.fireEvent(event, event.getCurrentX(), event.getCurrentY()); - div.addChild(panel); - } - //dummy panel handling - destroyDummyPanel(); - panel.setPositionX(div.getAbsoluteX() + itemPosX); - panel.setPositionY(div.getAbsoluteY() + itemPosY); - 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))){ - //fire equip event to equip state - ClientEquipState equipState = ClientEquipState.getEquipState(Globals.playerEntity); - equipState.commandAttemptEquip(item,inventory.getEquipPointFromSlot(slots.get(itemId))); + WindowUtils.pushItemIconToItemWindow(panel); + panel.setAbsolutePosition(true); + //add a dummy icon in place of the existing one + { + dummyPanel = ImagePanel.createImagePanel("Textures/ui/uiFrame1.png"); + dummyPanel.setWidth(50); + dummyPanel.setHeight(50); + if(endAlign){ + dummyPanel.setAlignSelf(YogaAlignment.End); + } + container.addChild(dummyPanel); + } //play sound effect if(Globals.virtualAudioSourceManager != null){ - Globals.virtualAudioSourceManager.createVirtualAudioSource("/Audio/inventorySlotItem.ogg", VirtualAudioSourceType.UI, false); + Globals.virtualAudioSourceManager.createVirtualAudioSource("/Audio/inventoryGrabItem.ogg", VirtualAudioSourceType.UI, false); } - } else if(inventory.canEquipItemToCombinedSlot(item, slots.get(itemId))){ - EquipPoint combinedPoint = inventory.getCombinedPoint(slots.get(itemId)); - //fire equip event to equip state - ClientEquipState equipState = ClientEquipState.getEquipState(Globals.playerEntity); - equipState.commandAttemptEquip(item,combinedPoint); - //play sound effect - if(Globals.virtualAudioSourceManager != null){ - Globals.virtualAudioSourceManager.createVirtualAudioSource("/Audio/inventorySlotItem.ogg", VirtualAudioSourceType.UI, false); + 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); + Globals.signalSystem.post(SignalType.YOGA_APPLY, Globals.elementService.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER)); + return false; + }}); + panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ + if(panel.getParent() != colContainer){ + if(panel.getParent() != null){ + ContainerElement container = (ContainerElement)panel.getParent(); + container.removeChild(panel); } + Globals.elementService.fireEvent(event, event.getCurrentX(), event.getCurrentY()); + colContainer.addChild(panel); + panel.setAbsolutePosition(false); } - //update ui - Globals.dragSourceInventory = null; - Globals.draggedItem = null; - //clear item container ui - WindowUtils.cleanItemDraggingWindow(); //dummy panel handling destroyDummyPanel(); - //rerender both inventories - //re-render inventory - WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGeneratorsInventory.createCharacterInventoryMenu(inventory)); - //re-render inventory - WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), PlayerInventoryWindow.createPlayerInventoryWindow(Globals.playerEntity)); - } - //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); + 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))){ + //fire equip event to equip state + ClientEquipState equipState = ClientEquipState.getEquipState(Globals.playerEntity); + equipState.commandAttemptEquip(item,inventory.getEquipPointFromSlot(slots.get(itemId))); + //play sound effect + if(Globals.virtualAudioSourceManager != null){ + Globals.virtualAudioSourceManager.createVirtualAudioSource("/Audio/inventorySlotItem.ogg", VirtualAudioSourceType.UI, false); + } + } else if(inventory.canEquipItemToCombinedSlot(item, slots.get(itemId))){ + EquipPoint combinedPoint = inventory.getCombinedPoint(slots.get(itemId)); + //fire equip event to equip state + ClientEquipState equipState = ClientEquipState.getEquipState(Globals.playerEntity); + equipState.commandAttemptEquip(item,combinedPoint); + //play sound effect + if(Globals.virtualAudioSourceManager != null){ + Globals.virtualAudioSourceManager.createVirtualAudioSource("/Audio/inventorySlotItem.ogg", VirtualAudioSourceType.UI, false); + } + } + //update ui + Globals.dragSourceInventory = null; + Globals.draggedItem = null; + //clear item container ui + WindowUtils.cleanItemDraggingWindow(); + //dummy panel handling + destroyDummyPanel(); + //rerender both inventories + //re-render inventory + WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGeneratorsInventory.createCharacterInventoryMenu(inventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), PlayerInventoryWindow.createPlayerInventoryWindow(Globals.playerEntity)); + } + //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; + }}); + } + colContainer.addChild(panel); - //create the slot text - posX = 80; - if((incrementer % 2) == 1){ - posX = posX + 190; + //create the slot text + Label slotText = new Label(0.7f); + slotText.setText(slots.get(i)); + colContainer.addChild(slotText); } - posY = posY + 15; - Label slotText = new Label(0.7f); - slotText.setText(slots.get(i)); - slotText.setPositionX(posX); - slotText.setPositionY(posY); - slotText.setAbsolutePosition(true); - div.addChild(slotText); - - incrementer++; } + Div columnContainer = Div.createRow(leftSlots,rightSlots); + columnContainer.setAlignItems(YogaAlignment.Between); + columnContainer.setFlexGrow(1); + div.addChild(columnContainer); } return div; diff --git a/src/main/java/electrosphere/renderer/ui/components/NaturalInventoryPanel.java b/src/main/java/electrosphere/renderer/ui/components/NaturalInventoryPanel.java index a0981fb7..1dc0e9f5 100644 --- a/src/main/java/electrosphere/renderer/ui/components/NaturalInventoryPanel.java +++ b/src/main/java/electrosphere/renderer/ui/components/NaturalInventoryPanel.java @@ -2,6 +2,7 @@ package electrosphere.renderer.ui.components; import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType; import electrosphere.engine.Globals; +import electrosphere.engine.signal.Signal.SignalType; import electrosphere.entity.Entity; import electrosphere.entity.state.equip.ClientEquipState; import electrosphere.entity.state.inventory.InventoryUtils; @@ -149,6 +150,7 @@ public class NaturalInventoryPanel { // System.out.println("Drag"); panel.setPositionX(event.getCurrentX() - panelWidth / 2); panel.setPositionY(event.getCurrentY() - panelHeight / 2); + Globals.signalSystem.post(SignalType.YOGA_APPLY, Globals.elementService.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER)); return false; }}); panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ diff --git a/src/main/java/electrosphere/renderer/ui/components/PlayerInventoryWindow.java b/src/main/java/electrosphere/renderer/ui/components/PlayerInventoryWindow.java index 484c6b12..31e7c650 100644 --- a/src/main/java/electrosphere/renderer/ui/components/PlayerInventoryWindow.java +++ b/src/main/java/electrosphere/renderer/ui/components/PlayerInventoryWindow.java @@ -37,14 +37,14 @@ public class PlayerInventoryWindow { rVal.setParentAlignItem(YogaAlignment.Center); rVal.setParentJustifyContent(YogaJustification.Center); - if(InventoryUtils.hasNaturalInventory(entity)){ - rVal.addChild(NaturalInventoryPanel.createNaturalInventoryPanel(entity)); - } - if(InventoryUtils.hasEquipInventory(entity)){ rVal.addChild(EquipmentInventoryPanel.createEquipmentInventoryPanel(entity)); } + if(InventoryUtils.hasNaturalInventory(entity)){ + rVal.addChild(NaturalInventoryPanel.createNaturalInventoryPanel(entity)); + } + Globals.signalSystem.post(SignalType.YOGA_APPLY, rVal);