custom dimension

This commit is contained in:
Kaupenjoe
2023-11-15 19:33:11 +01:00
parent c5a594acca
commit c9c8ce9ea9
15 changed files with 303 additions and 3 deletions

View File

@@ -1,4 +1,6 @@
// 1.20.1 2023-11-15T18:58:01.8034533 Registries
// 1.20.1 2023-11-15T19:29:59.7609744 Registries
26aeb220454dd70d2b1bb9c817a822697fb41c32 data/tutorialmod/dimension/kaupendim.json
e241e971aacde6f4d0236c622c99d6c9caeb981e data/tutorialmod/dimension_type/kaupendim_type.json
51c9eccab97082d42b64f544d2177b5d81ad7822 data/tutorialmod/forge/biome_modifier/add_end_sapphire_ore.json
64776d3eaf666ec57a7e039d2d4b5801202f71c5 data/tutorialmod/forge/biome_modifier/add_nether_sapphire_ore.json
6e10223d8ca98f02feea2da07585014b7a38b1e4 data/tutorialmod/forge/biome_modifier/add_sapphire_ore.json

View File

@@ -1,9 +1,10 @@
// 1.20.1 2023-11-06T18:06:15.8629612 Block States: tutorialmod
// 1.20.1 2023-11-15T19:29:59.7619786 Block States: tutorialmod
4f6f6f43eb03fe4d9e5ce223f245812e0d7eae93 assets/tutorialmod/blockstates/catmint.json
d537bf85846bd7eeffa314408c867cc1a7d531d5 assets/tutorialmod/blockstates/corn_crop.json
a3ad172be3e203ff6840db063558f809a86ca15a assets/tutorialmod/blockstates/deepslate_sapphire_ore.json
890efea75d7398469e0d7d5704472303c35fae62 assets/tutorialmod/blockstates/end_stone_sapphire_ore.json
ff720ea0aea021144b8557786f6e7f9dead2fd78 assets/tutorialmod/blockstates/gem_polishing_station.json
596765e65e592a2678d93f5eb4be193439fb33e9 assets/tutorialmod/blockstates/mod_portal.json
0198f629d0db6eb40ebd91067bbe631626116b54 assets/tutorialmod/blockstates/nether_sapphire_ore.json
f948710d8934e2dc304504a928d05dd957567e3c assets/tutorialmod/blockstates/pine_hanging_sign.json
b56d75abb778cdd35622d3977f825c2693e38777 assets/tutorialmod/blockstates/pine_leaves.json
@@ -43,6 +44,7 @@ cf760df02741eab6d508ac36d3ffecdef636ce0a assets/tutorialmod/models/block/corn_st
55ed2caa3126b780e9a064f6a73f009a802e85fb assets/tutorialmod/models/block/corn_stage_8.json
f98cb6175399c28ce46a77b4e68664303bc2c3d3 assets/tutorialmod/models/block/deepslate_sapphire_ore.json
0c40efccb23d85e5bdf98a041a64a110359aed7c assets/tutorialmod/models/block/end_stone_sapphire_ore.json
13fed721433921cd2b79654bdd3bdc84ff763fd3 assets/tutorialmod/models/block/mod_portal.json
5df59719eaf8bf42bcfeee7e2154e96a044c2703 assets/tutorialmod/models/block/nether_sapphire_ore.json
16d5376450465fabb63cdad8d3bd11bb9d9a9ce9 assets/tutorialmod/models/block/pine_hanging_sign.json
fe5a2155456cabb8f67e4afcb4a55b01fec6e87e assets/tutorialmod/models/block/pine_leaves.json
@@ -101,6 +103,7 @@ d9f1262cb586a131f4ef9e6b15e1d052f934349c assets/tutorialmod/models/block/strippe
251495c94fbf35dd43cd773e6cf31533a8b72f09 assets/tutorialmod/models/item/deepslate_sapphire_ore.json
bf5cdde3dfa3effdde9c4358ecb01c39922d7945 assets/tutorialmod/models/item/end_stone_sapphire_ore.json
c6fe90ee84600fb9c1f42a398459a0d8b38fe198 assets/tutorialmod/models/item/gem_polishing_station.json
2ca3a24e36047206a627f88e98669476f48ec27f assets/tutorialmod/models/item/mod_portal.json
81ecae58cc575e9ce9d7f21881bbccb6bbfb4432 assets/tutorialmod/models/item/nether_sapphire_ore.json
2edec443a236a702d91b370bfa43f0dd789c7a6e assets/tutorialmod/models/item/pine_leaves.json
f8a200f45709b5a3e854d5d6885a848e58c7a355 assets/tutorialmod/models/item/pine_log.json

