mirror of
https://github.com/PaperMC/Paper.git
synced 2025-02-22 04:33:28 +01:00
Work it
This commit is contained in:
parent
2e66bc9719
commit
149a25fb83
48 changed files with 63 additions and 122 deletions
patches
server
API-to-get-a-BlockState-without-a-snapshot.patchAbility-to-apply-mending-to-XP-API.patchAdd-ArmorStand-Item-Meta.patchAdd-PlayerAdvancementCriterionGrantEvent.patchAdd-PlayerArmorChangeEvent.patchAdd-PlayerJumpEvent.patchAdd-more-fields-to-AsyncPreLoginEvent.patchAdd-openSign-method-to-HumanEntity.patchAdd-setPlayerProfile-API-for-Skulls.patchAllow-specifying-a-custom-authentication-servers-dow.patchAsyncTabCompleteEvent.patchBlock-player-logins-during-server-shutdown.patchCall-PaperServerListPingEvent-for-legacy-pings.patchConfigurable-sprint-interruption-on-attack.patchDisable-Explicit-Network-Manager-Flushing.patchEnderman.teleportRandomly.patchEndermanEscapeEvent.patchEntity-fromMobSpawner.patchExpose-client-protocol-version-and-virtual-host.patchExtend-Player-Interact-cancellation.patchFill-Profile-Property-Events.patchFix-MC-117075-Block-entity-unload-lag-spike.patchFix-this-stupid-bullshit.patchFlag-to-disable-the-channel-limit.patchImplement-extended-PaperServerListPingEvent.patchImplement-getI18NDisplayName.patchImprove-the-Saddle-API-for-Horses.patchImproved-Async-Task-Scheduler.patchLivingEntity-setKiller.patchMake-legacy-ping-handler-more-reliable.patchOcelot-despawns-should-honor-nametags-and-leash.patchPlayer.setPlayerProfile-API.patchPlayerNaturallySpawnCreaturesEvent.patchPlayerPickupExperienceEvent.patchPreCreatureSpawnEvent.patchPrevent-logins-from-being-processed-when-the-player-.patchProfile-Lookup-Events.patchProfileWhitelistVerifyEvent.patchReset-spawner-timer-when-spawner-event-is-cancelled.patchSend-attack-SoundEffects-only-to-players-who-can-see.patchTameable-getOwnerUniqueId-API.patchToggleable-player-crits.patchensureServerConversions-API.patchgetPlayerUniqueId-API.patchhandle-ServerboundKeepAlivePacket-async.patchrevert-serverside-behavior-of-keepalives.patchuse-CB-BlockState-implementations-for-captured-block.patch
unapplied/server
|
@ -27,7 +27,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
@@ -0,0 +0,0 @@ public abstract class BlockEntity {
|
@@ -0,0 +0,0 @@ public abstract class BlockEntity {
|
||||||
|
|
||||||
// CraftBukkit start - read container
|
// CraftBukkit start - read container
|
||||||
protected void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) {
|
protected void loadAdditional(CompoundTag nbt, HolderLookup.Provider registries) {
|
||||||
- this.persistentDataContainer = new CraftPersistentDataContainer(BlockEntity.DATA_TYPE_REGISTRY);
|
- this.persistentDataContainer = new CraftPersistentDataContainer(BlockEntity.DATA_TYPE_REGISTRY);
|
||||||
+ this.persistentDataContainer.clear(); // Paper - clear instead of init
|
+ this.persistentDataContainer.clear(); // Paper - clear instead of init
|
||||||
|
|
|
@ -9,9 +9,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||||
ItemStack itemstack2 = this.getItemBySlot(enumitemslot);
|
|
||||||
|
|
||||||
if (this.equipmentHasChanged(itemstack1, itemstack2)) {
|
itemstack = this.getItemBySlot(enumitemslot);
|
||||||
|
if (this.equipmentHasChanged(itemstack2, itemstack)) {
|
||||||
+ // Paper start - PlayerArmorChangeEvent
|
+ // Paper start - PlayerArmorChangeEvent
|
||||||
+ if (this instanceof ServerPlayer && enumitemslot.getType() == EquipmentSlot.Type.HUMANOID_ARMOR) {
|
+ if (this instanceof ServerPlayer && enumitemslot.getType() == EquipmentSlot.Type.HUMANOID_ARMOR) {
|
||||||
+ final org.bukkit.inventory.ItemStack oldItem = CraftItemStack.asBukkitCopy(itemstack1);
|
+ final org.bukkit.inventory.ItemStack oldItem = CraftItemStack.asBukkitCopy(itemstack1);
|
|
@ -32,7 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
- PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
- PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||||
+ // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
|
+ // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
if (this.chatSpamTickCount.addAndGet(1) > 500 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) {
|
if (!this.chatSpamThrottler.isIncrementAndUnderThreshold(1, 500) && !this.server.getPlayerList().isOp(this.player.getGameProfile()) && !this.server.isSingleplayerOwner(this.player.getGameProfile())) {
|
||||||
this.disconnect(Component.translatable("disconnect.spam"));
|
this.disconnect(Component.translatable("disconnect.spam"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
|
@ -25,17 +25,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
public boolean setTarget(LivingEntity entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) {
|
public boolean setTarget(LivingEntity entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) {
|
||||||
if (!super.setTarget(entityliving, reason, fireEvent)) {
|
if (!super.setTarget(entityliving, reason, fireEvent)) {
|
||||||
@@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
|
@@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||||
if (this.level().isDay() && this.tickCount >= this.targetChangeTime + 600) {
|
if (world.isDay() && this.tickCount >= this.targetChangeTime + 600) {
|
||||||
float f = this.getLightLevelDependentMagicValue();
|
float f = this.getLightLevelDependentMagicValue();
|
||||||
|
|
||||||
- if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
|
- if (f > 0.5F && world.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
|
||||||
+ if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper - EndermanEscapeEvent
|
+ if (f > 0.5F && world.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper - EndermanEscapeEvent
|
||||||
this.setTarget((LivingEntity) null);
|
this.setTarget((LivingEntity) null);
|
||||||
this.teleport();
|
this.teleport();
|
||||||
}
|
}
|
||||||
@@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
|
@@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||||
} else {
|
} else {
|
||||||
flag1 = flag && this.hurtWithCleanWater(source, (ThrownPotion) source.getDirectEntity(), amount);
|
flag1 = flag && this.hurtWithCleanWater(world, source, (ThrownPotion) source.getDirectEntity(), amount);
|
||||||
|
|
||||||
+ if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent
|
+ if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent
|
||||||
for (int i = 0; i < 64; ++i) {
|
for (int i = 0; i < 64; ++i) {
|
||||||
|
@ -50,7 +50,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
@@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
|
@@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||||
} else {
|
} else {
|
||||||
if (this.target != null && !this.enderman.isPassenger()) {
|
if (this.target != null && !this.enderman.isPassenger()) {
|
||||||
if (this.enderman.isLookingAtMe((Player) this.target)) {
|
if (this.enderman.isBeingStaredBy((Player) this.target)) {
|
||||||
- if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D) {
|
- if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D) {
|
||||||
+ if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D && this.enderman.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.STARE)) { // Paper - EndermanEscapeEvent
|
+ if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D && this.enderman.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.STARE)) { // Paper - EndermanEscapeEvent
|
||||||
this.enderman.teleport();
|
this.enderman.teleport();
|
|
@ -36,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
|
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||||
@@ -0,0 +0,0 @@ public class Main {
|
@@ -0,0 +0,0 @@ public class Main {
|
||||||
Calendar deadline = Calendar.getInstance();
|
Calendar deadline = Calendar.getInstance();
|
||||||
deadline.add(Calendar.DAY_OF_YEAR, -28);
|
deadline.add(Calendar.DAY_OF_YEAR, -3);
|
||||||
if (buildDate.before(deadline.getTime())) {
|
if (buildDate.before(deadline.getTime())) {
|
||||||
- System.err.println("*** Error, this build is outdated ***");
|
- System.err.println("*** Error, this build is outdated ***");
|
||||||
+ // Paper start - This is some stupid bullshit
|
+ // Paper start - This is some stupid bullshit
|
|
@ -106,8 +106,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ @Override
|
+ @Override
|
||||||
+ public void mainThreadHeartbeat(int currentTick) {
|
+ public void mainThreadHeartbeat() {
|
||||||
+ this.currentTick = currentTick;
|
+ this.currentTick++;
|
||||||
+ this.management.execute(() -> this.runTasks(currentTick));
|
+ this.management.execute(() -> this.runTasks(currentTick));
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
@ -304,28 +304,28 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
|
@@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
|
||||||
* This method is designed to never block or wait for locks; an immediate execution of all current tasks.
|
|
||||||
*/
|
*/
|
||||||
public void mainThreadHeartbeat(final int currentTick) {
|
public void mainThreadHeartbeat() {
|
||||||
|
this.currentTick++;
|
||||||
+ // Paper start
|
+ // Paper start
|
||||||
+ if (!this.isAsyncScheduler) {
|
+ if (!this.isAsyncScheduler) {
|
||||||
+ this.asyncScheduler.mainThreadHeartbeat(currentTick);
|
+ this.asyncScheduler.mainThreadHeartbeat();
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end
|
+ // Paper end
|
||||||
this.currentTick = currentTick;
|
|
||||||
final List<CraftTask> temp = this.temp;
|
final List<CraftTask> temp = this.temp;
|
||||||
this.parsePending();
|
this.parsePending();
|
||||||
|
while (this.isReady(this.currentTick)) {
|
||||||
@@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
|
@@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
|
||||||
this.parsePending();
|
this.parsePending();
|
||||||
} else {
|
} else {
|
||||||
// this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper
|
// this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(this.currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper
|
||||||
- this.executor.execute(new com.destroystokyo.paper.ServerSchedulerReportingWrapper(task)); // Paper
|
- this.executor.execute(new com.destroystokyo.paper.ServerSchedulerReportingWrapper(task)); // Paper
|
||||||
+ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper
|
+ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper
|
||||||
// We don't need to parse pending
|
// We don't need to parse pending
|
||||||
// (async tasks must live with race-conditions if they attempt to cancel between these few lines of code)
|
// (async tasks must live with race-conditions if they attempt to cancel between these few lines of code)
|
||||||
}
|
}
|
||||||
@@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
|
@@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
|
||||||
//this.debugHead = this.debugHead.getNextHead(currentTick); // Paper
|
//this.debugHead = this.debugHead.getNextHead(this.currentTick); // Paper
|
||||||
}
|
}
|
||||||
|
|
||||||
- private void addTask(final CraftTask task) {
|
- private void addTask(final CraftTask task) {
|
|
@ -8,19 +8,6 @@ This can be useful for changing name or skins after a player has logged in.
|
||||||
== AT ==
|
== AT ==
|
||||||
public-f net.minecraft.world.entity.player.Player gameProfile
|
public-f net.minecraft.world.entity.player.Player gameProfile
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
||||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
||||||
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
||||||
this.internalTeleport(dest.getX(), dest.getY(), dest.getZ(), dest.getYaw(), dest.getPitch(), Collections.emptySet());
|
|
||||||
}
|
|
||||||
|
|
||||||
- private void internalTeleport(double d0, double d1, double d2, float f, float f1, Set<RelativeMovement> set) {
|
|
||||||
+ public void internalTeleport(double d0, double d1, double d2, float f, float f1, Set<RelativeMovement> set) { // Paper
|
|
||||||
// CraftBukkit start
|
|
||||||
if (Float.isNaN(f)) {
|
|
||||||
f = 0;
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||||
|
@ -203,7 +190,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ ServerLevel worldserver = handle.serverLevel();
|
+ ServerLevel worldserver = handle.serverLevel();
|
||||||
+ connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(handle.createCommonSpawnInfo(worldserver), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA));
|
+ connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(handle.createCommonSpawnInfo(worldserver), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA));
|
||||||
+ handle.onUpdateAbilities();
|
+ handle.onUpdateAbilities();
|
||||||
+ connection.internalTeleport(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch(), java.util.Collections.emptySet());
|
+ connection.internalTeleport(net.minecraft.world.entity.PositionMoveRotation.of(this.getHandle()), java.util.Collections.emptySet());
|
||||||
+ net.minecraft.server.players.PlayerList playerList = handle.server.getPlayerList();
|
+ net.minecraft.server.players.PlayerList playerList = handle.server.getPlayerList();
|
||||||
+ playerList.sendPlayerPermissionLevel(handle, false);
|
+ playerList.sendPlayerPermissionLevel(handle, false);
|
||||||
+ playerList.sendLevelInfo(handle, worldserver);
|
+ playerList.sendLevelInfo(handle, worldserver);
|
|
@ -21,44 +21,44 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event
|
+ //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event
|
||||||
+ double blockRange = 16384.0D; // Paper
|
+ double blockRange = 16384.0D; // Paper
|
||||||
// Spigot end
|
// Spigot end
|
||||||
if (!this.distanceManager.hasPlayersNearby(chunkcoordintpair.toLong())) {
|
Iterator iterator = this.playerMap.getAllPlayers().iterator();
|
||||||
return false;
|
|
||||||
@@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
@@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
entityplayer = (ServerPlayer) iterator.next();
|
entityplayer = (ServerPlayer) iterator.next();
|
||||||
+ // Paper start - PlayerNaturallySpawnCreaturesEvent
|
+ // Paper start - PlayerNaturallySpawnCreaturesEvent
|
||||||
+ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event;
|
+ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event;
|
||||||
+ blockRange = 16384.0D;
|
+ blockRange = 16384.0D;
|
||||||
+ if (reducedRange) {
|
+ if (reducedRange) {
|
||||||
+ event = entityplayer.playerNaturallySpawnedEvent;
|
+ event = entityplayer.playerNaturallySpawnedEvent;
|
||||||
+ if (event == null || event.isCancelled()) return false;
|
+ if (event == null || event.isCancelled()) return false;
|
||||||
+ blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
|
+ blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end - PlayerNaturallySpawnCreaturesEvent
|
+ // Paper end - PlayerNaturallySpawnCreaturesEvent
|
||||||
} while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot
|
} while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||||
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||||
@@ -0,0 +0,0 @@ public class ServerChunkCache extends ChunkSource {
|
@@ -0,0 +0,0 @@ public class ServerChunkCache extends ChunkSource {
|
||||||
boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit
|
List list1;
|
||||||
|
|
||||||
Util.shuffle(list, this.level.random);
|
if (flag && (this.spawnEnemies || this.spawnFriendlies)) {
|
||||||
+ // Paper start - PlayerNaturallySpawnCreaturesEvent
|
+ // Paper start - PlayerNaturallySpawnCreaturesEvent
|
||||||
+ int chunkRange = level.spigotConfig.mobSpawnRange;
|
+ int chunkRange = level.spigotConfig.mobSpawnRange;
|
||||||
+ chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange;
|
+ chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange;
|
||||||
+ chunkRange = Math.min(chunkRange, 8);
|
+ chunkRange = Math.min(chunkRange, 8);
|
||||||
+ for (ServerPlayer entityPlayer : this.level.players()) {
|
+ for (ServerPlayer entityPlayer : this.level.players()) {
|
||||||
+ entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange);
|
+ entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange);
|
||||||
+ entityPlayer.playerNaturallySpawnedEvent.callEvent();
|
+ entityPlayer.playerNaturallySpawnedEvent.callEvent();
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end - PlayerNaturallySpawnCreaturesEvent
|
+ // Paper end - PlayerNaturallySpawnCreaturesEvent
|
||||||
int l = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING);
|
boolean flag1 = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getLevelData().getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
|
||||||
boolean flag1 = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getLevelData().getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
|
|
||||||
Iterator iterator1 = list.iterator();
|
list1 = NaturalSpawner.getFilteredSpawningCategories(spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1, this.level); // CraftBukkit
|
||||||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
@ -20,14 +20,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+++ b/src/main/java/net/minecraft/util/SpawnUtil.java
|
+++ b/src/main/java/net/minecraft/util/SpawnUtil.java
|
||||||
@@ -0,0 +0,0 @@ public class SpawnUtil {
|
@@ -0,0 +0,0 @@ public class SpawnUtil {
|
||||||
|
|
||||||
public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entityType, MobSpawnType reason, ServerLevel world, BlockPos pos, int tries, int horizontalRange, int verticalRange, SpawnUtil.Strategy requirements) {
|
public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entityType, EntitySpawnReason reason, ServerLevel world, BlockPos pos, int tries, int horizontalRange, int verticalRange, SpawnUtil.Strategy requirements) {
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
- return SpawnUtil.trySpawnMob(entityType, reason, world, pos, tries, horizontalRange, verticalRange, requirements, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT);
|
- return SpawnUtil.trySpawnMob(entityType, reason, world, pos, tries, horizontalRange, verticalRange, requirements, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT);
|
||||||
+ return SpawnUtil.trySpawnMob(entityType, reason, world, pos, tries, horizontalRange, verticalRange, requirements, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT, null); // Paper
|
+ return SpawnUtil.trySpawnMob(entityType, reason, world, pos, tries, horizontalRange, verticalRange, requirements, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT, null); // Paper
|
||||||
}
|
}
|
||||||
|
|
||||||
- public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, MobSpawnType enummobspawn, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
|
- public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, EntitySpawnReason entityspawnreason, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
|
||||||
+ public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, MobSpawnType enummobspawn, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason, @javax.annotation.Nullable Runnable onAbort) { // Paper
|
+ public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, EntitySpawnReason entityspawnreason, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason, @javax.annotation.Nullable Runnable onAbort) { // Paper - pre creature spawn event
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
BlockPos.MutableBlockPos blockposition_mutableblockposition = blockposition.mutable();
|
BlockPos.MutableBlockPos blockposition_mutableblockposition = blockposition.mutable();
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ break;
|
+ break;
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end - PreCreatureSpawnEvent
|
+ // Paper end - PreCreatureSpawnEvent
|
||||||
T t0 = entitytypes.create(worldserver, (Consumer<T>) null, blockposition_mutableblockposition, enummobspawn, false, false); // CraftBukkit - decompile error
|
T t0 = entitytypes.create(worldserver, (Consumer<T>) null, blockposition_mutableblockposition, entityspawnreason, false, false); // CraftBukkit - decompile error
|
||||||
|
|
||||||
if (t0 != null) {
|
if (t0 != null) {
|
||||||
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
|
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
|
||||||
|
@ -60,7 +60,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
|
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
|
||||||
@@ -0,0 +0,0 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
|
@@ -0,0 +0,0 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
|
||||||
@Nullable
|
@Nullable
|
||||||
public T spawn(ServerLevel worldserver, @Nullable Consumer<T> consumer, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
|
public T spawn(ServerLevel worldserver, @Nullable Consumer<T> consumer, BlockPos blockposition, EntitySpawnReason entityspawnreason, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
+ // Paper start - PreCreatureSpawnEvent
|
+ // Paper start - PreCreatureSpawnEvent
|
||||||
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
|
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
|
||||||
|
@ -72,7 +72,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ return null;
|
+ return null;
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end - PreCreatureSpawnEvent
|
+ // Paper end - PreCreatureSpawnEvent
|
||||||
T t0 = this.create(worldserver, consumer, blockposition, enummobspawn, flag, flag1);
|
T t0 = this.create(worldserver, consumer, blockposition, entityspawnreason, flag, flag1);
|
||||||
|
|
||||||
if (t0 != null) {
|
if (t0 != null) {
|
||||||
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||||||
|
@ -80,11 +80,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||||||
@@ -0,0 +0,0 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
@@ -0,0 +0,0 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||||
}).limit(5L).collect(Collectors.toList());
|
}).limit(5L).toList();
|
||||||
|
|
||||||
if (list1.size() >= requiredCount) {
|
if (list1.size() >= requiredCount) {
|
||||||
- if (!SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, MobSpawnType.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE).isEmpty()) { // CraftBukkit
|
- if (!SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, EntitySpawnReason.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE).isEmpty()) { // CraftBukkit
|
||||||
+ if (SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, MobSpawnType.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE, () -> {GolemSensor.golemDetected(this);}).isPresent()) { // CraftBukkit // Paper - Set Golem Last Seen to stop it from spawning another one
|
+ if (SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, EntitySpawnReason.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE, () -> {GolemSensor.golemDetected(this);}).isPresent()) { // CraftBukkit // Paper - Set Golem Last Seen to stop it from spawning another one
|
||||||
list.forEach(GolemSensor::golemDetected);
|
list.forEach(GolemSensor::golemDetected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
|
--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
|
||||||
+++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
|
+++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
|
@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
|
||||||
} else if (!SpawnPlacements.checkSpawnRules((EntityType) optional.get(), world, MobSpawnType.SPAWNER, blockposition1, world.getRandom())) {
|
} else if (!SpawnPlacements.checkSpawnRules((EntityType) optional.get(), world, EntitySpawnReason.SPAWNER, blockposition1, world.getRandom())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
+ // Paper start - PreCreatureSpawnEvent
|
+ // Paper start - PreCreatureSpawnEvent
|
||||||
|
@ -111,7 +111,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end - PreCreatureSpawnEvent
|
+ // Paper end - PreCreatureSpawnEvent
|
||||||
|
|
||||||
Entity entity = EntityType.loadEntityRecursive(nbttagcompound, world, (entity1) -> {
|
Entity entity = EntityType.loadEntityRecursive(nbttagcompound, world, EntitySpawnReason.SPAWNER, (entity1) -> {
|
||||||
entity1.moveTo(d0, d1, d2, entity1.getYRot(), entity1.getXRot());
|
entity1.moveTo(d0, d1, d2, entity1.getYRot(), entity1.getXRot());
|
||||||
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
@ -148,7 +148,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ // Paper end - PreCreatureSpawnEvent
|
+ // Paper end - PreCreatureSpawnEvent
|
||||||
EntityType<?> entitytypes = spawnEntry.type;
|
EntityType<?> entitytypes = spawnEntry.type;
|
||||||
|
|
||||||
- return entitytypes.getCategory() == MobCategory.MISC ? false : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? false : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? false : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? false : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)))) : false));
|
- return entitytypes.getCategory() == MobCategory.MISC ? false : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? false : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? false : (!SpawnPlacements.checkSpawnRules(entitytypes, world, EntitySpawnReason.NATURAL, pos, world.random) ? false : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)))) : false));
|
||||||
+ // Paper start - PreCreatureSpawnEvent
|
+ // Paper start - PreCreatureSpawnEvent
|
||||||
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
|
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
|
||||||
+ io.papermc.paper.util.MCUtil.toLocation(world, pos),
|
+ io.papermc.paper.util.MCUtil.toLocation(world, pos),
|
||||||
|
@ -162,7 +162,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
+ }
|
+ }
|
||||||
+ // Paper end - PreCreatureSpawnEvent
|
+ // Paper end - PreCreatureSpawnEvent
|
||||||
+
|
+
|
||||||
+ return entitytypes.getCategory() == MobCategory.MISC ? PreSpawnStatus.FAIL : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? PreSpawnStatus.FAIL : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? PreSpawnStatus.FAIL : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? PreSpawnStatus.FAIL : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)) ? PreSpawnStatus.SUCCESS : PreSpawnStatus.FAIL)) : PreSpawnStatus.FAIL)); // Paper - PreCreatureSpawnEvent
|
+ return entitytypes.getCategory() == MobCategory.MISC ? PreSpawnStatus.FAIL : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? PreSpawnStatus.FAIL : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? PreSpawnStatus.FAIL : (!SpawnPlacements.checkSpawnRules(entitytypes, world, EntitySpawnReason.NATURAL, pos, world.random) ? PreSpawnStatus.FAIL : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)) ? PreSpawnStatus.SUCCESS : PreSpawnStatus.FAIL)) : PreSpawnStatus.FAIL)); // Paper - PreCreatureSpawnEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
|
@ -40,7 +40,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
@@ -0,0 +0,0 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
|
@@ -0,0 +0,0 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
|
||||||
|
|
||||||
protected void keepConnectionAlive() {
|
protected void keepConnectionAlive() {
|
||||||
this.server.getProfiler().push("keepAlive");
|
Profiler.get().push("keepAlive");
|
||||||
- long i = Util.getMillis();
|
- long i = Util.getMillis();
|
||||||
+ // Paper start - give clients a longer time to respond to pings as per pre 1.12.2 timings
|
+ // Paper start - give clients a longer time to respond to pings as per pre 1.12.2 timings
|
||||||
+ // This should effectively place the keepalive handling back to "as it was" before 1.12.2
|
+ // This should effectively place the keepalive handling back to "as it was" before 1.12.2
|
||||||
|
@ -64,5 +64,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||||
}
|
}
|
||||||
+ // Paper end - give clients a longer time to respond to pings as per pre 1.12.2 timings
|
+ // Paper end - give clients a longer time to respond to pings as per pre 1.12.2 timings
|
||||||
|
|
||||||
this.server.getProfiler().pop();
|
Profiler.get().pop();
|
||||||
}
|
}
|
|
@ -1,46 +0,0 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Aikar <aikar@aikar.co>
|
|
||||||
Date: Mon, 30 Apr 2018 17:15:26 -0400
|
|
||||||
Subject: [PATCH] Block Enderpearl Travel Exploit
|
|
||||||
|
|
||||||
Players are able to use alt accounts and enderpearls to travel
|
|
||||||
long distances utilizing the pearls in unloaded chunks and loading
|
|
||||||
the chunk later when convenient.
|
|
||||||
|
|
||||||
This disables that by not saving the thrower when the chunk is unloaded.
|
|
||||||
|
|
||||||
This is mainly useful for survival servers that do not allow freeform teleporting.
|
|
||||||
|
|
||||||
== AT ==
|
|
||||||
public net.minecraft.world.entity.projectile.Projectile cachedOwner
|
|
||||||
public net.minecraft.world.entity.projectile.Projectile ownerUUID
|
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
||||||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
||||||
@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
|
||||||
|
|
||||||
public void onTickingEnd(Entity entity) {
|
|
||||||
ServerLevel.this.entityTickList.remove(entity);
|
|
||||||
+ // Paper start - Reset pearls when they stop being ticked
|
|
||||||
+ if (paperConfig().fixes.disableUnloadedChunkEnderpearlExploit && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) {
|
|
||||||
+ pearl.cachedOwner = null;
|
|
||||||
+ pearl.ownerUUID = null;
|
|
||||||
+ }
|
|
||||||
+ // Paper end - Reset pearls when they stop being ticked
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onTrackingStart(Entity entity) {
|
|
||||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|
||||||
@@ -0,0 +0,0 @@ public abstract class Projectile extends Entity implements TraceableEntity {
|
|
||||||
if (nbt.hasUUID("Owner")) {
|
|
||||||
this.ownerUUID = nbt.getUUID("Owner");
|
|
||||||
this.cachedOwner = null;
|
|
||||||
+ if (this instanceof ThrownEnderpearl && this.level() != null && this.level().paperConfig().fixes.disableUnloadedChunkEnderpearlExploit) { this.ownerUUID = null; } // Paper - Reset pearls when they stop being ticked; Don't store shooter name for pearls to block enderpearl travel exploit
|
|
||||||
}
|
|
||||||
|
|
||||||
this.leftOwner = nbt.getBoolean("LeftOwner");
|
|
Loading…
Add table
Reference in a new issue