Skip to content

Commit 8b6f428

Browse files
moon worldgen + begining of the moon base
Signed-off-by: Real Ant Engineer <[email protected]>
1 parent 91dab50 commit 8b6f428

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+721
-198
lines changed

build.gradle

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ repositories {
123123
}
124124

125125
maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" } // ForgeConfigAPIPort
126+
127+
//TODO maybe use Jitpack
126128
maven {
127129
url = "https://maven.pkg.github.com/RealAntEngineer/Formic_API" // maven for Formic_API (temporary)
128130
credentials {
@@ -234,4 +236,12 @@ publishing {
234236

235237
tasks.withType(JavaCompile).configureEach {
236238
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
239+
}
240+
241+
// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior.
242+
idea {
243+
module {
244+
downloadSources = true
245+
downloadJavadoc = true
246+
}
237247
}

src/main/java/com/rae/creatingspace/content/planets/worldgen/CraterCarver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public boolean carve(CarvingContext context, CraterCarverConfig config, ChunkAcc
4747
boolean fresh = random.nextInt(16) == 1;
4848

4949
//adjust structures position
50-
if (chunk.hasAnyStructureReferences()){
50+
/*if (chunk.hasAnyStructureReferences()){
5151
for (Map.Entry<Structure, StructureStart> entry:chunk.getAllStarts().entrySet()){
5252
if (entry.getKey().step().equals(GenerationStep.Decoration.SURFACE_STRUCTURES)){
5353
double xDev = Math.abs((chunk.getPos().getBlockX(entry.getValue().getBoundingBox().getCenter().getX())) - craterCenter.getX());
@@ -66,7 +66,7 @@ public boolean carve(CarvingContext context, CraterCarverConfig config, ChunkAcc
6666
}
6767
}
6868
}
69-
}
69+
}*/
7070

7171

7272
for (int innerChunkX = 0; innerChunkX < 16; innerChunkX++) { //iterate through positions in chunk

src/main/java/com/rae/creatingspace/content/rocket/engine/SuperRocketStructuralBlock.java

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,17 @@
11
package com.rae.creatingspace.content.rocket.engine;
22

3-
import com.rae.creatingspace.init.ingameobject.BlockInit;
43
import com.rae.formicapi.multiblock.MBStructureBlock;
54
import com.simibubi.create.api.equipment.goggles.IProxyHoveringInformation;
6-
import com.simibubi.create.content.equipment.wrench.IWrenchable;
7-
import com.simibubi.create.foundation.block.render.MultiPosDestructionHandler;
8-
import com.tterrag.registrate.util.nullness.NonnullType;
9-
import net.minecraft.client.multiplayer.ClientLevel;
10-
import net.minecraft.client.particle.ParticleEngine;
115
import net.minecraft.core.BlockPos;
126
import net.minecraft.core.Direction;
13-
import net.minecraft.server.level.ServerLevel;
14-
import net.minecraft.util.RandomSource;
15-
import net.minecraft.world.InteractionResult;
16-
import net.minecraft.world.entity.LivingEntity;
17-
import net.minecraft.world.entity.player.Player;
187
import net.minecraft.world.item.ItemStack;
19-
import net.minecraft.world.item.context.UseOnContext;
208
import net.minecraft.world.level.BlockGetter;
219
import net.minecraft.world.level.Level;
2210
import net.minecraft.world.level.LevelAccessor;
2311
import net.minecraft.world.level.block.Block;
24-
import net.minecraft.world.level.block.Blocks;
25-
import net.minecraft.world.level.block.DirectionalBlock;
2612
import net.minecraft.world.level.block.state.BlockState;
27-
import net.minecraft.world.level.block.state.StateDefinition.Builder;
28-
import net.minecraft.world.phys.BlockHitResult;
29-
import net.minecraft.world.phys.HitResult;
30-
import net.minecraftforge.api.distmarker.Dist;
31-
import net.minecraftforge.api.distmarker.OnlyIn;
32-
import net.minecraftforge.client.extensions.common.IClientBlockExtensions;
33-
import org.jetbrains.annotations.NotNull;
34-
import org.jetbrains.annotations.Nullable;
3513
import org.lwjgl.system.NonnullDefault;
3614

37-
import java.util.ArrayList;
38-
import java.util.HashSet;
39-
import java.util.Set;
40-
import java.util.function.Consumer;
41-
import java.util.function.Supplier;
4215
@NonnullDefault
4316
public class SuperRocketStructuralBlock extends MBStructureBlock implements IProxyHoveringInformation {
4417
public SuperRocketStructuralBlock(Properties p_52591_) {

src/main/java/com/rae/creatingspace/content/worldgen/CustomDensityFunctions.java

Lines changed: 109 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,122 @@
44
import com.mojang.serialization.MapCodec;
55
import com.mojang.serialization.codecs.RecordCodecBuilder;
66
import net.minecraft.util.KeyDispatchDataCodec;
7+
import net.minecraft.util.Mth;
78
import net.minecraft.world.level.levelgen.DensityFunction;
89
import org.jetbrains.annotations.NotNull;
910

1011
public class CustomDensityFunctions {
12+
public record FolderDF(DensityFunction input, float a, float b, float c, double minValue, double maxValue) implements DensityFunction.SimpleFunction {
13+
//todo -> rename variable and analyse what it does
14+
public static final MapCodec<FolderDF> DATA_CODEC = RecordCodecBuilder.mapCodec((instance) ->
15+
instance.group(
16+
DensityFunction.HOLDER_HELPER_CODEC.fieldOf("input").forGetter(FolderDF::input),
17+
Codec.FLOAT.fieldOf("a").forGetter(FolderDF::a),
18+
Codec.FLOAT.fieldOf("b").forGetter(FolderDF::b),
19+
Codec.FLOAT.fieldOf("c").forGetter(FolderDF::c)
20+
21+
)
22+
.apply(instance, FolderDF::new));
23+
24+
public static final KeyDispatchDataCodec<FolderDF> CODEC = KeyDispatchDataCodec.of(DATA_CODEC);
25+
26+
public FolderDF(DensityFunction input, float a, float b, float c) {
27+
this(input, a, b, c,
28+
Math.min((Math.max(input.minValue(),input.maxValue()) - a - b) * c,-b*c),
29+
Math.max((Math.max(input.minValue(),input.maxValue()) - a - b) * c,-b*c));
30+
}
31+
32+
33+
@Override
34+
public double compute(FunctionContext context) {
35+
float X = (float) input.compute(context);
36+
return c * (Mth.abs(Mth.abs(X) - a) - b);
37+
}
38+
39+
@Override
40+
public @NotNull KeyDispatchDataCodec<? extends DensityFunction> codec() {
41+
return CODEC;
42+
}
43+
}
44+
45+
public record SinInterpolationDF(DensityFunction input, DensityFunction argument1, DensityFunction argument2) implements DensityFunction.SimpleFunction {
46+
47+
public static final MapCodec<SinInterpolationDF> DATA_CODEC = RecordCodecBuilder.mapCodec((instance) ->
48+
instance.group(
49+
DensityFunction.HOLDER_HELPER_CODEC.fieldOf("input").forGetter(SinInterpolationDF::input),
50+
DensityFunction.HOLDER_HELPER_CODEC.fieldOf("argument1").forGetter(SinInterpolationDF::argument1),
51+
DensityFunction.HOLDER_HELPER_CODEC.fieldOf("argument2").forGetter(SinInterpolationDF::argument2)
52+
53+
)
54+
.apply(instance, SinInterpolationDF::new));
55+
56+
public static final KeyDispatchDataCodec<SinInterpolationDF> CODEC = KeyDispatchDataCodec.of(DATA_CODEC);
57+
58+
@Override
59+
public double compute(@NotNull FunctionContext context) {
60+
double X = input.compute(context);
61+
// 16*X**4 - 32 * X**3 + 16 * X**2
62+
double interpolator = X * X * (16 * X * (X -2) + 16);
63+
if (interpolator!=0)
64+
System.out.println("X :"+X+" first function : "+argument1.compute(context)+ " second function : "+ argument2.compute(context) + " interpolator : "+ interpolator + " interpolated : "+ (argument1.compute(context) * interpolator + argument2.compute(context) * (1 - interpolator)));
65+
return argument1.compute(context) * interpolator + argument2.compute(context) * (1 - interpolator);
66+
//always equal to -1. Why ? -> because argument2 = -1 and interpolator = 0 because X = 1
67+
}
68+
69+
@Override
70+
public double minValue() {
71+
return argument1.minValue() + argument2.minValue();
72+
}
73+
74+
@Override
75+
public double maxValue() {
76+
return argument1.maxValue() + argument2.maxValue();
77+
}
78+
79+
@Override
80+
public @NotNull KeyDispatchDataCodec<? extends DensityFunction> codec() {
81+
return CODEC;
82+
}
83+
}
84+
85+
public record LinearInterpolationDF(DensityFunction input, DensityFunction argument1, DensityFunction argument2) implements DensityFunction.SimpleFunction {
86+
87+
public static final MapCodec<LinearInterpolationDF> DATA_CODEC = RecordCodecBuilder.mapCodec((instance) ->
88+
instance.group(
89+
DensityFunction.HOLDER_HELPER_CODEC.fieldOf("input").forGetter(LinearInterpolationDF::input),
90+
DensityFunction.HOLDER_HELPER_CODEC.fieldOf("argument1").forGetter(LinearInterpolationDF::argument1),
91+
DensityFunction.HOLDER_HELPER_CODEC.fieldOf("argument2").forGetter(LinearInterpolationDF::argument2)
92+
93+
)
94+
.apply(instance, LinearInterpolationDF::new));
95+
96+
public static final KeyDispatchDataCodec<LinearInterpolationDF> CODEC = KeyDispatchDataCodec.of(DATA_CODEC);
97+
98+
@Override
99+
public double compute(FunctionContext context) {
100+
double X = input.compute(context);
101+
return argument1.compute(context) * X + argument2.compute(context) * (1 - X);
102+
}
103+
104+
@Override
105+
public double minValue() {
106+
return argument1.minValue() + argument2.minValue();
107+
}
108+
109+
@Override
110+
public double maxValue() {
111+
return argument1.maxValue() + argument2.maxValue();
112+
}
113+
114+
@Override
115+
public @NotNull KeyDispatchDataCodec<? extends DensityFunction> codec() {
116+
return CODEC;
117+
}
118+
}
11119

12120
// TODO maybe do an abstraction for the simplex noise directly ?? -> no I can't, I will need to input the parameters into it
13121
// with amplitudes and all of that
14-
15-
//direct copy of endIsland noise to understand what it does
16-
public static final class WorleyDensityFunction implements DensityFunction.SimpleFunction {
122+
public static final class WorleyDensityFunction implements DensityFunction.SimpleFunction {
17123
WorleyNoise noise;
18124

19125
public static final MapCodec<WorleyDensityFunction> DATA_CODEC = RecordCodecBuilder.mapCodec((instance) -> instance.group(

src/main/java/com/rae/creatingspace/content/worldgen/WorleyNoise.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import net.minecraft.world.level.levelgen.XoroshiroRandomSource;
66

77
public class WorleyNoise {
8+
//TODO Optimise it further
9+
//TODO make a 2d version of it -> makes no sens to use 3d version and to
810
private static final float K = 0.142857142857f;
911
private static final float Ko = 0.428571428571f;
1012
private static final float K2 = 0.020408163265306f;
@@ -24,15 +26,16 @@ public float getYSize() {
2426
private final float XZSize;
2527
private final float YSize;
2628
private float x0,y0,z0;
27-
private final int[] p = new int[289];//go to 256 rather than 289
29+
private final int[] p = new int[289];//TODO go to 256 rather than 289, now that we use the seed it doesn't make sens anymore
30+
//TODO have 3 permutations for x, y, z for improved performance ? need to do profiling and see if it changes anything.
2831
public WorleyNoise(float XZSize, float YSize) {
2932
this.XZSize = XZSize;
3033
this.YSize = YSize;
3134
setSeed(0L);
3235
}
3336
public void setSeed(long seed){
3437
RandomSource random = new XoroshiroRandomSource(seed);
35-
this.x0 = random.nextFloat() * 289.0f;
38+
this.x0 = random.nextFloat() * 289.0f;//TODO is this needed ?
3639
this.y0 = random.nextFloat() * 289.0f;
3740
this.z0 = random.nextFloat() * 289.0f;
3841

src/main/java/com/rae/creatingspace/init/ingameobject/FluidInit.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ private static FluidBuilder<VirtualFluid, CreateRegistrate> registrateCustomVirt
4040
customFlowing(name));
4141
}
4242

43+
//TODO add metalic hydrogen and methalox_monoprop
44+
//TODO add color to fluids to e able to use said color in the cryo tank overing text
4345
public static final FluidEntry<VirtualFluid> LIQUID_METHANE =
4446
registrateCustomVirtualLiquid("liquid_methane")
4547
.properties(p -> p.viscosity(1000).temperature(90).density(500)
@@ -183,7 +185,6 @@ public static void registerFluidInteractions() {
183185

184186
//copy of Create's class
185187
private static class SolidRenderedPlaceableFluidType extends AllFluids.TintedFluidType {
186-
187188
private Vector3f fogColor;
188189
private Supplier<Float> fogDistance;
189190

src/main/java/com/rae/creatingspace/init/worldgen/DensityFunctionInit.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.mojang.serialization.Codec;
44
import com.rae.creatingspace.CreatingSpace;
55
import com.rae.creatingspace.content.worldgen.CustomDensityFunctions;
6-
import net.minecraft.core.Registry;
76
import net.minecraft.core.registries.Registries;
87
import net.minecraft.world.level.levelgen.DensityFunction;
98
import net.minecraftforge.eventbus.api.IEventBus;
@@ -12,6 +11,13 @@
1211

1312
public class DensityFunctionInit {
1413
private static final DeferredRegister<Codec<? extends DensityFunction>> DENSITY_FUNCTIONS = DeferredRegister.create(Registries.DENSITY_FUNCTION_TYPE, CreatingSpace.MODID);
14+
//TODO add linear_interpolation + sin interpolation
15+
16+
public static final RegistryObject<Codec<CustomDensityFunctions.SinInterpolationDF>> SIN_INTEROPOL = DENSITY_FUNCTIONS
17+
.register("sin_interpolation", CustomDensityFunctions.SinInterpolationDF.CODEC::codec);
18+
19+
public static final RegistryObject<Codec<CustomDensityFunctions.LinearInterpolationDF>> LIN_INTEROPOL = DENSITY_FUNCTIONS
20+
.register("linear_interpolation", CustomDensityFunctions.LinearInterpolationDF.CODEC::codec);
1521

1622
public static final RegistryObject<Codec<CustomDensityFunctions.WorleyDensityFunction>> WORLEY_NOISE_FUNCTION = DENSITY_FUNCTIONS
1723
.register("worley_noise", CustomDensityFunctions.WorleyDensityFunction.CODEC::codec);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.rae.creatingspace.mixin.worldgen;
2+
3+
import net.minecraft.core.Holder;
4+
import net.minecraft.resources.ResourceLocation;
5+
import net.minecraft.world.level.levelgen.Heightmap;
6+
import net.minecraft.world.level.levelgen.heightproviders.HeightProvider;
7+
import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;
8+
import net.minecraft.world.level.levelgen.structure.structures.JigsawStructure;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.gen.Accessor;
11+
12+
import java.util.Optional;
13+
14+
@Mixin(JigsawStructure.class)
15+
public interface JigsawStructureAccessor {
16+
@Accessor("startPool")
17+
Holder<StructureTemplatePool> getStartPool();
18+
19+
@Accessor("startJigsawName")
20+
Optional<ResourceLocation> getStartJigsawName();
21+
22+
@Accessor("maxDepth")
23+
int getMaxDepth();
24+
25+
@Accessor("startHeight")
26+
HeightProvider getStartHeight();
27+
28+
@Accessor("useExpansionHack")
29+
boolean getUseExpansionHack();
30+
31+
@Accessor("projectStartToHeightmap")
32+
Optional<Heightmap.Types> getProjectStartToHeightmap();
33+
34+
@Accessor("maxDistanceFromCenter")
35+
int getMaxDistanceFromCenter();
36+
}
37+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.rae.creatingspace.mixin.worldgen;
2+
3+
import com.mojang.serialization.Codec;
4+
import com.mojang.serialization.DataResult;
5+
import com.mojang.serialization.codecs.RecordCodecBuilder;
6+
import net.minecraft.resources.ResourceLocation;
7+
import net.minecraft.util.ExtraCodecs;
8+
import net.minecraft.world.level.levelgen.Heightmap;
9+
import net.minecraft.world.level.levelgen.heightproviders.HeightProvider;
10+
import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;
11+
import net.minecraft.world.level.levelgen.structure.structures.JigsawStructure;
12+
import org.spongepowered.asm.mixin.*;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
import org.spongepowered.asm.mixin.injection.Inject;
15+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
16+
17+
import static net.minecraft.world.level.levelgen.structure.Structure.settingsCodec;
18+
19+
@Mixin(JigsawStructure.class)
20+
public abstract class JigsawStructureMixin implements JigsawStructureAccessor{
21+
@Shadow
22+
@Mutable
23+
@Final
24+
public static Codec<JigsawStructure> CODEC;
25+
26+
@Unique
27+
private static DataResult<JigsawStructure> cS_1_20_1$verifyRange(JigsawStructure p_286886_) {
28+
byte b0 = switch (p_286886_.terrainAdaptation()) {
29+
case NONE -> 0;
30+
case BURY, BEARD_THIN, BEARD_BOX -> 12;
31+
default -> throw new IncompatibleClassChangeError();
32+
};
33+
34+
int i = b0;
35+
return ((JigsawStructureAccessor) (Object)p_286886_).getMaxDistanceFromCenter() + i > 128 ? DataResult.error(() -> "Structure size including terrain adaptation must not exceed 128") :
36+
DataResult.success(p_286886_);
37+
}
38+
39+
@Inject(method = "<clinit>", at = @At("TAIL"))
40+
private static void overrideCodec(CallbackInfo ci) {
41+
CODEC = ExtraCodecs.validate(
42+
RecordCodecBuilder.mapCodec((instance) ->
43+
instance.group(
44+
settingsCodec(instance),
45+
StructureTemplatePool.CODEC.fieldOf("start_pool").forGetter(s -> ((JigsawStructureAccessor) (Object)s).getStartPool()),
46+
ResourceLocation.CODEC.optionalFieldOf("start_jigsaw_name").forGetter(s -> ((JigsawStructureAccessor) (Object) s).getStartJigsawName()),
47+
Codec.intRange(0, 128).fieldOf("size").forGetter(s -> ((JigsawStructureAccessor) (Object) s).getMaxDepth()),
48+
HeightProvider.CODEC.fieldOf("start_height").forGetter(s -> ((JigsawStructureAccessor) (Object) s).getStartHeight()),
49+
Codec.BOOL.fieldOf("use_expansion_hack").forGetter(s -> ((JigsawStructureAccessor) (Object) s).getUseExpansionHack()),
50+
Heightmap.Types.CODEC.optionalFieldOf("project_start_to_heightmap").forGetter(s -> ((JigsawStructureAccessor) (Object)s).getProjectStartToHeightmap()),
51+
Codec.intRange(1, 128).fieldOf("max_distance_from_center").forGetter(s -> ((JigsawStructureAccessor) (Object) s).getMaxDistanceFromCenter())
52+
).apply(instance, JigsawStructure::new)
53+
),
54+
JigsawStructureMixin::cS_1_20_1$verifyRange
55+
).codec();
56+
}
57+
}

src/main/resources/creatingspace.mixins.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
"recipe.SequencedAssemblyRecipeMixin",
3131
"recipe.SequencedAssemblyRecipeSerializerMixin",
3232
"worldgen.FluidStatusAccessor",
33+
"worldgen.JigsawStructureAccessor",
34+
"worldgen.JigsawStructureMixin",
3335
"worldgen.NoiseBasedAquiferMixin",
3436
"worldgen.NoiseChunkMixin",
3537
"worldgen.NoiseGeneratorSettingsMixin",

0 commit comments

Comments
 (0)