View File

@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "tutorialmod:block/mod_portal"
}
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "tutorialmod:block/mod_portal"
}
}

View File

@@ -0,0 +1,3 @@
{
"parent": "tutorialmod:block/mod_portal"
}

View File

@@ -0,0 +1,60 @@
{
"type": "tutorialmod:kaupendim_type",
"generator": {
"type": "minecraft:noise",
"biome_source": {
"type": "minecraft:multi_noise",
"biomes": [
{
"biome": "tutorialmod:test_biome",
"parameters": {
"continentalness": 0.0,
"depth": 0.0,
"erosion": 0.0,
"humidity": 0.0,
"offset": 0.0,
"temperature": 0.0,
"weirdness": 0.0
}
},
{
"biome": "minecraft:birch_forest",
"parameters": {
"continentalness": 0.0,
"depth": 0.0,
"erosion": 0.2,
"humidity": 0.2,
"offset": 0.0,
"temperature": 0.1,
"weirdness": 0.0
}
},
{
"biome": "minecraft:ocean",
"parameters": {
"continentalness": 0.1,
"depth": 0.0,
"erosion": 0.1,
"humidity": 0.6,
"offset": 0.0,
"temperature": 0.3,
"weirdness": 0.0
}
},
{
"biome": "minecraft:dark_forest",
"parameters": {
"continentalness": 0.2,
"depth": 0.0,
"erosion": 0.1,
"humidity": 0.3,
"offset": 0.0,
"temperature": 0.4,
"weirdness": 0.0
}
}
]
},
"settings": "minecraft:amplified"
}
}

View File

@@ -0,0 +1,20 @@
{
"ambient_light": 1.0,
"bed_works": true,
"coordinate_scale": 1.0,
"effects": "minecraft:overworld",
"fixed_time": 12000,
"has_ceiling": false,
"has_raids": false,
"has_skylight": false,
"height": 256,
"infiniburn": "#minecraft:infiniburn_overworld",
"logical_height": 256,
"min_y": 0,
"monster_spawn_block_light_limit": 0,
"monster_spawn_light_level": 0,
"natural": false,
"piglin_safe": false,
"respawn_anchor_works": false,
"ultrawarm": false
}

View File

