Skip to content

Commit

Permalink
Mixing the mixins, but they don´t mix well
Browse files Browse the repository at this point in the history
  • Loading branch information
GirafiStudios committed Mar 26, 2022
1 parent b47f9cd commit d352e5b
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 15 deletions.
9 changes: 8 additions & 1 deletion src/main/java/com/teammetallurgy/atum/Atum.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.properties.WoodType;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.eventbus.api.IEventBus;
Expand All @@ -45,9 +48,13 @@
@Mod(value = Atum.MOD_ID)
public class Atum {
public static final String MOD_ID = "atum";
public static final ResourceLocation LOCATION = new ResourceLocation(MOD_ID, "atum");
public static final Logger LOG = LogManager.getLogger(StringUtils.capitalize(MOD_ID));
public static final CreativeModeTab GROUP = new AtumItemGroup();
public static final ResourceKey<Level> ATUM = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(MOD_ID, "atum"));
public static final ResourceKey<Level> ATUM = ResourceKey.create(Registry.DIMENSION_REGISTRY, LOCATION);
public static final ResourceKey<LevelStem> LEVEL_STEM = ResourceKey.create(Registry.LEVEL_STEM_REGISTRY, LOCATION);
public static final ResourceKey<DimensionType> DIMENSION_TYPE = ResourceKey.create(Registry.DIMENSION_TYPE_REGISTRY, LOCATION);
public static final ResourceKey<NoiseGeneratorSettings> DIMENSION_SETTINGS = ResourceKey.create(Registry.NOISE_GENERATOR_SETTINGS_REGISTRY, LOCATION);
public static Codec<AtumBiomeSource> ATUM_MULTI_NOISE;
public static final WoodType PALM = WoodType.create("atum_palm");
public static final WoodType DEADWOOD = WoodType.create("atum_deadwood");
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/teammetallurgy/atum/init/AtumBiomes.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public static void addBiomeTags() {
@SubscribeEvent
public static void registerBiomes(RegistryEvent.Register<Biome> event) {
AtumBiomes.addBiomeTags();
Atum.ATUM_MULTI_NOISE = Registry.register(Registry.BIOME_SOURCE, new ResourceLocation(Atum.MOD_ID, "atum_multi_noise"), AtumBiomeSource.ATUM_BIOME_SOURCE_CODEC);
Atum.ATUM_MULTI_NOISE = Registry.register(Registry.BIOME_SOURCE, new ResourceLocation(Atum.MOD_ID, "atum_multi_noise"), AtumBiomeSource.CODEC);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,58 @@
package com.teammetallurgy.atum.mixin;

import net.minecraft.resources.RegistryFileCodec;
import com.google.gson.JsonElement;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.Lifecycle;
import com.teammetallurgy.atum.Atum;
import com.teammetallurgy.atum.world.biome.AtumBiomeSource;
import net.minecraft.core.*;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.resources.RegistryLoader;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.ChunkGenerator;
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 net.minecraft.world.level.levelgen.structure.StructureSet;
import net.minecraft.world.level.levelgen.synth.NormalNoise;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(RegistryFileCodec.class)
import java.util.OptionalInt;

@Mixin(RegistryLoader.class)
public class MixinAtumBiomeBuilder {

@Inject(method = "overrideElementFromResources(Lnet/minecraft/core/WritableRegistry;Lnet/minecraft/resources/ResourceKey;Lcom/mojang/serialization/Codec;Lnet/minecraft/resources/ResourceKey;Lcom/mojang/serialization/DynamicOps;)Lcom/mojang/serialization/DataResult;", at = @At("HEAD"))
void register(WritableRegistry<?> writableRegistry, ResourceKey<? extends Registry<?>> registryResourceKey, Codec<?> codec, ResourceKey<?> resourceKey, DynamicOps<JsonElement> dynamicOps, CallbackInfoReturnable<DataResult<Holder<?>>> cir) {
//System.out.println(writableRegistry.get(Atum.LOCATION));
if (registryResourceKey == Registry.LEVEL_STEM_REGISTRY && writableRegistry.get(Atum.LOCATION) == null) {
System.out.println("I GOT CALLED HALLEAWUASDHCSAHBdfsa HDSAH");
this.addDimensions((MappedRegistry<LevelStem>) writableRegistry);
}
}

private void addDimensions(MappedRegistry<LevelStem> registry) {
RegistryAccess registryAccess = BuiltinRegistries.ACCESS;
LevelStem dimension = createDimension(registryAccess.registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY),
registryAccess.registryOrThrow(Registry.STRUCTURE_SET_REGISTRY),
registryAccess.registryOrThrow(Registry.BIOME_REGISTRY),
registryAccess.registryOrThrow(Registry.NOISE_GENERATOR_SETTINGS_REGISTRY),
registryAccess.registryOrThrow(Registry.NOISE_REGISTRY)
);
registry.registerOrOverride(OptionalInt.empty(), Atum.LEVEL_STEM, dimension, Lifecycle.stable());
}

private LevelStem createDimension(Registry<DimensionType> dimensionTypeRegistry, Registry<StructureSet> structureSetRegistry, Registry<Biome> biomeRegistry, Registry<NoiseGeneratorSettings> dimensionSettingsRegistry, Registry<NormalNoise.NoiseParameters> paramRegistry) {
Holder<DimensionType> dimensionType = dimensionTypeRegistry.getHolderOrThrow(Atum.DIMENSION_TYPE);
ChunkGenerator generator = new NoiseBasedChunkGenerator(structureSetRegistry, paramRegistry, AtumBiomeSource.Preset.ATUM.biomeSource(biomeRegistry, true), 0L, dimensionSettingsRegistry.getOrCreateHolder(NoiseGeneratorSettings.OVERWORLD)); //TODO Seed for ChunkGenerator? Or is the one passed in LevelStem fine?

return new LevelStem(dimensionType, generator, true);
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
package com.teammetallurgy.atum.world.biome;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.mojang.datafixers.util.Either;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.teammetallurgy.atum.Atum;
import com.teammetallurgy.atum.world.level.biome.AtumBiomeBuilder;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.ExtraCodecs;
import net.minecraft.util.VisibleForDebug;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.biome.Climate;
import net.minecraft.world.level.biome.MultiNoiseBiomeSource;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;

import javax.annotation.Nonnull;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;

public class AtumBiomeSource extends BiomeSource {
public static final MapCodec<AtumBiomeSource> DIRECT_CODEC = RecordCodecBuilder.mapCodec((k) -> {
Expand All @@ -34,21 +35,30 @@ public class AtumBiomeSource extends BiomeSource {
return biomeSource.parameters;
})).apply(k, AtumBiomeSource::new);
});
public static final Codec<AtumBiomeSource> ATUM_BIOME_SOURCE_CODEC = DIRECT_CODEC.codec();
public static final Codec<AtumBiomeSource> CODEC = Codec.mapEither(PresetInstance.CODEC, DIRECT_CODEC).xmap((e) -> {
return e.map(PresetInstance::biomeSource, Function.identity());
}, (biomeSource) -> {
return biomeSource.preset().map(Either::<PresetInstance, AtumBiomeSource>left).orElseGet(() -> {
return Either.right(biomeSource);
});
}).codec();
private final Climate.ParameterList<Holder<Biome>> parameters;
private final Optional<PresetInstance> preset;

AtumBiomeSource(Climate.ParameterList<Holder<Biome>> parameters) {
private AtumBiomeSource(Climate.ParameterList<Holder<Biome>> parameters) {
this(parameters, Optional.empty());
}

AtumBiomeSource(Climate.ParameterList<Holder<Biome>> parameters, Optional<PresetInstance> preset) {
super(parameters.values().stream().map(Pair::getSecond));
this.preset = preset;
this.parameters = parameters;

ImmutableList.Builder<Pair<Climate.ParameterPoint, Supplier<Biome>>> builder = ImmutableList.builder();
new AtumBiomeBuilder().addBiomes(consumer -> builder.add(consumer.mapSecond(key -> () -> BuiltinRegistries.BIOME.getOrThrow(key))));
}

@Override
@Nonnull
protected Codec<? extends BiomeSource> codec() {
return ATUM_BIOME_SOURCE_CODEC;
return CODEC;
}

@Override
Expand All @@ -57,6 +67,14 @@ public BiomeSource withSeed(long seed) {
return this;
}

private Optional<PresetInstance> preset() {
return this.preset;
}

public boolean stable(Preset p_187064_) {
return this.preset.isPresent() && Objects.equals(this.preset.get().preset(), p_187064_);
}

@Override
@Nonnull
public Holder<Biome> getNoiseBiome(int i, int i1, int i2, Climate.Sampler sampler) {
Expand All @@ -67,4 +85,52 @@ public Holder<Biome> getNoiseBiome(int i, int i1, int i2, Climate.Sampler sample
public Holder<Biome> getNoiseBiome(Climate.TargetPoint targetPoint) {
return this.parameters.findValue(targetPoint);
}

public static class Preset {
static final Map<ResourceLocation, Preset> BY_NAME = Maps.newHashMap();
final ResourceLocation name;
private final Function<Registry<Biome>, Climate.ParameterList<Holder<Biome>>> parameterSource;
public static final MultiNoiseBiomeSource.Preset ATUM = new MultiNoiseBiomeSource.Preset(new ResourceLocation(Atum.MOD_ID, "atum"), (p_204281_) -> {
ImmutableList.Builder<Pair<Climate.ParameterPoint, Holder<Biome>>> builder = ImmutableList.builder();
(new AtumBiomeBuilder()).addBiomes((p_204279_) -> {
builder.add(p_204279_.mapSecond(p_204281_::getOrCreateHolder));
});
return new Climate.ParameterList<>(builder.build());
});

public Preset(ResourceLocation resourceLocation, Function<Registry<Biome>, Climate.ParameterList<Holder<Biome>>> parameterSource) {
this.name = resourceLocation;
this.parameterSource = parameterSource;
BY_NAME.put(resourceLocation, this);
}

AtumBiomeSource biomeSource(PresetInstance presetInstance, boolean b) {
Climate.ParameterList<Holder<Biome>> parameterlist = this.parameterSource.apply(presetInstance.biomes());
return new AtumBiomeSource(parameterlist, b ? Optional.of(presetInstance) : Optional.empty());
}

public AtumBiomeSource biomeSource(Registry<Biome> registry, boolean b) {
return this.biomeSource(new PresetInstance(this, registry), b);
}

public AtumBiomeSource biomeSource(Registry<Biome> registry) {
return this.biomeSource(registry, true);
}
}

static record PresetInstance(Preset preset, Registry<Biome> biomes) {
public static final MapCodec<PresetInstance> CODEC = RecordCodecBuilder.mapCodec((p_48558_) -> {
return p_48558_.group(ResourceLocation.CODEC.flatXmap((p_151869_) -> {
return Optional.ofNullable(Preset.BY_NAME.get(p_151869_)).map(DataResult::success).orElseGet(() -> {
return DataResult.error("Unknown preset: " + p_151869_);
});
}, (p_151867_) -> {
return DataResult.success(p_151867_.name);
}).fieldOf("preset").stable().forGetter(PresetInstance::preset), RegistryOps.retrieveRegistry(Registry.BIOME_REGISTRY).forGetter(PresetInstance::biomes)).apply(p_48558_, p_48558_.stable(PresetInstance::new));
});

public AtumBiomeSource biomeSource() {
return this.preset.biomeSource(this, true);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ public static void onBiomeLoad(BiomeLoadingEvent event) { //Passive spawns handl
int weight = AtumConfig.Helper.get(baseCategory, mobName, "weight");
int min = AtumConfig.Helper.get(baseCategory, mobName, "min");
int max = AtumConfig.Helper.get(baseCategory, mobName, "max");
event.getSpawns().getSpawner(classification).add(new MobSpawnSettings.SpawnerData(entityType, weight, min, max));
if (weight > 0 && min > 0) {
event.getSpawns().getSpawner(classification).add(new MobSpawnSettings.SpawnerData(entityType, weight, min, max));
}
}
}
}
Expand Down

0 comments on commit d352e5b

Please sign in to comment.