前任者の残したプラグインを直したい

サーバーはpaper-1.21でbukkitで開発をしています。 前任のプラグイン開発者がjarファイルのみを残して引退してしまい、元のソースに近い形には出来たと思うのですがコマンドを実行しても処理が起こりません。 正直プラグインの開発がこれが初めてでjavaの知識しかないので知恵をお借りしたいです。
36 Replies
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
ソースコードを貼ってください
emeraldrex
emeraldrexOP2mo ago
zipになってしまいますが全体はこちらです
emeraldrex
emeraldrexOP2mo ago
CommandExecutorを使用してMainクラスに引き渡し何度か書き換えてみたりもしたのですがコマンドを実行しても(この画像だとscaleコマンド)処理が行われません。
No description
No description
emeraldrex
emeraldrexOP2mo ago
scaleコマンドはそのまま、attributeのscaleを簡単に使えるようにしているコマンドです。本来はnullや範囲外の数値が入力された場合elseでキャッチされて再実行を求められるのですが、scale含めて全てのコマンドがelseの記述すら実行されず何処から手を付けていいのか…というい状態です 必要であれば元のjarファイルも添付します。
のしぇあ
のしぇあ2mo ago
ちらっと見ただけなので改善するかはわからないですが、このソースコード内に、JavaPluginのサブクラスがなぜか複数個あって、plugin.yml で現在メインクラスを main: org.open2.openplugin2.net.OpenPlugin2 と他のクラスを指定してしまっていて、これがほぼ何も行わないクラスでした なので、今使おうとしている main: org.open2.openplugin2.net.Main をメインのクラスとしてplugin.yml で設定してあげるとうまくいくと思います
Wick
Wick2mo ago
sheauoian has been timed out for 2m mute Reason: Similar-Messages Spam
sheauoian | 427681269137145857
のしぇあ
のしぇあ2mo ago
また、CommandMain.javaonCommand メソッド内で、command.getName().equalsIgnoreCase("scale") が常に true となるため、他の条件が評価されずに処理が終了してしまいます。原因がよくわからないことになっている原因と思います
@Override
public boolean onCommand(@NotNull CommandSender sender, Command command, @NotNull String label, String[] args) {
// command.getName() は 常に 'scale'
if (command.getName().equalsIgnoreCase("scale")) { // 常に true
return true; // 常に ここで終わる
} else if ...
}
@Override
public boolean onCommand(@NotNull CommandSender sender, Command command, @NotNull String label, String[] args) {
// command.getName() は 常に 'scale'
if (command.getName().equalsIgnoreCase("scale")) { // 常に true
return true; // 常に ここで終わる
} else if ...
}
emeraldrex
emeraldrexOP2mo ago
なるほど、ご指摘ありがとうございます。 帰宅したら確認してみます。 ご指摘いだたいた通りmain: org.open2.openplugin2.net.Mainと変更し、不要なもう一つのメインクラスは削除しました。
public boolean onCommand(@NotNull CommandSender sender, Command command, @NotNull String label, String[] args) {
try {
if (command.getName().equalsIgnoreCase("scale")) {
sender.sendMessage("成功。");

return false;
} else if (args[0].equalsIgnoreCase("reload")) {
sender.sendMessage("Open2chプラグイン リロード完了");
this.m.reloadConfig();
return true;


} else {
sender.sendMessage("Unknown command: " + args[0]);
return true;
}
} catch (Exception e) {
sender.sendMessage("コマンドの実行中にエラーが発生しました。");
e.printStackTrace(); // サーバーコンソールにエラー情報を出力
return false;
}
}
}
public boolean onCommand(@NotNull CommandSender sender, Command command, @NotNull String label, String[] args) {
try {
if (command.getName().equalsIgnoreCase("scale")) {
sender.sendMessage("成功。");

return false;
} else if (args[0].equalsIgnoreCase("reload")) {
sender.sendMessage("Open2chプラグイン リロード完了");
this.m.reloadConfig();
return true;


} else {
sender.sendMessage("Unknown command: " + args[0]);
return true;
}
} catch (Exception e) {
sender.sendMessage("コマンドの実行中にエラーが発生しました。");
e.printStackTrace(); // サーバーコンソールにエラー情報を出力
return false;
}
}
}
Commandmain.javaでもreturn falseを返すようにし、エラーが発生していた場合も考慮してcatchを追加したのですが現状変わらずです。
emeraldrex
emeraldrexOP2mo ago
コンソールにもなにも残っていませんでした。
No description
何か
何か2mo ago
ちゃんとビルドして入れ替えてる?
emeraldrex
emeraldrexOP2mo ago
入れ替えてます。 試しにバージョンを変更し、一つコマンドを削除して入れ替えてみましたがしっかり反映されていました。
のしぇあ
のしぇあ2mo ago
- Main クラスで、Commandmainscale コマンドの CommandExecutorとして登録する為のコードが書かれていることを確認してください! - 私が修正してビルド・実装した際、「成功。」が/scaleを使った際に出力されたので、上の二点が直されていれば、正常に動作する可能性が高いと思います! Main クラス
public void onEnable() {
m = this;
...


// CommandMainクラスを scale コマンドの CommandExecutorとして登録
final PluginCommand cmd = getServer().getPluginCommand("scale");
if (cmd != null) {
cmd.setExecutor(new Commandmain(this));
}
}
public void onEnable() {
m = this;
...


// CommandMainクラスを scale コマンドの CommandExecutorとして登録
final PluginCommand cmd = getServer().getPluginCommand("scale");
if (cmd != null) {
cmd.setExecutor(new Commandmain(this));
}
}
emeraldrex
emeraldrexOP2mo ago
ありがとうございます
public Scale(Main m) {
m.getCommand("scale").setExecutor(this);
m.getServer().getPluginManager().registerEvents(this, m);
}
public Scale(Main m) {
m.getCommand("scale").setExecutor(this);
m.getServer().getPluginManager().registerEvents(this, m);
}
scaleクラスにこの記述があったので、ご指摘いただいた通りMainクラスに
ublic void onEnable() {
m = this;
getServer().getMessenger().registerOutgoingPluginChannel((Plugin) this, "BungeeCord");
System.out.println(ChatColor.GREEN + "Open Loaded");
for (Player p : Bukkit.getOnlinePlayers())
p.sendMessage(ChatColor.GREEN + "リロード完了");
// CommandMainクラスを scale コマンドの CommandExecutorとして登録
final PluginCommand cmd = getServer().getPluginCommand("scale");
if (cmd != null) {
cmd.setExecutor(new Commandmain(this));
}
new Scale(this);
}
ublic void onEnable() {
m = this;
getServer().getMessenger().registerOutgoingPluginChannel((Plugin) this, "BungeeCord");
System.out.println(ChatColor.GREEN + "Open Loaded");
for (Player p : Bukkit.getOnlinePlayers())
p.sendMessage(ChatColor.GREEN + "リロード完了");
// CommandMainクラスを scale コマンドの CommandExecutorとして登録
final PluginCommand cmd = getServer().getPluginCommand("scale");
if (cmd != null) {
cmd.setExecutor(new Commandmain(this));
}
new Scale(this);
}
new Scaleを追加して実行してみました
emeraldrex
emeraldrexOP2mo ago
無事に正常に動作しました、あとは残りのコマンドを同様に記述していけば大丈夫という認識で合っていますか?
No description
emeraldrex
emeraldrexOP2mo ago
すみません、最後にもうひとつお聞きしたいです。 シュルカーボックスをシフト右クリックで回収可能にするshulker.javaなどは同様にMainへの追記で実装できたのですが
public class Setup {


public Setup(Main m) {
try {
config(m);
world();
command(m);
event(m);
bet(m);
m.pve = new PVEmain(m, this.config);
try {
} catch (Exception exception) {}
} catch (Exception e) {
e.printStackTrace();
}
}
private void config(Main m) {
this.config = m.getConfig();
m.saveDefaultConfig();
this.configloader = new ConfigLoader(m, this.config, this.sigen);
}
private void command(Main m) {
m.getCommand("pipis").setExecutor((CommandExecutor)new Pipis(m));
m.getCommand("c").setExecutor((CommandExecutor)new Back(m));
m.getCommand("setumei").setExecutor((CommandExecutor)new Help());
m.getCommand("setting").setExecutor((CommandExecutor)new Setting(m));
..........................................................................
}
private void bet(Main m) {
Betinfo betinfo = new Betinfo();
m.getCommand("entry").setExecutor((CommandExecutor)new Entry(betinfo));
m.getCommand("bet").setExecutor((CommandExecutor)new Bet(betinfo));
m.getCommand("goal").setExecutor((CommandExecutor)new Goal(betinfo));
}

private void event(Main m) {
try {

} catch (Exception e) {
e.printStackTrace();
}
}

private void world() {
World w = Bukkit.getServer().getWorld("World");
WorldBorder wb = w.getWorldBorder();
w.setDifficulty(Difficulty.HARD);
wb.setCenter(0.0D, 0.0D);
wb.setSize(10000.0D);
System.out.println("World Loaded");
for (World ws : Bukkit.getWorlds())
ws.setGameRule(GameRule.KEEP_INVENTORY, Boolean.valueOf(true));
}
}
public class Setup {


public Setup(Main m) {
try {
config(m);
world();
command(m);
event(m);
bet(m);
m.pve = new PVEmain(m, this.config);
try {
} catch (Exception exception) {}
} catch (Exception e) {
e.printStackTrace();
}
}
private void config(Main m) {
this.config = m.getConfig();
m.saveDefaultConfig();
this.configloader = new ConfigLoader(m, this.config, this.sigen);
}
private void command(Main m) {
m.getCommand("pipis").setExecutor((CommandExecutor)new Pipis(m));
m.getCommand("c").setExecutor((CommandExecutor)new Back(m));
m.getCommand("setumei").setExecutor((CommandExecutor)new Help());
m.getCommand("setting").setExecutor((CommandExecutor)new Setting(m));
..........................................................................
}
private void bet(Main m) {
Betinfo betinfo = new Betinfo();
m.getCommand("entry").setExecutor((CommandExecutor)new Entry(betinfo));
m.getCommand("bet").setExecutor((CommandExecutor)new Bet(betinfo));
m.getCommand("goal").setExecutor((CommandExecutor)new Goal(betinfo));
}

private void event(Main m) {
try {

} catch (Exception e) {
e.printStackTrace();
}
}

private void world() {
World w = Bukkit.getServer().getWorld("World");
WorldBorder wb = w.getWorldBorder();
w.setDifficulty(Difficulty.HARD);
wb.setCenter(0.0D, 0.0D);
wb.setSize(10000.0D);
System.out.println("World Loaded");
for (World ws : Bukkit.getWorlds())
ws.setGameRule(GameRule.KEEP_INVENTORY, Boolean.valueOf(true));
}
}
このSetup.javaが同じ方法で実装できなかったので何かお分かりでしたらお聞きしたいです、調べてもこの様なクラスから実装しているプラグインを見つけることが出来ませんでした。
のしぇあ
のしぇあ2mo ago
ほんのり見た限りでは、MainクラスのonEnable()で単にSetup(this);を書くと動くと思います!
emeraldrex
emeraldrexOP2mo ago
僕もそうだと思ったのですが処理が行われませんでした。 Setupに記述されているクラスも他のクラスと同様にonEnable()に追記して動作するかテストしています。 全て追記して見ましたが、やはりSetupに記述されているものは動作しませんでした。 元々のjarから展開した際に、Mainや他のクラスにonCommandで呼び出されている記述がなかったのも引っ掛かっています。 このプラグインを作成した前任者がどうやってコマンドを実装して処理していたのかが甚だ疑問で仕方ないです…
tanoKun
tanoKun2mo ago
jarもらえたりしない?
emeraldrex
emeraldrexOP2mo ago
tanoKun
tanoKun2mo ago
えぐいスパゲッティ
emeraldrex
emeraldrexOP2mo ago
プラグインのことを何も言わず、ある日突然引退したので手掛かりがjarと開発環境が恐らくeclipseということしかわかりません。 サーバー管理人も何も聞いてないそうです。
のしぇあ
のしぇあ2mo ago
先程確認してみました: ・resources フォルダに config.yml という空のファイルを作成してください! ・(必要かわからないが) Setup クラスの、コンストラクタ、config メソッドのコードを次のように変えてみて下さい:
public Setup(Main m) {
try {
config(m);
world();
command(m);
event(m);
bet(m);
m.pve = new PVEmain(m, this.config);
} catch (Exception e) {
e.printStackTrace();
}
}

