89d51d5f29
Because this exploit has been widely known for years and has not been fixed by Mojang, we decided that it was worth allowing people to toggle it on/off due to how easy it is to make it configurable. It should be noted that this decision does not promise all future exploits will be configurable.
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 d7548eb7cd6986dcea6fbf4efb76b647cc350642..a87fcd5b837e1c824cbd5587c3350986e2fd7acb 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
@@ -504,9 +504,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 ItemEntity 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);
|
|
|
|
@@ -519,8 +525,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
|