diff --git a/docs/src/progress/currenttarget.md b/docs/src/progress/currenttarget.md index 3b2a88dd..73a5f59c 100644 --- a/docs/src/progress/currenttarget.md +++ b/docs/src/progress/currenttarget.md @@ -19,13 +19,13 @@ Ticketed randomizer node for BTs to more heavily weight attacking and waiting + bug fixes - Fix unequipping items Fix physics freakout for vertically aligned entities Fix entities running to edge of map causing audio engine to break Fix placing terrain Fix spawning item from non-local client Fix attack animation mayyybe caching on non-local clients ?? Fix sword double-swing + Fix broken rendering pipeline when creating new level Fix AI tracking deleted entity Fix AI components not resetting on turning off ai manager Fix being unable to jump sometimes (usually when pick up sword) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 1648d2d6..0b10cebf 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -589,6 +589,8 @@ Fix server not starting Fix client disconnection causing wrong socket to be closed from server Fix build tooling, scripts, etc Launcher fixes +Fix inventory control state suggestions not working correctly +Fix unequipping item hard crashing engine # TODO diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index 18a3831e..50181e82 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -1567,11 +1567,31 @@ public class ControlHandler { for(String windowString : controlBlockingWindows){ rVal = rVal || WindowUtils.windowIsOpen(windowString); } + //check if any generated inventory windows are open + for(String windowId : Globals.elementManager.getCurrentWindowIds()){ + rVal = rVal || (WindowUtils.windowIsOpen(windowId) && WindowUtils.isInventoryWindow(windowId)); + } //check imgui windows rVal = rVal || Globals.renderingEngine.getImGuiPipeline().shouldCaptureControls(); return rVal; } + /** + * Checks if the only menus open are inventory menus + * @return true if only inventory menus AND a menu is open, false otherwise + */ + private boolean onlyInventoryMenusOpen(){ + boolean foundInventory = false; + for(String windowId : Globals.elementManager.getCurrentWindowIds()){ + if(WindowUtils.isInventoryWindow(windowId) || WindowStrings.WINDOW_MENU_INVENTORY.equals(windowId) || WindowStrings.WINDOW_CHARACTER.equals(windowId)){ + foundInventory = true; + } else if(Globals.elementManager.getWindow(windowId) instanceof Window == false || ((Window)Globals.elementManager.getWindow(windowId)).visible) { + return false; + } + } + return foundInventory; + } + /** * Hints to the engine that it should update the control state * The provided control state will be overwritten if, for instance, @@ -1590,7 +1610,9 @@ public class ControlHandler { } //set to menu state if a menu is open, otherwise use the hinted control scheme - if(hasControlBlockingMenuOpen()){ + if(onlyInventoryMenusOpen()){ + setHandlerState(ControlsState.INVENTORY); + } else if(hasControlBlockingMenuOpen()){ setHandlerState(ControlsState.IN_GAME_MAIN_MENU); } else { setHandlerState(properState); diff --git a/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java b/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java index ee96dab6..f49d6296 100644 --- a/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java +++ b/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java @@ -15,6 +15,7 @@ import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityTags; import electrosphere.entity.EntityUtils; +import electrosphere.entity.ServerEntityUtils; import electrosphere.entity.btree.BehaviorTree; import electrosphere.entity.state.block.ServerBlockTree; import electrosphere.entity.state.gravity.GravityUtils; @@ -370,8 +371,7 @@ public class ServerEquipState implements BehaviorTree { // } // } } else { - AttachUtils.serverDetatchEntityFromEntityAtBone(parent, equipped); - EntityUtils.cleanUpEntity(equipped); + ServerEntityUtils.destroyEntity(equipped); } //interrupt animation diff --git a/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java b/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java index 83f3fe33..aa26331e 100644 --- a/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java +++ b/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java @@ -213,19 +213,18 @@ public class InventoryUtils { //get real world item Entity realWorldItem = ItemUtils.getRealWorldEntity(item); if(realWorldItem != null){ + //Tell players to unequip the item + Realm realm = Globals.realmManager.getEntityRealm(realWorldItem); + if(realm != null){ + //get closest chunk + ServerDataCell dataCell = realm.getEntityDataCellMapper().getEntityDataCell(realWorldItem); + //broadcast destroy item + NetworkMessage unequipMessage = InventoryMessage.constructserverCommandUnequipItemMessage(creature.getId(), inventorySlot); + dataCell.broadcastNetworkMessage(unequipMessage); + } //drop item ServerEquipState equipState = ServerEquipState.getEquipState(creature); equipState.serverTransformUnequipPoint(inventorySlot); - // equipState.serverAttemptUnequip(inventory.getItemSlot(item)); - // - //Tell clients to destroy the attached item - Vector3d oldItemPos = EntityUtils.getPosition(realWorldItem); - //get closest chunk - // ServerDataCell dataCell = Globals.dataCellLocationResolver.getDataCellAtPoint(oldItemPos,realWorldItem); - ServerDataCell dataCell = Globals.realmManager.getEntityRealm(realWorldItem).getEntityDataCellMapper().getEntityDataCell(realWorldItem); - //broadcast destroy item - NetworkMessage unequipMessage = InventoryMessage.constructserverCommandUnequipItemMessage(creature.getId(), inventorySlot); - dataCell.broadcastNetworkMessage(unequipMessage); } } } diff --git a/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java b/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java index 4d254ddb..15d074f5 100644 --- a/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java +++ b/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java @@ -64,6 +64,7 @@ public class ServerInventoryState implements BehaviorTree { } } break; + case CLIENTREQUESTPERFORMITEMACTION: case SERVERCOMMANDUNEQUIPITEM: case SERVERCOMMANDEQUIPITEM: case SERVERCOMMANDMOVEITEMCONTAINER: diff --git a/src/main/java/electrosphere/menu/WindowUtils.java b/src/main/java/electrosphere/menu/WindowUtils.java index 43a74c07..fc8e693f 100644 --- a/src/main/java/electrosphere/menu/WindowUtils.java +++ b/src/main/java/electrosphere/menu/WindowUtils.java @@ -191,4 +191,13 @@ public class WindowUtils { } } + /** + * Checks if the window is an inventory window or not + * @param windowId The window id + * @return true if is an inventory window, false otherwise + */ + public static boolean isInventoryWindow(String windowId){ + return windowId.contains("INVENTORY") || windowId.equals(WindowStrings.WINDOW_MENU_INVENTORY) || windowId.equals(WindowStrings.WINDOW_CHARACTER); + } + } diff --git a/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInventory.java b/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInventory.java index ce727931..5b52e2d2 100644 --- a/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInventory.java +++ b/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInventory.java @@ -12,6 +12,7 @@ import electrosphere.entity.state.inventory.RelationalInventoryState; import electrosphere.entity.state.inventory.UnrelationalInventoryState; import electrosphere.entity.types.item.ItemUtils; import electrosphere.game.data.creature.type.equip.EquipPoint; +import electrosphere.logger.LoggerInterface; import electrosphere.menu.WindowStrings; import electrosphere.menu.WindowUtils; import electrosphere.renderer.ui.elements.Div; @@ -61,6 +62,7 @@ public class MenuGeneratorsInventory { }}); div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ + LoggerInterface.loggerUI.INFO("Natural inventory received drag release event"); if(Globals.draggedItem != null){ if(Globals.dragSourceInventory != inventory){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ @@ -239,6 +241,7 @@ public class MenuGeneratorsInventory { }}); div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ + LoggerInterface.loggerUI.INFO("Character inventory received drag release event"); if(Globals.draggedItem != null){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory; @@ -344,8 +347,8 @@ public class MenuGeneratorsInventory { ContainerElement container = (ContainerElement)panel.getParent(); container.removeChild(panel); } - div.addChild(panel); Globals.elementManager.fireEvent(event, panel.getAbsoluteX(), panel.getAbsoluteY()); + div.addChild(panel); } panel.setPositionX(div.getAbsoluteX() + itemPosX); panel.setPositionY(div.getAbsoluteY() + itemPosY); @@ -431,6 +434,7 @@ public class MenuGeneratorsInventory { Window rVal = new Window(Globals.renderingEngine.getOpenGLState(),0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,true); Div div = Div.createDiv(); div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ + LoggerInterface.loggerUI.INFO("World item drop capture window received drag release"); if(Globals.draggedItem != null){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory; diff --git a/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java b/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java index 190bcb6c..509ac7fb 100644 --- a/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java +++ b/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java @@ -32,28 +32,28 @@ public class InventoryProtocol implements ServerProtocolTemplate getCurrentWindowIds(){ + return elementMap.keySet(); + } + /** * Tries to navigate-close the window at a window string * @param windowString The window string diff --git a/src/main/java/electrosphere/renderer/ui/elements/StandardContainerElement.java b/src/main/java/electrosphere/renderer/ui/elements/StandardContainerElement.java index 989319a7..8aaaeb2a 100644 --- a/src/main/java/electrosphere/renderer/ui/elements/StandardContainerElement.java +++ b/src/main/java/electrosphere/renderer/ui/elements/StandardContainerElement.java @@ -248,8 +248,8 @@ public class StandardContainerElement extends StandardElement implements Contain float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode); float widthRaw = Yoga.YGNodeLayoutGetWidth(yogaNode); float heightRaw = Yoga.YGNodeLayoutGetHeight(yogaNode); - LoggerInterface.loggerUI.INFO("" + this); - LoggerInterface.loggerUI.INFO("pos(" + leftRaw + "," + topRaw + ") dim(" + widthRaw + "," + heightRaw + ")"); + LoggerInterface.loggerUI.DEBUG("" + this); + LoggerInterface.loggerUI.DEBUG("pos(" + leftRaw + "," + topRaw + ") dim(" + widthRaw + "," + heightRaw + ")"); //apply the values to this component if(!useAbsolutePosition){ this.internalPositionX = (int)leftRaw; diff --git a/src/main/java/electrosphere/renderer/ui/elements/Window.java b/src/main/java/electrosphere/renderer/ui/elements/Window.java index 05d0b85e..260d3885 100644 --- a/src/main/java/electrosphere/renderer/ui/elements/Window.java +++ b/src/main/java/electrosphere/renderer/ui/elements/Window.java @@ -370,7 +370,7 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme this.width = (int)widthRaw; this.height = (int)heightRaw; //apply yoga values to all children - LoggerInterface.loggerUI.INFO("==Apply yoga to windoow=="); + LoggerInterface.loggerUI.DEBUG("==Apply yoga to windoow=="); for(Element child : this.getChildren()){ child.applyYoga(this.positionX,this.positionY); }