private void config(Main m) {
m.saveDefaultConfig();
this.config = m.getConfig();
this.configloader = new ConfigLoader(m, this.config, this.sigen);
}
public Setup(Main m) {
try {
config(m);
world();
command(m);
event(m);
bet(m);
m.pve = new PVEmain(m, this.config);
} catch (Exception e) {
e.printStackTrace();
}
}

private void config(Main m) {
m.saveDefaultConfig();
this.config = m.getConfig();
this.configloader = new ConfigLoader(m, this.config, this.sigen);
}
Main クラスのonEnable()new Setup(this); を書いてみて下さい!
emeraldrex
emeraldrexOP2mo ago
処理が行われました、ありがとうございます。 サーバー管理人に掛け合い、全体的なテストを行って問題なければ再度こちらでご報告させていただきます。
emeraldrex
emeraldrexOP2mo ago
テストを行ったところ、この様にコマンドを使用するとインベントリが開かれるものや、コマンドを介さず機能を追加するものは動作しませんでした。 恐らくイベントリスナーの追加で解決出来るものなのでしょうが、違っていたらご教授頂けると幸いです。 因みにこの画像はsetting.javaによる機能です。
No description
tanoKun
tanoKun2mo ago
1から作ったほうがいいんじゃねぇかなぁ これかなりスパゲッティだし 命名規則ぐじゃぐじゃだし
emeraldrex
emeraldrexOP2mo ago
今動かないのが上記の様なcreateInventoryが絡むものだけなんですよね… これが解決して一旦僕が改修や新規機能追加が可能になればこれを参考に作り直しも考えてはいるのですが… それとプラグイン開発の経験がないというのも相まって正直食指が伸びないのも事実ではあったり… プラグインを導入していながらもjavaを読めるのがサーバー内で僕だけというのも問題点なのですが
のしぇあ
のしぇあ2mo ago
Githubなどでソースコードを共有してみると、リファクタリングなどの協力がやりやすくなるかもしれないです
emeraldrex
emeraldrexOP2mo ago
GitHub
GitHub - EmeraldREX/openPlugin2
Contribute to EmeraldREX/openPlugin2 development by creating an account on GitHub.
emeraldrex
emeraldrexOP2mo ago
身内で共有する以外にgithubを使用したことがないためこれで確認出来るか心配ですが、リポジトリの作成はしておきました。
tanoKun
tanoKun2mo ago
inventoryは操作するイベントリスナーが登録されてないからだと思うけど
emeraldrex
emeraldrexOP2mo ago
それはそうですね。 こちらでも自分で触れています。
tanoKun
tanoKun2mo ago
ごめん見てなかった
emeraldrex
emeraldrexOP2mo ago
帰宅してからイベントリスナーに登録してみたりと色々弄ってみた結果、Bet関係とSetting関係がぐちゃぐちゃ過ぎて全く分からないです。 Betに関してはBetclick.javaをいじると賭ける相手のプレイヤーヘッドが取得できる、ドロップする等散々です。
emeraldrex
emeraldrexOP2mo ago
また、Goalすると賭けた人数によってオッズが決定され賭け金が返却されるのですが、ここの処理がほぼ行われませんでした。 勝ちに設定したプレイヤーと、倍率が2倍で固定されてチャットに表示されるだけです。
No description
emeraldrex
emeraldrexOP2mo ago
Bet群はこれになります
Want results from more Discord servers?
Add your server