I have a custom dimension that works AFAIK, in that the dimension is registered, and I can visit via the portal block I made. However, the way I added it was by messing around with things until it worked. I would like to know if I did the process correctly, and if not, the flaws included in my current method. Below are my classes/methods that involve the dimension.
DBMDimensions.class - Class where I have all of my dimension initialization, along with a method that registers the dimension to the DimensionManager.
public class DBMDimensions {
//Mod Dimensions
public static final ModDimension THE_REALM_OF_THE_ANCIENTS_DIMENSION = new DBMDimension(RealmOfTheAncientsDimension::new).setRegistryName(DBMRegistryHandler.modLocation("the_realm_of_the_ancients"));
//Dimension Types
public static DimensionType THE_REALM_OF_THE_ANCIENTS;
public static void registerDimensions() {
if (THE_REALM_OF_THE_ANCIENTS == null) THE_REALM_OF_THE_ANCIENTS = DimensionManager.registerDimension(DBMRegistryHandler.modLocation("the_realm_of_the_ancients"), THE_REALM_OF_THE_ANCIENTS_DIMENSION, null, false);
}
}
DBMDimension.class - Class that extends ModDimension
public class DBMDimension extends ModDimension {
private BiFunction<World, DimensionType, ? extends Dimension> factory;
public DBMDimension(BiFunction<World, DimensionType, ? extends Dimension> factory) {
this.factory = factory;
}
@Override
public BiFunction<World, DimensionType, ? extends Dimension> getFactory() {
return this.factory;
}
}
RealmOfTheAncientsDimension.class - The class for the actual properties of my dimension. I'm pretty sure this works entirely, but I am including it just in case. (Most of it is copied vanilla code)
public class RealmOfTheAncientsDimension extends Dimension {
public static final BlockPos SPAWN = new BlockPos(100, 50, 0);;
public RealmOfTheAncientsDimension(final World worldIn, final DimensionType dimension) {
super(worldIn, dimension);
}
@Override
public ChunkGenerator<?> createChunkGenerator() {
EndGenerationSettings realmoftheancientsgensettings = (EndGenerationSettings) ChunkGeneratorType.FLOATING_ISLANDS.createSettings();
realmoftheancientsgensettings.setDefaultBlock(DBMBlocks.JACOBIAN_BLOCK.getDefaultState());
realmoftheancientsgensettings.setDefaultFluid(Blocks.WATER.getDefaultState());
realmoftheancientsgensettings.setSpawnPos(this.getSpawnCoordinate());
return ChunkGeneratorType.FLOATING_ISLANDS
.create(this.world, BiomeProviderType.FIXED
.create(((SingleBiomeProviderSettings) BiomeProviderType.FIXED
.createSettings())
.setBiome(DBMBiomes.REALM_OF_THE_ANCIENTS)), realmoftheancientsgensettings);
}
@Override
public float calculateCelestialAngle(final long p_76563_1_, final float p_76563_3_) {
return 0.0f;
}
@Override @Nullable @OnlyIn(Dist.CLIENT)
public float[] calcSunriseSunsetColors(final float p_76560_1_, final float p_76560_2_) {
return null;
}
@Override @OnlyIn(Dist.CLIENT)
public Vec3d getFogColor(final float p_76562_1_, final float p_76562_2_) {
float f = MathHelper.cos(p_76562_1_ * 6.2831855f) * 2.0f + 0.5f;
f = MathHelper.clamp(f, 0.0f, 1.0f);
float f2 = 0.7529412f;
float f3 = 0.84705883f;
float f4 = 1.0f;
f2 *= f * 0.94f + 0.06f;
f3 *= f * 0.94f + 0.06f;
f4 *= f * 0.91f + 0.09f;
return new Vec3d((double) f2, (double) f3, (double) f4);
}
@Override @OnlyIn(Dist.CLIENT)
public Vec3d getSkyColor(final BlockPos pos, final float flo) {
final float f = this.world.getCelestialAngle(flo);
float f2 = MathHelper.cos(f * 6.2831855f) * 2.0f + 0.5f;
f2 = MathHelper.clamp(f2, 0.0f, 1.0f);
final int i = ForgeHooksClient.getSkyBlendColour(this.world, pos);
float f3 = (i >> 16 & 0xFF) / 255.0f;
float f4 = (i >> 8 & 0xFF) / 255.0f;
float f5 = (i & 0xFF) / 255.0f;
f3 *= f2;
f4 *= f2;
f5 *= f2;
return new Vec3d((double) f3, (double) f4, (double) f5);
}
@Override
public boolean hasSkyLight() {
return true;
}
@Override @OnlyIn(Dist.CLIENT)
public boolean isSkyColored() {
return true;
}
@Override
public boolean canRespawnHere() {
return false;
}
@Override
public boolean isSurfaceWorld() {
return false;
}
@Override @OnlyIn(Dist.CLIENT)
public float getCloudHeight() {
return 8.0f;
}
@Override @Nullable
public BlockPos findSpawn(final ChunkPos p_206920_1_, final boolean p_206920_2_) {
final Random random = new Random(this.world.getSeed());
final BlockPos blockpos = new BlockPos(p_206920_1_.getXStart() + random.nextInt(15), 0,
p_206920_1_.getZEnd() + random.nextInt(15));
return this.world.getGroundAboveSeaLevel(blockpos).getMaterial().blocksMovement() ? blockpos : null;
}
@Override
public BlockPos getSpawnCoordinate() {
return RealmOfTheAncientsDimension.SPAWN;
}
@Override @Nullable
public BlockPos findSpawn(final int p_206921_1_, final int p_206921_2_, final boolean p_206921_3_) {
return this.findSpawn(new ChunkPos(p_206921_1_ >> 4, p_206921_2_ >> 4), p_206921_3_);
}
@Override @OnlyIn(Dist.CLIENT)
public boolean doesXZShowFog(final int p_76568_1_, final int p_76568_2_) {
return false;
}
@Override
public void onWorldSave() {
final CompoundNBT compoundnbt = new CompoundNBT();
this.world.getWorldInfo().setDimensionData(this.world.getDimension().getType(), compoundnbt);
}
}
The ModDimension registration in DBMRegistryHandler.class, which registers the dimension.
@SubscribeEvent
public static void registerModDimensions(final RegistryEvent.Register<ModDimension> event) {
event.getRegistry().registerAll
(
DBMDimensions.THE_REALM_OF_THE_ANCIENTS_DIMENSION
);
LOGGER.info("Mod dimensions registered.");
}
And lastly, the invoking of registerDimension() in DBMEventHandler.class
@SubscribeEvent
public static void registerDimensions(final RegisterDimensionsEvent event) {
DBMDimensions.registerDimensions();
}
Thanks for any help.
Edit: Also, I am having an issue with my current way of adding a dimension, which is that instead of saving dimension data in a folder like DIM1 or DIM-1, it saves it in a folder called realm_of_the_ancients, which is nested in another folder called my mod ID.