mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-04 00:45:57 +00:00
Merge remote-tracking branch 'duplexsystem/dev/enviroment' into ver/6.2.0
This commit is contained in:
commit
4487be03f1
1
.gitignore
vendored
1
.gitignore
vendored
@ -246,3 +246,4 @@ nbdist/
|
|||||||
/run/
|
/run/
|
||||||
|
|
||||||
**/testDir/
|
**/testDir/
|
||||||
|
platforms/fabric/run/config/Terra/config.yml
|
||||||
|
@ -32,6 +32,10 @@ import com.dfsek.terra.mod.util.PresetUtil;
|
|||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.MinecraftVersion;
|
import net.minecraft.MinecraftVersion;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.sound.BiomeAdditionsSound;
|
||||||
|
import net.minecraft.sound.BiomeMoodSound;
|
||||||
|
import net.minecraft.sound.MusicSound;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.registry.BuiltinRegistries;
|
import net.minecraft.util.registry.BuiltinRegistries;
|
||||||
import net.minecraft.world.dimension.DimensionOptions;
|
import net.minecraft.world.dimension.DimensionOptions;
|
||||||
|
@ -6,12 +6,14 @@ import com.dfsek.terra.fabric.FabricEntryPoint;
|
|||||||
import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions;
|
import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions;
|
||||||
|
|
||||||
import com.dfsek.terra.mod.config.ProtoPlatformBiome;
|
import com.dfsek.terra.mod.config.ProtoPlatformBiome;
|
||||||
|
import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder;
|
||||||
import com.dfsek.terra.mod.util.MinecraftUtil;
|
import com.dfsek.terra.mod.util.MinecraftUtil;
|
||||||
|
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.registry.BuiltinRegistries;
|
import net.minecraft.util.registry.BuiltinRegistries;
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
|
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -68,5 +70,4 @@ public final class BiomeUtil {
|
|||||||
MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier);
|
MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.dfsek.terra.mod.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
import net.minecraft.sound.BiomeAdditionsSound;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeAdditionsSoundTemplate implements ObjectTemplate<BiomeAdditionsSound> {
|
||||||
|
@Value("sound")
|
||||||
|
@Default
|
||||||
|
private SoundEvent sound = null;
|
||||||
|
|
||||||
|
@Value("sound")
|
||||||
|
@Default
|
||||||
|
private Double soundChance = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeAdditionsSound get() {
|
||||||
|
if (sound == null || soundChance == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return new BiomeAdditionsSound(sound, soundChance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.dfsek.terra.mod.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
import net.minecraft.sound.BiomeMoodSound;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeMoodSoundTemplate implements ObjectTemplate<BiomeMoodSound> {
|
||||||
|
@Value("sound")
|
||||||
|
@Default
|
||||||
|
private SoundEvent sound = null;
|
||||||
|
|
||||||
|
@Value("cultivation-ticks")
|
||||||
|
@Default
|
||||||
|
private Integer soundCultivationTicks = null;
|
||||||
|
|
||||||
|
@Value("spawn-range")
|
||||||
|
@Default
|
||||||
|
private Integer soundSpawnRange = null;
|
||||||
|
|
||||||
|
@Value("extra-distance")
|
||||||
|
@Default
|
||||||
|
private Double soundExtraDistance = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeMoodSound get() {
|
||||||
|
if (sound == null || soundCultivationTicks == null || soundSpawnRange == null || soundExtraDistance == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return new BiomeMoodSound(sound, soundCultivationTicks, soundSpawnRange, soundExtraDistance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.dfsek.terra.mod.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
import com.mojang.brigadier.StringReader;
|
||||||
|
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||||
|
import net.minecraft.command.argument.ParticleEffectArgumentType;
|
||||||
|
import net.minecraft.world.biome.BiomeParticleConfig;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeParticleConfigTemplate implements ObjectTemplate<BiomeParticleConfig> {
|
||||||
|
@Value("particle")
|
||||||
|
@Default
|
||||||
|
private String particle = null;
|
||||||
|
|
||||||
|
@Value("probability")
|
||||||
|
@Default
|
||||||
|
private Integer particleProbability = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeParticleConfig get() {
|
||||||
|
if (particle == null || particleProbability == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return new BiomeParticleConfig(ParticleEffectArgumentType.readParameters(new StringReader(particle)), particleProbability);
|
||||||
|
} catch(CommandSyntaxException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.dfsek.terra.mod.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
import net.minecraft.sound.MusicSound;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
|
|
||||||
|
|
||||||
|
public class MusicSoundTemplate implements ObjectTemplate<MusicSound> {
|
||||||
|
@Value("sound")
|
||||||
|
@Default
|
||||||
|
private SoundEvent sound = null;
|
||||||
|
|
||||||
|
@Value("min-delay")
|
||||||
|
@Default
|
||||||
|
private Integer minDelay = null;
|
||||||
|
|
||||||
|
@Value("max-delay")
|
||||||
|
@Default
|
||||||
|
private Integer maxDelay = null;
|
||||||
|
|
||||||
|
@Value("-current-music")
|
||||||
|
@Default
|
||||||
|
private Boolean replaceCurrentMusic = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MusicSound get() {
|
||||||
|
if (sound == null || minDelay == null || maxDelay == null || replaceCurrentMusic == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return new MusicSound(sound, minDelay, maxDelay, replaceCurrentMusic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.dfsek.terra.mod.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
|
||||||
|
public class SoundEventTemplate implements ObjectTemplate<SoundEvent> {
|
||||||
|
@Value("id")
|
||||||
|
@Default
|
||||||
|
private Identifier id = null;
|
||||||
|
|
||||||
|
@Value("distanceToTravel")
|
||||||
|
@Default
|
||||||
|
private Float distanceToTravel = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SoundEvent get() {
|
||||||
|
if (id == null) {
|
||||||
|
return null;
|
||||||
|
} else if (distanceToTravel == null) {
|
||||||
|
return new SoundEvent(id);
|
||||||
|
} else {
|
||||||
|
return new SoundEvent(id, distanceToTravel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,11 +3,18 @@ package com.dfsek.terra.mod.config;
|
|||||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import net.minecraft.sound.BiomeAdditionsSound;
|
||||||
|
import net.minecraft.sound.BiomeMoodSound;
|
||||||
|
import net.minecraft.sound.MusicSound;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
import net.minecraft.world.biome.Biome.Precipitation;
|
import net.minecraft.world.biome.Biome.Precipitation;
|
||||||
|
import net.minecraft.world.biome.Biome.TemperatureModifier;
|
||||||
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
|
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
|
||||||
|
|
||||||
import com.dfsek.terra.api.properties.Properties;
|
import com.dfsek.terra.api.properties.Properties;
|
||||||
|
|
||||||
|
import net.minecraft.world.biome.BiomeParticleConfig;
|
||||||
|
|
||||||
|
|
||||||
public class VanillaBiomeProperties implements ConfigTemplate, Properties {
|
public class VanillaBiomeProperties implements ConfigTemplate, Properties {
|
||||||
@Value("colors.grass")
|
@Value("colors.grass")
|
||||||
@ -38,22 +45,50 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
|
|||||||
@Default
|
@Default
|
||||||
private GrassColorModifier modifier = null;
|
private GrassColorModifier modifier = null;
|
||||||
|
|
||||||
|
@Value("particles")
|
||||||
|
@Default
|
||||||
|
private BiomeParticleConfig particleConfig = null;
|
||||||
|
|
||||||
@Value("climate.precipitation")
|
@Value("climate.precipitation")
|
||||||
@Default
|
@Default
|
||||||
private Precipitation precipitation = null;
|
private Precipitation precipitation = null;
|
||||||
|
|
||||||
public Integer getFogColor() {
|
@Value("climate.temperature")
|
||||||
return fogColor;
|
@Default
|
||||||
}
|
private Float temperature = null;
|
||||||
|
|
||||||
public Integer getFoliageColor() {
|
@Value("climate.temperature-modifier")
|
||||||
return foliageColor;
|
@Default
|
||||||
}
|
private TemperatureModifier temperatureModifier = null;
|
||||||
|
|
||||||
|
@Value("climate.downfall")
|
||||||
|
@Default
|
||||||
|
private Float downfall = null;
|
||||||
|
|
||||||
|
@Value("sound.loop-sound.sound")
|
||||||
|
@Default
|
||||||
|
private SoundEvent loopSound = null;
|
||||||
|
|
||||||
|
@Value("sound.mood-sound")
|
||||||
|
@Default
|
||||||
|
private BiomeMoodSound moodSound = null;
|
||||||
|
|
||||||
|
@Value("sound.additions-sound")
|
||||||
|
@Default
|
||||||
|
private BiomeAdditionsSound additionsSound = null;
|
||||||
|
|
||||||
|
@Value("sound.music")
|
||||||
|
@Default
|
||||||
|
private MusicSound music = null;
|
||||||
|
|
||||||
public Integer getGrassColor() {
|
public Integer getGrassColor() {
|
||||||
return grassColor;
|
return grassColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getFogColor() {
|
||||||
|
return fogColor;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getWaterColor() {
|
public Integer getWaterColor() {
|
||||||
return waterColor;
|
return waterColor;
|
||||||
}
|
}
|
||||||
@ -62,15 +97,51 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
|
|||||||
return waterFogColor;
|
return waterFogColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getFoliageColor() {
|
||||||
|
return foliageColor;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getSkyColor() {
|
public Integer getSkyColor() {
|
||||||
return skyColor;
|
return skyColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GrassColorModifier getGrassColorModifier() {
|
||||||
|
return modifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomeParticleConfig getParticleConfig() {
|
||||||
|
return particleConfig;
|
||||||
|
}
|
||||||
|
|
||||||
public Precipitation getPrecipitation() {
|
public Precipitation getPrecipitation() {
|
||||||
return precipitation;
|
return precipitation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GrassColorModifier getModifier() {
|
public Float getTemperature() {
|
||||||
return modifier;
|
return temperature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TemperatureModifier getTemperatureModifier() {
|
||||||
|
return temperatureModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Float getDownfall() {
|
||||||
|
return downfall;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SoundEvent getLoopSound() {
|
||||||
|
return loopSound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomeMoodSound getMoodSound() {
|
||||||
|
return moodSound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomeAdditionsSound getAdditionsSound() {
|
||||||
|
return additionsSound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MusicSound getMusic() {
|
||||||
|
return music;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,9 +94,8 @@ public final class MinecraftUtil {
|
|||||||
|
|
||||||
BiomeEffects.Builder effects = new BiomeEffects.Builder();
|
BiomeEffects.Builder effects = new BiomeEffects.Builder();
|
||||||
|
|
||||||
Biome.Builder builder = new Builder();
|
net.minecraft.world.biome.Biome.Builder builder = new Builder();
|
||||||
|
|
||||||
if(biome.getContext().has(VanillaBiomeProperties.class)) {
|
|
||||||
VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class);
|
VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class);
|
||||||
|
|
||||||
effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor()))
|
effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor()))
|
||||||
@ -104,43 +103,61 @@ public final class MinecraftUtil {
|
|||||||
.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor()))
|
.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor()))
|
||||||
.skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor()))
|
.skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor()))
|
||||||
.grassColorModifier(
|
.grassColorModifier(
|
||||||
Objects.requireNonNullElse(vanillaBiomeProperties.getModifier(), vanilla.getEffects().getGrassColorModifier()));
|
Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), vanilla.getEffects().getGrassColorModifier()));
|
||||||
|
|
||||||
|
if (vanillaBiomeProperties.getFoliageColor() == null) {
|
||||||
if(vanillaBiomeProperties.getGrassColor() == null) {
|
|
||||||
vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor);
|
|
||||||
} else {
|
|
||||||
effects.grassColor(vanillaBiomeProperties.getGrassColor());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vanillaBiomeProperties.getFoliageColor() == null) {
|
|
||||||
vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor);
|
vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor);
|
||||||
} else {
|
} else {
|
||||||
effects.foliageColor(vanillaBiomeProperties.getFoliageColor());
|
effects.foliageColor(vanillaBiomeProperties.getFoliageColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.getPrecipitation()));
|
if (vanillaBiomeProperties.getGrassColor() == null) {
|
||||||
|
|
||||||
} else {
|
|
||||||
effects.waterColor(vanilla.getWaterColor())
|
|
||||||
.waterFogColor(vanilla.getWaterFogColor())
|
|
||||||
.fogColor(vanilla.getFogColor())
|
|
||||||
.skyColor(vanilla.getSkyColor());
|
|
||||||
vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor);
|
|
||||||
vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor);
|
vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor);
|
||||||
|
} else {
|
||||||
builder.precipitation(vanilla.getPrecipitation());
|
effects.grassColor(vanillaBiomeProperties.getGrassColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
vanilla.getLoopSound().ifPresent(effects::loopSound);
|
if (vanillaBiomeProperties.getParticleConfig() == null) {
|
||||||
vanilla.getAdditionsSound().ifPresent(effects::additionsSound);
|
vanilla.getEffects().getParticleConfig().ifPresent(effects::particleConfig);
|
||||||
vanilla.getMoodSound().ifPresent(effects::moodSound);
|
} else {
|
||||||
vanilla.getMusic().ifPresent(effects::music);
|
effects.particleConfig(vanillaBiomeProperties.getParticleConfig());
|
||||||
vanilla.getParticleConfig().ifPresent(effects::particleConfig);
|
}
|
||||||
|
|
||||||
|
if (vanillaBiomeProperties.getLoopSound() == null) {
|
||||||
|
vanilla.getEffects().getLoopSound().ifPresent(effects::loopSound);
|
||||||
|
} else {
|
||||||
|
effects.loopSound(vanillaBiomeProperties.getLoopSound());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vanillaBiomeProperties.getMoodSound() == null) {
|
||||||
|
vanilla.getEffects().getMoodSound().ifPresent(effects::moodSound);
|
||||||
|
} else {
|
||||||
|
effects.moodSound(vanillaBiomeProperties.getMoodSound());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vanillaBiomeProperties.getAdditionsSound() == null) {
|
||||||
|
vanilla.getEffects().getAdditionsSound().ifPresent(effects::additionsSound);
|
||||||
|
} else {
|
||||||
|
effects.additionsSound(vanillaBiomeProperties.getAdditionsSound());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vanillaBiomeProperties.getMusic() == null) {
|
||||||
|
vanilla.getEffects().getMusic().ifPresent(effects::music);
|
||||||
|
} else {
|
||||||
|
effects.music(vanillaBiomeProperties.getMusic());
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.getPrecipitation()));
|
||||||
|
|
||||||
|
builder.temperature(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperature(), vanilla.getTemperature()));
|
||||||
|
|
||||||
|
builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), vanilla.getDownfall()));
|
||||||
|
|
||||||
|
if (vanillaBiomeProperties.getTemperatureModifier() != null) {
|
||||||
|
builder.temperatureModifier(vanillaBiomeProperties.getTemperatureModifier());
|
||||||
|
}
|
||||||
|
|
||||||
return builder
|
return builder
|
||||||
.temperature(vanilla.getTemperature())
|
|
||||||
.downfall(vanilla.getDownfall())
|
|
||||||
.effects(effects.build())
|
.effects(effects.build())
|
||||||
.spawnSettings(vanilla.getSpawnSettings())
|
.spawnSettings(vanilla.getSpawnSettings())
|
||||||
.generationSettings(generationSettings.build())
|
.generationSettings(generationSettings.build())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user