by yamagami2211 » 2020年11月07日(土) 00:06
前に書いた「
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);
}
}
}
あとはコマンド実行処理書いて
もしくは
を処理させるだけ。
(コンソールから実行させるとエラー吐くと思うので、実行できないようにすること。)
...なにかに使えるかも...?
前に書いた「[url=https://forum.civa.jp/viewtopic.php?p=2229#p2229]Spigotでプレイヤーにエフェクトを与えるコード[/url]」で透明エフェクトを掛けるのではなく、NMSを使った方法を書き記しておきます。
何かしらの参考程度に御覧ください。恐らくもっといい方法があると思います。
今回は 1.12.2 を使います。
NMSを使えるようにする。
[b]追記 20/11/07 >>
BuildToolsが必要で、1.12.2をビルドする必要があります。[/b]
他のバージョンでNMSを使うなら、そのバージョンをビルドする必要があります。
<<追記終わり
pom.xmlに
[code=xml]
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>ばーじょん</version>
</dependency>
[/code]
を追加しただけ。
[spoiler=例][code=xml]
<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>[/code][/spoiler]
プレイヤーを消す
[code=java]
//どこかしらで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);
}
[/code]
プレイヤーを表示する。
[code=java]
//どこかしらで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);
}
[/code]
プレイヤーを消すとTablistから削除されるので、ログアウトを偽装できるかもしれません。
[spoiler=自分が使ったソース(参考用)]
[code=java]
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);
}
}
}
[/code]
あとはコマンド実行処理書いて
[code=java]Flag(p,true)[/code]
もしくは
[code=java]Flag(p,false)[/code]
を処理させるだけ。
(コンソールから実行させるとエラー吐くと思うので、実行できないようにすること。)
[/spoiler]
...なにかに使えるかも...?