1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 11:45:51 +00:00

Added support for custom item models

This commit is contained in:
TheBusyBiscuit 2019-11-10 17:46:18 +01:00
parent 2c7e155aa1
commit 2459469c9d
7 changed files with 133 additions and 26 deletions

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
@ -13,9 +14,7 @@ import org.bukkit.ChatColor;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import io.github.thebusybiscuit.cscorelib2.data.PersistentDataAPI;
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
@ -164,7 +163,11 @@ public class SlimefunItem {
if (SlimefunPlugin.getUtilities().itemIDs.containsKey(this.id)) { if (SlimefunPlugin.getUtilities().itemIDs.containsKey(this.id)) {
throw new IllegalArgumentException("ID \"" + this.id + "\" already exists"); throw new IllegalArgumentException("ID \"" + this.id + "\" already exists");
} }
if (this.recipe.length < 9) this.recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
if (this.recipe.length < 9) {
this.recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
}
SlimefunPlugin.getUtilities().allItems.add(this); SlimefunPlugin.getUtilities().allItems.add(this);
SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".enabled", true); SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".enabled", true);
@ -192,7 +195,10 @@ public class SlimefunItem {
} }
if (SlimefunPlugin.getItemCfg().getBoolean(id + ".enabled")) { if (SlimefunPlugin.getItemCfg().getBoolean(id + ".enabled")) {
if (!Category.list().contains(category)) category.register();
if (!Category.list().contains(category)) {
category.register();
}
this.state = ItemState.ENABLED; this.state = ItemState.ENABLED;
@ -202,8 +208,13 @@ public class SlimefunItem {
this.disenchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-disenchanting"); this.disenchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-disenchanting");
this.permission = SlimefunPlugin.getItemCfg().getString(this.id + ".required-permission"); this.permission = SlimefunPlugin.getItemCfg().getString(this.id + ".required-permission");
this.noPermissionTooltip = SlimefunPlugin.getItemCfg().getStringList(this.id + ".no-permission-tooltip"); this.noPermissionTooltip = SlimefunPlugin.getItemCfg().getStringList(this.id + ".no-permission-tooltip");
SlimefunPlugin.getUtilities().enabledItems.add(this); SlimefunPlugin.getUtilities().enabledItems.add(this);
if (slimefun) SlimefunPlugin.getUtilities().vanillaItems++;
if (slimefun) {
SlimefunPlugin.getUtilities().vanillaItems++;
}
SlimefunPlugin.getUtilities().itemIDs.put(this.id, this); SlimefunPlugin.getUtilities().itemIDs.put(this.id, this);
create(); create();
@ -285,17 +296,18 @@ public class SlimefunItem {
} }
if (item.hasItemMeta()) { if (item.hasItemMeta()) {
String id = PersistentDataAPI.getString(item.getItemMeta(), SlimefunPlugin.getItemDataKey()); Optional<String> itemID = SlimefunPlugin.getItemDataService().getItemData(item);
if (id != null) return getByID(id);
if (itemID.isPresent()) {
return getByID(itemID.get());
}
} }
for (SlimefunItem sfi: SlimefunPlugin.getUtilities().enabledItems) { for (SlimefunItem sfi: SlimefunPlugin.getUtilities().enabledItems) {
if (sfi.isItem(item)) { if (sfi.isItem(item)) {
// If we have to loop all items for the given item, then at least // If we have to loop all items for the given item, then at least
// set the id via PersistenDataAPI for future performance boosts // set the id via PersistenDataAPI for future performance boosts
ItemMeta im = item.getItemMeta(); SlimefunPlugin.getItemDataService().setItemData(item, sfi.getID());
PersistentDataAPI.setString(im, SlimefunPlugin.getItemDataKey(), sfi.getID());
item.setItemMeta(im);
return sfi; return sfi;
} }
@ -309,8 +321,10 @@ public class SlimefunItem {
if (item == null) return false; if (item == null) return false;
if (item.hasItemMeta()) { if (item.hasItemMeta()) {
String comparingId = PersistentDataAPI.getString(item.getItemMeta(), SlimefunPlugin.getItemDataKey()); Optional<String> itemID = SlimefunPlugin.getItemDataService().getItemData(item);
if (comparingId != null) return getID().equals(comparingId); if (itemID.isPresent()) {
return getID().equals(itemID.get());
}
} }
if (this instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, this.item, false)) return true; if (this instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, this.item, false)) return true;

View File

@ -179,11 +179,11 @@ import me.mrCookieSlime.Slimefun.holograms.ReactorHologram;
public final class SlimefunSetup { public final class SlimefunSetup {
private static final Random random = new Random();
private SlimefunSetup() {} private SlimefunSetup() {}
public static void setupItems() { public static void setupItems() {
Random random = new Random();
new SlimefunItem(Categories.WEAPONS, (SlimefunItemStack) SlimefunItems.GRANDMAS_WALKING_STICK, RecipeType.ENHANCED_CRAFTING_TABLE, new SlimefunItem(Categories.WEAPONS, (SlimefunItemStack) SlimefunItems.GRANDMAS_WALKING_STICK, RecipeType.ENHANCED_CRAFTING_TABLE,
new ItemStack[] {null, new ItemStack(Material.OAK_LOG), null, null, new ItemStack(Material.OAK_LOG), null, null, new ItemStack(Material.OAK_LOG), null}) new ItemStack[] {null, new ItemStack(Material.OAK_LOG), null, null, new ItemStack(Material.OAK_LOG), null, null, new ItemStack(Material.OAK_LOG), null})
.register(true); .register(true);

View File

@ -11,6 +11,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.Slimefun;
@ -18,11 +19,11 @@ public final class WikiSetup {
private WikiSetup() {} private WikiSetup() {}
public static void addWikiPages(Class<?> c) { public static void addWikiPages(SlimefunPlugin plugin) {
JsonParser parser = new JsonParser(); JsonParser parser = new JsonParser();
Slimefun.getLogger().log(Level.INFO, "Loading Wiki pages..."); Slimefun.getLogger().log(Level.INFO, "Loading Wiki pages...");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(c.getResourceAsStream("/wiki.json")))) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getClass().getResourceAsStream("/wiki.json")))) {
JsonElement element = parser.parse(reader.lines().collect(Collectors.joining(""))); JsonElement element = parser.parse(reader.lines().collect(Collectors.joining("")));
JsonObject json = element.getAsJsonObject(); JsonObject json = element.getAsJsonObject();

View File

@ -4,7 +4,6 @@ import java.io.File;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -71,6 +70,8 @@ import me.mrCookieSlime.Slimefun.listeners.TalismanListener;
import me.mrCookieSlime.Slimefun.listeners.TeleporterListener; import me.mrCookieSlime.Slimefun.listeners.TeleporterListener;
import me.mrCookieSlime.Slimefun.listeners.ToolListener; import me.mrCookieSlime.Slimefun.listeners.ToolListener;
import me.mrCookieSlime.Slimefun.listeners.WorldListener; import me.mrCookieSlime.Slimefun.listeners.WorldListener;
import me.mrCookieSlime.Slimefun.services.CustomItemDataService;
import me.mrCookieSlime.Slimefun.services.CustomTextureService;
import me.mrCookieSlime.Slimefun.utils.Settings; import me.mrCookieSlime.Slimefun.utils.Settings;
import me.mrCookieSlime.Slimefun.utils.Utilities; import me.mrCookieSlime.Slimefun.utils.Utilities;
@ -79,7 +80,9 @@ public final class SlimefunPlugin extends JavaPlugin {
public static SlimefunPlugin instance; public static SlimefunPlugin instance;
private RecipeSnapshot recipeSnapshot; private RecipeSnapshot recipeSnapshot;
private final NamespacedKey itemDataKey = new NamespacedKey(this, "slimefun_item");
private final CustomItemDataService itemDataService = new CustomItemDataService(this, "slimefun_item");
private final CustomTextureService textureService = new CustomTextureService(this);
private TickerTask ticker; private TickerTask ticker;
private SlimefunLocalization local; private SlimefunLocalization local;
@ -210,13 +213,14 @@ public final class SlimefunPlugin extends JavaPlugin {
MiscSetup.loadDescriptions(); MiscSetup.loadDescriptions();
settings.researchesEnabled = getResearchCfg().getBoolean("enable-researching"); settings.researchesEnabled = getResearchCfg().getBoolean("enable-researching");
settings.smelteryFireBreakChance = (Integer) Slimefun.getItemValue("SMELTERY", "chance.fireBreak"); settings.smelteryFireBreakChance = (int) Slimefun.getItemValue("SMELTERY", "chance.fireBreak");
getLogger().log(Level.INFO, "Loading Researches..."); getLogger().log(Level.INFO, "Loading Researches...");
ResearchSetup.setupResearches(); ResearchSetup.setupResearches();
MiscSetup.setupMisc(); MiscSetup.setupMisc();
WikiSetup.addWikiPages(getClass()); WikiSetup.addWikiPages(this);
textureService.setup(utilities.allItems);
getLogger().log(Level.INFO, "Loading World Generators..."); getLogger().log(Level.INFO, "Loading World Generators...");
@ -441,8 +445,12 @@ public final class SlimefunPlugin extends JavaPlugin {
return instance.recipeSnapshot; return instance.recipeSnapshot;
} }
public static NamespacedKey getItemDataKey() { public static CustomItemDataService getItemDataService() {
return instance.itemDataKey; return instance.itemDataService;
}
public static CustomTextureService getItemTextureService() {
return instance.textureService;
} }
} }

View File

@ -8,7 +8,6 @@ import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import io.github.thebusybiscuit.cscorelib2.data.PersistentDataAPI;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull;
import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
@ -56,9 +55,12 @@ public class SlimefunItemStack extends CustomItem {
private void setID(String id) { private void setID(String id) {
this.id = id; this.id = id;
ItemMeta im = getItemMeta(); ItemMeta meta = getItemMeta();
PersistentDataAPI.setString(im, SlimefunPlugin.getItemDataKey(), id);
setItemMeta(im); SlimefunPlugin.getItemDataService().setItemData(meta, id);
SlimefunPlugin.getItemTextureService().setTexture(meta, id);
setItemMeta(meta);
} }
private static ItemStack getSkull(String texture) { private static ItemStack getSkull(String texture) {

View File

@ -0,0 +1,38 @@
package me.mrCookieSlime.Slimefun.services;
import java.util.Optional;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import io.github.thebusybiscuit.cscorelib2.data.PersistentDataAPI;
public class CustomItemDataService {
private final NamespacedKey namespacedKey;
public CustomItemDataService(Plugin plugin, String key) {
namespacedKey = new NamespacedKey(plugin, key);
}
public void setItemData(ItemStack item, String id) {
ItemMeta im = item.getItemMeta();
setItemData(im, id);
item.setItemMeta(im);
}
public void setItemData(ItemMeta im, String id) {
PersistentDataAPI.setString(im, namespacedKey, id);
}
public Optional<String> getItemData(ItemStack item) {
return getItemData(item.getItemMeta());
}
public Optional<String> getItemData(ItemMeta meta) {
return PersistentDataAPI.getOptionalString(meta, namespacedKey);
}
}

View File

@ -0,0 +1,44 @@
package me.mrCookieSlime.Slimefun.services;
import java.util.Collection;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import io.github.thebusybiscuit.cscorelib2.config.Config;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
public class CustomTextureService {
private final Config config;
public CustomTextureService(Plugin plugin) {
this.config = new Config(plugin, "item-models.yml");
}
public void setup(Collection<SlimefunItem> items) {
for (SlimefunItem item : items) {
if (item != null && item.getID() != null) {
config.setDefaultValue(item.getID(), 0);
}
}
config.save();
}
public int getModelData(String id) {
return config.getInt(id);
}
public void setTexture(ItemStack item, String id) {
ItemMeta im = item.getItemMeta();
setTexture(im, id);
item.setItemMeta(im);
}
public void setTexture(ItemMeta im, String id) {
im.setCustomModelData(getModelData(id));
}
}