I have a problem to register my Oil Feature. Im working on this problem about 2 Weeks. Can somebody help me.
Iv'e tried a lot of Workarounds in 1.16.2 and 1.16.5 but the value of OIL_FEATURE will allways be null.
#1: The Crash Report
[13:45:50] [Render thread/INFO] [STDOUT/]: [net.minecraft.crash.CrashReport:makeCategoryDepth:227]: Negative index in crash report handler (21/23)
[13:45:50] [Render thread/FATAL] [ne.mi.fm.cl.ClientModLoader/]: Crash report saved to .\crash-reports\crash-2021-02-20_13.45.50-fml.txt
---- Minecraft Crash Report ----
// I bet Cylons wouldn't have this problem.
Time: 20.02.21 13:45
Description: Mod loading error has occurred
java.lang.Exception: Mod Loading has failed
at net.minecraftforge.fml.CrashReportExtender.dumpModLoadingCrashReport(CrashReportExtender.java:85) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading}
at net.minecraftforge.fml.client.ClientModLoader.completeModLoading(ClientModLoader.java:188) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.lambda$null$1(Minecraft.java:513) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.util.Util.acceptOrElse(Util.java:323) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading}
at net.minecraft.client.Minecraft.lambda$new$2(Minecraft.java:509) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.gui.ResourceLoadProgressGui.render(ResourceLoadProgressGui.java:113) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:492) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1002) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.run(Minecraft.java:612) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_201] {}
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_201] {}
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_201] {}
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_201] {}
at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:52) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.0.9.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.0.9.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.0.9.jar:?] {}
at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.0.9.jar:?] {}
at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.0.9.jar:?] {}
at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:105) [forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {}
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
-- Head --
Thread: Render thread
Stacktrace:
at java.util.Objects.requireNonNull(Objects.java:290) ~[?:1.8.0_201] {}
-- MOD examplemod --
Details:
Mod File: main
Failure message: Example Mod (examplemod) encountered an error during the common_setup event phase
java.lang.NullPointerException: Registry Object not present: exampe_mod:oil_feature
Mod Version: NONE
Mod Issue URL: http://my.issue.tracker/
Exception message: java.lang.NullPointerException: Registry Object not present: exampe_mod:oil_feature
Stacktrace:
at java.util.Objects.requireNonNull(Objects.java:290) ~[?:1.8.0_201] {}
at net.minecraftforge.fml.RegistryObject.get(RegistryObject.java:120) ~[forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading}
at com.example.examplemod.worldgen.WorldGen.initGen(WorldGen.java:19) ~[main/:?] {re:classloading}
at com.example.examplemod.ExampleMod.setup(ExampleMod.java:53) ~[main/:?] {re:classloading}
at net.minecraftforge.eventbus.EventBus.doCastFilter(EventBus.java:247) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.lambda$addListener$11(EventBus.java:239) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.fml.javafmlmod.FMLModContainer.acceptEvent(FMLModContainer.java:120) ~[forge:35.1] {re:classloading}
at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:121) ~[forge:?] {re:classloading}
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) ~[?:1.8.0_201] {}
at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1618) ~[?:1.8.0_201] {}
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) ~[?:1.8.0_201] {}
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) ~[?:1.8.0_201] {}
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) ~[?:1.8.0_201] {}
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) ~[?:1.8.0_201] {}
-- System Details --
Details:
Minecraft Version: 1.16.4
Minecraft Version ID: 1.16.4
Operating System: Windows 10 (amd64) version 10.0
Java Version: 1.8.0_201, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 2298261808 bytes (2191 MB) / 3393716224 bytes (3236 MB) up to 7594835968 bytes (7243 MB)
CPUs: 8
JVM Flags: 1 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
ModLauncher: 8.0.9+86+master.3cf110c
ModLauncher launch target: fmluserdevclient
ModLauncher naming: mcp
ModLauncher services:
/mixin-0.8.2.jar mixin PLUGINSERVICE
/eventbus-4.0.0.jar eventbus PLUGINSERVICE
/forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-launcher.jar object_holder_definalize PLUGINSERVICE
/forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-launcher.jar runtime_enum_extender PLUGINSERVICE
/accesstransformers-3.0.1.jar accesstransformer PLUGINSERVICE
/forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-launcher.jar capability_inject_definalize PLUGINSERVICE
/forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-launcher.jar runtimedistcleaner PLUGINSERVICE
/mixin-0.8.2.jar mixin TRANSFORMATIONSERVICE
/forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16.3-launcher.jar fml TRANSFORMATIONSERVICE
FML: 35.1
Forge: net.minecraftforge:35.1.37
FML Language Providers:
javafml@35.1
minecraft@1
Mod List:
client-extra.jar |Minecraft |minecraft |1.16.4 |SIDED_SETU|a1:d4:5e:04:4f:d3:d6:e0:7b:37:97:cf:77:b0:de:ad:4a:47:ce:8c:96:49:5f:0a:cf:8c:ae:b2:6d:4b:8a:3f
forge-1.16.4-35.1.37_mapped_snapshot_20201028-1.16|Forge |forge |35.1.37 |SIDED_SETU|NOSIGNATURE
main |Example Mod |examplemod |NONE |ERROR |NOSIGNATURE
Crash Report UUID: 1249c6e1-7cb9-4a38-b3b0-ce4f9ac298b2[13:45:55] [Render thread/INFO] [minecraft/Minecraft]: Stopping!
#2) Changes in Main File:
private void setup(final FMLCommonSetupEvent event)
{
// some preinit code
LOGGER.info("HELLO FROM PREINIT");
LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());
MyFeature.init();
WorldGen.initGen();
}
3.) My Feature
package com.example.examplemod.worldgen;
import java.util.function.Supplier;
import com.example.examplemod.ExampleMod;
import com.mojang.serialization.Codec;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.IFeatureConfig;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
public abstract class MyFeature<FC extends IFeatureConfig> extends Feature<FC> {
public static final DeferredRegister<Feature<?>> FEATURES = DeferredRegister.create(ForgeRegistries.FEATURES,ExampleMod.MODID);
public static final Supplier<OilFeature> sup = () -> new OilFeature(OilFeatureConfig.CODEC );
public static final RegistryObject<OilFeature> OIL_FEATURE = FEATURES.register("oil_feature",sup); // OilFeatureConfig.CODEC) );
public MyFeature(Codec<FC> codec) {
super(codec);
}
public ConfiguredFeature<FC, ?> withConfiguration(FC config) {
return new ConfiguredFeature<>(this, config);
}
public static void init() {
};
}
#3: WorldGen
package com.example.examplemod.worldgen;
import net.minecraft.block.Blocks;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.OreFeatureConfig;
public class WorldGen {
public static void initGen() {
OilFeatureConfig OFC = new OilFeatureConfig(
OreFeatureConfig.FillerBlockType.BASE_STONE_OVERWORLD,
Blocks.GOLD_BLOCK.getDefaultState(),
1, //Smal/mediumLarge Lake
60, //Realize % of generatins
1, //Mit Steinen umrandet
5, //lakes.minHeight, / /Min Height Placement
63 //lakes.maxHeight / / Max Height
);
ConfiguredFeature<?, ?> ConfFeature = MyFeature.OIL_FEATURE.get().withConfiguration(OFC);
//...
}
}
#4: OilFeatureConfig
package com.example.examplemod.worldgen;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.block.BlockState;
import net.minecraft.world.gen.feature.IFeatureConfig;
import net.minecraft.world.gen.feature.template.RuleTest;
public class OilFeatureConfig implements IFeatureConfig {
//public static final OilFeatureConfig field_236559_b_ = new OilFeatureConfig();
public static final Codec<OilFeatureConfig> CODEC = RecordCodecBuilder.create((p_236568_0_) -> {
return p_236568_0_.group(RuleTest.field_237127_c_.fieldOf("target").forGetter((config) -> {
return config.target;
}), BlockState.CODEC.fieldOf("state").forGetter((config) -> {
return config.state;
}), Codec.intRange(0, 64).fieldOf("size").forGetter((config) -> {
return config.size;
}), Codec.intRange(0, 64).fieldOf("realize").forGetter((config) -> {
return config.realize;
}), Codec.intRange(0, 64).fieldOf("mode").forGetter((config) -> {
return config.mode;
}), Codec.intRange(0, 256).fieldOf("minheight").forGetter((config) -> {
return config.minheigth;
}), Codec.intRange(0, 256).fieldOf("maxheight").forGetter((config) -> {
return config.maxheigth;
})).apply(p_236568_0_, OilFeatureConfig::new);
});
public final RuleTest target;
public final int size;
public final BlockState state;
public final int realize;
public final int mode;
public final int minheigth;
public final int maxheigth;
public OilFeatureConfig(RuleTest p_i241989_1_, BlockState state, int size, int realize, int mode, int minheight, int maxheight) {
this.size = size;
this.state = state;
this.target = p_i241989_1_;
this.realize = realize;
this.mode = mode;
this.minheigth = minheight;
this.maxheigth = maxheight;
}
public int minheight() {
return this.minheigth;
}
public int maxheigth() {
return this.maxheigth;
}
}
#5 OilFeature
package com.example.examplemod.worldgen;
import java.util.Random;
import com.mojang.serialization.Codec;
//import com.wilpito.wilpitomod.block.ModBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.SectionPos;
import net.minecraft.world.ISeedReader;
import net.minecraft.world.LightType;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.ChunkGenerator;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.NoFeatureConfig;
import net.minecraft.world.gen.feature.structure.Structure;
public class OilFeature extends Feature<OilFeatureConfig> {
private static final BlockState AIR = Blocks.CAVE_AIR.getDefaultState();
public OilFeature(Codec<OilFeatureConfig> field236558a) {
super(field236558a);
}
@Override
public boolean generate(ISeedReader SeedReader, ChunkGenerator chunkGen, Random rand, BlockPos pos, OilFeatureConfig config) {
BlockState decoBlock = Blocks.STONE.getDefaultState();
int sx=6,sy=3,sz=6;
int mode = config.mode;
// wahrscheinlichkeit zum platzieren:
if(config.realize < rand.nextInt(100)) {
return true;
}
// Durchmesser See festlegen
if (config.size == 0) { //Small
sy = 2 + rand.nextInt(2);
sx = 5;
sz = 5;
}
if (config.size == 1) { //Medium
sy = 3 + rand.nextInt(2);
sx = 7;
sz = 7;
}
if (config.size == 2) { //Large
sy = 4;
sx = 10;
sz = 10;
}
while(pos.getY() > 6 && SeedReader.isAirBlock(pos)) {
pos = pos.down();
}
Block block = SeedReader.getBlockState(pos).getBlock();
if (block == Blocks.SAND) {
decoBlock = Blocks.SANDSTONE.getDefaultState();
if (mode == 0) mode = 1;
}
if (block == Blocks.RED_SAND) {
decoBlock = Blocks.RED_SANDSTONE.getDefaultState();
if (mode == 0) mode = 1;
}
if (pos.getY() <= 5) {
return false;
} else {
pos = pos.down(sy);
if (SeedReader.func_241827_a(SectionPos.from(pos), Structure.VILLAGE).findAny().isPresent())
return false;
else if (SeedReader.func_241827_a(SectionPos.from(pos), Structure.WOODLAND_MANSION).findAny().isPresent())
return false;
boolean[] aboolean = new boolean[5760];
int i = rand.nextInt(sy) + 4;
for(int j = 0; j < i; ++j) {
double d0 = rand.nextDouble() * sx*2 + 3.0D;
double d1 = rand.nextDouble() * 4.0D + 2.0D;
double d2 = rand.nextDouble() * sy*2 + 3.0D;
double d3 = rand.nextDouble() * (24.0D - d0 - 2.0D) + 1.0D + d0 / 2.0D;
double d4 = rand.nextDouble() * (8.0D - d1 - 4.0D) + 2.0D + d1 / 2.0D;
double d5 = rand.nextDouble() * (24.0D - d2 - 2.0D) + 1.0D + d2 / 2.0D;
for(int l = 1; l < 23; ++l) {
for(int i1 = 1; i1 < 23; ++i1) {
for(int j1 = 1; j1 < 7; ++j1) {
double d6 = ((double)l - d3) / (d0 / 2.0D);
double d7 = ((double)j1 - d4) / (d1 / 2.0D);
double d8 = ((double)i1 - d5) / (d2 / 2.0D);
double d9 = d6 * d6 + d7 * d7 + d8 * d8;
if (d9 < 1.0D) {
aboolean[(l * 24 + i1) * 8 + j1] = true;
}
}
}
}
}
for(int k1 = 0; k1 < 24; ++k1) {
for(int l2 = 0; l2 < 24; ++l2) {
for(int k = 0; k < 8; ++k) {
boolean flag = !aboolean[(k1 * 24 + l2) * 8 + k] && (k1 < 23 && aboolean[((k1 + 1) * 24 + l2) * 8 + k] || k1 > 0 && aboolean[((k1 - 1) * 24 + l2) * 8 + k] || l2 < 23 && aboolean[(k1 * 24 + l2 + 1) * 8 + k] || l2 > 0 && aboolean[(k1 * 24 + (l2 - 1)) * 8 + k] || k < 7 && aboolean[(k1 * 24 + l2) * 8 + k + 1] || k > 0 && aboolean[(k1 * 24 + l2) * 8 + (k - 1)]);
if (flag) {
Material material = SeedReader.getBlockState(pos.add(k1, k, l2)).getMaterial();
if (k >= 4 && material.isLiquid()) {
return false;
}
if (k < 4 && !material.isSolid() && SeedReader.getBlockState(pos.add(k1, k, l2)) != config.state) {
return false;
}
}
}
}
}
for(int l1 = 0; l1 < 24; ++l1) {
for(int i3 = 0; i3 < 24; ++i3) {
for(int i4 = 0; i4 < 8; ++i4) {
if (aboolean[(l1 * 24 + i3) * 8 + i4]) {
SeedReader.setBlockState(pos.add(l1, i4, i3), i4 >= 4 ? AIR : config.state, 2);
}
}
}
}
for(int i2 = 0; i2 < 24; ++i2) {
for(int j3 = 0; j3 < 24; ++j3) {
for(int j4 = 4; j4 < 8; ++j4) {
if (aboolean[(i2 * 24 + j3) * 8 + j4]) {
BlockPos blockpos = pos.add(i2, j4 - 1, j3);
if (isDirt(SeedReader.getBlockState(blockpos).getBlock()) && SeedReader.getLightFor(LightType.SKY, pos.add(i2, j4, j3)) > 0) {
Biome biome = SeedReader.getBiome(blockpos);
if (biome.getGenerationSettings().getSurfaceBuilderConfig().getTop().isIn(Blocks.MYCELIUM)) {
SeedReader.setBlockState(blockpos, Blocks.MYCELIUM.getDefaultState(), 2);
} else {
SeedReader.setBlockState(blockpos, Blocks.GRASS_BLOCK.getDefaultState(), 2);
}
}
}
}
}
}
if (mode == 1) { // Oil See with Border
for(int j2 = 0; j2 < 24; ++j2) {
for(int k3 = 0; k3 < 24; ++k3) {
for(int k4 = 0; k4 < 8; ++k4) {
boolean flag1 = !aboolean[(j2 * 24 + k3) * 8 + k4] && (j2 < 23 && aboolean[((j2 + 1) * 24 + k3) * 8 + k4] || j2 > 0 && aboolean[((j2 - 1) * 24 + k3) * 8 + k4] || k3 < 15 && aboolean[(j2 * 24 + k3 + 1) * 8 + k4] || k3 > 0 && aboolean[(j2 * 24 + (k3 - 1)) * 8 + k4] || k4 < 7 && aboolean[(j2 * 24 + k3) * 8 + k4 + 1] || k4 > 0 && aboolean[(j2 * 24 + k3) * 8 + (k4 - 1)]);
if (flag1 && (k4 < 4 || rand.nextInt(2) != 0) && SeedReader.getBlockState(pos.add(j2, k4, k3)).getMaterial().isSolid()) {
SeedReader.setBlockState(pos.add(j2, k4, k3), decoBlock, 2);
}
}
}
}
}
if (mode == 2) { // Oil See with special Border
for(int j2 = 0; j2 < 24; ++j2) {
for(int k3 = 0; k3 < 24; ++k3) {
for(int k4 = 0; k4 < 8; ++k4) {
BlockState newState = decoBlock;
if (rand.nextInt(100)<15)
newState = Blocks.GOLD_BLOCK.getDefaultState(); //ModBlock.getRandomBlock(rand);
boolean flag1 = !aboolean[(j2 * 24 + k3) * 8 + k4] && (j2 < 23 && aboolean[((j2 + 1) * 24 + k3) * 8 + k4] || j2 > 0 && aboolean[((j2 - 1) * 24 + k3) * 8 + k4] || k3 < 15 && aboolean[(j2 * 24 + k3 + 1) * 8 + k4] || k3 > 0 && aboolean[(j2 * 24 + (k3 - 1)) * 8 + k4] || k4 < 7 && aboolean[(j2 * 24 + k3) * 8 + k4 + 1] || k4 > 0 && aboolean[(j2 * 24 + k3) * 8 + (k4 - 1)]);
if (flag1 && (k4 < 4 || rand.nextInt(2) != 0) && SeedReader.getBlockState(pos.add(j2, k4, k3)).getMaterial().isSolid()) {
SeedReader.setBlockState(pos.add(j2, k4, k3), newState, 2);
}
}
}
}
}
return true;
}
}