diff --git a/Core/pom.xml b/Core/pom.xml index 60fd057..374e291 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.4 + 3.4.0 4.0.0 @@ -72,32 +72,32 @@ su.nightexpress.excellentenchants NMS - 3.3.4 + 3.4.0 su.nightexpress.excellentenchants V1_19_R3 - 3.3.4 + 3.4.0 su.nightexpress.excellentenchants V1_19_R2 - 3.3.4 + 3.4.0 su.nightexpress.excellentenchants V1_19_R1 - 3.3.4 + 3.4.0 su.nightexpress.excellentenchants V1_18_R2 - 3.3.4 + 3.4.0 su.nightexpress.excellentenchants V1_17_R1 - 3.3.4 + 3.4.0 fr.neatmonster diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java b/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java index 458eaa6..966f7d6 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java @@ -29,9 +29,9 @@ import su.nightexpress.excellentenchants.tier.TierManager; public class ExcellentEnchants extends NexPlugin { private EnchantRegistry enchantRegistry; - private EnchantManager enchantManager; - private EnchantNMS enchantNMS; - private TierManager tierManager; + private EnchantManager enchantManager; + private EnchantNMS enchantNMS; + private TierManager tierManager; @Override @NotNull diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantRegistry.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantRegistry.java index dd8e386..1cc3cb8 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantRegistry.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantRegistry.java @@ -10,7 +10,7 @@ import su.nightexpress.excellentenchants.config.Config; import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant; import su.nightexpress.excellentenchants.enchantment.impl.armor.*; import su.nightexpress.excellentenchants.enchantment.impl.bow.*; -import su.nightexpress.excellentenchants.enchantment.impl.fishing.AutoFishEnchant; +import su.nightexpress.excellentenchants.enchantment.impl.fishing.*; import su.nightexpress.excellentenchants.enchantment.impl.tool.*; import su.nightexpress.excellentenchants.enchantment.impl.universal.EnchantCurseOfFragility; import su.nightexpress.excellentenchants.enchantment.impl.weapon.*; @@ -35,14 +35,22 @@ public class EnchantRegistry { public void setup() { // Prevent to register enchantments during the runtime. if (this.isLocked) { - REGISTRY_MAP.values().forEach(ExcellentEnchant::loadSettings); + REGISTRY_MAP.values().forEach(enchant -> { + enchant.loadSettings(); + enchant.registerListeners(); + }); return; } Reflex.setFieldValue(Enchantment.class, "acceptingNew", true); // Fising Enchants - this.register(AutoFishEnchant.ID,() -> new AutoFishEnchant(plugin)); + this.register(AutoReelEnchant.ID,() -> new AutoReelEnchant(plugin)); + this.register(DoubleCatchEnchant.ID, () -> new DoubleCatchEnchant(plugin)); + this.register(SeasonedAnglerEnchant.ID, () -> new SeasonedAnglerEnchant(plugin)); + this.register(SurvivalistEnchant.ID, () -> new SurvivalistEnchant(plugin)); + this.register(CurseOfDrownedEnchant.ID, () -> new CurseOfDrownedEnchant(plugin)); + this.register(RiverMasterEnchant.ID, () -> new RiverMasterEnchant(plugin)); // Tool enchants this.register(EnchantBlastMining.ID, () -> new EnchantBlastMining(plugin)); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/ExcellentEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/ExcellentEnchant.java index e8c6755..718688b 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/ExcellentEnchant.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/ExcellentEnchant.java @@ -97,6 +97,9 @@ public abstract class ExcellentEnchant extends Enchantment implements IEnchantme @NotNull public PlaceholderMap getPlaceholders(int level) { + if (level > this.getMaxLevel()) level = this.getMaxLevel(); + if (level < this.getStartLevel()) level = this.getStartLevel(); + return this.placeholdersMap.get(level); } diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantFlameWalker.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantFlameWalker.java index 5cb4a01..61363e8 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantFlameWalker.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantFlameWalker.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import su.nexmedia.engine.api.manager.ICleanable; import su.nexmedia.engine.api.particle.SimpleParticle; import su.nexmedia.engine.api.server.AbstractTask; +import su.nexmedia.engine.utils.Pair; import su.nexmedia.engine.utils.random.Rnd; import su.nightexpress.excellentenchants.ExcellentEnchants; import su.nightexpress.excellentenchants.enchantment.config.EnchantScaler; @@ -29,6 +30,7 @@ import su.nightexpress.excellentenchants.enchantment.util.EnchantUtils; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import java.util.stream.Stream; public class EnchantFlameWalker extends ExcellentEnchant implements ICleanable { @@ -36,7 +38,7 @@ public class EnchantFlameWalker extends ExcellentEnchant implements ICleanable { public static final String ID = "flame_walker"; private static final BlockFace[] FACES = {BlockFace.SOUTH, BlockFace.NORTH, BlockFace.EAST, BlockFace.WEST}; - private static final Map BLOCKS_TO_DESTROY = new ConcurrentHashMap<>(); + private static final Map> BLOCKS_TO_DESTROY = new ConcurrentHashMap<>(); private EnchantScaler blockDecayTime; private BlockTickTask blockTickTask; @@ -70,7 +72,7 @@ public class EnchantFlameWalker extends ExcellentEnchant implements ICleanable { } public static void addBlock(@NotNull Block block, double seconds) { - BLOCKS_TO_DESTROY.put(block, (long) (System.currentTimeMillis() + seconds * 1000L)); + BLOCKS_TO_DESTROY.put(block, Pair.of(System.currentTimeMillis() + (long) seconds * 1000L, Rnd.get(100))); } @Override @@ -148,13 +150,32 @@ public class EnchantFlameWalker extends ExcellentEnchant implements ICleanable { BLOCKS_TO_DESTROY.keySet().removeIf(block -> { if (block.isEmpty()) return true; - long time = BLOCKS_TO_DESTROY.get(block); + Pair pair = BLOCKS_TO_DESTROY.get(block); + long time = pair.getFirst(); if (now >= time) { + block.getWorld().getPlayers().forEach(player -> { + player.sendBlockDamage(block.getLocation(), 0F, pair.getSecond()); + }); + block.setType(Material.LAVA); - SimpleParticle.of(Particle.BLOCK_CRACK, Material.MAGMA_BLOCK) + + SimpleParticle.of(Particle.BLOCK_CRACK, Material.MAGMA_BLOCK.createBlockData()) .play(block.getLocation(), 0.5, 0.7, 0.5, 0.03, 30); + return true; } + else { + long diff = TimeUnit.MILLISECONDS.toSeconds(time - now); + + float progress = (float) (1D - Math.min(1D, diff / 5D)); + if (progress > 1F) progress = 1F; + if (progress < 0F) progress = 0F; + + float finalProgress = progress; + block.getWorld().getPlayers().forEach(player -> { + player.sendBlockDamage(block.getLocation(), finalProgress, pair.getSecond()); + }); + } return false; }); } diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantIceShield.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantIceShield.java index d65bccb..06bbc66 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantIceShield.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantIceShield.java @@ -74,7 +74,7 @@ public class EnchantIceShield extends ExcellentEnchant implements Chanced, Potio damager.setFreezeTicks(damager.getMaxFreezeTicks()); if (this.hasVisualEffects()) { - SimpleParticle.of(Particle.BLOCK_CRACK, Material.ICE) + SimpleParticle.of(Particle.BLOCK_CRACK, Material.ICE.createBlockData()) .play(damager.getEyeLocation(), 0.25, 0.1, 20); } return true; diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java index 8f7dc00..d959a48 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java @@ -92,7 +92,7 @@ public class EnchantElectrifiedArrows extends ExcellentEnchant implements Chance block.getWorld().strikeLightning(block.getLocation()).setMetadata(META_NO_ITEM_DAMAGE, new FixedMetadataValue(plugin, true)); if (this.hasVisualEffects()) { Location center = LocationUtil.getCenter(block.getLocation()); - SimpleParticle.of(Particle.BLOCK_CRACK, block.getType()).play(center, 1, 0.05, 120); + SimpleParticle.of(Particle.BLOCK_CRACK, block.getType().createBlockData()).play(center, 1, 0.05, 120); SimpleParticle.of(Particle.FIREWORKS_SPARK).play(center, 1, 0.05, 120); } return true; diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoFishEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoReelEnchant.java similarity index 84% rename from Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoFishEnchant.java rename to Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoReelEnchant.java index 473469b..4e13cde 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoFishEnchant.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoReelEnchant.java @@ -9,11 +9,11 @@ import su.nightexpress.excellentenchants.api.enchantment.type.FishingEnchant; import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant; import su.nightexpress.excellentenchants.enchantment.util.EnchantPriority; -public class AutoFishEnchant extends ExcellentEnchant implements FishingEnchant { +public class AutoReelEnchant extends ExcellentEnchant implements FishingEnchant { - public static final String ID = "auto_fish"; + public static final String ID = "auto_reel"; - public AutoFishEnchant(@NotNull ExcellentEnchants plugin) { + public AutoReelEnchant(@NotNull ExcellentEnchants plugin) { super(plugin, ID, EnchantPriority.MEDIUM); this.getDefaults().setDescription("Automatically reels in a hook on bite."); this.getDefaults().setLevelMax(1); @@ -29,6 +29,7 @@ public class AutoFishEnchant extends ExcellentEnchant implements FishingEnchant @Override public boolean onFishing(@NotNull PlayerFishEvent event, @NotNull ItemStack item, int level) { if (event.getState() != PlayerFishEvent.State.BITE) return false; + if (!this.isAvailableToUse(event.getPlayer())) return false; this.plugin.runTask(task -> { if (event.isCancelled()) return; diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/CurseOfDrownedEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/CurseOfDrownedEnchant.java new file mode 100644 index 0000000..e265a41 --- /dev/null +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/CurseOfDrownedEnchant.java @@ -0,0 +1,72 @@ +package su.nightexpress.excellentenchants.enchantment.impl.fishing; + +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.entity.Drowned; +import org.bukkit.entity.FishHook; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import su.nexmedia.engine.api.particle.SimpleParticle; +import su.nexmedia.engine.utils.MessageUtil; +import su.nightexpress.excellentenchants.ExcellentEnchants; +import su.nightexpress.excellentenchants.Placeholders; +import su.nightexpress.excellentenchants.api.enchantment.meta.Chanced; +import su.nightexpress.excellentenchants.api.enchantment.type.FishingEnchant; +import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant; +import su.nightexpress.excellentenchants.enchantment.impl.meta.ChanceImplementation; +import su.nightexpress.excellentenchants.enchantment.util.EnchantPriority; + +public class CurseOfDrownedEnchant extends ExcellentEnchant implements FishingEnchant, Chanced { + + public static final String ID = "curse_of_drowned"; + + private ChanceImplementation chanceImplementation; + + public CurseOfDrownedEnchant(@NotNull ExcellentEnchants plugin) { + super(plugin, ID, EnchantPriority.HIGHEST); + this.getDefaults().setDescription(Placeholders.ENCHANTMENT_CHANCE + "% chance to fish up a Drowned Zombie."); + this.getDefaults().setLevelMax(5); + this.getDefaults().setTier(0D); + } + + @Override + public void loadSettings() { + super.loadSettings(); + this.chanceImplementation = ChanceImplementation.create(this, + "5.0 + " + Placeholders.ENCHANTMENT_LEVEL); + } + + @NotNull + @Override + public ChanceImplementation getChanceImplementation() { + return chanceImplementation; + } + + @NotNull + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.FISHING_ROD; + } + + @Override + public boolean onFishing(@NotNull PlayerFishEvent event, @NotNull ItemStack item, int level) { + if (event.getState() != PlayerFishEvent.State.CAUGHT_FISH) return false; + if (!this.isAvailableToUse(event.getPlayer())) return false; + if (!this.checkTriggerChance(level)) return false; + + FishHook hook = event.getHook(); + Drowned drowned = hook.getWorld().spawn(hook.getLocation(), Drowned.class); + hook.setHookedEntity(drowned); + hook.pullHookedEntity(); + + event.setCancelled(true); + + if (this.hasVisualEffects()) { + SimpleParticle.of(Particle.WATER_SPLASH).play(hook.getLocation(), 0.5, 0.1, 50); + MessageUtil.sound(event.getPlayer(), Sound.ENTITY_DROWNED_AMBIENT); + } + return true; + } +} diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/DoubleCatchEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/DoubleCatchEnchant.java new file mode 100644 index 0000000..f793cbf --- /dev/null +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/DoubleCatchEnchant.java @@ -0,0 +1,61 @@ +package su.nightexpress.excellentenchants.enchantment.impl.fishing; + +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.entity.Item; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import su.nightexpress.excellentenchants.ExcellentEnchants; +import su.nightexpress.excellentenchants.Placeholders; +import su.nightexpress.excellentenchants.api.enchantment.meta.Chanced; +import su.nightexpress.excellentenchants.api.enchantment.type.FishingEnchant; +import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant; +import su.nightexpress.excellentenchants.enchantment.impl.meta.ChanceImplementation; +import su.nightexpress.excellentenchants.enchantment.util.EnchantPriority; + +public class DoubleCatchEnchant extends ExcellentEnchant implements FishingEnchant, Chanced { + + public static final String ID = "double_catch"; + + private ChanceImplementation chanceImplementation; + + public DoubleCatchEnchant(@NotNull ExcellentEnchants plugin) { + super(plugin, ID, EnchantPriority.LOWEST); + this.getDefaults().setDescription("Increases amount of caught item by x2 with " + Placeholders.ENCHANTMENT_CHANCE + "% chance."); + this.getDefaults().setLevelMax(3); + this.getDefaults().setTier(0.5); + } + + @Override + public void loadSettings() { + super.loadSettings(); + this.chanceImplementation = ChanceImplementation.create(this, + "10.0 * " + Placeholders.ENCHANTMENT_LEVEL); + } + + @NotNull + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.FISHING_ROD; + } + + @Override + @NotNull + public ChanceImplementation getChanceImplementation() { + return this.chanceImplementation; + } + + @Override + public boolean onFishing(@NotNull PlayerFishEvent event, @NotNull ItemStack item, int level) { + if (event.getState() != PlayerFishEvent.State.CAUGHT_FISH) return false; + if (!(event.getCaught() instanceof Item drop)) return false; + if (!this.isAvailableToUse(event.getPlayer())) return false; + if (!this.checkTriggerChance(level)) return false; + + ItemStack stack = drop.getItemStack(); + stack.setAmount(Math.min(stack.getMaxStackSize(), stack.getAmount() * 2)); + drop.setItemStack(stack); + + return true; + } +} diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/RiverMasterEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/RiverMasterEnchant.java new file mode 100644 index 0000000..4057e1a --- /dev/null +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/RiverMasterEnchant.java @@ -0,0 +1,68 @@ +package su.nightexpress.excellentenchants.enchantment.impl.fishing; + +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.entity.FishHook; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import su.nightexpress.excellentenchants.ExcellentEnchants; +import su.nightexpress.excellentenchants.Placeholders; +import su.nightexpress.excellentenchants.enchantment.config.EnchantScaler; +import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant; +import su.nightexpress.excellentenchants.enchantment.util.EnchantPriority; +import su.nightexpress.excellentenchants.enchantment.util.EnchantUtils; + +public class RiverMasterEnchant extends ExcellentEnchant { + + public static final String ID = "river_master"; + + private EnchantScaler distanceMod; + + public RiverMasterEnchant(@NotNull ExcellentEnchants plugin) { + super(plugin, ID, EnchantPriority.MEDIUM); + this.getDefaults().setDescription("Increases casting distance."); + this.getDefaults().setLevelMax(5); + this.getDefaults().setTier(0.1); + } + + @Override + public void loadSettings() { + super.loadSettings(); + this.distanceMod = EnchantScaler.read(this, "Settings.Distance_Modifier", + "1.25 + " + Placeholders.ENCHANTMENT_LEVEL + " / 5", + "Multiplies the casted fish hook's velocity by specified value.", + "Setting too high values will result in hook auto removal by vanilla game/server mechanics."); + } + + @NotNull + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.FISHING_ROD; + } + + public double getDistanceMod(int level) { + return this.distanceMod.getValue(level); + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onHookLaunch(ProjectileLaunchEvent event) { + if (!(event.getEntity() instanceof FishHook hook)) return; + if (!(hook.getShooter() instanceof Player player)) return; + if (!this.isAvailableToUse(player)) return; + + ItemStack rod = EnchantUtils.getFishingRod(player); + if (rod == null) return; + + int level = EnchantUtils.getLevel(rod, this); + if (level < 1) return; + + if (this.isOutOfCharges(rod)) return; + + hook.setVelocity(hook.getVelocity().multiply(this.getDistanceMod(level))); + + this.consumeCharges(rod); + } +} diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/SeasonedAnglerEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/SeasonedAnglerEnchant.java new file mode 100644 index 0000000..7a2d0c5 --- /dev/null +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/SeasonedAnglerEnchant.java @@ -0,0 +1,61 @@ +package su.nightexpress.excellentenchants.enchantment.impl.fishing; + +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import su.nexmedia.engine.utils.NumberUtil; +import su.nightexpress.excellentenchants.ExcellentEnchants; +import su.nightexpress.excellentenchants.Placeholders; +import su.nightexpress.excellentenchants.api.enchantment.type.FishingEnchant; +import su.nightexpress.excellentenchants.enchantment.config.EnchantScaler; +import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant; +import su.nightexpress.excellentenchants.enchantment.util.EnchantPriority; + +public class SeasonedAnglerEnchant extends ExcellentEnchant implements FishingEnchant { + + public static final String ID = "seasoned_angler"; + + private EnchantScaler expMod; + + public SeasonedAnglerEnchant(@NotNull ExcellentEnchants plugin) { + super(plugin, ID, EnchantPriority.MEDIUM); + this.getDefaults().setDescription("Increases amount of XP gained from fishing by " + Placeholders.GENERIC_AMOUNT + "%."); + this.getDefaults().setLevelMax(4); + this.getDefaults().setTier(0.1); + } + + @Override + public void loadSettings() { + super.loadSettings(); + this.expMod = EnchantScaler.read(this, "Settings.Exp_Percent", + "25.0 * " + Placeholders.ENCHANTMENT_LEVEL, + "Amount (in percent) of additional XP from fishing."); + + this.addPlaceholder(Placeholders.GENERIC_AMOUNT, level -> NumberUtil.format(this.getExpPercent(level))); + } + + public int getExpPercent(int level) { + return (int) this.expMod.getValue(level); + } + + @NotNull + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.FISHING_ROD; + } + + @Override + public boolean onFishing(@NotNull PlayerFishEvent event, @NotNull ItemStack item, int level) { + if (event.getState() != PlayerFishEvent.State.CAUGHT_FISH) return false; + if (!this.isAvailableToUse(event.getPlayer())) return false; + if (event.getExpToDrop() == 0) return false; + + int expDrop = event.getExpToDrop(); + int expPercent = this.getExpPercent(level); + int expModified = (int) Math.ceil(expDrop * (1D + expPercent / 100D)); + + event.setExpToDrop(expModified); + return true; + } +} diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/SurvivalistEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/SurvivalistEnchant.java new file mode 100644 index 0000000..e40c3c0 --- /dev/null +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/SurvivalistEnchant.java @@ -0,0 +1,78 @@ +package su.nightexpress.excellentenchants.enchantment.impl.fishing; + +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.entity.Item; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.inventory.CookingRecipe; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import su.nightexpress.excellentenchants.ExcellentEnchants; +import su.nightexpress.excellentenchants.api.enchantment.meta.Chanced; +import su.nightexpress.excellentenchants.api.enchantment.type.FishingEnchant; +import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant; +import su.nightexpress.excellentenchants.enchantment.impl.meta.ChanceImplementation; +import su.nightexpress.excellentenchants.enchantment.util.EnchantPriority; + +import java.util.HashSet; +import java.util.Set; + +public class SurvivalistEnchant extends ExcellentEnchant implements FishingEnchant, Chanced { + + public static final String ID = "survivalist"; + + private final Set> cookingRecipes; + + private ChanceImplementation chanceImplementation; + + public SurvivalistEnchant(@NotNull ExcellentEnchants plugin) { + super(plugin, ID, EnchantPriority.HIGH); + this.getDefaults().setDescription("Automatically cooks fish if what is caught is raw."); + this.getDefaults().setLevelMax(1); + this.getDefaults().setTier(0.4); + + this.cookingRecipes = new HashSet<>(); + } + + @Override + public void loadSettings() { + super.loadSettings(); + this.chanceImplementation = ChanceImplementation.create(this, "100"); + + this.cookingRecipes.clear(); + this.plugin.getServer().recipeIterator().forEachRemaining(recipe -> { + if (recipe instanceof CookingRecipe cookingRecipe) { + this.cookingRecipes.add(cookingRecipe); + } + }); + } + + @NotNull + @Override + public ChanceImplementation getChanceImplementation() { + return chanceImplementation; + } + + @NotNull + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.FISHING_ROD; + } + + @Override + public boolean onFishing(@NotNull PlayerFishEvent event, @NotNull ItemStack item, int level) { + if (event.getState() != PlayerFishEvent.State.CAUGHT_FISH) return false; + if (!this.isAvailableToUse(event.getPlayer())) return false; + if (!this.checkTriggerChance(level)) return false; + if (!(event.getCaught() instanceof Item drop)) return false; + + ItemStack stack = drop.getItemStack(); + + CookingRecipe recipe = this.cookingRecipes.stream().filter(r -> r.getInput().isSimilar(stack)).findFirst().orElse(null); + if (recipe == null) return false; + + ItemStack cooked = recipe.getResult(); + cooked.setAmount(stack.getAmount()); + drop.setItemStack(cooked); + return false; + } +} diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/meta/PotionImplementation.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/meta/PotionImplementation.java index d089168..5f8f885 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/meta/PotionImplementation.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/meta/PotionImplementation.java @@ -13,7 +13,7 @@ import su.nightexpress.excellentenchants.enchantment.config.EnchantScaler; public final class PotionImplementation implements Potioned { - //private final ExcellentEnchant enchant; + private final ExcellentEnchant enchant; private final PotionEffectType effectType; private final Scaler duration; private final Scaler amplifier; @@ -22,7 +22,7 @@ public final class PotionImplementation implements Potioned { private PotionImplementation(@NotNull ExcellentEnchant enchant, @NotNull PotionEffectType effectType, boolean isPermanent, @NotNull EnchantScaler duration, @NotNull EnchantScaler amplifier) { - //this.enchant = enchant; + this.enchant = enchant; this.effectType = effectType; this.duration = duration; this.amplifier = amplifier; @@ -82,7 +82,7 @@ public final class PotionImplementation implements Potioned { int duration = this.getEffectDuration(level); int amplifier = Math.max(0, this.getEffectAmplifier(level) - 1); - return new PotionEffect(this.getEffectType(), duration, amplifier, false, false); + return new PotionEffect(this.getEffectType(), duration, amplifier, false, this.enchant.hasVisualEffects()); } public boolean addEffect(@NotNull LivingEntity target, int level) { diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java index 7937fe2..5535a43 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java @@ -233,7 +233,7 @@ public class EnchantDecapitator extends ExcellentEnchant implements Chanced, Dea entity.getWorld().dropItemNaturally(entity.getLocation(), item); if (this.hasVisualEffects()) { - SimpleParticle.of(Particle.BLOCK_CRACK, Material.REDSTONE_BLOCK).play(entity.getEyeLocation(), 0.25, 0.15, 30); + SimpleParticle.of(Particle.BLOCK_CRACK, Material.REDSTONE_BLOCK.createBlockData()).play(entity.getEyeLocation(), 0.25, 0.15, 30); } return true; } diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantIceAspect.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantIceAspect.java index 368790f..6aa4805 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantIceAspect.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantIceAspect.java @@ -69,7 +69,7 @@ public class EnchantIceAspect extends ExcellentEnchant implements Chanced, Potio victim.setFreezeTicks(victim.getMaxFreezeTicks()); if (this.hasVisualEffects()) { - SimpleParticle.of(Particle.BLOCK_CRACK, Material.ICE).play(victim.getEyeLocation(), 0.25, 0.15, 30); + SimpleParticle.of(Particle.BLOCK_CRACK, Material.ICE.createBlockData()).play(victim.getEyeLocation(), 0.25, 0.15, 30); } return true; } diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantThrifty.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantThrifty.java index 5a303f2..019ad66 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantThrifty.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantThrifty.java @@ -1,6 +1,5 @@ package su.nightexpress.excellentenchants.enchantment.impl.weapon; -import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.enchantments.EnchantmentTarget; import org.bukkit.entity.EntityType; @@ -89,16 +88,10 @@ public class EnchantThrifty extends ExcellentEnchant implements Chanced, DeathEn if (PDCUtil.getBoolean(entity, this.keyEntityIgnored).orElse(false)) return false; if (!this.checkTriggerChance(level)) return false; - Material material = Material.getMaterial(entity.getType().name() + "_SPAWN_EGG"); - if (material == null) { - if (entity.getType() == EntityType.MUSHROOM_COW) { - material = Material.MOOSHROOM_SPAWN_EGG; - } - else return false; - } + ItemStack eggItem = plugin.getEnchantNMS().getSpawnEgg(entity); + if (eggItem == null) return false; - ItemStack egg = new ItemStack(material); - e.getDrops().add(egg); + e.getDrops().add(eggItem); return true; } diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java index 821d90a..73902b8 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java @@ -144,8 +144,11 @@ public class EnchantGenericListener extends AbstractListener boolean expReward = recipe.hasExperienceReward(); int villagerExperience = recipe.getVillagerExperience(); float priceMultiplier = recipe.getPriceMultiplier(); + int demand = recipe.getDemand(); + int specialPrice = recipe.getSpecialPrice(); - MerchantRecipe recipe2 = new MerchantRecipe(result, uses, maxUses, expReward, villagerExperience, priceMultiplier); + MerchantRecipe recipe2 = new MerchantRecipe(result, uses, maxUses, expReward, villagerExperience, + priceMultiplier, demand, specialPrice); recipe2.setIngredients(recipe.getIngredients()); e.setRecipe(recipe2); } diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantHandlerListener.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantHandlerListener.java index da4dc34..2b5b22b 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantHandlerListener.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantHandlerListener.java @@ -18,7 +18,6 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EntityEquipment; -import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.jetbrains.annotations.NotNull; @@ -26,10 +25,10 @@ import org.jetbrains.annotations.Nullable; import su.nexmedia.engine.api.manager.AbstractListener; import su.nexmedia.engine.utils.EntityUtil; import su.nightexpress.excellentenchants.ExcellentEnchants; -import su.nightexpress.excellentenchants.enchantment.util.EnchantDropContainer; -import su.nightexpress.excellentenchants.api.enchantment.type.*; import su.nightexpress.excellentenchants.api.enchantment.meta.Arrowed; +import su.nightexpress.excellentenchants.api.enchantment.type.*; import su.nightexpress.excellentenchants.enchantment.EnchantManager; +import su.nightexpress.excellentenchants.enchantment.util.EnchantDropContainer; import su.nightexpress.excellentenchants.enchantment.util.EnchantUtils; public class EnchantHandlerListener extends AbstractListener { @@ -211,14 +210,11 @@ public class EnchantHandlerListener extends AbstractListener public void onEnchantFishing(PlayerFishEvent event) { Player player = event.getPlayer(); - ItemStack item; - ItemStack main = player.getInventory().getItem(EquipmentSlot.HAND); - ItemStack off = player.getInventory().getItem(EquipmentSlot.OFF_HAND); - if (main != null && main.getType() == Material.FISHING_ROD) item = main; - else if (off != null && off.getType() == Material.FISHING_ROD) item = off; - else return; + ItemStack item = EnchantUtils.getFishingRod(player); + if (item == null) return; EnchantUtils.getExcellents(item, FishingEnchant.class).forEach((enchant, level) -> { + if (event.isCancelled()) return; // Check if event was cancelled by some enchantment. if (enchant.isOutOfCharges(item)) return; if (enchant.onFishing(event, item, level)) { enchant.consumeCharges(item); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/util/EnchantUtils.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/util/EnchantUtils.java index b0fd032..f38ce2e 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/util/EnchantUtils.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/util/EnchantUtils.java @@ -5,6 +5,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentTarget; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; @@ -102,14 +103,14 @@ public class EnchantUtils { ExcellentEnchant enchant = populator.getEnchantByChance(tier); // В тире нет подходящих чар (вообще) для итема, исключаем и идем дальше. if (enchant == null) { - populator.getEnchants().remove(tier); + populator.purge(tier); continue; } // Среди уже добавленных чар есть конфликты с тем, что нашли. // Исключаем, идем дальше. if (enchantsToAdd.keySet().stream().anyMatch(has -> has.conflictsWith(enchant) || enchant.conflictsWith(has))) { - populator.getEnchants(tier).remove(enchant); + populator.purge(tier, enchant); continue; } @@ -117,12 +118,12 @@ public class EnchantUtils { // Исключаем, идем дальше. int level = levelFunc.apply(enchant); if (level < enchant.getStartLevel()) { - populator.getEnchants(tier).remove(enchant); + populator.purge(tier, enchant); continue; } // Добавляем чар, засчитываем попытку. - populator.getEnchants(tier).remove(enchant); + populator.purge(tier, enchant); enchantsToAdd.put(enchant, level); enchRoll--; } @@ -202,6 +203,17 @@ public class EnchantUtils { return true; } + @Nullable + public static ItemStack getFishingRod(@NotNull Player player) { + ItemStack main = player.getInventory().getItem(EquipmentSlot.HAND); + if (main != null && main.getType() == Material.FISHING_ROD) return main; + + ItemStack off = player.getInventory().getItem(EquipmentSlot.OFF_HAND); + if (off != null && off.getType() == Material.FISHING_ROD) return off; + + return null; + } + @NotNull public static Map getAll(@NotNull ItemStack item) { ItemMeta meta = item.getItemMeta(); diff --git a/NMS/pom.xml b/NMS/pom.xml index 881f994..5879297 100644 --- a/NMS/pom.xml +++ b/NMS/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.4 + 3.4.0 4.0.0 diff --git a/NMS/src/main/java/su/nightexpress/excellentenchants/nms/EnchantNMS.java b/NMS/src/main/java/su/nightexpress/excellentenchants/nms/EnchantNMS.java index 8bc10ba..2cd518d 100644 --- a/NMS/src/main/java/su/nightexpress/excellentenchants/nms/EnchantNMS.java +++ b/NMS/src/main/java/su/nightexpress/excellentenchants/nms/EnchantNMS.java @@ -7,6 +7,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -16,5 +17,7 @@ public interface EnchantNMS { void retrieveHook(@NotNull FishHook hook, @NotNull ItemStack item); + @Nullable ItemStack getSpawnEgg(@NotNull LivingEntity entity); + @NotNull Set handleFlameWalker(@NotNull LivingEntity entity, @NotNull Location location, int level); } diff --git a/V1_17_R1/pom.xml b/V1_17_R1/pom.xml index fec6efa..8e7f38f 100644 --- a/V1_17_R1/pom.xml +++ b/V1_17_R1/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.4 + 3.4.0 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.4 + 3.4.0 diff --git a/V1_17_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_17_R1/V1_17_R1.java b/V1_17_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_17_R1/V1_17_R1.java index 6d64803..552eb7e 100644 --- a/V1_17_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_17_R1/V1_17_R1.java +++ b/V1_17_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_17_R1/V1_17_R1.java @@ -5,6 +5,7 @@ import net.minecraft.network.protocol.game.ClientboundAnimatePacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.state.BlockState; @@ -22,6 +23,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import su.nightexpress.excellentenchants.nms.EnchantNMS; import java.util.HashSet; @@ -44,6 +46,18 @@ public class V1_17_R1 implements EnchantNMS { handle.retrieve(CraftItemStack.asNMSCopy(item)); } + @Override + @Nullable + public ItemStack getSpawnEgg(@NotNull LivingEntity entity) { + CraftLivingEntity craftLivingEntity = (CraftLivingEntity) entity; + net.minecraft.world.entity.LivingEntity livingEntity = craftLivingEntity.getHandle(); + + SpawnEggItem eggItem = SpawnEggItem.byId(livingEntity.getType()); + if (eggItem == null) return null; + + return CraftItemStack.asBukkitCopy(eggItem.getDefaultInstance()); + } + @Override @NotNull public Set handleFlameWalker(@NotNull LivingEntity bukkitEntity, @NotNull Location location, int level) { diff --git a/V1_18_R2/pom.xml b/V1_18_R2/pom.xml index 113c38c..6f81230 100644 --- a/V1_18_R2/pom.xml +++ b/V1_18_R2/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.4 + 3.4.0 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.4 + 3.4.0 diff --git a/V1_18_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_18_R2/V1_18_R2.java b/V1_18_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_18_R2/V1_18_R2.java index 42bd1da..32a1472 100644 --- a/V1_18_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_18_R2/V1_18_R2.java +++ b/V1_18_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_18_R2/V1_18_R2.java @@ -5,6 +5,7 @@ import net.minecraft.network.protocol.game.ClientboundAnimatePacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.state.BlockState; @@ -22,6 +23,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import su.nightexpress.excellentenchants.nms.EnchantNMS; import java.util.HashSet; @@ -44,6 +46,18 @@ public class V1_18_R2 implements EnchantNMS { handle.retrieve(CraftItemStack.asNMSCopy(item)); } + @Override + @Nullable + public ItemStack getSpawnEgg(@NotNull LivingEntity entity) { + CraftLivingEntity craftLivingEntity = (CraftLivingEntity) entity; + net.minecraft.world.entity.LivingEntity livingEntity = craftLivingEntity.getHandle(); + + SpawnEggItem eggItem = SpawnEggItem.byId(livingEntity.getType()); + if (eggItem == null) return null; + + return CraftItemStack.asBukkitCopy(eggItem.getDefaultInstance()); + } + @Override @NotNull public Set handleFlameWalker(@NotNull LivingEntity bukkitEntity, @NotNull Location location, int level) { diff --git a/V1_19_R1/pom.xml b/V1_19_R1/pom.xml index e2121b0..cae16e3 100644 --- a/V1_19_R1/pom.xml +++ b/V1_19_R1/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.4 + 3.4.0 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.4 + 3.4.0 diff --git a/V1_19_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R1/V1_19_R1.java b/V1_19_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R1/V1_19_R1.java index 841aab7..0cd82d6 100644 --- a/V1_19_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R1/V1_19_R1.java +++ b/V1_19_R1/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R1/V1_19_R1.java @@ -5,6 +5,7 @@ import net.minecraft.network.protocol.game.ClientboundAnimatePacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.state.BlockState; @@ -22,6 +23,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import su.nightexpress.excellentenchants.nms.EnchantNMS; import java.util.HashSet; @@ -44,6 +46,18 @@ public class V1_19_R1 implements EnchantNMS { handle.retrieve(CraftItemStack.asNMSCopy(item)); } + @Override + @Nullable + public ItemStack getSpawnEgg(@NotNull LivingEntity entity) { + CraftLivingEntity craftLivingEntity = (CraftLivingEntity) entity; + net.minecraft.world.entity.LivingEntity livingEntity = craftLivingEntity.getHandle(); + + SpawnEggItem eggItem = SpawnEggItem.byId(livingEntity.getType()); + if (eggItem == null) return null; + + return CraftItemStack.asBukkitCopy(eggItem.getDefaultInstance()); + } + @Override @NotNull public Set handleFlameWalker(@NotNull LivingEntity bukkitEntity, @NotNull Location location, int level) { diff --git a/V1_19_R2/pom.xml b/V1_19_R2/pom.xml index 10cd8f8..8d443db 100644 --- a/V1_19_R2/pom.xml +++ b/V1_19_R2/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.4 + 3.4.0 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.4 + 3.4.0 diff --git a/V1_19_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R2/V1_19_R2.java b/V1_19_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R2/V1_19_R2.java index 3a1de22..9542b37 100644 --- a/V1_19_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R2/V1_19_R2.java +++ b/V1_19_R2/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R2/V1_19_R2.java @@ -5,6 +5,7 @@ import net.minecraft.network.protocol.game.ClientboundAnimatePacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.state.BlockState; @@ -22,6 +23,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import su.nightexpress.excellentenchants.nms.EnchantNMS; import java.util.HashSet; @@ -44,6 +46,18 @@ public class V1_19_R2 implements EnchantNMS { handle.retrieve(CraftItemStack.asNMSCopy(item)); } + @Override + @Nullable + public ItemStack getSpawnEgg(@NotNull LivingEntity entity) { + CraftLivingEntity craftLivingEntity = (CraftLivingEntity) entity; + net.minecraft.world.entity.LivingEntity livingEntity = craftLivingEntity.getHandle(); + + SpawnEggItem eggItem = SpawnEggItem.byId(livingEntity.getType()); + if (eggItem == null) return null; + + return CraftItemStack.asBukkitCopy(eggItem.getDefaultInstance()); + } + @Override @NotNull public Set handleFlameWalker(@NotNull LivingEntity bukkitEntity, @NotNull Location location, int level) { diff --git a/V1_19_R3/pom.xml b/V1_19_R3/pom.xml index 00991b8..d94498d 100644 --- a/V1_19_R3/pom.xml +++ b/V1_19_R3/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.4 + 3.4.0 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.4 + 3.4.0 diff --git a/V1_19_R3/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R3/V1_19_R3.java b/V1_19_R3/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R3/V1_19_R3.java index 5da9592..d451be8 100644 --- a/V1_19_R3/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R3/V1_19_R3.java +++ b/V1_19_R3/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R3/V1_19_R3.java @@ -5,6 +5,7 @@ import net.minecraft.network.protocol.game.ClientboundAnimatePacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.state.BlockState; @@ -22,6 +23,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import su.nightexpress.excellentenchants.nms.EnchantNMS; import java.util.HashSet; @@ -44,6 +46,18 @@ public class V1_19_R3 implements EnchantNMS { handle.retrieve(CraftItemStack.asNMSCopy(item)); } + @Override + @Nullable + public ItemStack getSpawnEgg(@NotNull LivingEntity entity) { + CraftLivingEntity craftLivingEntity = (CraftLivingEntity) entity; + net.minecraft.world.entity.LivingEntity livingEntity = craftLivingEntity.getHandle(); + + SpawnEggItem eggItem = SpawnEggItem.byId(livingEntity.getType()); + if (eggItem == null) return null; + + return CraftItemStack.asBukkitCopy(eggItem.getDefaultInstance()); + } + @Override @NotNull public Set handleFlameWalker(@NotNull LivingEntity bukkitEntity, @NotNull Location location, int level) { diff --git a/pom.xml b/pom.xml index 9743b28..dec9a7b 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ su.nightexpress.excellentenchants ExcellentEnchants pom - 3.3.4 + 3.4.0 Core NMS