inventory menu fixes and work

This commit is contained in:
austin 2024-09-17 17:22:38 -04:00
parent e6d946db53
commit 1e13c55f1f
4 changed files with 157 additions and 151 deletions

View File

@ -779,6 +779,7 @@ Fix equipped item packet not being sent to creature's player
Component-ify natural and equip inventory menus Component-ify natural and equip inventory menus
Post Processing Pipeline w/ blur Post Processing Pipeline w/ blur
Blur on open inventory/main menu in game Blur on open inventory/main menu in game
Remove legacy UI handling of positioning -- entirely reliant on yoga now
(09/17/2024) (09/17/2024)
Framebuffer position drilling Framebuffer position drilling

View File

@ -4,6 +4,7 @@ import java.util.List;
import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType; import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.engine.signal.Signal.SignalType;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.state.equip.ClientEquipState; import electrosphere.entity.state.equip.ClientEquipState;
import electrosphere.entity.state.inventory.InventoryUtils; 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.ImagePanel;
import electrosphere.renderer.ui.elements.Label; import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elementtypes.ClickableElement.ClickEventCallback; 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.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DraggableElement.DragEventCallback; import electrosphere.renderer.ui.elementtypes.DraggableElement.DragEventCallback;
import electrosphere.renderer.ui.elementtypes.Element; import electrosphere.renderer.ui.elementtypes.Element;
@ -80,167 +82,168 @@ public class EquipmentInventoryPanel {
inventoryLabel.setText("CHARACTER"); inventoryLabel.setText("CHARACTER");
div.addChild(inventoryLabel); div.addChild(inventoryLabel);
// int columns = 8;
// int columnWidth = 60;
// int rowHeight = 60;
int slotSpacing = 30;
List<String> slots = inventory.getSlots(); {
int numSlots = slots.size(); Div leftSlots = Div.createCol();
EquipPoint equipPoint = null; leftSlots.setFlexGrow(1);
// int numRows = (numSlots / 2) + (numSlots % 2 == 1 ? 1 : 0); Div rightSlots = Div.createCol();
rightSlots.setFlexGrow(1);
rightSlots.setAlignItems(YogaAlignment.End);
int incrementer = 0; List<String> slots = inventory.getSlots();
for(int i = 0; i < numSlots; i++){ EquipPoint equipPoint = null;
String texturePath = "Textures/ui/uiFrame1.png";
boolean hasItem = false; for(int i = 0; i < slots.size(); i++){
String slotId = slots.get(i); Div colContainer = i % 2 == 0 ? leftSlots : rightSlots;
equipPoint = inventory.getEquipPointFromSlot(slotId); boolean endAlign = i % 2 == 1;
if(!equipPoint.isCombinedPoint()){ String texturePath = "Textures/ui/uiFrame1.png";
if(inventory.getItemSlot(slotId) != null){ boolean hasItem = false;
Entity currentItem = inventory.getItemSlot(slotId); String slotId = slots.get(i);
//get texture path from item equipPoint = inventory.getEquipPointFromSlot(slotId);
texturePath = ItemUtils.getItemIcon(currentItem); if(!equipPoint.isCombinedPoint()){
//flag that this isn't an empty slot if(inventory.getItemSlot(slotId) != null){
hasItem = true; Entity currentItem = inventory.getItemSlot(slotId);
} else if(inventory.getCombinedPoint(slotId) != null && inventory.hasItemInSlot(inventory.getCombinedPoint(slotId).getEquipPointId())){ //get texture path from item
Entity currentItem = inventory.getItemSlot(inventory.getCombinedPoint(slotId).getEquipPointId()); texturePath = ItemUtils.getItemIcon(currentItem);
//get texture path from item //flag that this isn't an empty slot
texturePath = ItemUtils.getItemIcon(currentItem); hasItem = true;
//flag that this isn't an empty slot } else if(inventory.getCombinedPoint(slotId) != null && inventory.hasItemInSlot(inventory.getCombinedPoint(slotId).getEquipPointId())){
hasItem = true; Entity currentItem = inventory.getItemSlot(inventory.getCombinedPoint(slotId).getEquipPointId());
equipPoint = inventory.getCombinedPoint(slotId); //get texture path from item
slotId = equipPoint.getEquipPointId(); texturePath = ItemUtils.getItemIcon(currentItem);
} //flag that this isn't an empty slot
if(!Globals.assetManager.hasLoadedTexture(texturePath)){ hasItem = true;
Globals.assetManager.addTexturePathtoQueue(texturePath); equipPoint = inventory.getCombinedPoint(slotId);
} slotId = equipPoint.getEquipPointId();
int panelWidth = 50; }
int panelHeight = 50; if(!Globals.assetManager.hasLoadedTexture(texturePath)){
int posX = 20; Globals.assetManager.addTexturePathtoQueue(texturePath);
if((incrementer % 2) == 1){ }
posX = posX + 400; int panelWidth = 50;
} int panelHeight = 50;
int posXf = posX; ImagePanel panel = ImagePanel.createImagePanel(texturePath);
int posY = 60 + (i / 2 * (panelHeight + slotSpacing)); panel.setWidth(50);
int posYf = posY; panel.setHeight(50);
int itemPosX = posX; if(endAlign){
int itemPosY = posY; panel.setAlignSelf(YogaAlignment.End);
ImagePanel panel = ImagePanel.createImagePanelAbsolute(posX,posY,panelWidth,panelHeight,texturePath); }
if(hasItem == true){ if(hasItem == true){
//literally just here to get around finality of variable within callback //literally just here to get around finality of variable within callback
String finalSlotId = slotId; String finalSlotId = slotId;
panel.setOnDragStart(new DragEventCallback() { panel.setOnDragStart(new DragEventCallback() {
public boolean execute(DragEvent event){ public boolean execute(DragEvent event){
LoggerInterface.loggerUI.DEBUG("Drag start"); LoggerInterface.loggerUI.DEBUG("Drag start");
Globals.dragSourceInventory = inventory; Globals.dragSourceInventory = inventory;
Globals.draggedItem = inventory.getItemSlot(finalSlotId); 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){
ContainerElement container = (ContainerElement)panel.getParent(); ContainerElement container = (ContainerElement)panel.getParent();
container.removeChild(panel); container.removeChild(panel);
} WindowUtils.pushItemIconToItemWindow(panel);
Globals.elementService.fireEvent(event, event.getCurrentX(), event.getCurrentY()); panel.setAbsolutePosition(true);
div.addChild(panel); //add a dummy icon in place of the existing one
} {
//dummy panel handling dummyPanel = ImagePanel.createImagePanel("Textures/ui/uiFrame1.png");
destroyDummyPanel(); dummyPanel.setWidth(50);
panel.setPositionX(div.getAbsoluteX() + itemPosX); dummyPanel.setHeight(50);
panel.setPositionY(div.getAbsoluteY() + itemPosY); if(endAlign){
return false; dummyPanel.setAlignSelf(YogaAlignment.End);
}}); }
container.addChild(dummyPanel);
} 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 //play sound effect
if(Globals.virtualAudioSourceManager != null){ 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))){ return false;
EquipPoint combinedPoint = inventory.getCombinedPoint(slots.get(itemId)); }});
//fire equip event to equip state panel.setOnDrag(new DragEventCallback() {public boolean execute(DragEvent event){
ClientEquipState equipState = ClientEquipState.getEquipState(Globals.playerEntity); // System.out.println("Drag");
equipState.commandAttemptEquip(item,combinedPoint); panel.setPositionX(event.getCurrentX() - panelWidth / 2);
//play sound effect panel.setPositionY(event.getCurrentY() - panelHeight / 2);
if(Globals.virtualAudioSourceManager != null){ Globals.signalSystem.post(SignalType.YOGA_APPLY, Globals.elementService.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER));
Globals.virtualAudioSourceManager.createVirtualAudioSource("/Audio/inventorySlotItem.ogg", VirtualAudioSourceType.UI, false); 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 //dummy panel handling
destroyDummyPanel(); destroyDummyPanel();
//rerender both inventories return false;
//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);
//create the slot text } else {
posX = 80; int itemId = i;
if((incrementer % 2) == 1){ panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
posX = posX + 190; // panel.setPositionX(posX);
} // panel.setPositionY(posY);
posY = posY + 15; if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
Label slotText = new Label(0.7f); UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState) Globals.dragSourceInventory;
slotText.setText(slots.get(i)); Entity item = Globals.draggedItem;
slotText.setPositionX(posX); if(inventory.canEquipItemToSlot(item, slots.get(itemId))){
slotText.setPositionY(posY); //fire equip event to equip state
slotText.setAbsolutePosition(true); ClientEquipState equipState = ClientEquipState.getEquipState(Globals.playerEntity);
div.addChild(slotText); 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);
incrementer++; //create the slot text
Label slotText = new Label(0.7f);
slotText.setText(slots.get(i));
colContainer.addChild(slotText);
}
} }
Div columnContainer = Div.createRow(leftSlots,rightSlots);
columnContainer.setAlignItems(YogaAlignment.Between);
columnContainer.setFlexGrow(1);
div.addChild(columnContainer);
} }
return div; return div;

