こんにちは、皆に愛されるはにおかさいです。
人生に迷いすぎて精神崩壊しそうです。あぁ、もうしてるか。
今回は、パケットの読み方を頑張ります。
こちらも参考にしてください
http://blog.haniokasai.com/2017/04/libminecraftso.html
今回はSetEnableCommandsPacketを解説したいと思います。
そもそも、このパケットは、mcpeのクライアント側で、コマンドの入力を受け付けるか否かを設定できるものです。PMMPではデフォルトでtrue(真)となります。
MiNETでは、デフォルトでは何も設定されないので、
https://github.com/haniokasai/EnableCommand/blob/master/EnableCommand.cs
として、パケットを送りつけます。
本題に入りましょう
まず、libminecraftpe.soの解析ファイルを見てみましょう
赤い部分には、getBool()と書かれています。boolとは型で
Bool 真偽(true かfalse)
VarInt 数字
Byte
UnsignedVarInt
SignedBigEndianInt
FixedFloat 固定の小数
Float 浮動小数
UnsignedShort
< > で囲まれたのは独自にmcpeで定義されている型です
<Vec3>
<ItemInstance>
PMMPでは、この関数でパケットのデータを設定するようです
https://github.com/BlueLightJapan/BlueLight/blob/1bbb6a6e11db5e90de6672cf2a08a079228ff216/src/pocketmine/utils/BinaryStream.php
SetEnableCommandsPacketはtrueで有効になるわけですから、やはり解析結果にはBool型が書かれています。
PocketMineでこのパケットの動作を見てみましょう。
PocketMineでは、StartGamePacketにて、コマンドが有効になるようになっていますから、あえて、コマンドを使えなくしてみましょう。
これで、本来なら送信できますが、今回は解析結果を使ってみます。
このような風にかくと、datapacket型が作れます。
こんな感じのプラグインを作ってみました
https://github.com/haniokasai/PacketTest-PocketMine-/tree/master/enablepackettest
サーバーで試してみると、MCPEのアプリでコマンドを実行しても、チートが使えないと怒られるようになりました。
人生に迷いすぎて精神崩壊しそうです。あぁ、もうしてるか。
今回は、パケットの読み方を頑張ります。
こちらも参考にしてください
http://blog.haniokasai.com/2017/04/libminecraftso.html
今回はSetEnableCommandsPacketを解説したいと思います。
そもそも、このパケットは、mcpeのクライアント側で、コマンドの入力を受け付けるか否かを設定できるものです。PMMPではデフォルトでtrue(真)となります。
MiNETでは、デフォルトでは何も設定されないので、
Player player = e.Player; | |
var setCmdEnabled = McpeSetCommandsEnabled.CreateObject(); | |
setCmdEnabled.enabled = true; | |
player.SendPackage(setCmdEnabled); |
https://github.com/haniokasai/EnableCommand/blob/master/EnableCommand.cs
として、パケットを送りつけます。
本題に入りましょう
まず、libminecraftpe.soの解析ファイルを見てみましょう
9ecc22: b510 push {r4, lr}
9ecc24: 4604 mov r4, r0
9ecc26: 4608 mov r0, r1
9ecc28: f4de ea58 blx 6cb0dc <ReadOnlyBinaryStream::getBool()@plt>
9ecc2c: 7320 strb r0, [r4, #12]
9ecc2e: bd10 pop {r4, pc}
赤い部分には、getBool()と書かれています。boolとは型で
Bool 真偽(true かfalse)
VarInt 数字
Byte
UnsignedVarInt
SignedBigEndianInt
FixedFloat 固定の小数
Float 浮動小数
UnsignedShort
< > で囲まれたのは独自にmcpeで定義されている型です
<Vec3>
<ItemInstance>
PMMPでは、この関数でパケットのデータを設定するようです
https://github.com/BlueLightJapan/BlueLight/blob/1bbb6a6e11db5e90de6672cf2a08a079228ff216/src/pocketmine/utils/BinaryStream.php
SetEnableCommandsPacketはtrueで有効になるわけですから、やはり解析結果にはBool型が書かれています。
PocketMineでこのパケットの動作を見てみましょう。
PocketMineでは、StartGamePacketにて、コマンドが有効になるようになっていますから、あえて、コマンドを使えなくしてみましょう。
public function onJoin(PlayerJoinEvent $event){ $player = $event->getPlayer(); $pk = new SetCommandsEnabledPacket(); $pk->putBool(false); $player->dataPacket($pk);}
これで、本来なら送信できますが、今回は解析結果を使ってみます。
<?php
namespace haniokasai;
use pocketmine\network\protocol\DataPacket; /**
* Created by PhpStorm.
* User: htek
* Date: 2017/04/16
* Time: 22:41
*/ #include <rules/DataPacket.h>
class enablepk extends DataPacket{ const NETWORK_ID = "0x3c"; public $en;/*変数を、パケットの必要とする引数の数だけ書きます。 呼び出しは
*/ public function decode(){//mcpe->serverのパケットに関する処理
}
public function encode(){//server->mcpeのパケットに関する処理
$this->reset();//お掃除
$this->putBool($this->en);//libminecraftpe.soにgetBoolと書かれているので、型を合わせるのでputBoolとします。
}
}
このような風にかくと、datapacket型が作れます。
SetCommandsEnablePacketには、bool型を1つ必要としますから、putBoolで、真偽の値を置いてやります。変数$en(= $this->en)にはtrueかfalseが入ります。
$pk2 = new enablepk();//DataPacketの雛形を呼び出す | |
$pk2->en = true;//変数の内容を入力 | |
$player->dataPacket($pk); |
これでパケットが作成と送信ができます。
こんな感じのプラグインを作ってみました
https://github.com/haniokasai/PacketTest-PocketMine-/tree/master/enablepackettest
サーバーで試してみると、MCPEのアプリでコマンドを実行しても、チートが使えないと怒られるようになりました。
0 件のコメント:
コメントを投稿