terminate(); unset(self::$instances[$key]); } } /** * @param string $host * @param int $port * @param int $timeout * @param string $user * @param string $password */ protected function __construct($host, $port, $timeout, $user, $password) { $this->xmlrpcClient = new Xmlrpc\ClientMulticall($host, $port, $timeout); $this->authenticate($user, $password); $this->setApiVersion('2013-04-16'); } /** * Close the current socket connexion * Never call this method, use instead DedicatedApi::delete($host, $port) */ protected function terminate() { $this->xmlrpcClient->terminate(); } /** * * Read a Call back on the DedicatedServer and call the method if handle * @param array $methods if empty, every methods will be called on call back, otherwise only the method declared inside. The metho name must be the name of the interface's method */ function executeCallbacks() { $this->xmlrpcClient->readCallbacks(); $calls = $this->xmlrpcClient->getCallbackResponses(); return $calls; } /** * Execute the calls in queue and return the result * TODO Prendre en compte les retours du mutliQuery (via un handler ?) */ function executeMulticall() { $this->xmlrpcClient->multiqueryIgnoreResult(); } /** * Add a call in queur. It will be executed by the next Call from the user to executemulticall * @param string $methodName * @param string $authLevel * @param array $params */ protected function execute($methodName, $params = array(), $multicall = false) { if($multicall) { $this->xmlrpcClient->addCall($methodName, $params); } else { array_unshift($params, $methodName); call_user_func_array(array($this->xmlrpcClient, 'query'), $params); return $this->xmlrpcClient->getResponse(); } } /** * Given the name of a method, return an array of legal signatures. * Each signature is an array of strings. * The first item of each signature is the return type, and any others items are parameter types. * @param string $methodName * @return array */ function methodSignature($methodName) { return $this->execute('system.methodSignature', array($methodName)); } /** * Change the password for the specified login/user. * @param string $username * @param string $password * @return bool * @throws InvalidArgumentException */ function changeAuthPassword($username, $password) { if(!is_string($password)) { throw new InvalidArgumentException('password = '.print_r($password, true)); } if($username != 'User' && $username != 'Admin' && $username != 'SuperAdmin') { throw new InvalidArgumentException('username = '.print_r($username, true)); } return $this->execute(ucfirst(__FUNCTION__), array($username, $password), false); } /** * Allow the GameServer to call you back. * @param bool $enable * @param bool $multicall * @return bool */ function enableCallbacks($enable, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array((bool) $enable), $multicall); } /** * Define the wanted api. * @param string $version * @param bool $multicall * @return bool */ function setApiVersion($version, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array((string) $version), $multicall); } /** * Returns a struct with the Name, Version, Build and ApiVersion of the application remotely controled. * @return Structures\Version * @throws InvalidArgumentException */ function getVersion() { $result = $this->execute(ucfirst(__FUNCTION__)); return Structures\Version::fromArray($result); } function authenticate($username, $password) { return $this->execute(ucfirst(__FUNCTION__), array($username, $password), false); } /** * Call a vote for a cmd. The command is a XML string corresponding to an XmlRpc request. * You can additionally specifiy specific parameters for this vote: a ratio, a time out * and who is voting. Special timeout values: a timeout of '0' means default, '1' means * indefinite; a ratio of '-1' means default; Voters values: '0' means only active players, * '1' means any player, '2' is for everybody, pure spectators included. * @param Structures\Vote $vote * @param double $ratio -1 means default, else ration should be between 0 and 1 * @param int $timeout time to vote in millisecondes, '0' means default * @param int $voters Voters values: '0' means only active players, '1' means any player, '2' is for everybody, pure spectators included * @param bool $multicall * @throws InvalidArgumentException */ function callVote(Structures\Vote $vote, $ratio = 0.5, $timeout = 0, $voters = 1, $multicall = false) { if(is_null($vote)) { throw new InvalidArgumentException('vote must be set'); } if(!is_float($ratio)) { throw new InvalidArgumentException('ratio = '.print_r($ratio, true)); } if(!is_int($timeout)) { throw new InvalidArgumentException('timeout = '.print_r($timeout, true)); } if(!is_int($voters)) { throw new InvalidArgumentException('voters = '.print_r($voters, true)); } if(!is_array($vote->cmdParam)) { throw new InvalidArgumentException('vote->cmdParam = '.print_r($vote->cmdParam, true)); } $tmpCmd = new Xmlrpc\Request($vote->cmdName, $vote->cmdParam); return $this->execute(ucfirst(__FUNCTION__).'Ex', array($tmpCmd->getXml(), $ratio, $timeout, $voters), $multicall); } /** * Call a vote to kick a player. * You can additionally specifiy specific parameters for this vote: a ratio, a time out * and who is voting. Special timeout values: a timeout of '0' means default, '1' means * indefinite; a ratio of '-1' means default; Voters values: '0' means only active players, * '1' means any player, '2' is for everybody, pure spectators included. * @param Structures\Player|string $player Structures\Player or string * @param double $ratio -1 means default, else ration should be between 0 and 1 * @param int $timeout time to vote in millisecondes, '0' means default * @param int $voters Voters values: '0' means only active players, '1' means any player, '2' is for everybody, pure spectators included * @param bool $multicall * @throws InvalidArgumentException */ function callVoteKick($player, $ratio = 0.5, $timeout = 0, $voters = 1, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(!is_float($ratio)) { throw new InvalidArgumentException('ratio = '.print_r($ratio, true)); } if(!is_int($timeout)) { throw new InvalidArgumentException('timeout = '.print_r($timeout, true)); } if(!is_int($voters)) { throw new InvalidArgumentException('voters = '.print_r($voters, true)); } $tmpCmd = new Xmlrpc\Request('Kick', array($login)); return $this->execute('CallVoteEx', array($tmpCmd->getXml(), $ratio, $timeout, $voters), $multicall); } /** * Call a vote to ban a player. * You can additionally specifiy specific parameters for this vote: a ratio, a time out * and who is voting. Special timeout values: a timeout of '0' means default, '1' means * indefinite; a ratio of '-1' means default; Voters values: '0' means only active players, * '1' means any player, '2' is for everybody, pure spectators included. * @param Structures\Player|string $player * @param double $ratio -1 means default, else ration should be between 0 and 1 * @param int $timeout time to vote in millisecondes, '0' means default * @param int $voters Voters values: '0' means only active players, '1' means any player, '2' is for everybody, pure spectators included * @param bool $multicall * @throws InvalidArgumentException */ function callVoteBan($player, $ratio = 0.6, $timeout = 0, $voters = 1, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(!is_float($ratio)) { throw new InvalidArgumentException('ratio = '.print_r($ratio, true)); } if(!is_int($timeout)) { throw new InvalidArgumentException('timeout = '.print_r($timeout, true)); } if(!is_int($voters)) { throw new InvalidArgumentException('voters = '.print_r($voters, true)); } $tmpCmd = new Xmlrpc\Request('Ban', array($login)); return $this->execute('CallVoteEx', array($tmpCmd->getXml(), $ratio, $timeout, $voters), $multicall); } /** * Call a vote to restart the current Map. * You can additionally specifiy specific parameters for this vote: a ratio, a time out * and who is voting. Special timeout values: a timeout of '0' means default, '1' means * indefinite; a ratio of '-1' means default; Voters values: '0' means only active players, * '1' means any player, '2' is for everybody, pure spectators included. * @param double $ratio -1 means default, else ration should be between 0 and 1 * @param int $timeout time to vote in millisecondes, '0' means default * @param int $voters Voters values: '0' means only active players, '1' means any player, '2' is for everybody, pure spectators included * @param bool $multicall * @throws InvalidArgumentException */ function callVoteRestartMap($ratio = 0.5, $timeout = 0, $voters = 1, $multicall = false) { if(!is_float($ratio)) { throw new InvalidArgumentException('ratio = '.print_r($ratio, true)); } if(!is_int($timeout)) { throw new InvalidArgumentException('timeout = '.print_r($timeout, true)); } if(!is_int($voters)) { throw new InvalidArgumentException('voters = '.print_r($voters, true)); } $tmpCmd = new Xmlrpc\Request('RestartMap', array()); return $this->execute('CallVoteEx', array($tmpCmd->getXml(), $ratio, $timeout, $voters), $multicall); } /** * Call a vote to go to the next Map. * You can additionally specifiy specific parameters for this vote: a ratio, a time out * and who is voting. Special timeout values: a timeout of '0' means default, '1' means * indefinite; a ratio of '-1' means default; Voters values: '0' means only active players, * '1' means any player, '2' is for everybody, pure spectators included. * @param double $ratio -1 means default, else ration should be between 0 and 1 * @param int $timeout time to vote in millisecondes, '0' means default * @param int $voters Voters values: '0' means only active players, '1' means any player, '2' is for everybody, pure spectators included * @param bool $multicall * @throws InvalidArgumentException */ function callVoteNextMap($ratio = 0.5, $timeout = 0, $voters = 1, $multicall = false) { if(!is_float($ratio)) { throw new InvalidArgumentException('ratio = '.print_r($ratio, true)); } if(!is_int($timeout)) { throw new InvalidArgumentException('timeout = '.print_r($timeout, true)); } if(!is_int($voters)) { throw new InvalidArgumentException('voters = '.print_r($voters, true)); } $tmpCmd = new Xmlrpc\Request('NextMap', array()); return $this->execute('CallVoteEx', array($tmpCmd->getXml(), $ratio, $timeout, $voters), $multicall); } /** * Used internaly by game. * @param bool $multicall * @return bool */ protected function internalCallVote($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Cancel the current vote. * @param bool $multicall * @return bool */ function cancelVote($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns the vote currently in progress. * The returned structure is { CallerLogin, CmdName, CmdParam }. * @return Structures\Vote */ function getCurrentCallVote() { return Structures\Vote::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Set a new timeout for waiting for votes. A zero value disables callvote. * Requires a map restart to be taken into account * @param int $timeout time to vote in millisecondes, '0' disables callvote * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setCallVoteTimeOut($timeout, $multicall = false) { if(!is_int($timeout)) { throw new InvalidArgumentException('timeout = '.print_r($timeout, true)); } return $this->execute(ucfirst(__FUNCTION__), array($timeout), $multicall); } /** * Get the current and next timeout for waiting for votes. * The struct returned contains two fields 'CurrentValue' and 'NextValue'. * @return array */ function getCallVoteTimeOut() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new default ratio for passing a vote. * Must lie between 0 and 1. * @param double $ratio * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setCallVoteRatio($ratio, $multicall = false) { if($ratio !== -1. && !(is_float($ratio) && $ratio >= 0 && $ratio <= 1)) { throw new InvalidArgumentException('ratio = '.print_r($ratio, true)); } return $this->execute(ucfirst(__FUNCTION__), array($ratio), $multicall); } /** * Get the current default ratio for passing a vote. * This value lies between 0 and 1. * @return double */ function getCallVoteRatio() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set new ratios for passing specific votes. * The parameter is an array of associative arrays * {string votecommand, double ratio}, ratio is in [0,1] or -1. for vote disabled. * @example setCallVoteRatios(array(array('Command' => 'Kick', 'Ratio' => -1. )); * @param array $ratios * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setCallVoteRatios(array $ratios, $multicall = false) { return $this->setCallVoteRatiosEx(true, $ratios, $multicall); } /** * Get the current ratios for passing votes. * @return array */ function getCallVoteRatios() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the ratios list for passing specific votes, extended version with parameters matching. * The parameters, a boolean ReplaceAll (or else, only modify specified ratios, leaving the previous ones unmodified) * and an array of structs {string Command, string Param, double Ratio}, * ratio is in [0,1] or -1 for vote disabled. * Param is matched against the vote parameters to make more specific ratios, leave empty to match all votes for the command. * Only available to Admin. * @param bool $replaceAll * @param array[array[]]|Structures\VoteRatio[] $ratios * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setCallVoteRatiosEx($replaceAll, array $ratios, $multicall = false) { if(!is_array($ratios)) { throw new InvalidArgumentException('ratios = '.print_r($ratios, true)); } foreach($ratios as $i => $ratio) { if($ratio instanceof Structures\VoteRatio) { $ratios[$i] = $ratio->toArray(); } else { if(!is_array($ratio) && !array_key_exists('Command', $ratio) && !array_key_exists('Ratio', $ratio)) { throw new InvalidArgumentException('ratios['.$i.'] = '.print_r($ratio, true)); } if(!is_string($ratio['Command'])) { throw new InvalidArgumentException('ratios['.$i.'][Command] = '.print_r($ratios['Command'], true)); } if($ratio['Ratio'] !== -1. && !(is_float($ratio['Ratio']) && $ratio['Ratio'] >= 0 && $ratio['Ratio'] <= 1)) { throw new InvalidArgumentException('ratios['.$i.'][Ratio] = '.print_r($ratio['Ratio'], true)); } if(array_key_exists('Param', $ratio) && !is_string($ratio['Param'])) { throw new InvalidArgumentException('ratios['.$i.'][Param] = '.print_r($ratio['Param'], true)); } elseif(!array_key_exists('Param', $ratio)) { $ratio['Param'] = ''; $ratios[$i] = $ratio; } } } return $this->execute(ucfirst(__FUNCTION__), array($replaceAll, $ratios), $multicall); } /** * Get the current ratios for passing votes, extended version with parameters matching. * @return Structures\VoteRatio[] */ function getCallVoteRatiosEx() { return Structures\VoteRatio::fromArrayOfArray($this->execute(ucfirst(__FUNCTION__))); } /** * Send a localised text message to specied clients. * The parameter is an array of structures {Lang='??', Text='...'}. * If no matching language is found, the last text in the array is used. * @param array $messages * @param Structures\Player|string|mixed[] $receiver Structures\Player(s) who will receive the message, put null to send the message to everyone * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function chatSendServerMessageToLanguage(array $messages, $receiver = null, $multicall = false) { if(!is_array($messages)) { throw new InvalidArgumentException('messages = '.print_r($messages, true)); } if(is_null($receiver)) { $receiverString = ''; } else if(!($receiverString = $this->getLogins($receiver))) { throw new InvalidArgumentException('receiver = '.print_r($receiver, true)); } return $this->execute(ucfirst(__FUNCTION__), array($messages, $receiverString), $multicall); } /** * Send a text message without the server login to everyone if players is null. * Players can be a Structures\Player object or an array of Structures\Player * @param string $message * @param Structures\Player|string|mixed[] $receiver Structures\Player(s) who will receive the message, put null to send the message to everyone * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function chatSendServerMessage($message, $receiver = null, $multicall = false) { if(!is_string($message)) { throw new InvalidArgumentException('message = '.print_r($message, true)); } $params = array($message); $method = 'ChatSendServerMessage'; if(!is_null($receiver)) { if(!($logins = $this->getLogins($receiver))) { throw new InvalidArgumentException('receiver = '.print_r($receiver, true)); } $params[] = $logins; $method .= 'ToLogin'; } return $this->execute($method, $params, $multicall); } /** * Send a localised text message to selected clients. * The parameter is an array of structures {Lang='??', Text='...'}. * If no matching language is found, the last text in the array is used. * @param array $messages * @param Structures\Player|string|mixed[] $receiver Structures\Player(s) who will receive the message, put null to send the message to everyone * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function chatSendToLanguage(array $messages, $receiver = null, $multicall = false) { if(!is_array($messages)) throw new InvalidArgumentException('messages = '.print_r($messages, true)); if($receiver == null) { $receiverString = ''; } else if(!($receiverString = $this->getLogins($receiver))) { throw new InvalidArgumentException('receiver = '.print_r($receiver, true)); } return $this->execute(ucfirst(__FUNCTION__), array($messages, $receiverString), $multicall); } /** * Send a text message to every Structures\Player or the a specified player(s). * If Structures\Player is null, the message will be delivered to every Structures\Player * @param string $message * @param Structures\Player|string|mixed[] $receiver Structures\Player(s) who will receive the message, put null to send the message to everyone * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function chatSend($message, $receiver, $multicall = false) { if(!is_string($message)) throw new InvalidArgumentException('message = '.print_r($message, true)); $params = array($message); $method = 'ChatSend'; if(!is_null($receiver)) { if(!($logins = $this->getLogins($receiver))) { throw new InvalidArgumentException('players = '.print_r($receiver, true)); } $params[] = $logins; $method .= 'ToLogin'; } return $this->execute($method, $params, $multicall); } /** * Returns the last chat lines. Maximum of 40 lines. * @return array */ function getChatLines() { return $this->execute(ucfirst(__FUNCTION__)); } /** * The chat messages are no longer dispatched to the players, they only go to the rpc callback * and the controller has to manually forward them. The second (optional) parameter allows all * messages from the server to be automatically forwarded. * @param bool $enable * @param bool $serverAutomaticForward * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function chatEnableManualRouting($enable, $serverAutomaticForward = false, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } if(!is_bool($serverAutomaticForward)) { throw new InvalidArgumentException('serverAutomaticForward = '.print_r($serverAutomaticForward, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable, $serverAutomaticForward), $multicall); } /** * (Text, SenderLogin, DestLogin) Send a text message to the specified DestLogin (or everybody if empty) * on behalf of SenderLogin. DestLogin can be a single login or a list of comma-separated logins. * Only available if manual routing is enabled. * @param string $message * @param Structures\Player|string $sender * @param Structures\Player|string $receiver * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function chatForwardToLogin($message, $sender, $receiver = null, $multicall = false) { if(!is_string($message)) { throw new InvalidArgumentException('message = '.print_r($message, true)); } if(!($senderLogin = $this->getLogin($sender))) { throw new InvalidArgumentException('sender must be set'); } $receiverLogin = $this->getLogin($receiver) ? : ''; return $this->execute(ucfirst(__FUNCTION__), array($message, $senderLogin, $receiverLogin), $multicall); } /** * Display a notice on the client with the specified UId. * The parameters are : * the Uid of the client to whom the notice is sent, * the text message to display, * the UId of the avatar to display next to it (or '255' for no avatar), * an optional 'max duration' in seconds (default: 3). * @param string $message * @param Structures\Player|string|mixed[] $receiver * @param Structures\Player|string $player * @param int $variant 0, 1 or 2 * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function sendNotice($receiver, $message, $player = null, $variant = 0, $multicall = false) { if(!is_string($message)) { throw new InvalidArgumentException('message = '.print_r($message, true)); } $params = array(); $method = 'SendNotice'; if(!is_null($receiver)) { if(!($login = $this->getLogins($receiver))) throw new InvalidArgumentException('receiver = '.print_r($receiver, true)); else $params[] = $login; $method .= 'ToLogin'; } $params[] = $message; $params[] = $this->getLogin($player) ? : ''; $params[] = $variant; return $this->execute($method, $params, $multicall); } /** * Display a manialink page on the client of the specified Structures\Player(s). * The first parameter is the login of the player, * the other are identical to 'SendDisplayManialinkPage'. * The players can be an object of player Type or an array of Structures\Player object * @param null|Structures\Player|string|mixed[] $playerLogin * @param string $manialink * @param int $timeout * @param bool $hideOnClick * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function sendDisplayManialinkPage($players, $manialink, $timeout, $hideOnClick, $multicall = false) { $params = array(); $method = 'SendDisplayManialinkPage'; if(!is_null($players)) { if(!($login = $this->getLogins($players))) throw new InvalidArgumentException('players = '.print_r($players, true)); else $params[] = $login; $method .= 'ToLogin'; } if(!is_string($manialink)) { throw new InvalidArgumentException('manialink = '.print_r($manialink, true)); } if(!is_int($timeout)) { throw new InvalidArgumentException('timeout = '.print_r($timeout, true)); } if(!is_bool($hideOnClick)) { throw new InvalidArgumentException('hideOnClick = '.print_r($hideOnClick, true)); } $params[] = $manialink; $params[] = $timeout; $params[] = $hideOnClick; return $this->execute($method, $params, $multicall); } /** * Hide the displayed manialink page on the client with the specified login. * Login can be a single login or a list of comma-separated logins. * @param null|Structures\Player|string|mixed[] $players * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function sendHideManialinkPage($players = null, $multicall = false) { $params = array(); $method = 'SendHideManialinkPage'; if(!is_null($players)) { if(!($login = $this->getLogins($players))) throw new InvalidArgumentException('players = '.print_r($players, true)); else $params[] = $login; $method .= 'ToLogin'; } return $this->execute($method, $params, $multicall); } /** * Returns the latest results from the current manialink page, * as an array of structs {string Login, int PlayerId, int Result} * Result==0 -> no answer, Result>0.... -> answer from the player. * @return array */ function getManialinkPageAnswers() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Opens a link in the client with the specified players. * The parameters are the login of the client to whom the link to open is sent, the link url, and the 'LinkType' * (0 in the external browser, 1 in the internal manialink browser). * Login can be a single login or a list of comma-separated logins. Only available to * @param Structures\Player|string|mixed[] $player * @param string $link * @param int $linkType * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function sendOpenLink($player, $link, $linkType, $multicall = false) { if(!($login = $this->getLogins($player))) { throw new InvalidArgumentException('player must be set'); } if(!is_string($link)) { throw new InvalidArgumentException('link = '.print_r($link, true)); } if($linkType !== 0 && $linkType !== 1) { throw new InvalidArgumentException('linkType = '.print_r($linkType, true)); } return $this->execute('SendOpenLinkToLogin', array($login, $link, $linkType), $multicall); } /** * Kick the player with an optional message. * @param Structures\Player|string $playerLogin * @param string $message * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function kick($player, $message = '', $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(!is_string($message)) { throw new InvalidArgumentException('message = '.print_r($message, true)); } return $this->execute('Kick', array($login, $message), $multicall); } /** * Ban the player with an optional message. * @param Structures\Player|string $player * @param string $message * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function ban($player, $message = '', $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(!is_string($message)) { throw new InvalidArgumentException('message = '.print_r($message, true)); } return $this->execute('Ban', array($login, $message), $multicall); } /** * Ban the player with a message. * Add it to the black list, and optionally save the new list. * @param Structures\Player|string $player * @param string $message * @param bool $saveList * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function banAndBlackList($player, $message, $saveList = false, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(!is_string($message) || !$message) { throw new InvalidArgumentException('message = '.print_r($message, true)); } if(!is_bool($saveList)) { throw new InvalidArgumentException('saveList = '.print_r($saveList, true)); } return $this->execute(ucfirst(__FUNCTION__), array($login, $message, $saveList), $multicall); } /** * Unban the player * @param Structures\Player|string $player * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function unBan($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login), $multicall); } /** * Clean the ban list of the server. * @param bool $multicall * @return bool */ function cleanBanList($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns the list of banned players. This method takes two parameters. * The first parameter specifies the maximum number of infos to be returned, * the second one the starting index in the list. The list is an array of structures. * Each structure contains the following fields : Login, ClientName and IPAddress. * @param int $length specifies the maximum number of infos to be returned * @param int $offset specifies the starting index in the list * @return Structures\Player[] The list is an array of Structures\Player * @throws InvalidArgumentException */ function getBanList($length, $offset) { if(!is_int($length)) throw new InvalidArgumentException('length = '.print_r($length, true)); if(!is_int($offset)) throw new InvalidArgumentException('offset = '.print_r($offset, true)); $result = $this->execute(ucfirst(__FUNCTION__), array($length, $offset)); return Structures\Player::fromArrayOfArray($result); } /** * Blacklist the player * @param Structures\Player|string $player * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function blackList($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login), $multicall); } /** * UnBlackList the player * @param Structures\Player|string $player * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function unBlackList($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login), $multicall); } /** * Clean the blacklist of the server. * @param bool $multicall * @return bool */ function cleanBlackList($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns the list of blacklisted players. * This method takes two parameters. * The first parameter specifies the maximum number of infos to be returned, * the second one the starting index in the list. The list is an array of structures. * Each structure contains the following fields : Login. * @param int $length specifies the maximum number of infos to be returned * @param int $offset specifies the starting index in the list * @return Structures\Player[] The list is an array of structures. Each structure contains the following fields : Login. * @throws InvalidArgumentException */ function getBlackList($length, $offset) { if(!is_int($length)) throw new InvalidArgumentException('length = '.print_r($length, true)); if(!is_int($offset)) throw new InvalidArgumentException('offset = '.print_r($offset, true)); $result = $this->execute(ucfirst(__FUNCTION__), array($length, $offset)); return Structures\Player::fromArrayOfArray($result); } /** * Load the black list file with the specified file name. * @param string $filename blackList file name * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function loadBlackList($filename, $multicall = false) { if(!is_string($filename)) throw new InvalidArgumentException('filename = '.print_r($filename, true)); return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Save the black list in the file with specified file name. * @param string $filename blackList filename * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function saveBlackList($filename, $multicall = false) { if(!is_string($filename)) throw new InvalidArgumentException('filename = '.print_r($filename, true)); return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Add the player to the guest list. * @param Structures\Player|string $player * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function addGuest($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login), $multicall); } /** * Remove the player from the guest list. * @param Structures\Player|string $player * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function removeGuest($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login), $multicall); } /** * Clean the guest list of the server. * @param bool $multicall * @return bool */ function cleanGuestList($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns the list of players on the guest list. * This method takes two parameters. * The first parameter specifies the maximum number of infos to be returned, * the second one the starting index in the list. The list is an array of structures. * Each structure contains the following fields : Login. * @param int $length specifies the maximum number of infos to be returned * @param int $offset specifies the starting index in the list * @return Structures\Player[] The list is an array of structures. Each structure contains the following fields : Login. * @throws InvalidArgumentException */ function getGuestList($length, $offset) { if(!is_int($length)) { throw new InvalidArgumentException('length = '.print_r($length, true)); } if(!is_int($offset)) { throw new InvalidArgumentException('offset = '.print_r($offset, true)); } $result = $this->execute(ucfirst(__FUNCTION__), array($length, $offset)); return Structures\Player::fromArrayOfArray($result); } /** * * Load the guest list file with the specified file name. * @param string $filename blackList file name * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function loadGuestList($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Save the guest list in the file with specified file name. * @param string $filename blackList file name * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function saveGuestList($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Sets whether buddy notifications should be sent in the chat. * login is the login of the player, or '' for global setting, * enabled is the value. * @param null|Structures\Player|string $player the player, or null for global setting * @param bool $enable the value. * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setBuddyNotification($player, $enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } $player = $this->getLogin($player) ? : ''; return $this->execute(ucfirst(__FUNCTION__), array($player, $enable), $multicall); } /** * Gets whether buddy notifications are enabled for login, or '' to get the global setting. * @param null|Structures\Player|string $player the player, or null for global setting * @return bool * @throws InvalidArgumentException */ function getBuddyNotification($player) { $player = $this->getLogin($player) ? : ''; return $this->execute(ucfirst(__FUNCTION__), array($player)); } /** * Write the data to the specified file. The filename is relative to the Tracks path * @param string $filename The file to be written * @param string $localFilename The file to be read to obtain the data * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function writeFile($filename, $localFilename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } if(!file_exists($localFilename)) { throw new InvalidArgumentException('localFilename = '.print_r($localFilename, true)); } $inputData = file_get_contents($localFilename); $data = new Xmlrpc\Base64($inputData); if(strlen($data->getXml()) > 1024 * 1024 - 15) { throw new InvalidArgumentException('file is too big'); } return $this->execute(ucfirst(__FUNCTION__), array($filename, $data), $multicall); } /** * Write the data to the specified file. The filename is relative to the Tracks path * @param string $filename The file to be written * @param string $data the data to be written * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function writeFileFromString($filename, $data, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } $data = new Xmlrpc\Base64($data); if(strlen($data->getXml()) > 1024 * 1024 - 15) { throw new InvalidArgumentException('data are too big'); } return $this->execute('WriteFile', array($filename, $data), $multicall); } /** * Send the data to the specified player. * Login can be a single login or a list of comma-separated logins. * @param Structures\Player|string|mixed[] $players * @param string $filename * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function tunnelSendData($players, $filename, $multicall = false) { if(!($login = $this->getLogins($players))) { throw new InvalidArgumentException('players = '.print_r($players, true)); } if(!file_exists($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } if(filesize($filename) > 4 * 1024) { throw new InvalidArgumentException('file is too big'); } $inputData = file_get_contents($filename); $data = new Xmlrpc\Base64($inputData); return $this->execute('TunnelSendDataToLogin', array($login, $data), $multicall); } /** * Send the data to the specified player. * Login can be a single login or a list of comma-separated logins. * @param Structures\Player|string|mixed[] $players * @param string $data * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function tunnelSendDataFromString($players, $data, $multicall = false) { if(!($login = $this->getLogins($players))) { throw new InvalidArgumentException('players = '.print_r($players, true)); } $data = new Xmlrpc\Base64($data); return $this->execute('TunnelSendDataToLogin', array($login, $data), $multicall); } /** * Just log the parameters and invoke a callback. * Can be used to talk to other xmlrpc clients connected, or to make custom votes. * If used in a callvote, the first parameter will be used as the vote message on the clients. * @param string $message the message to log * @param string $callback optionnal callback name * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function dedicatedEcho($message, $callback = '', $multicall = false) { if(!is_string($message)) { throw new InvalidArgumentException('message = '.print_r($message, true)); } if(!is_string($callback)) { throw new InvalidArgumentException('callback = '.print_r($callback, true)); } return $this->execute('Echo', array($message, $callback), $multicall); } /** * Ignore the specified Structures\Player. * @param Structures\Player|string $player * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function ignore($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login), $multicall); } /** * Unignore the specified player. * @param Structures\Player|string $player * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function unIgnore($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login), $multicall); } /** * Clean the ignore list of the server. * @param bool $multicall * @return bool */ function cleanIgnoreList($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns the list of ignored players. This method takes two parameters. * The first parameter specifies the maximum number of infos to be returned, * the second one the starting index in the list. The list is an array of structures. * Each structure contains the following fields : Login. * @param int $length specifies the maximum number of infos to be returned * @param int $offset specifies the starting index in the list * @return Structures\Player[] The list is an array of structures. Each structure contains the following fields : Login. * @throws InvalidArgumentException */ function getIgnoreList($length, $offset) { if(!is_int($length)) { throw new InvalidArgumentException('length = '.print_r($length, true)); } if(!is_int($offset)) { throw new InvalidArgumentException('offset = '.print_r($offset, true)); } $result = $this->execute(ucfirst(__FUNCTION__), array($length, $offset)); return Structures\Player::fromArrayOfArray($result); } /** * Pay coppers from the server account to a player, returns the BillId. * This method takes three parameters: * Login of the payee, * Coppers to pay and * Label to send with the payment. * The creation of the transaction itself may cost coppers, * so you need to have coppers on the server account. * @param Structures\Player|string $player * @param int $amount * @param string $label * @param bool $multicall * @return int The Bill Id * @throws InvalidArgumentException */ function pay($player, $amount, $label, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(!is_int($amount) || $amount < 1) { throw new InvalidArgumentException('amount = '.print_r($amount, true)); } if(!is_string($label)) { throw new InvalidArgumentException('label = '.print_r($label, true)); } return $this->execute(ucfirst(__FUNCTION__), array($login, $amount, $label), $multicall); } /** * Create a bill, send it to a player, and return the BillId. * This method takes four parameters: * LoginFrom of the payer, * Coppers the player has to pay, * Label of the transaction and * optional LoginTo of the payee (if empty string, then the server account is used). * The creation of the transaction itself may cost coppers, * so you need to have coppers on the server account. * @param Structures\Player|string $fromPlayer * @param int $amount * @param string $label * @param Structures\Player|string|null $toPlayer * @param bool $multicall * @return int * @throws InvalidArgumentException */ function sendBill($fromPlayer, $amount, $label, $toPlayer = null, $multicall = false) { if(!is_int($amount) || $amount < 1) { throw new InvalidArgumentException('amount = '.print_r($amount, true)); } if(!is_string($label)) { throw new InvalidArgumentException('label = '.print_r($label, true)); } if(!($from = $this->getLogin($fromPlayer))) { throw new InvalidArgumentException('fromPlayer must be set'); } $to = $this->getLogin($toPlayer) ? : ''; return $this->execute(ucfirst(__FUNCTION__), array($from, $amount, $label, $to), $multicall); } /** * Returns the current state of a bill. * This method takes one parameter, the BillId. * Returns a struct containing * State, StateName and TransactionId. * Possible enum values are: CreatingTransaction, Issued, ValidatingPayement, Payed, Refused, Error. * @param int $billId * @return Structures\Bill * @throws InvalidArgumentException */ function getBillState($billId) { if(!is_int($billId)) { throw new InvalidArgumentException('billId = '.print_r($billId, true)); } $result = $this->execute(ucfirst(__FUNCTION__), array($billId)); return Structures\Bill::fromArray($result); } /** * Returns the current number of planets on the server account. * @return int */ function getServerPlanets() { return $this->execute('GetServerPlanets'); } /** * Get some system infos. * Return a struct containing: * PublishedIp, Port, P2PPort, ServerLogin, ServerPlayerId * @return Structures\SystemInfos */ function getSystemInfo() { $result = $this->execute(ucfirst(__FUNCTION__)); return Structures\SystemInfos::fromArray($result); } /** * Sets up- and download speed for the server in kbps. * @param int $downloadRate the download rate in kbps * @param int $uploadRate the upload rate in kbps * @param bool $multicall * @return bool */ function setConnectionRates($downloadRate, $uploadRate, $multicall = false) { if(!is_int($downloadRate)) { throw new InvalidArgumentException('downloadRate = '.print_r($downloadRate, true)); } if(!is_int($uploadRate)) { throw new InvalidArgumentException('uploadRate = '.print_r($uploadRate, true)); } return $this->execute(ucfirst(__FUNCTION__), array($downloadRate, $uploadRate), $multicall); } /** * Returns the list of tags and associated values set on this server. * The list is an array of structures {string Name, string Value}. * Only available to Admin. * @return array */ function getServerTags() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a tag and its value on the server. This method takes two parameters. * The first parameter specifies the name of the tag, and the second one its value. * Only available to Admin. * @param string $key * @param string $value * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setServerTag($key, $value, $multicall = false) { if(!is_string($key)) { throw new InvalidArgumentException('key = '.print_r($key, true)); } if(!is_string($value)) { throw new InvalidArgumentException('value = '.print_r($value, true)); } return $this->execute(ucfirst(__FUNCTION__), array($key, $value), $multicall); } /** * Unset the tag with the specified name on the server. * Only available to Admin. * @param string $key * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function unsetServerTag($key, $multicall = false) { if(!is_string($key)) { throw new InvalidArgumentException('key = '.print_r($key, true)); } return $this->execute(ucfirst(__FUNCTION__), array($key), $multicall); } /** * Reset all tags on the server. * Only available to Admin. * @param bool $multicall * @return bool */ function resetServerTags($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Set a new server name in utf8 format. * @param string $serverName * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setServerName($serverName, $multicall = false) { if(!is_string($serverName)) { throw new InvalidArgumentException('serverName = '.print_r($serverName, true)); } return $this->execute(ucfirst(__FUNCTION__), array($serverName), $multicall); } /** * Get the server name in utf8 format. * @return string */ function getServerName() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new server comment in utf8 format. * @param string $serverComment * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setServerComment($serverComment, $multicall = false) { if(!is_string($serverComment)) { throw new InvalidArgumentException('serverComment = '.print_r($serverComment, true)); } return $this->execute(ucfirst(__FUNCTION__), array($serverComment), $multicall); } /** * Get the server comment in utf8 format. * @return string */ function getServerComment() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set whether the server should be hidden from the public server list * (0 = visible, 1 = always hidden, 2 = hidden from nations). * @param int $visibility * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setHideServer($visibility, $multicall = false) { if($visibility !== 0 && $visibility !== 1 && $visibility !== 2) { throw new InvalidArgumentException('visibility = '.print_r($visibility, true)); } return $this->execute(ucfirst(__FUNCTION__), array($visibility), $multicall); } /** * Get whether the server wants to be hidden from the public server list. * @return string */ function getHideServer() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns true if this is a relay server. * @return bool */ function isRelayServer() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new password for the server. * @param string $serverPassword * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setServerPassword($serverPassword, $multicall = false) { if(!is_string($serverPassword)) { throw new InvalidArgumentException('serverPassword = '.print_r($serverPassword, true)); } return $this->execute(ucfirst(__FUNCTION__), array($serverPassword), $multicall); } /** * Get the server password if called as Admin or Super Admin, else returns if a password is needed or not. * Get the server name in utf8 format. * @return bool|string */ function getServerPassword() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new password for the spectator mode. * @param string $serverPassword * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setServerPasswordForSpectator($serverPassword, $multicall = false) { if(!is_string($serverPassword)) { throw new InvalidArgumentException('serverPassword = '.print_r($serverPassword, true)); } return $this->execute(ucfirst(__FUNCTION__), array($serverPassword), $multicall); } /** * Get the password for spectator mode if called as Admin or Super Admin, else returns if a password is needed or not. * @return bool|string */ function getServerPasswordForSpectator() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new maximum number of players. * Requires a map restart to be taken into account. * @param int $maxPlayers * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setMaxPlayers($maxPlayers, $multicall = false) { if(!is_int($maxPlayers)) { throw new InvalidArgumentException('maxPlayers = '.print_r($maxPlayers, true)); } return $this->execute(ucfirst(__FUNCTION__), array($maxPlayers), $multicall); } /** * Get the current and next maximum number of players allowed on server. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getMaxPlayers() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new maximum number of spectators. * Requires a map restart to be taken into account. * @param int $maxSpectators * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setMaxSpectators($maxSpectators, $multicall = false) { if(!is_int($maxSpectators)) { throw new InvalidArgumentException('maxPlayers = '.print_r($maxSpectators, true)); } return $this->execute(ucfirst(__FUNCTION__), array($maxSpectators), $multicall); } /** * Get the current and next maximum number of spectators allowed on server. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getMaxSpectators() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Declare if the server is a lobby, the number and maximum number of players currently managed by it, and the average level of the players. * Only available to Admin. * @param bool $isLobby * @param int $lobbyPlayers * @param int $maxPlayers * @param double $lobbyPlayersLevel * @param bool $multicall * @return bool */ function setLobbyInfo($isLobby, $lobbyPlayers, $maxPlayers, $lobbyPlayersLevel, $multicall = false) { if(!is_bool($isLobby)) { throw new InvalidArgumentException('isLobby = '.print_r($isLobby, true)); } if(!is_int($lobbyPlayers)) { throw new InvalidArgumentException('lobbyPlayers = '.print_r($lobbyPlayers, true)); } if(!is_int($maxPlayers)) { throw new InvalidArgumentException('maxPlayers = '.print_r($maxPlayers, true)); } if(!is_double($lobbyPlayersLevel)) { throw new InvalidArgumentException('lobbyPlayersLevel = '.print_r($lobbyPlayersLevel, true)); } return $this->execute(ucfirst(__FUNCTION__), array($isLobby, $lobbyPlayers, $maxPlayers, $lobbyPlayersLevel), $multicall); } /** * Get whether the server if a lobby, the number and maximum number of players currently managed by it. * The struct returned contains 4 fields IsLobby, LobbyPlayers, LobbyMaxPlayers, and LobbyPlayersLevel. * @return Structures\LobbyInfo */ function getLobbyInfo() { $result = $this->execute(ucfirst(__FUNCTION__)); return Structures\LobbyInfo::fromArray($result); } /** * Customize the clients 'leave server' dialog box. * Parameters are: ManialinkPage, SendToServer url '#qjoin=login@title', * ProposeAddToFavorites and DelayQuitButton (in milliseconds). * Only available to Admin. * @param string $manialinkPage * @param string $sendToServer * @param bool $proposeAddToFavorites * @param bool $multicall * @return bool */ function customizeQuitDialog($manialinkPage, $sendToServer, $proposeAddToFavorites, $delayQuitButton, $multicall = false) { if(!is_string($manialinkPage)) { throw new InvalidArgumentException('manialinkPage = '.print_r($manialinkPage, true)); } if(!is_string($sendToServer)) { throw new InvalidArgumentException('sendToServer = '.print_r($sendToServer, true)); } if(!is_bool($proposeAddToFavorites)) { throw new InvalidArgumentException('proposeAddToFavorites = '.print_r($proposeAddToFavorites, true)); } if(!is_int($delayQuitButton)) { throw new InvalidArgumentException('delayQuitButton = '.print_r($delayQuitButton, true)); } return $this->execute(ucfirst(__FUNCTION__), array($manialinkPage, $sendToServer, $proposeAddToFavorites, $delayQuitButton), $multicall); } /** * Set whether, when a player is switching to spectator, the server should still consider him a player * and keep his player slot, or not. Only available to Admin. * @param bool $keep * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function keepPlayerSlots($keep, $multicall = false) { if(!is_bool($keep)) { throw new InvalidArgumentException('keep = '.print_r($keep, true)); } return $this->execute(ucfirst(__FUNCTION__), array($keep), $multicall); } /** * Get whether the server keeps player slots when switching to spectator. * @return bool */ function isKeepingPlayerSlots() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Enable or disable peer-to-peer upload from server. * @param bool $enable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function enableP2PUpload($enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable), $multicall); } /** * Returns if the peer-to-peer upload from server is enabled. * @return bool */ function isP2PUpload() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Enable or disable peer-to-peer download from server. * @param bool $enable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function enableP2PDownload($enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable), $multicall); } /** * Returns if the peer-to-peer download from server is enabled. * @return bool */ function isP2PDownload() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Allow clients to download maps from the server. * @param bool $allow * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function allowMapDownload($allow, $multicall = false) { if(!is_bool($allow)) { throw new InvalidArgumentException('allow = '.print_r($allow, true)); } return $this->execute(ucfirst(__FUNCTION__), array($allow), $multicall); } /** * Returns if clients can download maps from the server. * @return bool */ function isMapDownloadAllowed() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Enable the autosaving of all replays (vizualisable replays with all players, * but not validable) on the server. * @param bool $enable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function autoSaveReplays($enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable), $multicall); } /** * Returns if autosaving of all replays is enabled on the server. * @return bool */ function isAutoSaveReplaysEnabled() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Enable the autosaving on the server of validation replays, every time a player makes a new time. * @param bool $enable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function autoSaveValidationReplays($enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable), $multicall); } /** * Returns if autosaving of validation replays is enabled on the server. * @return bool */ function isAutoSaveValidationReplaysEnabled() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Saves the current replay (vizualisable replays with all players, but not validable). * Pass a filename, or '' for an automatic filename. * @param string $filename * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function saveCurrentReplay($filename = '', $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Saves a replay with the ghost of all the players' best race. * First parameter is the player object(or null for all players), * Second parameter is the filename, or '' for an automatic filename. * @param null|Structures\Player|string $player the player (or null for all players) * @param string $filename is the filename, or '' for an automatic filename * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function saveBestGhostsReplay($player = null, $filename = '', $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } $playerLogin = $this->getLogin($player) ? : ''; return $this->execute(ucfirst(__FUNCTION__), array($playerLogin, $filename), $multicall); } /** * Returns a replay containing the data needed to validate the current best time of the player. * The parameter is the login of the player. * @param Structures\Player|string $player * @return string base64 encoded * @throws InvalidArgumentException */ function getValidationReplay($player) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute(ucfirst(__FUNCTION__), array($login)); } /** * Set a new ladder mode between ladder disabled (0) and forced (1). * Requires a map restart to be taken into account. * @param int $mode * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setLadderMode($mode, $multicall = false) { if($mode !== 0 && $mode !== 1) { throw new InvalidArgumentException('mode = '.print_r($mode, true)); } return $this->execute(ucfirst(__FUNCTION__), array($mode), $multicall); } /** * Get the current and next ladder mode on server. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getLadderMode() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Get the ladder points limit for the players allowed on this server. * The struct returned contains two fields LadderServerLimitMin and LadderServerLimitMax. * @return array */ function getLadderServerLimits() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the network vehicle quality to Fast (0) or High (1). * Requires a map restart to be taken into account. * @param int $quality * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setVehicleNetQuality($quality, $multicall = false) { if($quality !== 0 && $quality !== 1) { throw new InvalidArgumentException('quality = '.print_r($quality, true)); } return $this->execute(ucfirst(__FUNCTION__), array($quality), $multicall); } /** * Get the current and next network vehicle quality on server. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getVehicleNetQuality() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set new server options using the struct passed as parameters. This struct must contain the following fields : * Name, Comment, Password, PasswordForSpectator, NextMaxPlayers, NextMaxSpectators, IsP2PUpload, IsP2PDownload, * NextLadderMode, NextVehicleNetQuality, NextCallVoteTimeOut, CallVoteRatio, AllowMapDownload, AutoSaveReplays, * * and optionally for forever: * RefereePassword, RefereeMode, AutoSaveValidationReplays, HideServer, UseChangingValidationSeed, * ClientInputsMaxLatency, KeepPlayerSlots. * * Only available to Admin. * A change of NextMaxPlayers, NextMaxSpectators, NextLadderMode, NextVehicleNetQuality, NextCallVoteTimeOut * or UseChangingValidationSeed requires a map restart to be taken into account. * @param array $options * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setServerOptions(array $options, $multicall = false) { if(!is_array($options) || !array_key_exists('Name', $options) || !array_key_exists('Comment', $options) || !array_key_exists('Password', $options) || !array_key_exists('PasswordForSpectator', $options) || !array_key_exists('NextCallVoteTimeOut', $options) || !array_key_exists('CallVoteRatio', $options) || (array_key_exists('IsP2PUpload', $options) xor array_key_exists('IsP2PDownload', $options)) || (array_key_exists('NextMaxPlayer', $options) xor array_key_exists('NextMaxSpectator', $options)) || (array_key_exists('RefereePassword', $options) xor array_key_exists('RefereeMode', $options))) { throw new InvalidArgumentException('options = '.print_r($options, true)); } return $this->execute(ucfirst(__FUNCTION__), array($options), $multicall); } /** * Returns a struct containing the server options: * Name, Comment, Password, PasswordForSpectator, CurrentMaxPlayers, NextMaxPlayers, CurrentMaxSpectators, * NextMaxSpectators, KeepPlayerSlots, IsP2PUpload, IsP2PDownload, CurrentLadderMode, NextLadderMode, * CurrentVehicleNetQuality, NextVehicleNetQuality, CurrentCallVoteTimeOut, NextCallVoteTimeOut, CallVoteRatio, * AllowMapDownload, AutoSaveReplays, RefereePassword, RefereeMode, AutoSaveValidationReplays, HideServer, * CurrentUseChangingValidationSeed, NextUseChangingValidationSeed, ClientInputsMaxLatency. * @return Structures\ServerOptions * @throws InvalidArgumentException */ function getServerOptions() { return Structures\ServerOptions::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Set whether the players can choose their side or if the teams are forced by the server (using ForcePlayerTeam()). * Only available to Admin. * @param bool $enable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setForcedTeams($enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable), $multicall); } /** * Returns whether the players can choose their side or if the teams are forced by the server. * @return bool */ function getForcedTeams() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Defines the packmask of the server. Can be 'United', 'Nations', 'Sunrise', 'Original', * or any of the environment names. (Only maps matching the packmask will be * allowed on the server, so that player connecting to it know what to expect.) * Only available when the server is stopped. * @param string $packMask * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setServerPackMask($packMask, $multicall = false) { if(!is_string($packMask)) { throw new InvalidArgumentException('packMask = '.print_r($packMask, true)); } return $this->execute(ucfirst(__FUNCTION__), array($packMask), $multicall); } /** * Get the packmask of the server. * @return string */ function getServerPackMask() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the mods to apply on the clients. Parameters: * Override, if true even the maps with a mod will be overridden by the server setting; * Mods, an array of structures [{EnvName, Url}, ...]. * Requires a map restart to be taken into account. * @param bool $override * @param array $mods * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setForcedMods($override, $mods, $multicall = false) { if(!is_bool($override)) { throw new InvalidArgumentException('override = '.print_r($override, true)); } if(is_array($mods)) { $modList = array(); foreach($mods as $mod) { if(!($mod instanceof Structures\Mod)) throw new InvalidArgumentException('mods = '.print_r($mods, true)); else $modList[] = $mod->toArray(); } } elseif($mods instanceof Structures\Mod) $modList = array($mods->toArray()); else throw new InvalidArgumentException('mods = '.print_r($mods, true)); return $this->execute(ucfirst(__FUNCTION__), array($override, $modList), $multicall); } /** * Get the mods settings. * @return array the first value is a boolean which indicate if the mods override existing mods, the second is an array of objet of Structures\Mod type */ function getForcedMods() { $result = $this->execute(ucfirst(__FUNCTION__)); $result['Mods'] = Structures\Mod::fromArrayOfArray($result['Mods']); return $result; } /** * Set the music to play on the clients. Parameters: * Override, if true even the maps with a custom music will be overridden by the server setting, * UrlOrFileName for the music. * Requires a map restart to be taken into account * @param bool $override * @param string $music * @param bool $multicall * @throws InvalidArgumentException */ function setForcedMusic($override, $music, $multicall = false) { if(!is_bool($override)) { throw new InvalidArgumentException('override = '.print_r($override, true)); } if(!is_string($music)) { throw new InvalidArgumentException('music = '.print_r($music, true)); } return $this->execute(ucfirst(__FUNCTION__), array($override, $music), $multicall); } /** * Get the music setting. * @return Structures\Music */ function getForcedMusic() { return Structures\Music::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Defines a list of remappings for player skins. It expects a list of structs Orig, Name, Checksum, Url. * Orig is the name of the skin to remap, or '*' for any other. Name, Checksum, Url define the skin to use. * (They are optional, you may set value '' for any of those. All 3 null means same as Orig). * Will only affect players connecting after the value is set. * @param Structures\Skin[] $skins * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setForcedSkins(array $skins, $multicall = false) { if(!is_array($skins)) { throw new InvalidArgumentException('skins = '.print_r($skins, true)); } $skinParameter = array(); foreach($skins as $key => $skin) { if($skin instanceof Structures\Skin) { $skinParameter[$key] = array(); $skinParameter[$key]['Orig'] = $skin->orig; $skinParameter[$key]['Name'] = $skin->name; $skinParameter[$key]['Checksum'] = $skin->checksum; $skinParameter[$key]['Url'] = $skin->url; } elseif(!is_array($skin) || !array_key_exists('Orig', $skin) && !array_key_exists('Name', $skin) && !array_key_exists('Checksum', $skin) && !array_key_exists('Url', $skin)) { throw new InvalidArgumentException('skins['.$key.'] = '.print_r($skins[$key], true)); } else { $skinParameter[$key] = $skin; } } return $this->execute(ucfirst(__FUNCTION__), array($skinParameter), $multicall); } /** * Get the current forced skins. * @return Structures\Skin[] */ function getForcedSkins() { return Structures\Skin::fromArrayOfArray($this->execute(ucfirst(__FUNCTION__))); } /** * Returns the last error message for an internet connection. * @return string */ function getLastConnectionErrorMessage() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new password for the referee mode. * @param string $refereePassword * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setRefereePassword($refereePassword, $multicall = false) { if(!is_string($refereePassword)) { throw new InvalidArgumentException('refereePassword = '.print_r($refereePassword, true)); } return $this->execute(ucfirst(__FUNCTION__), array($refereePassword), $multicall); } /** * Get the password for referee mode if called as Admin or Super Admin, * else returns if a password is needed or not. * @return bool|string */ function getRefereePassword() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the referee validation mode. 0 = validate the top3 players, 1 = validate all players. Only available to Admin. * @param int $refereeMode * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setRefereeMode($refereeMode, $multicall = false) { if($refereeMode !== 0 && $refereeMode !== 1) { throw new InvalidArgumentException('refereeMode = '.print_r($refereeMode, true)); } return $this->execute(ucfirst(__FUNCTION__), array($refereeMode), $multicall); } /** * Get the referee validation mode. * @return bool|string */ function getRefereeMode() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set whether the game should use a variable validation seed or not. * Requires a map restart to be taken into account. * @param bool $enable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setUseChangingValidationSeed($enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable), $multicall); } /** * Get the current and next value of UseChangingValidationSeed. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getUseChangingValidationSeed() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the maximum time the server must wait for inputs from the clients before dropping data, or '0' for auto-adaptation. * Only used by ShootMania. Only available to Admin. * @param int $latency * @param bool $multicall * @return bool */ function setClientInputsMaxLatency($latency, $multicall = false) { if(!is_int($latency)) { throw new InvalidArgumentException('latency = '.print_r($latency, true)); } return $this->execute(ucfirst(__FUNCTION__), array($latency), $multicall); } /** * Get the current ClientInputsMaxLatency. Only used by ShootMania. * @return int */ function getClientInputsMaxLatency() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Sets whether the server is in warm-up phase or not. * @param bool $enable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setWarmUp($enable, $multicall = false) { if(!is_bool($enable)) { throw new InvalidArgumentException('enable = '.print_r($enable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($enable), $multicall); } /** * Returns whether the server is in warm-up phase. * @return bool */ function getWarmUp() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Get the current rules script. * TODO Check if correct * @return string */ function getModeScriptText() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the rules script and restart. * Only available to Admin. * TODO Check if correct * @param string $script * @param bool $multicall * @return bool */ function setModeScriptText($script, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array($script), $multicall); } /** * Get the xml-rpc variables of the mode script. * Only available to Admin. * @return array */ function getModeScriptVariables() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the variables of the rules script. Only available to Admin. * @param array $variables * @param bool $multicall */ function setModeScriptVariables($variables, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array($variables), $multicall); } /** * Send an event to the mode script. Only available to Admin. * @param string $param1 * @param string $param2 * @param bool $multicall * @return bool */ function triggerModeScriptEvent($param1, $param2, $multicall = false) { if(!is_string($param1)) { throw new InvalidArgumentException('param1 = '.print_r($param1, true)); } if(!is_string($param2)) { throw new InvalidArgumentException('param2 = '.print_r($param2, true)); } return $this->execute(ucfirst(__FUNCTION__), array($param1, $param2), $multicall); } /** * Send an event to the mode script. Only available to Admin. * @param string $param1 * @param mixed[] $param2 * @param bool $multicall * @return bool */ function triggerModeScriptEventArray($param1, $param2, $multicall = false) { if(!is_string($param1)) { throw new InvalidArgumentException('param1 = '.print_r($param1, true)); } if(!is_array($param2)) { throw new InvalidArgumentException('param2 = '.print_r($param2, true)); } return $this->execute(ucfirst(__FUNCTION__), array($param1, $param2), $multicall); } /** * Returns the description of the current rules script, * as a structure containing: Name, CompatibleTypes, * Description and the settings available. * @return Structures\ScriptInfo */ function getModeScriptInfo() { return Structures\ScriptInfo::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Returns the current parameters of the mode script. * @return array */ function getModeScriptSettings() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the parameters of the rules script. Only available to Admin. * @param array $rules * @param bool $multicall * @return bool */ function setModeScriptSettings($rules, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array($rules), $multicall); } /** * Send commands to the mode script. * Only available to Admin. * @param array $commands * @param bool $multicall * @return bool */ function sendModeScriptCommands(array $commands, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array($commands), $multicall); } /** * Change the settings and send commands to the mode script. * Only available to Admin. * @param array $settings * @param array $commands * @param bool $multicall * @return bool */ function setModeScriptSettingsAndCommands(array $settings, array $commands, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array($settings, $commands), $multicall); } /** * Restarts the map, with an optional boolean parameter DontClearCupScores (only available in cup mode). * @param bool $dontClearCupScores * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function restartMap($dontClearCupScores = false, $multicall = false) { if(!is_bool($dontClearCupScores)) { throw new InvalidArgumentException('dontClearCupScores = '.print_r($dontClearCupScores, true)); } return $this->execute(ucfirst(__FUNCTION__), array($dontClearCupScores), $multicall); } /** * Switch to next map, with an optional boolean parameter DontClearCupScores (only available in cup mode). * @param bool $dontClearCupScores * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function nextMap($dontClearCupScores = false, $multicall = false) { if(!is_bool($dontClearCupScores)) { throw new InvalidArgumentException('dontClearCupScores = '.print_r($dontClearCupScores, true)); } return $this->execute(ucfirst(__FUNCTION__), array($dontClearCupScores), $multicall); } /** * Attempt to balance teams. Only available to Admin. * @return bool */ function autoTeamBalance() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Stop the server. * @param bool $multicall * @return bool */ function stopServer($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * In Rounds or Laps mode, force the end of round without waiting for all players to giveup/finish. * @param bool $multicall * @return bool */ function forceEndRound($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Set new game settings using the struct passed as parameters. * This struct must contain the following fields : * GameMode, ChatTime, RoundsPointsLimit, RoundsUseNewRules, RoundsForcedLaps, TimeAttackLimit, * TimeAttackSynchStartPeriod, TeamPointsLimit, TeamMaxPoints, TeamUseNewRules, LapsNbLaps, LapsTimeLimit, * FinishTimeout, and optionally: AllWarmUpDuration, DisableRespawn, ForceShowAllOpponents, RoundsPointsLimitNewRules, * TeamPointsLimitNewRules, CupPointsLimit, CupRoundsPerMap, CupNbWinners, CupWarmUpDuration. * Requires a map restart to be taken into account. * @param Structures\GameInfos $gameInfos * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setGameInfos(Structures\GameInfos $gameInfos, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array($gameInfos->toArray()), $multicall); } /** * Optional parameter for compatibility: * struct version (0 = united, 1 = forever). * Returns a struct containing the current game settings, ie: * GameMode, ChatTime, NbMap, RoundsPointsLimit, RoundsUseNewRules, RoundsForcedLaps, * TimeAttackLimit, TimeAttackSynchStartPeriod, TeamPointsLimit, TeamMaxPoints, TeamUseNewRules, * LapsNbLaps, LapsTimeLimit, FinishTimeout, * additionally for version 1: AllWarmUpDuration, DisableRespawn, ForceShowAllOpponents, RoundsPointsLimitNewRules, * TeamPointsLimitNewRules, CupPointsLimit, CupRoundsPerMap, CupNbWinners, CupWarmUpDuration. * @param int $compatibility * @return Structures\GameInfos * @throws InvalidArgumentException */ function getCurrentGameInfo($compatibility = 1) { if($compatibility !== 1 && $compatibility != 0) { throw new InvalidArgumentException('compatibility = '.print_r($compatibility, true)); } return Structures\GameInfos::fromArray($this->execute(ucfirst(__FUNCTION__), array($compatibility))); } /** * Optional parameter for compatibility: * struct version (0 = united, 1 = forever). * Returns a struct containing the game settings for the next map, ie: * GameMode, ChatTime, NbMap, RoundsPointsLimit, RoundsUseNewRules, RoundsForcedLaps, * TimeAttackLimit, TimeAttackSynchStartPeriod, TeamPointsLimit, TeamMaxPoints, TeamUseNewRules, * LapsNbLaps, LapsTimeLimit, FinishTimeout, * additionally for version 1: AllWarmUpDuration, DisableRespawn, ForceShowAllOpponents, RoundsPointsLimitNewRules, * TeamPointsLimitNewRules, CupPointsLimit, CupRoundsPerMap, CupNbWinners, CupWarmUpDuration. * @param int $compatibility * @return Structures\GameInfos * @throws InvalidArgumentException */ function getNextGameInfo($compatibility = 1) { if($compatibility !== 1 && $compatibility != 0) { throw new InvalidArgumentException('compatibility = '.print_r($compatibility, true)); } return Structures\GameInfos::fromArray($this->execute(ucfirst(__FUNCTION__), array($compatibility))); } /** * Optional parameter for compatibility: struct version (0 = united, 1 = forever). * Returns a struct containing two other structures, * the first containing the current game settings and the second the game settings for next map. * The first structure is named CurrentGameInfos and the second NextGameInfos. * @param int $compatibility * @return Structures\GameInfos[] * @throws InvalidArgumentException */ function getGameInfos($compatibility = 1) { if($compatibility !== 1 && $compatibility != 0) { throw new InvalidArgumentException('compatibility = '.print_r($compatibility, true)); } return Structures\GameInfos::fromArrayOfArray($this->execute(ucfirst(__FUNCTION__), array($compatibility))); } /** * Set a new game mode between Rounds (0), TimeAttack (1), Team (2), Laps (3), Stunts (4) and Cup (5). * Requires a map restart to be taken into account. * @param int $gameMode * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setGameMode($gameMode, $multicall = false) { if(!is_int($gameMode) && ($gameMode < 0 || $gameMode > 5)) { throw new InvalidArgumentException('gameMode = '.print_r($gameMode, true)); } return $this->execute(ucfirst(__FUNCTION__), array($gameMode), $multicall); } /** * Get the current game mode. * @return int */ function getGameMode() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new chat time value in milliseconds (actually 'chat time' is the duration of the end race podium, 0 means no podium displayed.). * @param int $chatTime * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setChatTime($chatTime, $multicall = false) { if(!is_int($chatTime)) { throw new InvalidArgumentException('chatTime = '.print_r($chatTime, true)); } return $this->execute(ucfirst(__FUNCTION__), array($chatTime), $multicall); } /** * Get the current and next chat time. The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getChatTime() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new finish timeout (for rounds/laps mode) value in milliseconds. * 0 means default. 1 means adaptative to the duration of the map. * Requires a map restart to be taken into account. * @param int $finishTimeout * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setFinishTimeout($finishTimeout, $multicall = false) { if(!is_int($finishTimeout)) { throw new InvalidArgumentException('chatTime = '.print_r($finishTimeout, true)); } return $this->execute(ucfirst(__FUNCTION__), array($finishTimeout), $multicall); } /** * Get the current and next FinishTimeout. The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getFinishTimeout() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set whether to enable the automatic warm-up phase in all modes. * 0 = no, otherwise it's the duration of the phase, expressed in number of rounds (in rounds/team mode), * or in number of times the gold medal time (other modes). * Requires a map restart to be taken into account. * @param int $warmUpDuration * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setAllWarmUpDuration($warmUpDuration, $multicall = false) { if(!is_int($warmUpDuration)) { throw new InvalidArgumentException('warmUpDuration = '.print_r($warmUpDuration, true)); } return $this->execute(ucfirst(__FUNCTION__), array($warmUpDuration), $multicall); } /** * Get whether the automatic warm-up phase is enabled in all modes. The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getAllWarmUpDuration() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set whether to disallow players to respawn. * Requires a map restart to be taken into account. * @param bool $disableRespawn * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setDisableRespawn($disableRespawn, $multicall = false) { if(!is_bool($disableRespawn)) { throw new InvalidArgumentException('disableRespawn = '.print_r($disableRespawn, true)); } return $this->execute(ucfirst(__FUNCTION__), array($disableRespawn), $multicall); } /** * Get whether players are disallowed to respawn. The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getDisableRespawn() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set whether to override the players preferences and always display all opponents * 0=no override, 1=show all, other value=minimum number of opponents. * Requires a map restart to be taken into account. * @param int $forceShowAllOpponents * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setForceShowAllOpponents($forceShowAllOpponents, $multicall = false) { if(!is_int($forceShowAllOpponents)) { throw new InvalidArgumentException('forceShowAllOpponents = '.print_r($forceShowAllOpponents, true)); } return $this->execute(ucfirst(__FUNCTION__), array($forceShowAllOpponents), $multicall); } /** * Get whether players are forced to show all opponents. The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getForceShowAllOpponents() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new rules script name for script mode. Only available to Admin. * Requires a map restart to be taken into account. * @param string $scriptName * @param bool $multicall * @return bool */ function setScriptName($scriptName, $multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array($scriptName), $multicall); } /** * Get the current and next rules script name for script mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getScriptName() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new time limit for time attack mode. * Requires a map restart to be taken into account. * @param int $timeAttackLimit * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setTimeAttackLimit($timeAttackLimit, $multicall = false) { if(!is_int($timeAttackLimit)) { throw new InvalidArgumentException('timeAttackLimit = '.print_r($timeAttackLimit, true)); } return $this->execute(ucfirst(__FUNCTION__), array($timeAttackLimit), $multicall); } /** * Get the current and next time limit for time attack mode. The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getTimeAttackLimit() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new synchronized start period for time attack mode. * Requires a map restart to be taken into account. * @param int $timeAttackSynchPeriod * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setTimeAttackSynchStartPeriod($timeAttackSynchPeriod, $multicall = false) { if(!is_int($timeAttackSynchPeriod)) { throw new InvalidArgumentException('timeAttackSynchPeriod = '.print_r($timeAttackSynchPeriod, true)); } return $this->execute(ucfirst(__FUNCTION__), array($timeAttackSynchPeriod), $multicall); } /** * Get the current and synchronized start period for time attack mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getTimeAttackSynchStartPeriod() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new time limit for laps mode. * Requires a map restart to be taken into account. * @param int $lapsTimeLimit * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setLapsTimeLimit($lapsTimeLimit, $multicall = false) { if(!is_int($lapsTimeLimit)) { throw new InvalidArgumentException('lapsTimeLimit = '.print_r($lapsTimeLimit, true)); } return $this->execute(ucfirst(__FUNCTION__), array($lapsTimeLimit), $multicall); } /** * Get the current and next time limit for laps mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getLapsTimeLimit() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new number of laps for laps mode. * Requires a map restart to be taken into account. * @param int $nbLaps * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setNbLaps($nbLaps, $multicall = false) { if(!is_int($nbLaps)) { throw new InvalidArgumentException('nbLaps = '.print_r($nbLaps, true)); } return $this->execute(ucfirst(__FUNCTION__), array($nbLaps), $multicall); } /** * Get the current and next number of laps for laps mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getNbLaps() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new number of laps for rounds mode * 0 = default, use the number of laps from the maps, * otherwise forces the number of rounds for multilaps maps. * Requires a map restart to be taken into account. * @param int $roundForcedLaps * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setRoundForcedLaps($roundForcedLaps, $multicall = false) { if(!is_int($roundForcedLaps)) { throw new InvalidArgumentException('roundForcedLaps = '.print_r($roundForcedLaps, true)); } return $this->execute(ucfirst(__FUNCTION__), array($roundForcedLaps), $multicall); } /** * Get the current and next number of laps for rounds mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getRoundForcedLaps() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new points limit for rounds mode (value set depends on UseNewRulesRound). * Requires a map restart to be taken into account. * @param int $roundPointsLimit * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setRoundPointsLimit($roundPointsLimit, $multicall = false) { if(!is_int($roundPointsLimit)) { throw new InvalidArgumentException('roundPointsLimit = '.print_r($roundPointsLimit, true)); } return $this->execute(ucfirst(__FUNCTION__), array($roundPointsLimit), $multicall); } /** * Get the current and next points limit for rounds mode (values returned depend on UseNewRulesRound). * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getRoundPointsLimit() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the points used for the scores in rounds mode. * Points is an array of decreasing integers for the players from the first to last. * And you can add an optional boolean to relax the constraint checking on the scores. * @param array $roundCustomPoints * @param bool $relaxChecking * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setRoundCustomPoints(array $roundCustomPoints, $relaxChecking = false, $multicall = false) { if(!is_array($roundCustomPoints)) { throw new InvalidArgumentException('roundCustomPoints = '.print_r($roundCustomPoints, true)); } if(!is_bool($relaxChecking)) { throw new InvalidArgumentException('relaxChecking = '.print_r($relaxChecking, true)); } return $this->execute(ucfirst(__FUNCTION__), array($roundCustomPoints, $relaxChecking), $multicall); } /** * Gets the points used for the scores in rounds mode. * @param bool $multicall * @return array */ function getRoundCustomPoints() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the points used for the scores in rounds mode. * Points is an array of decreasing integers for the players from the first to last. * And you can add an optional boolean to relax the constraint checking on the scores. * @param bool $useNewRulesRound * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setUseNewRulesRound($useNewRulesRound, $multicall = false) { if(!is_bool($useNewRulesRound)) { throw new InvalidArgumentException('useNewRulesRound = '.print_r($useNewRulesRound, true)); } return $this->execute(ucfirst(__FUNCTION__), array($useNewRulesRound), $multicall); } /** * Gets the points used for the scores in rounds mode. * @return array */ function getUseNewRulesRound() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new points limit for team mode (value set depends on UseNewRulesTeam). * Requires a map restart to be taken into account. * @param int $teamPointsLimit * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setTeamPointsLimit($teamPointsLimit, $multicall = false) { if(!is_int($teamPointsLimit)) { throw new InvalidArgumentException('teamPointsLimit = '.print_r($teamPointsLimit, true)); } return $this->execute(ucfirst(__FUNCTION__), array($teamPointsLimit), $multicall); } /** * Get the current and next points limit for team mode (values returned depend on UseNewRulesTeam). * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getTeamPointsLimit() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set a new number of maximum points per round for team mode. * Requires a map restart to be taken into account. * @param int $maxPointsTeam * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setMaxPointsTeam($maxPointsTeam, $multicall = false) { if(!is_int($maxPointsTeam)) { throw new InvalidArgumentException('maxPointsTeam = '.print_r($maxPointsTeam, true)); } return $this->execute(ucfirst(__FUNCTION__), array($maxPointsTeam), $multicall); } /** * Get the current and next number of maximum points per round for team mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getMaxPointsTeam() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set if new rules are used for team mode. * Requires a map restart to be taken into account. * @param bool $useNewRulesTeam * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setUseNewRulesTeam($useNewRulesTeam, $multicall = false) { if(!is_bool($useNewRulesTeam)) { throw new InvalidArgumentException('useNewRulesTeam = '.print_r($useNewRulesTeam, true)); } return $this->execute(ucfirst(__FUNCTION__), array($useNewRulesTeam), $multicall); } /** * Get if the new rules are used for team mode (Current and next values). * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getUseNewRulesTeam() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the points needed for victory in Cup mode. * Requires a map restart to be taken into account. * @param int $pointsLimit * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setCupPointsLimit($pointsLimit, $multicall = false) { if(!is_int($pointsLimit)) { throw new InvalidArgumentException('pointsLimit = '.print_r($pointsLimit, true)); } return $this->execute(ucfirst(__FUNCTION__), array($pointsLimit), $multicall); } /** * Get the points needed for victory in Cup mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getCupPointsLimit() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Sets the number of rounds before going to next map in Cup mode. * Requires a map restart to be taken into account. * @param int $roundsPerMap * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setCupRoundsPerMap($roundsPerMap, $multicall = false) { if(!is_int($roundsPerMap)) { throw new InvalidArgumentException('roundsPerMap = '.print_r($roundsPerMap, true)); } return $this->execute(ucfirst(__FUNCTION__), array($roundsPerMap), $multicall); } /** * Get the number of rounds before going to next map in Cup mode. * The struct returned contains two fields CurrentValue and NextValue. * @param bool $multicall * @return array */ function getCupRoundsPerMap() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set whether to enable the automatic warm-up phase in Cup mode. * 0 = no, otherwise it's the duration of the phase, expressed in number of rounds. * Requires a map restart to be taken into account. * @param int $warmUpDuration * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setCupWarmUpDuration($warmUpDuration, $multicall = false) { if(!is_int($warmUpDuration)) { throw new InvalidArgumentException('warmUpDuration = '.print_r($warmUpDuration, true)); } return $this->execute(ucfirst(__FUNCTION__), array($warmUpDuration), $multicall); } /** * Get whether the automatic warm-up phase is enabled in Cup mode. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getCupWarmUpDuration() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Set the number of winners to determine before the match is considered over. * Requires a map restart to be taken into account. * @param int $nbWinners * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setCupNbWinners($nbWinners, $multicall = false) { if(!is_int($nbWinners)) { throw new InvalidArgumentException('nbWinners = '.print_r($nbWinners, true)); } return $this->execute(ucfirst(__FUNCTION__), array($nbWinners), $multicall); } /** * Get the number of winners to determine before the match is considered over. * The struct returned contains two fields CurrentValue and NextValue. * @return array */ function getCupNbWinners() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns the current map index in the selection, or -1 if the map is no longer in the selection. * @return int */ function getCurrentMapIndex() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns the map index in the selection that will be played next (unless the current one is restarted...) * @return int */ function getNextMapIndex() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Sets the map index in the selection that will be played next (unless the current one is restarted...) * @param int $nextMapIndex * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function setNextMapIndex($nextMapIndex, $multicall = false) { if(!is_int($nextMapIndex)) { throw new InvalidArgumentException('nextMapIndex = '.print_r($nextMapIndex, true)); } return $this->execute(ucfirst(__FUNCTION__), array($nextMapIndex), $multicall); } /** * Immediately jumps to the map designated by the index in the selection * @param int $nextMapIndex * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function jumpToMapIndex($mapIndex, $multicall = false) { if(!is_int($mapIndex)) { throw new InvalidArgumentException('mapIndex = '.print_r($mapIndex, true)); } return $this->execute(ucfirst(__FUNCTION__), array($mapIndex), $multicall); } /** * Set Team names and colors. Only available to Admin. * @param string $teamName1 * @param float $teamColor1 * @param string $team1Country * @param string $teamName2 * @param float $teamColor2 * @param string $team2Country * @param bool $multicall * @return bool * @throws InvalidArgumentException * @deprecated since version 2013-04-11 */ function setTeamInfo($teamName1, $teamColor1, $team1Country, $teamName2, $teamColor2, $team2Country, $multicall = false) { if(!is_float($teamColor1)) { throw new InvalidArgumentException('teamColor1 = '.print_r($teamColor1, true)); } if(!is_float($teamColor2)) { throw new InvalidArgumentException('teamColor2 = '.print_r($teamColor2, true)); } if(!is_string($teamName1)) { throw new InvalidArgumentException('teamName1 = '.print_r($teamName1, true)); } if(!is_string($teamName2)) { throw new InvalidArgumentException('teamName2 = '.print_r($teamName2, true)); } return $this->execute(ucfirst(__FUNCTION__), array('unused', 0., 'World', $teamName1, $teamColor1, $team1Country, $teamName2, $teamColor2, $team2Country), $multicall); } /** * Return Team info for a given clan (0 = no clan, 1, 2). * The structure contains: name, zonePath, city, emblemUrl, huePrimary, hueSecondary, rGB, clubLinkUrl. * Only available to Admin. * @param int $teamId * @return Structures\Team * @throws InvalidArgumentException */ function getTeamInfo($teamId) { if(!is_int($teamId)) { throw new InvalidArgumentException('teamId = '.print_r($teamId, true)); } return Structures\Team::fromArray($this->execute(ucfirst(__FUNCTION__), array($teamId))); } /** * Set the clublinks to use for the two clans. * Only available to Admin. * @param string $team1ClubLink * @param string $team2ClubLink * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function setForcedClubLinks($team1ClubLink, $team2ClubLink, $multicall = false) { if(!is_string($team1ClubLink)) { throw new InvalidArgumentException('team1ClubLink = '.print_r($team1ClubLink, true)); } if(!is_string($team2ClubLink)) { throw new InvalidArgumentException('team2ClubLink = '.print_r($team2ClubLink, true)); } return $this->execute(ucfirst(__FUNCTION__), array($team1ClubLink, $team2ClubLink), $multicall); } /** * Get the forced clublinks. * @return array */ function getForcedClubLinks() { return $this->execute(ucfirst(__FUNCTION__)); } /** * (debug tool) Connect a fake player to the server and returns the login. * Only available to Admin. * @param bool $multicall * @return string */ function connectFakePlayer($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * (debug tool) Disconnect a fake player, or all the fake players if login is '*'. * Only available to Admin. * @param string $fakePlayerLogin * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function disconnectFakePlayer($fakePlayerLogin, $multicall = false) { if(!is_string($fakePlayerLogin)) { throw new InvalidArgumentException('fakePlayerLogin = '.print_r($fakePlayerLogin, true)); } return $this->execute(ucfirst(__FUNCTION__), array($fakePlayerLogin), $multicall); } /** * Returns the token infos for a player. * The returned structure is { TokenCost, CanPayToken }. * @param Structures\Player|string $player * @return array */ function getDemoTokenInfosForPlayer($player) { $login = $this->getLogin($player); return (object) $this->execute(ucfirst(__FUNCTION__), array($login)); } /** * Disable player horns. Only available to Admin. * @param bool $disable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function disableHorns($disable, $multicall = false) { if(!is_bool($disable)) { throw new InvalidArgumentException('disable = '.print_r($disable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($disable), $multicall); } /** * Returns whether the horns are disabled. * @return bool */ function areHornsDisabled() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Disable the automatic mesages when a player connects/disconnects from the server. * Only available to Admin. * @param bool $disable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function disableServiceAnnounces($disable = true, $multicall = false) { if(!is_bool($disable)) { throw new InvalidArgumentException('disable = '.print_r($disable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($disable), $multicall); } /** * Returns whether the automatic mesages are disabled. * @return bool */ function areServiceAnnouncesDisabled() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns a struct containing the infos for the current map. * The struct contains the following fields : Name, UId, FileName, * Author, Environnement, Mood, BronzeTime, SilverTime, GoldTime, * AuthorTime, CopperPrice, LapRace, NbLaps and NbCheckpoints. * @return Structures\Map */ function getCurrentMapInfo() { return Structures\Map::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Returns a struct containing the infos for the next map. * The struct contains the following fields : Name, UId, FileName, * Author, Environnement, Mood, BronzeTime, SilverTime, GoldTime, * AuthorTime, CopperPrice, LapRace, NbLaps and NbCheckpoints. * (NbLaps and NbCheckpoints are also present but always set to -1) * @return Structures\Map */ function getNextMapInfo() { return Structures\Map::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Returns a struct containing the infos for the map with the specified filename. * The struct contains the following fields : Name, UId, FileName, * Author, Environnement, Mood, BronzeTime, SilverTime, GoldTime, * AuthorTime, CopperPrice, LapRace, NbLaps and NbCheckpoints. * (NbLaps and NbCheckpoints are also present but always set to -1) * @param string $filename * @return Structures\Map * @throws InvalidArgumentException */ function getMapInfo($filename) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } $temp = $this->execute(ucfirst(__FUNCTION__), array($filename)); return Structures\Map::fromArray($temp); } /** * Returns a boolean if the map with the specified filename matches the current server settings. * @param string $filename * @return bool */ function checkMapForCurrentServerParams($filename) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename)); } /** * Returns a list of maps among the current selection of the server. * This method take two parameters. * The first parameter specifies the maximum number of infos to be returned, * the second one the starting index in the selection. * The list is an array of structures. Each structure contains the following fields : Name, UId, FileName, Environnement, Author, GoldTime and CopperPrice. * @param int $length specifies the maximum number of infos to be returned * @param int $offset specifies the starting index in the list * @return Structures\Map[] The list is an array of Map * @throws InvalidArgumentException */ function getMapList($length, $offset) { if(!is_int($length)) { throw new InvalidArgumentException('length = '.print_r($length, true)); } if(!is_int($offset)) { throw new InvalidArgumentException('offset = '.print_r($offset, true)); } return Structures\Map::fromArrayOfArray($this->execute(ucfirst(__FUNCTION__), array($length, $offset))); } /** * Add the map with the specified filename at the end of the current selection. * @param string $filename * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function addMap($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Add the list of maps with the specified filename at the end of the current selection. * @param array $filenames * @param bool $multicall * @throws InvalidArgumentException * @return int */ function addMapList(array $filenames, $multicall = false) { if(!is_array($filenames)) { throw new InvalidArgumentException('filenames = '.print_r($filenames, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filenames), $multicall); } /** * Remove the map with the specified filename from the current selection. * @param string $filename * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function removeMap($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Remove the list of maps with the specified filenames from the current selection. * The list of maps to remove is an array of strings. * @param array $filenames * @param bool $multicall * @throws InvalidArgumentException * @return int */ function removeMapList(array $filenames, $multicall = false) { if(!is_array($filenames)) { throw new InvalidArgumentException('filenames = '.print_r($filenames, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filenames), $multicall); } /** * Insert the map with the specified filename after the current map. * @param string $filename * @throws InvalidArgumentException * @return bool */ function insertMap($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Insert the list of maps with the specified filenames after the current map. * The list of maps to remove is an array of strings. * @param array $filenames * @throws InvalidArgumentException * @return int */ function insertMapList(array $filenames, $multicall = false) { if(!is_array($filenames)) { throw new InvalidArgumentException('filenames = '.print_r($filenames, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filenames), $multicall); } /** * Set as next map the one with the specified filename, if it is present in the selection. * @param string $filename * @param bool $multicall * @throws InvalidArgumentException * @return bool */ function chooseNextMap($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Set as next maps the list of maps with the specified filenames, if they are present in the selection. * The list of maps to remove is an array of strings. * @param array $filenames * @param bool $multicall * @throws InvalidArgumentException * @return int */ function chooseNextMapList(array $filenames, $multicall = false) { if(!is_array($filenames)) { throw new InvalidArgumentException('filenames = '.print_r($filenames, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filenames), $multicall); } /** * Set a list of maps defined in the playlist with the specified filename * as the current selection of the server, and load the gameinfos from the same file. * @param string $filename * @throws InvalidArgumentException * @return int */ function loadMatchSettings($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Add a list of maps defined in the playlist with the specified filename at the end of the current selection. * @param string $filename * @throws InvalidArgumentException * @return int */ function appendPlaylistFromMatchSettings($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Save the current selection of map in the playlist with the specified filename, as well as the current gameinfos. * @param string $filename * @param bool $multicall * @throws InvalidArgumentException * @return int */ function saveMatchSettings($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Insert a list of maps defined in the playlist with the specified filename after the current map. * @param string $filename * @throws InvalidArgumentException * @return int */ function insertPlaylistFromMatchSettings($filename, $multicall = false) { if(!is_string($filename)) { throw new InvalidArgumentException('filename = '.print_r($filename, true)); } return $this->execute(ucfirst(__FUNCTION__), array($filename), $multicall); } /** * Returns the list of players on the server. This method take two parameters. * The first parameter specifies the maximum number of infos to be returned, * the second one the starting index in the list, * an optional 3rd parameter is used for compatibility: struct version (0 = united, 1 = forever, 2 = forever, including the servers). * The list is an array of Structures\Player. * LadderRanking is 0 when not in official mode, * Flags = ForceSpectator(0,1,2) + IsReferee * 10 + IsPodiumReady * 100 + IsUsingStereoscopy * 1000 + * IsManagedByAnOtherServer * 10000 + IsServer * 100000 + HasPlayerSlot * 1000000 * SpectatorStatus = Spectator + TemporarySpectator * 10 + PureSpectator * 100 + AutoTarget * 1000 + CurrentTargetId * 10000 * @param int $length specifies the maximum number of infos to be returned * @param int $offset specifies the starting index in the list * @param int $compatibility * @return Structures\Player[] The list is an array of Structures\Player * @throws InvalidArgumentException */ function getPlayerList($length, $offset, $compatibility = 1) { if(!is_int($length)) { throw new InvalidArgumentException('length = '.print_r($length, true)); } if(!is_int($offset)) { throw new InvalidArgumentException('offset = '.print_r($offset, true)); } if(!is_int($compatibility)) { throw new InvalidArgumentException('compatibility = '.print_r($compatibility, true)); } return Structures\Player::fromArrayOfArray($this->execute(ucfirst(__FUNCTION__), array($length, $offset, $compatibility))); } /** * Returns a object of type Structures\Player containing the infos on the player with the specified login, * with an optional parameter for compatibility: struct version (0 = united, 1 = forever). * The structure is identical to the ones from GetPlayerList. Forever PlayerInfo struct is: * Login, NickName, PlayerId, TeamId, SpectatorStatus, LadderRanking, and Flags. * LadderRanking is 0 when not in official mode, * Flags = ForceSpectator(0,1,2) + IsReferee * 10 + IsPodiumReady * 100 + IsUsingStereoscopy * 1000 + * IsManagedByAnOtherServer * 10000 + IsServer * 100000 + HasPlayerSlot * 1000000 * SpectatorStatus = Spectator + TemporarySpectator * 10 + PureSpectator * 100 + AutoTarget * 1000 + CurrentTargetId * 10000 * @param int $playerLogin * @param int $compatibility * @return Structures\Player * @throws InvalidArgumentException */ function getPlayerInfo($playerLogin, $compatibility = 1) { if(!is_string($playerLogin)) { throw new InvalidArgumentException('playerLogin = '.print_r($playerLogin, true)); } if(!is_int($compatibility)) { throw new InvalidArgumentException('compatibility = '.print_r($compatibility, true)); } return Structures\Player::fromArray($this->execute(ucfirst(__FUNCTION__), array($playerLogin, $compatibility))); } /** * Returns an object of type Structures\Player containing the infos on the player with the specified login. * The structure contains the following fields : * Login, NickName, PlayerId, TeamId, IPAddress, DownloadRate, UploadRate, Language, IsSpectator, * IsInOfficialMode, a structure named Avatar, an array of structures named Skins, a structure named LadderStats, * HoursSinceZoneInscription and OnlineRights (0: nations account, 3: united account). * Each structure of the array Skins contains two fields Environnement and a struct PackDesc. * Each structure PackDesc, as well as the struct Avatar, contains two fields FileName and Checksum. * @param int $playerLogin * @return Structures\Player * @throws InvalidArgumentException */ function getDetailedPlayerInfo($playerLogin) { if(!is_string($playerLogin)) { throw new InvalidArgumentException('playerLogin = '.print_r($playerLogin, true)); } return Structures\Player::fromArray($this->execute(ucfirst(__FUNCTION__), array($playerLogin))); } /** * Returns an object of Structures\Player type containing the infos on the player with the specified login. * The structure contains the following fields : Login, NickName, PlayerId, TeamId, IPAddress, DownloadRate, UploadRate, * Language, IsSpectator, IsInOfficialMode, a structure named Avatar, an array of structures named Skins, a structure named LadderStats, * HoursSinceZoneInscription and OnlineRights (0: nations account, 3: united account). * Each structure of the array Skins contains two fields Environnement and a struct PackDesc. * Each structure PackDesc, as well as the struct Avatar, contains two fields FileName and Checksum. * @param int $compatibility * @return Structures\Player * @throws InvalidArgumentException */ function getMainServerPlayerInfo($compatibility = 1) { if(!is_int($compatibility)) { throw new InvalidArgumentException('compatibility = '.print_r($compatibility, true)); } return Structures\Player::fromArray($this->execute(ucfirst(__FUNCTION__), array($compatibility))); } /** * Returns the current rankings for the race in progress. * (in team mode, the scores for the two teams are returned. * In other modes, it's the individual players' scores) This method take two parameters. * The first parameter specifies the maximum number of infos to be returned, * the second one the starting index in the ranking. * The ranking returned is a list of Structures\Player. * It also contains an array BestCheckpoints that contains the checkpoint times for the best race. * @param int $length specifies the maximum number of infos to be returned * @param int $offset specifies the starting index in the list * @return Structures\Player[] The list is an array of Structures\Player. * @throws InvalidArgumentException */ function getCurrentRanking($length, $offset) { if(!is_int($length)) { throw new InvalidArgumentException('length = '.print_r($length, true)); } if(!is_int($offset)) { throw new InvalidArgumentException('offset = '.print_r($offset, true)); } return Structures\Player::fromArrayOfArray($this->execute(ucfirst(__FUNCTION__), array($length, $offset))); } /** * Returns the current ranking for the race in progressof the player with the specified login (or list of comma-separated logins). * The ranking returned is a list of structures that contains the following fields : * Login, NickName, PlayerId, Rank, BestTime, Score, NbrLapsFinished and LadderScore. * It also contains an array BestCheckpoints that contains the checkpoint times for the best race. * @param Structures\Player|Structures\Player[] $player * @throws InvalidArgumentException * @return Structures\Player[] The list is an array of Structures\Player. */ function getCurrentRankingForLogin($player = null) { $login = $this->getLogin($player) ? : ''; return Structures\Player::fromArrayOfArray($this->execute(ucfirst(__FUNCTION__), array($login))); } /** * Returns the current winning team for the race in progress. (-1: if not in team mode, or draw match) * @return int -1, 0 or 1 */ function getCurrentWinnerTeam() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Force the scores of the current game. Only available in rounds and team mode. * You have to pass an array of structs {int PlayerId, int Score}. And a boolean SilentMode - * if true, the scores are silently updated (only available for SuperAdmin), allowing an external controller to do its custom counting... * @param array $scores * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function forceScores(array $scores, $silentMode = false, $multicall = false) { if(!is_array($scores)) { throw new InvalidArgumentException('scores = '.print_r($scores, true)); } for($i = 0; $i < count($scores); $i++) { if(!is_int($scores[$i]['PlayerId'])) { throw new InvalidArgumentException('score['.$i.'][\'PlayerId\'] = '.print_r($scores[$i]['PlayerId'], true)); } if(!is_int($scores[$i]['Score'])) { throw new InvalidArgumentException('score['.$i.'][\'Score\'] = '.print_r($scores[$i]['Score'], true)); } } return $this->execute(ucfirst(__FUNCTION__), array($scores, $silentMode), $multicall); } /** * Force the team of the player. Only available in team mode. You have to pass the login and the team number (0 or 1). * @param Structures\Player|string $player * @param int $teamNumber * @param bool $multicall * @return bool */ function forcePlayerTeam($player, $teamNumber, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if($teamNumber !== 0 && $teamNumber !== 1) { throw new InvalidArgumentException('teamNumber = '.print_r($teamNumber, true)); } return $this->execute('ForcePlayerTeam', array($login, $teamNumber), $multicall); } /** * Force the spectating status of the player. * You have to pass the login and the spectator mode * (0: user selectable, 1: spectator, 2: player, 3: spectator but keep selectable). * Only available to Admin. * @param Structures\Player|string $player * @param int $spectatorMode * @param bool $multicall * @return bool */ function forceSpectator($player, $spectatorMode, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(array_search($spectatorMode, range(0, 3), true) === false) { throw new InvalidArgumentException('spectatorMode = '.print_r($spectatorMode, true)); } return $this->execute('ForceSpectator', array($login, $spectatorMode), $multicall); } /** * Force spectators to look at a specific player. You have to pass the login of the spectator (or '' for all) and * the login of the target (or '' for automatic), and an integer for the camera type to use (-1 = leave unchanged, 0 = replay, 1 = follow, 2 = free). * @param Structures\Player|string $player * @param Structures\Player|string $target * @param int $cameraType * @param bool $multicall * @return bool */ function forceSpectatorTarget($player, $target, $cameraType, $multicall = false) { if(!($playerLogin = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } if(!($targetLogin = $this->getLogin($target))) { throw new InvalidArgumentException('target must be set'); } if($cameraType !== -1 && $cameraType !== 0 && $cameraType !== 1 && $cameraType !== 2) { throw new InvalidArgumentException('cameraType = '.print_r($cameraType, true)); } return $this->execute('ForceSpectatorTarget', array($playerLogin, $targetLogin, $cameraType), $multicall); } /** * Pass the login of the spectator. A spectator that once was a player keeps his player slot, so that he can go back to race mode. * Calling this function frees this slot for another player to connect. * @param Structures\Player|string $player * @param bool $multicall * @return bool */ function spectatorReleasePlayerSlot($player, $multicall = false) { if(!($login = $this->getLogin($player))) { throw new InvalidArgumentException('player must be set'); } return $this->execute('SpectatorReleasePlayerSlot', array($login), $multicall); } /** * Enable control of the game flow: the game will wait for the caller to validate state transitions. * @param bool $flowControlEnable * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function manualFlowControlEnable($flowControlEnable, $multicall = false) { if(!is_bool($flowControlEnable)) { throw new InvalidArgumentException('flowControlEnable = '.print_r($flowControlEnable, true)); } return $this->execute(ucfirst(__FUNCTION__), array($flowControlEnable), $multicall); } /** * Allows the game to proceed. * @param bool $multicall * @return bool */ function manualFlowControlProceed($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns whether the manual control of the game flow is enabled. 0 = no, 1 = yes by the xml-rpc client making the call, 2 = yes, by some other xml-rpc client. * @return int */ function manualFlowControlIsEnabled() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns the transition that is currently blocked, or '' if none. (That's exactly the value last received by the callback.) * @return string */ function manualFlowControlGetCurTransition() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns the current match ending condition. * Return values are: 'Playing', 'ChangeMap' or 'Finished'. * @param bool $multicall * @return string */ function checkEndMatchCondition() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns an object Structures\NetworkStats. * The structure contains the following fields : Uptime, NbrConnection, MeanConnectionTime, MeanNbrPlayer, * RecvNetRate, SendNetRate, TotalReceivingSize, TotalSendingSize and an array of structures named PlayerNetInfos. * Each structure of the array PlayerNetInfos is a Structures\Player object contains the following fields : Login, IPAddress, LastTransferTime, DeltaBetweenTwoLastNetState, PacketLossRate. * @return Structures\NetworkStats */ function getNetworkStats() { return Structures\NetworkStats::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Start a server on lan, using the current configuration. * @param bool $multicall * @return bool */ function startServerLan($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Start a server on internet using the 'Login' and 'Password' specified in the struct passed as parameters. * @param array $ids * @param bool $multicall * @return bool * @throws InvalidArgumentException */ function startServerInternet($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns the current status of the server. * @return Structures\Status */ function getStatus() { return Structures\Status::fromArray($this->execute(ucfirst(__FUNCTION__))); } /** * Quit the application. * @param bool $multicall * @return bool */ function quitGame($multicall = false) { return $this->execute(ucfirst(__FUNCTION__), array(), $multicall); } /** * Returns the path of the game datas directory. * @return string */ function gameDataDirectory() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns the path of the maps directory. * @return string */ function getMapsDirectory() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns the path of the skins directory. * @return string */ function getSkinsDirectory() { return $this->execute(ucfirst(__FUNCTION__)); } /** * Returns the login of the given player * @param mixed $player Structures\Player or string * @return string */ private function getLogin($player) { if(is_string($player)) return $player; if($player instanceof Structures\Player) return $player->login; return null; } /** * Returns logins of given players * @param mixed $player Structures\Player or string or array * @return string */ private function getLogins($players) { if(is_array($players)) { $logins = array(); foreach($players as $player) { if(($login = $this->getLogin($player))) $logins[] = $login; else return null; } return implode(',', $logins); } return $this->getLogin($players); } } /** * Exception Dedicated to Query Error */ class QueryException extends \Exception { } /** * Exception Dedicated to Connection Error */ class ConnectionException extends \Exception { } /** * Exception Dedicated to Invalid Argument Error on Request Call */ class InvalidArgumentException extends \Exception { } ?>