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: da9ef3c5 #496: Add methods to get/set ItemStacks in EquipmentSlots 3abebc9f #492: Let Tameable extend Animals rather than Entity 941111a0 #495: Expose ItemStack and hand used in PlayerShearEntityEvent 4fe19cae #494: InventoryView - Add missing Brewing FUEL_TIME CraftBukkit Changes: 933e9094 #664: Add methods to get/set ItemStacks in EquipmentSlots 18722312 #662: Expose ItemStack and hand used in PlayerShearEntityEvent
169 lines
10 KiB
Diff
169 lines
10 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Hugo Manrique <hugmanrique@gmail.com>
|
|
Date: Mon, 23 Jul 2018 14:22:26 +0200
|
|
Subject: [PATCH] Vanished players don't have rights
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 3043b87cf74cd5e27b978464ed3032c68af8a7c0..a0379c6a779a5507993827a1402f2acb02eca658 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -98,7 +98,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
private static double e = 1.0D;
|
|
private final EntityTypes<?> f;
|
|
private int id;
|
|
- public boolean i;
|
|
+ public boolean i; public final boolean blocksEntitySpawning() { return this.i; } // Paper - OBFHELPER
|
|
public final List<Entity> passengers;
|
|
protected int j;
|
|
@Nullable
|
|
diff --git a/src/main/java/net/minecraft/server/EntityFireworks.java b/src/main/java/net/minecraft/server/EntityFireworks.java
|
|
index 278ef79d8962cc5d337e34891c7ea3a606336cbb..5c3731f68a31b73b886b872eba69de483f78a2aa 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityFireworks.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityFireworks.java
|
|
@@ -110,6 +110,16 @@ public class EntityFireworks extends Entity implements IProjectile {
|
|
|
|
vec3d = this.getMot();
|
|
MovingObjectPosition movingobjectposition = ProjectileHelper.a(this, this.getBoundingBox().a(vec3d).g(1.0D), (entity) -> {
|
|
+ // Paper start - Cancel hit for vanished players
|
|
+ if (this.spawningEntity != null && entity instanceof EntityPlayer && this.world instanceof WorldServer) {
|
|
+ Entity spawningEntity = ((WorldServer) this.world).getEntity(this.spawningEntity);
|
|
+ if (spawningEntity instanceof EntityPlayer) {
|
|
+ org.bukkit.entity.Player collided = (org.bukkit.entity.Player) entity.getBukkitEntity();
|
|
+ org.bukkit.entity.Player shooter = (org.bukkit.entity.Player) spawningEntity.getBukkitEntity();
|
|
+ if (!shooter.canSee(collided)) return false;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
return !entity.isSpectator() && entity.isAlive() && entity.isInteractable();
|
|
}, RayTrace.BlockCollisionOption.COLLIDER, true);
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/IBlockData.java b/src/main/java/net/minecraft/server/IBlockData.java
|
|
index 3a1ad2346b4cae833de90dafb716c56e6e2f606d..9ab57be8500bf5106e32671b8d5fb11d8e9b1c60 100644
|
|
--- a/src/main/java/net/minecraft/server/IBlockData.java
|
|
+++ b/src/main/java/net/minecraft/server/IBlockData.java
|
|
@@ -146,6 +146,7 @@ public class IBlockData extends BlockDataAbstract<Block, IBlockData> implements
|
|
return this.c != null ? this.c.g : this.b(iblockaccess, blockposition, VoxelShapeCollision.a());
|
|
}
|
|
|
|
+ public final VoxelShape getCollisionShape(IBlockAccess iblockaccess, BlockPosition blockposition, VoxelShapeCollision voxelshapecollision) { return this.b(iblockaccess, blockposition, voxelshapecollision); } // Paper - OBFHELPER
|
|
public VoxelShape b(IBlockAccess iblockaccess, BlockPosition blockposition, VoxelShapeCollision voxelshapecollision) {
|
|
return this.getBlock().b(this, iblockaccess, blockposition, voxelshapecollision);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java
|
|
index ab875a7365693264ea8e5002d9d115e16320dbc8..aed353365bfdf1a133997f47cb458edc78af6c8b 100644
|
|
--- a/src/main/java/net/minecraft/server/ItemBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/ItemBlock.java
|
|
@@ -136,7 +136,8 @@ public class ItemBlock extends Item {
|
|
EntityHuman entityhuman = blockactioncontext.getEntity();
|
|
VoxelShapeCollision voxelshapecollision = entityhuman == null ? VoxelShapeCollision.a() : VoxelShapeCollision.a((Entity) entityhuman);
|
|
// CraftBukkit start - store default return
|
|
- boolean defaultReturn = (!this.T_() || iblockdata.canPlace(blockactioncontext.getWorld(), blockactioncontext.getClickPosition())) && blockactioncontext.getWorld().a(iblockdata, blockactioncontext.getClickPosition(), voxelshapecollision);
|
|
+ World world = blockactioncontext.getWorld(); // Paper
|
|
+ boolean defaultReturn = (!this.T_() || iblockdata.canPlace(blockactioncontext.getWorld(), blockactioncontext.getClickPosition())) && world.checkEntityCollision(iblockdata, entityhuman, voxelshapecollision, blockactioncontext.getClickPosition(), true); // Paper
|
|
org.bukkit.entity.Player player = (blockactioncontext.getEntity() instanceof EntityPlayer) ? (org.bukkit.entity.Player) blockactioncontext.getEntity().getBukkitEntity() : null;
|
|
|
|
BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(blockactioncontext.getWorld(), blockactioncontext.getClickPosition()), player, CraftBlockData.fromData(iblockdata), defaultReturn);
|
|
diff --git a/src/main/java/net/minecraft/server/VoxelShape.java b/src/main/java/net/minecraft/server/VoxelShape.java
|
|
index 0f64a3c0569a778cd5b8c60f253c77681a83308d..0f95bcbccb96f9d525583f6bb6c0c0ed7fb7561b 100644
|
|
--- a/src/main/java/net/minecraft/server/VoxelShape.java
|
|
+++ b/src/main/java/net/minecraft/server/VoxelShape.java
|
|
@@ -46,6 +46,7 @@ public abstract class VoxelShape {
|
|
return this.a.a();
|
|
}
|
|
|
|
+ public final VoxelShape offset(double x, double y, double z) { return this.a(x, y, z); } // Paper - OBFHELPER
|
|
public VoxelShape a(double d0, double d1, double d2) {
|
|
return (VoxelShape) (this.isEmpty() ? VoxelShapes.a() : new VoxelShapeArray(this.a, new DoubleListOffset(this.a(EnumDirection.EnumAxis.X), d0), new DoubleListOffset(this.a(EnumDirection.EnumAxis.Y), d1), new DoubleListOffset(this.a(EnumDirection.EnumAxis.Z), d2)));
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/VoxelShapes.java b/src/main/java/net/minecraft/server/VoxelShapes.java
|
|
index 143be566c683ae035997f9a4058381a109f3de23..08c83c62dfe875600162a46a0ca4b835b0bfe199 100644
|
|
--- a/src/main/java/net/minecraft/server/VoxelShapes.java
|
|
+++ b/src/main/java/net/minecraft/server/VoxelShapes.java
|
|
@@ -33,6 +33,7 @@ public final class VoxelShapes {
|
|
return a(new AxisAlignedBB(d0, d1, d2, d3, d4, d5));
|
|
}
|
|
|
|
+ public static final VoxelShape of(AxisAlignedBB axisAlignedbb) { return VoxelShapes.a(axisAlignedbb); } // Paper - OBFHELPER
|
|
public static VoxelShape a(AxisAlignedBB axisalignedbb) {
|
|
int i = a(axisalignedbb.minX, axisalignedbb.maxX);
|
|
int j = a(axisalignedbb.minY, axisalignedbb.maxY);
|
|
@@ -127,6 +128,7 @@ public final class VoxelShapes {
|
|
}
|
|
}
|
|
|
|
+ public static final boolean applyOperation(VoxelShape voxelshape, VoxelShape voxelshape1, OperatorBoolean operatorboolean) { return VoxelShapes.c(voxelshape, voxelshape1, operatorboolean); } // Paper - OBFHELPER
|
|
public static boolean c(VoxelShape voxelshape, VoxelShape voxelshape1, OperatorBoolean operatorboolean) {
|
|
if (operatorboolean.apply(false, false)) {
|
|
throw (IllegalArgumentException) SystemUtils.c(new IllegalArgumentException());
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index 2261c42ab69e260d3533cdff1149b83acea8ccb4..378ac5ae86e337f27975bc7935c4f25fce767eaf 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -152,6 +152,46 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
|
this.tileLimiter = new org.spigotmc.TickLimiter(spigotConfig.tileMaxTickTime);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ // ret true if no collision
|
|
+ public final boolean checkEntityCollision(IBlockData data, Entity source, VoxelShapeCollision voxelshapedcollision,
|
|
+ BlockPosition position, boolean checkCanSee) {
|
|
+ // Copied from IWorldReader#a(IBlockData, BlockPosition, VoxelShapeCollision) & EntityAccess#a(Entity, VoxelShape)
|
|
+ VoxelShape voxelshape = data.getCollisionShape(this, position, voxelshapedcollision);
|
|
+ if (voxelshape.isEmpty()) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ voxelshape = voxelshape.offset((double) position.getX(), (double) position.getY(), (double) position.getZ());
|
|
+ if (voxelshape.isEmpty()) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ List<Entity> entities = this.getEntities(null, voxelshape.getBoundingBox());
|
|
+ for (int i = 0, len = entities.size(); i < len; ++i) {
|
|
+ Entity entity = entities.get(i);
|
|
+
|
|
+ if (checkCanSee && source instanceof EntityPlayer && entity instanceof EntityPlayer
|
|
+ && !((EntityPlayer) source).getBukkitEntity().canSee(((EntityPlayer) entity).getBukkitEntity())) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ // !entity1.dead && entity1.i && (entity == null || !entity1.x(entity));
|
|
+ // elide the last check since vanilla calls with entity = null
|
|
+ // only we care about the source for the canSee check
|
|
+ if (entity.dead || !entity.blocksEntitySpawning()) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ if (VoxelShapes.applyOperation(voxelshape, VoxelShapes.of(entity.getBoundingBox()), OperatorBoolean.AND)) {
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return true;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
@Override
|
|
public boolean p_() {
|
|
return this.isClientSide;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index 6ca6ba46d0dd511072f518baa3aae6dc8281ef66..0125bf43e3383fddf7c36d831d19cca3f1ee3fae 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -1179,6 +1179,14 @@ public class CraftEventFactory {
|
|
Projectile projectile = (Projectile) entity.getBukkitEntity();
|
|
org.bukkit.entity.Entity collided = position.getEntity().getBukkitEntity();
|
|
com.destroystokyo.paper.event.entity.ProjectileCollideEvent event = new com.destroystokyo.paper.event.entity.ProjectileCollideEvent(projectile, collided);
|
|
+
|
|
+ if (projectile.getShooter() instanceof Player && collided instanceof Player) {
|
|
+ if (!((Player) projectile.getShooter()).canSee((Player) collided)) {
|
|
+ event.setCancelled(true);
|
|
+ return event;
|
|
+ }
|
|
+ }
|
|
+
|
|
Bukkit.getPluginManager().callEvent(event);
|
|
return event;
|
|
}
|