mirror of
https://github.com/PlayPro/CoreProtect.git
synced 2024-11-24 12:16:36 +01:00
Fixed backwards compatibility with older server software/versions
This commit is contained in:
parent
659fe649ed
commit
f5d13f8818
@ -19,6 +19,7 @@ import net.coreprotect.language.Language;
|
||||
import net.coreprotect.language.Phrase;
|
||||
import net.coreprotect.listener.ListenerHandler;
|
||||
import net.coreprotect.listener.player.PlayerQuitListener;
|
||||
import net.coreprotect.paper.PaperAdapter;
|
||||
import net.coreprotect.thread.CacheHandler;
|
||||
import net.coreprotect.thread.NetworkHandler;
|
||||
import net.coreprotect.utility.Chat;
|
||||
@ -161,7 +162,7 @@ public final class CoreProtect extends JavaPlugin {
|
||||
private static void safeShutdown(CoreProtect plugin) {
|
||||
try {
|
||||
/* if server is stopping, log disconnections of online players */
|
||||
if (plugin.getServer().isStopping()) {
|
||||
if (PaperAdapter.ADAPTER.isStopping(plugin.getServer())) {
|
||||
for (Player player : plugin.getServer().getOnlinePlayers()) {
|
||||
PlayerQuitListener.queuePlayerQuit(player);
|
||||
}
|
||||
|
@ -1,17 +1,54 @@
|
||||
package net.coreprotect.listener;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.AbstractArrow;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerPickupArrowEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.PotionMeta;
|
||||
import org.bukkit.potion.PotionData;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionType;
|
||||
|
||||
import net.coreprotect.listener.entity.EntityPickupItemListener;
|
||||
|
||||
public class PlayerPickupArrowListener extends EntityPickupItemListener implements Listener {
|
||||
|
||||
public static ItemStack getArrowType(AbstractArrow arrow) {
|
||||
ItemStack itemStack = null;
|
||||
switch (arrow.getType()) {
|
||||
case SPECTRAL_ARROW:
|
||||
itemStack = new ItemStack(Material.SPECTRAL_ARROW);
|
||||
break;
|
||||
default:
|
||||
itemStack = new ItemStack(Material.ARROW);
|
||||
break;
|
||||
}
|
||||
|
||||
if (arrow instanceof Arrow) {
|
||||
Arrow arrowEntity = (Arrow) arrow;
|
||||
PotionData data = arrowEntity.getBasePotionData();
|
||||
if (data.getType() != PotionType.UNCRAFTABLE) {
|
||||
itemStack = new ItemStack(Material.TIPPED_ARROW);
|
||||
PotionMeta meta = (PotionMeta) itemStack.getItemMeta();
|
||||
meta.setBasePotionData(data);
|
||||
for (PotionEffect effect : arrowEntity.getCustomEffects()) {
|
||||
meta.addCustomEffect(effect, false);
|
||||
}
|
||||
itemStack.setItemMeta(meta);
|
||||
}
|
||||
}
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
protected void onPlayerPickupArrowEvent(PlayerPickupArrowEvent event) {
|
||||
EntityPickupItemListener.onItemPickup(event.getPlayer(), event.getArrow().getLocation(), event.getArrow().getItemStack());
|
||||
ItemStack itemStack = getArrowType(event.getArrow());
|
||||
EntityPickupItemListener.onItemPickup(event.getPlayer(), event.getArrow().getLocation(), itemStack);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -660,7 +660,7 @@ public final class PlayerInteractListener extends Queue implements Listener {
|
||||
}
|
||||
|
||||
if (event.useItemInHand() != Event.Result.DENY) {
|
||||
List<Material> entityBlockTypes = Arrays.asList(Material.ARMOR_STAND, Material.END_CRYSTAL, Material.TRIDENT, Material.EXPERIENCE_BOTTLE, Material.SPLASH_POTION, Material.ENDER_PEARL, Material.FIREWORK_ROCKET);
|
||||
List<Material> entityBlockTypes = Arrays.asList(Material.ARMOR_STAND, Material.END_CRYSTAL, Material.BOW, Material.CROSSBOW, Material.TRIDENT, Material.EXPERIENCE_BOTTLE, Material.SPLASH_POTION, Material.ENDER_PEARL, Material.FIREWORK_ROCKET, Material.EGG);
|
||||
ItemStack handItem = null;
|
||||
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
||||
ItemStack offHand = player.getInventory().getItemInOffHand();
|
||||
|
@ -1,34 +1,39 @@
|
||||
package net.coreprotect.listener.player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Egg;
|
||||
import org.bukkit.entity.AbstractArrow;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityShootBowEvent;
|
||||
import org.bukkit.event.entity.ProjectileLaunchEvent;
|
||||
import org.bukkit.event.player.PlayerEggThrowEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.CrossbowMeta;
|
||||
|
||||
import net.coreprotect.config.Config;
|
||||
import net.coreprotect.config.ConfigHandler;
|
||||
import net.coreprotect.consumer.Queue;
|
||||
import net.coreprotect.database.logger.ItemLogger;
|
||||
import net.coreprotect.listener.PlayerPickupArrowListener;
|
||||
import net.coreprotect.utility.Util;
|
||||
|
||||
public class ProjectileLaunchListener extends Queue implements Listener {
|
||||
|
||||
public static Set<Material> BOWS = new HashSet<>(Arrays.asList(Material.BOW, Material.CROSSBOW));
|
||||
|
||||
protected static void playerLaunchProjectile(Location location, String user, ItemStack itemStack, int amount, int delay, int offset, int action) {
|
||||
if (!Config.getConfig(location.getWorld()).ITEM_DROPS || itemStack == null) {
|
||||
return;
|
||||
@ -66,15 +71,37 @@ public class ProjectileLaunchListener extends Queue implements Listener {
|
||||
Map.Entry<UUID, Object[]> pair = it.next();
|
||||
UUID uuid = pair.getKey();
|
||||
Object[] data = pair.getValue();
|
||||
if ((data[0].equals(key) || data[1].equals(key)) && Util.getEntityMaterial(event.getEntityType()) == ((ItemStack) data[2]).getType()) {
|
||||
Player player = Bukkit.getServer().getPlayer(uuid);
|
||||
ItemStack itemStack = (ItemStack) data[2];
|
||||
playerLaunchProjectile(location, player.getName(), itemStack, 1, 1, 0, (itemStack.getType() != Material.FIREWORK_ROCKET ? ItemLogger.ITEM_THROW : ItemLogger.ITEM_SHOOT));
|
||||
boolean isBow = BOWS.contains(itemStack.getType());
|
||||
if ((data[0].equals(key) || data[1].equals(key)) && (Util.getEntityMaterial(event.getEntityType()) == itemStack.getType() || isBow)) {
|
||||
Player player = Bukkit.getServer().getPlayer(uuid);
|
||||
|
||||
boolean thrownItem = (itemStack.getType() != Material.FIREWORK_ROCKET && !isBow);
|
||||
if (isBow) {
|
||||
if (itemStack.getType() == Material.CROSSBOW) {
|
||||
CrossbowMeta meta = (CrossbowMeta) itemStack.getItemMeta();
|
||||
for (ItemStack item : meta.getChargedProjectiles()) {
|
||||
itemStack = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (event.getEntity() instanceof AbstractArrow) {
|
||||
itemStack = PlayerPickupArrowListener.getArrowType((AbstractArrow) event.getEntity());
|
||||
}
|
||||
|
||||
if (itemStack == null || BOWS.contains(itemStack.getType())) {
|
||||
return; // unnecessary under normal circumstances
|
||||
}
|
||||
}
|
||||
|
||||
playerLaunchProjectile(location, player.getName(), itemStack, 1, 1, 0, (thrownItem ? ItemLogger.ITEM_THROW : ItemLogger.ITEM_SHOOT));
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Requires Bukkit 1.17+
|
||||
/*
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
protected void onEntityShootBow(EntityShootBowEvent event) {
|
||||
if (!(event.getEntity() instanceof Player)) {
|
||||
@ -84,12 +111,15 @@ public class ProjectileLaunchListener extends Queue implements Listener {
|
||||
ItemStack itemStack = event.getConsumable();
|
||||
playerLaunchProjectile(event.getEntity().getLocation(), event.getEntity().getName(), itemStack, 1, 1, 0, ItemLogger.ITEM_SHOOT);
|
||||
}
|
||||
|
||||
*/
|
||||
// Requires Bukkit 1.16+
|
||||
/*
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
protected void onPlayerEggThrow(PlayerEggThrowEvent event) {
|
||||
Egg egg = event.getEgg();
|
||||
ItemStack itemStack = egg.getItem();
|
||||
playerLaunchProjectile(event.getPlayer().getLocation(), event.getPlayer().getName(), itemStack, 0, 1, 0, ItemLogger.ITEM_THROW);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package net.coreprotect.paper;
|
||||
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
@ -46,4 +47,9 @@ public class PaperAdapter implements PaperInterface {
|
||||
return holder.getHolder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStopping(Server server) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,12 @@
|
||||
package net.coreprotect.paper;
|
||||
|
||||
import org.bukkit.Server;
|
||||
|
||||
public class PaperHandler extends PaperAdapter implements PaperInterface {
|
||||
|
||||
@Override
|
||||
public boolean isStopping(Server server) {
|
||||
return server.isStopping();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package net.coreprotect.paper;
|
||||
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
@ -7,4 +8,6 @@ public interface PaperInterface {
|
||||
|
||||
public InventoryHolder getHolder(Inventory holder, boolean useSnapshot);
|
||||
|
||||
public boolean isStopping(Server server);
|
||||
|
||||
}
|
||||
|
@ -811,6 +811,8 @@ public class Util extends Queue {
|
||||
return Material.TRIDENT;
|
||||
case FIREWORK:
|
||||
return Material.FIREWORK_ROCKET;
|
||||
case EGG:
|
||||
return Material.EGG;
|
||||
default:
|
||||
return BukkitAdapter.ADAPTER.getFrameType(type);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user