This commit is contained in:
Indyuce 2022-01-08 12:43:42 +01:00
parent 37a1246bb5
commit d2e9623644
8 changed files with 78 additions and 130 deletions

View File

@ -2,7 +2,6 @@ package net.Indyuce.mmoitems;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.api.util.ui.FriendlyFeedbackCategory;
import io.lumine.mythic.lib.api.util.ui.FriendlyFeedbackMessage;
import io.lumine.mythic.lib.api.util.ui.FriendlyFeedbackProvider;
import io.lumine.mythic.lib.version.SpigotPlugin;
@ -19,22 +18,13 @@ import net.Indyuce.mmoitems.api.util.MMOItemReforger;
import net.Indyuce.mmoitems.api.util.NumericStatFormula;
import net.Indyuce.mmoitems.api.util.message.FFPMMOItems;
import net.Indyuce.mmoitems.command.MMOItemsCommandTreeRoot;
import net.Indyuce.mmoitems.comp.MMOItemsMetrics;
import net.Indyuce.mmoitems.comp.MMOItemsRewardTypes;
import net.Indyuce.mmoitems.comp.McMMONonRPGHook;
import net.Indyuce.mmoitems.comp.PhatLootsHook;
import net.Indyuce.mmoitems.comp.RealDualWieldHook;
import net.Indyuce.mmoitems.comp.WorldEditSupport;
import net.Indyuce.mmoitems.comp.*;
import net.Indyuce.mmoitems.comp.eco.VaultSupport;
import net.Indyuce.mmoitems.comp.enchants.CrazyEnchantsStat;
import net.Indyuce.mmoitems.comp.enchants.EnchantPlugin;
import net.Indyuce.mmoitems.comp.enchants.MythicEnchantsSupport;
import net.Indyuce.mmoitems.comp.enchants.advanced_enchants.AdvancedEnchantmentsHook;
import net.Indyuce.mmoitems.comp.inventory.DefaultPlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.OrnamentPlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.PlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.PlayerInventoryHandler;
import net.Indyuce.mmoitems.comp.inventory.RPGInventoryHook;
import net.Indyuce.mmoitems.comp.inventory.*;
import net.Indyuce.mmoitems.comp.itemglow.ItemGlowListener;
import net.Indyuce.mmoitems.comp.itemglow.NoGlowListener;
import net.Indyuce.mmoitems.comp.mmocore.MMOCoreMMOLoader;
@ -51,16 +41,7 @@ import net.Indyuce.mmoitems.comp.rpg.RPGHandler;
import net.Indyuce.mmoitems.gui.PluginInventory;
import net.Indyuce.mmoitems.gui.edition.recipe.RecipeBrowserGUI;
import net.Indyuce.mmoitems.gui.listener.GuiListener;
import net.Indyuce.mmoitems.listener.CraftingListener;
import net.Indyuce.mmoitems.listener.CustomBlockListener;
import net.Indyuce.mmoitems.listener.CustomSoundListener;
import net.Indyuce.mmoitems.listener.DisableInteractions;
import net.Indyuce.mmoitems.listener.DurabilityListener;
import net.Indyuce.mmoitems.listener.ElementListener;
import net.Indyuce.mmoitems.listener.EquipListener;
import net.Indyuce.mmoitems.listener.ItemListener;
import net.Indyuce.mmoitems.listener.ItemUse;
import net.Indyuce.mmoitems.listener.PlayerListener;
import net.Indyuce.mmoitems.listener.*;
import net.Indyuce.mmoitems.manager.*;
import net.Indyuce.mmoitems.skill.Shulker_Missile;
import org.apache.commons.lang.Validate;
@ -77,6 +58,7 @@ import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
@ -116,7 +98,7 @@ public class MMOItems extends LuminePlugin {
private VaultSupport vaultSupport;
private RPGHandler rpgPlugin;
private static final int MYTHICLIB_COMPATIBILITY_INDEX = 1;
private static final int MYTHICLIB_COMPATIBILITY_INDEX = 2;
public MMOItems() {
plugin = this;
@ -128,7 +110,7 @@ public class MMOItems extends LuminePlugin {
// Check if the ML build matches
if (MYTHICLIB_COMPATIBILITY_INDEX != MythicLib.MMOITEMS_COMPATIBILITY_INDEX) {
getLogger().log(Level.WARNING, "Your versions of MythicLib and MMOItems do not match. Make sure you are using the latest builds of both plugins");
disable();
setEnabled(false);
return;
}
@ -141,8 +123,8 @@ public class MMOItems extends LuminePlugin {
saveDefaultConfig();
/*
* stat manager must be initialized before MMOCore compatibility
/**
* Stat manager must be initialized before MMOCore compatibility
* initializes so that MMOCore can register its stats
*/
statManager = new StatManager();
@ -343,6 +325,10 @@ public class MMOItems extends LuminePlugin {
@Override
public void disable() {
// Support for early plugin disabling
if (!isEnabled())
return;
// save player data
PlayerData.getLoaded().forEach(PlayerData::save);
@ -401,6 +387,30 @@ public class MMOItems extends LuminePlugin {
if (handler instanceof Listener && isEnabled()) Bukkit.getPluginManager().registerEvents((Listener) handler, this);
}
/**
* @param potentialPlugin Some plugin that the user wants compatibility with
* @return If it worked
*/
public boolean setRPG(RPGHandler.PluginEnum potentialPlugin) {
// Check if the plugin is installed
if (Bukkit.getPluginManager().getPlugin(potentialPlugin.getName()) == null) {
MMOItems.plugin.getLogger().log(Level.WARNING, "Could not initialize RPG plugin compatibility with " + potentialPlugin.getName() + ": plugin is not installed");
return false;
}
try {
setRPG(potentialPlugin.load());
return true;
// Some loading issue
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException | IllegalAccessException exception) {
MMOItems.plugin.getLogger().log(Level.WARNING, "Could not initialize RPG plugin compatibility with " + potentialPlugin.getName() + ":");
exception.printStackTrace();
return false;
}
}
public PluginUpdateManager getUpdates() {
return pluginUpdateManager;
}
@ -558,57 +568,32 @@ public class MMOItems extends LuminePlugin {
/**
* Decide by which system will the RPG Requirements of the player will be checked.
* <p></p>
* <p>
* For example, required level, is that vanilla XP levels, MMOCore levels, McMMO Leves or what?
*
* This method is called on server startup and will try to read the preferred RPG
* provider in the main plugin config. If it can't be found, it will look for RPG
* plugins in the installed plugin list.
*/
public void findRpgPlugin() {
if (rpgPlugin != null) return;
String preferred = plugin.getConfig().getString("preferred-rpg-provider", null);
if (preferred != null) {
if (preferred != null)
try {
RPGHandler.PluginEnum preferredRPG = RPGHandler.PluginEnum.valueOf(preferred.toUpperCase());
// Found the plugin?
if (Bukkit.getPluginManager().getPlugin(preferredRPG.getName()) != null) {
// Load that one
setRPG(preferredRPG.load());
// Mention it
print(null, "Using $s{0}$b as RPGPlayer provider", "RPG Provider", preferredRPG.getName());
if (setRPG(RPGHandler.PluginEnum.valueOf(preferred.toUpperCase())))
return;
} else
print(null, "Preferred RPGPlayer provider $r{0}$b is not installed!", "RPG Provider", preferred);
} catch (IllegalArgumentException ignored) {
// Log error
FriendlyFeedbackProvider ffp = new FriendlyFeedbackProvider(FFPMMOItems.get());
ffp.activatePrefix(true, "RPG Provider");
ffp.log(FriendlyFeedbackCategory.ERROR, "Invalid RPG Provider '$u{0}$b' --- These are the supported ones:", preferred);
for (RPGHandler.PluginEnum pgrep : RPGHandler.PluginEnum.values()) {
ffp.log(FriendlyFeedbackCategory.ERROR, " $r+ $b{0}", pgrep.getName());
}
ffp.sendTo(FriendlyFeedbackCategory.ERROR, getConsole());
} catch (IllegalArgumentException exception) {
MMOItems.plugin.getLogger().log(Level.WARNING, "'" + preferred.toUpperCase() + "' is not a valid RPG plugin:");
for (RPGHandler.PluginEnum pgrep : RPGHandler.PluginEnum.values())
MMOItems.plugin.getLogger().log(Level.WARNING, "- " + pgrep.getName());
}
}
// For each supported plugin
for (RPGHandler.PluginEnum pluginEnum : RPGHandler.PluginEnum.values()) {
// Found the plugin?
if (Bukkit.getPluginManager().getPlugin(pluginEnum.getName()) != null) {
// Load that one
setRPG(pluginEnum.load());
// Mention it
print(null, "Using $s{0}$b as RPGPlayer provider", "RPG Provider", pluginEnum.getName());
return;
}
}
// Look through installed plugins
for (RPGHandler.PluginEnum pluginEnum : RPGHandler.PluginEnum.values())
if (Bukkit.getPluginManager().getPlugin(pluginEnum.getName()) != null)
if (setRPG(pluginEnum))
return;
// Just use the default
setRPG(new DefaultHook());
@ -815,22 +800,6 @@ public class MMOItems extends LuminePlugin {
}
//endregion
/**
* Logs something into the console with a cool [MMOItems] prefix :)
* <p></p>
* Parses color codes. <b>Mostly for DEV testing</b>. these may removed any release.
*
* @author Gunging
*/
public static void log(@Nullable String message) {
if (message == null) {
message = "< null >";
}
//String prefix = "\u00a78[" + ChatColor.YELLOW + "MMOItems\u00a78] \u00a77";
String prefix = "";
plugin.getServer().getConsoleSender().sendMessage(prefix + message);
}
/**
* Easily log something using the FriendlyFeedbackProvider, nice!
* <p></p>

View File

@ -20,18 +20,18 @@ import java.util.List;
@SuppressWarnings("unused")
public class Type {
// slashing
// Slashing
public static final Type SWORD = new Type(TypeSet.SLASHING, "SWORD", true, EquipmentSlot.MAIN_HAND);
// piercing
// Piercing
public static final Type DAGGER = new Type(TypeSet.PIERCING, "DAGGER", true, EquipmentSlot.MAIN_HAND);
public static final Type SPEAR = new Type(TypeSet.PIERCING, "SPEAR", true, EquipmentSlot.MAIN_HAND);
// blunt
// Blunt
public static final Type HAMMER = new Type(TypeSet.BLUNT, "HAMMER", true, EquipmentSlot.MAIN_HAND);
public static final Type GAUNTLET = new Type(TypeSet.BLUNT, "GAUNTLET", true, EquipmentSlot.MAIN_HAND);
// range
// Range
public static final Type WHIP = new Type(TypeSet.RANGE, "WHIP", true, EquipmentSlot.MAIN_HAND);
public static final Type STAFF = new Type(TypeSet.RANGE, "STAFF", true, EquipmentSlot.MAIN_HAND);
public static final Type BOW = new Type(TypeSet.RANGE, "BOW", true, EquipmentSlot.BOTH_HANDS);
@ -39,14 +39,14 @@ public class Type {
public static final Type MUSKET = new Type(TypeSet.RANGE, "MUSKET", true, EquipmentSlot.MAIN_HAND);
public static final Type LUTE = new Type(TypeSet.RANGE, "LUTE", true, EquipmentSlot.MAIN_HAND);
// offhand
// Offhand
public static final Type CATALYST = new Type(TypeSet.OFFHAND, "CATALYST", false, EquipmentSlot.BOTH_HANDS);
public static final Type OFF_CATALYST = new Type(TypeSet.OFFHAND, "OFF_CATALYST", false, EquipmentSlot.OFF_HAND);
// any
// Any
public static final Type ORNAMENT = new Type(TypeSet.EXTRA, "ORNAMENT", false, EquipmentSlot.ANY);
// extra
// Extra
public static final Type ARMOR = new Type(TypeSet.EXTRA, "ARMOR", false, EquipmentSlot.ARMOR, true);
public static final Type TOOL = new Type(TypeSet.EXTRA, "TOOL", false, EquipmentSlot.MAIN_HAND);
public static final Type CONSUMABLE = new Type(TypeSet.EXTRA, "CONSUMABLE", false, EquipmentSlot.MAIN_HAND);
@ -96,8 +96,8 @@ public class Type {
private UnidentifiedItem unidentifiedTemplate;
/*
* list of stats which can be applied onto an item which has this type. This
/**
* List of stats which can be applied onto an item which has this type. This
* improves performance when generating an item by a significant amount.
*/
private final List<ItemStat> available = new ArrayList<>();
@ -118,7 +118,7 @@ public class Type {
//TYP//MMOItems.log("\u00a78TYPE \u00a75HARDCODED\u00a77 > Lore\u00a7b " + loreFormat);
}
public Type(@NotNull TypeManager manager,@NotNull ConfigurationSection config) {
public Type(@NotNull TypeManager manager, @NotNull ConfigurationSection config) {
id = config.getName().toUpperCase().replace("-", "_").replace(" ", "_");
parent = manager.get(config.getString("parent", "").toUpperCase().replace("-", "_").replace(" ", "_"));

View File

@ -5,7 +5,6 @@ import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.droptable.item.BlockDropItem;
import net.Indyuce.mmoitems.api.droptable.item.DropItem;
import net.Indyuce.mmoitems.api.droptable.item.MMOItemDropItem;
import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem;
import net.Indyuce.mmoitems.api.player.PlayerData;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
@ -16,11 +15,11 @@ import java.util.*;
import java.util.logging.Level;
public class DropTable {
private static final Random random = new Random();
private final List<String> subtablesList = new ArrayList<>();
private final Map<String, Subtable> subtables = new HashMap<>();
private static final Random random = new Random();
public DropTable(ConfigurationSection config) {
Validate.notNull(config, "Could not read the drop table config");
for (String key : config.getKeys(false))
@ -33,11 +32,8 @@ public class DropTable {
// Include parsed subtable
subtables.put(key, new Subtable(config.getConfigurationSection(key)));
// Ew
} catch (IllegalArgumentException exception) {
// Print that error message
MMOItems.print(null, "Could not read subtable '$r{0}$b' from drop table '$e{1}$b';&f {2}", key, config.getName(), exception.getMessage());
MMOItems.plugin.getLogger().log(Level.WARNING, "Could not read subtable '" + key + "' from drop table '" + config.getName() + "': " + exception.getMessage());
}
Validate.notEmpty(subtablesList, "Your droptable must contain at least one subtable");
@ -74,8 +70,8 @@ public class DropTable {
public static class Subtable {
private final List<DropItem> items = new ArrayList<>();
/*
* options to prevent players from abusing drop tables.
/**
* Options to prevent players from abusing drop tables.
*/
private final boolean disableSilkTouch;

View File

@ -19,12 +19,11 @@ public class MMOCoreHook implements RPGHandler, Listener {
/**
* Called when MMOItems enables
* <p>
* These stats are only updated on a server reload because that
* class has to be instanciated again for the registered stats to update
*/
public MMOCoreHook() {
/*
* only works when the server is reloaded. needs /reload when changing
* attributes or professions to refresh MMOItems stats
*/
for (PlayerAttribute attribute : MMOCore.plugin.attributeManager.getAll())
MMOItems.plugin.getStats().register(new Required_Attribute(attribute));
for (Profession profession : MMOCore.plugin.professionManager.getAll())
@ -105,12 +104,12 @@ public class MMOCoreHook implements RPGHandler, Listener {
@Override
public void giveMana(double value) {
data.giveMana(value, PlayerResourceUpdateEvent.UpdateReason.REGENERATION);
data.giveMana(value, PlayerResourceUpdateEvent.UpdateReason.OTHER);
}
@Override
public void giveStamina(double value) {
data.giveStamina(value, PlayerResourceUpdateEvent.UpdateReason.REGENERATION);
data.giveStamina(value, PlayerResourceUpdateEvent.UpdateReason.OTHER);
}
}
}

View File

@ -1,12 +1,10 @@
package net.Indyuce.mmoitems.comp.rpg;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.player.RPGPlayer;
import net.Indyuce.mmoitems.comp.mmocore.MMOCoreHook;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
public interface RPGHandler {
@ -52,14 +50,8 @@ public interface RPGHandler {
this.name = name;
}
public RPGHandler load() {
try {
return pluginClass.getDeclaredConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException exception) {
MMOItems.plugin.getLogger().log(Level.WARNING,
"Could not initialize RPG plugin compatibility with " + name + ": " + exception.getMessage());
return new DefaultHook();
}
public RPGHandler load() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
return pluginClass.getDeclaredConstructor().newInstance();
}
public String getName() {

View File

@ -24,8 +24,8 @@ public class StatManager {
private final Set<ConsumableItemInteraction> consumableActions = new HashSet<>();
private final Set<PlayerConsumable> playerConsumables = new HashSet<>();
/*
* load default stats using java reflection, get all public static final
/**
* Load default stats using java reflection, get all public static final
* fields in the ItemStat and register them as stat instances
*/
public StatManager() {

View File

@ -25,7 +25,7 @@ public class TypeManager implements Reloadable {
Type.STAFF, Type.SWORD, Type.TOOL, Type.WHIP);
/*
* register all other types. important: check if the map already
* Register all other types. Important: check if the map already
* contains the id, this way the DEFAULT types are not registered twice,
* and only custom types are registered with a parent.
*/

View File

@ -1,19 +1,14 @@
package net.Indyuce.mmoitems.stat;
import io.lumine.mythic.lib.api.item.SupportedNBTTagValues;
import io.lumine.mythic.lib.api.util.ui.SilentNumbers;
import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder;
import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem;
import net.Indyuce.mmoitems.api.util.NumericStatFormula;
import net.Indyuce.mmoitems.api.util.StatFormat;
import net.Indyuce.mmoitems.stat.data.DoubleData;
import net.Indyuce.mmoitems.stat.data.random.RandomStatData;
import net.Indyuce.mmoitems.stat.data.type.StatData;
import net.Indyuce.mmoitems.stat.type.DoubleStat;
import net.Indyuce.mmoitems.stat.type.GemStoneStat;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.item.ItemTag;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -23,9 +18,6 @@ import java.util.ArrayList;
public class CustomModelData extends DoubleStat implements GemStoneStat {
public CustomModelData() {
super("CUSTOM_MODEL_DATA", Material.PAINTING, "Custom Model Data", new String[] { "Your 1.14+ model data." }, new String[] { "!block", "all" });
if (MythicLib.plugin.getVersion().isBelowOrEqual(1, 13))
disable();
}
@Override