2023-09-17 01:27:11 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
|
|
|
|
Date: Thu, 31 Aug 2023 17:32:48 +0200
|
|
|
|
Subject: [PATCH] Fix silent equipment change for mobs
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
|
2024-01-19 17:54:05 +01:00
|
|
|
index 16d84042e2575418880897c728a99d1b8bbcdd15..c81c72bf1027fcbaac67808fbcf6e0af112176bc 100644
|
2023-09-17 01:27:11 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/Mob.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
|
2023-12-06 17:34:54 +01:00
|
|
|
@@ -1059,13 +1059,20 @@ public abstract class Mob extends LivingEntity implements Targeting {
|
2023-09-17 01:27:11 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setItemSlot(EquipmentSlot slot, ItemStack stack) {
|
2024-01-13 18:34:33 +01:00
|
|
|
+ // Paper start - Fix silent equipment change
|
2023-09-17 01:27:11 +02:00
|
|
|
+ setItemSlot(slot, stack, false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void setItemSlot(EquipmentSlot slot, ItemStack stack, boolean silent) {
|
2024-01-13 18:34:33 +01:00
|
|
|
+ // Paper end - Fix silent equipment change
|
2023-09-17 01:27:11 +02:00
|
|
|
this.verifyEquippedItem(stack);
|
|
|
|
switch (slot.getType()) {
|
|
|
|
case HAND:
|
|
|
|
- this.onEquipItem(slot, (ItemStack) this.handItems.set(slot.getIndex(), stack), stack);
|
2024-01-13 18:34:33 +01:00
|
|
|
+ this.onEquipItem(slot, (ItemStack) this.handItems.set(slot.getIndex(), stack), stack, silent); // Paper - Fix silent equipment change
|
2023-09-17 01:27:11 +02:00
|
|
|
break;
|
|
|
|
case ARMOR:
|
|
|
|
- this.onEquipItem(slot, (ItemStack) this.armorItems.set(slot.getIndex(), stack), stack);
|
2024-01-13 18:34:33 +01:00
|
|
|
+ this.onEquipItem(slot, (ItemStack) this.armorItems.set(slot.getIndex(), stack), stack, silent); // Paper - Fix silent equipment change
|
2023-09-17 01:27:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
2024-01-19 17:54:05 +01:00
|
|
|
index 9af5a4b46dcec727c7c862332759ffbe3ebd87b5..8527388f7cb5fce43ff485c903d6b78c10c4259e 100644
|
2023-09-17 01:27:11 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
|
|
|
@@ -250,8 +250,8 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
|
2024-01-19 17:54:05 +01:00
|
|
|
// Paper end - shouldBurnInDay API
|
2023-09-17 01:27:11 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
- public void setItemSlot(EquipmentSlot slot, ItemStack stack) {
|
|
|
|
- super.setItemSlot(slot, stack);
|
2024-01-13 18:34:33 +01:00
|
|
|
+ public void setItemSlot(EquipmentSlot slot, ItemStack stack, boolean silent) { // Paper - Fix silent equipment change
|
|
|
|
+ super.setItemSlot(slot, stack, silent); // Paper - Fix silent equipment change
|
2023-09-17 01:27:11 +02:00
|
|
|
if (!this.level().isClientSide) {
|
|
|
|
this.reassessWeaponGoal();
|
|
|
|
}
|
|
|
|
diff --git a/src/test/java/io/papermc/paper/entity/EntitySetItemSlotSilentOverrideTest.java b/src/test/java/io/papermc/paper/entity/EntitySetItemSlotSilentOverrideTest.java
|
|
|
|
new file mode 100644
|
2023-09-25 01:05:05 +02:00
|
|
|
index 0000000000000000000000000000000000000000..81947843d1f2f7dc6f59d7b52f327d60b17d0dcc
|
2023-09-17 01:27:11 +02:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/test/java/io/papermc/paper/entity/EntitySetItemSlotSilentOverrideTest.java
|
2023-09-25 01:05:05 +02:00
|
|
|
@@ -0,0 +1,51 @@
|
2023-09-17 01:27:11 +02:00
|
|
|
+package io.papermc.paper.entity;
|
|
|
|
+
|
|
|
|
+import io.github.classgraph.ClassGraph;
|
|
|
|
+import io.github.classgraph.ClassInfo;
|
|
|
|
+import io.github.classgraph.MethodInfo;
|
|
|
|
+import io.github.classgraph.MethodInfoList;
|
|
|
|
+import io.github.classgraph.MethodParameterInfo;
|
|
|
|
+import io.github.classgraph.ScanResult;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.List;
|
2023-09-24 09:16:58 +02:00
|
|
|
+import java.util.stream.Stream;
|
2023-09-17 01:27:11 +02:00
|
|
|
+import org.bukkit.support.AbstractTestingBase;
|
2023-09-24 09:16:58 +02:00
|
|
|
+import org.junit.jupiter.params.ParameterizedTest;
|
|
|
|
+import org.junit.jupiter.params.provider.MethodSource;
|
2023-09-17 01:27:11 +02:00
|
|
|
+
|
2023-09-24 09:16:58 +02:00
|
|
|
+import static org.junit.jupiter.api.Assertions.fail;
|
2023-09-17 01:27:11 +02:00
|
|
|
+
|
|
|
|
+public class EntitySetItemSlotSilentOverrideTest extends AbstractTestingBase {
|
|
|
|
+
|
2023-09-24 09:16:58 +02:00
|
|
|
+ public static Stream<ClassInfo> parameters() {
|
2023-09-17 01:27:11 +02:00
|
|
|
+ final List<ClassInfo> classInfo = new ArrayList<>();
|
|
|
|
+ try (ScanResult scanResult = new ClassGraph()
|
|
|
|
+ .enableClassInfo()
|
|
|
|
+ .enableMethodInfo()
|
|
|
|
+ .whitelistPackages("net.minecraft")
|
|
|
|
+ .scan()
|
|
|
|
+ ) {
|
|
|
|
+ for (final ClassInfo subclass : scanResult.getSubclasses("net.minecraft.world.entity.LivingEntity")) {
|
|
|
|
+ final MethodInfoList setItemSlot = subclass.getDeclaredMethodInfo("setItemSlot");
|
|
|
|
+ if (!setItemSlot.isEmpty()) {
|
|
|
|
+ classInfo.add(subclass);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
2023-09-24 09:16:58 +02:00
|
|
|
+ return classInfo.stream();
|
2023-09-17 01:27:11 +02:00
|
|
|
+ }
|
|
|
|
+
|
2023-09-24 09:16:58 +02:00
|
|
|
+ @ParameterizedTest
|
|
|
|
+ @MethodSource("parameters")
|
|
|
|
+ public void checkSetItemSlotSilentOverrides(ClassInfo overridesSetItemSlot) {
|
|
|
|
+ final MethodInfoList setItemSlot = overridesSetItemSlot.getDeclaredMethodInfo("setItemSlot");
|
2023-09-17 01:27:11 +02:00
|
|
|
+ for (final MethodInfo methodInfo : setItemSlot) {
|
|
|
|
+ for (final MethodParameterInfo methodParameterInfo : methodInfo.getParameterInfo()) {
|
|
|
|
+ if ("boolean".equals(methodParameterInfo.getTypeDescriptor().toStringWithSimpleNames())) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
2023-09-24 09:16:58 +02:00
|
|
|
+ fail(overridesSetItemSlot.getName() + " needs to override setItemSlot with the boolean silent parameter as well");
|
2023-09-17 01:27:11 +02:00
|
|
|
+ }
|
|
|
|
+}
|