diff --git a/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/compile/SetupStep.java b/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/compile/SetupStep.java index 8010a8ba..a1c6e5ac 100644 --- a/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/compile/SetupStep.java +++ b/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/compile/SetupStep.java @@ -8,6 +8,7 @@ import org.apache.logging.log4j.LogManager; import org.scaffoldeditor.scaffold.compile.Compiler.CompileProgressListener; import org.scaffoldeditor.scaffold.level.Level; +import org.scaffoldeditor.scaffold.level.LevelData.GameType; import org.scaffoldeditor.scaffold.level.entity.attribute.Attribute; import org.scaffoldeditor.scaffold.level.entity.attribute.BooleanAttribute; @@ -30,13 +31,19 @@ public boolean execute(Level level, Path target, Map> args, if (args.get("cheats") instanceof BooleanAttribute) { cheats = ((BooleanAttribute) args.get("cheats")).getValue(); } - + + GameType gameType = GameType.ADVENTURE; + Object gameTypeAtt = args.get("gameType").getValue(); + if (gameTypeAtt instanceof GameType) { + gameType = (GameType) gameTypeAtt; + } + // Make world folder target.toFile().mkdir(); // Compile levelData try { - level.levelData().compileFile(target.resolve("level.dat").toFile(), cheats); + level.levelData().compileFile(target.resolve("level.dat").toFile(), cheats, gameType); } catch (IOException e) { e.printStackTrace(); return false; diff --git a/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/LevelData.java b/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/LevelData.java index 6bbbe3c5..ac686c37 100644 --- a/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/LevelData.java +++ b/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/LevelData.java @@ -27,6 +27,13 @@ public class LevelData { private CompoundTag data = new CompoundTag(); private CompoundTag gamerules = new CompoundTag(); + public enum GameType { + SURVIVAL, + CREATIVE, + ADVENTURE, + SPECTATOR + } + public LevelData(Level level) { this.level = level; @@ -105,15 +112,16 @@ public String getGamerule(String name) { /** * Compile this LevelData into a compound tag. * @param cheats Should the compiled world have cheats on? + * @param gameType Initial gamemode for the player. * @return Compiled NBT */ - public CompoundTag compile(boolean cheats) throws IOException { + public CompoundTag compile(boolean cheats, GameType gameType) throws IOException { AssetManager assetManager = level.getProject().assetManager(); NamedTag named = new NBTDeserializer(true).fromStream(assetManager.getAssetAsStream("defaults/default_level.dat")); CompoundTag tag = (CompoundTag) named.getTag(); CompoundTag data = tag.getCompoundTag("Data"); - NBTMerger.mergeCompound(data, data, true, ListMergeMode.REPLACE); + NBTMerger.mergeCompound(data, this.data, true, ListMergeMode.REPLACE); // Identify player start Entity start = null; @@ -133,6 +141,7 @@ public CompoundTag compile(boolean cheats) throws IOException { data.putBoolean("allowCommands", cheats); data.putString("LevelName", level.getPrettyName()); + data.putInt("GameType", gameType.ordinal()); return tag; } @@ -143,10 +152,11 @@ public CompoundTag compile(boolean cheats) throws IOException { * Compile level data to nbt file. * @param file File to save to. * @param cheats Should cheats be enabled? + * @param gameType Initial gamemode for the player. * @throws IOException if an I/O error occurs. */ - public void compileFile(File file, boolean cheats) throws IOException { - CompoundTag compiled = compile(cheats); + public void compileFile(File file, boolean cheats, GameType gameType) throws IOException { + CompoundTag compiled = compile(cheats, gameType); NBTUtil.write(new NamedTag("", compiled), file); } diff --git a/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/entity/attribute/EnumAttribute.java b/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/entity/attribute/EnumAttribute.java index f6821dc5..e6f04c43 100644 --- a/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/entity/attribute/EnumAttribute.java +++ b/scaffold-core/src/main/java/org/scaffoldeditor/scaffold/level/entity/attribute/EnumAttribute.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; +import org.scaffoldeditor.scaffold.level.LevelData; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -61,6 +62,7 @@ public EnumAttribute deserialize(Element element) { enumRegistry.put("placeholder", DefaultEnums.PlaceholderEnum.class); enumRegistry.put("direction", DefaultEnums.Direction.class); + enumRegistry.put("game_type", LevelData.GameType.class); } private T value;