Skip to content
This repository has been archived by the owner on Aug 2, 2023. It is now read-only.

tpコマンド、他人を座標指定してtpさせることができる #867

Open
kohonayoshi opened this issue Jun 19, 2022 · 1 comment
Assignees
Labels
☢️優先度高 ☢️ 優先度高 - High priority 🐛bug バグ(動作しない・意図した動作ではない) ❗️help wanted 助けてほしい、是非協力してほしい的な

Comments

@kohonayoshi
Copy link
Contributor

不具合の説明

fooをコマンド実行主としたとき
/tp bar foo は規制されるが /tp bar ~ ~ ~ を実行することはできる不具合

再現手順

  1. 権限グループ「Default」のプレイヤー「foo」がコマンド「/tp bar ~ ~ ~」を実行する
  2. プレイヤー「bar」がプレイヤー「foo」の座標にテレポートさせられてしまう

スクリーンショット

No response

追加情報

No response

@kohonayoshi kohonayoshi added the 🐛bug バグ(動作しない・意図した動作ではない) label Jun 19, 2022
@book000
Copy link
Member

book000 commented Jun 20, 2022

本機能(AntiOtherTeleport)が利用している独自イベント TeleportCommandEvent がチルダやキャレットによる相対座標指定に対応していないことが原因です。イベント自体の実装はこれで、本イベントの実際の発火処理はこれです。
なので、相対座標指定ではないtpコマンド(/tp mine_book000 0 0 0 /tp mine_book000 X4Zなど)は期待通り規制されます。

したがって、本問題の解決にはチルダやキャレットが示す実際の座標位置を取得するよう変換関数(パーサー)を書いて組み込むことと、必要に応じてではありますがTeleportCommandEventが持つデータとしてチルダ・キャレットで指定されたものかを保持しておくのが望ましいでしょう。
以下、途中まで使って実際の挙動がよくわからず実装できなくなったので供養です。ご活用ください。
なお、何も無理やり以下のコードを使わずにもっといいものを作っても良いです(特に以下はXYZ座標で独立して処理していないので、チルダはともかくキャレットは書きにくいかもしれません)

追: 現行システムはテレポート先の座標をIntで処理するので、Doubleで処理するよう書き直す必要もあります。

よろしくお願いします。

    /**
     * チルダやキャレットによる相対座標の解決を行う
     *
     * @param now 現在の座標(X, Y, Z)
     * @param str 入力値 (例: ~1, ~-1, ^1, ^-1)
     *
     * @return 本来の座標
     */
    public static double getRelativeCoordinate(Player player, String str) {
        player.get

        // 入力値のチェック
        if (str.length() == 0) throw new IllegalArgumentException("Invalid coordinate string: " + str);
        if (!isDouble(str.substring(1))) throw new IllegalArgumentException("Invalid coordinate string: " + str);

        // 入力値を取得
        RelativeCoordinateType type = RelativeCoordinateType.getBySymbol(str.charAt(0));
        double input = Double.parseDouble(str.substring(1));

        // 計算
        double result = now;
        switch (type) { // 以降、いじる必要がある
            case TILDE:
                result = input;
                break;
            case CARET:
                result += input;
                break;
        }
    }

    public enum RelativeCoordinateType {
        TILDE('~'), CARET('^');

        private final char symbol;

        RelativeCoordinateType(char symbol) {
            this.symbol = symbol;
        }

        public char getSymbol() {
            return symbol;
        }

        public static RelativeCoordinateType getBySymbol(char symbol) {
            for (RelativeCoordinateType type : values()) {
                if (type.symbol == symbol) return type;
            }
            throw new IllegalArgumentException("Invalid symbol: " + symbol);
        }
    }

@github-actions github-actions bot added the ☢️優先度高 ☢️ 優先度高 - High priority label Aug 11, 2022
@book000 book000 added the ❗️help wanted 助けてほしい、是非協力してほしい的な label Aug 26, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
☢️優先度高 ☢️ 優先度高 - High priority 🐛bug バグ(動作しない・意図した動作ではない) ❗️help wanted 助けてほしい、是非協力してほしい的な
Projects
None yet
Development

No branches or pull requests

3 participants