mirror of
				https://github.com/slawkens/myaac.git
				synced 2025-10-29 23:16:23 +01:00 
			
		
		
		
	 9d664d3577
			
		
	
	9d664d3577
	
	
	
		
			
			* Part 1 Removing closing tags when no HTML or other output comes after the last PHP codeblock. * Further removals * nothing --------- Co-authored-by: slawkens <slawkens@gmail.com>
		
			
				
	
	
		
			738 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			738 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**#@+
 | |
|  * @version 0.1.2
 | |
|  * @since 0.1.2
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @package POT
 | |
|  * @version 0.1.4
 | |
|  * @author Wrzasq <wrzasq@gmail.com>
 | |
|  * @copyright 2007 - 2008 (C) by Wrzasq
 | |
|  * @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * OTAdmin protocol client.
 | |
|  * 
 | |
|  * @package POT
 | |
|  * @version 0.1.4
 | |
|  * @property-read bool $requiresLogin {@link OTS_Admin::requiresLogin() requiresLogin()} wrapper.
 | |
|  * @property-read bool $requiresEncryption {@link OTS_Admin::requiresEncryption() requiresEncryption()} wrapper.
 | |
|  * @property-read bool $usesRSA1024XTEA {@link OTS_Admin::usesRSA1024XTEA() usesRSA1024XTEA()} wrapper.
 | |
|  * @property-read int $ping Ping time.
 | |
|  * @property-write string $login Logs in with given password.
 | |
|  * @property-write string $broadcast Sends given broadcast message.
 | |
|  * @property-write string $kick Kicks player with given name from server.
 | |
|  * @tutorial POT/OTAdmin.pkg
 | |
|  * @example examples/admin.php admin.php
 | |
|  */
 | |
| class OTS_Admin
 | |
