fix inventory controls
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-08-16 15:13:15 -04:00
parent e30784fffb
commit e7851508fd
12 changed files with 68 additions and 22 deletions

View File

@ -19,13 +19,13 @@
Ticketed randomizer node for BTs to more heavily weight attacking and waiting Ticketed randomizer node for BTs to more heavily weight attacking and waiting
+ bug fixes + bug fixes
Fix unequipping items
Fix physics freakout for vertically aligned entities Fix physics freakout for vertically aligned entities
Fix entities running to edge of map causing audio engine to break Fix entities running to edge of map causing audio engine to break
Fix placing terrain Fix placing terrain
Fix spawning item from non-local client Fix spawning item from non-local client
Fix attack animation mayyybe caching on non-local clients ?? Fix attack animation mayyybe caching on non-local clients ??
Fix sword double-swing Fix sword double-swing
Fix broken rendering pipeline when creating new level
Fix AI tracking deleted entity Fix AI tracking deleted entity
Fix AI components not resetting on turning off ai manager Fix AI components not resetting on turning off ai manager
Fix being unable to jump sometimes (usually when pick up sword) Fix being unable to jump sometimes (usually when pick up sword)

View File

@ -589,6 +589,8 @@ Fix server not starting
Fix client disconnection causing wrong socket to be closed from server Fix client disconnection causing wrong socket to be closed from server
Fix build tooling, scripts, etc Fix build tooling, scripts, etc
Launcher fixes Launcher fixes
Fix inventory control state suggestions not working correctly
Fix unequipping item hard crashing engine
# TODO # TODO

View File

@ -1567,11 +1567,31 @@ public class ControlHandler {
for(String windowString : controlBlockingWindows){ for(String windowString : controlBlockingWindows){
rVal = rVal || WindowUtils.windowIsOpen(windowString); 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 //check imgui windows
rVal = rVal || Globals.renderingEngine.getImGuiPipeline().shouldCaptureControls(); rVal = rVal || Globals.renderingEngine.getImGuiPipeline().shouldCaptureControls();
return rVal; 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 * Hints to the engine that it should update the control state
* The provided control state will be overwritten if, for instance, * 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 //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); setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
} else { } else {
setHandlerState(properState); setHandlerState(properState);

View File

@ -15,6 +15,7 @@ import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityTags; import electrosphere.entity.EntityTags;
import electrosphere.entity.EntityUtils; import electrosphere.entity.EntityUtils;
import electrosphere.entity.ServerEntityUtils;
import electrosphere.entity.btree.BehaviorTree; import electrosphere.entity.btree.BehaviorTree;
import electrosphere.entity.state.block.ServerBlockTree; import electrosphere.entity.state.block.ServerBlockTree;
import electrosphere.entity.state.gravity.GravityUtils; import electrosphere.entity.state.gravity.GravityUtils;
@ -370,8 +371,7 @@ public class ServerEquipState implements BehaviorTree {
// } // }
// } // }
} else { } else {
AttachUtils.serverDetatchEntityFromEntityAtBone(parent, equipped); ServerEntityUtils.destroyEntity(equipped);
EntityUtils.cleanUpEntity(equipped);
} }
//interrupt animation //interrupt animation

View File

@ -213,20 +213,19 @@ public class InventoryUtils {
//get real world item //get real world item
Entity realWorldItem = ItemUtils.getRealWorldEntity(item); Entity realWorldItem = ItemUtils.getRealWorldEntity(item);
if(realWorldItem != null){ if(realWorldItem != null){
//drop item //Tell players to unequip the item
ServerEquipState equipState = ServerEquipState.getEquipState(creature); Realm realm = Globals.realmManager.getEntityRealm(realWorldItem);
equipState.serverTransformUnequipPoint(inventorySlot); if(realm != null){
// equipState.serverAttemptUnequip(inventory.getItemSlot(item));
//
//Tell clients to destroy the attached item
Vector3d oldItemPos = EntityUtils.getPosition(realWorldItem);
//get closest chunk //get closest chunk
// ServerDataCell dataCell = Globals.dataCellLocationResolver.getDataCellAtPoint(oldItemPos,realWorldItem); ServerDataCell dataCell = realm.getEntityDataCellMapper().getEntityDataCell(realWorldItem);
ServerDataCell dataCell = Globals.realmManager.getEntityRealm(realWorldItem).getEntityDataCellMapper().getEntityDataCell(realWorldItem);
//broadcast destroy item //broadcast destroy item
NetworkMessage unequipMessage = InventoryMessage.constructserverCommandUnequipItemMessage(creature.getId(), inventorySlot); NetworkMessage unequipMessage = InventoryMessage.constructserverCommandUnequipItemMessage(creature.getId(), inventorySlot);
dataCell.broadcastNetworkMessage(unequipMessage); dataCell.broadcastNetworkMessage(unequipMessage);
} }
//drop item
ServerEquipState equipState = ServerEquipState.getEquipState(creature);
equipState.serverTransformUnequipPoint(inventorySlot);
}
} }
} }
// //

