22
33import static org .junit .jupiter .api .Assertions .assertEquals ;
44import static org .junit .jupiter .api .Assertions .assertTrue ;
5+ import static org .junit .jupiter .api .Assumptions .assumeFalse ;
56import static org .junit .jupiter .api .Assumptions .assumeTrue ;
67
78import java .util .Set ;
89import java .util .concurrent .ThreadLocalRandom ;
910
11+ import org .bukkit .Bukkit ;
1012import org .bukkit .Color ;
1113import org .bukkit .Material ;
1214import 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