Merge pull request #947 from 99leonchang/master

Multiple orders for /gamemode
This commit is contained in:
Shoghi Cervantes 2013-11-24 14:20:04 -08:00
commit 336a40ae90

View File

@ -17,458 +17,468 @@
* @link http://www.pocketmine.net/ * @link http://www.pocketmine.net/
* *
* *
*/ */
class PlayerAPI{ class PlayerAPI{
private $server; private $server;
function __construct(){ function __construct(){
$this->server = ServerAPI::request(); $this->server = ServerAPI::request();
} }
public function init(){ public function init(){
$this->server->schedule(20 * 15, array($this, "handle"), 1, true, "server.regeneration"); $this->server->schedule(20 * 15, array($this, "handle"), 1, true, "server.regeneration");
$this->server->addHandler("player.death", array($this, "handle"), 1); $this->server->addHandler("player.death", array($this, "handle"), 1);
$this->server->api->console->register("list", "", array($this, "commandHandler")); $this->server->api->console->register("list", "", array($this, "commandHandler"));
$this->server->api->console->register("kill", "<player>", array($this, "commandHandler")); $this->server->api->console->register("kill", "<player>", array($this, "commandHandler"));
$this->server->api->console->register("gamemode", "<mode> [player]", array($this, "commandHandler")); $this->server->api->console->register("gamemode", "<mode> [player]", array($this, "commandHandler"));
$this->server->api->console->register("tp", "[target player] <destination player|w:world> OR /tp [target player] <x> <y> <z>", array($this, "commandHandler")); $this->server->api->console->register("tp", "[target player] <destination player|w:world> OR /tp [target player] <x> <y> <z>", array($this, "commandHandler"));
$this->server->api->console->register("spawnpoint", "[player] [x] [y] [z]", array($this, "commandHandler")); $this->server->api->console->register("spawnpoint", "[player] [x] [y] [z]", array($this, "commandHandler"));
$this->server->api->console->register("spawn", "", 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->register("ping", "", array($this, "commandHandler"));
$this->server->api->console->alias("lag", "ping"); $this->server->api->console->alias("lag", "ping");
$this->server->api->console->alias("suicide", "kill"); $this->server->api->console->alias("suicide", "kill");
$this->server->api->console->alias("tppos", "tp"); $this->server->api->console->alias("tppos", "tp");
$this->server->api->ban->cmdWhitelist("list"); $this->server->api->ban->cmdWhitelist("list");
$this->server->api->ban->cmdWhitelist("ping"); $this->server->api->ban->cmdWhitelist("ping");
$this->server->api->ban->cmdWhitelist("spawn"); $this->server->api->ban->cmdWhitelist("spawn");
$this->server->preparedSQL->selectPlayersToHeal = $this->server->database->prepare("SELECT EID FROM entities WHERE class = ".ENTITY_PLAYER." AND health < 20;"); $this->server->preparedSQL->selectPlayersToHeal = $this->server->database->prepare("SELECT EID FROM entities WHERE class = ".ENTITY_PLAYER." AND health < 20;");
} }
public function handle($data, $event){ public function handle($data, $event){
switch($event){ switch($event){
case "server.regeneration": case "server.regeneration":
if($this->server->difficulty === 0){ if($this->server->difficulty === 0){
$result = $this->server->preparedSQL->selectPlayersToHeal->execute(); $result = $this->server->preparedSQL->selectPlayersToHeal->execute();
if($result !== false){ if($result !== false){
while(($player = $result->fetchArray()) !== false){ while(($player = $result->fetchArray()) !== false){
if(($player = $this->server->api->entity->get($player["EID"])) !== false){ if(($player = $this->server->api->entity->get($player["EID"])) !== false){
if($player->getHealth() <= 0){ if($player->getHealth() <= 0){
continue; continue;
} }
$player->setHealth(min(20, $player->getHealth() + $data), "regeneration"); $player->setHealth(min(20, $player->getHealth() + $data), "regeneration");
} }
} }
return true; return true;
} }
} }
break; break;
case "player.death": case "player.death":
if(is_numeric($data["cause"])){ if(is_numeric($data["cause"])){
$e = $this->server->api->entity->get($data["cause"]); $e = $this->server->api->entity->get($data["cause"]);
if($e instanceof Entity){ if($e instanceof Entity){
switch($e->class){ switch($e->class){
case ENTITY_PLAYER: case ENTITY_PLAYER:
$message = " was killed by ".$e->name; $message = " was killed by ".$e->name;
break; break;
default: default:
$message = " was killed"; $message = " was killed";
break; break;
} }
} }
}else{ }else{
switch($data["cause"]){ switch($data["cause"]){
case "cactus": case "cactus":
$message = " was pricked to death"; $message = " was pricked to death";
break; break;
case "lava": case "lava":
$message = " tried to swim in lava"; $message = " tried to swim in lava";
break; break;
case "fire": case "fire":
$message = " went up in flames"; $message = " went up in flames";
break; break;
case "burning": case "burning":
$message = " burned to death"; $message = " burned to death";
break; break;
case "suffocation": case "suffocation":
$message = " suffocated in a wall"; $message = " suffocated in a wall";
break; break;
case "water": case "water":
$message = " drowned"; $message = " drowned";
break; break;
case "void": case "void":
$message = " fell out of the world"; $message = " fell out of the world";
break; break;
case "fall": case "fall":
$message = " hit the ground too hard"; $message = " hit the ground too hard";
break; break;
case "explosion": case "explosion":
$message = " blew up"; $message = " blew up";
break; break;
default: default:
$message = " died"; $message = " died";
break; break;
} }
} }
$this->server->api->chat->broadcast($data["player"]->username . $message); $this->server->api->chat->broadcast($data["player"]->username . $message);
return true; return true;
break; break;
} }
} }
public function commandHandler($cmd, $params, $issuer, $alias){ public function commandHandler($cmd, $params, $issuer, $alias){
$output = ""; $output = "";
switch($cmd){ switch($cmd){
case "spawnpoint": case "spawnpoint":
if(!($issuer instanceof Player)){ if(!($issuer instanceof Player)){
$output .= "Please run this command in-game.\n"; $output .= "Please run this command in-game.\n";
break; break;
} }
if(count($params) === 1 or count($params) === 4){ if(count($params) === 1 or count($params) === 4){
$target = $this->server->api->player->get(array_shift($params)); $target = $this->server->api->player->get(array_shift($params));
}else{ }else{
$target = $issuer; $target = $issuer;
} }
if(!($target instanceof Player)){ if(!($target instanceof Player)){
$output .= "That player cannot be found.\n"; $output .= "That player cannot be found.\n";
break; break;
} }
if(count($params) === 3){ if(count($params) === 3){
$spawn = new Position(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)), $issuer->level); $spawn = new Position(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)), $issuer->level);
}else{ }else{
$spawn = new Position($issuer->entity->x, $issuer->entity->y, $issuer->entity->z, $issuer->entity->level); $spawn = new Position($issuer->entity->x, $issuer->entity->y, $issuer->entity->z, $issuer->entity->level);
} }
$target->setSpawn($spawn); $target->setSpawn($spawn);
$output .= "Spawnpoint set correctly!\n"; $output .= "Spawnpoint set correctly!\n";
break; break;
case "spawn": case "spawn":
if(!($issuer instanceof Player)){ if(!($issuer instanceof Player)){
$output .= "Please run this command in-game.\n"; $output .= "Please run this command in-game.\n";
break; break;
} }
$issuer->teleport($this->server->spawn); $issuer->teleport($this->server->spawn);
break; break;
case "ping": case "ping":
if(!($issuer instanceof Player)){ if(!($issuer instanceof Player)){
$output .= "Please run this command in-game.\n"; $output .= "Please run this command in-game.\n";
break; break;
} }
$output .= "ping ".round($issuer->getLag(), 2)."ms, packet loss ".round($issuer->getPacketLoss() * 100, 2)."%, ".round($issuer->getBandwidth() / 1024, 2)." KB/s\n"; $output .= "ping ".round($issuer->getLag(), 2)."ms, packet loss ".round($issuer->getPacketLoss() * 100, 2)."%, ".round($issuer->getBandwidth() / 1024, 2)." KB/s\n";
break; break;
case "gamemode": case "gamemode":
$player = false; $player = false;
$gms = array( $setgm = false;
"0" => SURVIVAL, $gms = array(
"survival" => SURVIVAL, "0" => SURVIVAL,
"s" => SURVIVAL, "survival" => SURVIVAL,
"1" => CREATIVE, "s" => SURVIVAL,
"creative" => CREATIVE, "1" => CREATIVE,
"c" => CREATIVE, "creative" => CREATIVE,
"2" => ADVENTURE, "c" => CREATIVE,
"adventure" => ADVENTURE, "2" => ADVENTURE,
"a" => ADVENTURE, "adventure" => ADVENTURE,
"3" => VIEW, "a" => ADVENTURE,
"view" => VIEW, "3" => VIEW,
"viewer" => VIEW, "view" => VIEW,
"spectator" => VIEW, "viewer" => VIEW,
"v" => VIEW, "spectator" => VIEW,
); "v" => VIEW,
if($issuer instanceof Player){ );
$player = $issuer; if($issuer instanceof Player){
} $player = $issuer;
if(isset($params[1])){ }
$player = $this->server->api->player->get($params[1]); if(isset($params[1])){
} if($this->server->api->player->get($params[1]) instanceof Player){
if(!($player instanceof Player) or !isset($gms[strtolower($params[0])])){ $player = $this->server->api->player->get($params[1]);
$output .= "Usage: /$cmd <mode> [player]\n"; $setgm = $params[0];
break; }else if($this->server->api->player->get($params[0]) instanceof Player){
} $player = $this->server->api->player->get($params[0]);
if($player->setGamemode($gms[strtolower($params[0])])){ $setgm = $params[1];
$output .= "Gamemode of ".$player->username." changed to ".$player->getGamemode()."\n"; }else{
} $output .= "Usage: /$cmd <mode> [player] or /$cmd [player] <mode>\n";
break; 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)){ if(!($player instanceof Player) or !isset($gms[strtolower($setgm)])){
$name = $issuer->username; $output .= "Usage: /$cmd <mode> [player] or /$cmd [player] <mode>\n";
$target = implode(" ", $params); break;
}elseif(isset($params[1]) and isset($params[0])){ }
$name = array_shift($params); if($player->setGamemode($gms[strtolower($setgm)])){
$target = implode(" ", $params); $output .= "Gamemode of ".$player->username." changed to ".$player->getGamemode()."\n";
}else{ }
$output .= "Usage: /$cmd [target player] <destination player>\n"; break;
break; case "tp":
} if(count($params) <= 2 or substr($params[0], 0, 2) === "w:" or substr($params[1], 0, 2) === "w:"){
if($this->teleport($name, $target) !== false){ if((!isset($params[1]) or substr($params[0], 0, 2) === "w:") and isset($params[0]) and ($issuer instanceof Player)){
$output .= "\"$name\" teleported to \"$target\"\n"; $name = $issuer->username;
}else{ $target = implode(" ", $params);
$output .= "Couldn't teleport.\n"; }elseif(isset($params[1]) and isset($params[0])){
} $name = array_shift($params);
}else{ $target = implode(" ", $params);
if(!isset($params[3]) and isset($params[2]) and isset($params[1]) and isset($params[0]) and ($issuer instanceof Player)){ }else{
$name = $issuer->username; $output .= "Usage: /$cmd [target player] <destination player>\n";
$x = $params[0]; break;
$y = $params[1]; }
$z = $params[2]; if($this->teleport($name, $target) !== false){
}elseif(isset($params[3]) and isset($params[2]) and isset($params[1]) and isset($params[0])){ $output .= "\"$name\" teleported to \"$target\"\n";
$name = $params[0]; }else{
$x = $params[1]; $output .= "Couldn't teleport.\n";
$y = $params[2]; }
$z = $params[3]; }else{
}else{ if(!isset($params[3]) and isset($params[2]) and isset($params[1]) and isset($params[0]) and ($issuer instanceof Player)){
$output .= "Usage: /$cmd [player] <x> <y> <z>\n"; $name = $issuer->username;
break; $x = $params[0];
} $y = $params[1];
if($this->tppos($name, $x, $y, $z)){ $z = $params[2];
$output .= "\"$name\" teleported to ($x, $y, $z)\n"; }elseif(isset($params[3]) and isset($params[2]) and isset($params[1]) and isset($params[0])){
}else{ $name = $params[0];
$output .= "Couldn't teleport.\n"; $x = $params[1];
} $y = $params[2];
} $z = $params[3];
break; }else{
case "kill": $output .= "Usage: /$cmd [player] <x> <y> <z>\n";
case "suicide": break;
if(!isset($params[0]) and ($issuer instanceof Player)){ }
$player = $issuer; if($this->tppos($name, $x, $y, $z)){
}else{ $output .= "\"$name\" teleported to ($x, $y, $z)\n";
$player = $this->get($params[0]); }else{
} $output .= "Couldn't teleport.\n";
if($player instanceof Player){ }
$player->entity->harm(1000, "console", true); }
$player->sendChat("Ouch. That looks like it hurt.\n"); break;
}else{ case "kill":
$output .= "Usage: /$cmd [player]\n"; case "suicide":
} if(!isset($params[0]) and ($issuer instanceof Player)){
break; $player = $issuer;
case "list": }else{
$output .= "There are ".count($this->server->clients)."/".$this->server->maxClients." players online:\n"; $player = $this->get($params[0]);
if(count($this->server->clients) == 0){ }
break; if($player instanceof Player){
} $player->entity->harm(1000, "console", true);
foreach($this->server->clients as $c){ $player->sendChat("Ouch. That looks like it hurt.\n");
$output .= $c->username.", "; }else{
} $output .= "Usage: /$cmd [player]\n";
$output = substr($output, 0, -2)."\n"; }
break; break;
} case "list":
return $output; $output .= "There are ".count($this->server->clients)."/".$this->server->maxClients." players online:\n";
} if(count($this->server->clients) == 0){
break;
}
foreach($this->server->clients as $c){
$output .= $c->username.", ";
}
$output = substr($output, 0, -2)."\n";
break;
}
return $output;
}
public function teleport(&$name, &$target){ public function teleport(&$name, &$target){
if(substr($target, 0, 2) === "w:"){ if(substr($target, 0, 2) === "w:"){
$lv = $this->server->api->level->get(substr($target, 2)); $lv = $this->server->api->level->get(substr($target, 2));
if($lv instanceof Level){ if($lv instanceof Level){
$origin = $this->get($name); $origin = $this->get($name);
if($origin instanceof Player){ if($origin instanceof Player){
$name = $origin->username; $name = $origin->username;
return $origin->teleport($lv->getSafeSpawn()); return $origin->teleport($lv->getSafeSpawn());
} }
}else{ }else{
return false; return false;
} }
} }
$player = $this->get($target); $player = $this->get($target);
if(($player instanceof Player) and ($player->entity instanceof Entity)){ if(($player instanceof Player) and ($player->entity instanceof Entity)){
$target = $player->username; $target = $player->username;
$origin = $this->get($name); $origin = $this->get($name);
if($origin instanceof Player){ if($origin instanceof Player){
$name = $origin->username; $name = $origin->username;
return $origin->teleport($player->entity); return $origin->teleport($player->entity);
} }
} }
return false; return false;
} }
public function tppos(&$name, &$x, &$y, &$z){ public function tppos(&$name, &$x, &$y, &$z){
$player = $this->get($name); $player = $this->get($name);
if(($player instanceof Player) and ($player->entity instanceof Entity)){ if(($player instanceof Player) and ($player->entity instanceof Entity)){
$name = $player->username; $name = $player->username;
$x = $x{0} === "~" ? $player->entity->x + floatval(substr($x, 1)):floatval($x); $x = $x{0} === "~" ? $player->entity->x + floatval(substr($x, 1)):floatval($x);
$y = $y{0} === "~" ? $player->entity->y + floatval(substr($y, 1)):floatval($y); $y = $y{0} === "~" ? $player->entity->y + floatval(substr($y, 1)):floatval($y);
$z = $z{0} === "~" ? $player->entity->z + floatval(substr($z, 1)):floatval($z); $z = $z{0} === "~" ? $player->entity->z + floatval(substr($z, 1)):floatval($z);
$player->teleport(new Vector3($x, $y, $z)); $player->teleport(new Vector3($x, $y, $z));
return true; return true;
} }
return false; return false;
} }
public function get($name, $alike = true){ public function get($name, $alike = true){
$name = trim(strtolower($name)); $name = trim(strtolower($name));
if($name === ""){ if($name === ""){
return false; return false;
} }
$CID = $this->server->query("SELECT ip,port FROM players WHERE name ".($alike === true ? "LIKE '%".$name."%'":"= '".$name."'").";", true); $CID = $this->server->query("SELECT ip,port FROM players WHERE name ".($alike === true ? "LIKE '%".$name."%'":"= '".$name."'").";", true);
$CID = PocketMinecraftServer::clientID($CID["ip"], $CID["port"]); $CID = PocketMinecraftServer::clientID($CID["ip"], $CID["port"]);
if(isset($this->server->clients[$CID])){ if(isset($this->server->clients[$CID])){
return $this->server->clients[$CID]; return $this->server->clients[$CID];
} }
return false; return false;
} }
public function getAll($level = null){ public function getAll($level = null){
if($level instanceof Level){ if($level instanceof Level){
$clients = array(); $clients = array();
$l = $this->server->query("SELECT EID FROM entities WHERE level = '".$level->getName()."' AND class = '".ENTITY_PLAYER."';"); $l = $this->server->query("SELECT EID FROM entities WHERE level = '".$level->getName()."' AND class = '".ENTITY_PLAYER."';");
if($l !== false and $l !== true){ if($l !== false and $l !== true){
while(($e = $l->fetchArray(SQLITE3_ASSOC)) !== false){ while(($e = $l->fetchArray(SQLITE3_ASSOC)) !== false){
$e = $this->getByEID($e["EID"]); $e = $this->getByEID($e["EID"]);
if($e instanceof Player){ if($e instanceof Player){
$clients[$e->CID] = $e; $clients[$e->CID] = $e;
} }
} }
} }
return $clients; return $clients;
} }
return $this->server->clients; return $this->server->clients;
} }
public function broadcastPacket(array $players, $id, $data = array()){ public function broadcastPacket(array $players, $id, $data = array()){
$data = new CustomPacketHandler($id, "", $data, true); $data = new CustomPacketHandler($id, "", $data, true);
$packet = array("raw" => chr($id).$data->raw); $packet = array("raw" => chr($id).$data->raw);
foreach($players as $p){ foreach($players as $p){
$p->dataPacket(false, $packet); $p->dataPacket(false, $packet);
} }
} }
public function getByEID($eid){ public function getByEID($eid){
$eid = (int) $eid; $eid = (int) $eid;
$CID = $this->server->query("SELECT ip,port FROM players WHERE EID = '".$eid."';", true); $CID = $this->server->query("SELECT ip,port FROM players WHERE EID = '".$eid."';", true);
$CID = PocketMinecraftServer::clientID($CID["ip"], $CID["port"]); $CID = PocketMinecraftServer::clientID($CID["ip"], $CID["port"]);
if(isset($this->server->clients[$CID])){ if(isset($this->server->clients[$CID])){
return $this->server->clients[$CID]; return $this->server->clients[$CID];
} }
return false; return false;
} }
public function online(){ public function online(){
$o = array(); $o = array();
foreach($this->server->clients as $p){ foreach($this->server->clients as $p){
if($p->auth === true){ if($p->auth === true){
$o[] = $p->username; $o[] = $p->username;
} }
} }
return $o; return $o;
} }
public function add($CID){ public function add($CID){
if(isset($this->server->clients[$CID])){ if(isset($this->server->clients[$CID])){
$player = $this->server->clients[$CID]; $player = $this->server->clients[$CID];
$player->data = $this->getOffline($player->username); $player->data = $this->getOffline($player->username);
$player->gamemode = $player->data->get("gamemode"); $player->gamemode = $player->data->get("gamemode");
if(($player->level = $this->server->api->level->get($player->data->get("position")["level"])) === false){ if(($player->level = $this->server->api->level->get($player->data->get("position")["level"])) === false){
$player->level = $this->server->api->level->getDefault(); $player->level = $this->server->api->level->getDefault();
$player->data->set("position", array( $player->data->set("position", array(
"level" => $player->level->getName(), "level" => $player->level->getName(),
"x" => $player->level->getSpawn()->x, "x" => $player->level->getSpawn()->x,
"y" => $player->level->getSpawn()->y, "y" => $player->level->getSpawn()->y,
"z" => $player->level->getSpawn()->z, "z" => $player->level->getSpawn()->z,
)); ));
} }
$this->server->query("INSERT OR REPLACE INTO players (CID, ip, port, name) VALUES (".$player->CID.", '".$player->ip."', ".$player->port.", '".strtolower($player->username)."');"); $this->server->query("INSERT OR REPLACE INTO players (CID, ip, port, name) VALUES (".$player->CID.", '".$player->ip."', ".$player->port.", '".strtolower($player->username)."');");
} }
} }
public function spawnAllPlayers(Player $player){ public function spawnAllPlayers(Player $player){
foreach($this->getAll() as $p){ foreach($this->getAll() as $p){
if($p !== $player and ($p->entity instanceof Entity)){ if($p !== $player and ($p->entity instanceof Entity)){
$p->entity->spawn($player); $p->entity->spawn($player);
if($p->level !== $player->level){ if($p->level !== $player->level){
$player->dataPacket(MC_MOVE_ENTITY_POSROT, array( $player->dataPacket(MC_MOVE_ENTITY_POSROT, array(
"eid" => $p->entity->eid, "eid" => $p->entity->eid,
"x" => -256, "x" => -256,
"y" => 128, "y" => 128,
"z" => -256, "z" => -256,
"yaw" => 0, "yaw" => 0,
"pitch" => 0, "pitch" => 0,
)); ));
} }
} }
} }
} }
public function spawnToAllPlayers(Player $player){ public function spawnToAllPlayers(Player $player){
foreach($this->getAll() as $p){ foreach($this->getAll() as $p){
if($p !== $player and ($p->entity instanceof Entity)){ if($p !== $player and ($p->entity instanceof Entity)){
$player->entity->spawn($p); $player->entity->spawn($p);
if($p->level !== $player->level){ if($p->level !== $player->level){
$p->dataPacket(MC_MOVE_ENTITY_POSROT, array( $p->dataPacket(MC_MOVE_ENTITY_POSROT, array(
"eid" => $player->entity->eid, "eid" => $player->entity->eid,
"x" => -256, "x" => -256,
"y" => 128, "y" => 128,
"z" => -256, "z" => -256,
"yaw" => 0, "yaw" => 0,
"pitch" => 0, "pitch" => 0,
)); ));
} }
} }
} }
} }
public function remove($CID){ public function remove($CID){
if(isset($this->server->clients[$CID])){ if(isset($this->server->clients[$CID])){
$player = $this->server->clients[$CID]; $player = $this->server->clients[$CID];
unset($this->server->clients[$CID]); unset($this->server->clients[$CID]);
$player->close(); $player->close();
if($player->username != "" and ($player->data instanceof Config)){ if($player->username != "" and ($player->data instanceof Config)){
$this->saveOffline($player->data); $this->saveOffline($player->data);
} }
$this->server->query("DELETE FROM players WHERE name = '".$player->username."';"); $this->server->query("DELETE FROM players WHERE name = '".$player->username."';");
if($player->entity instanceof Entity){ if($player->entity instanceof Entity){
unset($player->entity->player); unset($player->entity->player);
unset($player->entity); unset($player->entity);
} }
$this->server->api->entity->remove($player->eid); $this->server->api->entity->remove($player->eid);
$player = null; $player = null;
unset($player); unset($player);
} }
} }
public function getOffline($name){ public function getOffline($name){
$iname = strtolower($name); $iname = strtolower($name);
$default = array( $default = array(
"caseusername" => $name, "caseusername" => $name,
"position" => array( "position" => array(
"level" => $this->server->spawn->level->getName(), "level" => $this->server->spawn->level->getName(),
"x" => $this->server->spawn->x, "x" => $this->server->spawn->x,
"y" => $this->server->spawn->y, "y" => $this->server->spawn->y,
"z" => $this->server->spawn->z, "z" => $this->server->spawn->z,
), ),
"spawn" => array( "spawn" => array(
"level" => $this->server->spawn->level->getName(), "level" => $this->server->spawn->level->getName(),
"x" => $this->server->spawn->x, "x" => $this->server->spawn->x,
"y" => $this->server->spawn->y, "y" => $this->server->spawn->y,
"z" => $this->server->spawn->z, "z" => $this->server->spawn->z,
), ),
"inventory" => array_fill(0, PLAYER_SURVIVAL_SLOTS, array(AIR, 0, 0)), "inventory" => array_fill(0, PLAYER_SURVIVAL_SLOTS, array(AIR, 0, 0)),
"armor" => array_fill(0, 4, array(AIR, 0)), "armor" => array_fill(0, 4, array(AIR, 0)),
"gamemode" => $this->server->gamemode, "gamemode" => $this->server->gamemode,
"health" => 20, "health" => 20,
"lastIP" => "", "lastIP" => "",
"lastID" => 0, "lastID" => 0,
"achievements" => array(), "achievements" => array(),
); );
if(!file_exists(DATA_PATH."players/".$iname.".yml")){ if(!file_exists(DATA_PATH."players/".$iname.".yml")){
console("[NOTICE] Player data not found for \"".$iname."\", creating new profile"); console("[NOTICE] Player data not found for \"".$iname."\", creating new profile");
$data = new Config(DATA_PATH."players/".$iname.".yml", CONFIG_YAML, $default); $data = new Config(DATA_PATH."players/".$iname.".yml", CONFIG_YAML, $default);
$data->save(); $data->save();
}else{ }else{
$data = new Config(DATA_PATH."players/".$iname.".yml", CONFIG_YAML, $default); $data = new Config(DATA_PATH."players/".$iname.".yml", CONFIG_YAML, $default);
} }
if(($data->get("gamemode") & 0x01) === 1){ if(($data->get("gamemode") & 0x01) === 1){
$data->set("health", 20); $data->set("health", 20);
} }
$this->server->handle("player.offline.get", $data); $this->server->handle("player.offline.get", $data);
return $data; return $data;
} }
public function saveOffline(Config $data){ public function saveOffline(Config $data){
$this->server->handle("player.offline.save", $data); $this->server->handle("player.offline.save", $data);
$data->save(); $data->save();
} }
} }