View File

@ -64,6 +64,7 @@ public class ServerInventoryState implements BehaviorTree {
} }
} }
break; break;
case CLIENTREQUESTPERFORMITEMACTION:
case SERVERCOMMANDUNEQUIPITEM: case SERVERCOMMANDUNEQUIPITEM:
case SERVERCOMMANDEQUIPITEM: case SERVERCOMMANDEQUIPITEM:
case SERVERCOMMANDMOVEITEMCONTAINER: case SERVERCOMMANDMOVEITEMCONTAINER:

View File

@ -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);
}
} }

View File

@ -12,6 +12,7 @@ import electrosphere.entity.state.inventory.RelationalInventoryState;
import electrosphere.entity.state.inventory.UnrelationalInventoryState; import electrosphere.entity.state.inventory.UnrelationalInventoryState;
import electrosphere.entity.types.item.ItemUtils; import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.data.creature.type.equip.EquipPoint; import electrosphere.game.data.creature.type.equip.EquipPoint;
import electrosphere.logger.LoggerInterface;
import electrosphere.menu.WindowStrings; import electrosphere.menu.WindowStrings;
import electrosphere.menu.WindowUtils; import electrosphere.menu.WindowUtils;
import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.Div;
@ -61,6 +62,7 @@ public class MenuGeneratorsInventory {
}}); }});
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
LoggerInterface.loggerUI.INFO("Natural inventory received drag release event");
if(Globals.draggedItem != null){ if(Globals.draggedItem != null){
if(Globals.dragSourceInventory != inventory){ if(Globals.dragSourceInventory != inventory){
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
@ -239,6 +241,7 @@ public class MenuGeneratorsInventory {
}}); }});
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
LoggerInterface.loggerUI.INFO("Character inventory received drag release event");
if(Globals.draggedItem != null){ if(Globals.draggedItem != null){
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory; UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory;
@ -344,8 +347,8 @@ public class MenuGeneratorsInventory {
ContainerElement container = (ContainerElement)panel.getParent(); ContainerElement container = (ContainerElement)panel.getParent();
container.removeChild(panel); container.removeChild(panel);
} }
div.addChild(panel);
Globals.elementManager.fireEvent(event, panel.getAbsoluteX(), panel.getAbsoluteY()); Globals.elementManager.fireEvent(event, panel.getAbsoluteX(), panel.getAbsoluteY());
div.addChild(panel);
} }
panel.setPositionX(div.getAbsoluteX() + itemPosX); panel.setPositionX(div.getAbsoluteX() + itemPosX);
panel.setPositionY(div.getAbsoluteY() + itemPosY); 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); Window rVal = new Window(Globals.renderingEngine.getOpenGLState(),0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,true);
Div div = Div.createDiv(); Div div = Div.createDiv();
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ 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.draggedItem != null){
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory; UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory;

View File

@ -32,28 +32,28 @@ public class InventoryProtocol implements ServerProtocolTemplate<InventoryMessag
case ADDITEMTOINVENTORY: case ADDITEMTOINVENTORY:
LoggerInterface.loggerNetworking.DEBUG("[SERVER] ADD ITEM TO INVENTORY " + message.getentityId()); LoggerInterface.loggerNetworking.DEBUG("[SERVER] ADD ITEM TO INVENTORY " + message.getentityId());
target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId()); target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId());
if(InventoryUtils.hasNaturalInventory(target)){ if(target != null && InventoryUtils.hasNaturalInventory(target)){
InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message); InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message);
} }
break; break;
case REMOVEITEMFROMINVENTORY: case REMOVEITEMFROMINVENTORY:
LoggerInterface.loggerNetworking.DEBUG("[SERVER] REMOVE ITEM FROM INVENTORY " + message.getentityId()); LoggerInterface.loggerNetworking.DEBUG("[SERVER] REMOVE ITEM FROM INVENTORY " + message.getentityId());
target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId()); target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId());
if(InventoryUtils.hasNaturalInventory(target)){ if(target != null && InventoryUtils.hasNaturalInventory(target)){
InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message); InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message);
} }
break; break;
case CLIENTREQUESTEQUIPITEM: case CLIENTREQUESTEQUIPITEM:
LoggerInterface.loggerNetworking.DEBUG("[SERVER] REQUEST EQUIP ITEM " + message.getentityId()); LoggerInterface.loggerNetworking.DEBUG("[SERVER] REQUEST EQUIP ITEM " + message.getentityId());
target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId()); target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId());
if(InventoryUtils.hasNaturalInventory(target)){ if(target != null && InventoryUtils.hasNaturalInventory(target)){
InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message); InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message);
} }
break; break;
case CLIENTREQUESTUNEQUIPITEM: case CLIENTREQUESTUNEQUIPITEM:
LoggerInterface.loggerNetworking.DEBUG("[SERVER] REQUEST UNEQUIP ITEM " + message.getentityId()); LoggerInterface.loggerNetworking.DEBUG("[SERVER] REQUEST UNEQUIP ITEM " + message.getentityId());
target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId()); target = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId());
if(InventoryUtils.hasNaturalInventory(target)){ if(target != null && InventoryUtils.hasNaturalInventory(target)){
InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message); InventoryUtils.serverGetInventoryState(target).addNetworkMessage(message);
} }
break; break;

