diff --git a/src/main/java/com/volmit/iris/ProjectManager.java b/src/main/java/com/volmit/iris/ProjectManager.java index 95bfa421c..980c268d3 100644 --- a/src/main/java/com/volmit/iris/ProjectManager.java +++ b/src/main/java/com/volmit/iris/ProjectManager.java @@ -17,6 +17,7 @@ import org.bukkit.World.Environment; import org.bukkit.WorldCreator; import org.bukkit.WorldType; import org.bukkit.block.Biome; +import org.bukkit.enchantments.Enchantment; import org.bukkit.potion.PotionEffectType; import org.zeroturnaround.zip.ZipUtil; @@ -816,6 +817,19 @@ public class ProjectManager prop.put("enum", a); } + if(k.getType().equals(String.class) && k.getName().equals("enchantment")) + { + tp = "string"; + JSONArray a = new JSONArray(); + + for(Field gg : Enchantment.class.getDeclaredFields()) + { + a.put(gg.getName()); + } + + prop.put("enum", a); + } + if(k.getType().equals(KList.class)) { tp = "array"; diff --git a/src/main/java/com/volmit/iris/command/CommandIrisLoot.java b/src/main/java/com/volmit/iris/command/CommandIrisLoot.java index 41375e5a1..a018f056e 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisLoot.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisLoot.java @@ -1,17 +1,13 @@ package com.volmit.iris.command; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; import com.volmit.iris.Iris; import com.volmit.iris.object.InventorySlotType; import com.volmit.iris.object.IrisLootTable; -import com.volmit.iris.util.KList; -import com.volmit.iris.util.KMap; import com.volmit.iris.util.KSet; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; diff --git a/src/main/java/com/volmit/iris/object/IrisAttributeModifier.java b/src/main/java/com/volmit/iris/object/IrisAttributeModifier.java new file mode 100644 index 000000000..5834971d5 --- /dev/null +++ b/src/main/java/com/volmit/iris/object/IrisAttributeModifier.java @@ -0,0 +1,67 @@ +package com.volmit.iris.object; + +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.attribute.AttributeModifier.Operation; +import org.bukkit.inventory.meta.ItemMeta; + +import com.volmit.iris.util.Desc; +import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.MaxNumber; +import com.volmit.iris.util.MinNumber; +import com.volmit.iris.util.RNG; +import com.volmit.iris.util.Required; + +import lombok.Data; + +@Desc("Represents an attribute modifier") +@Data +public class IrisAttributeModifier +{ + @Required + @DontObfuscate + @Desc("The Attribute type") + private Attribute attribute = null; + + @MinNumber(2) + @Required + @DontObfuscate + @Desc("The Attribute Name") + private String name = ""; + + @DontObfuscate + @Desc("The application operation (add number is default)") + private Operation operation = Operation.ADD_NUMBER; + + @DontObfuscate + @Desc("Minimum amount for this modifier") + private double minAmount = 1; + + @DontObfuscate + @Desc("Maximum amount for this modifier") + private double maxAmount = 1; + + @MinNumber(0) + @MaxNumber(1) + @DontObfuscate + @Desc("The chance that this attribute is applied (0 to 1)") + private double chance = 1; + + public IrisAttributeModifier() + { + + } + + public void apply(RNG rng, ItemMeta meta) + { + if(rng.nextDouble() < getChance()) + { + meta.addAttributeModifier(getAttribute(), new AttributeModifier(getName(), getAmount(rng), getOperation())); + } + } + + public double getAmount(RNG rng) + { + return rng.d(getMinAmount(), getMaxAmount()); + } +} diff --git a/src/main/java/com/volmit/iris/object/IrisEnchantment.java b/src/main/java/com/volmit/iris/object/IrisEnchantment.java new file mode 100644 index 000000000..05e251269 --- /dev/null +++ b/src/main/java/com/volmit/iris/object/IrisEnchantment.java @@ -0,0 +1,83 @@ +package com.volmit.iris.object; + +import java.lang.reflect.Field; + +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.meta.ItemMeta; + +import com.volmit.iris.Iris; +import com.volmit.iris.util.Desc; +import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.MaxNumber; +import com.volmit.iris.util.MinNumber; +import com.volmit.iris.util.RNG; +import com.volmit.iris.util.Required; + +import lombok.Data; + +@Desc("Represents an enchantment & level") +@Data +public class IrisEnchantment +{ + @Required + @DontObfuscate + @Desc("The enchantment") + private String enchantment = ""; + + @MinNumber(1) + @DontObfuscate + @Desc("Minimum amount of this loot") + private int minLevel = 1; + + @MinNumber(1) + @DontObfuscate + @Desc("Maximum amount of this loot") + private int maxLevel = 1; + + @MinNumber(0) + @MaxNumber(1) + @DontObfuscate + @Desc("The chance that this enchantment is applied (0 to 1)") + private double chance = 1; + + public IrisEnchantment() + { + + } + + public void apply(RNG rng, ItemMeta meta) + { + if(rng.nextDouble() < chance) + { + meta.addEnchant(getEnchant(), getLevel(rng), true); + } + } + + public Enchantment getEnchant() + { + for(Field i : Enchantment.class.getDeclaredFields()) + { + if(i.getType().equals(Enchantment.class) && i.getName().equals(getEnchantment())) + { + try + { + return (Enchantment) i.get(null); + } + + catch(IllegalArgumentException | IllegalAccessException e) + { + e.printStackTrace(); + } + } + } + + Iris.warn("Can't find enchantment type: " + getEnchantment()); + + return null; + } + + public int getLevel(RNG rng) + { + return rng.i(getMinLevel(), getMaxLevel()); + } +} diff --git a/src/main/java/com/volmit/iris/object/IrisLoot.java b/src/main/java/com/volmit/iris/object/IrisLoot.java index 046f93553..4c067ae51 100644 --- a/src/main/java/com/volmit/iris/object/IrisLoot.java +++ b/src/main/java/com/volmit/iris/object/IrisLoot.java @@ -1,7 +1,7 @@ package com.volmit.iris.object; import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; @@ -9,6 +9,7 @@ import org.bukkit.inventory.meta.ItemMeta; import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.noise.CNG; +import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.B; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; @@ -45,6 +46,11 @@ public class IrisLoot @Desc("Maximum amount of this loot") private int maxAmount = 1; + @MinNumber(1) + @DontObfuscate + @Desc("The display name of this item") + private String displayName = null; + @MinNumber(0) @MaxNumber(1) @DontObfuscate @@ -57,36 +63,36 @@ public class IrisLoot @Desc("Maximum durability percent") private double maxDurability = 1; - @MinNumber(1) - @MaxNumber(10) @DontObfuscate - @Desc("Minimum Enchantment level") - private int minEnchantLevel = 1; + @Desc("Define a custom model identifier") + private Integer customModel = null; - @MinNumber(1) - @MaxNumber(10) @DontObfuscate - @Desc("Maximum Enchantment level") - private int maxEnchantLevel = 1; + @Desc("Set this to true to prevent it from being broken") + private boolean unbreakable = false; - @MinNumber(0) - @MaxNumber(10) + @ArrayType(min = 1, type = ItemFlag.class) @DontObfuscate - @Desc("Minimum Enchantmentments") - private int minEnchants = 0; + @Desc("The item flags to add") + private KList itemFlags = new KList<>(); - @MinNumber(0) - @MaxNumber(10) @DontObfuscate - @Desc("Maximum Enchantmentments") - private int maxEnchants = 0; + @Desc("Apply enchantments to this item") + @ArrayType(min = 1, type = IrisEnchantment.class) + private KList enchantments = new KList<>(); - @MinNumber(1) @DontObfuscate - @Desc("The chance for every attempt to add an enchantment 1 in X") - private int enchantmentRarity = 4; + @Desc("Apply attribute modifiers to this item") + @ArrayType(min = 1, type = IrisAttributeModifier.class) + private KList attributes = new KList<>(); + + @ArrayType(min = 1, type = String.class) + @DontObfuscate + @Desc("Add lore to this item") + private KList lore = new KList<>(); @Required + @DontObfuscate @Desc("This is the item or block type. Does not accept minecraft:*. Only materials such as DIAMOND_SWORD or DIRT.") private String type = ""; @@ -127,35 +133,38 @@ public class IrisLoot d.setDamage((int) Math.round(Math.max(0, Math.min(max, (1D - rng.d(getMinDurability(), getMaxDurability())) * max)))); } + for(IrisEnchantment i : getEnchantments()) + { + i.apply(rng, m); + } + + for(IrisAttributeModifier i : getAttributes()) + { + i.apply(rng, m); + } + + m.setCustomModelData(getCustomModel()); + m.setLocalizedName(displayName); + m.setDisplayName(displayName); + m.setUnbreakable(isUnbreakable()); + + for(ItemFlag i : getItemFlags()) + { + m.addItemFlags(i); + } + KList lore = new KList<>(); - if(minEnchants > 0 || maxEnchants > 0) - { - KList c = new KList(Enchantment.values()); - - for(int i = minEnchants; i < maxEnchants; i++) - { - if(rng.i(1, enchantmentRarity) == 1) - { - Enchantment e = c.get(rng.nextInt(c.size())); - - for(int ggh = 0; ggh < 8; ggh++) - { - if(e.canEnchantItem(is)) - { - m.addEnchant(e, rng.i(getMinEnchantLevel(), getMaxEnchantLevel()), false); - break; - } - - e = c.get(rng.nextInt(c.size())); - } - } - } - } + lore.addAll(getLore()); if(debug) { - lore.add("From Table: " + table.getName() + " (" + Form.pc(1D / table.getRarity(), 5) + ")"); + if(lore.isNotEmpty()) + { + lore.add(ChatColor.GRAY + "--------------------"); + } + + lore.add(ChatColor.GRAY + "From: " + table.getName() + " (" + Form.pc(1D / table.getRarity(), 5) + ")"); lore.add(ChatColor.GRAY + "1 in " + (table.getRarity() * getRarity()) + " Chance (" + Form.pc(1D / (table.getRarity() * getRarity()), 5) + ")"); }