mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-21 10:27:44 +01:00
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)
198 lines
13 KiB
Diff
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);
|