Skip to content

Commit 802b457

Browse files
committed
Adds implementation of entity_effect particle which changed in 1.20.5
1 parent d97315e commit 802b457

File tree

4 files changed

+138
-15
lines changed
  • commandapi-platforms/commandapi-bukkit

4 files changed

+138
-15
lines changed

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.20.5/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
import org.bukkit.entity.Player;
7676
import org.bukkit.help.HelpTopic;
7777
import org.bukkit.inventory.Recipe;
78-
import org.bukkit.potion.PotionEffectType;
7978

8079
import com.google.common.collect.ImmutableList;
8180
import com.google.common.io.Files;
@@ -154,6 +153,7 @@
154153
import net.minecraft.core.component.DataComponentMap;
155154
import net.minecraft.core.component.PatchedDataComponentMap;
156155
import net.minecraft.core.particles.BlockParticleOption;
156+
import net.minecraft.core.particles.ColorParticleOption;
157157
import net.minecraft.core.particles.DustColorTransitionOptions;
158158
import net.minecraft.core.particles.DustParticleOptions;
159159
import net.minecraft.core.particles.ItemParticleOption;
@@ -658,6 +658,7 @@ public final org.bukkit.loot.LootTable getLootTable(CommandContext<CommandSource
658658
return CraftLootTable.minecraftToBukkit(ResourceLocationArgument.getId(cmdCtx, key));
659659
}
660660

661+
@Differs(from = "1.20.4", by = "New particle option ColorParticleOption")
661662
@Override
662663
public final ParticleData<?> getParticle(CommandContext<CommandSourceStack> cmdCtx, String key) {
663664
final ParticleOptions particleOptions = ParticleArgument.getParticle(cmdCtx, key);
@@ -684,12 +685,26 @@ public final ParticleData<?> getParticle(CommandContext<CommandSourceStack> cmdC
684685
} else if (particleOptions instanceof SculkChargeParticleOptions options) {
685686
// CraftBukkit implements sculk charge particles as a (boxed) Float object
686687
return new ParticleData<Float>(particle, Float.valueOf(options.roll()));
688+
} else if (particleOptions instanceof ColorParticleOption options) {
689+
return getParticleDataAsColorParticleOption(particle, options);
687690
} else {
688691
CommandAPI.getLogger().warning("Invalid particle data type for " + particle.getDataType().toString());
689692
return new ParticleData<Void>(particle, null);
690693
}
691694
}
692695

