Loot table fixes

This commit is contained in:
Daniel Mills 2020-08-21 12:42:21 -04:00
parent 7f3b7df710
commit 83772bed42
5 changed files with 217 additions and 48 deletions

View File

@ -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";

View File

@ -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;

View File

@ -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());
}
}

View File

@ -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());
}
}

View File

@ -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<ItemFlag> 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<IrisEnchantment> 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<IrisAttributeModifier> attributes = new KList<>();
@ArrayType(min = 1, type = String.class)
@DontObfuscate
@Desc("Add lore to this item")
private KList<String> 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<String> lore = new KList<>();
if(minEnchants > 0 || maxEnchants > 0)
{
KList<Enchantment> c = new KList<Enchantment>(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) + ")");
}