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
+ 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)

View File

@ -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

View File

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

View File

@ -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

View File

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

View File

@ -64,6 +64,7 @@ public class ServerInventoryState implements BehaviorTree {
}
}
break;
case CLIENTREQUESTPERFORMITEMACTION:
case SERVERCOMMANDUNEQUIPITEM:
case SERVERCOMMANDEQUIPITEM:
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.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;

View File

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

View File

@ -4,6 +4,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
@ -97,6 +98,14 @@ public class ElementManager {
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
* @param windowString The window string

View File

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

View File

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