From 05f7d835d6f97b7a1852538e7f7e47585f9b20c0 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Wed, 28 Aug 2024 21:17:55 +0200 Subject: [PATCH 01/11] Initial commit --- .../config/implementation/PluginConfig.java | 16 ++++++++++------ .../combat/region/RegionController.java | 15 ++++++++++----- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 2ebad9db..20e8c337 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -21,13 +21,13 @@ public class PluginConfig extends OkaeriConfig { @Comment("# Do you want to change the plugin settings?") public Settings settings = new Settings(); - @Comment({" ", "# Ender pearl settings"}) + @Comment({ " ", "# Ender pearl settings" }) public FightPearlSettings pearl = new FightPearlSettings(); - @Comment({" ", "# Custom effects settings"}) + @Comment({ " ", "# Custom effects settings" }) public FightEffectSettings effect = new FightEffectSettings(); - @Comment({" ", "# Set a custom way for a player's items to drop on death (if in combat)"}) + @Comment({ " ", "# Set a custom way for a player's items to drop on death (if in combat)" }) public DropSettings dropSettings = new DropSettings(); public static class Settings extends OkaeriConfig { @@ -46,8 +46,12 @@ public static class Settings extends OkaeriConfig { @Comment("# List of regions to block") public List blockedRegions = Collections.singletonList("your_region"); - @Comment("# Set the knock multiplier for the blocked region") - public double blockedRegionKnockMultiplier = 1.2; + @Comment({ + "# Set the knock multiplier for the blocked region", + "# Values can be decimal. Do NOT use negative values.", + "# Setting it around 1 knocks the player around 2-4 blocks away." + }) + public double blockedRegionKnockMultiplier = 1; @Comment("# Set the radius of the blocked region if you aren't using WorldGuard basen on default spawn region!") public int blockedRegionRadius = 10; @@ -127,7 +131,7 @@ public static class Settings extends OkaeriConfig { } - @Comment({" ", "# Do you want to change the plugin messages?"}) + @Comment({ " ", "# Do you want to change the plugin messages?" }) public Messages messages = new Messages(); public static class Messages extends OkaeriConfig { diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java index 657a60b9..2ec32f57 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java @@ -17,12 +17,15 @@ public class RegionController implements Listener { private final RegionProvider regionProvider; private final FightManager fightManager; private final PluginConfig pluginConfig; + private final double knockbackMultiplier; public RegionController(NotificationAnnouncer announcer, RegionProvider regionProvider, FightManager fightManager, PluginConfig pluginConfig) { this.announcer = announcer; this.regionProvider = regionProvider; this.fightManager = fightManager; this.pluginConfig = pluginConfig; + + this.knockbackMultiplier = this.pluginConfig.settings.blockedRegionKnockMultiplier; } @EventHandler @@ -49,12 +52,14 @@ void onPlayerMove(PlayerMoveEvent event) { } Location spawnLocation = this.regionProvider.getRegionCenter(locationTo); - Location playerLocation = player.getLocation().subtract(spawnLocation); - double distance = playerLocation.distance(spawnLocation); - Vector knockback = new Vector(0, 3, 0).multiply(this.pluginConfig.settings.blockedRegionKnockMultiplier / distance); - Vector vector = playerLocation.toVector().add(knockback); + Location playerLocation = player.getLocation(); + + double xMultiplier = playerLocation.getX() > spawnLocation.getX() ? 0.5 : -0.5; + double zMultiplier = playerLocation.getZ() > spawnLocation.getZ() ? 0.5 : -0.5; + + Vector knockback = new Vector(xMultiplier * this.knockbackMultiplier, 0.5, zMultiplier * this.knockbackMultiplier); - player.setVelocity(vector); + player.setVelocity(knockback); this.announcer.sendMessage(player, this.pluginConfig.messages.cantEnterOnRegion); } From ac494e727121c6181996e51dc1f347492c44eb47 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Wed, 28 Aug 2024 21:18:51 +0200 Subject: [PATCH 02/11] fix spaces --- .../combat/config/implementation/PluginConfig.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 20e8c337..8eb2fd23 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -21,13 +21,13 @@ public class PluginConfig extends OkaeriConfig { @Comment("# Do you want to change the plugin settings?") public Settings settings = new Settings(); - @Comment({ " ", "# Ender pearl settings" }) + @Comment({" ", "# Ender pearl settings"}) public FightPearlSettings pearl = new FightPearlSettings(); - @Comment({ " ", "# Custom effects settings" }) + @Comment({" ", "# Custom effects settings"}) public FightEffectSettings effect = new FightEffectSettings(); - @Comment({ " ", "# Set a custom way for a player's items to drop on death (if in combat)" }) + @Comment({" ", "# Set a custom way for a player's items to drop on death (if in combat)"}) public DropSettings dropSettings = new DropSettings(); public static class Settings extends OkaeriConfig { From 2a6de72f38ecb0dee0dbc0608ced1e5709f5bed7 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Wed, 28 Aug 2024 21:19:14 +0200 Subject: [PATCH 03/11] fix spaces --- .../eternalcode/combat/config/implementation/PluginConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 8eb2fd23..82911646 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -131,7 +131,7 @@ public static class Settings extends OkaeriConfig { } - @Comment({ " ", "# Do you want to change the plugin messages?" }) + @Comment({" ", "# Do you want to change the plugin messages?"}) public Messages messages = new Messages(); public static class Messages extends OkaeriConfig { From 2a4252f6729304b84253be767e7cb165d8c78d34 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Mon, 2 Sep 2024 02:53:05 +0200 Subject: [PATCH 04/11] Add Kamicjusz's changes. Normalize knockback vector, fix message. --- .../config/implementation/PluginConfig.java | 2 +- .../combat/region/RegionController.java | 17 ++++---- .../region/WorldGuardRegionProvider.java | 41 +++++++++---------- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 82911646..f1563ddc 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -182,7 +182,7 @@ public static class Messages extends OkaeriConfig { public String blockPlacingBlockedDuringCombat = "&cYou cannot place above 40Y coordinate during combat!"; @Comment("# Message sent when player tries to enter a region") - public String cantEnterOnRegion = "&cYou can't enter on this region during combat!"; + public String cantEnterOnRegion = "&cYou can't enter this region during combat!"; public static class AdminMessages extends OkaeriConfig { @Comment("# Message sent when the configuration is reloaded") diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java index 2ec32f57..d90364d6 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java @@ -17,7 +17,6 @@ public class RegionController implements Listener { private final RegionProvider regionProvider; private final FightManager fightManager; private final PluginConfig pluginConfig; - private final double knockbackMultiplier; public RegionController(NotificationAnnouncer announcer, RegionProvider regionProvider, FightManager fightManager, PluginConfig pluginConfig) { this.announcer = announcer; @@ -25,7 +24,6 @@ public RegionController(NotificationAnnouncer announcer, RegionProvider regionPr this.fightManager = fightManager; this.pluginConfig = pluginConfig; - this.knockbackMultiplier = this.pluginConfig.settings.blockedRegionKnockMultiplier; } @EventHandler @@ -51,15 +49,16 @@ void onPlayerMove(PlayerMoveEvent event) { return; } - Location spawnLocation = this.regionProvider.getRegionCenter(locationTo); - Location playerLocation = player.getLocation(); + Location centerOfRegion = this.regionProvider.getRegionCenter(locationTo); + Location subtract = player.getLocation().subtract(centerOfRegion); - double xMultiplier = playerLocation.getX() > spawnLocation.getX() ? 0.5 : -0.5; - double zMultiplier = playerLocation.getZ() > spawnLocation.getZ() ? 0.5 : -0.5; + Vector knockbackVector = new Vector(subtract.getX(), 0, subtract.getZ()).normalize(); + Vector configuredVector = new Vector( + this.pluginConfig.settings.blockedRegionKnockMultiplier, + 0.5, + this.pluginConfig.settings.blockedRegionKnockMultiplier); - Vector knockback = new Vector(xMultiplier * this.knockbackMultiplier, 0.5, zMultiplier * this.knockbackMultiplier); - - player.setVelocity(knockback); + player.setVelocity(knockbackVector.multiply(configuredVector)); this.announcer.sendMessage(player, this.pluginConfig.messages.cantEnterOnRegion); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java index 9773eeb0..cfac7c9b 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java @@ -30,33 +30,26 @@ public Location getRegionCenter(Location location) { RegionQuery regionQuery = regionContainer.createQuery(); ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location)); - double minX = 0; - double maxX = 0; - double minZ = 0; - double maxZ = 0; + ProtectedRegion combatRegion = null; for (ProtectedRegion region : applicableRegions.getRegions()) { - BlockVector3 min = region.getMinimumPoint(); - BlockVector3 max = region.getMaximumPoint(); - - if (min.getX() < minX) { - minX = min.getX(); - } - if (max.getX() > maxX) { - maxX = max.getX(); - } - if (min.getZ() < minZ) { - minZ = min.getZ(); - } - if (max.getZ() > maxZ) { - maxZ = max.getZ(); - } + if(!isCombatRegion(region)) continue; + + combatRegion = region; + break; + } + + if (combatRegion == null) { + throw new IllegalStateException("Combat region not found."); } - double x = (maxX - minX) / 2 + minX; - double z = (maxZ - minZ) / 2 + minZ; + BlockVector3 min = combatRegion.getMinimumPoint(); + BlockVector3 max = combatRegion.getMaximumPoint(); - return new Location(location.getWorld(), x, location.getY(), z); + double x = (double) (min.getX() + max.getX()) / 2; + double z = (double) (min.getZ() + max.getZ()) / 2; + + return new Location(location.getWorld(), x,location.getY(), z); } private boolean isInCombatRegion(Location location, String regionName) { @@ -66,4 +59,8 @@ private boolean isInCombatRegion(Location location, String regionName) { return applicableRegions.getRegions().stream().anyMatch(region -> region.getId().equalsIgnoreCase(regionName)); } + + private boolean isCombatRegion(ProtectedRegion region) { + return this.regions.stream().anyMatch(regionName -> region.getId().equalsIgnoreCase(regionName)); + } } From ba7eca8973f0cc367d87e7f9151aa7caae85f487 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Mon, 2 Sep 2024 03:01:29 +0200 Subject: [PATCH 05/11] Set cooldown for messages --- .../config/implementation/PluginConfig.java | 3 +++ .../notification/NotificationAnnouncer.java | 25 +++++++++++++++++++ .../combat/region/RegionController.java | 3 ++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index f1563ddc..0c18a351 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -53,6 +53,9 @@ public static class Settings extends OkaeriConfig { }) public double blockedRegionKnockMultiplier = 1; + @Comment({" ", "# Set duration (IN SECONDS) between next messages sent about not being able to enter the region"}) + public int regionEnterMessageCooldown = 3; + @Comment("# Set the radius of the blocked region if you aren't using WorldGuard basen on default spawn region!") public int blockedRegionRadius = 10; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java index 6ced8479..20497d33 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java @@ -1,6 +1,10 @@ package com.eternalcode.combat.notification; import com.eternalcode.combat.notification.implementation.BossBarNotification; +import java.time.Duration; +import java.time.Instant; +import java.util.HashMap; +import java.util.UUID; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.platform.AudienceProvider; @@ -15,6 +19,7 @@ public final class NotificationAnnouncer { private final AudienceProvider audienceProvider; private final MiniMessage miniMessage; + private final HashMap timeLimitMap = new HashMap<>(); public NotificationAnnouncer(AudienceProvider audienceProvider, MiniMessage miniMessage) { this.audienceProvider = audienceProvider; @@ -69,6 +74,26 @@ public void broadcast(String text) { audience.sendMessage(message); } + public void sendMessage(Player player, String text, Duration timeLimit) { + Audience audience = this.audience(player); + Component message = this.miniMessage.deserialize(text); + + UUID uniqueId = player.getUniqueId(); + + if (this.timeLimitMap.containsKey(uniqueId)) { + Instant instant = this.timeLimitMap.get(uniqueId); + + if (instant.isAfter(Instant.now())) { + return; + } + else { + this.timeLimitMap.remove(uniqueId); + } + } + audience.sendMessage(message); + this.timeLimitMap.put(uniqueId, Instant.now().plus(timeLimit)); + } + private Audience audience(CommandSender sender) { if (sender instanceof Player player) { return this.audienceProvider.player(player.getUniqueId()); diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java index d90364d6..7f25504e 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java @@ -3,6 +3,7 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.notification.NotificationAnnouncer; +import java.time.Duration; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -60,7 +61,7 @@ void onPlayerMove(PlayerMoveEvent event) { player.setVelocity(knockbackVector.multiply(configuredVector)); - this.announcer.sendMessage(player, this.pluginConfig.messages.cantEnterOnRegion); + this.announcer.sendMessage(player, this.pluginConfig.messages.cantEnterOnRegion, Duration.ofSeconds(this.pluginConfig.settings.regionEnterMessageCooldown)); } } From 1b244e5397b31ef021cc5667ff519f341e4faee3 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Tue, 3 Sep 2024 20:36:41 +0200 Subject: [PATCH 06/11] Resolve half of suggestions --- .../combat/notification/NotificationAnnouncer.java | 7 +++---- .../combat/region/WorldGuardRegionProvider.java | 11 ++++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java index 20497d33..13c86d27 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java @@ -50,7 +50,6 @@ public void send(CommandSender sender, Notification notification, Formatter form case BOSS_BAR -> { BossBarNotification bossBarNotification = (BossBarNotification) notification; - BossBar bossBar = bossBarNotification.create(message); audience.showBossBar(bossBar); @@ -86,9 +85,9 @@ public void sendMessage(Player player, String text, Duration timeLimit) { if (instant.isAfter(Instant.now())) { return; } - else { - this.timeLimitMap.remove(uniqueId); - } + + this.timeLimitMap.remove(uniqueId); + } audience.sendMessage(message); this.timeLimitMap.put(uniqueId, Instant.now().plus(timeLimit)); diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java index cfac7c9b..80fee057 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java @@ -7,6 +7,7 @@ import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; import com.sk89q.worldguard.protection.regions.RegionQuery; +import java.util.concurrent.atomic.AtomicReference; import org.bukkit.Location; import java.util.List; @@ -30,21 +31,21 @@ public Location getRegionCenter(Location location) { RegionQuery regionQuery = regionContainer.createQuery(); ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location)); - ProtectedRegion combatRegion = null; + AtomicReference combatRegion = new AtomicReference<>(); for (ProtectedRegion region : applicableRegions.getRegions()) { if(!isCombatRegion(region)) continue; - combatRegion = region; + combatRegion.set(region); break; } - if (combatRegion == null) { + if (combatRegion.get() == null) { throw new IllegalStateException("Combat region not found."); } - BlockVector3 min = combatRegion.getMinimumPoint(); - BlockVector3 max = combatRegion.getMaximumPoint(); + BlockVector3 min = combatRegion.get().getMinimumPoint(); + BlockVector3 max = combatRegion.get().getMaximumPoint(); double x = (double) (min.getX() + max.getX()) / 2; double z = (double) (min.getZ() + max.getZ()) / 2; From 6d6f604fa481784838271a5a44c5d920af3e6139 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Wed, 18 Sep 2024 22:13:52 +0200 Subject: [PATCH 07/11] Remove delay and add PVP regions blockade. --- .../combat/bridge/BridgeService.java | 8 ++-- .../config/implementation/PluginConfig.java | 4 +- .../notification/NotificationAnnouncer.java | 25 ------------- .../combat/region/RegionController.java | 3 +- .../region/WorldGuardRegionProvider.java | 37 ++++++++++++++++--- 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeService.java index ae2ae8be..665362bd 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeService.java @@ -30,12 +30,12 @@ public BridgeService(PluginConfig pluginConfig, PluginManager pluginManager, Log public void init(FightManager fightManager, Server server) { this.initialize("WorldGuard", - () -> this.regionProvider = new WorldGuardRegionProvider(this.pluginConfig.settings.blockedRegions), + () -> this.regionProvider = new WorldGuardRegionProvider(this.pluginConfig.settings.blockedRegions, this.pluginConfig), () -> { - this.regionProvider = new DefaultRegionProvider(this.pluginConfig.settings.blockedRegionRadius); + this.regionProvider = new DefaultRegionProvider(this.pluginConfig.settings.blockedRegionRadius); - this.logger.warning("WorldGuard is not installed, set to default region provider."); - }); + this.logger.warning("WorldGuard is not installed, set to default region provider."); + }); this.initialize("PlaceholderAPI", () -> new FightTagPlaceholder(fightManager, server, plugin).register(), diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 0c18a351..31009d95 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -53,8 +53,8 @@ public static class Settings extends OkaeriConfig { }) public double blockedRegionKnockMultiplier = 1; - @Comment({" ", "# Set duration (IN SECONDS) between next messages sent about not being able to enter the region"}) - public int regionEnterMessageCooldown = 3; + @Comment({"# Should the player be prevented from entering regions with WorldGuard flag PVP set to DENY "}) + public boolean shouldPreventPvpRegions = true; @Comment("# Set the radius of the blocked region if you aren't using WorldGuard basen on default spawn region!") public int blockedRegionRadius = 10; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java index 13c86d27..47de9228 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java @@ -1,10 +1,6 @@ package com.eternalcode.combat.notification; import com.eternalcode.combat.notification.implementation.BossBarNotification; -import java.time.Duration; -import java.time.Instant; -import java.util.HashMap; -import java.util.UUID; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.platform.AudienceProvider; @@ -19,7 +15,6 @@ public final class NotificationAnnouncer { private final AudienceProvider audienceProvider; private final MiniMessage miniMessage; - private final HashMap timeLimitMap = new HashMap<>(); public NotificationAnnouncer(AudienceProvider audienceProvider, MiniMessage miniMessage) { this.audienceProvider = audienceProvider; @@ -73,26 +68,6 @@ public void broadcast(String text) { audience.sendMessage(message); } - public void sendMessage(Player player, String text, Duration timeLimit) { - Audience audience = this.audience(player); - Component message = this.miniMessage.deserialize(text); - - UUID uniqueId = player.getUniqueId(); - - if (this.timeLimitMap.containsKey(uniqueId)) { - Instant instant = this.timeLimitMap.get(uniqueId); - - if (instant.isAfter(Instant.now())) { - return; - } - - this.timeLimitMap.remove(uniqueId); - - } - audience.sendMessage(message); - this.timeLimitMap.put(uniqueId, Instant.now().plus(timeLimit)); - } - private Audience audience(CommandSender sender) { if (sender instanceof Player player) { return this.audienceProvider.player(player.getUniqueId()); diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java index 7f25504e..d90364d6 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java @@ -3,7 +3,6 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.notification.NotificationAnnouncer; -import java.time.Duration; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -61,7 +60,7 @@ void onPlayerMove(PlayerMoveEvent event) { player.setVelocity(knockbackVector.multiply(configuredVector)); - this.announcer.sendMessage(player, this.pluginConfig.messages.cantEnterOnRegion, Duration.ofSeconds(this.pluginConfig.settings.regionEnterMessageCooldown)); + this.announcer.sendMessage(player, this.pluginConfig.messages.cantEnterOnRegion); } } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java index 80fee057..c4bcf1e9 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java @@ -1,9 +1,12 @@ package com.eternalcode.combat.region; +import com.eternalcode.combat.config.implementation.PluginConfig; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.flags.Flags; +import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; import com.sk89q.worldguard.protection.regions.RegionQuery; @@ -15,9 +18,12 @@ public class WorldGuardRegionProvider implements RegionProvider { private final List regions; + private final PluginConfig pluginConfig; - public WorldGuardRegionProvider(List regions) { + + public WorldGuardRegionProvider(List regions, PluginConfig pluginConfig) { this.regions = regions; + this.pluginConfig = pluginConfig; } @Override @@ -29,12 +35,13 @@ public boolean isInRegion(Location location) { public Location getRegionCenter(Location location) { RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionQuery regionQuery = regionContainer.createQuery(); + ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location)); AtomicReference combatRegion = new AtomicReference<>(); for (ProtectedRegion region : applicableRegions.getRegions()) { - if(!isCombatRegion(region)) continue; + if (!isCombatRegion(region)) continue; combatRegion.set(region); break; @@ -50,7 +57,7 @@ public Location getRegionCenter(Location location) { double x = (double) (min.getX() + max.getX()) / 2; double z = (double) (min.getZ() + max.getZ()) / 2; - return new Location(location.getWorld(), x,location.getY(), z); + return new Location(location.getWorld(), x, location.getY(), z); } private boolean isInCombatRegion(Location location, String regionName) { @@ -58,10 +65,30 @@ private boolean isInCombatRegion(Location location, String regionName) { RegionQuery regionQuery = regionContainer.createQuery(); ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location)); - return applicableRegions.getRegions().stream().anyMatch(region -> region.getId().equalsIgnoreCase(regionName)); + if (applicableRegions.getRegions().stream().anyMatch(region -> region.getId().equalsIgnoreCase(regionName))) { + return true; + } + + if (this.pluginConfig.settings.shouldPreventPvpRegions) { + for (ProtectedRegion region : applicableRegions.getRegions()) { + + return region.getFlag(Flags.PVP) != null && region.getFlag(Flags.PVP).equals(StateFlag.State.DENY); + } + } + + return false; } private boolean isCombatRegion(ProtectedRegion region) { - return this.regions.stream().anyMatch(regionName -> region.getId().equalsIgnoreCase(regionName)); + if (this.regions.stream().anyMatch(regionName -> region.getId().equalsIgnoreCase(regionName))) { + return true; + } + + if (this.pluginConfig.settings.shouldPreventPvpRegions && region.getFlag(Flags.PVP) != null) { + return region.getFlag(Flags.PVP).equals(StateFlag.State.DENY); + } + + + return false; } } From e1b795fdd20ac6b9cd7cbb5bee09b882246079c8 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Thu, 19 Sep 2024 00:02:55 +0200 Subject: [PATCH 08/11] Improve performance of WorldGuardRegionProvider. --- .../combat/region/DefaultRegionProvider.java | 27 ++++--- .../com/eternalcode/combat/region/Region.java | 9 +++ .../combat/region/RegionController.java | 8 +- .../eternalcode/combat/region/RegionMain.java | 23 ++++++ .../combat/region/RegionProvider.java | 7 +- .../region/WorldGuardRegionProvider.java | 74 +++++++------------ 6 files changed, 85 insertions(+), 63 deletions(-) create mode 100644 eternalcombat-api/src/main/java/com/eternalcode/combat/region/Region.java create mode 100644 eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java index 1f004c1a..e4b1f755 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java @@ -1,5 +1,6 @@ package com.eternalcode.combat.region; +import java.util.Optional; import org.bukkit.Location; public class DefaultRegionProvider implements RegionProvider { @@ -11,7 +12,7 @@ public DefaultRegionProvider(int radius) { } @Override - public boolean isInRegion(Location location) { + public Optional getRegion(Location location) { Location spawnLocation = location.getWorld().getSpawnLocation(); double x = spawnLocation.getX(); double z = spawnLocation.getZ(); @@ -19,23 +20,25 @@ public boolean isInRegion(Location location) { Point min = new Point(x - this.radius, z - this.radius); Point max = new Point(x + this.radius, z + this.radius); - return this.contains(min, max, location.getX(), location.getZ()); - } - - @Override - public Location getRegionCenter(Location location) { - Location spawnLocation = location.getWorld().getSpawnLocation(); - double x = spawnLocation.getX(); - double z = spawnLocation.getZ(); + if (this.contains(min, max, location.getX(), location.getZ())) { + return Optional.of(new SpawnRegion(location, x, z)); + } - return new Location(location.getWorld(), x, location.getY(), z); + return Optional.empty(); } - public boolean contains(Point min, Point max, double x, double z) { + private boolean contains(Point min, Point max, double x, double z) { return x >= min.x() && x < max.x() && z >= min.z() && z < max.z(); } - public record Point(double x, double z) {} + private record Point(double x, double z) {} + + private record SpawnRegion(Location contextLocation, double x, double z) implements Region { + @Override + public Location getCenter() { + return new Location(contextLocation.getWorld(), x, contextLocation.getY(), z); + } + } } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/Region.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/Region.java new file mode 100644 index 00000000..fecd119a --- /dev/null +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/Region.java @@ -0,0 +1,9 @@ +package com.eternalcode.combat.region; + +import org.bukkit.Location; + +public interface Region { + + Location getCenter(); + +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java index d90364d6..9039be19 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java @@ -3,6 +3,7 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.notification.NotificationAnnouncer; +import java.util.Optional; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -23,7 +24,6 @@ public RegionController(NotificationAnnouncer announcer, RegionProvider regionPr this.regionProvider = regionProvider; this.fightManager = fightManager; this.pluginConfig = pluginConfig; - } @EventHandler @@ -45,11 +45,13 @@ void onPlayerMove(PlayerMoveEvent event) { int zFrom = locationFrom.getBlockZ(); if (xTo != xFrom || yTo != yFrom || zTo != zFrom) { - if (!this.regionProvider.isInRegion(locationTo)) { + Optional regionOptional = regionProvider.getRegion(locationTo); + if (regionOptional.isEmpty()) { return; } - Location centerOfRegion = this.regionProvider.getRegionCenter(locationTo); + Region region = regionOptional.get(); + Location centerOfRegion = region.getCenter(); Location subtract = player.getLocation().subtract(centerOfRegion); Vector knockbackVector = new Vector(subtract.getX(), 0, subtract.getZ()).normalize(); diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java new file mode 100644 index 00000000..939277d4 --- /dev/null +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java @@ -0,0 +1,23 @@ +package com.eternalcode.combat.region; + +import java.util.List; +import java.util.TreeSet; + +public class RegionMain { + + public static void main(String[] args) { + TreeSet set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + + set.addAll(List.of("Rollczi", "Rollczi2", "Rollczi3")); + + if (!set.subSet("Rollczi", "Rollczi").isEmpty()) { + System.out.println("Rollczi is in the set"); + } + + if (!set.subSet("Rollczi2", "Rollczi2").isEmpty()) { + System.out.println("Rollczi2 is in the set"); + } + System.out.println("Rollczi3 is in the set"); + } + +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java index ec47f18d..a60c7fe9 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java @@ -1,11 +1,14 @@ package com.eternalcode.combat.region; +import java.util.Optional; import org.bukkit.Location; public interface RegionProvider { - boolean isInRegion(Location location); + Optional getRegion(Location location); - Location getRegionCenter(Location location); + default boolean isInRegion(Location location) { + return getRegion(location).isPresent(); + } } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java index c4bcf1e9..1dc2586d 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java @@ -10,85 +10,67 @@ import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; import com.sk89q.worldguard.protection.regions.RegionQuery; -import java.util.concurrent.atomic.AtomicReference; +import java.util.Optional; +import java.util.TreeSet; import org.bukkit.Location; import java.util.List; public class WorldGuardRegionProvider implements RegionProvider { - private final List regions; + private final RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer(); + private final TreeSet regions; private final PluginConfig pluginConfig; - public WorldGuardRegionProvider(List regions, PluginConfig pluginConfig) { - this.regions = regions; + this.regions = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + this.regions.addAll(regions); this.pluginConfig = pluginConfig; } @Override - public boolean isInRegion(Location location) { - return this.regions.stream().anyMatch(region -> this.isInCombatRegion(location, region)); - } - - @Override - public Location getRegionCenter(Location location) { - RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer(); - RegionQuery regionQuery = regionContainer.createQuery(); - + public Optional getRegion(Location location) { + RegionQuery regionQuery = this.regionContainer.createQuery(); ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location)); - AtomicReference combatRegion = new AtomicReference<>(); - for (ProtectedRegion region : applicableRegions.getRegions()) { - if (!isCombatRegion(region)) continue; - - combatRegion.set(region); - break; - } + if (!isCombatRegion(region)) { + continue; + } - if (combatRegion.get() == null) { - throw new IllegalStateException("Combat region not found."); + return Optional.of(new RegionImpl(location, region)); } - BlockVector3 min = combatRegion.get().getMinimumPoint(); - BlockVector3 max = combatRegion.get().getMaximumPoint(); - - double x = (double) (min.getX() + max.getX()) / 2; - double z = (double) (min.getZ() + max.getZ()) / 2; - - return new Location(location.getWorld(), x, location.getY(), z); + return Optional.empty(); } - private boolean isInCombatRegion(Location location, String regionName) { - RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer(); - RegionQuery regionQuery = regionContainer.createQuery(); - ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location)); - - if (applicableRegions.getRegions().stream().anyMatch(region -> region.getId().equalsIgnoreCase(regionName))) { + private boolean isCombatRegion(ProtectedRegion region) { + if (this.regions.contains(region.getId())) { return true; } if (this.pluginConfig.settings.shouldPreventPvpRegions) { - for (ProtectedRegion region : applicableRegions.getRegions()) { + StateFlag.State flag = region.getFlag(Flags.PVP); - return region.getFlag(Flags.PVP) != null && region.getFlag(Flags.PVP).equals(StateFlag.State.DENY); + if (flag != null) { + return flag.equals(StateFlag.State.DENY); } } return false; } - private boolean isCombatRegion(ProtectedRegion region) { - if (this.regions.stream().anyMatch(regionName -> region.getId().equalsIgnoreCase(regionName))) { - return true; - } - - if (this.pluginConfig.settings.shouldPreventPvpRegions && region.getFlag(Flags.PVP) != null) { - return region.getFlag(Flags.PVP).equals(StateFlag.State.DENY); - } + private record RegionImpl(Location contextLocation, ProtectedRegion region) implements Region { + @Override + public Location getCenter() { + BlockVector3 min = region.getMinimumPoint(); + BlockVector3 max = region.getMaximumPoint(); + double x = (double) (min.getX() + max.getX()) / 2; + double z = (double) (min.getZ() + max.getZ()) / 2; - return false; + return new Location(contextLocation.getWorld(), x, contextLocation.getY(), z); + } } + } From 00953b8e4f7758b63da0347d61c7f6e841e7e1a9 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Thu, 19 Sep 2024 00:33:21 +0200 Subject: [PATCH 09/11] Use lambda --- .../eternalcode/combat/region/DefaultRegionProvider.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java index e4b1f755..1750d8e9 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java @@ -21,7 +21,7 @@ public Optional getRegion(Location location) { Point max = new Point(x + this.radius, z + this.radius); if (this.contains(min, max, location.getX(), location.getZ())) { - return Optional.of(new SpawnRegion(location, x, z)); + return Optional.of(() -> new Location(location.getWorld(), x, location.getY(), z)); } return Optional.empty(); @@ -34,11 +34,4 @@ private boolean contains(Point min, Point max, double x, double z) { private record Point(double x, double z) {} - private record SpawnRegion(Location contextLocation, double x, double z) implements Region { - @Override - public Location getCenter() { - return new Location(contextLocation.getWorld(), x, contextLocation.getY(), z); - } - } - } From 3e709217ac0593f2fb542f82d61ce97accbc9879 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Thu, 19 Sep 2024 00:51:07 +0200 Subject: [PATCH 10/11] Resolve @vLuckyyy review --- .../combat/region/DefaultRegionProvider.java | 13 ++++++------- .../combat/region/WorldGuardRegionProvider.java | 3 +-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java index 1750d8e9..8f948ce3 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java @@ -2,6 +2,7 @@ import java.util.Optional; import org.bukkit.Location; +import org.bukkit.util.BlockVector; public class DefaultRegionProvider implements RegionProvider { @@ -17,8 +18,8 @@ public Optional getRegion(Location location) { double x = spawnLocation.getX(); double z = spawnLocation.getZ(); - Point min = new Point(x - this.radius, z - this.radius); - Point max = new Point(x + this.radius, z + this.radius); + BlockVector min = new BlockVector(x - this.radius, 0, z - this.radius); + BlockVector max = new BlockVector(x + this.radius, 0, z + this.radius); if (this.contains(min, max, location.getX(), location.getZ())) { return Optional.of(() -> new Location(location.getWorld(), x, location.getY(), z)); @@ -27,11 +28,9 @@ public Optional getRegion(Location location) { return Optional.empty(); } - private boolean contains(Point min, Point max, double x, double z) { - return x >= min.x() && x < max.x() - && z >= min.z() && z < max.z(); + private boolean contains(BlockVector min, BlockVector max, double x, double z) { + return x >= min.getX() && x < max.getX() + && z >= min.getZ() && z < max.getZ(); } - private record Point(double x, double z) {} - } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java index 1dc2586d..96ecef4b 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java @@ -19,11 +19,10 @@ public class WorldGuardRegionProvider implements RegionProvider { private final RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer(); - private final TreeSet regions; + private final TreeSet regions = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); private final PluginConfig pluginConfig; public WorldGuardRegionProvider(List regions, PluginConfig pluginConfig) { - this.regions = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); this.regions.addAll(regions); this.pluginConfig = pluginConfig; } From 7458936a03094ab4dc08adb46dd53de6d5096d97 Mon Sep 17 00:00:00 2001 From: CitralFlo Date: Sun, 22 Sep 2024 21:32:52 +0200 Subject: [PATCH 11/11] Remove bait class :P --- .../eternalcode/combat/region/RegionMain.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java deleted file mode 100644 index 939277d4..00000000 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionMain.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.eternalcode.combat.region; - -import java.util.List; -import java.util.TreeSet; - -public class RegionMain { - - public static void main(String[] args) { - TreeSet set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - - set.addAll(List.of("Rollczi", "Rollczi2", "Rollczi3")); - - if (!set.subSet("Rollczi", "Rollczi").isEmpty()) { - System.out.println("Rollczi is in the set"); - } - - if (!set.subSet("Rollczi2", "Rollczi2").isEmpty()) { - System.out.println("Rollczi2 is in the set"); - } - System.out.println("Rollczi3 is in the set"); - } - -}