diff --git a/src/PocketMinecraftServer.php b/src/PocketMinecraftServer.php index a7b102b9a..9451c82f0 100644 --- a/src/PocketMinecraftServer.php +++ b/src/PocketMinecraftServer.php @@ -186,8 +186,9 @@ class PocketMinecraftServer{ } public function setType($type = "normal"){ - switch($type){ + switch(trim(strtolower($type))){ case "normal": + case "demo": $this->serverType = "MCCPP;Demo;"; break; case "minecon": diff --git a/src/network/ThreadedUDPSocket.php b/src/network/ThreadedUDPSocket.php new file mode 100644 index 000000000..9191c97fd --- /dev/null +++ b/src/network/ThreadedUDPSocket.php @@ -0,0 +1,111 @@ +server = $server; + $this->port = (int) $port; + $this->d = array($listen, $serverip); + } + + public function isConnected(){ + return (bool) $this->connected; + } + + public function run(){ + $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($this->d[0] !== true){ + $this->connected = true; + $this->unblock(); + }else{ + if(socket_bind($this->socket, $this->d[1], $this->port) === true){ + $this->unblock(); + $this->connected = true; + }else{ + $this->connected = false; + } + } + $this->sendQueue = array(); + $this->receiveQueue = array(); + $this->wait(); + while($this->connected === true){ + if(count($this->receiveQueue) < 1024){ + $buf = ""; + $source = false; + $port = 1; + $len = @socket_recvfrom($this->socket, $buf, 65535, 0, $source, $port); + if($len !== false){ + $this->receiveQueue[] = array($buf, $source, $port, $len); + } + } + if(count($this->sendQueue) > 0){ + $item = array_shift($this->sendQueue); + @socket_sendto($this->socket, $item[0], strlen($item[0]), 0, ($item[1] === false ? $this->server:$item[1]), ($item[2] === false ? $this->port:$item[2])); + } + usleep(1); + } + exit(0); + } + + public function close($error = 125){ + $this->connected = false; + return @socket_close($this->socket); + } + + public function block(){ + socket_set_block($this->socket); + } + + public function unblock(){ + socket_set_nonblock($this->socket); + } + + public function read(){ + if($this->connected === false or count($this->receiveQueue) <= 0){ + return false; + } + return array_shift($this->receiveQueue); + } + + public function write($data, $dest = false, $port = false){ + if($this->connected === false){ + return false; + } + $this->sendQueue[] = array($data, $dest, $port); + return true; + } + +} \ No newline at end of file diff --git a/src/network/UDPSocket.php b/src/network/UDPSocket.php index 7f20bc1c1..12a7f2ec0 100644 --- a/src/network/UDPSocket.php +++ b/src/network/UDPSocket.php @@ -28,43 +28,27 @@ the Free Software Foundation, either version 3 of the License, or class UDPSocket{ - private $encrypt; - var $buffer, $connected, $errors, $sock, $server; + public $connected, $sock, $server; function __construct($server, $port, $listen = false, $serverip = "0.0.0.0"){ - $this->errors = array_fill(88,(125 - 88) + 1, true); $this->server = $server; $this->port = $port; $this->sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_set_option($this->sock, SOL_SOCKET, SO_BROADCAST, 1); //Allow sending broadcast messages if($listen !== true){ $this->connected = true; - $this->buffer = array(); $this->unblock(); }else{ if(socket_bind($this->sock, $serverip, $port) === true){ $this->unblock(); + $this->connected = true; }else{ - console("[ERROR] Couldn't bind to $serverip:".$port, true, true, 0); - die(); + $this->connected = false; } } } - public function listenSocket(){ - $sock = @socket_accept($this->sock); - if($sock !== false){ - $sock = new Socket(false, false, false, $sock); - $sock->unblock(); - return $sock; - } - return false; - } - public function close($error = 125){ $this->connected = false; - if($error !== false){ - console("[ERROR] [Socket] Socket closed, Error $error: ".socket_strerror($error)); - } return @socket_close($this->sock); } @@ -80,8 +64,7 @@ class UDPSocket{ if($this->connected === false){ return false; } - $len = @socket_recvfrom($this->sock, $buf, 65535, 0, $source, $port); - return $len; + return @socket_recvfrom($this->sock, $buf, 65535, 0, $source, $port); } public function write($data, $dest = false, $port = false){ diff --git a/src/utils/TickLoop.php b/src/utils/TickLoop.php deleted file mode 100644 index b765450c2..000000000 --- a/src/utils/TickLoop.php +++ /dev/null @@ -1,49 +0,0 @@ -tick = false; - $this->lastTick = 0; - $this->server = ServerAPI::request(); - } - public function run(){ - while($this->stop !== true){ - usleep(1); - $time = microtime(true); - if($this->lastTick <= ($time - 0.05)){ - $this->lastTick = $time; - $this->tick = true; - $this->wait(); - $this->tick = false; - } - } - exit(0); - } -} \ No newline at end of file