mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-20 17:46:38 +01:00
30f02fe6e5
I think its pretty clear that no one uses this given that it didn't work at all before
320 lines
16 KiB
Diff
320 lines
16 KiB
Diff
From b8725fa29dc886377b3042ff03cd3ff590cd997c 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 668bd78..7102d7b 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -233,4 +233,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 09d5f7b..a3c0315 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockTNT.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockTNT.java
|
|
@@ -30,7 +30,11 @@ public class BlockTNT extends Block {
|
|
public void wasExploded(World world, BlockPosition blockposition, Explosion explosion) {
|
|
if (!world.isClientSide) {
|
|
org.bukkit.Location loc = explosion.source instanceof EntityTNTPrimed ? ((EntityTNTPrimed) explosion.source).sourceLoc : new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); // Paper
|
|
- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(loc, world, (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F), explosion.getSource()); // Paper - Add loc
|
|
+ // Paper start - Fix cannons
|
|
+ double y = blockposition.getY();
|
|
+ if (!world.paperConfig.fixCannons) y += 0.5;
|
|
+ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(loc, world, (double) ((float) blockposition.getX() + 0.5F), y, (double) ((float) blockposition.getZ() + 0.5F), explosion.getSource()); // Paper - Add loc
|
|
+ // Paper end
|
|
|
|
entitytntprimed.setFuseTicks((short) (world.random.nextInt(entitytntprimed.getFuseTicks() / 4) + entitytntprimed.getFuseTicks() / 8));
|
|
world.addEntity(entitytntprimed);
|
|
@@ -45,7 +49,11 @@ public class BlockTNT extends Block {
|
|
if (!world.isClientSide) {
|
|
if (((Boolean) iblockdata.get(BlockTNT.EXPLODE)).booleanValue()) {
|
|
org.bukkit.Location loc = new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); // Paper
|
|
- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(loc, world, (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F), entityliving); // Paper - Add loc
|
|
+ // Paper start - Fix cannons
|
|
+ double y = blockposition.getY();
|
|
+ if (!world.paperConfig.fixCannons) y += 0.5;
|
|
+ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(loc, world, (double) ((float) blockposition.getX() + 0.5F), y, (double) ((float) blockposition.getZ() + 0.5F), entityliving); // Paper - Add loc
|
|
+ // 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 c1c0c7c..e2eb620 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 c44e493..51dda52 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
@@ -293,4 +293,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 1820c7b..ca3bfd5 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityTNTPrimed.java
|
|
@@ -42,6 +42,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() {
|
|
@@ -137,9 +138,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 cd2fb14..678ce44 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.2
|
|
|