diff --git a/eco-core/core-plugin/out/production/resources/config.yml b/eco-core/core-plugin/out/production/resources/config.yml new file mode 100644 index 00000000..ae2ad118 --- /dev/null +++ b/eco-core/core-plugin/out/production/resources/config.yml @@ -0,0 +1,14 @@ +# +# eco +# by Auxilor +# + + +# Options to fix villager bugs left behind from old (buggy) versions. +disable-display-on-villagers: false +villager-display-fix: false + +# DropQueue by default uses a faster collated queue system where all drops +# that originate from the same player on the same tick are dropped together. +# Disable it if it changes drop mechanics too much for you. +use-fast-collated-drops: true \ No newline at end of file diff --git a/eco-core/core-plugin/out/production/resources/lang.yml b/eco-core/core-plugin/out/production/resources/lang.yml new file mode 100644 index 00000000..7d1dc50a --- /dev/null +++ b/eco-core/core-plugin/out/production/resources/lang.yml @@ -0,0 +1 @@ +multiple-in-craft: '&l&c! &fThis recipe requires &a%amount%&f of this item.' \ No newline at end of file diff --git a/eco-core/core-plugin/out/production/resources/plugin.yml b/eco-core/core-plugin/out/production/resources/plugin.yml new file mode 100644 index 00000000..3b0f20f2 --- /dev/null +++ b/eco-core/core-plugin/out/production/resources/plugin.yml @@ -0,0 +1,28 @@ +name: eco +version: ${projectVersion} +main: com.willfp.eco.spigot.EcoHandler +api-version: 1.16 +authors: [Auxilor] +website: willfp.com +depend: + - ProtocolLib +softdepend: + - WorldGuard + - GriefPrevention + - Towny + - FactionsUUID + - Lands + - Kingdoms + - NoCheatPlus + - AAC + - Matrix + - Spartan + - PlaceholderAPI + - mcMMO + - CombatLogX +libraries: + - org.reflections:reflections:0.9.12 + - org.apache.maven:maven-artifact:3.0.3 + - net.kyori:adventure-text-serializer-gson:4.8.1 + - net.kyori:adventure-text-serializer-legacy:4.8.1 + - org.jetbrains.kotlin:kotlin-stdlib:1.5.21 \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/arrows/ArrowDataListener.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/arrows/ArrowDataListener.java deleted file mode 100644 index 897fcff5..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/arrows/ArrowDataListener.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.willfp.eco.spigot.arrows; - -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.core.PluginDependent; -import org.bukkit.Material; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.ProjectileLaunchEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; - -public class ArrowDataListener extends PluginDependent implements Listener { - public ArrowDataListener(@NotNull final EcoPlugin plugin) { - super(plugin); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void onLaunch(final ProjectileLaunchEvent event) { - if (!(event.getEntity() instanceof Arrow arrow)) { - return; - } - - if (!(arrow.getShooter() instanceof LivingEntity entity)) { - return; - } - - if (entity.getEquipment() == null) { - return; - } - - ItemStack item = entity.getEquipment().getItemInMainHand(); - - if (item.getType().equals(Material.AIR) || !item.hasItemMeta() || item.getItemMeta() == null) { - return; - } - - arrow.setMetadata("shot-from", this.getPlugin().getMetadataValueFactory().create(item)); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketAutoRecipe.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketAutoRecipe.java deleted file mode 100644 index 737fbd5a..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketAutoRecipe.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.willfp.eco.spigot.display; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import com.willfp.eco.core.AbstractPacketAdapter; -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.proxy.AutoCraftProxy; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.InvocationTargetException; - -public class PacketAutoRecipe extends AbstractPacketAdapter { - public PacketAutoRecipe(@NotNull final EcoPlugin plugin) { - super(plugin, PacketType.Play.Server.AUTO_RECIPE, false); - } - - @Override - public void onSend(@NotNull final PacketContainer packet, - @NotNull final Player player, - @NotNull final PacketEvent event) { - if (!EcoPlugin.getPluginNames().contains(packet.getMinecraftKeys().getValues().get(0).getFullKey().split(":")[0])) { - return; - } - - if (packet.getMinecraftKeys().getValues().get(0).getFullKey().split(":")[1].contains("displayed")) { - return; - } - - try { - this.getPlugin().getProxy(AutoCraftProxy.class).modifyPacket(packet.getHandle()); - } catch (NoSuchFieldException | IllegalAccessException e) { - e.printStackTrace(); - } - - PacketContainer newAutoRecipe = new PacketContainer(PacketType.Play.Server.AUTO_RECIPE); - newAutoRecipe.getMinecraftKeys().write(0, packet.getMinecraftKeys().read(0)); - - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, newAutoRecipe); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketChat.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketChat.java deleted file mode 100644 index c540abc2..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketChat.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.willfp.eco.spigot.display; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import com.willfp.eco.core.AbstractPacketAdapter; -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.proxy.ChatComponentProxy; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class PacketChat extends AbstractPacketAdapter { - public PacketChat(@NotNull final EcoPlugin plugin) { - super(plugin, PacketType.Play.Server.CHAT, ListenerPriority.MONITOR, true); - } - - @Override - public void onSend(@NotNull final PacketContainer packet, - @NotNull final Player player, - @NotNull final PacketEvent event) { - for (int i = 0; i < packet.getChatComponents().size(); i++) { - WrappedChatComponent component = packet.getChatComponents().read(i); - if (component == null) { - continue; - } - - if (component.getHandle() == null) { - return; - } - - WrappedChatComponent newComponent = WrappedChatComponent.fromHandle(this.getPlugin().getProxy(ChatComponentProxy.class).modifyComponent(component.getHandle(), player)); - packet.getChatComponents().write(i, newComponent); - } - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketOpenWindowMerchant.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketOpenWindowMerchant.java deleted file mode 100644 index 1f09e437..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketOpenWindowMerchant.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.willfp.eco.spigot.display; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import com.willfp.eco.core.AbstractPacketAdapter; -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.proxy.VillagerTradeProxy; -import com.willfp.eco.util.NamespacedKeyUtils; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.MerchantRecipe; -import org.bukkit.inventory.meta.ItemMeta; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public class PacketOpenWindowMerchant extends AbstractPacketAdapter { - public PacketOpenWindowMerchant(@NotNull final EcoPlugin plugin) { - super(plugin, PacketType.Play.Server.OPEN_WINDOW_MERCHANT, ListenerPriority.MONITOR, true); - } - - @Override - public void onSend(@NotNull final PacketContainer packet, - @NotNull final Player player, - @NotNull final PacketEvent event) { - List recipes = new ArrayList<>(); - - - /* - This awful, awful bit of code exists to fix a bug that existed in EcoEnchants - for too many versions. - */ - if (this.getPlugin().getConfigYml().getBool("villager-display-fix")) { - for (MerchantRecipe recipe : packet.getMerchantRecipeLists().read(0)) { - ItemStack result = recipe.getResult(); - ItemMeta meta = result.getItemMeta(); - if (meta != null) { - meta.removeItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_POTION_EFFECTS); - meta.getPersistentDataContainer().remove(NamespacedKeyUtils.create("ecoenchants", "ecoenchantlore-skip")); - result.setItemMeta(meta); - } - } - } - - for (MerchantRecipe recipe : packet.getMerchantRecipeLists().read(0)) { - MerchantRecipe newRecipe = this.getPlugin().getProxy(VillagerTradeProxy.class).displayTrade(recipe, player); - recipes.add(newRecipe); - } - - packet.getMerchantRecipeLists().write(0, recipes); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketSetCreativeSlot.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketSetCreativeSlot.java deleted file mode 100644 index 94a85c0f..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketSetCreativeSlot.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.willfp.eco.spigot.display; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import com.willfp.eco.core.AbstractPacketAdapter; -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.core.display.Display; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class PacketSetCreativeSlot extends AbstractPacketAdapter { - public PacketSetCreativeSlot(@NotNull final EcoPlugin plugin) { - super(plugin, PacketType.Play.Client.SET_CREATIVE_SLOT, false); - } - - @Override - public void onReceive(@NotNull final PacketContainer packet, - @NotNull final Player player, - @NotNull final PacketEvent event) { - packet.getItemModifier().modify(0, Display::revert); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketSetSlot.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketSetSlot.java deleted file mode 100644 index 09ff02f8..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketSetSlot.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.willfp.eco.spigot.display; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import com.willfp.eco.core.AbstractPacketAdapter; -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.core.display.Display; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class PacketSetSlot extends AbstractPacketAdapter { - public PacketSetSlot(@NotNull final EcoPlugin plugin) { - super(plugin, PacketType.Play.Server.SET_SLOT, false); - } - - @Override - public void onSend(@NotNull final PacketContainer packet, - @NotNull final Player player, - @NotNull final PacketEvent event) { - packet.getItemModifier().modify(0, item -> Display.display(item, player)); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketWindowItems.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketWindowItems.java deleted file mode 100644 index 1a03b04c..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/display/PacketWindowItems.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.willfp.eco.spigot.display; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import com.willfp.eco.core.AbstractPacketAdapter; -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.core.display.Display; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class PacketWindowItems extends AbstractPacketAdapter { - public PacketWindowItems(@NotNull final EcoPlugin plugin) { - super(plugin, PacketType.Play.Server.WINDOW_ITEMS, false); - } - - @Override - public void onSend(@NotNull final PacketContainer packet, - @NotNull final Player player, - @NotNull final PacketEvent event) { - packet.getItemListModifier().modify(0, itemStacks -> { - if (itemStacks == null) { - return null; - } - itemStacks.forEach(item -> Display.display(item, player)); - return itemStacks; - }); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityBuilder.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityBuilder.java deleted file mode 100644 index 386d11d3..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityBuilder.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.willfp.eco.spigot.eventlisteners; - -import com.willfp.eco.core.events.EntityDeathByEntityEvent; -import lombok.Getter; -import lombok.Setter; -import org.apache.commons.lang.Validate; -import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -class EntityDeathByEntityBuilder { - @Getter - @Setter - private LivingEntity victim = null; - - @Getter - @Setter - private Entity damager; - - @Getter - @Setter - private EntityDeathEvent deathEvent; - - @Getter - @Setter - private List drops; - - @Getter - @Setter - private int xp = 0; - - public void push() { - Validate.notNull(victim); - Validate.notNull(damager); - Validate.notNull(drops); - Validate.notNull(deathEvent); - - EntityDeathByEntityEvent event = new EntityDeathByEntityEvent(victim, damager, drops, xp, deathEvent); - - Bukkit.getPluginManager().callEvent(event); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityListeners.java deleted file mode 100644 index 146330d0..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityListeners.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.willfp.eco.spigot.eventlisteners; - -import com.willfp.eco.core.EcoPlugin; -import com.willfp.eco.core.PluginDependent; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; - -public class EntityDeathByEntityListeners extends PluginDependent implements Listener { - private final Set events = new HashSet<>(); - - public EntityDeathByEntityListeners(@NotNull final EcoPlugin plugin) { - super(plugin); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onEntityDamage(@NotNull final EntityDamageByEntityEvent event) { - if (!(event.getEntity() instanceof LivingEntity victim)) { - return; - } - - if (victim.getHealth() > event.getFinalDamage()) { - return; - } - - EntityDeathByEntityBuilder builtEvent = new EntityDeathByEntityBuilder(); - builtEvent.setVictim(victim); - builtEvent.setDamager(event.getDamager()); - events.add(builtEvent); - - this.getPlugin().getScheduler().runLater(() -> events.remove(builtEvent), 1); - } - - @EventHandler - public void onEntityDeath(@NotNull final EntityDeathEvent event) { - LivingEntity victim = event.getEntity(); - - List drops = event.getDrops(); - int xp = event.getDroppedExp(); - - AtomicReference atomicBuiltEvent = new AtomicReference<>(null); - EntityDeathByEntityBuilder builtEvent; - - events.forEach(deathByEntityEvent -> { - if (deathByEntityEvent.getVictim().equals(victim)) { - atomicBuiltEvent.set(deathByEntityEvent); - } - }); - - if (atomicBuiltEvent.get() == null) { - return; - } - - builtEvent = atomicBuiltEvent.get(); - events.remove(builtEvent); - builtEvent.setDrops(drops); - builtEvent.setXp(xp); - builtEvent.setDeathEvent(event); - - builtEvent.push(); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/NaturalExpGainBuilder.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/NaturalExpGainBuilder.java deleted file mode 100644 index 4e5744d7..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/NaturalExpGainBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.willfp.eco.spigot.eventlisteners; - -import com.willfp.eco.core.events.NaturalExpGainEvent; -import lombok.Getter; -import lombok.Setter; -import org.apache.commons.lang.Validate; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.event.player.PlayerExpChangeEvent; -import org.jetbrains.annotations.NotNull; - -class NaturalExpGainBuilder { - @Getter - @Setter - private boolean cancelled = false; - - @Getter - @Setter - private PlayerExpChangeEvent event; - - @Getter - @Setter - private Location location; - - @Getter - @Setter - private BuildReason reason; - - NaturalExpGainBuilder(@NotNull final BuildReason reason) { - this.reason = reason; - } - - public void push() { - Validate.notNull(event); - if (this.cancelled) { - return; - } - - NaturalExpGainEvent naturalExpGainEvent = new NaturalExpGainEvent(event); - - Bukkit.getPluginManager().callEvent(naturalExpGainEvent); - } - - public enum BuildReason { - BOTTLE, - PLAYER - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/NaturalExpGainListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/NaturalExpGainListeners.java deleted file mode 100644 index 178420fb..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/NaturalExpGainListeners.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.willfp.eco.spigot.eventlisteners; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.ExpBottleEvent; -import org.bukkit.event.player.PlayerExpChangeEvent; -import org.jetbrains.annotations.NotNull; - -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -public class NaturalExpGainListeners implements Listener { - private final Set events = new HashSet<>(); - - @EventHandler - public void playerChange(@NotNull final PlayerExpChangeEvent event) { - NaturalExpGainBuilder builder = new NaturalExpGainBuilder(NaturalExpGainBuilder.BuildReason.PLAYER); - builder.setEvent(event); - - NaturalExpGainBuilder toRemove = null; - for (NaturalExpGainBuilder searchBuilder : events) { - if (!Objects.equals(searchBuilder.getLocation().getWorld(), event.getPlayer().getLocation().getWorld())) { - continue; - } - - if (searchBuilder.getReason().equals(NaturalExpGainBuilder.BuildReason.BOTTLE) && searchBuilder.getLocation().distanceSquared(event.getPlayer().getLocation()) > 52) { - toRemove = searchBuilder; - } - } - - if (toRemove != null) { - events.remove(toRemove); - return; - } - - builder.setEvent(event); - builder.push(); - - events.remove(builder); - } - - @EventHandler - public void onExpBottle(@NotNull final ExpBottleEvent event) { - NaturalExpGainBuilder builtEvent = new NaturalExpGainBuilder(NaturalExpGainBuilder.BuildReason.BOTTLE); - builtEvent.setLocation(event.getEntity().getLocation()); - - events.add(builtEvent); - } -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/PlayerJumpListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/PlayerJumpListeners.java deleted file mode 100644 index ac05cd24..00000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/eventlisteners/PlayerJumpListeners.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.willfp.eco.spigot.eventlisteners; - -import com.willfp.eco.core.events.PlayerJumpEvent; -import com.willfp.eco.core.integrations.mcmmo.McmmoManager; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.potion.PotionEffectType; -import org.jetbrains.annotations.NotNull; - -import java.text.DecimalFormat; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - -@SuppressWarnings("deprecation") -public class PlayerJumpListeners implements Listener { - private static final Set PREVIOUS_PLAYERS_ON_GROUND = new HashSet<>(); - - private static final DecimalFormat FORMAT = new DecimalFormat("0.00"); - - @EventHandler(ignoreCancelled = true) - public void onJump(@NotNull final PlayerMoveEvent event) { - if (McmmoManager.isFake(event)) { - return; - } - - Player player = event.getPlayer(); - if (player.getVelocity().getY() > 0) { - float jumpVelocity = 0.42f; - if (player.hasPotionEffect(PotionEffectType.JUMP)) { - jumpVelocity += ((float) player.getPotionEffect(PotionEffectType.JUMP).getAmplifier() + 1) * 0.1F; - } - jumpVelocity = Float.parseFloat(FORMAT.format(jumpVelocity).replace(',', '.')); - if (event.getPlayer().getLocation().getBlock().getType() != Material.LADDER - && PREVIOUS_PLAYERS_ON_GROUND.contains(player.getUniqueId()) - && !player.isOnGround() - && Float.compare((float) player.getVelocity().getY(), jumpVelocity) == 0) { - Bukkit.getPluginManager().callEvent(new PlayerJumpEvent(event)); - } - } - if (player.isOnGround()) { - PREVIOUS_PLAYERS_ON_GROUND.add(player.getUniqueId()); - } else { - PREVIOUS_PLAYERS_ON_GROUND.remove(player.getUniqueId()); - } - } -} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/arrows/ArrowDataListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/arrows/ArrowDataListener.kt new file mode 100644 index 00000000..bbd89874 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/arrows/ArrowDataListener.kt @@ -0,0 +1,43 @@ +package com.willfp.eco.spigot.arrows + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.PluginDependent +import org.bukkit.Material +import org.bukkit.entity.Arrow +import org.bukkit.entity.LivingEntity +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.entity.ProjectileLaunchEvent + +class ArrowDataListener( + plugin: EcoPlugin +) : PluginDependent(plugin), Listener { + + @EventHandler(priority = EventPriority.LOWEST) + fun onLaunch(event:ProjectileLaunchEvent) { + val arrow = event.entity + + if (arrow !is Arrow) { + return + } + + if (arrow.shooter !is LivingEntity) { + return + } + + val entity = arrow.shooter as LivingEntity + + if (entity.equipment == null) { + return + } + + val item = entity.equipment!!.itemInMainHand + + if (item.type == Material.AIR || !item.hasItemMeta() || item.itemMeta == null) { + return + } + + arrow.setMetadata("shot-from", this.plugin.metadataValueFactory.create(item)) + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketAutoRecipe.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketAutoRecipe.kt new file mode 100644 index 00000000..456e5e49 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketAutoRecipe.kt @@ -0,0 +1,40 @@ +package com.willfp.eco.spigot.display + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.ProtocolLibrary +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.events.PacketEvent +import com.willfp.eco.core.AbstractPacketAdapter +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.proxy.AutoCraftProxy +import org.bukkit.entity.Player +import java.lang.reflect.InvocationTargetException + +class PacketAutoRecipe(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.AUTO_RECIPE, false) { + override fun onSend( + packet: PacketContainer, + player: Player, + event: PacketEvent + ) { + if (!EcoPlugin.getPluginNames() + .contains(packet.minecraftKeys.values[0].fullKey.split(":".toRegex()).toTypedArray()[0]) + ) { + return + } + if (packet.minecraftKeys.values[0].fullKey.split(":".toRegex()).toTypedArray()[1].contains("displayed")) { + return + } + try { + getPlugin().getProxy(AutoCraftProxy::class.java).modifyPacket(packet.handle) + } catch (e: Exception) { + e.printStackTrace() + } + val newAutoRecipe = PacketContainer(PacketType.Play.Server.AUTO_RECIPE) + newAutoRecipe.minecraftKeys.write(0, packet.minecraftKeys.read(0)) + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, newAutoRecipe) + } catch (e: InvocationTargetException) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketChat.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketChat.kt new file mode 100644 index 00000000..59d6728d --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketChat.kt @@ -0,0 +1,33 @@ +package com.willfp.eco.spigot.display + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.ListenerPriority +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.events.PacketEvent +import com.comphenix.protocol.wrappers.WrappedChatComponent +import com.willfp.eco.core.AbstractPacketAdapter +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.proxy.ChatComponentProxy +import org.bukkit.entity.Player + +class PacketChat(plugin: EcoPlugin) : + AbstractPacketAdapter(plugin, PacketType.Play.Server.CHAT, ListenerPriority.MONITOR, true) { + override fun onSend( + packet: PacketContainer, + player: Player, + event: PacketEvent + ) { + for (i in 0 until packet.chatComponents.size()) { + val component = packet.chatComponents.read(i) ?: continue + if (component.handle == null) { + return + } + val newComponent = WrappedChatComponent.fromHandle( + getPlugin().getProxy( + ChatComponentProxy::class.java + ).modifyComponent(component.handle, player) + ) + packet.chatComponents.write(i, newComponent) + } + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketOpenWindowMerchant.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketOpenWindowMerchant.kt new file mode 100644 index 00000000..5e20eba9 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketOpenWindowMerchant.kt @@ -0,0 +1,48 @@ +package com.willfp.eco.spigot.display + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.ListenerPriority +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.events.PacketEvent +import com.willfp.eco.core.AbstractPacketAdapter +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.proxy.VillagerTradeProxy +import com.willfp.eco.util.NamespacedKeyUtils +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemFlag +import org.bukkit.inventory.MerchantRecipe + +class PacketOpenWindowMerchant(plugin: EcoPlugin) : + AbstractPacketAdapter(plugin, PacketType.Play.Server.OPEN_WINDOW_MERCHANT, ListenerPriority.MONITOR, true) { + override fun onSend( + packet: PacketContainer, + player: Player, + event: PacketEvent + ) { + val recipes: MutableList = ArrayList() + + + /* + This awful, awful bit of code exists to fix a bug that existed in EcoEnchants + for too many versions. + */ + if (getPlugin().configYml.getBool("villager-display-fix")) { + for (recipe in packet.merchantRecipeLists.read(0)) { + val result = recipe.result + val meta = result.itemMeta + if (meta != null) { + meta.removeItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_POTION_EFFECTS) + meta.persistentDataContainer.remove(NamespacedKeyUtils.create("ecoenchants", "ecoenchantlore-skip")) + result.itemMeta = meta + } + } + } + for (recipe in packet.merchantRecipeLists.read(0)) { + val newRecipe = getPlugin().getProxy(VillagerTradeProxy::class.java).displayTrade( + recipe!!, player + ) + recipes.add(newRecipe) + } + packet.merchantRecipeLists.write(0, recipes) + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketSetCreativeSlot.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketSetCreativeSlot.kt new file mode 100644 index 00000000..58fd4099 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketSetCreativeSlot.kt @@ -0,0 +1,25 @@ +package com.willfp.eco.spigot.display + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.events.PacketEvent +import com.willfp.eco.core.AbstractPacketAdapter +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.display.Display +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack + +class PacketSetCreativeSlot(plugin: EcoPlugin) : + AbstractPacketAdapter(plugin, PacketType.Play.Client.SET_CREATIVE_SLOT, false) { + override fun onReceive( + packet: PacketContainer, + player: Player, + event: PacketEvent + ) { + packet.itemModifier.modify(0) { itemStack: ItemStack? -> + Display.revert( + itemStack!! + ) + } + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketSetSlot.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketSetSlot.kt new file mode 100644 index 00000000..78a0a9cd --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketSetSlot.kt @@ -0,0 +1,24 @@ +package com.willfp.eco.spigot.display + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.events.PacketEvent +import com.willfp.eco.core.AbstractPacketAdapter +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.display.Display +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack + +class PacketSetSlot(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.SET_SLOT, false) { + override fun onSend( + packet: PacketContainer, + player: Player, + event: PacketEvent + ) { + packet.itemModifier.modify(0) { item: ItemStack? -> + Display.display( + item!!, player + ) + } + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketWindowItems.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketWindowItems.kt new file mode 100644 index 00000000..38406e01 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/display/PacketWindowItems.kt @@ -0,0 +1,31 @@ +package com.willfp.eco.spigot.display + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.events.PacketEvent +import com.willfp.eco.core.AbstractPacketAdapter +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.display.Display +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import java.util.function.Consumer + +class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.WINDOW_ITEMS, false) { + override fun onSend( + packet: PacketContainer, + player: Player, + event: PacketEvent + ) { + packet.itemListModifier.modify(0) { itemStacks: List? -> + if (itemStacks == null) { + return@modify null + } + itemStacks.forEach(Consumer { item: ItemStack -> + Display.display( + item, player + ) + }) + itemStacks + } + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityBuilder.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityBuilder.kt new file mode 100644 index 00000000..7a6902e2 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityBuilder.kt @@ -0,0 +1,30 @@ +package com.willfp.eco.spigot.eventlisteners + +import com.willfp.eco.core.events.EntityDeathByEntityEvent +import org.apache.commons.lang.Validate +import org.bukkit.Bukkit +import org.bukkit.entity.Entity +import org.bukkit.entity.LivingEntity +import org.bukkit.event.entity.EntityDeathEvent +import org.bukkit.inventory.ItemStack + +internal class EntityDeathByEntityBuilder { + var victim: LivingEntity? = null + + var damager: Entity? = null + + var deathEvent: EntityDeathEvent? = null + + var drops: List? = null + + var xp = 0 + fun push() { + + Validate.notNull(victim) + Validate.notNull(damager) + Validate.notNull(drops) + Validate.notNull(deathEvent) + val event = EntityDeathByEntityEvent(victim!!, damager!!, drops!!, xp, deathEvent!!) + Bukkit.getPluginManager().callEvent(event) + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityListeners.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityListeners.kt new file mode 100644 index 00000000..cdbb9a67 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/EntityDeathByEntityListeners.kt @@ -0,0 +1,65 @@ +package com.willfp.eco.spigot.eventlisteners + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.PluginDependent +import org.bukkit.entity.LivingEntity +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.entity.EntityDamageByEntityEvent +import org.bukkit.event.entity.EntityDeathEvent +import java.util.concurrent.atomic.AtomicReference + +class EntityDeathByEntityListeners( + plugin: EcoPlugin +) : PluginDependent(plugin), Listener { + private val events = HashSet(); + + @EventHandler(priority = EventPriority.HIGH) + fun onEntityDamage(event: EntityDamageByEntityEvent) { + if ((event.entity !is LivingEntity)) { + return; + } + + val victim = event.entity as LivingEntity + + if (victim.health > event.finalDamage) { + return; + } + + val builtEvent = EntityDeathByEntityBuilder() + builtEvent.victim = victim + builtEvent.damager = event.damager + events.add(builtEvent) + this.plugin.scheduler.runLater({ + events.remove(builtEvent) + }, 1) + } + + @EventHandler + fun onEntityDeath(event: EntityDeathEvent) { + val victim = event.entity + val drops = event.drops + val xp = event.droppedExp + + val atomicBuiltEvent = AtomicReference(null) + + for (builder in events) { + if (builder.victim == victim) { + atomicBuiltEvent.set(builder) + } + } + + if (atomicBuiltEvent.get() == null) { + return; + } + + val builtEvent = atomicBuiltEvent.get(); + events.remove(builtEvent); + builtEvent.drops = drops + builtEvent.xp = xp + builtEvent.deathEvent = event + + builtEvent.push(); + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/NaturalExpGainBuilder.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/NaturalExpGainBuilder.kt new file mode 100644 index 00000000..70f16066 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/NaturalExpGainBuilder.kt @@ -0,0 +1,26 @@ +package com.willfp.eco.spigot.eventlisteners + +import com.willfp.eco.core.events.NaturalExpGainEvent +import org.apache.commons.lang.Validate +import org.bukkit.Bukkit +import org.bukkit.Location +import org.bukkit.event.player.PlayerExpChangeEvent + +internal class NaturalExpGainBuilder(var reason: BuildReason) { + var cancelled = false + var event: PlayerExpChangeEvent? = null + var location: Location? = null + + fun push() { + Validate.notNull(event) + if (cancelled) { + return + } + val naturalExpGainEvent = NaturalExpGainEvent(event!!) + Bukkit.getPluginManager().callEvent(naturalExpGainEvent) + } + + enum class BuildReason { + BOTTLE, PLAYER + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/NaturalExpGainListeners.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/NaturalExpGainListeners.kt new file mode 100644 index 00000000..eb431de9 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/NaturalExpGainListeners.kt @@ -0,0 +1,42 @@ +package com.willfp.eco.spigot.eventlisteners + +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.entity.ExpBottleEvent +import org.bukkit.event.player.PlayerExpChangeEvent + +class NaturalExpGainListeners : Listener { + private val events: MutableSet = HashSet() + + @EventHandler + fun playerChange(event: PlayerExpChangeEvent) { + val builder = NaturalExpGainBuilder(NaturalExpGainBuilder.BuildReason.PLAYER) + builder.event = event + var toRemove: NaturalExpGainBuilder? = null + for (searchBuilder in events) { + if (searchBuilder.location!!.world != event.player.location.world) { + continue + } + if (searchBuilder.reason == NaturalExpGainBuilder.BuildReason.BOTTLE && searchBuilder.location!!.distanceSquared( + event.player.location + ) > 52 + ) { + toRemove = searchBuilder + } + } + if (toRemove != null) { + events.remove(toRemove) + return + } + builder.event = event + builder.push() + events.remove(builder) + } + + @EventHandler + fun onExpBottle(event: ExpBottleEvent) { + val builtEvent = NaturalExpGainBuilder(NaturalExpGainBuilder.BuildReason.BOTTLE) + builtEvent.location = event.entity.location + events.add(builtEvent) + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/PlayerJumpListeners.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/PlayerJumpListeners.kt new file mode 100644 index 00000000..470e93fd --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/eventlisteners/PlayerJumpListeners.kt @@ -0,0 +1,46 @@ +package com.willfp.eco.spigot.eventlisteners + +import com.willfp.eco.core.events.PlayerJumpEvent +import com.willfp.eco.core.integrations.mcmmo.McmmoManager +import org.bukkit.Bukkit +import org.bukkit.Material +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerMoveEvent +import org.bukkit.potion.PotionEffectType +import java.text.DecimalFormat +import java.util.* + +@Suppress("DEPRECATION") +class PlayerJumpListeners : Listener { + @EventHandler(ignoreCancelled = true) + fun onJump(event: PlayerMoveEvent) { + if (McmmoManager.isFake(event)) { + return + } + val player = event.player + if (player.velocity.y > 0) { + var jumpVelocity = 0.42f + if (player.hasPotionEffect(PotionEffectType.JUMP)) { + jumpVelocity += (player.getPotionEffect(PotionEffectType.JUMP)!!.amplifier.toFloat() + 1) * 0.1f + } + jumpVelocity = FORMAT.format(jumpVelocity.toDouble()).replace(',', '.').toFloat() + if (event.player.location.block.type != Material.LADDER && PREVIOUS_PLAYERS_ON_GROUND.contains(player.uniqueId) + && !player.isOnGround + && java.lang.Float.compare(player.velocity.y.toFloat(), jumpVelocity) == 0 + ) { + Bukkit.getPluginManager().callEvent(PlayerJumpEvent(event)) + } + } + if (player.isOnGround) { + PREVIOUS_PLAYERS_ON_GROUND.add(player.uniqueId) + } else { + PREVIOUS_PLAYERS_ON_GROUND.remove(player.uniqueId) + } + } + + companion object { + private val PREVIOUS_PLAYERS_ON_GROUND: MutableSet = HashSet() + private val FORMAT = DecimalFormat("0.00") + } +} \ No newline at end of file