!Moved damage reduction formulas to MMOLib

This commit is contained in:
Indyuce 2020-03-29 15:20:25 +02:00
parent 7cde1863d2
commit 45d145ed38
26 changed files with 169 additions and 198 deletions

View File

@ -14,6 +14,8 @@ import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.PotionEffectType;
@ -22,9 +24,8 @@ import org.bukkit.util.Vector;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.Indyuce.mmoitems.api.util.AltChar;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.version.VersionMaterial;
public class MMOUtils {
public static String getSkullTextureURL(ItemStack item) {
@ -61,6 +62,35 @@ public class MMOUtils {
player.getWorld().dropItem(player.getLocation(), drop);
}
public static LivingEntity getDamager(EntityDamageByEntityEvent event) {
/*
* check direct damager
*/
if (event.getDamager() instanceof LivingEntity)
return (LivingEntity) event.getDamager();
/*
* checks projectile and add damage type, which supports every vanilla
* projectile like snowballs, tridents and arrows
*/
if (event.getDamager() instanceof Projectile) {
Projectile proj = (Projectile) event.getDamager();
if (proj.getShooter() instanceof LivingEntity)
return (LivingEntity) proj.getShooter();
}
/*
* check for last damage
*/
// if (event.getEntity().getLastDamageCause() instanceof
// EntityDamageByEntityEvent && checkLastDamageCause)
// return getDamager(result, (EntityDamageByEntityEvent)
// event.getEntity().getLastDamageCause(), false);
return null;
}
public static int getEffectDuration(PotionEffectType type) {
// confusion takes a lot of time to decay
@ -77,18 +107,10 @@ public class MMOUtils {
return 80;
}
public static String getDisplayName(ItemStack i) {
if (!i.hasItemMeta())
return MMOUtils.caseOnWords(i.getType().name().toLowerCase().replace("_", " "));
return i.getItemMeta().hasDisplayName() ? i.getItemMeta().getDisplayName() : MMOUtils.caseOnWords(i.getType().name().toLowerCase().replace("_", " "));
}
public static Integer[] getSocketSlots(List<String> lore) {
List<Integer> list = new ArrayList<Integer>();
for (int j = 0; j < lore.size(); j++)
if (lore.get(j).equals(ItemStat.translate("empty-gem-socket").replace("#d", AltChar.diamond)))
list.add(j);
return list.toArray(new Integer[list.size()]);
public static String getDisplayName(ItemStack item) {
if (!item.hasItemMeta())
return MMOUtils.caseOnWords(item.getType().name().toLowerCase().replace("_", " "));
return item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName() : MMOUtils.caseOnWords(item.getType().name().toLowerCase().replace("_", " "));
}
public static boolean twoHandedCase(Player player) {
@ -119,7 +141,7 @@ public class MMOUtils {
return builder.toString();
}
public static boolean isPluginItem(ItemStack item, boolean lore) {
public static boolean isMetaItem(ItemStack item, boolean lore) {
return item != null && item.getType() != Material.AIR && item.getItemMeta() != null && item.getItemMeta().getDisplayName() != null && (!lore || item.getItemMeta().getLore() != null);
}
@ -222,6 +244,19 @@ public class MMOUtils {
return s;
}
@Deprecated
public static boolean areSimilar(ItemStack item1, ItemStack iitem2) {
if (item1.getType() == VersionMaterial.PLAYER_HEAD.toMaterial() && iitem2.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) {
ItemMeta meta1 = item1.getItemMeta();
ItemMeta meta2 = iitem2.getItemMeta();
if (meta1.hasDisplayName() && meta2.hasDisplayName())
return meta1.getDisplayName().equalsIgnoreCase(meta2.getDisplayName());
}
return item1.isSimilar(iitem2);
}
public static double truncation(double x, int n) {
double pow = Math.pow(10.0, n);
return Math.floor(x * pow) / pow;

View File

@ -1,12 +1,15 @@
package net.Indyuce.mmoitems.ability;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.Particle;
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.EntityDamageEvent;
import org.bukkit.scheduler.BukkitRunnable;
import net.Indyuce.mmoitems.MMOItems;
@ -20,8 +23,6 @@ import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.version.VersionSound;
public class Magical_Shield extends Ability {
public static Map<Location, Double[]> magicalShield = new HashMap<>();
public Magical_Shield() {
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
@ -41,26 +42,50 @@ public class Magical_Shield extends Ability {
@Override
public void whenCast(CachedStats stats, AbilityResult ability, ItemAttackResult result) {
double duration = ability.getModifier("duration");
double radius = Math.pow(ability.getModifier("radius"), 2);
double radiusSquared = Math.pow(ability.getModifier("radius"), 2);
double power = ability.getModifier("power") / 100;
Location loc = stats.getPlayer().getLocation().clone();
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 3, 0);
magicalShield.put(loc, new Double[] { radius, power });
new BukkitRunnable() {
int ti = 0;
new MagicalShield(stats.getPlayer().getLocation().clone(), duration, radiusSquared, power);
}
public void run() {
ti++;
for (double j = 0; j < Math.PI / 2; j += Math.PI / (28 + random.nextInt(5)))
for (double i = 0; i < Math.PI * 2; i += Math.PI / (14 + random.nextInt(5)))
MMOLib.plugin.getVersion().getWrapper().spawnParticle(Particle.REDSTONE, loc.clone().add(2.5 * Math.cos(i + j) * Math.sin(j), 2.5 * Math.cos(j), 2.5 * Math.sin(i + j) * Math.sin(j)), Color.FUCHSIA);
public class MagicalShield extends BukkitRunnable implements Listener {
private final Location loc;
private final double duration, radius, power;
if (ti > duration * 20 / 3) {
magicalShield.remove(loc);
cancel();
}
}
}.runTaskTimer(MMOItems.plugin, 0, 3);
int ti = 0;
public MagicalShield(Location loc, double duration, double radius, double power) {
this.loc = loc;
this.duration = duration;
this.radius = radius;
this.power = power;
runTaskTimer(MMOItems.plugin, 0, 3);
Bukkit.getPluginManager().registerEvents(this, MMOItems.plugin);
}
private void close() {
cancel();
EntityDamageEvent.getHandlerList().unregister(this);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void a(EntityDamageEvent event) {
if (event.getEntity() instanceof Player && event.getEntity().getLocation().distanceSquared(loc) < radius)
event.setDamage(event.getDamage() * (1 - power));
}
@Override
public void run() {
ti++;
if (ti > duration * 20. / 3.)
close();
for (double j = 0; j < Math.PI / 2; j += Math.PI / (28 + random.nextInt(5)))
for (double i = 0; i < Math.PI * 2; i += Math.PI / (14 + random.nextInt(5)))
MMOLib.plugin.getVersion().getWrapper().spawnParticle(Particle.REDSTONE, loc.clone().add(2.5 * Math.cos(i + j) * Math.sin(j), 2.5 * Math.cos(j), 2.5 * Math.sin(i + j) * Math.sin(j)), Color.FUCHSIA);
}
}
}

View File

@ -1,25 +0,0 @@
package net.Indyuce.mmoitems.api.util;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import net.mmogroup.mmolib.version.VersionMaterial;
public class IsSimilar {
public static boolean check(ItemStack i1, ItemStack i2) {
/**
* Not the most optimal code,
* but it works for now.
*/
if(i1.getType() == VersionMaterial.PLAYER_HEAD.toMaterial() &&
i2.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) {
ItemMeta meta1 = i1.getItemMeta();
ItemMeta meta2 = i2.getItemMeta();
if(meta1.hasDisplayName() && meta2.hasDisplayName())
return meta1.getDisplayName().equalsIgnoreCase(meta2.getDisplayName());
}
return i1.isSimilar(i2);
}
}

View File

@ -128,7 +128,7 @@ public class BlockBrowser extends PluginInventory {
ItemStack item = event.getCurrentItem();
if (item == null) return;
if (MMOUtils.isPluginItem(item, false)) {
if (MMOUtils.isMetaItem(item, false)) {
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Next Page")) {
page++; open(); return;
}

View File

@ -19,7 +19,6 @@ import net.Indyuce.mmoitems.api.crafting.recipe.CraftingRecipe;
import net.Indyuce.mmoitems.api.crafting.recipe.RecipeInfo;
import net.Indyuce.mmoitems.api.crafting.recipe.UpgradingRecipe;
import net.Indyuce.mmoitems.api.item.plugin.ConfigItem;
import net.Indyuce.mmoitems.api.util.IsSimilar;
import net.md_5.bungee.api.ChatColor;
public class CraftingStationPreview extends PluginInventory {
@ -28,10 +27,8 @@ public class CraftingStationPreview extends PluginInventory {
private final RecipeInfo recipe;
private List<CheckedIngredient> ingredients = new ArrayList<>();
private static final int[]
slots = { 12, 13, 14, 21, 22, 23, 30, 31, 32 },
fill = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 17, 18, 19, 25, 26, 27, 29, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 };
private static final int[] slots = { 12, 13, 14, 21, 22, 23, 30, 31, 32 }, fill = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 17, 18, 19, 25, 26, 27, 29, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 };
public CraftingStationPreview(Player player, CraftingStation station, RecipeInfo recipe, int previousPage) {
super(player);
@ -46,9 +43,8 @@ public class CraftingStationPreview extends PluginInventory {
Inventory inv = Bukkit.createInventory(this, 45, "Recipe Preview");
ingredients.clear();
ingredients.addAll(recipe.getIngredients());
int min = (page - 1) * slots.length,
max = page * slots.length;
int min = (page - 1) * slots.length, max = page * slots.length;
for (int j = min; j < max; j++) {
if (j >= ingredients.size()) {
if (station.getItemOptions().hasNoRecipe())
@ -62,19 +58,19 @@ public class CraftingStationPreview extends PluginInventory {
for (int slot : fill)
inv.setItem(slot, ConfigItem.FILL.getItem());
if(recipe.getRecipe() instanceof CraftingRecipe) {
if (recipe.getRecipe() instanceof CraftingRecipe) {
ItemStack item = ((CraftingRecipe) recipe.getRecipe()).getOutput().getPreview();
item.setAmount(((CraftingRecipe) recipe.getRecipe()).getOutput().getAmount());
inv.setItem(16, item);
}
if(recipe.getRecipe() instanceof UpgradingRecipe) {
if (recipe.getRecipe() instanceof UpgradingRecipe) {
ItemStack stack = ((UpgradingRecipe) recipe.getRecipe()).getItem().getPreview();
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(meta.getDisplayName() + ChatColor.translateAlternateColorCodes('&', " &a+1!"));
stack.setItemMeta(meta);
inv.setItem(16, stack);
}
inv.setItem(10, ConfigItem.BACK.getItem());
inv.setItem(34, ConfigItem.CONFIRM.getItem());
ItemStack book = recipe.display();
@ -83,45 +79,45 @@ public class CraftingStationPreview extends PluginInventory {
ItemMeta meta = book.getItemMeta();
List<String> newLore = meta.getLore().subList(0, meta.getLore().size() - 3);
meta.setLore(newLore);
for(Enchantment ench : meta.getEnchants().keySet())
for (Enchantment ench : meta.getEnchants().keySet())
meta.removeEnchant(ench);
book.setItemMeta(meta);
inv.setItem(28, book);
inv.setItem(20, page > 1 ? ConfigItem.PREVIOUS_PAGE.getItem() : ConfigItem.FILL.getItem());
inv.setItem(24, max < ingredients.size() ? ConfigItem.NEXT_PAGE.getItem() : ConfigItem.FILL.getItem());
return inv;
}
@SuppressWarnings("deprecation")
@Override
public void whenClicked(InventoryClickEvent event) {
event.setCancelled(true);
if (!MMOUtils.isPluginItem(event.getCurrentItem(), false))
if (!MMOUtils.isMetaItem(event.getCurrentItem(), false))
return;
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.CONFIRM.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.CONFIRM.getItem())) {
CraftingStationView csv = new CraftingStationView(player, station, previousPage);
csv.processRecipe(recipe);
csv.open();
return;
}
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.PREVIOUS_PAGE.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.PREVIOUS_PAGE.getItem())) {
page--;
open();
return;
}
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.NEXT_PAGE.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.NEXT_PAGE.getItem())) {
page++;
open();
return;
}
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.BACK.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.BACK.getItem())) {
new CraftingStationView(player, station, previousPage).open();
return;
}

View File

@ -24,7 +24,6 @@ import net.Indyuce.mmoitems.api.crafting.recipe.RecipeInfo;
import net.Indyuce.mmoitems.api.event.crafting.PlayerUseRecipeEvent;
import net.Indyuce.mmoitems.api.item.plugin.ConfigItem;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.util.IsSimilar;
import net.Indyuce.mmoitems.api.util.message.Message;
import net.Indyuce.mmoitems.listener.CustomSoundListener;
import net.mmogroup.mmolib.MMOLib;
@ -124,32 +123,33 @@ public class CraftingStationView extends PluginInventory {
return inv;
}
@SuppressWarnings("deprecation")
@Override
public void whenClicked(InventoryClickEvent event) {
event.setCancelled(true);
if (!MMOUtils.isPluginItem(event.getCurrentItem(), false))
if (!MMOUtils.isMetaItem(event.getCurrentItem(), false))
return;
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.PREVIOUS_IN_QUEUE.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.PREVIOUS_IN_QUEUE.getItem())) {
queueOffset--;
open();
return;
}
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.NEXT_IN_QUEUE.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.NEXT_IN_QUEUE.getItem())) {
queueOffset++;
open();
return;
}
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.NEXT_PAGE.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.NEXT_PAGE.getItem())) {
page++;
open();
return;
}
if (IsSimilar.check(event.getCurrentItem(), ConfigItem.PREVIOUS_PAGE.getItem())) {
if (MMOUtils.areSimilar(event.getCurrentItem(), ConfigItem.PREVIOUS_PAGE.getItem())) {
page--;
open();
return;

View File

@ -212,7 +212,7 @@ public class ItemBrowser extends PluginInventory {
return;
ItemStack item = event.getCurrentItem();
if (MMOUtils.isPluginItem(item, false)) {
if (MMOUtils.isMetaItem(item, false)) {
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Next Page")) {
page++;
open();

View File

@ -136,7 +136,7 @@ public class AbilityEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + AltChar.rightArrow + " Ability List")) {

View File

@ -99,7 +99,7 @@ public class AbilityListEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Add an ability...")) {

View File

@ -133,7 +133,7 @@ public class ArrowParticlesEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Particle")) {

View File

@ -86,7 +86,7 @@ public class BlockEdition extends PluginInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if(event.getSlot() == 40)

View File

@ -85,7 +85,7 @@ public class CommandListEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Register a command...")) {

View File

@ -69,7 +69,7 @@ public class CraftingEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
CraftingType corresponding = CraftingType.getBySlot(event.getSlot());

View File

@ -91,7 +91,7 @@ public class ElementsEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (correspondingSlot.containsKey(event.getSlot())) {

View File

@ -101,7 +101,7 @@ public class ItemEdition extends EditionInventory {
return;
ItemStack item = event.getCurrentItem();
if (!MMOUtils.isPluginItem(item, false) || event.getInventory().getItem(4) == null)
if (!MMOUtils.isMetaItem(item, false) || event.getInventory().getItem(4) == null)
return;
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Next Page")) {

View File

@ -79,7 +79,7 @@ public class ItemUpdaterEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
// safe check

View File

@ -149,7 +149,7 @@ public class ParticlesEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Particle")) {

View File

@ -85,7 +85,7 @@ public class SoundsEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (correspondingSlot.containsKey(event.getSlot())) {

View File

@ -161,7 +161,7 @@ public class UpgradingEdition extends EditionInventory {
ItemStack item = event.getCurrentItem();
event.setCancelled(true);
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Success Chance")) {

View File

@ -32,7 +32,7 @@ public class GuiListener implements Listener {
if (!(inventory instanceof EditionInventory))
return;
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isPluginItem(item, false))
if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false))
return;
if (!item.getItemMeta().getDisplayName().startsWith(ChatColor.GREEN + ""))

View File

@ -38,7 +38,7 @@ public class CustomBlockListener implements Listener {
Bukkit.getPluginManager().registerEvents(new MushroomReplacer(), MMOItems.plugin);
}
@EventHandler
@EventHandler(ignoreCancelled = true)
public void a(BlockPhysicsEvent event) {
if (MMOItems.plugin.getCustomBlocks().isMushroomBlock(event.getChangedType())) {
event.setCancelled(true);
@ -46,7 +46,7 @@ public class CustomBlockListener implements Listener {
}
}
@EventHandler(priority = EventPriority.LOWEST)
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void b(BlockBreakEvent event) {
Material type = event.getBlock().getType();
@ -130,10 +130,8 @@ public class CustomBlockListener implements Listener {
*/
}
@EventHandler
@EventHandler(ignoreCancelled = true)
public void d(BlockIgniteEvent event) {
if (event.isCancelled())
return;
if (event.getCause() == IgniteCause.LAVA || event.getCause() == IgniteCause.SPREAD) {
BlockFace[] faces = { BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST };
for (BlockFace face : faces)
@ -150,7 +148,7 @@ public class CustomBlockListener implements Listener {
ItemStack item = player.getInventory().getItemInMainHand();
if (item != null && item.getType() != Material.AIR) {
NBTItem nbt = NBTItem.get(item);
if (nbt.hasType())
if (nbt.hasType())
return nbt.getInteger("MMOITEMS_PICKAXE_POWER");
}
@ -158,10 +156,8 @@ public class CustomBlockListener implements Listener {
}
public class MushroomReplacer implements Listener {
@EventHandler
@EventHandler(ignoreCancelled = true)
public void d(BlockBreakEvent event) {
if (event.isCancelled())
return;
if (MMOItems.plugin.getCustomBlocks().isMushroomBlock(event.getBlock().getType()) && MMOItems.plugin.getDropTables().hasSilkTouchTool(event.getPlayer()))
event.setDropItems(false);
}

View File

@ -33,10 +33,10 @@ public class ElementListener implements Listener {
iterator.remove();
}
@EventHandler(priority = EventPriority.HIGHEST)
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(EntityDamageByEntityEvent event) {
Entity entity = event.getEntity();
if (!event.isCancelled() && isWeakened(entity)) {
if (isWeakened(entity)) {
event.setDamage(event.getDamage() * (1 + waterWeaknessDamageIncrease));
entity.getWorld().spawnParticle(Particle.WATER_SPLASH, event.getEntity().getLocation().add(0, entity.getHeight() / 2, 0), 16, .3, .3, .3, 0);
}

View File

@ -2,17 +2,13 @@ package net.Indyuce.mmoitems.listener;
import java.util.Iterator;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerInteractEvent;
@ -21,112 +17,49 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Magical_Shield;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.api.ItemAttackResult;
import net.Indyuce.mmoitems.api.SoulboundInfo;
import net.Indyuce.mmoitems.api.ability.Ability.CastingMode;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.player.PlayerStats;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.api.DamageType;
public class PlayerListener implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void b(EntityDamageEvent event) {
if(event.getCause() == DamageCause.ENTITY_ATTACK || event.getCause() == DamageCause.ENTITY_SWEEP_ATTACK
|| event.getCause() == DamageCause.PROJECTILE) return;
if (!(event.getEntity() instanceof Player) || event.isCancelled() || event.getEntity().hasMetadata("NPC"))
return;
Player player = (Player) event.getEntity();
// magical shield ability
for (Location loc : Magical_Shield.magicalShield.keySet())
if (loc.getWorld().equals(player.getWorld())) {
Double[] values = Magical_Shield.magicalShield.get(loc);
if (loc.distanceSquared(player.getLocation()) <= values[0])
event.setDamage(event.getDamage() * (1 - Math.max(values[1], 1)));
}
/*
* damage reduction
*/
PlayerStats stats = PlayerData.get(player).getStats();
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));
event.setDamage(event.getDamage() * (1 - (stats.getStat(ItemStat.DAMAGE_REDUCTION) / 100)));
}
// regeneration
@EventHandler
public void c(EntityRegainHealthEvent event) {
public void applyMMOItemsRegeneration(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.LOW)
public void d(PlayerJoinEvent event) {
public void loadPlayerData(PlayerJoinEvent event) {
PlayerData.load(event.getPlayer());
if (!MMOLib.plugin.getVersion().isBelowOrEqual(1, 12) && MMOItems.plugin.getConfig().getBoolean("auto-recipe-book"))
event.getPlayer().discoverRecipes(MMOItems.plugin.getRecipes().getNamespacedKeys());
}
@EventHandler(priority = EventPriority.HIGH)
public void e(PlayerQuitEvent event) {
public void savePlayerData(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.getDamager() instanceof Projectile)) || event.getEntity().hasMetadata("NPC") || event.getDamager().hasMetadata("NPC"))
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void castWhenHitAbilities(EntityDamageByEntityEvent event) {
if (!(event.getEntity() instanceof Player) || event.getEntity().hasMetadata("NPC"))
return;
/*
* damage reduction
*/
if (MMOLib.plugin.getDamage().findInfo(event.getEntity()) != null)
LivingEntity damager = MMOUtils.getDamager(event);
if (damager == null)
return;
PlayerStats stats = PlayerData.get((Player) event.getEntity()).getStats();
double d = 0;
if(event.getCause() == DamageCause.PROJECTILE) {
d += (stats.getStat(ItemStat.PROJECTILE_DAMAGE_REDUCTION) / 100);
if(((Projectile) event.getDamager()).getShooter() instanceof Player)
d += (stats.getStat(ItemStat.PVP_DAMAGE_REDUCTION) / 100);
else d += (stats.getStat(ItemStat.PVE_DAMAGE_REDUCTION) / 100);
}
else {
d += (stats.getStat(ItemStat.PHYSICAL_DAMAGE_REDUCTION) / 100);
if(event.getDamager() instanceof Player)
d += (stats.getStat(ItemStat.PVP_DAMAGE_REDUCTION) / 100);
else d += (stats.getStat(ItemStat.PVE_DAMAGE_REDUCTION) / 100);
}
event.setDamage((event.getDamage() * (1 - d)) * (1 - (stats.getStat(ItemStat.DAMAGE_REDUCTION) / 100)));
LivingEntity damager = null;
if(event.getDamager() instanceof LivingEntity)
damager = (LivingEntity) event.getDamager();
else if(((Projectile) event.getDamager()).getShooter() instanceof LivingEntity)
damager = (LivingEntity) ((Projectile) event.getDamager()).getShooter();
if(damager == null) return;
Player player = (Player) event.getEntity();
PlayerData.get(player).castAbilities(damager, new ItemAttackResult(event.getDamage(), DamageType.SKILL), CastingMode.WHEN_HIT);
}
@EventHandler(priority = EventPriority.LOW)
public void g(PlayerInteractEvent event) {
public void castClickAbilities(PlayerInteractEvent event) {
if (event.getAction() == Action.PHYSICAL)
return;
@ -142,7 +75,7 @@ public class PlayerListener implements Listener {
* way there don't get lost
*/
@EventHandler
public void h(PlayerDeathEvent event) {
public void applySoulbound(PlayerDeathEvent event) {
if (event.getKeepInventory())
return;
@ -161,7 +94,7 @@ public class PlayerListener implements Listener {
}
@EventHandler
public void i(PlayerRespawnEvent event) {
public void readSoulbound(PlayerRespawnEvent event) {
SoulboundInfo.read(event.getPlayer());
}
}

View File

@ -4,8 +4,10 @@ import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.entity.Trident;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.Type;
@ -16,6 +18,8 @@ import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.api.item.NBTItem;
public class Listener_v1_13 implements Listener {
private final boolean autoRecipeBook = MMOItems.plugin.getConfig().getBoolean("auto-recipe-book");
@EventHandler
public void a(ProjectileLaunchEvent event) {
if (!(event.getEntity() instanceof Trident) || !(event.getEntity().getShooter() instanceof Player))
@ -37,4 +41,10 @@ public class Listener_v1_13 implements Listener {
MMOItems.plugin.getEntities().registerCustomProjectile(nbtItem, playerData.getStats().newTemporary(), (Trident) event.getEntity(), type != null);
}
@EventHandler(priority = EventPriority.LOW)
public void b(PlayerJoinEvent event) {
if (autoRecipeBook)
event.getPlayer().discoverRecipes(MMOItems.plugin.getRecipes().getNamespacedKeys());
}
}

View File

@ -96,9 +96,9 @@ public class EntityManager implements Listener {
Bukkit.getScheduler().scheduleSyncDelayedTask(MMOItems.plugin, () -> unregisterCustomEntity(event.getEntity()));
}
@EventHandler
@EventHandler(ignoreCancelled = true)
public void b(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Projectile) || !(event.getEntity() instanceof LivingEntity) || event.getEntity().hasMetadata("NPC") || event.isCancelled())
if (!(event.getDamager() instanceof Projectile) || !(event.getEntity() instanceof LivingEntity) || event.getEntity().hasMetadata("NPC"))
return;
Projectile arrow = (Projectile) event.getDamager();

View File

@ -20,10 +20,10 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.api.ConfigFile;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.item.MMOItem;
import net.Indyuce.mmoitems.api.util.IsSimilar;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.api.item.NBTItem;
@ -73,6 +73,7 @@ public class UpdaterManager implements Listener {
/*
* updates inventory item when clicked
*/
@SuppressWarnings("deprecation")
@EventHandler
public void a(InventoryClickEvent event) {
ItemStack item = event.getCurrentItem();
@ -80,7 +81,7 @@ public class UpdaterManager implements Listener {
return;
ItemStack newItem = getUpdated(item);
if (!IsSimilar.check(newItem, item))
if (!MMOUtils.areSimilar(newItem, item))
event.setCurrentItem(newItem);
}