From 5219d5551ff92ba8141badff3bf4c86fb054c247 Mon Sep 17 00:00:00 2001 From: Daniil Zao Date: Fri, 28 Jun 2024 23:14:51 +0300 Subject: [PATCH 1/4] Try using some of Folia API --- resources/plugin.yml | 3 +- src/wgextender/Config.java | 10 ++--- .../features/claimcommand/WGClaimCommand.java | 3 +- .../claimcommand/WGRegionCommandWrapper.java | 24 +++++------ .../features/extendedwand/WEWand.java | 15 +++---- .../flags/ChorusFruitFlagHandler.java | 2 +- .../features/flags/OldPVPFlagsHandler.java | 42 +++++++++++-------- .../ownormembased/PvPHandlingListener.java | 37 ++++++++-------- .../ownormembased/RestrictCommands.java | 25 ++++++----- .../regionprotect/regionbased/Explode.java | 18 ++++---- .../regionprotect/regionbased/LiquidFlow.java | 15 ++++--- src/wgextender/utils/Transform.java | 19 ++++++--- 12 files changed, 117 insertions(+), 96 deletions(-) diff --git a/resources/plugin.yml b/resources/plugin.yml index 028c9ca..511ffee 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,9 +1,10 @@ name: '${project.name}' main: wgextender.WGExtender -api-version: '1.13' +api-version: '1.20' version: '${project.version}' author: _Shevchik_ depend: [WorldGuard, WorldEdit, Vault] +folia-supported: true commands: wgextender: aliases: [wgex] diff --git a/src/wgextender/Config.java b/src/wgextender/Config.java index 80b9853..572f5cc 100644 --- a/src/wgextender/Config.java +++ b/src/wgextender/Config.java @@ -27,11 +27,7 @@ import java.io.File; import java.math.BigInteger; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; public class Config { @@ -64,7 +60,7 @@ public Config(WGExtender plugin) { public Map, String> claimAutoFlags = new HashMap<>(); public boolean restrictCommandsInRegionEnabled = false; - public Set restrictedCommandsInRegion = new HashSet<>(); + public List restrictedCommandsInRegion = new ArrayList<>(); public boolean extendedWorldEditWandEnabled = false; @@ -131,7 +127,7 @@ private void loadAll() { } restrictCommandsInRegionEnabled = config.getBoolean("restrictcommands.enabled", restrictCommandsInRegionEnabled); - restrictedCommandsInRegion = new HashSet<>(config.getStringList("restrictcommands.commands")); + restrictedCommandsInRegion = new ArrayList<>(config.getStringList("restrictcommands.commands")); extendedWorldEditWandEnabled = config.getBoolean("extendedwewand", extendedWorldEditWandEnabled); diff --git a/src/wgextender/features/claimcommand/WGClaimCommand.java b/src/wgextender/features/claimcommand/WGClaimCommand.java index 4949e84..1030ba7 100644 --- a/src/wgextender/features/claimcommand/WGClaimCommand.java +++ b/src/wgextender/features/claimcommand/WGClaimCommand.java @@ -37,7 +37,8 @@ protected static void claim(String id, CommandSender sender) throws CommandExcep BukkitWorldConfiguration wcfg = WGRegionUtils.getWorldConfig(player); if (wcfg.maxClaimVolume == Integer.MAX_VALUE) { - throw new CommandException("The maximum claim volume get in the configuration is higher than is supported. " + "Currently, it must be " + Integer.MAX_VALUE + " or smaller. Please contact a server administrator."); + throw new CommandException("The maximum claim volume get in the configuration is higher than is supported. " + + "Currently, it must be " + Integer.MAX_VALUE + " or smaller. Please contact a server administrator."); } LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); diff --git a/src/wgextender/features/claimcommand/WGRegionCommandWrapper.java b/src/wgextender/features/claimcommand/WGRegionCommandWrapper.java index a8270d3..18920e4 100644 --- a/src/wgextender/features/claimcommand/WGRegionCommandWrapper.java +++ b/src/wgextender/features/claimcommand/WGRegionCommandWrapper.java @@ -82,28 +82,28 @@ public boolean execute(CommandSender sender, String label, String[] args) { private boolean process(Player player) { BlockLimits.ProcessedClaimInfo info = blockLimits.processClaimInfo(config, player); - switch (info.result()) { - default: return true; - case DENY_MAX_VOLUME: { + return switch (info.result()) { + case ALLOW -> true; + case DENY_MAX_VOLUME -> { player.sendMessage(RED + "Вы не можете заприватить такой большой регион"); player.sendMessage(RED + "Ваш лимит: "+info.assignedLimit()+", вы попытались заприватить: "+info.assignedSize()); - return false; + yield false; } - case DENY_MIN_VOLUME: { + case DENY_MIN_VOLUME -> { player.sendMessage(RED + "Вы не можете заприватить такой маленький регион"); player.sendMessage(RED + "Минимальный объем: "+info.assignedLimit()+", вы попытались заприватить: "+info.assignedSize()); - return false; + yield false; } - case DENY_HORIZONTAL: { - player.sendMessage(RED + "Вы не можете заприватить такой маленький регион"); + case DENY_HORIZONTAL -> { + player.sendMessage(RED + "Вы не можете заприватить такой узкий регион"); player.sendMessage(RED + "Минимальная ширина: "+info.assignedLimit()+", вы попытались заприватить: "+info.assignedSize()); - return false; + yield false; } - case DENY_VERTICAL: { + case DENY_VERTICAL -> { player.sendMessage(RED + "Вы не можете заприватить такой низкий регион"); player.sendMessage(RED + "Минимальная высота: "+info.assignedLimit()+", вы попытались заприватить: "+info.assignedSize()); - return false; + yield false; } - } + }; } } diff --git a/src/wgextender/features/extendedwand/WEWand.java b/src/wgextender/features/extendedwand/WEWand.java index 4d6e021..65a735d 100644 --- a/src/wgextender/features/extendedwand/WEWand.java +++ b/src/wgextender/features/extendedwand/WEWand.java @@ -24,13 +24,12 @@ import org.bukkit.inventory.meta.ItemMeta; import wgextender.utils.WEUtils; -public class WEWand { - +public class WEWand { // TODO Use PersistentData API protected static final String WAND_NAME = ChatColor.LIGHT_PURPLE + "Selection wand"; protected static Material cachedWandMaterial; - protected static Material getWandMaterial() { + protected static Material getWandMaterial() { // TODO Rework to better handle registry String weWandMaterialName = WEUtils.getWorldEditPlugin().getLocalConfiguration().wandItem.toUpperCase(); if ((cachedWandMaterial == null) || !cachedWandMaterial.toString().equals(weWandMaterialName)) { cachedWandMaterial = Material.getMaterial(weWandMaterialName.split(":")[1]); @@ -46,12 +45,10 @@ public static ItemStack getWand() { return itemstack; } - public static boolean isWand(ItemStack itemstack) { - if (itemstack.getType().equals(getWandMaterial())) { - ItemMeta im = itemstack.getItemMeta(); - if (im != null) { - return WAND_NAME.equals(im.getDisplayName()); - } + public static boolean isWand(ItemStack item) { + if (item.getType().equals(getWandMaterial()) && item.hasItemMeta()) { + ItemMeta meta = item.getItemMeta(); + return meta.hasDisplayName() && WAND_NAME.equals(meta.getDisplayName()); } return false; } diff --git a/src/wgextender/features/flags/ChorusFruitFlagHandler.java b/src/wgextender/features/flags/ChorusFruitFlagHandler.java index 0db66fa..795309c 100644 --- a/src/wgextender/features/flags/ChorusFruitFlagHandler.java +++ b/src/wgextender/features/flags/ChorusFruitFlagHandler.java @@ -18,7 +18,7 @@ public void onItemUse(PlayerItemConsumeEvent event) { !WGRegionUtils.canBypassProtection(event.getPlayer()) && !WGRegionUtils.isFlagAllows(player, player.getLocation(), WGExtenderFlags.CHORUS_FRUIT_USE_FLAG) ) { - player.sendMessage(ChatColor.RED + "Вы не можете использовать фрукт телепортации в этом регионе"); + player.sendMessage(ChatColor.RED + "Вы не можете использовать хорус в этом регионе"); event.setCancelled(true); } } diff --git a/src/wgextender/features/flags/OldPVPFlagsHandler.java b/src/wgextender/features/flags/OldPVPFlagsHandler.java index aa59e93..6e124d5 100644 --- a/src/wgextender/features/flags/OldPVPFlagsHandler.java +++ b/src/wgextender/features/flags/OldPVPFlagsHandler.java @@ -22,15 +22,20 @@ import wgextender.utils.WGRegionUtils; import java.lang.reflect.Field; -import java.util.*; +import java.util.EnumSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; +@Deprecated public class OldPVPFlagsHandler implements Listener { - @SuppressWarnings("deprecation") private static final Set PVP_MODIFIERS = EnumSet.of( DamageModifier.ARMOR, DamageModifier.RESISTANCE, DamageModifier.MAGIC, DamageModifier.ABSORPTION ); - private final Map oldValues = new HashMap<>(); + private final Map oldValues = new ConcurrentHashMap<>(); private Field functionsField; public void start(Plugin plugin) { @@ -48,24 +53,27 @@ public void start(Plugin plugin) { Server server = plugin.getServer(); server.getPluginManager().registerEvents(this, plugin); - server.getScheduler().runTaskTimer(WGExtender.getInstance(), () -> { + server.getAsyncScheduler().runAtFixedRate(plugin, (task) -> { for (Player player : Bukkit.getOnlinePlayers()) { if (WGRegionUtils.isFlagTrue(player.getLocation(), WGExtenderFlags.OLDPVP_ATTACKSPEED)) { - if (!oldValues.containsKey(player.getUniqueId())) { - AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_ATTACK_SPEED); - oldValues.put(player.getUniqueId(), attribute.getBaseValue()); - attribute.setBaseValue(16.0); - } - } else { - reset(player); + if (oldValues.containsKey(player.getUniqueId())) continue; + player.getScheduler().run(WGExtender.getInstance(), (playerTask) -> { + AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_ATTACK_SPEED); + oldValues.put(player.getUniqueId(), attribute.getBaseValue()); + attribute.setBaseValue(16.0); + }, null); + } else { + player.getScheduler().run(WGExtender.getInstance(), (playerTask) -> { + reset(player); + }, null); } } - }, 0, 1); + }, 0, 50, TimeUnit.MICROSECONDS); } public void stop() { for (Player player : Bukkit.getOnlinePlayers()) { - reset(player); + player.getScheduler().run(WGExtender.getInstance(), playerTask -> reset(player), null); } } @@ -81,7 +89,6 @@ public void onQuit(PlayerQuitEvent event) { reset(event.getPlayer()); } - @SuppressWarnings({"unchecked", "deprecation"}) @EventHandler(priority = EventPriority.LOWEST) public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { Entity entity = event.getEntity(); @@ -92,15 +99,16 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { } Map> func; try { - func = (Map>) functionsField.get(event); + //noinspection unchecked + func = (Map>) functionsField.get(event); } catch (IllegalArgumentException | IllegalAccessException e) { WGExtender.getInstance().getLogger().log(Level.SEVERE, "Unable to recalculate blocking damage", e); return; } double totalDamage = event.getDamage() + event.getDamage(DamageModifier.HARD_HAT); - //reset blocking modifier + // Reset blocking modifier event.setDamage(DamageModifier.BLOCKING, 0); - //recalculate other modifiers + // Recalculate other modifiers for (var modifier : PVP_MODIFIERS) { double damage = func.get(modifier).apply(totalDamage); event.setDamage(modifier, damage); diff --git a/src/wgextender/features/regionprotect/ownormembased/PvPHandlingListener.java b/src/wgextender/features/regionprotect/ownormembased/PvPHandlingListener.java index abd2331..96f5297 100644 --- a/src/wgextender/features/regionprotect/ownormembased/PvPHandlingListener.java +++ b/src/wgextender/features/regionprotect/ownormembased/PvPHandlingListener.java @@ -91,12 +91,12 @@ public void onDamageEntity(DamageEntityEvent event) { Entities.isAmbient(event.getEntity()) || Entities.isVehicle(event.getEntity().getType()) ) { - canDamage = event.getRelevantFlags().isEmpty() || (query.queryState(weTarget, associable, combine(event)) != State.DENY); + canDamage = event.getRelevantFlags().isEmpty() || (query.queryState(weTarget, associable, getFlags(event)) != State.DENY); what = "hit that"; /* Paintings, item frames, etc. */ } else if (Entities.isConsideredBuildingIfUsed(event.getEntity())) { - canDamage = query.testBuild(weTarget, associable, combine(event)); + canDamage = query.testBuild(weTarget, associable, getFlags(event)); what = "change that"; /* PVP */ @@ -110,18 +110,18 @@ public void onDamageEntity(DamageEntityEvent event) { // false - disallow pvp when flag not set if (config.miscDefaultPvPFlagOperationMode == null) { canDamage = - query.testBuild(weTarget, associable, combine(event, Flags.PVP)) && - (query.queryState(weAttacker, localPlayerAttacker, combine(event, Flags.PVP)) != State.DENY) && - (query.queryState(weTarget, localPlayerAttacker, combine(event, Flags.PVP)) != State.DENY); + query.testBuild(weTarget, associable, getFlags(event, Flags.PVP)) && + (query.queryState(weAttacker, localPlayerAttacker, getFlags(event, Flags.PVP)) != State.DENY) && + (query.queryState(weTarget, localPlayerAttacker, getFlags(event, Flags.PVP)) != State.DENY); } else if (config.miscDefaultPvPFlagOperationMode) { canDamage = - (query.queryState(weAttacker, localPlayerAttacker, combine(event, Flags.PVP)) != State.DENY) && - (query.queryState(weTarget, localPlayerAttacker, combine(event, Flags.PVP)) != State.DENY); + (query.queryState(weAttacker, localPlayerAttacker, getFlags(event, Flags.PVP)) != State.DENY) && + (query.queryState(weTarget, localPlayerAttacker, getFlags(event, Flags.PVP)) != State.DENY); } else { if (!WGRegionUtils.isInWGRegion(playerAttacker.getLocation()) && !WGRegionUtils.isInWGRegion(target)) { canDamage = true; } else { - canDamage = (query.queryState(weAttacker, localPlayerAttacker, combine(event, Flags.PVP)) == State.ALLOW) && (query.queryState(weTarget, localPlayerAttacker, combine(event, Flags.PVP)) == State.ALLOW); + canDamage = (query.queryState(weAttacker, localPlayerAttacker, getFlags(event, Flags.PVP)) == State.ALLOW) && (query.queryState(weTarget, localPlayerAttacker, getFlags(event, Flags.PVP)) == State.ALLOW); } } @@ -135,17 +135,17 @@ public void onDamageEntity(DamageEntityEvent event) { /* Player damage not caused by another player */ } else if (event.getEntity() instanceof Player) { - canDamage = event.getRelevantFlags().isEmpty() || (query.queryState(weTarget, associable, combine(event)) != State.DENY); + canDamage = event.getRelevantFlags().isEmpty() || (query.queryState(weTarget, associable, getFlags(event)) != State.DENY); what = "damage that"; /* damage to non-hostile mobs (e.g. animals) */ } else if (Entities.isNonHostile(event.getEntity())) { - canDamage = query.testBuild(weTarget, associable, combine(event, Flags.DAMAGE_ANIMALS)); + canDamage = query.testBuild(weTarget, associable, getFlags(event, Flags.DAMAGE_ANIMALS)); what = "harm that"; /* Everything else */ } else { - canDamage = query.testBuild(weTarget, associable, combine(event, Flags.INTERACT)); + canDamage = query.testBuild(weTarget, associable, getFlags(event, Flags.INTERACT)); what = "hit that"; } @@ -197,7 +197,6 @@ private void tellErrorMessage(DelegateEvent event, Cause cause, Location locatio long now = System.currentTimeMillis(); Long lastTime = WGMetadata.getIfPresent(player, DENY_MESSAGE_KEY, Long.class); if ((lastTime == null) || ((now - lastTime) >= LAST_MESSAGE_DELAY)) { - @SuppressWarnings("deprecation") String message = WGRegionUtils.REGION_QUERY.queryValue(BukkitAdapter.adapt(location), WorldGuardPlugin.inst().wrapPlayer(player), Flags.DENY_MESSAGE); if (message != null && !message.isEmpty()) { player.sendMessage(message.replace("%what%", what)); @@ -207,12 +206,14 @@ private void tellErrorMessage(DelegateEvent event, Cause cause, Location locatio } } - private static StateFlag[] combine(DelegateEvent event, StateFlag... flag) { + private static StateFlag[] getFlags(DelegateEvent event) { + return event.getRelevantFlags().toArray(new StateFlag[0]); + } + + private static StateFlag[] getFlags(DelegateEvent event, StateFlag flag) { List extra = event.getRelevantFlags(); - StateFlag[] flags = Arrays.copyOf(flag, flag.length + extra.size()); - for (int i = 0; i < extra.size(); i++) { - flags[flag.length + i] = extra.get(i); - } - return flags; + StateFlag[] result = Arrays.copyOf(getFlags(event), extra.size() + 1); + result[extra.size()] = flag; + return result; } } diff --git a/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java b/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java index 5c16a91..022beae 100644 --- a/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java +++ b/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java @@ -30,33 +30,36 @@ import wgextender.utils.WGRegionUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; public class RestrictCommands implements Listener { - private final Pattern SPACE_PATTERN = Pattern.compile("\\s+"); + private static final long MS_PER_TICK = 50; protected final Config config; - protected volatile String[] restrictedCommands; + protected volatile List restrictedCommands; public RestrictCommands(Config config) { this.config = config; - restrictedCommands = config.restrictedCommandsInRegion.toArray(new String[0]); - Bukkit.getScheduler().runTaskTimerAsynchronously(WGExtender.getInstance(), () -> { + restrictedCommands = config.restrictedCommandsInRegion; + startCommandRecheckTask(config); + } + + private void startCommandRecheckTask(Config config) { + Bukkit.getAsyncScheduler().runAtFixedRate(WGExtender.getInstance(), (task) -> { if (!config.restrictCommandsInRegionEnabled) { return; } List computedRestrictedCommands = new ArrayList<>(); for (String restrictedCommand : config.restrictedCommandsInRegion) { - String[] split = SPACE_PATTERN.split(restrictedCommand); - String toAdd = split.length > 1 ? String.join(" ", Arrays.copyOfRange(split, 1, split.length)) : ""; + String[] split = restrictedCommand.split(" ", 2); + String toAdd = " " + split[1].trim(); for (String alias : CommandUtils.getCommandAliases(split[0])) { - computedRestrictedCommands.add(String.join(" ", alias, toAdd)); + computedRestrictedCommands.add(alias + toAdd); } } - restrictedCommands = computedRestrictedCommands.toArray(new String[0]); - }, 1, 100); + restrictedCommands = computedRestrictedCommands; + }, MS_PER_TICK, 100 * MS_PER_TICK, TimeUnit.MICROSECONDS); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/wgextender/features/regionprotect/regionbased/Explode.java b/src/wgextender/features/regionprotect/regionbased/Explode.java index 1d2d1fc..2757e33 100644 --- a/src/wgextender/features/regionprotect/regionbased/Explode.java +++ b/src/wgextender/features/regionprotect/regionbased/Explode.java @@ -18,6 +18,7 @@ package wgextender.features.regionprotect.regionbased; import org.bukkit.Location; +import org.bukkit.entity.Creeper; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; @@ -73,8 +74,8 @@ public void onEntityDamageByExplosion(EntityDamageEvent event) { if ((event.getCause() == DamageCause.BLOCK_EXPLOSION) || (event.getCause() == DamageCause.ENTITY_EXPLOSION)) { Location location = event.getEntity().getLocation(); if (WGRegionUtils.isInWGRegion(location)) { - if (event instanceof EntityDamageByEntityEvent byEntityEvent) { - Player source = findExplosionSource(byEntityEvent.getDamager()); + if (event instanceof EntityDamageByEntityEvent entityEvent) { + Player source = findExplosionSource(entityEvent.getDamager()); if ((source == null) || (!WGRegionUtils.canBypassProtection(source) && !WGRegionUtils.canBuild(source, location))) { event.setCancelled(true); } @@ -87,14 +88,15 @@ public void onEntityDamageByExplosion(EntityDamageEvent event) { } protected static Player findExplosionSource(Entity exploded) { + Entity source; if (exploded instanceof TNTPrimed primed) { - Entity source = primed.getSource(); - if (source instanceof Player player) { - return player; - } + source = primed.getSource(); + } else if (exploded instanceof Creeper creeper) { + source = creeper.getTarget(); // TODO Creeper can be ignited using flint and steel + } else { + return null; } - //TODO: explosion source for creeper (last damager or target?)? - return null; + return source instanceof Player player ? player : null; } } diff --git a/src/wgextender/features/regionprotect/regionbased/LiquidFlow.java b/src/wgextender/features/regionprotect/regionbased/LiquidFlow.java index 6bc8b30..5f1f42e 100644 --- a/src/wgextender/features/regionprotect/regionbased/LiquidFlow.java +++ b/src/wgextender/features/regionprotect/regionbased/LiquidFlow.java @@ -38,20 +38,25 @@ public LiquidFlow(Config config) { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onLiquidFlow(BlockFromToEvent event) { - check(event.getBlock(), event.getToBlock(), event); + if (event.getBlock().isLiquid()) { + check(event.getBlock(), event.getToBlock(), event, true); + } } @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onDispense(BlockDispenseEvent event) { Block block = event.getBlock(); - BlockData blockData = block.getState().getBlockData(); + BlockData blockData = block.getBlockData(); if (blockData instanceof Directional directional) { - check(block, block.getRelative(directional.getFacing()), event); + Block relative = block.getRelative(directional.getFacing()); + if (relative.isLiquid()) { + check(block, relative, event, false); + } } } - private void check(Block source, Block to, Cancellable event) { - if (switch (source.getType()) { + private void check(Block source, Block to, Cancellable event, boolean checkSource) { + if (switch (checkSource ? source.getType() : to.getType()) { case LAVA -> config.checkLavaFlow; case WATER -> config.checkWaterFlow; default -> config.checkOtherLiquidFlow; diff --git a/src/wgextender/utils/Transform.java b/src/wgextender/utils/Transform.java index d806b0e..3b1b7e9 100644 --- a/src/wgextender/utils/Transform.java +++ b/src/wgextender/utils/Transform.java @@ -19,21 +19,28 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.function.Function; public class Transform { - public static List toList(Iterable list, Function transform) { - List transformedList = new ArrayList<>(); - for (O element : list) { - transformedList.add(transform.apply(element)); - } - return transformedList; + public static List toList(Iterable iterable, Function transform) { + return toList(iterable, transform, new ArrayList<>()); } public static List toList(O[] array, Function transform) { return toList(Arrays.asList(array), transform); } + public static List toList(Collection coll, Function transform) { + return toList(coll, transform, new ArrayList<>(coll.size())); + } + + public static List toList(Iterable list, Function transform, List outputList) { + for (O element : list) { + outputList.add(transform.apply(element)); + } + return outputList; + } } From 10c884dc649394ec2e42fb7d82d579fdb5d77016 Mon Sep 17 00:00:00 2001 From: Daniil Zao Date: Sun, 14 Jul 2024 18:10:59 +0300 Subject: [PATCH 2/4] Don't explode with a bunch of tasks --- .../ownormembased/RestrictCommands.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java b/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java index 6785494..ae98109 100644 --- a/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java +++ b/src/wgextender/features/regionprotect/ownormembased/RestrictCommands.java @@ -54,20 +54,18 @@ public RestrictCommands(Config config) { } private void commandRecheckTask(Config config) { - Bukkit.getAsyncScheduler().runAtFixedRate(WGExtender.getInstance(), (task) -> { - if (!config.restrictCommandsInRegionEnabled) { - return; - } - Set computedRestrictedCommands = new HashSet<>(); - for (String restrictedCommand : config.restrictedCommandsInRegion) { - String[] split = SPACE_PATTERN.split(restrictedCommand, 2); - String toAdd = split.length > 1 ? split[1] : ""; - for (String alias : CommandUtils.getCommandAliases(split[0].toLowerCase(Locale.ROOT))) { - computedRestrictedCommands.add(alias + toAdd); - } + if (!config.restrictCommandsInRegionEnabled) { + return; + } + Set computedRestrictedCommands = new HashSet<>(); + for (String restrictedCommand : config.restrictedCommandsInRegion) { + String[] split = SPACE_PATTERN.split(restrictedCommand, 2); + String toAdd = split.length > 1 ? split[1] : ""; + for (String alias : CommandUtils.getCommandAliases(split[0].toLowerCase(Locale.ROOT))) { + computedRestrictedCommands.add(alias + toAdd); } - restrictedCommands = computedRestrictedCommands; - }, TICK, TICK * 100, TimeUnit.MILLISECONDS); + } + restrictedCommands = computedRestrictedCommands; } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) From add0e76cbb5c84d2eda62680bcb6910054d191d6 Mon Sep 17 00:00:00 2001 From: Daniil Zao Date: Thu, 8 Aug 2024 14:02:55 +0300 Subject: [PATCH 3/4] Rework oldpvp flag handling --- src/wgextender/WGExtender.java | 2 +- .../features/flags/OldPVPFlagsHandler.java | 51 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/wgextender/WGExtender.java b/src/wgextender/WGExtender.java index d7afaae..f1df073 100644 --- a/src/wgextender/WGExtender.java +++ b/src/wgextender/WGExtender.java @@ -90,7 +90,7 @@ public void onDisable() { WEWandCommandWrapper.uninject(); WGRegionCommandWrapper.uninject(); pvplistener.uninject(); - oldpvphandler.stop(); + oldpvphandler.stop(this); } catch (Throwable t) { getLogger().log(Level.SEVERE, "Unable to uninject, shutting down", t); Bukkit.shutdown(); diff --git a/src/wgextender/features/flags/OldPVPFlagsHandler.java b/src/wgextender/features/flags/OldPVPFlagsHandler.java index 6e124d5..02ba51c 100644 --- a/src/wgextender/features/flags/OldPVPFlagsHandler.java +++ b/src/wgextender/features/flags/OldPVPFlagsHandler.java @@ -1,9 +1,7 @@ package wgextender.features.flags; import com.google.common.base.Function; -import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.Server; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Entity; @@ -15,6 +13,7 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.plugin.Plugin; @@ -27,7 +26,6 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; import java.util.logging.Level; @Deprecated @@ -51,29 +49,23 @@ public void start(Plugin plugin) { return; } - Server server = plugin.getServer(); - server.getPluginManager().registerEvents(this, plugin); - server.getAsyncScheduler().runAtFixedRate(plugin, (task) -> { - for (Player player : Bukkit.getOnlinePlayers()) { - if (WGRegionUtils.isFlagTrue(player.getLocation(), WGExtenderFlags.OLDPVP_ATTACKSPEED)) { - if (oldValues.containsKey(player.getUniqueId())) continue; - player.getScheduler().run(WGExtender.getInstance(), (playerTask) -> { - AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_ATTACK_SPEED); - oldValues.put(player.getUniqueId(), attribute.getBaseValue()); - attribute.setBaseValue(16.0); - }, null); - } else { - player.getScheduler().run(WGExtender.getInstance(), (playerTask) -> { - reset(player); - }, null); - } - } - }, 0, 50, TimeUnit.MICROSECONDS); + plugin.getServer().getPluginManager().registerEvents(this, plugin); } - public void stop() { - for (Player player : Bukkit.getOnlinePlayers()) { - player.getScheduler().run(WGExtender.getInstance(), playerTask -> reset(player), null); + public void stop(Plugin plugin) { + for (Player player : plugin.getServer().getOnlinePlayers()) { + reset(player); + } + } + + private void handlePlayer(Player player) { + if (WGRegionUtils.isFlagTrue(player.getLocation(), WGExtenderFlags.OLDPVP_ATTACKSPEED)) { + if (oldValues.containsKey(player.getUniqueId())) return; + AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_ATTACK_SPEED); + oldValues.put(player.getUniqueId(), attribute.getBaseValue()); + attribute.setBaseValue(16.0); + } else { + reset(player); } } @@ -84,6 +76,17 @@ private void reset(Player player) { } } + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + handlePlayer(player); + player.getScheduler().runAtFixedRate(WGExtender.getInstance(), + (task) -> handlePlayer(player), + () -> reset(player), + 1, 1 + ); + } + @EventHandler(priority = EventPriority.LOWEST) public void onQuit(PlayerQuitEvent event) { reset(event.getPlayer()); From 5b84216c119a90ed0f61cfdf8c95219d73eaa697 Mon Sep 17 00:00:00 2001 From: "Daniil Zao." Date: Sun, 1 Sep 2024 19:58:48 +0300 Subject: [PATCH 4/4] Old PvP is too legacy --- resources/config.yml | 1 + src/wgextender/Config.java | 3 +++ src/wgextender/WGExtender.java | 9 ++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/resources/config.yml b/resources/config.yml index 9d38d54..697bfd6 100644 --- a/resources/config.yml +++ b/resources/config.yml @@ -30,3 +30,4 @@ restrictcommands: extendedwewand: false misc: pvpmode: default + old-pvp-flags: true diff --git a/src/wgextender/Config.java b/src/wgextender/Config.java index 47de127..4294e09 100644 --- a/src/wgextender/Config.java +++ b/src/wgextender/Config.java @@ -67,6 +67,8 @@ public Config(WGExtender plugin) { public Boolean miscDefaultPvPFlagOperationMode = null; + public boolean miscOldPvpFlags = true; + protected static final String miscPvPFlagOperationModeAllow = "allow"; protected static final String miscPvPFlagOperationModeDeny = "deny"; protected static final String miscPvPFlagOperationModeDefault = "default"; @@ -141,6 +143,7 @@ private void loadAll() { } else { miscDefaultPvPFlagOperationMode = null; } + miscOldPvpFlags = config.getBoolean("misc.old-pvp-flags"); } private static BigInteger asBig(ConfigurationSection section, String key) { diff --git a/src/wgextender/WGExtender.java b/src/wgextender/WGExtender.java index f1df073..9f810a6 100644 --- a/src/wgextender/WGExtender.java +++ b/src/wgextender/WGExtender.java @@ -76,7 +76,14 @@ public void onEnable() { pvplistener = new PvPHandlingListener(config); pvplistener.inject(); oldpvphandler = new OldPVPFlagsHandler(); - oldpvphandler.start(this); + if (config.miscOldPvpFlags) { + getLogger().warning( + "Enabling the old-PvP flags. Do note that they're not supported, " + + "as they're very out of scope of extending WG capabilities. " + + "Consider turning them off by setting 'misc.old-pvp-flags' to 'false'" + ); + oldpvphandler.start(this); + } } catch (Throwable t) { getLogger().log(Level.SEVERE, "Unable to inject, shutting down", t); t.printStackTrace();