トピックを立てるまでもないライブラリやコード置き場

アバター
ta3
Forum Administrator
ID: 624FJHWYTI
記事: 97
登録日時: 2019年7月01日(月) 21:08
お住まい: JP
Minecraft ID: ta3
いいね: 1回
いいねされた回数: 1回
連絡する:

トピックを立てるまでもないライブラリやコード置き場

投稿記事 by ta3 » 2020年10月15日(木) 13:11

トピックを立てるまでもないライブラリやコードなどを公開するトピックです。
非公式フォーラムにあったトピックをもとに以下を記載して投稿してください:
  • 投稿したライブラリやコードの説明
  • ライブラリやコードのライセンス
長いコードはzipファイルなどに圧縮して投稿することをお勧めします。
0



アバター
Reiga
ID: 23BN3NPNFE
記事: 36
登録日時: 2019年12月24日(火) 15:11
お住まい: 自室
Minecraft ID: Ign1s_Reiga
いいね: 1回
連絡する:

Re: トピックを立てるまでもないライブラリやコード置き場

投稿記事 by Reiga » 2020年11月03日(火) 13:37

自分の環境ではspigot-apiのsetHealthメソッドや、damageメソッドでkillコマンドを作ることができなかったため
最終的にできたものを置いておきます
(これはNMSを使います。NMSにある程度知識を持っていることを前提とします)
テストしたバージョン:1.12.2

コード: 全て選択

Player player; #Playerの変数初期化は自分でお願いします。
EntityPlayer ep = ((CraftPlayer) player).getHandle();
ep.killEntity();
0
最後に編集したユーザー Reiga [ 2022年1月30日(日) 02:09 ], 累計 2 回

アバター
yamagami2211
ID: 44003AWZ5U
記事: 50
登録日時: 2020年3月30日(月) 22:03
お住まい: ユーゴスラビア
Minecraft ID: yamagami2211
いいねされた回数: 8回
連絡する:

Spigotでプレイヤーにエフェクトを与えるコード

投稿記事 by yamagami2211 » 2020年11月04日(水) 21:46

例えばこんな感じ。

コード: 全て選択

    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);
    }
なにかに使えるかもですね。
0

アバター
yamagami2211
ID: 44003AWZ5U
記事: 50
登録日時: 2020年3月30日(月) 22:03
お住まい: ユーゴスラビア
Minecraft ID: yamagami2211
いいねされた回数: 8回
連絡する:

プレイヤーを非表示にする

投稿記事 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>
を追加しただけ。
Show

コード: 全て選択

        <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から削除されるので、ログアウトを偽装できるかもしれません。
自分が使ったソース(参考用)
Show

コード: 全て選択

    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);
            }

        }
    }
 
あとはコマンド実行処理書いて

コード: 全て選択

Flag(p,true)
もしくは

コード: 全て選択

Flag(p,false)
を処理させるだけ。

(コンソールから実行させるとエラー吐くと思うので、実行できないようにすること。)
...なにかに使えるかも...?
0
最後に編集したユーザー yamagami2211 [ 2020年11月07日(土) 10:16 ], 累計 1 回

アバター
Reiga
ID: 3J5KPPTORF
記事: 36
登録日時: 2019年12月24日(火) 15:11
お住まい: 自室
Minecraft ID: Ign1s_Reiga
いいね: 1回
連絡する:

Re: トピックを立てるまでもないライブラリやコード置き場

投稿記事 by Reiga » 2020年11月07日(土) 06:58

プレイヤーの国(多分言語設定)を取得するもの

・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();
0

アバター
Reiga
ID: 3J5KPPTORF
記事: 36
登録日時: 2019年12月24日(火) 15:11
お住まい: 自室
Minecraft ID: Ign1s_Reiga
いいね: 1回
連絡する:

Re: トピックを立てるまでもないライブラリやコード置き場

投稿記事 by Reiga » 2020年11月07日(土) 07:08

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";
	}
}
0

アバター
yamagami2211
ID: 44003AWZ5U
記事: 50
登録日時: 2020年3月30日(月) 22:03
お住まい: ユーゴスラビア
Minecraft ID: yamagami2211
いいねされた回数: 8回
連絡する:

オンラインのプレイヤーにメッセージを送る

投稿記事 by yamagami2211 » 2020年11月07日(土) 13:56

コード: 全て選択

Bukkit.broadcastMessage("String");
ChatColorが使える他、Configから引っ張ってくることもできます。

オンライン中の全員に送るので、Tipsとか告知とかそういうのに使えるかも.......?
小言...
Show
自分の環境がおかしいのか、setJoinMessageとかsetQuitMessageが使えない(...?)ようなので、ggって見つけてきた。
知ってる人多いと思うけど。
0

アバター
Reiga
ID: 3J5KPPTORF
記事: 36
登録日時: 2019年12月24日(火) 15:11
お住まい: 自室
Minecraft ID: Ign1s_Reiga
いいね: 1回
連絡する:

Re: トピックを立てるまでもないライブラリやコード置き場

投稿記事 by Reiga » 2020年11月07日(土) 16:08

コマンド実行時に返すメッセージ等を上書き
荒らし対策に使えそう

・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.");
	}
}
0

アバター
yamagami2211
ID: 44003AWZ5U
記事: 50
登録日時: 2020年3月30日(月) 22:03
お住まい: ユーゴスラビア
Minecraft ID: yamagami2211
いいねされた回数: 8回
連絡する:

プレイヤーのインベントリを開く+α

投稿記事 by yamagami2211 » 2020年11月09日(月) 16:24

自分で作ったプラグインと同じものです。
コマンド実行を前提としていますので 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);
0

返信する