View File

@ -4,6 +4,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.Stack; import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
@ -97,6 +98,14 @@ public class ElementManager {
elementList.add(window); elementList.add(window);
} }
/**
* Gets the currently open window's ids
* @return The set of ids
*/
public Set<String> getCurrentWindowIds(){
return elementMap.keySet();
}
/** /**
* Tries to navigate-close the window at a window string * Tries to navigate-close the window at a window string
* @param windowString The window string * @param windowString The window string

View File

@ -248,8 +248,8 @@ public class StandardContainerElement extends StandardElement implements Contain
float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode); float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode);
float widthRaw = Yoga.YGNodeLayoutGetWidth(yogaNode); float widthRaw = Yoga.YGNodeLayoutGetWidth(yogaNode);
float heightRaw = Yoga.YGNodeLayoutGetHeight(yogaNode); float heightRaw = Yoga.YGNodeLayoutGetHeight(yogaNode);
LoggerInterface.loggerUI.INFO("" + this); LoggerInterface.loggerUI.DEBUG("" + this);
LoggerInterface.loggerUI.INFO("pos(" + leftRaw + "," + topRaw + ") dim(" + widthRaw + "," + heightRaw + ")"); LoggerInterface.loggerUI.DEBUG("pos(" + leftRaw + "," + topRaw + ") dim(" + widthRaw + "," + heightRaw + ")");
//apply the values to this component //apply the values to this component
if(!useAbsolutePosition){ if(!useAbsolutePosition){
this.internalPositionX = (int)leftRaw; this.internalPositionX = (int)leftRaw;

View File

@ -370,7 +370,7 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
this.width = (int)widthRaw; this.width = (int)widthRaw;
this.height = (int)heightRaw; this.height = (int)heightRaw;
//apply yoga values to all children //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()){ for(Element child : this.getChildren()){
child.applyYoga(this.positionX,this.positionY); child.applyYoga(this.positionX,this.positionY);
} }