6d41af029c
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 3e2858f6 SPIGOT-4352: MoistureChangeEvent 5466e281 Add BlockDispenseArmorEvent CraftBukkit Changes:3123a069
SPIGOT-4352: MoistureChangeEvent226db0ea
Add BlockDispenseArmorEventcd367fa4
Fix bad thread safety in ChunkRegionLoader3f5ca5f2
SPIGOT-4355: Improve cancelling VehicleEnterEvent Spigot Changes: 145a37ae Rebuild patches 3f2423cc Rebuild patches
120 Zeilen
4.3 KiB
Diff
120 Zeilen
4.3 KiB
Diff
From 2e63969b601f0219ad563c9f8a062268f7339496 Mon Sep 17 00:00:00 2001
|
|
From: Zach Brown <zach.brown@destroystokyo.com>
|
|
Date: Sun, 22 May 2016 20:20:55 -0500
|
|
Subject: [PATCH] Optional TNT doesn't move in water
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
index c2c4e16d13..f8102d9f07 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -2,7 +2,6 @@ package com.destroystokyo.paper;
|
|
|
|
import java.util.List;
|
|
|
|
-import org.bukkit.Bukkit;
|
|
import org.bukkit.configuration.file.YamlConfiguration;
|
|
import org.spigotmc.SpigotWorldConfig;
|
|
|
|
@@ -279,4 +278,14 @@ public class PaperWorldConfig {
|
|
);
|
|
}
|
|
}
|
|
+
|
|
+ public boolean preventTntFromMovingInWater;
|
|
+ private void preventTntFromMovingInWater() {
|
|
+ if (PaperConfig.version < 13) {
|
|
+ boolean oldVal = getBoolean("enable-old-tnt-cannon-behaviors", false);
|
|
+ set("prevent-tnt-from-moving-in-water", oldVal);
|
|
+ }
|
|
+ preventTntFromMovingInWater = getBoolean("prevent-tnt-from-moving-in-water", false);
|
|
+ log("Prevent TNT from moving in water: " + preventTntFromMovingInWater);
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 0952bff5c0..b73a4e6b37 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -1170,6 +1170,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
}
|
|
|
|
public boolean aq() {
|
|
+ // Paper start
|
|
+ return this.doWaterMovement();
|
|
+ }
|
|
+
|
|
+ public boolean doWaterMovement() {
|
|
+ // Paper end
|
|
return this.isInWater() || this.q();
|
|
}
|
|
|
|
@@ -2721,6 +2727,11 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
}
|
|
|
|
public boolean bw() {
|
|
+ return this.pushedByWater();
|
|
+ }
|
|
+
|
|
+ public boolean pushedByWater() {
|
|
+ // Paper end
|
|
return true;
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityTNTPrimed.java b/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
index 87f3205f82..8c1d25979f 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
@@ -147,4 +147,49 @@ public class EntityTNTPrimed extends Entity {
|
|
public int getFuseTicks() {
|
|
return this.c;
|
|
}
|
|
+
|
|
+ // Paper start - Optional prevent TNT from moving in water
|
|
+ @Override
|
|
+ public boolean pushedByWater() {
|
|
+ return !world.paperConfig.preventTntFromMovingInWater && super.pushedByWater();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Author: Jedediah Smith <jedediah@silencegreys.com>
|
|
+ */
|
|
+ @Override
|
|
+ public boolean doWaterMovement() {
|
|
+ if (!world.paperConfig.preventTntFromMovingInWater) return super.doWaterMovement();
|
|
+
|
|
+ // Preserve velocity while calling the super method
|
|
+ double oldMotX = this.motX;
|
|
+ double oldMotY = this.motY;
|
|
+ double oldMotZ = this.motZ;
|
|
+
|
|
+ super.doWaterMovement();
|
|
+
|
|
+ this.motX = oldMotX;
|
|
+ this.motY = oldMotY;
|
|
+ this.motZ = oldMotZ;
|
|
+
|
|
+ if (this.inWater) {
|
|
+ // Send position and velocity updates to nearby players on every tick while the TNT is in water.
|
|
+ // This does pretty well at keeping their clients in sync with the server.
|
|
+ EntityTrackerEntry ete = ((WorldServer) this.getWorld()).getTracker().trackedEntities.get(this.getId());
|
|
+ if (ete != null) {
|
|
+ PacketPlayOutEntityVelocity velocityPacket = new PacketPlayOutEntityVelocity(this);
|
|
+ PacketPlayOutEntityTeleport positionPacket = new PacketPlayOutEntityTeleport(this);
|
|
+
|
|
+ ete.trackedPlayers.stream()
|
|
+ .filter(viewer -> (viewer.locX - this.locX) * (viewer.locY - this.locY) * (viewer.locZ - this.locZ) < 16 * 16)
|
|
+ .forEach(viewer -> {
|
|
+ viewer.playerConnection.sendPacket(velocityPacket);
|
|
+ viewer.playerConnection.sendPacket(positionPacket);
|
|
+ });
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return this.inWater;
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
--
|
|
2.18.0
|
|
|