11From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
22From: MidnightTale <
[email protected] >
3- Date: Thu, 24 Jul 2025 05:39:48 +0700
3+ Date: Thu, 24 Jul 2025 06:59:05 +0700
44Subject: [PATCH] Add config for allow disable to spawn boat
55
66
77diff --git a/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java b/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java
8- index 702ca443a746d733ef14e927b7377aa3d31ae61d..b717b74895abd99c7974f92a445fd5d8dbd1debd 100644
8+ index 702ca443a746d733ef14e927b7377aa3d31ae61d..3413c31197f6ffac399a846385d23a00a614c22a 100644
99--- a/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java
1010+++ b/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java
11- @@ -30,14 +30,29 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
11+ @@ -30,22 +30,36 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
1212 double d3 = vec3.z() + direction.getStepZ() * d;
1313 BlockPos blockPos = blockSource.pos().relative(direction);
1414 double d4;
15- + Vec3 spawnLoc;
15+ + Vec3 spawnLoc = null;
16+ +
17+ + // atDeprecated start - Add boat placement on ice
1618 if (serverLevel.getFluidState(blockPos).is(FluidTags.WATER)) {
1719 d4 = 1.0;
1820+ spawnLoc = new Vec3(d1, d2 + d4, d3);
19- + } else if (fun.mntale.atdeprecated.config.AtCoreConfig.DISPENSER_CONFIG.placeBoatOnIce && (direction == Direction.UP || serverLevel.isEmptyBlock(blockPos))) {
20- + BlockPos targetPos = (direction == Direction.UP) ? blockPos.above() : blockPos;
21- + if (isIceType(serverLevel, targetPos.below())) {
22- + spawnLoc = Vec3.atCenterOf(targetPos.below()).add(0, 0.6, 0);
23- + } else if (direction == Direction.UP && isIceType(serverLevel, targetPos)) {
24- + spawnLoc = Vec3.atCenterOf(targetPos).add(0, 1.1, 0);
25- + } else {
26- + if (!serverLevel.getBlockState(blockPos).isAir() || !serverLevel.getFluidState(blockPos.below()).is(FluidTags.WATER)) {
21+ + } else if (fun.mntale.atdeprecated.config.AtCoreConfig.DISPENSER_CONFIG.placeBoatOnIce) {
22+ + spawnLoc = this.tryPlaceBoatOnIce(serverLevel, direction, blockPos);
23+ + if (spawnLoc == null) {
24+ + if (!serverLevel.getBlockState(blockPos).canBeReplaced() || !serverLevel.getFluidState(blockPos.below()).is(FluidTags.WATER)) { // atDeprecated - Allow non-solid blocks
2725+ return this.defaultDispenseItemBehavior.dispense(blockSource, item);
2826+ }
2927+ d4 = 0.0;
3028+ spawnLoc = new Vec3(d1, d2 + d4, d3);
3129+ }
3230 } else {
33- if (!serverLevel.getBlockState(blockPos).isAir() || !serverLevel.getFluidState(blockPos.below()).is(FluidTags.WATER)) {
31+ - if (!serverLevel.getBlockState(blockPos).isAir() || !serverLevel.getFluidState(blockPos.below()).is(FluidTags.WATER)) {
32+ + if (!serverLevel.getBlockState(blockPos).canBeReplaced() || !serverLevel.getFluidState(blockPos.below()).is(FluidTags.WATER)) { // atDeprecated - Allow non-solid blocks
3433 return this.defaultDispenseItemBehavior.dispense(blockSource, item);
3534 }
3635-
3736 d4 = 0.0;
3837+ spawnLoc = new Vec3(d1, d2 + d4, d3);
3938 }
39+ + // atDeprecated end
4040
4141 // CraftBukkit start
42- @@ -45,7 +60,7 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
42+ ItemStack singleItemStack = item.copyWithCount(1);
4343 org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(serverLevel, blockSource.pos());
4444 org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(singleItemStack);
4545
@@ -48,16 +48,53 @@ index 702ca443a746d733ef14e927b7377aa3d31ae61d..b717b74895abd99c7974f92a445fd5d8
4848 serverLevel.getCraftServer().getPluginManager().callEvent(event);
4949
5050 if (event.isCancelled()) {
51- @@ -75,6 +90,13 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
51+ @@ -75,6 +89,50 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
5252 return item;
5353 }
5454
55+ + // atDeprecated start - Add boat placement on ice
56+ + private Vec3 tryPlaceBoatOnIce(ServerLevel serverLevel, Direction direction, BlockPos blockPos) {
57+ + BlockPos current = blockPos;
58+ + if (direction == Direction.UP) {
59+ + int airCount = 0;
60+ + int maxAir = 2;
61+ + for (int i = 0; i < 4; i++) {
62+ + if (airCount < maxAir && serverLevel.getBlockState(current).canBeReplaced()) { // atDeprecated - Allow non-solid blocks
63+ + airCount++;
64+ + current = current.above();
65+ + continue;
66+ + }
67+ + if (isIceType(serverLevel, current)) {
68+ + BlockPos aboveIce = current.above();
69+ + if (serverLevel.getBlockState(aboveIce).canBeReplaced()) { // atDeprecated - Allow non-solid blocks
70+ + return Vec3.atCenterOf(current).add(0, 1.1, 0);
71+ + }
72+ + }
73+ + break;
74+ + }
75+ + } else {
76+ + for (int i = 0; i < 2; i++) {
77+ + if (serverLevel.getBlockState(current).canBeReplaced()) { // atDeprecated - Allow non-solid blocks
78+ + BlockPos below = current.below();
79+ + if (isIceType(serverLevel, below)) {
80+ + return Vec3.atCenterOf(below).add(0, 0.6, 0);
81+ + }
82+ + current = current.relative(direction);
83+ + } else {
84+ + break;
85+ + }
86+ + }
87+ + }
88+ + return null;
89+ + }
90+ +
5591+ private static boolean isIceType(ServerLevel level, BlockPos pos) {
5692+ var block = level.getBlockState(pos).getBlock();
5793+ return block == net.minecraft.world.level.block.Blocks.ICE ||
58- + block == net.minecraft.world.level.block.Blocks.PACKED_ICE ||
59- + block == net.minecraft.world.level.block.Blocks.BLUE_ICE;
94+ + block == net.minecraft.world.level.block.Blocks.PACKED_ICE ||
95+ + block == net.minecraft.world.level.block.Blocks.BLUE_ICE;
6096+ }
97+ + // atDeprecated end
6198+
6299 @Override
63100 protected void playSound(BlockSource blockSource) {
0 commit comments