diff --git a/src/API/PlayerAPI.php b/src/API/PlayerAPI.php index f71d7a2a7..a0e1b55d7 100644 --- a/src/API/PlayerAPI.php +++ b/src/API/PlayerAPI.php @@ -326,84 +326,4 @@ class PlayerAPI{ } return false; } - - public function broadcastPacket(array $players, RakNetDataPacket $packet){ - foreach($players as $p){ - $p->dataPacket(clone $packet); - } - } - - public function online(){ - $o = array(); - foreach(Player::$list as $p){ - if($p->auth === true){ - $o[] = $p->username; - } - } - return $o; - } - - //TODO (remove) - public function add($CID){ - if(isset(Player::$list[$CID])){ - $player =Player::$list[$CID]; - $player->data = $this->getOffline($player->username); - $player->gamemode = $player->data->get("gamemode"); - if(($player->level = $this->server->api->level->get($player->data->get("position")["level"])) === false){ - $player->level = $this->server->api->level->getDefault(); - $player->data->set("position", array( - "level" => $player->level->getName(), - "x" => $player->level->getSpawn()->x, - "y" => $player->level->getSpawn()->y, - "z" => $player->level->getSpawn()->z, - )); - } - } - } - - public function getOffline($name){ - $iname = strtolower($name); - $default = array( - "caseusername" => $name, - "position" => array( - "level" => $this->server->spawn->level->getName(), - "x" => $this->server->spawn->x, - "y" => $this->server->spawn->y, - "z" => $this->server->spawn->z, - ), - "spawn" => array( - "level" => $this->server->spawn->level->getName(), - "x" => $this->server->spawn->x, - "y" => $this->server->spawn->y, - "z" => $this->server->spawn->z, - ), - "inventory" => array_fill(0, PLAYER_SURVIVAL_SLOTS, array(AIR, 0, 0)), - "hotbar" => array(0, -1, -1, -1, -1, -1, -1, -1, -1), - "armor" => array_fill(0, 4, array(AIR, 0)), - "gamemode" => $this->server->gamemode, - "health" => 20, - "lastIP" => "", - "lastID" => 0, - "achievements" => array(), - ); - - if(!file_exists(DATA_PATH."players/".$iname.".yml")){ - console("[NOTICE] Player data not found for \"".$iname."\", creating new profile"); - $data = new Config(DATA_PATH."players/".$iname.".yml", Config::YAML, $default); - $data->save(); - }else{ - $data = new Config(DATA_PATH."players/".$iname.".yml", Config::YAML, $default); - } - - if(($data->get("gamemode") & 0x01) === 1){ - $data->set("health", 20); - } - $this->server->handle("player.offline.get", $data); - return $data; - } - - public function saveOffline(Config $data){ - $this->server->handle("player.offline.save", $data); - $data->save(); - } } diff --git a/src/EntityOLD.php b/src/EntityOLD.php index 5bca5d1fa..8c12f4347 100644 --- a/src/EntityOLD.php +++ b/src/EntityOLD.php @@ -588,7 +588,7 @@ class EntityOLD extends Position{ $pk->yaw = $this->yaw; $pk->pitch = $this->pitch; $pk->bodyYaw = $this->yaw; - $this->server->api->player->broadcastPacket($players, $pk); + Player::broadcastPacket($players, $pk); }else{ $pk = new MoveEntityPacket_PosRot; $pk->eid = $this->eid; @@ -597,7 +597,7 @@ class EntityOLD extends Position{ $pk->z = $this->z; $pk->yaw = $this->yaw; $pk->pitch = $this->pitch; - $this->server->api->player->broadcastPacket($players, $pk); + Player::broadcastPacket($players, $pk); } } }else{ @@ -1029,7 +1029,7 @@ class EntityOLD extends Position{ $pk->z = -256; $pk->yaw = 0; $pk->pitch = 0; - $this->server->api->player->broadcastPacket($this->level->players, $pk); + Player::broadcastPacket($this->level->players, $pk); }else{ $this->server->api->dhandle("entity.event", array("entity" => $this, "event" => 3)); //Entity dead } diff --git a/src/Player.php b/src/Player.php index c15b05505..0c81c6cfe 100644 --- a/src/Player.php +++ b/src/Player.php @@ -119,6 +119,59 @@ class Player extends PlayerEntity{ public static function getAll(){ return Player::$list; } + + public static function getOffline($name){ + $server = ServerAPI::request(); + $iname = strtolower($name); + $default = array( + "caseusername" => $name, + "position" => array( + "level" => $server->spawn->level->getName(), + "x" => $server->spawn->x, + "y" => $server->spawn->y, + "z" => $server->spawn->z, + ), + "spawn" => array( + "level" => $server->spawn->level->getName(), + "x" => $server->spawn->x, + "y" => $server->spawn->y, + "z" => $server->spawn->z, + ), + "inventory" => array_fill(0, PLAYER_SURVIVAL_SLOTS, array(AIR, 0, 0)), + "hotbar" => array(0, -1, -1, -1, -1, -1, -1, -1, -1), + "armor" => array_fill(0, 4, array(AIR, 0)), + "gamemode" => $server->gamemode, + "health" => 20, + "lastIP" => "", + "lastID" => 0, + "achievements" => array(), + ); + + if(!file_exists(DATA_PATH."players/".$iname.".yml")){ + console("[NOTICE] Player data not found for \"".$iname."\", creating new profile"); + $data = new Config(DATA_PATH."players/".$iname.".yml", Config::YAML, $default); + $data->save(); + }else{ + $data = new Config(DATA_PATH."players/".$iname.".yml", Config::YAML, $default); + } + + if(($data->get("gamemode") & 0x01) === 1){ + $data->set("health", 20); + } + $server->handle("player.offline.get", $data); + return $data; + } + + public static function saveOffline(Config $data){ + ServerAPI::request()->handle("player.offline.save", $data); + $data->save(); + } + + public static function broadcastPacket(array $players, RakNetDataPacket $packet){ + foreach($players as $player){ + $player->dataPacket(clone $packet); + } + } /** * @param integer $clientID @@ -293,43 +346,39 @@ class Player extends PlayerEntity{ } public function save(){ - if($this->entity instanceof Entity){ - $this->data->set("achievements", $this->achievements); - $this->data->set("position", array( - "level" => $this->entity->level->getName(), - "x" => $this->entity->x, - "y" => $this->entity->y, - "z" => $this->entity->z, - )); - $this->data->set("spawn", array( - "level" => $this->spawnPosition->level->getName(), - "x" => $this->spawnPosition->x, - "y" => $this->spawnPosition->y, - "z" => $this->spawnPosition->z, - )); - $inv = array(); - foreach($this->inventory as $slot => $item){ - if($item instanceof Item){ - if($slot < (($this->gamemode & 0x01) === 0 ? PLAYER_SURVIVAL_SLOTS:PLAYER_CREATIVE_SLOTS)){ - $inv[$slot] = array($item->getID(), $item->getMetadata(), $item->count); - } + $this->data->set("achievements", $this->achievements); + $this->data->set("position", array( + "level" => $this->level->getName(), + "x" => $this->x, + "y" => $this->y, + "z" => $this->z, + )); + $this->data->set("spawn", array( + "level" => $this->spawnPosition->level->getName(), + "x" => $this->spawnPosition->x, + "y" => $this->spawnPosition->y, + "z" => $this->spawnPosition->z, + )); + $inv = array(); + foreach($this->inventory as $slot => $item){ + if($item instanceof Item){ + if($slot < (($this->gamemode & 0x01) === 0 ? PLAYER_SURVIVAL_SLOTS:PLAYER_CREATIVE_SLOTS)){ + $inv[$slot] = array($item->getID(), $item->getMetadata(), $item->count); } } - $this->data->set("inventory", $inv); - $this->data->set("hotbar", $this->hotbar); - - $armor = array(); - foreach($this->armor as $slot => $item){ - if($item instanceof Item){ - $armor[$slot] = array($item->getID(), $item->getMetadata()); - } - } - $this->data->set("armor", $armor); - if($this->entity instanceof Entity){ - $this->data->set("health", $this->entity->getHealth()); - } - $this->data->set("gamemode", $this->gamemode); } + $this->data->set("inventory", $inv); + $this->data->set("hotbar", $this->hotbar); + + $armor = array(); + foreach($this->armor as $slot => $item){ + if($item instanceof Item){ + $armor[$slot] = array($item->getID(), $item->getMetadata()); + } + } + $this->data->set("armor", $armor); + //$this->data->set("health", $this->getHealth()); + $this->data->set("gamemode", $this->gamemode); } /** @@ -360,8 +409,7 @@ class Player extends PlayerEntity{ $this->resendQueue = array(); $this->ackQueue = array(); if($this->username != "" and ($this->data instanceof Config)){ - //TODO - //$this->saveOffline($player->data); + Player::saveOffline($this->data); } if($msg === true and $this->username != "" and $this->spawned !== false){ $this->server->api->chat->broadcast($this->username." left the game"); @@ -1282,7 +1330,18 @@ class Player extends PlayerEntity{ } } - $this->server->api->player->add($this->CID); + $this->data = Player::getOffline($this->username); + $this->gamemode = $this->data->get("gamemode"); + if(($this->level = $this->server->api->level->get($this->data->get("position")["level"])) === false){ + $this->level = $this->server->api->level->getDefault(); + $this->data->set("position", array( + "level" => $this->level->getName(), + "x" => $this->level->getSpawn()->x, + "y" => $this->level->getSpawn()->y, + "z" => $this->level->getSpawn()->z, + )); + } + if($this->server->api->handle("player.join", $this) === false){ $this->close("join cancelled", false); return; @@ -1327,7 +1386,7 @@ class Player extends PlayerEntity{ $this->data->set("lastIP", $this->ip); $this->data->set("lastID", $this->clientID); - $this->server->api->player->saveOffline($this->data); + Player::saveOffline($this->data); $pk = new LoginStatusPacket; @@ -2000,7 +2059,7 @@ class Player extends PlayerEntity{ $pk->z = $ob->z; $pk->case1 = 1; $pk->case2 = 0; - $this->server->api->player->broadcastPacket($this->level->players, $pk); + Player::broadcastPacket($this->level->players, $pk); } }elseif($this->windows[$packet->windowid] instanceof ChestTile){ $pk = new TileEventPacket; @@ -2009,7 +2068,7 @@ class Player extends PlayerEntity{ $pk->z = $this->windows[$packet->windowid]->z; $pk->case1 = 1; $pk->case2 = 0; - $this->server->api->player->broadcastPacket($this->level->players, $pk); + Player::broadcastPacket($this->level->players, $pk); } } unset($this->windows[$packet->windowid]); diff --git a/src/tile/ContainerTileTrait.php b/src/tile/ContainerTileTrait.php index d40ec178c..32a35eed7 100644 --- a/src/tile/ContainerTileTrait.php +++ b/src/tile/ContainerTileTrait.php @@ -59,7 +59,7 @@ trait ContainerTileTrait{ $pk->z = $ob->z; $pk->case1 = 1; $pk->case2 = 2; - $this->server->api->player->broadcastPacket($all, $pk); + Player::broadcastPacket($all, $pk); for($s = 0; $s < ChestTile::SLOTS; ++$s){ $slot = $ob->getSlot($s); if($slot->getID() > AIR and $slot->count > 0){ @@ -76,7 +76,7 @@ trait ContainerTileTrait{ $pk->z = $this->z; $pk->case1 = 1; $pk->case2 = 2; - $this->server->api->player->broadcastPacket($this->level->getPlayers(), $pk); + Player::broadcastPacket($this->level->getPlayers(), $pk); for($s = 0; $s < ChestTile::SLOTS; ++$s){ $slot = $this->getSlot($s); if($slot->getID() > AIR and $slot->count > 0){ diff --git a/src/world/Level.php b/src/world/Level.php index 49ab81a14..03b057b94 100644 --- a/src/world/Level.php +++ b/src/world/Level.php @@ -103,7 +103,7 @@ class Level{ $pk = new SetTimePacket; $pk->time = (int) $this->time; $pk->started = $this->stopTime == false; - $this->server->api->player->broadcastPacket($this->players, $pk); + Player::broadcastPacket($this->players, $pk); } } @@ -143,7 +143,7 @@ class Level{ $pk->z = $b->z; $pk->block = $b->getID(); $pk->meta = $b->getMetadata(); - $this->server->api->player->broadcastPacket($this->players, $pk); + Player::broadcastPacket($this->players, $pk); } } } @@ -259,7 +259,7 @@ class Level{ $pk->z = $pos->z; $pk->block = $block->getID(); $pk->meta = $block->getMetadata(); - $this->server->api->player->broadcastPacket($this->players, $pk); + Player::broadcastPacket($this->players, $pk); }elseif($direct === false){ if(!($pos instanceof Position)){ $pos = new Position($pos->x, $pos->y, $pos->z, $this); @@ -303,7 +303,7 @@ class Level{ $pk->z = $pos->z; $pk->block = $block->getID(); $pk->meta = $block->getMetadata(); - $this->server->api->player->broadcastPacket($this->players, $pk); + Player::broadcastPacket($this->players, $pk); }else{ $index = PMFLevel::getIndex($pos->x >> 4, $pos->z >> 4); if(ADVANCED_CACHE == true){