696+
@Differs(from = "1.20.4", by = "This now exists")
697+
private ParticleData<Color> getParticleDataAsColorParticleOption(Particle particle,
698+
ColorParticleOption options) {
699+
final Color color = Color.fromARGB(
700+
(int) (options.getAlpha() * 255.0F),
701+
(int) (options.getRed() * 255.0F),
702+
(int) (options.getGreen() * 255.0F),
703+
(int) (options.getBlue() * 255.0F)
704+
);
705+
return new ParticleData<Color>(particle, color);
706+
}
707+
693708
@Differs(from = "1.20.4", by = "Now uses options#getFromColor instead of options.getColor")
694709
private ParticleData<DustTransition> getParticleDataAsDustColorTransitionOption(Particle particle,
695710
DustColorTransitionOptions options) {

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.20.5/src/main/java/dev/jorel/commandapi/test/ArgumentNMS.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -783,11 +783,7 @@ public ParticleData<?> getParticle(CommandContext cmdCtx, String key) {
783783

784784
final ParticleOptions particleOptions = ParticleArgument.getParticle(cmdCtx, key);
785785

786-
// registry.getResourceKey(particleOptions.getType()).get().
787-
// registry.asLookup().
788-
789786
String nmsKey = registry.getResourceKey(particleOptions.getType()).get().location().getPath();
790-
System.out.println("Trying to find " + nmsKey + " but got " + map.get(nmsKey));
791787
result = new ParticleData(map.get(nmsKey), null); //baseNMS.getParticle(cmdCtx, key);
792788
}
793789

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.20.5/src/main/java/dev/jorel/commandapi/test/MockNMS.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ public String getNMSParticleNameFromBukkit(Particle particle) {
449449
// return BuiltInRegistries.PARTICLE_TYPE.getKey(CraftParticle.bukkitToMinecraft(particle)).toString();
450450
// return particle.getKey().toString();
451451

452-
return Map.ofEntries(
452+
Map<org.bukkit.Particle, String> particleMap = Map.ofEntries(
453453
Map.entry(Particle.valueOf("EXPLOSION_NORMAL"), "poof"),
454454
Map.entry(Particle.valueOf("EXPLOSION_LARGE"), "explosion"),
455455
Map.entry(Particle.valueOf("EXPLOSION_HUGE"), "explosion_emitter"),
@@ -548,7 +548,13 @@ public String getNMSParticleNameFromBukkit(Particle particle) {
548548
Map.entry(Particle.valueOf("CHERRY_LEAVES"), "cherry_leaves"),
549549
Map.entry(Particle.valueOf("EGG_CRACK"), "egg_crack"),
550550
Map.entry(Particle.valueOf("BLOCK_MARKER"), "dust_plume")
551-
).get(particle);
551+
);
552+
553+
final String particleName = particleMap.get(particle);
554+
if (particleName == null) {
555+
System.err.println("Couldn't find particle name for " + particle);
556+
}
557+
return particleName;
552558
}
553559

554560
@Override

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/arguments/ArgumentParticleTests.java

Lines changed: 114 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
import static org.junit.jupiter.api.Assumptions.assumeFalse;
56
import static org.junit.jupiter.api.Assumptions.assumeTrue;
67

78
import java.util.Set;
89
import java.util.concurrent.ThreadLocalRandom;
910

11+
import org.bukkit.Bukkit;
1012
import org.bukkit.Color;
1113
import org.bukkit.Material;
1214
import org.bukkit.Particle;
@@ -43,6 +45,21 @@ public void setUp() {
4345

4446
// Disabled for 1.20.3+ due to "reasons"
4547
// assumeTrue(version.lessThan(MCVersion.V1_20_3));
48+
49+
/**
50+
* From https://misode.github.io/versions/?id=1.20.5-pre1&tab=changelog&tags=command
51+
*
52+
* Changed the /particle command syntax for particles with extra options:
53+
54+
block redstone_lamp[lit=true] → block{block_state:{Name:"redstone_lamp",Properties:{lit:"true"}}} (also for block_marker, falling_dust, and dust_pillar)
55+
dust 0.1 0.2 0.3 0.4 → dust{color:[0.1,0.2,0.3],scale:0.4}
56+
dust_color_transition 0.1 0.2 0.3 0.4 0.5 0.6 0.7 → dust_color_transition{from_color:[0.1,0.2,0.3],scale:0.4,to_color:[0.5,0.6,0.7]}
57+
entity_effect → entity_effect{color:[0.1,0.2,0.3,0.4]}
58+
item diamond → item{item:"diamond"}
59+
sculk_charge 0.1 → sculk_charge{roll:0.1}
60+
shriek 1 → shriek{delay:1}
61+
vibration 0.1 0.2 0.3 4 → vibration{destination:{type:"block",pos:[0.1,0.2,0.3]},arrival_in_ticks:4}
62+
*/
4663
}
4764

4865
@AfterEach
@@ -78,10 +95,17 @@ void executionTestWithParticleArgumentVoid() {
7895

7996
for (Particle particle : Particle.values()) {
8097
if (particle.getDataType().equals(Void.class) && !dodgyParticles.contains(particle)) {
81-
82-
// TODO: If 1.20.5+, we we can use particle.getKey() directly
83-
84-
server.dispatchCommand(player, "test " + MockPlatform.getInstance().getNMSParticleNameFromBukkit(particle));
98+
if (version.greaterThanOrEqualTo(MCVersion.V1_20_5) && particle.name().equals("SPELL_MOB")) {
99+
// SPELL_MOB (entity_effect) has an additional parameter in 1.20.5 onwards
100+
continue;
101+
} else {
102+
String particleName = MockPlatform.getInstance().getNMSParticleNameFromBukkit(particle);
103+
if (particleName != null) {
104+
server.dispatchCommand(player, "test " + particleName);
105+
} else {
106+
continue;
107+
}
108+
}
85109
assertEquals(particle, results.get().particle());
86110
}
87111
}
@@ -180,10 +204,11 @@ void executionTestWithParticleArgumentBlock() {
180204

181205
PlayerMock player = server.addPlayer();
182206

183-
// block block_type[meta]
184207
if (version.greaterThanOrEqualTo(MCVersion.V1_20_5)) {
185-
server.dispatchCommand(player, "test block minecraft:grass_block{snowy:true}");
208+
// block{block_state{state}}
209+
server.dispatchCommand(player, "test block{block_state:{Name:\"minecraft:grass_block\",Properties:{snowy:\"true\"}}}");
186210
} else {
211+
// block block_type[meta]
187212
server.dispatchCommand(player, "test block minecraft:grass_block[snowy=true]");
188213
}
189214

@@ -216,8 +241,13 @@ void executionTestWithParticleArgumentItem() {
216241

217242
PlayerMock player = server.addPlayer();
218243

219-
// item item_id
220-
server.dispatchCommand(player, "test item apple");
244+
if (version.greaterThanOrEqualTo(MCVersion.V1_20_5)) {
245+
// item{item:"item_id"}
246+
server.dispatchCommand(player, "test item{item:\"apple\"}");
247+
} else {
248+
// item item_id
249+
server.dispatchCommand(player, "test item apple");
250+
}
221251
@SuppressWarnings("unchecked")
222252
ParticleData<ItemStack> result = (ParticleData<ItemStack>) results.get();
223253

@@ -232,5 +262,81 @@ void executionTestWithParticleArgumentItem() {
232262

233263
assertNoMoreResults(results);
234264
}
265+
266+
@Test
267+
void executionTestWithParticleArgumentEntityEffect() {
268+
// Only effective from 1.20.5+
269+
assumeTrue(version.greaterThanOrEqualTo(MCVersion.V1_20_5));
270+
271+
Mut<ParticleData<?>> results = Mut.of();
272+
273+
new CommandAPICommand("test")
274+
.withArguments(new ParticleArgument("particle"))
275+
.executesPlayer((player, args) -> {
276+
results.set(args.getUnchecked("particle"));
277+
})
278+
.register();
279+
280+
PlayerMock player = server.addPlayer();
281+
282+
// entity_effect{color:[r,g,b,a]}
283+
// (red entity effect, fully visible)
284+
server.dispatchCommand(player, "test entity_effect{color:[1.0,0.0,0.0,1.0]}");
285+
286+
@SuppressWarnings("unchecked")
287+
ParticleData<Color> result = (ParticleData<Color>) results.get();
288+
289+
assumeFalse(Bukkit.getBukkitVersion().equals("1.20.1-R0.1-SNAPSHOT"));
290+
291+
// Check the particle type is correct
292+
assertEquals(Particle.valueOf("ENTITY_EFFECT"), result.particle());
293+
294+
// TODO: Can't handle particle data yet in 1.20.5
295+
assumeTrue(version.lessThan(MCVersion.V1_20_5));
296+
297+
// Check the particle properties
298+
assertEquals(255, result.data().getRed());
299+
assertEquals(0, result.data().getGreen());
300+
assertEquals(0, result.data().getBlue());
301+
assertEquals(255, result.data().getAlpha());
302+
303+
assertNoMoreResults(results);
304+
}
305+
306+
// @Test
307+
// void executionTestWithParticleArgumentVibration() {
308+
// Mut<ParticleData<?>> results = Mut.of();
309+
//
310+
// new CommandAPICommand("test")
311+
// .withArguments(new ParticleArgument("particle"))
312+
// .executesPlayer((player, args) -> {
313+
// results.set((ParticleData<?>) args.get("particle"));
314+
// })
315+
// .register();
316+
//
317+
// PlayerMock player = server.addPlayer();
318+
//
319+
// // block block_type[meta]
320+
// if (version.greaterThanOrEqualTo(MCVersion.V1_20_5)) {
321+
// server.dispatchCommand(player, "test block{block_state:{Name:\"minecraft:grass_block\",Properties:{snowy:\"true\"}}}");
322+
// } else {
323+
// server.dispatchCommand(player, "test block minecraft:grass_block[snowy=true]");
324+
// }
325+
//
326+
// @SuppressWarnings("unchecked")
327+
// ParticleData<BlockData> result = (ParticleData<BlockData>) results.get();
328+
//
329+
// // Check the particle type is correct
330+
// assertEquals(Particle.BLOCK_CRACK, result.particle());
331+
//
332+
// // TODO: Can't handle particle data yet in 1.20.5
333+
// assumeTrue(version.lessThan(MCVersion.V1_20_5));
334+
//
335+
// // Check the particle properties
336+
// assertEquals(Material.GRASS_BLOCK, result.data().getMaterial());
337+
// assertTrue(((Snowable) result.data()).isSnowy());
338+
//
339+
// assertNoMoreResults(results);
340+
// }
235341

236342
}

0 commit comments

Comments
 (0)