Skip to content

Commit 47eceb8

Browse files
committed
Merge branch 'release/1.0.3.6'
2 parents 125b0eb + ba9a4a6 commit 47eceb8

23 files changed

Lines changed: 156 additions & 36 deletions

File tree

API/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ rootProject.extra.properties["sha"]?.let { sha ->
88

99
dependencies {
1010
compileOnly("io.papermc.paper:paper-api:1.21.5-R0.1-SNAPSHOT")
11-
compileOnly(files("../libs/zMenu-1.1.1.0.jar"))
11+
compileOnly(files("../libs/zMenu-1.1.1.2.jar"))
1212

13-
implementation("fr.maxlego08.sarah:sarah:1.20")
13+
implementation("fr.maxlego08.sarah:sarah:1.23")
1414
implementation("com.tcoded:FoliaLib:0.5.1")
1515
implementation("fr.mrmicky:fastboard:2.1.5")
1616
}

API/src/main/java/fr/maxlego08/essentials/api/worldedit/WorldEditTask.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,18 @@ public void calculatePrice(Consumer<BigDecimal> consumer) {
7272
this.loadBlocks();
7373

7474
// Process the blocks in batches and calculate the total price
75-
processNextBatch(blocks.stream().filter(b -> worldeditManager.hasPermission(user.getPlayer(), b)).map(b -> new BlockInfo(b, null, BigDecimal.ZERO)).collect(Collectors.toList()), 0, this.worldeditManager.getBatchSize(), () -> {
75+
processNextBatch(blocks.stream().map(b -> new BlockInfo(b, null, BigDecimal.ZERO)).collect(Collectors.toList()), 0, this.worldeditManager.getBatchSize(), () -> {
7676

7777
this.totalPrice = this.blockInfos.stream().map(BlockInfo::price).reduce(BigDecimal.ZERO, BigDecimal::add);
7878
this.materials = this.blockInfos.stream().collect(Collectors.groupingBy(BlockInfo::newMaterial, Collectors.counting()));
7979
this.worldeditStatus = WorldeditStatus.WAITING_RESPONSE_PRICE;
8080

8181
consumer.accept(totalPrice);
82-
}, blocks -> blocks.forEach(block -> this.processBlock(block.block())));
82+
}, batchBlocks -> batchBlocks.forEach(block -> {
83+
if (worldeditManager.hasPermission(user.getPlayer(), block.block())) {
84+
this.processBlock(block.block());
85+
}
86+
}));
8387
});
8488
}
8589

DiscordBot/src/main/java/fr/maxlego08/essentials/bot/storage/StorageManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import fr.maxlego08.sarah.DatabaseConnection;
1010
import fr.maxlego08.sarah.HikariDatabaseConnection;
1111
import fr.maxlego08.sarah.RequestHelper;
12+
import fr.maxlego08.sarah.logger.JULogger;
1213
import fr.maxlego08.sarah.logger.Logger;
1314

1415
import java.util.Optional;
@@ -25,14 +26,14 @@ public class StorageManager {
2526
public void connect(Configuration configuration) {
2627

2728
DatabaseConfiguration databaseConfiguration = configuration.getDatabaseConfiguration().toDatabaseConfiguration();
28-
DatabaseConnection databaseConnection = new HikariDatabaseConnection(databaseConfiguration);
29+
Logger logger = System.out::println;
30+
DatabaseConnection databaseConnection = new HikariDatabaseConnection(databaseConfiguration, logger);
2931

3032
if (!databaseConnection.isValid()) {
3133
System.err.println("Database connection failed.");
3234
return;
3335
}
3436

35-
Logger logger = System.out::println;
3637
this.requestHelper = new RequestHelper(databaseConnection, logger);
3738
}
3839

build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
}
77

88
group = "fr.maxlego08.essentials"
9-
version = "1.0.3.5"
9+
version = "1.0.3.6"
1010

