From 7857c453f8bd3753d41206b86cfeeeec1e073345 Mon Sep 17 00:00:00 2001 From: Tobias Nett Date: Sun, 8 Aug 2021 17:18:06 +0200 Subject: [PATCH] fix: retrieve character entity within binding In #45 the character entity was cached outside of the binding evaluation. However, it in multiplayer games it can happen that it is `null`, and therefore opening container screens on a connected client fails. This is fixed by retrieving the character entity with each binding evaluation via a common helper method `getPredictedInteractionTarget`. --- .../module/inventory/ui/ContainerScreen.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/terasology/module/inventory/ui/ContainerScreen.java b/src/main/java/org/terasology/module/inventory/ui/ContainerScreen.java index c88395b56..bef599bd5 100644 --- a/src/main/java/org/terasology/module/inventory/ui/ContainerScreen.java +++ b/src/main/java/org/terasology/module/inventory/ui/ContainerScreen.java @@ -14,6 +14,7 @@ import org.terasology.nui.widgets.UILabel; /** + * A UI screen to show a container inventory next to the player's inventory. */ public class ContainerScreen extends CoreScreenLayer { @@ -23,8 +24,6 @@ public class ContainerScreen extends CoreScreenLayer { @In private TranslationSystem i18n; - private InventoryGrid containerInventory; - @Override public void initialise() { InventoryGrid inventory = find("inventory", InventoryGrid.class); @@ -37,19 +36,18 @@ public EntityRef get() { inventory.setCellOffset(10); UILabel containerTitle = find("containerTitle", UILabel.class); - containerInventory = find("container", InventoryGrid.class); + InventoryGrid containerInventory = find("container", InventoryGrid.class); - EntityRef characterEntity = localPlayer.getCharacterEntity(); containerInventory.bindTargetEntity(new ReadOnlyBinding() { @Override public EntityRef get() { - return characterEntity.getComponent(CharacterComponent.class).predictedInteractionTarget; + return getPredictedInteractionTarget(); } }); containerTitle.bindText(new ReadOnlyBinding() { @Override public String get() { - Prefab parentPrefab = characterEntity.getComponent(CharacterComponent.class).predictedInteractionTarget.getParentPrefab(); + Prefab parentPrefab = getPredictedInteractionTarget().getParentPrefab(); DisplayNameComponent displayName = parentPrefab.getComponent(DisplayNameComponent.class); if (displayName != null) { // The display name may contain a translatable string reference, thus we attempt to get the translation. @@ -63,6 +61,14 @@ public String get() { }); } + /** + * Retrieve the predicted interaction target entity for the local player. + */ + private EntityRef getPredictedInteractionTarget() { + EntityRef characterEntity = localPlayer.getCharacterEntity(); + return characterEntity.getComponent(CharacterComponent.class).predictedInteractionTarget; + } + @Override public boolean isModal() { return false;