Added the concept of inventories
I'll end myself if I spend any more time on this neverending commit
This commit is contained in:
parent
30464febf6
commit
c6e6dc6851
@ -21,6 +21,7 @@ package ru.windcorp.progressia.client.graphics.world;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
|
||||||
import ru.windcorp.progressia.client.Client;
|
import ru.windcorp.progressia.client.Client;
|
||||||
|
import ru.windcorp.progressia.client.events.ClientEvent;
|
||||||
import ru.windcorp.progressia.client.events.NewLocalEntityEvent;
|
import ru.windcorp.progressia.client.events.NewLocalEntityEvent;
|
||||||
import ru.windcorp.progressia.client.world.WorldRender;
|
import ru.windcorp.progressia.client.world.WorldRender;
|
||||||
import ru.windcorp.progressia.client.world.entity.EntityRenderable;
|
import ru.windcorp.progressia.client.world.entity.EntityRenderable;
|
||||||
@ -83,8 +84,9 @@ public class LocalPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (playerEntity != lastKnownEntity) {
|
if (playerEntity != lastKnownEntity) {
|
||||||
|
ClientEvent event = new NewLocalEntityEvent.Immutable(getClient(), playerEntity, lastKnownEntity);
|
||||||
this.lastKnownEntity = playerEntity;
|
this.lastKnownEntity = playerEntity;
|
||||||
getClient().postEvent(new NewLocalEntityEvent.Immutable(getClient(), playerEntity, lastKnownEntity));
|
getClient().postEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
return playerEntity;
|
return playerEntity;
|
||||||
|
@ -17,8 +17,19 @@
|
|||||||
*/
|
*/
|
||||||
package ru.windcorp.progressia.client.graphics.world.hud;
|
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.Client;
|
||||||
|
import ru.windcorp.progressia.client.events.NewLocalEntityEvent;
|
||||||
import ru.windcorp.progressia.client.graphics.GUI;
|
import ru.windcorp.progressia.client.graphics.GUI;
|
||||||
|
import ru.windcorp.progressia.client.graphics.gui.Component;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryComponent;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryRender;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryRenderRegistry;
|
||||||
|
import ru.windcorp.progressia.common.util.crash.CrashReports;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.Inventory;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.InventoryClosingEvent;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.InventoryOpenedEvent;
|
||||||
|
|
||||||
public class HUDManager implements HUDWorkspace {
|
public class HUDManager implements HUDWorkspace {
|
||||||
|
|
||||||
@ -28,6 +39,17 @@ public class HUDManager implements HUDWorkspace {
|
|||||||
public HUDManager(Client client) {
|
public HUDManager(Client client) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.layer = new LayerHUD(this);
|
this.layer = new LayerHUD(this);
|
||||||
|
client.subscribe(new Object() {
|
||||||
|
@Subscribe
|
||||||
|
public void onLocalEntityChanged(NewLocalEntityEvent e) {
|
||||||
|
if (e.getNewEntity() != null) {
|
||||||
|
e.getNewEntity().subscribe(HUDManager.this);
|
||||||
|
}
|
||||||
|
if (e.getPreviousEntity() != null) {
|
||||||
|
e.getPreviousEntity().unsubscribe(HUDManager.this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void install() {
|
public void install() {
|
||||||
@ -39,8 +61,8 @@ public class HUDManager implements HUDWorkspace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void openContainer(InventoryComponent component) {
|
public void openInventory(InventoryComponent component) {
|
||||||
InventoryWindow window = new InventoryWindow("Window", component);
|
InventoryWindow window = new InventoryWindow("Window", component, this);
|
||||||
layer.getWindowManager().addWindow(window);
|
layer.getWindowManager().addWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,5 +90,36 @@ public class HUDManager implements HUDWorkspace {
|
|||||||
public Client getClient() {
|
public Client getClient() {
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
private void onInventoryOpened(InventoryOpenedEvent event) {
|
||||||
|
Inventory inventory = event.getInventory();
|
||||||
|
InventoryRender render = InventoryRenderRegistry.getInstance().get(inventory.getId());
|
||||||
|
|
||||||
|
if (render == null) {
|
||||||
|
throw CrashReports.report(null, "InventoryRender not found for ID %s", inventory.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
InventoryComponent component = render.createComponent(inventory, this);
|
||||||
|
openInventory(component);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw CrashReports.report(null, "Could not open inventory %s", inventory.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
private void onInventoryClosing(InventoryClosingEvent event) {
|
||||||
|
Inventory inventory = event.getInventory();
|
||||||
|
|
||||||
|
for (Component component : layer.getWindowManager().getChildren()) {
|
||||||
|
if (component instanceof InventoryWindow) {
|
||||||
|
InventoryWindow window = (InventoryWindow) component;
|
||||||
|
if (window.getContent().getInventory() == inventory) {
|
||||||
|
layer.getWindowManager().closeWindow(window);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ package ru.windcorp.progressia.client.graphics.world.hud;
|
|||||||
|
|
||||||
import ru.windcorp.progressia.client.Client;
|
import ru.windcorp.progressia.client.Client;
|
||||||
import ru.windcorp.progressia.client.graphics.world.LocalPlayer;
|
import ru.windcorp.progressia.client.graphics.world.LocalPlayer;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryComponent;
|
||||||
import ru.windcorp.progressia.common.world.entity.EntityDataPlayer;
|
import ru.windcorp.progressia.common.world.entity.EntityDataPlayer;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemContainerHand;
|
import ru.windcorp.progressia.common.world.item.ItemContainerHand;
|
||||||
|
|
||||||
@ -38,6 +39,6 @@ public interface HUDWorkspace {
|
|||||||
return getClient().getLocalPlayer().getEntity().getSelectedHand();
|
return getClient().getLocalPlayer().getEntity().getSelectedHand();
|
||||||
}
|
}
|
||||||
|
|
||||||
void openContainer(InventoryComponent component);
|
void openInventory(InventoryComponent component);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -121,12 +121,8 @@ public class InteractiveSlotComponent extends Button {
|
|||||||
|
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
|
|
||||||
if (handSlot.isEmpty() && invSlot.getAmount() == 1 && invSlot.getContents() instanceof ItemDataContainer) {
|
if (handSlot.isEmpty()) {
|
||||||
ItemDataContainer item = (ItemDataContainer) invSlot.getContents();
|
success = tryToOpen(invSlot);
|
||||||
if (item.canOpenContainer()) {
|
|
||||||
workspace.openContainer(new SimpleInventoryComponent(item.getContainer(), workspace));
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!success && handSlot.isEmpty()) {
|
if (!success && handSlot.isEmpty()) {
|
||||||
@ -146,6 +142,18 @@ public class InteractiveSlotComponent extends Button {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean tryToOpen(ItemSlot invSlot) {
|
||||||
|
if (invSlot.getAmount() != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!(invSlot.getContents() instanceof ItemDataContainer)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemDataContainer item = (ItemDataContainer) invSlot.getContents();
|
||||||
|
return item.open(workspace.getPlayerEntity()) != null;
|
||||||
|
}
|
||||||
|
|
||||||
private void onSingleMoveAction(boolean fromHand) {
|
private void onSingleMoveAction(boolean fromHand) {
|
||||||
ItemSlot handSlot = workspace.getHand().slot();
|
ItemSlot handSlot = workspace.getHand().slot();
|
||||||
ItemSlot invSlot = getSlot();
|
ItemSlot invSlot = getSlot();
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
package ru.windcorp.progressia.client.graphics.world.hud;
|
package ru.windcorp.progressia.client.graphics.world.hud;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import glm.vec._4.Vec4;
|
import glm.vec._4.Vec4;
|
||||||
import ru.windcorp.progressia.client.graphics.Colors;
|
import ru.windcorp.progressia.client.graphics.Colors;
|
||||||
import ru.windcorp.progressia.client.graphics.flat.RenderTarget;
|
import ru.windcorp.progressia.client.graphics.flat.RenderTarget;
|
||||||
@ -34,6 +32,7 @@ import ru.windcorp.progressia.client.graphics.gui.layout.LayoutFill;
|
|||||||
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutVertical;
|
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutVertical;
|
||||||
import ru.windcorp.progressia.client.localization.MutableString;
|
import ru.windcorp.progressia.client.localization.MutableString;
|
||||||
import ru.windcorp.progressia.client.localization.MutableStringLocalized;
|
import ru.windcorp.progressia.client.localization.MutableStringLocalized;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryComponent;
|
||||||
|
|
||||||
public class InventoryWindow extends Panel {
|
public class InventoryWindow extends Panel {
|
||||||
|
|
||||||
@ -41,13 +40,18 @@ public class InventoryWindow extends Panel {
|
|||||||
private static final Vec4 CLOSE_BUTTON_IDLE = Colors.toVector(0xFFBC1515);
|
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_HOVER = Colors.toVector(0xFFFA6464);
|
||||||
private static final Vec4 CLOSE_BUTTON_PRESSED = Colors.BLACK;
|
private static final Vec4 CLOSE_BUTTON_PRESSED = Colors.BLACK;
|
||||||
|
|
||||||
|
private final InventoryComponent content;
|
||||||
|
private final HUDWorkspace workspace;
|
||||||
|
|
||||||
public InventoryWindow(String name, InventoryComponent component) {
|
public InventoryWindow(String name, InventoryComponent component, HUDWorkspace workspace) {
|
||||||
super(name, new LayoutVertical(15, 15));
|
super(name, new LayoutVertical(15, 15));
|
||||||
|
this.content = component;
|
||||||
|
this.workspace = workspace;
|
||||||
|
|
||||||
Group titleBar = new Group(getName() + ".TitleBar", new LayoutBorderHorizontal());
|
Group titleBar = new Group(getName() + ".TitleBar", new LayoutBorderHorizontal());
|
||||||
titleBar.addChild(createLabel(component).setLayoutHint(LayoutBorderHorizontal.CENTER));
|
titleBar.addChild(createLabel(component).setLayoutHint(LayoutBorderHorizontal.CENTER));
|
||||||
titleBar.addChild(createCloseButton().setLayoutHint(LayoutBorderHorizontal.RIGHT));
|
titleBar.addChild(createCloseButton(component).setLayoutHint(LayoutBorderHorizontal.RIGHT));
|
||||||
|
|
||||||
addChild(titleBar);
|
addChild(titleBar);
|
||||||
|
|
||||||
@ -55,21 +59,22 @@ public class InventoryWindow extends Panel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Label createLabel(InventoryComponent component) {
|
private Label createLabel(InventoryComponent component) {
|
||||||
String translationKey = "Inventory." + component.getContainer().getId() + ".Title";
|
String translationKey = "Inventory." + component.getInventory().getId() + ".Title";
|
||||||
MutableString titleText = new MutableStringLocalized(translationKey);
|
MutableString titleText = new MutableStringLocalized(translationKey);
|
||||||
Font titleFont = new Font().deriveBold().withColor(Colors.BLACK).withAlign(Typeface.ALIGN_LEFT);
|
Font titleFont = new Font().deriveBold().withColor(Colors.BLACK).withAlign(Typeface.ALIGN_LEFT);
|
||||||
|
|
||||||
return new Label(getName() + ".Title", titleFont, titleText);
|
return new Label(getName() + ".Title", titleFont, titleText);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doWithManager(Consumer<WindowedHUD> action) {
|
private WindowedHUD getManager() {
|
||||||
Component parent = getParent();
|
Component parent = getParent();
|
||||||
if (parent instanceof WindowedHUD) {
|
if (parent instanceof WindowedHUD) {
|
||||||
action.accept((WindowedHUD) parent);
|
return (WindowedHUD) parent;
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Component createCloseButton() {
|
private Component createCloseButton(InventoryComponent component) {
|
||||||
|
|
||||||
Button button = new Button(getName() + ".CloseButton", CLOSE_CHAR) {
|
Button button = new Button(getName() + ".CloseButton", CLOSE_CHAR) {
|
||||||
|
|
||||||
@ -91,7 +96,18 @@ public class InventoryWindow extends Panel {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
button.addAction(b -> doWithManager(manager -> manager.closeWindow(this)));
|
button.addAction(b -> {
|
||||||
|
|
||||||
|
content.getInventory().close(workspace.getPlayerEntity());
|
||||||
|
|
||||||
|
WindowedHUD manager = getManager();
|
||||||
|
if (manager == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
manager.closeWindow(this);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
button.setLayout(new LayoutFill());
|
button.setLayout(new LayoutFill());
|
||||||
|
|
||||||
@ -100,5 +116,9 @@ public class InventoryWindow extends Panel {
|
|||||||
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public InventoryComponent getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ package ru.windcorp.progressia.client.graphics.world.hud;
|
|||||||
|
|
||||||
import java.util.function.BooleanSupplier;
|
import java.util.function.BooleanSupplier;
|
||||||
import glm.mat._4.Mat4;
|
import glm.mat._4.Mat4;
|
||||||
|
import ru.windcorp.progressia.client.graphics.Colors;
|
||||||
import ru.windcorp.progressia.client.graphics.flat.FlatRenderProgram;
|
import ru.windcorp.progressia.client.graphics.flat.FlatRenderProgram;
|
||||||
import ru.windcorp.progressia.client.graphics.flat.RenderTarget;
|
import ru.windcorp.progressia.client.graphics.flat.RenderTarget;
|
||||||
import ru.windcorp.progressia.client.graphics.font.Font;
|
import ru.windcorp.progressia.client.graphics.font.Font;
|
||||||
@ -26,18 +27,22 @@ import ru.windcorp.progressia.client.graphics.gui.Component;
|
|||||||
import ru.windcorp.progressia.client.graphics.gui.DynamicLabel;
|
import ru.windcorp.progressia.client.graphics.gui.DynamicLabel;
|
||||||
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutAlign;
|
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutAlign;
|
||||||
import ru.windcorp.progressia.client.graphics.model.Renderable;
|
import ru.windcorp.progressia.client.graphics.model.Renderable;
|
||||||
|
import ru.windcorp.progressia.client.graphics.model.ShapeRenderHelper;
|
||||||
import ru.windcorp.progressia.client.graphics.model.Shapes.PgmBuilder;
|
import ru.windcorp.progressia.client.graphics.model.Shapes.PgmBuilder;
|
||||||
import ru.windcorp.progressia.client.graphics.texture.Texture;
|
import ru.windcorp.progressia.client.graphics.texture.Texture;
|
||||||
import ru.windcorp.progressia.client.world.item.ItemRenderRegistry;
|
import ru.windcorp.progressia.client.world.item.ItemRenderRegistry;
|
||||||
import ru.windcorp.progressia.client.world.item.ItemRenderable;
|
import ru.windcorp.progressia.client.world.item.ItemRenderable;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemData;
|
import ru.windcorp.progressia.common.world.item.ItemData;
|
||||||
|
import ru.windcorp.progressia.common.world.item.ItemDataContainer;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemSlot;
|
import ru.windcorp.progressia.common.world.item.ItemSlot;
|
||||||
|
|
||||||
public class SlotComponent extends Component {
|
public class SlotComponent extends Component {
|
||||||
|
|
||||||
static final float TEXTURE_SIZE = 24;
|
static final float TEXTURE_SIZE = 24;
|
||||||
|
|
||||||
|
private static Renderable containerOpenDecoration = null;
|
||||||
|
|
||||||
private final ItemContainer container;
|
private final ItemContainer container;
|
||||||
private final int index;
|
private final int index;
|
||||||
|
|
||||||
@ -62,6 +67,13 @@ public class SlotComponent extends Component {
|
|||||||
addChild(new DynamicLabel(getName() + ".Size", sizeFont, () -> amountDisplayString, getPreferredSize().x));
|
addChild(new DynamicLabel(getName() + ".Size", sizeFont, () -> amountDisplayString, getPreferredSize().x));
|
||||||
|
|
||||||
setLayout(new LayoutAlign(0, 0, 0));
|
setLayout(new LayoutAlign(0, 0, 0));
|
||||||
|
|
||||||
|
if (containerOpenDecoration == null) {
|
||||||
|
containerOpenDecoration = new PgmBuilder(
|
||||||
|
FlatRenderProgram.getDefault(),
|
||||||
|
HUDTextures.getHUDTexture("DecorationContainerOpen")
|
||||||
|
).setSize(TEXTURE_SIZE + 2).setOrigin(-1, -1, 0).create();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemSlot getSlot() {
|
public ItemSlot getSlot() {
|
||||||
@ -83,11 +95,11 @@ public class SlotComponent extends Component {
|
|||||||
setBackgroundDisplayCondition(when);
|
setBackgroundDisplayCondition(when);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SlotComponent setBackground(Texture texture) {
|
public SlotComponent setBackground(Texture texture) {
|
||||||
return setBackground(texture, null);
|
return setBackground(texture, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SlotComponent setBackgroundDisplayCondition(BooleanSupplier backgroundCondition) {
|
public SlotComponent setBackgroundDisplayCondition(BooleanSupplier backgroundCondition) {
|
||||||
this.backgroundCondition = backgroundCondition;
|
this.backgroundCondition = backgroundCondition;
|
||||||
return this;
|
return this;
|
||||||
@ -120,13 +132,14 @@ public class SlotComponent extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void assembleItem(RenderTarget target) {
|
private void assembleItem(RenderTarget target) {
|
||||||
target.pushTransform(new Mat4().translate(getX(), getY(), 0).scale(scale));
|
target.pushTransform(new Mat4().translate(getX(), getY(), 0).scale(scale, scale, 1));
|
||||||
target.addCustomRenderer(renderer -> {
|
target.addCustomRenderer(renderer -> {
|
||||||
|
|
||||||
updateItemRenderer();
|
updateItemRenderer();
|
||||||
|
|
||||||
if (itemRenderer != null) {
|
if (itemRenderer != null) {
|
||||||
itemRenderer.render(renderer);
|
itemRenderer.render(renderer);
|
||||||
|
renderDecorations(renderer);
|
||||||
} else if (background != null) {
|
} else if (background != null) {
|
||||||
if (backgroundCondition == null || backgroundCondition.getAsBoolean()) {
|
if (backgroundCondition == null || backgroundCondition.getAsBoolean()) {
|
||||||
background.render(renderer);
|
background.render(renderer);
|
||||||
@ -137,4 +150,17 @@ public class SlotComponent extends Component {
|
|||||||
target.popTransform();
|
target.popTransform();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void renderDecorations(ShapeRenderHelper renderer) {
|
||||||
|
ItemData contents = getSlot().getContents();
|
||||||
|
|
||||||
|
if (contents instanceof ItemDataContainer) {
|
||||||
|
ItemDataContainer asContainer = (ItemDataContainer) contents;
|
||||||
|
if (asContainer.isOpen()) {
|
||||||
|
renderer.pushColorMultiplier().mul(Colors.BLUE);
|
||||||
|
containerOpenDecoration.render(renderer);
|
||||||
|
renderer.popColorMultiplier();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.client.world.item.inventory;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import ru.windcorp.progressia.client.graphics.gui.Component;
|
||||||
|
import ru.windcorp.progressia.client.graphics.world.hud.InteractiveSlotComponent;
|
||||||
|
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
||||||
|
|
||||||
|
public abstract class ContainerComponent extends Component {
|
||||||
|
|
||||||
|
public ContainerComponent(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract ItemContainer getContainer();
|
||||||
|
|
||||||
|
public abstract Collection<InteractiveSlotComponent> getSlots();
|
||||||
|
|
||||||
|
}
|
@ -15,7 +15,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package ru.windcorp.progressia.client.graphics.world.hud;
|
package ru.windcorp.progressia.client.world.item.inventory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -27,15 +27,19 @@ 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.LayoutBorderHorizontal;
|
||||||
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutBorderVertical;
|
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutBorderVertical;
|
||||||
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutGrid;
|
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutGrid;
|
||||||
|
import ru.windcorp.progressia.client.graphics.world.hud.Bar;
|
||||||
|
import ru.windcorp.progressia.client.graphics.world.hud.HUDWorkspace;
|
||||||
|
import ru.windcorp.progressia.client.graphics.world.hud.InteractiveSlotComponent;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
||||||
|
|
||||||
public class SimpleInventoryComponent extends InventoryComponent {
|
public class ContainerComponentSimple extends ContainerComponent {
|
||||||
|
|
||||||
private final Group slots = new Group("Inventory.Slots", new LayoutGrid(0, 15));
|
private final Group slots = new Group("Inventory.Slots", new LayoutGrid(0, 15));
|
||||||
private final Collection<InteractiveSlotComponent> slotCollection = new ArrayList<>();
|
private final Collection<InteractiveSlotComponent> slotCollection = new ArrayList<>();
|
||||||
|
|
||||||
private final ItemContainer container;
|
private final ItemContainer container;
|
||||||
|
|
||||||
public SimpleInventoryComponent(ItemContainer container, HUDWorkspace workspace) {
|
public ContainerComponentSimple(ItemContainer container, HUDWorkspace workspace) {
|
||||||
super("Inventory");
|
super("Inventory");
|
||||||
this.container = container;
|
this.container = container;
|
||||||
|
|
||||||
@ -80,7 +84,7 @@ public class SimpleInventoryComponent extends InventoryComponent {
|
|||||||
slots.addChild(component.setLayoutHint(pos));
|
slots.addChild(component.setLayoutHint(pos));
|
||||||
slotCollection.add(component);
|
slotCollection.add(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemContainer getContainer() {
|
public ItemContainer getContainer() {
|
||||||
return container;
|
return container;
|
@ -15,21 +15,21 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package ru.windcorp.progressia.client.graphics.world.hud;
|
package ru.windcorp.progressia.client.world.item.inventory;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import ru.windcorp.progressia.client.graphics.gui.Component;
|
import ru.windcorp.progressia.client.graphics.gui.Component;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
import ru.windcorp.progressia.common.world.item.inventory.Inventory;
|
||||||
|
|
||||||
public abstract class InventoryComponent extends Component {
|
public abstract class InventoryComponent extends Component {
|
||||||
|
|
||||||
public InventoryComponent(String name) {
|
public InventoryComponent(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract ItemContainer getContainer();
|
|
||||||
|
|
||||||
public abstract Collection<InteractiveSlotComponent> getSlots();
|
public abstract Inventory getInventory();
|
||||||
|
|
||||||
|
public abstract Collection<? extends ContainerComponent> getContainers();
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.client.world.item.inventory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import ru.windcorp.progressia.client.graphics.gui.layout.LayoutFill;
|
||||||
|
import ru.windcorp.progressia.client.graphics.world.hud.HUDWorkspace;
|
||||||
|
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.Inventory;
|
||||||
|
|
||||||
|
public class InventoryComponentSimple extends InventoryComponent {
|
||||||
|
|
||||||
|
private final Inventory inventory;
|
||||||
|
private final Collection<ContainerComponentSimple> containers = new ArrayList<>();
|
||||||
|
|
||||||
|
public InventoryComponentSimple(String name, Inventory inventory, HUDWorkspace workspace) {
|
||||||
|
super(name);
|
||||||
|
setLayout(new LayoutFill());
|
||||||
|
this.inventory = inventory;
|
||||||
|
|
||||||
|
for (ItemContainer container : inventory.getContainers()) {
|
||||||
|
ContainerComponentSimple component = new ContainerComponentSimple(container, workspace);
|
||||||
|
containers.add(component);
|
||||||
|
addChild(component);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Inventory getInventory() {
|
||||||
|
return inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<? extends ContainerComponent> getContainers() {
|
||||||
|
return containers;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.client.world.item.inventory;
|
||||||
|
|
||||||
|
import ru.windcorp.progressia.client.graphics.world.hud.HUDWorkspace;
|
||||||
|
import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.Inventory;
|
||||||
|
|
||||||
|
public abstract class InventoryRender extends Namespaced {
|
||||||
|
|
||||||
|
public InventoryRender(String id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract InventoryComponent createComponent(Inventory inventory, HUDWorkspace workspace);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.client.world.item.inventory;
|
||||||
|
|
||||||
|
import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry;
|
||||||
|
|
||||||
|
public class InventoryRenderRegistry extends NamespacedInstanceRegistry<InventoryRender> {
|
||||||
|
|
||||||
|
private static final InventoryRenderRegistry INSTANCE = new InventoryRenderRegistry();
|
||||||
|
|
||||||
|
public static InventoryRenderRegistry getInstance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ru.windcorp.progressia.common.state;
|
||||||
|
|
||||||
|
import java.io.DataInput;
|
||||||
|
import java.io.DataOutput;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class BooleanStateField extends StateField {
|
||||||
|
|
||||||
|
public BooleanStateField(
|
||||||
|
String id,
|
||||||
|
boolean isLocal,
|
||||||
|
int index
|
||||||
|
) {
|
||||||
|
super(id, isLocal, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean get(StatefulObject object) {
|
||||||
|
return object.getStorage().getBoolean(getIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNow(StatefulObject object, boolean value) {
|
||||||
|
object.getStorage().setBoolean(getIndex(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(StateChanger changer, boolean value) {
|
||||||
|
changer.setBoolean(this, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(
|
||||||
|
StatefulObject object,
|
||||||
|
DataInput input,
|
||||||
|
IOContext context
|
||||||
|
)
|
||||||
|
throws IOException {
|
||||||
|
object.getStorage().setBoolean(getIndex(), input.readBoolean());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(
|
||||||
|
StatefulObject object,
|
||||||
|
DataOutput output,
|
||||||
|
IOContext context
|
||||||
|
)
|
||||||
|
throws IOException {
|
||||||
|
output.writeBoolean(object.getStorage().getBoolean(getIndex()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void copy(StatefulObject from, StatefulObject to) {
|
||||||
|
setNow(to, get(from));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int computeHashCode(StatefulObject object) {
|
||||||
|
return Boolean.hashCode(get(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean areEqual(StatefulObject a, StatefulObject b) {
|
||||||
|
return get(a) == get(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDefault(StateStorage storage) {
|
||||||
|
storage.setBoolean(getIndex(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -22,10 +22,13 @@ import gnu.trove.map.TIntIntMap;
|
|||||||
import gnu.trove.map.TIntObjectMap;
|
import gnu.trove.map.TIntObjectMap;
|
||||||
import gnu.trove.map.hash.TIntIntHashMap;
|
import gnu.trove.map.hash.TIntIntHashMap;
|
||||||
import gnu.trove.map.hash.TIntObjectHashMap;
|
import gnu.trove.map.hash.TIntObjectHashMap;
|
||||||
|
import gnu.trove.set.TIntSet;
|
||||||
|
import gnu.trove.set.hash.TIntHashSet;
|
||||||
|
|
||||||
public class HashMapStateStorage extends StateStorage {
|
public class HashMapStateStorage extends StateStorage {
|
||||||
|
|
||||||
private final TIntIntMap ints = new TIntIntHashMap();
|
private final TIntIntMap ints = new TIntIntHashMap();
|
||||||
|
private final TIntSet booleans = new TIntHashSet();
|
||||||
private final TIntObjectMap<Object> objects = new TIntObjectHashMap<>();
|
private final TIntObjectMap<Object> objects = new TIntObjectHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -38,6 +41,20 @@ public class HashMapStateStorage extends StateStorage {
|
|||||||
ints.put(index, value);
|
ints.put(index, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getBoolean(int index) {
|
||||||
|
return booleans.contains(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBoolean(int index, boolean value) {
|
||||||
|
if (value) {
|
||||||
|
booleans.add(index);
|
||||||
|
} else {
|
||||||
|
booleans.remove(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getObject(int index) {
|
public Object getObject(int index) {
|
||||||
return objects.get(index);
|
return objects.get(index);
|
||||||
|
@ -85,6 +85,21 @@ public class InspectingStatefulObjectLayout
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class Boolean implements StateFieldBuilder.Boolean {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BooleanStateField build() {
|
||||||
|
return registerField(
|
||||||
|
new BooleanStateField(
|
||||||
|
id,
|
||||||
|
isLocal,
|
||||||
|
fieldIndexCounters.getBooleansThenIncrement()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private class Obj<T> implements StateFieldBuilder.Obj<T> {
|
private class Obj<T> implements StateFieldBuilder.Obj<T> {
|
||||||
|
|
||||||
private final ObjectCodec<T> codec;
|
private final ObjectCodec<T> codec;
|
||||||
@ -123,6 +138,11 @@ public class InspectingStatefulObjectLayout
|
|||||||
return new Int();
|
return new Int();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean ofBoolean() {
|
||||||
|
return new Boolean();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> Obj<T> of(ObjectCodec<T> codec, Supplier<T> defaultValue) {
|
public <T> Obj<T> of(ObjectCodec<T> codec, Supplier<T> defaultValue) {
|
||||||
return new Obj<T>(codec, defaultValue);
|
return new Obj<T>(codec, defaultValue);
|
||||||
|
@ -21,11 +21,13 @@ package ru.windcorp.progressia.common.state;
|
|||||||
public class OptimizedStateStorage extends StateStorage {
|
public class OptimizedStateStorage extends StateStorage {
|
||||||
|
|
||||||
private final int[] ints;
|
private final int[] ints;
|
||||||
|
private final boolean[] booleans;
|
||||||
private final Object[] objects;
|
private final Object[] objects;
|
||||||
|
|
||||||
public OptimizedStateStorage(PrimitiveCounters sizes) {
|
public OptimizedStateStorage(PrimitiveCounters sizes) {
|
||||||
this.ints = new int[sizes.getInts()];
|
this.ints = sizes.getInts() == 0 ? null : new int[sizes.getInts()];
|
||||||
this.objects = new Object[sizes.getObjects()];
|
this.booleans = sizes.getBooleans() == 0 ? null : new boolean[sizes.getBooleans()];
|
||||||
|
this.objects = sizes.getObjects() == 0 ? null : new Object[sizes.getObjects()];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -38,6 +40,16 @@ public class OptimizedStateStorage extends StateStorage {
|
|||||||
ints[index] = value;
|
ints[index] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getBoolean(int index) {
|
||||||
|
return booleans[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBoolean(int index, boolean value) {
|
||||||
|
booleans[index] = value;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getObject(int index) {
|
public Object getObject(int index) {
|
||||||
return objects[index];
|
return objects[index];
|
||||||
|
@ -75,6 +75,16 @@ public class OptimizedStatefulObjectLayout
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean ofBoolean() {
|
||||||
|
return new Boolean() {
|
||||||
|
@Override
|
||||||
|
public BooleanStateField build() {
|
||||||
|
return (BooleanStateField) result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> Obj<T> of(ObjectCodec<T> codec, Supplier<T> defaultValue) {
|
public <T> Obj<T> of(ObjectCodec<T> codec, Supplier<T> defaultValue) {
|
||||||
return new Obj<T>() {
|
return new Obj<T>() {
|
||||||
|
@ -21,6 +21,7 @@ package ru.windcorp.progressia.common.state;
|
|||||||
class PrimitiveCounters {
|
class PrimitiveCounters {
|
||||||
|
|
||||||
private int ints = 0;
|
private int ints = 0;
|
||||||
|
private int booleans = 0;
|
||||||
private int objects = 0;
|
private int objects = 0;
|
||||||
|
|
||||||
public PrimitiveCounters() {
|
public PrimitiveCounters() {
|
||||||
@ -28,6 +29,7 @@ class PrimitiveCounters {
|
|||||||
|
|
||||||
public PrimitiveCounters(PrimitiveCounters copyFrom) {
|
public PrimitiveCounters(PrimitiveCounters copyFrom) {
|
||||||
this.ints = copyFrom.ints;
|
this.ints = copyFrom.ints;
|
||||||
|
this.booleans = copyFrom.booleans;
|
||||||
this.objects = copyFrom.objects;
|
this.objects = copyFrom.objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,6 +41,14 @@ class PrimitiveCounters {
|
|||||||
return this.ints++;
|
return this.ints++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getBooleans() {
|
||||||
|
return booleans;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBooleansThenIncrement() {
|
||||||
|
return this.booleans++;
|
||||||
|
}
|
||||||
|
|
||||||
public int getObjects() {
|
public int getObjects() {
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ package ru.windcorp.progressia.common.state;
|
|||||||
public interface StateChanger {
|
public interface StateChanger {
|
||||||
|
|
||||||
void setInt(IntStateField field, int value);
|
void setInt(IntStateField field, int value);
|
||||||
|
void setBoolean(BooleanStateField field, boolean value);
|
||||||
<T> void setObject(ObjectStateField<T> field, T value);
|
<T> void setObject(ObjectStateField<T> field, T value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,12 +29,18 @@ public interface StateFieldBuilder {
|
|||||||
IntStateField build();
|
IntStateField build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static interface Boolean {
|
||||||
|
BooleanStateField build();
|
||||||
|
}
|
||||||
|
|
||||||
public static interface Obj<T> {
|
public static interface Obj<T> {
|
||||||
ObjectStateField<T> build();
|
ObjectStateField<T> build();
|
||||||
}
|
}
|
||||||
|
|
||||||
Int ofInt();
|
Int ofInt();
|
||||||
|
|
||||||
|
Boolean ofBoolean();
|
||||||
|
|
||||||
<T> Obj<T> of(ObjectCodec<T> codec, Supplier<T> defaultValue);
|
<T> Obj<T> of(ObjectCodec<T> codec, Supplier<T> defaultValue);
|
||||||
|
|
||||||
default <T> Obj<T> of(Class<T> clazz, Supplier<T> defaultValue) {
|
default <T> Obj<T> of(Class<T> clazz, Supplier<T> defaultValue) {
|
||||||
|
@ -24,6 +24,10 @@ public abstract class StateStorage {
|
|||||||
|
|
||||||
public abstract void setInt(int index, int value);
|
public abstract void setInt(int index, int value);
|
||||||
|
|
||||||
|
public abstract boolean getBoolean(int index);
|
||||||
|
|
||||||
|
public abstract void setBoolean(int index, boolean value);
|
||||||
|
|
||||||
public abstract Object getObject(int index);
|
public abstract Object getObject(int index);
|
||||||
|
|
||||||
public abstract void setObject(int index, Object object);
|
public abstract void setObject(int index, Object object);
|
||||||
|
@ -17,17 +17,26 @@
|
|||||||
*/
|
*/
|
||||||
package ru.windcorp.progressia.common.world.entity;
|
package ru.windcorp.progressia.common.world.entity;
|
||||||
|
|
||||||
|
import com.google.common.eventbus.EventBus;
|
||||||
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
|
||||||
import ru.windcorp.progressia.common.state.IntStateField;
|
import ru.windcorp.progressia.common.state.IntStateField;
|
||||||
import ru.windcorp.progressia.common.state.ObjectStateField;
|
import ru.windcorp.progressia.common.state.ObjectStateField;
|
||||||
|
import ru.windcorp.progressia.common.util.crash.ReportingEventBus;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemContainerEquipment;
|
import ru.windcorp.progressia.common.world.item.ItemContainerEquipment;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemContainerHand;
|
import ru.windcorp.progressia.common.world.item.ItemContainerHand;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.InventoryClosingEvent;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.InventoryOpenedEvent;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.InventoryUser;
|
||||||
|
|
||||||
public class EntityDataPlayer extends EntityData {
|
public class EntityDataPlayer extends EntityData implements InventoryUser {
|
||||||
|
|
||||||
private final ObjectStateField<SpeciesDatalet> speciesDatalet = field("Core:SpeciesDatalet").setShared()
|
private final ObjectStateField<SpeciesDatalet> speciesDatalet = field("Core:SpeciesDatalet").setShared()
|
||||||
.of(SpeciesDataRegistry.getInstance().getCodec()).build();
|
.of(SpeciesDataRegistry.getInstance().getCodec()).build();
|
||||||
|
|
||||||
private final IntStateField selectedHand = field("Core:SelectedHand").setShared().ofInt().build();
|
private final IntStateField selectedHand = field("Core:SelectedHand").setShared().ofInt().build();
|
||||||
|
|
||||||
|
private final EventBus eventBus = ReportingEventBus.create("EntityDataPlayer");
|
||||||
|
|
||||||
public EntityDataPlayer(String id, SpeciesData species) {
|
public EntityDataPlayer(String id, SpeciesData species) {
|
||||||
super(id);
|
super(id);
|
||||||
@ -71,5 +80,23 @@ public class EntityDataPlayer extends EntityData {
|
|||||||
public ItemContainerHand getSelectedHand() {
|
public ItemContainerHand getSelectedHand() {
|
||||||
return getHand(getSelectedHandIndex());
|
return getHand(getSelectedHandIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
private void onInventoryOpened(InventoryOpenedEvent event) {
|
||||||
|
eventBus.post(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
private void onInventoryClosed(InventoryClosingEvent event) {
|
||||||
|
eventBus.post(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void subscribe(Object listener) {
|
||||||
|
eventBus.register(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsubscribe(Object listener) {
|
||||||
|
eventBus.unregister(listener);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import java.util.function.Consumer;
|
|||||||
|
|
||||||
import ru.windcorp.progressia.common.state.Encodable;
|
import ru.windcorp.progressia.common.state.Encodable;
|
||||||
import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.Inventory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A collection of {@link ItemSlot}s representing a single storage unit. A
|
* A collection of {@link ItemSlot}s representing a single storage unit. A
|
||||||
@ -34,10 +35,20 @@ import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
|||||||
* through <i>n</i> - 1.
|
* through <i>n</i> - 1.
|
||||||
*/
|
*/
|
||||||
public abstract class ItemContainer extends Namespaced implements Encodable, Iterable<ItemSlot> {
|
public abstract class ItemContainer extends Namespaced implements Encodable, Iterable<ItemSlot> {
|
||||||
|
|
||||||
|
private Inventory inventory;
|
||||||
|
|
||||||
public ItemContainer(String id) {
|
public ItemContainer(String id) {
|
||||||
super(id);
|
super(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Inventory getInventory() {
|
||||||
|
return inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInventory(Inventory inventory) {
|
||||||
|
this.inventory = inventory;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the slot with the given index.
|
* Retrieves the slot with the given index.
|
||||||
|
@ -18,18 +18,21 @@
|
|||||||
package ru.windcorp.progressia.common.world.item;
|
package ru.windcorp.progressia.common.world.item;
|
||||||
|
|
||||||
import ru.windcorp.progressia.common.state.ObjectStateField;
|
import ru.windcorp.progressia.common.state.ObjectStateField;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.InventorySimple;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.InventoryUser;
|
||||||
|
|
||||||
public class ItemDataContainer extends ItemData {
|
public class ItemDataContainer extends ItemData {
|
||||||
|
|
||||||
private final ObjectStateField<ItemContainer> container = field("Core:Contents").def(this::createContainer).build();
|
private final ObjectStateField<InventorySimple> inventory = field("Core:Contents").setShared().def(this::createInventory)
|
||||||
|
.build();
|
||||||
|
|
||||||
private final float ownMass;
|
private final float ownMass;
|
||||||
private final float containerMassLimit;
|
private final float containerMassLimit;
|
||||||
|
|
||||||
private final float ownVolume;
|
private final float ownVolume;
|
||||||
private final float containerVolumeLimit;
|
private final float containerVolumeLimit;
|
||||||
private final boolean containerContributesVolume;
|
private final boolean containerContributesVolume;
|
||||||
|
|
||||||
public ItemDataContainer(
|
public ItemDataContainer(
|
||||||
String id,
|
String id,
|
||||||
float ownMass,
|
float ownMass,
|
||||||
@ -46,27 +49,49 @@ public class ItemDataContainer extends ItemData {
|
|||||||
this.containerContributesVolume = containerContributesVolume;
|
this.containerContributesVolume = containerContributesVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ItemContainer createContainer() {
|
protected InventorySimple createInventory() {
|
||||||
return new ItemContainerMixedSimple(getId(), containerMassLimit, containerVolumeLimit, 10);
|
return new InventorySimple(
|
||||||
|
getId(),
|
||||||
|
new ItemContainerMixedSimple(getId(), containerMassLimit, containerVolumeLimit, 10)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemContainer getContainer() {
|
public InventorySimple getInventory() {
|
||||||
return container.get(this);
|
return inventory.get(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canOpenContainer() {
|
public boolean isOpen() {
|
||||||
|
return !getInventory().getUsers().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canOpen(InventoryUser user) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized InventorySimple open(InventoryUser user) {
|
||||||
|
if (isOpen()) {
|
||||||
|
return null;
|
||||||
|
} else if (!canOpen(user)) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
getInventory().open(user);
|
||||||
|
return getInventory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void close() {
|
||||||
|
getInventory().closeAll();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getMass() {
|
public float getMass() {
|
||||||
return ownMass + getContainer().getMass();
|
return ownMass + getInventory().getMass();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getVolume() {
|
public float getVolume() {
|
||||||
if (containerContributesVolume) {
|
if (containerContributesVolume) {
|
||||||
return ownVolume + getContainer().getVolume();
|
return ownVolume + getInventory().getVolume();
|
||||||
} else {
|
} else {
|
||||||
return ownVolume;
|
return ownVolume;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.common.world.item.inventory;
|
||||||
|
|
||||||
|
import java.io.DataInput;
|
||||||
|
import java.io.DataOutput;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import com.google.common.eventbus.EventBus;
|
||||||
|
|
||||||
|
import ru.windcorp.progressia.common.state.Encodable;
|
||||||
|
import ru.windcorp.progressia.common.state.IOContext;
|
||||||
|
import ru.windcorp.progressia.common.util.crash.ReportingEventBus;
|
||||||
|
import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
||||||
|
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
||||||
|
|
||||||
|
public class Inventory extends Namespaced implements Encodable {
|
||||||
|
|
||||||
|
private final ItemContainer[] containers;
|
||||||
|
private final List<InventoryUser> users = new ArrayList<>();
|
||||||
|
|
||||||
|
private EventBus eventBus = null;
|
||||||
|
|
||||||
|
public Inventory(String id, ItemContainer... containers) {
|
||||||
|
super(id);
|
||||||
|
this.containers = containers;
|
||||||
|
for (ItemContainer container : containers) {
|
||||||
|
container.setInventory(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void open(InventoryUser user) {
|
||||||
|
users.add(user);
|
||||||
|
subscribe(user);
|
||||||
|
eventBus.post(new InventoryOpenedEvent(this, user));
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void close(InventoryUser user) {
|
||||||
|
if (eventBus != null) {
|
||||||
|
eventBus.post(new InventoryClosingEvent(this, user));
|
||||||
|
}
|
||||||
|
|
||||||
|
users.remove(user);
|
||||||
|
unsubscribe(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void subscribe(Object listener) {
|
||||||
|
if (eventBus == null) {
|
||||||
|
eventBus = ReportingEventBus.create("Inventory " + getId());
|
||||||
|
}
|
||||||
|
eventBus.register(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void unsubscribe(Object listener) {
|
||||||
|
if (eventBus == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
eventBus.unregister(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized boolean isUser(InventoryUser user) {
|
||||||
|
return users.contains(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void forEachUser(Consumer<? super InventoryUser> action) {
|
||||||
|
users.forEach(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<InventoryUser> getUsers() {
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void closeAll() {
|
||||||
|
while (!users.isEmpty()) {
|
||||||
|
close(users.get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemContainer[] getContainers() {
|
||||||
|
return containers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized float getMass() {
|
||||||
|
float sum = 0;
|
||||||
|
for (ItemContainer container : containers) {
|
||||||
|
sum += container.getMass();
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized float getVolume() {
|
||||||
|
float sum = 0;
|
||||||
|
for (ItemContainer container : containers) {
|
||||||
|
sum += container.getVolume();
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void read(DataInput input, IOContext context) throws IOException {
|
||||||
|
for (ItemContainer container : containers) {
|
||||||
|
container.read(input, context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void write(DataOutput output, IOContext context) throws IOException {
|
||||||
|
for (ItemContainer container : containers) {
|
||||||
|
container.write(output, context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void copy(Encodable destination) {
|
||||||
|
Inventory inventory = (Inventory) destination;
|
||||||
|
assert inventory.containers.length == containers.length;
|
||||||
|
for (int i = 0; i < containers.length; ++i) {
|
||||||
|
containers[i].copy(inventory.containers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.common.world.item.inventory;
|
||||||
|
|
||||||
|
public class InventoryClosingEvent extends InventoryEvent {
|
||||||
|
|
||||||
|
private final InventoryUser closingUser;
|
||||||
|
|
||||||
|
public InventoryClosingEvent(Inventory inventory, InventoryUser closingUser) {
|
||||||
|
super(inventory);
|
||||||
|
this.closingUser = closingUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryUser getClosingUser() {
|
||||||
|
return closingUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.common.world.item.inventory;
|
||||||
|
|
||||||
|
public abstract class InventoryEvent {
|
||||||
|
|
||||||
|
private final Inventory inventory;
|
||||||
|
|
||||||
|
public InventoryEvent(Inventory inventory) {
|
||||||
|
this.inventory = inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the inventory
|
||||||
|
*/
|
||||||
|
public Inventory getInventory() {
|
||||||
|
return inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.common.world.item.inventory;
|
||||||
|
|
||||||
|
public class InventoryOpenedEvent extends InventoryEvent {
|
||||||
|
|
||||||
|
private final InventoryUser newUser;
|
||||||
|
|
||||||
|
public InventoryOpenedEvent(Inventory inventory, InventoryUser newUser) {
|
||||||
|
super(inventory);
|
||||||
|
this.newUser = newUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the newUser
|
||||||
|
*/
|
||||||
|
public InventoryUser getNewUser() {
|
||||||
|
return newUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.common.world.item.inventory;
|
||||||
|
|
||||||
|
import ru.windcorp.progressia.common.world.item.ItemContainer;
|
||||||
|
|
||||||
|
public class InventorySimple extends Inventory {
|
||||||
|
|
||||||
|
public InventorySimple(String id, ItemContainer container) {
|
||||||
|
super(id, container);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemContainer getContainer() {
|
||||||
|
return getContainers()[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ru.windcorp.progressia.common.world.item.inventory;
|
||||||
|
|
||||||
|
public interface InventoryUser {
|
||||||
|
|
||||||
|
default void open(Inventory inventory) {
|
||||||
|
inventory.open(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
default void close(Inventory inventory) {
|
||||||
|
inventory.close(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
default boolean isUsing(Inventory inventory) {
|
||||||
|
return inventory.isUser(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -36,6 +36,7 @@ import ru.windcorp.progressia.client.comms.controls.*;
|
|||||||
import ru.windcorp.progressia.client.graphics.input.KeyEvent;
|
import ru.windcorp.progressia.client.graphics.input.KeyEvent;
|
||||||
import ru.windcorp.progressia.client.graphics.input.KeyMatcher;
|
import ru.windcorp.progressia.client.graphics.input.KeyMatcher;
|
||||||
import ru.windcorp.progressia.client.graphics.world.Selection;
|
import ru.windcorp.progressia.client.graphics.world.Selection;
|
||||||
|
import ru.windcorp.progressia.client.graphics.world.hud.HUDWorkspace;
|
||||||
import ru.windcorp.progressia.client.world.block.*;
|
import ru.windcorp.progressia.client.world.block.*;
|
||||||
import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerRegistry;
|
import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerRegistry;
|
||||||
import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSimple;
|
import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSimple;
|
||||||
@ -44,6 +45,10 @@ import ru.windcorp.progressia.client.world.entity.*;
|
|||||||
import ru.windcorp.progressia.client.world.item.ItemRender;
|
import ru.windcorp.progressia.client.world.item.ItemRender;
|
||||||
import ru.windcorp.progressia.client.world.item.ItemRenderRegistry;
|
import ru.windcorp.progressia.client.world.item.ItemRenderRegistry;
|
||||||
import ru.windcorp.progressia.client.world.item.ItemRenderSimple;
|
import ru.windcorp.progressia.client.world.item.ItemRenderSimple;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryComponent;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryComponentSimple;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryRender;
|
||||||
|
import ru.windcorp.progressia.client.world.item.inventory.InventoryRenderRegistry;
|
||||||
import ru.windcorp.progressia.client.world.tile.*;
|
import ru.windcorp.progressia.client.world.tile.*;
|
||||||
import ru.windcorp.progressia.common.Units;
|
import ru.windcorp.progressia.common.Units;
|
||||||
import ru.windcorp.progressia.common.collision.CollisionModel;
|
import ru.windcorp.progressia.common.collision.CollisionModel;
|
||||||
@ -57,6 +62,7 @@ import ru.windcorp.progressia.common.world.item.ItemData;
|
|||||||
import ru.windcorp.progressia.common.world.item.ItemDataContainer;
|
import ru.windcorp.progressia.common.world.item.ItemDataContainer;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemDataRegistry;
|
import ru.windcorp.progressia.common.world.item.ItemDataRegistry;
|
||||||
import ru.windcorp.progressia.common.world.item.ItemDataSimple;
|
import ru.windcorp.progressia.common.world.item.ItemDataSimple;
|
||||||
|
import ru.windcorp.progressia.common.world.item.inventory.Inventory;
|
||||||
import ru.windcorp.progressia.common.world.rels.AbsFace;
|
import ru.windcorp.progressia.common.world.rels.AbsFace;
|
||||||
import ru.windcorp.progressia.common.world.tile.*;
|
import ru.windcorp.progressia.common.world.tile.*;
|
||||||
import ru.windcorp.progressia.server.Server;
|
import ru.windcorp.progressia.server.Server;
|
||||||
@ -258,6 +264,7 @@ public class TestContent {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
register(new ItemRenderSimple("Test:CardboardBackpack", getItemTexture("CardboardBackpack")));
|
register(new ItemRenderSimple("Test:CardboardBackpack", getItemTexture("CardboardBackpack")));
|
||||||
|
registerSimplestInventory("Test:CardboardBackpack");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void registerSimplestBlock(String name) {
|
private static void registerSimplestBlock(String name) {
|
||||||
@ -301,6 +308,15 @@ public class TestContent {
|
|||||||
register(new TestEntityRenderStatie("Test:Statie"));
|
register(new TestEntityRenderStatie("Test:Statie"));
|
||||||
register(new TestEntityLogicStatie("Test:Statie"));
|
register(new TestEntityLogicStatie("Test:Statie"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void registerSimplestInventory(String id) {
|
||||||
|
InventoryRenderRegistry.getInstance().register(new InventoryRender(id) {
|
||||||
|
@Override
|
||||||
|
public InventoryComponent createComponent(Inventory inventory, HUDWorkspace workspace) {
|
||||||
|
return new InventoryComponentSimple(id, inventory, workspace);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private static void registerPlayer() {
|
private static void registerPlayer() {
|
||||||
SpeciesData human = new SpeciesDataHuman("Core:Human");
|
SpeciesData human = new SpeciesDataHuman("Core:Human");
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 1011 B |
Reference in New Issue
Block a user