| {
 | |
| /**
 | |
|  * User login.
 | |
|  */
 | |
|     const REQUEST_LOGIN = 1;
 | |
| /**
 | |
|  * Encryption packet.
 | |
|  */
 | |
|     const REQUEST_ENCRYPTION = 2;
 | |
| /**
 | |
|  * RSA key exchange.
 | |
|  */
 | |
|     const REQUEST_KEY_EXCHANGE = 3;
 | |
| /**
 | |
|  * OTAdmin commnd.
 | |
|  */
 | |
|     const REQUEST_COMMAND = 4;
 | |
| /**
 | |
|  * Ping.
 | |
|  */
 | |
|     const REQUEST_PING = 5;
 | |
| 
 | |
| /**
 | |
|  * Hello respond.
 | |
|  */
 | |
|     const RESPOND_HELLO = 1;
 | |
| /**
 | |
|  * Keys exchange success.
 | |
|  */
 | |
|     const RESPOND_KEY_EXCHANGE_OK = 2;
 | |
| /**
 | |
|  * Keys exchange failed.
 | |
|  */
 | |
|     const RESPOND_KEY_EXCHANGE_FAILED = 3;
 | |
| /**
 | |
|  * Login success.
 | |
|  */
 | |
|     const RESPOND_LOGIN_OK = 4;
 | |
| /**
 | |
|  * Login incorrect.
 | |
|  */
 | |
|     const RESPOND_LOGIN_FAILED = 5;
 | |
| /**
 | |
|  * Command success.
 | |
|  */
 | |
|     const RESPOND_COMMAND_OK = 6;
 | |
| /**
 | |
|  * Command failed.
 | |
|  */
 | |
|     const RESPOND_COMMAND_FAILED = 7;
 | |
| /**
 | |
|  * Encryption initialization success.
 | |
|  */
 | |
|     const RESPOND_ENCRYPTION_OK = 8;
 | |
| /**
 | |
|  * Encryption initialization failed.
 | |
|  */
 | |
|     const RESPOND_ENCRYPTION_FAILED = 9;
 | |
| /**
 | |
|  * Ping success.
 | |
|  */
 | |
|     const RESPOND_PING_OK = 10;
 | |
| /**
 | |
|  * Message.
 | |
|  */
 | |
|     const RESPOND_MESSAGE = 11;
 | |
| /**
 | |
|  * Error.
 | |
|  */
 | |
|     const RESPOND_ERROR = 12;
 | |
| 
 | |
| /**
 | |
|  * Broadcast message.
 | |
|  */
 | |
|     const COMMAND_BROADCAST = 1;
 | |
| /**
 | |
|  * Closes server.
 | |
|  */
 | |
|     const COMMAND_CLOSE_SERVER = 2;
 | |
| /**
 | |
|  * Pays all rented shouses.
 | |
|  */
 | |
|     const COMMAND_PAY_HOUSES = 3;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_OPEN_SERVER = 4;
 | |
| /**
 | |
|  * Shutdowns the server.
 | |
|  */
 | |
|     const COMMAND_SHUTDOWN_SERVER = 5;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_RELOAD_SCRIPTS = 6;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_PLAYER_INFO = 7;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_GETONLINE = 8;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_KICK = 9;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_BAN_MANAGER = 10;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_SERVER_INFO = 11;
 | |
| /**
 | |
|  * Not supported in current OTAdmin imlpementation.
 | |
|  */
 | |
|     const COMMAND_GETHOUSE = 12;
 | |
| 
 | |
| /**
 | |
|  * Server requires login.
 | |
|  */
 | |
|     const REQUIRE_LOGIN = 1;
 | |
| /**
 | |
|  * Server requires encryption.
 | |
|  */
 | |
|     const REQUIRE_ENCRYPTION = 2;
 | |
| 
 | |
| /**
 | |
|  * Server uses XTEA encryption, XTEA key is being sent in 1024bit RSA encrypted packet.
 | |
|  */
 | |
|     const ENCRYPTION_RSA1024XTEA = 1;
 | |
| 
 | |
| /**
 | |
|  * Socket handle.
 | |
|  * 
 | |
|  * @var resource
 | |
|  */
 | |
|     private $socket;
 | |
| 
 | |
| /**
 | |
|  * Server security policy.
 | |
|  * 
 | |
|  * @var int
 | |
|  */
 | |
|     private $policy;
 | |
| 
 | |
| /**
 | |
|  * Protocol options.
 | |
|  * 
 | |
|  * @var int
 | |
|  */
 | |
|     private $options;
 | |
| 
 | |
| /**
 | |
|  * Packets cipher.
 | |
|  * 
 | |
|  * @var IOTS_Cipher
 | |
|  */
 | |
|     private $cipher;
 | |
| 
 | |
| /**
 | |
|  * Host address for session sleep/wakeup.
 | |
|  * 
 | |
|  * @var string
 | |
|  */
 | |
|     private $host;
 | |
| 
 | |
| /**
 | |
|  * Port number for session sleep/wakeup.
 | |
|  * 
 | |
|  * @var int
 | |
|  */
 | |
|     private $port;
 | |
| 
 | |
| /**
 | |
|  * Creates new connection to OTServ administration backend.
 | |
|  * 
 | |
|  * <p>
 | |
|  * This method automaticly handles RSA and XTEA encryption if such method is required by server including keys negotiations.
 | |
|  * </p>
 | |
|  * 
 | |
|  * <p>
 | |
|  * After connecting you should check {@link OTS_Admin::requiresLogin() if server requires login}.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @param string $host Target server.
 | |
|  * @param int $port Port (7171 by default).
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function __construct($host, $port = 7171)
 | |
|     {
 | |
|         // saves connection sessint
 | |
|         $this->host = $host;
 | |
|         $this->port = $port;
 | |
| 
 | |
|         // opens connection
 | |
|         $this->socket = fsockopen($this->host, $this->port);
 | |
| 
 | |
|         // 254 = OTAdmin protocol identifier
 | |
|         $message = new OTS_Buffer( chr(254) );
 | |
| 
 | |
|         // sends initial packet
 | |
|         $respond = $this->send($message);
 | |
|         $message->reset();
 | |
| 
 | |
|         $byte = $respond->getChar();
 | |
| 
 | |
|         // checks if it's HELLO packet
 | |
|         if($byte != self::RESPOND_HELLO)
 | |
|         {
 | |
|             throw new E_OTS_ErrorCode($byte);
 | |
|         }
 | |
| 
 | |
|         // skips respond signature and protocol version
 | |
|         $respond->getLong();
 | |
|         $respond->getString();
 | |
| 
 | |
|         // saves protocol settings
 | |
|         $this->policy = $respond->getShort();
 | |
|         $this->options = $respond->getLong();
 | |
| 
 | |
|         // handles encryption initialisation if required
 | |
|         if( $this->requiresEncryption() && $this->usesRSA1024XTEA() )
 | |
|         {
 | |
|             // requests public key
 | |
|             $message->putChar(self::REQUEST_KEY_EXCHANGE);
 | |
|             $message->putChar(self::ENCRYPTION_RSA1024XTEA);
 | |
|             $respond = $this->send($message);
 | |
|             $message->reset();
 | |
| 
 | |
|             $byte = $respond->getChar();
 | |
| 
 | |
|             // checks if it succeded
 | |
|             if($byte != self::RESPOND_KEY_EXCHANGE_OK)
 | |
|             {
 | |
|                 throw new E_OTS_ErrorCode($byte, $respond->getString() );
 | |
|             }
 | |
| 
 | |
|             // we support only RSA 1024bit encryption for XTEA key sending
 | |
|             if( $respond->getChar() != self::ENCRYPTION_RSA1024XTEA)
 | |
|             {
 | |
|                 throw new E_OTS_ErrorCode($byte);
 | |
|             }
 | |
| 
 | |
|             // reads binary form of public key (128 bytes)
 | |
|             $key = OTS_BinaryTools::bin2Int( strrev( $respond->getString(128) ) );
 | |
| 
 | |
|             // creates RSA cipher
 | |
|             // as we have ready N computer here and we don't compute it by ourselves we can use a little hack, to save N as P * Q we will use P = N and Q = 1
 | |
|             $rsa = new OTS_RSA($key, '1');
 | |
| 
 | |
|             $key = '';
 | |
| 
 | |
|             // generates random XTEA key
 | |
|             for($i = 0; $i < 4; $i++)
 | |
|             {
 | |
|                 $key .= pack('L', rand(0, 4294967295) );
 | |
|             }
 | |
| 
 | |
|             $xtea = new OTS_XTEA($key);
 | |
| 
 | |
|             // sends XTEA key
 | |
|             $message->putChar(self::REQUEST_ENCRYPTION);
 | |
|             $message->putChar(self::ENCRYPTION_RSA1024XTEA);
 | |
|             $message->putString( $rsa->encrypt( chr(0) . $key), false);
 | |
| 
 | |
|             // we can't bind cipher yet since only respnd will be XTEA encrypted
 | |
|             $respond = new OTS_Buffer( $xtea->decrypt( $this->send($message)->getBuffer() ) );
 | |
| 
 | |
|             $byte = $respond->getChar();
 | |
| 
 | |
|             // checks if encryption negotation succeeded
 | |
|             if($byte != self::RESPOND_ENCRYPTION_OK)
 | |
|             {
 | |
|                 throw new E_OTS_ErrorCode($byte, $respond->getString());
 | |
|             }
 | |
| 
 | |
|             // saves encryption/decryption cipher
 | |
|             $this->cipher = $xtea;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Checks if protocol requires login.
 | |
|  * 
 | |
|  * @return bool True if protocol requires user login.
 | |
|  */
 | |
|     public function requiresLogin()
 | |
|     {
 | |
|         return ($this->policy & self::REQUIRE_LOGIN) == self::REQUIRE_LOGIN;
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Checks if protocol requires encryption.
 | |
|  * 
 | |
|  * @return bool True if protocol requires encryption.
 | |
|  */
 | |
|     public function requiresEncryption()
 | |
|     {
 | |
|         return ($this->policy & self::REQUIRE_ENCRYPTION) == self::REQUIRE_ENCRYPTION;
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Checks if protocol requires XTEA encryption with RSA-encrypted key.
 | |
|  * 
 | |
|  * @return bool True if protocol requires that encryption.
 | |
|  */
 | |
|     public function usesRSA1024XTEA()
 | |
|     {
 | |
|         return ($this->options & self::ENCRYPTION_RSA1024XTEA) == self::ENCRYPTION_RSA1024XTEA;
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Sends OTAdmin packet.
 | |
|  * 
 | |
|  * @param OTS_Buffer $message Packet to be sent.
 | |
|  * @return OTS_Buffer Server respond.
 | |
|  * @throws E_OTS_ErrorCode When receive RESPOND_ERROR message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function send(OTS_Buffer $message)
 | |
|     {
 | |
|         $message = $message->getBuffer();
 | |
| 
 | |
|         // encrypts message if required
 | |
|         if( isset($this->cipher) )
 | |
|         {
 | |
|             $message = $this->cipher->encrypt($message);
 | |
|         }
 | |
| 
 | |
|         $message = pack('v', strlen($message) ) . $message;
 | |
| 
 | |
|         fputs($this->socket, $message);
 | |
| 
 | |
|         // reads respond length
 | |
|         $length = unpack('v', fgets($this->socket, 3) );
 | |
| 
 | |
|         $buffer = fgets($this->socket, $length[1] + 1);
 | |
| 
 | |
|         // decrypts buffer if required
 | |
|         if(  isset($this->cipher) )
 | |
|         {
 | |
|             $buffer = $this->cipher->decrypt($buffer);
 | |
|         }
 | |
| 
 | |
|         // checks for error code
 | |
|         $respond = new OTS_Buffer($buffer);
 | |
| 
 | |
|         if( $respond->getChar() == self::RESPOND_ERROR)
 | |
|         {
 | |
|             throw new E_OTS_ErrorCode(self::RESPOND_ERROR, $respond->getString() );
 | |
|         }
 | |
| 
 | |
|         // returns respond
 | |
|         $respond->setPos(0);
 | |
|         return $respond;
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Closes connection.
 | |
|  */
 | |
|     public function __destruct()
 | |
|     {
 | |
|         fclose($this->socket);
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Magic PHP5 method.
 | |
|  * 
 | |
|  * @version 0.1.3
 | |
|  * @since 0.1.3
 | |
|  * @param string $name Property name.
 | |
|  * @param mixed $value Property value.
 | |
|  * @throws OutOfBoundsException For non-supported properties.
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function __get($name)
 | |
|     {
 | |
|         switch($name)
 | |
|         {
 | |
|             case 'requiresLogin':
 | |
|                 return $this->requiresLogin();
 | |
| 
 | |
|             case 'requiresEncryption':
 | |
|                 return $this->requiresEncryption();
 | |
| 
 | |
|             case 'usesRSA1024XTEA':
 | |
|                 return $this->usesRSA1024XTEA();
 | |
| 
 | |
|             case 'ping':
 | |
|                 return $this->ping();
 | |
| 
 | |
|             default:
 | |
|                 throw new OutOfBoundsException();
 | |
|         }
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Magic PHP5 method.
 | |
|  * 
 | |
|  * @version 0.1.4
 | |
|  * @since 0.1.3
 | |
|  * @param string $name Property name.
 | |
|  * @param mixed $value Property value.
 | |
|  * @throws OutOfBoundsException For non-supported properties.
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function __set($name, $value)
 | |
|     {
 | |
|         switch($name)
 | |
|         {
 | |
|             case 'login':
 | |
|                 $this->login($value);
 | |
|                 break;
 | |
| 
 | |
|             case 'broadcast':
 | |
|                 $this->broadcast($value);
 | |
|                 break;
 | |
| 
 | |
|             case 'kick':
 | |
|                 $this->kick($value);
 | |
|                 break;
 | |
| 
 | |
|             default:
 | |
|                 throw new OutOfBoundsException();
 | |
|         }
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Logs into server.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Call this method if after connection is established login required flag is set.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @param string $password Admin password.
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function login($password)
 | |
|     {
 | |
|         // password packet
 | |
|         $message = new OTS_Buffer();
 | |
|         $message->putChar(self::REQUEST_LOGIN);
 | |
|         $message->putString($password);
 | |
| 
 | |
|         // reads respond
 | |
|         $message = $this->send($message);
 | |
| 
 | |
|         $byte = $message->getChar();
 | |
| 
 | |
|         // checks respond
 | |
|         if($byte != self::RESPOND_LOGIN_OK)
 | |
|         {
 | |
|             throw new E_OTS_ErrorCode($byte, $message->getString());
 | |
|         }
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Ping command.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Note: This methods calculates ping time based on {@link OTS_Admin::send() OTS_Admin::send()} sub-call. This means ping time will be time used for entire seding operation including packet encryption, packing, unpacking and decryption.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @return int Ping time.
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function ping()
 | |
|     {
 | |
|         // constructs message
 | |
|         $message = new OTS_Buffer();
 | |
|         $message->putChar(self::REQUEST_PING);
 | |
| 
 | |
|         // start
 | |
|         $ping = microtime(true);
 | |
|         $message = $this->send($message);
 | |
| 
 | |
|         // stop
 | |
|         $ping = microtime(true) - $ping;
 | |
| 
 | |
|         $byte = $message->getChar();
 | |
| 
 | |
|         // checks if command succeeded
 | |
|         if($byte != self::RESPOND_PING_OK)
 | |
|         {
 | |
|             throw new E_OTS_ErrorCode($byte, $respond->getString());
 | |
|         }
 | |
| 
 | |
|         return $ping;
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Sends command message.
 | |
|  * 
 | |
|  * <p>
 | |
|  * This method wraps another buffer within command byte and also checks for command success.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @param OTS_Buffer $message Command to be send.
 | |
|  * @return OTS_Buffer Respond.
 | |
|  * @throws E_OTS_ErrorCode If failure respond received.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     private function sendCommand(OTS_Buffer $message)
 | |
|     {
 | |
|         // prepends command byte
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::REQUEST_COMMAND);
 | |
|         $buffer->putString( $message->getBuffer(), false);
 | |
| 
 | |
|         // sends command
 | |
|         $buffer = $this->send($buffer);
 | |
|         $byte = $buffer->getChar();
 | |
| 
 | |
|         // checks for error code
 | |
|         if($byte != self::RESPOND_COMMAND_OK)
 | |
|         {
 | |
|             throw new E_OTS_ErrorCode($byte, $buffer->getString() );
 | |
|         }
 | |
| 
 | |
|         // returns respond with reseted position
 | |
|         $buffer->setPos(0);
 | |
|         return $buffer;
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Sends COMMAND_BROADCAST command with given parameter.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Sends broadcast message to all players.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @param string $message Broadcast to be sent.
 | |
|  * @throws E_OTS_ErrorCode If failure respond received.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function broadcast($message)
 | |
|     {
 | |
|         // sends message
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::COMMAND_BROADCAST);
 | |
|         $buffer->putString($message);
 | |
|         $this->sendCommand($buffer);
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Sends COMMAND_CLOSE_SERVER command.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Closes server. This command closes server for connections to enable maintenance but doesn't shut it down.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @throws E_OTS_ErrorCode If failure respond received.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function close()
 | |
|     {
 | |
|         // sends message
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::COMMAND_CLOSE_SERVER);
 | |
|         $this->sendCommand($buffer);
 | |
|     }
 | |
| 
 | |
|     public function open()
 | |
|     {
 | |
|         // sends message
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::COMMAND_OPEN_SERVER);
 | |
|         $this->sendCommand($buffer);
 | |
|     }
 | |
| 	
 | |
|     public function reloadScripts($type)
 | |
|     {
 | |
|         // sends message
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::COMMAND_RELOAD_SCRIPTS);
 | |
| 		$buffer->putChar($type);
 | |
|         $this->sendCommand($buffer);
 | |
|     }
 | |
| /**
 | |
|  * Sends COMMAND_PAY_HOUSES command.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Takes fees for all rented houses.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @throws E_OTS_ErrorCode If failure respond received.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function payHouses()
 | |
|     {
 | |
|         // sends message
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::COMMAND_PAY_HOUSES);
 | |
|         $this->sendCommand($buffer);
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Sends COMMAND_SHUTDOWN_SERVER command.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Shutdowns server. This command closes server thread.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @throws E_OTS_ErrorCode If failure respond received.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function shutdown()
 | |
|     {
 | |
|         // sends message
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::COMMAND_SHUTDOWN_SERVER);
 | |
|         $this->sendCommand($buffer);
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Sends COMMAND_KICK command with given parameter.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Kicks given player from server.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @version 0.1.4
 | |
|  * @since 0.1.4
 | |
|  * @param string $name Name of player to be kicked.
 | |
|  * @throws E_OTS_ErrorCode If failure respond received.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function kick($name)
 | |
|     {
 | |
|         // sends message
 | |
|         $buffer = new OTS_Buffer();
 | |
|         $buffer->putChar(self::COMMAND_KICK);
 | |
|         $buffer->putString($name);
 | |
|         $this->sendCommand($buffer);
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Magic PHP5 method.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Allows object importing from {@link http://www.php.net/manual/en/function.var-export.php var_export()}.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @param array $properties List of object properties.
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public static function __set_state($properties)
 | |
|     {
 | |
|         return new self($properties['host'], $properties['port']);
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Magic PHP5 method.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Creates new socket connection to server.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function __clone()
 | |
|     {
 | |
|         $this->__construct($this->host, $this->port);
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Magic PHP5 method.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Allows object serialisation.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @return array List of properties that should be saved.
 | |
|  */
 | |
|     public function __sleep()
 | |
|     {
 | |
|         return array('host', 'port');
 | |
|     }
 | |
| 
 | |
| /**
 | |
|  * Magic PHP5 method.
 | |
|  * 
 | |
|  * <p>
 | |
|  * Allows object unserialisation.
 | |
|  * </p>
 | |
|  * 
 | |
|  * @throws E_OTS_ErrorCode When receive failed respond or unexpected message.
 | |
|  * @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
 | |
|  */
 | |
|     public function __wakeup()
 | |
|     {
 | |
|         $this->__construct($this->host, $this->port);
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**#@-*/
 |