Skip to content

Commit

Permalink
Merge pull request #4 from nova-27/better-commands
Browse files Browse the repository at this point in the history
コマンドの改善
  • Loading branch information
nova-27 authored Sep 25, 2022
2 parents e211c0a + e89f2e0 commit 438c67e
Show file tree
Hide file tree
Showing 14 changed files with 432 additions and 179 deletions.
36 changes: 26 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,52 @@
[![license](https://img.shields.io/github/license/nova-27/CrafterePostPlugin?color=b8b8b8)](https://github.com/nova-27/CrafterePostPlugin/blob/main/LICENSE)

# CrafterePostPlugin
このプラグインは、[CrafterePost](https://crafterepost.netlify.app/)公式のSpigotプラグインです。
選択した範囲をSchematic([Sponge Schematic Specification Version 2](https://github.com/SpongePowered/Schematic-Specification/blob/master/versions/schematic-2.md))建築形式やMCSR(Minecraft Schematic based Recording)録画形式のファイルに出力します。
出力したデータを[CrafterePost](https://crafterepost.netlify.app/)に投稿できます。

このプラグインは、[CrafterePost](https://crafterepost.netlify.app/)公式のSpigotプラグインです。

選択した範囲をSchematic([Sponge Schematic Specification Version 2](https://github.com/SpongePowered/Schematic-Specification/blob/master/versions/schematic-2.md))
建築形式やMCSR(Minecraft Schematic based Recording)録画形式のファイルに出力します。

出力したデータを[CrafterePost](https://crafterepost.netlify.app/)に投稿できます。

## 導入

現時点では**Spigot 1.18.x**でのみ動作確認済みです。

1. [Releases](https://github.com/nova-27/CrafterePostPlugin/releases)から最新のプラグインをダウンロードします。
2. 依存プラグインである[WorldEdit](https://dev.bukkit.org/projects/worldedit/files)[ProtocolLib](https://www.spigotmc.org/resources/protocollib.1997/)をダウンロードします。
2. 依存プラグインである[WorldEdit](https://dev.bukkit.org/projects/worldedit/files)
[ProtocolLib](https://www.spigotmc.org/resources/protocollib.1997/)をダウンロードします。
3. ダウンロードした3つのプラグインを、Spigotサーバーの`plugins`フォルダに移動します。

## コマンド一覧
- `/crapos schem`
- WorldEditのwandで選択した範囲をSchematic形式で出力します。
- 出力ファイル: `plugins/CrafterePost/test.schem`
- `/crapos record`
- WorldEditのwandで選択した範囲をMCSR形式で録画開始・停止します。
- 出力ファイル: `plugins/CrafterePost/test.mcsr`

- `/crapos schem ファイル名`
- WorldEditのwandで選択した範囲をSchematic建築形式で出力します。
- 出力ファイル: `plugins/CrafterePost/ファイル名.schem`
- `/crapos record start ファイル名`
- WorldEditのwandで選択した範囲をMCSR録画形式で録画開始します。
- 出力ファイル: `plugins/CrafterePost/ファイル名.mcsr`
- `/crapos record stop`
- MCSRの録画を停止します。
- 録画中にプレイヤーがサーバーを退出した場合、その時点で自動的に録画を停止します。

## ビルド

1. ソースコードをダウンロードします。

```shell
git clone https://github.com/nova-27/CrafterePostPlugin.git
```

2. ビルドします。

```shell
cd CrafterePostPlugin
./gradlew shadowJar
```

3. `build/libs`ディレクトリにプラグインjarが生成されます。

## ライセンス

当リポジトリは [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/deed) のもとで公開されています。
9 changes: 5 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,17 @@ bukkit {
name = rootProject.name
version = project.version
main = "${project.group}.${rootProject.name.toLowerCase()}.${rootProject.name}"
description = 'description'
website = 'https://example.com'
description = 'CrafterePost公式プラグイン'
website = 'https://crafterepost.netlify.app/'
apiVersion = '1.18'
author = 'nova27'
depend = ['WorldEdit', 'ProtocolLib']

commands {
crapos {
description = 'Export the selected area in the Sponge Schematic Format.'
usage = 'test!'
description = 'Schematic建築ファイル / MCSR録画ファイル を出力します'
usage = 'usage: /<command> <schem|record>'
aliases = ['crafterepost']
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.github.nova_27.mcplugin.crafterepost;

import com.github.nova_27.mcplugin.crafterepost.command.CommandManager;
import com.github.nova_27.mcplugin.crafterepost.command.RecordCommand;
import com.github.nova_27.mcplugin.crafterepost.command.SchemCommand;
import com.github.nova_27.mcplugin.crafterepost.record.RecordingManager;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import com.github.nova_27.mcplugin.crafterepost.record.RecordingManager;

import java.util.Objects;
import java.util.logging.Level;
Expand All @@ -24,19 +27,22 @@ public RecordingManager getRecordingManager() {
public void onEnable() {
instance = this;
recordingManager = new RecordingManager();
recordingManager.runTaskTimer(CrafterePost.getInstance(), 0L, 1L);

if(!getDataFolder().isDirectory() && !getDataFolder().mkdirs()) {
if (!getDataFolder().isDirectory() && !getDataFolder().mkdirs()) {
getLogger().log(Level.SEVERE, "Failed to create the plugin directory!");
return;
}

if(!(Bukkit.getPluginManager().getPlugin("WorldEdit") instanceof WorldEditPlugin)) {
if (!(Bukkit.getPluginManager().getPlugin("WorldEdit") instanceof WorldEditPlugin)) {
getLogger().log(Level.SEVERE, "Could not find WorldEdit plugin!");
return;
}

recordingManager.runTaskTimer(CrafterePost.getInstance(), 0L, 1L);
Objects.requireNonNull(getCommand("crapos")).setExecutor(new SpigotCommand());
var commandManager = new CommandManager();
commandManager.register(new SchemCommand());
commandManager.register(new RecordCommand());
Objects.requireNonNull(getCommand("crapos")).setExecutor(commandManager);
}

@Override
Expand Down

This file was deleted.

This file was deleted.

107 changes: 107 additions & 0 deletions src/main/java/com/github/nova_27/mcplugin/crafterepost/Utils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package com.github.nova_27.mcplugin.crafterepost;

import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.bukkit.BukkitPlayer;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.session.SessionManager;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Objects;

public class Utils {
/**
* wand選択範囲を取得する
*
* @param player 対象プレイヤー
* @return 選択範囲
* @throws IncompleteRegionException 範囲未選択の場合
*/
public static Region getSelection(Player player) throws IncompleteRegionException {
BukkitPlayer actor = BukkitAdapter.adapt(player);
SessionManager manager = WorldEdit.getInstance().getSessionManager();
LocalSession localSession = manager.get(actor);

return localSession.getSelection();
}

/**
* OutputStreamにSchematicを書き出す
*
* @param region 書き出す地域
* @param outputStream 書き出し先
*/
public static void writeSchematic(@NotNull Region region, @NotNull OutputStream outputStream) throws WorldEditException, IOException {
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy(
Objects.requireNonNull(region.getWorld()), region, clipboard, region.getMinimumPoint()
);
//forwardExtentCopy.setCopyingEntities(true);
Operations.complete(forwardExtentCopy);

try (ClipboardWriter clipboardWriter = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(outputStream)) {
clipboardWriter.write(clipboard);
}
}

/**
* 有効なファイル名かどうか
*
* @param fileName 検証するファイル名
* @return trueなら有効
*/
public static boolean isValidFileName(String fileName) {
return !fileName.matches("^.*[\\\\|/|:|\\*|?|\"|<|>|\\|].*$");
}

/**
* コマンド引数からFileインスタンスを生成する
*
* @param args コマンド引数
* @param ext 拡張子
* @return 生成したFile
* @throws IOException エラーが発生したらメッセージ付きでthrow
*/
public static File createFileInstanceFromArgs(String[] args, String ext) throws IOException {
var doOverwrite = false;
var fileName = "";

for (var arg : args) {
if (arg.startsWith("-")) {
// フラグだったら
if (arg.equalsIgnoreCase("-f")) {
doOverwrite = true;
} else {
throw new IOException("無効なフラグ: " + arg);
}
} else {
//ファイル名なら
fileName = arg;
}
}

if (fileName.equals("")) throw new IOException("保存ファイル名を指定してください");

fileName += "." + ext;
if (!isValidFileName(fileName)) throw new IOException("ファイル名に禁則文字が含まれています");

var file = new File(CrafterePost.getInstance().getDataFolder(), fileName);
if (!doOverwrite && file.exists()) throw new IOException("ファイルが存在します\n上書きするには -f フラグを使用してください");

if (!file.createNewFile() && !file.canWrite()) throw new IOException("ファイルを書き出すことができません");

return file;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.github.nova_27.mcplugin.crafterepost.command;

import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;

import java.util.List;

public abstract class BaseCommand {
public abstract String getName();

public abstract boolean checkPermission(Player player);

public abstract void onCommand(CommandSender sender, String label, String[] args);

public abstract @Nullable List<String> onTabComplete(CommandSender sender, String[] args);
}
Loading

0 comments on commit 438c67e

Please sign in to comment.