Even more patches for 1.14

This commit is contained in:
Shane Freeder 2019-04-30 02:20:24 +01:00
parent cab9529fe8
commit 86e7cee50c
35 changed files with 504 additions and 847 deletions

View file

@ -6,100 +6,81 @@ Subject: [PATCH] Add Debug Entities option to debug dupe uuid issues
Add -Ddebug.entities=true to your JVM flags to gain more information
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 69a058d830..b6c46e01d9 100644
index c7d19d957..8dd589aae 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData; // Paper
protected CraftEntity bukkitEntity;
EntityTrackerEntry tracker; // Paper
+ EntityTrackerEntry tracker; // Paper
+ Throwable addedToWorldStack; // Paper - entity debug
public CraftEntity getBukkitEntity() {
if (bukkitEntity == null) {
bukkitEntity = CraftEntity.getEntity(world.getServer(), this);
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index c7712d2e71..1496125ddf 100644
index 6bd181565..f9f0a94e9 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose
public boolean pvpMode;
public boolean keepSpawnInMemory = true;
public ChunkGenerator generator;
public org.bukkit.generator.ChunkGenerator generator;
+ public static final boolean DEBUG_ENTITIES = Boolean.getBoolean("debug.entities"); // Paper
public boolean captureBlockStates = false;
public boolean captureTreeGeneration = false;
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 85a30652c4..6d1f70b39e 100644
index 0b4990a00..3e41c080d 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
// CraftBukkit start
@@ -0,0 +0,0 @@ public class WorldServer extends World {
public final DimensionManager dimension;
private int tickPosition;
boolean hasPhysicsEvent = true; // Paper
+ private static Throwable getAddToWorldStackTrace(Entity entity) {
+ return new Throwable(entity + " Added to world at " + new java.util.Date());
+ }
// Add env and gen to constructor
public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, PersistentCollection persistentcollection, WorldData worlddata, DimensionManager dimensionmanager, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) {
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
private boolean j(Entity entity) {
public WorldServer(MinecraftServer minecraftserver, Executor executor, WorldNBTStorage worldnbtstorage, WorldData worlddata, DimensionManager dimensionmanager, GameProfilerFiller gameprofilerfiller, WorldLoadListener worldloadlistener, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) {
@@ -0,0 +0,0 @@ public class WorldServer extends World {
org.spigotmc.AsyncCatcher.catchOp( "entity add"); // Spigot
if (entity.valid) { MinecraftServer.LOGGER.error("Attempted Double World add on " + entity, new Throwable()); return true; } // Paper
if (entity.dead) {
- // WorldServer.a.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.P())); // CraftBukkit
+ // Paper start
+ if (DEBUG_ENTITIES) {
+ new Throwable("Tried to add entity " + entity + " but it was marked as removed already").printStackTrace(); // CraftBukkit
+ getAddToWorldStackTrace(entity).printStackTrace();
+ }
+ // Paper end
// WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.getEntityType())); // CraftBukkit
return false;
} else {
UUID uuid = entity.getUniqueID();
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
this.g.remove(entity1);
} else {
if (!(entity instanceof EntityHuman)) {
- WorldServer.a.error("Keeping entity {} that already exists with UUID {} - " + entity1, EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit // Paper
- WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper
+ if (DEBUG_ENTITIES) {
+ WorldServer.a.error("Keeping entity {} that already exists with UUID {}", entity1, uuid.toString()); // CraftBukkit // Paper
+ WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper
+
+ if (entity1.addedToWorldStack != null) {
+ entity1.addedToWorldStack.printStackTrace();
+ }
+ getAddToWorldStackTrace(entity).printStackTrace();
+ }
return false;
}
} else if (this.isUUIDTaken(entity)) {
@@ -0,0 +0,0 @@ public class WorldServer extends World {
}
}
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
protected void b(Entity entity) {
super.b(entity);
this.entitiesById.a(entity.getId(), entity);
- this.entitiesByUUID.put(entity.getUniqueID(), entity);
+ // Paper start
+ if (DEBUG_ENTITIES) {
+ entity.addedToWorldStack = getAddToWorldStackTrace(entity);
+ }
+
+ Entity old = this.entitiesByUUID.put(entity.getUniqueID(), entity);
+ if (old != null && old.getId() != entity.getId() && old.valid) {
+ Logger logger = LogManager.getLogger();
+ logger.error("Overwrote an existing entity " + old + " with " + entity);
- this.entitiesByUUID.put(entity.getUniqueID(), entity);
+ if (DEBUG_ENTITIES) {
+ if (old.addedToWorldStack != null) {
+ old.addedToWorldStack.printStackTrace();
+ } else {
+ logger.error("Oddly, the old entity was not added to the world in the normal way. Plugins?");
+ }
+ entity.addedToWorldStack.printStackTrace();
+ entity.addedToWorldStack = getAddToWorldStackTrace(entity);
+ }
+ }
+ // Paper end
Entity[] aentity = entity.bi();
if (aentity != null) {
+
+ Entity old = this.entitiesByUUID.put(entity.getUniqueID(), entity);
+ if (old != null && old.getId() != entity.getId() && old.valid) {
+ Logger logger = LogManager.getLogger();
+ logger.error("Overwrote an existing entity " + old + " with " + entity);
+ if (DEBUG_ENTITIES) {
+ if (old.addedToWorldStack != null) {
+ old.addedToWorldStack.printStackTrace();
+ } else {
+ logger.error("Oddly, the old entity was not added to the world in the normal way. Plugins?");
+ }
+ entity.addedToWorldStack.printStackTrace();
+ }
+ }
+
this.getChunkProvider().addEntity(entity);
if (entity instanceof EntityInsentient) {
this.I.add(((EntityInsentient) entity).getNavigation());
--

View file

@ -5,7 +5,7 @@ Subject: [PATCH] Add config to disable ender dragon legacy check
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 47f8dfcc41..aa2be2ede6 100644
index ce17447fa..3294fbbea 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -0,0 +0,0 @@ public class PaperWorldConfig {
@ -19,7 +19,7 @@ index 47f8dfcc41..aa2be2ede6 100644
+ }
}
diff --git a/src/main/java/net/minecraft/server/EnderDragonBattle.java b/src/main/java/net/minecraft/server/EnderDragonBattle.java
index a6259d9e6c..aad7ce93f6 100644
index 5ae20b132..60ba37c92 100644
--- a/src/main/java/net/minecraft/server/EnderDragonBattle.java
+++ b/src/main/java/net/minecraft/server/EnderDragonBattle.java
@@ -0,0 +0,0 @@ public class EnderDragonBattle {

View file

@ -10,68 +10,66 @@ to the object directly on the Entity/TileEntity object we can directly grab.
Use that local value instead to reduce lookups in many hot places.
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index d87b08a49e..c7712d2e71 100644
index 3737fca81..6bd181565 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
int i = entity.chunkX;
int j = entity.chunkZ;
- if (entity.inChunk && this.isChunkLoaded(i, j, true)) {
- this.getChunkAt(i, j).b(entity);
- }
+ Chunk chunk = entity.getCurrentChunk(); // Paper
+ if (chunk != null) chunk.removeEntity(entity); // Paper
// CraftBukkit start - Decrement loop variable field if we've already ticked this entity
int index = this.entityList.indexOf(entity);
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
int k = entity.chunkX;
j = entity.chunkZ;
- if (entity.inChunk && this.isChunkLoaded(k, j, true)) {
- this.getChunkAt(k, j).b(entity);
- }
+ Chunk chunk = entity.getCurrentChunk(); // Paper
+ if (chunk != null) chunk.removeEntity(entity); // Paper
//} // Paper - merge
//for (Entity e : this.g) { // Paper - merge
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
j = entity.chunkX;
int l = entity.chunkZ;
- if (entity.inChunk && this.isChunkLoaded(j, l, true)) {
- this.getChunkAt(j, l).b(entity);
- }
+ // Paper start
+ Chunk chunk = entity.getCurrentChunk();
+ if (chunk != null) chunk.removeEntity(entity);
+ // Paper end
guardEntityList = false; // Spigot
this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose
if (!tileentity.isRemoved() && tileentity.hasWorld()) {
BlockPosition blockposition = tileentity.getPosition();
// Paper start - Skip ticking in chunks scheduled for unload
- net.minecraft.server.Chunk chunk = this.getChunkIfLoaded(blockposition);
+ net.minecraft.server.Chunk chunk = tileentity.getCurrentChunk();
boolean shouldTick = chunk != null;
if(this.paperConfig.skipEntityTickingInChunksScheduledForUnload)
shouldTick = shouldTick && chunk.scheduledForUnload == null;
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
tilesThisCycle--;
- if (this.isLoaded(blockposition) && this.getWorldBorder().a(blockposition)) {
+ Chunk currentChunk = tileentity.getCurrentChunk(); // Paper
+ if (currentChunk != null && this.getWorldBorder().a(blockposition)) { // Paper
try {
gameprofilerfiller.a(() -> {
return String.valueOf(TileEntityTypes.a(tileentity.q()));
@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose
this.tileEntityListTick.remove(tileTickPosition--);
// Spigot end
//this.tileEntityList.remove(tileentity); // Paper - remove unused list
- if (this.isLoaded(tileentity.getPosition())) {
- this.getChunkAtWorldCoords(tileentity.getPosition()).d(tileentity.getPosition());
+ // Paper start
+ net.minecraft.server.Chunk chunk = tileentity.getCurrentChunk();
+ if (chunk != null) {
+ chunk.removeTileEntity(tileentity.getPosition());
+ // Paper end
+ if (tileentity.getCurrentChunk() != null ) { // Paper - avoid lookups
this.getChunkAtWorldCoords(tileentity.getPosition()).removeTileEntity(tileentity.getPosition());
}
}
@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose
}
// CraftBukkit end */
- if (this.isLoaded(tileentity1.getPosition())) {
- Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition());
+ Chunk chunk = tileentity1.getCurrentChunk(); // Paper
+ if (chunk != null) { // Paper
+ //Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition()); // Paper
IBlockData iblockdata = chunk.getType(tileentity1.getPosition());
chunk.setTileEntity(tileentity1.getPosition(), tileentity1);
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 79be8cfa3..af62ab182 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -0,0 +0,0 @@ public class WorldServer extends World {
}
this.entitiesByUUID.remove(entity.getUniqueID());
- this.getChunkProvider().removeEntity(entity);
+ if (entity.getCurrentChunk() != null ) this.getChunkProvider().removeEntity(entity); // Paper
if (entity instanceof EntityPlayer) {
EntityPlayer entityplayer = (EntityPlayer) entity;
@@ -0,0 +0,0 @@ public class WorldServer extends World {
}
private void removeEntityFromChunk(Entity entity) {
- IChunkAccess ichunkaccess = this.getChunkAt(entity.chunkX, entity.chunkZ, ChunkStatus.FULL, false);
+ // Paper start
+ if (!entity.inChunk) return;
+ IChunkAccess ichunkaccess = this.getChunkIfLoaded(entity.chunkX, entity.chunkZ);
+ // Paper start
- if (ichunkaccess instanceof Chunk) {
+ if (ichunkaccess != null) {
((Chunk) ichunkaccess).b(entity);
}
--

View file

@ -5,18 +5,18 @@ Subject: [PATCH] Avoid item merge if stack size above max stack size
diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java
index e9986420c2..c9473087ad 100644
index c582c6711..c5fefa060 100644
--- a/src/main/java/net/minecraft/server/EntityItem.java
+++ b/src/main/java/net/minecraft/server/EntityItem.java
@@ -0,0 +0,0 @@ public class EntityItem extends Entity {
}
private void v() {
private void mergeNearby() {
+ // Paper start - avoid item merge if stack size above max stack size
+ ItemStack stack = getItemStack();
+ if (stack.getCount() >= stack.getMaxStackSize()) return;
+ // Paper end
// Spigot start
double radius = world.spigotConfig.itemMerge;
Iterator iterator = this.world.a(EntityItem.class, this.getBoundingBox().grow(radius, radius, radius)).iterator();
List<EntityItem> list = this.world.a(EntityItem.class, this.getBoundingBox().grow(radius, radius, radius), (entityitem) -> {
--

View file

@ -36,7 +36,7 @@ This change will result in some major changes to fishing formulas.
I would love to see this change in Vanilla, so Mojang please pull :)
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
index b85cd10437..d42853d14c 100644
index 7fba61a6d..c8f9c45e5 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
@@ -0,0 +0,0 @@ public class PaperConfig {
@ -53,54 +53,81 @@ index b85cd10437..d42853d14c 100644
+ }
}
diff --git a/src/main/java/net/minecraft/server/LootSelectorEntry.java b/src/main/java/net/minecraft/server/LootSelectorEntry.java
index 3e313bba7c..80f9f9a252 100644
index 929053491..62cac814d 100644
--- a/src/main/java/net/minecraft/server/LootSelectorEntry.java
+++ b/src/main/java/net/minecraft/server/LootSelectorEntry.java
@@ -0,0 +0,0 @@ import java.util.Random;
@@ -0,0 +0,0 @@ import org.apache.commons.lang3.ArrayUtils;
public abstract class LootSelectorEntry {
public abstract class LootSelectorEntry extends LootEntryAbstract {
- protected final int c;
- protected final int d;
+ protected final int c; public int getWeight() { return c; } // Paper - OBFHELPER
+ protected final int d; public int getQuality() { return d; } // Paper - OBFHELPER
protected final LootItemCondition[] e;
- protected final int e;
- protected final int f;
+ protected final int e; public int getWeight() { return e; } // Paper - OBFHELPER
+ protected final int f; public int getQuality() { return f; } // Paper - OBFHELPER
protected final LootItemFunction[] g;
private final BiFunction<ItemStack, LootTableInfo, ItemStack> c;
private final LootEntry h = new LootSelectorEntry.c() {
@@ -0,0 +0,0 @@ public abstract class LootSelectorEntry extends LootEntryAbstract {
@Override
public T b(LootItemFunction.a lootitemfunction_a) {
this.c.add(lootitemfunction_a.b());
- return (LootSelectorEntry.a) this.d();
+ return this.d(); // Paper - decompile fix -- move to mcdev fixes
}
protected LootSelectorEntry(int i, int j, LootItemCondition[] alootitemcondition) {
@@ -0,0 +0,0 @@ public abstract class LootSelectorEntry {
protected LootItemFunction[] a() {
@@ -0,0 +0,0 @@ public abstract class LootSelectorEntry extends LootEntryAbstract {
public T a(int i) {
this.a = i;
- return (LootSelectorEntry.a) this.d();
+ return this.d(); // Paper - decompile fix -- move to mcdev fixes
}
public T b(int i) {
this.b = i;
- return (LootSelectorEntry.a) this.d();
+ return this.d(); // Paper - decompile fix -- MOVE UP
}
}
public int a(float f) {
- return Math.max(MathHelper.d((float) this.c + (float) this.d * f), 0);
+ // Paper start - Offer an alternative loot formula to refactor how luck bonus applies
+ // SEE: https://luckformula.emc.gs for details and data
+ if (lastLuck != null && lastLuck == f) {
public abstract class c implements LootEntry {
- protected c() {}
+ protected c() {
+ }
@Override
public int a(float f) {
- return Math.max(MathHelper.d((float) LootSelectorEntry.this.e + (float) LootSelectorEntry.this.f * f), 0);
+ // Paper start - Offer an alternative loot formula to refactor how luck bonus applies
+ // SEE: https://luckformula.emc.gs for details and data
+ if (lastLuck != null && lastLuck == f) {
+ return lastWeight;
+ }
+ // This is vanilla
+ float qualityModifer = (float) getQuality() * f;
+ double baseWeight = (getWeight() + qualityModifer);
+ if (com.destroystokyo.paper.PaperConfig.useAlternativeLuckFormula) {
+ // Random boost to avoid losing precision in the final int cast on return
+ final int weightBoost = 100;
+ baseWeight *= weightBoost;
+ // If we have vanilla 1, bump that down to 0 so nothing is is impacted
+ // vanilla 3 = 300, 200 basis = impact 2%
+ // =($B2*(($B2-100)/100/100))
+ double impacted = baseWeight * ((baseWeight - weightBoost) / weightBoost / 100);
+ // =($B$7/100)
+ float luckModifier = Math.min(100, f * 10) / 100;
+ // =B2 - (C2 *($B$7/100))
+ baseWeight = Math.ceil(baseWeight - (impacted * luckModifier));
+ }
+ lastLuck = f;
+ lastWeight = (int) Math.max(0, Math.floor(baseWeight));
+ return lastWeight;
+ }
+ // This is vanilla
+ float qualityModifer = (float) this.getQuality() * f;
+ double baseWeight = (this.getWeight() + qualityModifer);
+ if (com.destroystokyo.paper.PaperConfig.useAlternativeLuckFormula) {
+ // Random boost to avoid losing precision in the final int cast on return
+ final int weightBoost = 100;
+ baseWeight *= weightBoost;
+ // If we have vanilla 1, bump that down to 0 so nothing is is impacted
+ // vanilla 3 = 300, 200 basis = impact 2%
+ // =($B2*(($B2-100)/100/100))
+ double impacted = baseWeight * ((baseWeight - weightBoost) / weightBoost / 100);
+ // =($B$7/100)
+ float luckModifier = Math.min(100, f * 10) / 100;
+ // =B2 - (C2 *($B$7/100))
+ baseWeight = Math.ceil(baseWeight - (impacted * luckModifier));
+ }
+ lastLuck = f;
+ lastWeight = (int) Math.max(0, Math.floor(baseWeight));
+ return lastWeight;
}
}
+ private Float lastLuck = null;
+ private int lastWeight = 0;
+ // Paper end
public abstract void a(Collection<ItemStack> collection, Random random, LootTableInfo loottableinfo);
+ private Float lastLuck = null;
+ private int lastWeight = 0;
+ // Paper end
}
--

View file

@ -10,7 +10,7 @@ player at their bed should it of became obstructed.
Defaults to vanilla 1.
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index aa2be2ede6..f5b2e88f3b 100644
index 3294fbbea..83e54cb90 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -0,0 +0,0 @@ public class PaperWorldConfig {
@ -30,74 +30,74 @@ index aa2be2ede6..f5b2e88f3b 100644
+ }
}
diff --git a/src/main/java/net/minecraft/server/BlockBed.java b/src/main/java/net/minecraft/server/BlockBed.java
index 06f627002c..d81a2db6cd 100644
index 2a451025f..75331c986 100644
--- a/src/main/java/net/minecraft/server/BlockBed.java
+++ b/src/main/java/net/minecraft/server/BlockBed.java
@@ -0,0 +0,0 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity {
@Nullable
public static BlockPosition a(IBlockAccess iblockaccess, BlockPosition blockposition, int i) {
EnumDirection enumdirection = (EnumDirection) iblockaccess.getType(blockposition).get(BlockBed.FACING);
+ // Paper - replace whole method
+ World world = (World) iblockaccess;
public static Optional<Vec3D> a(EntityTypes<?> entitytypes, IWorldReader iworldreader, BlockPosition blockposition, int i) {
EnumDirection enumdirection = (EnumDirection) iworldreader.getType(blockposition).get(BlockBed.FACING);
+ // Paper - configurable bed search radius
+ World world = (World) iworldreader;
+ int radius = world.paperConfig.bedSearchRadius;
+ for (int r = 1; r <= radius; r++) {
+ int x = -r;
+ int z = r;
+ if (radius > 0) {
+ for (int r = 1; r <= radius; r++) {
+ int x = -r;
+ int z = r;
+
+ // Iterates the edge of half of the box; then negates for other half.
+ while (x <= r && z > -r) {
+ for (int y = -1; y <= 1; y++) {
+ BlockPosition pos = blockposition.add(x, y, z);
+ if (isSafeRespawn(world, pos)) {
+ if (i-- <= 0) {
+ return pos;
+ // Iterates the edge of half of the box; then negates for other half.
+ while (x <= r && z > -r) {
+ for (int y = -1; y <= 1; y++) {
+ BlockPosition pos = blockposition.add(x, y, z);
+ Optional<Vec3D> vector;
+ vector = isSafeRespawn(entitytypes, world, pos);
+ if (vector.isPresent()) {
+ if (i-- <= 0) {
+ return vector;
+ }
+ }
+ }
+ pos = blockposition.add(-x, y, -z);
+ if (isSafeRespawn(world, pos)) {
+ if (i-- <= 0) {
+ return pos;
+ pos = blockposition.add(-x, y, -z);
+ vector = isSafeRespawn(entitytypes, world, pos);
+ if (vector.isPresent()) {
+ if (i-- <= 0) {
+ return vector;
+ }
+ }
+ }
+
+ pos = blockposition.add(enumdirection.getAdjacentX() + x, y, enumdirection.getAdjacentZ() + z);
+ if (isSafeRespawn(world, pos)) {
+ if (i-- <= 0) {
+ return pos;
+ vector = isSafeRespawn(entitytypes, world, pos);
+ if (vector.isPresent()) {
+ if (i-- <= 0) {
+ return vector;
+ }
+ }
+ }
+
+ pos = blockposition.add(enumdirection.getAdjacentX() - x, y, enumdirection.getAdjacentZ() - z);
+ if (isSafeRespawn(world, pos)) {
+ if (i-- <= 0) {
+ return pos;
+ vector = isSafeRespawn(entitytypes, world, pos);
+ if (vector.isPresent()) {
+ if (i-- <= 0) {
+ return vector;
+ }
+ }
+ }
+ }
+ if (x < r) {
+ x++;
+ } else {
+ z--;
+ if (x < r) {
+ x++;
+ } else {
+ z--;
+ }
+ }
+ }
+ }
+
+ return null; /* // Paper comment out
+ return Optional.empty();
+ }
+ // Paper end
int j = blockposition.getX();
int k = blockposition.getY();
int l = blockposition.getZ();
@@ -0,0 +0,0 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity {
}
}
- return null;
+ return null;*/ // Paper
return Optional.empty();
}
+ protected static boolean isSafeRespawn(IBlockAccess iblockaccess, BlockPosition blockposition) { // Paper - OBFHELPER + behavior improvement
+ return a(iblockaccess, blockposition) && iblockaccess.getType(blockposition.down()).getMaterial().isBuildable(); // Paper - ensure solid block
+ }
protected static boolean a(IBlockAccess iblockaccess, BlockPosition blockposition) {
return iblockaccess.getType(blockposition.down()).q() && !iblockaccess.getType(blockposition).getMaterial().isBuildable() && !iblockaccess.getType(blockposition.up()).getMaterial().isBuildable();
}
+ protected static Optional<Vec3D> isSafeRespawn(EntityTypes<?> entityTypes, IWorldReader iworldreader, BlockPosition blockPosition) { return a(entityTypes, iworldreader, blockPosition); } // Paper -- obfhelper
protected static Optional<Vec3D> a(EntityTypes<?> entitytypes, IWorldReader iworldreader, BlockPosition blockposition) {
VoxelShape voxelshape = iworldreader.getType(blockposition).getCollisionShape(iworldreader, blockposition);
--

View file

@ -5,16 +5,16 @@ Subject: [PATCH] Don't change the Entity Random seed for squids
diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java
index b9c76325db..ab79317a2d 100644
index d5dff4b88..77c0ed42f 100644
--- a/src/main/java/net/minecraft/server/EntitySquid.java
+++ b/src/main/java/net/minecraft/server/EntitySquid.java
@@ -0,0 +0,0 @@ public class EntitySquid extends EntityWaterAnimal {
public EntitySquid(World world) {
super(EntityTypes.SQUID, world);
this.setSize(0.8F, 0.8F);
- this.random.setSeed((long) (1 + this.getId()));
+ //this.random.setSeed((long) (1 + this.getId())); // Paper
this.bI = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
public EntitySquid(EntityTypes<? extends EntitySquid> entitytypes, World world) {
super(entitytypes, world);
- this.random.setSeed((long) this.getId());
+ //this.random.setSeed((long) this.getId()); // Paper
this.bF = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
}
--

View file

@ -1,27 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Thu, 19 Jul 2018 01:23:00 -0400
Subject: [PATCH] Don't process despawn if entity is in a chunk scheduled for
unload
This won't happen anyways if the user has
"skip ticking for entities in chunks scheduled for unload" turned on,
but if they don't, protect from this instant killing the entity to
keep it vanilla in behavior
a player may teleport away, and trigger instant despawn
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
index 98e214cdd6..ee5078370c 100644
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
@@ -0,0 +0,0 @@ public abstract class EntityInsentient extends EntityLiving {
if (this.persistent) {
this.ticksFarFromPlayer = 0;
} else {
+ Chunk currentChunk = getChunkAtLocation(); // Paper
+ if (currentChunk != null && currentChunk.scheduledForUnload != null) return; // Paper
EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D);
if (entityhuman != null && entityhuman.affectsSpawning) { // Paper - Affects Spawning API
--

View file

@ -7,37 +7,16 @@ These chunks are unfinished, and waste cpu time saving these unfinished chunks.
the loadChunk method refuses to acknoledge they exists, and will restart
a new chunk generation process to begin with, so saving them serves no benefit.
diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
index 0fc4d9f520..2c4a4fc6b7 100644
--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
+++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
@@ -0,0 +0,0 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
index 3fab45aa9..26fd5dd1e 100644
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
@@ -0,0 +0,0 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
public void saveChunk(World world, IChunkAccess ichunkaccess, boolean unloaded) throws IOException, ExceptionWorldConflict {
+ if (ichunkaccess.i().d() == ChunkStatus.Type.PROTOCHUNK) { return; } // Paper - don't save proto chunks
// Spigot end
world.checkSession();
diff --git a/src/main/java/net/minecraft/server/ChunkTaskScheduler.java b/src/main/java/net/minecraft/server/ChunkTaskScheduler.java
index 70a95c2636..56958a5ce3 100644
--- a/src/main/java/net/minecraft/server/ChunkTaskScheduler.java
+++ b/src/main/java/net/minecraft/server/ChunkTaskScheduler.java
@@ -0,0 +0,0 @@ public class ChunkTaskScheduler extends Scheduler<ChunkCoordIntPair, ChunkStatus
protected boolean a(Scheduler<ChunkCoordIntPair, ChunkStatus, ProtoChunk>.a scheduler_a) {
ProtoChunk protochunk = (ProtoChunk) scheduler_a.a();
- return !protochunk.ab_() && !protochunk.h();
+ return !protochunk.ab_() /*&& !protochunk.h()*/; // Paper
}
};
@@ -0,0 +0,0 @@ public class ChunkTaskScheduler extends Scheduler<ChunkCoordIntPair, ChunkStatus
}
public void a(BooleanSupplier booleansupplier) {
+ if (true) return; // Paper - we don't save proto chunks, and don't want to block thread
IChunkLoader ichunkloader = this.e;
synchronized (this.e) {
public void saveChunk(IChunkAccess ichunkaccess, boolean save) {
+ if (ichunkaccess.getChunkStatus().getType() == ChunkStatus.Type.PROTOCHUNK) { return; } // Paper - don't save proto chunks
// CraftBukkit end
this.n.a(ichunkaccess.getPos());
if (save) { // CraftBukkit
--

View file

@ -1,221 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Sat, 21 Jul 2018 14:27:34 -0400
Subject: [PATCH] Duplicate UUID Resolve Option
Due to a bug in https://github.com/PaperMC/Paper/commit/2e29af3df05ec0a383f48be549d1c03200756d24
which was added all the way back in March of 2016, it was unknown (potentially not at the time)
that an entity might actually change the seed of the random object.
At some point, EntitySquid did start setting the seed. Due to this shared random, this caused
every entity to use a Random object with a predictable seed.
This has caused entities to potentially generate with the same UUID....
Over the years, servers have had entities disappear, but no sign of trouble
because CraftBukkit removed the log lines indicating that something was wrong.
We have fixed the root issue causing duplicate UUID's, however we now have chunk
files full of entities that have the same UUID as another entity!
When these chunks load, the 2nd entity will not be added to the world correctly.
If that chunk loads in a different order in the future, then it will reverse and the
missing one is now the one added to the world and not the other. This results in very
inconsistent entity behavior.
This change allows you to recover any duplicate entity by generating a new UUID for it.
This also lets you delete them instead if you don't want to risk having new entities added to
the world that you previously did not see.
But for those who are ok with leaving this inconsistent behavior, you may use WARN or NOTHING options.
It is recommended you regenerate the entities, as these were legit entities, and deserve your love.
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index f5b2e88f3b..8c4ff18868 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -0,0 +0,0 @@ public class PaperWorldConfig {
log("Bed Search Radius: " + bedSearchRadius);
}
}
+
+ public enum DuplicateUUIDMode {
+ SAFE_REGEN, DELETE, NOTHING, WARN
+ }
+ public DuplicateUUIDMode duplicateUUIDMode = DuplicateUUIDMode.SAFE_REGEN;
+ public int duplicateUUIDDeleteRange = 32;
+ private void repairDuplicateUUID() {
+ String desiredMode = getString("duplicate-uuid-resolver", "saferegen").toLowerCase().trim();
+ duplicateUUIDDeleteRange = getInt("duplicate-uuid-saferegen-delete-range", duplicateUUIDDeleteRange);
+ switch (desiredMode.toLowerCase()) {
+ case "regen":
+ case "regenerate":
+ case "saferegen":
+ case "saferegenerate":
+ duplicateUUIDMode = DuplicateUUIDMode.SAFE_REGEN;
+ log("Duplicate UUID Resolve: Regenerate New UUID if distant (Delete likely duplicates within " + duplicateUUIDDeleteRange + " blocks)");
+ break;
+ case "remove":
+ case "delete":
+ duplicateUUIDMode = DuplicateUUIDMode.DELETE;
+ log("Duplicate UUID Resolve: Delete Entity");
+ break;
+ case "silent":
+ case "nothing":
+ duplicateUUIDMode = DuplicateUUIDMode.NOTHING;
+ logError("Duplicate UUID Resolve: Do Nothing (no logs) - Warning, may lose indication of bad things happening");
+ break;
+ case "log":
+ case "warn":
+ duplicateUUIDMode = DuplicateUUIDMode.WARN;
+ log("Duplicate UUID Resolve: Warn (do nothing but log it happened, may be spammy)");
+ break;
+ default:
+ duplicateUUIDMode = DuplicateUUIDMode.WARN;
+ logError("Warning: Invalid duplicate-uuid-resolver config " + desiredMode + " - must be one of: regen, delete, nothing, warn");
+ log("Duplicate UUID Resolve: Warn (do nothing but log it happened, may be spammy)");
+ break;
+ }
+ }
}
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index c2f12f92b0..e8c06e01b4 100644
--- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -0,0 +0,0 @@
package net.minecraft.server;
+// Paper start
+import com.destroystokyo.paper.PaperWorldConfig.DuplicateUUIDMode;
+import java.util.HashMap;
+import java.util.UUID;
+// Paper end
import com.destroystokyo.paper.exception.ServerInternalException;
import com.google.common.collect.Maps;
import com.google.common.collect.Queues;
@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess {
public final World world;
public final Map<HeightMap.Type, HeightMap> heightMap;
public Long scheduledForUnload; // Paper - delay chunk unloads
+ private static final Logger logger = LogManager.getLogger(); // Paper
public final int locX;
public final int locZ;
private boolean l;
@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess {
if (i != this.locX || j != this.locZ) {
Chunk.d.warn("Wrong location! ({}, {}) should be ({}, {}), {}", i, j, this.locX, this.locZ, entity);
entity.die();
+ return; // Paper
}
int k = MathHelper.floor(entity.locY / 16.0D);
@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess {
for (int j = 0; j < i; ++j) {
List<Entity> entityslice = aentityslice[j]; // Spigot
+ // Paper start
+ DuplicateUUIDMode mode = world.paperConfig.duplicateUUIDMode;
+ if (mode == DuplicateUUIDMode.WARN || mode == DuplicateUUIDMode.DELETE || mode == DuplicateUUIDMode.SAFE_REGEN) {
+ Map<UUID, Entity> thisChunk = new HashMap<>();
+ for (Iterator<Entity> iterator = ((List<Entity>) entityslice).iterator(); iterator.hasNext(); ) {
+ Entity entity = iterator.next();
+ if (entity.dead || entity.valid) continue;
+ Entity other = ((WorldServer) world).entitiesByUUID.get(entity.uniqueID);
+ if (other == null || other.dead || world.getEntityUnloadQueue().contains(other)) {
+ other = thisChunk.get(entity.uniqueID);
+ }
+
+ if (mode == DuplicateUUIDMode.SAFE_REGEN && other != null && !other.dead &&
+ !world.getEntityUnloadQueue().contains(other)
+ && java.util.Objects.equals(other.getSaveID(), entity.getSaveID())
+ && entity.getBukkitEntity().getLocation().distance(other.getBukkitEntity().getLocation()) < world.paperConfig.duplicateUUIDDeleteRange
+ ) {
+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", deleted entity " + entity + " because it was near the duplicate and likely an actual duplicate. See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about.");
+ entity.die();
+ iterator.remove();
+ continue;
+ }
+ if (other != null && !other.dead) {
+ switch (mode) {
+ case SAFE_REGEN: {
+ entity.setUUID(UUID.randomUUID());
+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", regenerated UUID for " + entity + ". See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about.");
+ break;
+ }
+ case DELETE: {
+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", deleted entity " + entity + ". See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about.");
+ entity.die();
+ iterator.remove();
+ break;
+ }
+ default:
+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", doing nothing to " + entity + ". See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about.");
+ break;
+ }
+ }
+ thisChunk.put(entity.uniqueID, entity);
+ }
+ }
+ // Paper end
// CraftBukkit start
List<Entity> toRemove = new LinkedList<>();
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index b6c46e01d9..6598b87eef 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
});
}
+ public void setUUID(UUID uuid) { a(uuid); } // Paper - OBFHELPER
public void a(UUID uuid) {
this.uniqueID = uuid;
this.au = this.uniqueID.toString();
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 1496125ddf..a5f4b9ad94 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
}
};
// Spigot end
- protected final Set<Entity> g = com.google.common.collect.Sets.newHashSet(); // Paper
+ protected final Set<Entity> g = com.google.common.collect.Sets.newHashSet(); public Set<Entity> getEntityUnloadQueue() { return g; };// Paper - OBFHELPER
//public final List<TileEntity> tileEntityList = Lists.newArrayList(); // Paper - remove unused list
public final List<TileEntity> tileEntityListTick = Lists.newArrayList();
private final List<TileEntity> c = Lists.newArrayList();
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 6d1f70b39e..293818b196 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
private final MinecraftServer server;
public EntityTracker tracker;
private final PlayerChunkMap manager;
- private final Map<UUID, Entity> entitiesByUUID = Maps.newHashMap();
+ public final Map<UUID, Entity> entitiesByUUID = Maps.newHashMap(); // Paper
public boolean savingDisabled;
private boolean J;
private int emptyTime;
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
this.g.remove(entity1);
} else {
if (!(entity instanceof EntityHuman)) {
- if (DEBUG_ENTITIES) {
+ if (DEBUG_ENTITIES && entity.world.paperConfig.duplicateUUIDMode != com.destroystokyo.paper.PaperWorldConfig.DuplicateUUIDMode.NOTHING) {
WorldServer.a.error("Keeping entity {} that already exists with UUID {}", entity1, uuid.toString()); // CraftBukkit // Paper
WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
}
Entity old = this.entitiesByUUID.put(entity.getUniqueID(), entity);
- if (old != null && old.getId() != entity.getId() && old.valid) {
+ if (old != null && old.getId() != entity.getId() && old.valid && entity.world.paperConfig.duplicateUUIDMode != com.destroystokyo.paper.PaperWorldConfig.DuplicateUUIDMode.NOTHING) {
Logger logger = LogManager.getLogger();
logger.error("Overwrote an existing entity " + old + " with " + entity);
if (DEBUG_ENTITIES) {
--

View file

@ -5,12 +5,12 @@ Subject: [PATCH] EnderDragon Events
diff --git a/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java b/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java
index 1906bcfc96..50d291139c 100644
index 4ab310cd6..90f6d58dd 100644
--- a/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java
+++ b/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java
@@ -0,0 +0,0 @@ public class DragonControllerLandedFlame extends AbstractDragonControllerLanded
this.d.setDuration(200);
this.d.setParticle(Particles.j);
this.d.setParticle(Particles.DRAGON_BREATH);
this.d.a(new MobEffect(MobEffects.HARM));
+ if (new com.destroystokyo.paper.event.entity.EnderDragonFlameEvent((org.bukkit.entity.EnderDragon) this.a.getBukkitEntity(), (org.bukkit.entity.AreaEffectCloud) this.d.getBukkitEntity()).callEvent()) // Paper
this.a.world.addEntity(this.d);
@ -22,12 +22,13 @@ index 1906bcfc96..50d291139c 100644
++this.c;
}
+
+ public void removeAreaEffect() { this.e(); } // Paper - OBFHELPER
@Override
public void e() {
if (this.d != null) {
this.d.die();
diff --git a/src/main/java/net/minecraft/server/DragonControllerStrafe.java b/src/main/java/net/minecraft/server/DragonControllerStrafe.java
index e742586765..141ba1e5e6 100644
index b46660576..bf15964e7 100644
--- a/src/main/java/net/minecraft/server/DragonControllerStrafe.java
+++ b/src/main/java/net/minecraft/server/DragonControllerStrafe.java
@@ -0,0 +0,0 @@ public class DragonControllerStrafe extends AbstractDragonController {
@ -41,7 +42,7 @@ index e742586765..141ba1e5e6 100644
if (this.d != null) {
while (!this.d.b()) {
diff --git a/src/main/java/net/minecraft/server/EntityDragonFireball.java b/src/main/java/net/minecraft/server/EntityDragonFireball.java
index 7df8fd4d74..c0d66a0233 100644
index 239be99c5..2195b83ce 100644
--- a/src/main/java/net/minecraft/server/EntityDragonFireball.java
+++ b/src/main/java/net/minecraft/server/EntityDragonFireball.java
@@ -0,0 +0,0 @@ public class EntityDragonFireball extends EntityFireball {

View file

@ -6,7 +6,7 @@ Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API
Adds ability to get what arrow was shot, and control if it should be consumed.
diff --git a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
index 749a8a5272..6e2ee04c77 100644
index e575d3cff..85157e80d 100644
--- a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
+++ b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
@@ -0,0 +0,0 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR
@ -19,10 +19,10 @@ index 749a8a5272..6e2ee04c77 100644
event.getProjectile().remove();
return;
diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java
index 6934114005..52bc68e6a6 100644
index 50b815dc8..4ec02c8ce 100644
--- a/src/main/java/net/minecraft/server/ItemBow.java
+++ b/src/main/java/net/minecraft/server/ItemBow.java
@@ -0,0 +0,0 @@ public class ItemBow extends Item {
@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon {
if ((double) f >= 0.1D) {
boolean flag1 = flag && itemstack1.getItem() == Items.ARROW;
@ -30,7 +30,7 @@ index 6934114005..52bc68e6a6 100644
if (!world.isClientSide) {
ItemArrow itemarrow = (ItemArrow) ((ItemArrow) (itemstack1.getItem() instanceof ItemArrow ? itemstack1.getItem() : Items.ARROW));
EntityArrow entityarrow = itemarrow.a(world, itemstack1, (EntityLiving) entityhuman);
@@ -0,0 +0,0 @@ public class ItemBow extends Item {
@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon {
entityarrow.setOnFire(100);
}
// CraftBukkit start
@ -39,17 +39,17 @@ index 6934114005..52bc68e6a6 100644
if (event.isCancelled()) {
event.getProjectile().remove();
return;
@@ -0,0 +0,0 @@ public class ItemBow extends Item {
// CraftBukkit end
itemstack.damage(1, entityhuman);
@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon {
itemstack.damage(1, entityhuman, (entityhuman1) -> {
entityhuman1.d(entityhuman.getRaisedHand());
});
- if (flag1 || entityhuman.abilities.canInstantlyBuild && (itemstack1.getItem() == Items.SPECTRAL_ARROW || itemstack1.getItem() == Items.TIPPED_ARROW)) {
+ consumeArrow = event.getConsumeArrow(); // Paper
+ if (!consumeArrow || flag1 || (entityhuman.abilities.canInstantlyBuild && ((itemstack1.getItem() == Items.SPECTRAL_ARROW) || (itemstack1.getItem() == Items.TIPPED_ARROW)))) { // Paper - add !consumeArrow
+ if (!consumeArrow || flag1 || (entityhuman.abilities.canInstantlyBuild && ((itemstack1.getItem() == Items.SPECTRAL_ARROW) || (itemstack1.getItem() == Items.TIPPED_ARROW)))) { // Paper - add
entityarrow.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY;
}
@@ -0,0 +0,0 @@ public class ItemBow extends Item {
@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon {
}
world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_ARROW_SHOOT, SoundCategory.PLAYERS, 1.0F, 1.0F / (ItemBow.i.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
@ -58,25 +58,48 @@ index 6934114005..52bc68e6a6 100644
itemstack1.subtract(1);
if (itemstack1.isEmpty()) {
entityhuman.inventory.f(itemstack1);
diff --git a/src/main/java/net/minecraft/server/ItemCrossbow.java b/src/main/java/net/minecraft/server/ItemCrossbow.java
index 569e117b7..144c63c9a 100644
--- a/src/main/java/net/minecraft/server/ItemCrossbow.java
+++ b/src/main/java/net/minecraft/server/ItemCrossbow.java
@@ -0,0 +0,0 @@ public class ItemCrossbow extends ItemProjectileWeapon {
((IProjectile) object).shoot((double) vector3fa.a(), (double) vector3fa.b(), (double) vector3fa.c(), f1, f2);
}
// CraftBukkit start
- org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityliving, itemstack, (Entity) object, f);
+ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityliving, itemstack, itemstack1, (IProjectile) object, f); // Paper // TODO: consume??
if (event.isCancelled()) {
event.getProjectile().remove();
return;
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index c02619bb57..acc80d0684 100644
index 8d3dca2a9..4a16f2f53 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -0,0 +0,0 @@ import net.minecraft.server.GeneratorAccess;
import net.minecraft.server.IBlockData;
import net.minecraft.server.IChatBaseComponent;
import net.minecraft.server.IInventory;
+import net.minecraft.server.IProjectile;
import net.minecraft.server.ItemActionContext;
import net.minecraft.server.ItemStack;
import net.minecraft.server.Items;
@@ -0,0 +0,0 @@ public class CraftEventFactory {
/**
* EntityShootBowEvent
*/
- public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, EntityArrow entityArrow, float force) {
+ public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, /*bow*/ItemStack itemstack, /*arrow*/ ItemStack arrowItem, EntityArrow entityArrow, float force) { // Paper
- public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, Entity entityArrow, float force) {
+ public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, ItemStack arrowItem, IProjectile entityArrow, float force) { // paper
LivingEntity shooter = (LivingEntity) who.getBukkitEntity();
CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack);
Arrow arrow = (Arrow) entityArrow.getBukkitEntity();
@@ -0,0 +0,0 @@ public class CraftEventFactory {
- org.bukkit.entity.Entity arrow = entityArrow.getBukkitEntity();
+ org.bukkit.entity.Entity arrow = ((Entity) entityArrow).getBukkitEntity(); // Paper
if (itemInHand != null && (itemInHand.getType() == Material.AIR || itemInHand.getAmount() == 0)) {
itemInHand = null;
}
- EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, arrow, force);
+ EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, CraftItemStack.asCraftMirror(arrowItem), arrow, force); // Paper
+ EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, CraftItemStack.asCraftMirror(arrowItem), (Projectile) arrow, force); // Paper
Bukkit.getPluginManager().callEvent(event);
return event;

View file

@ -6,12 +6,12 @@ Subject: [PATCH] Expand Explosions API
Add Entity as a Source capability, and add more API choices, and on Location.
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 1cc42edae8..cfa35740b4 100644
index 3ed9d3f47..c8cbedb5c 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -0,0 +0,0 @@ public class CraftWorld implements World {
public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks) {
return !world.createExplosion(null, x, y, z, power, setFire, breakBlocks).wasCanceled;
return !world.createExplosion(null, x, y, z, power, setFire, breakBlocks ? Explosion.Effect.BREAK : Explosion.Effect.NONE).wasCanceled;
}
+ // Paper start
+ public boolean createExplosion(Entity source, Location loc, float power, boolean setFire, boolean breakBlocks) {

View file

@ -5,7 +5,7 @@ Subject: [PATCH] Fire EntityShootBowEvent for Illusioner
diff --git a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
index 08af4453fa..8b595979e7 100644
index 378267314..96ad67889 100644
--- a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
+++ b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
@@ -0,0 +0,0 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan
@ -27,5 +27,5 @@ index 08af4453fa..8b595979e7 100644
+ // Paper end
}
protected EntityArrow v(float f) {
class a extends EntityIllagerWizard.c {
--

View file

@ -21,7 +21,7 @@ check is essentially the same as this.getHandle() == other.getHandle()
However, replaced it too to make it clearer of intent.
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index 84a58c7dcd..a0e1a70d43 100644
index e0ae72bbc..65621f966 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -0,0 +0,0 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {

View file

@ -6,29 +6,29 @@ Subject: [PATCH] Ignore Missing Recipes in RecipeBook to avoid data errors
This code was causing NPE's in saving player data, potentially related to reloads.
diff --git a/src/main/java/net/minecraft/server/RecipeBookServer.java b/src/main/java/net/minecraft/server/RecipeBookServer.java
index 5a21aed438..4d9f3d3695 100644
index 440e8f134..091c4abbd 100644
--- a/src/main/java/net/minecraft/server/RecipeBookServer.java
+++ b/src/main/java/net/minecraft/server/RecipeBookServer.java
@@ -0,0 +0,0 @@ public class RecipeBookServer extends RecipeBook {
while (iterator.hasNext()) {
MinecraftKey minecraftkey = (MinecraftKey) iterator.next();
+ // Paper start - ignore missing recipes
+ IRecipe recipe = this.h.a(minecraftkey);
+ if (recipe == null) continue;
+ final Optional<? extends IRecipe<?>> recipe = this.l.a(minecraftkey);
+ if (!recipe.isPresent()) continue;
+ // Paper end
nbttaglist.add((NBTBase) (new NBTTagString(minecraftkey.toString())));
}
nbttaglist.add(new NBTTagString(minecraftkey.toString()));
}
@@ -0,0 +0,0 @@ public class RecipeBookServer extends RecipeBook {
while (iterator1.hasNext()) {
MinecraftKey minecraftkey1 = (MinecraftKey) iterator1.next();
+ // Paper start - ignore missing recipes
+ IRecipe recipe = this.h.a(minecraftkey1);
+ if (recipe == null) continue;
+ final Optional<? extends IRecipe<?>> recipe = this.l.a(minecraftkey1);
+ if (!recipe.isPresent()) continue;
+ // Paper end
nbttaglist1.add((NBTBase) (new NBTTagString(minecraftkey1.toString())));
}
nbttaglist1.add(new NBTTagString(minecraftkey1.toString()));
}
--

View file

@ -6,36 +6,21 @@ Subject: [PATCH] Implement EntityKnockbackByEntityEvent
This event is called when an entity receives knockback by another entity.
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index deb50b84f7..164e4b412a 100644
index 8c6d53f44..d65933e9e 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity {
this.impulse = true;
float f1 = MathHelper.sqrt(d0 * d0 + d1 * d1);
Vec3D vec3d1 = (new Vec3D(d0, 0.0D, d1)).d().a((double) f);
+ // Paper start - preserve old velocity
+ double oldMotX = this.motX;
+ double oldMotY = this.motY;
+ double oldMotZ = this.motZ;
+ // Paper end
this.setMot(vec3d.x / 2.0D - vec3d1.x, this.onGround ? Math.min(0.4D, vec3d.y / 2.0D + (double) f) : vec3d.y, vec3d.z / 2.0D - vec3d1.z);
+
this.motX /= 2.0D;
this.motZ /= 2.0D;
this.motX -= d0 / (double) f1 * (double) f;
@@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity {
}
}
+ // Paper start - call EntityKnockbackByEntityEvent
+ org.bukkit.util.Vector delta = new org.bukkit.util.Vector(this.motX - oldMotX, this.motY - oldMotY, this.motZ - oldMotZ);
+ Vec3D currentMot = this.getMot();
+ org.bukkit.util.Vector delta = new org.bukkit.util.Vector(currentMot.x - vec3d.x, currentMot.y - vec3d.y, currentMot.z - vec3d.z);
+ // Restore old velocity to be able to access it in the event
+ this.motX = oldMotX;
+ this.motY = oldMotY;
+ this.motZ = oldMotZ;
+ this.setMot(vec3d);
+ if (entity == null || new com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent((LivingEntity) getBukkitEntity(), entity.getBukkitEntity(), f, delta).callEvent()) {
+ this.motX += delta.getX();
+ this.motY += delta.getY();
+ this.motZ += delta.getZ();
+ this.setMot(vec3d.x + delta.getX(), vec3d.y + delta.getY(), vec3d.z + delta.getZ());
+ }
+ // Paper end
}

View file

@ -5,7 +5,7 @@ Subject: [PATCH] Implement World.getEntity(UUID) API
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index cfa35740b4..609b911265 100644
index c8cbedb5c..f8870f37b 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -0,0 +0,0 @@ public class CraftWorld implements World {
@ -21,6 +21,6 @@ index cfa35740b4..609b911265 100644
+ // Paper end
+
public void save() {
// Spigot start
save(true);
this.server.checkSaveState();
try {
--

View file

@ -6,34 +6,12 @@ Subject: [PATCH] InventoryCloseEvent Reason API
Allows you to determine why an inventory was closed, enabling plugin developers
to "confirm" things based on if it was player triggered close or not.
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index a6cacd7da9..c2f12f92b0 100644
--- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess {
{
if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity )
{
- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory();
+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
}
}
}
@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess {
{
if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity )
{
- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory();
+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
}
}
}
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index d4618d644a..cc1bc01b16 100644
index 3031d73f5..f665dc0eb 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving {
this.dg();
this.dA();
super.tick();
if (!this.world.isClientSide && this.activeContainer != null && !this.activeContainer.canUse(this)) {
- this.closeInventory();
@ -42,7 +20,7 @@ index d4618d644a..cc1bc01b16 100644
}
@@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving {
return this.getHealth() <= 0.0F || this.isSleeping();
return 20;
}
+ // Paper start - unused code, but to keep signatures aligned
@ -56,7 +34,7 @@ index d4618d644a..cc1bc01b16 100644
this.activeContainer = this.defaultContainer;
}
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index e4e1d999e9..dc72538de6 100644
index 27ade8d7d..634c30d93 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
@ -69,23 +47,23 @@ index e4e1d999e9..dc72538de6 100644
}
@@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
if (!event.getKeepInventory()) {
this.inventory.clear();
}
-
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DEATH); // Paper
this.setSpectatorTarget(this); // Remove spectated target
// CraftBukkit end
// SPIGOT-943 - only call if they have an inventory open
if (this.activeContainer != this.defaultContainer) {
- this.closeInventory();
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DEATH); // Paper
}
String deathMessage = event.getDeathMessage();
@@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).a(EnumChatFormat.RED), true);
return OptionalInt.empty();
} else {
if (this.activeContainer != this.defaultContainer) {
- this.closeInventory();
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
}
if (iinventory instanceof ITileInventory) {
this.nextContainerCounter();
@@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
}
// CraftBukkit end
@ -94,10 +72,10 @@ index e4e1d999e9..dc72538de6 100644
+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper
}
this.nextContainerCounter();
// this.nextContainerCounter(); // CraftBukkit - moved up
@@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
}
@Override
public void closeInventory() {
- CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit
+ // Paper start
@ -110,10 +88,10 @@ index e4e1d999e9..dc72538de6 100644
this.m();
}
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
index 6dea9456a4..0b5dc66897 100644
index c9caf4423..fbdc755e8 100644
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn {
PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.getWorldServer());
if (this.player.isFrozen()) return; // CraftBukkit
@ -123,7 +101,7 @@ index 6dea9456a4..0b5dc66897 100644
this.player.m();
}
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
index 96eff10ffa..ddaa73e83d 100644
index b855e7968..6d464a3dc 100644
--- a/src/main/java/net/minecraft/server/PlayerList.java
+++ b/src/main/java/net/minecraft/server/PlayerList.java
@@ -0,0 +0,0 @@ public abstract class PlayerList {
@ -135,8 +113,30 @@ index 96eff10ffa..ddaa73e83d 100644
PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game");
cserver.getPluginManager().callEvent(playerQuitEvent);
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index e400cc05d..79be8cfa3 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -0,0 +0,0 @@ public class WorldServer extends World {
{
if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity )
{
- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory();
+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
}
}
}
@@ -0,0 +0,0 @@ public class WorldServer extends World {
{
if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity )
{
- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory();
+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper
}
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
index 9b19dce9bd..cb7697f80b 100644
index 6478d6126..356c503dd 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
@@ -0,0 +0,0 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
@ -155,7 +155,7 @@ index 9b19dce9bd..cb7697f80b 100644
public boolean isBlocking() {
return getHandle().isBlocking();
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 62235efde9..47426d8fda 100644
index 01e260024..6ceb02200 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@ -168,7 +168,7 @@ index 62235efde9..47426d8fda 100644
// Check if the fromWorld and toWorld are the same.
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index acc80d0684..2cfe8afe13 100644
index 4a16f2f53..de081ca1c 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -0,0 +0,0 @@ public class CraftEventFactory {

View file

@ -6,33 +6,33 @@ Subject: [PATCH] LivingEntity Hand Raised/Item Use API
How long an entity has raised hands to charge an attack or use an item
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 164e4b412a..bc1ab273bd 100644
index d65933e9e..58bfe8c1c 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity {
private float bI;
private int bJ;
private float bK;
private float bD;
private int jumpTicks;
private float bF;
- protected ItemStack activeItem;
+ public ItemStack activeItem; // Paper - public
protected int bu;
protected int bv;
private BlockPosition bL;
protected int bo;
protected int bp;
private BlockPosition bG;
@@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity {
return this.activeItem;
}
+ public int getItemUseRemainingTime() { return cX(); } // Paper - OBFHELPER
public int cX() {
return this.bu;
+ public int getItemUseRemainingTime() { return dm(); } // Paper - OBFHELPER
public int dm() {
return this.bo;
}
+ public int getHandRaisedTime() { return cY(); } // Paper - OBFHELPER
public int cY() {
return this.isHandRaised() ? this.activeItem.k() - this.cX() : 0;
+ public int getHandRaisedTime() { return dn(); } // Paper - OBFHELPER
public int dn() {
return this.isHandRaised() ? this.activeItem.k() - this.dm() : 0;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index 8e65bfc78e..52834b6da3 100644
index 182145ccf..29b23e30f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {

View file

@ -5,12 +5,12 @@ Subject: [PATCH] Make shield blocking delay configurable
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 4727ac6eb5..47f8dfcc41 100644
index fe9415b1d..ce17447fa 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -0,0 +0,0 @@ public class PaperWorldConfig {
log("Villages can load chunks - Warning this can cause intense TPS loss. Strongly consider disabling this.");
}
disableEnderpearlExploit = getBoolean("game-mechanics.disable-unloaded-chunk-enderpearl-exploit", disableEnderpearlExploit);
log("Disable Unloaded Chunk Enderpearl Exploit: " + (disableEnderpearlExploit ? "enabled" : "disabled"));
}
+
+ public int shieldBlockingDelay = 5;
@ -19,23 +19,22 @@ index 4727ac6eb5..47f8dfcc41 100644
+ }
}
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 02fcfc449c..deb50b84f7 100644
index 9ef605ba3..8c6d53f44 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity {
if (this.isHandRaised() && !this.activeItem.isEmpty()) {
Item item = this.activeItem.getItem();
- return item.d(this.activeItem) != EnumAnimation.BLOCK ? false : item.c(this.activeItem) - this.bu >= 5;
+ return item.d(this.activeItem) != EnumAnimation.BLOCK ? false : item.c(this.activeItem) - this.bu >= getShieldBlockingDelay(); // Paper - shieldBlockingDelay
- return item.e_(this.activeItem) != EnumAnimation.BLOCK ? false : item.f_(this.activeItem) - this.bo >= 5;
+ return item.e_(this.activeItem) != EnumAnimation.BLOCK ? false : item.f_(this.activeItem) - this.bo >= getShieldBlockingDelay(); // Paper - shieldBlockingDelay
} else {
return false;
}
@@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity {
public boolean df() {
return true;
public void d(EnumHand enumhand) {
this.c(enumhand == EnumHand.MAIN_HAND ? EnumItemSlot.MAINHAND : EnumItemSlot.OFFHAND);
}
+
+ // Paper start
+ public int shieldBlockingDelay = world.paperConfig.shieldBlockingDelay;
+
@ -49,7 +48,7 @@ index 02fcfc449c..deb50b84f7 100644
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index 2f96842bb9..8e65bfc78e 100644
index f95347df0..182145ccf 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {

View file

@ -6,7 +6,7 @@ Subject: [PATCH] Optimize RegistryID.c()
This is a frequent hotspot for world loading/saving.
diff --git a/src/main/java/net/minecraft/server/RegistryID.java b/src/main/java/net/minecraft/server/RegistryID.java
index 5a5c464ea1..37641fa865 100644
index e15d28671..e8a48b9a4 100644
--- a/src/main/java/net/minecraft/server/RegistryID.java
+++ b/src/main/java/net/minecraft/server/RegistryID.java
@@ -0,0 +0,0 @@ public class RegistryID<K> implements Registry<K> {

View file

@ -5,7 +5,7 @@ Subject: [PATCH] Option to prevent armor stands from doing entity lookups
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 8c4ff18868..6c4cb61dc5 100644
index 83e54cb90..f06bb3ae1 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -0,0 +0,0 @@ public class PaperWorldConfig {
@ -21,11 +21,11 @@ index 8c4ff18868..6c4cb61dc5 100644
private void maxEntityCollision() {
maxCollisionsPerEntity = getInt( "max-entity-collisions", this.spigotConfig.getInt("max-entity-collisions", 8) );
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index a5f4b9ad94..28fca165cd 100644
index f9f0a94e9..79ded224c 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
}
@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose
// Spigot end
}
+ // Paper start - Prevent armor stands from doing entity lookups

View file

@ -5,14 +5,15 @@ Subject: [PATCH] PlayerElytraBoostEvent
diff --git a/src/main/java/net/minecraft/server/ItemFireworks.java b/src/main/java/net/minecraft/server/ItemFireworks.java
index dbb422e9da..13938775ba 100644
index aea46ffae..9e86ef4ce 100644
--- a/src/main/java/net/minecraft/server/ItemFireworks.java
+++ b/src/main/java/net/minecraft/server/ItemFireworks.java
@@ -0,0 +0,0 @@ public class ItemFireworks extends Item {
EntityFireworks entityfireworks = new EntityFireworks(world, itemstack, entityhuman);
entityfireworks.spawningEntity = entityhuman.getUniqueID(); // Paper
// Paper start
final EntityFireworks entityfireworks = new EntityFireworks(world, itemstack, entityhuman);
entityfireworks.spawningEntity = entityhuman.getUniqueID();
- world.addEntity(entityfireworks);
- // Paper end
- if (!entityhuman.abilities.canInstantlyBuild) {
- itemstack.subtract(1);
+ // Paper start
@ -23,8 +24,9 @@ index dbb422e9da..13938775ba 100644
+ } else ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory();
+ } else if (entityhuman instanceof EntityPlayer) {
+ ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory();
+ // Paper end
}
+ // Paper end
}
return new InteractionResultWrapper<>(EnumInteractionResult.SUCCESS, entityhuman.b(enumhand));
--

View file

@ -5,7 +5,7 @@ Subject: [PATCH] PlayerLaunchProjectileEvent
diff --git a/src/main/java/net/minecraft/server/ItemEgg.java b/src/main/java/net/minecraft/server/ItemEgg.java
index 18e8825c48..5f3926d830 100644
index 2bdb65bf8..f526af45f 100644
--- a/src/main/java/net/minecraft/server/ItemEgg.java
+++ b/src/main/java/net/minecraft/server/ItemEgg.java
@@ -0,0 +0,0 @@ public class ItemEgg extends Item {
@ -22,6 +22,7 @@ index 18e8825c48..5f3926d830 100644
if (!world.isClientSide) {
EntityEgg entityegg = new EntityEgg(world, entityhuman);
entityegg.setItem(itemstack);
entityegg.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F);
- world.addEntity(entityegg);
+ // Paper start
@ -45,12 +46,12 @@ index 18e8825c48..5f3926d830 100644
entityhuman.b(StatisticList.ITEM_USED.b(this));
diff --git a/src/main/java/net/minecraft/server/ItemEnderPearl.java b/src/main/java/net/minecraft/server/ItemEnderPearl.java
index 3672996c2d..719210da15 100644
index eb5f62dec..e8e52d726 100644
--- a/src/main/java/net/minecraft/server/ItemEnderPearl.java
+++ b/src/main/java/net/minecraft/server/ItemEnderPearl.java
@@ -0,0 +0,0 @@ public class ItemEnderPearl extends Item {
EntityEnderPearl entityenderpearl = new EntityEnderPearl(world, entityhuman);
entityenderpearl.setItem(itemstack);
entityenderpearl.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F);
- if (!world.addEntity(entityenderpearl)) {
+ // Paper start
@ -93,11 +94,11 @@ index 3672996c2d..719210da15 100644
entityhuman.b(StatisticList.ITEM_USED.b(this));
return new InteractionResultWrapper<>(EnumInteractionResult.SUCCESS, itemstack);
diff --git a/src/main/java/net/minecraft/server/ItemExpBottle.java b/src/main/java/net/minecraft/server/ItemExpBottle.java
index d26b42f710..23b06169e2 100644
index 35f842ede..eb626a6f0 100644
--- a/src/main/java/net/minecraft/server/ItemExpBottle.java
+++ b/src/main/java/net/minecraft/server/ItemExpBottle.java
@@ -0,0 +0,0 @@ public class ItemExpBottle extends Item {
@Override
public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
-
@ -111,6 +112,7 @@ index d26b42f710..23b06169e2 100644
if (!world.isClientSide) {
EntityThrownExpBottle entitythrownexpbottle = new EntityThrownExpBottle(world, entityhuman);
entitythrownexpbottle.setItem(itemstack);
entitythrownexpbottle.a(entityhuman, entityhuman.pitch, entityhuman.yaw, -20.0F, 0.7F, 1.0F);
- world.addEntity(entitythrownexpbottle);
+ // Paper start
@ -134,11 +136,11 @@ index d26b42f710..23b06169e2 100644
entityhuman.b(StatisticList.ITEM_USED.b(this));
diff --git a/src/main/java/net/minecraft/server/ItemLingeringPotion.java b/src/main/java/net/minecraft/server/ItemLingeringPotion.java
index a74c803e72..8d882b81bb 100644
index e3683bdae..f3ad1cd6d 100644
--- a/src/main/java/net/minecraft/server/ItemLingeringPotion.java
+++ b/src/main/java/net/minecraft/server/ItemLingeringPotion.java
@@ -0,0 +0,0 @@ public class ItemLingeringPotion extends ItemPotion {
@Override
public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
+ /* // Paper start
@ -147,14 +149,16 @@ index a74c803e72..8d882b81bb 100644
world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_LINGERING_POTION_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemLingeringPotion.i.nextFloat() * 0.4F + 0.8F));
+ */ // Paper end
if (!world.isClientSide) {
+
+ // Paper start - ensure stack count matches vanilla behavior without modifying original stack yet
+ ItemStack itemstack1 = itemstack.cloneItemStack();
+ if (!entityhuman.abilities.canInstantlyBuild) {
+ itemstack1.setCount(1);
+ }
+ // Paper end
EntityPotion entitypotion = new EntityPotion(world, entityhuman, itemstack1);
EntityPotion entitypotion = new EntityPotion(world, entityhuman);
entitypotion.setItem(itemstack1);
entitypotion.a(entityhuman, entityhuman.pitch, entityhuman.yaw, -20.0F, 0.5F, 1.0F);
- world.addEntity(entitypotion);
+ // Paper start
@ -178,12 +182,12 @@ index a74c803e72..8d882b81bb 100644
entityhuman.b(StatisticList.ITEM_USED.b(this));
diff --git a/src/main/java/net/minecraft/server/ItemSnowball.java b/src/main/java/net/minecraft/server/ItemSnowball.java
index d8879e0847..95194ccdc8 100644
index 624989dd7..c119785b7 100644
--- a/src/main/java/net/minecraft/server/ItemSnowball.java
+++ b/src/main/java/net/minecraft/server/ItemSnowball.java
@@ -0,0 +0,0 @@ public class ItemSnowball extends Item {
EntitySnowball entitysnowball = new EntitySnowball(world, entityhuman);
entitysnowball.setItem(itemstack);
entitysnowball.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F);
- if (world.addEntity(entitysnowball)) {
- if (!entityhuman.abilities.canInstantlyBuild) {
@ -211,11 +215,11 @@ index d8879e0847..95194ccdc8 100644
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/ItemSplashPotion.java b/src/main/java/net/minecraft/server/ItemSplashPotion.java
index 87e2825a84..2bddefb802 100644
index e267e43fe..fa6d627db 100644
--- a/src/main/java/net/minecraft/server/ItemSplashPotion.java
+++ b/src/main/java/net/minecraft/server/ItemSplashPotion.java
@@ -0,0 +0,0 @@ public class ItemSplashPotion extends ItemPotion {
@Override
public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
+ /* // Paper start
@ -224,14 +228,15 @@ index 87e2825a84..2bddefb802 100644
world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_SPLASH_POTION_THROW, SoundCategory.PLAYERS, 0.5F, 0.4F / (ItemSplashPotion.i.nextFloat() * 0.4F + 0.8F));
+ */ // Paper end
if (!world.isClientSide) {
EntityPotion entitypotion = new EntityPotion(world, entityhuman);
+ // Paper start - ensure stack count matches vanilla behavior without modifying original stack yet
+ ItemStack itemstack1 = itemstack.cloneItemStack();
+ if (!entityhuman.abilities.canInstantlyBuild) {
+ itemstack1.setCount(1);
+ }
+ // Paper end
EntityPotion entitypotion = new EntityPotion(world, entityhuman, itemstack1);
entitypotion.setItem(itemstack1);
entitypotion.a(entityhuman, entityhuman.pitch, entityhuman.yaw, -20.0F, 0.5F, 1.0F);
- world.addEntity(entitypotion);
+ // Paper start

View file

@ -6,73 +6,35 @@ Subject: [PATCH] PlayerReadyArrowEvent
Called when a player is firing a bow and the server is choosing an arrow to use.
Plugins can skip selection of certain arrows and control which is used.
diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java
index 52bc68e6a6..f8dbc3c400 100644
--- a/src/main/java/net/minecraft/server/ItemBow.java
+++ b/src/main/java/net/minecraft/server/ItemBow.java
@@ -0,0 +0,0 @@
package net.minecraft.server;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+
public class ItemBow extends Item {
public ItemBow(Item.Info item_info) {
@@ -0,0 +0,0 @@ public class ItemBow extends Item {
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index 27bf83f37..3031d73f5 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving {
return (EntitySize) EntityHuman.b.getOrDefault(entitypose, EntityHuman.bs);
}
- private ItemStack a(EntityHuman entityhuman) {
- if (this.e_(entityhuman.b(EnumHand.OFF_HAND))) {
+ private ItemStack a(EntityHuman entityhuman, ItemStack bow) { // Paper
+ if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.OFF_HAND))) { // Paper
return entityhuman.b(EnumHand.OFF_HAND);
- } else if (this.e_(entityhuman.b(EnumHand.MAIN_HAND))) {
+ } else if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.MAIN_HAND))) {
return entityhuman.b(EnumHand.MAIN_HAND);
} else {
for (int i = 0; i < entityhuman.inventory.getSize(); ++i) {
ItemStack itemstack = entityhuman.inventory.getItem(i);
- if (this.e_(itemstack)) {
+ if (this.e_(entityhuman, bow, itemstack)) {
return itemstack;
}
}
@@ -0,0 +0,0 @@ public class ItemBow extends Item {
}
}
- protected boolean e_(ItemStack itemstack) {
- return itemstack.getItem() instanceof ItemArrow;
+ // Paper start
+ protected boolean e_(EntityHuman player, ItemStack bow, ItemStack itemstack) {
+ return itemstack.getItem() instanceof ItemArrow && (
+ !(player instanceof EntityPlayer) ||
+ protected boolean tryReadyArrow(ItemStack bow, ItemStack itemstack) {
+ return !(this instanceof EntityPlayer) ||
+ new com.destroystokyo.paper.event.player.PlayerReadyArrowEvent(
+ ((EntityPlayer) player).getBukkitEntity(),
+ CraftItemStack.asCraftMirror(bow),
+ CraftItemStack.asCraftMirror(itemstack)
+ ).callEvent());
+ ((EntityPlayer) this).getBukkitEntity(),
+ org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(bow),
+ org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack)
+ ).callEvent();
+ // Paper end
}
+ }
+
@Override
public ItemStack f(ItemStack itemstack) {
if (!(itemstack.getItem() instanceof ItemProjectileWeapon)) {
@@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving {
for (int i = 0; i < this.inventory.getSize(); ++i) {
ItemStack itemstack2 = this.inventory.getItem(i);
public void a(ItemStack itemstack, World world, EntityLiving entityliving, int i) {
if (entityliving instanceof EntityHuman) {
EntityHuman entityhuman = (EntityHuman) entityliving;
boolean flag = entityhuman.abilities.canInstantlyBuild || EnchantmentManager.getEnchantmentLevel(Enchantments.ARROW_INFINITE, itemstack) > 0;
- ItemStack itemstack1 = this.a(entityhuman);
+ ItemStack itemstack1 = this.a(entityhuman, itemstack); // Paper
if (!itemstack1.isEmpty() || flag) {
if (itemstack1.isEmpty()) {
@@ -0,0 +0,0 @@ public class ItemBow extends Item {
public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
- boolean flag = !this.a(entityhuman).isEmpty();
+ boolean flag = !this.a(entityhuman, itemstack).isEmpty(); // Paper
if (!entityhuman.abilities.canInstantlyBuild && !flag) {
return flag ? new InteractionResultWrapper<>(EnumInteractionResult.PASS, itemstack) : new InteractionResultWrapper<>(EnumInteractionResult.FAIL, itemstack);
- if (predicate.test(itemstack2)) {
+ if (predicate.test(itemstack2) && tryReadyArrow(itemstack, itemstack2)) { // Paper
return itemstack2;
}
}
--

View file

@ -5,15 +5,15 @@ Subject: [PATCH] Print Error details when failing to save player data
diff --git a/src/main/java/net/minecraft/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java
index d5e21cc33c..577ba1b5f9 100644
index e60e10c57..350ac42d6 100644
--- a/src/main/java/net/minecraft/server/WorldNBTStorage.java
+++ b/src/main/java/net/minecraft/server/WorldNBTStorage.java
@@ -0,0 +0,0 @@ public class WorldNBTStorage implements IDataManager, IPlayerFileData {
@@ -0,0 +0,0 @@ public class WorldNBTStorage implements IPlayerFileData {
file.renameTo(file1);
} catch (Exception exception) {
- WorldNBTStorage.b.warn("Failed to save player data for {}", entityhuman.getDisplayName().getString());
+ WorldNBTStorage.b.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper
- WorldNBTStorage.LOGGER.warn("Failed to save player data for {}", entityhuman.getDisplayName().getString());
+ WorldNBTStorage.LOGGER.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper
}
}

View file

@ -1,49 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Sun, 10 Jun 2018 20:04:42 -0400
Subject: [PATCH] Properly remove entities on dimension teleport
To teleport an entity between dimensions, the server makes a copy
and puts the copy in the new location, and marks the old one dead.
If this method got called for the same world in the same tick,
the entity would not have been removed from the UUID map, and the
world readd would fail.
This can be triggered even with a plugin if the entity is teleported
twice in the same tick, from world A to B, then back from B to A.
The re-add to A will fail to add the entity to the world. It will
actually be there, but it will not be visible on the client until
the server is restarted to re-try the add to world process again.
This bug was unlikely to be seen by many due to the double teleport
requirement, but plugins (such as my own) use this method to
trigger a "reload" of the entity on the client.
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 92a15ba947..debab1a715 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
}
// CraftBukkit end */
- this.world.kill(this);
+ this.world.removeEntity(this); // Paper - Fully remove entity, can't have dupes in the UUID map
this.dead = false;
this.world.methodProfiler.enter("reposition");
/* CraftBukkit start - Handled in calculateTarget
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index e4730352d3..c08ee62e84 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
}
protected void c(Entity entity) {
+ if (!this.entitiesByUUID.containsKey(entity.getUniqueID()) && !entity.valid) return; // Paper - Already removed, dont fire twice - this looks like it can happen even without our changes
super.c(entity);
this.entitiesById.d(entity.getId());
this.entitiesByUUID.remove(entity.getUniqueID());
--

View file

@ -8,7 +8,7 @@ and to perform an attack.
diff --git a/src/main/java/com/destroystokyo/paper/entity/CraftRangedEntity.java b/src/main/java/com/destroystokyo/paper/entity/CraftRangedEntity.java
new file mode 100644
index 0000000000..696660b089
index 000000000..696660b08
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/entity/CraftRangedEntity.java
@@ -0,0 +0,0 @@
@ -32,7 +32,7 @@ index 0000000000..696660b089
+ }
+}
diff --git a/src/main/java/net/minecraft/server/IRangedEntity.java b/src/main/java/net/minecraft/server/IRangedEntity.java
index 4fd69850fd..b763bd11dd 100644
index b4178ce1e..9b79ac77d 100644
--- a/src/main/java/net/minecraft/server/IRangedEntity.java
+++ b/src/main/java/net/minecraft/server/IRangedEntity.java
@@ -0,0 +0,0 @@ package net.minecraft.server;
@ -41,12 +41,12 @@ index 4fd69850fd..b763bd11dd 100644
- void a(EntityLiving entityliving, float f);
+ void a(EntityLiving entityliving, float f); default void rangedAttack(EntityLiving entityliving, float f) { a(entityliving, f); } // Paper - OBFHELPER
- void s(boolean flag);
+ void s(boolean flag); default void setChargingAttack(boolean flag) { s(flag); } // Paper - OBFHELPER
+
+ // - see EntitySkeletonAbstract melee goal
+ void q(boolean flag); default void setChargingAttack(boolean charging) { q(charging); }; // Paper
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java
index 2ec1af8be4..f31d3eed3a 100644
index 2ec1af8be..f31d3eed3 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java
@@ -0,0 +0,0 @@
@ -64,7 +64,7 @@ index 2ec1af8be4..f31d3eed3a 100644
public CraftIllusioner(CraftServer server, EntityIllagerIllusioner entity) {
super(server, entity);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java
index 23ab78da15..3f94c5a920 100644
index 23ab78da1..3f94c5a92 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java
@@ -0,0 +0,0 @@
@ -84,7 +84,7 @@ index 23ab78da15..3f94c5a920 100644
public CraftLlama(CraftServer server, EntityLlama entity) {
super(server, entity);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java
index 4ed89615fd..4fa5e84ea4 100644
index 9fef81cc2..1dc9b4412 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java
@@ -0,0 +0,0 @@
@ -92,7 +92,6 @@ index 4ed89615fd..4fa5e84ea4 100644
+import com.destroystokyo.paper.entity.CraftRangedEntity;
import net.minecraft.server.EntitySkeletonAbstract;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Skeleton;
@ -103,7 +102,7 @@ index 4ed89615fd..4fa5e84ea4 100644
public CraftSkeleton(CraftServer server, EntitySkeletonAbstract entity) {
super(server, entity);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java
index 0349f0a574..2e3d8fcdfa 100644
index 0349f0a57..2e3d8fcdf 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java
@@ -0,0 +0,0 @@
@ -121,25 +120,25 @@ index 0349f0a574..2e3d8fcdfa 100644
super(server, entity);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java
index c08833cb7a..f25998eb6d 100644
index fb14179c3..49e0f2206 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java
@@ -0,0 +0,0 @@
package org.bukkit.craftbukkit.entity;
+import com.destroystokyo.paper.entity.CraftRangedEntity;
+import com.destroystokyo.paper.entity.CraftRangedEntity; // Paper
import net.minecraft.server.EntityWitch;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.Witch;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Witch;
-public class CraftWitch extends CraftMonster implements Witch {
+public class CraftWitch extends CraftMonster implements Witch, CraftRangedEntity<EntityWitch> { // Paper
-public class CraftWitch extends CraftRaider implements Witch {
+public class CraftWitch extends CraftRaider implements Witch, CraftRangedEntity<EntityWitch> { // Paper
public CraftWitch(CraftServer server, EntityWitch entity) {
super(server, entity);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
index 3df0fcb9b6..a1d04ff284 100644
index 3df0fcb9b..a1d04ff28 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
@@ -0,0 +0,0 @@

View file

@ -8,17 +8,17 @@ These are a critical sign that somethin went wrong, and you've lost some data...
We should kind of know about these things you know.
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index c08ee62e84..85a30652c4 100644
index af62ab182..0b4990a00 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
this.g.remove(entity1);
} else {
if (!(entity instanceof EntityHuman)) {
- // WorldServer.a.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit
+ WorldServer.a.error("Keeping entity {} that already exists with UUID {} - " + entity1, EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit // Paper
+ WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper
return false;
}
@@ -0,0 +0,0 @@ public class WorldServer extends World {
if (entity1 == null) {
return false;
} else {
- // WorldServer.LOGGER.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.getEntityType()), entity.getUniqueID().toString()); // CraftBukkit
+ WorldServer.LOGGER.error("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.getEntityType()), entity.getUniqueID().toString()); // CraftBukkit // paper
+ WorldServer.LOGGER.error("Deleting duplicate entity {}", entity); // CraftBukkit // paper
return true;
}
}
--

View file

@ -16,10 +16,10 @@ Refresh the player inventory when PlayerInteractEntityEvent is
cancelled to avoid this problem.
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
index 0b5dc66897..6d04c5733c 100644
index fbdc755e8..a0f6addef 100644
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
if (event.isCancelled()) {

View file

@ -21,7 +21,7 @@ This is based upon conclusions drawn from inspecting the assenmbly generated byt
They had 'callq' (invoke) instead of 'mov' (get from memory) instructions.
diff --git a/src/main/java/net/minecraft/server/BaseBlockPosition.java b/src/main/java/net/minecraft/server/BaseBlockPosition.java
index 4c7793f86d..cc17a414f5 100644
index 7cb46d7a9..e96428bb2 100644
--- a/src/main/java/net/minecraft/server/BaseBlockPosition.java
+++ b/src/main/java/net/minecraft/server/BaseBlockPosition.java
@@ -0,0 +0,0 @@ import javax.annotation.concurrent.Immutable;
@ -79,40 +79,32 @@ index 4c7793f86d..cc17a414f5 100644
public BaseBlockPosition d(BaseBlockPosition baseblockposition) {
return new BaseBlockPosition(this.getY() * baseblockposition.getZ() - this.getZ() * baseblockposition.getY(), this.getZ() * baseblockposition.getX() - this.getX() * baseblockposition.getZ(), this.getX() * baseblockposition.getY() - this.getY() * baseblockposition.getX());
}
public boolean a(BaseBlockPosition baseblockposition, double d0) {
- return this.distanceSquared((double) baseblockposition.a, (double) baseblockposition.b, (double) baseblockposition.c, false) < d0 * d0;
+ return this.distanceSquared((double) baseblockposition.x, (double) baseblockposition.y, (double) baseblockposition.z, false) < d0 * d0; // Paper
}
public boolean a(IPosition iposition, double d0) {
@@ -0,0 +0,0 @@ public class BaseBlockPosition implements Comparable<BaseBlockPosition> {
}
public int n(BaseBlockPosition baseblockposition) {
- float f = (float) Math.abs(baseblockposition.getX() - this.a);
- float f1 = (float) Math.abs(baseblockposition.getY() - this.b);
- float f2 = (float) Math.abs(baseblockposition.getZ() - this.c);
+ float f = (float) Math.abs(baseblockposition.getX() - this.x); // Paper
+ float f1 = (float) Math.abs(baseblockposition.getY() - this.y); // Paper
+ float f2 = (float) Math.abs(baseblockposition.getZ() - this.z); // Paper
return (int) (f + f1 + f2);
}
diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java
index 80e13dfb2e..20cf9255ba 100644
index 64700b97c..a5e5a4eba 100644
--- a/src/main/java/net/minecraft/server/BlockPosition.java
+++ b/src/main/java/net/minecraft/server/BlockPosition.java
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition {
if (this.g == null) {
this.g = new BlockPosition.MutableBlockPosition(i, j, k);
return this.g;
- } else if (this.g.b == l && this.g.c == i1 && this.g.d == j1) {
+ } else if (this.g.x == l && this.g.y == i1 && this.g.z == j1) {
return (BlockPosition.MutableBlockPosition) this.endOfData();
} else {
- if (this.g.b < l) {
- ++this.g.b;
- } else if (this.g.c < i1) {
- this.g.b = i; // Paper - decompile fix Readd line removed by the decompiler
- ++this.g.c;
- } else if (this.g.d < j1) {
- this.g.b = i; // Paper - decompile fix Readd line removed by the decompiler
- this.g.c = j; // Paper - decompile fix Readd line removed by the decompiler
- ++this.g.d;
+ if (this.g.x < l) {
+ ++this.g.x;
+ } else if (this.g.y < i1) {
+ this.g.x = i; // Paper - decompile fix Readd line removed by the decompiler
+ ++this.g.y;
+ } else if (this.g.z < j1) {
+ this.g.x = i; // Paper - decompile fix Readd line removed by the decompiler
+ this.g.y = j; // Paper - decompile fix Readd line removed by the decompiler
+ ++this.g.z;
}
return this.g;
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
}
public static class MutableBlockPosition extends BlockPosition {
@ -127,7 +119,7 @@ index 80e13dfb2e..20cf9255ba 100644
@Override
public boolean isValidLocation() {
return b >= -30000000 && d >= -30000000 && b < 30000000 && d < 30000000 && c >= 0 && c < 256;
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
public boolean isInvalidYLocation() {
return c < 0 || c >= 256;
}
@ -135,7 +127,7 @@ index 80e13dfb2e..20cf9255ba 100644
// Paper end
public MutableBlockPosition() {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
}
public MutableBlockPosition(int i, int j, int k) {
@ -150,26 +142,27 @@ index 80e13dfb2e..20cf9255ba 100644
+ // Paper end
}
public BlockPosition a(double d0, double d1, double d2) {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition {
return super.a(enumblockrotation).h();
public MutableBlockPosition(double d0, double d1, double d2) {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
return super.a(enumblockrotation).immutableCopy();
}
+
+ /*
+ // Paper start - use parent getters
@Override
public int getX() {
return this.b;
}
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
@Override
public int getZ() {
return this.d;
- }
+ }*/
+ // Paper end
public BlockPosition.MutableBlockPosition setValues(int i, int j, int k) { return c(i, j, k);} // Paper - OBFHELPER
public BlockPosition.MutableBlockPosition c(int i, int j, int k) {
public BlockPosition.MutableBlockPosition setValues(int i, int j, int k) { return d(i, j, k);} // Paper - OBFHELPER
public BlockPosition.MutableBlockPosition d(int i, int j, int k) {
- this.b = i;
- this.c = j;
- this.d = k;
@ -181,17 +174,17 @@ index 80e13dfb2e..20cf9255ba 100644
return this;
}
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition {
@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
}
public BlockPosition.MutableBlockPosition c(EnumDirection enumdirection, int i) {
- return this.c(this.b + enumdirection.getAdjacentX() * i, this.c + enumdirection.getAdjacentY() * i, this.d + enumdirection.getAdjacentZ() * i);
+ return this.c(x + enumdirection.getAdjacentX() * i, y + enumdirection.getAdjacentY() * i, z + enumdirection.getAdjacentZ() * i); // Paper - use xyz
- return this.d(this.b + enumdirection.getAdjacentX() * i, this.c + enumdirection.getAdjacentY() * i, this.d + enumdirection.getAdjacentZ() * i);
+ return this.d(this.x + enumdirection.getAdjacentX() * i, this.y + enumdirection.getAdjacentY() * i, this.z + enumdirection.getAdjacentZ() * i);
}
public BlockPosition.MutableBlockPosition d(int i, int j, int k) {
- return this.c(this.b + i, this.c + j, this.d + k);
+ return this.c(x + i, y + j, z + k); // Paper - use xyz
public BlockPosition.MutableBlockPosition e(int i, int j, int k) {
- return this.d(this.b + i, this.c + j, this.d + k);
+ return this.d(this.x + i, this.y + j, this.z + k);
}
public void p(int i) {
@ -199,5 +192,5 @@ index 80e13dfb2e..20cf9255ba 100644
+ this.y = i; // Paper change to y
}
public BlockPosition toBlockPosition() { return h(); } // Paper - OBFHELPER
@Override
--

View file

@ -5,7 +5,7 @@ Subject: [PATCH] Use asynchronous Log4j 2 loggers
diff --git a/pom.xml b/pom.xml
index 3ad5af3463..9cbd4880f7 100644
index 16799b4cd..8c18a0c09 100644
--- a/pom.xml
+++ b/pom.xml
@@ -0,0 +0,0 @@
@ -24,7 +24,7 @@ index 3ad5af3463..9cbd4880f7 100644
<artifactId>asm</artifactId>
diff --git a/src/main/resources/log4j2.component.properties b/src/main/resources/log4j2.component.properties
new file mode 100644
index 0000000000..ee7c90784c
index 000000000..ee7c90784
--- /dev/null
+++ b/src/main/resources/log4j2.component.properties
@@ -0,0 +1 @@

View file

@ -6,7 +6,7 @@ Subject: [PATCH] Vex#getSummoner API
Get's the NPC that summoned this Vex
diff --git a/src/main/java/net/minecraft/server/EntityVex.java b/src/main/java/net/minecraft/server/EntityVex.java
index 388d341262..c3864b869e 100644
index ecfc057a1..83e022c91 100644
--- a/src/main/java/net/minecraft/server/EntityVex.java
+++ b/src/main/java/net/minecraft/server/EntityVex.java
@@ -0,0 +0,0 @@ public class EntityVex extends EntityMonster {
@ -15,10 +15,10 @@ index 388d341262..c3864b869e 100644
+ public EntityInsentient getOwner() { return l(); } // Paper - OBFHELPER
public EntityInsentient l() {
return this.b;
return this.c;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
index 0f01fc591d..c96a5df80a 100644
index 737a37b6f..169c951ec 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
@@ -0,0 +0,0 @@

View file

@ -6,7 +6,7 @@ Subject: [PATCH] add more information to Entity.toString()
UUID, ticks lived, valid, dead
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index debab1a715..69a058d830 100644
index c28b498a2..c7d19d957 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke