From 872d8d33cbe765588d09f0e4f07b490a8c23d22e Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 3 Aug 2020 14:46:39 +0200 Subject: [PATCH] Clean up global state for cable render mode (#4539) * Clean up the global state used to hack part interaction into respecting the player's facade render mode. Make the name more indicative of what is actually happening. * Fun. --- src/main/java/appeng/client/ClientHelper.java | 6 ++-- src/main/java/appeng/core/CommonHelper.java | 12 ++++++-- src/main/java/appeng/core/api/ApiPart.java | 2 +- .../appeng/core/api/definitions/ApiItems.java | 5 ++-- .../sync/packets/PartPlacementPacket.java | 15 ++++++---- src/main/java/appeng/parts/PartPlacement.java | 11 ++++---- src/main/java/appeng/server/ServerHelper.java | 28 ++++++++++++------- 7 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 50d0efbb0..054428bf5 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -138,15 +138,15 @@ public class ClientHelper extends ServerHelper { } @Override - public CableRenderMode getRenderMode() { + public CableRenderMode getCableRenderMode() { if (Platform.isServer()) { - return super.getRenderMode(); + return super.getCableRenderMode(); } final Minecraft mc = Minecraft.getInstance(); final PlayerEntity player = mc.player; - return this.renderModeForPlayer(player); + return this.getCableRenderModeForPlayer(player); } @Override diff --git a/src/main/java/appeng/core/CommonHelper.java b/src/main/java/appeng/core/CommonHelper.java index 773612f12..f91fd7448 100644 --- a/src/main/java/appeng/core/CommonHelper.java +++ b/src/main/java/appeng/core/CommonHelper.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Random; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import net.minecraft.client.util.InputMappings; import net.minecraft.entity.player.PlayerEntity; @@ -55,11 +56,18 @@ public abstract class CommonHelper { public abstract void postInit(); - public abstract CableRenderMode getRenderMode(); + public abstract CableRenderMode getCableRenderMode(); public abstract void triggerUpdates(); - public abstract void updateRenderMode(PlayerEntity player); + /** + * Sets the player that is currently interacting with a cable or part attached + * to a cable. This will return that player's cable render mode from calls to + * {@link #getCableRenderMode()}, until another player or null is set. + * + * @param player Null to revert to the default cable render mode. + */ + public abstract void setPartInteractionPlayer(@Nullable PlayerEntity player); public abstract boolean isActionKey(@Nonnull final ActionKey key, InputMappings.Input input); diff --git a/src/main/java/appeng/core/api/ApiPart.java b/src/main/java/appeng/core/api/ApiPart.java index df9d064e1..beb541bcc 100644 --- a/src/main/java/appeng/core/api/ApiPart.java +++ b/src/main/java/appeng/core/api/ApiPart.java @@ -41,6 +41,6 @@ public class ApiPart implements IPartHelper { @Override public CableRenderMode getCableRenderMode() { - return AppEng.proxy.getRenderMode(); + return AppEng.proxy.getCableRenderMode(); } } diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 9aac0c4a5..3ee08e5c1 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -18,13 +18,13 @@ package appeng.core.api.definitions; -import java.awt.*; import java.util.function.Consumer; import net.minecraft.entity.EntityClassification; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemModelsProperties; +import net.minecraft.item.Rarity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -241,7 +241,8 @@ public final class ApiItems implements IItems { .features(AEFeature.NETWORK_TOOL).build(); this.cellCreative = registry.item("creative_storage_cell", CreativeStorageCellItem::new) - .props(props -> props.maxStackSize(1)).features(AEFeature.STORAGE_CELLS, AEFeature.CREATIVE).build(); + .props(props -> props.maxStackSize(1).rarity(Rarity.EPIC)) + .features(AEFeature.STORAGE_CELLS, AEFeature.CREATIVE).build(); this.viewCell = registry.item("view_cell", ViewCellItem::new).props(props -> props.maxStackSize(1)) .features(AEFeature.VIEW_CELL).build(); diff --git a/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java b/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java index 6ba7a1307..5b4005236 100644 --- a/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java +++ b/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java @@ -68,11 +68,14 @@ public class PartPlacementPacket extends BasePacket { @Override public void serverPacketData(final INetworkInfo manager, final PlayerEntity player) { final ServerPlayerEntity sender = (ServerPlayerEntity) player; - AppEng.proxy.updateRenderMode(sender); - PartPlacement.setEyeHeight(this.eyeHeight); - PartPlacement.place(sender.getHeldItem(this.hand), new BlockPos(this.x, this.y, this.z), - Direction.values()[this.face], sender, this.hand, sender.world, - PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0); - AppEng.proxy.updateRenderMode(null); + AppEng.proxy.setPartInteractionPlayer(sender); + try { + PartPlacement.setEyeHeight(this.eyeHeight); + PartPlacement.place(sender.getHeldItem(this.hand), new BlockPos(this.x, this.y, this.z), + Direction.values()[this.face], sender, this.hand, sender.world, + PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0); + } finally { + AppEng.proxy.setPartInteractionPlayer(null); + } } } diff --git a/src/main/java/appeng/parts/PartPlacement.java b/src/main/java/appeng/parts/PartPlacement.java index c592408d4..03c11f960 100644 --- a/src/main/java/appeng/parts/PartPlacement.java +++ b/src/main/java/appeng/parts/PartPlacement.java @@ -330,11 +330,12 @@ public class PartPlacement { } private static SelectedPart selectPart(final PlayerEntity player, final IPartHost host, final Vector3d pos) { - AppEng.proxy.updateRenderMode(player); - final SelectedPart sp = host.selectPart(pos); - AppEng.proxy.updateRenderMode(null); - - return sp; + AppEng.proxy.setPartInteractionPlayer(player); + try { + return host.selectPart(pos); + } finally { + AppEng.proxy.setPartInteractionPlayer(null); + } } public static IFacadePart isFacade(final ItemStack held, final AEPartLocation side) { diff --git a/src/main/java/appeng/server/ServerHelper.java b/src/main/java/appeng/server/ServerHelper.java index 72d37e1b4..d5654eb4d 100644 --- a/src/main/java/appeng/server/ServerHelper.java +++ b/src/main/java/appeng/server/ServerHelper.java @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import javax.annotation.Nullable; + import net.minecraft.client.util.InputMappings; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -46,7 +48,17 @@ import appeng.util.Platform; public class ServerHelper extends CommonHelper { - private PlayerEntity renderModeBased; + /** + * While we process a player-specific part placement/cable interaction packet, + * we need to use that player's transparent-facade mode to understand whether + * the player can see through facades or not. + *

+ * We need to use this method since the collision shape methods do not know + * about the player that the shape is being requested for, so they will call + * {@link #getCableRenderMode()} below, which then will use this field to figure + * out which player it's for. + */ + private final ThreadLocal partInteractionPlayer = new ThreadLocal<>(); @Override public World getWorld() { @@ -112,12 +124,8 @@ public class ServerHelper extends CommonHelper { } @Override - public CableRenderMode getRenderMode() { - if (this.renderModeBased == null) { - return CableRenderMode.STANDARD; - } - - return this.renderModeForPlayer(this.renderModeBased); + public CableRenderMode getCableRenderMode() { + return this.getCableRenderModeForPlayer(partInteractionPlayer.get()); } @Override @@ -126,11 +134,11 @@ public class ServerHelper extends CommonHelper { } @Override - public void updateRenderMode(final PlayerEntity player) { - this.renderModeBased = player; + public void setPartInteractionPlayer(final PlayerEntity player) { + this.partInteractionPlayer.set(player); } - protected CableRenderMode renderModeForPlayer(final PlayerEntity player) { + protected final CableRenderMode getCableRenderModeForPlayer(@Nullable final PlayerEntity player) { if (player != null) { for (int x = 0; x < PlayerInventory.getHotbarSize(); x++) { final ItemStack is = player.inventory.getStackInSlot(x);