server = ServerAPI::request(); } public function init(){ $this->server->schedule(20 * 15, array($this, "handle"), 1, true, "server.regeneration"); $this->server->addHandler("player.death", array($this, "handle"), 1); $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 /tp [target player] ", array($this, "commandHandler")); $this->server->api->console->register("spawnpoint", "[player | w:world] [x] [y] [z]", array($this, "commandHandler")); $this->server->api->console->register("spawn", "", array($this, "commandHandler")); $this->server->api->console->register("ping", "", array($this, "commandHandler")); $this->server->api->console->alias("lag", "ping"); $this->server->api->console->alias("suicide", "kill"); $this->server->api->console->alias("tppos", "tp"); $this->server->api->ban->cmdWhitelist("list"); $this->server->api->ban->cmdWhitelist("ping"); $this->server->api->ban->cmdWhitelist("spawn"); } public function handle($data, $event){ switch($event){ case "server.regeneration": /*if($this->server->difficulty === 0){ $result = $this->server->preparedSQL->selectPlayersToHeal->execute(); if($result !== false){ while(($player = $result->fetchArray()) !== false){ if(($player = Entity\Entity::get($player["EID"])) !== false){ if($player->getHealth() <= 0){ continue; } $player->setHealth(min(20, $player->getHealth() + $data), "regeneration"); } } return true; } }*/ break; case "player.death": if(is_numeric($data["cause"])){ $e = Entity\Entity::get($data["cause"]); if($e instanceof Entity\Entity){ switch($e->class){ case ENTITY_PLAYER: $message = " was killed by ".$e->name; break; default: $message = " was killed"; break; } } }else{ switch($data["cause"]){ case "cactus": $message = " was pricked to death"; break; case "lava": $message = " tried to swim in lava"; break; case "fire": $message = " went up in flames"; break; case "burning": $message = " burned to death"; break; case "suffocation": $message = " suffocated in a wall"; break; case "water": $message = " drowned"; break; case "void": $message = " fell out of the world"; break; case "fall": $message = " hit the ground too hard"; break; case "explosion": $message = " blew up"; break; default: $message = " died"; break; } } $this->server->api->chat->broadcast($data["player"]->getUsername() . $message); return true; } } public function commandHandler($cmd, $params, $issuer, $alias){ $output = ""; switch($cmd){ case "spawnpoint": if(count($params) === 0){ $output .= "Usage: /$cmd [player | w:world] [x] [y] [z]\n"; break; } if(!($issuer instanceof Player) and count($params) < 4){ $output .= "Please run this command in-game.\n"; break; } if(count($params) === 1 or count($params) === 4){ $tg = array_shift($params); if(count($params) === 3 and substr($tg, 0, 2) === "w:"){ $target = $this->server->api->level->get(substr($tg, 2)); }else{ $target = Player::get($tg); } }else{ $target = $issuer; } if(!($target instanceof Player) and !($target instanceof Level\Level)){ $output .= "That player cannot be found.\n"; break; } if(count($params) === 3){ if($target instanceof Level){ $spawn = new Math\Vector3(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params))); }else{ $spawn = new Level\Position(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)), $issuer->level); } }else{ $spawn = new Level\Position($issuer->entity->x, $issuer->entity->y, $issuer->entity->z, $issuer->entity->level); } $target->setSpawn($spawn); if($target instanceof Level){ $output .= "Spawnpoint of world ".$target->getName()." set correctly!\n"; }elseif($target !== $issuer){ $output .= "Spawnpoint of ".$target->getUsername()." set correctly!\n"; }else{ $output .= "Spawnpoint set correctly!\n"; } break; case "spawn": if(!($issuer instanceof Player)){ $output .= "Please run this command in-game.\n"; break; } $issuer->teleport($this->server->spawn); break; case "ping": if(!($issuer instanceof Player)){ $output .= "Please run this command in-game.\n"; break; } $output .= "ping ".round($issuer->getLag(), 2)."ms, packet loss ".round($issuer->getPacketLoss() * 100, 2)."%, ".round($issuer->getBandwidth() / 1024, 2)." KB/s\n"; break; case "gamemode": $player = false; $setgm = false; $gms = array( "0" => SURVIVAL, "survival" => SURVIVAL, "s" => SURVIVAL, "1" => CREATIVE, "creative" => CREATIVE, "c" => CREATIVE, "2" => ADVENTURE, "adventure" => ADVENTURE, "a" => ADVENTURE, "3" => VIEW, "view" => VIEW, "viewer" => VIEW, "spectator" => VIEW, "v" => VIEW, ); if(isset($params[1])){ if(Player::get($params[1]) instanceof Player){ $player = Player::get($params[1]); $setgm = $params[0]; }elseif(Player::get($params[0]) instanceof Player){ $player = Player::get($params[0]); $setgm = $params[1]; }else{ $output .= "Usage: /$cmd [player] or /$cmd [player] \n"; break; } }elseif(isset($params[0])){ if(!(Player::get($params[0]) instanceof Player)){ if($issuer instanceof Player){ $setgm = $params[0]; $player = $issuer; } } } if(!($player instanceof Player) or !isset($gms[strtolower($setgm)])){ $output .= "Usage: /$cmd [player] or /$cmd [player] \n"; break; } if($player->setGamemode($gms[strtolower($setgm)])){ $output .= "Gamemode of ".$player->getUsername()." changed to ".$player->getGamemode()."\n"; } break; case "tp": if(count($params) <= 2 or substr($params[0], 0, 2) === "w:" or substr($params[1], 0, 2) === "w:"){ if((!isset($params[1]) or substr($params[0], 0, 2) === "w:") and isset($params[0]) and ($issuer instanceof Player)){ $name = $issuer->getUsername(); $target = implode(" ", $params); }elseif(isset($params[1]) and isset($params[0])){ $name = array_shift($params); $target = implode(" ", $params); }else{ $output .= "Usage: /$cmd [target player] \n"; break; } if($this->teleport($name, $target) !== false){ $output .= "\"$name\" teleported to \"$target\"\n"; }else{ $output .= "Couldn't teleport.\n"; } }else{ if(!isset($params[3]) and isset($params[2]) and isset($params[1]) and isset($params[0]) and ($issuer instanceof Player)){ $name = $issuer->getUsername(); $x = $params[0]; $y = $params[1]; $z = $params[2]; }elseif(isset($params[3]) and isset($params[2]) and isset($params[1]) and isset($params[0])){ $name = $params[0]; $x = $params[1]; $y = $params[2]; $z = $params[3]; }else{ $output .= "Usage: /$cmd [player] \n"; break; } if($this->tppos($name, $x, $y, $z)){ $output .= "\"$name\" teleported to ($x, $y, $z)\n"; }else{ $output .= "Couldn't teleport.\n"; } } break; case "kill": case "suicide": if(!isset($params[0]) and ($issuer instanceof Player)){ $player = $issuer; }else{ $player = Player::get($params[0]); } if($player instanceof Player){ $player->entity->harm(1000, "console", true); $player->sendChat("Ouch. That looks like it hurt.\n"); }else{ $output .= "Usage: /$cmd [player]\n"; } break; case "list": $output .= "There are ".count(Player::$list)."/".$this->server->maxClients." players online:\n"; if(count(Player::$list) == 0){ break; } foreach(Player::$list as $c){ $output .= $c->getUsername().", "; } $output = substr($output, 0, -2)."\n"; break; } return $output; } public function teleport(&$name, &$target){ if(substr($target, 0, 2) === "w:"){ $lv = $this->server->api->level->get(substr($target, 2)); if($lv instanceof Level){ $origin = Player::get($name); if($origin instanceof Player){ $name = $origin->getUsername(); return $origin->teleport($lv->getSafeSpawn()); } }else{ return false; } } $player = Player::get($target); if($player instanceof Player and $player->spawned === true){ $target = $player->getUsername(); $origin = Player::get($name); if($origin instanceof Player){ $name = $origin->getUsername(); return $origin->teleport($player->entity); } } return false; } public function tppos(&$name, &$x, &$y, &$z){ $player = Player::get($name); if($player instanceof Player and $player->spawned === true){ $name = $player->getUsername(); $x = $x{0} === "~" ? $player->entity->x + floatval(substr($x, 1)):floatval($x); $y = $y{0} === "~" ? $player->entity->y + floatval(substr($y, 1)):floatval($y); $z = $z{0} === "~" ? $player->entity->z + floatval(substr($z, 1)):floatval($z); $player->teleport(new Math\Vector3($x, $y, $z)); return true; } return false; } }