mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
216 lines
14 KiB
Diff
216 lines
14 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 44b79a7c2f8b95a484d1999fa2167ce588f7985b..68632372c8704058f35f12e0ae6cdd98ebd55937 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 - Add drops to shear events
|
|
- 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.LOOTING, CraftItemStack.asNMSCopy(craftItem)))); // Purpur
|
|
if (event.isCancelled()) {
|
|
// Paper end - Add drops to shear events
|
|
continue;
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Shearable.java b/src/main/java/net/minecraft/world/entity/Shearable.java
|
|
index 2ee48ac3b665db2b02bcb1a30ec972d43a3725b0..59e8f5431ce5026209e1428b5fa5b5485dcfebc7 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 - custom shear drops; 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) { // Purpur
|
|
return java.util.Collections.emptyList();
|
|
}
|
|
// Paper end - custom shear drops
|
|
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 06fac8dae42451f912c2db14d792461cee3dba83..e5a84dd5f1a375dd44b9d14dc7f44339bd8ddf3a 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
|
|
@@ -161,7 +161,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
|
|
- java.util.List<ItemStack> drops = this.generateDefaultDrops();
|
|
+ java.util.List<ItemStack> drops = this.generateDefaultDrops(net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.LOOTING, itemstack)); // Purpur
|
|
org.bukkit.event.player.PlayerShearEntityEvent event = CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops);
|
|
if (event != null) {
|
|
if (event.isCancelled()) {
|
|
@@ -209,13 +209,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 java.util.List<ItemStack> generateDefaultDrops() {
|
|
+ public java.util.List<ItemStack> generateDefaultDrops(int looting) { // Purpur
|
|
java.util.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) { // Purpur
|
|
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 ca63c98bc45584812c0fb2af84a63aa08daa9a9e..17b49186293578c06144a476473324a9a1f6fcbb 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java
|
|
@@ -296,7 +296,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.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.LOOTING, itemstack)); // Purpur
|
|
org.bukkit.event.player.PlayerShearEntityEvent event = CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops);
|
|
if (event != null) {
|
|
if (event.isCancelled()) {
|
|
@@ -321,12 +321,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)); // Purpur
|
|
}
|
|
|
|
@Override
|
|
- public java.util.List<ItemStack> generateDefaultDrops() {
|
|
+ public java.util.List<ItemStack> generateDefaultDrops(int looting) { // Purpur
|
|
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.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 b3bb0d55da0278d4981830f7073bb326bc836215..7bd2d2b9bb1275fa8e4bdc6d498a59e47838930f 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java
|
|
@@ -190,7 +190,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.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.LOOTING, itemstack)); // Purpur
|
|
org.bukkit.event.player.PlayerShearEntityEvent event = CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops);
|
|
if (event != null) {
|
|
if (event.isCancelled()) {
|
|
@@ -223,11 +223,20 @@ 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)); // Purpur
|
|
}
|
|
|
|
@Override
|
|
- public java.util.List<ItemStack> generateDefaultDrops() {
|
|
+ // Purpur start
|
|
+ public java.util.List<ItemStack> generateDefaultDrops(int looting) {
|
|
+ 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/entity/monster/Bogged.java b/src/main/java/net/minecraft/world/entity/monster/Bogged.java
|
|
index 71efea7a6bfb5662890dae5faae27a3c80afad2b..f3aae2c50d05a05ad4aef36d432b87b431ba07e8 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/Bogged.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/Bogged.java
|
|
@@ -104,7 +104,7 @@ public class Bogged extends AbstractSkeleton implements Shearable {
|
|
if (itemstack.is(Items.SHEARS) && this.readyForShearing()) {
|
|
// CraftBukkit start
|
|
// Paper start - expose drops in event
|
|
- java.util.List<net.minecraft.world.item.ItemStack> drops = generateDefaultDrops();
|
|
+ java.util.List<net.minecraft.world.item.ItemStack> drops = generateDefaultDrops(net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.LOOTING, itemstack)); // Purpur
|
|
final org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops);
|
|
if (event != null) {
|
|
if (event.isCancelled()) {
|
|
@@ -171,7 +171,7 @@ public class Bogged extends AbstractSkeleton implements Shearable {
|
|
@Override
|
|
public void shear(SoundSource shearedSoundCategory) {
|
|
// Paper start - shear drop API
|
|
- this.shear(shearedSoundCategory, generateDefaultDrops());
|
|
+ this.shear(shearedSoundCategory, generateDefaultDrops(0)); // Purpur
|
|
}
|
|
|
|
@Override
|
|
@@ -184,7 +184,7 @@ public class Bogged extends AbstractSkeleton implements Shearable {
|
|
|
|
private void spawnShearedMushrooms() {
|
|
// Paper start - shear drops API
|
|
- this.spawnDrops(generateDefaultDrops()); // Only here for people calling spawnSheardMushrooms. Not used otherwise.
|
|
+ this.spawnDrops(generateDefaultDrops(0)); // Only here for people calling spawnSheardMushrooms. Not used otherwise. // Purpur
|
|
}
|
|
private void spawnDrops(java.util.List<net.minecraft.world.item.ItemStack> drops) {
|
|
drops.forEach(stack -> {
|
|
@@ -193,14 +193,22 @@ public class Bogged extends AbstractSkeleton implements Shearable {
|
|
this.forceDrops = false;
|
|
});
|
|
}
|
|
- private void generateShearedMushrooms(java.util.function.Consumer<ItemStack> stackConsumer) {
|
|
+ private void generateShearedMushrooms(java.util.function.Consumer<ItemStack> stackConsumer, int looting) { // Purpur
|
|
// Paper end - shear drops API
|
|
Level world = this.level();
|
|
|
|
if (world instanceof ServerLevel worldserver) {
|
|
LootTable loottable = worldserver.getServer().reloadableRegistries().getLootTable(BuiltInLootTables.BOGGED_SHEAR);
|
|
LootParams lootparams = (new LootParams.Builder(worldserver)).withParameter(LootContextParams.ORIGIN, this.position()).withParameter(LootContextParams.THIS_ENTITY, this).create(LootContextParamSets.SHEARING);
|
|
- ObjectListIterator objectlistiterator = loottable.getRandomItems(lootparams).iterator();
|
|
+ // Purpur start
|
|
+ it.unimi.dsi.fastutil.objects.ObjectArrayList<ItemStack> randomItemsList = loottable.getRandomItems(lootparams);
|
|
+ if (org.purpurmc.purpur.PurpurConfig.allowShearsLooting && looting > 0) {
|
|
+ for (int i = 0; i < looting; i++) {
|
|
+ randomItemsList.addAll(loottable.getRandomItems(lootparams));
|
|
+ }
|
|
+ }
|
|
+ ObjectListIterator objectlistiterator = randomItemsList.iterator();
|
|
+ // Purpur end
|
|
|
|
while (objectlistiterator.hasNext()) {
|
|
ItemStack itemstack = (ItemStack) objectlistiterator.next();
|
|
@@ -213,9 +221,9 @@ public class Bogged extends AbstractSkeleton implements Shearable {
|
|
|
|
// Paper start - shear drops API
|
|
@Override
|
|
- public java.util.List<ItemStack> generateDefaultDrops() {
|
|
+ public java.util.List<ItemStack> generateDefaultDrops(int looting) { // Purpur
|
|
final java.util.List<ItemStack> drops = new java.util.ArrayList<>();
|
|
- this.generateShearedMushrooms(drops::add);
|
|
+ this.generateShearedMushrooms(drops::add, looting); // Purpur
|
|
return drops;
|
|
}
|
|
// Paper end - shear drops API
|
|
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
index ccf4d068b4cd11ad666b01bba9cbed1d428e6af3..29b07c04c23772da1b29499e4db9c678ebbd2180 100644
|
|
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
@@ -393,6 +393,7 @@ public class PurpurConfig {
|
|
}
|
|
}
|
|
|
|
+ public static boolean allowShearsLooting = false;
|
|
public static boolean allowInapplicableEnchants = true;
|
|
public static boolean allowIncompatibleEnchants = true;
|
|
public static boolean allowHigherEnchantsLevels = true;
|
|
@@ -416,6 +417,7 @@ public class PurpurConfig {
|
|
}
|
|
set("settings.enchantment.anvil.allow-unsafe-enchants", null);
|
|
}
|
|
+ allowShearsLooting = getBoolean("settings.enchantment.allow-looting-on-shears", allowShearsLooting);
|
|
allowInapplicableEnchants = getBoolean("settings.enchantment.anvil.allow-inapplicable-enchants", allowInapplicableEnchants);
|
|
allowIncompatibleEnchants = getBoolean("settings.enchantment.anvil.allow-incompatible-enchants", allowIncompatibleEnchants);
|
|
allowHigherEnchantsLevels = getBoolean("settings.enchantment.anvil.allow-higher-enchants-levels", allowHigherEnchantsLevels);
|