Skip to content

Commit

Permalink
add origin config for spreads
Browse files Browse the repository at this point in the history
  • Loading branch information
MelanX committed Apr 22, 2024
1 parent 51c489d commit 41131ba
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ public class TemplatesConfig {

@Config({"A list of file names for templates which should spread around an island",
"Instead of \"minOffset\" and \"maxOffset\" with same values, you could also just use \"offset\".",
"\"origin\" defines from where the offset will be used. Possible values are \"zero\" and \"center\", where \"zero\" is default.",
"Example: ",
"{",
" \"file\": \"default.nbt\",",
" \"minOffset\": [ -6, 3, 5 ],",
" \"maxOffset\": [ 4, 10, 3 ]",
" \"maxOffset\": [ 4, 10, 3 ],",
" \"origin\": \"center\"",
"}"})
public static Map<String, List<TemplateInfo.SpreadInfo>> spreads = Map.of("default", List.of());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,12 @@ public TemplateInfo.SpreadInfo fromJson(JsonObject json) {
throw new IllegalArgumentException("No offset provided: " + json);
}

return new TemplateInfo.SpreadInfo(json.get("file").getAsString(), minOffset, maxOffset);
TemplateInfo.SpreadInfo.Origin origin = TemplateInfo.SpreadInfo.Origin.ZERO;
if (json.has("origin")) {
origin = TemplateInfo.SpreadInfo.Origin.valueOf(json.get("origin").getAsString());
}

return new TemplateInfo.SpreadInfo(json.get("file").getAsString(), minOffset, maxOffset, origin);
}

@Override
Expand All @@ -57,6 +62,10 @@ public JsonObject toJson(TemplateInfo.SpreadInfo value) {
json.add("maxOffset", BlockPosMapper.toJsonArray(value.maxOffset()));
}

if (value.origin() != TemplateInfo.SpreadInfo.Origin.ZERO) {
json.addProperty("origin", value.origin().name());
}

return json;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ private static Set<TemplatesConfig.Spawn> collectSpawns(Map<String, Set<BlockPos
public boolean placeInWorld(ServerLevelAccessor serverLevel, BlockPos pos, BlockPos otherPos, StructurePlaceSettings settings, RandomSource random, int flags) {
for (SpreadConfig spread : this.spreads) {
BlockPos offset = spread.getRandomOffset(random);
if (spread.getOrigin() != TemplateInfo.SpreadInfo.Origin.ZERO) {
offset = offset.offset(TemplateInfo.SpreadInfo.Origin.originOffset(spread.getOrigin(), this.template));
}
spread.getTemplate().placeInWorld(serverLevel, pos.offset(offset), otherPos.offset(offset), settings, random, flags);
}
return this.template.placeInWorld(serverLevel, pos, otherPos, settings, random, flags);
Expand Down Expand Up @@ -169,6 +172,7 @@ public CompoundTag write(CompoundTag nbt) {

CompoundTag tag = new CompoundTag();
tag.putString("File", spread.fileName);
tag.putString("Origin", spread.origin.name());
tag.put("minOffset", minPos);
tag.put("maxOffset", maxPos);

Expand Down Expand Up @@ -212,14 +216,15 @@ public void read(CompoundTag nbt) {
List<SpreadConfig> spreadConfigs = new ArrayList<>();
for (Tag spread : spreads) {
String file = ((CompoundTag) spread).getString("File");
TemplateInfo.SpreadInfo.Origin origin = TemplateInfo.SpreadInfo.Origin.valueOf(((CompoundTag) spread).getString("Origin"));

CompoundTag minPos = ((CompoundTag) spread).getCompound("minOffset");
BlockPos minOffset = new BlockPos(minPos.getInt("posX"), minPos.getInt("posY"), minPos.getInt("posZ"));

CompoundTag maxPos = ((CompoundTag) spread).getCompound("maxOffset");
BlockPos maxOffset = new BlockPos(maxPos.getInt("posX"), maxPos.getInt("posY"), maxPos.getInt("posZ"));

spreadConfigs.add(new SpreadConfig(file, minOffset, maxOffset));
spreadConfigs.add(new SpreadConfig(file, minOffset, maxOffset, origin));
}
this.spreads = List.copyOf(spreadConfigs);
}
Expand All @@ -244,12 +249,13 @@ public static class SpreadConfig {
private final BlockPos minOffset;
private final BlockPos maxOffset;
private final StructureTemplate template;
private final TemplateInfo.SpreadInfo.Origin origin;

public SpreadConfig(TemplateInfo.SpreadInfo info) {
this(info.file(), info.minOffset(), info.maxOffset());
this(info.file(), info.minOffset(), info.maxOffset(), info.origin());
}

public SpreadConfig(String fileName, BlockPos minOffset, BlockPos maxOffset) {
public SpreadConfig(String fileName, BlockPos minOffset, BlockPos maxOffset, TemplateInfo.SpreadInfo.Origin origin) {
StructureTemplate template = new StructureTemplate();
CompoundTag nbt;
try {
Expand All @@ -265,6 +271,7 @@ public SpreadConfig(String fileName, BlockPos minOffset, BlockPos maxOffset) {
this.minOffset = minOffset;
this.maxOffset = maxOffset;
this.template = template;
this.origin = origin;
}

public String getFileName() {
Expand All @@ -288,11 +295,21 @@ public BlockPos getRandomOffset(long seed) {
}

public BlockPos getRandomOffset(RandomSource random) {
return new BlockPos(
BlockPos offset = new BlockPos(
getRandomBetween(random, this.minOffset.getX(), this.maxOffset.getX()),
getRandomBetween(random, this.minOffset.getY(), this.maxOffset.getY()),
getRandomBetween(random, this.minOffset.getZ(), this.maxOffset.getZ())
);

if (this.getOrigin() != TemplateInfo.SpreadInfo.Origin.ZERO) {
offset = offset.subtract(TemplateInfo.SpreadInfo.Origin.originOffset(this.origin, this.template));
}

return offset;
}

public TemplateInfo.SpreadInfo.Origin getOrigin() {
return this.origin;
}

public StructureTemplate getTemplate() {
Expand Down
18 changes: 16 additions & 2 deletions src/main/java/de/melanx/skyblockbuilder/template/TemplateInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import de.melanx.skyblockbuilder.config.common.WorldConfig;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;

public record TemplateInfo(String name, String desc, String file, String spawns, Offset offset,
String surroundingBlocks, String spreads, int surroundingMargin) {
Expand All @@ -14,9 +15,22 @@ public TemplateInfo(String name, String file, String spawns, Offset offset) {
this(name, "", file, spawns, offset, "default", "default", 0);
}

public record SpreadInfo(String file, BlockPos minOffset, BlockPos maxOffset) {
public record SpreadInfo(String file, BlockPos minOffset, BlockPos maxOffset, Origin origin) {

public static final SpreadInfo DEFAULT = new SpreadInfo("default.nbt", BlockPos.ZERO, BlockPos.ZERO);
public static final SpreadInfo DEFAULT = new SpreadInfo("default.nbt", BlockPos.ZERO, BlockPos.ZERO, Origin.ZERO);

public enum Origin {
CENTER,
ZERO;

public static BlockPos originOffset(Origin origin, StructureTemplate template) {
return switch (origin) {
case CENTER ->
new BlockPos(template.size.getX() / 2, template.size.getY() / 2, template.size.getZ() / 2);
default -> BlockPos.ZERO;
};
}
}
}

public record Offset(int x, int y, int z) {}
Expand Down

0 comments on commit 41131ba

Please sign in to comment.