custom dimension
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "tutorialmod:block/mod_portal"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "tutorialmod:block/mod_portal"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"parent": "tutorialmod:block/mod_portal"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 |
Reference in New Issue
Block a user