ページ 1 / 1
トピックを立てるまでもないライブラリやコード置き場
Posted: 2020年10月15日(木) 13:11
by ta3
トピックを立てるまでもないライブラリやコードなどを公開するトピックです。
非公式フォーラムにあったトピックをもとに以下を記載して投稿してください:
- 投稿したライブラリやコードの説明
- ライブラリやコードのライセンス
長いコードはzipファイルなどに圧縮して投稿することをお勧めします。
Re: トピックを立てるまでもないライブラリやコード置き場
Posted: 2020年11月03日(火) 13:37
by Reiga
自分の環境ではspigot-apiのsetHealthメソッドや、damageメソッドでkillコマンドを作ることができなかったため
最終的にできたものを置いておきます
(これはNMSを使います。NMSにある程度知識を持っていることを前提とします)
テストしたバージョン:1.12.2
コード: 全て選択
Player player; #Playerの変数初期化は自分でお願いします。
EntityPlayer ep = ((CraftPlayer) player).getHandle();
ep.killEntity();
Spigotでプレイヤーにエフェクトを与えるコード
Posted: 2020年11月04日(水) 21:46
by yamagami2211
例えばこんな感じ。
コード: 全て選択
public void onLogin(PlayerLoginEvent e){
Player player = e.getPlayer();
player.addPotionEffect(new PotionEffect(PotionEffectType.LUCK,10,0));
}
(ログインしたプレイヤーに 幸運 を付与する)
LUCKの部分を存在するエフェクトのやつに書き換えれば、ログインしたら透明化とか移動速度100とかできます。
逆にエフェクトを剥ぐやつ。
コード: 全て選択
public void onLogin(PlayerLoginEvent e){
Player player = e.getPlayer();
player.removePotionEffect(PotionEffectType.INVISIBILITY);
}
なにかに使えるかもですね。
プレイヤーを非表示にする
Posted: 2020年11月07日(土) 00:06
by yamagami2211
前に書いた「
Spigotでプレイヤーにエフェクトを与えるコード」で透明エフェクトを掛けるのではなく、NMSを使った方法を書き記しておきます。
何かしらの参考程度に御覧ください。恐らくもっといい方法があると思います。
今回は 1.12.2 を使います。
NMSを使えるようにする。
追記 20/11/07 >>
BuildToolsが必要で、1.12.2をビルドする必要があります。
他のバージョンでNMSを使うなら、そのバージョンをビルドする必要があります。
<<追記終わり
pom.xmlに
コード: 全て選択
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>ばーじょん</version>
</dependency>
を追加しただけ。
コード: 全て選択
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.12.2-R0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.12.2-R0.1-SNAPSHOT</version>
</dependency>
プレイヤーを消す
コード: 全て選択
//どこかしらでplayerを持ってくる必要がある。
PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, ((CraftPlayer)player).getHandle());
for (Player ps : Bukkit.getOnlinePlayers()) {
ps.hidePlayer(player);
((CraftPlayer)ps).getHandle().playerConnection.sendPacket(packet);
}
プレイヤーを表示する。
コード: 全て選択
//どこかしらでplayerを持ってくる必要がある。
PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, ((CraftPlayer)player).getHandle());
for (Player ps : Bukkit.getOnlinePlayers()) {
ps.showPlayer(player);
((CraftPlayer)ps).getHandle().playerConnection.sendPacket(packet);
}
プレイヤーを消すとTablistから削除されるので、ログアウトを偽装できるかもしれません。
コード: 全て選択
public void Flag(Player player,Boolean flag){
if(flag){
//プレイヤーを消す
PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, ((CraftPlayer)player).getHandle());
for (Player ps : Bukkit.getOnlinePlayers()) {
ps.hidePlayer(player);
((CraftPlayer)ps).getHandle().playerConnection.sendPacket(packet);
}
} else {
//プレイヤーを表示する
PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, ((CraftPlayer)player).getHandle());
for (Player ps : Bukkit.getOnlinePlayers()) {
ps.showPlayer(player);
((CraftPlayer)ps).getHandle().playerConnection.sendPacket(packet);
}
}
}
あとはコマンド実行処理書いて
もしくは
を処理させるだけ。
(コンソールから実行させるとエラー吐くと思うので、実行できないようにすること。)
...なにかに使えるかも...?
Re: トピックを立てるまでもないライブラリやコード置き場
Posted: 2020年11月07日(土) 06:58
by Reiga
プレイヤーの国(多分言語設定)を取得するもの
・NoNMS&1.9以前(?)
コード: 全て選択
public String getLocale(Player player) {
Object ep;
try {
ep = getMethod("getHandle", player.getClass()).invoke(player, (Object[]) null);
Field f = ep.getClass().getDeclaredField("locale");
f.setAccessible(true);
String language = (String) f.get(ep);
return language;
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
return null;
}
private Method getMethod(String name, Class<?> clazz) {
for (Method m : clazz.getDeclaredMethods()) {
if (m.getName().equals(name))
return m;
}
return null;
}
・NoNMS
コード: 全て選択
//Player変数の初期化は自分で
player.getLocale();
Re: トピックを立てるまでもないライブラリやコード置き場
Posted: 2020年11月07日(土) 07:08
by Reiga
ProtocolLibを使ったプレイヤーバージョンの取得
※ProtocolLib必須
物凄く汚くなってると思う()
コード: 全て選択
public static String getClientVer(Player player) {
int protocol = ProtocolLibrary.getProtocolManager().getProtocolVersion(player);
switch (protocol) {
case 335:
return "1.12";
case 338:
return "1.12.1";
case 340:
return "1.12.2";
case 393:
return "1.13";
case 401:
return "1.13.1";
case 404:
return "1.13.2";
case 477:
return "1.14";
case 480:
return "1.14.1";
case 485:
return "1.14.2";
case 490:
return "1.14.3";
case 498:
return "1.14.4";
case 573:
return "1.15";
case 575:
return "1.15.1";
case 578:
return "1.15.2";
case 735:
return "1.16";
case 736:
return "1.16.1";
case 751:
return "1.16.2";
case 753:
return "1.16.3";
default:
return "UNKNOWN";
}
}
オンラインのプレイヤーにメッセージを送る
Posted: 2020年11月07日(土) 13:56
by yamagami2211
コード: 全て選択
Bukkit.broadcastMessage("String");
ChatColorが使える他、Configから引っ張ってくることもできます。
オンライン中の全員に送るので、Tipsとか告知とかそういうのに使えるかも.......?
自分の環境がおかしいのか、setJoinMessageとかsetQuitMessageが使えない(...?)ようなので、ggって見つけてきた。
知ってる人多いと思うけど。
Re: トピックを立てるまでもないライブラリやコード置き場
Posted: 2020年11月07日(土) 16:08
by Reiga
コマンド実行時に返すメッセージ等を上書き
荒らし対策に使えそう
・PlayerCommandPreprocessEventを使って上書き
コード: 全て選択
@EventHandler
public void onPerformCommand(PlayerCommandPreprocessEvent event) {
//プレイヤーがplugins、plコマンドを実行した時
if (event.getMessage().matches("/plugins") || event.getMessage().matches("/pl")) {
//返すメッセージを引数内のものに設定する
event.setMessage("There are no Plugins in this server.");
}
}
プレイヤーのインベントリを開く+α
Posted: 2020年11月09日(月) 16:24
by yamagami2211
自分で作ったプラグインと同じものです。
コマンド実行を前提としていますので Player player = (Player) sender; とかでplayerを持ってきています。
1.12.2です。
*1 : 自分のインベントリを開く
(/<command> )
コード: 全て選択
player.openInventory(player.getInventory());
*2 : 他のプレイヤーのインベントリを開く
(/<command> [playername] )
コード: 全て選択
Player targetplayer = player.getServer().getPlayer(args[0]);
player.openInventory(targetplayer.getInventory());
*3 : 自分のエンダーチェストを開く
(/<command> )
コード: 全て選択
player.openInventory(player.getEnderChest());
*4 : 他のプレイヤーのインベントリを開く
(/<command> [playername] )
コード: 全て選択
Player targetplayer = player.getServer().getPlayer(args[0]);
player.openInventory(targetplayer.getEnderChest());
*5 : 作業台を開く
コード: 全て選択
player.openWorkbench(null, true);
*6 : エンチャントテーブルを開く
ラピスラズリが必要かつ、低レベルエンチャントになる
コード: 全て選択
player.openEnchanting(null, true);