mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-19 09:27:43 +01:00
102 lines
5.6 KiB
Diff
102 lines
5.6 KiB
Diff
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 342eaa0e3b053e9b39dc58fa92cd18cac446a844..06f7bc4d8d6679d6625a8d392777722fc97739ba 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
@@ -77,6 +77,7 @@ public abstract class AbstractArrow extends Projectile {
|
|
@Nullable
|
|
private List<Entity> piercedAndKilledEntities;
|
|
public ItemStack pickupItemStack;
|
|
+ public int lootingLevel; // Purpur
|
|
|
|
// Spigot Start
|
|
@Override
|
|
@@ -655,6 +656,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/ProjectileWeaponItem.java b/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java
|
|
index d27e83c08c45b8514207f26e48ceb1a91ded94be..8f01772a7b06b2acf96a3f922cb9b481f634680b 100644
|
|
--- a/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java
|
|
+++ b/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java
|
|
@@ -131,6 +131,14 @@ public abstract class ProjectileWeaponItem extends Item {
|
|
entityarrow.setPierceLevel((byte) k);
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ int lootingLevel = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.LOOTING, weaponStack);
|
|
+
|
|
+ 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 85dc79b9b969fa0cbf6964cb26bac139fa55710a..905a020dd7b365d51d5addadbbeb9555d03c5238 100644
|
|
--- a/src/main/java/net/minecraft/world/item/TridentItem.java
|
|
+++ b/src/main/java/net/minecraft/world/item/TridentItem.java
|
|
@@ -81,6 +81,14 @@ public class TridentItem extends Item implements ProjectileItem {
|
|
entitythrowntrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY;
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ int lootingLevel = EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.LOOTING, stack);
|
|
+
|
|
+ if (lootingLevel > 0) {
|
|
+ entitythrowntrident.setLootingLevel(lootingLevel);
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
// CraftBukkit start
|
|
// Paper start - PlayerLaunchProjectileEvent
|
|
com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), (org.bukkit.entity.Projectile) entitythrowntrident.getBukkitEntity());
|
|
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 cfe953bc924f46b570e37395ac0f05ebcb82eb39..5500e7ada2dd783cc1317968a3e54696bdd73bf8 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
|
|
@@ -57,6 +57,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 62612451c23bb146e82f4082ca8677e5dc57a08f..3b3d5bd9e645f440e033abd3c234a017972efa59 100644
|
|
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
@@ -497,4 +497,9 @@ public class PurpurConfig {
|
|
String setPattern = getString("settings.username-valid-characters", defaultPattern);
|
|
usernameValidCharactersPattern = java.util.regex.Pattern.compile(setPattern == null || setPattern.isBlank() ? defaultPattern : setPattern);
|
|
}
|
|
+
|
|
+ public static boolean fixProjectileLootingTransfer = false;
|
|
+ private static void fixProjectileLootingTransfer() {
|
|
+ fixProjectileLootingTransfer = getBoolean("settings.fix-projectile-looting-transfer", fixProjectileLootingTransfer);
|
|
+ }
|
|
}
|