@@ -157,6 +157,9 @@ public class ModBlocks {
public static final RegistryObject<Block> PINE_SAPLING = registerBlock("pine_sapling",
() -> new SaplingBlock(new PineTreeGrower(), BlockBehaviour.Properties.copy(Blocks.OAK_SAPLING)));
public static final RegistryObject<Block> MOD_PORTAL = registerBlock("mod_portal",
() -> new ModPortalBlock(BlockBehaviour.Properties.copy(Blocks.STONE).noLootTable().noOcclusion().noCollission()));
private static <T extends Block> RegistryObject<T> registerBlock(String name, Supplier<T> block) {
RegistryObject<T> toReturn = BLOCKS.register(name, block);

View File

@@ -0,0 +1,49 @@
package net.kaupenjoe.tutorialmod.block.custom;
import net.kaupenjoe.tutorialmod.worldgen.dimension.ModDimensions;
import net.kaupenjoe.tutorialmod.worldgen.portal.ModTeleporter;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
public class ModPortalBlock extends Block {
public ModPortalBlock(Properties pProperties) {
super(pProperties);
}
@Override
public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) {
if (pPlayer.canChangeDimensions()) {
handleKaupenPortal(pPlayer, pPos);
return InteractionResult.SUCCESS;
} else {
return InteractionResult.CONSUME;
}
}
private void handleKaupenPortal(Entity player, BlockPos pPos) {
if (player.level() instanceof ServerLevel serverlevel) {
MinecraftServer minecraftserver = serverlevel.getServer();
ResourceKey<Level> resourcekey = player.level().dimension() == ModDimensions.KAUPENDIM_LEVEL_KEY ?
Level.OVERWORLD : ModDimensions.KAUPENDIM_LEVEL_KEY;
ServerLevel portalDimension = minecraftserver.getLevel(resourcekey);
if (portalDimension != null && !player.isPassenger()) {
if(resourcekey == ModDimensions.KAUPENDIM_LEVEL_KEY) {
player.changeDimension(portalDimension, new ModTeleporter(pPos, true));
} else {
player.changeDimension(portalDimension, new ModTeleporter(pPos, false));
}
}
}
}
}

View File

@@ -81,6 +81,8 @@ public class ModBlockStateProvider extends BlockStateProvider {
hangingSignBlock(ModBlocks.PINE_HANGING_SIGN.get(), ModBlocks.PINE_WALL_HANGING_SIGN.get(), blockTexture(ModBlocks.PINE_PLANKS.get()));
saplingBlock(ModBlocks.PINE_SAPLING);
blockWithItem(ModBlocks.MOD_PORTAL);
}
private void saplingBlock(RegistryObject<Block> blockRegistryObject) {

View File

@@ -5,6 +5,7 @@ import net.kaupenjoe.tutorialmod.worldgen.ModBiomeModifiers;
import net.kaupenjoe.tutorialmod.worldgen.ModConfiguredFeatures;
import net.kaupenjoe.tutorialmod.worldgen.ModPlacedFeatures;
import net.kaupenjoe.tutorialmod.worldgen.biome.ModBiomes;
import net.kaupenjoe.tutorialmod.worldgen.dimension.ModDimensions;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.core.registries.Registries;
@@ -17,10 +18,12 @@ import java.util.concurrent.CompletableFuture;
public class ModWorldGenProvider extends DatapackBuiltinEntriesProvider {
public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()
.add(Registries.DIMENSION_TYPE, ModDimensions::bootstrapType)
.add(Registries.CONFIGURED_FEATURE, ModConfiguredFeatures::bootstrap)
.add(Registries.PLACED_FEATURE, ModPlacedFeatures::bootstrap)
.add(ForgeRegistries.Keys.BIOME_MODIFIERS, ModBiomeModifiers::bootstrap)
.add(Registries.BIOME, ModBiomes::boostrap);
.add(Registries.BIOME, ModBiomes::boostrap)
.add(Registries.LEVEL_STEM, ModDimensions::bootstrapStem);
public ModWorldGenProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries, BUILDER, Set.of(TutorialMod.MOD_ID));

View File

@@ -91,6 +91,7 @@ public class ModCreativeModTabs {
pOutput.accept(ModBlocks.PINE_LEAVES.get());
pOutput.accept(ModBlocks.PINE_SAPLING.get());
pOutput.accept(ModBlocks.MOD_PORTAL.get());
})
.build());

View File

