From d0d5c1bb7944e81b41d3094e59c91b3519829cc3 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Pueyo Date: Wed, 15 May 2013 16:29:11 +0200 Subject: [PATCH] CMD Selectors [@all, @player, @random] --- src/API/ConsoleAPI.php | 59 ++++++++++++++++++++++++++++++++++++++---- src/API/LevelAPI.php | 29 ++++++++++++--------- src/Player.php | 6 ++++- 3 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/API/ConsoleAPI.php b/src/API/ConsoleAPI.php index 68f52b650..337c8778f 100644 --- a/src/API/ConsoleAPI.php +++ b/src/API/ConsoleAPI.php @@ -194,17 +194,66 @@ class ConsoleAPI{ public function run($line = "", $issuer = "console", $alias = false){ if($line != ""){ - $params = explode(" ", $line); - $cmd = strtolower(array_shift($params)); + $end = strpos($line, " "); + if($end === false){ + $end = strlen($line); + }else{ + ++$end; + } + $cmd = strtolower(substr($line, 0, $end - 1)); + $params = substr($line, $end); + if(isset($this->alias[$cmd])){ - $this->run($this->alias[$cmd] . " " .implode(" ", $params), $issuer, $cmd); + $this->run($this->alias[$cmd] . " " .$params, $issuer, $cmd); return; } if($issuer instanceof Player){ - console("[DEBUG] \x1b[33m".$issuer->username."\x1b[0m issued server command: ".ltrim("$alias ")."/$cmd ".implode(" ", $params), true, true, 2); + console("[DEBUG] \x1b[33m".$issuer->username."\x1b[0m issued server command: ".ltrim("$alias ")."/$cmd ".$params, true, true, 2); }else{ - console("[DEBUG] \x1b[33m*".$issuer."\x1b[0m issued server command: ".ltrim("$alias ")."/$cmd ".implode(" ", $params), true, true, 2); + console("[DEBUG] \x1b[33m*".$issuer."\x1b[0m issued server command: ".ltrim("$alias ")."/$cmd ".$params, true, true, 2); } + + if(preg_match_all('#@([@A-Za-z_]{1,})#', $params, $matches, PREG_OFFSET_CAPTURE) > 0){ + $offsetshift = 0; + foreach($matches[1] as $selector){ + if($selector[0]{0} === "@"){ //Escape! + $params = substr_replace($params, $selector[0], $selector[1] + $offsetshift - 1, strlen($selector[0]) + 1); + --$offsetshift; + continue; + } + switch(strtolower($selector[0])){ + case "player": + case "username": + $p = ($issuer instanceof Player) ? $issuer->username:$issuer; + $params = substr_replace($params, $p, $selector[1] + $offsetshift - 1, strlen($selector[0]) + 1); + $offsetshift += strlen($selector[0]) - strlen($p) + 1; + break; + case "all": + foreach($this->server->api->player->getAll() as $p){ + $this->run($cmd . " ". substr_replace($params, $p->username, $selector[1] + $offsetshift - 1, strlen($selector[0]) + 1), $issuer, $alias); + } + return; + case "random": + $l = array(); + foreach($this->server->api->player->getAll() as $p){ + if($p !== $issuer){ + $l[] = $p; + } + } + if(count($l) === 0){ + return; + } + + $p = $l[mt_rand(0, count($l) - 1)]->username; + $params = substr_replace($params, $p, $selector[1] + $offsetshift - 1, strlen($selector[0]) + 1); + $offsetshift += strlen($selector[0]) - strlen($p) + 1; + break; + } + } + } + + $params = explode(" ", $params); + if($this->server->api->dhandle("console.command.".$cmd, array("cmd" => $cmd, "parameters" => $params, "issuer" => $issuer, "alias" => $alias)) === false or $this->server->api->dhandle("console.command", array("cmd" => $cmd, "parameters" => $params, "issuer" => $issuer, "alias" => $alias)) === false){ $output = "You don't have permission to use this command.\n"; diff --git a/src/API/LevelAPI.php b/src/API/LevelAPI.php index dba1825e7..bf7b8d11c 100644 --- a/src/API/LevelAPI.php +++ b/src/API/LevelAPI.php @@ -46,21 +46,26 @@ class LevelAPI{ public function init(){ $this->default = $this->server->api->getProperty("level-name"); if($this->loadLevel($this->default) === false){ - $path = DATA_PATH."worlds/".$this->default."/"; - $generator = "SuperflatGenerator"; - if($this->server->api->getProperty("generator") !== false and class_exists($this->server->api->getProperty("generator"))){ - $generator = $this->server->api->getProperty("generator"); - } - $gen = new WorldGenerator($generator, $this->server->seed); - if($this->server->api->getProperty("generator-settings") !== false and trim($this->server->api->getProperty("generator-settings")) != ""){ - $gen->set("preset", $this->server->api->getProperty("generator-settings")); - } - $gen->init(); - $gen->generate(); - $gen->save($path, $this->default); + $this->generateLevel($this->default); $this->loadLevel($this->default); } $this->server->spawn = $this->getDefault()->getSpawn(); + $this->loadLevel("other"); + } + + public function generateLevel($name, $seed = false){ + $path = DATA_PATH."worlds/".$name."/"; + $generator = "SuperflatGenerator"; + if($this->server->api->getProperty("generator") !== false and class_exists($this->server->api->getProperty("generator"))){ + $generator = $this->server->api->getProperty("generator"); + } + $gen = new WorldGenerator($generator, ($seed === false ? Utils::readInt(Utils::getRandomBytes(4, false)):(int) $seed)); + if($this->server->api->getProperty("generator-settings") !== false and trim($this->server->api->getProperty("generator-settings")) != ""){ + $gen->set("preset", $this->server->api->getProperty("generator-settings")); + } + $gen->init(); + $gen->generate(); + $gen->save($path, $name); } public function loadLevel($name){ diff --git a/src/Player.php b/src/Player.php index 1e8ccb20f..c94cacb99 100644 --- a/src/Player.php +++ b/src/Player.php @@ -209,7 +209,7 @@ class Player{ "z" => $this->entity->z, )); $this->data->set("spawn", array( - "level" => $this->entity->level->getName(), + "level" => $this->spawnPosition->level->getName(), "x" => $this->spawnPosition->x, "y" => $this->spawnPosition->y, "z" => $this->spawnPosition->z, @@ -558,6 +558,10 @@ class Player{ if($pitch === false){ $pitch = $this->entity->yaw; } + if($pos instanceof Position and $pos->level !== $this->level){ + $this->level = $pos->level; + $this->chunksLoaded = array(); + } $this->lastCorrect = $pos; $this->entity->fallY = false; $this->entity->fallStart = false;