From 71f10ccd90c981cc7354b212da9741fbd845e626 Mon Sep 17 00:00:00 2001 From: Noksio Date: Sun, 2 Apr 2023 02:02:45 -0400 Subject: [PATCH 01/12] They forget the 4 armor slots --' --- .../src/main/java/org/bukkit/event/inventory/InventoryType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nPaper-API/src/main/java/org/bukkit/event/inventory/InventoryType.java b/nPaper-API/src/main/java/org/bukkit/event/inventory/InventoryType.java index b83580a4..bfa91da5 100644 --- a/nPaper-API/src/main/java/org/bukkit/event/inventory/InventoryType.java +++ b/nPaper-API/src/main/java/org/bukkit/event/inventory/InventoryType.java @@ -42,7 +42,7 @@ public enum InventoryType { * A player's inventory, with 9 QUICKBAR slots, 27 CONTAINER slots, and 4 * ARMOR slots. The ARMOUR slots may not be visible to the player, though. */ - PLAYER(36,"Player"), + PLAYER(40,"Player"), // nPaper - add the 4 ARMOR slot /** * The creative mode inventory, with only 9 QUICKBAR slots and nothing * else. (The actual creative interface with the items is client-side and From fe55a395fc35bf41fc7851d94711c1161111c297 Mon Sep 17 00:00:00 2001 From: Noksio Date: Wed, 5 Apr 2023 19:14:00 -0400 Subject: [PATCH 02/12] EntityEnderPearl lil update --- .../main/java/net/minecraft/server/EntityEnderPearl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityEnderPearl.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityEnderPearl.java index a2b0be09..3f3b34fb 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityEnderPearl.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityEnderPearl.java @@ -26,7 +26,12 @@ public EntityEnderPearl(World world, EntityLiving entityliving) { // nPaper start - antipearl glitch public void h() { - if (PaperSpigotConfig.fixEnderPearlGlitch && this.world.getCubes(this, this.boundingBox.grow(0.25D, 0.25D, 0.25D)).isEmpty()) { + final EntityLiving entityliving = this.getShooter(); + if (entityliving != null && entityliving instanceof EntityHuman && !entityliving.isAlive()) { + this.die(); + return; + } + if (PaperSpigotConfig.fixEnderPearlGlitch && this.world.getCubes(this, this.boundingBox.grow(0.225D, 0.1D, 0.225D)).isEmpty()) { this.lastValidLocation = getBukkitEntity().getLocation(); } super.h(); From d4f23135de70d8e19a6a0afffbe618bb361d6d02 Mon Sep 17 00:00:00 2001 From: Noksio Date: Thu, 6 Apr 2023 02:40:31 -0400 Subject: [PATCH 03/12] Add PandaSpigot PR -https://github.com/hpfxd/PandaSpigot/pull/98 - https://github.com/hpfxd/PandaSpigot/pull/77 --- .../net/minecraft/server/DataWatcher.java | 38 +---- .../java/net/minecraft/server/Entity.java | 1 + .../server/RemoteControlSession.java | 145 ++++++++++++++++++ 3 files changed, 151 insertions(+), 33 deletions(-) create mode 100644 nPaper-Server/src/main/java/net/minecraft/server/RemoteControlSession.java diff --git a/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java b/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java index 96e40ec0..3141df8c 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java @@ -1,16 +1,14 @@ package net.minecraft.server; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import net.minecraft.util.org.apache.commons.lang3.ObjectUtils; import org.spigotmc.ProtocolData; // Spigot - protocol patch +import net.minecraft.util.org.apache.commons.lang3.ObjectUtils; + public class DataWatcher { private final Entity a; @@ -23,13 +21,14 @@ public class DataWatcher { private final Map d = net.minecraft.util.gnu.trove.TDecorators.wrap( dataValues ); // Spigot End private boolean e; - private ReadWriteLock f = new ReentrantReadWriteLock(); public DataWatcher(Entity entity) { this.a = entity; } + boolean registrationLocked; // PandaSpigot public void a(int i, Object object) { + if (registrationLocked) throw new IllegalStateException("Registering datawatcher object after entity initialization"); // PandaSpigot int integer = classToId.get(object.getClass()); // Spigot // Spigot start - protocol patch @@ -54,9 +53,7 @@ public void a(int i, Object object) { } else { WatchableObject watchableobject = new WatchableObject(integer, i, object); // Spigot - this.f.writeLock().lock(); this.dataValues.put(i, watchableobject); // Spigot - this.f.writeLock().unlock(); this.b = false; } } @@ -64,9 +61,7 @@ public void a(int i, Object object) { public void add(int i, int j) { WatchableObject watchableobject = new WatchableObject(j, i, null); - this.f.writeLock().lock(); this.dataValues.put(i, watchableobject); // Spigot - this.f.writeLock().unlock(); this.b = false; } @@ -107,22 +102,7 @@ public ProtocolData.DualInt getDualInt(int i) { // Spigot end private WatchableObject i(int i) { - this.f.readLock().lock(); - - WatchableObject watchableobject; - - try { - watchableobject = (WatchableObject) this.dataValues.get(i); // Spigot - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Getting synched entity data"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Synched entity data"); - - crashreportsystemdetails.a("Data ID", Integer.valueOf(i)); - throw new ReportedException(crashreport); - } - - this.f.readLock().unlock(); - return watchableobject; + return (WatchableObject) this.dataValues.get(i); } public void watch(int i, Object object) { @@ -169,7 +149,6 @@ public List b() { ArrayList arraylist = null; if (this.e) { - this.f.readLock().lock(); Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot while (iterator.hasNext()) { @@ -195,8 +174,6 @@ public List b() { arraylist.add(watchableobject); } } - - this.f.readLock().unlock(); } this.e = false; @@ -210,7 +187,6 @@ public void a(PacketDataSerializer packetdataserializer) { public void a(PacketDataSerializer packetdataserializer, int version) { // Spigot end - this.f.readLock().lock(); Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot while (iterator.hasNext()) { @@ -219,15 +195,12 @@ public void a(PacketDataSerializer packetdataserializer, int version) { a(packetdataserializer, watchableobject, version); // Spigot - protocol patch } - this.f.readLock().unlock(); packetdataserializer.writeByte(127); } public List c() { ArrayList arraylist = new ArrayList(); // Spigot - this.f.readLock().lock(); - arraylist.addAll(this.dataValues.valueCollection()); // Spigot // Spigot start - copy ItemStacks to prevent ConcurrentModificationExceptions for ( int i = 0; i < arraylist.size(); i++ ) @@ -245,7 +218,6 @@ public List c() { } // Spigot end - this.f.readLock().unlock(); return arraylist; } diff --git a/nPaper-Server/src/main/java/net/minecraft/server/Entity.java b/nPaper-Server/src/main/java/net/minecraft/server/Entity.java index 19c9769b..e4e2e1db 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/Entity.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/Entity.java @@ -171,6 +171,7 @@ public Entity(World world) { this.datawatcher.a(0, Byte.valueOf((byte) 0)); this.datawatcher.a(1, Short.valueOf((short) 300)); this.c(); + this.datawatcher.registrationLocked = true; // PandaSpigot } protected abstract void c(); diff --git a/nPaper-Server/src/main/java/net/minecraft/server/RemoteControlSession.java b/nPaper-Server/src/main/java/net/minecraft/server/RemoteControlSession.java new file mode 100644 index 00000000..5e5bc734 --- /dev/null +++ b/nPaper-Server/src/main/java/net/minecraft/server/RemoteControlSession.java @@ -0,0 +1,145 @@ +package net.minecraft.server; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.net.SocketTimeoutException; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class RemoteControlSession extends RemoteConnectionThread { + private static final Logger h; + private boolean i; + private Socket j; + private byte[] k; + private String l; + + RemoteControlSession(final IMinecraftServer minecraftServer, final Socket j) { + super(minecraftServer, "RCON Client"); + this.k = new byte[1460]; + this.j = j; + try { + this.j.setSoTimeout(0); + } + catch (Exception ex) { + this.running = false; + } + this.l = minecraftServer.a("rcon.password", ""); + this.info("Rcon connection from: " + j.getInetAddress()); + } + + @Override + public void run() { + while (this.running) { + boolean closeConnection = true; + try { + final int read = new BufferedInputStream(this.j.getInputStream()).read(this.k, 0, 1460); + if (10 > read) { + return; + } + int n = 0; + if (StatusChallengeUtils.b(this.k, 0, read) != read - 4) { + return; + } + n += 4; + final int b = StatusChallengeUtils.b(this.k, n, read); + n += 4; + final int b2 = StatusChallengeUtils.b(this.k, n); + n += 4; + switch (b2) { + case 3: { + final String a = StatusChallengeUtils.a(this.k, n, read); + //final int n2 = n + a.length(); + if (0 != a.length() && a.equals(this.l)) { + this.i = true; + this.a(b, 2, ""); + closeConnection = false; + continue; + } + this.i = false; + this.f(); + closeConnection = false; + continue; + } + case 2: { + if (this.i) { + final String a2 = StatusChallengeUtils.a(this.k, n, read); + try { + this.a(b, this.server.g(a2)); + } + catch (Exception ex) { + this.a(b, "Error executing: " + a2 + " (" + ex.getMessage() + ")"); + } + closeConnection = false; + continue; + } + this.f(); + closeConnection = false; + continue; + } + default: { + this.a(b, String.format("Unknown request %s", Integer.toHexString(b2))); + //continue; + break; + } + } + }catch (SocketTimeoutException ex2) {} + catch (IOException ex3) {} + catch (Exception throwable) { + RemoteControlSession.h.error("Exception whilst parsing RCON input", throwable); + } + finally { + if (closeConnection) { + this.g(); + } + } + } + } + + private void a(final int n, final int n2, final String s) throws IOException { + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1248); + final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); + final byte[] bytes = s.getBytes("UTF-8"); + dataOutputStream.writeInt(Integer.reverseBytes(bytes.length + 10)); + dataOutputStream.writeInt(Integer.reverseBytes(n)); + dataOutputStream.writeInt(Integer.reverseBytes(n2)); + dataOutputStream.write(bytes); + dataOutputStream.write(0); + dataOutputStream.write(0); + this.j.getOutputStream().write(byteArrayOutputStream.toByteArray()); + } + + private void f() throws IOException { + this.a(-1, 2, ""); + } + + private void a(final int n, String substring) throws IOException { + int n2 = substring.length(); + do { + final int n3 = (4096 <= n2) ? 4096 : n2; + this.a(n, 0, substring.substring(0, n3)); + substring = substring.substring(n3); + n2 = substring.length(); + } while (n2 > 0); + } + + private void g() { + if (null == this.j) { + return; + } + try { + this.j.close(); + } + catch (IOException ex) { + this.warning("IO: " + ex.getMessage()); + } + this.j = null; + } + + static { + h = LogManager.getLogger(); + } +} \ No newline at end of file From d2e79662dd902cd084a33c5441997f0cf28693d5 Mon Sep 17 00:00:00 2001 From: Noksio Date: Sun, 9 Apr 2023 00:34:10 -0400 Subject: [PATCH 04/12] 3 changes - Don't execute code when not needed - Use variable to get rid of NPE - Waitable are now better --- .../minecraft/server/PlayerConnection.java | 4 ++- .../server/ThreadPlayerLookupUUID.java | 24 +++++++-------- .../org/bukkit/craftbukkit/util/Waitable.java | 30 +++++-------------- 3 files changed, 22 insertions(+), 36 deletions(-) diff --git a/nPaper-Server/src/main/java/net/minecraft/server/PlayerConnection.java b/nPaper-Server/src/main/java/net/minecraft/server/PlayerConnection.java index bf75ab73..edefa04c 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/PlayerConnection.java @@ -429,7 +429,9 @@ public void a(PacketPlayInFlying packetplayinflying) { } } } else { - this.f = 0; + if (this.f > 0) { // Rinny - dont do useless action + this.f = 0; + } } this.player.onGround = packetplayinflying.i(); diff --git a/nPaper-Server/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java b/nPaper-Server/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java index eb31a7d0..43c77552 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java @@ -1,6 +1,8 @@ package net.minecraft.server; import java.math.BigInteger; +import java.net.InetAddress; +import java.net.InetSocketAddress; import java.util.UUID; // CraftBukkit start @@ -13,8 +15,8 @@ import net.minecraft.util.com.mojang.authlib.exceptions.AuthenticationUnavailableException; class ThreadPlayerLookupUUID implements Runnable { - final LoginListener a; + ThreadPlayerLookupUUID(LoginListener loginlistener) { this.a = loginlistener; } @@ -31,9 +33,9 @@ public void run() { return; } // Spigot End - String s = (new BigInteger(MinecraftEncryption.a(LoginListener.b(this.a), LoginListener.c(this.a).K().getPublic(), LoginListener.d(this.a)))).toString(16); + String hash = (new BigInteger(MinecraftEncryption.a(LoginListener.b(this.a), LoginListener.c(this.a).K().getPublic(), LoginListener.d(this.a)))).toString(16); - LoginListener.a(this.a, LoginListener.c(this.a).av().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s)); + LoginListener.a(this.a, LoginListener.c(this.a).av().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), hash)); if (LoginListener.a(this.a) != null) { fireLoginEvents(); // Spigot } else if (LoginListener.c(this.a).N()) { @@ -42,7 +44,7 @@ public void run() { LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); } else { this.a.disconnect("Failed to verify username!"); - LoginListener.e().error("Username \'" + LoginListener.a(this.a).getName() + "\' tried to join with an invalid session"); + LoginListener.e().error("Username \'" + gameprofile.getName() + "\' tried to join with an invalid session"); } } catch (AuthenticationUnavailableException authenticationunavailableexception) { if (LoginListener.c(this.a).N()) { @@ -56,9 +58,7 @@ public void run() { // CraftBukkit start - catch all exceptions } catch (Exception exception) { this.a.disconnect("Failed to verify username!"); - if (LoginListener.c(this.a) != null && LoginListener.c(this.a).server != null) { // Rinny - Fix NPE - LoginListener.c(this.a).server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + LoginListener.a(this.a).getName(), exception); - } + LoginListener.c(this.a).server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + gameprofile.getName(), exception); // Use variable to fix the NPE // CraftBukkit end } } @@ -70,12 +70,12 @@ private void fireLoginEvents() throws Exception return; } - String playerName = LoginListener.a(this.a).getName(); - java.net.InetAddress address = ((java.net.InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); - java.util.UUID uniqueId = LoginListener.a(this.a).getId(); + final String playerName = LoginListener.a(this.a).getName(); + final InetAddress address = ((InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); + final UUID uniqueId = LoginListener.a(this.a).getId(); final org.bukkit.craftbukkit.CraftServer server = LoginListener.c(this.a).server; - AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); + final AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); server.getPluginManager().callEvent(asyncEvent); if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { @@ -103,7 +103,7 @@ protected PlayerPreLoginEvent.Result evaluate() { } // CraftBukkit end - LoginListener.e().info("UUID of player " + LoginListener.a(this.a).getName() + " is " + LoginListener.a(this.a).getId()); + LoginListener.e().info("UUID of player " + playerName + " is " + uniqueId); LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); } } diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/util/Waitable.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/util/Waitable.java index 5cd11543..4e6ee412 100644 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/util/Waitable.java +++ b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/util/Waitable.java @@ -1,43 +1,27 @@ package org.bukkit.craftbukkit.util; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; - public abstract class Waitable implements Runnable { - private enum Status { - WAITING, - RUNNING, - FINISHED, - } - Throwable t = null; - T value = null; - Status status = Status.WAITING; + private T value; + private Throwable t; + private CountDownLatch latch = new CountDownLatch(1); public final void run() { - synchronized (this) { - if (status != Status.WAITING) { - throw new IllegalStateException("Invalid state " + status); - } - status = Status.RUNNING; - } try { value = evaluate(); } catch (Throwable t) { this.t = t; } finally { - synchronized (this) { - status = Status.FINISHED; - this.notifyAll(); - } + latch.countDown(); } } protected abstract T evaluate(); - public synchronized T get() throws InterruptedException, ExecutionException { - while (status != Status.FINISHED) { - this.wait(); - } + public T get() throws InterruptedException, ExecutionException { + latch.await(); if (t != null) { throw new ExecutionException(t); } From fc7ee6e4e7428144a5ff93f0e575ff64ed7debea Mon Sep 17 00:00:00 2001 From: Noksio Date: Tue, 11 Apr 2023 01:09:56 -0400 Subject: [PATCH 05/12] remove BukkitUpdater --- .../java/net/minecraft/server/PlayerList.java | 2 - .../org/bukkit/craftbukkit/CraftServer.java | 23 +--- .../craftbukkit/updater/ArtifactDetails.java | 128 ------------------ .../craftbukkit/updater/AutoUpdater.java | 127 ----------------- .../updater/BukkitDLUpdaterService.java | 102 -------------- 5 files changed, 1 insertion(+), 381 deletions(-) delete mode 100644 nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java delete mode 100644 nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java delete mode 100644 nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java diff --git a/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java b/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java index 7e0dc57d..48a913ec 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java @@ -302,8 +302,6 @@ public void c(EntityPlayer entityplayer) { this.server.getPlayerList().sendAll(new PacketPlayOutChat(line)); } } - this.cserver.onPlayerJoin(playerJoinEvent.getPlayer()); - ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit end diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 837f97c2..2fbf35bb 100644 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -64,8 +64,6 @@ import org.bukkit.craftbukkit.potion.CraftPotionBrewer; import org.bukkit.craftbukkit.scheduler.CraftScheduler; import org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager; -import org.bukkit.craftbukkit.updater.AutoUpdater; -import org.bukkit.craftbukkit.updater.BukkitDLUpdaterService; import org.bukkit.craftbukkit.util.CraftIconCache; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.craftbukkit.util.DatFileFilter; @@ -110,8 +108,8 @@ import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.SQLitePlatform; import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation; -import com.google.common.collect.ImmutableList; import com.google.common.cache.CacheBuilder; +import com.google.common.collect.ImmutableList; import jline.console.ConsoleReader; import net.minecraft.server.ChunkCoordinates; @@ -213,7 +211,6 @@ public final class CraftServer implements Server { private YamlConfiguration commandsConfiguration; private final Yaml yaml = new Yaml(new SafeConstructor()); private final Map offlinePlayers = CacheBuilder.newBuilder().softValues().build().asMap(); - private final AutoUpdater updater; private final EntityMetadataStore entityMetadata = new EntityMetadataStore(); private final PlayerMetadataStore playerMetadata = new PlayerMetadataStore(); private final WorldMetadataStore worldMetadata = new WorldMetadataStore(); @@ -318,14 +315,6 @@ public CraftPlayer apply(EntityPlayer player) { chunkGCPeriod = configuration.getInt("chunk-gc.period-in-ticks"); chunkGCLoadThresh = configuration.getInt("chunk-gc.load-threshold"); loadIcon(); - - updater = new AutoUpdater(new BukkitDLUpdaterService(configuration.getString("auto-updater.host")), getLogger(), configuration.getString("auto-updater.preferred-channel")); - updater.setEnabled(false); // Spigot - updater.setSuggestChannels(configuration.getBoolean("auto-updater.suggest-channels")); - updater.getOnBroken().addAll(configuration.getStringList("auto-updater.on-broken")); - updater.getOnUpdate().addAll(configuration.getStringList("auto-updater.on-update")); - updater.check(serverVersion); - // Spigot Start - Moved to old location of new DedicatedPlayerList in DedicatedServer // loadPlugins(); // enablePlugins(PluginLoadOrder.STARTUP); @@ -1629,16 +1618,6 @@ public Set getListeningPluginChannels() { return result; } - public void onPlayerJoin(Player player) { - if ((updater.isEnabled()) && (updater.getCurrent() != null) && (player.hasPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE))) { - if ((updater.getCurrent().isBroken()) && (updater.getOnBroken().contains(AutoUpdater.WARN_OPERATORS))) { - player.sendMessage(ChatColor.DARK_RED + "The version of CraftBukkit that this server is running is known to be broken. Please consider updating to the latest version at dl.bukkit.org."); - } else if ((updater.isUpdateAvailable()) && (updater.getOnUpdate().contains(AutoUpdater.WARN_OPERATORS))) { - player.sendMessage(ChatColor.DARK_PURPLE + "The version of CraftBukkit that this server is running is out of date. Please consider updating to the latest version at dl.bukkit.org."); - } - } - } - @Override public Inventory createInventory(InventoryHolder owner, InventoryType type) { // TODO: Create the appropriate type, rather than Custom? diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java deleted file mode 100644 index a9c5eafc..00000000 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import java.util.Date; - -public class ArtifactDetails { - private String brokenReason; - private boolean isBroken; - private int buildNumber; - private String htmlUrl; - private String version; - private Date created; - private FileDetails file; - private ChannelDetails channel; - - public ChannelDetails getChannel() { - return channel; - } - - public void setChannel(ChannelDetails channel) { - this.channel = channel; - } - - public boolean isIsBroken() { - return isBroken; - } - - public void setIsBroken(boolean isBroken) { - this.isBroken = isBroken; - } - - public FileDetails getFile() { - return file; - } - - public void setFile(FileDetails file) { - this.file = file; - } - - public String getBrokenReason() { - return brokenReason; - } - - public void setBrokenReason(String brokenReason) { - this.brokenReason = brokenReason; - } - - public int getBuildNumber() { - return buildNumber; - } - - public void setBuildNumber(int buildNumber) { - this.buildNumber = buildNumber; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public String getHtmlUrl() { - return htmlUrl; - } - - public void setHtmlUrl(String htmlUrl) { - this.htmlUrl = htmlUrl; - } - - public boolean isBroken() { - return isBroken; - } - - public void setBroken(boolean isBroken) { - this.isBroken = isBroken; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public static class FileDetails { - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - } - - public static class ChannelDetails { - private String name; - private String slug; - private int priority; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getPriority() { - return priority; - } - - public void setPriority(int priority) { - this.priority = priority; - } - - public String getSlug() { - return slug; - } - - public void setSlug(String slug) { - this.slug = slug; - } - } -} diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java deleted file mode 100644 index f21301ce..00000000 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -public class AutoUpdater { - public static final String WARN_CONSOLE = "warn-console"; - public static final String WARN_OPERATORS = "warn-ops"; - - private final BukkitDLUpdaterService service; - private final List onUpdate = new ArrayList(); - private final List onBroken = new ArrayList(); - private final Logger log; - private final String channel; - private boolean enabled; - private ArtifactDetails current = null; - private ArtifactDetails latest = null; - private boolean suggestChannels = true; - - public AutoUpdater(BukkitDLUpdaterService service, Logger log, String channel) { - this.service = service; - this.log = log; - this.channel = channel; - } - - public String getChannel() { - return channel; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean isEnabled) { - this.enabled = isEnabled; - } - - public boolean shouldSuggestChannels() { - return suggestChannels; - } - - public void setSuggestChannels(boolean suggestChannels) { - this.suggestChannels = suggestChannels; - } - - public List getOnBroken() { - return onBroken; - } - - public List getOnUpdate() { - return onUpdate; - } - - public boolean isUpdateAvailable() { - if ((latest == null) || (current == null) || (!isEnabled())) { - return false; - } else { - return latest.getCreated().after(current.getCreated()); - } - } - - public ArtifactDetails getCurrent() { - return current; - } - - public ArtifactDetails getLatest() { - return latest; - } - - public void check(final String currentSlug) { - if (!isEnabled()) return; - - new Thread() { - @Override - public void run() { - current = service.getArtifact(currentSlug, "information about this CraftBukkit version; perhaps you are running a custom one?"); - latest = service.getArtifact("latest-" + channel, "latest artifact information"); - - if (isUpdateAvailable()) { - if ((current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { - log.severe("----- Bukkit Auto Updater -----"); - log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); - log.severe("Known issues with your version:"); - - for (String line : current.getBrokenReason().split("\n")) { - log.severe("> " + line); - } - - log.severe("Newer version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); - log.severe("Details: " + latest.getHtmlUrl()); - log.severe("Download: " + latest.getFile().getUrl()); - log.severe("----- ------------------- -----"); - } else if (onUpdate.contains(WARN_CONSOLE)) { - log.warning("----- Bukkit Auto Updater -----"); - log.warning("Your version of CraftBukkit is out of date. Version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); - log.warning("Details: " + latest.getHtmlUrl()); - log.warning("Download: " + latest.getFile().getUrl()); - log.warning("----- ------------------- -----"); - } - } else if ((current != null) && (current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { - log.severe("----- Bukkit Auto Updater -----"); - log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); - log.severe("Known issues with your version:"); - - for (String line : current.getBrokenReason().split("\n")) { - log.severe("> " + line); - } - - log.severe("Unfortunately, there is not yet a newer version suitable for your server. We would advise you wait an hour or two, or try out a dev build."); - log.severe("----- ------------------- -----"); - } else if ((current != null) && (shouldSuggestChannels())) { - ArtifactDetails.ChannelDetails prefChan = service.getChannel(channel, "preferred channel details"); - - if ((prefChan != null) && (current.getChannel().getPriority() < prefChan.getPriority())) { - log.info("----- Bukkit Auto Updater -----"); - log.info("It appears that you're running a " + current.getChannel().getName() + ", when you've specified in bukkit.yml that you prefer to run " + prefChan.getName() + "s."); - log.info("If you would like to be kept informed about new " + current.getChannel().getName() + " releases, it is recommended that you change 'preferred-channel' in your bukkit.yml to '" + current.getChannel().getSlug() + "'."); - log.info("With that set, you will be told whenever a new version is available for download, so that you can always keep up to date and secure with the latest fixes."); - log.info("If you would like to disable this warning, simply set 'suggest-channels' to false in bukkit.yml."); - log.info("----- ------------------- -----"); - } - } - } - }.start(); - } -} diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java deleted file mode 100644 index 0145ac36..00000000 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import com.google.gson.*; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Type; -import java.net.URL; -import java.net.URLConnection; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.bukkit.Bukkit; - -public class BukkitDLUpdaterService { - private static final String API_PREFIX_ARTIFACT = "/api/1.0/downloads/projects/craftbukkit/view/"; - private static final String API_PREFIX_CHANNEL = "/api/1.0/downloads/channels/"; - private static final DateDeserializer dateDeserializer = new DateDeserializer(); - private final String host; - - public BukkitDLUpdaterService(String host) { - this.host = host; - } - - public ArtifactDetails getArtifact(String slug, String name) { - try { - return fetchArtifact(slug); - } catch (UnsupportedEncodingException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } catch (IOException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } - - return null; - } - - private String getUserAgent() { - return "CraftBukkit/" + BukkitDLUpdaterService.class.getPackage().getImplementationVersion() + "/" + System.getProperty("java.version"); - } - - public ArtifactDetails fetchArtifact(String slug) throws IOException { - URL url = new URL("http", host, API_PREFIX_ARTIFACT + slug + "/"); - InputStreamReader reader = null; - - try { - URLConnection connection = url.openConnection(); - connection.setRequestProperty("User-Agent", getUserAgent()); - reader = new InputStreamReader(connection.getInputStream()); - Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - return gson.fromJson(reader, ArtifactDetails.class); - } finally { - if (reader != null) { - reader.close(); - } - } - } - - public ArtifactDetails.ChannelDetails getChannel(String slug, String name) { - try { - return fetchChannel(slug); - } catch (UnsupportedEncodingException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } catch (IOException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } - - return null; - } - - public ArtifactDetails.ChannelDetails fetchChannel(String slug) throws IOException { - URL url = new URL("http", host, API_PREFIX_CHANNEL + slug + "/"); - InputStreamReader reader = null; - - try { - URLConnection connection = url.openConnection(); - connection.setRequestProperty("User-Agent", getUserAgent()); - reader = new InputStreamReader(connection.getInputStream()); - Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - - return gson.fromJson(reader, ArtifactDetails.ChannelDetails.class); - } finally { - if (reader != null) { - reader.close(); - } - } - } - - static class DateDeserializer implements JsonDeserializer { - private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - public Date deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { - try { - return format.parse(je.getAsString()); - } catch (ParseException ex) { - throw new JsonParseException("Date is not formatted correctly", ex); - } - } - } -} From 9e0aed6059a08b9d33446e4f2063600fbc10a7ae Mon Sep 17 00:00:00 2001 From: Noksio Date: Mon, 17 Apr 2023 23:08:30 -0400 Subject: [PATCH 06/12] use isLiquid for ItemBucket and add SportPaper PR Added SportPaper PR: https://github.com/Electroid/SportPaper/pull/127 --- .../net/minecraft/server/DataWatcher.java | 20 ++++++------ .../minecraft/server/EntityTrackerEntry.java | 32 ++++++++++++++++++- .../java/net/minecraft/server/ItemBucket.java | 2 +- .../server/PacketPlayOutEntityMetadata.java | 10 +++++- .../github/paperspigot/PaperSpigotConfig.java | 5 +++ 5 files changed, 56 insertions(+), 13 deletions(-) diff --git a/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java b/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java index 3141df8c..8d23af4c 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java @@ -15,7 +15,7 @@ public class DataWatcher { private boolean b = true; // Spigot Start private static final net.minecraft.util.gnu.trove.map.TObjectIntMap classToId = new net.minecraft.util.gnu.trove.map.hash.TObjectIntHashMap( 10, 0.5f, -1 ); - private final net.minecraft.util.gnu.trove.map.TIntObjectMap dataValues = new net.minecraft.util.gnu.trove.map.hash.TIntObjectHashMap( 10, 0.5f, -1 ); + private final net.minecraft.util.gnu.trove.map.TIntObjectMap dataValues = new net.minecraft.util.gnu.trove.map.hash.TIntObjectHashMap( 10, 0.5f, -1 ); // These exist as an attempt at backwards compatability for (broken) NMS plugins private static final Map c = net.minecraft.util.gnu.trove.TDecorators.wrap( classToId ); private final Map d = net.minecraft.util.gnu.trove.TDecorators.wrap( dataValues ); @@ -145,11 +145,11 @@ public static void a(List list, PacketDataSerializer packetdataserializer, int v packetdataserializer.writeByte(127); } - public List b() { - ArrayList arraylist = null; + public List b() { + ArrayList arraylist = null; if (this.e) { - Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot + Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot while (iterator.hasNext()) { WatchableObject watchableobject = (WatchableObject) iterator.next(); @@ -157,7 +157,7 @@ public List b() { if (watchableobject.d()) { watchableobject.a(false); if (arraylist == null) { - arraylist = new ArrayList(); + arraylist = new ArrayList(); } // Spigot start - copy ItemStacks to prevent ConcurrentModificationExceptions @@ -198,8 +198,8 @@ public void a(PacketDataSerializer packetdataserializer, int version) { packetdataserializer.writeByte(127); } - public List c() { - ArrayList arraylist = new ArrayList(); // Spigot + public List c() { + ArrayList arraylist = new ArrayList(); // Spigot arraylist.addAll(this.dataValues.valueCollection()); // Spigot // Spigot start - copy ItemStacks to prevent ConcurrentModificationExceptions @@ -287,12 +287,12 @@ private static void a(PacketDataSerializer packetdataserializer, WatchableObject } // Spigot end - public static List b(PacketDataSerializer packetdataserializer) { - ArrayList arraylist = null; + public static List b(PacketDataSerializer packetdataserializer) { + ArrayList arraylist = null; for (byte b0 = packetdataserializer.readByte(); b0 != 127; b0 = packetdataserializer.readByte()) { if (arraylist == null) { - arraylist = new ArrayList(); + arraylist = new ArrayList(); } int i = (b0 & 224) >> 5; diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java index 83b2f2ef..92be3a80 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -15,6 +15,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerVelocityEvent; // CraftBukkit end +import org.github.paperspigot.PaperSpigotConfig; public class EntityTrackerEntry { @@ -265,7 +266,36 @@ private void b() { DataWatcher datawatcher = this.tracker.getDataWatcher(); if (datawatcher.a()) { - this.broadcastIncludingSelf(new PacketPlayOutEntityMetadata(this.tracker.getId(), datawatcher, false)); + if (PaperSpigotConfig.obfuscatePlayerHealth && this.tracker instanceof EntityHuman) { + final List changedMetadata = datawatcher.c(); // Clone the data watcher elements + final Iterator iterator = changedMetadata.iterator(); + boolean found = false; + // We iterate over every data watcher element + while (iterator.hasNext()) { + WatchableObject watchable = iterator.next(); + // If the index is 6 (player health) we can replace it with an obfuscated value. We have to make sure the health is also over 0 otherwise death animations won't show + // https://wiki.vg/index.php?title=Entity_metadata&oldid=7415#Living_Entity_Base + if (watchable.a() == 6 && (float) watchable.b() > 0) { + iterator.remove(); + found = true; + break; // Rinny - cut the loop + } + } + // Put in the fake hp value + if (found) { + changedMetadata.add(new WatchableObject(3, 6, 1.0F)); + } + // Create a new packet with the obfuscated player health + final PacketPlayOutEntityMetadata modifiedPacket = new PacketPlayOutEntityMetadata(this.tracker.getId(), changedMetadata); + // Broadcast the modified metadata packet to everyone and send the correct packet to the player + this.broadcast(modifiedPacket); + if (this.tracker instanceof EntityPlayer) { + ((EntityPlayer) this.tracker).playerConnection.sendPacket(new PacketPlayOutEntityMetadata(this.tracker.getId(), datawatcher, false)); + } + } else { + // SportPaper end + this.broadcastIncludingSelf(new PacketPlayOutEntityMetadata(this.tracker.getId(), datawatcher, false)); + } } if (this.tracker instanceof EntityLiving) { diff --git a/nPaper-Server/src/main/java/net/minecraft/server/ItemBucket.java b/nPaper-Server/src/main/java/net/minecraft/server/ItemBucket.java index 119b3a71..047ace35 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/ItemBucket.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/ItemBucket.java @@ -50,7 +50,7 @@ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { Material material = world.getType(i, j, k).getMaterial(); int l = world.getData(i, j, k); - if ((material == Material.WATER || material == Material.LAVA) && l == 0) { + if (material.isLiquid() && l == 0) { final Item bucketType = (material == Material.LAVA ? Items.LAVA_BUCKET : Items.WATER_BUCKET); // CraftBukkit start PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, i, j, k, -1, itemstack, bucketType); diff --git a/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java b/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java index c937f592..a68096a9 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutEntityMetadata.java @@ -5,9 +5,17 @@ public class PacketPlayOutEntityMetadata extends Packet { private int a; - private List b; + private List b; public PacketPlayOutEntityMetadata() {} + + // SportPaper start + public PacketPlayOutEntityMetadata(int i, List list) { + this.a = i; + this.b = list; + } + // SportPaper end + public PacketPlayOutEntityMetadata(int i, DataWatcher datawatcher, boolean flag) { this.a = i; diff --git a/nPaper-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java b/nPaper-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java index 1c5eb34c..6b55b129 100644 --- a/nPaper-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java +++ b/nPaper-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java @@ -262,4 +262,9 @@ private static void potionInaccuracy() { private static void logPlayerIp() { logPlayerIp = getBoolean("log-player-ip", true); } + + public static boolean obfuscatePlayerHealth = false; + private static void obfuscatePlayerHealth() { + obfuscatePlayerHealth = getBoolean("settings.obfuscate-player-health", obfuscatePlayerHealth); + } } From 8cdf213631f45fb01e932ecd6baaf4287036b44f Mon Sep 17 00:00:00 2001 From: Noksio Date: Wed, 19 Apr 2023 00:22:39 -0400 Subject: [PATCH 07/12] Update - Store XP as Int - Reduce locations desync of EntityExperienceOrb - Remoe EnumEntitySize since higher version doesn't use it - Backport playerBlockingDamageMultiplier - Add https://github.com/hpfxd/PandaSpigot/pull/110 - Fix MC-158900 - Fix teleportation glitch: https://github.com/IPVP-MC/Paper-1.7/commit/729d4d8e59f79126854d234705973f1d1f1d94ac - Optimize CraftEventFactory::getPlayerBucketEvent - Better memory-efficient storing for validBlocks in SpigotDebreakifier - Add expDespawnRate setting --- .../java/net/minecraft/server/Entity.java | 17 ------- .../minecraft/server/EntityExperienceOrb.java | 46 +++++++++++------ .../net/minecraft/server/EntityLiving.java | 2 +- .../minecraft/server/EntityTrackerEntry.java | 23 ++++----- .../PacketPlayOutSpawnEntityLiving.java | 4 +- .../java/net/minecraft/server/PlayerList.java | 49 +++++++------------ .../craftbukkit/entity/CraftPlayer.java | 2 +- .../craftbukkit/event/CraftEventFactory.java | 12 +---- .../java/org/spigotmc/SpigotDebreakifier.java | 12 ++--- .../java/org/spigotmc/SpigotWorldConfig.java | 7 +++ 10 files changed, 78 insertions(+), 96 deletions(-) diff --git a/nPaper-Server/src/main/java/net/minecraft/server/Entity.java b/nPaper-Server/src/main/java/net/minecraft/server/Entity.java index e4e2e1db..1258eac9 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/Entity.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/Entity.java @@ -120,7 +120,6 @@ public void retrack() { protected int aq; private boolean invulnerable; public UUID uniqueID; // CraftBukkit - protected -> public - public EnumEntitySize as; public boolean valid; // CraftBukkit public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only public boolean inUnloadedChunk = false; // PaperSpigot - Remove entities in unloaded chunks @@ -155,7 +154,6 @@ public Entity(World world) { this.maxFireTicks = 1; this.justCreated = true; this.uniqueID = new UUID(random.nextLong(), random.nextLong()); // Spigot - this.as = EnumEntitySize.SIZE_2; this.world = world; this.setPosition(0.0D, 0.0D, 0.0D); if (world != null) { @@ -206,21 +204,6 @@ protected void a(float f, float f1) { this.move((double) (f2 - this.width), 0.0D, (double) (f2 - this.width)); } } - - f2 = f % 2.0F; - if ((double) f2 < 0.375D) { - this.as = EnumEntitySize.SIZE_1; - } else if ((double) f2 < 0.75D) { - this.as = EnumEntitySize.SIZE_2; - } else if ((double) f2 < 1.0D) { - this.as = EnumEntitySize.SIZE_3; - } else if ((double) f2 < 1.375D) { - this.as = EnumEntitySize.SIZE_4; - } else if ((double) f2 < 1.75D) { - this.as = EnumEntitySize.SIZE_5; - } else { - this.as = EnumEntitySize.SIZE_6; - } } protected void b(float f, float f1) { diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java index 57507603..a07c0627 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java @@ -59,9 +59,26 @@ public void h() { this.j(this.locX, (this.boundingBox.b + this.boundingBox.e) / 2.0D, this.locZ); double d0 = 8.0D; + EntityHuman foundTarget = null; + boolean wasCancelled = false; if (this.targetTime < this.a - 20 + this.getId() % 100) { if (this.targetPlayer == null || this.targetPlayer.f(this) > d0 * d0) { - this.targetPlayer = this.world.findNearbyPlayer(this, d0); + foundTarget = this.world.findNearbyPlayer(this, d0); + if(foundTarget == null) { + this.targetPlayer = foundTarget; + } else if (foundTarget != null && !foundTarget.equals(this.targetPlayer)) { + // CraftBukkit start + EntityTargetEvent event = CraftEventFactory.callEntityTargetEvent(this, foundTarget, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); + Entity target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); + if (!(event.isCancelled())) { + if (target == null) { + this.targetPlayer = null; + } else if (target instanceof EntityHuman) { + this.targetPlayer = (EntityHuman) target; + } + } + // CraftBukkit end + } } this.targetTime = this.a; @@ -73,7 +90,7 @@ public void h() { Entity target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); if (!event.isCancelled() && target != null) { - double d1 = (target.locX - this.locX) / d0; + double d1 = (target.locX - this.locX) / d0; double d2 = (target.locY + (double) target.getHeadHeight() - this.locY) / d0; double d3 = (target.locZ - this.locZ) / d0; double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3); @@ -104,9 +121,12 @@ public void h() { ++this.a; ++this.b; - if (this.b >= 6000) { + if (this.b >= this.world.spigotConfig.expDespawnRate) { // Rinny - add ExpDespawnRate :) this.die(); - } + } else if (wasCancelled) { // Reduce desync + EntityTrackerEntry tracker = (EntityTrackerEntry)((WorldServer)this.world).tracker.trackedEntities.get(getId()); + tracker.broadcast(new PacketPlayOutRelEntityMove(getId(), (byte)(MathHelper.floor(this.locX * 32.0D) - tracker.xLoc), (byte)(MathHelper.floor(this.locY * 32.0D) - tracker.yLoc), (byte)(MathHelper.floor(this.locZ * 32.0D) - tracker.zLoc), this.onGround)); + } } public boolean N() { @@ -120,27 +140,25 @@ protected void burn(int i) { public boolean damageEntity(DamageSource damagesource, float f) { if (this.isInvulnerable()) { return false; - } else { - this.Q(); - this.d = (int) ((float) this.d - f); - if (this.d <= 0) { - this.die(); - } - - return false; } + this.Q(); + this.d = (int) ((float) this.d - f); + if (this.d <= 0) { + this.die(); + } + return false; } public void b(NBTTagCompound nbttagcompound) { nbttagcompound.setShort("Health", (short) ((byte) this.d)); nbttagcompound.setShort("Age", (short) this.b); - nbttagcompound.setShort("Value", (short) this.value); + nbttagcompound.setInt("Value", this.value); } public void a(NBTTagCompound nbttagcompound) { this.d = nbttagcompound.getShort("Health") & 255; this.b = nbttagcompound.getShort("Age"); - this.value = nbttagcompound.getShort("Value"); + this.value = nbttagcompound.getInt("Value"); } public void b_(EntityHuman entityhuman) { diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java index f850226b..047ac2d5 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java @@ -1045,7 +1045,7 @@ public Double apply(Double f) { public Double apply(Double f) { if (human) { if (!damagesource.ignoresArmor() && ((EntityHuman) EntityLiving.this).isBlocking() && f > 0.0F) { - return -(f - ((1.0F + f) * 0.5F)); + return -(f - ((1.0F + f) * EntityLiving.this.world.paperSpigotConfig.playerBlockingDamageMultiplier)); } } return -0.0; diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java index 92be3a80..23b89b3c 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -1,16 +1,13 @@ package net.minecraft.server; import java.util.Collection; -import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Set; import java.util.Map; +import java.util.Set; -import com.google.common.collect.Sets; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; - // CraftBukkit start import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerVelocityEvent; @@ -50,9 +47,9 @@ public EntityTrackerEntry(Entity entity, int i, int j, boolean flag) { this.b = i; this.c = j; this.u = flag; - this.xLoc = MathHelper.floor(entity.locX * 32.0D); - this.yLoc = MathHelper.floor(entity.locY * 32.0D); - this.zLoc = MathHelper.floor(entity.locZ * 32.0D); + this.xLoc = (int) Math.round(entity.locX * 32.0D); + this.yLoc = (int) Math.round(entity.locY * 32.0D); + this.zLoc = (int) Math.round(entity.locZ * 32.0D); this.yRot = MathHelper.d(entity.yaw * 256.0F / 360.0F); this.xRot = MathHelper.d(entity.pitch * 256.0F / 360.0F); this.i = MathHelper.d(entity.getHeadRotation() * 256.0F / 360.0F); @@ -110,9 +107,9 @@ public void track(List list) { if (this.tracker.vehicle == null) { ++this.v; - i = this.tracker.as.a(this.tracker.locX); - j = MathHelper.floor(this.tracker.locY * 32.0D); - int k = this.tracker.as.a(this.tracker.locZ); + i = (int) Math.round(this.tracker.locX * 32.0D); + j = (int) Math.round(this.tracker.locY * 32.0D); + int k = (int) Math.round(this.tracker.locZ * 32.0D); int l = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); int i1 = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); int j1 = i - this.xLoc; @@ -218,9 +215,9 @@ public void track(List list) { this.xRot = j; } - this.xLoc = this.tracker.as.a(this.tracker.locX); - this.yLoc = MathHelper.floor(this.tracker.locY * 32.0D); - this.zLoc = this.tracker.as.a(this.tracker.locZ); + this.xLoc = (int) Math.round(this.tracker.locX * 32.0D); + this.yLoc = (int) Math.round(this.tracker.locY * 32.0D); + this.zLoc = (int) Math.round(this.tracker.locZ * 32.0D); this.b(); this.x = true; } diff --git a/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java b/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java index 98b4d973..9f03085c 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java @@ -23,9 +23,9 @@ public PacketPlayOutSpawnEntityLiving() {} public PacketPlayOutSpawnEntityLiving(EntityLiving entityliving) { this.a = entityliving.getId(); this.b = (byte) EntityTypes.a(entityliving); - this.c = entityliving.as.a(entityliving.locX); + this.c = MathHelper.floor(entityliving.locX * 32.0D); this.d = MathHelper.floor(entityliving.locY * 32.0D); - this.e = entityliving.as.a(entityliving.locZ); + this.e = MathHelper.floor(entityliving.locZ * 32.0D); this.i = (byte) ((int) (entityliving.yaw * 256.0F / 360.0F)); this.j = (byte) ((int) (entityliving.pitch * 256.0F / 360.0F)); this.k = (byte) ((int) (entityliving.aO * 256.0F / 360.0F)); diff --git a/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java b/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java index 48a913ec..5bce4ab5 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java @@ -385,43 +385,32 @@ public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return st // CraftBukkit end } - // CraftBukkit start - Whole method, SocketAddress to LoginListener, added hostname to signature, return EntityPlayer + // CraftBukkit start - Whole method, SocketAddress to LoginListener, added hostname to signature, return EntityPlayer public EntityPlayer attemptLogin(LoginListener loginlistener, GameProfile gameprofile, String hostname) { // Instead of kicking then returning, we need to store the kick reason // in the event, check with plugins to see if it's ok, and THEN kick // depending on the outcome. - SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress(); - - EntityPlayer entity = new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, new PlayerInteractManager(this.server.getWorldServer(0))); - Player player = entity.getBukkitEntity(); - PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress(), ((java.net.InetSocketAddress) loginlistener.networkManager.getRawAddress()).getAddress()); - String s; - - if (this.j.isBanned(gameprofile) && !this.j.get(gameprofile).hasExpired()) { - GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.j.get(gameprofile); - - s = "You are banned from this server!\nReason: " + gameprofilebanentry.getReason(); - if (gameprofilebanentry.getExpires() != null) { - s = s + "\nYour ban will be removed on " + h.format(gameprofilebanentry.getExpires()); - } - - // return s; - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); // Spigot + final SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress(); + + final EntityPlayer entity = new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, new PlayerInteractManager(this.server.getWorldServer(0))); + final Player player = entity.getBukkitEntity(); + final PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress(), ((java.net.InetSocketAddress) loginlistener.networkManager.getRawAddress()).getAddress()); + + // Paper start - Fix MC-158900 + GameProfileBanEntry gameprofilebanentry; + if (getProfileBans().isBanned(gameprofile) && (gameprofilebanentry = (GameProfileBanEntry) getProfileBans().get(gameprofile)) != null) { + // Paper end + if (!gameprofilebanentry.hasExpired()) event.disallow(PlayerLoginEvent.Result.KICK_BANNED, "You are banned from this server!" + + "\nReason: " + gameprofilebanentry.getReason() + + (gameprofilebanentry.getExpires() != null ? "\nYour ban will be removed on " + h.format(gameprofilebanentry.getExpires()) : "")); // Spigot } else if (!this.isWhitelisted(gameprofile)) { - // return "You are not white-listed on this server!"; event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, org.spigotmc.SpigotConfig.whitelistMessage); // Spigot } else if (this.k.isBanned(socketaddress) && !this.k.get(socketaddress).hasExpired()) { // Spigot - IpBanEntry ipbanentry = this.k.get(socketaddress); - - s = "Your IP address is banned from this server!\nReason: " + ipbanentry.getReason(); - if (ipbanentry.getExpires() != null) { - s = s + "\nYour ban will be removed on " + h.format(ipbanentry.getExpires()); - } - - // return s; - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); + final IpBanEntry ipbanentry = this.k.get(socketaddress); + event.disallow(PlayerLoginEvent.Result.KICK_BANNED, "Your IP address is banned from this server!" + + "\nReason: " + ipbanentry.getReason() + + (ipbanentry.getExpires() != null ? "\nYour ban will be removed on " + h.format(ipbanentry.getExpires()) : "")); } else { - // return this.players.size() >= this.maxPlayers ? "The server is full!" : null; if (this.players.size() >= this.maxPlayers && (!player.isOp() && !player.hasPermission("bukkit.whitelist.bypass"))) { // Rinny allow to join server even if its full event.disallow(PlayerLoginEvent.Result.KICK_FULL, org.spigotmc.SpigotConfig.serverFullMessage); // Spigot } @@ -439,8 +428,6 @@ public EntityPlayer attemptLogin(LoginListener loginlistener, GameProfile gamepr public EntityPlayer processLogin(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer UUID uuid = EntityHuman.a(gameprofile); - ArrayList arraylist = Lists.newArrayList(); - EntityPlayer entityplayer; /* // PaperSpigot start - Use exact lookup below diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 07b2fccb..3e77b472 100644 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -684,7 +684,7 @@ public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cau if (fromWorld == toWorld) { entity.playerConnection.teleport(to); } else { - server.getHandle().moveToWorld(entity, toWorld.dimension, true, to, true); + server.getHandle().moveToWorld(entity, toWorld.dimension, true, to, false); // Fix teleportation glitch: https://github.com/IPVP-MC/Paper-1.7/commit/729d4d8e59f79126854d234705973f1d1f1d94ac } // PaperSpigot start diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 898a9bfc..6b3372f3 100644 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -173,17 +173,9 @@ private static PlayerEvent getPlayerBucketEvent(boolean isFilling, EntityHuman w Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ); BlockFace blockFace = CraftBlock.notchToBlockFace(clickedFace); - PlayerEvent event = null; - if (isFilling) { - event = new PlayerBucketFillEvent(player, blockClicked, blockFace, bucket, itemInHand); - ((PlayerBucketFillEvent) event).setCancelled(!canBuild(craftWorld, player, clickedX, clickedZ)); - } else { - event = new PlayerBucketEmptyEvent(player, blockClicked, blockFace, bucket, itemInHand); - ((PlayerBucketEmptyEvent) event).setCancelled(!canBuild(craftWorld, player, clickedX, clickedZ)); - } - + PlayerBucketEvent event = (isFilling ? new PlayerBucketFillEvent(player, blockClicked, blockFace, bucket, itemInHand) : new PlayerBucketEmptyEvent(player, blockClicked, blockFace, bucket, itemInHand)); + event.setCancelled(!canBuild(craftWorld, player, clickedX, clickedZ)); craftServer.getPluginManager().callEvent(event); - return event; } diff --git a/nPaper-Server/src/main/java/org/spigotmc/SpigotDebreakifier.java b/nPaper-Server/src/main/java/org/spigotmc/SpigotDebreakifier.java index d811f557..98c85c97 100644 --- a/nPaper-Server/src/main/java/org/spigotmc/SpigotDebreakifier.java +++ b/nPaper-Server/src/main/java/org/spigotmc/SpigotDebreakifier.java @@ -14,11 +14,12 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arrays; +import java.util.BitSet; public class SpigotDebreakifier { - private static final boolean[] validBlocks = new boolean[ 198 << 4 ]; + private static final BitSet validBlocks = new BitSet(198 << 4); // Rinny - Better memory-efficient storing private static final int[] correctedValues = new int[ 198 ]; static @@ -33,7 +34,7 @@ public class SpigotDebreakifier String[] parts = entry.getAsString().split( ":" ); int id = Integer.parseInt( parts[ 0 ] ); int data = Integer.parseInt( parts[ 1 ] ); - validBlocks[ ( id << 4 ) | data ] = true; + validBlocks.set((id << 4) | data, true); // Rinny if ( correctedValues[ id ] == -1 || data < correctedValues[ id ] ) { correctedValues[ id ] = data; @@ -58,13 +59,10 @@ public static int getCorrectedData(int id, int data) { data = 8; } - if ( validBlocks[ ( id << 4 ) | data ] ) - { + if (validBlocks.get((id << 4) | data)) { // Rinny return data; - } else - { - return correctedValues[ id ] & 0xF; } + return correctedValues[ id ] & 0xF; } private static TIntIntHashMap invalidItems = new TIntIntHashMap(); diff --git a/nPaper-Server/src/main/java/org/spigotmc/SpigotWorldConfig.java b/nPaper-Server/src/main/java/org/spigotmc/SpigotWorldConfig.java index 854ba6d8..fabd3bfd 100644 --- a/nPaper-Server/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/nPaper-Server/src/main/java/org/spigotmc/SpigotWorldConfig.java @@ -239,6 +239,13 @@ private void arrowDespawnRate() log( "Arrow Despawn Rate: " + arrowDespawnRate ); } + public int expDespawnRate = 6000;; + private void expDespawnRate() + { + expDespawnRate = getInt( "exp-despawn-rate", expDespawnRate); + log( "Exp Despawn Rate: " + expDespawnRate ); + } + public boolean antiXray; public int engineMode; public List hiddenBlocks; From 1a9c123128f1af0db286d16944d543d0a860f85f Mon Sep 17 00:00:00 2001 From: Noksio Date: Mon, 24 Apr 2023 14:56:06 -0400 Subject: [PATCH 08/12] https://github.com/hpfxd/PandaSpigot/commit/8165e1babe08d0a97700aafe8e04b99ddc344483 but better --- .../java/net/minecraft/server/PortalTravelAgent.java | 8 ++++++-- .../java/org/bukkit/craftbukkit/CraftTravelAgent.java | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/nPaper-Server/src/main/java/net/minecraft/server/PortalTravelAgent.java b/nPaper-Server/src/main/java/net/minecraft/server/PortalTravelAgent.java index 70e6e81d..f116950d 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/PortalTravelAgent.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/PortalTravelAgent.java @@ -91,9 +91,13 @@ private ChunkCoordinates findEndPortal(ChunkCoordinates portal) { public boolean b(Entity entity, double d0, double d1, double d2, float f) { // CraftBukkit start - Modularize portal search process and entity teleportation - ChunkCoordinates found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128); + ChunkCoordinates found = this.findPortal(entity.locX, entity.locY, entity.locZ, 10); if (found == null) { - return false; + found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128); + + if (found == null) { + return false; + } } Location exit = new Location(this.a.getWorld(), found.x, found.y, found.z, f, entity.pitch); diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java index f7ca6a3f..fc29da73 100644 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java +++ b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java @@ -41,8 +41,13 @@ public Location findOrCreate(Location target) { } public Location findPortal(Location location) { - PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().getTravelAgent(); - ChunkCoordinates found = pta.findPortal(location.getX(), location.getY(), location.getZ(), this.getSearchRadius()); + final PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().getTravelAgent(); + // PandaSpigot + ChunkCoordinates found = pta.findPortal(location.getX(), location.getY(), location.getZ(), 10); + if (found == null) { + found = pta.findPortal(location.getX(), location.getY(), location.getZ(), this.getSearchRadius()); + } + // PandaSpigot return found != null ? new Location(location.getWorld(), found.x, found.y, found.z, location.getYaw(), location.getPitch()) : null; } From 6e826a05442daca506cc033f84c309ff0f5940a4 Mon Sep 17 00:00:00 2001 From: Noksio Date: Thu, 25 May 2023 01:17:49 -0400 Subject: [PATCH 09/12] add knockbackReduction --- .../src/main/java/org/bukkit/entity/Entity.java | 14 ++++++++++++++ .../java/net/minecraft/server/EntityHanging.java | 2 +- .../java/net/minecraft/server/EntityLiving.java | 9 +++++---- .../minecraft/server/EntityMinecartAbstract.java | 2 +- .../org/bukkit/craftbukkit/entity/CraftEntity.java | 10 +++++++++- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/nPaper-API/src/main/java/org/bukkit/entity/Entity.java b/nPaper-API/src/main/java/org/bukkit/entity/Entity.java index 5161518c..00071d72 100644 --- a/nPaper-API/src/main/java/org/bukkit/entity/Entity.java +++ b/nPaper-API/src/main/java/org/bukkit/entity/Entity.java @@ -76,6 +76,20 @@ public interface Entity extends Metadatable { * @return True if entity is on ground. */ public boolean isOnGround(); + + /** + * Reduction of the knockback. + * + * @param reduction The new knockback reduction. + */ + public void setKnockbackReduction(float reduction); + + /** + * Gets the actual knockback reduction of the entity + * + * @return Knockback reduction + */ + public float getKnockbackReduction(); /** * Gets the current world this entity resides in diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityHanging.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityHanging.java index 3fad5d5b..7c3d3392 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityHanging.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityHanging.java @@ -208,7 +208,7 @@ public boolean damageEntity(DamageSource damagesource, float f) { HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.DEFAULT); PaintingBreakEvent paintingEvent = null; if (damagesource.getEntity() != null) { - event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); + event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damagesource.getEntity() == null ? null : (org.bukkit.entity.Entity) damagesource.getEntity().getBukkitEntity()); if (this instanceof EntityPainting) { // Fire old painting event until it can be removed diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java index 047ac2d5..e301938e 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityLiving.java @@ -883,15 +883,16 @@ public void a(Entity entity, float f, double d0, double d1) { this.al = true; // Rinny start - configurable knockback double magnitude = MathHelper.sqrt(d0 * d0 + d1 * d1); - double d2 = this.world.paperSpigotConfig.knockbackForceAndHeight; + final double knockbackReduction = getBukkitEntity().getKnockbackReduction(); + final double force = (world.paperSpigotConfig.knockbackForceAndHeight * (1.0D - knockbackReduction)); this.motX /= 2.0; this.motY /= 2.0; this.motZ /= 2.0; - this.motX -= d0 / magnitude * d2; - this.motY = MathHelper.limit(this.motY + d2, 0.05D, this.world.paperSpigotConfig.knockbackVerticalLimit); - this.motZ -= d1 / magnitude * d2; + this.motX -= d0 / magnitude * force; + this.motY = MathHelper.limit(this.motY + force, 0.05D, this.world.paperSpigotConfig.knockbackVerticalLimit); + this.motZ -= d1 / magnitude * force; // Rinny end } } diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityMinecartAbstract.java index 0710fccd..07e4a733 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityMinecartAbstract.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityMinecartAbstract.java @@ -115,7 +115,7 @@ public boolean damageEntity(DamageSource damagesource, float f) { } else { // CraftBukkit start - fire VehicleDamageEvent Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); + org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : (org.bukkit.entity.Entity) damagesource.getEntity().getBukkitEntity(); VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, f); this.world.getServer().getPluginManager().callEvent(event); diff --git a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 8625a1d9..65df6c5f 100644 --- a/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/nPaper-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -10,7 +10,6 @@ import org.bukkit.Server; import org.bukkit.World; import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.metadata.MetadataValue; @@ -21,6 +20,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { protected final CraftServer server; protected Entity entity; private EntityDamageEvent lastDamageEvent; + private float knockbackReduction = 0.0f; public CraftEntity(final CraftServer server, final Entity entity) { this.server = server; @@ -276,6 +276,14 @@ public boolean isValid() { public Server getServer() { return server; } + + public void setKnockbackReduction(float reduction) { + this.knockbackReduction = reduction; + } + + public float getKnockbackReduction() { + return this.knockbackReduction; + } public Vector getMomentum() { return getVelocity(); From c26c016b012f4fa01d4f533aa0af9ff835bb72cf Mon Sep 17 00:00:00 2001 From: Noksio Date: Thu, 25 May 2023 01:21:23 -0400 Subject: [PATCH 10/12] replace round by floor --- .../minecraft/server/EntityTrackerEntry.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java index 23b89b3c..849bbed2 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -47,9 +47,9 @@ public EntityTrackerEntry(Entity entity, int i, int j, boolean flag) { this.b = i; this.c = j; this.u = flag; - this.xLoc = (int) Math.round(entity.locX * 32.0D); - this.yLoc = (int) Math.round(entity.locY * 32.0D); - this.zLoc = (int) Math.round(entity.locZ * 32.0D); + this.xLoc = (int) Math.floor(entity.locX * 32.0D); + this.yLoc = (int) Math.floor(entity.locY * 32.0D); + this.zLoc = (int) Math.floor(entity.locZ * 32.0D); this.yRot = MathHelper.d(entity.yaw * 256.0F / 360.0F); this.xRot = MathHelper.d(entity.pitch * 256.0F / 360.0F); this.i = MathHelper.d(entity.getHeadRotation() * 256.0F / 360.0F); @@ -107,9 +107,9 @@ public void track(List list) { if (this.tracker.vehicle == null) { ++this.v; - i = (int) Math.round(this.tracker.locX * 32.0D); - j = (int) Math.round(this.tracker.locY * 32.0D); - int k = (int) Math.round(this.tracker.locZ * 32.0D); + i = (int) Math.floor(this.tracker.locX * 32.0D); + j = (int) Math.floor(this.tracker.locY * 32.0D); + int k = (int) Math.floor(this.tracker.locZ * 32.0D); int l = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); int i1 = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); int j1 = i - this.xLoc; @@ -215,9 +215,9 @@ public void track(List list) { this.xRot = j; } - this.xLoc = (int) Math.round(this.tracker.locX * 32.0D); - this.yLoc = (int) Math.round(this.tracker.locY * 32.0D); - this.zLoc = (int) Math.round(this.tracker.locZ * 32.0D); + this.xLoc = (int) Math.floor(this.tracker.locX * 32.0D); + this.yLoc = (int) Math.floor(this.tracker.locY * 32.0D); + this.zLoc = (int) Math.floor(this.tracker.locZ * 32.0D); this.b(); this.x = true; } From 47e4916b7fac267a0023bd60cc7c74caf046050b Mon Sep 17 00:00:00 2001 From: Noksio Date: Thu, 25 May 2023 01:28:36 -0400 Subject: [PATCH 11/12] update qlite-jdbc --- nPaper-Server/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nPaper-Server/pom.xml b/nPaper-Server/pom.xml index b743d1d0..e012e6c6 100644 --- a/nPaper-Server/pom.xml +++ b/nPaper-Server/pom.xml @@ -106,7 +106,7 @@ org.xerial sqlite-jdbc - 3.40.0.0 + 3.42.0.0 jar compile From 6038e8633c7d84c0322f85cb8145b98b01ef4259 Mon Sep 17 00:00:00 2001 From: Noksio Date: Mon, 5 Jun 2023 23:30:54 -0400 Subject: [PATCH 12/12] tiny cleanup --- .../main/java/net/minecraft/server/World.java | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/nPaper-Server/src/main/java/net/minecraft/server/World.java b/nPaper-Server/src/main/java/net/minecraft/server/World.java index f53a1f2d..f9e9db41 100644 --- a/nPaper-Server/src/main/java/net/minecraft/server/World.java +++ b/nPaper-Server/src/main/java/net/minecraft/server/World.java @@ -3,39 +3,35 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; -import java.util.HashSet; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; - // PaperSpigot start import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.HashMap; -import java.util.Map; -import net.minecraft.util.com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.bukkit.craftbukkit.CraftChunk; -// PaperSpigot end // CraftBukkit start import org.bukkit.Bukkit; import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.util.LongHashSet; -import org.bukkit.craftbukkit.SpigotTimings; // Spigot -import org.bukkit.generator.ChunkGenerator; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.SpigotTimings; // Spigot import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.event.block.BlockCanBuildEvent; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -import org.bukkit.event.weather.WeatherChangeEvent; import org.bukkit.event.weather.ThunderChangeEvent; // CraftBukkit end +import org.bukkit.event.weather.WeatherChangeEvent; +import org.bukkit.generator.ChunkGenerator; + +import net.minecraft.util.com.google.common.util.concurrent.ThreadFactoryBuilder; public abstract class World implements IBlockAccess { @@ -2276,30 +2272,35 @@ protected void o() { protected void C() { // this.chunkTickList.clear(); // CraftBukkit - removed this.methodProfiler.a("buildList"); - - int i; - EntityHuman entityhuman; + + // Rinny - Moved down + /* int j; int k; int l; - + */ + // Rinny + // Spigot start - int optimalChunks = spigotConfig.chunksPerTick; + final int optimalChunks = spigotConfig.chunksPerTick; // Quick conditions to allow us to exist early if ( optimalChunks <= 0 || players.isEmpty() ) { return; } + // Rinny - Moved - dont init variable when not needed + int j; + int k; + int l; + // Rinny - Moved // Keep chunks with growth inside of the optimal chunk range - int chunksPerPlayer = Math.min( 200, Math.max( 1, (int) ( ( ( optimalChunks - players.size() ) / (double) players.size() ) + 0.5 ) ) ); - int randRange = 3 + chunksPerPlayer / 30; + final int chunksPerPlayer = Math.min(200, Math.max(1, (int) Math.ceil(((optimalChunks - players.size()) / (double) players.size())))); // Rinny - reduce the number of floating-point operations that result in faster code // Limit to normal tick radius - including view distance - randRange = ( randRange > chunkTickRadius ) ? chunkTickRadius : randRange; + final int randRange = Math.min(3 + chunksPerPlayer / 30, chunkTickRadius); // odds of growth happening vs growth happening in vanilla this.growthOdds = this.modifiedOdds = Math.max( 35, Math.min( 100, ( ( chunksPerPlayer + 1 ) * 100F ) / 15F ) ); // Spigot end - for (i = 0; i < this.players.size(); ++i) { - entityhuman = (EntityHuman) this.players.get(i); + for (EntityHuman entityhuman : (List) this.players) { j = MathHelper.floor(entityhuman.locX / 16.0D); k = MathHelper.floor(entityhuman.locZ / 16.0D); l = this.p(); @@ -2330,8 +2331,8 @@ protected void C() { this.methodProfiler.a("playerCheckLight"); if (spigotConfig.randomLightUpdates && !this.players.isEmpty()) { // Spigot - i = this.random.nextInt(this.players.size()); - entityhuman = (EntityHuman) this.players.get(i); + final int i = this.random.nextInt(this.players.size()); + final EntityHuman entityhuman = (EntityHuman) this.players.get(i); j = MathHelper.floor(entityhuman.locX) + this.random.nextInt(11) - 5; k = MathHelper.floor(entityhuman.locY) + this.random.nextInt(11) - 5; l = MathHelper.floor(entityhuman.locZ) + this.random.nextInt(11) - 5;