split playerListener into two listeners so one can be disabled by MCore

MMOCore is going to have custom mitigation formulas, MI must not
interfere
This commit is contained in:
Indyuce 2019-08-27 13:42:27 +02:00
parent 6f38f52902
commit f05e4fd110
4 changed files with 689 additions and 668 deletions

View File

@ -1,416 +1,418 @@
package net.Indyuce.mmoitems; package net.Indyuce.mmoitems;
import java.io.File; 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.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import net.Indyuce.mmoitems.api.ConfigFile; import net.Indyuce.mmoitems.api.ConfigFile;
import net.Indyuce.mmoitems.api.SoulboundInfo; import net.Indyuce.mmoitems.api.SoulboundInfo;
import net.Indyuce.mmoitems.api.player.PlayerData; import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.command.AdvancedWorkbenchCommand; import net.Indyuce.mmoitems.command.AdvancedWorkbenchCommand;
import net.Indyuce.mmoitems.command.MMOItemsCommand; import net.Indyuce.mmoitems.command.MMOItemsCommand;
import net.Indyuce.mmoitems.command.UpdateItemCommand; import net.Indyuce.mmoitems.command.UpdateItemCommand;
import net.Indyuce.mmoitems.command.completion.MMOItemsCompletion; import net.Indyuce.mmoitems.command.completion.MMOItemsCompletion;
import net.Indyuce.mmoitems.command.completion.UpdateItemCompletion; import net.Indyuce.mmoitems.command.completion.UpdateItemCompletion;
import net.Indyuce.mmoitems.comp.AdvancedEnchantmentsHook; import net.Indyuce.mmoitems.comp.AdvancedEnchantmentsHook;
import net.Indyuce.mmoitems.comp.MMOItemsMetrics; import net.Indyuce.mmoitems.comp.MMOItemsMetrics;
import net.Indyuce.mmoitems.comp.MMOItemsRewardTypes; import net.Indyuce.mmoitems.comp.MMOItemsRewardTypes;
import net.Indyuce.mmoitems.comp.RealDualWieldHook; import net.Indyuce.mmoitems.comp.RealDualWieldHook;
import net.Indyuce.mmoitems.comp.flags.DefaultFlags; import net.Indyuce.mmoitems.comp.flags.DefaultFlags;
import net.Indyuce.mmoitems.comp.flags.FlagPlugin; import net.Indyuce.mmoitems.comp.flags.FlagPlugin;
import net.Indyuce.mmoitems.comp.flags.ResidenceFlags; import net.Indyuce.mmoitems.comp.flags.ResidenceFlags;
import net.Indyuce.mmoitems.comp.flags.WorldGuardFlags; import net.Indyuce.mmoitems.comp.flags.WorldGuardFlags;
import net.Indyuce.mmoitems.comp.holograms.CMIPlugin; import net.Indyuce.mmoitems.comp.holograms.CMIPlugin;
import net.Indyuce.mmoitems.comp.holograms.HologramSupport; import net.Indyuce.mmoitems.comp.holograms.HologramSupport;
import net.Indyuce.mmoitems.comp.holograms.HologramsPlugin; import net.Indyuce.mmoitems.comp.holograms.HologramsPlugin;
import net.Indyuce.mmoitems.comp.holograms.HolographicDisplaysPlugin; import net.Indyuce.mmoitems.comp.holograms.HolographicDisplaysPlugin;
import net.Indyuce.mmoitems.comp.inventory.DefaultPlayerInventory; import net.Indyuce.mmoitems.comp.inventory.DefaultPlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.PlayerInventory; import net.Indyuce.mmoitems.comp.inventory.PlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.RPGInventoryHook; import net.Indyuce.mmoitems.comp.inventory.RPGInventoryHook;
import net.Indyuce.mmoitems.comp.itemglow.ItemGlowListener; import net.Indyuce.mmoitems.comp.itemglow.ItemGlowListener;
import net.Indyuce.mmoitems.comp.itemglow.NoGlowListener; import net.Indyuce.mmoitems.comp.itemglow.NoGlowListener;
import net.Indyuce.mmoitems.comp.mmocore.MMOCoreMMOLoader; import net.Indyuce.mmoitems.comp.mmocore.MMOCoreMMOLoader;
import net.Indyuce.mmoitems.comp.mythicmobs.MythicMobsHook; import net.Indyuce.mmoitems.comp.mythicmobs.MythicMobsHook;
import net.Indyuce.mmoitems.comp.placeholderapi.DefaultParser; import net.Indyuce.mmoitems.comp.placeholderapi.DefaultParser;
import net.Indyuce.mmoitems.comp.placeholderapi.PlaceholderAPIParser; import net.Indyuce.mmoitems.comp.placeholderapi.PlaceholderAPIParser;
import net.Indyuce.mmoitems.comp.placeholderapi.PlaceholderParser; import net.Indyuce.mmoitems.comp.placeholderapi.PlaceholderParser;
import net.Indyuce.mmoitems.comp.rpg.DefaultHook; import net.Indyuce.mmoitems.comp.rpg.DefaultHook;
import net.Indyuce.mmoitems.comp.rpg.RPGHandler; import net.Indyuce.mmoitems.comp.rpg.RPGHandler;
import net.Indyuce.mmoitems.gui.PluginInventory; import net.Indyuce.mmoitems.gui.PluginInventory;
import net.Indyuce.mmoitems.gui.listener.GuiListener; import net.Indyuce.mmoitems.gui.listener.GuiListener;
import net.Indyuce.mmoitems.listener.AdvancedWorkbenchListener; import net.Indyuce.mmoitems.listener.AdvancedWorkbenchListener;
import net.Indyuce.mmoitems.listener.CustomDurability; import net.Indyuce.mmoitems.listener.CustomDurability;
import net.Indyuce.mmoitems.listener.DisableInteractions; import net.Indyuce.mmoitems.listener.DisableInteractions;
import net.Indyuce.mmoitems.listener.ElementListener; import net.Indyuce.mmoitems.listener.ElementListener;
import net.Indyuce.mmoitems.listener.ItemUse; import net.Indyuce.mmoitems.listener.ItemUse;
import net.Indyuce.mmoitems.listener.PlayerListener; import net.Indyuce.mmoitems.listener.MitigationListener;
import net.Indyuce.mmoitems.listener.version.Listener_v1_13; import net.Indyuce.mmoitems.listener.PlayerListener;
import net.Indyuce.mmoitems.manager.AbilityManager; import net.Indyuce.mmoitems.listener.version.Listener_v1_13;
import net.Indyuce.mmoitems.manager.ConfigManager; import net.Indyuce.mmoitems.manager.AbilityManager;
import net.Indyuce.mmoitems.manager.CraftingManager; import net.Indyuce.mmoitems.manager.ConfigManager;
import net.Indyuce.mmoitems.manager.DamageManager; import net.Indyuce.mmoitems.manager.CraftingManager;
import net.Indyuce.mmoitems.manager.DropTableManager; import net.Indyuce.mmoitems.manager.DamageManager;
import net.Indyuce.mmoitems.manager.EntityManager; import net.Indyuce.mmoitems.manager.DropTableManager;
import net.Indyuce.mmoitems.manager.ItemManager; import net.Indyuce.mmoitems.manager.EntityManager;
import net.Indyuce.mmoitems.manager.PluginUpdateManager; import net.Indyuce.mmoitems.manager.ItemManager;
import net.Indyuce.mmoitems.manager.RecipeManager; import net.Indyuce.mmoitems.manager.PluginUpdateManager;
import net.Indyuce.mmoitems.manager.SetManager; import net.Indyuce.mmoitems.manager.RecipeManager;
import net.Indyuce.mmoitems.manager.StatManager; import net.Indyuce.mmoitems.manager.SetManager;
import net.Indyuce.mmoitems.manager.TierManager; import net.Indyuce.mmoitems.manager.StatManager;
import net.Indyuce.mmoitems.manager.TypeManager; import net.Indyuce.mmoitems.manager.TierManager;
import net.Indyuce.mmoitems.manager.UpdaterManager; import net.Indyuce.mmoitems.manager.TypeManager;
import net.Indyuce.mmoitems.manager.UpgradeManager; import net.Indyuce.mmoitems.manager.UpdaterManager;
import net.Indyuce.mmoitems.version.ServerVersion; import net.Indyuce.mmoitems.manager.UpgradeManager;
import net.Indyuce.mmoitems.version.SpigotPlugin; import net.Indyuce.mmoitems.version.ServerVersion;
import net.Indyuce.mmoitems.version.nms.NMSHandler; import net.Indyuce.mmoitems.version.SpigotPlugin;
import net.Indyuce.mmoitems.version.nms.NMSHandler;
public class MMOItems extends JavaPlugin {
public static MMOItems plugin; public class MMOItems extends JavaPlugin {
public static MMOItems plugin;
private ServerVersion version;
private RecipeManager recipeManager; private ServerVersion version;
private ConfigManager configManager; private RecipeManager recipeManager;
private StatManager statManager; private ConfigManager configManager;
private EntityManager entityManager; private StatManager statManager;
private DamageManager damageManager; private EntityManager entityManager;
private DropTableManager dropTableManager; private DamageManager damageManager;
private UpdaterManager itemUpdaterManager; private DropTableManager dropTableManager;
private TypeManager typeManager; private UpdaterManager itemUpdaterManager;
private TierManager tierManager; private TypeManager typeManager;
private ItemManager itemManager; private TierManager tierManager;
private SetManager setManager; private ItemManager itemManager;
private UpgradeManager upgradeManager; private SetManager setManager;
private AbilityManager abilityManager = new AbilityManager(); private UpgradeManager upgradeManager;
private CraftingManager stationRecipeManager = new CraftingManager(); private AbilityManager abilityManager = new AbilityManager();
private PluginUpdateManager pluginUpdateManager = new PluginUpdateManager(); private CraftingManager stationRecipeManager = new CraftingManager();
private PluginUpdateManager pluginUpdateManager = new PluginUpdateManager();
private RPGHandler rpgPlugin;
private PlaceholderParser placeholderParser = new DefaultParser(); private RPGHandler rpgPlugin;
private HologramSupport hologramSupport; private PlaceholderParser placeholderParser = new DefaultParser();
private FlagPlugin flagPlugin = new DefaultFlags(); private HologramSupport hologramSupport;
private PlayerInventory inventory = new DefaultPlayerInventory(); private FlagPlugin flagPlugin = new DefaultFlags();
private NMSHandler nms; private PlayerInventory inventory = new DefaultPlayerInventory();
private NMSHandler nms;
public void onLoad() {
plugin = this; public void onLoad() {
version = new ServerVersion(Bukkit.getServer().getClass()); plugin = this;
version = new ServerVersion(Bukkit.getServer().getClass());
try {
getLogger().log(Level.INFO, "Detected Bukkit Version: " + version.toString()); try {
nms = (NMSHandler) Class.forName("net.Indyuce.mmoitems.version.nms.NMSHandler_" + version.toString().substring(1)).newInstance(); getLogger().log(Level.INFO, "Detected Bukkit Version: " + version.toString());
} catch (Exception e) { nms = (NMSHandler) Class.forName("net.Indyuce.mmoitems.version.nms.NMSHandler_" + version.toString().substring(1)).newInstance();
getLogger().log(Level.INFO, "Your server version is not compatible."); } catch (Exception e) {
Bukkit.getPluginManager().disablePlugin(this); getLogger().log(Level.INFO, "Your server version is not compatible.");
return; Bukkit.getPluginManager().disablePlugin(this);
// nms = new NMSHandler_Reflection(); return;
} // nms = new NMSHandler_Reflection();
}
try {
if (getServer().getPluginManager().getPlugin("WorldGuard") != null && version.isStrictlyHigher(1, 12)) { try {
flagPlugin = new WorldGuardFlags(); if (getServer().getPluginManager().getPlugin("WorldGuard") != null && version.isStrictlyHigher(1, 12)) {
getLogger().log(Level.INFO, "Hooked onto WorldGuard"); flagPlugin = new WorldGuardFlags();
} getLogger().log(Level.INFO, "Hooked onto WorldGuard");
} catch (Exception e) { }
getLogger().log(Level.WARNING, "Could not initialize support with WorldGuard 7+"); } catch (Exception e) {
} getLogger().log(Level.WARNING, "Could not initialize support with WorldGuard 7+");
}
if (Bukkit.getPluginManager().getPlugin("MMOCore") != null)
new MMOCoreMMOLoader(); if (Bukkit.getPluginManager().getPlugin("MMOCore") != null)
new MMOCoreMMOLoader();
saveDefaultConfig();
statManager = new StatManager(); saveDefaultConfig();
typeManager = new TypeManager(); statManager = new StatManager();
} typeManager = new TypeManager();
}
public void onEnable() {
new SpigotPlugin(39267, this).checkForUpdate(); public void onEnable() {
new SpigotPlugin(39267, this).checkForUpdate();
new MMOItemsMetrics();
new MMOItemsMetrics();
if (!getDataFolder().exists())
getDataFolder().mkdir(); if (!getDataFolder().exists())
getDataFolder().mkdir();
abilityManager.registerDefaultAbilities();
abilityManager.stopRegistration(); abilityManager.registerDefaultAbilities();
abilityManager.stopRegistration();
configManager = new ConfigManager();
itemManager = new ItemManager(); configManager = new ConfigManager();
tierManager = new TierManager(); itemManager = new ItemManager();
setManager = new SetManager(); tierManager = new TierManager();
upgradeManager = new UpgradeManager(); setManager = new SetManager();
upgradeManager = new UpgradeManager();
getLogger().log(Level.INFO, "Loading crafting stations, please wait..");
stationRecipeManager.reload(); getLogger().log(Level.INFO, "Loading crafting stations, please wait..");
stationRecipeManager.reload();
Bukkit.getPluginManager().registerEvents(entityManager = new EntityManager(), this);
Bukkit.getPluginManager().registerEvents(damageManager = new DamageManager(), this); Bukkit.getPluginManager().registerEvents(entityManager = new EntityManager(), this);
Bukkit.getPluginManager().registerEvents(dropTableManager = new DropTableManager(), this); Bukkit.getPluginManager().registerEvents(damageManager = new DamageManager(), this);
Bukkit.getPluginManager().registerEvents(itemUpdaterManager = new UpdaterManager(), this); Bukkit.getPluginManager().registerEvents(dropTableManager = new DropTableManager(), this);
Bukkit.getPluginManager().registerEvents(new ItemUse(), this); Bukkit.getPluginManager().registerEvents(itemUpdaterManager = new UpdaterManager(), this);
Bukkit.getPluginManager().registerEvents(new PlayerListener(), this); Bukkit.getPluginManager().registerEvents(new ItemUse(), this);
Bukkit.getPluginManager().registerEvents(new CustomDurability(), this); Bukkit.getPluginManager().registerEvents(new PlayerListener(), this);
Bukkit.getPluginManager().registerEvents(new DisableInteractions(), this); Bukkit.getPluginManager().registerEvents(new MitigationListener(), this);
Bukkit.getPluginManager().registerEvents(new GuiListener(), this); Bukkit.getPluginManager().registerEvents(new CustomDurability(), this);
Bukkit.getPluginManager().registerEvents(new ElementListener(), this); Bukkit.getPluginManager().registerEvents(new DisableInteractions(), this);
if (version.isStrictlyHigher(1, 12)) Bukkit.getPluginManager().registerEvents(new GuiListener(), this);
Bukkit.getPluginManager().registerEvents(new Listener_v1_13(), this); Bukkit.getPluginManager().registerEvents(new ElementListener(), this);
if (version.isStrictlyHigher(1, 12))
/* Bukkit.getPluginManager().registerEvents(new Listener_v1_13(), this);
* this class implements the Listener, if the option
* perm-effects-apply-on-move is enabled the loop will not apply perm /*
* effects and this class will be registered as a listener. starts with * this class implements the Listener, if the option
* a 5s delay to let the other plugins time to load nicely * perm-effects-apply-on-move is enabled the loop will not apply perm
*/ * effects and this class will be registered as a listener. starts with
Bukkit.getScheduler().runTaskTimer(this, () -> Bukkit.getOnlinePlayers().forEach(player -> PlayerData.get(player).updateEffects()), 100, 20); * a 5s delay to let the other plugins time to load nicely
*/
/* Bukkit.getScheduler().runTaskTimer(this, () -> Bukkit.getOnlinePlayers().forEach(player -> PlayerData.get(player).updateEffects()), 100, 20);
* this tasks updates twice a second player inventories on the server.
* allows now to use a glitchy itemEquipEvent. must be called after /*
* loading the config since it checks for a config option * this tasks updates twice a second player inventories on the server.
*/ * allows now to use a glitchy itemEquipEvent. must be called after
Bukkit.getScheduler().runTaskTimer(this, () -> Bukkit.getOnlinePlayers().forEach(player -> PlayerData.get(player).checkForInventoryUpdate()), 100, getConfig().getInt("inventory-update-delay")); * loading the config since it checks for a config option
*/
if (!getConfig().getBoolean("disable-craftings.advanced")) Bukkit.getScheduler().runTaskTimer(this, () -> Bukkit.getOnlinePlayers().forEach(player -> PlayerData.get(player).checkForInventoryUpdate()), 100, getConfig().getInt("inventory-update-delay"));
Bukkit.getPluginManager().registerEvents(new AdvancedWorkbenchListener(), this);
if (!getConfig().getBoolean("disable-craftings.advanced"))
if (Bukkit.getPluginManager().getPlugin("Residence") != null) { Bukkit.getPluginManager().registerEvents(new AdvancedWorkbenchListener(), this);
flagPlugin = new ResidenceFlags();
getLogger().log(Level.INFO, "Hooked onto Residence"); if (Bukkit.getPluginManager().getPlugin("Residence") != null) {
} flagPlugin = new ResidenceFlags();
getLogger().log(Level.INFO, "Hooked onto Residence");
if (Bukkit.getPluginManager().getPlugin("RPGInventory") != null) { }
inventory = new RPGInventoryHook(this);
getLogger().log(Level.INFO, "Hooked onto RPGInventory"); if (Bukkit.getPluginManager().getPlugin("RPGInventory") != null) {
} inventory = new RPGInventoryHook(this);
getLogger().log(Level.INFO, "Hooked onto RPGInventory");
if (Bukkit.getPluginManager().getPlugin("AdvancedEnchantments") != null) { }
Bukkit.getPluginManager().registerEvents(new AdvancedEnchantmentsHook(), this);
getLogger().log(Level.INFO, "Hooked onto AdvancedEnchantments"); if (Bukkit.getPluginManager().getPlugin("AdvancedEnchantments") != null) {
} Bukkit.getPluginManager().registerEvents(new AdvancedEnchantmentsHook(), this);
getLogger().log(Level.INFO, "Hooked onto AdvancedEnchantments");
if (Bukkit.getPluginManager().getPlugin("HolographicDisplays") != null) { }
hologramSupport = new HolographicDisplaysPlugin();
getLogger().log(Level.INFO, "Hooked onto HolographicDisplays"); if (Bukkit.getPluginManager().getPlugin("HolographicDisplays") != null) {
} else if (Bukkit.getPluginManager().getPlugin("CMI") != null) { hologramSupport = new HolographicDisplaysPlugin();
hologramSupport = new CMIPlugin(); getLogger().log(Level.INFO, "Hooked onto HolographicDisplays");
getLogger().log(Level.INFO, "Hooked onto CMI Holograms"); } else if (Bukkit.getPluginManager().getPlugin("CMI") != null) {
} else if (Bukkit.getPluginManager().getPlugin("Holograms") != null) { hologramSupport = new CMIPlugin();
hologramSupport = new HologramsPlugin(); getLogger().log(Level.INFO, "Hooked onto CMI Holograms");
getLogger().log(Level.INFO, "Hooked onto Holograms"); } else if (Bukkit.getPluginManager().getPlugin("Holograms") != null) {
} hologramSupport = new HologramsPlugin();
getLogger().log(Level.INFO, "Hooked onto Holograms");
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { }
getLogger().log(Level.INFO, "Hooked onto PlaceholderAPI");
placeholderParser = new PlaceholderAPIParser(); if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
} getLogger().log(Level.INFO, "Hooked onto PlaceholderAPI");
placeholderParser = new PlaceholderAPIParser();
if (Bukkit.getPluginManager().getPlugin("MythicMobs") != null) { }
Bukkit.getPluginManager().registerEvents(new MythicMobsHook(), this);
getLogger().log(Level.INFO, "Hooked onto MythicMobs"); if (Bukkit.getPluginManager().getPlugin("MythicMobs") != null) {
} Bukkit.getPluginManager().registerEvents(new MythicMobsHook(), this);
getLogger().log(Level.INFO, "Hooked onto MythicMobs");
if (getConfig().getBoolean("item-glow")) { }
if (Bukkit.getPluginManager().getPlugin("GlowAPI") != null && Bukkit.getPluginManager().getPlugin("PacketListenerApi") != null) {
Bukkit.getPluginManager().registerEvents(new ItemGlowListener(), this); if (getConfig().getBoolean("item-glow")) {
getLogger().log(Level.INFO, "Hooked onto GlowAPI (Item Glow)"); if (Bukkit.getPluginManager().getPlugin("GlowAPI") != null && Bukkit.getPluginManager().getPlugin("PacketListenerApi") != null) {
} else Bukkit.getPluginManager().registerEvents(new ItemGlowListener(), this);
Bukkit.getPluginManager().registerEvents(new NoGlowListener(), this); getLogger().log(Level.INFO, "Hooked onto GlowAPI (Item Glow)");
} } else
Bukkit.getPluginManager().registerEvents(new NoGlowListener(), this);
if (Bukkit.getPluginManager().getPlugin("RealDualWield") != null) { }
Bukkit.getPluginManager().registerEvents(new RealDualWieldHook(), this);
getLogger().log(Level.INFO, "Hooked onto RealDualWield"); if (Bukkit.getPluginManager().getPlugin("RealDualWield") != null) {
} Bukkit.getPluginManager().registerEvents(new RealDualWieldHook(), this);
getLogger().log(Level.INFO, "Hooked onto RealDualWield");
if (Bukkit.getPluginManager().getPlugin("BossShopPro") != null) { }
/* if (Bukkit.getPluginManager().getPlugin("BossShopPro") != null) {
* runs async because of plugin loading order issues, this way it
* only registers after BossShop is initialized /*
*/ * runs async because of plugin loading order issues, this way it
Bukkit.getScheduler().runTaskAsynchronously(this, () -> { * only registers after BossShop is initialized
new MMOItemsRewardTypes().register(); */
getLogger().log(Level.INFO, "Hooked onto BossShopPro (async)"); Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
}); new MMOItemsRewardTypes().register();
} getLogger().log(Level.INFO, "Hooked onto BossShopPro (async)");
});
findRpgPlugin(); }
// compatibility with /reload findRpgPlugin();
Bukkit.getOnlinePlayers().forEach(player -> PlayerData.load(player));
// compatibility with /reload
// advanced recipes Bukkit.getOnlinePlayers().forEach(player -> PlayerData.load(player));
getLogger().log(Level.INFO, "Loading recipes, please wait...");
recipeManager = new RecipeManager(); // advanced recipes
getLogger().log(Level.INFO, "Loading recipes, please wait...");
// commands recipeManager = new RecipeManager();
getCommand("mmoitems").setExecutor(new MMOItemsCommand());
getCommand("advancedworkbench").setExecutor(new AdvancedWorkbenchCommand()); // commands
getCommand("updateitem").setExecutor(new UpdateItemCommand()); getCommand("mmoitems").setExecutor(new MMOItemsCommand());
getCommand("advancedworkbench").setExecutor(new AdvancedWorkbenchCommand());
// tab completion getCommand("updateitem").setExecutor(new UpdateItemCommand());
getCommand("mmoitems").setTabCompleter(new MMOItemsCompletion());
getCommand("updateitem").setTabCompleter(new UpdateItemCompletion()); // tab completion
} getCommand("mmoitems").setTabCompleter(new MMOItemsCompletion());
getCommand("updateitem").setTabCompleter(new UpdateItemCompletion());
public void onDisable() { }
// save player data public void onDisable() {
PlayerData.getLoaded().forEach(data -> data.save());
// save player data
// save item updater data PlayerData.getLoaded().forEach(data -> data.save());
ConfigFile updater = new ConfigFile("/dynamic", "updater");
updater.getConfig().getKeys(false).forEach(key -> updater.getConfig().set(key, null)); // save item updater data
itemUpdaterManager.getDatas().forEach(data -> data.save(updater.getConfig())); ConfigFile updater = new ConfigFile("/dynamic", "updater");
updater.save(); updater.getConfig().getKeys(false).forEach(key -> updater.getConfig().set(key, null));
itemUpdaterManager.getDatas().forEach(data -> data.save(updater.getConfig()));
// drop abandonned soulbound items updater.save();
SoulboundInfo.getAbandonnedInfo().forEach(info -> info.dropItems());
// drop abandonned soulbound items
// close inventories SoulboundInfo.getAbandonnedInfo().forEach(info -> info.dropItems());
for (Player player : Bukkit.getOnlinePlayers())
if (player.getOpenInventory() != null && player.getOpenInventory().getTopInventory().getHolder() instanceof PluginInventory) // close inventories
player.closeInventory(); for (Player player : Bukkit.getOnlinePlayers())
} if (player.getOpenInventory() != null && player.getOpenInventory().getTopInventory().getHolder() instanceof PluginInventory)
player.closeInventory();
public String getPrefix() { }
return ChatColor.YELLOW + "MI" + ChatColor.DARK_GRAY + "> " + ChatColor.GRAY;
} public String getPrefix() {
return ChatColor.YELLOW + "MI" + ChatColor.DARK_GRAY + "> " + ChatColor.GRAY;
public File getJarFile() { }
return plugin.getFile();
} public File getJarFile() {
return plugin.getFile();
public CraftingManager getCrafting() { }
return stationRecipeManager;
} public CraftingManager getCrafting() {
return stationRecipeManager;
public UpdaterManager getUpdater() { }
return itemUpdaterManager;
} public UpdaterManager getUpdater() {
return itemUpdaterManager;
public SetManager getSets() { }
return setManager;
} public SetManager getSets() {
return setManager;
public NMSHandler getNMS() { }
return nms;
} public NMSHandler getNMS() {
return nms;
public FlagPlugin getFlags() { }
return flagPlugin;
} public FlagPlugin getFlags() {
return flagPlugin;
public void setFlags(FlagPlugin value) { }
flagPlugin = value;
} public void setFlags(FlagPlugin value) {
flagPlugin = value;
public RPGHandler getRPG() { }
return rpgPlugin;
} public RPGHandler getRPG() {
return rpgPlugin;
public void setRPG(RPGHandler handler) { }
rpgPlugin = handler;
} public void setRPG(RPGHandler handler) {
rpgPlugin = handler;
public PluginUpdateManager getUpdates() { }
return pluginUpdateManager;
} public PluginUpdateManager getUpdates() {
return pluginUpdateManager;
public PlayerInventory getInventory() { }
return inventory;
} public PlayerInventory getInventory() {
return inventory;
public void setPlayerInventory(PlayerInventory value) { }
inventory = value;
} public void setPlayerInventory(PlayerInventory value) {
inventory = value;
public ServerVersion getVersion() { }
return version;
} public ServerVersion getVersion() {
return version;
public StatManager getStats() { }
return statManager;
} public StatManager getStats() {
return statManager;
public TierManager getTiers() { }
return tierManager;
} public TierManager getTiers() {
return tierManager;
public EntityManager getEntities() { }
return entityManager;
} public EntityManager getEntities() {
return entityManager;
public DamageManager getDamage() { }
return damageManager;
} public DamageManager getDamage() {
return damageManager;
public DropTableManager getDropTables() { }
return dropTableManager;
} public DropTableManager getDropTables() {
return dropTableManager;
public AbilityManager getAbilities() { }
return abilityManager;
} public AbilityManager getAbilities() {
return abilityManager;
public RecipeManager getRecipes() { }
return recipeManager;
} public RecipeManager getRecipes() {
return recipeManager;
public ConfigManager getLanguage() { }
return configManager;
} public ConfigManager getLanguage() {
return configManager;
public TypeManager getTypes() { }
return typeManager;
} public TypeManager getTypes() {
return typeManager;
public UpgradeManager getUpgrades() { }
return upgradeManager;
} public UpgradeManager getUpgrades() {
return upgradeManager;
public PlaceholderParser getPlaceholderParser() { }
return placeholderParser;
} public PlaceholderParser getPlaceholderParser() {
return placeholderParser;
public HologramSupport getHolograms() { }
return hologramSupport;
} public HologramSupport getHolograms() {
return hologramSupport;
public ItemManager getItems() { }
return itemManager;
} public ItemManager getItems() {
return itemManager;
public void findRpgPlugin() { }
if (rpgPlugin != null)
return; public void findRpgPlugin() {
if (rpgPlugin != null)
for (RPGHandler.PluginEnum plugin : RPGHandler.PluginEnum.values()) return;
if (Bukkit.getPluginManager().getPlugin(plugin.getName()) != null) {
setRPG(plugin.load()); for (RPGHandler.PluginEnum plugin : RPGHandler.PluginEnum.values())
getLogger().log(Level.INFO, "Hooked onto " + plugin.getName()); if (Bukkit.getPluginManager().getPlugin(plugin.getName()) != null) {
return; setRPG(plugin.load());
} getLogger().log(Level.INFO, "Hooked onto " + plugin.getName());
return;
setRPG(new DefaultHook()); }
}
setRPG(new DefaultHook());
public boolean isBlacklisted(Material material) { }
return getConfig().getStringList("block-blacklist").contains(material.name());
} public boolean isBlacklisted(Material material) {
return getConfig().getStringList("block-blacklist").contains(material.name());
public void debug(Object... message) { }
if (!getConfig().getBoolean("debug"))
return; public void debug(Object... message) {
if (!getConfig().getBoolean("debug"))
for (Object line : message) { return;
getLogger().log(Level.INFO, "Debug> " + line.toString());
Bukkit.getOnlinePlayers().forEach(online -> online.sendMessage(ChatColor.YELLOW + "Debug> " + ChatColor.WHITE + line.toString())); for (Object line : message) {
} getLogger().log(Level.INFO, "Debug> " + line.toString());
} Bukkit.getOnlinePlayers().forEach(online -> online.sendMessage(ChatColor.YELLOW + "Debug> " + ChatColor.WHITE + line.toString()));
}
}
} }

