From 22ab4657d65a883b19bbc5613c18c0c4ae195a37 Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Thu, 7 May 2020 20:17:50 +0200 Subject: MC-126244 Hackfix: Cartographer map trade crash Replaced structure map trade with dummy map around (0,0) to mitigate server crash on large worlds due to poor locateStructure implementation. --- Readme.md | 6 +++ .../re/jag/parquet/mixin/SellMapFactoryMixin.java | 49 ++++++++++++++++++++++ src/main/resources/parquet.mixins.json | 3 +- 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/main/java/re/jag/parquet/mixin/SellMapFactoryMixin.java diff --git a/Readme.md b/Readme.md index aae5531..6c5576b 100644 --- a/Readme.md +++ b/Readme.md @@ -50,3 +50,9 @@ A dispenser pointing into an undyed Shulker Box can apply a color. ### [MC-111534](https://bugs.mojang.com/browse/MC-111534) Stat `minecraft.used:minecraft.firework_rocket` is only incremented, when the rocket is used on the ground, not during elytra flight. + +## "Fixes" + +### [MC-126244](https://bugs.mojang.com/browse/MC-126244) + +Cartographer map trade replaced with dummy map around (0,0) to mitigate server crash in large worlds due to poor implementation of locateStructure. diff --git a/src/main/java/re/jag/parquet/mixin/SellMapFactoryMixin.java b/src/main/java/re/jag/parquet/mixin/SellMapFactoryMixin.java new file mode 100644 index 0000000..7dc536b --- /dev/null +++ b/src/main/java/re/jag/parquet/mixin/SellMapFactoryMixin.java @@ -0,0 +1,49 @@ +package re.jag.parquet.mixin; + +import net.minecraft.entity.Entity; +import net.minecraft.item.FilledMapItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.map.MapIcon; +import net.minecraft.item.map.MapState; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.LiteralText; +import net.minecraft.util.math.BlockPos; +import net.minecraft.village.TradeOffer; +import net.minecraft.village.TradeOffers; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Random; + +@Mixin(targets="net.minecraft.village.TradeOffers$SellMapFactory") +public class SellMapFactoryMixin implements TradeOffers.Factory { + @Shadow + private int price; + @Shadow + private String structure; + @Shadow + private MapIcon.Type iconType; + @Shadow + private int maxUses; + @Shadow + private int experience; + + @Overwrite + public TradeOffer create(Entity entity, Random random) { + if (!(entity.world instanceof ServerWorld)) { + return null; + } else { + ServerWorld serverWorld = (ServerWorld) entity.world; + BlockPos blockPos = new BlockPos(0,0,0); + ItemStack itemStack = FilledMapItem.createMap(serverWorld, blockPos.getX(), blockPos.getZ(), (byte)2, true, true); + FilledMapItem.fillExplorationMap(serverWorld, itemStack); + MapState.addDecorationsTag(itemStack, blockPos, "+", this.iconType); + itemStack.setCustomName(new LiteralText("You shall not crash")); + return new TradeOffer(new ItemStack(Items.EMERALD, this.price), new ItemStack(Items.COMPASS), itemStack, this.maxUses, this.experience, 0.2F); + } + } +} + diff --git a/src/main/resources/parquet.mixins.json b/src/main/resources/parquet.mixins.json index 93d9905..5d809a4 100644 --- a/src/main/resources/parquet.mixins.json +++ b/src/main/resources/parquet.mixins.json @@ -10,7 +10,8 @@ "CommandManagerMixin", "ServerPlayerEntityMixin", "BootstrapMixin", - "FireWorkItemMixin" + "FireWorkItemMixin", + "SellMapFactoryMixin" ], "client": [ ], -- cgit v1.2.3