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-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
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
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..8d23af4c 100644
--- a/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java
+++ b/nPaper-Server/src/main/java/net/minecraft/server/DataWatcher.java
@@ -1,35 +1,34 @@
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;
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 );
// 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) {
@@ -165,12 +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) {
- this.f.readLock().lock();
- Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot
+ Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot
while (iterator.hasNext()) {
WatchableObject watchableobject = (WatchableObject) iterator.next();
@@ -178,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
@@ -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,14 +195,11 @@ 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();
+ public List c() {
+ ArrayList arraylist = new ArrayList(); // Spigot
arraylist.addAll(this.dataValues.valueCollection()); // Spigot
// Spigot start - copy ItemStacks to prevent ConcurrentModificationExceptions
@@ -245,7 +218,6 @@ public List c() {
}
// Spigot end
- this.f.readLock().unlock();
return arraylist;
}
@@ -315,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/Entity.java b/nPaper-Server/src/main/java/net/minecraft/server/Entity.java
index 19c9769b..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) {
@@ -171,6 +169,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();
@@ -205,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/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();
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/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 f850226b..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
}
}
@@ -1045,7 +1046,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/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/net/minecraft/server/EntityTrackerEntry.java b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java
index 83b2f2ef..849bbed2 100644
--- a/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java
+++ b/nPaper-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java
@@ -1,20 +1,18 @@
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;
// CraftBukkit end
+import org.github.paperspigot.PaperSpigotConfig;
public class EntityTrackerEntry {
@@ -49,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.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);
@@ -109,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.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;
@@ -217,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.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;
}
@@ -265,7 +263,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/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/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/PlayerList.java b/nPaper-Server/src/main/java/net/minecraft/server/PlayerList.java
index 7e0dc57d..5bce4ab5 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
@@ -387,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
}
@@ -441,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/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/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
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/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;
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/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;
}
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();
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/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);
- }
- }
- }
-}
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);
}
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);
+ }
}
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;