Files
Purpur/patches/server/0233-Shears-can-have-looting-enchantment.patch
granny 04ee5e7c28 Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@4fdda9e Keep newlines in outdated client/server message (#10042)
PaperMC/Paper@f483b38 fix NPE on EntityTeleportEvent getTo (#10016)
PaperMC/Paper@dc62150 Catch async usage of playsound (#10021)
PaperMC/Paper@0d6a0c3 Fix command block async message (again) (#10082)
PaperMC/Paper@d1f507f Don't fire 2 game events for certain cauldron interactions (#8904)
PaperMC/Paper@a401585 Fix campfire recipes not always outputting full result (#8754)
PaperMC/Paper@88d28d6 Fix long loading screen when refreshing skins (#10026)
PaperMC/Paper@c081104 Add experience points api (#9688)
PaperMC/Paper@8221b08 Fix global sound event gamerule not being respected (#8727)
PaperMC/Paper@3c0d6aa Updated Upstream (Bukkit/CraftBukkit/Spigot) (#10085)
PaperMC/Paper@2c3ccb8 Add drops to shear events (#5678)
PaperMC/Paper@b2ffb1b Add PlayerShieldDisableEvent (#9177)
PaperMC/Paper@2951732 Add HiddenPotionEffect API (#9910)
PaperMC/Paper@e4ab50d Properly disallow async Player#chat (#8123)
PaperMC/Paper@5e978d3 Fix Folia scheduler tasks not canceling when plugin disable (#10091)
2023-12-29 04:40:59 -08:00

198 lines
13 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@Gmail.com>
Date: Mon, 3 Jan 2022 00:06:51 -0600
Subject: [PATCH] Shears can have looting enchantment
diff --git a/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java
index ec43e8294d7e7112478a2fc1475f0852690a4882..2f1bd058543af6a7a0b3d94ab0fc9627b4e0da49 100644
--- a/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java
+++ b/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java
@@ -104,7 +104,7 @@ public class ShearsDispenseItemBehavior extends OptionalDispenseItemBehavior {
if (ishearable.readyForShearing()) {
// CraftBukkit start
// Paper start
- org.bukkit.event.block.BlockShearEntityEvent event = CraftEventFactory.callBlockShearEntityEvent(entityliving, bukkitBlock, craftItem, ishearable.generateDefaultDrops());
+ org.bukkit.event.block.BlockShearEntityEvent event = CraftEventFactory.callBlockShearEntityEvent(entityliving, bukkitBlock, craftItem, ishearable.generateDefaultDrops(net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.MOB_LOOTING, CraftItemStack.asNMSCopy(craftItem))));
if (event.isCancelled()) {
// Paper end
continue;
diff --git a/src/main/java/net/minecraft/world/entity/Shearable.java b/src/main/java/net/minecraft/world/entity/Shearable.java
index 4921d1b2ff9112374477c5c9b4a68cc75a51dbf8..40716d46a2d9c1b3b13e92995e6441d83bdd2396 100644
--- a/src/main/java/net/minecraft/world/entity/Shearable.java
+++ b/src/main/java/net/minecraft/world/entity/Shearable.java
@@ -8,7 +8,7 @@ public interface Shearable {
boolean readyForShearing();
// Paper start - ensure all implementing entities override this
- default java.util.List<net.minecraft.world.item.ItemStack> generateDefaultDrops() {
+ default java.util.List<net.minecraft.world.item.ItemStack> generateDefaultDrops(int looting) {
return java.util.Collections.emptyList();
}
// Paper end
diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
index 5d75e715a2edac73350cd74e2a5184e7fccbad53..9ac87800d1d15ae3431caaf4e86d4fe10e105972 100644
--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
@@ -160,7 +160,7 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder<Mushroo
} else if (itemstack.is(Items.SHEARS) && this.readyForShearing()) {
// CraftBukkit start
// Paper start - custom shear drops
- List<ItemStack> drops = this.generateDefaultDrops();
+ List<ItemStack> drops = this.generateDefaultDrops(net.minecraft.world.item.enchantment.EnchantmentHelper.getMobLooting(player));
org.bukkit.event.player.PlayerShearEntityEvent event = CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops);
if (event != null) {
if (event.isCancelled()) {
@@ -212,13 +212,13 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder<Mushroo
@Override
public void shear(SoundSource shearedSoundCategory) {
// Paper start - custom shear drops
- this.shear(shearedSoundCategory, this.generateDefaultDrops());
+ this.shear(shearedSoundCategory, this.generateDefaultDrops(0)); // Purpur
}
@Override
- public List<ItemStack> generateDefaultDrops() {
+ public List<ItemStack> generateDefaultDrops(int looting) { // Purpur
List<ItemStack> dropEntities = new java.util.ArrayList<>(5);
- for (int i = 0; i < 5; ++i) {
+ for (int i = 0; i < 5 + (org.purpurmc.purpur.PurpurConfig.allowShearsLooting ? looting : 0); ++i) {
dropEntities.add(new ItemStack(this.getVariant().getBlockState().getBlock()));
}
return dropEntities;
diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java
index 4d28cb60f8fa816205699a66a7667358e13c6a01..e2f29a1bf72e4a8785397318f159aae8059ac4ed 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java
@@ -292,7 +292,7 @@ public class Sheep extends Animal implements Shearable {
if (!this.level().isClientSide && this.readyForShearing()) {
// CraftBukkit start
// Paper start - custom shear drops
- java.util.List<ItemStack> drops = this.generateDefaultDrops();
+ java.util.List<ItemStack> drops = this.generateDefaultDrops(net.minecraft.world.item.enchantment.EnchantmentHelper.getMobLooting(player));
org.bukkit.event.player.PlayerShearEntityEvent event = CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops);
if (event != null) {
if (event.isCancelled()) {
@@ -319,12 +319,13 @@ public class Sheep extends Animal implements Shearable {
@Override
public void shear(SoundSource shearedSoundCategory) {
// Paper start - custom shear drops
- this.shear(shearedSoundCategory, this.generateDefaultDrops());
+ this.shear(shearedSoundCategory, this.generateDefaultDrops(0));
}
@Override
- public java.util.List<ItemStack> generateDefaultDrops() {
+ public java.util.List<ItemStack> generateDefaultDrops(int looting) {
int count = 1 + this.random.nextInt(3);
+ if (org.purpurmc.purpur.PurpurConfig.allowShearsLooting) count += looting; // Purpur
java.util.List<ItemStack> dropEntities = new java.util.ArrayList<>(count);
for (int j = 0; j < count; ++j) {
dropEntities.add(new ItemStack(Sheep.ITEM_BY_DYE.get(this.level().purpurConfig.sheepShearJebRandomColor && hasCustomName() && getCustomName().getString().equals("jeb_") ? DyeColor.random(this.level().random) : this.getColor())));
diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java
index 8a0327a870a22def6538bb56df2f2fd384449928..58e101a3963be08c21e6d8c80731d45c0883be8d 100644
--- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java
+++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java
@@ -196,7 +196,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM
if (itemstack.is(Items.SHEARS) && this.readyForShearing()) {
// CraftBukkit start
// Paper start - custom shear drops
- java.util.List<ItemStack> drops = this.generateDefaultDrops();
+ java.util.List<ItemStack> drops = this.generateDefaultDrops(net.minecraft.world.item.enchantment.EnchantmentHelper.getMobLooting(player));
org.bukkit.event.player.PlayerShearEntityEvent event = CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops);
if (event != null) {
if (event.isCancelled()) {
@@ -231,15 +231,22 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM
@Override
public void shear(SoundSource shearedSoundCategory) {
// Paper start - custom shear drops
- this.shear(shearedSoundCategory, this.generateDefaultDrops());
+ this.shear(shearedSoundCategory, this.generateDefaultDrops(0));
}
@Override
- public java.util.List<ItemStack> generateDefaultDrops() {
+ public java.util.List<ItemStack> generateDefaultDrops(int looting) { // Purpur
// Purpur start
if (!level().purpurConfig.snowGolemDropsPumpkin) {
return Shearable.super.generateDefaultDrops(0);
}
+ if (org.purpurmc.purpur.PurpurConfig.allowShearsLooting) {
+ java.util.ArrayList<ItemStack> list = new java.util.ArrayList<>();
+ for (int i = 0; i < 1 + looting; i++) {
+ list.add(new ItemStack(Items.CARVED_PUMPKIN));
+ }
+ return java.util.Collections.unmodifiableList(list);
+ }
// Purpur end
return java.util.Collections.singletonList(new ItemStack(Items.CARVED_PUMPKIN));
}
diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java
index 859435f747ceef860cb4e9e825a7353ea3b90798..fc2c35f57436371cb0111aedfd289ac95d506d07 100644
--- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java
+++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentCategory.java
@@ -128,6 +128,12 @@ public enum EnchantmentCategory {
public boolean canEnchant(Item item) {
return item instanceof BowItem || item instanceof CrossbowItem;
}
+ },
+ WEAPON_AND_SHEARS {
+ @Override
+ public boolean canEnchant(Item item) {
+ return WEAPON.canEnchant(item) || item instanceof net.minecraft.world.item.ShearsItem;
+ }
// Purpur end
};
diff --git a/src/main/java/net/minecraft/world/item/enchantment/LootBonusEnchantment.java b/src/main/java/net/minecraft/world/item/enchantment/LootBonusEnchantment.java
index 7f1ffc0ac402fcf0ec086986e959ecc9f78dde03..1351d52374d1c2367932e5ecd5f4637955fb14c9 100644
--- a/src/main/java/net/minecraft/world/item/enchantment/LootBonusEnchantment.java
+++ b/src/main/java/net/minecraft/world/item/enchantment/LootBonusEnchantment.java
@@ -7,6 +7,14 @@ public class LootBonusEnchantment extends Enchantment {
super(rarity, target, slotTypes);
}
+ // Purpur start
+ @Override
+ public boolean canEnchant(net.minecraft.world.item.ItemStack stack) {
+ // we have to cheat the system because this class is loaded before purpur's config is loaded
+ return (org.purpurmc.purpur.PurpurConfig.allowShearsLooting && this.category == EnchantmentCategory.WEAPON ? EnchantmentCategory.WEAPON_AND_SHEARS : this.category).canEnchant(stack.getItem());
+ }
+ // Purpur end
+
@Override
public int getMinCost(int level) {
return 15 + (level - 1) * 9;
diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
index f81faaf6d69b09f635d71491303fca1d494001c5..f782e8dd9d3456f345859dffd69e5830d576ccd1 100644
--- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
+++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
@@ -81,6 +81,7 @@ public class CraftEnchantment extends Enchantment {
case CROSSBOW -> EnchantmentTarget.CROSSBOW;
case VANISHABLE -> EnchantmentTarget.VANISHABLE;
case BOW_AND_CROSSBOW -> EnchantmentTarget.BOW_AND_CROSSBOW; // Purpur
+ case WEAPON_AND_SHEARS -> EnchantmentTarget.WEAPON_AND_SHEARS; // Purpur
};
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
index e24cd4274bfe7d8694a91f74a2f4674befb13bd6..ffff69021335ca52d10a07bb3b3f272eea6ebcb5 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
@@ -391,6 +391,7 @@ public class PurpurConfig {
public static boolean allowInfinityMending = false;
public static boolean allowCrossbowInfinity = false;
+ public static boolean allowShearsLooting = false;
public static boolean allowUnsafeEnchants = false;
public static boolean allowInapplicableEnchants = true;
public static boolean allowIncompatibleEnchants = true;
@@ -413,6 +414,7 @@ public class PurpurConfig {
}
allowInfinityMending = getBoolean("settings.enchantment.allow-infinity-and-mending-together", allowInfinityMending);
allowCrossbowInfinity = getBoolean("settings.enchantment.allow-infinity-on-crossbow", allowCrossbowInfinity);
+ allowShearsLooting = getBoolean("settings.enchantment.allow-looting-on-shears", allowShearsLooting);
allowUnsafeEnchants = getBoolean("settings.enchantment.anvil.allow-unsafe-enchants", allowUnsafeEnchants);
allowInapplicableEnchants = getBoolean("settings.enchantment.anvil.allow-inapplicable-enchants", allowInapplicableEnchants);
allowIncompatibleEnchants = getBoolean("settings.enchantment.anvil.allow-incompatible-enchants", allowIncompatibleEnchants);