geforkt von Mirrors/Paper
aa52bf9e33
Mojang made some changes to priorities in 1.17 and it seems that these changes conflict with the changes made in this patch, which in some cases appears to cause excessive rescheduling of tasks. This, however, is not confirmed as such but seems to be the behavior that we're seeing to cause this issue, if mojang has adopted the changes we suggested, then a good chunk of this patch may be unneeded, but, this needs a much better look than I'm currently able to do
47 Zeilen
3.5 KiB
Diff
47 Zeilen
3.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Toon Schoenmakers <nighteyes1993@gmail.com>
|
|
Date: Fri, 23 Oct 2020 15:01:44 +0200
|
|
Subject: [PATCH] Avoid error bubbling up when item stack is empty in fishing
|
|
loot
|
|
|
|
This can realistically only happen if there's custom loot active on fishing
|
|
which can return 0 items. This would disconnect the player who's fishing.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
index 0258d0699afe7ceec19154c669b10298e6e1bf95..852a4edde291bf368b2396e3c94ab402e3c66622 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
@@ -497,9 +497,15 @@ public class FishingHook extends Projectile {
|
|
|
|
while (iterator.hasNext()) {
|
|
ItemStack itemstack1 = (ItemStack) iterator.next();
|
|
- ItemEntity entityitem = new ItemEntity(this.level, this.getX(), this.getY(), this.getZ(), itemstack1);
|
|
+ // Paper start, new EntityItem would throw if for whatever reason (mostly shitty datapacks) the itemstack1 turns out to be empty
|
|
+ // if the item stack is empty we instead just have our entityitem as null
|
|
+ ItemEntity entityitem = null;
|
|
+ if (!itemstack1.isEmpty()) {
|
|
+ entityitem = new ItemEntity(this.level, this.getX(), this.getY(), this.getZ(), itemstack1);
|
|
+ }
|
|
+ // Paper end
|
|
// CraftBukkit start
|
|
- PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) entityhuman.getBukkitEntity(), entityitem.getBukkitEntity(), (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH);
|
|
+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) entityhuman.getBukkitEntity(), entityitem != null ? entityitem.getBukkitEntity() : null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); // Paper - entityitem may be null
|
|
playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1);
|
|
this.level.getCraftServer().getPluginManager().callEvent(playerFishEvent);
|
|
|
|
@@ -512,8 +518,12 @@ public class FishingHook extends Projectile {
|
|
double d2 = entityhuman.getZ() - this.getZ();
|
|
double d3 = 0.1D;
|
|
|
|
- entityitem.setDeltaMovement(d0 * 0.1D, d1 * 0.1D + Math.sqrt(Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2)) * 0.08D, d2 * 0.1D);
|
|
- this.level.addFreshEntity(entityitem);
|
|
+ // Paper start, entity item can be null, so we need to check against this
|
|
+ if (entityitem != null) {
|
|
+ entityitem.setDeltaMovement(d0 * 0.1D, d1 * 0.1D + Math.sqrt(Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2)) * 0.08D, d2 * 0.1D);
|
|
+ this.level.addFreshEntity(entityitem);
|
|
+ }
|
|
+ // Paper end
|
|
// CraftBukkit start - this.random.nextInt(6) + 1 -> playerFishEvent.getExpToDrop()
|
|
if (playerFishEvent.getExpToDrop() > 0) {
|
|
entityhuman.level.addFreshEntity(new ExperienceOrb(entityhuman.level, entityhuman.getX(), entityhuman.getY() + 0.5D, entityhuman.getZ() + 0.5D, playerFishEvent.getExpToDrop(), org.bukkit.entity.ExperienceOrb.SpawnReason.FISHING, this.getPlayerOwner(), this)); // Paper
|