diff options
-rw-r--r-- | Readme.md | 6 | ||||
-rw-r--r-- | src/main/java/re/jag/parquet/mixin/SellMapFactoryMixin.java | 49 | ||||
-rw-r--r-- | src/main/resources/parquet.mixins.json | 3 |
3 files changed, 57 insertions, 1 deletions
@@ -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": [ ], |