mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 08:27:43 +01:00
185 lines
11 KiB
Diff
185 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 db5a2227009bc4d655fc781d5850221f36f2d112..c26846d3b92be4ed8ec40ce21128dfe912f19298 100644
|
|
--- a/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -4456,6 +4456,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
}
|
|
|
|
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 c1ebb74b0d4a8e2eb8880ccaf20f0f9bc1940094..4d0916c0ec6c199f9ef359a17cda0891448d07f6 100644
|
|
--- a/net/minecraft/world/entity/monster/Monster.java
|
|
+++ b/net/minecraft/world/entity/monster/Monster.java
|
|
@@ -144,6 +144,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 43657822f0660613078e9afa512000b5255a1537..a5284118fa4c3c2fff52c8220615c9ca848d9af0 100644
|
|
--- a/net/minecraft/world/entity/player/Player.java
|
|
+++ b/net/minecraft/world/entity/player/Player.java
|
|
@@ -2294,6 +2294,12 @@ public abstract class Player extends LivingEntity {
|
|
|
|
@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 {
|
|
@@ -2306,6 +2312,39 @@ public abstract class Player extends LivingEntity {
|
|
|
|
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 b3e003694ce0da357e91ab3ce2b1380f9ab0a32a..186bd391ed3738734ca2d8e82339af0158ae4875 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 966029b761bcb31113b167831fe7f4f2dea4b17d..eda25cc71b4804d805b1a7f875f823b20efc754b 100644
|
|
--- a/net/minecraft/world/item/BundleItem.java
|
|
+++ b/net/minecraft/world/item/BundleItem.java
|
|
@@ -131,7 +131,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 1131e984fd30e40c1b99054b5db9462ffe55b5f1..c9dbe63316cad0437f50fa3f7ffe345ec1906752 100644
|
|
--- a/net/minecraft/world/item/CrossbowItem.java
|
|
+++ b/net/minecraft/world/item/CrossbowItem.java
|
|
@@ -72,7 +72,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);
|
|
@@ -124,7 +124,7 @@ public class CrossbowItem extends ProjectileWeaponItem {
|
|
return CrossbowItem.tryLoadProjectiles(shooter, crossbowStack, true);
|
|
}
|
|
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 fca2dd0fb9ff4ff795a01de722fbb31dc02682fa..6fb9becef49bd4161c7829d240dd9e786f2226b5 100644
|
|
--- a/net/minecraft/world/item/component/BundleContents.java
|
|
+++ b/net/minecraft/world/item/component/BundleContents.java
|
|
@@ -163,7 +163,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++) {
|
|
@@ -223,11 +228,20 @@ public final class BundleContents implements TooltipComponent {
|
|
|
|
@Nullable
|
|
public ItemStack removeOne() {
|
|
+ // Purpur start - config for turning bundles into functional quivers
|
|
+ return this.removeOne(null);
|
|
+ }
|
|
+ @Nullable
|
|
+ public ItemStack removeOne(ItemStack itemStack2) {
|
|
+ // Purpur end - config for turning bundles into functional quivers
|
|
if (this.items.isEmpty()) {
|
|
return null;
|
|
} else {
|
|
int i = this.selectedItem != -1 && this.selectedItem < this.items.size() ? this.selectedItem : 0;
|
|
- 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;
|