fix inventory controls
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
e30784fffb
commit
e7851508fd
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,6 +64,7 @@ public class ServerInventoryState implements BehaviorTree {
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CLIENTREQUESTPERFORMITEMACTION:
|
||||
case SERVERCOMMANDUNEQUIPITEM:
|
||||
case SERVERCOMMANDEQUIPITEM:
|
||||
case SERVERCOMMANDMOVEITEMCONTAINER:
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user