9ff01b16ab
This will be used by my next commit. But trying to get the build going since CI blew up
319 lines
16 KiB
Diff
319 lines
16 KiB
Diff
From b54bda97dbbe9c013c860bb721c8fc836486b243 Mon Sep 17 00:00:00 2001
|
|
From: Iceee <andrew@opticgaming.tv>
|
|
Date: Wed, 2 Mar 2016 23:00:53 -0600
|
|
Subject: [PATCH] Configurable TNT cannon fix
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
index 1236128..8d97890 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -241,4 +241,10 @@ public class PaperWorldConfig {
|
|
private void mobSpawnerTickRate() {
|
|
mobSpawnerTickRate = getInt("mob-spawner-tick-rate", 1);
|
|
}
|
|
+
|
|
+ public boolean fixCannons;
|
|
+ private void fixCannons() {
|
|
+ fixCannons = getBoolean("fix-cannons", false);
|
|
+ log("Fix TNT cannons: " + fixCannons);
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/BlockDiodeAbstract.java b/src/main/java/net/minecraft/server/BlockDiodeAbstract.java
|
|
index ffc07cd..64aaba4 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockDiodeAbstract.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockDiodeAbstract.java
|
|
@@ -76,6 +76,17 @@ public abstract class BlockDiodeAbstract extends BlockFacingHorizontal {
|
|
} else {
|
|
this.b(world, blockposition, iblockdata, 0);
|
|
world.setAir(blockposition);
|
|
+ // Paper start - Fix cannons
|
|
+ if (world.paperConfig.fixCannons) {
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.EAST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.WEST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.SOUTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.NORTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.DOWN), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.UP), this);
|
|
+ return;
|
|
+ }
|
|
+ // Paper end
|
|
EnumDirection[] aenumdirection = EnumDirection.values();
|
|
int i = aenumdirection.length;
|
|
|
|
@@ -173,6 +184,17 @@ public abstract class BlockDiodeAbstract extends BlockFacingHorizontal {
|
|
|
|
public void postBreak(World world, BlockPosition blockposition, IBlockData iblockdata) {
|
|
if (this.d) {
|
|
+ // Paper start - Fix cannons
|
|
+ if (world.paperConfig.fixCannons) {
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.EAST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.WEST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.NORTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.SOUTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.DOWN), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.UP), this);
|
|
+ return;
|
|
+ }
|
|
+ // Paper end
|
|
EnumDirection[] aenumdirection = EnumDirection.values();
|
|
int i = aenumdirection.length;
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java
|
|
index b4d1741..257bbbb 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java
|
|
@@ -52,6 +52,17 @@ public class BlockRedstoneTorch extends BlockTorch {
|
|
|
|
public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) {
|
|
if (this.isOn) {
|
|
+ // Paper start - Fix cannons
|
|
+ if (world.paperConfig.fixCannons) {
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.DOWN), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.UP), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.WEST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.EAST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.SOUTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.NORTH), this);
|
|
+ return;
|
|
+ }
|
|
+ // Paper end
|
|
EnumDirection[] aenumdirection = EnumDirection.values();
|
|
int i = aenumdirection.length;
|
|
|
|
@@ -66,6 +77,17 @@ public class BlockRedstoneTorch extends BlockTorch {
|
|
|
|
public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) {
|
|
if (this.isOn) {
|
|
+ // Paper start - Fix cannons
|
|
+ if (world.paperConfig.fixCannons) {
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.DOWN), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.UP), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.WEST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.EAST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.SOUTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.NORTH), this);
|
|
+ return;
|
|
+ }
|
|
+ // Paper end
|
|
EnumDirection[] aenumdirection = EnumDirection.values();
|
|
int i = aenumdirection.length;
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/BlockRedstoneWire.java b/src/main/java/net/minecraft/server/BlockRedstoneWire.java
|
|
index 1a133d9..f4f9be6 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockRedstoneWire.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockRedstoneWire.java
|
|
@@ -184,6 +184,17 @@ public class BlockRedstoneWire extends Block {
|
|
}
|
|
|
|
this.B.add(blockposition);
|
|
+ // Paper start - Fix cannons
|
|
+ if (world.paperConfig.fixCannons) {
|
|
+ this.B.add(blockposition.shift(EnumDirection.WEST));
|
|
+ this.B.add(blockposition.shift(EnumDirection.EAST));
|
|
+ this.B.add(blockposition.shift(EnumDirection.DOWN));
|
|
+ this.B.add(blockposition.shift(EnumDirection.UP));
|
|
+ this.B.add(blockposition.shift(EnumDirection.NORTH));
|
|
+ this.B.add(blockposition.shift(EnumDirection.SOUTH));
|
|
+ return iblockdata;
|
|
+ }
|
|
+ // Paper end
|
|
EnumDirection[] aenumdirection = EnumDirection.values();
|
|
int i1 = aenumdirection.length;
|
|
|
|
@@ -200,6 +211,17 @@ public class BlockRedstoneWire extends Block {
|
|
private void b(World world, BlockPosition blockposition) {
|
|
if (world.getType(blockposition).getBlock() == this) {
|
|
world.applyPhysics(blockposition, this);
|
|
+ // Paper start - Fix cannons
|
|
+ if (world.paperConfig.fixCannons) {
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.WEST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.EAST), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.NORTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.SOUTH), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.DOWN), this);
|
|
+ world.applyPhysics(blockposition.shift(EnumDirection.UP), this);
|
|
+ return;
|
|
+ }
|
|
+ // Paper end
|
|
EnumDirection[] aenumdirection = EnumDirection.values();
|
|
int i = aenumdirection.length;
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/BlockTNT.java b/src/main/java/net/minecraft/server/BlockTNT.java
|
|
index f794167..021a3be 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockTNT.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockTNT.java
|
|
@@ -29,7 +29,11 @@ public class BlockTNT extends Block {
|
|
|
|
public void wasExploded(World world, BlockPosition blockposition, Explosion explosion) {
|
|
if (!world.isClientSide) {
|
|
- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F), explosion.getSource());
|
|
+ // Paper start - Fix cannons
|
|
+ double y = blockposition.getY();
|
|
+ if (!world.paperConfig.fixCannons) y += 0.5;
|
|
+ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) ((float) blockposition.getX() + 0.5F), y, (double) ((float) blockposition.getZ() + 0.5F), explosion.getSource());
|
|
+ // Paper end
|
|
|
|
entitytntprimed.setFuseTicks((short) (world.random.nextInt(entitytntprimed.getFuseTicks() / 4) + entitytntprimed.getFuseTicks() / 8));
|
|
world.addEntity(entitytntprimed);
|
|
@@ -43,7 +47,11 @@ public class BlockTNT extends Block {
|
|
public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityLiving entityliving) {
|
|
if (!world.isClientSide) {
|
|
if (((Boolean) iblockdata.get(BlockTNT.EXPLODE)).booleanValue()) {
|
|
- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F), entityliving);
|
|
+ // Paper start - Fix cannons
|
|
+ double y = blockposition.getY();
|
|
+ if (!world.paperConfig.fixCannons) y += 0.5;
|
|
+ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) ((float) blockposition.getX() + 0.5F), y, (double) ((float) blockposition.getZ() + 0.5F), entityliving);
|
|
+ // Paper end
|
|
|
|
world.addEntity(entitytntprimed);
|
|
world.a((EntityHuman) null, entitytntprimed.locX, entitytntprimed.locY, entitytntprimed.locZ, SoundEffects.gj, SoundCategory.BLOCKS, 1.0F, 1.0F);
|
|
diff --git a/src/main/java/net/minecraft/server/DispenserRegistry.java b/src/main/java/net/minecraft/server/DispenserRegistry.java
|
|
index d7bea3d..61ac795 100644
|
|
--- a/src/main/java/net/minecraft/server/DispenserRegistry.java
|
|
+++ b/src/main/java/net/minecraft/server/DispenserRegistry.java
|
|
@@ -498,7 +498,11 @@ public class DispenserRegistry {
|
|
org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
|
|
CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
|
|
|
|
- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D));
|
|
+ // Paper start - Fix cannons
|
|
+ double y = blockposition.getY();
|
|
+ if (!world.paperConfig.fixCannons) y += 0.5;
|
|
+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockposition.getX() + 0.5D, y, (double) blockposition.getZ() + 0.5D));
|
|
+ // Paper end
|
|
if (!BlockDispenser.eventFired) {
|
|
world.getServer().getPluginManager().callEvent(event);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
index 8f2b253..23fb154 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
@@ -274,4 +274,22 @@ public class EntityFallingBlock extends Entity {
|
|
public boolean br() {
|
|
return true;
|
|
}
|
|
+
|
|
+ // Paper start - Fix cannons
|
|
+ @Override
|
|
+ public double f(double d0, double d1, double d2) {
|
|
+ if (!world.paperConfig.fixCannons) return super.f(d0, d1, d2);
|
|
+
|
|
+ double d3 = this.locX - d0;
|
|
+ double d4 = this.locY + this.getHeadHeight() - d1;
|
|
+ double d5 = this.locZ - d2;
|
|
+
|
|
+ return (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public float getHeadHeight() {
|
|
+ return world.paperConfig.fixCannons ? this.length / 2 : super.getHeadHeight();
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityTNTPrimed.java b/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
index 1113b1c..12feacf 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
@@ -30,6 +30,7 @@ public class EntityTNTPrimed extends Entity {
|
|
this.lastY = d1;
|
|
this.lastZ = d2;
|
|
this.source = entityliving;
|
|
+ if (world.paperConfig.fixCannons) this.motX = this.motZ = 0.0F; // Paper - Fix cannons
|
|
}
|
|
|
|
protected void i() {
|
|
@@ -118,9 +119,66 @@ public class EntityTNTPrimed extends Entity {
|
|
return this.source;
|
|
}
|
|
|
|
+ // Paper start - Fix cannons
|
|
+ @Override
|
|
+ public double f(double d0, double d1, double d2) {
|
|
+ if (!world.paperConfig.fixCannons) return super.f(d0, d1, d2);
|
|
+
|
|
+ double d3 = this.locX - d0;
|
|
+ double d4 = this.locY + this.getHeadHeight() - d1;
|
|
+ double d5 = this.locZ - d2;
|
|
+
|
|
+ return (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean bd() {
|
|
+ return !world.paperConfig.fixCannons && super.bd();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
public float getHeadHeight() {
|
|
- return 0.0F;
|
|
+ return world.paperConfig.fixCannons ? this.length / 2 : 0.0F;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Author: Jedediah Smith <jedediah@silencegreys.com>
|
|
+ */
|
|
+ @Override
|
|
+ public boolean aj() {
|
|
+ if (!world.paperConfig.fixCannons) return super.aj();
|
|
+
|
|
+ // Preserve velocity while calling the super method
|
|
+ double oldMotX = this.motX;
|
|
+ double oldMotY = this.motY;
|
|
+ double oldMotZ = this.motZ;
|
|
+
|
|
+ super.aj();
|
|
+
|
|
+ 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);
|
|
+
|
|
+ for (EntityPlayer viewer : ete.trackedPlayers) {
|
|
+ if ((viewer.locX - this.locX) * (viewer.locY - this.locY) * (viewer.locZ - this.locZ) < 16 * 16) {
|
|
+ viewer.playerConnection.sendPacket(velocityPacket);
|
|
+ viewer.playerConnection.sendPacket(positionPacket);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return this.inWater;
|
|
}
|
|
+ // Paper end
|
|
|
|
public void setFuseTicks(int i) {
|
|
this.datawatcher.set(EntityTNTPrimed.FUSE_TICKS, Integer.valueOf(i));
|
|
diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java
|
|
index 418ee29..9b86454 100644
|
|
--- a/src/main/java/net/minecraft/server/Explosion.java
|
|
+++ b/src/main/java/net/minecraft/server/Explosion.java
|
|
@@ -148,9 +148,16 @@ public class Explosion {
|
|
d14 = entity instanceof EntityHuman && world.paperConfig.disableExplosionKnockback ? 0 : EnchantmentProtection.a((EntityLiving) entity, d13); // Paper - Disable explosion knockback
|
|
}
|
|
|
|
+ // Paper start - Fix cannons
|
|
+ /*
|
|
entity.motX += d8 * d14;
|
|
entity.motY += d9 * d14;
|
|
entity.motZ += d10 * d14;
|
|
+ */
|
|
+ // This impulse method sets the dirty flag, so clients will get an immediate velocity update
|
|
+ entity.g(d8 * d14, d9 * d14, d10 * d14);
|
|
+ // Paper end
|
|
+
|
|
if (entity instanceof EntityHuman) {
|
|
EntityHuman entityhuman = (EntityHuman) entity;
|
|
|
|
--
|
|
2.7.4
|
|
|