diff --git a/nms-patches/DedicatedServer.patch b/nms-patches/DedicatedServer.patch index 74b46250d..d5890e9a2 100644 --- a/nms-patches/DedicatedServer.patch +++ b/nms-patches/DedicatedServer.patch @@ -15,9 +15,9 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer { private static final Logger LOGGER = LogManager.getLogger(); -@@ -34,8 +42,10 @@ +@@ -36,8 +44,10 @@ @Nullable - private ServerGUI q; + private final TextFilter r; - public DedicatedServer(Thread thread, IRegistryCustom.Dimension iregistrycustom_dimension, Convertable.ConversionSession convertable_conversionsession, ResourcePackRepository resourcepackrepository, DataPackResources datapackresources, SaveData savedata, DedicatedServerSettings dedicatedserversettings, DataFixer datafixer, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache, WorldLoadListenerFactory worldloadlistenerfactory) { - super(thread, iregistrycustom_dimension, convertable_conversionsession, savedata, resourcepackrepository, Proxy.NO_PROXY, datafixer, datapackresources, minecraftsessionservice, gameprofilerepository, usercache, worldloadlistenerfactory); @@ -27,8 +27,8 @@ + // CraftBukkit end this.propertyManager = dedicatedserversettings; this.remoteControlCommandListener = new RemoteControlCommandListener(this); - } -@@ -44,13 +54,44 @@ + this.r = null; +@@ -47,13 +57,44 @@ public boolean init() throws IOException { Thread thread = new Thread("Server console handler") { public void run() { @@ -76,7 +76,7 @@ } } catch (IOException ioexception) { DedicatedServer.LOGGER.error("Exception handling console input", ioexception); -@@ -59,6 +100,27 @@ +@@ -62,6 +103,27 @@ } }; @@ -104,7 +104,7 @@ thread.setDaemon(true); thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(DedicatedServer.LOGGER)); thread.start(); -@@ -85,7 +147,7 @@ +@@ -88,7 +150,7 @@ this.setForceGamemode(dedicatedserverproperties.forceGamemode); super.setIdleTimeout((Integer) dedicatedserverproperties.playerIdleTimeout.get()); this.i(dedicatedserverproperties.enforceWhitelist); @@ -113,7 +113,7 @@ DedicatedServer.LOGGER.info("Default game type: {}", dedicatedserverproperties.gamemode); InetAddress inetaddress = null; -@@ -110,6 +172,12 @@ +@@ -112,6 +174,12 @@ return false; } @@ -126,7 +126,7 @@ if (!this.getOnlineMode()) { DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); -@@ -124,7 +192,7 @@ +@@ -126,7 +194,7 @@ if (!NameReferencingFileConverter.e(this)) { return false; } else { @@ -135,7 +135,7 @@ long i = SystemUtils.getMonotonicNanos(); this.c(dedicatedserverproperties.maxBuildHeight); -@@ -132,7 +200,7 @@ +@@ -134,7 +202,7 @@ TileEntitySkull.a(this.getMinecraftSessionService()); UserCache.a(this.getOnlineMode()); DedicatedServer.LOGGER.info("Preparing level \"{}\"", this.getWorld()); @@ -144,7 +144,7 @@ long j = SystemUtils.getMonotonicNanos() - i; String s = String.format(Locale.ROOT, "%.3fs", (double) j / 1.0E9D); -@@ -149,6 +217,7 @@ +@@ -151,6 +219,7 @@ if (dedicatedserverproperties.enableRcon) { DedicatedServer.LOGGER.info("Starting remote control listener"); this.remoteControlListener = RemoteControlListener.a((IMinecraftServer) this); @@ -152,7 +152,7 @@ } if (this.getMaxTickTime() > 0L) { -@@ -259,6 +328,7 @@ +@@ -265,6 +334,7 @@ this.remoteStatusListener.b(); } @@ -160,7 +160,7 @@ } @Override -@@ -287,7 +357,15 @@ +@@ -293,7 +363,15 @@ while (!this.serverCommandQueue.isEmpty()) { ServerCommand servercommand = (ServerCommand) this.serverCommandQueue.remove(0); @@ -177,7 +177,7 @@ } } -@@ -497,14 +575,45 @@ +@@ -503,14 +581,45 @@ @Override public String getPlugins() { @@ -225,9 +225,9 @@ }); return this.remoteControlCommandListener.getMessages(); } -@@ -540,4 +649,15 @@ - public boolean isSyncChunkWrites() { - return this.propertyManager.getProperties().syncChunkWrites; +@@ -552,4 +661,15 @@ + public ITextFilter a(EntityPlayer entityplayer) { + return this.r != null ? this.r.a(entityplayer.getProfile()) : null; } + + // CraftBukkit start diff --git a/nms-patches/DedicatedServerProperties.patch b/nms-patches/DedicatedServerProperties.patch index edcec8b4f..8452a0d56 100644 --- a/nms-patches/DedicatedServerProperties.patch +++ b/nms-patches/DedicatedServerProperties.patch @@ -12,7 +12,7 @@ public final boolean onlineMode = this.getBoolean("online-mode", true); public final boolean preventProxyConnections = this.getBoolean("prevent-proxy-connections", false); public final String serverIp = this.getString("server-ip", ""); -@@ -54,8 +56,10 @@ +@@ -55,8 +57,10 @@ public final PropertyManager.EditableProperty whiteList; public final GeneratorSettings generatorSettings; @@ -25,7 +25,7 @@ this.difficulty = (EnumDifficulty) this.a("difficulty", a(EnumDifficulty::getById, EnumDifficulty::a), EnumDifficulty::c, EnumDifficulty.EASY); this.gamemode = (EnumGamemode) this.a("gamemode", a(EnumGamemode::getById, EnumGamemode::a), EnumGamemode::b, EnumGamemode.SURVIVAL); this.levelName = this.getString("level-name", "world"); -@@ -105,12 +109,14 @@ +@@ -107,12 +111,14 @@ this.generatorSettings = GeneratorSettings.a(iregistrycustom, properties); } diff --git a/nms-patches/Entity.patch b/nms-patches/Entity.patch index 10f04f23a..c399fc83a 100644 --- a/nms-patches/Entity.patch +++ b/nms-patches/Entity.patch @@ -135,7 +135,7 @@ + if (valid) ((WorldServer) world).chunkCheck(this); // CraftBukkit } - protected void ae() { + protected void af() { @@ -249,6 +348,15 @@ this.entityBaseTick(); } @@ -158,8 +158,8 @@ this.lastYaw = this.yaw; - this.doPortalTick(); + if (this instanceof EntityPlayer) this.doPortalTick(); // CraftBukkit - // Moved up to postTick - if (this.aN()) { - this.aO(); + if (this.aO()) { + this.aP(); } @@ -325,12 +433,44 @@ @@ -233,7 +233,7 @@ + } + // CraftBukkit end + - if (this.onGround && !this.bu()) { + if (this.onGround && !this.bv()) { block.stepOn(this.world, blockposition, this); } @@ -700,6 +862,7 @@ @@ -430,7 +430,7 @@ } @@ -1589,10 +1851,31 @@ - this.be(); + this.bf(); } - protected void addPassenger(Entity entity) { @@ -662,7 +662,7 @@ + // CraftBukkit end } - this.bM(); + this.bN(); @@ -2012,13 +2398,18 @@ @Nullable diff --git a/nms-patches/EntityAgeable.patch b/nms-patches/EntityAgeable.patch index f914201b2..2c947c9cf 100644 --- a/nms-patches/EntityAgeable.patch +++ b/nms-patches/EntityAgeable.patch @@ -32,4 +32,4 @@ + if (this.world.isClientSide || ageLocked) { // CraftBukkit if (this.d > 0) { if (this.d % 4 == 0) { - this.world.addParticle(Particles.HAPPY_VILLAGER, this.d(1.0D), this.cE() + 0.5D, this.g(1.0D), 0.0D, 0.0D, 0.0D); + this.world.addParticle(Particles.HAPPY_VILLAGER, this.d(1.0D), this.cF() + 0.5D, this.g(1.0D), 0.0D, 0.0D, 0.0D); diff --git a/nms-patches/EntityFireball.patch b/nms-patches/EntityFireball.patch index 0855e4e7b..a1a36789e 100644 --- a/nms-patches/EntityFireball.patch +++ b/nms-patches/EntityFireball.patch @@ -18,7 +18,7 @@ @@ -14,6 +18,12 @@ this(entitytypes, world); this.setPositionRotation(d0, d1, d2, this.yaw, this.pitch); - this.ae(); + this.af(); + // CraftBukkit start - Added setDirection method + this.setDirection(d3, d4, d5); + } diff --git a/nms-patches/EntityFireworks.patch b/nms-patches/EntityFireworks.patch index e51b4870a..36cb62f07 100644 --- a/nms-patches/EntityFireworks.patch +++ b/nms-patches/EntityFireworks.patch @@ -8,7 +8,7 @@ public class EntityFireworks extends IProjectile { -@@ -119,7 +120,11 @@ +@@ -121,7 +122,11 @@ } if (!this.world.isClientSide && this.ticksFlown > this.expectedLifespan) { @@ -21,7 +21,7 @@ } } -@@ -134,7 +139,11 @@ +@@ -136,7 +141,11 @@ protected void a(MovingObjectPositionEntity movingobjectpositionentity) { super.a(movingobjectpositionentity); if (!this.world.isClientSide) { @@ -34,7 +34,7 @@ } } -@@ -144,7 +153,11 @@ +@@ -146,7 +155,11 @@ this.world.getType(blockposition).a(this.world, blockposition, (Entity) this); if (!this.world.s_() && this.hasExplosions()) { @@ -47,7 +47,7 @@ } super.a(movingobjectpositionblock); -@@ -170,7 +183,9 @@ +@@ -172,7 +185,9 @@ if (f > 0.0F) { if (this.ridingEntity != null) { @@ -57,7 +57,7 @@ } double d0 = 5.0D; -@@ -197,7 +212,9 @@ +@@ -199,7 +214,9 @@ if (flag) { float f1 = f * (float) Math.sqrt((5.0D - (double) this.g((Entity) entityliving)) / 5.0D); diff --git a/nms-patches/EntityHuman.patch b/nms-patches/EntityHuman.patch index a19d48d0c..9bbe68bd1 100644 --- a/nms-patches/EntityHuman.patch +++ b/nms-patches/EntityHuman.patch @@ -114,7 +114,7 @@ return false; } else { this.ticksFarFromPlayer = 0; - if (this.dk()) { + if (this.dl()) { return false; } else { - this.releaseShoulderEntities(); diff --git a/nms-patches/EntityInsentient.patch b/nms-patches/EntityInsentient.patch index f2392c31b..ee6ceedaf 100644 --- a/nms-patches/EntityInsentient.patch +++ b/nms-patches/EntityInsentient.patch @@ -323,8 +323,8 @@ boolean flag = entity.damageEntity(DamageSource.mobAttack(this), f); @@ -1420,6 +1538,7 @@ @Override - protected void bM() { - super.bM(); + protected void bN() { + super.bN(); + this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit this.unleash(true, false); } diff --git a/nms-patches/EntityItem.patch b/nms-patches/EntityItem.patch index bda96b648..52029bd63 100644 --- a/nms-patches/EntityItem.patch +++ b/nms-patches/EntityItem.patch @@ -45,7 +45,7 @@ } + // CraftBukkit end */ - this.impulse |= this.aJ(); + this.impulse |= this.aK(); if (!this.world.isClientSide) { @@ -122,6 +132,12 @@ } diff --git a/nms-patches/EntityLiving.patch b/nms-patches/EntityLiving.patch index 6d8db8510..e537d6494 100644 --- a/nms-patches/EntityLiving.patch +++ b/nms-patches/EntityLiving.patch @@ -60,7 +60,7 @@ + this.datawatcher.set(EntityLiving.HEALTH, (float) this.getAttributeInstance(GenericAttributes.MAX_HEALTH).getValue()); this.i = true; this.az = (float) ((Math.random() + 1.0D) * 0.009999999776482582D); - this.ae(); + this.af(); @@ -184,7 +222,13 @@ double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); int i = (int) (150.0D * d1); @@ -78,7 +78,7 @@ @@ -406,7 +450,7 @@ - protected void cT() { + protected void cU() { ++this.deathTicks; - if (this.deathTicks == 20) { + if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead) @@ -345,7 +345,7 @@ return false; } else if (this.world.isClientSide) { return false; -- } else if (this.dk()) { +- } else if (this.dl()) { + } else if (this.dead || this.killed || this.getHealth() <= 0.0F) { // CraftBukkit - Don't allow entities that got set to dead/killed elsewhere to get damaged and die return false; } else if (damagesource.isFire() && this.hasEffect(MobEffects.FIRE_RESISTANCE)) { @@ -476,7 +476,7 @@ boolean flag = this.lastDamageByPlayerTime > 0; + this.dropInventory(); // CraftBukkit - from below - if (this.cV() && this.world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) { + if (this.cW() && this.world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) { this.a(damagesource, flag); this.dropDeathLoot(damagesource, i, flag); } @@ -757,7 +757,7 @@ + } + // CraftBukkit end + - public final int dy() { + public final int dz() { return (Integer) this.datawatcher.get(EntityLiving.bi); } @@ -1816,6 +2223,7 @@ diff --git a/nms-patches/EntityMinecartAbstract.patch b/nms-patches/EntityMinecartAbstract.patch index 40d9b4c5b..6e6a88a0f 100644 --- a/nms-patches/EntityMinecartAbstract.patch +++ b/nms-patches/EntityMinecartAbstract.patch @@ -95,7 +95,7 @@ this.c(this.getType() - 1); } @@ -246,7 +296,7 @@ - this.am(); + this.an(); } - this.doPortalTick(); diff --git a/nms-patches/EntityMinecartCommandBlock.patch b/nms-patches/EntityMinecartCommandBlock.patch index 1ecc34a91..b9590a622 100644 --- a/nms-patches/EntityMinecartCommandBlock.patch +++ b/nms-patches/EntityMinecartCommandBlock.patch @@ -2,7 +2,7 @@ +++ b/net/minecraft/server/EntityMinecartCommandBlock.java @@ -103,5 +103,12 @@ public CommandListenerWrapper getWrapper() { - return new CommandListenerWrapper(this, EntityMinecartCommandBlock.this.getPositionVector(), EntityMinecartCommandBlock.this.bh(), this.d(), 2, this.getName().getString(), EntityMinecartCommandBlock.this.getScoreboardDisplayName(), this.d().getMinecraftServer(), EntityMinecartCommandBlock.this); + return new CommandListenerWrapper(this, EntityMinecartCommandBlock.this.getPositionVector(), EntityMinecartCommandBlock.this.bi(), this.d(), 2, this.getName().getString(), EntityMinecartCommandBlock.this.getScoreboardDisplayName(), this.d().getMinecraftServer(), EntityMinecartCommandBlock.this); } + + // CraftBukkit start diff --git a/nms-patches/EntityMinecartFurnace.patch b/nms-patches/EntityMinecartFurnace.patch deleted file mode 100644 index af8efb5a4..000000000 --- a/nms-patches/EntityMinecartFurnace.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/EntityMinecartFurnace.java -+++ b/net/minecraft/server/EntityMinecartFurnace.java -@@ -3,7 +3,7 @@ - public class EntityMinecartFurnace extends EntityMinecartAbstract { - - private static final DataWatcherObject d = DataWatcher.a(EntityMinecartFurnace.class, DataWatcherRegistry.i); -- private int e; -+ public int e; // CraftBukkit PAIL private -> public, RENAME fuel - public double b; - public double c; - private static final RecipeItemStack f = RecipeItemStack.a(Items.COAL, Items.CHARCOAL); diff --git a/nms-patches/EntityPlayer.patch b/nms-patches/EntityPlayer.patch index 3c68aa747..b4e3b032d 100644 --- a/nms-patches/EntityPlayer.patch +++ b/nms-patches/EntityPlayer.patch @@ -28,7 +28,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { private static final Logger LOGGER = LogManager.getLogger(); -@@ -58,6 +79,20 @@ +@@ -60,6 +81,20 @@ public int ping; public boolean viewingCredits; @@ -49,10 +49,10 @@ public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) { super(worldserver, worldserver.getSpawn(), worldserver.v(), gameprofile); this.spawnDimension = World.OVERWORLD; -@@ -68,12 +103,56 @@ - this.advancementDataPlayer = minecraftserver.getPlayerList().f(this); +@@ -71,12 +106,56 @@ this.G = 1.0F; this.c(worldserver); + this.co = minecraftserver.a(this); + + // CraftBukkit start + this.displayName = this.getName(); @@ -107,7 +107,7 @@ int i = Math.max(0, this.server.a(worldserver)); int j = MathHelper.floor(worldserver.getWorldBorder().b((double) blockposition.getX(), (double) blockposition.getZ())); -@@ -139,11 +218,20 @@ +@@ -142,11 +221,20 @@ if (nbttagcompound.hasKeyOfType("recipeBook", 10)) { this.recipeBook.a(nbttagcompound.getCompound("recipeBook"), this.server.getCraftingManager()); } @@ -128,7 +128,7 @@ if (nbttagcompound.hasKeyOfType("SpawnX", 99) && nbttagcompound.hasKeyOfType("SpawnY", 99) && nbttagcompound.hasKeyOfType("SpawnZ", 99)) { this.spawn = new BlockPosition(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ")); this.spawnForced = nbttagcompound.getBoolean("SpawnForced"); -@@ -177,7 +265,20 @@ +@@ -180,7 +268,20 @@ Entity entity = this.getRootVehicle(); Entity entity1 = this.getVehicle(); @@ -150,7 +150,7 @@ NBTTagCompound nbttagcompound2 = new NBTTagCompound(); NBTTagCompound nbttagcompound3 = new NBTTagCompound(); -@@ -195,7 +296,7 @@ +@@ -198,7 +299,7 @@ nbttagcompound.setInt("SpawnZ", this.spawn.getZ()); nbttagcompound.setBoolean("SpawnForced", this.spawnForced); nbttagcompound.setFloat("SpawnAngle", this.spawnAngle); @@ -159,7 +159,7 @@ Logger logger = EntityPlayer.LOGGER; logger.getClass(); -@@ -203,9 +304,33 @@ +@@ -206,9 +307,33 @@ nbttagcompound.set("SpawnDimension", nbtbase); }); } @@ -193,7 +193,7 @@ public void a(int i) { float f = (float) this.getExpToLevel(); float f1 = (f - 1.0F) / f; -@@ -259,6 +384,11 @@ +@@ -262,6 +387,11 @@ @Override public void tick() { @@ -205,7 +205,7 @@ this.playerInteractManager.a(); --this.invulnerableTicks; if (this.noDamageTicks > 0) { -@@ -326,7 +456,7 @@ +@@ -329,7 +459,7 @@ } if (this.getHealth() != this.lastHealthSent || this.lastFoodSent != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.lastSentSaturationZero) { @@ -214,7 +214,7 @@ this.lastHealthSent = this.getHealth(); this.lastFoodSent = this.foodData.getFoodLevel(); this.lastSentSaturationZero = this.foodData.getSaturationLevel() == 0.0F; -@@ -357,6 +487,12 @@ +@@ -360,6 +490,12 @@ this.a(IScoreboardCriteria.XP, MathHelper.f((float) this.lastExpTotalScored)); } @@ -227,7 +227,7 @@ if (this.expLevel != this.lastExpLevelScored) { this.lastExpLevelScored = this.expLevel; this.a(IScoreboardCriteria.LEVEL, MathHelper.f((float) this.lastExpLevelScored)); -@@ -371,6 +507,16 @@ +@@ -374,6 +510,16 @@ CriterionTriggers.p.a(this); } @@ -244,7 +244,7 @@ } catch (Throwable throwable) { CrashReport crashreport = CrashReport.a(throwable, "Ticking player"); CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked"); -@@ -381,7 +527,8 @@ +@@ -384,7 +530,8 @@ } private void a(IScoreboardCriteria iscoreboardcriteria, int i) { @@ -254,7 +254,7 @@ scoreboardscore.setScore(i); }); } -@@ -389,9 +536,46 @@ +@@ -392,9 +539,46 @@ @Override public void die(DamageSource damagesource) { boolean flag = this.world.getGameRules().getBoolean(GameRules.SHOW_DEATH_MESSAGES); @@ -303,9 +303,9 @@ this.playerConnection.a((Packet) (new PacketPlayOutCombatEvent(this.getCombatTracker(), PacketPlayOutCombatEvent.EnumCombatEventType.ENTITY_DIED, ichatbasecomponent)), (future) -> { if (!future.isSuccess()) { -@@ -425,12 +609,18 @@ +@@ -428,12 +612,18 @@ if (this.world.getGameRules().getBoolean(GameRules.FORGIVE_DEAD_PLAYERS)) { - this.eV(); + this.eW(); } - - if (!this.isSpectator()) { @@ -326,7 +326,7 @@ EntityLiving entityliving = this.getKillingEntity(); if (entityliving != null) { -@@ -466,10 +656,12 @@ +@@ -469,10 +659,12 @@ String s = this.getName(); String s1 = entity.getName(); @@ -341,7 +341,7 @@ } else { this.a(StatisticList.MOB_KILLS); } -@@ -487,7 +679,8 @@ +@@ -490,7 +682,8 @@ int i = scoreboardteam.getColor().b(); if (i >= 0 && i < aiscoreboardcriteria.length) { @@ -351,7 +351,7 @@ } } -@@ -531,18 +724,20 @@ +@@ -534,18 +727,20 @@ } private boolean canPvP() { @@ -375,7 +375,7 @@ } else { return shapedetectorshape; } -@@ -551,11 +746,20 @@ +@@ -554,11 +749,20 @@ @Nullable @Override public Entity b(WorldServer worldserver) { @@ -399,7 +399,7 @@ this.decouple(); this.getWorldServer().removePlayer(this); if (!this.viewingCredits) { -@@ -566,6 +770,8 @@ +@@ -569,6 +773,8 @@ return this; } else { @@ -408,7 +408,7 @@ WorldData worlddata = worldserver.getWorldData(); this.playerConnection.sendPacket(new PacketPlayOutRespawn(worldserver.getDimensionManager(), worldserver.getDimensionKey(), BiomeManager.a(worldserver.getSeed()), this.playerInteractManager.getGameMode(), this.playerInteractManager.c(), worldserver.isDebugWorld(), worldserver.isFlatWorld(), true)); -@@ -575,22 +781,52 @@ +@@ -578,22 +784,52 @@ playerlist.d(this); worldserver1.removePlayer(this); this.dead = false; @@ -467,7 +467,7 @@ worldserver1.getMethodProfiler().exit(); this.triggerDimensionAdvancements(worldserver1); this.playerInteractManager.a(worldserver); -@@ -609,12 +845,31 @@ +@@ -612,12 +848,31 @@ this.lastSentExp = -1; this.lastHealthSent = -1.0F; this.lastFoodSent = -1; @@ -499,7 +499,7 @@ private void a(WorldServer worldserver, BlockPosition blockposition) { BlockPosition.MutableBlockPosition blockposition_mutableblockposition = blockposition.i(); -@@ -631,17 +886,17 @@ +@@ -634,17 +889,17 @@ } @Override @@ -522,7 +522,7 @@ } return optional1; -@@ -685,10 +940,8 @@ +@@ -688,10 +943,8 @@ this.activeContainer.c(); } @@ -535,7 +535,7 @@ if (!this.isSleeping() && this.isAlive()) { if (!this.world.getDimensionManager().isNatural()) { return Either.left(EntityHuman.EnumBedResult.NOT_POSSIBLE_HERE); -@@ -714,7 +967,36 @@ +@@ -717,7 +970,36 @@ } } @@ -573,7 +573,7 @@ this.a(StatisticList.SLEEP_IN_BED); CriterionTriggers.q.a(this); }); -@@ -723,9 +1005,8 @@ +@@ -726,9 +1008,8 @@ return either; } } @@ -584,7 +584,7 @@ } @Override -@@ -752,6 +1033,7 @@ +@@ -755,6 +1036,7 @@ @Override public void wakeup(boolean flag, boolean flag1) { @@ -592,7 +592,7 @@ if (this.isSleeping()) { this.getWorldServer().getChunkProvider().broadcastIncludingSelf(this, new PacketPlayOutAnimation(this, 2)); } -@@ -823,8 +1105,9 @@ +@@ -826,8 +1108,9 @@ this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentitysign.getPosition())); } @@ -603,7 +603,7 @@ } @Override -@@ -839,6 +1122,24 @@ +@@ -842,6 +1125,24 @@ this.nextContainerCounter(); Container container = itileinventory.createMenu(this.containerCounter, this.inventory, this); @@ -628,7 +628,7 @@ if (container == null) { if (this.isSpectator()) { this.a((IChatBaseComponent) (new ChatMessage("container.spectatorCantOpen")).a(EnumChatFormat.RED), true); -@@ -846,9 +1147,11 @@ +@@ -849,9 +1150,11 @@ return OptionalInt.empty(); } else { @@ -642,7 +642,7 @@ return OptionalInt.of(this.containerCounter); } } -@@ -861,13 +1164,24 @@ +@@ -864,13 +1167,24 @@ @Override public void openHorseInventory(EntityHorseAbstract entityhorseabstract, IInventory iinventory) { @@ -669,7 +669,7 @@ this.activeContainer.addSlotListener(this); } -@@ -912,6 +1226,11 @@ +@@ -915,6 +1229,11 @@ public void a(Container container, NonNullList nonnulllist) { this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, nonnulllist)); this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried())); @@ -681,7 +681,7 @@ } @Override -@@ -921,6 +1240,7 @@ +@@ -924,6 +1243,7 @@ @Override public void closeInventory() { @@ -689,7 +689,7 @@ this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId)); this.o(); } -@@ -955,7 +1275,7 @@ +@@ -958,7 +1278,7 @@ @Override public void a(Statistic statistic, int i) { this.serverStatisticManager.b(this, statistic, i); @@ -698,7 +698,7 @@ scoreboardscore.addScore(i); }); } -@@ -963,7 +1283,7 @@ +@@ -966,7 +1286,7 @@ @Override public void a(Statistic statistic) { this.serverStatisticManager.setStatistic(this, statistic, 0); @@ -707,7 +707,7 @@ } @Override -@@ -1012,8 +1332,17 @@ +@@ -1015,8 +1335,17 @@ public void triggerHealthUpdate() { this.lastHealthSent = -1.0E8F; @@ -725,7 +725,7 @@ @Override public void a(IChatBaseComponent ichatbasecomponent, boolean flag) { this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent, flag ? ChatMessageType.GAME_INFO : ChatMessageType.CHAT, SystemUtils.b)); -@@ -1065,12 +1394,13 @@ +@@ -1068,12 +1397,13 @@ this.lastSentExp = -1; this.lastHealthSent = -1.0F; this.lastFoodSent = -1; @@ -740,7 +740,7 @@ } @Override -@@ -1138,6 +1468,18 @@ +@@ -1141,6 +1471,18 @@ @Override public void a(EnumGamemode enumgamemode) { @@ -759,7 +759,7 @@ this.playerInteractManager.setGameMode(enumgamemode); this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.d, (float) enumgamemode.getId())); if (enumgamemode == EnumGamemode.SPECTATOR) { -@@ -1187,7 +1529,20 @@ +@@ -1190,7 +1532,20 @@ return s; } @@ -780,7 +780,7 @@ this.bY = packetplayinsettings.d(); this.bZ = packetplayinsettings.e(); this.getDataWatcher().set(EntityPlayer.bi, (byte) packetplayinsettings.f()); -@@ -1223,13 +1578,13 @@ +@@ -1226,13 +1581,13 @@ if (entity instanceof EntityHuman) { this.playerConnection.sendPacket(new PacketPlayOutEntityDestroy(new int[]{entity.getId()})); } else { @@ -796,7 +796,7 @@ } @Override -@@ -1253,7 +1608,7 @@ +@@ -1256,7 +1611,7 @@ this.spectatedEntity = (Entity) (entity == null ? this : entity); if (entity1 != this.spectatedEntity) { this.playerConnection.sendPacket(new PacketPlayOutCamera(this.spectatedEntity)); @@ -805,7 +805,7 @@ } } -@@ -1282,7 +1637,7 @@ +@@ -1285,7 +1640,7 @@ @Nullable public IChatBaseComponent getPlayerListName() { @@ -814,7 +814,7 @@ } @Override -@@ -1303,9 +1658,16 @@ +@@ -1306,9 +1661,16 @@ return this.advancementDataPlayer; } @@ -831,7 +831,7 @@ if (worldserver == this.world) { this.playerConnection.a(d0, d1, d2, f, f1); } else { -@@ -1326,6 +1688,9 @@ +@@ -1329,6 +1691,9 @@ this.server.getPlayerList().a(this, worldserver); this.server.getPlayerList().updateClient(this); } @@ -841,9 +841,9 @@ } -@@ -1418,4 +1783,144 @@ - return entityitem; - } +@@ -1426,4 +1791,144 @@ + public ITextFilter Q() { + return this.co; } + + // CraftBukkit start - Add per-player time and weather. diff --git a/nms-patches/EntityTNTPrimed.patch b/nms-patches/EntityTNTPrimed.patch index 349d19cf2..50b78af52 100644 --- a/nms-patches/EntityTNTPrimed.patch +++ b/nms-patches/EntityTNTPrimed.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/EntityTNTPrimed.java +++ b/net/minecraft/server/EntityTNTPrimed.java -@@ -1,13 +1,16 @@ +@@ -1,6 +1,7 @@ package net.minecraft.server; import javax.annotation.Nullable; @@ -8,10 +8,9 @@ public class EntityTNTPrimed extends Entity { - private static final DataWatcherObject FUSE_TICKS = DataWatcher.a(EntityTNTPrimed.class, DataWatcherRegistry.b); +@@ -8,6 +9,8 @@ @Nullable -- private EntityLiving source; -+ public EntityLiving source; // PAIL private -> public + public EntityLiving source; private int fuseTicks; + public float yield = 4; // CraftBukkit - add field + public boolean isIncendiary = false; // CraftBukkit - add field @@ -31,7 +30,7 @@ + this.die(); + // CraftBukkit end } else { - this.aJ(); + this.aK(); if (this.world.isClientSide) { @@ -71,9 +77,16 @@ } diff --git a/nms-patches/FoodMetaData.patch b/nms-patches/FoodMetaData.patch index 909db70c4..2f0e4bdf7 100644 --- a/nms-patches/FoodMetaData.patch +++ b/nms-patches/FoodMetaData.patch @@ -64,7 +64,7 @@ this.a(f); this.foodTickTimer = 0; } - } else if (flag && this.foodLevel >= 18 && entityhuman.eI()) { + } else if (flag && this.foodLevel >= 18 && entityhuman.eJ()) { ++this.foodTickTimer; if (this.foodTickTimer >= 80) { - entityhuman.heal(1.0F); diff --git a/nms-patches/HandshakeListener.patch b/nms-patches/HandshakeListener.patch index e8dce7059..f05d80a5a 100644 --- a/nms-patches/HandshakeListener.patch +++ b/nms-patches/HandshakeListener.patch @@ -17,10 +17,10 @@ private static final IChatBaseComponent a = new ChatComponentText("Ignoring status request"); private final MinecraftServer b; private final NetworkManager c; -@@ -18,6 +27,41 @@ +@@ -16,6 +25,40 @@ + switch (packethandshakinginsetprotocol.b()) { + case LOGIN: this.c.setProtocol(EnumProtocol.LOGIN); - ChatMessage chatmessage; - + // CraftBukkit start - Connection throttle + try { + long currentTime = System.currentTimeMillis(); @@ -30,7 +30,7 @@ + synchronized (throttleTracker) { + if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) { + throttleTracker.put(address, currentTime); -+ chatmessage = new ChatMessage("Connection throttled! Please wait before reconnecting."); ++ ChatMessage chatmessage = new ChatMessage("Connection throttled! Please wait before reconnecting."); + this.c.sendPacket(new PacketLoginOutDisconnect(chatmessage)); + this.c.close(chatmessage); + return; @@ -55,11 +55,10 @@ + org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); + } + // CraftBukkit end -+ - if (packethandshakinginsetprotocol.c() > SharedConstants.getGameVersion().getProtocolVersion()) { - chatmessage = new ChatMessage("multiplayer.disconnect.outdated_server", new Object[]{SharedConstants.getGameVersion().getName()}); - this.c.sendPacket(new PacketLoginOutDisconnect(chatmessage)); -@@ -28,6 +72,7 @@ + if (packethandshakinginsetprotocol.c() != SharedConstants.getGameVersion().getProtocolVersion()) { + ChatMessage chatmessage; + +@@ -29,6 +72,7 @@ this.c.close(chatmessage); } else { this.c.setPacketListener(new LoginListener(this.b, this.c)); diff --git a/nms-patches/IEntitySelector.patch b/nms-patches/IEntitySelector.patch index 971d828b8..e1ca0f263 100644 --- a/nms-patches/IEntitySelector.patch +++ b/nms-patches/IEntitySelector.patch @@ -7,5 +7,5 @@ - if (!entity1.isCollidable()) { + if (!entity1.canCollideWith(entity) || !entity.canCollideWith(entity1)) { // CraftBukkit - collidable API return false; - } else if (entity.world.isClientSide && (!(entity1 instanceof EntityHuman) || !((EntityHuman) entity1).ey())) { + } else if (entity.world.isClientSide && (!(entity1 instanceof EntityHuman) || !((EntityHuman) entity1).ez())) { return false; diff --git a/nms-patches/LoginListener.patch b/nms-patches/LoginListener.patch index bc361908f..5fa8454f9 100644 --- a/nms-patches/LoginListener.patch +++ b/nms-patches/LoginListener.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/LoginListener.java +++ b/net/minecraft/server/LoginListener.java -@@ -17,6 +17,12 @@ +@@ -18,6 +18,12 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -13,7 +13,7 @@ public class LoginListener implements PacketLoginInListener { private static final AtomicInteger b = new AtomicInteger(0); -@@ -31,6 +37,7 @@ +@@ -32,6 +38,7 @@ private final String j; private SecretKey loginKey; private EntityPlayer l; @@ -21,7 +21,7 @@ public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { this.g = LoginListener.EnumProtocolState.HELLO; -@@ -59,6 +66,20 @@ +@@ -60,6 +67,20 @@ } @@ -42,7 +42,7 @@ @Override public NetworkManager a() { return this.networkManager; -@@ -80,10 +101,12 @@ +@@ -81,10 +102,12 @@ this.i = this.a(this.i); } @@ -57,8 +57,8 @@ + // CraftBukkit end } else { this.g = LoginListener.EnumProtocolState.ACCEPTED; - if (this.server.aw() >= 0 && !this.networkManager.isLocal()) { -@@ -97,9 +120,9 @@ + if (this.server.ax() >= 0 && !this.networkManager.isLocal()) { +@@ -98,9 +121,9 @@ if (entityplayer != null) { this.g = LoginListener.EnumProtocolState.DELAY_ACCEPT; @@ -70,59 +70,59 @@ } } -@@ -147,6 +170,43 @@ - - LoginListener.this.i = LoginListener.this.server.getMinecraftSessionService().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s, this.a()); - if (LoginListener.this.i != null) { -+ // CraftBukkit start - fire PlayerPreLoginEvent -+ if (!networkManager.isConnected()) { +@@ -158,6 +181,43 @@ + try { + LoginListener.this.i = LoginListener.this.server.getMinecraftSessionService().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s, this.a()); + if (LoginListener.this.i != null) { ++ // CraftBukkit start - fire PlayerPreLoginEvent ++ if (!networkManager.isConnected()) { ++ return; ++ } ++ ++ String playerName = i.getName(); ++ java.net.InetAddress address = ((java.net.InetSocketAddress) networkManager.getSocketAddress()).getAddress(); ++ java.util.UUID uniqueId = i.getId(); ++ final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; ++ ++ AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); ++ server.getPluginManager().callEvent(asyncEvent); ++ ++ if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { ++ final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); ++ if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { ++ event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); ++ } ++ Waitable waitable = new Waitable() { ++ @Override ++ protected PlayerPreLoginEvent.Result evaluate() { ++ server.getPluginManager().callEvent(event); ++ return event.getResult(); ++ }}; ++ ++ LoginListener.this.server.processQueue.add(waitable); ++ if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { ++ disconnect(event.getKickMessage()); + return; + } -+ -+ String playerName = i.getName(); -+ java.net.InetAddress address = ((java.net.InetSocketAddress) networkManager.getSocketAddress()).getAddress(); -+ java.util.UUID uniqueId = i.getId(); -+ final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; -+ -+ AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); -+ server.getPluginManager().callEvent(asyncEvent); -+ -+ if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { -+ final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); -+ if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { -+ event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); -+ } -+ Waitable waitable = new Waitable() { -+ @Override -+ protected PlayerPreLoginEvent.Result evaluate() { -+ server.getPluginManager().callEvent(event); -+ return event.getResult(); -+ }}; -+ -+ LoginListener.this.server.processQueue.add(waitable); -+ if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { -+ disconnect(event.getKickMessage()); -+ return; -+ } -+ } else { -+ if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { -+ disconnect(asyncEvent.getKickMessage()); -+ return; -+ } ++ } else { ++ if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { ++ disconnect(asyncEvent.getKickMessage()); ++ return; + } -+ // CraftBukkit end - LoginListener.LOGGER.info("UUID of player {} is {}", LoginListener.this.i.getName(), LoginListener.this.i.getId()); - LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; - } else if (LoginListener.this.server.isEmbeddedServer()) { -@@ -166,6 +226,11 @@ - LoginListener.this.disconnect(new ChatMessage("multiplayer.disconnect.authservers_down")); - LoginListener.LOGGER.error("Couldn't verify username because servers are unavailable"); - } -+ // CraftBukkit start - catch all exceptions -+ } catch (Exception exception) { -+ disconnect("Failed to verify username!"); -+ server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + gameprofile.getName(), exception); ++ } + // CraftBukkit end + LoginListener.LOGGER.info("UUID of player {} is {}", LoginListener.this.i.getName(), LoginListener.this.i.getId()); + LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + } else if (LoginListener.this.server.isEmbeddedServer()) { +@@ -177,6 +237,11 @@ + LoginListener.this.disconnect(new ChatMessage("multiplayer.disconnect.authservers_down")); + LoginListener.LOGGER.error("Couldn't verify username because servers are unavailable"); } - ++ // CraftBukkit start - catch all exceptions ++ } catch (Exception exception) { ++ disconnect("Failed to verify username!"); ++ server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + gameprofile.getName(), exception); ++ // CraftBukkit end } + + } diff --git a/nms-patches/Main.patch b/nms-patches/Main.patch index 3d3d6df7b..4cad0c466 100644 --- a/nms-patches/Main.patch +++ b/nms-patches/Main.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -28,7 +28,8 @@ +@@ -27,7 +27,8 @@ public Main() {} @@ -10,7 +10,7 @@ OptionParser optionparser = new OptionParser(); OptionSpec optionspec = optionparser.accepts("nogui"); OptionSpec optionspec1 = optionparser.accepts("initSettings", "Initializes 'server.properties' and 'eula.txt', then quits"); -@@ -52,20 +53,22 @@ +@@ -51,20 +52,22 @@ optionparser.printHelpOn(System.err); return; } @@ -35,13 +35,13 @@ Main.LOGGER.info("Initialized '{}' and '{}'", java_nio_file_path.toAbsolutePath(), java_nio_file_path1.toAbsolutePath()); return; } -@@ -75,24 +78,42 @@ +@@ -74,24 +77,42 @@ return; } - File file = new File((String) optionset.valueOf(optionspec9)); + File file = (File) optionset.valueOf("universe"); // CraftBukkit - YggdrasilAuthenticationService yggdrasilauthenticationservice = new YggdrasilAuthenticationService(Proxy.NO_PROXY, UUID.randomUUID().toString()); + YggdrasilAuthenticationService yggdrasilauthenticationservice = new YggdrasilAuthenticationService(Proxy.NO_PROXY); MinecraftSessionService minecraftsessionservice = yggdrasilauthenticationservice.createMinecraftSessionService(); GameProfileRepository gameprofilerepository = yggdrasilauthenticationservice.createProfileRepository(); UserCache usercache = new UserCache(gameprofilerepository, new File(file, MinecraftServer.b.getName())); @@ -82,7 +82,7 @@ DataPackConfiguration datapackconfiguration1 = MinecraftServer.a(resourcepackrepository, datapackconfiguration == null ? DataPackConfiguration.a : datapackconfiguration, flag); CompletableFuture completablefuture = DataPackResources.a(resourcepackrepository.f(), CommandDispatcher.ServerType.DEDICATED, dedicatedserversettings.getProperties().functionPermissionLevel, SystemUtils.f(), Runnable::run); -@@ -107,6 +128,7 @@ +@@ -106,6 +127,7 @@ } datapackresources.i(); @@ -90,7 +90,7 @@ RegistryReadOps registryreadops = RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, datapackresources.h(), iregistrycustom_dimension); Object object = convertable_conversionsession.a((DynamicOps) registryreadops, datapackconfiguration1); -@@ -134,21 +156,32 @@ +@@ -133,21 +155,32 @@ } convertable_conversionsession.a((IRegistryCustom) iregistrycustom_dimension, (SaveData) object); @@ -109,7 +109,7 @@ + boolean flag1 = !optionset.has("nogui") && !optionset.nonOptionArguments().contains("nogui"); if (flag1 && !GraphicsEnvironment.isHeadless()) { - dedicatedserver1.bc(); + dedicatedserver1.bd(); } + if (optionset.has("port")) { @@ -125,7 +125,7 @@ Thread thread = new Thread("Server Shutdown Thread") { public void run() { dedicatedserver.safeShutdown(true); -@@ -157,14 +190,15 @@ +@@ -156,14 +189,15 @@ thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(Main.LOGGER)); Runtime.getRuntime().addShutdownHook(thread); diff --git a/nms-patches/MinecraftServer.patch b/nms-patches/MinecraftServer.patch index 6474373db..5f1a9ae17 100644 --- a/nms-patches/MinecraftServer.patch +++ b/nms-patches/MinecraftServer.patch @@ -61,7 +61,7 @@ - public MinecraftServer(Thread thread, IRegistryCustom.Dimension iregistrycustom_dimension, Convertable.ConversionSession convertable_conversionsession, SaveData savedata, ResourcePackRepository resourcepackrepository, Proxy proxy, DataFixer datafixer, DataPackResources datapackresources, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache, WorldLoadListenerFactory worldloadlistenerfactory) { + public MinecraftServer(OptionSet options, DataPackConfiguration datapackconfiguration, Thread thread, IRegistryCustom.Dimension iregistrycustom_dimension, Convertable.ConversionSession convertable_conversionsession, SaveData savedata, ResourcePackRepository resourcepackrepository, Proxy proxy, DataFixer datafixer, DataPackResources datapackresources, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache, WorldLoadListenerFactory worldloadlistenerfactory) { super("Server"); - this.m = new GameProfilerSwitcher(SystemUtils.a, this::ah); + this.m = new GameProfilerSwitcher(SystemUtils.a, this::ai); this.methodProfiler = GameProfilerDisabled.a; this.serverPing = new ServerPing(); this.r = new Random(); @@ -447,7 +447,7 @@ + // CraftBukkit end worldloadlistener.b(); chunkproviderserver.getLightEngine().a(5); - this.bb(); + this.bc(); + + // CraftBukkit start + this.forceTicks = false; @@ -616,7 +616,7 @@ } public CrashReport b(CrashReport crashreport) { -@@ -1214,16 +1472,17 @@ +@@ -1220,16 +1478,17 @@ public CompletableFuture a(Collection collection) { CompletableFuture completablefuture = CompletableFuture.supplyAsync(() -> { @@ -636,7 +636,7 @@ this.resourcePackRepository.a(collection); this.saveData.a(a(this.resourcePackRepository)); datapackresources.i(); -@@ -1589,6 +1848,22 @@ +@@ -1595,6 +1854,22 @@ } diff --git a/nms-patches/MobEffectList.patch b/nms-patches/MobEffectList.patch index 52a8db6f3..b3e7e1ce0 100644 --- a/nms-patches/MobEffectList.patch +++ b/nms-patches/MobEffectList.patch @@ -53,8 +53,8 @@ + ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); + // CraftBukkit end } - } else if ((this != MobEffects.HEAL || entityliving.di()) && (this != MobEffects.HARM || !entityliving.di())) { - if (this == MobEffects.HARM && !entityliving.di() || this == MobEffects.HEAL && entityliving.di()) { + } else if ((this != MobEffects.HEAL || entityliving.dj()) && (this != MobEffects.HARM || !entityliving.dj())) { + if (this == MobEffects.HARM && !entityliving.dj() || this == MobEffects.HEAL && entityliving.dj()) { entityliving.damageEntity(DamageSource.MAGIC, (float) (6 << i)); } } else { diff --git a/nms-patches/PathfinderGoalHurtByTarget.patch b/nms-patches/PathfinderGoalHurtByTarget.patch index e96c26d7d..097e86ac9 100644 --- a/nms-patches/PathfinderGoalHurtByTarget.patch +++ b/nms-patches/PathfinderGoalHurtByTarget.patch @@ -7,7 +7,7 @@ - this.e.setGoalTarget(this.e.getLastDamager()); + this.e.setGoalTarget(this.e.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason this.g = this.e.getGoalTarget(); - this.c = this.e.cZ(); + this.c = this.e.da(); this.h = 300; @@ -100,6 +100,6 @@ } diff --git a/nms-patches/PathfinderGoalSit.patch b/nms-patches/PathfinderGoalSit.patch index 7d6e8df64..047feacc8 100644 --- a/nms-patches/PathfinderGoalSit.patch +++ b/nms-patches/PathfinderGoalSit.patch @@ -6,6 +6,6 @@ if (!this.entity.isTamed()) { - return false; + return this.entity.isWillSit() && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals - } else if (this.entity.aG()) { + } else if (this.entity.aH()) { return false; } else if (!this.entity.isOnGround()) { diff --git a/nms-patches/PlayerConnection.patch b/nms-patches/PlayerConnection.patch index 50750f0b6..9ee7c3fa1 100644 --- a/nms-patches/PlayerConnection.patch +++ b/nms-patches/PlayerConnection.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/PlayerConnection.java +++ b/net/minecraft/server/PlayerConnection.java -@@ -18,6 +18,48 @@ +@@ -24,6 +24,48 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -49,7 +49,7 @@ public class PlayerConnection implements PacketListenerPlayIn { private static final Logger LOGGER = LogManager.getLogger(); -@@ -28,7 +70,10 @@ +@@ -34,7 +76,10 @@ private long lastKeepAlive; private boolean awaitingKeepAlive; private long h; @@ -61,15 +61,14 @@ private int j; private final Int2ShortMap k = new Int2ShortOpenHashMap(); private double l; -@@ -60,7 +105,33 @@ - networkmanager.setPacketListener(this); - this.player = entityplayer; - entityplayer.playerConnection = this; -+ +@@ -72,8 +117,33 @@ + itextfilter.a(); + } + + // CraftBukkit start - add fields and methods + this.server = minecraftserver.server; -+ } -+ + } + + private final org.bukkit.craftbukkit.CraftServer server; + public boolean processedDisconnect; + private int lastTick = MinecraftServer.currentTick; @@ -90,12 +89,13 @@ + + public CraftPlayer getPlayer() { + return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); - } ++ } + // CraftBukkit end - ++ public void tick() { this.syncPosition(); -@@ -109,7 +180,7 @@ + this.player.lastX = this.player.locX(); +@@ -121,7 +191,7 @@ this.minecraftServer.getMethodProfiler().enter("keepAlive"); long i = SystemUtils.getMonotonicMillis(); @@ -104,7 +104,7 @@ if (this.awaitingKeepAlive) { this.disconnect(new ChatMessage("disconnect.timeout")); } else { -@@ -121,15 +192,21 @@ +@@ -133,15 +203,21 @@ } this.minecraftServer.getMethodProfiler().exit(); @@ -126,7 +126,7 @@ this.disconnect(new ChatMessage("multiplayer.disconnect.idling")); } -@@ -153,16 +230,46 @@ +@@ -165,16 +241,46 @@ return this.minecraftServer.a(this.player.getProfile()); } @@ -173,8 +173,17 @@ + minecraftserver.postToMainThread(networkmanager::handleDisconnection); } - @Override -@@ -203,7 +310,34 @@ + private void a(T t0, Consumer consumer, BiFunction>> bifunction) { +@@ -190,7 +296,7 @@ + ITextFilter itextfilter = this.player.Q(); + + if (itextfilter != null) { +- ((CompletableFuture) bifunction.apply(itextfilter, t0)).thenAcceptAsync((optional) -> { ++ (bifunction.apply(itextfilter, t0)).thenAcceptAsync((optional) -> { // CraftBukkit - decompile error + optional.ifPresent(consumer1); + }, iasynctaskhandler); + } else { +@@ -247,7 +353,34 @@ double d9 = entity.getMot().g(); double d10 = d6 * d6 + d7 * d7 + d8 * d8; @@ -210,7 +219,7 @@ PlayerConnection.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", entity.getDisplayName().getString(), this.player.getDisplayName().getString(), d6, d7, d8); this.networkManager.sendPacket(new PacketPlayOutVehicleMove(entity)); return; -@@ -233,14 +367,72 @@ +@@ -277,14 +410,72 @@ } entity.setLocation(d3, d4, d5, f, f1); @@ -283,7 +292,7 @@ this.player.getWorldServer().getChunkProvider().movePlayer(this.player); this.player.checkMovement(this.player.locX() - d0, this.player.locY() - d1, this.player.locZ() - d2); this.D = d11 >= -0.03125D && !this.minecraftServer.getAllowFlight() && this.a(entity); -@@ -259,7 +451,7 @@ +@@ -303,7 +494,7 @@ @Override public void a(PacketPlayInTeleportAccept packetplayinteleportaccept) { PlayerConnectionUtils.ensureMainThread(packetplayinteleportaccept, this, this.player.getWorldServer()); @@ -292,7 +301,7 @@ this.player.setLocation(this.teleportPos.x, this.teleportPos.y, this.teleportPos.z, this.player.yaw, this.player.pitch); this.o = this.teleportPos.x; this.p = this.teleportPos.y; -@@ -269,6 +461,7 @@ +@@ -313,6 +504,7 @@ } this.teleportPos = null; @@ -300,7 +309,7 @@ } } -@@ -276,7 +469,7 @@ +@@ -320,7 +512,7 @@ @Override public void a(PacketPlayInRecipeDisplayed packetplayinrecipedisplayed) { PlayerConnectionUtils.ensureMainThread(packetplayinrecipedisplayed, this, this.player.getWorldServer()); @@ -309,7 +318,7 @@ RecipeBookServer recipebookserver = this.player.getRecipeBook(); optional.ifPresent(recipebookserver::e); -@@ -305,6 +498,12 @@ +@@ -349,6 +541,12 @@ @Override public void a(PacketPlayInTabComplete packetplayintabcomplete) { PlayerConnectionUtils.ensureMainThread(packetplayintabcomplete, this, this.player.getWorldServer()); @@ -322,7 +331,7 @@ StringReader stringreader = new StringReader(packetplayintabcomplete.c()); if (stringreader.canRead() && stringreader.peek() == '/') { -@@ -314,6 +513,7 @@ +@@ -358,6 +556,7 @@ ParseResults parseresults = this.minecraftServer.getCommandDispatcher().a().parse(stringreader, this.player.getCommandListener()); this.minecraftServer.getCommandDispatcher().a().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { @@ -330,7 +339,7 @@ this.networkManager.sendPacket(new PacketPlayOutTabComplete(packetplayintabcomplete.b(), suggestions)); }); } -@@ -542,6 +742,7 @@ +@@ -586,6 +785,7 @@ if (container instanceof ContainerMerchant) { ContainerMerchant containermerchant = (ContainerMerchant) container; @@ -338,35 +347,49 @@ containermerchant.d(i); containermerchant.g(i); -@@ -552,6 +753,14 @@ +@@ -595,6 +795,13 @@ + @Override public void a(PacketPlayInBEdit packetplayinbedit) { - PlayerConnectionUtils.ensureMainThread(packetplayinbedit, this, this.player.getWorldServer()); + // CraftBukkit start + if (this.lastBookTick + 20 > MinecraftServer.currentTick) { + this.disconnect("Book edited too quickly!"); + return; + } + this.lastBookTick = MinecraftServer.currentTick; -+ EnumItemSlot enumitemslot = packetplayinbedit.d() == EnumHand.MAIN_HAND ? EnumItemSlot.MAINHAND : EnumItemSlot.OFFHAND; + // CraftBukkit end ItemStack itemstack = packetplayinbedit.b(); - if (!itemstack.isEmpty()) { -@@ -580,9 +789,11 @@ - } + if (itemstack.getItem() == Items.WRITABLE_BOOK) { +@@ -610,13 +817,15 @@ - itemstack2.a("pages", (NBTBase) nbttaglist); -- this.player.a(packetplayinbedit.d(), itemstack2); -+ this.player.a(packetplayinbedit.d(), CraftEventFactory.handleEditBookEvent(player, enumitemslot, itemstack1, itemstack2)); // CraftBukkit - } else { -+ ItemStack old = itemstack1.cloneItemStack(); // CraftBukkit - itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); -+ CraftEventFactory.handleEditBookEvent(player, enumitemslot, old, itemstack1); // CraftBukkit - } + NBTTagList nbttaglist = nbttagcompound.getList("pages", 8); + +- int i; ++ // CraftBukkit start - decompile error ++ // int i; + +- for (i = 0; i < nbttaglist.size(); ++i) { ++ for (int i = 0; i < nbttaglist.size(); ++i) { + list.add(nbttaglist.getString(i)); } -@@ -624,7 +835,7 @@ +- i = packetplayinbedit.d(); ++ int i = packetplayinbedit.d(); ++ // CraftBukkit end + if (PlayerInventory.d(i) || i == 40) { + this.a((List) list, flag ? (list1) -> { + this.a((String) list1.get(0), list1.subList(1, list1.size()), i); +@@ -664,7 +873,7 @@ + } + + itemstack1.a("pages", (NBTBase) nbttaglist); +- this.player.inventory.setItem(i, itemstack1); ++ this.player.inventory.setItem(i, CraftEventFactory.handleEditBookEvent(player, i, itemstack, itemstack1)); // CraftBukkit + } + } + +@@ -702,7 +911,7 @@ } else { WorldServer worldserver = this.player.getWorldServer(); @@ -375,7 +398,7 @@ if (this.e == 0) { this.syncPosition(); } -@@ -634,13 +845,21 @@ +@@ -712,13 +921,21 @@ this.A = this.e; this.a(this.teleportPos.x, this.teleportPos.y, this.teleportPos.z, this.player.yaw, this.player.pitch); } @@ -398,7 +421,7 @@ double d0 = this.player.locX(); double d1 = this.player.locY(); double d2 = this.player.locZ(); -@@ -665,15 +884,33 @@ +@@ -743,15 +960,33 @@ ++this.receivedMovePackets; int i = this.receivedMovePackets - this.processedMovePackets; @@ -434,7 +457,7 @@ PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", this.player.getDisplayName().getString(), d7, d8, d9); this.a(this.player.locX(), this.player.locY(), this.player.locZ(), this.player.yaw, this.player.pitch); return; -@@ -692,6 +929,7 @@ +@@ -770,6 +1005,7 @@ } this.player.move(EnumMoveType.PLAYER, new Vec3D(d7, d8, d9)); @@ -442,7 +465,7 @@ double d12 = d8; d7 = d4 - this.player.locX(); -@@ -713,10 +951,74 @@ +@@ -791,10 +1027,74 @@ if (!this.player.noclip && !this.player.isSleeping() && (flag1 && worldserver.getCubes(this.player, axisalignedbb) || this.a((IWorldReader) worldserver, axisalignedbb))) { this.a(d0, d1, d2, f, f1); } else { @@ -519,7 +542,7 @@ if (flag) { this.player.fallDistance = 0.0F; } -@@ -745,10 +1047,66 @@ +@@ -823,10 +1123,66 @@ } public void a(double d0, double d1, double d2, float f, float f1) { @@ -587,7 +610,7 @@ double d3 = set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.X) ? this.player.locX() : 0.0D; double d4 = set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.Y) ? this.player.locY() : 0.0D; double d5 = set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.Z) ? this.player.locZ() : 0.0D; -@@ -760,6 +1118,14 @@ +@@ -838,6 +1194,14 @@ this.teleportAwait = 0; } @@ -602,7 +625,7 @@ this.A = this.e; this.player.setLocation(d0, d1, d2, f, f1); this.player.playerConnection.sendPacket(new PacketPlayOutPosition(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.teleportAwait)); -@@ -768,6 +1134,7 @@ +@@ -846,6 +1210,7 @@ @Override public void a(PacketPlayInBlockDig packetplayinblockdig) { PlayerConnectionUtils.ensureMainThread(packetplayinblockdig, this, this.player.getWorldServer()); @@ -610,7 +633,7 @@ BlockPosition blockposition = packetplayinblockdig.b(); this.player.resetIdleTimer(); -@@ -778,14 +1145,46 @@ +@@ -856,14 +1221,46 @@ if (!this.player.isSpectator()) { ItemStack itemstack = this.player.b(EnumHand.OFF_HAND); @@ -659,7 +682,7 @@ this.player.dropItem(false); } -@@ -822,6 +1221,7 @@ +@@ -900,6 +1297,7 @@ @Override public void a(PacketPlayInUseItem packetplayinuseitem) { PlayerConnectionUtils.ensureMainThread(packetplayinuseitem, this, this.player.getWorldServer()); @@ -667,7 +690,7 @@ WorldServer worldserver = this.player.getWorldServer(); EnumHand enumhand = packetplayinuseitem.b(); ItemStack itemstack = this.player.b(enumhand); -@@ -832,6 +1232,14 @@ +@@ -910,6 +1308,14 @@ this.player.resetIdleTimer(); if (blockposition.getY() < this.minecraftServer.getMaxBuildHeight()) { if (this.teleportPos == null && this.player.h((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D) < 64.0D && worldserver.a((EntityHuman) this.player, blockposition)) { @@ -682,7 +705,7 @@ EnumInteractionResult enuminteractionresult = this.player.playerInteractManager.a(this.player, worldserver, itemstack, enumhand, movingobjectpositionblock); if (enumdirection == EnumDirection.UP && !enuminteractionresult.a() && blockposition.getY() >= this.minecraftServer.getMaxBuildHeight() - 1 && a(this.player, itemstack)) { -@@ -855,12 +1263,51 @@ +@@ -933,12 +1339,51 @@ @Override public void a(PacketPlayInBlockPlace packetplayinblockplace) { PlayerConnectionUtils.ensureMainThread(packetplayinblockplace, this, this.player.getWorldServer()); @@ -734,7 +757,7 @@ EnumInteractionResult enuminteractionresult = this.player.playerInteractManager.a(this.player, worldserver, itemstack, enumhand); if (enuminteractionresult.b()) { -@@ -881,7 +1328,7 @@ +@@ -959,7 +1404,7 @@ Entity entity = packetplayinspectate.a(worldserver); if (entity != null) { @@ -743,7 +766,7 @@ return; } } -@@ -890,7 +1337,12 @@ +@@ -968,7 +1413,12 @@ } @Override @@ -757,7 +780,7 @@ @Override public void a(PacketPlayInBoatMove packetplayinboatmove) { -@@ -905,11 +1357,26 @@ +@@ -983,11 +1433,26 @@ @Override public void a(IChatBaseComponent ichatbasecomponent) { @@ -782,10 +805,10 @@ + this.minecraftServer.getPlayerList().sendMessage(CraftChatMessage.fromString(quitMessage)); + } + // CraftBukkit end - if (this.isExemptPlayer()) { - PlayerConnection.LOGGER.info("Stopping singleplayer server as player logged out"); - this.minecraftServer.safeShutdown(false); -@@ -935,6 +1402,15 @@ + ITextFilter itextfilter = this.player.Q(); + + if (itextfilter != null) { +@@ -1019,6 +1484,15 @@ } } @@ -801,7 +824,7 @@ try { this.networkManager.sendPacket(packet, genericfuturelistener); } catch (Throwable throwable) { -@@ -951,7 +1427,16 @@ +@@ -1035,7 +1509,16 @@ @Override public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) { PlayerConnectionUtils.ensureMainThread(packetplayinhelditemslot, this, this.player.getWorldServer()); @@ -818,7 +841,7 @@ if (this.player.inventory.itemInHandIndex != packetplayinhelditemslot.b() && this.player.getRaisedHand() == EnumHand.MAIN_HAND) { this.player.clearActiveItem(); } -@@ -960,13 +1445,24 @@ +@@ -1044,65 +1527,286 @@ this.player.resetIdleTimer(); } else { PlayerConnection.LOGGER.warn("{} tried to set an invalid carried item", this.player.getDisplayName().getString()); @@ -828,30 +851,37 @@ @Override public void a(PacketPlayInChat packetplayinchat) { -- PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.getWorldServer()); -- if (this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { + // CraftBukkit start - async chat + // SPIGOT-3638 + if (this.minecraftServer.isStopped()) { + return; + } -+ -+ boolean isSync = packetplayinchat.b().startsWith("/"); -+ if (packetplayinchat.b().startsWith("/")) { -+ PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.getWorldServer()); -+ } + // CraftBukkit end + String s = StringUtils.normalizeSpace(packetplayinchat.b()); + + if (s.startsWith("/")) { + PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.getWorldServer()); + this.c(s); + } else { +- this.a(s, this::c); ++ this.c(s); // CraftBukkit - filter NYI + } + + } + + private void c(String s) { +- if (this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { + if (this.player.dead || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { // CraftBukkit - dead men tell no tales this.sendPacket(new PacketPlayOutChat((new ChatMessage("chat.cannotSend")).a(EnumChatFormat.RED), ChatMessageType.SYSTEM, SystemUtils.b)); } else { this.player.resetIdleTimer(); -@@ -974,41 +1470,254 @@ ++ boolean isSync = s.startsWith("/"); // CraftBukkit for (int i = 0; i < s.length(); ++i) { if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { - this.disconnect(new ChatMessage("multiplayer.disconnect.illegal_characters")); + // CraftBukkit start - threadsafety -+ if (!isSync) { ++ if (!s.startsWith("/")) { + Waitable waitable = new Waitable() { + @Override + protected Object evaluate() { @@ -1107,7 +1137,7 @@ this.player.resetIdleTimer(); IJumpable ijumpable; -@@ -1066,6 +1775,7 @@ +@@ -1160,6 +1864,7 @@ @Override public void a(PacketPlayInUseEntity packetplayinuseentity) { PlayerConnectionUtils.ensureMainThread(packetplayinuseentity, this, this.player.getWorldServer()); @@ -1115,7 +1145,7 @@ WorldServer worldserver = this.player.getWorldServer(); Entity entity = packetplayinuseentity.a((World) worldserver); -@@ -1079,18 +1789,72 @@ +@@ -1173,18 +1878,72 @@ ItemStack itemstack = enumhand != null ? this.player.b(enumhand).cloneItemStack() : ItemStack.b; Optional optional = Optional.empty(); @@ -1189,7 +1219,7 @@ } if (optional.isPresent() && ((EnumInteractionResult) optional.get()).a()) { -@@ -1137,15 +1901,21 @@ +@@ -1231,15 +1990,21 @@ @Override public void a(PacketPlayInCloseWindow packetplayinclosewindow) { PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.getWorldServer()); @@ -1213,7 +1243,7 @@ NonNullList nonnulllist = NonNullList.a(); for (int i = 0; i < this.player.activeContainer.slots.size(); ++i) { -@@ -1154,8 +1924,274 @@ +@@ -1248,8 +2013,274 @@ this.player.a(this.player.activeContainer, nonnulllist); } else { @@ -1489,7 +1519,7 @@ if (ItemStack.matches(packetplayinwindowclick.f(), itemstack)) { this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.b(), packetplayinwindowclick.e(), true)); this.player.e = true; -@@ -1195,6 +2231,7 @@ +@@ -1289,6 +2320,7 @@ @Override public void a(PacketPlayInEnchantItem packetplayinenchantitem) { PlayerConnectionUtils.ensureMainThread(packetplayinenchantitem, this, this.player.getWorldServer()); @@ -1497,7 +1527,7 @@ this.player.resetIdleTimer(); if (this.player.activeContainer.windowId == packetplayinenchantitem.b() && this.player.activeContainer.c(this.player) && !this.player.isSpectator()) { this.player.activeContainer.a((EntityHuman) this.player, packetplayinenchantitem.c()); -@@ -1227,6 +2264,43 @@ +@@ -1321,6 +2353,43 @@ boolean flag1 = packetplayinsetcreativeslot.b() >= 1 && packetplayinsetcreativeslot.b() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamage() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); @@ -1541,7 +1571,7 @@ if (flag1 && flag2) { if (itemstack.isEmpty()) { -@@ -1248,6 +2322,7 @@ +@@ -1342,6 +2411,7 @@ @Override public void a(PacketPlayInTransaction packetplayintransaction) { PlayerConnectionUtils.ensureMainThread(packetplayintransaction, this, this.player.getWorldServer()); @@ -1549,15 +1579,15 @@ int i = this.player.activeContainer.windowId; if (i == packetplayintransaction.b() && this.k.getOrDefault(i, (short) (packetplayintransaction.c() + 1)) == packetplayintransaction.c() && !this.player.activeContainer.c(this.player) && !this.player.isSpectator()) { -@@ -1259,6 +2334,7 @@ - @Override - public void a(PacketPlayInUpdateSign packetplayinupdatesign) { - PlayerConnectionUtils.ensureMainThread(packetplayinupdatesign, this, this.player.getWorldServer()); +@@ -1360,6 +2430,7 @@ + } + + private void a(PacketPlayInUpdateSign packetplayinupdatesign, List list) { + if (this.player.isFrozen()) return; // CraftBukkit this.player.resetIdleTimer(); WorldServer worldserver = this.player.getWorldServer(); BlockPosition blockposition = packetplayinupdatesign.b(); -@@ -1275,14 +2351,30 @@ +@@ -1376,12 +2447,28 @@ if (!tileentitysign.d() || tileentitysign.f() != this.player) { PlayerConnection.LOGGER.warn("Player {} just tried to change non-editable sign", this.player.getDisplayName().getString()); @@ -1565,8 +1595,6 @@ return; } - String[] astring = packetplayinupdatesign.c(); - + // CraftBukkit start + Player player = this.server.getPlayer(this.player); + int x = packetplayinupdatesign.b().getX(); @@ -1574,9 +1602,9 @@ + int z = packetplayinupdatesign.b().getZ(); + String[] lines = new String[4]; + - for (int i = 0; i < astring.length; ++i) { -- tileentitysign.a(i, new ChatComponentText(EnumChatFormat.a(astring[i]))); -+ lines[i] = EnumChatFormat.a(new ChatComponentText(EnumChatFormat.a(astring[i])).getString()); + for (int i = 0; i < list.size(); ++i) { +- tileentitysign.a(i, new ChatComponentText((String) list.get(i))); ++ lines[i] = EnumChatFormat.a(new ChatComponentText(EnumChatFormat.a((String) list.get(i))).getString()); } + SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.server.getPlayer(this.player), lines); + this.server.getPluginManager().callEvent(event); @@ -1589,7 +1617,7 @@ tileentitysign.update(); worldserver.notify(blockposition, iblockdata, iblockdata, 3); -@@ -1292,6 +2384,7 @@ +@@ -1391,6 +2478,7 @@ @Override public void a(PacketPlayInKeepAlive packetplayinkeepalive) { @@ -1597,7 +1625,7 @@ if (this.awaitingKeepAlive && packetplayinkeepalive.b() == this.h) { int i = (int) (SystemUtils.getMonotonicMillis() - this.lastKeepAlive); -@@ -1306,7 +2399,17 @@ +@@ -1405,7 +2493,17 @@ @Override public void a(PacketPlayInAbilities packetplayinabilities) { PlayerConnectionUtils.ensureMainThread(packetplayinabilities, this, this.player.getWorldServer()); @@ -1616,7 +1644,7 @@ } @Override -@@ -1315,8 +2418,50 @@ +@@ -1414,8 +2512,50 @@ this.player.a(packetplayinsettings); } diff --git a/nms-patches/RegionLimitedWorldAccess.patch b/nms-patches/RegionLimitedWorldAccess.patch index 8759110f0..27a411c78 100644 --- a/nms-patches/RegionLimitedWorldAccess.patch +++ b/nms-patches/RegionLimitedWorldAccess.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/RegionLimitedWorldAccess.java +++ b/net/minecraft/server/RegionLimitedWorldAccess.java -@@ -234,6 +234,13 @@ +@@ -236,6 +236,13 @@ @Override public boolean addEntity(Entity entity) { diff --git a/nms-patches/World.patch b/nms-patches/World.patch index 9571fc948..0553b4cd0 100644 --- a/nms-patches/World.patch +++ b/nms-patches/World.patch @@ -296,7 +296,7 @@ } } } -@@ -505,12 +694,25 @@ +@@ -509,12 +698,25 @@ @Nullable @Override @@ -322,7 +322,7 @@ TileEntity tileentity = null; if (this.tickingTileEntities) { -@@ -545,6 +747,13 @@ +@@ -549,6 +751,13 @@ public void setTileEntity(BlockPosition blockposition, @Nullable TileEntity tileentity) { if (!isOutsideWorld(blockposition)) { if (tileentity != null && !tileentity.isRemoved()) { @@ -336,7 +336,7 @@ if (this.tickingTileEntities) { tileentity.setLocation(this, blockposition); Iterator iterator = this.tileEntityListPending.iterator(); -@@ -569,7 +778,7 @@ +@@ -573,7 +782,7 @@ } public void removeTileEntity(BlockPosition blockposition) { diff --git a/nms-patches/WorldAccess.patch b/nms-patches/WorldAccess.patch index da85625cd..25cfac4ec 100644 --- a/nms-patches/WorldAccess.patch +++ b/nms-patches/WorldAccess.patch @@ -4,13 +4,13 @@ WorldServer getMinecraftWorld(); default void addAllEntities(Entity entity) { -- entity.co().forEach(this::addEntity); +- entity.cp().forEach(this::addEntity); + // CraftBukkit start + this.addAllEntities(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); } + + default boolean addAllEntities(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { -+ entity.co().forEach((e) -> this.addEntity(e, reason)); ++ entity.cp().forEach((e) -> this.addEntity(e, reason)); + return !entity.dead; + } + // CraftBukkit end diff --git a/nms-patches/WorldServer.patch b/nms-patches/WorldServer.patch index 2e096ae01..693ff9227 100644 --- a/nms-patches/WorldServer.patch +++ b/nms-patches/WorldServer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/WorldServer.java +++ b/net/minecraft/server/WorldServer.java -@@ -35,6 +35,18 @@ +@@ -39,6 +39,18 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -19,7 +19,7 @@ public class WorldServer extends World implements GeneratorAccessSeed { public static final BlockPosition a = new BlockPosition(100, 50, 0); -@@ -46,7 +58,7 @@ +@@ -50,7 +62,7 @@ private final ChunkProviderServer chunkProvider; boolean tickingEntities; private final MinecraftServer server; @@ -28,7 +28,7 @@ public boolean savingDisabled; private boolean everyoneSleeping; private int emptyTime; -@@ -63,8 +75,23 @@ +@@ -67,8 +79,23 @@ private final StructureManager structureManager; private final boolean Q; @@ -54,7 +54,7 @@ this.nextTickListBlock = new TickListServer<>(this, (block) -> { return block == null || block.getBlockData().isAir(); }, IRegistry.BLOCK::getKey, this::b); -@@ -76,10 +103,17 @@ +@@ -80,10 +107,17 @@ this.Q = flag1; this.server = minecraftserver; this.mobSpawners = list; @@ -71,9 +71,9 @@ }); + // CraftBukkit end this.portalTravelAgent = new PortalTravelAgent(this); - this.P(); this.Q(); -@@ -91,14 +125,48 @@ + this.R(); +@@ -95,14 +129,48 @@ iworlddataserver.setGameType(minecraftserver.getGamemode()); } @@ -124,7 +124,7 @@ public void a(int i, int j, boolean flag, boolean flag1) { this.worldDataServer.a(i); -@@ -189,6 +257,7 @@ +@@ -193,6 +261,7 @@ this.rainLevel = MathHelper.a(this.rainLevel, 0.0F, 1.0F); } @@ -132,7 +132,7 @@ if (this.lastRainLevel != this.rainLevel) { this.server.getPlayerList().a((Packet) (new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.h, this.rainLevel)), this.getDimensionKey()); } -@@ -207,18 +276,47 @@ +@@ -211,18 +280,47 @@ this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.h, this.rainLevel)); this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.i, this.thunderLevel)); } @@ -185,8 +185,8 @@ if (this.getGameRules().getBoolean(GameRules.DO_WEATHER_CYCLE)) { this.clearWeather(); } -@@ -240,7 +338,7 @@ - this.aj(); +@@ -244,7 +342,7 @@ + this.ak(); this.ticking = false; gameprofilerfiller.exitEnter("entities"); - boolean flag3 = !this.players.isEmpty() || !this.getForceLoadedChunks().isEmpty(); @@ -194,7 +194,7 @@ if (flag3) { this.resetEmptyTime(); -@@ -259,6 +357,7 @@ +@@ -263,6 +361,7 @@ Entity entity = (Entity) entry.getValue(); Entity entity1 = entity.getVehicle(); @@ -202,7 +202,7 @@ if (!this.server.getSpawnAnimals() && (entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal)) { entity.die(); } -@@ -266,6 +365,7 @@ +@@ -270,6 +369,7 @@ if (!this.server.getSpawnNPCs() && entity instanceof NPC) { entity.die(); } @@ -210,7 +210,7 @@ gameprofilerfiller.enter("checkDespawn"); if (!entity.dead) { -@@ -340,7 +440,7 @@ +@@ -344,7 +444,7 @@ } private void wakeupPlayers() { @@ -219,7 +219,7 @@ entityplayer.wakeup(false, false); }); } -@@ -367,14 +467,14 @@ +@@ -371,14 +471,14 @@ entityhorseskeleton.t(true); entityhorseskeleton.setAgeRaw(0); entityhorseskeleton.setPosition((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); @@ -236,7 +236,7 @@ } } -@@ -385,11 +485,11 @@ +@@ -389,11 +489,11 @@ BiomeBase biomebase = this.getBiome(blockposition); if (biomebase.a(this, blockposition1)) { @@ -250,7 +250,7 @@ } if (flag && this.getBiome(blockposition1).c() == BiomeBase.Precipitation.RAIN) { -@@ -436,7 +536,7 @@ +@@ -440,7 +540,7 @@ protected BlockPosition a(BlockPosition blockposition) { BlockPosition blockposition1 = this.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING, blockposition); AxisAlignedBB axisalignedbb = (new AxisAlignedBB(blockposition1, new BlockPosition(blockposition1.getX(), this.getBuildHeight(), blockposition1.getZ()))).g(3.0D); @@ -259,7 +259,7 @@ return entityliving != null && entityliving.isAlive() && this.e(entityliving.getChunkCoordinates()); }); -@@ -465,7 +565,7 @@ +@@ -469,7 +569,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -268,7 +268,7 @@ ++i; } else if (entityplayer.isSleeping()) { ++j; -@@ -483,10 +583,22 @@ +@@ -487,10 +587,22 @@ } private void clearWeather() { @@ -293,7 +293,7 @@ } public void resetEmptyTime() { -@@ -527,6 +639,7 @@ +@@ -531,6 +643,7 @@ }); gameprofilerfiller.c("tickNonPassenger"); entity.tick(); @@ -301,7 +301,7 @@ gameprofilerfiller.exit(); } -@@ -615,6 +728,7 @@ +@@ -619,6 +732,7 @@ ChunkProviderServer chunkproviderserver = this.getChunkProvider(); if (!flag1) { @@ -309,7 +309,7 @@ if (iprogressupdate != null) { iprogressupdate.a(new ChatMessage("menu.savingLevel")); } -@@ -626,11 +740,19 @@ +@@ -630,11 +744,19 @@ chunkproviderserver.save(flag); } @@ -323,14 +323,14 @@ + // CraftBukkit end } - private void ai() { + private void aj() { if (this.dragonBattle != null) { - this.server.getSaveData().a(this.dragonBattle.a()); + this.worldDataServer.a(this.dragonBattle.a()); // CraftBukkit } this.getChunkProvider().getWorldPersistentData().a(); -@@ -691,11 +813,24 @@ +@@ -695,11 +817,24 @@ @Override public boolean addEntity(Entity entity) { @@ -357,7 +357,7 @@ } public void addEntityTeleport(Entity entity) { -@@ -745,13 +880,18 @@ +@@ -749,13 +884,18 @@ this.registerEntity(entityplayer); } @@ -378,7 +378,7 @@ IChunkAccess ichunkaccess = this.getChunkAt(MathHelper.floor(entity.locX() / 16.0D), MathHelper.floor(entity.locZ() / 16.0D), ChunkStatus.FULL, entity.attachedToPlayer); if (!(ichunkaccess instanceof Chunk)) { -@@ -780,7 +920,7 @@ +@@ -784,7 +924,7 @@ if (entity1 == null) { return false; } else { @@ -387,7 +387,7 @@ return true; } } -@@ -809,11 +949,16 @@ +@@ -813,11 +953,16 @@ } public boolean addAllEntitiesSafely(Entity entity) { @@ -397,7 +397,7 @@ + + public boolean addAllEntitiesSafely(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { + // CraftBukkit end - if (entity.co().anyMatch(this::isUUIDTaken)) { + if (entity.cp().anyMatch(this::isUUIDTaken)) { return false; } else { - this.addAllEntities(entity); @@ -406,7 +406,7 @@ } } -@@ -863,10 +1008,17 @@ +@@ -867,10 +1012,17 @@ } this.getScoreboard().a(entity); @@ -424,7 +424,7 @@ } private void registerEntity(Entity entity) { -@@ -887,9 +1039,16 @@ +@@ -891,9 +1043,16 @@ this.entitiesByUUID.put(entity.getUniqueID(), entity); this.getChunkProvider().addEntity(entity); @@ -441,7 +441,7 @@ } } -@@ -919,10 +1078,33 @@ +@@ -923,10 +1082,33 @@ this.everyoneSleeping(); } @@ -475,7 +475,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); -@@ -931,6 +1113,12 @@ +@@ -935,6 +1117,12 @@ double d1 = (double) blockposition.getY() - entityplayer.locY(); double d2 = (double) blockposition.getZ() - entityplayer.locZ(); @@ -488,7 +488,7 @@ if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { entityplayer.playerConnection.sendPacket(new PacketPlayOutBlockBreakAnimation(i, blockposition, j)); } -@@ -991,10 +1179,20 @@ +@@ -995,10 +1183,20 @@ @Override public Explosion createExplosion(@Nullable Entity entity, @Nullable DamageSource damagesource, @Nullable ExplosionDamageCalculator explosiondamagecalculator, double d0, double d1, double d2, float f, boolean flag, Explosion.Effect explosion_effect) { @@ -509,7 +509,7 @@ if (explosion_effect == Explosion.Effect.NONE) { explosion.clearBlocks(); } -@@ -1059,13 +1257,20 @@ +@@ -1063,13 +1261,20 @@ } public int a(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { @@ -532,7 +532,7 @@ ++j; } } -@@ -1107,7 +1312,7 @@ +@@ -1111,7 +1316,7 @@ @Nullable public BlockPosition a(StructureGenerator structuregenerator, BlockPosition blockposition, int i, boolean flag) { @@ -541,7 +541,7 @@ } @Nullable -@@ -1145,7 +1350,13 @@ +@@ -1149,7 +1354,13 @@ @Override public WorldMap a(String s) { return (WorldMap) this.getMinecraftServer().E().getWorldPersistentData().b(() -> { @@ -556,7 +556,7 @@ }, s); } -@@ -1456,6 +1667,11 @@ +@@ -1460,6 +1671,11 @@ @Override public void update(BlockPosition blockposition, Block block) { if (!this.isDebugWorld()) { @@ -568,7 +568,7 @@ this.applyPhysics(blockposition, block); } -@@ -1470,12 +1686,12 @@ +@@ -1474,12 +1690,12 @@ } public boolean isFlatWorld() { @@ -583,7 +583,38 @@ } @Nullable -@@ -1494,16 +1710,32 @@ +@@ -1499,9 +1715,9 @@ + + @VisibleForTesting + public String F() { +- return String.format("players: %s, entities: %d [%s], block_entities: %d [%s], block_ticks: %d, fluid_ticks: %d, chunk_source: %s", this.players.size(), this.entitiesById.size(), a((Collection) this.entitiesById.values(), (entity) -> { ++ return String.format("players: %s, entities: %d [%s], block_entities: %d [%s], block_ticks: %d, fluid_ticks: %d, chunk_source: %s", this.players.size(), this.entitiesById.size(), a(this.entitiesById.values(), (entity) -> { // CraftBukkit - decompile error + return IRegistry.ENTITY_TYPE.getKey(entity.getEntityType()); +- }), this.tileEntityListTick.size(), a((Collection) this.tileEntityListTick, (tileentity) -> { ++ }), this.tileEntityListTick.size(), a(this.tileEntityListTick, (tileentity) -> { // CraftBukkit - decompile error + return IRegistry.BLOCK_ENTITY_TYPE.getKey(tileentity.getTileType()); + }), this.getBlockTickList().a(), this.getFluidTickList().a(), this.P()); + } +@@ -1509,7 +1725,7 @@ + private static String a(Collection collection, Function function) { + try { + Object2IntOpenHashMap object2intopenhashmap = new Object2IntOpenHashMap(); +- Iterator iterator = collection.iterator(); ++ Iterator iterator = collection.iterator(); // CraftBukkit - decompile error + + while (iterator.hasNext()) { + T t0 = iterator.next(); +@@ -1518,7 +1734,8 @@ + object2intopenhashmap.addTo(minecraftkey, 1); + } + +- return (String) object2intopenhashmap.object2IntEntrySet().stream().sorted(Comparator.comparing(it.unimi.dsi.fastutil.objects.Object2IntMap.Entry::getIntValue).reversed()).limit(5L).map((it_unimi_dsi_fastutil_objects_object2intmap_entry) -> { ++ // CraftBukkit - decompile error ++ return (String) object2intopenhashmap.object2IntEntrySet().stream().sorted(Comparator.comparing(it.unimi.dsi.fastutil.objects.Object2IntMap.Entry::getIntValue).reversed()).limit(5L).map((it_unimi_dsi_fastutil_objects_object2intmap_entry) -> { + return it_unimi_dsi_fastutil_objects_object2intmap_entry.getKey() + ":" + it_unimi_dsi_fastutil_objects_object2intmap_entry.getIntValue(); + }).collect(Collectors.joining(",")); + } catch (Exception exception) { +@@ -1527,16 +1744,32 @@ } public static void a(WorldServer worldserver) { diff --git a/pom.xml b/pom.xml index 24704174a..755be3124 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.bukkit craftbukkit jar - 1.16.3-R0.1-SNAPSHOT + 1.16.4-R0.1-SNAPSHOT CraftBukkit https://www.spigotmc.org/ @@ -12,8 +12,8 @@ true UTF-8 unknown - 1.16.3 - 1_16_R2 + 1.16.4 + 1_16_R3 1.8 1.8 diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index 960031a61..17b9475b2 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -177,11 +177,11 @@ public class Main { useConsole = false; } - if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { + if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { Date buildDate = new Date(Integer.parseInt(Main.class.getPackage().getImplementationVendor()) * 1000L); Calendar deadline = Calendar.getInstance(); - deadline.add(Calendar.DAY_OF_YEAR, -21); + deadline.add(Calendar.DAY_OF_YEAR, -7); if (buildDate.before(deadline.getTime())) { System.err.println("*** Error, this build is outdated ***"); System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***"); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java index 1e8ccde24..80ccbb2cc 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java @@ -19,13 +19,13 @@ public class CraftMinecartFurnace extends CraftMinecart implements PoweredMineca @Override public int getFuel() { - return getHandle().e; + return getHandle().fuel; } @Override public void setFuel(int fuel) { Preconditions.checkArgument(fuel >= 0, "ticks cannot be negative"); - getHandle().e = fuel; + getHandle().fuel = fuel; } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 11bebcd7a..71b5d0a5b 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1279,9 +1279,7 @@ public class CraftEventFactory { human.activeContainer.transferTo(human.defaultContainer, human.getBukkitEntity()); } - public static ItemStack handleEditBookEvent(EntityPlayer player, EnumItemSlot slot, ItemStack itemInHand, ItemStack newBookItem) { - int itemInHandIndex = (slot == EnumItemSlot.MAINHAND) ? player.inventory.itemInHandIndex : -1; - + public static ItemStack handleEditBookEvent(EntityPlayer player, int itemInHandIndex, ItemStack itemInHand, ItemStack newBookItem) { PlayerEditBookEvent editBookEvent = new PlayerEditBookEvent(player.getBukkitEntity(), itemInHandIndex, (BookMeta) CraftItemStack.getItemMeta(itemInHand), (BookMeta) CraftItemStack.getItemMeta(newBookItem), newBookItem.getItem() == Items.WRITTEN_BOOK); player.world.getServer().getPluginManager().callEvent(editBookEvent); diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index 983444d7b..1e138a569 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -224,7 +224,7 @@ public final class CraftMagicNumbers implements UnsafeValues { * @return string */ public String getMappingsVersion() { - return "09f04031f41cb54f1077c6ac348cc220"; + return "da85101b34b252659e3ddf10c0c57cc9"; } @Override