From 8ca49867142cbe951de9255e0da067f17f865e25 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Tue, 24 Mar 2020 15:29:41 -0400 Subject: [PATCH] 1.2.6 Fix Potential Client-Server De-sync Bug --- CHANGELOG.md | 3 ++ gradle.properties | 2 +- .../client/gui/CastingTableScreen.java | 11 ++++++-- .../gui/CastingTableScreenHandler.java | 8 ++++-- .../mixin/MixinClientPlayNetworkHandler.java | 1 + .../mixin/MixinClientPlayerEntity.java | 28 +++++++++++++++++++ .../mixin/MixinServerPlayerEntity.java | 3 ++ .../packet/UpdateKnownSpellsS2CPacket.java | 3 ++ src/main/resources/sorcerycraft.mixins.json | 5 ++-- 9 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayerEntity.java diff --git a/CHANGELOG.md b/CHANGELOG.md index cdd00fe..c9ac3cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +**1.2.6** +* Fix Potential Client-Server De-sync Bug + **1.2.5** * Fix Casting Table Bug diff --git a/gradle.properties b/gradle.properties index a27b7c8..260ede2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs = -Xmx1G fabric_loader_version = 0.7.8+build.189 # Mod Properties - mod_version = 1.2.5 + mod_version = 1.2.6 maven_group = com.thebrokenrail archives_base_name = sorcerycraft diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/client/gui/CastingTableScreen.java b/src/main/java/com/thebrokenrail/sorcerycraft/client/gui/CastingTableScreen.java index 7e4144f..26f12ba 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/client/gui/CastingTableScreen.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/client/gui/CastingTableScreen.java @@ -21,9 +21,9 @@ import net.minecraft.util.math.MathHelper; @Environment(EnvType.CLIENT) public class CastingTableScreen extends HandledScreen { private static final Identifier TEXTURE = new Identifier("textures/gui/container/villager2.png"); - private int selectedIndex; - private int indexStartOffset; - private boolean scrolling; + private int selectedIndex = 0; + private int indexStartOffset = 0; + private boolean scrolling = false; public CastingTableScreen(CastingTableScreenHandler container, PlayerInventory inventory, Text title) { super(container, inventory, title); @@ -40,6 +40,11 @@ public class CastingTableScreen extends HandledScreen renderXPCost(); } + public void resetIndex() { + selectedIndex = 0; + indexStartOffset = 0; + } + @Override protected void drawBackground(float delta, int mouseX, int mouseY) { RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/gui/CastingTableScreenHandler.java b/src/main/java/com/thebrokenrail/sorcerycraft/gui/CastingTableScreenHandler.java index 432795f..7fca86d 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/gui/CastingTableScreenHandler.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/gui/CastingTableScreenHandler.java @@ -109,6 +109,11 @@ public class CastingTableScreenHandler extends ScreenHandler { } } + private void resetIndex() { + index = 0; + onContentChanged(inventory); + } + public void setSpells(PlayerEntity player) { if (player.isCreative() ? SorceryCraft.getConfig().limitCastingTable.creative : SorceryCraft.getConfig().limitCastingTable.survival) { SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player; @@ -125,8 +130,7 @@ public class CastingTableScreenHandler extends ScreenHandler { } else { spells = SpellRegistry.getSpells(); } - index = 0; - onContentChanged(inventory); + resetIndex(); } public boolean canTakeResult(PlayerEntity playerEntity) { diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java index 7ee8ed2..24a27e2 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java @@ -16,6 +16,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @SuppressWarnings("unused") +@Environment(EnvType.CLIENT) @Mixin(ClientPlayNetworkHandler.class) public class MixinClientPlayNetworkHandler { @Shadow diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayerEntity.java b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayerEntity.java new file mode 100644 index 0000000..36a6a00 --- /dev/null +++ b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayerEntity.java @@ -0,0 +1,28 @@ +package com.thebrokenrail.sorcerycraft.mixin; + +import com.thebrokenrail.sorcerycraft.client.gui.CastingTableScreen; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +@SuppressWarnings("unused") +@Mixin(ClientPlayerEntity.class) +@Environment(EnvType.CLIENT) +public class MixinClientPlayerEntity extends MixinPlayerEntity { + @Shadow @Final protected MinecraftClient client; + + @Override + public void setDiscoveredSpells(Map spells) { + super.setDiscoveredSpells(spells); + if (client.currentScreen instanceof CastingTableScreen) { + ((CastingTableScreen) client.currentScreen).resetIndex(); + } + } +} diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinServerPlayerEntity.java b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinServerPlayerEntity.java index c952165..21d6556 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinServerPlayerEntity.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinServerPlayerEntity.java @@ -5,6 +5,8 @@ import com.thebrokenrail.sorcerycraft.packet.UpdateKnownSpellsS2CPacket; import com.thebrokenrail.sorcerycraft.spell.util.SpellHelper; import com.thebrokenrail.sorcerycraft.spell.util.SpellPlayerEntity; import com.thebrokenrail.sorcerycraft.spell.util.SpellServerPlayerEntity; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; @@ -16,6 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Map; @SuppressWarnings("unused") +@Environment(EnvType.SERVER) @Mixin(ServerPlayerEntity.class) public abstract class MixinServerPlayerEntity extends MixinPlayerEntity implements SpellServerPlayerEntity { @Inject(at = @At("HEAD"), method = "copyFrom") diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/packet/UpdateKnownSpellsS2CPacket.java b/src/main/java/com/thebrokenrail/sorcerycraft/packet/UpdateKnownSpellsS2CPacket.java index 5ff6e8b..66a88c7 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/packet/UpdateKnownSpellsS2CPacket.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/packet/UpdateKnownSpellsS2CPacket.java @@ -4,6 +4,8 @@ import com.thebrokenrail.sorcerycraft.SorceryCraft; import com.thebrokenrail.sorcerycraft.spell.util.SpellPlayerEntity; import com.thebrokenrail.sorcerycraft.spell.util.SpellHelper; import io.netty.buffer.Unpooled; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.network.PacketContext; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.PacketByteBuf; @@ -12,6 +14,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; public class UpdateKnownSpellsS2CPacket { + @Environment(EnvType.CLIENT) public static void handle(PacketContext context, PacketByteBuf bytes) { CompoundTag tag = bytes.readCompoundTag(); if (context.getPlayer() != null) { diff --git a/src/main/resources/sorcerycraft.mixins.json b/src/main/resources/sorcerycraft.mixins.json index b828f46..3738b86 100644 --- a/src/main/resources/sorcerycraft.mixins.json +++ b/src/main/resources/sorcerycraft.mixins.json @@ -6,9 +6,10 @@ "MixinClientPlayNetworkHandler" ], "mixins": [ + "CriterionRegistryHook", + "MixinClientPlayerEntity", "MixinPlayerEntity", - "MixinServerPlayerEntity", - "CriterionRegistryHook" + "MixinServerPlayerEntity" ], "injectors": { "defaultRequire": 1