-
Recently Browsing
- No registered users viewing this page.
-
Posts
-
By Toasterkid · Posted
What's the issue your running into? The link for the image you posted is also broken. -
By Toasterkid · Posted
What does NetworkHooks.openScreen(player, blockEntity, pPos) do? -
By Toasterkid · Posted
At an attempt at answering my first question I thought I might be able to change the code to this public static final RegistryObject<StatType<?>> FIREWORK_BOOSTS_USED = STATISTICS.register("firework_boosts_used", () -> new StatType<>(ForgeRegistries.STAT_TYPES, Component.literal("firework_boosts"))); or to this public static final RegistryObject<StatType<?>> FIREWORK_BOOSTS_USED = STATISTICS.register("firework_boosts_used", () -> new StatType<>(BuiltInRegistries.STAT_TYPE, Component.literal("firework_boosts"))); but for the first code snippet the StatType constructor requires a Registry not an IForgeRegistry and for the second code snippet we run into the same NPE issue from above. -
Hi guys, I'm using Crafty installed on CasaOS and i want to create a BetterMC4 Server. Unfortunatly i got an error message. This error only appear when using my "online" server because when i create a singleplayer adventure, everythings works just fine. https://github.com/OwNuT/Errors/issues/1 Thank you !
-
By Toasterkid · Posted
I am attempting to create a mod that adds custom statistics to Minecraft. I've had some help from LexManos on the Discord server, but posting a lot of what I posted in the #mod-dev-support-1.20 channel here to have a more permanent spot for discussion. --- Minecraft creates their stats like this: public class Stats { public static final StatType<Block> BLOCK_MINED = makeRegistryStatType("mined", BuiltInRegistries.BLOCK); public static final StatType<Item> ITEM_CRAFTED = makeRegistryStatType("crafted", BuiltInRegistries.ITEM); public static final StatType<EntityType<?>> ENTITY_KILLED = makeRegistryStatType("killed", BuiltInRegistries.ENTITY_TYPE); public static final StatType<ResourceLocation> CUSTOM = makeRegistryStatType("custom", BuiltInRegistries.CUSTOM_STAT); public static final ResourceLocation LEAVE_GAME = makeCustomStat("leave_game", StatFormatter.DEFAULT); public static final ResourceLocation PLAY_TIME = makeCustomStat("play_time", StatFormatter.TIME); private static ResourceLocation makeCustomStat(String p_13008_, StatFormatter p_13009_) { ResourceLocation resourcelocation = new ResourceLocation(p_13008_); Registry.register(BuiltInRegistries.CUSTOM_STAT, p_13008_, resourcelocation); CUSTOM.get(resourcelocation, p_13009_); return resourcelocation; } private static <T> StatType<T> makeRegistryStatType(String p_13011_, Registry<T> p_13012_) { Component component = Component.translatable("stat_type.minecraft." + p_13011_); return Registry.register(BuiltInRegistries.STAT_TYPE, p_13011_, new StatType<>(p_13012_, component)); } } and some of the registries in the code above are located in BuiltInRegistries.java like this: /** * @deprecated Forge: Use {@link net.minecraftforge.registries.ForgeRegistries#STAT_TYPES} instead. */ @Deprecated public static final Registry<StatType<?>> STAT_TYPE = forge(Registries.STAT_TYPE, (p_259967_) -> { return Stats.ITEM_USED; }); public static final Registry<ResourceLocation> CUSTOM_STAT = registerSimple(Registries.CUSTOM_STAT, (p_259833_) -> { return Stats.JUMP; }); and the ForgeRegistries#STAT_TYPES looks like this: public static final IForgeRegistry<StatType<?>> STAT_TYPES = active(Keys.STAT_TYPES); So, attempting to follow that and the forge documentation on registries I arrived at this: public class SampleModStatisticsRegistry { public static final DeferredRegister<StatType<?>> STATISTICS = DeferredRegister.create(ForgeRegistries.STAT_TYPES, SampleMod.MODID); public static final RegistryObject<StatType<?>> FIREWORK_BOOSTS_USED = STATISTICS.register("firework_boosts_used", () -> makeRegistryStatType("firework_boosts_used", BuiltInRegistries.CUSTOM_STAT)); // code stolen from Minecraft's Stats file public static <T> StatType<T> makeRegistryStatType(String p_13011_, Registry<T> p_13012_) { Component component = Component.translatable("stat_type.minecraft." + p_13011_); return Registry.register(BuiltInRegistries.STAT_TYPE, p_13011_, new StatType<>(p_13012_, component)); } } Clearly, registering a stat twice in a row is the wrong way to do it, but the makeRegistryStatType function was used as it does give the correct return type for the code I had come up with so far. --- At this point the game crashes upon trying to use Player#awardStat, because of a NPE that occurs in Stat#locationToKey. java.lang.NullPointerException: Cannot invoke "net.minecraft.resources.ResourceLocation.toString()" because "p_12866_" is null at net.minecraft.stats.Stat.locationToKey(Stat.java:26) ~[forge-1.20.2-48.1.0_mapped_official_1.20.2-recomp.jar%23199!/:?] {re:classloading} at net.minecraft.stats.Stat.buildName(Stat.java:22) ~[forge-1.20.2-48.1.0_mapped_official_1.20.2-recomp.jar%23199!/:?] {re:classloading} at net.minecraft.stats.Stat.<init>(Stat.java:15) ~[forge-1.20.2-48.1.0_mapped_official_1.20.2-recomp.jar%23199!/:?] {re:classloading} at net.minecraft.stats.StatType.lambda$get$0(StatType.java:25) ~[forge-1.20.2-48.1.0_mapped_official_1.20.2-recomp.jar%23199!/:?] {re:classloading} at java.util.Map.computeIfAbsent(Map.java:1054) ~[?:?] {re:mixin} at net.minecraft.stats.StatType.get(StatType.java:24) ~[forge-1.20.2-48.1.0_mapped_official_1.20.2-recomp.jar%23199!/:?] {re:classloading} at net.minecraft.stats.StatType.get(StatType.java:38) ~[forge-1.20.2-48.1.0_mapped_official_1.20.2-recomp.jar%23199!/:?] {re:classloading} at net.minecraft.world.entity.player.Player.awardStat(Player.java:1364) ~[forge-1.20.2-48.1.0_mapped_official_1.20.2-recomp.jar%23199!/:?] {re:classloading,pl:accesstransformer:B} Which happens in the 2nd Stat#locationToKey in the Stat#buildName function. public static <T> String buildName(StatType<T> p_12863_, T p_12864_) { return locationToKey(BuiltInRegistries.STAT_TYPE.getKey(p_12863_)) + ":" + locationToKey(p_12863_.getRegistry().getKey(p_12864_)); } The .getRegistry returns the this.registry class variable with a value of {MappedRegistry@#####} "Registry[ResourceKey[minecraft:root / minecraft:custom_stat] (Stable)]" The value passed into .getKey is "samplemod:fireworks_boosts_used" but the reference found is null. So Lex's conclusion was that "[I'm] passing in null because the registry doesnt have an entry for your custom stat instance. So.. register your custom stat instance in that registry." --- So I suppose at this point my questions are 1. How can I create a supplier that returns a Supplier<? extends StatType<?>> to replace the () -> makeRegistryStatType("firework_boosts_used", BuiltInRegistries.CUSTOM_STAT) line of code. 2. Is my registry entry public static final RegistryObject<StatType<?>> FIREWORK_BOOSTS_USED the correct type? 3. Do I need to do anything additional, like create my own StatType<> or my own Stat<> ?
-
-
Topics
-
Who's Online (See full list)
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.