mirror of
https://github.com/PaperMC/Paper.git
synced 2024-10-29 23:09:33 +01:00
9147456fc9
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes: ab8ace685 SPIGOT-7236: Bone meal doesn't increase use statistic 7dcb59b8e Avoid switch on material in previous commit Spigot Changes: 19641c75 SPIGOT-7235: World.Spigot#strikeLightningEffect doesn't do anything
151 lines
6.9 KiB
Diff
151 lines
6.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Fri, 20 Aug 2021 13:03:21 -0700
|
|
Subject: [PATCH] Get entity default attributes
|
|
|
|
== AT ==
|
|
public net.minecraft.world.entity.ai.attributes.AttributeSupplier getAttributeInstance(Lnet/minecraft/world/entity/ai/attributes/Attribute;)Lnet/minecraft/world/entity/ai/attributes/AttributeInstance;
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeInstance.java b/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeInstance.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..12135ffeacd648f6bc4d7d327059ea1a7e8c79c4
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeInstance.java
|
|
@@ -0,0 +1,30 @@
|
|
+package io.papermc.paper.attribute;
|
|
+
|
|
+import net.minecraft.world.entity.ai.attributes.AttributeInstance;
|
|
+import org.bukkit.attribute.Attribute;
|
|
+import org.bukkit.attribute.AttributeModifier;
|
|
+import org.bukkit.craftbukkit.attribute.CraftAttributeInstance;
|
|
+
|
|
+import java.util.Collection;
|
|
+
|
|
+public class UnmodifiableAttributeInstance extends CraftAttributeInstance {
|
|
+
|
|
+ public UnmodifiableAttributeInstance(AttributeInstance handle, Attribute attribute) {
|
|
+ super(handle, attribute);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setBaseValue(double d) {
|
|
+ throw new UnsupportedOperationException("Cannot modify default attributes");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void addModifier(AttributeModifier modifier) {
|
|
+ throw new UnsupportedOperationException("Cannot modify default attributes");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void removeModifier(AttributeModifier modifier) {
|
|
+ throw new UnsupportedOperationException("Cannot modify default attributes");
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeMap.java b/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeMap.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..cf9d28ea97d93cec05c9fb768d59e283ca915565
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeMap.java
|
|
@@ -0,0 +1,32 @@
|
|
+package io.papermc.paper.attribute;
|
|
+
|
|
+import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
|
|
+import org.bukkit.attribute.Attributable;
|
|
+import org.bukkit.attribute.Attribute;
|
|
+import org.bukkit.attribute.AttributeInstance;
|
|
+import org.bukkit.craftbukkit.attribute.CraftAttributeMap;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+
|
|
+public class UnmodifiableAttributeMap implements Attributable {
|
|
+
|
|
+ private final AttributeSupplier handle;
|
|
+
|
|
+ public UnmodifiableAttributeMap(@NotNull AttributeSupplier handle) {
|
|
+ this.handle = handle;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public @Nullable AttributeInstance getAttribute(@NotNull Attribute attribute) {
|
|
+ net.minecraft.world.entity.ai.attributes.Attribute nmsAttribute = CraftAttributeMap.toMinecraft(attribute);
|
|
+ if (!this.handle.hasAttribute(nmsAttribute)) {
|
|
+ return null;
|
|
+ }
|
|
+ return new UnmodifiableAttributeInstance(this.handle.getAttributeInstance(nmsAttribute), attribute);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void registerAttribute(@NotNull Attribute attribute) {
|
|
+ throw new UnsupportedOperationException("Cannot register new attributes here");
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
index ec49b0719491f52057818a6fc2b4d3f16c7fc440..30ac1162851331526f3fc00332eded67be48e1d4 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
@@ -564,6 +564,18 @@ public final class CraftMagicNumbers implements UnsafeValues {
|
|
public int getProtocolVersion() {
|
|
return net.minecraft.SharedConstants.getCurrentVersion().getProtocolVersion();
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public boolean hasDefaultEntityAttributes(NamespacedKey bukkitEntityKey) {
|
|
+ return net.minecraft.world.entity.ai.attributes.DefaultAttributes.hasSupplier(net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE.get(CraftNamespacedKey.toMinecraft(bukkitEntityKey)));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public org.bukkit.attribute.Attributable getDefaultEntityAttributes(NamespacedKey bukkitEntityKey) {
|
|
+ Preconditions.checkArgument(hasDefaultEntityAttributes(bukkitEntityKey), bukkitEntityKey + " doesn't have default attributes");
|
|
+ var supplier = net.minecraft.world.entity.ai.attributes.DefaultAttributes.getSupplier((net.minecraft.world.entity.EntityType<? extends net.minecraft.world.entity.LivingEntity>) net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE.get(CraftNamespacedKey.toMinecraft(bukkitEntityKey)));
|
|
+ return new io.papermc.paper.attribute.UnmodifiableAttributeMap(supplier);
|
|
+ }
|
|
// Paper end
|
|
|
|
/**
|
|
diff --git a/src/test/java/io/papermc/paper/attribute/EntityTypeAttributesTest.java b/src/test/java/io/papermc/paper/attribute/EntityTypeAttributesTest.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..7b999deba66aa6d22cd7520f6c13550a44ca327d
|
|
--- /dev/null
|
|
+++ b/src/test/java/io/papermc/paper/attribute/EntityTypeAttributesTest.java
|
|
@@ -0,0 +1,39 @@
|
|
+package io.papermc.paper.attribute;
|
|
+
|
|
+import org.bukkit.attribute.Attributable;
|
|
+import org.bukkit.attribute.Attribute;
|
|
+import org.bukkit.attribute.AttributeInstance;
|
|
+import org.bukkit.attribute.AttributeModifier;
|
|
+import org.bukkit.entity.EntityType;
|
|
+import org.bukkit.support.AbstractTestingBase;
|
|
+import org.junit.Test;
|
|
+
|
|
+import static org.junit.Assert.assertFalse;
|
|
+import static org.junit.Assert.assertNotNull;
|
|
+import static org.junit.Assert.assertThrows;
|
|
+import static org.junit.Assert.assertTrue;
|
|
+
|
|
+public class EntityTypeAttributesTest extends AbstractTestingBase {
|
|
+
|
|
+ @Test
|
|
+ public void testIllegalEntity() {
|
|
+ assertFalse(EntityType.EGG.hasDefaultAttributes());
|
|
+ assertThrows(IllegalArgumentException.class, () -> EntityType.EGG.getDefaultAttributes());
|
|
+ }
|
|
+
|
|
+ @Test
|
|
+ public void testLegalEntity() {
|
|
+ assertTrue(EntityType.ZOMBIE.hasDefaultAttributes());
|
|
+ EntityType.ZOMBIE.getDefaultAttributes();
|
|
+ }
|
|
+
|
|
+ @Test
|
|
+ public void testUnmodifiabilityOfAttributable() {
|
|
+ Attributable attributable = EntityType.ZOMBIE.getDefaultAttributes();
|
|
+ assertThrows(UnsupportedOperationException.class, () -> attributable.registerAttribute(Attribute.GENERIC_ATTACK_DAMAGE));
|
|
+ AttributeInstance instance = attributable.getAttribute(Attribute.GENERIC_FOLLOW_RANGE);
|
|
+ assertNotNull(instance);
|
|
+ assertThrows(UnsupportedOperationException.class, () -> instance.addModifier(new AttributeModifier("test", 3, AttributeModifier.Operation.ADD_NUMBER)));
|
|
+ assertThrows(UnsupportedOperationException.class, () -> instance.setBaseValue(3.2));
|
|
+ }
|
|
+}
|