From ea48b9616bad0a0c41bbd106d673db9848014fe9 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 12 Sep 2019 00:57:22 +0200 Subject: [PATCH] 1.12.2 support (still needs legacy configs!) --- .../armorequip/ArmorType.java | 4 +- .../mmocore/api/experience/Profession.java | 3 +- .../source/EnchantItemExperienceSource.java | 3 +- .../Indyuce/mmocore/api/item/ConfigItem.java | 3 +- .../api/math/particle/CastingParticle.java | 6 +- .../math/particle/ParabolicProjectile.java | 4 +- .../mmocore/api/player/PlayerData.java | 7 +- .../mmocore/api/player/PlayerQuests.java | 3 +- .../mmocore/api/skill/TargetSkillResult.java | 4 +- .../mmocore/comp/mythicmobs/LootColor.java | 2 +- .../net/Indyuce/mmocore/gui/PlayerStats.java | 4 +- .../listener/profession/FishingListener.java | 6 +- .../profession/PlayerCollectStats.java | 9 +- .../mmocore/listener/profession/Smelting.java | 9 +- .../net/Indyuce/mmocore/skill/Ambers.java | 2 +- .../net/Indyuce/mmocore/skill/Control.java | 7 +- .../net/Indyuce/mmocore/skill/Deep_Wound.java | 3 +- .../mmocore/skill/Empowered_Attack.java | 7 +- .../java/net/Indyuce/mmocore/skill/Evade.java | 4 +- .../net/Indyuce/mmocore/skill/Fire_Rage.java | 11 +- .../net/Indyuce/mmocore/skill/Fire_Storm.java | 5 +- .../net/Indyuce/mmocore/skill/Fireball.java | 9 +- .../Indyuce/mmocore/skill/Human_Shield.java | 4 +- .../net/Indyuce/mmocore/skill/Ice_Spikes.java | 6 +- .../net/Indyuce/mmocore/skill/Power_Mark.java | 7 +- .../net/Indyuce/mmocore/skill/Telekinesy.java | 7 +- .../java/net/Indyuce/mmocore/skill/Warp.java | 3 +- .../net/Indyuce/mmocore/skill/Weaken.java | 4 +- .../mmocore/version/ServerVersion.java | 9 + .../mmocore/version/VersionMaterial.java | 85 +++++++ .../Indyuce/mmocore/version/VersionSound.java | 33 +++ .../mmocore/version/nms/NMSHandler.java | 4 + .../version/nms/NMSHandler_1_12_R1.java | 185 +++++++++++++++ .../version/nms/NMSHandler_1_13_R1.java | 7 + .../version/nms/NMSHandler_1_13_R2.java | 7 + .../version/nms/NMSHandler_1_14_R1.java | 7 + .../wrapper/DefaultVersionWrapper.java | 68 ++++++ .../version/wrapper/LegacyVersionWrapper.java | 224 ++++++++++++++++++ .../version/wrapper/VersionWrapper.java | 58 +++++ 39 files changed, 764 insertions(+), 69 deletions(-) create mode 100644 src/main/java/net/Indyuce/mmocore/version/VersionMaterial.java create mode 100644 src/main/java/net/Indyuce/mmocore/version/VersionSound.java create mode 100644 src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_12_R1.java create mode 100644 src/main/java/net/Indyuce/mmocore/version/wrapper/DefaultVersionWrapper.java create mode 100644 src/main/java/net/Indyuce/mmocore/version/wrapper/LegacyVersionWrapper.java create mode 100644 src/main/java/net/Indyuce/mmocore/version/wrapper/VersionWrapper.java diff --git a/src/main/java/com/codingforcookies/armorequip/ArmorType.java b/src/main/java/com/codingforcookies/armorequip/ArmorType.java index 0dc43ea5..77209e7d 100644 --- a/src/main/java/com/codingforcookies/armorequip/ArmorType.java +++ b/src/main/java/com/codingforcookies/armorequip/ArmorType.java @@ -7,6 +7,8 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import net.Indyuce.mmocore.version.VersionMaterial; + /** * @author Arnah * @since Jul 30, 2015 @@ -46,7 +48,7 @@ public enum ArmorType { Material type = item.getType(); String name = type.name(); - if (name.endsWith("HELMET") || name.endsWith("SKULL") || name.endsWith("HEAD") || type == Material.PLAYER_HEAD || type == Material.PUMPKIN) + if (name.endsWith("HELMET") || name.endsWith("SKULL") || name.endsWith("HEAD") || type == VersionMaterial.PLAYER_HEAD.toMaterial() || type == Material.PUMPKIN) return HELMET; else if (name.endsWith("CHESTPLATE")) diff --git a/src/main/java/net/Indyuce/mmocore/api/experience/Profession.java b/src/main/java/net/Indyuce/mmocore/api/experience/Profession.java index 27e5bf9e..dafd5087 100644 --- a/src/main/java/net/Indyuce/mmocore/api/experience/Profession.java +++ b/src/main/java/net/Indyuce/mmocore/api/experience/Profession.java @@ -4,7 +4,6 @@ import java.util.logging.Level; import org.apache.commons.lang.Validate; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.potion.PotionType; @@ -72,7 +71,7 @@ public class Profession { if (config.contains("base-enchant-exp")) for (String key : config.getConfigurationSection("base-enchant-exp").getKeys(false)) try { - Enchantment enchant = Enchantment.getByKey(NamespacedKey.minecraft(key.toLowerCase().replace("-", "_"))); + Enchantment enchant = MMOCore.plugin.version.getVersionWrapper().getEnchantmentFromString(key.toLowerCase().replace("-", "_")); MMOCore.plugin.enchantManager.registerBaseExperience(enchant, config.getDouble("base-enchant-exp." + key)); } catch (IllegalArgumentException exception) { MMOCore.log(Level.WARNING, "[Professions:" + id + "] Could not read enchant from " + key); diff --git a/src/main/java/net/Indyuce/mmocore/api/experience/source/EnchantItemExperienceSource.java b/src/main/java/net/Indyuce/mmocore/api/experience/source/EnchantItemExperienceSource.java index cab67f94..baa3295c 100644 --- a/src/main/java/net/Indyuce/mmocore/api/experience/source/EnchantItemExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/api/experience/source/EnchantItemExperienceSource.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -28,7 +27,7 @@ public class EnchantItemExperienceSource extends ExperienceSource { if (config.contains("enchant")) for (String key : config.getString("enchant").split("\\,")) - enchants.add(Enchantment.getByKey(NamespacedKey.minecraft(key.toLowerCase().replace("-", "_")))); + enchants.add(MMOCore.plugin.version.getVersionWrapper().getEnchantmentFromString(key.toLowerCase().replace("-", "_"))); } @Override diff --git a/src/main/java/net/Indyuce/mmocore/api/item/ConfigItem.java b/src/main/java/net/Indyuce/mmocore/api/item/ConfigItem.java index 2bc23a0e..1ab4cedb 100644 --- a/src/main/java/net/Indyuce/mmocore/api/item/ConfigItem.java +++ b/src/main/java/net/Indyuce/mmocore/api/item/ConfigItem.java @@ -21,6 +21,7 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.version.VersionMaterial; import net.Indyuce.mmocore.version.nms.ItemTag; public class ConfigItem { @@ -101,7 +102,7 @@ public class ConfigItem { if (meta instanceof Damageable) ((Damageable) meta).setDamage(damage); - if (item.getType() == Material.PLAYER_HEAD && texture != null) { + if (item.getType() == VersionMaterial.PLAYER_HEAD.toMaterial() && texture != null) { try { Field profileField = meta.getClass().getDeclaredField("profile"); profileField.setAccessible(true); diff --git a/src/main/java/net/Indyuce/mmocore/api/math/particle/CastingParticle.java b/src/main/java/net/Indyuce/mmocore/api/math/particle/CastingParticle.java index cba91d49..12389874 100644 --- a/src/main/java/net/Indyuce/mmocore/api/math/particle/CastingParticle.java +++ b/src/main/java/net/Indyuce/mmocore/api/math/particle/CastingParticle.java @@ -9,6 +9,8 @@ import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.configuration.ConfigurationSection; +import net.Indyuce.mmocore.MMOCore; + public class CastingParticle { private final Consumer display; @@ -23,7 +25,7 @@ public class CastingParticle { final float size = (float) config.getDouble("size") == 0 ? 1 : (float) Math.max(config.getDouble("size"), 0); Color color = Color.fromRGB(config.getInt("color.red"), config.getInt("color.green"), config.getInt("color.blue")); - display = (loc) -> loc.getWorld().spawnParticle(particle, loc, 0, new Particle.DustOptions(color, size)); + display = (loc) -> MMOCore.plugin.version.getVersionWrapper().spawnParticle(particle, loc, size, color); return; } @@ -32,7 +34,7 @@ public class CastingParticle { Validate.notNull(format, "Could not read material name"); Material material = Material.valueOf(format.toUpperCase().replace("-", "_").replace(" ", "_")); - display = (loc) -> loc.getWorld().spawnParticle(particle, loc, 0, material.createBlockData()); + display = (loc) -> MMOCore.plugin.version.getVersionWrapper().spawnParticle(particle, loc, material); return; } diff --git a/src/main/java/net/Indyuce/mmocore/api/math/particle/ParabolicProjectile.java b/src/main/java/net/Indyuce/mmocore/api/math/particle/ParabolicProjectile.java index 76d5cbb8..bdc996c7 100644 --- a/src/main/java/net/Indyuce/mmocore/api/math/particle/ParabolicProjectile.java +++ b/src/main/java/net/Indyuce/mmocore/api/math/particle/ParabolicProjectile.java @@ -29,11 +29,11 @@ public class ParabolicProjectile extends BukkitRunnable { } public ParabolicProjectile(Location source, Location target, Particle particle, Runnable end, int speed, Color color, float size) { - this(source, target, target.clone().subtract(source).toVector().multiply(.1).setY(6).normalize().multiply(.3), end, speed, (loc) -> loc.getWorld().spawnParticle(particle, loc, 1, new Particle.DustOptions(color, size))); + this(source, target, target.clone().subtract(source).toVector().multiply(.1).setY(6).normalize().multiply(.3), end, speed, (loc) -> MMOCore.plugin.version.getVersionWrapper().spawnParticle(particle, loc, size, color)); } public ParabolicProjectile(Location source, Location target, Runnable end, Color color) { - this(source, target, target.clone().subtract(source).toVector().multiply(.1).setY(6).normalize().multiply(.3), end, 1, (loc) -> loc.getWorld().spawnParticle(Particle.REDSTONE, loc, 1, new Particle.DustOptions(color, 1))); + this(source, target, target.clone().subtract(source).toVector().multiply(.1).setY(6).normalize().multiply(.3), end, 1, (loc) -> MMOCore.plugin.version.getVersionWrapper().spawnParticle(Particle.REDSTONE, loc, 1, color)); } public ParabolicProjectile(Location source, Location target, Particle particle) { diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index b6129e38..b9aaf5b7 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -45,6 +45,7 @@ import net.Indyuce.mmocore.api.skill.Skill.SkillInfo; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.api.skill.SkillResult.CancelReason; import net.Indyuce.mmocore.listener.SpellCast.SkillCasting; +import net.Indyuce.mmocore.version.VersionSound; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; @@ -433,15 +434,15 @@ public class PlayerData { if (t++ >= 100) { player.teleport(waypoint.getLocation()); player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20, 1, false, false)); - player.playSound(player.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1, .5f); + player.playSound(player.getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 1, .5f); cancel(); return; } - player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_BELL, 1, (float) (t / Math.PI * .015 + .5)); + player.playSound(player.getLocation(), VersionSound.BLOCK_NOTE_BLOCK_BELL.toSound(), 1, (float) (t / Math.PI * .015 + .5)); double r = Math.sin((double) t / 100 * Math.PI); for (double j = 0; j < Math.PI * 2; j += Math.PI / 4) - player.getWorld().spawnParticle(Particle.REDSTONE, player.getLocation().add(Math.cos((double) t / 20 + j) * r, (double) t / 50, Math.sin((double) t / 20 + j) * r), 0, new Particle.DustOptions(Color.PURPLE, 1.25f)); + MMOCore.plugin.version.getVersionWrapper().spawnParticle(Particle.REDSTONE, player.getLocation().add(Math.cos((double) t / 20 + j) * r, (double) t / 50, Math.sin((double) t / 20 + j) * r), 1.25f, Color.PURPLE); } }.runTaskTimer(MMOCore.plugin, 0, 1); } diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerQuests.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerQuests.java index b0791c62..f7fd97cb 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerQuests.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerQuests.java @@ -6,7 +6,6 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; -import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; @@ -27,7 +26,7 @@ public class PlayerQuests { public PlayerQuests(PlayerData playerData) { this.playerData = playerData; - bossbar = Bukkit.createBossBar(new NamespacedKey(MMOCore.plugin, "quest_bar_" + playerData.getUniqueId().toString()), "", BarColor.PURPLE, BarStyle.SEGMENTED_20, new BarFlag[0]); + bossbar = MMOCore.plugin.version.getVersionWrapper().createBossBar(new NamespacedKey(MMOCore.plugin, "quest_bar_" + playerData.getUniqueId().toString()), "", BarColor.PURPLE, BarStyle.SEGMENTED_20, new BarFlag[0]); bossbar.addPlayer(playerData.getPlayer()); } diff --git a/src/main/java/net/Indyuce/mmocore/api/skill/TargetSkillResult.java b/src/main/java/net/Indyuce/mmocore/api/skill/TargetSkillResult.java index f749954e..882626b9 100644 --- a/src/main/java/net/Indyuce/mmocore/api/skill/TargetSkillResult.java +++ b/src/main/java/net/Indyuce/mmocore/api/skill/TargetSkillResult.java @@ -3,7 +3,7 @@ package net.Indyuce.mmocore.api.skill; import org.bukkit.entity.LivingEntity; import org.bukkit.util.RayTraceResult; -import net.Indyuce.mmocore.MMOCoreUtils; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill.SkillInfo; @@ -14,7 +14,7 @@ public class TargetSkillResult extends SkillResult { super(data, skill); if (isSuccessful()) { - RayTraceResult result = data.getPlayer().getWorld().rayTraceEntities(data.getPlayer().getEyeLocation(), data.getPlayer().getEyeLocation().getDirection(), range, (entity) -> MMOCoreUtils.canTarget(data.getPlayer(), entity)); + RayTraceResult result = MMOCore.plugin.version.getVersionWrapper().rayTraceEntities(data.getPlayer(), data.getPlayer().getEyeLocation().getDirection(), range); if (result == null) abort(CancelReason.OTHER); else diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/LootColor.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/LootColor.java index dbf8c02e..6d17feec 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/LootColor.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/LootColor.java @@ -27,6 +27,6 @@ public class LootColor extends BukkitRunnable { return; } - item.getWorld().spawnParticle(Particle.REDSTONE, item.getLocation(), 0, new Particle.DustOptions(color, 1.3f)); + MMOCore.plugin.version.getVersionWrapper().spawnParticle(Particle.REDSTONE, item.getLocation(), 1.3f, color); } } diff --git a/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java b/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java index 3fab89b3..b2d1ca86 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java +++ b/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java @@ -2,7 +2,6 @@ package net.Indyuce.mmocore.gui; import org.apache.commons.lang.Validate; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; @@ -22,6 +21,7 @@ import net.Indyuce.mmocore.gui.api.item.InventoryItem; import net.Indyuce.mmocore.gui.api.item.InventoryPlaceholderItem; import net.Indyuce.mmocore.gui.api.item.NoPlaceholderItem; import net.Indyuce.mmocore.gui.api.item.Placeholders; +import net.Indyuce.mmocore.version.VersionMaterial; public class PlayerStats extends EditableInventory { public PlayerStats() { @@ -262,7 +262,7 @@ public class PlayerStats extends EditableInventory { @Override public ItemStack display(GeneratedInventory inv, int n) { ItemStack item = super.display(inv, n); - if (item.getType() == Material.PLAYER_HEAD) { + if (item.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { SkullMeta meta = (SkullMeta) item.getItemMeta(); meta.setOwningPlayer(inv.getPlayer()); item.setItemMeta(meta); diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java index fd500aa3..a5e37d99 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java @@ -8,7 +8,6 @@ import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Particle; -import org.bukkit.Sound; import org.bukkit.entity.FishHook; import org.bukkit.entity.Item; import org.bukkit.entity.Player; @@ -28,6 +27,7 @@ import net.Indyuce.mmocore.api.event.CustomPlayerFishEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.manager.profession.FishingManager.FishingDropTable; +import net.Indyuce.mmocore.version.VersionSound; public class FishingListener implements Listener { private Set fishing = new HashSet<>(); @@ -116,7 +116,7 @@ public class FishingListener implements Listener { @EventHandler public void a(PlayerFishEvent event) { - if (event.getPlayer().equals(player) && (event.getState() == State.CAUGHT_FISH || event.getState() == State.FAILED_ATTEMPT || event.getState() == State.REEL_IN)) { + if (event.getPlayer().equals(player) && (event.getState() == State.CAUGHT_FISH || event.getState() == State.FAILED_ATTEMPT || (MMOCore.plugin.version.isStrictlyHigher(1, 12) ? event.getState() == State.valueOf("REEL_IN") : false))) { /* * lose the catch if the current fish is gone! @@ -169,7 +169,7 @@ public class FishingListener implements Listener { vec.setX(vec.getX() * .08); vec.setZ(vec.getZ() * .08); item.setVelocity(vec); - player.getWorld().playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 1, 0); + player.getWorld().playSound(player.getLocation(), VersionSound.BLOCK_NOTE_BLOCK_HAT.toSound(), 1, 0); for (int j = 0; j < 16; j++) location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location, 0, 4 * (random.nextDouble() - .5), 2, 4 * (random.nextDouble() - .5), .05); diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java b/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java index 2f84c689..5d6edb07 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java +++ b/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java @@ -4,7 +4,6 @@ import java.util.Random; import org.bukkit.Location; import org.bukkit.Particle; -import org.bukkit.block.data.Ageable; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -12,6 +11,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.event.CustomBlockMineEvent; import net.Indyuce.mmocore.api.math.particle.SmallParticleEffect; import net.Indyuce.mmocore.api.player.stats.StatType; @@ -39,11 +39,8 @@ public class PlayerCollectStats implements Listener { item.setAmount(item.getAmount() + a); } - if (event.getBlock().getBlockData() instanceof Ageable) { - Ageable ageable = (Ageable) event.getBlock().getBlockData(); - if (ageable.getAge() < ageable.getMaximumAge()) - return; - + if(MMOCore.plugin.version.getVersionWrapper().isCropFullyGrown(event.getBlock())) + { // drop more items if fortune enchant double l = event.getData().getStats().getStat(StatType.LUCK_OF_THE_FIELD); if (l > 0 && random.nextDouble() < l * .045) { diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java b/src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java index 69117c0b..9689ee84 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java +++ b/src/main/java/net/Indyuce/mmocore/listener/profession/Smelting.java @@ -12,7 +12,6 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.FurnaceSmeltEvent; -import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; @@ -34,9 +33,9 @@ public class Smelting implements Listener { public Smelting(ConfigurationSection config) { for (Iterator iterator = Bukkit.recipeIterator(); iterator.hasNext();) { - Recipe recipe = iterator.next(); - if (recipe instanceof FurnaceRecipe && vanillaKeys.contains(((FurnaceRecipe) recipe).getKey())) - iterator.remove(); + //Recipe recipe = iterator.next(); + //if (recipe instanceof FurnaceRecipe && vanillaKeys.contains(((FurnaceRecipe) recipe).getKey())) + // iterator.remove(); } Smelting.recipes.clear(); @@ -48,7 +47,7 @@ public class Smelting implements Listener { recipes.add(recipe); NamespacedKey vanillaKey = new NamespacedKey(MMOCore.plugin, "furnace_recipe_" + key.replace("-", "_").toLowerCase()); vanillaKeys.add(vanillaKey); - Bukkit.addRecipe(new FurnaceRecipe(vanillaKey, new ItemStack(Material.BARRIER), recipe.getIngredientMaterial(), 0, recipe.getCookingTime())); + Bukkit.addRecipe(MMOCore.plugin.version.getVersionWrapper().getFurnaceRecipe(vanillaKey, new ItemStack(Material.BARRIER), recipe.getIngredientMaterial(), 0, recipe.getCookingTime())); } } } diff --git a/src/main/java/net/Indyuce/mmocore/skill/Ambers.java b/src/main/java/net/Indyuce/mmocore/skill/Ambers.java index 52f0ea74..884fb8ef 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Ambers.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Ambers.java @@ -80,7 +80,7 @@ public class Ambers extends Skill implements Listener { for (int j = 0; j < 5; j++) loc.getWorld().spawnParticle(Particle.SPELL_MOB, loc, 0, 1, 0.647, 0, 1); - loc.getWorld().spawnParticle(Particle.REDSTONE, loc, 0, new Particle.DustOptions(Color.ORANGE, 1.3f)); + MMOCore.plugin.version.getVersionWrapper().spawnParticle(Particle.REDSTONE, loc, 1.3f, Color.ORANGE); } } } diff --git a/src/main/java/net/Indyuce/mmocore/skill/Control.java b/src/main/java/net/Indyuce/mmocore/skill/Control.java index 61e1794d..da308507 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Control.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Control.java @@ -1,7 +1,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.LivingEntity; @@ -20,11 +19,13 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.api.skill.TargetSkillResult; +import net.Indyuce.mmocore.version.VersionMaterial; +import net.Indyuce.mmocore.version.VersionSound; public class Control extends Skill { public Control() { super(); - setMaterial(Material.MAGENTA_DYE); + setMaterial(VersionMaterial.MAGENTA_DYE.toMaterial()); setLore("Your target is temporarily slowed for &8{duration} &7seconds.", "As soon as you left click, it gets", "pushed back where you are looking at.", "Knockback force: &f{knockback}%", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("cooldown", new LinearValue(18, -.3, 10, 20)); @@ -79,7 +80,7 @@ public class Control extends Skill { entity.removePotionEffect(PotionEffectType.SLOW); entity.getWorld().spawnParticle(Particle.SPELL_WITCH, entity.getLocation().add(0, entity.getHeight() / 2, 0), 16); - entity.getWorld().playSound(entity.getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2, 1); + entity.getWorld().playSound(entity.getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 2, 1); close(); } } diff --git a/src/main/java/net/Indyuce/mmocore/skill/Deep_Wound.java b/src/main/java/net/Indyuce/mmocore/skill/Deep_Wound.java index 43ac8901..f35f1449 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Deep_Wound.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Deep_Wound.java @@ -5,6 +5,7 @@ import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.attribute.Attribute; import org.bukkit.entity.LivingEntity; +import org.bukkit.inventory.ItemStack; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.math.formula.LinearValue; @@ -35,7 +36,7 @@ public class Deep_Wound extends Skill { LivingEntity target = cast.getTarget(); target.getWorld().playSound(target.getLocation(), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 2, 2); target.getWorld().spawnParticle(Particle.CRIT, target.getLocation().add(0, target.getHeight() / 2, 0), 32, 0, 0, 0, .7); - target.getWorld().spawnParticle(Particle.BLOCK_CRACK, target.getLocation().add(0, target.getHeight() / 2, 0), 32, 0, 0, 0, 2, Material.REDSTONE_BLOCK.createBlockData()); + target.getWorld().spawnParticle(Particle.BLOCK_CRACK, target.getLocation().add(0, target.getHeight() / 2, 0), 32, 0, 0, 0, 2, new ItemStack(Material.REDSTONE_BLOCK)); double max = target.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(); double ratio = (max - target.getHealth()) / max; diff --git a/src/main/java/net/Indyuce/mmocore/skill/Empowered_Attack.java b/src/main/java/net/Indyuce/mmocore/skill/Empowered_Attack.java index 95cc0b20..985865d3 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Empowered_Attack.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Empowered_Attack.java @@ -2,7 +2,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.Entity; @@ -20,13 +19,15 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo.DamageType; +import net.Indyuce.mmocore.version.VersionMaterial; +import net.Indyuce.mmocore.version.VersionSound; public class Empowered_Attack extends Skill { private static final double perb = 5; public Empowered_Attack() { super(); - setMaterial(Material.BONE_MEAL); + setMaterial(VersionMaterial.BONE_MEAL.toMaterial()); setLore("You charge your weapon with lightning.", "Your next attack deals &f{extra}% &7extra damage", "and spreads to enemies within &f{radius} &7blocks", "for &f{ratio}% &7of the initial damage.", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("cooldown", new LinearValue(10, -.2, 5, 10)); @@ -94,7 +95,7 @@ public class Empowered_Attack extends Skill { drawVector(clone, loc.clone().subtract(clone).toVector()); } - target.getWorld().playSound(target.getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2, .5f); + target.getWorld().playSound(target.getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 2, .5f); target.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, target.getLocation().add(0, target.getHeight() / 2, 0), 32, 0, 0, 0, .2); double sweep = event.getDamage() * r; diff --git a/src/main/java/net/Indyuce/mmocore/skill/Evade.java b/src/main/java/net/Indyuce/mmocore/skill/Evade.java index d661fa73..149d0aea 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Evade.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Evade.java @@ -3,7 +3,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Particle; -import org.bukkit.Sound; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -17,6 +16,7 @@ import net.Indyuce.mmocore.api.math.particle.SmallParticleEffect; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; +import net.Indyuce.mmocore.version.VersionSound; public class Evade extends Skill { public Evade() { @@ -35,7 +35,7 @@ public class Evade extends Skill { if (!cast.isSuccessful()) return cast; - data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1, 2); + data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 1, 2); new SmallParticleEffect(data.getPlayer(), Particle.CLOUD); new EvadeSkill(data, cast.getModifier("duration")); return cast; diff --git a/src/main/java/net/Indyuce/mmocore/skill/Fire_Rage.java b/src/main/java/net/Indyuce/mmocore/skill/Fire_Rage.java index 4949539f..ca043462 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Fire_Rage.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Fire_Rage.java @@ -2,7 +2,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.Entity; @@ -24,11 +23,13 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo.DamageType; +import net.Indyuce.mmocore.version.VersionMaterial; +import net.Indyuce.mmocore.version.VersionSound; public class Fire_Rage extends Skill { public Fire_Rage() { super(); - setMaterial(Material.FIRE_CHARGE); + setMaterial(VersionMaterial.FIRE_CHARGE.toMaterial()); setLore("For {duration} seconds, you slow down and are able", "to cast up to {count} fireballs by left clicking.", "", "Fireballs deal &c{damage} &7damage upon contact", "and ignite your target for &c{ignite} &7seconds.", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("duration", new LinearValue(8, 0)); @@ -110,7 +111,7 @@ public class Fire_Rage extends Skill { data.getPlayer().removePotionEffect(PotionEffectType.SLOW); } - data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1, last ? 0 : 1); + data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 1, last ? 0 : 1); new BukkitRunnable() { int j = 0; Vector vec = data.getPlayer().getEyeLocation().getDirection(); @@ -126,9 +127,9 @@ public class Fire_Rage extends Skill { loc.getWorld().playSound(loc, Sound.BLOCK_FIRE_AMBIENT, 2, 1); loc.getWorld().spawnParticle(Particle.FLAME, loc, 4, .1, .1, .1, 0); loc.getWorld().spawnParticle(Particle.LAVA, loc, 0); - + for (Entity target : MMOCoreUtils.getNearbyChunkEntities(loc)) - if (target.getBoundingBox().expand(.2, .2, .2).contains(loc.toVector()) && MMOCoreUtils.canTarget(data.getPlayer(), target)) { + if (MMOCore.plugin.nms.getBoundingBox(target).expand(.2, .2, .2).contains(loc.toVector()) && MMOCoreUtils.canTarget(data.getPlayer(), target)) { loc.getWorld().spawnParticle(Particle.LAVA, loc, 8); loc.getWorld().spawnParticle(Particle.FLAME, loc, 32, 0, 0, 0, .1); loc.getWorld().playSound(loc, Sound.ENTITY_BLAZE_HURT, 2, 1); diff --git a/src/main/java/net/Indyuce/mmocore/skill/Fire_Storm.java b/src/main/java/net/Indyuce/mmocore/skill/Fire_Storm.java index cb70a29c..cce4ee0f 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Fire_Storm.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Fire_Storm.java @@ -16,6 +16,7 @@ import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.api.skill.TargetSkillResult; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo.DamageType; +import net.Indyuce.mmocore.version.VersionSound; public class Fire_Storm extends Skill { public Fire_Storm() { @@ -40,7 +41,7 @@ public class Fire_Storm extends Skill { double damage = cast.getModifier("damage"); int ignite = (int) (20 * cast.getModifier("ignite")); - data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1, 1); + data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 1, 1); new BukkitRunnable() { int j = 0; @@ -55,7 +56,7 @@ public class Fire_Storm extends Skill { data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), Sound.BLOCK_FIRE_AMBIENT, 1, 1); new ParabolicProjectile(data.getPlayer().getLocation().add(0, 1, 0), target.getLocation().add(0, target.getHeight() / 2, 0), randomVector(data.getPlayer()), () -> { - target.getWorld().playSound(target.getLocation(), Sound.ENTITY_FIREWORK_ROCKET_TWINKLE, 1, 2); + target.getWorld().playSound(target.getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_TWINKLE.toSound(), 1, 2); target.getWorld().spawnParticle(Particle.SMOKE_NORMAL, target.getLocation().add(0, target.getHeight() / 2, 0), 8, 0, 0, 0, .15); MMOCore.plugin.damage.damage(data, target, damage, DamageType.SKILL, DamageType.PROJECTILE, DamageType.MAGICAL); target.setFireTicks(ignite); diff --git a/src/main/java/net/Indyuce/mmocore/skill/Fireball.java b/src/main/java/net/Indyuce/mmocore/skill/Fireball.java index 3cf6f5fd..f8d9bb16 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Fireball.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Fireball.java @@ -1,7 +1,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.Entity; @@ -16,11 +15,13 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo.DamageType; +import net.Indyuce.mmocore.version.VersionMaterial; +import net.Indyuce.mmocore.version.VersionSound; public class Fireball extends Skill { public Fireball() { super(); - setMaterial(Material.FIRE_CHARGE); + setMaterial(VersionMaterial.FIRE_CHARGE.toMaterial()); setLore("Casts a deadly fireball onto your", "target, dealing &c{damage} &7damage upon contact", "and igniting it for &c{ignite} &7seconds.", "", "Shatters into 3 blazing hot shards which stick", "to walls and explode 3 seconds later, dealing", "33% of the initial spell damage.", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("mana", new LinearValue(15, 1)); @@ -35,7 +36,7 @@ public class Fireball extends Skill { if (!cast.isSuccessful()) return cast; - data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1, 1); + data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 1, 1); new BukkitRunnable() { int j = 0; Vector vec = data.getPlayer().getEyeLocation().getDirection(); @@ -58,7 +59,7 @@ public class Fireball extends Skill { // loc.getWorld().spawnParticle(Particle.LAVA, loc, 0); for (Entity target : MMOCoreUtils.getNearbyChunkEntities(loc)) - if (target.getBoundingBox().expand(.2, .2, .2).contains(loc.toVector()) && MMOCoreUtils.canTarget(data.getPlayer(), target)) { + if (MMOCore.plugin.nms.getBoundingBox(target).expand(.2, .2, .2).contains(loc.toVector()) && MMOCoreUtils.canTarget(data.getPlayer(), target)) { loc.getWorld().spawnParticle(Particle.LAVA, loc, 8); loc.getWorld().spawnParticle(Particle.FLAME, loc, 32, 0, 0, 0, .1); loc.getWorld().playSound(loc, Sound.ENTITY_BLAZE_HURT, 2, 1); diff --git a/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java b/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java index a3dd0496..64178e44 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java @@ -1,7 +1,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.attribute.Attribute; @@ -18,11 +17,12 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.api.skill.TargetSkillResult; +import net.Indyuce.mmocore.version.VersionMaterial; public class Human_Shield extends Skill { public Human_Shield() { super(); - setMaterial(Material.TOTEM_OF_UNDYING); + setMaterial(VersionMaterial.TOTEM_OF_UNDYING.toMaterial()); setLore("Casts a protection charm onto target ally,", "reducing damage taken by &a{reduction}%&7.", "&a{redirect}% &7of this damage is redirected to you.", "Charm is cancelled when reaching &c{low}%&7 health.", "Lasts &a{duration} &7seconds.", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("cooldown", new LinearValue(18, -.3, 14, 18)); diff --git a/src/main/java/net/Indyuce/mmocore/skill/Ice_Spikes.java b/src/main/java/net/Indyuce/mmocore/skill/Ice_Spikes.java index 193dbc91..3c608372 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Ice_Spikes.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Ice_Spikes.java @@ -1,7 +1,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.Entity; @@ -20,6 +19,7 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo.DamageType; +import net.Indyuce.mmocore.version.VersionMaterial; public class Ice_Spikes extends Skill { @@ -27,7 +27,7 @@ public class Ice_Spikes extends Skill { public Ice_Spikes() { super(); - setMaterial(Material.SNOWBALL); + setMaterial(VersionMaterial.SNOWBALL.toMaterial()); setLore("Ice spikes summon from the ground", "and shatters, each dealing &9{damage} &7damage", "to hit enemies and slowing them down", "for &9{slow} &7seconds.", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("cooldown", new LinearValue(6, -.1, 2, 6)); @@ -84,7 +84,7 @@ public class Ice_Spikes extends Skill { public IceSpikesCast(PlayerData data, SkillInfo skill) { super(data, skill); - if (isSuccessful() && (loc = data.getPlayer().rayTraceBlocks(30)) == null) + if (isSuccessful() && (loc = MMOCore.plugin.version.getVersionWrapper().rayTrace(data.getPlayer(), 30)) == null) abort(); } } diff --git a/src/main/java/net/Indyuce/mmocore/skill/Power_Mark.java b/src/main/java/net/Indyuce/mmocore/skill/Power_Mark.java index 6d82a2ed..0c04f3f5 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Power_Mark.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Power_Mark.java @@ -3,7 +3,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.Entity; @@ -26,11 +25,13 @@ import net.Indyuce.mmocore.api.player.stats.TemporaryStats; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo.DamageType; +import net.Indyuce.mmocore.version.VersionMaterial; +import net.Indyuce.mmocore.version.VersionSound; public class Power_Mark extends Skill implements Listener { public Power_Mark() { super(); - setMaterial(Material.WITHER_SKELETON_SKULL); + setMaterial(VersionMaterial.WITHER_SKELETON_SKULL.toMaterial()); setLore("Attacking an enemy applies a deadly", "magical mark which spreads accross the", "ground. This mark accumulates &6{ratio}%", "of the damage dealt to the initial", "target over &6{duration} &7seconds.", "", "After this duration, the mark bursts, dealing", "accumulated damage to nearby enemies and", "stunning them for &6{stun}+ &7seconds.", "", "The more damage, the longer the stun.", "", "&e{cooldown}s Cooldown"); setPassive(); @@ -122,7 +123,7 @@ public class Power_Mark extends Skill implements Listener { } if (j % 2 == 0 && j > 20 * (duration - 2)) - loc.getWorld().playSound(loc, Sound.BLOCK_NOTE_BLOCK_PLING, 1, (float) (1 + (j - 20 * (duration - 2)) / 40)); + loc.getWorld().playSound(loc, VersionSound.BLOCK_NOTE_BLOCK_PLING.toSound(), 1, (float) (1 + (j - 20 * (duration - 2)) / 40)); double a = (double) j / 16; double r = Math.sqrt(Math.min(duration * 2 - (double) j / 10, 4)) * 2; diff --git a/src/main/java/net/Indyuce/mmocore/skill/Telekinesy.java b/src/main/java/net/Indyuce/mmocore/skill/Telekinesy.java index e36d6336..745bb127 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Telekinesy.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Telekinesy.java @@ -2,7 +2,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.entity.Entity; @@ -19,11 +18,13 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.api.skill.TargetSkillResult; +import net.Indyuce.mmocore.version.VersionMaterial; +import net.Indyuce.mmocore.version.VersionSound; public class Telekinesy extends Skill { public Telekinesy() { super(); - setMaterial(Material.MAGENTA_DYE); + setMaterial(VersionMaterial.MAGENTA_DYE.toMaterial()); setLore("You take the control over your target", "for &9{duration} &7seconds. Left click to throw him.", "Knockback force: &f{knockback}%", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("cooldown", new LinearValue(20, -.3, 10, 20)); @@ -68,7 +69,7 @@ public class Telekinesy extends Skill { public void a(PlayerInteractEvent event) { if (event.getPlayer().equals(data.getPlayer()) && event.getAction().name().contains("LEFT_CLICK")) { entity.setVelocity(data.getPlayer().getEyeLocation().getDirection().multiply(1.5 * f)); - entity.getWorld().playSound(entity.getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2, 1); + entity.getWorld().playSound(entity.getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 2, 1); entity.getWorld().spawnParticle(Particle.SPELL_WITCH, entity.getLocation().add(0, entity.getHeight() / 2, 0), 16); close(); } diff --git a/src/main/java/net/Indyuce/mmocore/skill/Warp.java b/src/main/java/net/Indyuce/mmocore/skill/Warp.java index cf8b33ec..66e5ce25 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Warp.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Warp.java @@ -11,6 +11,7 @@ import net.Indyuce.mmocore.api.math.particle.ParabolicProjectile; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; +import net.Indyuce.mmocore.version.VersionSound; public class Warp extends Skill { public Warp() { @@ -40,7 +41,7 @@ public class Warp extends Skill { data.getPlayer().teleport(loc); data.getPlayer().getWorld().spawnParticle(Particle.EXPLOSION_LARGE, data.getPlayer().getLocation().add(0, 1, 0), 0); data.getPlayer().getWorld().spawnParticle(Particle.SPELL_INSTANT, data.getPlayer().getLocation().add(0, 1, 0), 32, 0, 0, 0, .1); - data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1, 1); + data.getPlayer().getWorld().playSound(data.getPlayer().getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 1, 1); } }, 2, Particle.SPELL_INSTANT); return cast; diff --git a/src/main/java/net/Indyuce/mmocore/skill/Weaken.java b/src/main/java/net/Indyuce/mmocore/skill/Weaken.java index a521334b..fe3a36b3 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Weaken.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Weaken.java @@ -1,7 +1,6 @@ package net.Indyuce.mmocore.skill; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -19,11 +18,12 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.skill.Skill; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.api.skill.TargetSkillResult; +import net.Indyuce.mmocore.version.VersionMaterial; public class Weaken extends Skill { public Weaken() { super(); - setMaterial(Material.MAGENTA_DYE); + setMaterial(VersionMaterial.MAGENTA_DYE.toMaterial()); setLore("The target is weakened for", "&8{duration} &7seconds and is dealt", "&7extra &8{ratio}% &7damage.", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"); addModifier("cooldown", new LinearValue(20, -.1, 5, 20)); diff --git a/src/main/java/net/Indyuce/mmocore/version/ServerVersion.java b/src/main/java/net/Indyuce/mmocore/version/ServerVersion.java index 0daed96e..953ff38e 100644 --- a/src/main/java/net/Indyuce/mmocore/version/ServerVersion.java +++ b/src/main/java/net/Indyuce/mmocore/version/ServerVersion.java @@ -3,17 +3,22 @@ package net.Indyuce.mmocore.version; import net.Indyuce.mmocore.version.texture.CustomModelDataHandler; import net.Indyuce.mmocore.version.texture.TextureByDurabilityHandler; import net.Indyuce.mmocore.version.texture.TextureHandler; +import net.Indyuce.mmocore.version.wrapper.DefaultVersionWrapper; +import net.Indyuce.mmocore.version.wrapper.LegacyVersionWrapper; +import net.Indyuce.mmocore.version.wrapper.VersionWrapper; public class ServerVersion { private final String version; private final int[] integers; private final TextureHandler textureHandler; + private final VersionWrapper versionWrapper; public ServerVersion(Class clazz) { this.version = clazz.getPackage().getName().replace(".", ",").split(",")[3]; String[] split = version.substring(1).split("\\_"); this.integers = new int[] { Integer.parseInt(split[0]), Integer.parseInt(split[1]) }; + versionWrapper = isBelowOrEqual(1, 12) ? new LegacyVersionWrapper() : new DefaultVersionWrapper(); textureHandler = isBelowOrEqual(1, 13) ? new TextureByDurabilityHandler() : new CustomModelDataHandler(); } @@ -42,6 +47,10 @@ public class ServerVersion { return textureHandler; } + public VersionWrapper getVersionWrapper() { + return versionWrapper; + } + @Override public String toString() { return version; diff --git a/src/main/java/net/Indyuce/mmocore/version/VersionMaterial.java b/src/main/java/net/Indyuce/mmocore/version/VersionMaterial.java new file mode 100644 index 00000000..3bdd48d0 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/version/VersionMaterial.java @@ -0,0 +1,85 @@ +package net.Indyuce.mmocore.version; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import net.Indyuce.mmocore.MMOCore; + +public enum VersionMaterial { + + /* + * the enum object name corresponds to the 1.14 material name. the first + * argument corresponds to the 1.13 name. second argument corresponds to + * legacy, third is DURABILITY if needed only. + */ + + OAK_SIGN("SIGN", "SIGN"), + LAPIS_LAZULI("LAPIS_LAZULI", "INK_SACK", 4), + LIME_DYE("LIME_DYE", "INK_SACK", 5), + LIGHT_GRAY_DYE("LIGHT_GRAY_DYE", "INK_SACK", 7), + GRAY_DYE("GRAY_DYE", "INK_SACK", 8), + LIGHT_BLUE_DYE("LIGHT_BLUE_DYE", "INK_SACK", 12), + RED_DYE("ROSE_RED", "INK_SACK", 14), + BONE_MEAL("BONE_MEAL", "INK_SACK", 18), + MAGENTA_DYE("MAGENTA_DYE", "INK_SACK", 13), + GRAY_STAINED_GLASS_PANE("GRAY_STAINED_GLASS_PANE", "STAINED_GLASS_PANE", 7), + RED_STAINED_GLASS_PANE("RED_STAINED_GLASS_PANE", "STAINED_GLASS_PANE", 14), + GREEN_STAINED_GLASS_PANE("GREEN_STAINED_GLASS_PANE", "STAINED_GLASS_PANE", 13), + LIME_STAINED_GLASS("LIME_STAINED_GLASS", "STAINED_GLASS", 5), + PINK_STAINED_GLASS("PINK_STAINED_GLASS", "STAINED_GLASS", 6), + PLAYER_HEAD("PLAYER_HEAD", "SKULL_ITEM", 3), + SKELETON_SKULL("SKELETON_SKULL", "SKULL_ITEM"), + WITHER_SKELETON_SKULL("WITHER_SKELETON_SKULL", "SKULL_ITEM", 1), + NETHER_WART("NETHER_WART", "NETHER_STALK"), + WRITABLE_BOOK("WRITABLE_BOOK", "BOOK_AND_QUILL"), + CRAFTING_TABLE("CRAFTING_TABLE", "WORKBENCH"), + SNOWBALL("SNOWBALL", "SNOW_BALL"), + LILY_PAD("LILY_PAD", "WATER_LILY"), + GUNPOWDER("GUNPOWDER", "SULPHUR"), + OAK_SAPLING("OAK_SAPLING", "SAPLING"), + COMPARATOR("COMPARATOR", "REDSTONE_COMPARATOR"), + EXPERIENCE_BOTTLE("EXPERIENCE_BOTTLE", "EXP_BOTTLE"), + IRON_HORSE_ARMOR("IRON_HORSE_ARMOR", "IRON_BARDING"), + MUSIC_DISC_MALL("MUSIC_DISC_MALL", "RECORD_8"), + COBBLESTONE_WALL("COBBLESTONE_WALL", "COBBLE_WALL"), + ENDER_EYE("ENDER_EYE", "EYE_OF_ENDER"), + GRASS_BLOCK("GRASS_BLOCK", "GRASS"), + ENCHANTING_TABLE("ENCHANTING_TABLE", "ENCHANTMENT_TABLE"), + PORKCHOP("PORKCHOP", "PORK"), + GOLDEN_CHESTPLATE("GOLDEN_CHESTPLATE", "GOLD_CHESTPLATE"), + GOLDEN_HORSE_ARMOR("GOLDEN_HORSE_ARMOR", "GOLD_BARDING"), + COMMAND_BLOCK_MINECART("COMMAND_BLOCK_MINECART", "COMMAND_MINECART"), + OAK_PLANKS("OAK_PLANKS", "WOOD"), + CAULDRON("CAULDRON", "CAULDRON_ITEM"), + FIRE_CHARGE("FIRE_CHARGE", "FIREBALL"), + TOTEM_OF_UNDYING("TOTEM_OF_UNDYING", "SHIELD"), + + ; + + private Material material; + private ItemStack item; + + private VersionMaterial(String name_1_13, String legacy) { + material = Material.valueOf(MMOCore.plugin.version.isStrictlyHigher(1, 13) ? name() : MMOCore.plugin.version.isStrictlyHigher(1, 12) ? name_1_13 : legacy); + } + + @SuppressWarnings("deprecation") + private VersionMaterial(String name_1_13, String legacy, int legacyDurability) { + if (MMOCore.plugin.version.isStrictlyHigher(1, 12)) + material = Material.valueOf(MMOCore.plugin.version.isStrictlyHigher(1, 13) ? name() : name_1_13); + else + item = new ItemStack(material = Material.valueOf(legacy), 1, (short) legacyDurability); + } + + public Material toMaterial() { + return material; + } + + public boolean hasItem() { + return item != null; + } + + public ItemStack toItem() { + return hasItem() ? item.clone() : new ItemStack(material); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/version/VersionSound.java b/src/main/java/net/Indyuce/mmocore/version/VersionSound.java new file mode 100644 index 00000000..241d55cc --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/version/VersionSound.java @@ -0,0 +1,33 @@ +package net.Indyuce.mmocore.version; + +import org.bukkit.Sound; + +import net.Indyuce.mmocore.MMOCore; + +public enum VersionSound { + ENTITY_ENDERMAN_HURT("ENTITY_ENDERMEN_HURT"), + ENTITY_ENDERMAN_DEATH("ENTITY_ENDERMEN_DEATH"), + ENTITY_ENDERMAN_TELEPORT("ENTITY_ENDERMEN_TELEPORT"), + ENTITY_FIREWORK_ROCKET_LARGE_BLAST("ENTITY_FIREWORK_LARGE_BLAST"), + ENTITY_FIREWORK_ROCKET_TWINKLE("ENTITY_FIREWORK_TWINKLE"), + ENTITY_FIREWORK_ROCKET_BLAST("ENTITY_FIREWORK_BLAST"), + ENTITY_ZOMBIE_PIGMAN_ANGRY("ENTITY_ZOMBIE_PIG_ANGRY"), + BLOCK_NOTE_BLOCK_HAT("BLOCK_NOTE_HAT"), + BLOCK_NOTE_BLOCK_PLING("BLOCK_NOTE_PLING"), + BLOCK_NOTE_BLOCK_BELL("BLOCK_NOTE_BELL"), + ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR("ENTITY_ZOMBIE_ATTACK_DOOR_WOOD"), + ENTITY_ENDER_DRAGON_GROWL("ENTITY_ENDERDRAGON_GROWL"), + ENTITY_ENDER_DRAGON_FLAP("ENTITY_ENDERDRAGON_FLAP"), + + ; + + private final Sound sound; + + private VersionSound(String legacy) { + sound = Sound.valueOf(MMOCore.plugin.version.isStrictlyHigher(1, 12) ? name() : legacy); + } + + public Sound toSound() { + return sound; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler.java b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler.java index d9b242ce..fa104012 100644 --- a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler.java +++ b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler.java @@ -1,8 +1,10 @@ package net.Indyuce.mmocore.version.nms; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.BoundingBox; import net.Indyuce.mmocore.api.item.NBTItem; @@ -34,4 +36,6 @@ public interface NMSHandler { Inventory toBukkitInventory(Object container); Object newContainerAnvil(Player player); + + BoundingBox getBoundingBox(Entity target); } diff --git a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_12_R1.java b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_12_R1.java new file mode 100644 index 00000000..88246db7 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_12_R1.java @@ -0,0 +1,185 @@ +package net.Indyuce.mmocore.version.nms; + +import java.util.Set; + +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory; +import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.util.BoundingBox; + +import net.Indyuce.mmocore.api.item.NBTItem; +import net.minecraft.server.v1_12_R1.AxisAlignedBB; +import net.minecraft.server.v1_12_R1.BlockPosition; +import net.minecraft.server.v1_12_R1.Blocks; +import net.minecraft.server.v1_12_R1.ChatMessage; +import net.minecraft.server.v1_12_R1.ChatMessageType; +import net.minecraft.server.v1_12_R1.Container; +import net.minecraft.server.v1_12_R1.ContainerAnvil; +import net.minecraft.server.v1_12_R1.Entity; +import net.minecraft.server.v1_12_R1.EntityHuman; +import net.minecraft.server.v1_12_R1.IChatBaseComponent.ChatSerializer; +import net.minecraft.server.v1_12_R1.ItemStack; +import net.minecraft.server.v1_12_R1.NBTTagCompound; +import net.minecraft.server.v1_12_R1.PacketPlayOutChat; +import net.minecraft.server.v1_12_R1.PacketPlayOutCloseWindow; +import net.minecraft.server.v1_12_R1.PacketPlayOutOpenWindow; +import net.minecraft.server.v1_12_R1.PacketPlayOutTitle; +import net.minecraft.server.v1_12_R1.PacketPlayOutTitle.EnumTitleAction; + +public class NMSHandler_1_12_R1 implements NMSHandler { + @Override + public void sendJson(Player player, String message) { + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(message))); + } + + @Override + public void sendTitle(Player player, String msgTitle, String msgSubTitle, int fadeIn, int ticks, int fadeOut) { + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutTitle(EnumTitleAction.TITLE, ChatSerializer.a("{\"text\": \"" + msgTitle + "\"}"))); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutTitle(EnumTitleAction.SUBTITLE, ChatSerializer.a("{\"text\": \"" + msgSubTitle + "\"}"))); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutTitle(EnumTitleAction.TIMES, null, fadeIn, ticks, fadeOut)); + } + + @Override + public void sendActionBar(Player player, String message) { + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a("{\"text\": \"" + message + "\"}"), ChatMessageType.GAME_INFO)); + } + + @Override + public int getNextContainerId(Player player) { + return ((CraftPlayer) player).getHandle().nextContainerCounter(); + } + + @Override + public void handleInventoryCloseEvent(Player player) { + CraftEventFactory.handleInventoryCloseEvent(((CraftPlayer) player).getHandle()); + } + + @Override + public void sendPacketOpenWindow(Player player, int containerId) { + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutOpenWindow(containerId, "minecraft:anvil", new ChatMessage(Blocks.ANVIL.a() + ".name"))); + } + + @Override + public void sendPacketCloseWindow(Player player, int containerId) { + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutCloseWindow(containerId)); + } + + @Override + public void setActiveContainerDefault(Player player) { + ((CraftPlayer) player).getHandle().activeContainer = ((CraftPlayer) player).getHandle().defaultContainer; + } + + @Override + public void setActiveContainer(Player player, Object container) { + ((CraftPlayer) player).getHandle().activeContainer = (Container) container; + } + + @Override + public void setActiveContainerId(Object container, int containerId) { + ((Container) container).windowId = containerId; + } + + @Override + public void addActiveContainerSlotListener(Object container, Player player) { + ((Container) container).addSlotListener(((CraftPlayer) player).getHandle()); + } + + @Override + public Inventory toBukkitInventory(Object container) { + return ((Container) container).getBukkitView().getTopInventory(); + } + + @Override + public Object newContainerAnvil(Player player) { + return new AnvilContainer(((CraftPlayer) player).getHandle()); + } + + private class AnvilContainer extends ContainerAnvil { + public AnvilContainer(EntityHuman entityhuman) { + super(entityhuman.inventory, entityhuman.world, new BlockPosition(0, 0, 0), entityhuman); + this.checkReachable = false; + } + } + + @Override + public NBTItem getNBTItem(org.bukkit.inventory.ItemStack item) { + return new NBTItem_v1_13_1(item); + } + + public class NBTItem_v1_13_1 extends NBTItem { + private final ItemStack nms; + private final NBTTagCompound compound; + + public NBTItem_v1_13_1(org.bukkit.inventory.ItemStack item) { + super(item); + nms = CraftItemStack.asNMSCopy(item); + compound = nms.hasTag() ? nms.getTag() : new NBTTagCompound(); + } + + @Override + public String getString(String path) { + return compound.getString(path); + } + + @Override + public boolean has(String path) { + return compound.hasKey(path); + } + + @Override + public boolean getBoolean(String path) { + return compound.getBoolean(path); + } + + @Override + public double getDouble(String path) { + return compound.getDouble(path); + } + + @Override + public int getInt(String path) { + return compound.getInt(path); + } + + @Override + public NBTItem add(ItemTag... tags) { + for (ItemTag tag : tags) { + if (tag.getValue() instanceof Boolean) + compound.setBoolean(tag.getPath(), (boolean) tag.getValue()); + else if (tag.getValue() instanceof Double) + compound.setDouble(tag.getPath(), (double) tag.getValue()); + else if (tag.getValue() instanceof String) + compound.setString(tag.getPath(), (String) tag.getValue()); + else if (tag.getValue() instanceof Integer) + compound.setInt(tag.getPath(), (int) tag.getValue()); + } + return this; + } + + @Override + public NBTItem remove(String... paths) { + for (String path : paths) + compound.remove(path); + return this; + } + + @Override + public Set getTags() { + return compound.c(); + } + + @Override + public org.bukkit.inventory.ItemStack toItem() { + nms.setTag(compound); + return CraftItemStack.asBukkitCopy(nms); + } + } + + @Override + public BoundingBox getBoundingBox(org.bukkit.entity.Entity target) { + AxisAlignedBB aabb = ((Entity) target).getBoundingBox(); + return new BoundingBox(aabb.a, aabb.b, aabb.c, aabb.d, aabb.e, aabb.f); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R1.java b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R1.java index fd671dab..4aaf6753 100644 --- a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R1.java +++ b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R1.java @@ -5,8 +5,10 @@ import java.util.Set; import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_13_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftItemStack; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.bukkit.util.BoundingBox; import net.Indyuce.mmocore.api.item.NBTItem; import net.minecraft.server.v1_13_R1.BlockPosition; @@ -173,4 +175,9 @@ public class NMSHandler_1_13_R1 implements NMSHandler { return CraftItemStack.asBukkitCopy(nms); } } + + @Override + public BoundingBox getBoundingBox(Entity target) { + return target.getBoundingBox(); + } } diff --git a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R2.java b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R2.java index 74dc7c1c..884b3fde 100644 --- a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R2.java +++ b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_13_R2.java @@ -5,8 +5,10 @@ import java.util.Set; import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_13_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.bukkit.util.BoundingBox; import net.Indyuce.mmocore.api.item.NBTItem; import net.minecraft.server.v1_13_R2.BlockPosition; @@ -174,4 +176,9 @@ public class NMSHandler_1_13_R2 implements NMSHandler { return CraftItemStack.asBukkitCopy(nms); } } + + @Override + public BoundingBox getBoundingBox(Entity target) { + return target.getBoundingBox(); + } } diff --git a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_14_R1.java b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_14_R1.java index 77aeca92..ef8e11a2 100644 --- a/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_14_R1.java +++ b/src/main/java/net/Indyuce/mmocore/version/nms/NMSHandler_1_14_R1.java @@ -8,8 +8,10 @@ import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.bukkit.util.BoundingBox; import net.Indyuce.mmocore.api.item.NBTItem; import net.minecraft.server.v1_14_R1.BlockPosition; @@ -197,4 +199,9 @@ public class NMSHandler_1_14_R1 implements NMSHandler { return CraftItemStack.asBukkitCopy(nms); } } + + @Override + public BoundingBox getBoundingBox(Entity target) { + return target.getBoundingBox(); + } } diff --git a/src/main/java/net/Indyuce/mmocore/version/wrapper/DefaultVersionWrapper.java b/src/main/java/net/Indyuce/mmocore/version/wrapper/DefaultVersionWrapper.java new file mode 100644 index 00000000..f0625313 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/version/wrapper/DefaultVersionWrapper.java @@ -0,0 +1,68 @@ +package net.Indyuce.mmocore.version.wrapper; + +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.FurnaceRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; + +import net.Indyuce.mmocore.MMOCoreUtils; + +public class DefaultVersionWrapper implements VersionWrapper { + + @Override + public void spawnParticle(Particle particle, Location loc, int amount, double x, double y, double z, double speed, float size, Color color) { + loc.getWorld().spawnParticle(particle, loc, amount, x, y, z, speed, new Particle.DustOptions(color, size)); + } + + @Override + public void spawnParticle(Particle particle, Location loc, int amount, double x, double y, double z, double speed, Material material) { + loc.getWorld().spawnParticle(particle, loc, amount, x, y, z, 0, material.createBlockData()); + } + + @Override + public Enchantment getEnchantmentFromString(String s) { + return Enchantment.getByKey(NamespacedKey.minecraft(s)); + } + + @Override + public FurnaceRecipe getFurnaceRecipe(NamespacedKey key, ItemStack item, Material material, float exp, int cook) { + return new FurnaceRecipe(key, item, material, exp, cook); + } + + @Override + public RayTraceResult rayTraceEntities(Player player, Vector direction, double range) { + return player.getWorld().rayTraceEntities(player.getEyeLocation(), direction, range, (entity) -> MMOCoreUtils.canTarget(player, entity)); + } + + @Override + public RayTraceResult rayTrace(Player player, Vector direction, double range) { + return player.rayTraceBlocks(range); + } + + @Override + public BossBar createBossBar(NamespacedKey key, String title, BarColor color, BarStyle style, BarFlag... flags) { + return Bukkit.createBossBar(key, title, color, style, flags); + } + + @Override + public boolean isCropFullyGrown(Block block) { + if (block.getBlockData() instanceof Ageable) { + Ageable ageable = (Ageable) block.getBlockData(); + return ageable.getAge() == ageable.getMaximumAge(); + } return false; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/version/wrapper/LegacyVersionWrapper.java b/src/main/java/net/Indyuce/mmocore/version/wrapper/LegacyVersionWrapper.java new file mode 100644 index 00000000..3d94cf58 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/version/wrapper/LegacyVersionWrapper.java @@ -0,0 +1,224 @@ +package net.Indyuce.mmocore.version.wrapper; + +import java.lang.reflect.InvocationTargetException; + +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.CropState; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.FurnaceRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Crops; +import org.bukkit.material.MaterialData; +import org.bukkit.util.BlockIterator; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; + +import net.Indyuce.mmocore.MMOCoreUtils; +import net.minecraft.server.v1_12_R1.AxisAlignedBB; +import net.minecraft.server.v1_12_R1.MovingObjectPosition; +import net.minecraft.server.v1_12_R1.Vec3D; + +@SuppressWarnings("deprecation") +public class LegacyVersionWrapper implements VersionWrapper { + + @Override + public void spawnParticle(Particle particle, Location loc, int amount, double x, double y, double z, double speed, float size, Color color) { + loc.getWorld().spawnParticle(particle, loc, 0, (double) color.getRed() / 255, (double) color.getGreen() / 255, (double) color.getBlue() / 255, 0); + } + + @Override + public void spawnParticle(Particle particle, Location loc, int amount, double x, double y, double z, double speed, Material material) { + loc.getWorld().spawnParticle(particle, loc, amount, x, y, z, 0, new MaterialData(material)); + } + + @Override + public BossBar createBossBar(NamespacedKey key, String title, BarColor color, BarStyle style, BarFlag... flags) { + return Bukkit.createBossBar(title, color, style, flags); + } + + + @Override + public Enchantment getEnchantmentFromString(String s) { + if(s.equals("protection")) s = "PROTECTION_ENVIRONMENTAL"; + if(s.equals("fire_protection")) s = "PROTECTION_FIRE"; + if(s.equals("feather_falling")) s = "PROTECTION_FALL"; + if(s.equals("blast_protection")) s = "PROTECTION_EXPLOSIONS"; + if(s.equals("projectile_protection")) s = "PROTECTION_PROJECTILE"; + if(s.equals("respiration")) s = "OXYGEN"; + if(s.equals("aqua_affinity")) s = "WATER_WORKER"; + if(s.equals("sharpness")) s = "DAMAGE_ALL"; + if(s.equals("smite")) s = "DAMAGE_UNDEAD"; + if(s.equals("bane_of_arthropods")) s = "DAMAGE_ARTHROPODS"; + if(s.equals("looting")) s = "LOOT_BONUS_MOBS"; + if(s.equals("sweeping")) s = "SWEEPING_EDGE"; + if(s.equals("efficiency")) s = "DIG_SPEED"; + if(s.equals("unbreaking")) s = "DURABILITY"; + if(s.equals("fortune")) s = "LOOT_BONUS_BLOCKS"; + if(s.equals("power")) s = "ARROW_DAMAGE"; + if(s.equals("punch")) s = "ARROW_KNOCKBACK"; + if(s.equals("flame")) s = "ARROW_FIRE"; + if(s.equals("infinity")) s = "ARROW_INFINITE"; + if(s.equals("luck_of_the_sea")) s = "LUCK"; + + return Enchantment.getByName(s.toUpperCase()); + } + + @Override + public FurnaceRecipe getFurnaceRecipe(NamespacedKey key, ItemStack item, Material material, float exp, int cook) { + try { + return (FurnaceRecipe) Class.forName("org.bukkit.inventory.FurnaceRecipe").getConstructor(ItemStack.class, Material.class, Integer.TYPE, Integer.TYPE).newInstance(item, material, 0, (int) exp); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | ClassNotFoundException exception) { + exception.printStackTrace(); + return null; + } + } + + //I'm so sorry Indy. + //I have no fucking clue what I'm doing :( + @Override + public RayTraceResult rayTrace(Player player, Vector direction, double range) { + BlockIterator blocksToAdd = new BlockIterator(player.getWorld(), player.getLocation().toVector(), direction, 0.0d, (int) range); + Location location = null; + + while(blocksToAdd.hasNext()) { + location = blocksToAdd.next().getLocation(); + } + + if(location != null) return new RayTraceResult(location.toVector()); + + return new RayTraceResult(null); + } + + + @Override + public RayTraceResult rayTraceEntities(Player player, Vector direction, double range) { + + Location loc = player.getEyeLocation(); + Vec3D vec = new Vec3D(loc.getDirection().getX(), loc.getDirection().getY(), loc.getDirection().getZ()); + MovingObjectPosition block = ((CraftPlayer) player).getHandle().getBoundingBox().b(vec, new Vec3D(vec.x, vec.y, vec.z).add(range * vec.x, range * vec.y, range * vec.z)); + + double d = block == null ? range : Math.sqrt(block.pos.distanceSquared(new Vec3D(loc.getX(), loc.getY(), loc.getZ()))); + Ray3D line = new Ray3D(player.getEyeLocation()); + for (Entity entity : player.getNearbyEntities(d, d, d)) + if (line.intersectsRay(((CraftEntity) entity).getHandle().getBoundingBox()) && MMOCoreUtils.canTarget(player, entity)) + return new RayTraceResult(entity.getLocation().toVector(), (LivingEntity) entity); + + return new RayTraceResult(null); + } + + public class Ray3D extends Vec3D { + public final Vec3D dir; + + /* + * warning, direction is not normalized + */ + public Ray3D(Vec3D origin, Vec3D direction) { + super(origin.x, origin.y, origin.z); + dir = direction; + } + + /** + * Construct a 3D ray from a location. + * + * @param loc + * - the Bukkit location. + */ + public Ray3D(Location loc) { + this(new Vec3D(loc.getX(), loc.getY(), loc.getZ()), new Vec3D(loc.getDirection().getX(), loc.getDirection().getY(), loc.getDirection().getZ())); + } + + public Vec3D getDirection() { + return dir; + } + + public String toString() { + return "origin: " + super.toString() + " dir: " + dir; + } + + /** + * Calculates intersection with the given ray between a certain distance + * interval. + *

+ * Ray-box intersection is using IEEE numerical properties to ensure the + * test is both robust and efficient, as described in:
+ * Amy Williams, Steve Barrus, R. Keith Morley, and Peter Shirley: "An + * Efficient and Robust Ray-Box Intersection Algorithm" Journal of graphics + * tools, 10(1):49-54, 2005 + * + * @param ray + * incident ray + * @param minDist + * @param maxDist + * @return intersection point on the bounding box (only the first is + * returned) or null if no intersection + */ + public boolean intersectsRay(AxisAlignedBB box) { + Vec3D invDir = new Vec3D(1f / dir.x, 1f / dir.y, 1f / dir.z); + + Vec3D min = new Vec3D(box.a, box.b, box.c); + Vec3D max = new Vec3D(box.d, box.e, box.f); + + boolean signDirX = invDir.x < 0; + boolean signDirY = invDir.y < 0; + boolean signDirZ = invDir.z < 0; + + Vec3D bbox = signDirX ? max : min; + double tmin = (bbox.x - x) * invDir.x; + bbox = signDirX ? min : max; + double tmax = (bbox.x - x) * invDir.x; + bbox = signDirY ? max : min; + double tymin = (bbox.y - y) * invDir.y; + bbox = signDirY ? min : max; + double tymax = (bbox.y - y) * invDir.y; + + if ((tmin > tymax) || (tymin > tmax)) { + return false; + } + if (tymin > tmin) { + tmin = tymin; + } + if (tymax < tmax) { + tmax = tymax; + } + + bbox = signDirZ ? max : min; + double tzmin = (bbox.z - z) * invDir.z; + bbox = signDirZ ? min : max; + double tzmax = (bbox.z - z) * invDir.z; + + if ((tmin > tzmax) || (tzmin > tmax)) { + return false; + } + if (tzmin > tmin) { + tmin = tzmin; + } + if (tzmax < tmax) { + tmax = tzmax; + } + return true; + } + } + + @Override + public boolean isCropFullyGrown(Block block) { + if(block.getState().getData() instanceof Crops) { + Crops ageable = (Crops) block.getState().getData(); + return ageable.getState().equals(CropState.RIPE); + } return false; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/version/wrapper/VersionWrapper.java b/src/main/java/net/Indyuce/mmocore/version/wrapper/VersionWrapper.java new file mode 100644 index 00000000..77d98f84 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/version/wrapper/VersionWrapper.java @@ -0,0 +1,58 @@ +package net.Indyuce.mmocore.version.wrapper; + +import org.bukkit.Color; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.FurnaceRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; + +public interface VersionWrapper { + default void spawnParticle(Particle particle, Location loc, Color color) { + spawnParticle(particle, loc, 1, 0, 0, 0, 0, 1, color); + } + + default void spawnParticle(Particle particle, Location loc, float size, Color color) { + spawnParticle(particle, loc, 1, 0, 0, 0, 0, size, color); + } + + default void spawnParticle(Particle particle, Location loc, Material material) { + spawnParticle(particle, loc, 1, 0, 0, 0, 0, material); + } + + void spawnParticle(Particle particle, Location loc, int amount, double x, double y, double z, double speed, float size, Color color); + + void spawnParticle(Particle particle, Location loc, int amount, double x, double y, double z, double speed, Material material); + + BossBar createBossBar(NamespacedKey key, String title, BarColor color, BarStyle style, BarFlag... flags); + + Enchantment getEnchantmentFromString(String s); + + FurnaceRecipe getFurnaceRecipe(NamespacedKey key, ItemStack item, Material material, float exp, int cook); + + + default RayTraceResult rayTrace(Player player, double range) { + return rayTrace(player, player.getEyeLocation().getDirection(), range); + } + + RayTraceResult rayTrace(Player player, Vector direction, double range); + + + default RayTraceResult rayTraceEntities(Player player, double range) { + return rayTraceEntities(player, player.getEyeLocation().getDirection(), range); + } + + RayTraceResult rayTraceEntities(Player player, Vector direction, double range); + + boolean isCropFullyGrown(Block block); +}