Files
Purpur/purpur-server/minecraft-patches/features/0021-config-for-turning-bundles-into-functional-quivers.patch

182 lines
11 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: granny <granny@purpurmc.org>
Date: Mon, 16 Oct 2023 21:54:47 -0700
Subject: [PATCH] config for turning bundles into functional quivers
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
index 78e68335805270ff1f942fe28e0e833adb41fd85..bbc1a45b80d0ffc3d7567466716e8c8f86bdfac8 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
@@ -4753,6 +4753,11 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
}
public ItemStack getProjectile(ItemStack weaponStack) {
+ // Purpur start - config for turning bundles into functional quivers
+ return getProjectile(weaponStack, false);
+ }
+ public ItemStack getProjectile(ItemStack weaponStack, boolean useBundleItemStack) {
+ // Purpur end - config for turning bundles into functional quivers
return ItemStack.EMPTY;
}
diff --git a/net/minecraft/world/entity/monster/Monster.java b/net/minecraft/world/entity/monster/Monster.java
index 54033572e325f8486a438e31dde34f8407f9180a..0b947c3f9f45d5ff590e496bec4d43bd8b0c5c20 100644
--- a/net/minecraft/world/entity/monster/Monster.java
+++ b/net/minecraft/world/entity/monster/Monster.java
@@ -148,6 +148,12 @@ public abstract class Monster extends PathfinderMob implements Enemy {
@Override
public ItemStack getProjectile(ItemStack shootable) {
+ // Purpur start - config for turning bundles into functional quivers
+ return getProjectile(shootable, false);
+ }
+ @Override
+ public ItemStack getProjectile(ItemStack shootable, boolean useBundleItemStack) {
+ // Purpur end - config for turning bundles into functional quivers
if (shootable.getItem() instanceof ProjectileWeaponItem) {
Predicate<ItemStack> supportedHeldProjectiles = ((ProjectileWeaponItem)shootable.getItem()).getSupportedHeldProjectiles();
ItemStack heldProjectile = ProjectileWeaponItem.getHeldProjectile(this, supportedHeldProjectiles);
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
index 053d51070df51e901bdf8f0f33316e4f25ea9a2f..214b915712538f98811b4efde8bf360202a2ef49 100644
--- a/net/minecraft/world/entity/player/Player.java
+++ b/net/minecraft/world/entity/player/Player.java
@@ -2089,6 +2089,12 @@ public abstract class Player extends Avatar implements ContainerUser {
@Override
public ItemStack getProjectile(ItemStack shootable) {
+ // Purpur start - config for turning bundles into functional quivers
+ return getProjectile(shootable, false);
+ }
+ @Override
+ public ItemStack getProjectile(ItemStack shootable, boolean useBundleItemStack) {
+ // Purpur end - config for turning bundles into functional quivers
if (!(shootable.getItem() instanceof ProjectileWeaponItem)) {
return ItemStack.EMPTY;
} else {
@@ -2102,6 +2108,37 @@ public abstract class Player extends Avatar implements ContainerUser {
for (int i = 0; i < this.inventory.getContainerSize(); i++) {
ItemStack item = this.inventory.getItem(i);
+ // Purpur start - config for turning bundles into functional quivers
+ if ((this.level().purpurConfig.bowUseBundleAsQuiver || this.level().purpurConfig.crossbowUseBundleAsQuiver) && !this.abilities.instabuild && item.getItem() instanceof net.minecraft.world.item.BundleItem) {
+ net.minecraft.world.item.component.BundleContents bundleContents = item.get(net.minecraft.core.component.DataComponents.BUNDLE_CONTENTS);
+ if (bundleContents == null || bundleContents.isEmpty()) {
+ continue;
+ }
+
+ Optional<ItemStack> first = bundleContents.itemCopyStream().filter(supportedHeldProjectiles).findFirst();
+
+ if (first.isEmpty()) {
+ continue;
+ }
+
+ ItemStack itemStack = first.get();
+ if (useBundleItemStack) {
+ net.minecraft.world.item.component.BundleContents.Mutable mutable = new net.minecraft.world.item.component.BundleContents.Mutable(bundleContents);
+ ItemStack itemStack2 = mutable.removeOne(itemStack);
+ if (itemStack2 == null) {
+ continue;
+ }
+
+ itemStack2.shrink(1);
+ if (itemStack2.getCount() != 0) {
+ mutable.tryInsert(itemStack2);
+ }
+ item.set(net.minecraft.core.component.DataComponents.BUNDLE_CONTENTS, mutable.toImmutable());
+ }
+ itemStack.setCount(1);
+ return itemStack;
+ }
+ // Purpur end - config for turning bundles into functional quivers
if (supportedHeldProjectiles.test(item)) {
return item;
}
diff --git a/net/minecraft/world/item/BowItem.java b/net/minecraft/world/item/BowItem.java
index 0a14a098f3aa40c8195c3a3bdf61ad6ae0fcc9d2..06cd5f1664d2f02fe36a16e675dfbb7ebf66751c 100644
--- a/net/minecraft/world/item/BowItem.java
+++ b/net/minecraft/world/item/BowItem.java
@@ -27,7 +27,7 @@ public class BowItem extends ProjectileWeaponItem {
if (!(entity instanceof Player player)) {
return false;
} else {
- ItemStack projectile = player.getProjectile(stack);
+ ItemStack projectile = player.getProjectile(stack, true); // Purpur - config for turning bundles into functional quivers
// Purpur start - Infinity bow settings
if (level.purpurConfig.infinityWorksWithoutArrows && projectile.isEmpty() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, stack) > 0) {
projectile = new ItemStack(Items.ARROW);
diff --git a/net/minecraft/world/item/BundleItem.java b/net/minecraft/world/item/BundleItem.java
index 79f3955cbf3a19b013d86180d8dda576ab4c25cd..8eae89acdfdc15a3a2ebfa72ea5a2c4282fdf770 100644
--- a/net/minecraft/world/item/BundleItem.java
+++ b/net/minecraft/world/item/BundleItem.java
@@ -132,7 +132,7 @@ public class BundleItem extends Item {
}
private void dropContent(Level level, Player player, ItemStack stack) {
- if (this.dropContent(stack, player)) {
+ if (!(level.purpurConfig.bowUseBundleAsQuiver || level.purpurConfig.bowUseBundleAsQuiver) && this.dropContent(stack, player)) { // Purpur - config for turning bundles into functional quivers
playDropContentsSound(level, player);
player.awardStat(Stats.ITEM_USED.get(this));
}
diff --git a/net/minecraft/world/item/CrossbowItem.java b/net/minecraft/world/item/CrossbowItem.java
index a29ff7584371d35d9b0fff71681f672b76dea07c..d1d450fa22f5deb766b39f2c34d4cf7cda944644 100644
--- a/net/minecraft/world/item/CrossbowItem.java
+++ b/net/minecraft/world/item/CrossbowItem.java
@@ -68,7 +68,7 @@ public class CrossbowItem extends ProjectileWeaponItem {
if (chargedProjectiles != null && !chargedProjectiles.isEmpty()) {
this.performShooting(level, player, hand, itemInHand, getShootingPower(chargedProjectiles), (float) level.purpurConfig.crossbowProjectileOffset, null); // Purpur - Projectile offset config
return InteractionResult.CONSUME;
- } else if (!player.getProjectile(itemInHand).isEmpty()) {
+ } else if (!player.getProjectile(itemInHand).isEmpty()) { // Purpur - config for turning bundles into functional quivers
this.startSoundPlayed = false;
this.midLoadSoundPlayed = false;
player.startUsingItem(hand);
@@ -95,7 +95,7 @@ public class CrossbowItem extends ProjectileWeaponItem {
}
private static boolean tryLoadProjectiles(LivingEntity shooter, ItemStack crossbowStack, boolean consume) {
- List<ItemStack> list = draw(crossbowStack, shooter.getProjectile(crossbowStack), shooter, consume);
+ List<ItemStack> list = draw(crossbowStack, shooter.getProjectile(crossbowStack, true), shooter, consume); // Purpur - config for turning bundles into functional quivers
// Paper end - Add EntityLoadCrossbowEvent
if (!list.isEmpty()) {
crossbowStack.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.of(list));
diff --git a/net/minecraft/world/item/component/BundleContents.java b/net/minecraft/world/item/component/BundleContents.java
index e513f95105b0663bd6155e69ac814bc8dbba5b76..2bf687e86ae6d0117f7c72e535f6841eaeefd2ea 100644
--- a/net/minecraft/world/item/component/BundleContents.java
+++ b/net/minecraft/world/item/component/BundleContents.java
@@ -164,7 +164,12 @@ public final class BundleContents implements TooltipComponent {
}
private int findStackIndex(ItemStack stack) {
- if (!stack.isStackable()) {
+ // Purpur start - config for turning bundles into functional quivers
+ return this.findStackIndex(stack, false);
+ }
+ private int findStackIndex(ItemStack stack, boolean skipStackableCheck) {
+ if (!skipStackableCheck && !stack.isStackable()) {
+ // Purpur end - config for turning bundles into functional quivers
return -1;
} else {
for (int i = 0; i < this.items.size(); i++) {
@@ -227,11 +232,19 @@ public final class BundleContents implements TooltipComponent {
}
public @Nullable ItemStack removeOne() {
+ // Purpur start - config for turning bundles into functional quivers
+ return this.removeOne(null);
+ }
+ public @Nullable ItemStack removeOne(ItemStack itemStack2) {
+ // Purpur end - config for turning bundles into functional quivers
if (this.items.isEmpty()) {
return null;
} else {
int i = this.indexIsOutsideAllowedBounds(this.selectedItem) ? 0 : this.selectedItem;
- ItemStack itemStack = this.items.remove(i).copy();
+ // Purpur start - config for turning bundles into functional quivers
+ int stackIndex = itemStack2 != null ? this.findStackIndex(itemStack2, true) : -1;
+ ItemStack itemStack = this.items.remove(stackIndex == -1 ? i : stackIndex).copy();
+ // Purpur end - config for turning bundles into functional quivers
this.weight = this.weight.subtract(BundleContents.getWeight(itemStack).multiplyBy(Fraction.getFraction(itemStack.getCount(), 1)));
this.toggleSelectedItem(-1);
return itemStack;