1111
extra.set("targetFolder", file("target/"))
1212
extra.set("targetFolderDiscord", file("target-discord/"))
@@ -67,9 +67,9 @@ allprojects {
6767

6868
dependencies {
6969
// compileOnly("fr.maxlego08.menu:zmenu-api:1.1.0.0")
70-
compileOnly(files("libs/zMenu-1.1.1.0.jar"))
70+
compileOnly(files("libs/zMenu-1.1.1.2.jar"))
7171

72-
compileOnly("fr.maxlego08.sarah:sarah:1.20")
72+
compileOnly("fr.maxlego08.sarah:sarah:1.23")
7373
compileOnly("com.tcoded:FoliaLib:0.5.1")
7474
compileOnly("fr.mrmicky:fastboard:2.1.5")
7575
}

changelog.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@
66

77
# Unreleased
88

9+
# 1.0.3.6
10+
11+
- Updated zMenu to version 1.1.1.2
12+
- Updated Sarah to version 1.23
13+
- Added generic Bukkit event-based permission checker for WorldEdit module — blocks in protected claims (HuskClaims, GriefPrevention, Lands, Towny, etc.) are now automatically skipped without needing a specific hook [#237](https://github.com/Maxlego08/zEssentials/issues/237)
14+
- Added configurable sounds for teleportation countdown and completion (`countdown-sound` and `complete-sound` in `modules/teleportation/config.yml`), supports custom sounds via the zMenu XSound API
15+
- Added warp lookup cache with O(1) HashMap for improved performance [#239](https://github.com/Maxlego08/zEssentials/pull/239)
16+
- Fixed home deletion from donut GUI showing "The home ? does not exist." — `/delhome` now opens the confirmation GUI when `homeDeleteConfirm` is enabled
17+
- Fixed cancelled TPA requests still being accepted — `/tpacancel` now properly removes the request from the target player's incoming requests
18+
- Fixed vault admin command permission check bypassed for admin access
19+
- Fixed chat URL pattern not matching URLs with special characters (`~`, `+`, `#`)
20+
- Fixed chat link transform regex replacement error with special characters
21+
922
# 1.0.3.5
1023

1124
- Added `/itemframe` command (`/iframe` alias), toggles visibility of the item frame you're looking at

libs/zMenu-1.1.1.2.jar

2.56 MB
Binary file not shown.

src/main/java/fr/maxlego08/essentials/ZEssentialsPlugin.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@
149149
import java.nio.charset.StandardCharsets;
150150
import java.util.ArrayList;
151151
import java.util.Arrays;
152+
import java.util.Collections;
153+
import java.util.HashMap;
152154
import java.util.List;
153155
import java.util.Map;
154156
import java.util.Objects;
@@ -163,6 +165,7 @@ public final class ZEssentialsPlugin extends ZPlugin implements EssentialsPlugin
163165
private final List<Material> materials = Arrays.stream(Material.values()).filter(e -> !e.name().startsWith("LEGACY_")).toList();
164166
private final Enchantments enchantments = new ZEnchantments();
165167
private final List<PermissionChecker> permissionCheckers = new ArrayList<>();
168+
private volatile Map<String, Warp> warpsByName = Collections.emptyMap();
166169
private EssentialsUtils essentialsUtils;
167170
private ServerStorage serverStorage = new ZServerStorage(this);
168171
private InventoryManager inventoryManager;
@@ -220,6 +223,7 @@ public void onEnable() {
220223
// Load configuration files
221224
this.configurationFiles.forEach(ConfigurationFile::load);
222225
ConfigStorage.getInstance().load(getPersist());
226+
rebuildWarpCache();
223227

224228
// Commands
225229
this.registerListener(this.commandManager = new ZCommandManager(this));
@@ -523,9 +527,23 @@ public List<Warp> getWarps() {
523527
return ConfigStorage.warps;
524528
}
525529

530+
public void rebuildWarpCache() {
531+
Map<String, Warp> map = new HashMap<>();
532+
for (Warp warp : ConfigStorage.warps) {
533+
map.put(warp.name().toLowerCase(), warp);
534+
}
535+
this.warpsByName = Collections.unmodifiableMap(map);
536+
}
537+
526538
@Override
527539
public Optional<Warp> getWarp(String name) {
528-
return getWarps().stream().filter(warp -> warp.name().equalsIgnoreCase(name)).findFirst();
540+
Warp warp = this.warpsByName.get(name.toLowerCase());
541+
if (warp != null) return Optional.of(warp);
542+
if (this.warpsByName.size() != ConfigStorage.warps.size()) {
543+
rebuildWarpCache();
544+
return Optional.ofNullable(this.warpsByName.get(name.toLowerCase()));
545+
}
546+
return Optional.empty();
529547
}
530548

531549
@Override
@@ -844,5 +862,8 @@ private void loadHooks() {
844862
this.getLogger().info("Register MythicMobsHook.");
845863
});
846864
}
865+
866+
this.permissionCheckers.add(new fr.maxlego08.essentials.hooks.BukkitEventPermissionChecker());
867+
this.getLogger().info("Register Bukkit Event Permission Checker.");
847868
}
848869
}

