マインクラフト非公式フォーラム

本フォーラムでは多彩なサービスを提供しています。

利用方法は「Wiki」より確認できます。

ぜひご登録をお願いいたします!

PocketMine-MP 右クリック長押しの検知

fuyutsuki

メンバー
wiki編集者
PMMP4.2ではPlayerInteractEventでブロックに対する左と右クリックしか検知できず、空中(AIR)に対しての長押しが検知できないという理解なのですが、もし空中に対しての長押しの検知のやり方をご存じの方がいれば教えて下さい!
 
解決策
こんな感じでItemComponentsPacketでminecraft: on_useを定義してあげれば、
右クリックしている間、定期的にInventoryTransactionPacketが送信されるようです。(中身未検証)
送信方法はカスタムアイテムの追加と同じ要領です。

これを使う場合はStartGamePacketでホリデークリエイターの特徴をonにしてあげてください。

急ぎで書いたのでコードが雑なのはご容赦ください...

PHP:
public function enableExpetiments(DataPacketSendEvent $event):void{
        foreach($event->getPackets() as $packet) {
            if (!$packet instanceof StartGamePacket) continue;
            $experiments = $packet->levelSettings->experiments;
            $ref_plop = new \ReflectionProperty($experiments, "experiments");
            $ref_plop->setAccessible(true);
            $ref_plop->setValue($experiments, array_merge($ref_plop->getValue($experiments), ['holiday_creator_features' => true]));
        }...

RarkHopper

新メンバー
FoodやShooterのコンポーネントを持つアイテムは、
空中で使用されたときと、離されたときの二回クライアントサイドからInventoryTransactionPacketが送信されます。

そのパケットの中身にあるtrDataプロパティに、
使用が開始された際はUseItemTransactionDataが、
離された際にはReleaseItemTransactionDataが格納されているので、

サーバー側ではUseItemTransactionDataが格納されたInventoryTransactionPacketを感知してから、
ReleasseItemTransactionDataを格納したInventoryTransactionPacketを感知するまでの間がアイテムが右クリックされていると考えることができます。

しかし、一部のブロックやエンティティに対してアイテムが使用されたとき、
ReleaseItemTransactionDataが保証されない場合があるので、別途対策が必要です。
 
Last edited:
Upvote 1

fuyutsuki

メンバー
wiki編集者
FoodやShooterのコンポーネントを持つアイテムは、
空中で使用されたときと、離されたときに二回クライアントサイドからInventoryTransactionPacketが送信されます。

そのパケットの中身にあるtrDataプロパティに、
使用が開始された際はUseItemTransactionDataが、
離された際にはReleaseItemTransactionDataが格納されているので、

サーバー側ではUseItemTransactionDataが格納されたInventoryTransactionPacketを感知してから、
ReleasseItemTransactionDataを格納したInventoryTransactionPacketを感知するまでの間がアイテムが右クリックされていると考えることができます。

しかし、一部のブロックやエンティティに対してアイテムが使用されたとき、
ReleaseItemTransactionDataが保証されない場合があるので、別途対策が必要です。
なるほど、UseItemTransactionDataまでは見ていたのですがReleaseItemは弓だけだと思って見てませんでした
ありがとうございます:mc_e_95:
 
Upvote 0

fuyutsuki

メンバー
wiki編集者
試してみたんですが、弓や食べ物ではReleaseItemTransactionDataがあったんですが棒などではありませんでした
移動速度の低下を受けたくないので、弓や食べ物ではないもので右クリック長押しを検知したいです
 
Upvote 0

RarkHopper

新メンバー
こんな感じでItemComponentsPacketでminecraft: on_useを定義してあげれば、
右クリックしている間、定期的にInventoryTransactionPacketが送信されるようです。(中身未検証)
送信方法はカスタムアイテムの追加と同じ要領です。

これを使う場合はStartGamePacketでホリデークリエイターの特徴をonにしてあげてください。

急ぎで書いたのでコードが雑なのはご容赦ください...

PHP:
public function enableExpetiments(DataPacketSendEvent $event):void{
        foreach($event->getPackets() as $packet) {
            if (!$packet instanceof StartGamePacket) continue;
            $experiments = $packet->levelSettings->experiments;
            $ref_plop = new \ReflectionProperty($experiments, "experiments");
            $ref_plop->setAccessible(true);
            $ref_plop->setValue($experiments, array_merge($ref_plop->getValue($experiments), ['holiday_creator_features' => true]));
        }
    }


PHP:
                    $parent_on_use = CompoundTag::create();{
                        $child_on_use = CompoundTag::create();{
                            $child_on_use->setString("event", "");
                            $child_on_use->setString("target", "self");
                            $parent_on_use->setTag("on_use", $child_on_use);
                        }
                        $components->setTag("minecraft:on_use", $parent_on_use);
                    }


↓↓↓ 動作確認動画 (送信速度遅めっぽいです)
youtube
 
Last edited:
Upvote 1
解決策
Top