From fd42b120d9dc4845f55e920e49fc2bc74506e740 Mon Sep 17 00:00:00 2001 From: Patbox <39821509+Patbox@users.noreply.github.com> Date: Fri, 6 Dec 2024 19:11:34 +0100 Subject: [PATCH] Handle invalid game portals in non-lossy way --- .../impl/portal/GamePortalManager.java | 10 ++++- .../portal/game/InvalidGamePortalBackend.java | 39 +++++++++++++++++++ .../mixin/game/portal/EntityMixin.java | 5 ++- 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/main/java/xyz/nucleoid/plasmid/impl/portal/game/InvalidGamePortalBackend.java diff --git a/src/main/java/xyz/nucleoid/plasmid/impl/portal/GamePortalManager.java b/src/main/java/xyz/nucleoid/plasmid/impl/portal/GamePortalManager.java index 93ac31b9..678b9f9e 100644 --- a/src/main/java/xyz/nucleoid/plasmid/impl/portal/GamePortalManager.java +++ b/src/main/java/xyz/nucleoid/plasmid/impl/portal/GamePortalManager.java @@ -3,6 +3,7 @@ import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import com.mojang.serialization.JsonOps; +import com.mojang.serialization.MapCodec; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.resource.ResourceManager; @@ -12,6 +13,8 @@ import org.jetbrains.annotations.Nullable; import xyz.nucleoid.plasmid.impl.Plasmid; import xyz.nucleoid.plasmid.api.util.TinyRegistry; +import xyz.nucleoid.plasmid.impl.PlasmidConfig; +import xyz.nucleoid.plasmid.impl.portal.game.InvalidGamePortalBackend; import java.io.IOException; import java.util.Collection; @@ -86,7 +89,12 @@ private Map loadConfigs(DynamicRegistryManager reg var json = JsonParser.parseReader(reader); var identifier = identifierFromPath(path); GamePortalConfig.CODEC.parse(ops, json) - .resultOrPartial(error -> Plasmid.LOGGER.error("Failed to parse game portal at {}: {}", path, error)) + .resultOrPartial(error -> { + Plasmid.LOGGER.error("Failed to parse game portal at {}: {}", path, error); + if (PlasmidConfig.get().ignoreInvalidGames()) { + configs.put(identifier, InvalidGamePortalBackend.CONFIG); + } + }) .ifPresent(config -> configs.put(identifier, config)); } } catch (IOException e) { diff --git a/src/main/java/xyz/nucleoid/plasmid/impl/portal/game/InvalidGamePortalBackend.java b/src/main/java/xyz/nucleoid/plasmid/impl/portal/game/InvalidGamePortalBackend.java new file mode 100644 index 00000000..9aeebd60 --- /dev/null +++ b/src/main/java/xyz/nucleoid/plasmid/impl/portal/game/InvalidGamePortalBackend.java @@ -0,0 +1,39 @@ +package xyz.nucleoid.plasmid.impl.portal.game; + +import com.mojang.serialization.MapCodec; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import xyz.nucleoid.plasmid.api.game.config.CustomValuesConfig; +import xyz.nucleoid.plasmid.impl.portal.GamePortalBackend; +import xyz.nucleoid.plasmid.impl.portal.GamePortalConfig; + +public record InvalidGamePortalBackend(Identifier identifier) implements GamePortalBackend { + public static final GamePortalConfig CONFIG = new GamePortalConfig() { + @Override + public GamePortalBackend createBackend(MinecraftServer server, Identifier id) { + return new InvalidGamePortalBackend(id); + } + + @Override + public CustomValuesConfig custom() { + return CustomValuesConfig.empty(); + } + + @Override + public MapCodec codec() { + return MapCodec.unit(this); + } + }; + + @Override + public Text getName() { + return Text.literal("Invalid portal'" + this.identifier + "'"); + } + + @Override + public void applyTo(ServerPlayerEntity player, boolean alt) { + + } +} diff --git a/src/main/java/xyz/nucleoid/plasmid/mixin/game/portal/EntityMixin.java b/src/main/java/xyz/nucleoid/plasmid/mixin/game/portal/EntityMixin.java index ad25108f..df7be049 100644 --- a/src/main/java/xyz/nucleoid/plasmid/mixin/game/portal/EntityMixin.java +++ b/src/main/java/xyz/nucleoid/plasmid/mixin/game/portal/EntityMixin.java @@ -123,8 +123,9 @@ private void removeHologram() { @Inject(method = "tick", at = @At("HEAD")) private void onTick(CallbackInfo ci) { if (this.loadedPortalId != null) { - this.tryConnectTo(this.loadedPortalId); - this.loadedPortalId = null; + if (this.tryConnectTo(this.loadedPortalId)) { + this.loadedPortalId = null; + } } }