diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java index a6bd0aeea..9925d31ca 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ExplosionsListener.java @@ -21,12 +21,13 @@ public class ExplosionsListener implements Listener { plugin.getServer().getPluginManager().registerEvents(this, plugin); } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityExplode(EntityExplodeEvent e) { Iterator blocks = e.blockList().iterator(); while (blocks.hasNext()) { Block block = blocks.next(); + String id = BlockStorage.checkID(block); if (id != null) { blocks.remove(); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GrapplingHookListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GrapplingHookListener.java index b7bd18a78..ce67b5bc7 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GrapplingHookListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/GrapplingHookListener.java @@ -31,12 +31,8 @@ public class GrapplingHookListener implements Listener { @EventHandler public void onArrowHit(ProjectileHitEvent e) { Slimefun.runSync(() -> { - if (e.getEntity().isValid()) { - SlimefunPlugin.getUtilities().arrows.remove(e.getEntity().getUniqueId()); - - if (e.getEntity() instanceof Arrow) { - handleGrapplingHook((Arrow) e.getEntity()); - } + if (e.getEntity().isValid() && e.getEntity() instanceof Arrow) { + handleGrapplingHook((Arrow) e.getEntity()); } }, 4L); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunBowListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunBowListener.java index 41147baea..098d2183e 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunBowListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunBowListener.java @@ -1,5 +1,9 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + import org.bukkit.entity.Arrow; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -7,35 +11,56 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.ProjectileHitEvent; import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBow; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler; -import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; +import me.mrCookieSlime.Slimefun.api.Slimefun; public class SlimefunBowListener implements Listener { + private final Map bows = new HashMap<>(); + public SlimefunBowListener(SlimefunPlugin plugin) { plugin.getServer().getPluginManager().registerEvents(this, plugin); } + public Map getBows() { + return bows; + } + @EventHandler public void onBowUse(EntityShootBowEvent e) { - if (e.getEntity() instanceof Player && e.getProjectile() instanceof Arrow && SlimefunItem.getByItem(e.getBow()) != null) { - SlimefunPlugin.getUtilities().arrows.put(e.getProjectile().getUniqueId(), e.getBow()); + if (e.getEntity() instanceof Player && e.getProjectile() instanceof Arrow) { + SlimefunItem bow = SlimefunItem.getByItem(e.getBow()); + + if (bow instanceof SlimefunBow) { + bows.put(e.getProjectile().getUniqueId(), (SlimefunBow) bow); + } } } + + @EventHandler + public void onArrowHit(ProjectileHitEvent e) { + Slimefun.runSync(() -> { + if (e.getEntity().isValid() && e.getEntity() instanceof Arrow) { + bows.remove(e.getEntity().getUniqueId()); + } + }, 4L); + } @EventHandler public void onArrowSuccessfulHit(EntityDamageByEntityEvent e) { - if (e.getDamager() instanceof Arrow && e.getEntity() instanceof LivingEntity && SlimefunPlugin.getUtilities().arrows.containsKey(e.getDamager().getUniqueId())) { - for (ItemHandler handler : SlimefunItem.getHandlers(BowShootHandler.class)) { - if (((BowShootHandler) handler).onHit(e, (LivingEntity) e.getEntity())) { - break; - } - } - - SlimefunPlugin.getUtilities().arrows.remove(e.getDamager().getUniqueId()); + if (e.getDamager() instanceof Arrow && e.getEntity() instanceof LivingEntity) { + SlimefunBow bow = bows.get(e.getDamager().getUniqueId()); + + if (bow != null) { + bow.callItemHandler(BowShootHandler.class, handler -> handler.onHit(e, (LivingEntity) e.getEntity())); + } + + bows.remove(e.getDamager().getUniqueId()); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java index 8612a2f7d..3d6aa313a 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/SlimefunItemListener.java @@ -9,7 +9,6 @@ import org.bukkit.entity.IronGolem; import org.bukkit.entity.Player; import org.bukkit.event.Event.Result; import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerDropItemEvent; @@ -122,7 +121,8 @@ public class SlimefunItemListener implements Listener { } } - @EventHandler(priority = EventPriority.NORMAL) + @Deprecated + @EventHandler public void onRightClick(ItemUseEvent e) { if (e.getParentEvent() != null && e.getParentEvent().getHand() != EquipmentSlot.HAND) { return; diff --git a/src/main/java/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java b/src/main/java/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java index dedca3a57..335c31743 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/GPS/GPSNetwork.java @@ -27,7 +27,6 @@ import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.electric.gps.GPSTransmitter; import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.Slimefun; public class GPSNetwork { @@ -196,7 +195,7 @@ public class GPSNetwork { return map; } - public void addWaypoint(Player p, final Location l) { + public void addWaypoint(Player p, Location l) { if ((getWaypoints(p.getUniqueId()).size() + 2) > inventory.length) { SlimefunPlugin.getLocal().sendMessage(p, "gps.waypoint.max", true); return; @@ -231,7 +230,7 @@ public class GPSNetwork { return transmitters.getOrDefault(uuid, new HashSet<>()); } - public void openTeleporterGUI(Player p, UUID uuid, Block b, final int complexity) { + public void openTeleporterGUI(Player p, UUID uuid, Block b, int complexity) { if (SlimefunPlugin.getUtilities().teleporterUsers.contains(p.getUniqueId())) { return; } @@ -252,14 +251,14 @@ public class GPSNetwork { Location source = new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + 2D, b.getZ() + 0.5D); int index = 0; - for (Map.Entry entry : Slimefun.getGPSNetwork().getWaypoints(uuid).entrySet()) { + for (Map.Entry entry : SlimefunPlugin.getGPSNetwork().getWaypoints(uuid).entrySet()) { if (index >= teleporterInventory.length) break; int slot = teleporterInventory[index]; Location l = entry.getValue(); ItemStack globe = getIcon(entry); - menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "&8\u21E8 &7Estimated Teleportation Time: &r" + (50 / TeleportationSequence.getSpeed(Slimefun.getGPSNetwork().getNetworkComplexity(uuid), source, l)) + "s", "", "&8\u21E8 &cClick to select")); + menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "&8\u21E8 &7Estimated Teleportation Time: &r" + (50 / TeleportationSequence.getSpeed(SlimefunPlugin.getGPSNetwork().getNetworkComplexity(uuid), source, l)) + "s", "", "&8\u21E8 &cClick to select")); menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> { pl.closeInventory(); TeleportationSequence.start(pl.getUniqueId(), complexity, source, l, false); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBow.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBow.java index 29251d225..c773b647e 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBow.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunBow.java @@ -4,12 +4,21 @@ import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.Categories; import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; -public class SlimefunBow extends SlimefunItem { +public abstract class SlimefunBow extends SlimefunItem { public SlimefunBow(SlimefunItemStack item, ItemStack[] recipe) { super(Categories.WEAPONS, item, RecipeType.MAGIC_WORKBENCH, recipe); } + + @Override + public void preRegister() { + super.preRegister(); + addItemHandler(onShoot()); + } + + public abstract BowShootHandler onShoot(); } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveBow.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveBow.java new file mode 100644 index 000000000..e19724555 --- /dev/null +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveBow.java @@ -0,0 +1,30 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Sound; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBow; +import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; + +public class ExplosiveBow extends SlimefunBow { + + public ExplosiveBow(SlimefunItemStack item, ItemStack[] recipe) { + super(item, recipe); + } + + @Override + public BowShootHandler onShoot() { + return (e, n) -> { + Vector vector = n.getVelocity(); + vector.setY(0.6); + n.setVelocity(vector); + n.getWorld().createExplosion(n.getLocation(), 0F); + n.getWorld().playSound(n.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F); + }; + } + + + +} diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GrapplingHook.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GrapplingHook.java index 12dca5c31..0dd62fd91 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GrapplingHook.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GrapplingHook.java @@ -71,7 +71,7 @@ public class GrapplingHook extends SimpleSlimefunItem { // To fix issue #253 Slimefun.runSync(() -> { if (utilities.jumpState.containsKey(uuid)) { - utilities.arrows.remove(uuid); + SlimefunPlugin.getBowListener().getBows().remove(uuid); for (Entity n : utilities.remove.get(uuid)) { if (n.isValid()) n.remove(); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/IcyBow.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/IcyBow.java new file mode 100644 index 000000000..c9fe62705 --- /dev/null +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/IcyBow.java @@ -0,0 +1,31 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBow; +import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; + +public class IcyBow extends SlimefunBow { + + public IcyBow(SlimefunItemStack item, ItemStack[] recipe) { + super(item, recipe); + } + + @Override + public BowShootHandler onShoot() { + return (e, n) -> { + n.getWorld().playEffect(n.getLocation(), Effect.STEP_SOUND, Material.ICE); + n.getWorld().playEffect(n.getEyeLocation(), Effect.STEP_SOUND, Material.ICE); + n.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 20 * 2, 10)); + n.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 20 * 2, -10)); + }; + } + + + +} diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/gps/GPSTransmitter.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/gps/GPSTransmitter.java index ff434d6a6..dbd26c1c2 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/gps/GPSTransmitter.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/electric/gps/GPSTransmitter.java @@ -17,7 +17,6 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; @@ -35,7 +34,7 @@ public abstract class GPSTransmitter extends SimpleSlimefunItem { @Override public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { - Slimefun.getGPSNetwork().updateTransmitter(b.getLocation(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); + SlimefunPlugin.getGPSNetwork().updateTransmitter(b.getLocation(), UUID.fromString(BlockStorage.getLocationInfo(b.getLocation(), "owner")), NetworkStatus.OFFLINE); return true; } }); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BowShootHandler.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BowShootHandler.java index 305da3110..5a20590a6 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BowShootHandler.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/handlers/BowShootHandler.java @@ -6,7 +6,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; @FunctionalInterface public interface BowShootHandler extends ItemHandler { - boolean onHit(EntityDamageByEntityEvent e, LivingEntity n); + void onHit(EntityDamageByEntityEvent e, LivingEntity n); @Override default Class getIdentifier() { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index 06ec26f31..a435bfd72 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -18,14 +18,11 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import org.bukkit.util.Vector; import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; @@ -50,7 +47,6 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingAlloy; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBow; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundBackpack; @@ -67,6 +63,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo.CargoOutputNode; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.Bandage; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.DietCookie; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.EnderBackpack; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.ExplosiveBow; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.ExplosivePickaxe; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.ExplosiveShovel; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.FortuneCookie; @@ -74,6 +71,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.GoldPan; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.GrapplingHook; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.HerculesPickaxe; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.HunterTalisman; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.IcyBow; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.InfernalBonemeal; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.KnowledgeFlask; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.KnowledgeTome; @@ -169,7 +167,6 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.PressureChambe import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.Smeltery; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.TableSaw; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockPlaceHandler; -import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemUseHandler; import me.mrCookieSlime.Slimefun.Objects.handlers.MultiBlockInteractionHandler; import me.mrCookieSlime.Slimefun.Objects.tasks.RainbowTicker; @@ -1397,40 +1394,13 @@ public final class SlimefunSetup { new ItemStack[] {null, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGIC_EYE_OF_ENDER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGICAL_BOOK_COVER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGIC_EYE_OF_ENDER, SlimefunItems.ENDER_LUMP_3, null}) .register(true); - new SlimefunBow((SlimefunItemStack) SlimefunItems.EXPLOSIVE_BOW, + new ExplosiveBow((SlimefunItemStack) SlimefunItems.EXPLOSIVE_BOW, new ItemStack[] {null, new ItemStack(Material.STICK), new ItemStack(Material.GUNPOWDER), SlimefunItems.STAFF_FIRE, null, SlimefunItems.SULFATE, null, new ItemStack(Material.STICK), new ItemStack(Material.GUNPOWDER)}) - .register(true, new BowShootHandler() { + .register(true); - @Override - public boolean onHit(EntityDamageByEntityEvent e, LivingEntity n) { - if (SlimefunManager.isItemSimilar(SlimefunPlugin.getUtilities().arrows.get(e.getDamager().getUniqueId()), SlimefunItems.EXPLOSIVE_BOW, true)) { - Vector vector = n.getVelocity(); - vector.setY(0.6); - n.setVelocity(vector); - n.getWorld().createExplosion(n.getLocation(), 0F); - n.getWorld().playSound(n.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F); - return true; - } - else return false; - } - }); - - new SlimefunBow((SlimefunItemStack) SlimefunItems.ICY_BOW, + new IcyBow((SlimefunItemStack) SlimefunItems.ICY_BOW, new ItemStack[] {null, new ItemStack(Material.STICK), new ItemStack(Material.ICE), SlimefunItems.STAFF_WATER, null, new ItemStack(Material.PACKED_ICE), null, new ItemStack(Material.STICK), new ItemStack(Material.ICE)}) - .register(true, new BowShootHandler() { - - @Override - public boolean onHit(EntityDamageByEntityEvent e, LivingEntity n) { - if (SlimefunManager.isItemSimilar(SlimefunPlugin.getUtilities().arrows.get(e.getDamager().getUniqueId()), SlimefunItems.ICY_BOW, true)) { - n.getWorld().playEffect(n.getLocation(), Effect.STEP_SOUND, Material.ICE); - n.getWorld().playEffect(n.getEyeLocation(), Effect.STEP_SOUND, Material.ICE); - n.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 20 * 2, 10)); - n.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 20 * 2, -10)); - return true; - } - else return false; - } - }); + .register(true); new KnowledgeTome(Categories.MAGIC, (SlimefunItemStack) SlimefunItems.TOME_OF_KNOWLEDGE_SHARING, RecipeType.MAGIC_WORKBENCH, new ItemStack[] {null, new ItemStack(Material.FEATHER), null, new ItemStack(Material.INK_SAC), SlimefunItems.MAGICAL_BOOK_COVER, new ItemStack(Material.GLASS_BOTTLE), null, new ItemStack(Material.WRITABLE_BOOK), null}) diff --git a/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java b/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java index aa0eadf88..98edaed31 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java @@ -111,48 +111,17 @@ public final class SlimefunPlugin extends JavaPlugin { private AncientAltarListener ancientAltarListener; private BackpackListener backpackListener; + private SlimefunBowListener bowListener; @Override public void onEnable() { if (getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) { - - String currentVersion = ReflectionUtils.getVersion(); - - if (currentVersion.startsWith("v")) { - boolean compatibleVersion = false; - StringBuilder versions = new StringBuilder(); - - int i = 0; - for (String version : supported) { - if (currentVersion.startsWith(version)) { - compatibleVersion = true; - } - - String s = version.substring(1).replaceFirst("_", ".").replace("_", ".X"); - if (i == 0) versions.append(s); - else if (i == supported.length - 1) versions.append(" or ").append(s); - else versions.append(", ").append(s); - - i++; - } - - // Looks like you are using an unsupported Minecraft Version - if (!compatibleVersion) { - getLogger().log(Level.SEVERE, "### Slimefun was not installed correctly!"); - getLogger().log(Level.SEVERE, "###"); - getLogger().log(Level.SEVERE, "### You are using the wrong Version of Minecraft!"); - getLogger().log(Level.SEVERE, "###"); - getLogger().log(Level.SEVERE, "### You are using Minecraft " + ReflectionUtils.getVersion()); - getLogger().log(Level.SEVERE, "### but Slimefun v" + getDescription().getVersion() + " requires you to be using"); - getLogger().log(Level.SEVERE, "### Minecraft {0}", versions); - getLogger().log(Level.SEVERE, "###"); - getLogger().log(Level.SEVERE, "### Please use an older Version of Slimefun and disable auto-updating"); - getLogger().log(Level.SEVERE, "### or consider updating your Server Software."); - getServer().getPluginManager().disablePlugin(this); - return; - } + + if (isVersionUnsupported()) { + getServer().getPluginManager().disablePlugin(this); + return; } - + instance = this; // Creating all necessary Folders @@ -197,7 +166,7 @@ public final class SlimefunPlugin extends JavaPlugin { try { SlimefunSetup.setupItems(); } catch (Exception x) { - getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + Slimefun.getVersion(), x); + getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + getVersion(), x); } getLogger().log(Level.INFO, "Loading Researches..."); @@ -229,7 +198,6 @@ public final class SlimefunPlugin extends JavaPlugin { new GearListener(this); new AutonomousToolsListener(this); new DamageListener(this); - new SlimefunBowListener(this); new BlockListener(this); new EnhancedFurnaceListener(this); new TeleporterListener(this); @@ -240,7 +208,8 @@ public final class SlimefunPlugin extends JavaPlugin { new ExplosionsListener(this); new DebugFishListener(this); new VanillaMachinesListener(this); - + + bowListener = new SlimefunBowListener(this); ancientAltarListener = new AncientAltarListener(); // Toggleable Listeners for performance @@ -299,7 +268,7 @@ public final class SlimefunPlugin extends JavaPlugin { ticker.run(); } catch(Exception x) { - getLogger().log(Level.SEVERE, "An Exception was caught while ticking the Block Tickers Task for Slimefun v" + Slimefun.getVersion(), x); + getLogger().log(Level.SEVERE, "An Exception was caught while ticking the Block Tickers Task for Slimefun v" + getVersion(), x); ticker.abortTick(); } }, 100L, config.getInt("URID.custom-ticker-delay")); @@ -331,6 +300,46 @@ public final class SlimefunPlugin extends JavaPlugin { } } + private boolean isVersionUnsupported() { + String currentVersion = ReflectionUtils.getVersion(); + + if (currentVersion.startsWith("v")) { + boolean compatibleVersion = false; + StringBuilder versions = new StringBuilder(); + + int i = 0; + for (String version : supported) { + if (currentVersion.startsWith(version)) { + compatibleVersion = true; + } + + String s = version.substring(1).replaceFirst("_", ".").replace("_", ".X"); + if (i == 0) versions.append(s); + else if (i == supported.length - 1) versions.append(" or ").append(s); + else versions.append(", ").append(s); + + i++; + } + + // Looks like you are using an unsupported Minecraft Version + if (!compatibleVersion) { + getLogger().log(Level.SEVERE, "### Slimefun was not installed correctly!"); + getLogger().log(Level.SEVERE, "###"); + getLogger().log(Level.SEVERE, "### You are using the wrong Version of Minecraft!"); + getLogger().log(Level.SEVERE, "###"); + getLogger().log(Level.SEVERE, "### You are using Minecraft " + ReflectionUtils.getVersion()); + getLogger().log(Level.SEVERE, "### but Slimefun v" + getDescription().getVersion() + " requires you to be using"); + getLogger().log(Level.SEVERE, "### Minecraft {0}", versions); + getLogger().log(Level.SEVERE, "###"); + getLogger().log(Level.SEVERE, "### Please use an older Version of Slimefun and disable auto-updating"); + getLogger().log(Level.SEVERE, "### or consider updating your Server Software."); + return true; + } + } + + return false; + } + @Override public void onDisable() { // CS-CoreLib wasn't loaded, just disabling @@ -359,7 +368,7 @@ public final class SlimefunPlugin extends JavaPlugin { getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"" + world.getName() + "\""); } } catch (Exception x) { - getLogger().log(Level.SEVERE, "An Error occured while saving Slimefun-Blocks in World '" + world.getName() + "' for Slimefun " + Slimefun.getVersion(), x); + getLogger().log(Level.SEVERE, "An Error occured while saving Slimefun-Blocks in World '" + world.getName() + "' for Slimefun " + getVersion(), x); } } @@ -474,5 +483,9 @@ public final class SlimefunPlugin extends JavaPlugin { public static BackpackListener getBackpackListener() { return instance.backpackListener; } + + public static SlimefunBowListener getBowListener() { + return instance.bowListener; + } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java index 997e97e57..752cbc026 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -486,10 +486,11 @@ public class BlockStorage { if (destroy) { if (storage.hasInventory(l)) storage.clearInventory(l); - - if (storage.hasUniversalInventory(l)) { - storage.getUniversalInventory(l).close(); - storage.getUniversalInventory(l).save(); + + UniversalBlockMenu universalInventory = getUniversalInventory(l); + if (universalInventory != null) { + universalInventory.close(); + universalInventory.save(); } String chunkString = locationToChunkString(l); @@ -660,7 +661,7 @@ public class BlockStorage { if (menu != null) { for (HumanEntity human : new ArrayList<>(menu.toInventory().getViewers())) { // Prevents "java.lang.IllegalStateException: Asynchronous entity add!" when closing inventory while holding an item - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, human::closeInventory); + Slimefun.runSync(human::closeInventory); } inventories.get(l).delete(l); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java b/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java index 5d5db44e7..4092d74b5 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java @@ -15,6 +15,8 @@ import java.util.logging.Level; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; + public final class SlimefunBackup { private SlimefunBackup() {} @@ -118,7 +120,7 @@ public final class SlimefunBackup { Slimefun.getLogger().log(Level.WARNING, "Could not create backup-file: " + file.getName()); } } catch(IOException x) { - Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a World-Backup for Slimefun " + Slimefun.getVersion(), x); + Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a World-Backup for Slimefun " + SlimefunPlugin.getVersion(), x); } } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/TickerTask.java b/src/main/java/me/mrCookieSlime/Slimefun/api/TickerTask.java index ba9326915..f16131fd5 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/TickerTask.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/TickerTask.java @@ -24,9 +24,9 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; +import io.github.thebusybiscuit.cscorelib2.chat.json.ChatComponent; +import io.github.thebusybiscuit.cscorelib2.chat.json.HoverEvent; import io.github.thebusybiscuit.slimefun4.api.ErrorReport; -import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage; -import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage.HoverAction; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; @@ -215,29 +215,31 @@ public class TickerTask implements Runnable { .collect(Collectors.toList()); if (sender instanceof Player) { - TellRawMessage tellraw = new TellRawMessage(); - tellraw.addText(" &7&oHover for more Info"); - StringBuilder hover = new StringBuilder(); + ChatComponent component = new ChatComponent(ChatColors.color(" &7&oHover for more Info")); + StringBuilder builder = new StringBuilder(); int hidden = 0; for (Map.Entry entry : timings) { int count = machineCount.get(entry.getKey()); - if (entry.getValue() > 500_000) - hover.append("\n&c").append(entry.getKey()).append(" - ") - .append(count).append("x &7(").append(toMillis(entry.getValue())).append(", ") - .append(toMillis(entry.getValue() / count)).append(" avg/machine)"); - else - hidden++; + + if (entry.getValue() > 500_000) { + builder.append("\n&c") + .append(entry.getKey()) + .append(" - ") + .append(count) + .append("x &7(") + .append(toMillis(entry.getValue())) + .append(", ") + .append(toMillis(entry.getValue() / count)) + .append(" avg/machine)"); + } + else hidden++; } - hover.append("\n\n&c+ &4").append(hidden).append(" Hidden"); - tellraw.addHoverEvent(HoverAction.SHOW_TEXT, hover.toString()); + builder.append("\n\n&c+ &4").append(hidden).append(" Hidden"); + component.setHoverEvent(new HoverEvent(builder.toString())); - try { - tellraw.send((Player) sender); - } catch (Exception x) { - Slimefun.getLogger().log(Level.SEVERE, "An Error occurred while sending a Timings Summary for Slimefun " + Slimefun.getVersion(), x); - } + component.sendMessage((Player) sender); } else { int hidden = 0; @@ -261,33 +263,33 @@ public class TickerTask implements Runnable { .collect(Collectors.toList()); if (sender instanceof Player) { - TellRawMessage tellraw = new TellRawMessage(); - tellraw.addText(" &7&oHover for more Info"); - StringBuilder hover = new StringBuilder(); + ChatComponent component = new ChatComponent(ChatColors.color(" &7&oHover for more Info")); + StringBuilder builder = new StringBuilder(); int hidden = 0; for (Map.Entry entry : timings) { if (!chunksSkipped.contains(entry.getKey())) { - if (entry.getValue() > 0) - hover.append("\n&c").append(formatChunk(entry.getKey())).append(" - ") - .append(chunkItemCount.getOrDefault(entry.getKey(), 0)) - .append("x &7(").append(toMillis(entry.getValue())).append(")"); - else - hidden++; + if (entry.getValue() > 0) { + builder.append("\n&c") + .append(formatChunk(entry.getKey())) + .append(" - ") + .append(chunkItemCount.getOrDefault(entry.getKey(), 0)) + .append("x &7(") + .append(toMillis(entry.getValue())) + .append(")"); + } + else hidden++; } } - hover.append("\n\n&c+ &4").append(hidden).append(" Hidden"); - tellraw.addHoverEvent(HoverAction.SHOW_TEXT, hover.toString()); + builder.append("\n\n&c+ &4").append(hidden).append(" Hidden"); + component.setHoverEvent(new HoverEvent(builder.toString())); - try { - tellraw.send((Player) sender); - } catch (Exception x) { - Slimefun.getLogger().log(Level.SEVERE, "An Error occurred while sending a Timings Summary for Slimefun " + Slimefun.getVersion(), x); - } + component.sendMessage((Player) sender); } else { int hidden = 0; + for (Map.Entry entry : timings) { if (!chunksSkipped.contains(entry.getKey())) { if (entry.getValue() > 0) sender.sendMessage(" " + formatChunk(entry.getKey()) + " - " @@ -295,7 +297,8 @@ public class TickerTask implements Runnable { else hidden++; } } - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c+ &4" + hidden + " Hidden")); + + sender.sendMessage(ChatColors.color("&c+ &4" + hidden + " Hidden")); } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java index 9f8bdea76..c8ab691be 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java @@ -61,6 +61,9 @@ public class CargoNet extends Network { private final Set imports = new HashSet<>(); private final Set exports = new HashSet<>(); + private final Map roundRobin = new HashMap<>(); + private final Set itemRequests = new HashSet<>(); + public static CargoNet getNetworkFromLocation(Location l) { return SlimefunPlugin.getNetworkManager().getNetworkFromLocation(l, CargoNet.class); } @@ -219,7 +222,7 @@ public class CargoNet extends Network { } if (menu.getItemInSlot(17) != null) { - SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(bus, 17, menu.getItemInSlot(17), ItemTransportFlow.INSERT)); + itemRequests.add(new ItemRequest(bus, 17, menu.getItemInSlot(17), ItemTransportFlow.INSERT)); } } @@ -246,7 +249,7 @@ public class CargoNet extends Network { if (index > (items.size() - 1)) index = 0; BlockStorage.addBlockInfo(bus, "index", String.valueOf(index)); - SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(bus, 17, items.get(index), ItemTransportFlow.WITHDRAW)); + itemRequests.add(new ItemRequest(bus, 17, items.get(index), ItemTransportFlow.WITHDRAW)); } } } @@ -256,11 +259,11 @@ public class CargoNet extends Network { ItemStack sendingItem = menu.getItemInSlot(TERMINAL_OUT_SLOT); if (sendingItem != null) { - SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(terminal, TERMINAL_OUT_SLOT, sendingItem, ItemTransportFlow.INSERT)); + itemRequests.add(new ItemRequest(terminal, TERMINAL_OUT_SLOT, sendingItem, ItemTransportFlow.INSERT)); } } - Iterator iterator = SlimefunPlugin.getUtilities().itemRequests.iterator(); + Iterator iterator = itemRequests.iterator(); while (iterator.hasNext()) { ItemRequest request = iterator.next(); @@ -367,7 +370,7 @@ public class CargoNet extends Network { List outputlist = new ArrayList<>(outputs); if (roundrobin) { - int cIndex = SlimefunPlugin.getUtilities().roundRobin.getOrDefault(input, 0); + int cIndex = roundRobin.getOrDefault(input, 0); if (cIndex < outputlist.size()) { for (int i = 0; i < cIndex; i++) { @@ -379,7 +382,7 @@ public class CargoNet extends Network { } else cIndex = 1; - SlimefunPlugin.getUtilities().roundRobin.put(input, cIndex); + roundRobin.put(input, cIndex); } for (Location out : outputlist) { @@ -418,7 +421,7 @@ public class CargoNet extends Network { UniversalBlockMenu menu = BlockStorage.getUniversalInventory(target); if (menu != null) { - for (int slot : menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { + for (int slot : menu.getPreset().getSlotsAccessedByItemTransport((DirtyChestMenu) menu, ItemTransportFlow.WITHDRAW, null)) { ItemStack is = menu.getItemInSlot(slot); filter(is, items, l); } @@ -502,7 +505,7 @@ public class CargoNet extends Network { menu.replaceExistingItem(slot, stack); menu.addMenuClickHandler(slot, (p, sl, is, action) -> { int amount = item.getAmount() > item.getItem().getMaxStackSize() ? item.getItem().getMaxStackSize() : item.getAmount(); - SlimefunPlugin.getUtilities().itemRequests.add(new ItemRequest(l, 44, new CustomItem(item.getItem(), action.isRightClicked() ? amount : 1), ItemTransportFlow.WITHDRAW)); + itemRequests.add(new ItemRequest(l, 44, new CustomItem(item.getItem(), action.isRightClicked() ? amount : 1), ItemTransportFlow.WITHDRAW)); return false; }); @@ -537,7 +540,7 @@ public class CargoNet extends Network { return freq; } - private void handleWithdraw(BlockMenu menu, List items, Location l) { + private void handleWithdraw(DirtyChestMenu menu, List items, Location l) { for (int slot : menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { filter(menu.getItemInSlot(slot), items, l); } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java b/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java index 76c5623fa..94a0242f1 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/utils/Utilities.java @@ -27,7 +27,6 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler; import me.mrCookieSlime.Slimefun.Setup.PostSlimefunLoadingHandler; -import me.mrCookieSlime.Slimefun.ancient_altar.AltarRecipe; import me.mrCookieSlime.Slimefun.api.BlockInfoConfig; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.GuideHandler; @@ -35,7 +34,6 @@ import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; import me.mrCookieSlime.Slimefun.api.item_transport.CargoTransportEvent; -import me.mrCookieSlime.Slimefun.api.item_transport.ItemRequest; /** * Really dirty way to store stuff, but you can dump @@ -78,9 +76,6 @@ public final class Utilities { public final Set energyNetInput = new HashSet<>(); public final Set energyNetStorage = new HashSet<>(); public final Set energyNetOutput = new HashSet<>(); - - public final Map roundRobin = new HashMap<>(); - public final Set itemRequests = new HashSet<>(); public final Map blockMenuPresets = new HashMap<>(); @@ -100,7 +95,6 @@ public final class Utilities { public final Map> drops = new EnumMap<>(EntityType.class); - public final Map arrows = new HashMap<>(); public final Map jumpState = new HashMap<>(); public final Set damage = new HashSet<>(); public final Map remove = new HashMap<>();