SPIGOT-4712: Allow spawning of upwards or downwards facing item frames

Also use correct block position for spawning hanging entities
This commit is contained in:
BlackHole 2019-07-23 09:38:02 +10:00 committed by md_5
parent db97147724
commit c98d61bfcd
2 changed files with 59 additions and 8 deletions

View File

@ -1,6 +1,55 @@
--- a/net/minecraft/server/EntityItemFrame.java --- a/net/minecraft/server/EntityItemFrame.java
+++ b/net/minecraft/server/EntityItemFrame.java +++ b/net/minecraft/server/EntityItemFrame.java
@@ -108,6 +108,11 @@ @@ -52,15 +52,29 @@
@Override
protected void updateBoundingBox() {
if (this.direction != null) {
+ // CraftBukkit start code moved in to calculateBoundingBox
+ this.a(calculateBoundingBox(this, this.blockPosition, this.direction, this.getHangingWidth(), this.getHangingHeight()));
+ // CraftBukkit end
+ }
+ }
+
+ // CraftBukkit start - break out BB calc into own method
+ public static AxisAlignedBB calculateBoundingBox(@Nullable Entity entity, BlockPosition blockPosition, EnumDirection direction, int width, int height) {
+ {
double d0 = 0.46875D;
- this.locX = (double) this.blockPosition.getX() + 0.5D - (double) this.direction.getAdjacentX() * 0.46875D;
- this.locY = (double) this.blockPosition.getY() + 0.5D - (double) this.direction.getAdjacentY() * 0.46875D;
- this.locZ = (double) this.blockPosition.getZ() + 0.5D - (double) this.direction.getAdjacentZ() * 0.46875D;
- double d1 = (double) this.getHangingWidth();
- double d2 = (double) this.getHangingHeight();
- double d3 = (double) this.getHangingWidth();
- EnumDirection.EnumAxis enumdirection_enumaxis = this.direction.k();
+ double locX = (double) blockPosition.getX() + 0.5D - (double) direction.getAdjacentX() * 0.46875D;
+ double locY = (double) blockPosition.getY() + 0.5D - (double) direction.getAdjacentY() * 0.46875D;
+ double locZ = (double) blockPosition.getZ() + 0.5D - (double) direction.getAdjacentZ() * 0.46875D;
+ if (entity != null) {
+ entity.locX = locX;
+ entity.locY = locY;
+ entity.locZ = locZ;
+ }
+ double d1 = (double) width;
+ double d2 = (double) height;
+ double d3 = (double) width;
+ EnumDirection.EnumAxis enumdirection_enumaxis = direction.k();
switch (enumdirection_enumaxis) {
case X:
@@ -76,9 +90,10 @@
d1 /= 32.0D;
d2 /= 32.0D;
d3 /= 32.0D;
- this.a(new AxisAlignedBB(this.locX - d1, this.locY - d2, this.locZ - d3, this.locX + d1, this.locY + d2, this.locZ + d3));
+ return new AxisAlignedBB(locX - d1, locY - d2, locZ - d3, locX + d1, locY + d2, locZ + d3);
}
}
+ // CraftBukkit end
@Override
public boolean survives() {
@@ -108,6 +123,11 @@
return false; return false;
} else if (!damagesource.isExplosion() && !this.getItem().isEmpty()) { } else if (!damagesource.isExplosion() && !this.getItem().isEmpty()) {
if (!this.world.isClientSide) { if (!this.world.isClientSide) {
@ -12,7 +61,7 @@
this.b(damagesource.getEntity(), false); this.b(damagesource.getEntity(), false);
this.a(SoundEffects.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1.0F, 1.0F); this.a(SoundEffects.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1.0F, 1.0F);
} }
@@ -193,6 +198,12 @@ @@ -193,6 +213,12 @@
} }
public void setItem(ItemStack itemstack, boolean flag) { public void setItem(ItemStack itemstack, boolean flag) {
@ -25,7 +74,7 @@
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
itemstack = itemstack.cloneItemStack(); itemstack = itemstack.cloneItemStack();
itemstack.setCount(1); itemstack.setCount(1);
@@ -200,7 +211,7 @@ @@ -200,7 +226,7 @@
} }
this.getDataWatcher().set(EntityItemFrame.ITEM, itemstack); this.getDataWatcher().set(EntityItemFrame.ITEM, itemstack);

View File

@ -1620,12 +1620,14 @@ public class CraftWorld implements World {
} }
BlockFace[] faces = new BlockFace[]{BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH, BlockFace.UP, BlockFace.DOWN}; BlockFace[] faces = new BlockFace[]{BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH, BlockFace.UP, BlockFace.DOWN};
final BlockPosition pos = new BlockPosition((int) x, (int) y, (int) z); final BlockPosition pos = new BlockPosition(x, y, z);
for (BlockFace dir : faces) { for (BlockFace dir : faces) {
IBlockData nmsBlock = world.getType(pos.shift(CraftBlock.blockFaceToNotch(dir))); IBlockData nmsBlock = world.getType(pos.shift(CraftBlock.blockFaceToNotch(dir)));
if (nmsBlock.getMaterial().isBuildable() || BlockDiodeAbstract.isDiode(nmsBlock)) { if (nmsBlock.getMaterial().isBuildable() || BlockDiodeAbstract.isDiode(nmsBlock)) {
boolean taken = false; boolean taken = false;
AxisAlignedBB bb = EntityHanging.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).opposite(), width, height); AxisAlignedBB bb = (ItemFrame.class.isAssignableFrom(clazz))
? EntityItemFrame.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).opposite(), width, height)
: EntityHanging.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).opposite(), width, height);
List<net.minecraft.server.Entity> list = (List<net.minecraft.server.Entity>) world.getEntities(null, bb); List<net.minecraft.server.Entity> list = (List<net.minecraft.server.Entity>) world.getEntities(null, bb);
for (Iterator<net.minecraft.server.Entity> it = list.iterator(); !taken && it.hasNext();) { for (Iterator<net.minecraft.server.Entity> it = list.iterator(); !taken && it.hasNext();) {
net.minecraft.server.Entity e = it.next(); net.minecraft.server.Entity e = it.next();
@ -1642,7 +1644,7 @@ public class CraftWorld implements World {
} }
if (LeashHitch.class.isAssignableFrom(clazz)) { if (LeashHitch.class.isAssignableFrom(clazz)) {
entity = new EntityLeash(world, new BlockPosition((int) x, (int) y, (int) z)); entity = new EntityLeash(world, new BlockPosition(x, y, z));
entity.attachedToPlayer = true; entity.attachedToPlayer = true;
} else { } else {
// No valid face found // No valid face found
@ -1650,9 +1652,9 @@ public class CraftWorld implements World {
EnumDirection dir = CraftBlock.blockFaceToNotch(face).opposite(); EnumDirection dir = CraftBlock.blockFaceToNotch(face).opposite();
if (Painting.class.isAssignableFrom(clazz)) { if (Painting.class.isAssignableFrom(clazz)) {
entity = new EntityPainting(world, new BlockPosition((int) x, (int) y, (int) z), dir); entity = new EntityPainting(world, new BlockPosition(x, y, z), dir);
} else if (ItemFrame.class.isAssignableFrom(clazz)) { } else if (ItemFrame.class.isAssignableFrom(clazz)) {
entity = new EntityItemFrame(world, new BlockPosition((int) x, (int) y, (int) z), dir); entity = new EntityItemFrame(world, new BlockPosition(x, y, z), dir);
} }
} }