From 8c772dd85fc55b1af00322508c7f6834390c812e Mon Sep 17 00:00:00 2001 From: Sotr Date: Sun, 24 Mar 2019 18:17:28 +0800 Subject: [PATCH] Upstream Paper --- .../paper/PaperWorldEntityList.java | 4 +++- .../java/net/minecraft/server/Entity.java | 24 +++++++++++++++++++ .../minecraft/server/PacketPlayOutChat.java | 6 ++--- .../net/minecraft/server/SpawnerCreature.java | 4 ++-- src/main/java/net/minecraft/server/World.java | 1 + .../org/bukkit/craftbukkit/CraftWorld.java | 2 +- .../craftbukkit/entity/CraftEntity.java | 4 ++++ 7 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java b/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java index a10a5bc13..8ad00c7d1 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java @@ -7,6 +7,7 @@ import net.minecraft.server.IAnimal; import net.minecraft.server.MinecraftServer; import net.minecraft.server.World; import net.minecraft.server.WorldServer; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import java.util.ArrayList; import java.util.Collection; @@ -90,7 +91,8 @@ public class PaperWorldEntityList extends ArrayList { } public void updateEntityCount(Entity entity, int amt) { - if (!(entity instanceof IAnimal)) return; + // Only count natural spawns so that mob + if (!(entity instanceof IAnimal) || entity.spawnReason != SpawnReason.NATURAL) return; if (entity instanceof EntityInsentient) { EntityInsentient entityinsentient = (EntityInsentient) entity; diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 3c2e79b14..0c58a4766 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -63,6 +63,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } }; List entitySlice = null; + public org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason; // Paper end static boolean isLevelAtLeast(NBTTagCompound tag, int level) { return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; @@ -1671,6 +1672,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke if (origin != null) { nbttagcompound.set("Paper.Origin", this.createList(origin.getX(), origin.getY(), origin.getZ())); } + if (spawnReason != null) { + nbttagcompound.setString("Paper.SpawnReason", spawnReason.name()); + } // Save entity's from mob spawner status if (spawnedViaMobSpawner) { nbttagcompound.setBoolean("Paper.FromMobSpawner", true); @@ -1824,6 +1828,26 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } spawnedViaMobSpawner = nbttagcompound.getBoolean("Paper.FromMobSpawner"); // Restore entity's from mob spawner status + if (nbttagcompound.hasKey("Paper.SpawnReason")) { + String spawnReasonName = nbttagcompound.getString("Paper.SpawnReason"); + try { + spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.valueOf(spawnReasonName); + } catch (Exception ignored) { + LogManager.getLogger().error("Unknown SpawnReason " + spawnReasonName + " for " + this); + } + } + if (spawnReason == null) { + if (spawnedViaMobSpawner) { + spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER; + } else if (this instanceof EntityInsentient && this instanceof IAnimal && !((EntityInsentient) this).isTypeNotPersistent()) { + if (!nbttagcompound.getBoolean("PersistenceRequired")) { + spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL; + } + } + } + if (spawnReason == null) { + spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; + } // Paper end } catch (Throwable throwable) { diff --git a/src/main/java/net/minecraft/server/PacketPlayOutChat.java b/src/main/java/net/minecraft/server/PacketPlayOutChat.java index eba6aadad..3a332e980 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutChat.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutChat.java @@ -3,7 +3,7 @@ package net.minecraft.server; import java.io.IOException; public class PacketPlayOutChat implements Packet { - + private static final int MAX_LENGTH = Short.MAX_VALUE * 8 + 8; // Paper private IChatBaseComponent a; public net.md_5.bungee.api.chat.BaseComponent[] components; // Spigot private ChatMessageType b; @@ -30,9 +30,9 @@ public class PacketPlayOutChat implements Packet { //packetdataserializer.a(net.md_5.bungee.chat.ComponentSerializer.toString(components)); // Paper - comment, replaced with below // Paper start - don't nest if we don't need to so that we can preserve formatting if (this.components.length == 1) { - packetdataserializer.a(net.md_5.bungee.chat.ComponentSerializer.toString(this.components[0])); + packetdataserializer.a(net.md_5.bungee.chat.ComponentSerializer.toString(this.components[0]), MAX_LENGTH); // Paper - use proper max length } else { - packetdataserializer.a(net.md_5.bungee.chat.ComponentSerializer.toString(this.components)); + packetdataserializer.a(net.md_5.bungee.chat.ComponentSerializer.toString(this.components), MAX_LENGTH); // Paper - use proper max length } // Paper end } else { diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java index e2bf17f44..17bb81c03 100644 --- a/src/main/java/net/minecraft/server/SpawnerCreature.java +++ b/src/main/java/net/minecraft/server/SpawnerCreature.java @@ -158,7 +158,7 @@ public final class SpawnerCreature { float f1 = (float) l3 + 0.5F; EntityHuman entityhuman1 = worldserver.a((double) f, (double) f1, -1.0D); - if (entityhuman1 != null) { + if (entityhuman1 != null && worldserver.isLoadedAndInBounds(blockposition_mutableblockposition)) { // Paper - don't load chunks for mob spawn double d0 = entityhuman1.d((double) f, (double) k3, (double) f1); if (d0 > 576.0D && blockposition.distanceSquared((double) f, (double) k3, (double) f1) >= 576.0D) { @@ -171,7 +171,7 @@ public final class SpawnerCreature { i4 = biomebase_biomemeta.c + worldserver.random.nextInt(1 + biomebase_biomemeta.d - biomebase_biomemeta.c); } - if (worldserver.isLoadedAndInBounds(blockposition_mutableblockposition) && worldserver.a(enumcreaturetype, biomebase_biomemeta, (BlockPosition) blockposition_mutableblockposition)) { // Paper - don't load chunks for mob spawn + if (worldserver.a(enumcreaturetype, biomebase_biomemeta, (BlockPosition) blockposition_mutableblockposition)) { EntityPositionTypes.Surface entitypositiontypes_surface = EntityPositionTypes.a(biomebase_biomemeta.b); if (entitypositiontypes_surface != null && a(entitypositiontypes_surface, worldserver, blockposition_mutableblockposition, biomebase_biomemeta.b)) { EntityInsentient entityinsentient; diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 0624848cc..9faed9303 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -1084,6 +1084,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason // Paper start + if (entity.spawnReason == null) entity.spawnReason = spawnReason; if (regionLimited != null) { return regionLimited.addEntity(entity, spawnReason); } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 6ed7c9355..40ee34675 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -1348,7 +1348,7 @@ public class CraftWorld implements World { height = 9; } - BlockFace[] faces = new BlockFace[]{BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH}; + 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); for (BlockFace dir : faces) { IBlockData nmsBlock = world.getType(pos.shift(CraftBlock.blockFaceToNotch(dir))); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index d4a8fb16b..51f70c5ee 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -845,5 +845,9 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { public boolean fromMobSpawner() { return getHandle().spawnedViaMobSpawner; } + + public org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason getEntitySpawnReason() { + return getHandle().spawnReason; + } // Paper end }