So I've attempted to add new Stat Types in 1.14.3, this is through total guess work though as I can't seem to find anything about them or if they're even doable yet.
I've created a new StatType like so:
Registry<ResourceLocation> statRegistry = new SimpleRegistry<>();
StatType<ResourceLocation> statType = new StatType<>(statRegistry);
statType.setRegistryName(modid, "stat_type_name");
And then registered it like so:
@SubscribeEvent
public void registerStats(RegistryEvent.Register<StatType<?>> event) {
event.getRegistry().register(statType);
}
Finally I add the stat to the player like this:
player.addStat(statType.get(new ResourceLocation(modid, "stat_name"), IStatFormatter.DEFAULT), 1);
This seems to register fine (confirmed that the registry event is fired, etc) but i get this exception on trying to add the stat to the player:
java.lang.NullPointerException: Unexpected error
at net.minecraft.stats.Stat.locationToKey(SourceFile:29) ~[forge-1.14.3-27.0.22_mapped_snapshot_20190625-1.14.3.jar:?] {}
at net.minecraft.stats.Stat.buildName(SourceFile:23) ~[forge-1.14.3-27.0.22_mapped_snapshot_20190625-1.14.3.jar:?] {}
at net.minecraft.stats.Stat.<init>(SourceFile:16) ~[forge-1.14.3-27.0.22_mapped_snapshot_20190625-1.14.3.jar:?] {}
at net.minecraft.stats.StatType.lambda$get$0(StatType.java:25) ~[forge-1.14.3-27.0.22_mapped_snapshot_20190625-1.14.3.jar:?] {}
at java.util.Map.computeIfAbsent(Map.java:957) ~[?:1.8.0_162] {}
at net.minecraft.stats.StatType.get(StatType.java:24) ~[forge-1.14.3-27.0.22_mapped_snapshot_20190625-1.14.3.jar:?] {}
I have no idea if this is even remotely correct but it was what I figured out from look at the vanilla classes and comparing things to other registries.
Looking at StatType it looks like it uses an empty SimpleRegistry in it's constructor and adds any stats dynamically to it via get() but this is just my guess.