20w28a. Rewritten scarpet structure and plop API. Removed portalSuffocationFix, as its fixed.

This commit is contained in:
gnembon committed 2020-07-12 02:38:12 -03:00
1 parent bba9f4e88d
commit a0e0dc0f88
16 files changed
+207 -303

No files matched your search

+2 -2
View File
@@ -4,8 +4,8 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/use # check these on https://fabricmc.net/use
# or better: https://modmuss50.me/fabric.html # or better: https://modmuss50.me/fabric.html
minecraft_version=20w27a minecraft_version=20w28a
yarn_mappings=20w27a+build.1 yarn_mappings=20w28a+build.17
loader_version=0.8.9+build.203 loader_version=0.8.9+build.203
# Mod Properties # Mod Properties
-7
View File
@@ -68,13 +68,6 @@ public class CarpetSettings
) )
public static String language = "none"; public static String language = "none";
@Rule(
desc = "Nether portals correctly place entities going through",
extra = "Entities shouldn't suffocate in obsidian",
category = BUGFIX
)
public static boolean portalSuffocationFix = false;
@Rule(desc = "Gbhs sgnf sadsgras fhskdpri!", category = EXPERIMENTAL) @Rule(desc = "Gbhs sgnf sadsgras fhskdpri!", category = EXPERIMENTAL)
public static boolean superSecretSetting = false; public static boolean superSecretSetting = false;
+136 -246
View File
@@ -1,66 +1,97 @@
package carpet.helpers; package carpet.helpers;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.fakes.BiomeInterface;
import carpet.fakes.StructureFeatureInterface; import carpet.fakes.StructureFeatureInterface;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.mojang.datafixers.util.Pair;
import net.minecraft.block.Blocks;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.structure.StructureManager; import net.minecraft.structure.StructureManager;
import net.minecraft.structure.StructureStart; import net.minecraft.structure.StructureStart;
import net.minecraft.structure.pool.StructurePool;
import net.minecraft.structure.pool.StructurePoolElement;
import net.minecraft.structure.processor.ProcessorLists;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockBox;
import net.minecraft.structure.BastionRemnantGenerator;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.Biomes; import net.minecraft.world.biome.Biomes;
import net.minecraft.world.gen.chunk.StructureConfig;
import net.minecraft.world.gen.feature.DefaultBiomeFeatures;
import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.biome.source.BiomeAccess;
//import net.minecraft.world.biome.source.BiomeSource;
//import net.minecraft.world.biome.source.FixedBiomeSource;
//import net.minecraft.world.biome.source.VanillaLayeredBiomeSource;
//import net.minecraft.world.biome.source.VanillaLayeredBiomeSourceConfig;
import net.minecraft.world.gen.ChunkRandom; import net.minecraft.world.gen.ChunkRandom;
import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGenerator;
//import net.minecraft.world.gen.chunk.OverworldChunkGenerator; import net.minecraft.world.gen.chunk.StructureConfig;
//import net.minecraft.world.gen.chunk.OverworldChunkGeneratorConfig;
import net.minecraft.world.gen.decorator.BeehiveTreeDecorator; import net.minecraft.world.gen.decorator.BeehiveTreeDecorator;
import net.minecraft.world.gen.feature.BastionRemnantFeatureConfig;
import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.ConfiguredFeatures;
import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.FeatureConfig; import net.minecraft.world.gen.feature.FeatureConfig;
import net.minecraft.world.gen.feature.ForestRockFeatureConfig; import net.minecraft.world.gen.feature.SimpleRandomFeatureConfig;
import net.minecraft.world.gen.feature.HugeFungusFeatureConfig;
import net.minecraft.world.gen.feature.MineshaftFeature;
import net.minecraft.world.gen.feature.MineshaftFeatureConfig;
import net.minecraft.world.gen.feature.OceanRuinFeature;
import net.minecraft.world.gen.feature.OceanRuinFeatureConfig;
import net.minecraft.world.gen.feature.RandomPatchFeatureConfig;
import net.minecraft.world.gen.feature.SeaPickleFeatureConfig;
import net.minecraft.world.gen.feature.SeagrassFeatureConfig;
import net.minecraft.world.gen.feature.ShipwreckFeatureConfig;
import net.minecraft.world.gen.feature.SingleStateFeatureConfig;
import net.minecraft.world.gen.feature.StructureFeature; import net.minecraft.world.gen.feature.StructureFeature;
import net.minecraft.world.gen.feature.StructurePoolFeatureConfig; import net.minecraft.world.gen.feature.StructurePoolFeatureConfig;
import net.minecraft.world.gen.feature.TreeFeatureConfig; import net.minecraft.world.gen.feature.TreeFeatureConfig;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import static net.minecraft.world.gen.feature.DefaultBiomeFeatures.FANCY_TREE_CONFIG;
import static net.minecraft.world.gen.feature.DefaultBiomeFeatures.OAK_TREE_CONFIG;
public class FeatureGenerator public class FeatureGenerator
{ {
synchronized public static Boolean plop(String featureName, ServerWorld world, BlockPos pos)
{
Thing custom = featureMap.get(featureName);
if (custom != null)
{
return custom.plop(world, pos);
}
Identifier id = new Identifier(featureName);
ConfiguredStructureFeature<?, ?> structureFeature = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.get(id);
if (structureFeature != null)
{
return ((StructureFeatureInterface)structureFeature.feature).plopAnywhere(
world, pos, world.getChunkManager().getChunkGenerator(),
false, Biomes.PLAINS, structureFeature.config);
}
ConfiguredFeature<?, ?> feature = BuiltinRegistries.CONFIGURED_FEATURE.get(id);
if (feature != null)
{
CarpetSettings.skipGenerationChecks = true;
try
{
return feature.generate(world, world.getChunkManager().getChunkGenerator(), world.random, pos);
}
finally
{
CarpetSettings.skipGenerationChecks = false;
}
}
return null;
}
public static ConfiguredStructureFeature<?, ?> resolveConfiguredStructure(String name, ServerWorld world, BlockPos pos)
{
Identifier id = new Identifier(name);
ConfiguredStructureFeature<?, ?> configuredStructureFeature = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.get(id);
if (configuredStructureFeature != null) return configuredStructureFeature;
StructureFeature<?> structureFeature = Registry.STRUCTURE_FEATURE.get(id);
if (structureFeature == null) return null;
return getDefaultFeature(structureFeature, world, pos, true);
// optionally fish out
}
synchronized public static Boolean plopGrid(ConfiguredStructureFeature<?, ?> structureFeature, ServerWorld world, BlockPos pos)
{
return ((StructureFeatureInterface)structureFeature.feature).plopAnywhere(
world, pos, world.getChunkManager().getChunkGenerator(),
true, Biomes.PLAINS, structureFeature.config);
}
@FunctionalInterface @FunctionalInterface
private interface Thing private interface Thing
{ {
@@ -80,10 +111,6 @@ public class FeatureGenerator
} }
}; };
} }
private static Thing simplePlop(Feature<DefaultFeatureConfig> feature)
{
return simplePlop(feature.configure(FeatureConfig.DEFAULT));
}
private static Thing simpleTree(TreeFeatureConfig config) private static Thing simpleTree(TreeFeatureConfig config)
{ {
@@ -91,11 +118,6 @@ public class FeatureGenerator
return simplePlop(Feature.TREE.configure(config)); return simplePlop(Feature.TREE.configure(config));
} }
private static Thing simplePatch(RandomPatchFeatureConfig config)
{
return simplePlop(Feature.RANDOM_PATCH.configure(config));
}
private static Thing spawnCustomStructure(StructureFeature structure, FeatureConfig conf, Biome biome) private static Thing spawnCustomStructure(StructureFeature structure, FeatureConfig conf, Biome biome)
{ {
return setupCustomStructure(structure, conf, biome, false); return setupCustomStructure(structure, conf, biome, false);
@@ -115,235 +137,103 @@ public class FeatureGenerator
return featureMap.get(name).plop(world, pos); return featureMap.get(name).plop(world, pos);
return null; return null;
} }
public static void noop() {System.out.println("boo");}
public static Boolean gridStructure(String name, ServerWorld world, BlockPos pos) private static ConfiguredStructureFeature<?, ?> getDefaultFeature(StructureFeature<?> structure, ServerWorld world, BlockPos pos, boolean tryHard)
{ {
if (gridMap.containsKey(name)) ConfiguredStructureFeature<?, ?> configuredFeature = world.getBiome(pos).method_28405(structure.configure(null));
return gridMap.get(name).plop(world, pos); if (configuredFeature.config != null || !tryHard) return configuredFeature;
return null; return BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getEntries().stream().
filter(cS -> cS.getValue().feature == structure).
findFirst().map(Map.Entry::getValue).orElse(null);
} }
public static <T extends FeatureConfig> StructureStart shouldStructureStartAt(ServerWorld world, BlockPos pos, StructureFeature<T> structure, boolean computeBox) public static <T extends FeatureConfig> StructureStart shouldStructureStartAt(ServerWorld world, BlockPos pos, StructureFeature<T> structure, boolean computeBox)
{ {
long seed = world.getSeed(); long seed = world.getSeed();
ChunkGenerator generator = world.getChunkManager().getChunkGenerator(); ChunkGenerator generator = world.getChunkManager().getChunkGenerator();
StructureConfig params = generator.getConfig().method_28600(structure); StructureConfig params = generator.getConfig().getForType(structure);
if (!generator.getBiomeSource().hasStructureFeature(structure)) if (!generator.getBiomeSource().hasStructureFeature(structure))
return null; return null;
BiomeAccess biomeAccess = world.getBiomeAccess().withSource(generator.getBiomeSource()); BiomeAccess biomeAccess = world.getBiomeAccess().withSource(generator.getBiomeSource());
ChunkRandom chunkRandom = new ChunkRandom(); ChunkRandom chunkRandom = new ChunkRandom();
ChunkPos chunkPos = new ChunkPos(pos); ChunkPos chunkPos = new ChunkPos(pos);
Biome biome = biomeAccess.getBiome(new BlockPos(chunkPos.getStartX() + 9, 0, chunkPos.getStartZ() + 9)); Biome biome = biomeAccess.getBiome(new BlockPos(chunkPos.getStartX() + 9, 0, chunkPos.getStartZ() + 9));
ConfiguredStructureFeature<?, ?> configuredFeature = ((BiomeInterface)biome).getConfiguredFeature(structure); ConfiguredStructureFeature<?, ?> configuredFeature = biome.method_28405(structure.configure(null));
if (configuredFeature == null) return null; if (configuredFeature == null || configuredFeature.config == null) return null;
ChunkPos chunkPos2 = structure.method_27218(params, seed, chunkRandom, chunkPos.x, chunkPos.z); //find some chunk I guess ChunkPos chunkPos2 = structure.getStartChunk(params, seed, chunkRandom, chunkPos.x, chunkPos.z); //find some chunk I guess
if (chunkPos.x == chunkPos2.x && chunkPos.z == chunkPos2.z && ((StructureFeatureInterface)structure).shouldStartPublicAt(generator, generator.getBiomeSource(), seed, chunkRandom, chunkPos.x, chunkPos.z, biome, chunkPos, configuredFeature.field_24836)) // should start at if (chunkPos.x == chunkPos2.x && chunkPos.z == chunkPos2.z && ((StructureFeatureInterface)structure).shouldStartPublicAt(generator, generator.getBiomeSource(), seed, chunkRandom, chunkPos.x, chunkPos.z, biome, chunkPos, configuredFeature.config)) // should start at
{ {
if (!computeBox) return StructureStart.DEFAULT; if (!computeBox) return StructureStart.DEFAULT;
StructureManager manager = world.getStructureManager(); StructureManager manager = world.getStructureManager();
StructureStart<T> structureStart3 = structure.getStructureStartFactory().create((StructureFeature<T>) configuredFeature.field_24835, chunkPos.x, chunkPos.z, BlockBox.empty(), 0, seed); StructureStart<T> structureStart3 = structure.getStructureStartFactory().create((StructureFeature<T>) configuredFeature.feature, chunkPos.x, chunkPos.z, BlockBox.empty(), 0, seed);
structureStart3.init(generator, manager, chunkPos.x, chunkPos.z, biome, (T) configuredFeature.field_24836); structureStart3.init(world.method_30349(), generator, manager, chunkPos.x, chunkPos.z, biome, (T) configuredFeature.config);
if (!structureStart3.hasChildren()) return null; if (!structureStart3.hasChildren()) return null;
return structureStart3; return structureStart3;
} }
return null; return null;
} }
public static final Map<StructureFeature<?>, List<String>> structureToFeature = new HashMap<>();
public static final Map<String, StructureFeature<?>> featureToStructure = new HashMap<>();
static
{
structureToFeature.put(StructureFeature.MONUMENT, Collections.singletonList("monument"));
structureToFeature.put(StructureFeature.END_CITY, Collections.singletonList("end_city"));
structureToFeature.put(StructureFeature.OCEAN_RUIN, Arrays.asList("ocean_ruin", "ocean_ruin_warm", "ocean_ruin_small", "ocean_ruin_warm_small", "ocean_ruin_tall", "ocean_ruin_warm_tall"));
structureToFeature.put(StructureFeature.VILLAGE, Arrays.asList("village", "village_desert", "village_savanna", "village_taiga", "village_snowy"));
structureToFeature.put(StructureFeature.MANSION, Collections.singletonList("mansion"));
structureToFeature.put(StructureFeature.BURIED_TREASURE, Collections.singletonList("treasure"));
structureToFeature.put(StructureFeature.SWAMP_HUT, Collections.singletonList("witch_hut"));
structureToFeature.put(StructureFeature.STRONGHOLD, Collections.singletonList("stronghold"));
structureToFeature.put(StructureFeature.DESERT_PYRAMID, Collections.singletonList("desert_temple"));
structureToFeature.put(StructureFeature.JUNGLE_PYRAMID, Collections.singletonList("jungle_temple"));
structureToFeature.put(StructureFeature.SHIPWRECK, Arrays.asList("shipwreck", "shipwreck2"));
structureToFeature.put(StructureFeature.PILLAGER_OUTPOST, Collections.singletonList("pillager_outpost"));
structureToFeature.put(StructureFeature.MINESHAFT, Arrays.asList("mineshaft", "mineshaft_mesa"));
structureToFeature.put(StructureFeature.IGLOO, Collections.singletonList("igloo"));
structureToFeature.put(StructureFeature.FORTRESS, Collections.singletonList("fortress"));
structureToFeature.put(StructureFeature.NETHER_FOSSIL, Collections.singletonList("nether_fossil"));
structureToFeature.put(StructureFeature.BASTION_REMNANT, Arrays.asList("bastion_remnant", "bastion_remnant_housing", "bastion_remnant_stable", "bastion_remnant_treasure", "bastion_remnant_bridge"));
structureToFeature.put(StructureFeature.RUINED_PORTAL, Collections.singletonList("ruined_portal"));
structureToFeature.forEach((key, value) -> value.forEach(el -> featureToStructure.put(el, key)));
}
private static final Map<String, Thing> gridMap = new HashMap<String, Thing>() {{
put("monument", ((StructureFeatureInterface)StructureFeature.MONUMENT)::gridAnywhere);
put("fortress", ((StructureFeatureInterface)StructureFeature.FORTRESS)::gridAnywhere);
put("mansion", ((StructureFeatureInterface)StructureFeature.MANSION)::gridAnywhere);
put("jungle_temple", ((StructureFeatureInterface)StructureFeature.JUNGLE_PYRAMID)::gridAnywhere);
put("desert_temple", ((StructureFeatureInterface)StructureFeature.DESERT_PYRAMID)::gridAnywhere);
put("end_city", ((StructureFeatureInterface)StructureFeature.END_CITY)::gridAnywhere);
put("igloo", ((StructureFeatureInterface)StructureFeature.IGLOO)::gridAnywhere);
put("shipwreck", gridCustomStructure(StructureFeature.SHIPWRECK, new ShipwreckFeatureConfig(true), Biomes.PLAINS));
put("shipwreck2", gridCustomStructure(StructureFeature.SHIPWRECK, new ShipwreckFeatureConfig(false), Biomes.PLAINS));
put("witch_hut", ((StructureFeatureInterface)StructureFeature.SWAMP_HUT)::gridAnywhere);
put("stronghold", ((StructureFeatureInterface)StructureFeature.STRONGHOLD)::gridAnywhere);
put("ocean_ruin_small", gridCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.COLD, 0.0F, 0.5F), Biomes.PLAINS));
put("ocean_ruin_warm_small", gridCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.WARM, 0.0F, 0.5F), Biomes.PLAINS));
put("ocean_ruin_tall", gridCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.COLD, 1.0F, 0.0F), Biomes.PLAINS));
put("ocean_ruin_warm_tall", gridCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.WARM, 1.0F, 0.0F), Biomes.PLAINS));
put("ocean_ruin", gridCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.COLD, 1.0F, 1.0F), Biomes.PLAINS));
put("ocean_ruin_warm", gridCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.WARM, 1.0F, 1.0F), Biomes.PLAINS));
put("treasure", ((StructureFeatureInterface)StructureFeature.BURIED_TREASURE)::gridAnywhere);
put("pillager_outpost", ((StructureFeatureInterface)StructureFeature.PILLAGER_OUTPOST)::gridAnywhere);
put("mineshaft", gridCustomStructure(StructureFeature.MINESHAFT, new MineshaftFeatureConfig(0.0, MineshaftFeature.Type.NORMAL), Biomes.PLAINS));
put("mineshaft_mesa", gridCustomStructure(StructureFeature.MINESHAFT, new MineshaftFeatureConfig(0.0, MineshaftFeature.Type.MESA), Biomes.PLAINS));
put("village", gridCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/plains/town_centers"),6), Biomes.PLAINS));
put("village_desert", gridCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/desert/town_centers"), 6), Biomes.PLAINS));
put("village_savanna", gridCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/savanna/town_centers"), 6), Biomes.PLAINS));
put("village_taiga", gridCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/taiga/town_centers"), 6), Biomes.PLAINS));
put("village_snowy", gridCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/snowy/town_centers"), 6), Biomes.PLAINS));
put("nether_fossil", ((StructureFeatureInterface)StructureFeature.NETHER_FOSSIL)::gridAnywhere);
put("bastion_remnant", gridCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(BastionRemnantGenerator.START_POOLS_TO_SIZES), Biomes.NETHER_WASTES));
put("bastion_remnant_housing", gridCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/units/base", 60).build()), Biomes.NETHER_WASTES));
put("bastion_remnant_stable", gridCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/hoglin_stable/origin", 60).build()), Biomes.NETHER_WASTES));
put("bastion_remnant_treasure", gridCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/treasure/starters", 60).build()), Biomes.NETHER_WASTES));
put("bastion_remnant_bridge", gridCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/bridge/start", 60).build()), Biomes.NETHER_WASTES));
}};
private static final Map<String, Thing> featureMap = new HashMap<String, Thing>() {{ private static final Map<String, Thing> featureMap = new HashMap<String, Thing>() {{
put("oak_bees", simpleTree(ConfiguredFeatures.OAK.method_30381().setTreeDecorators(ImmutableList.of(new BeehiveTreeDecorator(1.0F)))));
put("fancy_oak_bees", simpleTree(ConfiguredFeatures.FANCY_OAK.method_30381().setTreeDecorators(ImmutableList.of(new BeehiveTreeDecorator(1.0F)))));
put("oak", simpleTree(OAK_TREE_CONFIG)); put("birch_bees", simpleTree(ConfiguredFeatures.BIRCH.method_30381().setTreeDecorators(ImmutableList.of(new BeehiveTreeDecorator(1.0F)))));
put("oak_beehive", simpleTree( put("coral_tree", simplePlop(Feature.CORAL_TREE.configure(FeatureConfig.DEFAULT)));
(OAK_TREE_CONFIG.setTreeDecorators((ImmutableList.of(new BeehiveTreeDecorator(1.0F)))) put("coral_claw", simplePlop(Feature.CORAL_CLAW.configure(FeatureConfig.DEFAULT)));
))); put("coral_mushroom", simplePlop(Feature.CORAL_MUSHROOM.configure(FeatureConfig.DEFAULT)));
put("oak_large", simpleTree(DefaultBiomeFeatures.FANCY_TREE_CONFIG)); put("coral", simplePlop(Feature.SIMPLE_RANDOM_SELECTOR.configure(new SimpleRandomFeatureConfig(ImmutableList.of(
put("oak_large_beehive", simpleTree( () -> Feature.CORAL_TREE.configure(FeatureConfig.DEFAULT),
FANCY_TREE_CONFIG.setTreeDecorators(ImmutableList.of(new BeehiveTreeDecorator(1.0F))))); () -> Feature.CORAL_CLAW.configure(FeatureConfig.DEFAULT),
put("birch", simpleTree(DefaultBiomeFeatures.BIRCH_TREE_CONFIG)); () -> Feature.CORAL_MUSHROOM.configure(FeatureConfig.DEFAULT)
put("birch_large", simpleTree(DefaultBiomeFeatures.LARGE_BIRCH_TREE_CONFIG)); )))));
put("shrub", simpleTree(DefaultBiomeFeatures.JUNGLE_GROUND_BUSH_CONFIG)); put("bastion_remnant_units", spawnCustomStructure(
put("jungle", simpleTree(DefaultBiomeFeatures.JUNGLE_TREE_CONFIG)); StructureFeature.BASTION_REMNANT,
put("jungle_large", simpleTree(DefaultBiomeFeatures.MEGA_JUNGLE_TREE_CONFIG)); new StructurePoolFeatureConfig(() -> new StructurePool(
put("spruce", simpleTree(DefaultBiomeFeatures.SPRUCE_TREE_CONFIG)); new Identifier("bastion/starts"),
put("spruce_large", simpleTree(DefaultBiomeFeatures.MEGA_SPRUCE_TREE_CONFIG)); new Identifier("empty"),
put("pine", simpleTree(DefaultBiomeFeatures.PINE_TREE_CONFIG)); ImmutableList.of(
put("pine_large", simpleTree(DefaultBiomeFeatures.MEGA_PINE_TREE_CONFIG)); Pair.of(StructurePoolElement.method_30435("bastion/units/air_base", ProcessorLists.BASTION_GENERIC_DEGRADATION), 1)
put("dark_oak", simpleTree(DefaultBiomeFeatures.DARK_OAK_TREE_CONFIG)); ),
put("acacia", simpleTree(DefaultBiomeFeatures.ACACIA_TREE_CONFIG)); StructurePool.Projection.RIGID
put("oak_swamp", simpleTree(DefaultBiomeFeatures.SWAMP_TREE_CONFIG)); ), 6),
put("well", simplePlop(Feature.DESERT_WELL)); Biomes.NETHER_WASTES
put("grass", simplePatch(DefaultBiomeFeatures.GRASS_CONFIG)); ));
put("tall_grass", simplePatch(DefaultBiomeFeatures.TALL_GRASS_CONFIG)); put("bastion_remnant_hoglin_stable", spawnCustomStructure(
StructureFeature.BASTION_REMNANT,
put("lush_grass", simplePatch(DefaultBiomeFeatures.LUSH_GRASS_CONFIG)); new StructurePoolFeatureConfig(() -> new StructurePool(
put("fern", simplePatch(DefaultBiomeFeatures.LARGE_FERN_CONFIG)); new Identifier("bastion/starts"),
new Identifier("empty"),
ImmutableList.of(
put("cactus", simplePatch(DefaultBiomeFeatures.CACTUS_CONFIG)); Pair.of(StructurePoolElement.method_30435("bastion/hoglin_stable/air_base", ProcessorLists.BASTION_GENERIC_DEGRADATION), 1)
put("dead_bush", simplePatch(DefaultBiomeFeatures.DEAD_BUSH_CONFIG)); ),
put("fossils", simplePlop(Feature.FOSSIL)); // spawn above, spawn invisible StructurePool.Projection.RIGID
put("mushroom_brown", simplePlop(Feature.HUGE_BROWN_MUSHROOM.configure(DefaultBiomeFeatures.HUGE_BROWN_MUSHROOM_CONFIG))); ), 6),
put("mushroom_red", simplePlop(Feature.HUGE_RED_MUSHROOM.configure(DefaultBiomeFeatures.HUGE_RED_MUSHROOM_CONFIG))); Biomes.NETHER_WASTES
put("ice_spike", simplePlop(Feature.ICE_SPIKE)); ));
put("glowstone", simplePlop(Feature.GLOWSTONE_BLOB)); put("bastion_remnant_treasure", spawnCustomStructure(
put("melon", simplePatch(DefaultBiomeFeatures.MELON_PATCH_CONFIG)); StructureFeature.BASTION_REMNANT,
put("melon_pile", simplePlop(Feature.BLOCK_PILE.configure(DefaultBiomeFeatures.MELON_PILE_CONFIG))); new StructurePoolFeatureConfig(() -> new StructurePool(
put("pumpkin", simplePatch(DefaultBiomeFeatures.PUMPKIN_PATCH_CONFIG)); new Identifier("bastion/starts"),
put("pumpkin_pile", simplePlop(Feature.BLOCK_PILE.configure(DefaultBiomeFeatures.PUMPKIN_PILE_CONFIG))); new Identifier("empty"),
put("sugarcane", simplePatch(DefaultBiomeFeatures.SUGAR_CANE_CONFIG)); ImmutableList.of(
put("lilypad", simplePatch(DefaultBiomeFeatures.LILY_PAD_CONFIG)); Pair.of(StructurePoolElement.method_30435("bastion/treasure/big_air_full", ProcessorLists.BASTION_GENERIC_DEGRADATION), 1)
put("dungeon", simplePlop(Feature.MONSTER_ROOM)); ),
put("iceberg", simplePlop(Feature.ICEBERG.configure(new SingleStateFeatureConfig(Blocks.PACKED_ICE.getDefaultState())))); StructurePool.Projection.RIGID
put("iceberg_blue", simplePlop(Feature.ICEBERG.configure(new SingleStateFeatureConfig(Blocks.BLUE_ICE.getDefaultState())))); ), 6),
put("lake", simplePlop(Feature.LAKE.configure(new SingleStateFeatureConfig(Blocks.WATER.getDefaultState())))); Biomes.NETHER_WASTES
put("lake_lava", simplePlop(Feature.LAKE.configure(new SingleStateFeatureConfig(Blocks.LAVA.getDefaultState())))); ));
//put("end tower", simplePlop(Feature.END_SPIKE.configure(new EndSpikeFeatureConfig(false, )))); put("bastion_remnant_bridge", spawnCustomStructure(
put("end_island", simplePlop(Feature.END_ISLAND)); StructureFeature.BASTION_REMNANT,
put("chorus", simplePlop(Feature.CHORUS_PLANT)); new StructurePoolFeatureConfig(() -> new StructurePool(
put("sea_grass", simplePlop(Feature.SEAGRASS.configure( new SeagrassFeatureConfig(80, 0.8D)))); new Identifier("bastion/starts"),
put("sea_grass_river", simplePlop(Feature.SEAGRASS.configure( new SeagrassFeatureConfig(48, 0.4D)))); new Identifier("empty"),
put("kelp", simplePlop(Feature.KELP)); ImmutableList.of(
put("coral_tree", simplePlop(Feature.CORAL_TREE)); Pair.of(StructurePoolElement.method_30435("bastion/bridge/starting_pieces/entrance_base", ProcessorLists.BASTION_GENERIC_DEGRADATION), 1)
put("coral_mushroom", simplePlop(Feature.CORAL_MUSHROOM)); ),
put("coral_claw", simplePlop(Feature.CORAL_CLAW)); StructurePool.Projection.RIGID
put("coral", (w, p) -> ), 6),
w.random.nextInt(3)!=0? Biomes.NETHER_WASTES
(w.random.nextInt(2)!=0? ));
simplePlop(Feature.CORAL_MUSHROOM).plop(w, p):
simplePlop(Feature.CORAL_TREE).plop(w, p))
:simplePlop(Feature.CORAL_CLAW).plop(w, p));
put("sea_pickle", simplePlop(Feature.SEA_PICKLE.configure( new SeaPickleFeatureConfig(20))));
put("boulder", simplePlop(Feature.FOREST_ROCK.configure( new ForestRockFeatureConfig(Blocks.MOSSY_COBBLESTONE.getDefaultState(), 0))));
put("crimson_fungus", simplePlop(Feature.HUGE_FUNGUS.configure(HugeFungusFeatureConfig.CRIMSON_FUNGUS_NOT_PLANTED_CONFIG)));
put("warped_fungus", simplePlop(Feature.HUGE_FUNGUS.configure(HugeFungusFeatureConfig.WARPED_FUNGUS_NOT_PLANTED_CONFIG)));
put("nether_sprouts", simplePlop(Feature.NETHER_FOREST_VEGETATION.configure(DefaultBiomeFeatures.NETHER_SPROUTS_CONFIG)));
put("crimson_roots", simplePlop(Feature.NETHER_FOREST_VEGETATION.configure(DefaultBiomeFeatures.CRIMSON_ROOTS_CONFIG)));
put("warped_roots", simplePlop(Feature.NETHER_FOREST_VEGETATION.configure(DefaultBiomeFeatures.WARPED_ROOTS_CONFIG)));
put("weeping_vines", simplePlop(Feature.WEEPING_VINES));
put("twisting_vines", simplePlop(Feature.TWISTING_VINES));
put("basalt_pillar", simplePlop(Feature.BASALT_PILLAR));
//structures
put("monument", ((StructureFeatureInterface)StructureFeature.MONUMENT)::plopAnywhere);
put("fortress", ((StructureFeatureInterface)StructureFeature.FORTRESS)::plopAnywhere);
put("mansion", ((StructureFeatureInterface)StructureFeature.MANSION)::plopAnywhere);
put("jungle_temple", ((StructureFeatureInterface)StructureFeature.JUNGLE_PYRAMID)::plopAnywhere);
put("desert_temple", ((StructureFeatureInterface)StructureFeature.DESERT_PYRAMID)::plopAnywhere);
put("end_city", ((StructureFeatureInterface)StructureFeature.END_CITY)::plopAnywhere);
put("igloo", ((StructureFeatureInterface)StructureFeature.IGLOO)::plopAnywhere);
put("shipwreck", spawnCustomStructure(StructureFeature.SHIPWRECK, new ShipwreckFeatureConfig(true), Biomes.PLAINS));
put("shipwreck2", spawnCustomStructure(StructureFeature.SHIPWRECK, new ShipwreckFeatureConfig(false), Biomes.PLAINS));
put("witch_hut", ((StructureFeatureInterface)StructureFeature.SWAMP_HUT)::plopAnywhere);
put("stronghold", ((StructureFeatureInterface)StructureFeature.STRONGHOLD)::plopAnywhere);
put("ocean_ruin_small", spawnCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.COLD, 0.0F, 0.5F), Biomes.PLAINS));
put("ocean_ruin_warm_small", spawnCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.WARM, 0.0F, 0.5F), Biomes.PLAINS));
put("ocean_ruin_tall", spawnCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.COLD, 1.0F, 0.0F), Biomes.PLAINS));
put("ocean_ruin_warm_tall", spawnCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.WARM, 1.0F, 0.0F), Biomes.PLAINS));
put("ocean_ruin", spawnCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.COLD, 1.0F, 1.0F), Biomes.PLAINS));
put("ocean_ruin_warm", spawnCustomStructure(StructureFeature.OCEAN_RUIN,
new OceanRuinFeatureConfig(OceanRuinFeature.BiomeType.WARM, 1.0F, 1.0F), Biomes.PLAINS));
put("treasure", ((StructureFeatureInterface)StructureFeature.BURIED_TREASURE)::plopAnywhere);
put("pillager_outpost", ((StructureFeatureInterface)StructureFeature.PILLAGER_OUTPOST)::plopAnywhere);
put("mineshaft", spawnCustomStructure(StructureFeature.MINESHAFT, new MineshaftFeatureConfig(0.0, MineshaftFeature.Type.NORMAL), Biomes.PLAINS));
put("mineshaft_mesa", spawnCustomStructure(StructureFeature.MINESHAFT, new MineshaftFeatureConfig(0.0, MineshaftFeature.Type.MESA), Biomes.PLAINS));
put("village", spawnCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/plains/town_centers"),6), Biomes.PLAINS));
put("village_desert", spawnCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/desert/town_centers"), 6), Biomes.PLAINS));
put("village_savanna", spawnCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/savanna/town_centers"), 6), Biomes.PLAINS));
put("village_taiga", spawnCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/taiga/town_centers"), 6), Biomes.PLAINS));
put("village_snowy", spawnCustomStructure(StructureFeature.VILLAGE, new StructurePoolFeatureConfig(new Identifier("village/snowy/town_centers"), 6), Biomes.PLAINS));
put("nether_fossil", ((StructureFeatureInterface)StructureFeature.NETHER_FOSSIL)::plopAnywhere);
put("bastion_remnant", spawnCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(BastionRemnantGenerator.START_POOLS_TO_SIZES), Biomes.NETHER_WASTES));
put("bastion_remnant_housing", spawnCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/units/base", 60).build()), Biomes.NETHER_WASTES));
put("bastion_remnant_stable", spawnCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/hoglin_stable/origin", 60).build()), Biomes.NETHER_WASTES));
put("bastion_remnant_treasure", spawnCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/treasure/starters", 60).build()), Biomes.NETHER_WASTES));
put("bastion_remnant_bridge", spawnCustomStructure(StructureFeature.BASTION_REMNANT, new BastionRemnantFeatureConfig(new ImmutableMap.Builder<String,Integer>().put("bastion/bridge/start", 60).build()), Biomes.NETHER_WASTES));
put("ruined_portal", ((StructureFeatureInterface)StructureFeature.RUINED_PORTAL)::plopAnywhere);
}}; }};
} }
@@ -4,28 +4,29 @@ import carpet.CarpetSettings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.class_5434;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.feature.BastionRemnantFeature; import net.minecraft.world.gen.feature.BastionRemnantFeature;
import net.minecraft.world.gen.feature.BastionRemnantFeatureConfig;
import net.minecraft.world.gen.feature.StructureFeature;
import net.minecraft.world.gen.feature.StructurePoolFeatureConfig;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@Mixin(BastionRemnantFeature.class) @Mixin(BastionRemnantFeature.class)
public abstract class BastionRemnantFeatureMixin extends StructureFeature<BastionRemnantFeatureConfig> { public abstract class BastionRemnantFeatureMixin extends class_5434
{
private static final List<Biome.SpawnEntry> spawnList = Lists.newArrayList( private static final List<Biome.SpawnEntry> spawnList = Lists.newArrayList(
new Biome.SpawnEntry(EntityType.PIGLIN_BRUTE, 5, 1, 2), new Biome.SpawnEntry(EntityType.PIGLIN_BRUTE, 5, 1, 2),
new Biome.SpawnEntry(EntityType.PIGLIN, 10, 2, 4), new Biome.SpawnEntry(EntityType.PIGLIN, 10, 2, 4),
new Biome.SpawnEntry(EntityType.HOGLIN, 2, 1, 2) new Biome.SpawnEntry(EntityType.HOGLIN, 2, 1, 2)
); );
public BastionRemnantFeatureMixin(Codec<BastionRemnantFeatureConfig> codec) { public BastionRemnantFeatureMixin(Codec<StructurePoolFeatureConfig> codec, int i, boolean bl, boolean bl2)
super(codec); {
super(codec, i, bl, bl2);
} }
@Override @Override
@@ -11,13 +11,14 @@ import org.spongepowered.asm.mixin.Shadow;
import java.util.Map; import java.util.Map;
@Mixin(Biome.class) @Mixin(Biome.class)
public class Biome_scarpetMixin implements BiomeInterface public class Biome_scarpetMixin
{ {
@Shadow @Final private Map<StructureFeature<?>, ConfiguredStructureFeature<?, ?>> structureFeatures; //@Shadow @Final private Map<StructureFeature<?>, ConfiguredStructureFeature<?, ?>> structureFeatures;
/*
@Override @Override
public ConfiguredStructureFeature<?, ?> getConfiguredFeature(StructureFeature<?> arg) public ConfiguredStructureFeature<?, ?> getConfiguredFeature(StructureFeature<?> arg)
{ {
return structureFeatures.get(arg); return null;
} // return structureFeatures.get(arg);
}*/
} }
@@ -15,12 +15,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ChunkGenerator.class) @Mixin(ChunkGenerator.class)
public abstract class ChunkGeneratorMixin implements ChunkGeneratorInterface public abstract class ChunkGeneratorMixin implements ChunkGeneratorInterface
{ {
@Shadow protected abstract void method_28509(); @Shadow protected abstract void generateStrongholdPositions();
@Override @Override
public void initStrongholds() public void initStrongholds()
{ {
method_28509(); generateStrongholdPositions();
} }
// this might not be needed anymore // this might not be needed anymore
/* /*
@@ -10,6 +10,7 @@ import net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.biome.source.BiomeArray;
import net.minecraft.world.chunk.WorldChunk; import net.minecraft.world.chunk.WorldChunk;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -31,7 +32,7 @@ public class ClientPlayNetworkHandler_smoothClientAnimationsMixin
shift = At.Shift.AFTER shift = At.Shift.AFTER
)) ))
private void recreateMovingPistons(ChunkDataS2CPacket packet, CallbackInfo ci, private void recreateMovingPistons(ChunkDataS2CPacket packet, CallbackInfo ci,
int i, int j, WorldChunk worldChunk, Iterator var5, CompoundTag tag, BlockPos blockPos) int i, int j, BiomeArray biomeArray, WorldChunk worldChunk, Iterator var5, CompoundTag tag, BlockPos blockPos)
{ {
if (CarpetSettings.smoothClientAnimations) if (CarpetSettings.smoothClientAnimations)
{ {
@@ -15,6 +15,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(Entity.class) @Mixin(Entity.class)
public abstract class Entity_portalSuffocationMixin public abstract class Entity_portalSuffocationMixin
{ {
// FIXED IN 20w28a
/*
@Shadow public abstract Box getBoundingBox(); @Shadow public abstract Box getBoundingBox();
@Inject(method = "changeDimension", at = @At( @Inject(method = "changeDimension", at = @At(
@@ -48,4 +50,6 @@ public abstract class Entity_portalSuffocationMixin
CarpetSettings.currentTelepotingEntityBox = null; CarpetSettings.currentTelepotingEntityBox = null;
CarpetSettings.fixedPosition = null; CarpetSettings.fixedPosition = null;
} }
*/
} }
@@ -18,6 +18,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(PortalForcer.class) @Mixin(PortalForcer.class)
public class PortalForcer_portalSuffocationMixin public class PortalForcer_portalSuffocationMixin
{ {
//FIXED IN 20w28a
/*
@Inject(method = "usePortal", at = @At( @Inject(method = "usePortal", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/entity/Entity;getLastNetherPortalDirectionVector()Lnet/minecraft/util/math/Vec3d;" target = "Lnet/minecraft/entity/Entity;getLastNetherPortalDirectionVector()Lnet/minecraft/util/math/Vec3d;"
@@ -84,4 +86,6 @@ public class PortalForcer_portalSuffocationMixin
CarpetSettings.fixedPosition = target.pos; CarpetSettings.fixedPosition = target.pos;
return target; return target;
} }
*/
} }
@@ -92,25 +92,25 @@ public abstract class ServerPlayerEntity_scarpetEventMixin extends PlayerEntity
private Vec3d previousLocation; private Vec3d previousLocation;
private RegistryKey<World> previousDimension; private RegistryKey<World> previousDimension;
@Inject(method = "changeDimension", at = @At("HEAD")) @Inject(method = "moveToWorld", at = @At("HEAD"))
private void logPreviousCoordinates(ServerWorld serverWorld, CallbackInfoReturnable<Entity> cir) private void logPreviousCoordinates(ServerWorld serverWorld, CallbackInfoReturnable<Entity> cir)
{ {
previousLocation = getPos(); previousLocation = getPos();
previousDimension = world.getRegistryKey(); //dimension type previousDimension = world.getRegistryKey(); //dimension type
} }
@Inject(method = "changeDimension", at = @At("RETURN")) @Inject(method = "moveToWorld", at = @At("RETURN"))
private void atChangeDimension(ServerWorld newWorld, CallbackInfoReturnable<Entity> cir) private void atChangeDimension(ServerWorld destination, CallbackInfoReturnable<Entity> cir)
{ {
if (PLAYER_CHANGES_DIMENSION.isNeeded()) if (PLAYER_CHANGES_DIMENSION.isNeeded())
{ {
ServerPlayerEntity player = (ServerPlayerEntity) (Object)this; ServerPlayerEntity player = (ServerPlayerEntity) (Object)this;
Vec3d to = null; Vec3d to = null;
if (!notInAnyWorld || previousDimension != World.END || newWorld.getRegistryKey() != World.OVERWORLD) // end ow if (!notInAnyWorld || previousDimension != World.END || destination.getRegistryKey() != World.OVERWORLD) // end ow
{ {
to = getPos(); to = getPos();
} }
PLAYER_CHANGES_DIMENSION.onDimensionChange(player, previousLocation, to, previousDimension, newWorld.getRegistryKey()); PLAYER_CHANGES_DIMENSION.onDimensionChange(player, previousLocation, to, previousDimension, destination.getRegistryKey());
} }
} }
@@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(ServerWorld.class) @Mixin(ServerWorld.class)
public class ServerWorld_unloadedEntityMixin public class ServerWorld_unloadedEntityMixin
{ {
@Redirect(method = "checkChunk", at = @At( @Redirect(method = "checkEntityChunkPos", at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/entity/Entity;teleportRequested()Z" target = "Lnet/minecraft/entity/Entity;teleportRequested()Z"
)) ))
@@ -135,7 +135,7 @@ public abstract class StructureFeatureMixin<C extends FeatureConfig> implements
StructureStart structurestart1 = getStructureStartFactory().create((StructureFeature)(Object)this, chunkpos.x, chunkpos.z, BlockBox.empty(),0,worldIn.getSeed()); StructureStart structurestart1 = getStructureStartFactory().create((StructureFeature)(Object)this, chunkpos.x, chunkpos.z, BlockBox.empty(),0,worldIn.getSeed());
if (config == null) if (config == null)
config = new DefaultFeatureConfig(); config = new DefaultFeatureConfig();
structurestart1.init(generator, worldIn.getStructureManager() , chunkpos.x, chunkpos.z, biome_1, config); structurestart1.init(worldIn.method_30349(), generator, worldIn.getStructureManager() , chunkpos.x, chunkpos.z, biome_1, config);
structurestart = structurestart1.hasChildren() ? structurestart1 : StructureStart.DEFAULT; structurestart = structurestart1.hasChildren() ? structurestart1 : StructureStart.DEFAULT;
if (structurestart.hasChildren()) if (structurestart.hasChildren())
@@ -8,12 +8,10 @@ import carpet.fakes.IngredientInterface;
import carpet.fakes.MinecraftServerInterface; import carpet.fakes.MinecraftServerInterface;
import carpet.fakes.RecipeManagerInterface; import carpet.fakes.RecipeManagerInterface;
import carpet.fakes.ServerChunkManagerInterface; import carpet.fakes.ServerChunkManagerInterface;
import carpet.fakes.ServerLightingProviderInterface;
import carpet.fakes.SpawnHelperInnerInterface; import carpet.fakes.SpawnHelperInnerInterface;
import carpet.fakes.StatTypeInterface; import carpet.fakes.StatTypeInterface;
import carpet.fakes.ThreadedAnvilChunkStorageInterface; import carpet.fakes.ThreadedAnvilChunkStorageInterface;
import carpet.helpers.FeatureGenerator; import carpet.helpers.FeatureGenerator;
import carpet.mixins.ChunkGeneratorMixin;
import carpet.mixins.PointOfInterest_scarpetMixin; import carpet.mixins.PointOfInterest_scarpetMixin;
import carpet.script.Fluff.TriFunction; import carpet.script.Fluff.TriFunction;
import carpet.script.argument.BlockArgument; import carpet.script.argument.BlockArgument;
@@ -130,6 +128,7 @@ import net.minecraft.util.math.Vec3i;
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.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.ConfiguredStructureFeature;
import net.minecraft.world.gen.feature.StructureFeature; import net.minecraft.world.gen.feature.StructureFeature;
import net.minecraft.world.SpawnHelper; import net.minecraft.world.SpawnHelper;
import net.minecraft.world.poi.PointOfInterest; import net.minecraft.world.poi.PointOfInterest;
@@ -1086,7 +1085,9 @@ public class CarpetExpression
ServerWorld world = cc.s.getWorld(); ServerWorld world = cc.s.getWorld();
BlockPos pos = locator.block.getPos(); BlockPos pos = locator.block.getPos();
Biome biome = world.getBiome(pos); Biome biome = world.getBiome(pos);
Value res = new StringValue(biome.getTranslationKey().replaceFirst("^biome\\.minecraft\\.", "")); // in locatebiome
Identifier biomeId = cc.s.getMinecraftServer().method_30611().method_30530(Registry.BIOME_KEY).getId(biome);
Value res = new StringValue(NBTSerializableValue.nameFromRegistryId(biomeId));
return (_c, _t) -> res; return (_c, _t) -> res;
}); });
@@ -1097,7 +1098,8 @@ public class CarpetExpression
if (lv.size() == locator.offset) if (lv.size() == locator.offset)
throw new InternalExpressionException("'set_biome' needs a biome name as an argument"); throw new InternalExpressionException("'set_biome' needs a biome name as an argument");
String biomeName = lv.get(locator.offset+0).evalValue(c).getString(); String biomeName = lv.get(locator.offset+0).evalValue(c).getString();
Biome biome = Registry.BIOME.get(new Identifier(biomeName)); // from locatebiome command code
Biome biome = cc.s.getMinecraftServer().method_30611().method_30530(Registry.BIOME_KEY).get(new Identifier(biomeName));
if (biome == null) if (biome == null)
throw new InternalExpressionException("Unknown biome: "+biomeName); throw new InternalExpressionException("Unknown biome: "+biomeName);
boolean doImmediateUpdate = true; boolean doImmediateUpdate = true;
@@ -1132,13 +1134,13 @@ public class CarpetExpression
//CarpetSettings.LOG.error(references.keySet().stream().collect(Collectors.joining(","))); //CarpetSettings.LOG.error(references.keySet().stream().collect(Collectors.joining(",")));
List<Value> referenceList = references.entrySet().stream(). List<Value> referenceList = references.entrySet().stream().
filter(e -> e.getValue()!= null && !e.getValue().isEmpty()). filter(e -> e.getValue()!= null && !e.getValue().isEmpty()).
map(e -> new StringValue(FeatureGenerator.structureToFeature.get(e.getKey()).get(0))).collect(Collectors.toList()); map(e -> new StringValue(NBTSerializableValue.nameFromRegistryId(Registry.STRUCTURE_FEATURE.getId(e.getKey())))).collect(Collectors.toList());
return (_c, _t ) -> ListValue.wrap(referenceList); return (_c, _t ) -> ListValue.wrap(referenceList);
} }
String simpleStructureName = lv.get(locator.offset).evalValue(c).getString().toLowerCase(Locale.ROOT); String simpleStructureName = lv.get(locator.offset).evalValue(c).getString().toLowerCase(Locale.ROOT);
//CarpetSettings.LOG.error(FeatureGenerator.featureToStructure.keySet().stream().collect(Collectors.joining(","))); //CarpetSettings.LOG.error(FeatureGenerator.featureToStructure.keySet().stream().collect(Collectors.joining(",")));
//CarpetSettings.LOG.error(FeatureGenerator.featureToStructure.values().stream().collect(Collectors.joining(","))); //CarpetSettings.LOG.error(FeatureGenerator.featureToStructure.values().stream().collect(Collectors.joining(",")));
StructureFeature<?> structureName = FeatureGenerator.featureToStructure.get(simpleStructureName); StructureFeature<?> structureName = Registry.STRUCTURE_FEATURE.get(new Identifier(simpleStructureName));
if (structureName == null) return LazyValue.NULL; if (structureName == null) return LazyValue.NULL;
LongSet structureReferences = references.get(structureName); LongSet structureReferences = references.get(structureName);
if (structureReferences == null || structureReferences.isEmpty()) return ListValue.lazyEmpty(); if (structureReferences == null || structureReferences.isEmpty()) return ListValue.lazyEmpty();
@@ -1168,7 +1170,7 @@ public class CarpetExpression
if (!(requested instanceof NullValue)) if (!(requested instanceof NullValue))
{ {
String reqString = requested.getString(); String reqString = requested.getString();
structure = FeatureGenerator.featureToStructure.get(reqString); structure = Registry.STRUCTURE_FEATURE.get(new Identifier(reqString));
if (structure == null) throw new InternalExpressionException("Unknown structure: " + reqString); if (structure == null) throw new InternalExpressionException("Unknown structure: " + reqString);
} }
if (lv.size() > locator.offset+1) if (lv.size() > locator.offset+1)
@@ -1190,7 +1192,7 @@ public class CarpetExpression
StructureStart start = FeatureGenerator.shouldStructureStartAt(world, pos, str, needSize); StructureStart start = FeatureGenerator.shouldStructureStartAt(world, pos, str, needSize);
if (start == null) continue; if (start == null) continue;
Value key = new StringValue(FeatureGenerator.structureToFeature.get(str).get(0)); Value key = new StringValue(NBTSerializableValue.nameFromRegistryId(Registry.STRUCTURE_FEATURE.getId(str)));
ret.put(key, (!needSize)?Value.NULL:structureToValue(start)); ret.put(key, (!needSize)?Value.NULL:structureToValue(start));
} }
Value retMap = MapValue.wrap(ret); Value retMap = MapValue.wrap(ret);
@@ -1214,7 +1216,7 @@ public class CarpetExpression
continue; continue;
BlockBox box = start.getBoundingBox(); BlockBox box = start.getBoundingBox();
structureList.put( structureList.put(
new StringValue(FeatureGenerator.structureToFeature.get(entry.getKey()).get(0)), new StringValue(NBTSerializableValue.nameFromRegistryId(Registry.STRUCTURE_FEATURE.getId(entry.getKey()))),
ListValue.of(ListValue.fromTriple(box.minX, box.minY, box.minZ), ListValue.fromTriple(box.maxX, box.maxY, box.maxZ)) ListValue.of(ListValue.fromTriple(box.minX, box.minY, box.minZ), ListValue.fromTriple(box.maxX, box.maxY, box.maxZ))
); );
} }
@@ -1222,7 +1224,7 @@ public class CarpetExpression
return (_c, _t) -> ret; return (_c, _t) -> ret;
} }
String structureName = lv.get(locator.offset).evalValue(c).getString().toLowerCase(Locale.ROOT); String structureName = lv.get(locator.offset).evalValue(c).getString().toLowerCase(Locale.ROOT);
StructureStart start = structures.get(FeatureGenerator.featureToStructure.get(structureName)); StructureStart start = structures.get(Registry.STRUCTURE_FEATURE.get(new Identifier(structureName)));
Value ret = structureToValue(start); Value ret = structureToValue(start);
return (_c, _t) -> ret; return (_c, _t) -> ret;
}); });
@@ -1238,8 +1240,8 @@ public class CarpetExpression
if (lv.size() == locator.offset) if (lv.size() == locator.offset)
throw new InternalExpressionException("'set_structure requires at least position and a structure name"); throw new InternalExpressionException("'set_structure requires at least position and a structure name");
String structureName = lv.get(locator.offset).evalValue(c).getString().toLowerCase(Locale.ROOT); String structureName = lv.get(locator.offset).evalValue(c).getString().toLowerCase(Locale.ROOT);
StructureFeature<?> structureId = FeatureGenerator.featureToStructure.get(structureName); ConfiguredStructureFeature<?, ?> configuredStructure = FeatureGenerator.resolveConfiguredStructure(structureName, world, pos);
if (structureId == null) throw new InternalExpressionException("Unknown structure: "+structureName); if (configuredStructure == null) throw new InternalExpressionException("Unknown structure: "+structureName);
// good 'ol pointer // good 'ol pointer
Value[] result = new Value[]{Value.NULL}; Value[] result = new Value[]{Value.NULL};
// technically a world modification. Even if we could let it slide, we will still park it // technically a world modification. Even if we could let it slide, we will still park it
@@ -1248,7 +1250,8 @@ public class CarpetExpression
Map<StructureFeature<?>, StructureStart<?>> structures = world.getChunk(pos).getStructureStarts(); Map<StructureFeature<?>, StructureStart<?>> structures = world.getChunk(pos).getStructureStarts();
if (lv.size() == locator.offset + 1) if (lv.size() == locator.offset + 1)
{ {
Boolean res = FeatureGenerator.gridStructure(structureName, ((CarpetContext) c).s.getWorld(), locator.block.getPos()); Boolean res = FeatureGenerator.plopGrid(configuredStructure, ((CarpetContext) c).s.getWorld(), locator.block.getPos());
//Boolean res = FeatureGenerator.gridStructure(structureName, ((CarpetContext) c).s.getWorld(), locator.block.getPos());
if (res == null) return; if (res == null) return;
result[0] = res?Value.TRUE:Value.FALSE; result[0] = res?Value.TRUE:Value.FALSE;
return; return;
@@ -1256,11 +1259,12 @@ public class CarpetExpression
Value newValue = lv.get(locator.offset+1).evalValue(c); Value newValue = lv.get(locator.offset+1).evalValue(c);
if (newValue instanceof NullValue) // remove structure if (newValue instanceof NullValue) // remove structure
{ {
if (!structures.containsKey(structureId)) StructureFeature<?> structure = configuredStructure.feature;
if (!structures.containsKey(structure))
{ {
return; return;
} }
StructureStart<?> start = structures.get(structureId); StructureStart<?> start = structures.get(structure);
ChunkPos structureChunkPos = new ChunkPos(start.getChunkX(), start.getChunkZ()); ChunkPos structureChunkPos = new ChunkPos(start.getChunkX(), start.getChunkZ());
BlockBox box = start.getBoundingBox(); BlockBox box = start.getBoundingBox();
for (int chx = box.minX / 16; chx <= box.maxX / 16; chx++) for (int chx = box.minX / 16; chx <= box.maxX / 16; chx++)
@@ -1270,11 +1274,11 @@ public class CarpetExpression
ChunkPos chpos = new ChunkPos(chx, chz); ChunkPos chpos = new ChunkPos(chx, chz);
// getting a chunk will convert it to full, allowing to modify references // getting a chunk will convert it to full, allowing to modify references
Map<StructureFeature<?>, LongSet> references = world.getChunk(chpos.getCenterBlockPos()).getStructureReferences(); Map<StructureFeature<?>, LongSet> references = world.getChunk(chpos.getCenterBlockPos()).getStructureReferences();
if (references.containsKey(structureId) && references.get(structureId) != null) if (references.containsKey(structure) && references.get(structure) != null)
references.get(structureId).remove(structureChunkPos.toLong()); references.get(structure).remove(structureChunkPos.toLong());
} }
} }
structures.remove(structureId); structures.remove(structure);
result[0] = Value.TRUE; result[0] = Value.TRUE;
} }
}); });
@@ -3136,7 +3140,7 @@ public class CarpetExpression
{ {
long newTime = NumericValue.asNumber(lv.get(0).evalValue(c)).getLong(); long newTime = NumericValue.asNumber(lv.get(0).evalValue(c)).getLong();
if (newTime < 0) newTime = 0; if (newTime < 0) newTime = 0;
((CarpetContext) c).s.getWorld().method_29199(newTime);// setTimeOfDay(newTime); ((CarpetContext) c).s.getWorld().setTimeOfDay(newTime);// setTimeOfDay(newTime);
} }
return (cc, tt) -> time; return (cc, tt) -> time;
}); });
@@ -3283,8 +3287,9 @@ public class CarpetExpression
Value [] result = new Value[]{Value.NULL}; Value [] result = new Value[]{Value.NULL};
((CarpetContext)c).s.getMinecraftServer().submitAndJoin( () -> ((CarpetContext)c).s.getMinecraftServer().submitAndJoin( () ->
{ {
Boolean res = FeatureGenerator.plop(what, ((CarpetContext) c).s.getWorld(), locator.block.getPos());
Boolean res = FeatureGenerator.spawn(what, ((CarpetContext) c).s.getWorld(), locator.block.getPos()); //Boolean res = FeatureGenerator.spawn(what, ((CarpetContext) c).s.getWorld(), locator.block.getPos());
if (res == null) if (res == null)
return; return;
if (what.equalsIgnoreCase("boulder")) // there might be more of those if (what.equalsIgnoreCase("boulder")) // there might be more of those
@@ -278,7 +278,11 @@ public class BlockValue extends Value
@Override @Override
public BlockPos getBlockPos() { public BlockPos getBlockPos() {
return this.hit.getBlockPos(); boolean prevcanReplaceExisting = canReplaceExisting;
canReplaceExisting = true;
BlockPos ret = super.getBlockPos();
canReplaceExisting = prevcanReplaceExisting;
return ret;
} }
@Override @Override
+1 -1
View File
@@ -166,7 +166,7 @@ public class Messenger
{ {
if (previous_message != null) if (previous_message != null)
previous_message.setStyle( previous_message.setStyle(
previous_message.getStyle().setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, c(message.substring(1)))) previous_message.getStyle().withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, c(message.substring(1))))
); );
return previous_message; return previous_message;
} }
@@ -27,20 +27,21 @@ __command() -> '';
monument() -> __toggle('monument', 'structures'); monument() -> __toggle('monument', 'structures');
fortress() -> __toggle('fortress', 'structures'); fortress() -> __toggle('fortress', 'structures');
mansion() -> __toggle('mansion', 'structures'); mansion() -> __toggle('mansion', 'structures');
jungle_temple() -> __toggle('jungle_temple', 'structures'); jungle_pyramid() -> __toggle('jungle_pyramid', 'structures');
desert_temple() -> __toggle('desert_temple', 'structures'); desert_pyramid() -> __toggle('desert_pyramid', 'structures');
end_city() -> __toggle('end_city', 'structures'); endcity() -> __toggle('endcity', 'structures');
igloo() -> __toggle('igloo', 'structures'); igloo() -> __toggle('igloo', 'structures');
shipwreck() -> __toggle('shipwreck', 'structures'); shipwreck() -> __toggle('shipwreck', 'structures');
witch_hut() -> __toggle('witch_hut', 'structures'); swamp_hut() -> __toggle('swamp_hut', 'structures');
stronghold() -> __toggle('stronghold', 'structures'); stronghold() -> __toggle('stronghold', 'structures');
ocean_ruin() -> __toggle('ocean_ruin', 'structures'); ocean_ruin() -> __toggle('ocean_ruin', 'structures');
treasure() -> __toggle('treasure', 'structures'); buried_treasure() -> __toggle('buried_treasure', 'structures');
pillager_outpost() -> __toggle('pillager_outpost', 'structures'); pillager_outpost() -> __toggle('pillager_outpost', 'structures');
mineshaft() -> __toggle('mineshaft', 'structures'); mineshaft() -> __toggle('mineshaft', 'structures');
village() -> __toggle('village', 'structures'); village() -> __toggle('village', 'structures');
nether_fossil() -> __toggle('nether_fossil', 'structures'); nether_fossil() -> __toggle('nether_fossil', 'structures');
bastion_remnant() -> __toggle('bastion_remnant', 'structures'); bastion_remnant() -> __toggle('bastion_remnant', 'structures');
ruined_portal() -> __toggle('ruined_portal', 'structures');
slime_chunks() -> __toggle('slime_chunks', 'chunks'); slime_chunks() -> __toggle('slime_chunks', 'chunks');