Skip to content

Commit 5bc32ed

Browse files
committed
Start to refactor toggle areas to core package
1 parent 7eb48da commit 5bc32ed

File tree

15 files changed

+240
-167
lines changed

15 files changed

+240
-167
lines changed

craftbook-bukkit/doctools/src/main/java/org/enginehub/craftbook/internal/util/CommandUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import com.sk89q.worldedit.util.formatting.text.Component;
2121
import com.sk89q.worldedit.util.formatting.text.TextComponent;
2222
import org.enginehub.craftbook.PlatformCommandManager;
23+
import org.enginehub.craftbook.bukkit.mechanics.area.clipboard.AreaCommands;
2324
import org.enginehub.craftbook.mechanic.MechanicCommandRegistrar;
24-
import org.enginehub.craftbook.mechanics.area.clipboard.AreaCommands;
2525
import org.enginehub.craftbook.mechanics.headdrops.HeadDropsCommands;
2626
import org.enginehub.craftbook.mechanics.signcopier.SignEditCommands;
2727
import org.enginehub.piston.Command;

craftbook-bukkit/src/main/java/org/enginehub/craftbook/bukkit/mechanic/BukkitMechanicManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public void setup() {
3535
// registerMechanic("CustomCrafting", org.enginehub.craftbook.mechanics.crafting.CustomCrafting.class, MechanicCategory.CUSTOMISATION);
3636
// registerMechanic("CustomDrops", org.enginehub.craftbook.mechanics.drops.CustomDrops.class, MechanicCategory.CUSTOMISATION);
3737
// registerMechanic("CommandSigns", org.enginehub.craftbook.mechanics.CommandSigns.class, MechanicCategory.GENERAL);
38-
// registerMechanic("ToggleArea", org.enginehub.craftbook.mechanics.area.ToggleArea.class, MechanicCategory.GENERAL);
3938
// registerMechanic("Cauldron", org.enginehub.craftbook.mechanics.cauldron.ImprovedCauldron.class, MechanicCategory.CUSTOMISATION);
4039
// registerMechanic("Pay", org.enginehub.craftbook.mechanics.Payment.class, MechanicCategory.CIRCUIT);
4140
// registerMechanic("Pipes", org.enginehub.craftbook.mechanics.pipe.Pipes.class, MechanicCategory.CIRCUIT);
@@ -126,7 +125,7 @@ public void setup() {
126125
.description(TranslatableComponent.of("craftbook.marquee.description"))
127126
.className("org.enginehub.craftbook.bukkit.mechanics.BukkitMarquee")
128127
.category(MechanicCategory.GENERAL)
129-
.dependsOn(new MechanicDependency(org.enginehub.craftbook.mechanic.MechanicTypes.VARIABLES))
128+
.dependsOn(new MechanicDependency(org.enginehub.craftbook.mechanic.MechanicTypes.VARIABLES.get()))
130129
.buildAndRegister();
131130

132131
MechanicType.Builder
@@ -540,7 +539,7 @@ public void setup() {
540539
.name("ToggleArea")
541540
.description(TranslatableComponent.of("craftbook.togglearea.description"))
542541
.category(MechanicCategory.GENERAL)
543-
.className("org.enginehub.craftbook.mechanics.area.clipboard.ToggleArea")
542+
.className("org.enginehub.craftbook.bukkit.mechanics.area.clipboard.BukkitToggleArea")
544543
.buildAndRegister();
545544

546545
MechanicType.Builder

craftbook-bukkit/src/main/java/org/enginehub/craftbook/bukkit/mechanic/MechanicTypes.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.enginehub.craftbook.mechanics.area.Bridge;
2121
import org.enginehub.craftbook.mechanics.area.Door;
2222
import org.enginehub.craftbook.mechanics.area.Gate;
23-
import org.enginehub.craftbook.mechanics.area.clipboard.ToggleArea;
2423
import org.enginehub.craftbook.mechanics.headdrops.HeadDrops;
2524
import org.enginehub.craftbook.mechanics.minecart.MinecartCollisionEntry;
2625
import org.enginehub.craftbook.mechanics.minecart.MinecartEmptyDecay;
@@ -73,7 +72,6 @@ public class MechanicTypes {
7372
public static final @Nullable MechanicType<CartStation> MINECART_STATION = get("minecart_station");
7473
public static final @Nullable MechanicType<CartStrongBraker> MINECART_STRONG_BRAKER = get("minecart_strong_braker");
7574
public static final @Nullable MechanicType<CartTeleporter> MINECART_TELEPORTER = get("minecart_teleporter");
76-
public static final @Nullable MechanicType<ToggleArea> TOGGLE_AREA = get("toggle_area");
7775

7876
private MechanicTypes() {
7977
}

craftbook-bukkit/src/main/java/org/enginehub/craftbook/mechanics/area/clipboard/AreaCommands.java renamed to craftbook-bukkit/src/main/java/org/enginehub/craftbook/bukkit/mechanics/area/clipboard/AreaCommands.java

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* see <http://www.gnu.org/licenses/>.
1414
*/
1515

16-
package org.enginehub.craftbook.mechanics.area.clipboard;
16+
package org.enginehub.craftbook.bukkit.mechanics.area.clipboard;
1717

1818
import com.sk89q.worldedit.IncompleteRegionException;
1919
import com.sk89q.worldedit.WorldEdit;
@@ -22,21 +22,26 @@
2222
import com.sk89q.worldedit.command.util.CommandPermissions;
2323
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
2424
import com.sk89q.worldedit.extension.platform.Actor;
25-
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
25+
import com.sk89q.worldedit.extent.clipboard.Clipboard;
2626
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
2727
import com.sk89q.worldedit.internal.command.CommandRegistrationHandler;
2828
import com.sk89q.worldedit.math.BlockVector3;
2929
import com.sk89q.worldedit.regions.Region;
3030
import com.sk89q.worldedit.util.auth.AuthorizationException;
3131
import com.sk89q.worldedit.util.formatting.component.InvalidComponentException;
32+
import com.sk89q.worldedit.util.formatting.text.Component;
3233
import com.sk89q.worldedit.util.formatting.text.TextComponent;
3334
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
35+
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
3436
import com.sk89q.worldedit.util.formatting.text.format.TextColor;
37+
import com.sk89q.worldedit.util.formatting.text.format.TextDecoration;
3538
import com.sk89q.worldedit.world.World;
3639
import org.bukkit.block.Block;
3740
import org.enginehub.craftbook.CraftBook;
3841
import org.enginehub.craftbook.CraftBookPlayer;
3942
import org.enginehub.craftbook.bukkit.CraftBookPlugin;
43+
import org.enginehub.craftbook.mechanics.area.clipboard.AreaListBox;
44+
import org.enginehub.craftbook.mechanics.area.clipboard.CopyManager;
4045
import org.enginehub.craftbook.util.SignUtil;
4146
import org.enginehub.piston.CommandManager;
4247
import org.enginehub.piston.annotation.Command;
@@ -56,22 +61,34 @@
5661
@CommandContainer(superTypes = CommandPermissionsConditionGenerator.Registration.class)
5762
public class AreaCommands {
5863

59-
public static void register(CommandManager commandManager, CommandRegistrationHandler registration, ToggleArea toggleArea) {
64+
public static void register(CommandManager commandManager, CommandRegistrationHandler registration, BukkitToggleArea toggleArea) {
6065
registration.register(
6166
commandManager,
6267
AreaCommandsRegistration.builder(),
6368
new AreaCommands(toggleArea)
6469
);
6570
}
6671

67-
private final ToggleArea toggleArea;
72+
private final BukkitToggleArea toggleArea;
6873

69-
private AreaCommands(ToggleArea toggleArea) {
74+
private AreaCommands(BukkitToggleArea toggleArea) {
7075
this.toggleArea = toggleArea;
7176
}
7277

7378
private final CraftBookPlugin plugin = CraftBookPlugin.inst();
7479

80+
private Component makeFriendlyNamespace(Actor actor, String namespace) {
81+
Component namespaceComponent = null;
82+
if (!actor.isPlayer() || !namespace.equalsIgnoreCase(actor.getUniqueId().toString())) {
83+
// Show the raw namespace for non-player actors, or when it's not their UUID
84+
namespaceComponent = TextComponent.of(namespace);
85+
} else {
86+
namespaceComponent = TranslatableComponent.of("~" + actor.getName(), TextColor.LIGHT_PURPLE, TextDecoration.ITALIC).hoverEvent(HoverEvent.showText(TextComponent.of(namespace)));
87+
}
88+
89+
return namespaceComponent;
90+
}
91+
7592
@Command(name = "save", desc = "Saves the selected area")
7693
@CommandPermissions({ "craftbook.togglearea.save" })
7794
public void save(CraftBookPlayer player,
@@ -133,14 +150,14 @@ public void save(CraftBookPlayer player,
133150
}
134151

135152
// Copy
136-
BlockArrayClipboard copy = CopyManager.getInstance().copy(sel, world, saveEntities, saveBiomes);
153+
Clipboard copy = CopyManager.getInstance().copy(sel, world, saveEntities, saveBiomes);
137154

138155
CraftBook.LOGGER.info(player.getName() + " saving toggle area with folder '" + namespace + "' and ID '" + name + "'.");
139156

140157
// Save
141158
try {
142159
CopyManager.getInstance().save(namespace, name.toLowerCase(Locale.ENGLISH), copy);
143-
player.printInfo(TranslatableComponent.of("craftbook.togglearea.saved", TextComponent.of(name), TextComponent.of(namespace)));
160+
player.printInfo(TranslatableComponent.of("craftbook.togglearea.saved", TextComponent.of(name), makeFriendlyNamespace(player, namespace)));
144161
} catch (IOException e) {
145162
player.printError(TranslatableComponent.of("craftbook.togglearea.save-failed", TextComponent.of(e.getMessage())));
146163
}
@@ -262,8 +279,10 @@ public void delete(Actor actor,
262279

263280
Path areasPath = plugin.getDataFolder().toPath().resolve("areas").resolve(namespace);
264281

282+
Component namespaceComponent = makeFriendlyNamespace(actor, namespace);
283+
265284
if (!Files.exists(areasPath) || !Files.isDirectory(areasPath)) {
266-
actor.printError(TranslatableComponent.of("craftbook.togglearea.unknown-namespace", TextComponent.of(namespace)));
285+
actor.printError(TranslatableComponent.of("craftbook.togglearea.unknown-namespace", namespaceComponent));
267286
return;
268287
}
269288

@@ -275,9 +294,9 @@ public void delete(Actor actor,
275294
if (Files.exists(areaPath)) {
276295
try {
277296
Files.delete(areaPath);
278-
actor.printInfo(TranslatableComponent.of("craftbook.togglearea.deleted-area", TextComponent.of(name), TextComponent.of(namespace)));
297+
actor.printInfo(TranslatableComponent.of("craftbook.togglearea.deleted-area", TextComponent.of(name), namespaceComponent));
279298
} catch (IOException e) {
280-
actor.printError(TranslatableComponent.of("craftbook.togglearea.failed-delete", TextComponent.of(name), TextComponent.of(namespace)));
299+
actor.printError(TranslatableComponent.of("craftbook.togglearea.failed-delete", TextComponent.of(name), namespaceComponent));
281300
return;
282301
}
283302
break;
@@ -307,17 +326,18 @@ public void deleteAll(Actor actor,
307326
}
308327

309328
Path areasPath = plugin.getDataFolder().toPath().resolve("areas").resolve(namespace);
329+
Component namespaceComponent = makeFriendlyNamespace(actor, namespace);
310330

311331
if (!Files.exists(areasPath) || !Files.isDirectory(areasPath)) {
312-
actor.printError(TranslatableComponent.of("craftbook.togglearea.unknown-namespace", TextComponent.of(namespace)));
332+
actor.printError(TranslatableComponent.of("craftbook.togglearea.unknown-namespace", namespaceComponent));
313333
return;
314334
}
315335

316336
try {
317337
deleteDir(areasPath);
318-
actor.printInfo(TranslatableComponent.of("craftbook.togglearea.deleted-all-in-namespace", TextComponent.of(namespace)));
338+
actor.printInfo(TranslatableComponent.of("craftbook.togglearea.deleted-all-in-namespace", namespaceComponent));
319339
} catch (IOException e) {
320-
actor.printError(TranslatableComponent.of("craftbook.togglearea.failed-delete-all", TextComponent.of(namespace)));
340+
actor.printError(TranslatableComponent.of("craftbook.togglearea.failed-delete-all", namespaceComponent));
321341
}
322342
}
323343

craftbook-bukkit/src/main/java/org/enginehub/craftbook/mechanics/area/clipboard/ToggleArea.java renamed to craftbook-bukkit/src/main/java/org/enginehub/craftbook/bukkit/mechanics/area/clipboard/BukkitToggleArea.java

Lines changed: 19 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,15 @@
1313
* see <http://www.gnu.org/licenses/>.
1414
*/
1515

16-
package org.enginehub.craftbook.mechanics.area.clipboard;
16+
package org.enginehub.craftbook.bukkit.mechanics.area.clipboard;
1717

18-
import com.sk89q.util.yaml.YAMLProcessor;
1918
import com.sk89q.worldedit.WorldEditException;
2019
import com.sk89q.worldedit.bukkit.BukkitAdapter;
21-
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
20+
import com.sk89q.worldedit.extent.clipboard.Clipboard;
2221
import com.sk89q.worldedit.util.formatting.text.TextComponent;
2322
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
2423
import com.sk89q.worldedit.world.World;
2524
import net.kyori.adventure.text.Component;
26-
import net.kyori.adventure.text.TextReplacementConfig;
2725
import net.kyori.adventure.text.format.TextDecoration;
2826
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
2927
import org.bukkit.Bukkit;
@@ -35,14 +33,15 @@
3533
import org.bukkit.event.Listener;
3634
import org.bukkit.event.block.Action;
3735
import org.bukkit.event.block.SignChangeEvent;
38-
import org.enginehub.craftbook.AbstractCraftBookMechanic;
3936
import org.enginehub.craftbook.ChangedSign;
4037
import org.enginehub.craftbook.CraftBook;
4138
import org.enginehub.craftbook.CraftBookPlayer;
4239
import org.enginehub.craftbook.bukkit.CraftBookPlugin;
4340
import org.enginehub.craftbook.mechanic.CraftBookMechanic;
4441
import org.enginehub.craftbook.mechanic.MechanicCommandRegistrar;
4542
import org.enginehub.craftbook.mechanic.MechanicType;
43+
import org.enginehub.craftbook.mechanics.area.clipboard.CopyManager;
44+
import org.enginehub.craftbook.mechanics.area.clipboard.ToggleArea;
4645
import org.enginehub.craftbook.util.EventUtil;
4746
import org.enginehub.craftbook.util.ProtectionUtil;
4847
import org.enginehub.craftbook.util.SignUtil;
@@ -54,13 +53,10 @@
5453
import java.util.List;
5554
import java.util.Locale;
5655
import java.util.UUID;
57-
import java.util.regex.Pattern;
5856

59-
public class ToggleArea extends AbstractCraftBookMechanic implements Listener {
57+
public class BukkitToggleArea extends ToggleArea implements Listener {
6058

61-
private static final TextReplacementConfig DASH_REMOVER = TextReplacementConfig.builder().matchLiteral("-").replacement("").build();
62-
63-
public ToggleArea(MechanicType<? extends CraftBookMechanic> mechanicType) {
59+
public BukkitToggleArea(MechanicType<? extends CraftBookMechanic> mechanicType) {
6460
super(mechanicType);
6561
}
6662

@@ -200,6 +196,7 @@ public void onRightClick(SignClickEvent event) {
200196
// check if the namespace and area exists
201197
if (!isValidArea(toggleAreaData)) {
202198
player.printError(TranslatableComponent.of("craftbook.togglearea.missing-area"));
199+
event.setCancelled(true);
203200
return;
204201
}
205202

@@ -216,11 +213,11 @@ public void onRightClick(SignClickEvent event) {
216213
}
217214

218215
private boolean isValidArea(ToggleAreaData toggleAreaData) {
219-
if (CopyManager.isExistingArea(CraftBookPlugin.inst().getDataFolder(), toggleAreaData.namespace, toggleAreaData.areaOn)) {
220-
if (toggleAreaData.areaOff == null || toggleAreaData.areaOff.isEmpty() || toggleAreaData.areaOff.equals("--")) {
216+
if (CopyManager.isExistingArea(toggleAreaData.namespace(), toggleAreaData.areaOn())) {
217+
if (toggleAreaData.areaOff() == null || toggleAreaData.areaOff().isEmpty() || toggleAreaData.areaOff().equals("--")) {
221218
return true;
222219
}
223-
return CopyManager.isExistingArea(CraftBookPlugin.inst().getDataFolder(), toggleAreaData.namespace, toggleAreaData.areaOff);
220+
return CopyManager.isExistingArea(toggleAreaData.namespace(), toggleAreaData.areaOff());
224221
}
225222
return false;
226223
}
@@ -270,20 +267,20 @@ public void onBlockRedstoneChange(SourcedBlockRedstoneEvent event) {
270267

271268
private boolean toggle(ChangedSign sign, ToggleAreaData toggleAreaData, boolean save) {
272269
try {
273-
BlockArrayClipboard copy;
270+
Clipboard copy;
274271
World weWorld = BukkitAdapter.adapt(sign.getBlock().getWorld());
275272

276273
if (checkToggleState(sign)) {
277-
copy = CopyManager.getInstance().load(toggleAreaData.namespace, toggleAreaData.areaOn);
274+
copy = CopyManager.getInstance().load(toggleAreaData.namespace(), toggleAreaData.areaOn());
278275

279276
// if this is a save area save it before toggling off
280277
if (save) {
281278
copy = CopyManager.getInstance().copy(copy.getRegion(), weWorld);
282-
CopyManager.getInstance().save(toggleAreaData.namespace, toggleAreaData.areaOn, copy);
279+
CopyManager.getInstance().save(toggleAreaData.namespace(), toggleAreaData.areaOn(), copy);
283280
}
284281
// if we are toggling to the second area we dont clear the old area
285-
if (!toggleAreaData.areaOff.isEmpty() && !toggleAreaData.areaOff.equals("--")) {
286-
copy = CopyManager.getInstance().load(toggleAreaData.namespace, toggleAreaData.areaOff);
282+
if (!toggleAreaData.areaOff().isEmpty() && !toggleAreaData.areaOff().equals("--")) {
283+
copy = CopyManager.getInstance().load(toggleAreaData.namespace(), toggleAreaData.areaOff());
287284
CopyManager.getInstance().paste(copy, weWorld);
288285
} else {
289286
CopyManager.getInstance().clear(copy, weWorld);
@@ -293,13 +290,13 @@ private boolean toggle(ChangedSign sign, ToggleAreaData toggleAreaData, boolean
293290

294291
// toggle the area on
295292
// if this is a save area save it before toggling off
296-
if (save && !toggleAreaData.areaOff.isEmpty() && !toggleAreaData.areaOff.equals("--")) {
297-
copy = CopyManager.getInstance().load(toggleAreaData.namespace, toggleAreaData.areaOff);
293+
if (save && !toggleAreaData.areaOff().isEmpty() && !toggleAreaData.areaOff().equals("--")) {
294+
copy = CopyManager.getInstance().load(toggleAreaData.namespace(), toggleAreaData.areaOff());
298295
copy = CopyManager.getInstance().copy(copy.getRegion(), weWorld);
299-
CopyManager.getInstance().save(toggleAreaData.namespace, toggleAreaData.areaOff, copy);
296+
CopyManager.getInstance().save(toggleAreaData.namespace(), toggleAreaData.areaOff(), copy);
300297
}
301298

302-
copy = CopyManager.getInstance().load(toggleAreaData.namespace, toggleAreaData.areaOn);
299+
copy = CopyManager.getInstance().load(toggleAreaData.namespace(), toggleAreaData.areaOn());
303300
CopyManager.getInstance().paste(copy, weWorld);
304301
setToggledState(sign, true);
305302
}
@@ -331,9 +328,6 @@ public boolean toggleCold(Block block) {
331328
return toggle(sign, toggleAreaData, save);
332329
}
333330

334-
// pattern to check where the markers for on and off state are
335-
private static final Pattern TOGGLED_ON_PATTERN = Pattern.compile("^-[A-Za-z0-9_]*?-$");
336-
337331
private boolean checkToggleState(ChangedSign sign) {
338332
String line3 = PlainTextComponentSerializer.plainText().serialize(sign.getLine(2)).toLowerCase(Locale.ENGLISH);
339333
String line4 = PlainTextComponentSerializer.plainText().serialize(sign.getLine(3)).toLowerCase(Locale.ENGLISH);
@@ -366,27 +360,4 @@ private void updateOwnerName(ChangedSign sign) {
366360
sign.setLine(0, Component.text("~" + name, null, TextDecoration.ITALIC));
367361
}
368362
}
369-
370-
private boolean allowRedstone;
371-
boolean removeEntitiesOnToggle;
372-
int maxAreaSize;
373-
int maxAreasPerUser;
374-
375-
@Override
376-
public void loadFromConfiguration(YAMLProcessor config) {
377-
config.setComment("allow-redstone", "Allow ToggleAreas to be toggled via redstone.");
378-
allowRedstone = config.getBoolean("allow-redstone", true);
379-
380-
config.setComment("remove-entities-on-toggle", "Whether the area toggling will remove entities within it.");
381-
removeEntitiesOnToggle = config.getBoolean("remove-entities-on-toggle", false);
382-
383-
config.setComment("max-size", "Sets the max amount of blocks that a ToggleArea can hold.");
384-
maxAreaSize = config.getInt("max-size", 5000);
385-
386-
config.setComment("max-per-user", "Sets the max amount of ToggleAreas that can be within one personal namespace.");
387-
maxAreasPerUser = config.getInt("max-per-user", 30);
388-
}
389-
390-
public record ToggleAreaData(String namespace, String areaOn, String areaOff) {
391-
}
392363
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* CraftBook Copyright (C) EngineHub and Contributors <https://enginehub.org/>
3+
*
4+
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
5+
* License as published by the Free
6+
* Software Foundation, either version 3 of the License, or (at your option) any later version.
7+
*
8+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
9+
* warranty of MERCHANTABILITY or
10+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
11+
*
12+
* You should have received a copy of the GNU General Public License along with this program. If not,
13+
* see <http://www.gnu.org/licenses/>.
14+
*/
15+
16+
@org.jspecify.annotations.NullMarked
17+
package org.enginehub.craftbook.bukkit.mechanics.area.clipboard;
18+

0 commit comments

Comments
 (0)