Merge remote-tracking branch 'origin/ver/6.3.0'

# Conflicts:
#	build.gradle.kts
#	buildSrc/src/main/kotlin/Versions.kt
#	platforms/bukkit/build.gradle.kts
#	platforms/bukkit/nms/v1_19_R1/build.gradle.kts
#	platforms/bukkit/nms/v1_19_R2/build.gradle.kts
#	platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java
#	platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java
#	platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java
#	platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java
#	platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java
#	platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java
This commit is contained in:
dfsek 2023-06-09 03:16:18 -07:00
commit 60fec05e12
9 changed files with 76 additions and 27 deletions

View File

@ -1,8 +1,8 @@
preRelease(true)
versionProjects(":common:api", version("6.2.2"))
versionProjects(":common:implementation", version("6.2.2"))
versionProjects(":platforms", version("6.2.2"))
versionProjects(":common:api", version("6.3.0"))
versionProjects(":common:implementation", version("6.3.0"))
versionProjects(":platforms", version("6.3.0"))
allprojects {

View File

@ -11,6 +11,7 @@ import net.jafama.FastMath;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.StreamSupport;
@ -97,6 +98,11 @@ public class PipelineBiomeProvider implements BiomeProvider {
return biomes;
}
@Override
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
return Optional.of(getBiome(x, z, seed));
}
@Override
public Column<Biome> getColumn(int x, int z, long seed, int min, int max) {
return new BiomePipelineColumn(this, min, max, x, z, seed);

View File

@ -30,6 +30,7 @@ import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.StringUtil;
import com.dfsek.terra.api.util.vector.Vector3Int;
public class SpongeSchematicAddon implements AddonInitializer {
@ -71,9 +72,36 @@ public class SpongeSchematicAddon implements AddonInitializer {
public SpongeStructure convert(InputStream in, String id) {
try {
CompoundTag baseTag = (CompoundTag) new NBTDeserializer(false).fromStream(detectDecompression(in)).getTag();
int ver = baseTag.getInt("Version");
int wid = baseTag.getShort("Width");
int len = baseTag.getShort("Length");
int hei = baseTag.getShort("Height");
CompoundTag metadata = baseTag.getCompoundTag("Metadata");
Vector3Int offset = switch(ver) {
case 2 -> {
// Use WorldEdit defined legacy relative offset if it exists in schematic metadata
IntTag worldEditOffsetX = metadata.getIntTag("WEOffsetX");
IntTag worldEditOffsetY = metadata.getIntTag("WEOffsetY");
IntTag worldEditOffsetZ = metadata.getIntTag("WEOffsetZ");
if(worldEditOffsetX != null || worldEditOffsetY != null || worldEditOffsetZ != null) {
if(worldEditOffsetX == null || worldEditOffsetY == null || worldEditOffsetZ == null) {
throw new IllegalArgumentException("Failed to parse Sponge schematic: Malformed WorldEdit offset");
}
yield Vector3Int.of(worldEditOffsetX.asInt(), worldEditOffsetY.asInt(), worldEditOffsetZ.asInt());
} else {
// Relative offset handling via 'Offset' field is ambiguous in spec 2 so just apply no offset
yield Vector3Int.zero();
}
}
case 3 -> {
// Relative offset is more concretely defined in spec 3 to use 'Offset' field
int[] offsetArray = baseTag.getIntArray("Offset");
yield Vector3Int.of(offsetArray[0], offsetArray[1], offsetArray[2]);
}
default -> throw new IllegalArgumentException("Failed to parse Sponge schematic: Unsupported format version: " + ver);
};
ByteArrayTag blocks = baseTag.getByteArrayTag("BlockData");
@ -97,7 +125,7 @@ public class SpongeSchematicAddon implements AddonInitializer {
}
}
return new SpongeStructure(states, addon.key(id));
return new SpongeStructure(states, offset, addon.key(id));
} catch(IOException e) {
throw new IllegalArgumentException("Failed to parse Sponge schematic: ", e);
}

View File

@ -23,10 +23,15 @@ public class SpongeStructure implements Structure, Keyed<SpongeStructure> {
private final BlockState[][][] blocks;
private final int offsetX, offsetY, offsetZ;
private final RegistryKey id;
public SpongeStructure(BlockState[][][] blocks, RegistryKey id) {
public SpongeStructure(BlockState[][][] blocks, Vector3Int offset, RegistryKey id) {
this.blocks = blocks;
this.offsetX = offset.getX();
this.offsetY = offset.getY();
this.offsetZ = offset.getZ();
this.id = id;
}
@ -37,13 +42,15 @@ public class SpongeStructure implements Structure, Keyed<SpongeStructure> {
int bZ = location.getZ();
for(int x = 0; x < blocks.length; x++) {
for(int z = 0; z < blocks[x].length; z++) {
Vector2Int r = Vector2Int.of(x, z).rotate(rotation);
int oX = x + offsetX;
int oZ = z + offsetZ;
Vector2Int r = Vector2Int.of(oX, oZ).rotate(rotation);
int rX = r.getX();
int rZ = r.getZ();
for(int y = 0; y < blocks[x][z].length; y++) {
BlockState state = blocks[x][z][y];
if(state == null) continue;
world.setBlockState(bX + rX, bY + y, bZ + rZ, state);
world.setBlockState(bX + rX, bY + y + offsetY, bZ + rZ, state);
}
}
}

View File

@ -27,24 +27,40 @@ import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.lang.reflect.AnnotatedType;
import java.util.concurrent.ConcurrentHashMap;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.config.Loader;
import com.dfsek.terra.api.properties.Properties;
public class BufferedImageLoader implements TypeLoader<BufferedImage> {
private final Loader files;
public BufferedImageLoader(Loader files) {
private final ConfigPack pack;
public BufferedImageLoader(Loader files, ConfigPack pack) {
this.files = files;
this.pack = pack;
if (!pack.getContext().has(ImageCache.class))
pack.getContext().put(new ImageCache(new ConcurrentHashMap<>()));
}
@Override
public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker)
throws LoadException {
try {
return ImageIO.read(files.get((String) c));
} catch(IOException e) {
throw new LoadException("Unable to load image", e, depthTracker);
}
return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, s -> {
try {
return ImageIO.read(files.get(s));
} catch(IOException e) {
throw new LoadException("Unable to load image", e, depthTracker);
}
});
}
/*
* Cache prevents configs from loading the same image multiple times into memory
*/
private record ImageCache(ConcurrentHashMap<String, BufferedImage> map) implements Properties {
}
}

View File

@ -283,7 +283,7 @@ public class ConfigPackImpl implements ConfigPack {
@Override
public void register(TypeRegistry registry) {
registry.registerLoader(ConfigType.class, configTypeRegistry)
.registerLoader(BufferedImage.class, new BufferedImageLoader(loader));
.registerLoader(BufferedImage.class, new BufferedImageLoader(loader, this));
registryMap.forEach(registry::registerLoader);
shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present
}

View File

@ -5,6 +5,9 @@ import com.dfsek.tectonic.api.depth.DepthTracker;
import com.dfsek.tectonic.api.exception.LoadException;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.registry.DynamicRegistryManager;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
import net.minecraft.registry.RegistryKeys;
@ -24,6 +27,7 @@ import net.minecraft.world.biome.SpawnSettings;
import net.minecraft.world.biome.SpawnSettings.SpawnEntry;
import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList;
import net.minecraft.world.dimension.DimensionType;
import net.minecraft.world.dimension.DimensionType;
import net.minecraft.world.gen.WorldPreset;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import org.jetbrains.annotations.NotNull;

View File

@ -1,18 +1,8 @@
package com.dfsek.terra.mod.util;
import com.dfsek.terra.mod.ModPlatform;
import com.dfsek.terra.mod.mixin.access.WorldPresetsRegistrarAccessor;
import com.dfsek.terra.mod.mixin_ifaces.RegistrarInstance;
import net.minecraft.registry.DynamicRegistryManager;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryEntryLookup;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.util.Identifier;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.source.MultiNoiseBiomeSource;
import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList;
import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterLists;
@ -21,7 +11,6 @@ import net.minecraft.world.dimension.DimensionOptions;
import net.minecraft.world.dimension.DimensionType;
import net.minecraft.world.dimension.DimensionTypes;
import net.minecraft.world.gen.WorldPreset;
import net.minecraft.world.gen.WorldPresets;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import net.minecraft.world.gen.chunk.NoiseChunkGenerator;
@ -35,6 +24,7 @@ import java.util.Map;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.util.generic.pair.Pair;
import com.dfsek.terra.mod.ModPlatform;
import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper;
import com.dfsek.terra.mod.generation.TerraBiomeSource;

View File

@ -18,9 +18,7 @@ public final class LifecycleUtil {
public static void initialize(MutableRegistry<Biome> biomeMutableRegistry, MutableRegistry<WorldPreset> worldPresetMutableRegistry) {
CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent());
BiomeUtil.registerBiomes(biomeMutableRegistry);
CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(worldPresetMutableRegistry, RegistryKey.of(RegistryKeys.WORLD_PRESET, id), preset));
}
}