From a4b731e8a5dac400289833a622a5668373def1a4 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Mon, 30 Aug 2021 23:36:13 +0300 Subject: [PATCH] Added mass/volume limit enforcement and displays - Also added Test:RedGraniteCobblestone --- .../progressia/client/graphics/Colors.java | 19 +++ .../common/world/item/ItemContainer.java | 28 +++++ .../common/world/item/ItemContainerHand.java | 2 + .../common/world/item/ItemContainerMixed.java | 18 ++- .../world/item/ItemContainerMixedSimple.java | 7 +- .../common/world/item/ItemSlot.java | 33 ++++- .../progressia/server/PlayerManager.java | 3 +- .../windcorp/progressia/test/TestContent.java | 1 + .../ru/windcorp/progressia/test/inv/Bar.java | 113 ++++++++++++++++++ .../progressia/test/inv/InventoryScreen.java | 4 + .../test/inv/SimpleInventoryComponent.java | 29 ++++- .../textures/items/RedGraniteCobblestone.png | Bin 0 -> 1483 bytes 12 files changed, 243 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/test/inv/Bar.java create mode 100644 src/main/resources/assets/textures/items/RedGraniteCobblestone.png diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java b/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java index b37a6a8..c02faaa 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java @@ -55,6 +55,25 @@ public class Colors { output = new Vec4(); return color.mul(multiplier, multiplier, multiplier, 1, output); } + + public static Vec4 mix(Vec4 zero, Vec4 one, float t, Vec4 output) { + if (output == null) { + output = new Vec4(); + } + + if (t <= 0) { + return output.set(zero); + } else if (t >= 1) { + return output.set(one); + } + + return output.set( + zero.x * (1 - t) + one.x * t, + zero.y * (1 - t) + one.y * t, + zero.z * (1 - t) + one.z * t, + zero.w * (1 - t) + one.w * t + ); + } public static Vec4 toVector(int argb, Vec4 output) { output.w = ((argb & 0xFF000000) >>> 24) / (float) 0xFF; // Alpha diff --git a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainer.java b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainer.java index 7cb124a..0b5d655 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainer.java +++ b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainer.java @@ -71,5 +71,33 @@ public abstract class ItemContainer extends Namespaced implements Encodable { * boundary is set */ public abstract float getVolumeLimit(); + + public synchronized float getMass() { + float sum = 0; + for (int i = 0; i < getSlotCount(); ++i) { + ItemSlot slot = getSlot(i); + + if (slot.isEmpty()) { + continue; + } + + sum += slot.getContents().getMass() * slot.getAmount(); + } + return sum; + } + + public synchronized float getVolume() { + float sum = 0; + for (int i = 0; i < getSlotCount(); ++i) { + ItemSlot slot = getSlot(i); + + if (slot.isEmpty()) { + continue; + } + + sum += slot.getContents().getVolume() * slot.getAmount(); + } + return sum; + } } diff --git a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerHand.java b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerHand.java index a6bc3b1..9f8c086 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerHand.java +++ b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerHand.java @@ -36,6 +36,8 @@ public class ItemContainerHand extends ItemContainer { super(id); this.massLimit = massLimit; this.volumeLimit = volumeLimit; + + slot.setContainer(this); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixed.java b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixed.java index c6d4b44..567f9f3 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixed.java +++ b/src/main/java/ru/windcorp/progressia/common/world/item/ItemContainerMixed.java @@ -50,7 +50,23 @@ public abstract class ItemContainerMixed extends ItemContainer { * * @param amount the amount of slots to add */ - public abstract void addSlots(int amount); + public synchronized void addSlots(int amount) { + List slots = getSlots(); + + for (int i = 0; i < amount; ++i) { + ItemSlot slot = createSlot(slots.size()); + slots.add(slot); + slot.setContainer(this); + } + } + + /** + * Instantiates a new slot object that will be appended to the container. + * + * @param index the index that the new slot will receive + * @return the new slot + */ + protected abstract ItemSlot createSlot(int index); @Override public ItemSlot getSlot(int index) { 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 5748d41..183fa6f 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 @@ -40,11 +40,8 @@ public class ItemContainerMixedSimple extends ItemContainerMixed { } @Override - public synchronized void addSlots(int amount) { - ((ArrayList) list).ensureCapacity(list.size() + amount); - for (int i = 0; i < amount; ++i) { - list.add(new ItemSlot()); - } + public ItemSlot createSlot(int index) { + return new ItemSlot(); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/item/ItemSlot.java b/src/main/java/ru/windcorp/progressia/common/world/item/ItemSlot.java index c8cfa1b..662683f 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/item/ItemSlot.java +++ b/src/main/java/ru/windcorp/progressia/common/world/item/ItemSlot.java @@ -32,6 +32,22 @@ public class ItemSlot implements Encodable { private ItemData contents; private int amount; + + private ItemContainer container; + + /** + * @return the container + */ + public ItemContainer getContainer() { + return container; + } + + /** + * @param container the container to set + */ + void setContainer(ItemContainer container) { + this.container = container; + } /** * Retrieves the contents of this slot. @@ -95,14 +111,19 @@ public class ItemSlot implements Encodable { } public synchronized boolean canInsert(ItemData contents, int amount) { - - // Ignore amount - - if (this.contents == null) { - return true; + if (contents == null) { + return false; } - return this.contents.equals(contents); + if (container.getMass() + contents.getMass() * amount > container.getMassLimit()) { + return false; + } + + if (container.getVolume() + contents.getVolume() * amount > container.getVolumeLimit()) { + return false; + } + + return this.contents == null || this.contents.equals(contents); } public synchronized boolean canRemove(int amount) { diff --git a/src/main/java/ru/windcorp/progressia/server/PlayerManager.java b/src/main/java/ru/windcorp/progressia/server/PlayerManager.java index 1953184..851bf82 100644 --- a/src/main/java/ru/windcorp/progressia/server/PlayerManager.java +++ b/src/main/java/ru/windcorp/progressia/server/PlayerManager.java @@ -65,8 +65,9 @@ public class PlayerManager { player.getInventory().addSlots(10); - player.getInventory().getSlot(3).setContents(ItemDataRegistry.getInstance().create("Test:Stick"), 5); + 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.setPosition(getServer().getWorld().getGenerator().suggestSpawnLocation()); diff --git a/src/main/java/ru/windcorp/progressia/test/TestContent.java b/src/main/java/ru/windcorp/progressia/test/TestContent.java index a265d21..5206620 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestContent.java +++ b/src/main/java/ru/windcorp/progressia/test/TestContent.java @@ -245,6 +245,7 @@ public class TestContent { 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")); } private static void registerSimplestBlock(String name) { diff --git a/src/main/java/ru/windcorp/progressia/test/inv/Bar.java b/src/main/java/ru/windcorp/progressia/test/inv/Bar.java new file mode 100644 index 0000000..8b15e87 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/test/inv/Bar.java @@ -0,0 +1,113 @@ +/* + * 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.test.inv; + +import glm.vec._3.Vec3; +import glm.vec._4.Vec4; +import ru.windcorp.jputil.functions.FloatSupplier; +import ru.windcorp.progressia.client.graphics.Colors; +import ru.windcorp.progressia.client.graphics.backend.Usage; +import ru.windcorp.progressia.client.graphics.flat.FlatRenderProgram; +import ru.windcorp.progressia.client.graphics.flat.RenderTarget; +import ru.windcorp.progressia.client.graphics.gui.Component; +import ru.windcorp.progressia.client.graphics.model.Renderable; +import ru.windcorp.progressia.client.graphics.model.Shape; +import ru.windcorp.progressia.client.graphics.model.ShapeParts; +import ru.windcorp.progressia.client.graphics.model.ShapeRenderHelper; + +public class Bar extends Component { + + private static final int THICKNESS = 5; + + private final boolean isVertical; + + private final FloatSupplier value; + private final FloatSupplier maxValue; + + private final Vec4 color; + private final Vec4 backgroundColor; + + private static Renderable unitSquare = null; + + public Bar(String name, boolean isVertical, Vec4 color, FloatSupplier value, FloatSupplier maxValue) { + super(name); + this.isVertical = isVertical; + this.value = value; + this.maxValue = maxValue; + + this.color = color; + this.backgroundColor = Colors.mix(color, Colors.WHITE, 0.75f, null); + + if (unitSquare == null) { + unitSquare = new Shape( + Usage.STATIC, + FlatRenderProgram.getDefault(), + ShapeParts.createRectangle( + FlatRenderProgram.getDefault(), + null, + Colors.WHITE, + new Vec3(0, 0, 0), + new Vec3(1, 0, 0), + new Vec3(0, 1, 0), + false + ) + ); + } + + setPreferredSize(THICKNESS, THICKNESS); + } + + @Override + protected void assembleSelf(RenderTarget target) { + target.addCustomRenderer(this::renderSelf); + } + + private void renderSelf(ShapeRenderHelper renderer) { + renderer.pushTransform() + .translate(getX(), getY(), 0) + .scale(getWidth(), getHeight(), 1); + + float length = value.getAsFloat() / maxValue.getAsFloat(); + if (length < 0) { + length = 0; + } else if (length > 1) { + length = 1; + } + + // TODO why is the order reverse???? + renderRectangle(renderer, color, length); + renderRectangle(renderer, backgroundColor, 1); + + renderer.popTransform(); + } + + private void renderRectangle(ShapeRenderHelper renderer, Vec4 color, float length) { + renderer.pushColorMultiplier().mul(color); + if (length != 1) { + renderer.pushTransform().scale(isVertical ? 1 : length, isVertical ? length : 1, 1); + } + + unitSquare.render(renderer); + + if (length != 1) { + renderer.popTransform(); + } + renderer.popColorMultiplier(); + } + +} 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 a3c7275..853f315 100644 --- a/src/main/java/ru/windcorp/progressia/test/inv/InventoryScreen.java +++ b/src/main/java/ru/windcorp/progressia/test/inv/InventoryScreen.java @@ -131,6 +131,10 @@ public class InventoryScreen extends Component { if (!success) { success = Items.swap(handSlot, invSlot); } + + if (!success && handSlot.isEmpty()) { + success = Items.pour(invSlot, handSlot) != 0; + } if (success) { requestReassembly(); diff --git a/src/main/java/ru/windcorp/progressia/test/inv/SimpleInventoryComponent.java b/src/main/java/ru/windcorp/progressia/test/inv/SimpleInventoryComponent.java index f003f8e..b7d3caf 100644 --- a/src/main/java/ru/windcorp/progressia/test/inv/SimpleInventoryComponent.java +++ b/src/main/java/ru/windcorp/progressia/test/inv/SimpleInventoryComponent.java @@ -21,8 +21,11 @@ import java.util.ArrayList; import java.util.Collection; import glm.vec._2.i.Vec2i; +import ru.windcorp.progressia.client.graphics.Colors; +import ru.windcorp.progressia.client.graphics.gui.Component; 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.LayoutGrid; import ru.windcorp.progressia.common.world.item.ItemContainer; @@ -35,7 +38,31 @@ public class SimpleInventoryComponent extends InventoryComponent { super("Inventory"); setLayout(new LayoutBorderHorizontal(15)); - addChild(slots.setLayoutHint(LayoutBorderHorizontal.CENTER)); + + Bar massBar = new Bar( + "MassBar", + true, + Colors.toVector(0xFF44AAAA), + container::getMass, + container::getMassLimit + ); + Bar volumeBar = new Bar( + "VolumeBar", + false, + Colors.toVector(0xFFAA4444), + container::getVolume, + container::getVolumeLimit + ); + + Component slotsAndVolumeBar = new Group( + "SlotsAndVolumeBar", + new LayoutBorderVertical(15), + slots.setLayoutHint(LayoutBorderVertical.CENTER), + volumeBar.setLayoutHint(LayoutBorderVertical.UP) + ); + + addChild(slotsAndVolumeBar.setLayoutHint(LayoutBorderHorizontal.CENTER)); + addChild(massBar.setLayoutHint(LayoutBorderHorizontal.LEFT)); for (int i = 0; i < container.getSlotCount(); ++i) { addSlot(container, i); diff --git a/src/main/resources/assets/textures/items/RedGraniteCobblestone.png b/src/main/resources/assets/textures/items/RedGraniteCobblestone.png new file mode 100644 index 0000000000000000000000000000000000000000..e933bac05f6fdebd08d133f5eb87efeee2b40461 GIT binary patch literal 1483 zcmV;+1vL7JP)EX>4Tx04R}tkv&MmKpe$iQ>8^K4t5X`$xxjvh>AK&6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi`@MG!;i#xw+pnR+6*kx9)Fhl#~v8_R9XN`^{2NgPpBjq-)8 z%L?Z$&T6^Jn)l={4CS@uG}mbkB928Qkc0>sRcxRP3sG7%QcR?1Kjz^daQsPf$>iDq zBgZ@{P$4;f@IUz7ty!2DcauUfp!3DHKZb$8F3_mi_V=-EH%pV2qvfWBLxYt`+oxsTHaAVXa(-2exN zz(|p@*F4@GZ13&gGtK^f0G0=GwNWsVYXATM24YJ`L;#BbZ~$m1?YqVR000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvJJ3?(`(4!g|&000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}000A`Nkl5QV?0d%JCq14)z!CP+y6RqSAc zP+UEUY9?Y2qDy@B~%p=!Fykm zl!8PAJzougbB>e}s*3l%9@;bwW>yOT*lad6VJW600?raR=TOyJWl16;J21rRHDomx#uIm^K z29<;IUeh#{%x6W6@iakEfvVO6%#56KJ)jR$|2pTqgL$8uwr%k_=i2&t1^o2IXBJYz z%((T@fplGm_kKqNA%qauSnEAbmA@bV#f#%HUD%+axY78m%WbFcd~#1p#eFVS^^D{~?zeaEm>Gz` zpMU($plKNIjSwK^%&={VDdC;NsWQHNm5lNB$9MmC+_gWEs!B{5FgEiU*RNb=xn6U! zT#|BTJQ|YC$k|X8VoJ=8Cd>{ed~^FlE972CP=@Qfdv{C(=0_7YA>f^3|N1o+t2Nyw zukH3gC8G>h*X6Y zRD8iKrNsR33EnxDtBy?w%uW`l2sdx+lecOMDRQY9v0Qa@8gQyi=kuLuF48x%Gntn7 z^xZd21t!yDUcPp<%F%$B68}t&*c%P;PQl>lc+Qs(f02|@t-6njFP2;?IGW99yyw;Z zmq_VsKZF>W&gUGTENB|fVigeJt4F^|L7-T9aon8_`sViF{aaS>JXtL9-hrKVkaA`= zU-0$Mzsd8~X?Z5aw2J?iB)8vs!vMTfRFs$!i{%RE9iRX3uo7DQt1PU(lUB1Uk+#m+ zUn(EG{+ii#dJ7!S`XK0AclDyuLAhCss_;^