From 30464febf68c5cc0256b8b133ebb73e779f08419 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Fri, 10 Sep 2021 23:11:15 +0300 Subject: [PATCH] Added item containers - Added ItemDataContainer. It is an item that has a container - Added Test:CardboardBackpack - Added back inventory GUIs - Now in window form! - *not interactive (don't sue us) - Hand background icons now only render when an inventory is open - Removed intrinsic player inventory because we're hardcore --- .../client/graphics/world/hud/HUDManager.java | 3 +- .../client/graphics/world/hud/HandsHUD.java | 9 +- .../world/hud/InteractiveSlotComponent.java | 11 +- .../world/hud/InventoryComponent.java | 3 + .../graphics/world/hud/InventoryWindow.java | 104 ++++++++++++++++++ .../client/graphics/world/hud/LayerHUD.java | 20 +++- .../world/hud/SimpleInventoryComponent.java | 9 +- .../graphics/world/hud/WindowedHUD.java | 48 ++++++++ .../common/world/entity/EntityDataPlayer.java | 10 -- .../world/item/ItemContainerMixedSimple.java | 6 + .../common/world/item/ItemDataContainer.java | 75 +++++++++++++ .../progressia/server/PlayerManager.java | 8 +- .../windcorp/progressia/test/TestContent.java | 52 +++++---- .../resources/assets/languages/en-US.lang | 4 +- .../resources/assets/languages/ru-RU.lang | 4 +- 15 files changed, 318 insertions(+), 48 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryWindow.java create mode 100644 src/main/java/ru/windcorp/progressia/client/graphics/world/hud/WindowedHUD.java create mode 100644 src/main/java/ru/windcorp/progressia/common/world/item/ItemDataContainer.java diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HUDManager.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HUDManager.java index af6be9c..291faf2 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HUDManager.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HUDManager.java @@ -40,7 +40,8 @@ public class HUDManager implements HUDWorkspace { @Override public void openContainer(InventoryComponent component) { - System.err.println("openContainer NYI"); + InventoryWindow window = new InventoryWindow("Window", component); + layer.getWindowManager().addWindow(window); } public void closeEverything() { diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HandsHUD.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HandsHUD.java index af598f7..30ab34a 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HandsHUD.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/HandsHUD.java @@ -31,7 +31,6 @@ import ru.windcorp.progressia.client.graphics.gui.layout.LayoutAlign; import ru.windcorp.progressia.client.graphics.gui.layout.LayoutBorderHorizontal; import ru.windcorp.progressia.client.graphics.gui.layout.LayoutHorizontal; import ru.windcorp.progressia.client.graphics.model.Renderable; -import ru.windcorp.progressia.client.graphics.world.LocalPlayer; import ru.windcorp.progressia.client.world.entity.SpeciesRender; import ru.windcorp.progressia.client.world.entity.SpeciesRenderRegistry; import ru.windcorp.progressia.common.world.entity.EntityDataPlayer; @@ -59,7 +58,7 @@ public class HandsHUD extends Component { Renderable renderable = slotComponent.assembleToRenderable(); target.addCustomRenderer(renderer -> { - float scale = player.getEntity().getSelectedHand() == slotComponent.getSlot().getContainer() ? 2 : 1; + float scale = manager.getHand() == slotComponent.getSlot().getContainer() ? 2 : 1; renderer.pushTransform() .translate(getX() + getWidth() / 2, getY(), 0) .scale(selected.updateForFrame(scale)); @@ -88,11 +87,11 @@ public class HandsHUD extends Component { } } - private final LocalPlayer player; + private final HUDManager manager; public HandsHUD(String name, HUDManager manager) { super(name); - this.player = manager.getPlayer(); + this.manager = manager; EntityDataPlayer entity = manager.getPlayerEntity(); String speciesId = entity.getSpecies().getId(); @@ -129,7 +128,7 @@ public class HandsHUD extends Component { } private boolean shouldRenderHandPlaceholder() { - return true; + return manager.isInventoryShown(); } } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InteractiveSlotComponent.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InteractiveSlotComponent.java index 5d27cfc..98fa3dc 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InteractiveSlotComponent.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InteractiveSlotComponent.java @@ -25,6 +25,7 @@ import ru.windcorp.progressia.client.graphics.input.KeyMatcher; import ru.windcorp.progressia.client.graphics.input.WheelScrollEvent; import ru.windcorp.progressia.common.Units; import ru.windcorp.progressia.common.world.item.ItemContainer; +import ru.windcorp.progressia.common.world.item.ItemDataContainer; import ru.windcorp.progressia.common.world.item.ItemSlot; import ru.windcorp.progressia.common.world.item.Items; @@ -119,8 +120,16 @@ public class InteractiveSlotComponent extends Button { ItemSlot invSlot = getSlot(); boolean success = false; + + if (handSlot.isEmpty() && invSlot.getAmount() == 1 && invSlot.getContents() instanceof ItemDataContainer) { + ItemDataContainer item = (ItemDataContainer) invSlot.getContents(); + if (item.canOpenContainer()) { + workspace.openContainer(new SimpleInventoryComponent(item.getContainer(), workspace)); + success = true; + } + } - if (handSlot.isEmpty()) { + if (!success && handSlot.isEmpty()) { success = Items.pour(invSlot, handSlot, invSlot.getAmount() / 2) != 0; } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryComponent.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryComponent.java index ba0bb1d..a6ef715 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryComponent.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryComponent.java @@ -20,6 +20,7 @@ package ru.windcorp.progressia.client.graphics.world.hud; import java.util.Collection; import ru.windcorp.progressia.client.graphics.gui.Component; +import ru.windcorp.progressia.common.world.item.ItemContainer; public abstract class InventoryComponent extends Component { @@ -27,6 +28,8 @@ public abstract class InventoryComponent extends Component { super(name); } + public abstract ItemContainer getContainer(); + public abstract Collection getSlots(); } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryWindow.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryWindow.java new file mode 100644 index 0000000..9c36b88 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/InventoryWindow.java @@ -0,0 +1,104 @@ +/* + * 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 java.util.function.Consumer; + +import glm.vec._4.Vec4; +import ru.windcorp.progressia.client.graphics.Colors; +import ru.windcorp.progressia.client.graphics.flat.RenderTarget; +import ru.windcorp.progressia.client.graphics.font.Font; +import ru.windcorp.progressia.client.graphics.font.Typeface; +import ru.windcorp.progressia.client.graphics.gui.Button; +import ru.windcorp.progressia.client.graphics.gui.Component; +import ru.windcorp.progressia.client.graphics.gui.Group; +import ru.windcorp.progressia.client.graphics.gui.Label; +import ru.windcorp.progressia.client.graphics.gui.Panel; +import ru.windcorp.progressia.client.graphics.gui.layout.LayoutBorderHorizontal; +import ru.windcorp.progressia.client.graphics.gui.layout.LayoutFill; +import ru.windcorp.progressia.client.graphics.gui.layout.LayoutVertical; +import ru.windcorp.progressia.client.localization.MutableString; +import ru.windcorp.progressia.client.localization.MutableStringLocalized; + +public class InventoryWindow extends Panel { + + private static final String CLOSE_CHAR = "\u2715"; + private static final Vec4 CLOSE_BUTTON_IDLE = Colors.toVector(0xFFBC1515); + private static final Vec4 CLOSE_BUTTON_HOVER = Colors.toVector(0xFFFA6464); + private static final Vec4 CLOSE_BUTTON_PRESSED = Colors.BLACK; + + public InventoryWindow(String name, InventoryComponent component) { + super(name, new LayoutVertical(15, 15)); + + Group titleBar = new Group(getName() + ".TitleBar", new LayoutBorderHorizontal()); + titleBar.addChild(createLabel(component).setLayoutHint(LayoutBorderHorizontal.CENTER)); + titleBar.addChild(createCloseButton().setLayoutHint(LayoutBorderHorizontal.RIGHT)); + + addChild(titleBar); + + addChild(component); + } + + private Label createLabel(InventoryComponent component) { + String translationKey = "Inventory." + component.getContainer().getId() + ".Title"; + MutableString titleText = new MutableStringLocalized(translationKey); + Font titleFont = new Font().deriveBold().withColor(Colors.BLACK).withAlign(Typeface.ALIGN_LEFT); + + return new Label(getName() + ".Title", titleFont, titleText); + } + + private void doWithManager(Consumer action) { + Component parent = getParent(); + if (parent instanceof WindowedHUD) { + action.accept((WindowedHUD) parent); + } + } + + private Component createCloseButton() { + + Button button = new Button(getName() + ".CloseButton", CLOSE_CHAR) { + + @Override + protected void assembleSelf(RenderTarget target) { + + Vec4 color = CLOSE_BUTTON_IDLE; + if (isPressed()) { + color = CLOSE_BUTTON_PRESSED; + } else if (isHovered()) { + color = CLOSE_BUTTON_HOVER; + } + + if (hasLabel()) { + getLabel().setFont(getLabel().getFont().withColor(color)); + } + + } + + }; + + button.addAction(b -> doWithManager(manager -> manager.closeWindow(this))); + + button.setLayout(new LayoutFill()); + + int height = button.getLabel().getFont().getHeight(button.getLabel().getCurrentText()); + button.setPreferredSize(height, height); + + return button; + } + +} 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 index 5a73bc4..1f0031b 100644 --- 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 @@ -23,8 +23,10 @@ import com.google.common.eventbus.Subscribe; import ru.windcorp.progressia.client.events.NewLocalEntityEvent; import ru.windcorp.progressia.client.graphics.GUI; +import ru.windcorp.progressia.client.graphics.gui.Component; import ru.windcorp.progressia.client.graphics.gui.Components; import ru.windcorp.progressia.client.graphics.gui.GUILayer; +import ru.windcorp.progressia.client.graphics.gui.Group; import ru.windcorp.progressia.client.graphics.gui.layout.LayoutFill; import ru.windcorp.progressia.client.graphics.input.KeyEvent; import ru.windcorp.progressia.client.graphics.input.bus.Input; @@ -33,6 +35,7 @@ import ru.windcorp.progressia.test.TestPlayerControls; public class LayerHUD extends GUILayer { private final HUDManager manager; + private WindowedHUD windowManager = null; private boolean showInventory = false; private boolean isHidden = false; @@ -58,11 +61,24 @@ public class LayerHUD extends GUILayer { } getRoot().addChild(new PermanentHUD(getName() + ".Permanent", manager)); - getRoot().addChild(Components.hide(new InventoryHUD(getName() + ".Equipment", manager), () -> !showInventory)); - getRoot().addChild(Components.hide(new CursorHUD(getName() + ".Equipment", manager.getPlayerEntity()), () -> !showInventory)); + + Component inventoryGroup = new Group(getName() + ".InventoryGroup", new LayoutFill()); + + inventoryGroup.addChild(new InventoryHUD(getName() + ".Equipment", manager)); + + windowManager = new WindowedHUD(getName() + ".Windows"); + inventoryGroup.addChild(windowManager); + + inventoryGroup.addChild(new CursorHUD(getName() + ".Cursor", manager.getPlayerEntity())); + + getRoot().addChild(Components.hide(inventoryGroup, () -> !showInventory)); getRoot().requestReassembly(); } + + public WindowedHUD getWindowManager() { + return windowManager; + } public boolean isInventoryShown() { return showInventory; diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/SimpleInventoryComponent.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/SimpleInventoryComponent.java index ea318e4..0a52891 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/SimpleInventoryComponent.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/SimpleInventoryComponent.java @@ -31,11 +31,13 @@ import ru.windcorp.progressia.common.world.item.ItemContainer; public class SimpleInventoryComponent extends InventoryComponent { - private final Group slots = new Group("Inventory.Slots", new LayoutGrid(15)); + private final Group slots = new Group("Inventory.Slots", new LayoutGrid(0, 15)); private final Collection slotCollection = new ArrayList<>(); + private final ItemContainer container; public SimpleInventoryComponent(ItemContainer container, HUDWorkspace workspace) { super("Inventory"); + this.container = container; setLayout(new LayoutBorderHorizontal(15)); @@ -78,6 +80,11 @@ public class SimpleInventoryComponent extends InventoryComponent { slots.addChild(component.setLayoutHint(pos)); slotCollection.add(component); } + + @Override + public ItemContainer getContainer() { + return container; + } @Override public Collection getSlots() { diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/WindowedHUD.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/WindowedHUD.java new file mode 100644 index 0000000..ff44d61 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/hud/WindowedHUD.java @@ -0,0 +1,48 @@ +/* + * 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 ru.windcorp.progressia.client.graphics.gui.Component; + +public class WindowedHUD extends Component { + + public WindowedHUD(String name) { + super(name); + setLayout(null); + } + + public void addWindow(InventoryWindow window) { + addChild(window); + window.setSize(window.getPreferredSize()); + + centerWindow(window); + } + + public void closeWindow(InventoryWindow window) { + removeChild(window); + requestReassembly(); + } + + private void centerWindow(InventoryWindow window) { + window.setPosition( + (getWidth() - window.getWidth()) / 2, + (getHeight() - window.getHeight()) / 2 + ); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/entity/EntityDataPlayer.java b/src/main/java/ru/windcorp/progressia/common/world/entity/EntityDataPlayer.java index da173c7..b7aa58e 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/entity/EntityDataPlayer.java +++ b/src/main/java/ru/windcorp/progressia/common/world/entity/EntityDataPlayer.java @@ -17,22 +17,16 @@ */ package ru.windcorp.progressia.common.world.entity; -import ru.windcorp.progressia.common.Units; import ru.windcorp.progressia.common.state.IntStateField; import ru.windcorp.progressia.common.state.ObjectStateField; import ru.windcorp.progressia.common.world.item.ItemContainerEquipment; import ru.windcorp.progressia.common.world.item.ItemContainerHand; -import ru.windcorp.progressia.common.world.item.ItemContainerMixedSimple; public class EntityDataPlayer extends EntityData { private final ObjectStateField speciesDatalet = field("Core:SpeciesDatalet").setShared() .of(SpeciesDataRegistry.getInstance().getCodec()).build(); - private final ObjectStateField inventory = field("Core:Inventory").setShared().def( - () -> new ItemContainerMixedSimple("Core:PlayerInventory", Units.get(15, "kg"), Units.get(50, "L")) - ).build(); - private final IntStateField selectedHand = field("Core:SelectedHand").setShared().ofInt().build(); public EntityDataPlayer(String id, SpeciesData species) { @@ -40,10 +34,6 @@ public class EntityDataPlayer extends EntityData { setSpecies(species); } - - public ItemContainerMixedSimple getInventory() { - return inventory.get(this); - } private void setSpecies(SpeciesData species) { speciesDatalet.setNow(this, species.createDatalet()); diff --git a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixedSimple.java b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixedSimple.java index 183fa6f..8853a76 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixedSimple.java +++ b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixedSimple.java @@ -28,10 +28,16 @@ public class ItemContainerMixedSimple extends ItemContainerMixed { private final float volumeLimit; public ItemContainerMixedSimple(String id, float massLimit, float volumeLimit) { + this(id, massLimit, volumeLimit, 1); + } + + public ItemContainerMixedSimple(String id, float massLimit, float volumeLimit, int startingSlots) { super(id); this.list = new ArrayList<>(); this.massLimit = massLimit; this.volumeLimit = volumeLimit; + + addSlots(startingSlots); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/item/ItemDataContainer.java b/src/main/java/ru/windcorp/progressia/common/world/item/ItemDataContainer.java new file mode 100644 index 0000000..6d52b3d --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/item/ItemDataContainer.java @@ -0,0 +1,75 @@ +/* + * 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.common.world.item; + +import ru.windcorp.progressia.common.state.ObjectStateField; + +public class ItemDataContainer extends ItemData { + + private final ObjectStateField container = field("Core:Contents").def(this::createContainer).build(); + + private final float ownMass; + private final float containerMassLimit; + + private final float ownVolume; + private final float containerVolumeLimit; + private final boolean containerContributesVolume; + + public ItemDataContainer( + String id, + float ownMass, + float containerMassLimit, + float ownVolume, + float containerVolumeLimit, + boolean containerContributesVolume + ) { + super(id); + this.ownMass = ownMass; + this.containerMassLimit = containerMassLimit; + this.ownVolume = ownVolume; + this.containerVolumeLimit = containerVolumeLimit; + this.containerContributesVolume = containerContributesVolume; + } + + protected ItemContainer createContainer() { + return new ItemContainerMixedSimple(getId(), containerMassLimit, containerVolumeLimit, 10); + } + + public ItemContainer getContainer() { + return container.get(this); + } + + public boolean canOpenContainer() { + return true; + } + + @Override + public float getMass() { + return ownMass + getContainer().getMass(); + } + + @Override + public float getVolume() { + if (containerContributesVolume) { + return ownVolume + getContainer().getVolume(); + } else { + return ownVolume; + } + } + +} diff --git a/src/main/java/ru/windcorp/progressia/server/PlayerManager.java b/src/main/java/ru/windcorp/progressia/server/PlayerManager.java index c59c12b..48c39c9 100644 --- a/src/main/java/ru/windcorp/progressia/server/PlayerManager.java +++ b/src/main/java/ru/windcorp/progressia/server/PlayerManager.java @@ -62,15 +62,9 @@ public class PlayerManager { private EntityDataPlayer spawnPlayerEntity(String login) { EntityDataPlayer player = (EntityDataPlayer) EntityDataRegistry.getInstance().create("Core:Player"); - - player.getInventory().addSlots(10); - - player.getInventory().getSlot(3).setContents(ItemDataRegistry.getInstance().create("Test:Stick"), 7); - player.getInventory().getSlot(5).setContents(ItemDataRegistry.getInstance().create("Test:Stick"), 4); - player.getInventory().getSlot(9).setContents(ItemDataRegistry.getInstance().create("Test:RedGraniteCobblestone"), 1); - player.getInventory().getSlot(6).setContents(ItemDataRegistry.getInstance().create("Test:MoonTypeIceCream"), 1); player.getHand(0).slot().setContents(ItemDataRegistry.getInstance().create("Test:Stick"), 7); + player.getEquipmentSlot(0).slot().setContents(ItemDataRegistry.getInstance().create("Test:CardboardBackpack"), 1); player.setPosition(getServer().getWorld().getGenerator().suggestSpawnLocation()); player.setUpVector(new Vec3(0, 0, 1)); diff --git a/src/main/java/ru/windcorp/progressia/test/TestContent.java b/src/main/java/ru/windcorp/progressia/test/TestContent.java index ad9ed98..4b3d927 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestContent.java +++ b/src/main/java/ru/windcorp/progressia/test/TestContent.java @@ -54,6 +54,7 @@ import ru.windcorp.progressia.common.world.block.*; import ru.windcorp.progressia.common.world.entity.*; import ru.windcorp.progressia.common.world.io.ChunkIO; import ru.windcorp.progressia.common.world.item.ItemData; +import ru.windcorp.progressia.common.world.item.ItemDataContainer; import ru.windcorp.progressia.common.world.item.ItemDataRegistry; import ru.windcorp.progressia.common.world.item.ItemDataSimple; import ru.windcorp.progressia.common.world.rels.AbsFace; @@ -104,7 +105,7 @@ public class TestContent { register(new BlockRenderNone("Test:Air")); register(new TestBlockLogicAir("Test:Air")); placeableBlacklist.add("Test:Air"); - + registerSimplestBlock("Dirt"); registerSimplestBlock("Chernozem"); registerSimplestBlock("Stone"); @@ -113,7 +114,7 @@ public class TestContent { registerSimplestBlock("Sand"); registerSimplestBlock("Concrete"); registerSimplestBlock("WoodenPlank"); - + registerRocks(); register(new BlockData("Test:Glass")); @@ -130,12 +131,12 @@ public class TestContent { ) ); register(new BlockLogic("Test:Log")); - + register(new BlockData("Test:TemporaryLeaves")); register(new BlockRenderTransparentCube("Test:TemporaryLeaves", getBlockTexture("TemporaryLeaves"))); - // Sic, using Glass logic for leaves because Test - register(new TestBlockLogicGlass("Test:TemporaryLeaves")); - + // Sic, using Glass logic for leaves because Test + register(new TestBlockLogicGlass("Test:TemporaryLeaves")); + register(new BlockData("Test:StatieSpawner")); register(new BlockRenderOpaqueCube("Test:StatieSpawner", getBlockTexture("StatieSpawner"))); register(new TestBlockLogicStatieSpawner("Test:StatieSpawner")); @@ -234,16 +235,29 @@ public class TestContent { registerHerb("Bush", 1); registerHerb("Fern", 3); - + TileDataRegistry.getInstance().values().forEach(PLACEABLE_TILES::add); PLACEABLE_TILES.removeIf(b -> placeableBlacklist.contains(b.getId())); PLACEABLE_TILES.sort(Comparator.comparing(TileData::getId)); } - + private static void registerItems() { registerSimplestItem("MoonTypeIceCream", Units.get("200 g"), Units.get("1 L")); registerSimplestItem("Stick", Units.get("260 g"), Units.get("0.5 L")); registerSimplestItem("RedGraniteCobblestone", Units.get("4 kg"), Units.get("1500 cm^3")); + + registerItem( + "Test:CardboardBackpack", + s -> new ItemDataContainer( + "Test:CardboardBackpack", + Units.get("0.7 kg"), // Own mass + Units.get("5 kg"), // Container mass limit + Units.get("125 L"), // Own volume + Units.get("125 L"), // Container volume limit + false // Whether container contents contribute to item volume + ) + ); + register(new ItemRenderSimple("Test:CardboardBackpack", getItemTexture("CardboardBackpack"))); } private static void registerSimplestBlock(String name) { @@ -273,7 +287,7 @@ public class TestContent { register(new TileRenderHerb(id, getTileTexture(name), maxCount)); register(new HangingTileLogic(id)); } - + private static void registerSimplestItem(String name, float mass, float volume) { String id = "Test:" + name; registerItem(id, s -> new ItemDataSimple(s, mass, volume)); @@ -292,7 +306,7 @@ public class TestContent { SpeciesData human = new SpeciesDataHuman("Core:Human"); SpeciesDataRegistry.getInstance().register(human); SpeciesRenderRegistry.getInstance().register(new SpeciesRenderHuman("Core:Human")); - + registerEntity("Core:Player", id -> new EntityDataPlayer(id, human)); register(new EntityRenderPlayer("Core:Player")); register(new EntityLogic("Core:Player")); @@ -348,7 +362,7 @@ public class TestContent { KeyMatcher.of("M") ) ); - + triggers.register( ControlTriggers.localOf( "Test:ShowInventory", @@ -357,7 +371,7 @@ public class TestContent { KeyMatcher.of("E") ) ); - + triggers.register( ControlTriggers.localOf( "Test:HideHUD", @@ -375,11 +389,11 @@ public class TestContent { private static void register(TileData x) { TileDataRegistry.getInstance().register(x); } - + private static void registerItem(String id, IdFactory factory) { ItemDataRegistry.getInstance().register(id, factory); } - + private static void registerEntity( String id, IdFactory factory @@ -394,7 +408,7 @@ public class TestContent { private static void register(TileRender x) { TileRenderRegistry.getInstance().register(x); } - + private static void register(ItemRender x) { ItemRenderRegistry.getInstance().register(x); } @@ -503,20 +517,20 @@ public class TestContent { } tileContext.addTile(tile); } - + private static void switchInventory() { ru.windcorp.progressia.client.Client client = ClientState.getInstance(); if (client == null || !client.isReady()) return; - + client.getHUD().setInventoryShown(!client.getHUD().isInventoryShown()); } - + private static void switchHUD() { ru.windcorp.progressia.client.Client client = ClientState.getInstance(); if (client == null || !client.isReady()) return; - + client.getHUD().setHidden(!client.getHUD().isHidden()); } diff --git a/src/main/resources/assets/languages/en-US.lang b/src/main/resources/assets/languages/en-US.lang index b4123f8..80a2e44 100644 --- a/src/main/resources/assets/languages/en-US.lang +++ b/src/main/resources/assets/languages/en-US.lang @@ -22,4 +22,6 @@ LayerTestGUI.IsFullscreen = Fullscreen: %5s (F11) LayerTestGUI.IsVSync = VSync: %5s (F12) LayerButtonTest.Title = Button Test -LayerInventory.Title = Player \ No newline at end of file +LayerInventory.Title = Player + +Inventory.Test:CardboardBackpack.Title = Cardboard Backpack \ No newline at end of file diff --git a/src/main/resources/assets/languages/ru-RU.lang b/src/main/resources/assets/languages/ru-RU.lang index f18bd71..bda77d9 100644 --- a/src/main/resources/assets/languages/ru-RU.lang +++ b/src/main/resources/assets/languages/ru-RU.lang @@ -22,4 +22,6 @@ LayerTestGUI.IsFullscreen = Полный экран: %5s (F11) LayerTestGUI.IsVSync = Верт. синхр.: %5s (F12) LayerButtonTest.Title = Тест Кнопок -LayerInventory.Title = Игрок \ No newline at end of file +LayerInventory.Title = Игрок + +Inventory.Test:CardboardBackpack.Title = Картонный рюкзак \ No newline at end of file