mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-22 16:51:42 +00:00
Things are working ヽ༼ຈل͜ຈ༽ノ
This commit is contained in:
parent
2b8df410d1
commit
1ff381ebf4
@ -253,17 +253,19 @@ class Player extends RealHuman implements CommandSender{
|
||||
*/
|
||||
public function __construct($clientID, $ip, $port, $MTU){
|
||||
$this->perm = new PermissibleBase($this);
|
||||
$this->namedtag = new Compound();
|
||||
$this->bigCnt = 0;
|
||||
$this->MTU = $MTU;
|
||||
$this->server = Server::getInstance();
|
||||
$this->lastBreak = microtime(true);
|
||||
$this->clientID = $clientID;
|
||||
$this->CID = $ip . ":" . $port;
|
||||
Player::$list[$this->CID] = $this;
|
||||
$this->ip = $ip;
|
||||
$this->port = $port;
|
||||
$this->spawnPosition = Level::getDefault()->getSafeSpawn();
|
||||
$this->timeout = microtime(true) + 20;
|
||||
$this->gamemode = $this->server->gamemode;
|
||||
$this->gamemode = $this->server->getGamemode();
|
||||
$this->level = Level::getDefault();
|
||||
$this->viewDistance = $this->server->getViewDistance();
|
||||
$this->slot = 0;
|
||||
@ -381,7 +383,7 @@ class Player extends RealHuman implements CommandSender{
|
||||
$distance = @$this->chunksOrder[$index];
|
||||
if($index === null or $distance === null){
|
||||
if($this->chunkScheduled === 0){
|
||||
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk")), 60);
|
||||
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk"), array(false, true)), 60);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -392,7 +394,7 @@ class Player extends RealHuman implements CommandSender{
|
||||
if(!$this->level->isChunkPopulated($X, $Z)){
|
||||
$this->orderChunks();
|
||||
if($this->chunkScheduled === 0 or $force === true){
|
||||
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk")), MAX_CHUNK_RATE);
|
||||
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk"), array(false, true)), MAX_CHUNK_RATE);
|
||||
++$this->chunkScheduled;
|
||||
}
|
||||
|
||||
@ -421,7 +423,7 @@ class Player extends RealHuman implements CommandSender{
|
||||
$this->lastChunk = array($X, $Z);
|
||||
|
||||
if($this->chunkScheduled === 0 or $force === true){
|
||||
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk")), MAX_CHUNK_RATE);
|
||||
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk"), array(false, true)), MAX_CHUNK_RATE);
|
||||
++$this->chunkScheduled;
|
||||
}
|
||||
}
|
||||
@ -1063,7 +1065,7 @@ class Player extends RealHuman implements CommandSender{
|
||||
return;
|
||||
}
|
||||
|
||||
if($this->server->isWhitelisted(strtolower($this->getName()))){
|
||||
if(!$this->server->isWhitelisted(strtolower($this->getName()))){
|
||||
$this->close($this->username . " has left the game", "Server is white-listed");
|
||||
|
||||
return;
|
||||
@ -1180,7 +1182,6 @@ class Player extends RealHuman implements CommandSender{
|
||||
//$this->heal($this->data->get("health"), "spawn", true);
|
||||
$this->spawned = true;
|
||||
$this->spawnToAll();
|
||||
$this->sendMessage($this->server->getMotd() . "\n");
|
||||
|
||||
$this->sendInventory();
|
||||
$this->sendSettings();
|
||||
@ -2045,7 +2046,9 @@ class Player extends RealHuman implements CommandSender{
|
||||
if($this->connected === true){
|
||||
if($this->username != ""){
|
||||
$this->server->getPluginManager()->callEvent($ev = new Event\Player\PlayerQuitEvent($this, $message));
|
||||
$this->save();
|
||||
if($this->loggedIn === true){
|
||||
$this->save();
|
||||
}
|
||||
}
|
||||
|
||||
$this->sendBuffer();
|
||||
|
@ -40,6 +40,8 @@ use PocketMine\Item\Item;
|
||||
use PocketMine\Level\Generator\Generator;
|
||||
use PocketMine\Level\Level;
|
||||
use PocketMine\Network\Packet;
|
||||
use PocketMine\Network\RakNet\Info as RakNetInfo;
|
||||
use PocketMine\Network\RakNet\Packet as RakNetPacket;
|
||||
use PocketMine\Network\Query\QueryHandler;
|
||||
use PocketMine\Network\Query\QueryPacket;
|
||||
use PocketMine\Network\ThreadedHandler;
|
||||
@ -342,7 +344,7 @@ class Server{
|
||||
* @return string
|
||||
*/
|
||||
public function getMotd(){
|
||||
return $this->getConfigString("motd", "");
|
||||
return $this->getConfigString("motd", "Minecraft: PE Server");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -455,6 +457,7 @@ class Server{
|
||||
}else{
|
||||
$value = $this->properties->exists($variable) ? $this->properties->get($variable) : $defaultValue;
|
||||
}
|
||||
|
||||
if(is_bool($value)){
|
||||
return $value;
|
||||
}
|
||||
@ -601,7 +604,7 @@ class Server{
|
||||
@mkdir($this->pluginPath, 0777);
|
||||
|
||||
$this->operators = new Config($this->dataPath . "ops.txt", Config::ENUM);
|
||||
$this->whitelist = new Config($this->dataPath . "whitelist.txt", Config::ENUM);
|
||||
$this->whitelist = new Config($this->dataPath . "white-list.txt", Config::ENUM);
|
||||
if(file_exists($this->dataPath . "banned.txt") and !file_exists($this->dataPath . "banned-players.txt")){
|
||||
@rename($this->dataPath . "banned.txt", $this->dataPath . "banned-players.txt");
|
||||
}
|
||||
@ -617,8 +620,7 @@ class Server{
|
||||
|
||||
console("[INFO] Loading properties...");
|
||||
$this->properties = new Config($this->dataPath . "server.properties", Config::PROPERTIES, array(
|
||||
"server-name" => "Minecraft: PE Server",
|
||||
"motd" => "Welcome @player to this server!",
|
||||
"motd" => "Minecraft: PE Server",
|
||||
"server-port" => 19132,
|
||||
"memory-limit" => "128M",
|
||||
"white-list" => false,
|
||||
@ -887,6 +889,51 @@ class Server{
|
||||
public function handlePacket(Packet $packet){
|
||||
if($packet instanceof QueryPacket and isset($this->queryHandler)){
|
||||
$this->queryHandler->handle($packet);
|
||||
}elseif($packet instanceof RakNetPacket){
|
||||
$CID = $packet->ip . ":" . $packet->port;
|
||||
if(isset(Player::$list[$CID])){
|
||||
Player::$list[$CID]->handlePacket($packet);
|
||||
}else{
|
||||
switch($packet->pid()){
|
||||
case RakNetInfo::UNCONNECTED_PING:
|
||||
case RakNetInfo::UNCONNECTED_PING_OPEN_CONNECTIONS:
|
||||
$pk = new RakNetPacket(RakNetInfo::UNCONNECTED_PONG);
|
||||
$pk->pingID = $packet->pingID;
|
||||
$pk->serverID = $this->serverID;
|
||||
$pk->serverType = "MCCPP;Demo;" . $this->getMotd() . " [" . count(Player::$list) . "/" . $this->getMaxPlayers() . "]";
|
||||
$pk->ip = $packet->ip;
|
||||
$pk->port = $packet->port;
|
||||
$this->sendPacket($pk);
|
||||
break;
|
||||
case RakNetInfo::OPEN_CONNECTION_REQUEST_1:
|
||||
if($packet->structure !== RakNetInfo::STRUCTURE){
|
||||
console("[DEBUG] Incorrect structure #" . $packet->structure . " from " . $packet->ip . ":" . $packet->port, true, true, 2);
|
||||
$pk = new RakNetPacket(RakNetInfo::INCOMPATIBLE_PROTOCOL_VERSION);
|
||||
$pk->serverID = $this->serverID;
|
||||
$pk->ip = $packet->ip;
|
||||
$pk->port = $packet->port;
|
||||
$this->sendPacket($pk);
|
||||
}else{
|
||||
$pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_1);
|
||||
$pk->serverID = $this->serverID;
|
||||
$pk->mtuSize = strlen($packet->buffer);
|
||||
$pk->ip = $packet->ip;
|
||||
$pk->port = $packet->port;
|
||||
$this->sendPacket($pk);
|
||||
}
|
||||
break;
|
||||
case RakNetInfo::OPEN_CONNECTION_REQUEST_2:
|
||||
new Player($packet->clientID, $packet->ip, $packet->port, $packet->mtuSize); //New Session!
|
||||
$pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_2);
|
||||
$pk->serverID = $this->serverID;
|
||||
$pk->serverPort = $this->getPort();
|
||||
$pk->mtuSize = $packet->mtuSize;
|
||||
$pk->ip = $packet->ip;
|
||||
$pk->port = $packet->port;
|
||||
$this->sendPacket($pk);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,6 +27,7 @@ namespace PocketMine\Network;
|
||||
use PocketMine\Network\Query\QueryPacket;
|
||||
use PocketMine\Network\RakNet\Info;
|
||||
use PocketMine\Network\RakNet\Packet as RakNetPacket;
|
||||
use PocketMine\Server;
|
||||
|
||||
class ThreadedHandler extends \Thread{
|
||||
protected $bandwidthUp;
|
||||
@ -61,7 +62,7 @@ class ThreadedHandler extends \Thread{
|
||||
}
|
||||
|
||||
public function close(){
|
||||
$this->synchronized(function (){
|
||||
$this->synchronized(function(){
|
||||
$this->stop = true;
|
||||
socket_close($this->socket);
|
||||
});
|
||||
@ -73,9 +74,7 @@ class ThreadedHandler extends \Thread{
|
||||
* @return float
|
||||
*/
|
||||
public function getUploadSpeed(){
|
||||
return $this->synchronized(function (){
|
||||
return $this->bandwidthUp / max(1, microtime(true) - $this->bandwidthTime);
|
||||
});
|
||||
return $this->bandwidthUp / max(1, microtime(true) - $this->bandwidthTime);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -84,9 +83,7 @@ class ThreadedHandler extends \Thread{
|
||||
* @return float
|
||||
*/
|
||||
public function getDownloadSpeed(){
|
||||
return $this->synchronized(function (){
|
||||
return $this->bandwidthDown / max(1, microtime(true) - $this->bandwidthTime);
|
||||
});
|
||||
return $this->bandwidthDown / max(1, microtime(true) - $this->bandwidthTime);
|
||||
}
|
||||
|
||||
|
||||
@ -94,10 +91,7 @@ class ThreadedHandler extends \Thread{
|
||||
* @return Packet
|
||||
*/
|
||||
public function readPacket(){
|
||||
return $this->packets->synchronized(function (){
|
||||
//$this->notify();
|
||||
return $this->packets->shift();
|
||||
});
|
||||
return $this->packets->shift();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -106,15 +100,17 @@ class ThreadedHandler extends \Thread{
|
||||
* @return int
|
||||
*/
|
||||
public function writePacket(Packet $packet){
|
||||
return $this->queue->synchronized(function ($packet){
|
||||
$this->queue[] = $packet;
|
||||
|
||||
//$this->notify();
|
||||
return strlen($packet->buffer);
|
||||
}, $packet);
|
||||
$this->queue[] = $packet;
|
||||
return strlen($packet->buffer);
|
||||
}
|
||||
|
||||
public function run(){
|
||||
$autoloader = new \SplClassLoader();
|
||||
$autoloader->add("PocketMine", array(
|
||||
\PocketMine\PATH . "src"
|
||||
));
|
||||
$autoloader->register(true);
|
||||
|
||||
$this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
|
||||
socket_set_option($this->socket, SOL_SOCKET, SO_BROADCAST, 1); //Allow sending broadcast messages
|
||||
if(@socket_bind($this->socket, $this->serverip, $this->port) === true){
|
||||
@ -142,10 +138,7 @@ class ThreadedHandler extends \Thread{
|
||||
}
|
||||
|
||||
private function putPacket(){
|
||||
if(($packet = $this->queue->synchronized(function (){
|
||||
return $this->queue->shift();
|
||||
})) instanceof Packet
|
||||
){
|
||||
if(($packet = $this->queue->shift()) instanceof Packet){
|
||||
if($packet instanceof RakNetPacket){
|
||||
$packet->encode();
|
||||
}
|
||||
@ -184,9 +177,7 @@ class ThreadedHandler extends \Thread{
|
||||
$packet->port = $port;
|
||||
$packet->buffer =& $buffer;
|
||||
}
|
||||
$this->packets->synchronized(function (Packet $packet){
|
||||
$this->packets[] = $packet;
|
||||
}, $packet);
|
||||
$this->packets[] = $packet;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -21,11 +21,66 @@
|
||||
|
||||
namespace PocketMine\Network\RakNet;
|
||||
|
||||
use PocketMine\Network;
|
||||
use PocketMine\Network\Packet as NetworkPacket;
|
||||
use PocketMine\Network\Protocol\AddEntityPacket;
|
||||
use PocketMine\Network\Protocol\AddItemEntityPacket;
|
||||
use PocketMine\Network\Protocol\AddMobPacket;
|
||||
use PocketMine\Network\Protocol\AddPaintingPacket;
|
||||
use PocketMine\Network\Protocol\AddPlayerPacket;
|
||||
use PocketMine\Network\Protocol\AdventureSettingsPacket;
|
||||
use PocketMine\Network\Protocol\AnimatePacket;
|
||||
use PocketMine\Network\Protocol\ChatPacket;
|
||||
use PocketMine\Network\Protocol\ChunkDataPacket;
|
||||
use PocketMine\Network\Protocol\ClientConnectPacket;
|
||||
use PocketMine\Network\Protocol\ContainerClosePacket;
|
||||
use PocketMine\Network\Protocol\ContainerOpenPacket;
|
||||
use PocketMine\Network\Protocol\ContainerSetContentPacket;
|
||||
use PocketMine\Network\Protocol\ContainerSetDataPacket;
|
||||
use PocketMine\Network\Protocol\ContainerSetSlotPacket;
|
||||
use PocketMine\Network\Protocol\DataPacket;
|
||||
use PocketMine\Network\Protocol\DisconnectPacket;
|
||||
use PocketMine\Network\Protocol\DropItemPacket;
|
||||
use PocketMine\Network\Protocol\EntityDataPacket;
|
||||
use PocketMine\Network\Protocol\EntityEventPacket;
|
||||
use PocketMine\Network\Protocol\ExplodePacket;
|
||||
use PocketMine\Network\Protocol\HurtArmorPacket;
|
||||
use PocketMine\Network\Protocol\Info as ProtocolInfo;
|
||||
use PocketMine\Network\Protocol\InteractPacket;
|
||||
use PocketMine\Network\Protocol\LevelEventPacket;
|
||||
use PocketMine\Network\Protocol\LoginPacket;
|
||||
use PocketMine\Network\Protocol\LoginStatusPacket;
|
||||
use PocketMine\Network\Protocol\MessagePacket;
|
||||
use PocketMine\Network\Protocol\MoveEntityPacket;
|
||||
use PocketMine\Network\Protocol\MoveEntityPacket_PosRot;
|
||||
use PocketMine\Network\Protocol\MovePlayerPacket;
|
||||
use PocketMine\Network\Protocol\PingPacket;
|
||||
use PocketMine\Network\Protocol\PlayerActionPacket;
|
||||
use PocketMine\Network\Protocol\PlayerArmorEquipmentPacket;
|
||||
use PocketMine\Network\Protocol\PlayerEquipmentPacket;
|
||||
use PocketMine\Network\Protocol\PongPacket;
|
||||
use PocketMine\Network\Protocol\ReadyPacket;
|
||||
use PocketMine\Network\Protocol\RemoveBlockPacket;
|
||||
use PocketMine\Network\Protocol\RemoveEntityPacket;
|
||||
use PocketMine\Network\Protocol\RemovePlayerPacket;
|
||||
use PocketMine\Network\Protocol\RequestChunkPacket;
|
||||
use PocketMine\Network\Protocol\RespawnPacket;
|
||||
use PocketMine\Network\Protocol\RotateHeadPacket;
|
||||
use PocketMine\Network\Protocol\SendInventoryPacket;
|
||||
use PocketMine\Network\Protocol\ServerHandshakePacket;
|
||||
use PocketMine\Network\Protocol\SetEntityDataPacket;
|
||||
use PocketMine\Network\Protocol\SetEntityMotionPacket;
|
||||
use PocketMine\Network\Protocol\SetHealthPacket;
|
||||
use PocketMine\Network\Protocol\SetSpawnPositionPacket;
|
||||
use PocketMine\Network\Protocol\SetTimePacket;
|
||||
use PocketMine\Network\Protocol\StartGamePacket;
|
||||
use PocketMine\Network\Protocol\TakeItemEntityPacket;
|
||||
use PocketMine\Network\Protocol\TileEventPacket;
|
||||
use PocketMine\Network\Protocol\UnknownPacket;
|
||||
use PocketMine\Network\Protocol\UpdateBlockPacket;
|
||||
use PocketMine\Network\Protocol\UseItemPacket;
|
||||
use PocketMine\Utils\Utils;
|
||||
|
||||
class Packet extends Network\Packet{
|
||||
class Packet extends NetworkPacket{
|
||||
private $packetID;
|
||||
private $offset = 1;
|
||||
public $data = array();
|
||||
@ -196,166 +251,166 @@ class Packet extends Network\Packet{
|
||||
}
|
||||
switch($pid){
|
||||
case ProtocolInfo::PING_PACKET:
|
||||
$data = new Network\Protocol\PingPacket;
|
||||
$data = new PingPacket();
|
||||
break;
|
||||
case ProtocolInfo::PONG_PACKET:
|
||||
$data = new Network\Protocol\PongPacket;
|
||||
$data = new PongPacket();
|
||||
break;
|
||||
case ProtocolInfo::CLIENT_CONNECT_PACKET:
|
||||
$data = new Network\Protocol\ClientConnectPacket;
|
||||
$data = new ClientConnectPacket();
|
||||
break;
|
||||
case ProtocolInfo::SERVER_HANDSHAKE_PACKET:
|
||||
$data = new Network\Protocol\ServerHandshakePacket;
|
||||
$data = new ServerHandshakePacket();
|
||||
break;
|
||||
case ProtocolInfo::DISCONNECT_PACKET:
|
||||
$data = new Network\Protocol\DisconnectPacket;
|
||||
$data = new DisconnectPacket();
|
||||
break;
|
||||
case ProtocolInfo::LOGIN_PACKET:
|
||||
$data = new Network\Protocol\LoginPacket;
|
||||
$data = new LoginPacket();
|
||||
break;
|
||||
case ProtocolInfo::LOGIN_STATUS_PACKET:
|
||||
$data = new Network\Protocol\LoginStatusPacket;
|
||||
$data = new LoginStatusPacket();
|
||||
break;
|
||||
case ProtocolInfo::READY_PACKET:
|
||||
$data = new Network\Protocol\ReadyPacket;
|
||||
$data = new ReadyPacket();
|
||||
break;
|
||||
case ProtocolInfo::MESSAGE_PACKET:
|
||||
$data = new Network\Protocol\MessagePacket;
|
||||
$data = new MessagePacket();
|
||||
break;
|
||||
case ProtocolInfo::SET_TIME_PACKET:
|
||||
$data = new Network\Protocol\SetTimePacket;
|
||||
$data = new SetTimePacket();
|
||||
break;
|
||||
case ProtocolInfo::START_GAME_PACKET:
|
||||
$data = new Network\Protocol\StartGamePacket;
|
||||
$data = new StartGamePacket();
|
||||
break;
|
||||
case ProtocolInfo::ADD_MOB_PACKET:
|
||||
$data = new Network\Protocol\AddMobPacket;
|
||||
$data = new AddMobPacket();
|
||||
break;
|
||||
case ProtocolInfo::ADD_PLAYER_PACKET:
|
||||
$data = new Network\Protocol\AddPlayerPacket;
|
||||
$data = new AddPlayerPacket();
|
||||
break;
|
||||
case ProtocolInfo::REMOVE_PLAYER_PACKET:
|
||||
$data = new Network\Protocol\RemovePlayerPacket;
|
||||
$data = new RemovePlayerPacket();
|
||||
break;
|
||||
case ProtocolInfo::ADD_ENTITY_PACKET:
|
||||
$data = new Network\Protocol\AddEntityPacket;
|
||||
$data = new AddEntityPacket();
|
||||
break;
|
||||
case ProtocolInfo::REMOVE_ENTITY_PACKET:
|
||||
$data = new Network\Protocol\RemoveEntityPacket;
|
||||
$data = new RemoveEntityPacket();
|
||||
break;
|
||||
case ProtocolInfo::ADD_ITEM_ENTITY_PACKET:
|
||||
$data = new Network\Protocol\AddItemEntityPacket;
|
||||
$data = new AddItemEntityPacket();
|
||||
break;
|
||||
case ProtocolInfo::TAKE_ITEM_ENTITY_PACKET:
|
||||
$data = new Network\Protocol\TakeItemEntityPacket;
|
||||
$data = new TakeItemEntityPacket();
|
||||
break;
|
||||
case ProtocolInfo::MOVE_ENTITY_PACKET:
|
||||
$data = new Network\Protocol\MoveEntityPacket;
|
||||
$data = new MoveEntityPacket();
|
||||
break;
|
||||
case ProtocolInfo::MOVE_ENTITY_PACKET_POSROT:
|
||||
$data = new Network\Protocol\MoveEntityPacket_PosRot;
|
||||
$data = new MoveEntityPacket_PosRot();
|
||||
break;
|
||||
case ProtocolInfo::ROTATE_HEAD_PACKET:
|
||||
$data = new Network\Protocol\RotateHeadPacket;
|
||||
$data = new RotateHeadPacket();
|
||||
break;
|
||||
case ProtocolInfo::MOVE_PLAYER_PACKET:
|
||||
$data = new Network\Protocol\MovePlayerPacket;
|
||||
$data = new MovePlayerPacket();
|
||||
break;
|
||||
case ProtocolInfo::REMOVE_BLOCK_PACKET:
|
||||
$data = new Network\Protocol\RemoveBlockPacket;
|
||||
$data = new RemoveBlockPacket();
|
||||
break;
|
||||
case ProtocolInfo::UPDATE_BLOCK_PACKET:
|
||||
$data = new Network\Protocol\UpdateBlockPacket;
|
||||
$data = new UpdateBlockPacket();
|
||||
break;
|
||||
case ProtocolInfo::ADD_PAINTING_PACKET:
|
||||
$data = new Network\Protocol\AddPaintingPacket;
|
||||
$data = new AddPaintingPacket();
|
||||
break;
|
||||
case ProtocolInfo::EXPLODE_PACKET:
|
||||
$data = new Network\Protocol\ExplodePacket;
|
||||
$data = new ExplodePacket();
|
||||
break;
|
||||
case ProtocolInfo::LEVEL_EVENT_PACKET:
|
||||
$data = new Network\Protocol\LevelEventPacket;
|
||||
$data = new LevelEventPacket();
|
||||
break;
|
||||
case ProtocolInfo::TILE_EVENT_PACKET:
|
||||
$data = new Network\Protocol\TileEventPacket;
|
||||
$data = new TileEventPacket();
|
||||
break;
|
||||
case ProtocolInfo::ENTITY_EVENT_PACKET:
|
||||
$data = new Network\Protocol\EntityEventPacket;
|
||||
$data = new EntityEventPacket();
|
||||
break;
|
||||
case ProtocolInfo::REQUEST_CHUNK_PACKET:
|
||||
$data = new Network\Protocol\RequestChunkPacket;
|
||||
$data = new RequestChunkPacket();
|
||||
break;
|
||||
case ProtocolInfo::CHUNK_DATA_PACKET:
|
||||
$data = new Network\Protocol\ChunkDataPacket;
|
||||
$data = new ChunkDataPacket();
|
||||
break;
|
||||
case ProtocolInfo::PLAYER_EQUIPMENT_PACKET:
|
||||
$data = new Network\Protocol\PlayerEquipmentPacket;
|
||||
$data = new PlayerEquipmentPacket();
|
||||
break;
|
||||
case ProtocolInfo::PLAYER_ARMOR_EQUIPMENT_PACKET:
|
||||
$data = new Network\Protocol\PlayerArmorEquipmentPacket;
|
||||
$data = new PlayerArmorEquipmentPacket();
|
||||
break;
|
||||
case ProtocolInfo::INTERACT_PACKET:
|
||||
$data = new Network\Protocol\InteractPacket;
|
||||
$data = new InteractPacket();
|
||||
break;
|
||||
case ProtocolInfo::USE_ITEM_PACKET:
|
||||
$data = new Network\Protocol\UseItemPacket;
|
||||
$data = new UseItemPacket();
|
||||
break;
|
||||
case ProtocolInfo::PLAYER_ACTION_PACKET:
|
||||
$data = new Network\Protocol\PlayerActionPacket;
|
||||
$data = new PlayerActionPacket();
|
||||
break;
|
||||
case ProtocolInfo::HURT_ARMOR_PACKET:
|
||||
$data = new Network\Protocol\HurtArmorPacket;
|
||||
$data = new HurtArmorPacket();
|
||||
break;
|
||||
case ProtocolInfo::SET_ENTITY_DATA_PACKET:
|
||||
$data = new Network\Protocol\SetEntityDataPacket;
|
||||
$data = new SetEntityDataPacket();
|
||||
break;
|
||||
case ProtocolInfo::SET_ENTITY_MOTION_PACKET:
|
||||
$data = new Network\Protocol\SetEntityMotionPacket;
|
||||
$data = new SetEntityMotionPacket();
|
||||
break;
|
||||
case ProtocolInfo::SET_HEALTH_PACKET:
|
||||
$data = new Network\Protocol\SetHealthPacket;
|
||||
$data = new SetHealthPacket();
|
||||
break;
|
||||
case ProtocolInfo::SET_SPAWN_POSITION_PACKET:
|
||||
$data = new Network\Protocol\SetSpawnPositionPacket;
|
||||
$data = new SetSpawnPositionPacket();
|
||||
break;
|
||||
case ProtocolInfo::ANIMATE_PACKET:
|
||||
$data = new Network\Protocol\AnimatePacket;
|
||||
$data = new AnimatePacket();
|
||||
break;
|
||||
case ProtocolInfo::RESPAWN_PACKET:
|
||||
$data = new Network\Protocol\RespawnPacket;
|
||||
$data = new RespawnPacket();
|
||||
break;
|
||||
case ProtocolInfo::SEND_INVENTORY_PACKET:
|
||||
$data = new Network\Protocol\SendInventoryPacket;
|
||||
$data = new SendInventoryPacket();
|
||||
break;
|
||||
case ProtocolInfo::DROP_ITEM_PACKET:
|
||||
$data = new Network\Protocol\DropItemPacket;
|
||||
$data = new DropItemPacket();
|
||||
break;
|
||||
case ProtocolInfo::CONTAINER_OPEN_PACKET:
|
||||
$data = new Network\Protocol\ContainerOpenPacket;
|
||||
$data = new ContainerOpenPacket();
|
||||
break;
|
||||
case ProtocolInfo::CONTAINER_CLOSE_PACKET:
|
||||
$data = new Network\Protocol\ContainerClosePacket;
|
||||
$data = new ContainerClosePacket();
|
||||
break;
|
||||
case ProtocolInfo::CONTAINER_SET_SLOT_PACKET:
|
||||
$data = new Network\Protocol\ContainerSetSlotPacket;
|
||||
$data = new ContainerSetSlotPacket();
|
||||
break;
|
||||
case ProtocolInfo::CONTAINER_SET_DATA_PACKET:
|
||||
$data = new Network\Protocol\ContainerSetDataPacket;
|
||||
$data = new ContainerSetDataPacket();
|
||||
break;
|
||||
case ProtocolInfo::CONTAINER_SET_CONTENT_PACKET:
|
||||
$data = new Network\Protocol\ContainerSetContentPacket;
|
||||
$data = new ContainerSetContentPacket();
|
||||
break;
|
||||
case ProtocolInfo::CHAT_PACKET:
|
||||
$data = new Network\Protocol\ChatPacket;
|
||||
$data = new ChatPacket();
|
||||
break;
|
||||
case ProtocolInfo::ADVENTURE_SETTINGS_PACKET:
|
||||
$data = new Network\Protocol\AdventureSettingsPacket;
|
||||
$data = new AdventureSettingsPacket();
|
||||
break;
|
||||
case ProtocolInfo::ENTITY_DATA_PACKET:
|
||||
$data = new Network\Protocol\EntityDataPacket;
|
||||
$data = new EntityDataPacket();
|
||||
break;
|
||||
default:
|
||||
$data = new Network\Protocol\UnknownPacket();
|
||||
$data = new UnknownPacket();
|
||||
$data->packetID = $pid;
|
||||
break;
|
||||
}
|
||||
@ -468,7 +523,7 @@ class Packet extends Network\Packet{
|
||||
|
||||
}
|
||||
|
||||
private function encodeDataPacket(Network\Protocol\DataPacket $pk){
|
||||
private function encodeDataPacket(DataPacket $pk){
|
||||
$this->putByte(($pk->reliability << 5) | ($pk->hasSplit > 0 ? 0b00010000 : 0));
|
||||
$this->putShort(strlen($pk->buffer) << 3);
|
||||
if($pk->reliability === 2
|
||||
|
@ -45,7 +45,7 @@ class ServerScheduler{
|
||||
protected $currentTick = 0;
|
||||
|
||||
public function __construct(){
|
||||
$this->queue = new \SplPriorityQueue();
|
||||
$this->queue = new TaskQueue();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -165,14 +165,13 @@ class ServerScheduler{
|
||||
*/
|
||||
public function mainThreadHeartbeat($currentTick){
|
||||
$this->currentTick = $currentTick;
|
||||
|
||||
while($this->isReady($this->currentTick)){
|
||||
$task = $this->queue->extract();
|
||||
if($task->isCancelled()){
|
||||
unset($this->tasks[$task->getTaskId()]);
|
||||
continue;
|
||||
}else{
|
||||
$task->run();
|
||||
$task->run($this->currentTick);
|
||||
}
|
||||
if($task->isRepeating()){
|
||||
$task->setNextRun($this->currentTick + $task->getPeriod());
|
||||
|
@ -47,7 +47,7 @@ abstract class Task{
|
||||
/**
|
||||
* @param TaskHandler $taskHandler
|
||||
*/
|
||||
public final function setHandler(TaskHandler $taskHandler){
|
||||
public final function setHandler($taskHandler){
|
||||
if($this->taskHandler === null or $taskHandler === null){
|
||||
$this->taskHandler = $taskHandler;
|
||||
}
|
||||
|
29
src/PocketMine/scheduler/TaskQueue.php
Normal file
29
src/PocketMine/scheduler/TaskQueue.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
*
|
||||
* ____ _ _ __ __ _ __ __ ____
|
||||
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
||||
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
||||
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
||||
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* @author PocketMine Team
|
||||
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
namespace PocketMine\Scheduler;
|
||||
|
||||
class TaskQueue extends \SplPriorityQueue{
|
||||
|
||||
public function compare($priority1, $priority2){
|
||||
return (int) -($priority1 - $priority2);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user