mirror of
https://github.com/YouHaveTrouble/BlockEdit.git
synced 2026-06-29 13:36:19 +00:00
schematic load from file prototype command and adjustments that it required
This commit is contained in:
@@ -13,7 +13,8 @@ public class BELocale {
|
|||||||
private static final Locale defaultLocale = Locale.of("en_US");
|
private static final Locale defaultLocale = Locale.of("en_US");
|
||||||
|
|
||||||
public final String couldNotFindWandById, selectArea, copiedSelectionToClipboard, selectionReset, firstPositionSet,
|
public final String couldNotFindWandById, selectArea, copiedSelectionToClipboard, selectionReset, firstPositionSet,
|
||||||
secondPositionSet, pastingClipboard, clipboardRotated, settingBlocks, replacingBlocks;
|
secondPositionSet, pastingClipboard, clipboardRotated, settingBlocks, replacingBlocks, schematicLoaded,
|
||||||
|
startedLoadingSchematic, noProviderForSchematicFileExtension, schematicLoadError, schematicNotFound;
|
||||||
|
|
||||||
|
|
||||||
protected BELocale(JsonObject json) {
|
protected BELocale(JsonObject json) {
|
||||||
@@ -27,6 +28,11 @@ public class BELocale {
|
|||||||
clipboardRotated = json.get("clipboard_rotated").getAsString();
|
clipboardRotated = json.get("clipboard_rotated").getAsString();
|
||||||
settingBlocks = json.get("setting_blocks").getAsString();
|
settingBlocks = json.get("setting_blocks").getAsString();
|
||||||
replacingBlocks = json.get("replacing_blocks").getAsString();
|
replacingBlocks = json.get("replacing_blocks").getAsString();
|
||||||
|
startedLoadingSchematic = json.get("started_loading_schematic").getAsString();
|
||||||
|
schematicLoaded = json.get("schematic_loaded").getAsString();
|
||||||
|
noProviderForSchematicFileExtension = json.get("no_provider_for_schematic_file_extension").getAsString();
|
||||||
|
schematicLoadError = json.get("schematic_load_error").getAsString();
|
||||||
|
schematicNotFound = json.get("schematic_not_found").getAsString();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static void registerLocale(Locale locale, BELocale blockEditLocale) {
|
protected static void registerLocale(Locale locale, BELocale blockEditLocale) {
|
||||||
|
|||||||
@@ -12,9 +12,12 @@ import io.papermc.paper.command.brigadier.argument.resolvers.BlockPositionResolv
|
|||||||
import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager;
|
import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager;
|
||||||
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
|
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
|
||||||
import me.youhavetrouble.blockedit.api.BlockEditAPI;
|
import me.youhavetrouble.blockedit.api.BlockEditAPI;
|
||||||
|
import me.youhavetrouble.blockedit.exception.NoProviderForSchematicFileExtensionException;
|
||||||
|
import me.youhavetrouble.blockedit.exception.SchematicLoadException;
|
||||||
import me.youhavetrouble.blockedit.operations.PasteOperation;
|
import me.youhavetrouble.blockedit.operations.PasteOperation;
|
||||||
import me.youhavetrouble.blockedit.operations.ReplaceOperation;
|
import me.youhavetrouble.blockedit.operations.ReplaceOperation;
|
||||||
import me.youhavetrouble.blockedit.operations.SetOperation;
|
import me.youhavetrouble.blockedit.operations.SetOperation;
|
||||||
|
import me.youhavetrouble.blockedit.schematic.Schematic;
|
||||||
import me.youhavetrouble.blockedit.util.Selection;
|
import me.youhavetrouble.blockedit.util.Selection;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
@@ -27,6 +30,7 @@ import org.bukkit.util.Vector;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
@SuppressWarnings("UnstableApiUsage")
|
@SuppressWarnings("UnstableApiUsage")
|
||||||
public class BlockEditCommands {
|
public class BlockEditCommands {
|
||||||
@@ -373,4 +377,55 @@ public class BlockEditCommands {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static LiteralCommandNode<CommandSourceStack> schematicCommand() {
|
||||||
|
return Commands.literal("schematic")
|
||||||
|
.requires(css -> {
|
||||||
|
if (!(css.getSender() instanceof Player player)) return false;
|
||||||
|
return player.hasPermission("blockedit.command.schematic");
|
||||||
|
})
|
||||||
|
.then(Commands.literal("load")
|
||||||
|
.then(Commands.literal("file")
|
||||||
|
.then(Commands.argument("schematic_name", StringArgumentType.word())
|
||||||
|
.requires(commandSourceStack -> {
|
||||||
|
if (!(commandSourceStack.getSender() instanceof Player player))
|
||||||
|
return false;
|
||||||
|
return player.hasPermission("blockedit.command.schematic.load.file");
|
||||||
|
})
|
||||||
|
.executes(context -> {
|
||||||
|
CompletableFuture.runAsync(() -> {
|
||||||
|
Player player = (Player) context.getSource().getSender();
|
||||||
|
String schematicName = context.getArgument("schematic_name", String.class);
|
||||||
|
|
||||||
|
player.sendMessage(Component.text(BELocale.getLocale(player.locale()).startedLoadingSchematic.formatted(schematicName), NamedTextColor.GRAY));
|
||||||
|
|
||||||
|
Schematic schematic;
|
||||||
|
try {
|
||||||
|
schematic = BlockEditAPI.getSchematicHandler().loadSchematic(schematicName);
|
||||||
|
} catch (NoProviderForSchematicFileExtensionException e) {
|
||||||
|
player.sendMessage(Component.text(BELocale.getLocale(player.locale()).noProviderForSchematicFileExtension.formatted(e.getExtension()), NamedTextColor.RED));
|
||||||
|
return;
|
||||||
|
} catch (SchematicLoadException e) {
|
||||||
|
player.sendMessage(Component.text(BELocale.getLocale(player.locale()).schematicLoadError.formatted(schematicName), NamedTextColor.RED));
|
||||||
|
BlockEdit.getPlugin().getSLF4JLogger().error("Could not load schematic {} due to provider error ", schematicName, e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (schematic == null) {
|
||||||
|
player.sendMessage(Component.text(BELocale.getLocale(player.locale()).schematicNotFound.formatted(schematicName), NamedTextColor.RED));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEPlayer bePlayer = BEPlayer.getByPlayer(player);
|
||||||
|
bePlayer.setClipboard(schematic.asClipboard());
|
||||||
|
player.sendMessage(Component.text(BELocale.getLocale(player.locale()).schematicLoaded.formatted(schematicName), NamedTextColor.GRAY));
|
||||||
|
});
|
||||||
|
|
||||||
|
return Command.SINGLE_SUCCESS;
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package me.youhavetrouble.blockedit;
|
package me.youhavetrouble.blockedit;
|
||||||
|
|
||||||
|
import me.youhavetrouble.blockedit.exception.NoProviderForSchematicFileExtensionException;
|
||||||
import me.youhavetrouble.blockedit.exception.SchematicHandlerRegistrationException;
|
import me.youhavetrouble.blockedit.exception.SchematicHandlerRegistrationException;
|
||||||
import me.youhavetrouble.blockedit.exception.SchematicLoadException;
|
import me.youhavetrouble.blockedit.exception.SchematicLoadException;
|
||||||
import me.youhavetrouble.blockedit.exception.SchematicSaveException;
|
import me.youhavetrouble.blockedit.exception.SchematicSaveException;
|
||||||
@@ -117,13 +118,9 @@ public class SchematicHandler<S extends Schematic> {
|
|||||||
String fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1);
|
String fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1);
|
||||||
SchematicProvider<S> schematicProvider = schematicProvidersByExtension.get(fileExtension);
|
SchematicProvider<S> schematicProvider = schematicProvidersByExtension.get(fileExtension);
|
||||||
if (schematicProvider == null) {
|
if (schematicProvider == null) {
|
||||||
throw new SchematicLoadException("No schematic provider found for file extension " + fileExtension, schematicName);
|
throw new NoProviderForSchematicFileExtensionException("No schematic provider found for file extension " + fileExtension, schematicName, fileExtension);
|
||||||
}
|
}
|
||||||
Schematic schematic = schematicProvider.load(schematicName);
|
return schematicProvider.load(schematicName);
|
||||||
if (schematic == null) {
|
|
||||||
throw new SchematicLoadException("Schematic could not be loaded", schematicName);
|
|
||||||
}
|
|
||||||
return schematic;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
package me.youhavetrouble.blockedit.exception;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class NoProviderForSchematicFileExtensionException extends SchematicLoadException {
|
||||||
|
|
||||||
|
private String extension;
|
||||||
|
|
||||||
|
public NoProviderForSchematicFileExtensionException(
|
||||||
|
@NotNull String message,
|
||||||
|
@NotNull String schematicName,
|
||||||
|
@NotNull String extension
|
||||||
|
) {
|
||||||
|
super(message, schematicName);
|
||||||
|
this.extension = extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExtension() {
|
||||||
|
return extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,16 +1,14 @@
|
|||||||
package me.youhavetrouble.blockedit.schematic;
|
package me.youhavetrouble.blockedit.schematic;
|
||||||
|
|
||||||
import me.youhavetrouble.blockedit.util.Clipboard;
|
import me.youhavetrouble.blockedit.util.Clipboard;
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public abstract class Schematic {
|
public abstract class Schematic {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the schematic as a Clipboard object
|
* Get the schematic as a Clipboard object
|
||||||
* @param originLocation The location to use as the origin for the clipboard
|
|
||||||
* @return The clipboard object containing the schematic
|
* @return The clipboard object containing the schematic
|
||||||
*/
|
*/
|
||||||
public abstract @NotNull Clipboard asClipboard(@NotNull Location originLocation);
|
public abstract @NotNull Clipboard asClipboard();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package me.youhavetrouble.blockedit.schematic;
|
package me.youhavetrouble.blockedit.schematic;
|
||||||
|
|
||||||
|
import me.youhavetrouble.blockedit.exception.SchematicLoadException;
|
||||||
import me.youhavetrouble.blockedit.util.Clipboard;
|
import me.youhavetrouble.blockedit.util.Clipboard;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -15,8 +16,6 @@ public interface SchematicProvider<S extends Schematic> {
|
|||||||
*/
|
*/
|
||||||
@NotNull String name();
|
@NotNull String name();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save the schematic
|
* Save the schematic
|
||||||
* @param schematic The schematic to save
|
* @param schematic The schematic to save
|
||||||
@@ -26,9 +25,10 @@ public interface SchematicProvider<S extends Schematic> {
|
|||||||
/**
|
/**
|
||||||
* Load a schematic
|
* Load a schematic
|
||||||
* @param name Name of the schematic to load
|
* @param name Name of the schematic to load
|
||||||
* @return The loaded schematic. Returns null if the schematic could not be loaded.
|
* @return The loaded schematic. Returns null if the schematic does not exist.
|
||||||
|
* @throws SchematicLoadException If the schematic could not be loaded
|
||||||
*/
|
*/
|
||||||
@Nullable S load(@NotNull String name);
|
@Nullable S load(@NotNull String name) throws SchematicLoadException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new schematic from the given clipboard
|
* Create a new schematic from the given clipboard
|
||||||
|
|||||||
@@ -8,5 +8,10 @@
|
|||||||
"pasting_clipboard": "Pasting clipboard...",
|
"pasting_clipboard": "Pasting clipboard...",
|
||||||
"clipboard_rotated": "Clipboard rotated %s degrees",
|
"clipboard_rotated": "Clipboard rotated %s degrees",
|
||||||
"setting_blocks": "Setting blocks...",
|
"setting_blocks": "Setting blocks...",
|
||||||
"replacing_blocks": "Replacing blocks..."
|
"replacing_blocks": "Replacing blocks...",
|
||||||
|
"started_loading_schematic": "Started loading schematic %s",
|
||||||
|
"schematic_loaded": "Loaded schematic %s",
|
||||||
|
"no_provider_for_schematic_file": "No provider for schematic file type %s",
|
||||||
|
"schematic_load_error": "Error loading schematic %s: %s",
|
||||||
|
"schematic_not_found": "Schematic %s not found"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user