From 94ceb63a1fb40b3d622f8d7373ed569f26e25078 Mon Sep 17 00:00:00 2001 From: Wynd Date: Sun, 18 Aug 2024 21:07:55 +0300 Subject: [PATCH] Furnace minecarts pushing other minecarts and excess fuel dropping from them --- .../xyz/pixelatedw/finalbeta/ModConfig.java | 2 ++ .../xyz/pixelatedw/finalbeta/WyHelper.java | 4 +++ .../finalbeta/mixin/MinecartMixin.java | 31 ++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java b/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java index 02a83c6..cb49421 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/ModConfig.java @@ -44,6 +44,8 @@ public class ModConfig { "Maximum allowed speed for minecarts\nVanilla default is 0.4"); public static final Option MINECART_POWERED_BOOST = make("Powered rails speed boost", 1.15, "Extra speed modifier when minecarts go over powered rails\nVanilla default is 1.0"); + public static final Option FURNACE_MINECART_PUSH = make("Enable furnace minecarts push", true, + "Enables furance minecarts to push forward the first minecart it comes in contact with"); public static final Option FIX_BOW_MODEL = make("Fix bow model", true, "Makes the box model held by players and skeletons bigger and facing forward"); diff --git a/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java b/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java index a08cf21..e182734 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java @@ -86,6 +86,10 @@ public class WyHelper { public static float clamp(float val, float min, float max) { return val < min ? min : Math.min(val, max); } + + public static int clamp(int val, int min, int max) { + return val < min ? min : Math.min(val, max); + } public static void cheatCommand(Player player) { // player.dropItem(new ItemInstance(Tile.LADDER, 64)); diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecartMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecartMixin.java index 5a36102..519729f 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecartMixin.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecartMixin.java @@ -12,6 +12,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.Minecart; import net.minecraft.entity.projectile.Arrow; +import net.minecraft.item.ItemType; import net.minecraft.tile.RailTile; import net.minecraft.util.maths.Box; import net.minecraft.util.maths.MathsHelper; @@ -23,7 +24,26 @@ public class MinecartMixin { private static final double EXTRA_MINECART_XZ_SIZE = 0.4; private static final double EXTRA_MINECART_Y_SIZE = 0.0; - + private static final int COAL_FUEL = 1200; + + @Inject(method = "damage", at = @At("HEAD")) + public void onDamage(Entity entity, int damage, CallbackInfoReturnable ci) { + Minecart minecart = ((Minecart) (Object) this); + if (!minecart.level.isClient && minecart.type == 2) { + int coal = minecart.fuel / COAL_FUEL; + if (coal > 0) { + while (coal > 0) { + if (coal < 64) { + minecart.dropItem(ItemType.coal.id, coal, 0.0F); + break; + } + minecart.dropItem(ItemType.coal.id, 64, 0.0F); + coal -= 64; + } + } + } + } + @Inject(method = "method_1379", at = @At("HEAD"), cancellable = true) public void onCollision(Entity other, CallbackInfoReturnable ci) { if (ModConfig.FIX_MINECART_STOPPING_ON_ITEMS.get()) { @@ -31,6 +51,15 @@ public class MinecartMixin { ci.setReturnValue(null); } } + + if (ModConfig.FURNACE_MINECART_PUSH.get()) { + Minecart minecart = ((Minecart) (Object) this); + if (minecart.type == 2 && other instanceof Minecart) { + Minecart otherMinecart = (Minecart) other; + otherMinecart.velocityX = minecart.pushX * 1.02; + otherMinecart.velocityZ = minecart.pushZ * 1.02; + } + } } @ModifyConstant(method = "tick", constant = @Constant(doubleValue = 0.4))