From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: BillyGalbreath 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 generateDefaultDrops() { + default java.util.List 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 drops = this.generateDefaultDrops(); + java.util.List 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 generateDefaultDrops() { + public java.util.List generateDefaultDrops(int looting) { // Purpur java.util.List 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 drops = this.generateDefaultDrops(); + java.util.List 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 generateDefaultDrops() { + public java.util.List generateDefaultDrops(int looting) { // Purpur int count = 1 + this.random.nextInt(3); + if (org.purpurmc.purpur.PurpurConfig.allowShearsLooting) count += looting; // Purpur java.util.List 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 drops = this.generateDefaultDrops(); + java.util.List 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 generateDefaultDrops() { + // Purpur start + public java.util.List generateDefaultDrops(int looting) { + if (org.purpurmc.purpur.PurpurConfig.allowShearsLooting) { + java.util.ArrayList 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 drops = generateDefaultDrops(); + java.util.List 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 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 stackConsumer) { + private void generateShearedMushrooms(java.util.function.Consumer 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 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 generateDefaultDrops() { + public java.util.List generateDefaultDrops(int looting) { // Purpur final java.util.List 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 7ad309e81ec61a6f2553e9ffeb9a986f4d569b37..3d5c89238ee3fbd3c9b33107995ae47733539960 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 = false; public static boolean allowIncompatibleEnchants = false; public static boolean allowHigherEnchantsLevels = false; @@ -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);