mirror of
https://github.com/EssentialsX/Essentials.git
synced 2025-01-11 02:47:52 +01:00
Add NBT support in items.csv (#1276)
This commit adds a new 4th column reading in `items.csv` to enable the ability to specify NBT data for newly constructed items.
This commit is contained in:
parent
bbe0ca9302
commit
3fba6e9ad0
@ -4,6 +4,7 @@ import com.earth2me.essentials.utils.NumberUtil;
|
|||||||
import net.ess3.nms.updatedmeta.BasePotionDataProvider;
|
import net.ess3.nms.updatedmeta.BasePotionDataProvider;
|
||||||
import com.earth2me.essentials.utils.StringUtil;
|
import com.earth2me.essentials.utils.StringUtil;
|
||||||
import net.ess3.api.IEssentials;
|
import net.ess3.api.IEssentials;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Color;
|
import org.bukkit.Color;
|
||||||
import org.bukkit.FireworkEffect;
|
import org.bukkit.FireworkEffect;
|
||||||
@ -29,8 +30,10 @@ public class ItemDb implements IConf, net.ess3.api.IItemDb {
|
|||||||
private final transient Map<ItemData, List<String>> names = new HashMap<>();
|
private final transient Map<ItemData, List<String>> names = new HashMap<>();
|
||||||
private final transient Map<ItemData, String> primaryName = new HashMap<>();
|
private final transient Map<ItemData, String> primaryName = new HashMap<>();
|
||||||
private final transient Map<String, Short> durabilities = new HashMap<>();
|
private final transient Map<String, Short> durabilities = new HashMap<>();
|
||||||
|
private final transient Map<String, String> nbtData = new HashMap<>();
|
||||||
private final transient ManagedFile file;
|
private final transient ManagedFile file;
|
||||||
private final transient Pattern splitPattern = Pattern.compile("((.*)[:+',;.](\\d+))");
|
private final transient Pattern splitPattern = Pattern.compile("((.*)[:+',;.](\\d+))");
|
||||||
|
private final transient Pattern csvSplitPattern = Pattern.compile("(\"([^\"]*)\"|[^,]*)(,|$)");
|
||||||
|
|
||||||
public ItemDb(final IEssentials ess) {
|
public ItemDb(final IEssentials ess) {
|
||||||
this.ess = ess;
|
this.ess = ess;
|
||||||
@ -51,35 +54,66 @@ public class ItemDb implements IConf, net.ess3.api.IItemDb {
|
|||||||
primaryName.clear();
|
primaryName.clear();
|
||||||
|
|
||||||
for (String line : lines) {
|
for (String line : lines) {
|
||||||
line = line.trim().toLowerCase(Locale.ENGLISH);
|
|
||||||
if (line.length() > 0 && line.charAt(0) == '#') {
|
if (line.length() > 0 && line.charAt(0) == '#') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String[] parts = line.split("[^a-z0-9]");
|
String itemName = null;
|
||||||
if (parts.length < 2) {
|
int numeric = -1;
|
||||||
|
short data = 0;
|
||||||
|
String nbt = null;
|
||||||
|
|
||||||
|
int col = 0;
|
||||||
|
Matcher matcher = csvSplitPattern.matcher(line);
|
||||||
|
while (matcher.find()) {
|
||||||
|
String match = matcher.group(1);
|
||||||
|
if (StringUtils.stripToNull(match) == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
match = StringUtils.strip(match, "\"");
|
||||||
|
switch (col) {
|
||||||
|
case 0:
|
||||||
|
itemName = match.toLowerCase(Locale.ENGLISH);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
numeric = Integer.parseInt(match);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
data = Short.parseShort(match);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
nbt = StringUtils.stripToNull(match);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
// Invalid row
|
||||||
|
if (itemName == null || numeric < 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int numeric = Integer.parseInt(parts[1]);
|
|
||||||
final short data = parts.length > 2 && !parts[2].equals("0") ? Short.parseShort(parts[2]) : 0;
|
|
||||||
String itemName = parts[0].toLowerCase(Locale.ENGLISH);
|
|
||||||
|
|
||||||
durabilities.put(itemName, data);
|
durabilities.put(itemName, data);
|
||||||
items.put(itemName, numeric);
|
items.put(itemName, numeric);
|
||||||
|
if (nbt != null) {
|
||||||
|
nbtData.put(itemName, nbt);
|
||||||
|
}
|
||||||
|
|
||||||
ItemData itemData = new ItemData(numeric, data);
|
ItemData itemData = new ItemData(numeric, data);
|
||||||
if (names.containsKey(itemData)) {
|
if (names.containsKey(itemData)) {
|
||||||
List<String> nameList = names.get(itemData);
|
List<String> nameList = names.get(itemData);
|
||||||
nameList.add(itemName);
|
nameList.add(itemName);
|
||||||
Collections.sort(nameList, new LengthCompare());
|
|
||||||
} else {
|
} else {
|
||||||
List<String> nameList = new ArrayList<String>();
|
List<String> nameList = new ArrayList<>();
|
||||||
nameList.add(itemName);
|
nameList.add(itemName);
|
||||||
names.put(itemData, nameList);
|
names.put(itemData, nameList);
|
||||||
primaryName.put(itemData, itemName);
|
primaryName.put(itemData, itemName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (List<String> nameList : names.values()) {
|
||||||
|
Collections.sort(nameList, LengthCompare.INSTANCE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -138,6 +172,13 @@ public class ItemDb implements IConf, net.ess3.api.IItemDb {
|
|||||||
throw new Exception(tl("unknownItemId", itemid));
|
throw new Exception(tl("unknownItemId", itemid));
|
||||||
}
|
}
|
||||||
ItemStack retval = new ItemStack(mat);
|
ItemStack retval = new ItemStack(mat);
|
||||||
|
if (nbtData.containsKey(itemname)) {
|
||||||
|
String nbt = nbtData.get(itemname);
|
||||||
|
if (nbt.startsWith("*")) {
|
||||||
|
nbt = nbtData.get(nbt.substring(1));
|
||||||
|
}
|
||||||
|
retval = ess.getServer().getUnsafe().modifyItemStack(retval, nbt);
|
||||||
|
}
|
||||||
if (mat == Material.MOB_SPAWNER) {
|
if (mat == Material.MOB_SPAWNER) {
|
||||||
if (metaData == 0) metaData = EntityType.PIG.getTypeId();
|
if (metaData == 0) metaData = EntityType.PIG.getTypeId();
|
||||||
try {
|
try {
|
||||||
@ -412,7 +453,10 @@ public class ItemDb implements IConf, net.ess3.api.IItemDb {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class LengthCompare implements java.util.Comparator<String> {
|
static class LengthCompare implements java.util.Comparator<String> {
|
||||||
|
|
||||||
|
private static final LengthCompare INSTANCE = new LengthCompare();
|
||||||
|
|
||||||
public LengthCompare() {
|
public LengthCompare() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user