View File

@ -1,43 +1,43 @@
package net.Indyuce.mmoitems.listener; package net.Indyuce.mmoitems.listener;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.gui.AdvancedWorkbench; import net.Indyuce.mmoitems.gui.AdvancedWorkbench;
import net.Indyuce.mmoitems.version.VersionMaterial; import net.Indyuce.mmoitems.version.VersionMaterial;
public class AdvancedWorkbenchListener implements Listener { public class AdvancedWorkbenchListener implements Listener {
@EventHandler @EventHandler
public void a(PlayerInteractEvent event) { public void a(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getClickedBlock().getType() != VersionMaterial.CRAFTING_TABLE.toMaterial()) if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getClickedBlock().getType() != VersionMaterial.CRAFTING_TABLE.toMaterial())
return; return;
boolean shiftClick = MMOItems.plugin.getConfig().getBoolean("advanced-workbench.open-when.shift-click"); boolean shiftClick = MMOItems.plugin.getConfig().getBoolean("advanced-workbench.open-when.shift-click");
boolean simpleClick = MMOItems.plugin.getConfig().getBoolean("advanced-workbench.open-when.simple-click"); boolean simpleClick = MMOItems.plugin.getConfig().getBoolean("advanced-workbench.open-when.simple-click");
Player player = event.getPlayer(); Player player = event.getPlayer();
if ((shiftClick && player.isSneaking()) || (simpleClick && !player.isSneaking())) { if ((shiftClick && player.isSneaking()) || (simpleClick && !player.isSneaking())) {
event.setCancelled(true); event.setCancelled(true);
new AdvancedWorkbench(player).open(); new AdvancedWorkbench(player).open();
} }
} }
@EventHandler @EventHandler
public void b(InventoryCloseEvent event) { public void b(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer(); Player player = (Player) event.getPlayer();
Inventory inv = event.getInventory(); Inventory inv = event.getInventory();
if (inv.getHolder() instanceof AdvancedWorkbench) if (inv.getHolder() instanceof AdvancedWorkbench)
for (int j : MMOItems.plugin.getRecipes().recipeSlots) { for (int j : MMOItems.plugin.getRecipes().recipeSlots) {
ItemStack drop = inv.getItem(j); ItemStack drop = inv.getItem(j);
if (drop != null) if (drop != null)
player.getWorld().dropItemNaturally(player.getLocation(), drop); player.getWorld().dropItemNaturally(player.getLocation(), drop);
} }
} }
} }

