mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-29 19:52:55 +01:00
149 lines
7.7 KiB
Diff
149 lines
7.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Fri, 28 Jul 2023 15:02:44 -0700
|
|
Subject: [PATCH] Bandaid fix for Effect
|
|
|
|
Effect or LevelEvent needs to be replaced
|
|
but ideally after the enum PR has been merged
|
|
upstream. Until then, this test and these fixes
|
|
should address all the known issues with them
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
|
|
index 71733f918ed84b9879ac1b142ef6205c5e768a9c..7ee13c0a0cd12979c7f8cc2e403baf9300fd61c8 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
|
|
@@ -15,6 +15,8 @@ public class CraftEffect {
|
|
public static <T> int getDataValue(Effect effect, T data) {
|
|
int datavalue;
|
|
switch (effect) {
|
|
+ case PARTICLES_SCULK_CHARGE: // Paper - add missing effects
|
|
+ case TRIAL_SPAWNER_DETECT_PLAYER: // Paper - add missing effects
|
|
case VILLAGER_PLANT_GROW:
|
|
datavalue = (Integer) data;
|
|
break;
|
|
@@ -26,6 +28,13 @@ public class CraftEffect {
|
|
Preconditions.checkArgument(data == Material.AIR || ((Material) data).isRecord(), "Invalid record type for Material %s!", data);
|
|
datavalue = Item.getId(CraftItemType.bukkitToMinecraft((Material) data));
|
|
break;
|
|
+ // Paper start - handle shoot white smoke event
|
|
+ case SHOOT_WHITE_SMOKE:
|
|
+ final BlockFace face = (BlockFace) data;
|
|
+ Preconditions.checkArgument(face.isCartesian(), face + " isn't cartesian");
|
|
+ datavalue = org.bukkit.craftbukkit.block.CraftBlock.blockFaceToNotch(face).get3DDataValue();
|
|
+ break;
|
|
+ // Paper end - handle shoot white smoke event
|
|
case SMOKE:
|
|
switch ((BlockFace) data) {
|
|
case DOWN:
|
|
@@ -57,8 +66,15 @@ public class CraftEffect {
|
|
}
|
|
break;
|
|
case STEP_SOUND:
|
|
+ if (data instanceof Material) { // Paper - support BlockData
|
|
Preconditions.checkArgument(((Material) data).isBlock(), "Material %s is not a block!", data);
|
|
datavalue = Block.getId(CraftBlockType.bukkitToMinecraft((Material) data).defaultBlockState());
|
|
+ // Paper start - support BlockData
|
|
+ break;
|
|
+ }
|
|
+ case PARTICLES_AND_SOUND_BRUSH_BLOCK_COMPLETE:
|
|
+ datavalue = Block.getId(((org.bukkit.craftbukkit.block.data.CraftBlockData) data).getState());
|
|
+ // Paper end
|
|
break;
|
|
case COMPOSTER_FILL_ATTEMPT:
|
|
datavalue = ((Boolean) data) ? 1 : 0;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index 80aa2aebc490e763d2b9dfd56bcaff94cb13cd91..e99ebf806f955a7c0c163ef546b884c794be8a2a 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -1402,7 +1402,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
public <T> void playEffect(Location loc, Effect effect, T data, int radius) {
|
|
if (data != null) {
|
|
Preconditions.checkArgument(effect.getData() != null, "Effect.%s does not have a valid Data", effect);
|
|
- Preconditions.checkArgument(effect.getData().isAssignableFrom(data.getClass()), "%s data cannot be used for the %s effect", data.getClass().getName(), effect);
|
|
+ Preconditions.checkArgument(effect.isApplicable(data), "%s data cannot be used for the %s effect", data.getClass().getName(), effect); // Paper
|
|
} else {
|
|
// Special case: the axis is optional for ELECTRIC_SPARK
|
|
Preconditions.checkArgument(effect.getData() == null || effect == Effect.ELECTRIC_SPARK, "Wrong kind of data for the %s effect", effect);
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 4db40044c0ac4fefe315c1ee52ff19e300f30629..ed6612311d1f5db95b47bd9883745ce3ebc01cd8 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -914,7 +914,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
Preconditions.checkArgument(effect != null, "Effect cannot be null");
|
|
if (data != null) {
|
|
Preconditions.checkArgument(effect.getData() != null, "Effect.%s does not have a valid Data", effect);
|
|
- Preconditions.checkArgument(effect.getData().isAssignableFrom(data.getClass()), "%s data cannot be used for the %s effect", data.getClass().getName(), effect);
|
|
+ Preconditions.checkArgument(effect.isApplicable(data), "%s data cannot be used for the %s effect", data.getClass().getName(), effect); // Paper
|
|
} else {
|
|
// Special case: the axis is optional for ELECTRIC_SPARK
|
|
Preconditions.checkArgument(effect.getData() == null || effect == Effect.ELECTRIC_SPARK, "Wrong kind of data for the %s effect", effect);
|
|
diff --git a/src/test/java/org/bukkit/EffectTest.java b/src/test/java/org/bukkit/EffectTest.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..875eacc2e5776901ba8593d0183844db2571f71b
|
|
--- /dev/null
|
|
+++ b/src/test/java/org/bukkit/EffectTest.java
|
|
@@ -0,0 +1,64 @@
|
|
+package org.bukkit;
|
|
+
|
|
+import java.lang.reflect.Field;
|
|
+import java.lang.reflect.Modifier;
|
|
+import java.util.ArrayList;
|
|
+import java.util.HashMap;
|
|
+import java.util.List;
|
|
+import java.util.Map;
|
|
+import net.minecraft.world.level.block.LevelEvent;
|
|
+import org.junit.jupiter.api.Test;
|
|
+
|
|
+import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
+import static org.junit.jupiter.api.Assertions.assertNull;
|
|
+import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
+
|
|
+public class EffectTest {
|
|
+
|
|
+ private static List<Integer> collectNmsLevelEvents() throws ReflectiveOperationException {
|
|
+ final List<Integer> events = new ArrayList<>();
|
|
+ for (final Field field : LevelEvent.class.getFields()) {
|
|
+ if (Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers()) && field.getType() == int.class) {
|
|
+ events.add((int) field.get(null));
|
|
+ }
|
|
+ }
|
|
+ return events;
|
|
+ }
|
|
+
|
|
+ private static boolean isNotDeprecated(Effect effect) throws ReflectiveOperationException {
|
|
+ return !Effect.class.getDeclaredField(effect.name()).isAnnotationPresent(Deprecated.class);
|
|
+ }
|
|
+
|
|
+ @SuppressWarnings("deprecation")
|
|
+ @Test
|
|
+ public void checkAllApiExists() throws ReflectiveOperationException {
|
|
+ Map<Integer, Effect> toId = new HashMap<>();
|
|
+ for (final Effect effect : Effect.values()) {
|
|
+ if (isNotDeprecated(effect)) {
|
|
+ final Effect put = toId.put(effect.getId(), effect);
|
|
+ assertNull(put, "duplicate API effect: " + put);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ for (final Integer event : collectNmsLevelEvents()) {
|
|
+ assertNotNull(toId.get(event), "missing API Effect: " + event);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @SuppressWarnings("deprecation")
|
|
+ @Test
|
|
+ public void checkNoExtraApi() throws ReflectiveOperationException {
|
|
+ Map<Integer, Effect> toId = new HashMap<>();
|
|
+ for (final Effect effect : Effect.values()) {
|
|
+ if (isNotDeprecated(effect)) {
|
|
+ final Effect put = toId.put(effect.getId(), effect);
|
|
+ assertNull(put, "duplicate API effect: " + put);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ final List<Integer> nmsEvents = collectNmsLevelEvents();
|
|
+ for (final Map.Entry<Integer, Effect> entry : toId.entrySet()) {
|
|
+ assertTrue(nmsEvents.contains(entry.getKey()), "Extra API Effect: " + entry.getValue());
|
|
+ }
|
|
+ }
|
|
+}
|