@@ -0,0 +1,79 @@
package net.kaupenjoe.tutorialmod.worldgen.dimension;
import com.mojang.datafixers.util.Pair;
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.worldgen.biome.ModBiomes;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.util.valueproviders.ConstantInt;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.*;
import net.minecraft.world.level.dimension.BuiltinDimensionTypes;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import java.util.List;
import java.util.OptionalLong;
public class ModDimensions {
public static final ResourceKey<LevelStem> KAUPENDIM_KEY = ResourceKey.create(Registries.LEVEL_STEM,
new ResourceLocation(TutorialMod.MOD_ID, "kaupendim"));
public static final ResourceKey<Level> KAUPENDIM_LEVEL_KEY = ResourceKey.create(Registries.DIMENSION,
new ResourceLocation(TutorialMod.MOD_ID, "kaupendim"));
public static final ResourceKey<DimensionType> KAUPEN_DIM_TYPE = ResourceKey.create(Registries.DIMENSION_TYPE,
new ResourceLocation(TutorialMod.MOD_ID, "kaupendim_type"));
public static void bootstrapType(BootstapContext<DimensionType> context) {
context.register(KAUPEN_DIM_TYPE, new DimensionType(
OptionalLong.of(12000), // fixedTime
false, // hasSkylight
false, // hasCeiling
false, // ultraWarm
false, // natural
1.0, // coordinateScale
true, // bedWorks
false, // respawnAnchorWorks
0, // minY
256, // height
256, // logicalHeight
BlockTags.INFINIBURN_OVERWORLD, // infiniburn
BuiltinDimensionTypes.OVERWORLD_EFFECTS, // effectsLocation
1.0f, // ambientLight
new DimensionType.MonsterSettings(false, false, ConstantInt.of(0), 0)));
}
public static void bootstrapStem(BootstapContext<LevelStem> context) {
HolderGetter<Biome> biomeRegistry = context.lookup(Registries.BIOME);
HolderGetter<DimensionType> dimTypes = context.lookup(Registries.DIMENSION_TYPE);
HolderGetter<NoiseGeneratorSettings> noiseGenSettings = context.lookup(Registries.NOISE_SETTINGS);
NoiseBasedChunkGenerator wrappedChunkGenerator = new NoiseBasedChunkGenerator(
new FixedBiomeSource(biomeRegistry.getOrThrow(ModBiomes.TEST_BIOME)),
noiseGenSettings.getOrThrow(NoiseGeneratorSettings.AMPLIFIED));
NoiseBasedChunkGenerator noiseBasedChunkGenerator = new NoiseBasedChunkGenerator(
MultiNoiseBiomeSource.createFromList(
new Climate.ParameterList<>(List.of(Pair.of(
Climate.parameters(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(ModBiomes.TEST_BIOME)),
Pair.of(
Climate.parameters(0.1F, 0.2F, 0.0F, 0.2F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(Biomes.BIRCH_FOREST)),
Pair.of(
Climate.parameters(0.3F, 0.6F, 0.1F, 0.1F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(Biomes.OCEAN)),
Pair.of(
Climate.parameters(0.4F, 0.3F, 0.2F, 0.1F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(Biomes.DARK_FOREST))
))),
noiseGenSettings.getOrThrow(NoiseGeneratorSettings.AMPLIFIED));
LevelStem stem = new LevelStem(dimTypes.getOrThrow(ModDimensions.KAUPEN_DIM_TYPE), noiseBasedChunkGenerator);
context.register(KAUPENDIM_KEY, stem);
}
}

View File

@@ -0,0 +1,62 @@
package net.kaupenjoe.tutorialmod.worldgen.portal;
import net.kaupenjoe.tutorialmod.block.ModBlocks;
import net.kaupenjoe.tutorialmod.block.custom.ModPortalBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.material.Fluids;
import net.minecraftforge.common.util.ITeleporter;
import java.util.function.Function;
public class ModTeleporter implements ITeleporter {
public static BlockPos thisPos = BlockPos.ZERO;
public static boolean insideDimension = true;
public ModTeleporter(BlockPos pos, boolean insideDim) {
thisPos = pos;
insideDimension = insideDim;
}
@Override
public Entity placeEntity(Entity entity, ServerLevel currentWorld, ServerLevel destinationWorld,
float yaw, Function<Boolean, Entity> repositionEntity) {
entity = repositionEntity.apply(false);
int y = 61;
if (!insideDimension) {
y = thisPos.getY();
}
BlockPos destinationPos = new BlockPos(thisPos.getX(), y, thisPos.getZ());
int tries = 0;
while ((destinationWorld.getBlockState(destinationPos).getBlock() != Blocks.AIR) &&
!destinationWorld.getBlockState(destinationPos).canBeReplaced(Fluids.WATER) &&
(destinationWorld.getBlockState(destinationPos.above()).getBlock() != Blocks.AIR) &&
!destinationWorld.getBlockState(destinationPos.above()).canBeReplaced(Fluids.WATER) && (tries < 25)) {
destinationPos = destinationPos.above(2);
tries++;
}
entity.setPos(destinationPos.getX(), destinationPos.getY(), destinationPos.getZ());
if (insideDimension) {
boolean doSetBlock = true;
for (BlockPos checkPos : BlockPos.betweenClosed(destinationPos.below(10).west(10),
destinationPos.above(10).east(10))) {
if (destinationWorld.getBlockState(checkPos).getBlock() instanceof ModPortalBlock) {
doSetBlock = false;
break;
}
}
if (doSetBlock) {
destinationWorld.setBlock(destinationPos, ModBlocks.MOD_PORTAL.get().defaultBlockState(), 3);
}
}
return entity;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B