src/main/java/fr/maxlego08/essentials/commands/commands/home/CommandDelHome.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ protected CommandResultType perform(EssentialsPlugin plugin) {
4545
}
4646

4747
if (homeManager.isHomeDeleteConfirm()) {
48-
message(user, Message.COMMAND_HOME_DELETE_CONFIRM, "%name%", homeName);
48+
Home home = user.getHome(homeName).orElse(null);
49+
if (home == null) {
50+
message(user, Message.COMMAND_HOME_DOESNT_EXIST, "%name%", homeName);
51+
return CommandResultType.DEFAULT;
52+
}
53+
homeManager.openInventoryConfirmHome(user, home);
4954
return CommandResultType.SUCCESS;
5055
}
5156

src/main/java/fr/maxlego08/essentials/commands/commands/warp/CommandDelWarp.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.maxlego08.essentials.commands.commands.warp;
22

3+
import fr.maxlego08.essentials.ZEssentialsPlugin;
34
import fr.maxlego08.essentials.api.EssentialsPlugin;
45
import fr.maxlego08.essentials.api.commands.CommandResultType;
56
import fr.maxlego08.essentials.api.commands.Permission;
@@ -35,6 +36,7 @@ protected CommandResultType perform(EssentialsPlugin plugin) {
3536

3637
ConfigStorage.warps.removeIf(warp -> warp.name().equalsIgnoreCase(warpName));
3738
ConfigStorage.getInstance().save(plugin.getPersist());
39+
((ZEssentialsPlugin) plugin).rebuildWarpCache();
3840

3941
message(sender, Message.COMMAND_WARP_DELETE, "%name%", warpName);
4042

src/main/java/fr/maxlego08/essentials/commands/commands/warp/CommandSetWarp.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.maxlego08.essentials.commands.commands.warp;
22

3+
import fr.maxlego08.essentials.ZEssentialsPlugin;
34
import fr.maxlego08.essentials.api.EssentialsPlugin;
45
import fr.maxlego08.essentials.api.commands.CommandResultType;
56
import fr.maxlego08.essentials.api.commands.Permission;
@@ -40,6 +41,7 @@ protected CommandResultType perform(EssentialsPlugin plugin) {
4041
ConfigStorage.warps.removeIf(warp -> warp.name().equalsIgnoreCase(warpName));
4142
ConfigStorage.warps.add(new Warp(warpName, new SafeLocation(this.player.getLocation())));
4243
ConfigStorage.getInstance().save(plugin.getPersist());
44+
((ZEssentialsPlugin) plugin).rebuildWarpCache();
4345

4446
message(sender, Message.COMMAND_WARP_CREATE, "%name%", warpName);
4547

0 commit comments

Comments
 (0)