View File

@ -0,0 +1,99 @@
package net.Indyuce.mmoitems.listener;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.util.Vector;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.Message;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.player.PlayerData.CooldownType;
import net.Indyuce.mmoitems.api.player.PlayerStats;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.Indyuce.mmoitems.version.VersionSound;
public class MitigationListener implements Listener {
private static final Random random = new Random();
private static final List<DamageCause> mitigationCauses = Arrays.asList(DamageCause.PROJECTILE, DamageCause.ENTITY_ATTACK, DamageCause.ENTITY_EXPLOSION, DamageCause.ENTITY_SWEEP_ATTACK);
@EventHandler(priority = EventPriority.HIGH)
public void a(EntityDamageEvent event) {
if (event.isCancelled() || !(event.getEntity() instanceof Player) || !mitigationCauses.contains(event.getCause()) || event.getEntity().hasMetadata("NPC"))
return;
Player player = (Player) event.getEntity();
PlayerData playerData = PlayerData.get(player);
PlayerStats stats = playerData.getStats();
// dodging
double dodgeRating = Math.min(stats.getStat(ItemStat.DODGE_RATING), MMOItems.plugin.getConfig().getDouble("mitigation.dodge.rating-max")) / 100;
if (random.nextDouble() < dodgeRating && !playerData.isOnCooldown(CooldownType.DODGE)) {
playerData.applyCooldown(CooldownType.DODGE, stats.getStat(ItemStat.DODGE_COOLDOWN_REDUCTION));
event.setCancelled(true);
Message.ATTACK_DODGED.format(ChatColor.RED).send(player, "mitigation");
player.getWorld().playSound(player.getLocation(), VersionSound.ENTITY_ENDER_DRAGON_FLAP.toSound(), 2, 1);
player.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, player.getLocation(), 16, 0, 0, 0, .06);
if (MMOItems.plugin.getLanguage().dodgeKnockbackEnabled)
player.setVelocity(getVector(player, event).multiply(.85 * MMOItems.plugin.getLanguage().dodgeKnockbackForce).setY(.3));
return;
}
// parrying
double parryRating = Math.min(stats.getStat(ItemStat.PARRY_RATING), MMOItems.plugin.getConfig().getDouble("mitigation.parry.rating-max")) / 100;
if (random.nextDouble() < parryRating && !playerData.isOnCooldown(CooldownType.PARRY)) {
playerData.applyCooldown(CooldownType.PARRY, stats.getStat(ItemStat.PARRY_COOLDOWN_REDUCTION));
event.setCancelled(true);
Message.ATTACK_PARRIED.format(ChatColor.RED).send(player, "mitigation");
player.getWorld().playSound(player.getLocation(), VersionSound.ENTITY_ENDER_DRAGON_FLAP.toSound(), 2, 1);
player.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, player.getLocation(), 16, 0, 0, 0, .06);
if (event instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) event).getDamager() instanceof LivingEntity) {
LivingEntity attacker = (LivingEntity) ((EntityDamageByEntityEvent) event).getDamager();
attacker.setVelocity(attacker.getLocation().toVector().subtract(player.getLocation().toVector()).normalize().setY(.35).multiply(MMOItems.plugin.getConfig().getDouble("mitigation.parry.knockback-force")));
}
return;
}
// blocking
double blockRating = Math.min(stats.getStat(ItemStat.BLOCK_RATING), MMOItems.plugin.getConfig().getDouble("mitigation.block.rating-max")) / 100;
if (random.nextDouble() < blockRating && !playerData.isOnCooldown(CooldownType.BLOCK)) {
double blockPower = Math.min(MMOItems.plugin.getConfig().getDouble("mitigation.block.power.default") + stats.getStat(ItemStat.BLOCK_POWER), MMOItems.plugin.getConfig().getDouble("mitigation.block.power.max")) / 100;
playerData.applyCooldown(CooldownType.BLOCK, stats.getStat(ItemStat.BLOCK_COOLDOWN_REDUCTION));
event.setDamage(event.getDamage() * (1 - blockPower));
Message.ATTACK_BLOCKED.format(ChatColor.RED, "#percent#", new DecimalFormat("0.#").format(blockPower * 100)).send(player, "mitigation");
player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 2, 1);
double yaw = getYaw(player, getVector(player, event)) + 95;
for (double j = yaw - 90; j < yaw + 90; j += 5)
for (double y = 0; y < 2; y += .1)
MMOItems.plugin.getVersion().getVersionWrapper().spawnParticle(Particle.REDSTONE, player.getLocation().clone().add(Math.cos(Math.toRadians(j)) * .7, y, Math.sin(Math.toRadians(j)) * .7), Color.GRAY);
}
}
private Vector getVector(Player player, EntityDamageEvent event) {
return event instanceof EntityDamageByEntityEvent ? player.getLocation().subtract(((EntityDamageByEntityEvent) event).getDamager().getLocation()).toVector().normalize() : player.getEyeLocation().getDirection();
}
private double getYaw(Entity player, Vector vec) {
return new Location(player.getWorld(), vec.getX(), vec.getY(), vec.getZ()).setDirection(vec).getYaw();
}
}