View File

@ -2,6 +2,7 @@ package electrosphere.renderer.ui.components;
import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType; import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.engine.signal.Signal.SignalType;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.state.equip.ClientEquipState; import electrosphere.entity.state.equip.ClientEquipState;
import electrosphere.entity.state.inventory.InventoryUtils; import electrosphere.entity.state.inventory.InventoryUtils;
@ -149,6 +150,7 @@ public class NaturalInventoryPanel {
// System.out.println("Drag"); // System.out.println("Drag");
panel.setPositionX(event.getCurrentX() - panelWidth / 2); panel.setPositionX(event.getCurrentX() - panelWidth / 2);
panel.setPositionY(event.getCurrentY() - panelHeight / 2); panel.setPositionY(event.getCurrentY() - panelHeight / 2);
Globals.signalSystem.post(SignalType.YOGA_APPLY, Globals.elementService.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER));
return false; return false;
}}); }});
panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){

View File

@ -37,14 +37,14 @@ public class PlayerInventoryWindow {
rVal.setParentAlignItem(YogaAlignment.Center); rVal.setParentAlignItem(YogaAlignment.Center);
rVal.setParentJustifyContent(YogaJustification.Center); rVal.setParentJustifyContent(YogaJustification.Center);
if(InventoryUtils.hasNaturalInventory(entity)){
rVal.addChild(NaturalInventoryPanel.createNaturalInventoryPanel(entity));
}
if(InventoryUtils.hasEquipInventory(entity)){ if(InventoryUtils.hasEquipInventory(entity)){
rVal.addChild(EquipmentInventoryPanel.createEquipmentInventoryPanel(entity)); rVal.addChild(EquipmentInventoryPanel.createEquipmentInventoryPanel(entity));
} }
if(InventoryUtils.hasNaturalInventory(entity)){
rVal.addChild(NaturalInventoryPanel.createNaturalInventoryPanel(entity));
}
Globals.signalSystem.post(SignalType.YOGA_APPLY, rVal); Globals.signalSystem.post(SignalType.YOGA_APPLY, rVal);