From 73ee339dcc2bf729920b61fdea8b0b694d28860b Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Sat, 4 Sep 2021 17:12:54 +0300 Subject: [PATCH] Working toward player species? I think? - Left/right hand can now be permanently switched by tapping ctrl - Moved LayerHUD into .hud subpackage - Extracted PermanentHUD out of LayerHUD - Fixed the issuer of NewLocalEntityEvent --- .../progressia/client/ClientState.java | 2 +- .../client/graphics/world/LocalPlayer.java | 2 +- .../client/graphics/world/hud/LayerHUD.java | 50 ++++++++++ .../{LayerHUD.java => hud/PermanentHUD.java} | 43 +++------ .../progressia/test/inv/InventoryScreen.java | 92 +++++++++++-------- 5 files changed, 120 insertions(+), 69 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/client/graphics/world/hud/LayerHUD.java rename src/main/java/ru/windcorp/progressia/client/graphics/world/{LayerHUD.java => hud/PermanentHUD.java} (56%) diff --git a/src/main/java/ru/windcorp/progressia/client/ClientState.java b/src/main/java/ru/windcorp/progressia/client/ClientState.java index 5ba262b..fe9153a 100644 --- a/src/main/java/ru/windcorp/progressia/client/ClientState.java +++ b/src/main/java/ru/windcorp/progressia/client/ClientState.java @@ -20,8 +20,8 @@ package ru.windcorp.progressia.client; import ru.windcorp.progressia.client.comms.localhost.LocalServerCommsChannel; import ru.windcorp.progressia.client.graphics.GUI; -import ru.windcorp.progressia.client.graphics.world.LayerHUD; import ru.windcorp.progressia.client.graphics.world.LayerWorld; +import ru.windcorp.progressia.client.graphics.world.hud.LayerHUD; import ru.windcorp.progressia.common.world.DefaultWorldData; import ru.windcorp.progressia.server.ServerState; import ru.windcorp.progressia.test.LayerAbout; diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/LocalPlayer.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/LocalPlayer.java index 79d88c2..80008b0 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/LocalPlayer.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/LocalPlayer.java @@ -83,8 +83,8 @@ public class LocalPlayer { } if (playerEntity != lastKnownEntity) { - getClient().postEvent(new NewLocalEntityEvent.Immutable(getClient(), playerEntity, lastKnownEntity)); this.lastKnownEntity = playerEntity; + getClient().postEvent(new NewLocalEntityEvent.Immutable(getClient(), playerEntity, lastKnownEntity)); } return playerEntity; diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/LayerHUD.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/LayerHUD.java new file mode 100644 index 0000000..2d1e45e --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/LayerHUD.java @@ -0,0 +1,50 @@ +/* + * Progressia + * Copyright (C) 2020-2021 Wind Corporation and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package ru.windcorp.progressia.client.graphics.world.hud; + +import com.google.common.eventbus.Subscribe; + +import ru.windcorp.progressia.client.Client; +import ru.windcorp.progressia.client.events.NewLocalEntityEvent; +import ru.windcorp.progressia.client.graphics.gui.GUILayer; +import ru.windcorp.progressia.client.graphics.gui.layout.LayoutFill; + +public class LayerHUD extends GUILayer { + + public LayerHUD(Client client) { + super("LayerHUD", new LayoutFill(15)); + setCursorPolicy(CursorPolicy.INDIFFERENT); + + client.subscribe(this); + } + + @Subscribe + private void onEntityChanged(NewLocalEntityEvent e) { + while (!getRoot().getChildren().isEmpty()) { + getRoot().removeChild(getRoot().getChild(0)); + } + + if (e.getNewEntity() == null) { + return; + } + + getRoot().addChild(new PermanentHUD(getName(), e.getClient().getLocalPlayer())); + getRoot().requestReassembly(); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerHUD.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/PermanentHUD.java similarity index 56% rename from src/main/java/ru/windcorp/progressia/client/graphics/world/LayerHUD.java rename to src/main/java/ru/windcorp/progressia/client/graphics/world/hud/PermanentHUD.java index eb3f8d5..457a537 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerHUD.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/PermanentHUD.java @@ -15,55 +15,38 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package ru.windcorp.progressia.client.graphics.world; +package ru.windcorp.progressia.client.graphics.world.hud; -import com.google.common.eventbus.Subscribe; - -import ru.windcorp.progressia.client.Client; -import ru.windcorp.progressia.client.events.NewLocalEntityEvent; import ru.windcorp.progressia.client.graphics.gui.Component; -import ru.windcorp.progressia.client.graphics.gui.GUILayer; import ru.windcorp.progressia.client.graphics.gui.Group; import ru.windcorp.progressia.client.graphics.gui.layout.LayoutBorderHorizontal; import ru.windcorp.progressia.client.graphics.gui.layout.LayoutBorderVertical; -import ru.windcorp.progressia.client.graphics.gui.layout.LayoutFill; import ru.windcorp.progressia.client.graphics.texture.SimpleTextures; +import ru.windcorp.progressia.client.graphics.world.LocalPlayer; +import ru.windcorp.progressia.common.world.entity.EntityDataPlayer; import ru.windcorp.progressia.test.inv.SlotComponent; -public class LayerHUD extends GUILayer { +public class PermanentHUD extends Component { - public LayerHUD(Client client) { - super("LayerHUD", new LayoutFill(15)); - setCursorPolicy(CursorPolicy.INDIFFERENT); - - client.subscribe(this); - } - - @Subscribe - private void onEntityChanged(NewLocalEntityEvent e) { - while (!getRoot().getChildren().isEmpty()) { - getRoot().removeChild(getRoot().getChild(0)); - } + public PermanentHUD(String name, LocalPlayer player) { + super(name); + setLayout(new LayoutBorderVertical()); - if (e.getNewEntity() == null) { - return; + EntityDataPlayer entity = player.getEntity(); + if (entity == null) { + throw new IllegalStateException("Player " + player + " does not have an associated entity"); } - Component content = new Group(getName() + ".Content", new LayoutBorderVertical()); - Group handDisplays = new Group( getName() + ".Hands", new LayoutBorderHorizontal(), - new SlotComponent(getName() + ".Hands.LeftHand", e.getNewEntity().getLeftHand(), 0) + new SlotComponent(getName() + ".Hands.LeftHand", entity.getLeftHand(), 0) .setBackground(SimpleTextures.get("gui/LeftHand")).setScale(4).setLayoutHint(LayoutBorderHorizontal.LEFT), - new SlotComponent(getName() + ".Hands.RightHand", e.getNewEntity().getRightHand(), 0) + new SlotComponent(getName() + ".Hands.RightHand", entity.getRightHand(), 0) .setBackground(SimpleTextures.get("gui/RightHand")).setScale(4).setLayoutHint(LayoutBorderHorizontal.RIGHT) ); - content.addChild(handDisplays.setLayoutHint(LayoutBorderVertical.UP)); - - getRoot().addChild(content); - getRoot().requestReassembly(); + addChild(handDisplays.setLayoutHint(LayoutBorderVertical.UP)); } } diff --git a/src/main/java/ru/windcorp/progressia/test/inv/InventoryScreen.java b/src/main/java/ru/windcorp/progressia/test/inv/InventoryScreen.java index 853f315..473fc81 100644 --- a/src/main/java/ru/windcorp/progressia/test/inv/InventoryScreen.java +++ b/src/main/java/ru/windcorp/progressia/test/inv/InventoryScreen.java @@ -24,7 +24,6 @@ import org.lwjgl.glfw.GLFW; import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface; -import ru.windcorp.progressia.client.graphics.backend.InputTracker; import ru.windcorp.progressia.client.graphics.gui.BasicButton; import ru.windcorp.progressia.client.graphics.gui.Component; import ru.windcorp.progressia.client.graphics.gui.Components; @@ -41,24 +40,27 @@ import ru.windcorp.progressia.common.world.item.ItemSlot; import ru.windcorp.progressia.common.world.item.Items; public class InventoryScreen extends Component { - + private static final double MIN_PICK_ALL_DELAY = Units.get("0.5 s"); + private static boolean isLeftHandSelected = false; + private static double controlStart = Double.NEGATIVE_INFINITY; + public static boolean isLeftHandSelected() { - return InputTracker.isKeyPressed(GLFW.GLFW_KEY_LEFT_CONTROL) - || InputTracker.isKeyPressed(GLFW.GLFW_KEY_RIGHT_CONTROL); + return isLeftHandSelected; } private final ItemContainer leftHand; private final ItemContainer rightHand; private final InventoryComponent mainInventory; - + private double lastLeftClick = Double.NEGATIVE_INFINITY; private ItemSlot lastLeftClickSlot = null; public InventoryScreen(String name, InventoryComponent mainInventory, EntityDataPlayer player) { super(name); + isLeftHandSelected = false; this.mainInventory = mainInventory; this.leftHand = player.getLeftHand(); this.rightHand = player.getRightHand(); @@ -73,21 +75,38 @@ public class InventoryScreen extends Component { SlotComponent leftComponent = new SlotComponent(name + ".HandLeft", leftHand, 0); SlotComponent rightComponent = new SlotComponent(name + ".HandRight", rightHand, 0); - + addChild(new HandSlots(name + ".Hands", leftComponent, rightComponent)); addListeners(mainInventory); - + mainInventory.focusNext(); + mainInventory.addListener(KeyEvent.class, input -> { + if (input.getKey() == GLFW.GLFW_KEY_LEFT_CONTROL || input.getKey() == GLFW.GLFW_KEY_RIGHT_CONTROL) { + double now = GraphicsInterface.getTime(); + if (input.isPress()) { + isLeftHandSelected = !isLeftHandSelected; + controlStart = now; + } else if (input.isRelease()) { + if (now - controlStart > Units.get("200 ms")) { + isLeftHandSelected = !isLeftHandSelected; + controlStart = Double.NEGATIVE_INFINITY; + } + } + + return true; + } + return false; + }); } private void addListeners(InventoryComponent mainInventory) { - + ItemSlot left = leftHand.getSlot(0); ItemSlot right = rightHand.getSlot(0); - + Supplier handSlot = () -> isLeftHandSelected() ? left : right; - + Consumer pickAll = createPickAllAction(handSlot); for (DecoratedSlotComponent component : mainInventory.getSlots()) { @@ -99,39 +118,39 @@ public class InventoryScreen extends Component { private Consumer createPickAllAction(Supplier handSlotChooser) { return button -> { - + ItemSlot handSlot = handSlotChooser.get(); ItemSlot invSlot = ((DecoratedSlotComponent) button).getSlot(); - + boolean success = false; - + double now = GraphicsInterface.getTime(); if (lastLeftClickSlot == invSlot && now - lastLeftClick < MIN_PICK_ALL_DELAY) { - + lastLeftClickSlot = null; lastLeftClick = Double.NEGATIVE_INFINITY; - + pickAll(handSlot); - + success = true; - + } else { lastLeftClick = now; lastLeftClickSlot = invSlot; } - + if (!success && !leftHand.getSlot(0).isEmpty() && rightHand.getSlot(0).isEmpty()) { success = Items.pour(leftHand.getSlot(0), invSlot) != 0; } - + if (!success) { success = Items.pour(handSlot, invSlot) != 0; } - + if (!success) { success = Items.swap(handSlot, invSlot); } - + if (!success && handSlot.isEmpty()) { success = Items.pour(invSlot, handSlot) != 0; } @@ -145,31 +164,31 @@ public class InventoryScreen extends Component { private void pickAll(ItemSlot handSlot) { for (DecoratedSlotComponent component : mainInventory.getSlots()) { - + Items.pour(component.getSlot(), handSlot); if (handSlot.isEmpty()) { break; } - + } } private InputListener createRMBAction(ItemSlot invSlot, Supplier handSlotChooser) { return input -> { - + if (input.isPress() && input.isRightMouseButton()) { ItemSlot handSlot = handSlotChooser.get(); boolean success = false; - + if (handSlot.isEmpty()) { success = Items.pour(invSlot, handSlot, invSlot.getAmount() / 2) != 0; } - + if (!success) { success = Items.pour(handSlot, invSlot, 1) != 0; } - + if (!success) { success = Items.swap(handSlot, invSlot); } @@ -177,34 +196,33 @@ public class InventoryScreen extends Component { if (success) { requestReassembly(); } - + return true; } - + return false; - + }; } - private InputListener createWheelAction(ItemSlot invSlot, Supplier handSlotChooser) { return input -> { - + if (!input.hasVerticalMovement()) { return false; } - + ItemSlot handSlot = handSlotChooser.get(); - + ItemSlot from = input.isDown() ? handSlot : invSlot; ItemSlot into = input.isDown() ? invSlot : handSlot; - + if (Items.pour(from, into, 1) != 0) { requestReassembly(); } - + return true; - + }; }