diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/IrisDimension.java index 22f453a63..55124473a 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisDimension.java @@ -70,6 +70,10 @@ public class IrisDimension extends IrisRegistrant { @Required @Desc("The human readable name of this dimension") private String name = "A Dimension"; + @MinNumber(1) + @MaxNumber(2032) + @Desc("Maximum height at which players can be teleported to through gameplay.") + private int logicalHeight = 256; @RegistryListResource(IrisJigsawStructure.class) @Desc("If defined, Iris will place the given jigsaw structure where minecraft should place the overworld stronghold.") private String stronghold; @@ -238,13 +242,11 @@ public class IrisDimension extends IrisRegistrant { private int caveLavaHeight = 8; public int getMaxHeight() { - return 320; - // return (int) getDimensionHeight().getMax(); + return (int) getDimensionHeight().getMax(); } public int getMinHeight() { - return -64; - // return (int) getDimensionHeight().getMin(); + return (int) getDimensionHeight().getMin(); } public BlockData generateOres(int x, int y, int z, RNG rng, IrisData data) { @@ -282,6 +284,10 @@ public class IrisDimension extends IrisRegistrant { }); } + public int getFluidHeight() { + return fluidHeight - (int)dimensionHeight.getMin(); + } + public CNG getCoordFracture(RNG rng, int signature) { return coordFracture.aquire(() -> { @@ -399,6 +405,21 @@ public class IrisDimension extends IrisRegistrant { } } + if(!dimensionHeight.equals(new IrisRange(-64, 320))) { + File dimType = new File(datapacks, "iris/data/minecraft/dimension_type/" + getLoadKey().toLowerCase() + ".json"); + if(!dimType.exists()) + changed = true; + + Iris.verbose(" Installing Data Pack Dimension Type: " + dimType.getPath()); + dimType.getParentFile().mkdirs(); + try { + IO.writeAll(dimType, generateDatapackJson()); + } catch(IOException e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + if(write) { File mcm = new File(datapacks, "iris/pack.mcmeta"); try { @@ -434,4 +455,30 @@ public class IrisDimension extends IrisRegistrant { public void scanForErrors(JSONObject p, VolmitSender sender) { } + + private String generateDatapackJson() { + JSONObject obj = new JSONObject(DP_OVERWORLD_DEFAULT); + obj.put("min_y", dimensionHeight.getMin()); + obj.put("height", dimensionHeight.getMax() - dimensionHeight.getMin()); + obj.put("logical_height", logicalHeight); + return obj.toString(4); + } + + private static final String DP_OVERWORLD_DEFAULT = """ + { + "name": "minecraft:overworld", + "ultrawarm": false, + "natural": true, + "coordinate_scale": 1.0, + "has_skylight": true, + "has_ceiling": false, + "ambient_light": 0, + "fixed_time": false, + "piglin_safe": false, + "bed_works": true, + "respawn_anchor_works": false, + "has_raids": true, + "infiniburn": "infiniburn_overworld", + "effects": "minecraft:overworld" + }"""; } diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java b/src/main/java/com/volmit/iris/engine/object/IrisLoot.java index 26c637411..d4678342e 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisLoot.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.object; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.ArrayType; @@ -28,17 +29,25 @@ import com.volmit.iris.engine.object.annotations.RegistryListItemType; import com.volmit.iris.engine.object.annotations.Required; import com.volmit.iris.engine.object.annotations.Snippet; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.data.B; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.noise.CNG; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.TagParser; +import net.minecraft.server.commands.GiveCommand; import org.bukkit.DyeColor; import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; @@ -102,6 +111,8 @@ public class IrisLoot { private DyeColor dyeColor = null; @Desc("The leather armor color") private String leatherColor = null; + @Desc("Defines a custom NBT Tag for the item.") + private KMap customNbt; public Material getType() { return B.getMaterial(type); @@ -173,7 +184,7 @@ public class IrisLoot { } is.setItemMeta(m); - return is; + return applyCustomNbt(is); } catch(Throwable e) { Iris.reportError(e); @@ -250,13 +261,23 @@ public class IrisLoot { m.setLore(lore); is.setItemMeta(m); - return is; + return applyCustomNbt(is); } catch(Throwable e) { Iris.reportError(e); - } } return null; } + + private ItemStack applyCustomNbt(ItemStack stack) throws CommandSyntaxException { + if(customNbt == null || customNbt.isEmpty()) + return stack; + net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(stack); + CompoundTag tag = TagParser.parseTag(new JSONObject(customNbt).toString()); + tag.merge(s.getOrCreateTag()); + s.setTag(tag); + System.out.println(customNbt); + return CraftItemStack.asBukkitCopy(s); + } }