Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MelnCat <melncatuwu@gmail.com>
Date: Sat, 1 Oct 2022 11:33:15 -0700
Subject: [PATCH] Add an option to fix MC-3304 (projectile looting)


diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
index e292589e015c6691be65285b041f5b4f0d0afeb1..4c6b015532a033ec3d11a96e5758d9dcaad8827c 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
@@ -71,6 +71,7 @@ public abstract class AbstractArrow extends Projectile {
private IntOpenHashSet piercingIgnoreEntityIds;
@Nullable
private List<Entity> piercedAndKilledEntities;
+ public int lootingLevel; // Purpur

// Spigot Start
@Override
@@ -622,6 +623,12 @@ public abstract class AbstractArrow extends Projectile {
this.knockback = punch;
}

+ // Purpur start
+ public void setLootingLevel(int looting) {
+ this.lootingLevel = looting;
+ }
+ // Purpur end
+
public int getKnockback() {
return this.knockback;
}
diff --git a/src/main/java/net/minecraft/world/item/BowItem.java b/src/main/java/net/minecraft/world/item/BowItem.java
index 220513d3fd5645322886522ea4f6b8c55d043b3c..d45a2f49c82d00801578c34e5f5277fc5e82be87 100644
--- a/src/main/java/net/minecraft/world/item/BowItem.java
+++ b/src/main/java/net/minecraft/world/item/BowItem.java
@@ -64,6 +64,13 @@ public class BowItem extends ProjectileWeaponItem implements Vanishable {
if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.FLAMING_ARROWS, stack) > 0) {
entityarrow.setSecondsOnFire(100);
}
+ // Purpur start
+ int lootingLevel = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.MOB_LOOTING, stack);
+
+ if (lootingLevel > 0) {
+ entityarrow.setLootingLevel(lootingLevel);
+ }
+ // Purpur end
// CraftBukkit start
org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, stack, itemstack1, entityarrow, entityhuman.getUsedItemHand(), f, !flag1);
if (event.isCancelled()) {
diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java
index 2d30300de78de957358cfddac12294b308062e2a..37cbd0d95f3232ed399c6ef19f714c547b9fd8e5 100644
--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java
+++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java
@@ -294,6 +294,14 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable {
entityarrow.setPierceLevel((byte) i);
}

+ // Purpur start
+ int lootingLevel = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.MOB_LOOTING, crossbow);
+
+ if (lootingLevel > 0) {
+ entityarrow.setLootingLevel(lootingLevel);
+ }
+ // Purpur end
+
return entityarrow;
}

diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java
index 086f746cc632a90c67a6c30ea9197c5bb5485b22..ccf1ae6d7b8bf1177526c95a62814f507221da58 100644
--- a/src/main/java/net/minecraft/world/item/TridentItem.java
+++ b/src/main/java/net/minecraft/world/item/TridentItem.java
@@ -82,6 +82,14 @@ public class TridentItem extends Item implements Vanishable {
entitythrowntrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY;
}

+ // Purpur start
+ int lootingLevel = EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.MOB_LOOTING, stack);
+
+ if (lootingLevel > 0) {
+ entitythrowntrident.setLootingLevel(lootingLevel);
+ }
+ // Purpur end
+
// CraftBukkit start
if (!world.addFreshEntity(entitythrowntrident)) {
if (entityhuman instanceof net.minecraft.server.level.ServerPlayer) {
diff --git a/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java b/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java
index 31918fa2eb38e42a5ea5366e559f25ea9d7d59ae..15d8e9261a89da30529ac347462c520920ca4e7d 100644
--- a/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java
+++ b/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java
@@ -49,6 +49,13 @@ public class LootingEnchantFunction extends LootItemConditionalFunction {

if (entity instanceof LivingEntity) {
int i = EnchantmentHelper.getMobLooting((LivingEntity) entity);
+ // Purpur start
+ if (org.purpurmc.purpur.PurpurConfig.fixProjectileLootingTransfer &&
+ context.getParamOrNull(LootContextParams.DIRECT_KILLER_ENTITY)
+ instanceof net.minecraft.world.entity.projectile.AbstractArrow arrow) {
+ i = arrow.lootingLevel;
+ }
+ // Purpur end
// CraftBukkit start - use lootingModifier if set by plugin
if (context.hasParam(LootContextParams.LOOTING_MOD)) {
i = context.getParamOrNull(LootContextParams.LOOTING_MOD);
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
index 8d12ba33da62b58f6390a812fd025ede6032ed88..7efdb3d71c065435dc365207bfc42a82ec36a8b1 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
@@ -566,4 +566,9 @@ public class PurpurConfig {
}
});
}
+
+ public static boolean fixProjectileLootingTransfer = false;
+ private static void fixProjectileLootingTransfer() {
+ fixProjectileLootingTransfer = getBoolean("settings.fix-projectile-looting-transfer", fixProjectileLootingTransfer);
+ }
}