public function setHealth($amount) { $wasAlive = $this->isAlive(); parent::setHealth($amount); if ($this->isAlive() and !$wasAlive) { $pk = new EntityEventPacket(); $pk->eid = $this->getId(); $pk->event = EntityEventPacket::RESPAWN; Server::broadcastPacket($this->hasSpawned, $pk); } }
public function setHealth($amount) { $wasAlive = !$this->dead; parent::setHealth($amount); if (!$this->dead and !$wasAlive) { $pk = new EntityEventPacket(); $pk->eid = $this->getId(); $pk->event = EntityEventPacket::RESPAWN; Server::broadcastPacket($this->hasSpawned, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); } }
public function setHealth($amount) { $wasAlive = $this->isAlive(); parent::setHealth($amount); $this->attributeMap->getAttribute(Attribute::HEALTH)->setValue($this->getHealth()); if ($this->isAlive() and !$wasAlive) { $pk = new EntityEventPacket(); $pk->eid = $this->getId(); $pk->event = EntityEventPacket::RESPAWN; Server::broadcastPacket($this->hasSpawned, $pk); } }
protected function processLogin() { if (!$this->server->isWhitelisted(strtolower($this->getName()))) { $this->close($this->getLeaveMessage(), "Server is white-listed"); return; } elseif ($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress()) or $this->server->getCIDBans()->isBanned($this->randomClientId)) { $this->close($this->getLeaveMessage(), "You are banned"); return; } if ($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)) { $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this); } if ($this->hasPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE)) { $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); } foreach ($this->server->getOnlinePlayers() as $p) { if ($p !== $this and strtolower($p->getName()) === strtolower($this->getName())) { if ($p->kick("logged in from another location") === false) { $this->close($this->getLeaveMessage(), "Logged in from another location"); return; } } elseif ($p->loggedIn and $this->getUniqueId()->equals($p->getUniqueId())) { if ($p->kick("logged in from another location") === false) { $this->close($this->getLeaveMessage(), "Logged in from another location"); return; } } } $nbt = $this->server->getOfflinePlayerData($this->username); if (!isset($nbt->NameTag)) { $nbt->NameTag = new StringTag("NameTag", $this->username); } else { $nbt["NameTag"] = $this->username; } if (!isset($nbt->Hunger) or !isset($nbt->Experience) or !isset($nbt->ExpLevel) or !isset($nbt->Health) or !isset($nbt->MaxHealth)) { $nbt->Hunger = new ShortTag("Hunger", 20); $nbt->Experience = new LongTag("Experience", 0); $nbt->ExpLevel = new LongTag("ExpLevel", 0); $nbt->Health = new ShortTag("Health", 20); $nbt->MaxHealth = new ShortTag("MaxHealth", 20); } $this->food = $nbt["Hunger"]; $this->setMaxHealth($nbt["MaxHealth"]); Entity::setHealth($nbt["Health"] <= 0 ? 20 : $nbt["Health"]); $this->experience = $nbt["Experience"] > 0 ? $nbt["Experience"] : 0; $this->explevel = $nbt["ExpLevel"] >= 0 ? $nbt["ExpLevel"] : 0; $this->calcExpLevel(); $this->gamemode = $nbt["playerGameType"] & 0x3; if ($this->server->getForceGamemode()) { $this->gamemode = $this->server->getGamemode(); $nbt->playerGameType = new IntTag("playerGameType", $this->gamemode); } $this->allowFlight = $this->isCreative(); if (($level = $this->server->getLevelByName($nbt["Level"])) === null) { $this->setLevel($this->server->getDefaultLevel()); $nbt["Level"] = $this->level->getName(); $nbt["Pos"][0] = $this->level->getSpawnLocation()->x; $nbt["Pos"][1] = $this->level->getSpawnLocation()->y; $nbt["Pos"][2] = $this->level->getSpawnLocation()->z; } else { $this->setLevel($level); } if (!$nbt instanceof CompoundTag) { $this->close($this->getLeaveMessage(), "Invalid data"); return; } $this->achievements = []; /** @var ByteTag $achievement */ foreach ($nbt->Achievements as $achievement) { $this->achievements[$achievement->getName()] = $achievement->getValue() > 0 ? true : false; } $nbt->lastPlayed = new LongTag("lastPlayed", floor(microtime(true) * 1000)); if ($this->server->getAutoSave()) { $this->server->saveOfflinePlayerData($this->username, $nbt, true); } parent::__construct($this->level->getChunk($nbt["Pos"][0] >> 4, $nbt["Pos"][2] >> 4, true), $nbt); $this->loggedIn = true; $this->server->addOnlinePlayer($this); $this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason")); if ($ev->isCancelled()) { $this->close($this->getLeaveMessage(), $ev->getKickMessage()); return; } if ($this->isCreative()) { $this->inventory->setHeldItemSlot(0); } else { $this->inventory->setHeldItemSlot($this->inventory->getHotbarSlotIndex(0)); } $pk = new PlayStatusPacket(); $pk->status = PlayStatusPacket::LOGIN_SUCCESS; $this->dataPacket($pk); if ($this->spawnPosition === null and isset($this->namedtag->SpawnLevel) and ($level = $this->server->getLevelByName($this->namedtag["SpawnLevel"])) instanceof Level) { $this->spawnPosition = new Position($this->namedtag["SpawnX"], $this->namedtag["SpawnY"], $this->namedtag["SpawnZ"], $level); } $spawnPosition = $this->getSpawn(); $pk = new StartGamePacket(); $pk->seed = -1; $pk->dimension = ChangeDimensionPacket::DIMENSION_NORMAL; if ($this->server->netherEnabled) { if ($this->getLevel() == $this->server->netherLevel) { $pk->dimension = ChangeDimensionPacket::DIMENSION_NETHER; } } $pk->x = $this->x; $pk->y = $this->y; $pk->z = $this->z; $pk->spawnX = (int) $spawnPosition->x; $pk->spawnY = (int) $spawnPosition->y; $pk->spawnZ = (int) $spawnPosition->z; $pk->generator = 1; //0 old, 1 infinite, 2 flat $pk->gamemode = $this->gamemode & 0x1; $pk->eid = 0; //Always use EntityID as zero for the actual player /*$pk = new SetPlayerGameTypePacket(); $pk->gamemode = $this->gamemode & 0x01;*/ $this->dataPacket($pk); $pk = new SetTimePacket(); $pk->time = $this->level->getTime(); $pk->started = $this->level->stopTime == false; $this->dataPacket($pk); $pk = new SetSpawnPositionPacket(); $pk->x = (int) $spawnPosition->x; $pk->y = (int) $spawnPosition->y; $pk->z = (int) $spawnPosition->z; $this->dataPacket($pk); $pk = new SetHealthPacket(); $pk->health = $this->getHealth(); $this->dataPacket($pk); $pk = new SetDifficultyPacket(); $pk->difficulty = $this->server->getDifficulty(); $this->dataPacket($pk); $this->server->getLogger()->info($this->getServer()->getLanguage()->translateString("pocketmine.player.logIn", [TextFormat::AQUA . $this->username . TextFormat::WHITE, $this->ip, $this->port, TextFormat::GREEN . $this->randomClientId . TextFormat::WHITE, $this->id, $this->level->getName(), round($this->x, 4), round($this->y, 4), round($this->z, 4)])); if ($this->isOp()) { $this->setRemoveFormat(false); } if ($this->gamemode === Player::SPECTATOR) { $pk = new ContainerSetContentPacket(); $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE; $this->dataPacket($pk); } else { $pk = new ContainerSetContentPacket(); $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE; $pk->slots = Item::getCreativeItems(); $this->dataPacket($pk); } $this->forceMovement = $this->teleportPosition = $this->getPosition(); }
protected function processLogin() { if ($this->isFirstTimeLogin) { parent::processLogin(); } else { if (!$this->server->isWhitelisted(strtolower($this->getName()))) { $this->close($this->getLeaveMessage(), "Server is white-listed"); return; } elseif ($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress()) or $this->server->getCIDBans()->isBanned($this->randomClientId)) { $this->close($this->getLeaveMessage(), TextFormat::RED . "You are banned"); return; } if ($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)) { $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this); } if ($this->hasPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE)) { $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); } foreach ($this->server->getOnlinePlayers() as $p) { if ($p !== $this and strtolower($p->getName()) === strtolower($this->getName())) { if ($p->kick("logged in from another location") === false) { $this->close($this->getLeaveMessage(), "Logged in from another location"); return; } } elseif ($p->loggedIn and $this->getUniqueId()->equals($p->getUniqueId())) { if ($p->kick("logged in from another location") === false) { $this->close($this->getLeaveMessage(), "Logged in from another location"); return; } } } $nbt = $this->server->getOfflinePlayerData($this->username); $this->playedBefore = $nbt["lastPlayed"] - $nbt["firstPlayed"] > 1; if (!isset($nbt->NameTag)) { $nbt->NameTag = new StringTag("NameTag", $this->username); } else { $nbt["NameTag"] = $this->username; } if (!isset($nbt->Hunger) or !isset($nbt->Health) or !isset($nbt->MaxHealth)) { $nbt->Hunger = new ShortTag("Hunger", 20); $nbt->Health = new ShortTag("Health", 20); $nbt->MaxHealth = new ShortTag("MaxHealth", 20); } $this->food = $nbt["Hunger"]; $this->setMaxHealth($nbt["MaxHealth"]); Entity::setHealth($nbt["Health"] <= 0 ? 20 : $nbt["Health"]); $this->gamemode = $nbt["playerGameType"] & 0x3; if ($this->server->getForceGamemode()) { $this->gamemode = $this->server->getGamemode(); $nbt->playerGameType = new IntTag("playerGameType", $this->gamemode); } $this->allowFlight = $this->isCreative(); if (($level = $this->server->getLevelByName($nbt["Level"])) === null) { $this->setLevel($this->server->getDefaultLevel()); $nbt["Level"] = $this->level->getName(); $nbt["Pos"][0] = $this->level->getSpawnLocation()->x; $nbt["Pos"][1] = $this->level->getSpawnLocation()->y; $nbt["Pos"][2] = $this->level->getSpawnLocation()->z; } else { $this->setLevel($level); } if (!$nbt instanceof CompoundTag) { $this->close($this->getLeaveMessage(), "Invalid data"); return; } $this->achievements = []; /** @var ByteTag $achievement */ foreach ($nbt->Achievements as $achievement) { $this->achievements[$achievement->getName()] = $achievement->getValue() > 0 ? true : false; } $nbt->lastPlayed = new LongTag("lastPlayed", floor(microtime(true) * 1000)); if ($this->server->getAutoSave()) { $this->server->saveOfflinePlayerData($this->username, $nbt, true); } Entity::__construct($this->level->getChunk($nbt["Pos"][0] >> 4, $nbt["Pos"][2] >> 4, true), $nbt); $this->loggedIn = true; $this->server->addOnlinePlayer($this); $this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason")); if ($ev->isCancelled()) { $this->close($this->getLeaveMessage(), $ev->getKickMessage()); return; } if ($this->isCreative()) { $this->inventory->setHeldItemSlot(0); } else { $this->inventory->setHeldItemSlot($this->inventory->getHotbarSlotIndex(0)); } if ($this->spawnPosition === null and isset($this->namedtag->SpawnLevel) and ($level = $this->server->getLevelByName($this->namedtag["SpawnLevel"])) instanceof Level) { $this->spawnPosition = new Position($this->namedtag["SpawnX"], $this->namedtag["SpawnY"], $this->namedtag["SpawnZ"], $level); } $spawnPosition = $this->getSpawn(); $pk = new SetTimePacket(); $pk->time = $this->level->getTime(); $pk->started = $this->level->stopTime == false; $this->dataPacket($pk); $pk = new SetSpawnPositionPacket(); $pk->x = (int) $spawnPosition->x; $pk->y = (int) $spawnPosition->y; $pk->z = (int) $spawnPosition->z; $this->dataPacket($pk); $this->sendAttributes(); $pk = new SetDifficultyPacket(); $pk->difficulty = $this->server->getDifficulty(); $this->dataPacket($pk); $pk = new SetPlayerGameTypePacket(); $pk->gamemode = $this->gamemode & 0x1; $this->dataPacket($pk); $this->sendSettings(); $this->server->getLogger()->info($this->getServer()->getLanguage()->translateString("pocketmine.player.logIn", [TextFormat::AQUA . $this->username . TextFormat::WHITE, $this->ip, $this->port, TextFormat::GREEN . $this->randomClientId . TextFormat::WHITE, $this->id, $this->level->getName(), round($this->x, 4), round($this->y, 4), round($this->z, 4)])); if ($this->gamemode === Player::SPECTATOR) { $pk = new ContainerSetContentPacket(); $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE; $this->dataPacket($pk); } else { $pk = new ContainerSetContentPacket(); $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE; $pk->slots = array_merge(Item::getCreativeItems(), $this->personalCreativeItems); $this->dataPacket($pk); } $pk = new SetEntityDataPacket(); $pk->eid = 0; $pk->metadata = [self::DATA_LEAD_HOLDER => [self::DATA_TYPE_LONG, -1]]; $this->dataPacket($pk); $this->forceMovement = $this->teleportPosition = $this->getPosition(); } }
protected function processLogin() { if (!$this->server->isWhitelisted(strtolower($this->getName()))) { $this->close($this->getLeaveMessage(), "Server is white-listed"); return; } elseif ($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress()) or $this->server->getCIDBans()->isBanned($this->randomClientId)) { $this->close($this->getLeaveMessage(), TextFormat::RED . "You are banned"); return; } if ($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)) { $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this); } if ($this->hasPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE)) { $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); } foreach ($this->server->getOnlinePlayers() as $p) { if ($p !== $this and strtolower($p->getName()) === strtolower($this->getName())) { if ($p->kick("logged in from another location") === false) { $this->close($this->getLeaveMessage(), "Logged in from another location"); return; } } elseif ($p->loggedIn and $this->getUniqueId()->equals($p->getUniqueId())) { if ($p->kick("logged in from another location") === false) { $this->close($this->getLeaveMessage(), "Logged in from another location"); return; } } } $this->setNameTag($this->getDisplayName()); $nbt = $this->server->getOfflinePlayerData($this->username); $this->playedBefore = $nbt["lastPlayed"] - $nbt["firstPlayed"] > 1; if (!isset($nbt->NameTag)) { $nbt->NameTag = new StringTag("NameTag", $this->username); } else { $nbt["NameTag"] = $this->username; } if (!isset($nbt->Hunger) or !isset($nbt->Health) or !isset($nbt->MaxHealth)) { $nbt->Hunger = new ShortTag("Hunger", 20); $nbt->Health = new ShortTag("Health", 20); $nbt->MaxHealth = new ShortTag("MaxHealth", 20); } $this->food = $nbt["Hunger"]; $this->setMaxHealth($nbt["MaxHealth"]); Entity::setHealth($nbt["Health"] <= 0 ? 20 : $nbt["Health"]); $this->gamemode = $nbt["playerGameType"] & 0x3; if ($this->server->getForceGamemode()) { $this->gamemode = $this->server->getGamemode(); $nbt->playerGameType = new IntTag("playerGameType", $this->gamemode); } $this->allowFlight = $this->isCreative(); if (($level = $this->server->getLevelByName($nbt["Level"])) === null) { $this->setLevel($this->server->getDefaultLevel()); $nbt["Level"] = $this->level->getName(); $nbt["Pos"][0] = $this->level->getSpawnLocation()->x; $nbt["Pos"][1] = $this->level->getSpawnLocation()->y; $nbt["Pos"][2] = $this->level->getSpawnLocation()->z; } else { $this->setLevel($level); } if (!$nbt instanceof CompoundTag) { $this->close($this->getLeaveMessage(), "Invalid data"); return; } $this->achievements = []; /** @var ByteTag $achievement */ foreach ($nbt->Achievements as $achievement) { $this->achievements[$achievement->getName()] = $achievement->getValue() > 0 ? true : false; } $nbt->lastPlayed = new LongTag("lastPlayed", floor(microtime(true) * 1000)); if ($this->server->getAutoSave()) { $this->server->saveOfflinePlayerData($this->username, $nbt, true); } parent::__construct($this->level->getChunk($nbt["Pos"][0] >> 4, $nbt["Pos"][2] >> 4, true), $nbt); $this->loggedIn = true; $this->server->addOnlinePlayer($this); $this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason")); if ($ev->isCancelled()) { $this->close($this->getLeaveMessage(), $ev->getKickMessage()); return; } if (!$this->isConnected()) { return; } $this->dataPacket(new ResourcePacksInfoPacket()); if (!$this->hasValidSpawnPosition() and isset($this->namedtag->SpawnLevel) and ($level = $this->server->getLevelByName($this->namedtag["SpawnLevel"])) instanceof Level) { $this->spawnPosition = new WeakPosition($this->namedtag["SpawnX"], $this->namedtag["SpawnY"], $this->namedtag["SpawnZ"], $level); } $spawnPosition = $this->getSpawn(); $pk = new StartGamePacket(); $pk->entityUniqueId = 0; $pk->entityRuntimeId = 0; $pk->x = $this->x; $pk->y = $this->y; $pk->z = $this->z; $pk->seed = -1; $pk->dimension = $this->level->getDimension(); $pk->gamemode = $this->gamemode & 0x1; $pk->difficulty = $this->server->getDifficulty(); $pk->spawnX = $spawnPosition->getFloorX(); $pk->spawnY = $spawnPosition->getFloorY(); $pk->spawnZ = $spawnPosition->getFloorZ(); $pk->hasBeenLoadedInCreative = 1; $pk->dayCycleStopTime = -1; //TODO: implement this properly $pk->eduMode = 0; $pk->rainLevel = 0; //TODO: implement these properly $pk->lightningLevel = 0; $pk->commandsEnabled = 1; $pk->unknown = "UNKNOWN"; $pk->worldName = $this->server->getMotd(); $this->dataPacket($pk); $pk = new SetTimePacket(); $pk->time = $this->level->getTime(); $pk->started = $this->level->stopTime == false; $this->dataPacket($pk); $this->sendAttributes(true); $this->setNameTagVisible(true); $this->setNameTagAlwaysVisible(true); $this->server->getLogger()->info($this->getServer()->getLanguage()->translateString("pocketmine.player.logIn", [TextFormat::AQUA . $this->username . TextFormat::WHITE, $this->ip, $this->port, TextFormat::GREEN . $this->randomClientId . TextFormat::WHITE, $this->id, $this->level->getName(), round($this->x, 4), round($this->y, 4), round($this->z, 4)])); /*if($this->isOp()){ $this->setRemoveFormat(false); }*/ if ($this->gamemode === Player::SPECTATOR) { $pk = new ContainerSetContentPacket(); $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE; $this->dataPacket($pk); } else { $pk = new ContainerSetContentPacket(); $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE; $pk->slots = array_merge(Item::getCreativeItems(), $this->personalCreativeItems); $this->dataPacket($pk); } $this->sendCommandData(); $this->level->getWeather()->sendWeather($this); $this->forceMovement = $this->teleportPosition = $this->getPosition(); }