!added unpolished dynamic lore system

it works and can be used in public builds, but I prefer looking at this
as a proof of concept rather than the finished code for this feature
This commit is contained in:
ASangarin 2020-09-27 17:45:30 +02:00
parent d5fb39f311
commit dd4633c7d2
7 changed files with 104 additions and 27 deletions

Binary file not shown.

View File

@ -9,6 +9,7 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import net.Indyuce.mmoitems.api.item.util.DynamicLore;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.api.item.ItemTag;
@ -115,7 +116,6 @@ public class DurabilityItem {
}
public ItemStack toItem() {
/*
* Cross multiplication to display the current item durability on the
* item durability bar. (1 - ratio) because minecraft works with item
@ -130,6 +130,6 @@ public class DurabilityItem {
: Math.max(1, (int) ((1. - ((double) durability / maxDurability)) * nbtItem.getItem().getType().getMaxDurability()));
nbtItem.addTag(new ItemTag("MMOITEMS_DURABILITY", durability), new ItemTag("Damage", damage));
return nbtItem.toItem();
return new DynamicLore(nbtItem).build();
}
}

View File

@ -1,16 +1,11 @@
package net.Indyuce.mmoitems.api.item.build;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem;
import net.Indyuce.mmoitems.api.util.StatFormat;
import net.Indyuce.mmoitems.stat.data.*;
import net.Indyuce.mmoitems.stat.data.type.UpgradeInfo;
import net.Indyuce.mmoitems.stat.type.DoubleStat;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.api.item.ItemTag;
import net.mmogroup.mmolib.api.item.NBTItem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import org.bukkit.Material;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
@ -19,11 +14,25 @@ import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import com.google.gson.JsonArray;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem;
import net.Indyuce.mmoitems.api.item.util.DynamicLore;
import net.Indyuce.mmoitems.api.util.StatFormat;
import net.Indyuce.mmoitems.stat.data.DoubleData;
import net.Indyuce.mmoitems.stat.data.MaterialData;
import net.Indyuce.mmoitems.stat.data.StoredTagsData;
import net.Indyuce.mmoitems.stat.data.StringData;
import net.Indyuce.mmoitems.stat.data.StringListData;
import net.Indyuce.mmoitems.stat.data.UpgradeData;
import net.Indyuce.mmoitems.stat.data.type.UpgradeInfo;
import net.Indyuce.mmoitems.stat.type.DoubleStat;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.api.item.ItemTag;
import net.mmogroup.mmolib.api.item.NBTItem;
public class ItemStackBuilder {
private MMOItem mmoitem;
@ -118,8 +127,13 @@ public class ItemStackBuilder {
lore.insert("lore", parsed);
}
meta.setLore(lore.build());
final List<String> list = lore.build();
JsonArray array = new JsonArray();
for (String s : list)
array.add(s);
tags.add(new ItemTag("MMOITEMS_DYNAMIC_LORE", array.toString()));
meta.setLore(list);
/*
* This tag is added to entirely override default vanilla item attribute
* modifiers, this way armor gives no ARMOR or ARMOR TOUGHNESS to the
@ -134,7 +148,7 @@ public class ItemStackBuilder {
* @return Builds the item
*/
public ItemStack build() {
return buildNBT().toItem();
return new DynamicLore(buildNBT()).build();
}
public class StatLore {

View File

@ -1,14 +1,15 @@
package net.Indyuce.mmoitems.api.item.build;
import com.google.common.collect.Lists;
import net.Indyuce.mmoitems.MMOItems;
import net.mmogroup.mmolib.MMOLib;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import net.Indyuce.mmoitems.MMOItems;
import net.mmogroup.mmolib.MMOLib;
public class LoreBuilder {
private final List<String> lore = MMOItems.plugin.getLanguage().getDefaultLoreFormat();
private final Map<String, String> placeholders = new HashMap<>();

View File

@ -0,0 +1,52 @@
package net.Indyuce.mmoitems.api.item.util;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import net.Indyuce.mmoitems.MMOItems;
import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.api.item.NBTItem;
public class DynamicLore {
private final NBTItem item;
public DynamicLore(NBTItem nbt) {
item = nbt;
}
public ItemStack build() {
ItemStack stack = item.toItem();
if (item.hasTag("MMOITEMS_DYNAMIC_LORE")) {
JsonArray array = MMOLib.plugin.getJson().parse(item.getString("MMOITEMS_DYNAMIC_LORE"), JsonArray.class);
List<String> lore = new ArrayList<>();
for (JsonElement e : array) {
String s = replace(e.getAsString());
if(!s.equals("!INVALID!"))
lore.add(s);
}
ItemMeta meta = stack.getItemMeta();
meta.setLore(lore);
stack.setItemMeta(meta);
}
return stack;
}
private String replace(String input) {
switch(input.toLowerCase()) {
case "%durability%":
if(item.hasTag("MMOITEMS_DURABILITY") && item.hasTag("MMOITEMS_MAX_DURABILITY"))
return MMOLib.plugin.parseColors(MMOItems.plugin.getLanguage().getDynLoreFormat("durability")
.replace("%durability%", "" + item.getInteger("MMOITEMS_DURABILITY"))
.replace("%max_durability%", "" + item.getInteger("MMOITEMS_MAX_DURABILITY")));
else return "!INVALID!";
default:
return input;
}
}
}

View File

@ -31,7 +31,7 @@ import java.util.logging.Level;
public class ConfigManager {
// cached config files
private ConfigFile abilities, items, loreFormat, messages, potionEffects, stats, attackEffects;
private ConfigFile abilities, items, loreFormat, messages, potionEffects, stats, attackEffects, dynLore;
// cached config options
public boolean abilityPlayerDamage, dodgeKnockbackEnabled, replaceMushroomDrops, worldGenEnabled, upgradeRequirementsCheck;
@ -172,6 +172,7 @@ public class ConfigManager {
potionEffects = new ConfigFile("/language", "potion-effects");
stats = new ConfigFile("/language", "stats");
attackEffects = new ConfigFile("/language", "attack-effects");
dynLore = new ConfigFile("/language", "dynamic-lore");
/*
* reload cached config options for quicker access - these options are
@ -246,6 +247,10 @@ public class ConfigManager {
public String getStaffSpiritName(StaffSpirit spirit) {
return attackEffects.getConfig().getString("staff-spirit." + spirit.name().toLowerCase().replace("_", "-"));
}
public String getDynLoreFormat(String input) {
return dynLore.getConfig().getString("format." + input);
}
/**
* Creates an empty directory in the MMOItems plugin folder if it does not
@ -259,7 +264,7 @@ public class ConfigManager {
if (!folder.exists())
folder.mkdir();
}
/*
* all config files that have a default configuration are stored here, they
* get copied into the plugin folder when the plugin enables
@ -278,6 +283,7 @@ public class ConfigManager {
// default language files -> /MMOItems/language
LORE_FORMAT("lore-format.yml", "language", "lore-format.yml"),
STATS("stats.yml", "language", "stats.yml"),
DYN_LORE("dynamic-lore.yml", "language", "dynamic-lore.yml"),
// station layouts
DEFAULT_LAYOUT("layouts/default.yml", "layouts", "default.yml"),

View File

@ -0,0 +1,4 @@
# This file contains all the data about dynamic lore.
# Use this to change the formatting of different lore parts.
format:
durability: "&7Durability: %durability% / %max_durability%"