Skip to content

Commit 2c5bc5f

Browse files
committed
Poke around with particles for 1.20.5. Doesn't work until MockBukkit updates
1 parent 515b688 commit 2c5bc5f

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

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: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@
1515
import org.bukkit.Location;
1616
import org.bukkit.NamespacedKey;
1717
import org.bukkit.OfflinePlayer;
18+
import org.bukkit.Particle;
1819
import org.bukkit.World;
20+
import org.bukkit.Registry.SimpleRegistry;
1921
import org.bukkit.block.Block;
2022
import org.bukkit.block.data.BlockData;
23+
import org.bukkit.craftbukkit.v1_20_R4.CraftParticle;
24+
import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey;
2125
import org.bukkit.enchantments.Enchantment;
2226
import org.bukkit.entity.EntityType;
2327
import org.bukkit.entity.Player;
@@ -27,6 +31,7 @@
2731
import org.bukkit.potion.PotionEffectType;
2832
import org.bukkit.scoreboard.Objective;
2933
import org.bukkit.scoreboard.Team;
34+
import org.mockito.MockedStatic;
3035
import org.mockito.Mockito;
3136

3237
import com.mojang.brigadier.Message;
@@ -61,8 +66,11 @@
6166
import net.minecraft.core.Holder;
6267
import net.minecraft.core.HolderLookup;
6368
import net.minecraft.core.HolderOwner;
69+
import net.minecraft.core.Registry;
70+
import net.minecraft.core.particles.ParticleType;
6471
import net.minecraft.core.registries.BuiltInRegistries;
6572
import net.minecraft.core.registries.Registries;
73+
import net.minecraft.resources.RegistryOps;
6674
import net.minecraft.resources.ResourceKey;
6775

