diff --git a/src/API/ConsoleAPI.php b/src/API/ConsoleAPI.php index 9a3a40eba1..35ea546c0b 100644 --- a/src/API/ConsoleAPI.php +++ b/src/API/ConsoleAPI.php @@ -205,7 +205,7 @@ class ConsoleAPI{ 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){ + if(preg_match_all('#@([@a-z]{1,})#', $params, $matches, PREG_OFFSET_CAPTURE) > 0){ $offsetshift = 0; foreach($matches[1] as $selector){ if($selector[0]{0} === "@"){ //Escape! @@ -214,18 +214,27 @@ class ConsoleAPI{ continue; } switch(strtolower($selector[0])){ + case "u": 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 "w": + case "world": + $p = ($issuer instanceof Player) ? $issuer->level->getName():$this->server->api->level->getDefault()->getName(); + $params = substr_replace($params, $p, $selector[1] + $offsetshift - 1, strlen($selector[0]) + 1); + $offsetshift -= strlen($selector[0]) - strlen($p) + 1; + break; + case "a": case "all": $output = ""; foreach($this->server->api->player->getAll() as $p){ $output .= $this->run($cmd . " ". substr_replace($params, $p->username, $selector[1] + $offsetshift - 1, strlen($selector[0]) + 1), $issuer, $alias); } return $output; + case "r": case "random": $l = array(); foreach($this->server->api->player->getAll() as $p){ diff --git a/src/API/PlayerAPI.php b/src/API/PlayerAPI.php index 1b424d7343..010ddebc50 100644 --- a/src/API/PlayerAPI.php +++ b/src/API/PlayerAPI.php @@ -37,7 +37,8 @@ class PlayerAPI{ $this->server->api->console->register("list", "", array($this, "commandHandler")); $this->server->api->console->register("kill", "", array($this, "commandHandler")); $this->server->api->console->register("gamemode", " [player]", array($this, "commandHandler")); - $this->server->api->console->register("tp", "[target player] OR [target player] ", array($this, "commandHandler")); + $this->server->api->console->register("tp", "[target player] OR /tp [target player] ", array($this, "commandHandler")); + $this->server->api->console->register("spawnpoint", "[player] [x] [y] [z]", array($this, "commandHandler")); $this->server->api->console->register("spawn", "[world]", array($this, "commandHandler")); $this->server->api->console->register("lag", "", array($this, "commandHandler")); $this->server->api->console->alias("suicide", "kill"); @@ -115,12 +116,39 @@ class PlayerAPI{ public function commandHandler($cmd, $params, $issuer, $alias){ $output = ""; switch($cmd){ - case "spawn": - if(count($params) > 1){ - $player = $this->server->api->player->get(array_pop($params)); - }else{ - $player = $issuer; + case "spawnpoint": + if(!($issuer instanceof Player)){ + $output .= "Please run this command in-game.\n"; + break; } + + if(count($params) === 1 or count($params) === 4){ + $target = $this->server->api->player->get(array_shift($params)); + }else{ + $target = $issuer; + } + + if(!($target instanceof Player)){ + $output .= "That player cannot be found.\n"; + break; + } + + if(count($params) === 3){ + $spawn = new Position(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)), $issuer->level); + }else{ + $spawn = new Position($issuer->x, $issuer->y, $issuer->z, $issuer->level); + } + + $target->setSpawn($spawn); + + $output .= "Spawnpoint set correctly!\n"; + break; + case "spawn": + if(!($issuer instanceof Player)){ + $output .= "Please run this command in-game.\n"; + break; + } + if(isset($params[0])){ $lv = $this->server->api->level->get(trim(implode(" ",$params))); if($lv === false){ @@ -132,11 +160,7 @@ class PlayerAPI{ $spawn = $this->server->api->level->getDefault()->getSpawn(); } - if(!($player instanceof Player)){ - $output .= "Couldn't respawn.\n"; - break; - } - $player->teleport($spawn); + $issuer->teleport($spawn); break; case "lag": if(!($issuer instanceof Player)){ diff --git a/src/Player.php b/src/Player.php index 9f29977bfc..25c8633a05 100644 --- a/src/Player.php +++ b/src/Player.php @@ -94,9 +94,11 @@ class Player{ console("[DEBUG] New Session started with ".$ip.":".$port.". MTU ".$this->MTU.", Client ID ".$this->clientID, true, true, 2); } - public function setSpawn(Vector3 $pos, $level){ - if(($level = $this->server->api->level->get($level)) === false){ - $level = $this->server->api->level->getDefault(); + public function setSpawn(Vector3 $pos){ + if(!($pos instanceof Level)){ + $level = $this->level; + }else{ + $level = $pos->level; } $this->spawnPosition = new Position($pos->x, $pos->y, $pos->z, $level); $this->dataPacket(MC_SET_SPAWN_POSITION, array(