From c88201413bffe385615a1650884bd4f1ac45b902 Mon Sep 17 00:00:00 2001 From: TheEpicBlock Date: Sat, 2 Jul 2022 16:19:11 +0200 Subject: [PATCH] Optional config value to force PolyMc to take over the int id of blocks --- .../theepicblock/polymc/impl/Config.java | 9 ++++- .../ChunkDeltaUpdateImplementation.java | 36 +++++++++++++++++++ .../WriteRegistryValueImplementation.java | 7 ++-- .../ChunkDeltaUpdateImplementation.java | 2 +- .../WriteRegistryValueImplementation.java | 24 +++++++++++++ src/main/resources/config_update.json | 5 +++ src/main/resources/polymc.mixins.json | 6 ++-- 7 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/dontforceintcontrol/ChunkDeltaUpdateImplementation.java rename src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/{ => dontforceintcontrol}/WriteRegistryValueImplementation.java (82%) rename src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/{ => forceintcontrol}/ChunkDeltaUpdateImplementation.java (98%) create mode 100644 src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/forceintcontrol/WriteRegistryValueImplementation.java diff --git a/src/main/java/io/github/theepicblock/polymc/impl/Config.java b/src/main/java/io/github/theepicblock/polymc/impl/Config.java index b8ff44aa..77491073 100644 --- a/src/main/java/io/github/theepicblock/polymc/impl/Config.java +++ b/src/main/java/io/github/theepicblock/polymc/impl/Config.java @@ -39,12 +39,13 @@ */ @SuppressWarnings({"unused", "MismatchedQueryAndUpdateOfCollection", "JavadocReference"}) public class Config { - public static final int LATEST_VERSION = 9; + public static final int LATEST_VERSION = 10; public MiscConfig misc; private int configVersion; private List disabledMixins; public boolean remapVanillaBlockIds; public boolean enableWizardThreading; + public boolean forceBlockIdIntControl; public int maxPacketsPerSecond; public int getConfigVersion() { @@ -80,6 +81,12 @@ public boolean isMixinAutoDisabled(String mixin) { return FabricLoader.getInstance().isModLoaded("imm_ptl_core"); } + if (mixin.contains("dontforceintcontrol")) { + return !forceBlockIdIntControl; + } else if (mixin.contains("forceintcontrol")) { + return forceBlockIdIntControl; + } + return false; } diff --git a/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/dontforceintcontrol/ChunkDeltaUpdateImplementation.java b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/dontforceintcontrol/ChunkDeltaUpdateImplementation.java new file mode 100644 index 00000000..cfc4fae3 --- /dev/null +++ b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/dontforceintcontrol/ChunkDeltaUpdateImplementation.java @@ -0,0 +1,36 @@ +/* + * PolyMc + * Copyright (C) 2020-2021 TheEpicBlock_TEB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; If not, see . + */ +package io.github.theepicblock.polymc.mixins.block.implementations.dontforceintcontrol; + +import io.github.theepicblock.polymc.impl.Util; +import net.minecraft.block.BlockState; +import net.minecraft.network.packet.s2c.play.ChunkDeltaUpdateS2CPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import xyz.nucleoid.packettweaker.PacketContext; + +@Mixin(ChunkDeltaUpdateS2CPacket.class) +public class ChunkDeltaUpdateImplementation { + @ModifyArg(method = "write", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Block;getRawIdFromState(Lnet/minecraft/block/BlockState;)I")) + public BlockState getRawIdFromStateRedirect(BlockState state) { + var player = PacketContext.get().getTarget(); + var polymap = Util.tryGetPolyMap(player); + return polymap.getClientState(state, player); + } +} diff --git a/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/WriteRegistryValueImplementation.java b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/dontforceintcontrol/WriteRegistryValueImplementation.java similarity index 82% rename from src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/WriteRegistryValueImplementation.java rename to src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/dontforceintcontrol/WriteRegistryValueImplementation.java index 1e738127..df80e73c 100644 --- a/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/WriteRegistryValueImplementation.java +++ b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/dontforceintcontrol/WriteRegistryValueImplementation.java @@ -1,4 +1,4 @@ -package io.github.theepicblock.polymc.mixins.block.implementations; +package io.github.theepicblock.polymc.mixins.block.implementations.dontforceintcontrol; import io.github.theepicblock.polymc.impl.Util; import net.minecraft.block.Block; @@ -18,10 +18,7 @@ private T redirectBlock(T original, IndexedIterable registry) { if (registry == Block.STATE_IDS) { var player = PacketContext.get().getTarget(); var polymap = Util.tryGetPolyMap(player); - int clientStateId = polymap.getClientStateRawId((BlockState)original, player); - - //noinspection unchecked - return (T)Block.STATE_IDS.get(clientStateId); + return (T)polymap.getClientState((BlockState)original, player); } return original; } diff --git a/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/ChunkDeltaUpdateImplementation.java b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/forceintcontrol/ChunkDeltaUpdateImplementation.java similarity index 98% rename from src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/ChunkDeltaUpdateImplementation.java rename to src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/forceintcontrol/ChunkDeltaUpdateImplementation.java index 8c112f3d..00e7c2f1 100644 --- a/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/ChunkDeltaUpdateImplementation.java +++ b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/forceintcontrol/ChunkDeltaUpdateImplementation.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with this program; If not, see . */ -package io.github.theepicblock.polymc.mixins.block.implementations; +package io.github.theepicblock.polymc.mixins.block.implementations.forceintcontrol; import io.github.theepicblock.polymc.impl.Util; import net.minecraft.block.BlockState; diff --git a/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/forceintcontrol/WriteRegistryValueImplementation.java b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/forceintcontrol/WriteRegistryValueImplementation.java new file mode 100644 index 00000000..0eb38b4c --- /dev/null +++ b/src/main/java/io/github/theepicblock/polymc/mixins/block/implementations/forceintcontrol/WriteRegistryValueImplementation.java @@ -0,0 +1,24 @@ +package io.github.theepicblock.polymc.mixins.block.implementations.forceintcontrol; + +import io.github.theepicblock.polymc.impl.Util; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.collection.IndexedIterable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import xyz.nucleoid.packettweaker.PacketContext; + +@Mixin(PacketByteBuf.class) +public class WriteRegistryValueImplementation { + @Redirect(method = "writeRegistryValue", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/collection/IndexedIterable;getRawId(Ljava/lang/Object;)I")) + private int redirectBlock(IndexedIterable instance, T t) { + if (instance == Block.STATE_IDS) { + var player = PacketContext.get().getTarget(); + var polymap = Util.tryGetPolyMap(player); + return polymap.getClientStateRawId((BlockState)t, player); + } + return instance.getRawId(t); + } +} diff --git a/src/main/resources/config_update.json b/src/main/resources/config_update.json index 71e42f9b..47e822a6 100644 --- a/src/main/resources/config_update.json +++ b/src/main/resources/config_update.json @@ -46,5 +46,10 @@ "add": { "maxPacketsPerSecond": 600 } + }, + "10": { + "add": { + "forceBlockIdIntControl": false + } } } \ No newline at end of file diff --git a/src/main/resources/polymc.mixins.json b/src/main/resources/polymc.mixins.json index e2ba6928..6091b4bd 100644 --- a/src/main/resources/polymc.mixins.json +++ b/src/main/resources/polymc.mixins.json @@ -26,14 +26,16 @@ "block.implementations.BedBlockImplementation", "block.implementations.BreakParticleImplementation", "block.implementations.ChunkDataPlayerProvider", - "block.implementations.ChunkDeltaUpdateImplementation", "block.implementations.FallingBlockEntityImplementation", "block.implementations.IdListImplementation", "block.implementations.PaletteBlockPolyImplementation", "block.implementations.TallPlantBreakImplementation", "block.implementations.TrackedDataImplementation", - "block.implementations.WriteRegistryValueImplementation", "block.implementations.ZombieBreakDoorImplementation", + "block.implementations.dontforceintcontrol.ChunkDeltaUpdateImplementation", + "block.implementations.dontforceintcontrol.WriteRegistryValueImplementation", + "block.implementations.forceintcontrol.ChunkDeltaUpdateImplementation", + "block.implementations.forceintcontrol.WriteRegistryValueImplementation", "compat.FabricRegistrySyncDisabler", "compat.immersive_portals.ChunkDataSyncManagerMixin", "entity.DisableCustomEntities",