6876
/**
@@ -241,6 +249,9 @@ public ArgumentType<?> _ArgumentParticle() {
241249
Mockito
242250
.when(buildContextMock.lookupOrThrow(any(ResourceKey.class)))
243251
.thenReturn(Optional.of(BuiltInRegistries.PARTICLE_TYPE.asLookup()).orElseThrow()); // Registry.PARTICLE_TYPE
252+
Mockito
253+
.when(buildContextMock.createSerializationContext(any()))
254+
.thenAnswer(a -> RegistryOps.create(a.getArgument(0), buildContextMock));
244255
return ParticleArgument.particle(buildContextMock);
245256
}
246257

@@ -531,7 +542,28 @@ public OfflinePlayer getOfflinePlayer(CommandContext cmdCtx, String key) throws
531542

532543
@Override
533544
public ParticleData<?> getParticle(CommandContext cmdCtx, String key) {
534-
return baseNMS.getParticle(cmdCtx, key);
545+
546+
final ParticleData<?> result;
547+
548+
try (MockedStatic<CraftParticle> craftParticle = Mockito.mockStatic(CraftParticle.class)) {
549+
craftParticle.when(() -> CraftParticle.minecraftToBukkit(any()))
550+
.thenAnswer(args -> {
551+
ParticleType minecraft = args.getArgument(0, ParticleType.class);
552+
553+
554+
Registry<ParticleType<?>> registry = BuiltInRegistries.PARTICLE_TYPE; //CraftRegistry.getMinecraftRegistry(Registries.PARTICLE_TYPE);
555+
org.bukkit.Registry.PARTICLE_TYPE
556+
// new SimpleRegistry(Particle.class, (par) -> par.register);
557+
558+
Particle bukkit = (Particle) org.bukkit.Registry.PARTICLE_TYPE.get(CraftNamespacedKey
559+
.fromMinecraft(((ResourceKey) registry.getResourceKey(minecraft).orElseThrow()).location()));
560+
return bukkit;
561+
});
562+
563+
result = baseNMS.getParticle(cmdCtx, key);
564+
}
565+
566+
return result;
535567
}
536568

537569
@Override

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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
import org.bukkit.command.CommandSender;
3131
import org.bukkit.command.SimpleCommandMap;
3232
import org.bukkit.craftbukkit.v1_20_R4.CraftParticle;
33+
import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry;
3334
import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
3435
import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer;
3536
import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemFactory;
37+
import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey;
3638
import org.bukkit.enchantments.Enchantment;
3739
import org.bukkit.entity.Player;
3840
import org.bukkit.help.HelpTopic;
@@ -41,6 +43,7 @@
4143
import org.bukkit.scoreboard.Team;
4244
import org.jetbrains.annotations.NotNull;
4345
import org.jetbrains.annotations.Nullable;
46+
import org.mockito.MockedStatic;
4447
import org.mockito.Mockito;
4548

4649
import com.google.gson.JsonParseException;
@@ -67,7 +70,11 @@
6770
import net.minecraft.commands.functions.CommandFunction;
6871
import net.minecraft.core.BlockPos;
6972
import net.minecraft.core.HolderLookup;
73+
import net.minecraft.core.Registry;
74+
import net.minecraft.core.RegistryAccess;
75+
import net.minecraft.core.particles.ParticleType;
7076
import net.minecraft.core.registries.BuiltInRegistries;
77+
import net.minecraft.core.registries.Registries;
7178
import net.minecraft.network.chat.Component;
7279
import net.minecraft.network.chat.numbers.BlankFormat;
7380
import net.minecraft.resources.ResourceKey;
@@ -160,6 +167,24 @@ public MockNMS(CommandAPIBukkit<?> baseNMS) {
160167
}
161168
return null;
162169
});
170+
171+
// CraftBukkit's registry is shared across all instances of a test (or all tests?)
172+
if (CraftRegistry.getMinecraftRegistry() == null) {
173+
RegistryAccess registry = Mockito.mock(RegistryAccess.class);
174+
Mockito.when(registry.registry(any())).thenAnswer(args -> {
175+
ResourceKey key = args.getArgument(0);
176+
System.out.println("Trying to access registry: " + key.registry());
177+
Thread.currentThread().dumpStack();
178+
return Optional.ofNullable(null);
179+
});
180+
Mockito.when(registry.registryOrThrow(any())).thenAnswer(args -> {
181+
ResourceKey key = args.getArgument(0);
182+
System.out.println("Trying to access registry: " + key.registry());
183+
Thread.currentThread().dumpStack();
184+
return null;
185+
});
186+
CraftRegistry.setMinecraftRegistry(registry);
187+
}
163188
}
164189

165190
/*************************
@@ -412,11 +437,13 @@ public String getBukkitPotionEffectTypeName(PotionEffectType potionEffectType) {
412437

413438
@Override
414439
public String getNMSParticleNameFromBukkit(Particle particle) {
440+
// CraftRegistry.setMinecraftRegistry(this.<MinecraftServer>getMinecraftServer().getServer().registryAccess());
415441
// Didn't want to do it like this, but it's way easier than going via the
416442
// registry to do all sorts of nonsense with lookups. If you ever want to
417443
// change your mind, here's how to access it via the registry. This doesn't
418444
// scale well for pre 1.19 versions though!
419445
// BuiltInRegistries.PARTICLE_TYPE.getKey(CraftParticle.toNMS(particle).getType()).toString();
446+
particle.getKey();
420447
return BuiltInRegistries.PARTICLE_TYPE.getKey(CraftParticle.bukkitToMinecraft(particle)).toString();
421448
// return particle.getKey().toString();
422449
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,11 @@ void executionTestWithParticleArgumentDustRandom() {
140140
// caps it off at 4.
141141
int size = ThreadLocalRandom.current().nextInt(1, 5);
142142

143-
server.dispatchCommand(player, "test dust %s %s %s %d".formatted(red, green, blue, size));
143+
if (version.greaterThanOrEqualTo(MCVersion.V1_20_5)) {
144+
server.dispatchCommand(player, "test dust{color:[%sf,%sf,%sf],scale:%d.0f}".formatted(red, green, blue, size));
145+
} else {
146+
server.dispatchCommand(player, "test dust %s %s %s %d".formatted(red, green, blue, size));
147+
}
144148
@SuppressWarnings("unchecked")
145149
ParticleData<DustOptions> result = (ParticleData<DustOptions>) results.get();
146150

0 commit comments

Comments
 (0)