View File

@ -1,212 +1,132 @@
package net.Indyuce.mmoitems.listener; package net.Indyuce.mmoitems.listener;
import java.text.DecimalFormat; import java.util.Iterator;
import java.util.Arrays;
import java.util.Iterator; import org.bukkit.Location;
import java.util.List; import org.bukkit.entity.LivingEntity;
import java.util.Random; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.ChatColor; import org.bukkit.event.EventPriority;
import org.bukkit.Color; import org.bukkit.event.Listener;
import org.bukkit.Location; import org.bukkit.event.block.Action;
import org.bukkit.Particle; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.Sound; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.entity.Entity; import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.entity.LivingEntity; import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.entity.Player; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.inventory.ItemStack;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import net.Indyuce.mmoitems.MMOItems;
import org.bukkit.event.entity.EntityRegainHealthEvent; import net.Indyuce.mmoitems.ability.Magical_Shield;
import org.bukkit.event.entity.PlayerDeathEvent; import net.Indyuce.mmoitems.api.Ability.CastingMode;
import org.bukkit.event.player.PlayerInteractEvent; import net.Indyuce.mmoitems.api.AttackResult;
import org.bukkit.event.player.PlayerJoinEvent; import net.Indyuce.mmoitems.api.SoulboundInfo;
import org.bukkit.event.player.PlayerQuitEvent; import net.Indyuce.mmoitems.api.player.PlayerData;
import org.bukkit.event.player.PlayerRespawnEvent; import net.Indyuce.mmoitems.api.player.PlayerStats;
import org.bukkit.inventory.ItemStack; import net.Indyuce.mmoitems.stat.type.ItemStat;
import org.bukkit.util.Vector;
public class PlayerListener implements Listener {
import net.Indyuce.mmoitems.MMOItems; @EventHandler(priority = EventPriority.HIGH)
import net.Indyuce.mmoitems.ability.Magical_Shield; public void b(EntityDamageEvent event) {
import net.Indyuce.mmoitems.api.Ability.CastingMode; if (!(event.getEntity() instanceof Player) || event.isCancelled() || event.getEntity().hasMetadata("NPC"))
import net.Indyuce.mmoitems.api.AttackResult; return;
import net.Indyuce.mmoitems.api.Message;
import net.Indyuce.mmoitems.api.SoulboundInfo; Player player = (Player) event.getEntity();
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.player.PlayerData.CooldownType; // magical shield ability
import net.Indyuce.mmoitems.api.player.PlayerStats; for (Location loc : Magical_Shield.magicalShield.keySet())
import net.Indyuce.mmoitems.stat.type.ItemStat; if (loc.getWorld().equals(player.getWorld())) {
import net.Indyuce.mmoitems.version.VersionSound; Double[] values = Magical_Shield.magicalShield.get(loc);
if (loc.distanceSquared(player.getLocation()) <= values[0])
public class PlayerListener implements Listener { event.setDamage(event.getDamage() * (1 - Math.max(values[1], 1)));
private static final Random random = new Random(); }
private static final List<DamageCause> mitigationCauses = Arrays.asList(DamageCause.PROJECTILE, DamageCause.ENTITY_ATTACK, DamageCause.ENTITY_EXPLOSION, DamageCause.ENTITY_SWEEP_ATTACK);
// damage reduction stats
@EventHandler(priority = EventPriority.HIGH) PlayerStats stats = PlayerData.get(player).getStats();
public void a(EntityDamageEvent event) {
if (event.isCancelled() || !(event.getEntity() instanceof Player) || !mitigationCauses.contains(event.getCause()) || event.getEntity().hasMetadata("NPC")) if (MMOItems.plugin.getRPG().canBeDamaged(player) && !MMOItems.plugin.getDamage().isDamaged(player)) {
return; if (event.getCause() == DamageCause.FIRE)
event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FIRE_DAMAGE_REDUCTION) / 100));
Player player = (Player) event.getEntity(); else if (event.getCause() == DamageCause.FALL)
PlayerData playerData = PlayerData.get(player); event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FALL_DAMAGE_REDUCTION) / 100));
PlayerStats stats = playerData.getStats(); else if (event.getCause() == DamageCause.MAGIC)
event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.MAGIC_DAMAGE_REDUCTION) / 100));
// dodging else if (event.getCause() == DamageCause.ENTITY_ATTACK || event.getCause() == DamageCause.ENTITY_SWEEP_ATTACK || event.getCause() == DamageCause.PROJECTILE)
double dodgeRating = Math.min(stats.getStat(ItemStat.DODGE_RATING), MMOItems.plugin.getConfig().getDouble("mitigation.dodge.rating-max")) / 100; event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.PHYSICAL_DAMAGE_REDUCTION) / 100));
if (random.nextDouble() < dodgeRating && !playerData.isOnCooldown(CooldownType.DODGE)) { }
playerData.applyCooldown(CooldownType.DODGE, stats.getStat(ItemStat.DODGE_COOLDOWN_REDUCTION));
event.setCancelled(true); event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.DAMAGE_REDUCTION) / 100));
}
Message.ATTACK_DODGED.format(ChatColor.RED).send(player, "mitigation");
player.getWorld().playSound(player.getLocation(), VersionSound.ENTITY_ENDER_DRAGON_FLAP.toSound(), 2, 1); // regeneration
player.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, player.getLocation(), 16, 0, 0, 0, .06); @EventHandler
if (MMOItems.plugin.getLanguage().dodgeKnockbackEnabled) public void c(EntityRegainHealthEvent event) {
player.setVelocity(getVector(player, event).multiply(.85 * MMOItems.plugin.getLanguage().dodgeKnockbackForce).setY(.3)); if (event.getEntity() instanceof Player)
return; event.setAmount(event.getAmount() * (1 + PlayerData.get((Player) event.getEntity()).getStats().getStat(ItemStat.REGENERATION) / 100));
} }
// parrying @EventHandler(priority = EventPriority.HIGHEST)
double parryRating = Math.min(stats.getStat(ItemStat.PARRY_RATING), MMOItems.plugin.getConfig().getDouble("mitigation.parry.rating-max")) / 100; public void d(PlayerJoinEvent event) {
if (random.nextDouble() < parryRating && !playerData.isOnCooldown(CooldownType.PARRY)) { PlayerData.load(event.getPlayer());
playerData.applyCooldown(CooldownType.PARRY, stats.getStat(ItemStat.PARRY_COOLDOWN_REDUCTION)); }
event.setCancelled(true);
@EventHandler(priority = EventPriority.HIGHEST)
Message.ATTACK_PARRIED.format(ChatColor.RED).send(player, "mitigation"); public void e(PlayerQuitEvent event) {
player.getWorld().playSound(player.getLocation(), VersionSound.ENTITY_ENDER_DRAGON_FLAP.toSound(), 2, 1); PlayerData.get(event.getPlayer()).save();
player.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, player.getLocation(), 16, 0, 0, 0, .06); }
if (event instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) event).getDamager() instanceof LivingEntity) {
LivingEntity attacker = (LivingEntity) ((EntityDamageByEntityEvent) event).getDamager(); // apply on-hit abilities from armor pieces.
attacker.setVelocity(attacker.getLocation().toVector().subtract(player.getLocation().toVector()).normalize().setY(.35).multiply(MMOItems.plugin.getConfig().getDouble("mitigation.parry.knockback-force"))); @EventHandler(priority = EventPriority.HIGH)
} public void f(EntityDamageByEntityEvent event) {
return; if (event.isCancelled() || !(event.getEntity() instanceof Player) || !(event.getDamager() instanceof LivingEntity) || event.getEntity().hasMetadata("NPC") || event.getDamager().hasMetadata("NPC"))
} return;
// blocking LivingEntity damager = (LivingEntity) event.getDamager();
double blockRating = Math.min(stats.getStat(ItemStat.BLOCK_RATING), MMOItems.plugin.getConfig().getDouble("mitigation.block.rating-max")) / 100; Player player = (Player) event.getEntity();
if (random.nextDouble() < blockRating && !playerData.isOnCooldown(CooldownType.BLOCK)) { PlayerData.get(player).castAbilities(damager, new AttackResult(true, event.getDamage()), CastingMode.WHEN_HIT);
double blockPower = Math.min(MMOItems.plugin.getConfig().getDouble("mitigation.block.power.default") + stats.getStat(ItemStat.BLOCK_POWER), MMOItems.plugin.getConfig().getDouble("mitigation.block.power.max")) / 100; }
playerData.applyCooldown(CooldownType.BLOCK, stats.getStat(ItemStat.BLOCK_COOLDOWN_REDUCTION));
event.setDamage(event.getDamage() * (1 - blockPower)); @EventHandler(priority = EventPriority.LOW)
public void g(PlayerInteractEvent event) {
Message.ATTACK_BLOCKED.format(ChatColor.RED, "#percent#", new DecimalFormat("0.#").format(blockPower * 100)).send(player, "mitigation"); if (event.getAction() == Action.PHYSICAL)
player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 2, 1); return;
double yaw = getYaw(player, getVector(player, event)) + 95; Player player = event.getPlayer();
for (double j = yaw - 90; j < yaw + 90; j += 5) boolean left = event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK;
for (double y = 0; y < 2; y += .1) PlayerData.get(player).castAbilities(null, new AttackResult(true), player.isSneaking() ? (left ? CastingMode.SHIFT_LEFT_CLICK : CastingMode.SHIFT_RIGHT_CLICK) : (left ? CastingMode.LEFT_CLICK : CastingMode.RIGHT_CLICK));
MMOItems.plugin.getVersion().getVersionWrapper().spawnParticle(Particle.REDSTONE, player.getLocation().clone().add(Math.cos(Math.toRadians(j)) * .7, y, Math.sin(Math.toRadians(j)) * .7), Color.GRAY); }
}
} /*
* prevent players from droping items which are bound to them with a
private Vector getVector(Player player, EntityDamageEvent event) { * soulbound. items are cached inside a map waiting for the player to
return event instanceof EntityDamageByEntityEvent ? player.getLocation().subtract(((EntityDamageByEntityEvent) event).getDamager().getLocation()).toVector().normalize() : player.getEyeLocation().getDirection(); * respawn. if he does not respawn the items are dropped on the ground, this
} * way there don't get lost
*/
private double getYaw(Entity player, Vector vec) { @EventHandler
return new Location(player.getWorld(), vec.getX(), vec.getY(), vec.getZ()).setDirection(vec).getYaw(); public void h(PlayerDeathEvent event) {
} if (event.getKeepInventory())
return;
@EventHandler(priority = EventPriority.HIGH)
public void b(EntityDamageEvent event) { Player player = event.getEntity();
if (!(event.getEntity() instanceof Player) || event.isCancelled() || event.getEntity().hasMetadata("NPC")) SoulboundInfo soulboundInfo = new SoulboundInfo(player);
return;
ItemStack item;
Player player = (Player) event.getEntity(); Iterator<ItemStack> iterator = event.getDrops().iterator();
while (iterator.hasNext())
// magical shield ability if (MMOItems.plugin.getNMS().getNBTItem(item = iterator.next()).getString("MMOITEMS_SOULBOUND").equals(player.getUniqueId().toString())) {
for (Location loc : Magical_Shield.magicalShield.keySet()) iterator.remove();
if (loc.getWorld().equals(player.getWorld())) { soulboundInfo.add(item);
Double[] values = Magical_Shield.magicalShield.get(loc); }
if (loc.distanceSquared(player.getLocation()) <= values[0])
event.setDamage(event.getDamage() * (1 - Math.max(values[1], 1))); soulboundInfo.setup();
} }
// damage reduction stats @EventHandler
PlayerStats stats = PlayerData.get(player).getStats(); public void i(PlayerRespawnEvent event) {
SoulboundInfo.read(event.getPlayer());
if (MMOItems.plugin.getRPG().canBeDamaged(player) && !MMOItems.plugin.getDamage().isDamaged(player)) { }
if (event.getCause() == DamageCause.FIRE)
event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FIRE_DAMAGE_REDUCTION) / 100));
else if (event.getCause() == DamageCause.FALL)
event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FALL_DAMAGE_REDUCTION) / 100));
else if (event.getCause() == DamageCause.MAGIC)
event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.MAGIC_DAMAGE_REDUCTION) / 100));
else if (event.getCause() == DamageCause.ENTITY_ATTACK || event.getCause() == DamageCause.ENTITY_SWEEP_ATTACK || event.getCause() == DamageCause.PROJECTILE)
event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.PHYSICAL_DAMAGE_REDUCTION) / 100));
}
event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.DAMAGE_REDUCTION) / 100));
}
// regeneration
@EventHandler
public void c(EntityRegainHealthEvent event) {
if (event.getEntity() instanceof Player)
event.setAmount(event.getAmount() * (1 + PlayerData.get((Player) event.getEntity()).getStats().getStat(ItemStat.REGENERATION) / 100));
}
@EventHandler(priority = EventPriority.HIGHEST)
public void d(PlayerJoinEvent event) {
PlayerData.load(event.getPlayer());
}
@EventHandler(priority = EventPriority.HIGHEST)
public void e(PlayerQuitEvent event) {
PlayerData.get(event.getPlayer()).save();
}
// apply on-hit abilities from armor pieces.
@EventHandler(priority = EventPriority.HIGH)
public void f(EntityDamageByEntityEvent event) {
if (event.isCancelled() || !(event.getEntity() instanceof Player) || !(event.getDamager() instanceof LivingEntity) || event.getEntity().hasMetadata("NPC") || event.getDamager().hasMetadata("NPC"))
return;
LivingEntity damager = (LivingEntity) event.getDamager();
Player player = (Player) event.getEntity();
PlayerData.get(player).castAbilities(damager, new AttackResult(true, event.getDamage()), CastingMode.WHEN_HIT);
}
@EventHandler(priority = EventPriority.LOW)
public void g(PlayerInteractEvent event) {
if (event.getAction() == Action.PHYSICAL)
return;
Player player = event.getPlayer();
boolean left = event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK;
PlayerData.get(player).castAbilities(null, new AttackResult(true), player.isSneaking() ? (left ? CastingMode.SHIFT_LEFT_CLICK : CastingMode.SHIFT_RIGHT_CLICK) : (left ? CastingMode.LEFT_CLICK : CastingMode.RIGHT_CLICK));
}
/*
* prevent players from droping items which are bound to them with a
* soulbound. items are cached inside a map waiting for the player to
* respawn. if he does not respawn the items are dropped on the ground, this
* way there don't get lost
*/
@EventHandler
public void h(PlayerDeathEvent event) {
if (event.getKeepInventory())
return;
Player player = event.getEntity();
SoulboundInfo soulboundInfo = new SoulboundInfo(player);
ItemStack item;
Iterator<ItemStack> iterator = event.getDrops().iterator();
while (iterator.hasNext())
if (MMOItems.plugin.getNMS().getNBTItem(item = iterator.next()).getString("MMOITEMS_SOULBOUND").equals(player.getUniqueId().toString())) {
iterator.remove();
soulboundInfo.add(item);
}
soulboundInfo.setup();
}
@EventHandler
public void i(PlayerRespawnEvent event) {
SoulboundInfo.read(event.getPlayer());
}
} }