Skip to content

Instantly share code, notes, and snippets.

@forthxu
Created November 25, 2015 09:29
Show Gist options
  • Select an option

  • Save forthxu/50da9174348720f91726 to your computer and use it in GitHub Desktop.

Select an option

Save forthxu/50da9174348720f91726 to your computer and use it in GitHub Desktop.
try write a php client to learn the pocketmine-pe
<?php
//error_reporting(0);
header("Content-type:text/html;charset=utf-8");
function __autoload($class_name) {
require_once ('/workspace/minecraft/pocket/src/'.str_replace('\\','/',$class_name) . '.php');
}
function test($f=array()){
$magic = "\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78";
$re = null;
$config=array_merge(array('ip'=>'192.168.54.245','port'=>19121),$f);
$client = @stream_socket_client("udp://".$config['ip'].":".$config['port'], $errno, $errstr); //非阻塞Socket
if(!$client){
$re = false;
}else{
stream_set_timeout($client , 1);
//-----------------0x05 0x06
$r1 = new raklib\protocol\OPEN_CONNECTION_REQUEST_1();
$r1->encode();
$date_send = $r1->buffer;
fwrite($client, $date_send);
$data_receive = fread($client, 65535);
echo "\r\n".'send_id:'.'0x'.dechex($r1::$ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n";
if ($data_receive != "") {
var_dump('0x'.dechex(ord($data_receive{0})));
$rs1 = new raklib\protocol\OPEN_CONNECTION_REPLY_1();
$rs1->buffer=$data_receive;
$rs1->decode();
var_dump($rs1);
}else{
$re = 'no_data';
}
//-----------------0x07 0x08
$r2 = new raklib\protocol\OPEN_CONNECTION_REQUEST_2();
$r2->serverAddress=$config['ip'];
$r2->serverPort=$config['port'];
$r2->encode();
$date_send = $r2->buffer;
fwrite($client, $date_send);
$data_receive = fread($client, 65535);
echo "\r\n".'send_id:'.'0x'.dechex($r2::$ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n";
if ($data_receive != "") {
var_dump('0x'.dechex(ord($data_receive{0})));
$rs2 = new raklib\protocol\OPEN_CONNECTION_REPLY_2();
$rs2->buffer=$data_receive;
$rs2->decode();
var_dump($rs2);
}else{
$re = 'no_data';
}
//-----------------0x09 0x10
$pk = new raklib\protocol\CLIENT_CONNECT_DataPacket();
$pk->clientID=1343475902;
$pk->sendPing=21310322131032;
$pk->encode();
$sendPacket = new raklib\protocol\EncapsulatedPacket();
$sendPacket->reliability = 0;
$sendPacket->buffer = $pk->buffer;
$packet = new raklib\protocol\DATA_PACKET_0();
if ($sendPacket->needACK) {
$packet->packets[] = clone $sendPacket;
$sendPacket->needACK = false;
} else {
$packet->packets[] = $sendPacket->toBinary();
}
$packet->encode();
$date_send = $packet->buffer;
fwrite($client, $date_send);
$data_receive = fread($client, 65535);
echo "\r\n".'send_id:'.'0x'.dechex($pk::$ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n";
if ($data_receive != "") {
//多个合成包
var_dump('0x'.dechex(ord($data_receive{0})));
$packet = new raklib\protocol\DATA_PACKET_0();
$packet->buffer=$data_receive;
$packet->decode();
// var_dump($packet);
//压缩包
var_dump($packet->packets[0]);
var_dump('0x'.dechex(ord($packet->packets[0]->buffer{0})));
// $sendPacket = new raklib\protocol\EncapsulatedPacket();
// var_dump($sendPacket->fromBinary($packet->packets[0]->buffer));
//数据包
$rs = new raklib\protocol\SERVER_HANDSHAKE_DataPacket();
$rs->buffer=$packet->packets[0]->buffer;
$rs->decode();
var_dump($rs);
}else{
$re = 'no_data';
}
//-----------------0x13
$pk = new raklib\protocol\CLIENT_HANDSHAKE_DataPacket();
$pk->address=$config['ip'];
$pk->port=$config['port'];
$pk->sendPing=$rs->sendPing;
$pk->sendPong=bcadd($rs->sendPing, "1000");;
$pk->encode();
$sendPacket = new raklib\protocol\EncapsulatedPacket();
$sendPacket->reliability = 0;
$sendPacket->buffer = $pk->buffer;
$packet = new raklib\protocol\DATA_PACKET_0();
if ($sendPacket->needACK) {
$packet->packets[] = clone $sendPacket;
$sendPacket->needACK = false;
} else {
$packet->packets[] = $sendPacket->toBinary();
}
$packet->encode();
$date_send = $packet->buffer;
fwrite($client, $date_send);
echo "\r\n".'send_id:'.'0x'.dechex($pk::$ID).' send_len:'.strlen($date_send)."\r\n";
//-----------------0x82
$pk = new pocketmine\network\protocol\LoginPacket();
$pk->username='forthxu';
$pk->protocol1=27;
$pk->protocol2=27;
$pk->clientId=1299218856;
$pk->slim=true;
$pk->encode();
$sendPacket = new raklib\protocol\EncapsulatedPacket();
$sendPacket->reliability = 0;
$sendPacket->buffer = $pk->buffer;
$packet = new raklib\protocol\DATA_PACKET_4();
// if ($sendPacket->needACK) {
// $packet->packets[] = clone $sendPacket;
// $sendPacket->needACK = false;
// } else {
$packet->packets[] = $sendPacket->toBinary();
// }
$packet->encode();
$date_send = $packet->buffer;
fwrite($client, $date_send);
$data_receive = fread($client, 65535);
echo "\r\n".'send_id:'.'0x'.dechex($pk::NETWORK_ID).' send_len:'.strlen($date_send).' receive_len:'.strlen($data_receive)."\r\n";
if ($data_receive != "") {
var_dump('0x'.dechex(ord($data_receive{0})));
}else{
$re = 'no_data';
}
}
fclose($client);
$re='end';
return $re;
}
$f=array();
var_dump(test($f));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment