mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-15 22:05:06 +00:00
Compare commits
25 Commits
Author | SHA1 | Date | |
---|---|---|---|
a60154e0b7 | |||
4cbbf2e91c | |||
b0624aff9f | |||
c38e2c5ccb | |||
02ef0bfbb4 | |||
4835537886 | |||
4a6841a5a4 | |||
925da62afa | |||
09985c5763 | |||
d1ee9eb960 | |||
196cf8a68d | |||
5e68858ebf | |||
45c9caa38c | |||
d749f19c73 | |||
41fd03f329 | |||
58067b2ad1 | |||
0c9946621c | |||
af5637e050 | |||
a524b0e447 | |||
88a5e92c20 | |||
b876ae4ef8 | |||
1983964f9e | |||
c5cd813b76 | |||
bc2dff3f51 | |||
839d5eab7b |
@ -473,7 +473,7 @@ class MemoryManager{
|
||||
self::continueDump($value, $data[$key], $objects, $refCounts, $recursion + 1, $maxNesting, $maxStringSize);
|
||||
}
|
||||
}elseif(is_string($from)){
|
||||
$data = "(string) len(". strlen($from) .") " . substr(Utils::printable($from), 0, $maxStringSize);
|
||||
$data = "(string) len(" . strlen($from) . ") " . substr(Utils::printable($from), 0, $maxStringSize);
|
||||
}elseif(is_resource($from)){
|
||||
$data = "(resource) " . print_r($from, true);
|
||||
}else{
|
||||
|
@ -173,6 +173,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
|
||||
/**
|
||||
* Checks a supplied username and checks it is valid.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return bool
|
||||
@ -627,7 +628,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
/**
|
||||
* @param Plugin $plugin
|
||||
* @param string $name
|
||||
* @param bool $value
|
||||
* @param bool $value
|
||||
*
|
||||
* @return PermissionAttachment
|
||||
*/
|
||||
@ -1326,6 +1327,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
* TODO: remove this when Spectator Mode gets added properly to MCPE
|
||||
*
|
||||
* @param int $gamemode
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function getClientFriendlyGamemode(int $gamemode) : int{
|
||||
@ -2266,6 +2268,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
* Don't expect much from this handler. Most of it is roughly hacked and duct-taped together.
|
||||
*
|
||||
* @param InventoryTransactionPacket $packet
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function handleInventoryTransaction(InventoryTransactionPacket $packet) : bool{
|
||||
@ -2845,6 +2848,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
* Drops an item on the ground in front of the player. Returns if the item drop was successful.
|
||||
*
|
||||
* @param Item $item
|
||||
*
|
||||
* @return bool if the item was dropped or if the item was null
|
||||
*/
|
||||
public function dropItem(Item $item) : bool{
|
||||
@ -3144,7 +3148,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
* Transfers a player to another server.
|
||||
*
|
||||
* @param string $address The IP address or hostname of the destination server
|
||||
* @param int $port The destination port, defaults to 19132
|
||||
* @param int $port The destination port, defaults to 19132
|
||||
* @param string $message Message to show in the console when closing the player
|
||||
*
|
||||
* @return bool if transfer was successful.
|
||||
@ -3168,8 +3172,8 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
/**
|
||||
* Kicks a player from the server
|
||||
*
|
||||
* @param string $reason
|
||||
* @param bool $isAdmin
|
||||
* @param string $reason
|
||||
* @param bool $isAdmin
|
||||
* @param TextContainer|string $quitMessage
|
||||
*
|
||||
* @return bool
|
||||
@ -3271,7 +3275,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
* Internal function used for sending titles.
|
||||
*
|
||||
* @param string $title
|
||||
* @param int $type
|
||||
* @param int $type
|
||||
*/
|
||||
protected function sendTitleText(string $title, int $type){
|
||||
$pk = new SetTitlePacket();
|
||||
|
@ -37,7 +37,7 @@ namespace pocketmine {
|
||||
use pocketmine\wizard\SetupWizard;
|
||||
|
||||
const NAME = "PocketMine-MP";
|
||||
const BASE_VERSION = "3.2.5";
|
||||
const BASE_VERSION = "3.3.1";
|
||||
const IS_DEVELOPMENT_BUILD = false;
|
||||
const BUILD_NUMBER = 0;
|
||||
|
||||
|
@ -991,6 +991,7 @@ class Server{
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @param Level $level
|
||||
*/
|
||||
public function removeLevel(Level $level) : void{
|
||||
@ -2195,6 +2196,14 @@ class Server{
|
||||
|
||||
if($this->getProperty("auto-report.enabled", true) !== false){
|
||||
$report = true;
|
||||
|
||||
$stamp = $this->getDataPath() . "crashdumps/.last_crash";
|
||||
$crashInterval = 120; //2 minutes
|
||||
if(file_exists($stamp) and !($report = (filemtime($stamp) + $crashInterval < time()))){
|
||||
$this->logger->debug("Not sending crashdump due to last crash less than $crashInterval seconds ago");
|
||||
}
|
||||
@touch($stamp); //update file timestamp
|
||||
|
||||
$plugin = $dump->getData()["plugin"];
|
||||
if(is_string($plugin)){
|
||||
$p = $this->pluginManager->getPlugin($plugin);
|
||||
@ -2309,7 +2318,7 @@ class Server{
|
||||
$pk = new PlayerListPacket();
|
||||
$pk->type = PlayerListPacket::TYPE_ADD;
|
||||
|
||||
$pk->entries[] = PlayerListEntry::createAdditionEntry($uuid, $entityId, $name, "", 0, $skin, $xboxUserId);
|
||||
$pk->entries[] = PlayerListEntry::createAdditionEntry($uuid, $entityId, $name, $skin, $xboxUserId);
|
||||
|
||||
$this->broadcastPacket($players ?? $this->playerList, $pk);
|
||||
}
|
||||
@ -2332,7 +2341,7 @@ class Server{
|
||||
$pk = new PlayerListPacket();
|
||||
$pk->type = PlayerListPacket::TYPE_ADD;
|
||||
foreach($this->playerList as $player){
|
||||
$pk->entries[] = PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), "", 0, $player->getSkin(), $player->getXuid());
|
||||
$pk->entries[] = PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), $player->getSkin(), $player->getXuid());
|
||||
}
|
||||
|
||||
$p->dataPacket($pk);
|
||||
|
@ -330,6 +330,10 @@ class BlockFactory{
|
||||
}
|
||||
}
|
||||
|
||||
public static function isInit() : bool{
|
||||
return self::$fullList !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a block type into the index. Plugins may use this method to register new block types or override
|
||||
* existing ones.
|
||||
@ -411,6 +415,7 @@ class BlockFactory{
|
||||
* Returns whether a specified block ID is already registered in the block factory.
|
||||
*
|
||||
* @param int $id
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isRegistered(int $id) : bool{
|
||||
|
@ -27,7 +27,7 @@ namespace pocketmine\command;
|
||||
interface CommandMap{
|
||||
|
||||
/**
|
||||
* @param string $fallbackPrefix
|
||||
* @param string $fallbackPrefix
|
||||
* @param Command[] $commands
|
||||
*/
|
||||
public function registerAll(string $fallbackPrefix, array $commands);
|
||||
|
@ -95,6 +95,7 @@ class CommandReader extends Thread{
|
||||
* Checks if the specified stream is a FIFO pipe.
|
||||
*
|
||||
* @param resource $stream
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isPipe($stream) : bool{
|
||||
|
@ -54,6 +54,7 @@ interface CommandSender extends Permissible{
|
||||
|
||||
/**
|
||||
* Sets the line height used for command output pagination for this command sender. `null` will reset it to default.
|
||||
*
|
||||
* @param int|null $height
|
||||
*/
|
||||
public function setScreenLineHeight(int $height = null);
|
||||
|
@ -64,7 +64,7 @@ class ConsoleCommandSender implements CommandSender{
|
||||
/**
|
||||
* @param Plugin $plugin
|
||||
* @param string $name
|
||||
* @param bool $value
|
||||
* @param bool $value
|
||||
*
|
||||
* @return PermissionAttachment
|
||||
*/
|
||||
|
@ -193,9 +193,9 @@ class SimpleCommandMap implements CommandMap{
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param bool $isAlias
|
||||
* @param string $fallbackPrefix
|
||||
* @param string $label
|
||||
* @param bool $isAlias
|
||||
* @param string $fallbackPrefix
|
||||
* @param string $label
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
|
@ -143,7 +143,8 @@ class DataPropertyManager{
|
||||
*/
|
||||
public function getItem(int $key) : ?Item{
|
||||
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_SLOT);
|
||||
assert($value instanceof Item or $value === null);
|
||||
assert($value instanceof Item or $value === null);
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
|
@ -81,6 +81,7 @@ class EffectInstance{
|
||||
|
||||
/**
|
||||
* @param int $duration
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return $this
|
||||
|
@ -206,34 +206,38 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
public const DATA_FLAG_INTERESTED = 26;
|
||||
public const DATA_FLAG_CHARGED = 27;
|
||||
public const DATA_FLAG_TAMED = 28;
|
||||
public const DATA_FLAG_LEASHED = 29;
|
||||
public const DATA_FLAG_SHEARED = 30;
|
||||
public const DATA_FLAG_GLIDING = 31;
|
||||
public const DATA_FLAG_ELDER = 32;
|
||||
public const DATA_FLAG_MOVING = 33;
|
||||
public const DATA_FLAG_BREATHING = 34;
|
||||
public const DATA_FLAG_CHESTED = 35;
|
||||
public const DATA_FLAG_STACKABLE = 36;
|
||||
public const DATA_FLAG_SHOWBASE = 37;
|
||||
public const DATA_FLAG_REARING = 38;
|
||||
public const DATA_FLAG_VIBRATING = 39;
|
||||
public const DATA_FLAG_IDLING = 40;
|
||||
public const DATA_FLAG_EVOKER_SPELL = 41;
|
||||
public const DATA_FLAG_CHARGE_ATTACK = 42;
|
||||
public const DATA_FLAG_WASD_CONTROLLED = 43;
|
||||
public const DATA_FLAG_CAN_POWER_JUMP = 44;
|
||||
public const DATA_FLAG_LINGER = 45;
|
||||
public const DATA_FLAG_HAS_COLLISION = 46;
|
||||
public const DATA_FLAG_AFFECTED_BY_GRAVITY = 47;
|
||||
public const DATA_FLAG_FIRE_IMMUNE = 48;
|
||||
public const DATA_FLAG_DANCING = 49;
|
||||
public const DATA_FLAG_ENCHANTED = 50;
|
||||
public const DATA_FLAG_SHOW_TRIDENT_ROPE = 51; // tridents show an animated rope when enchanted with loyalty after they are thrown and return to their owner. To be combined with DATA_OWNER_EID
|
||||
public const DATA_FLAG_CONTAINER_PRIVATE = 52; //inventory is private, doesn't drop contents when killed if true
|
||||
//53 TransformationComponent
|
||||
public const DATA_FLAG_SPIN_ATTACK = 54;
|
||||
public const DATA_FLAG_SWIMMING = 55;
|
||||
public const DATA_FLAG_BRIBED = 56; //dolphins have this set when they go to find treasure for the player
|
||||
public const DATA_FLAG_ORPHANED = 29;
|
||||
public const DATA_FLAG_LEASHED = 30;
|
||||
public const DATA_FLAG_SHEARED = 31;
|
||||
public const DATA_FLAG_GLIDING = 32;
|
||||
public const DATA_FLAG_ELDER = 33;
|
||||
public const DATA_FLAG_MOVING = 34;
|
||||
public const DATA_FLAG_BREATHING = 35;
|
||||
public const DATA_FLAG_CHESTED = 36;
|
||||
public const DATA_FLAG_STACKABLE = 37;
|
||||
public const DATA_FLAG_SHOWBASE = 38;
|
||||
public const DATA_FLAG_REARING = 39;
|
||||
public const DATA_FLAG_VIBRATING = 40;
|
||||
public const DATA_FLAG_IDLING = 41;
|
||||
public const DATA_FLAG_EVOKER_SPELL = 42;
|
||||
public const DATA_FLAG_CHARGE_ATTACK = 43;
|
||||
public const DATA_FLAG_WASD_CONTROLLED = 44;
|
||||
public const DATA_FLAG_CAN_POWER_JUMP = 45;
|
||||
public const DATA_FLAG_LINGER = 46;
|
||||
public const DATA_FLAG_HAS_COLLISION = 47;
|
||||
public const DATA_FLAG_AFFECTED_BY_GRAVITY = 48;
|
||||
public const DATA_FLAG_FIRE_IMMUNE = 49;
|
||||
public const DATA_FLAG_DANCING = 50;
|
||||
public const DATA_FLAG_ENCHANTED = 51;
|
||||
public const DATA_FLAG_SHOW_TRIDENT_ROPE = 52; // tridents show an animated rope when enchanted with loyalty after they are thrown and return to their owner. To be combined with DATA_OWNER_EID
|
||||
public const DATA_FLAG_CONTAINER_PRIVATE = 53; //inventory is private, doesn't drop contents when killed if true
|
||||
//54 TransformationComponent
|
||||
public const DATA_FLAG_SPIN_ATTACK = 55;
|
||||
public const DATA_FLAG_SWIMMING = 56;
|
||||
public const DATA_FLAG_BRIBED = 57; //dolphins have this set when they go to find treasure for the player
|
||||
public const DATA_FLAG_PREGNANT = 58;
|
||||
public const DATA_FLAG_LAYING_EGG = 59;
|
||||
//60 ??
|
||||
|
||||
public static $entityCount = 1;
|
||||
/** @var Entity[] */
|
||||
@ -260,8 +264,8 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
Entity::registerEntity(Snowball::class, false, ['Snowball', 'minecraft:snowball']);
|
||||
Entity::registerEntity(SplashPotion::class, false, ['ThrownPotion', 'minecraft:potion', 'thrownpotion']);
|
||||
Entity::registerEntity(Squid::class, false, ['Squid', 'minecraft:squid']);
|
||||
Entity::registerEntity(Villager::class, false, ['Villager', 'minecraft:villager']);
|
||||
Entity::registerEntity(Zombie::class, false, ['Zombie', 'minecraft:zombie']);
|
||||
Entity::registerEntity(Villager::class, false, ['Villager', 'minecraft:villager']);
|
||||
Entity::registerEntity(Zombie::class, false, ['Zombie', 'minecraft:zombie']);
|
||||
|
||||
Entity::registerEntity(Human::class, true);
|
||||
|
||||
@ -342,7 +346,7 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
*
|
||||
* @return CompoundTag
|
||||
*/
|
||||
public static function createBaseNBT(Vector3 $pos, ?Vector3 $motion = null , float $yaw = 0.0, float $pitch = 0.0) : CompoundTag{
|
||||
public static function createBaseNBT(Vector3 $pos, ?Vector3 $motion = null, float $yaw = 0.0, float $pitch = 0.0) : CompoundTag{
|
||||
return new CompoundTag("", [
|
||||
new ListTag("Pos", [
|
||||
new DoubleTag("", $pos->x),
|
||||
@ -932,6 +936,7 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
* Called to tick entities while dead. Returns whether the entity should be flagged for despawn yet.
|
||||
*
|
||||
* @param int $tickDiff
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function onDeathUpdate(int $tickDiff) : bool{
|
||||
@ -1390,7 +1395,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
Timings::$timerEntityBaseTick->stopTiming();
|
||||
|
||||
|
||||
|
||||
$this->timings->stopTiming();
|
||||
|
||||
//if($this->isStatic())
|
||||
@ -2071,6 +2075,7 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
* Wrapper around {@link Entity#getDataFlag} for generic data flag reading.
|
||||
*
|
||||
* @param int $flagId
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getGenericFlag(int $flagId) : bool{
|
||||
|
@ -841,7 +841,7 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
||||
/* we don't use Server->updatePlayerListData() because that uses batches, which could cause race conditions in async compression mode */
|
||||
$pk = new PlayerListPacket();
|
||||
$pk->type = PlayerListPacket::TYPE_ADD;
|
||||
$pk->entries = [PlayerListEntry::createAdditionEntry($this->uuid, $this->id, $this->getName(), $this->getName(), 0, $this->skin)];
|
||||
$pk->entries = [PlayerListEntry::createAdditionEntry($this->uuid, $this->id, $this->getName(), $this->skin)];
|
||||
$player->dataPacket($pk);
|
||||
}
|
||||
|
||||
@ -888,6 +888,7 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
||||
* Wrapper around {@link Entity#getDataFlag} for player-specific data flag reading.
|
||||
*
|
||||
* @param int $flagId
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getPlayerFlag(int $flagId) : bool{
|
||||
|
@ -329,6 +329,7 @@ abstract class Living extends Entity implements Damageable{
|
||||
|
||||
/**
|
||||
* Sends the mob's potion effects to the specified player.
|
||||
*
|
||||
* @param Player $player
|
||||
*/
|
||||
public function sendPotionEffects(Player $player) : void{
|
||||
@ -771,6 +772,7 @@ abstract class Living extends Entity implements Damageable{
|
||||
|
||||
/**
|
||||
* Sets the number of air ticks left in the entity's air supply.
|
||||
*
|
||||
* @param int $ticks
|
||||
*/
|
||||
public function setAirSupplyTicks(int $ticks) : void{
|
||||
@ -787,6 +789,7 @@ abstract class Living extends Entity implements Damageable{
|
||||
|
||||
/**
|
||||
* Sets the maximum amount of air ticks the air supply can hold.
|
||||
*
|
||||
* @param int $ticks
|
||||
*/
|
||||
public function setMaxAirSupplyTicks(int $ticks) : void{
|
||||
|
@ -73,6 +73,7 @@ class PaintingMotive{
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*
|
||||
* @return PaintingMotive|null
|
||||
*/
|
||||
public static function getMotiveByName(string $name) : ?PaintingMotive{
|
||||
|
@ -27,8 +27,8 @@ use pocketmine\block\Block;
|
||||
use pocketmine\block\BlockFactory;
|
||||
use pocketmine\entity\EffectInstance;
|
||||
use pocketmine\entity\Living;
|
||||
use pocketmine\event\entity\ProjectileHitEntityEvent;
|
||||
use pocketmine\event\entity\ProjectileHitBlockEvent;
|
||||
use pocketmine\event\entity\ProjectileHitEntityEvent;
|
||||
use pocketmine\event\entity\ProjectileHitEvent;
|
||||
use pocketmine\item\Potion;
|
||||
use pocketmine\network\mcpe\protocol\LevelEventPacket;
|
||||
@ -151,6 +151,7 @@ class SplashPotion extends Throwable{
|
||||
|
||||
/**
|
||||
* Sets whether this splash potion will create an area-effect-cloud when it lands.
|
||||
*
|
||||
* @param bool $value
|
||||
*/
|
||||
public function setLinger(bool $value = true) : void{
|
||||
|
@ -31,6 +31,7 @@ abstract class ExperienceUtils{
|
||||
* Calculates and returns the amount of XP needed to get from level 0 to level $level
|
||||
*
|
||||
* @param int $level
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function getXpToReachLevel(int $level) : int{
|
||||
|
@ -40,8 +40,8 @@ class FurnaceBurnEvent extends BlockEvent implements Cancellable{
|
||||
|
||||
/**
|
||||
* @param Furnace $furnace
|
||||
* @param Item $fuel
|
||||
* @param int $burnTime
|
||||
* @param Item $fuel
|
||||
* @param int $burnTime
|
||||
*/
|
||||
public function __construct(Furnace $furnace, Item $fuel, int $burnTime){
|
||||
parent::__construct($furnace->getBlock());
|
||||
|
@ -38,8 +38,8 @@ class FurnaceSmeltEvent extends BlockEvent implements Cancellable{
|
||||
|
||||
/**
|
||||
* @param Furnace $furnace
|
||||
* @param Item $source
|
||||
* @param Item $result
|
||||
* @param Item $source
|
||||
* @param Item $result
|
||||
*/
|
||||
public function __construct(Furnace $furnace, Item $source, Item $result){
|
||||
parent::__construct($furnace->getBlock());
|
||||
|
@ -63,6 +63,7 @@ class PlayerChangeSkinEvent extends PlayerEvent implements Cancellable{
|
||||
|
||||
/**
|
||||
* @param Skin $skin
|
||||
*
|
||||
* @throws \InvalidArgumentException if the specified skin is not valid
|
||||
*/
|
||||
public function setNewSkin(Skin $skin) : void{
|
||||
|
@ -34,7 +34,7 @@ class PlayerMoveEvent extends PlayerEvent implements Cancellable{
|
||||
private $to;
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
* @param Player $player
|
||||
* @param Location $from
|
||||
* @param Location $to
|
||||
*/
|
||||
|
@ -34,7 +34,7 @@ class DataPacketSendEvent extends ServerEvent implements Cancellable{
|
||||
private $player;
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
* @param Player $player
|
||||
* @param DataPacket $packet
|
||||
*/
|
||||
public function __construct(Player $player, DataPacket $packet){
|
||||
|
@ -384,6 +384,7 @@ abstract class BaseInventory implements Inventory{
|
||||
|
||||
/**
|
||||
* Removes the inventory window from all players currently viewing it.
|
||||
*
|
||||
* @param bool $force Force removal of permanent windows such as the player's own inventory. Used internally.
|
||||
*/
|
||||
public function removeAllViewers(bool $force = false) : void{
|
||||
|
@ -244,6 +244,7 @@ interface Inventory{
|
||||
* Returns whether the specified slot exists in the inventory.
|
||||
*
|
||||
* @param int $slot
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function slotExists(int $slot) : bool;
|
||||
|
@ -87,6 +87,7 @@ class PlayerInventory extends BaseInventory{
|
||||
|
||||
/**
|
||||
* @param int $slot
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
private function throwIfNotHotbarSlot(int $slot){
|
||||
@ -99,6 +100,7 @@ class PlayerInventory extends BaseInventory{
|
||||
* Returns the item in the specified hotbar slot.
|
||||
*
|
||||
* @param int $hotbarSlot
|
||||
*
|
||||
* @return Item
|
||||
*
|
||||
* @throws \InvalidArgumentException if the hotbar slot index is out of range
|
||||
@ -159,6 +161,7 @@ class PlayerInventory extends BaseInventory{
|
||||
|
||||
/**
|
||||
* Sends the currently-held item to specified targets.
|
||||
*
|
||||
* @param Player|Player[] $target
|
||||
*/
|
||||
public function sendHeldItem($target){
|
||||
|
@ -46,11 +46,11 @@ class ShapedRecipe implements CraftingRecipe{
|
||||
* Array of 1, 2, or 3 strings representing the rows of the recipe.
|
||||
* This accepts an array of 1, 2 or 3 strings. Each string should be of the same length and must be at most 3
|
||||
* characters long. Each character represents a unique type of ingredient. Spaces are interpreted as air.
|
||||
* @param Item[] $ingredients <br>
|
||||
* @param Item[] $ingredients <br>
|
||||
* Char => Item map of items to be set into the shape.
|
||||
* This accepts an array of Items, indexed by character. Every unique character (except space) in the shape
|
||||
* array MUST have a corresponding item in this list. Space character is automatically treated as air.
|
||||
* @param Item[] $results List of items that this recipe produces when crafted.
|
||||
* @param Item[] $results List of items that this recipe produces when crafted.
|
||||
*
|
||||
* Note: Recipes **do not** need to be square. Do NOT add padding for empty rows/columns.
|
||||
*/
|
||||
|
@ -54,6 +54,7 @@ class DropItemAction extends InventoryAction{
|
||||
* Drops the target item in front of the player.
|
||||
*
|
||||
* @param Player $source
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function execute(Player $source) : bool{
|
||||
|
@ -53,6 +53,7 @@ abstract class Armor extends Durable{
|
||||
|
||||
/**
|
||||
* Sets the dyed colour of this armour piece. This generally only applies to leather armour.
|
||||
*
|
||||
* @param Color $color
|
||||
*/
|
||||
public function setCustomColor(Color $color) : void{
|
||||
|
@ -38,6 +38,7 @@ abstract class Durable extends Item{
|
||||
|
||||
/**
|
||||
* Sets whether the item will take damage when used.
|
||||
*
|
||||
* @param bool $value
|
||||
*/
|
||||
public function setUnbreakable(bool $value = true){
|
||||
@ -46,6 +47,7 @@ abstract class Durable extends Item{
|
||||
|
||||
/**
|
||||
* Applies damage to the item.
|
||||
*
|
||||
* @param int $amount
|
||||
*
|
||||
* @return bool if any damage was applied to the item
|
||||
|
@ -523,6 +523,7 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*
|
||||
* @return NamedTag|null
|
||||
*/
|
||||
public function getNamedTagEntry(string $name) : ?NamedTag{
|
||||
@ -557,6 +558,7 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
|
||||
/**
|
||||
* Sets the Item's NBT from the supplied CompoundTag object.
|
||||
*
|
||||
* @param CompoundTag $tag
|
||||
*
|
||||
* @return Item
|
||||
@ -589,6 +591,7 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
|
||||
/**
|
||||
* @param int $count
|
||||
*
|
||||
* @return Item
|
||||
*/
|
||||
public function setCount(int $count) : Item{
|
||||
@ -669,6 +672,7 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
|
||||
/**
|
||||
* @param int $meta
|
||||
*
|
||||
* @return Item
|
||||
*/
|
||||
public function setDamage(int $meta) : Item{
|
||||
@ -779,6 +783,7 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
* Returns whether the item was changed, for example count decrease or durability change.
|
||||
*
|
||||
* @param Player $player
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function onReleaseUsing(Player $player) : bool{
|
||||
@ -844,6 +849,7 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
|
||||
/**
|
||||
* Returns whether the specified item stack has the same ID, damage, NBT and count as this item stack.
|
||||
*
|
||||
* @param Item $other
|
||||
*
|
||||
* @return bool
|
||||
@ -888,6 +894,7 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
* Returns an Item from properties created in an array by {@link Item#jsonSerialize}
|
||||
*
|
||||
* @param array $data
|
||||
*
|
||||
* @return Item
|
||||
*/
|
||||
final public static function jsonDeserialize(array $data) : Item{
|
||||
|
@ -71,6 +71,7 @@ class Potion extends Item implements Consumable{
|
||||
* Returns a list of effects applied by potions with the specified ID.
|
||||
*
|
||||
* @param int $id
|
||||
*
|
||||
* @return EffectInstance[]
|
||||
*/
|
||||
public static function getPotionEffectsById(int $id) : array{
|
||||
|
@ -27,8 +27,8 @@ use pocketmine\entity\Entity;
|
||||
use pocketmine\entity\projectile\Projectile;
|
||||
use pocketmine\event\entity\ProjectileLaunchEvent;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
|
||||
use pocketmine\nbt\tag\CompoundTag;
|
||||
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
|
||||
use pocketmine\Player;
|
||||
|
||||
abstract class ProjectileItem extends Item{
|
||||
|
@ -137,7 +137,7 @@ class WritableBook extends Item{
|
||||
/**
|
||||
* Inserts a new page with the given text and moves other pages upwards.
|
||||
*
|
||||
* @param int $pageId
|
||||
* @param int $pageId
|
||||
* @param string $pageText
|
||||
*
|
||||
* @return bool indicating success
|
||||
|
@ -69,6 +69,7 @@ class EnchantmentInstance{
|
||||
|
||||
/**
|
||||
* Sets the level of the enchantment.
|
||||
*
|
||||
* @param int $level
|
||||
*
|
||||
* @return $this
|
||||
|
@ -62,6 +62,7 @@ class ProtectionEnchantment extends Enchantment{
|
||||
|
||||
/**
|
||||
* Returns the base EPF this enchantment type offers for the given enchantment level.
|
||||
*
|
||||
* @param int $level
|
||||
*
|
||||
* @return int
|
||||
@ -72,6 +73,7 @@ class ProtectionEnchantment extends Enchantment{
|
||||
|
||||
/**
|
||||
* Returns whether this enchantment type offers protection from the specified damage source's cause.
|
||||
*
|
||||
* @param EntityDamageEvent $event
|
||||
*
|
||||
* @return bool
|
||||
|
@ -284,6 +284,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
|
||||
/**
|
||||
* @param string $str
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function getDifficultyFromString(string $str) : int{
|
||||
@ -875,7 +876,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
$pk->blockRuntimeId = $b->getRuntimeId();
|
||||
}else{
|
||||
$fullBlock = $this->getFullBlock($b->x, $b->y, $b->z);
|
||||
$pk->blockRuntimeId = BlockFactory::toStaticRuntimeId($fullBlock >> 4, $fullBlock & 0xf);
|
||||
$pk->blockRuntimeId = BlockFactory::toStaticRuntimeId($fullBlock >> 4, $fullBlock & 0xf);
|
||||
}
|
||||
|
||||
$pk->flags = $first ? $flags : UpdateBlockPacket::FLAG_NONE;
|
||||
@ -897,7 +898,7 @@ class Level implements ChunkManager, Metadatable{
|
||||
$pk->blockRuntimeId = $b->getRuntimeId();
|
||||
}else{
|
||||
$fullBlock = $this->getFullBlock($b->x, $b->y, $b->z);
|
||||
$pk->blockRuntimeId = BlockFactory::toStaticRuntimeId($fullBlock >> 4, $fullBlock & 0xf);
|
||||
$pk->blockRuntimeId = BlockFactory::toStaticRuntimeId($fullBlock >> 4, $fullBlock & 0xf);
|
||||
}
|
||||
|
||||
$pk->flags = $flags;
|
||||
@ -971,13 +972,20 @@ class Level implements ChunkManager, Metadatable{
|
||||
foreach($this->chunkTickList as $index => $loaders){
|
||||
Level::getXZ($index, $chunkX, $chunkZ);
|
||||
|
||||
if(($chunk = $this->chunks[$index] ?? null) === null){
|
||||
unset($this->chunkTickList[$index]);
|
||||
continue;
|
||||
}elseif($loaders <= 0){
|
||||
for($cx = -1; $cx <= 1; ++$cx){
|
||||
for($cz = -1; $cz <= 1; ++$cz){
|
||||
if(!isset($this->chunks[Level::chunkHash($chunkX + $cx, $chunkZ + $cz)])){
|
||||
unset($this->chunkTickList[$index]);
|
||||
goto skip_to_next; //no "continue 3" thanks!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($loaders <= 0){
|
||||
unset($this->chunkTickList[$index]);
|
||||
}
|
||||
|
||||
$chunk = $this->chunks[$index];
|
||||
foreach($chunk->getEntities() as $entity){
|
||||
$entity->scheduleUpdate();
|
||||
}
|
||||
@ -1006,6 +1014,8 @@ class Level implements ChunkManager, Metadatable{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
skip_to_next: //dummy label to break out of nested loops
|
||||
}
|
||||
|
||||
if($this->clearChunksOnTick){
|
||||
|
@ -51,7 +51,7 @@ class Chunk{
|
||||
/** @var bool */
|
||||
protected $isInit = false;
|
||||
|
||||
/** @var bool*/
|
||||
/** @var bool */
|
||||
protected $lightPopulated = false;
|
||||
/** @var bool */
|
||||
protected $terrainGenerated = false;
|
||||
@ -327,8 +327,8 @@ class Chunk{
|
||||
/**
|
||||
* Returns the Y coordinate of the highest non-air block at the specified X/Z chunk block coordinates
|
||||
*
|
||||
* @param int $x 0-15
|
||||
* @param int $z 0-15
|
||||
* @param int $x 0-15
|
||||
* @param int $z 0-15
|
||||
*
|
||||
* @return int 0-255, or -1 if there are no blocks in the column
|
||||
*/
|
||||
@ -366,6 +366,7 @@ class Chunk{
|
||||
|
||||
/**
|
||||
* Returns the heightmap value at the specified X/Z chunk block coordinates
|
||||
*
|
||||
* @param int $x 0-15
|
||||
* @param int $z 0-15
|
||||
* @param int $value
|
||||
@ -465,6 +466,7 @@ class Chunk{
|
||||
|
||||
/**
|
||||
* Returns a column of block IDs from bottom to top at the specified X/Z chunk block coordinates.
|
||||
*
|
||||
* @param int $x 0-15
|
||||
* @param int $z 0-15
|
||||
*
|
||||
@ -475,11 +477,13 @@ class Chunk{
|
||||
foreach($this->subChunks as $subChunk){
|
||||
$result .= $subChunk->getBlockIdColumn($x, $z);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a column of block meta values from bottom to top at the specified X/Z chunk block coordinates.
|
||||
*
|
||||
* @param int $x 0-15
|
||||
* @param int $z 0-15
|
||||
*
|
||||
@ -495,6 +499,7 @@ class Chunk{
|
||||
|
||||
/**
|
||||
* Returns a column of sky light values from bottom to top at the specified X/Z chunk block coordinates.
|
||||
*
|
||||
* @param int $x 0-15
|
||||
* @param int $z 0-15
|
||||
*
|
||||
@ -510,6 +515,7 @@ class Chunk{
|
||||
|
||||
/**
|
||||
* Returns a column of block light values from bottom to top at the specified X/Z chunk block coordinates.
|
||||
*
|
||||
* @param int $x 0-15
|
||||
* @param int $z 0-15
|
||||
*
|
||||
@ -858,8 +864,8 @@ class Chunk{
|
||||
$result .= $this->subChunks[$y]->networkSerialize();
|
||||
}
|
||||
$result .= pack("v*", ...$this->heightMap)
|
||||
. $this->biomeIds
|
||||
. chr(0); //border block array count
|
||||
. $this->biomeIds
|
||||
. chr(0); //border block array count
|
||||
//Border block entry format: 1 byte (4 bits X, 4 bits Z). These are however useless since they crash the regular client.
|
||||
|
||||
foreach($this->tiles as $tile){
|
||||
|
@ -27,6 +27,7 @@ interface SubChunkInterface{
|
||||
|
||||
/**
|
||||
* @param bool $checkLight
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isEmpty(bool $checkLight = true) : bool;
|
||||
|
@ -148,6 +148,7 @@ interface LevelProvider{
|
||||
|
||||
/**
|
||||
* Sets the world difficulty.
|
||||
*
|
||||
* @param int $difficulty
|
||||
*/
|
||||
public function setDifficulty(int $difficulty);
|
||||
|
@ -33,9 +33,9 @@ abstract class Populator{
|
||||
|
||||
/**
|
||||
* @param ChunkManager $level
|
||||
* @param int $chunkX
|
||||
* @param int $chunkZ
|
||||
* @param Random $random
|
||||
* @param int $chunkX
|
||||
* @param int $chunkZ
|
||||
* @param Random $random
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
|
@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace pocketmine\level\light;
|
||||
|
||||
use pocketmine\block\BlockFactory;
|
||||
use pocketmine\level\format\Chunk;
|
||||
use pocketmine\level\Level;
|
||||
use pocketmine\scheduler\AsyncTask;
|
||||
@ -39,6 +40,9 @@ class LightPopulationTask extends AsyncTask{
|
||||
}
|
||||
|
||||
public function onRun(){
|
||||
if(!BlockFactory::isInit()){
|
||||
BlockFactory::init();
|
||||
}
|
||||
/** @var Chunk $chunk */
|
||||
$chunk = Chunk::fastDeserialize($this->chunk);
|
||||
|
||||
|
@ -106,6 +106,8 @@ abstract class LightUpdate{
|
||||
while(!$this->spreadQueue->isEmpty()){
|
||||
list($x, $y, $z) = $this->spreadQueue->dequeue();
|
||||
|
||||
unset($this->spreadVisited[Level::blockHash($x, $y, $z)]);
|
||||
|
||||
if(!$this->subChunkHandler->moveTo($x, $y, $z)){
|
||||
continue;
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ class FloatingTextParticle extends Particle{
|
||||
|
||||
$add = new PlayerListPacket();
|
||||
$add->type = PlayerListPacket::TYPE_ADD;
|
||||
$add->entries = [PlayerListEntry::createAdditionEntry($uuid, $this->entityId, $name, $name, 0, new Skin("Standard_Custom", str_repeat("\x00", 8192)))];
|
||||
$add->entries = [PlayerListEntry::createAdditionEntry($uuid, $this->entityId, $name, new Skin("Standard_Custom", str_repeat("\x00", 8192)))];
|
||||
$p[] = $add;
|
||||
|
||||
$pk = new AddPlayerPacket();
|
||||
@ -109,8 +109,8 @@ class FloatingTextParticle extends Particle{
|
||||
1 << Entity::DATA_FLAG_IMMOBILE
|
||||
);
|
||||
$pk->metadata = [
|
||||
Entity::DATA_FLAGS => [Entity::DATA_TYPE_LONG, $flags],
|
||||
Entity::DATA_SCALE => [Entity::DATA_TYPE_FLOAT, 0.01] //zero causes problems on debug builds
|
||||
Entity::DATA_FLAGS => [Entity::DATA_TYPE_LONG, $flags],
|
||||
Entity::DATA_SCALE => [Entity::DATA_TYPE_FLOAT, 0.01] //zero causes problems on debug builds
|
||||
];
|
||||
|
||||
$p[] = $pk;
|
||||
|
@ -101,6 +101,7 @@ use pocketmine\network\mcpe\protocol\ResourcePackStackPacket;
|
||||
use pocketmine\network\mcpe\protocol\ResourcePacksInfoPacket;
|
||||
use pocketmine\network\mcpe\protocol\RespawnPacket;
|
||||
use pocketmine\network\mcpe\protocol\RiderJumpPacket;
|
||||
use pocketmine\network\mcpe\protocol\ScriptCustomEventPacket;
|
||||
use pocketmine\network\mcpe\protocol\ServerSettingsRequestPacket;
|
||||
use pocketmine\network\mcpe\protocol\ServerSettingsResponsePacket;
|
||||
use pocketmine\network\mcpe\protocol\ServerToClientHandshakePacket;
|
||||
@ -603,4 +604,8 @@ abstract class NetworkSession{
|
||||
public function handleNetworkStackLatency(NetworkStackLatencyPacket $packet) : bool{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function handleScriptCustomEvent(ScriptCustomEventPacket $packet) : bool{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -38,10 +38,6 @@ class AddPlayerPacket extends DataPacket{
|
||||
public $uuid;
|
||||
/** @var string */
|
||||
public $username;
|
||||
/** @var string */
|
||||
public $thirdPartyName = "";
|
||||
/** @var int */
|
||||
public $platform = 0;
|
||||
/** @var int|null */
|
||||
public $entityUniqueId = null; //TODO
|
||||
/** @var int */
|
||||
@ -81,8 +77,6 @@ class AddPlayerPacket extends DataPacket{
|
||||
protected function decodePayload(){
|
||||
$this->uuid = $this->getUUID();
|
||||
$this->username = $this->getString();
|
||||
$this->thirdPartyName = $this->getString();
|
||||
$this->platform = $this->getVarInt();
|
||||
$this->entityUniqueId = $this->getEntityUniqueId();
|
||||
$this->entityRuntimeId = $this->getEntityRuntimeId();
|
||||
$this->platformChatId = $this->getString();
|
||||
@ -113,8 +107,6 @@ class AddPlayerPacket extends DataPacket{
|
||||
protected function encodePayload(){
|
||||
$this->putUUID($this->uuid);
|
||||
$this->putString($this->username);
|
||||
$this->putString($this->thirdPartyName);
|
||||
$this->putVarInt($this->platform);
|
||||
$this->putEntityUniqueId($this->entityUniqueId ?? $this->entityRuntimeId);
|
||||
$this->putEntityRuntimeId($this->entityRuntimeId);
|
||||
$this->putString($this->platformChatId);
|
||||
|
@ -329,7 +329,7 @@ class AvailableCommandsPacket extends DataPacket{
|
||||
foreach($commandData->overloads as $overload){
|
||||
/**
|
||||
* @var CommandParameter[] $overload
|
||||
* @var CommandParameter $parameter
|
||||
* @var CommandParameter $parameter
|
||||
*/
|
||||
foreach($overload as $parameter){
|
||||
if($parameter->enum !== null){
|
||||
|
@ -40,6 +40,9 @@ class EventPacket extends DataPacket{
|
||||
public const TYPE_BOSS_KILLED = 7;
|
||||
public const TYPE_AGENT_COMMAND = 8;
|
||||
public const TYPE_AGENT_CREATED = 9;
|
||||
public const TYPE_PATTERN_REMOVED = 10; //???
|
||||
public const TYPE_COMMANED_EXECUTED = 11;
|
||||
public const TYPE_FISH_BUCKETED = 12;
|
||||
|
||||
/** @var int */
|
||||
public $playerRuntimeId;
|
||||
|
@ -87,7 +87,7 @@ class LoginPacket extends DataPacket{
|
||||
}
|
||||
|
||||
$logger = MainLogger::getLogger();
|
||||
$logger->debug(get_class($e) . " was thrown while decoding connection request in login (protocol version " . ($this->protocol ?? "unknown") . "): " . $e->getMessage());
|
||||
$logger->debug(get_class($e) . " was thrown while decoding connection request in login (protocol version " . ($this->protocol ?? "unknown") . "): " . $e->getMessage());
|
||||
foreach(Utils::getTrace(0, $e->getTrace()) as $line){
|
||||
$logger->debug($line);
|
||||
}
|
||||
|
@ -37,6 +37,8 @@ class MoveEntityDeltaPacket extends DataPacket{
|
||||
public const FLAG_HAS_ROT_Y = 0x10;
|
||||
public const FLAG_HAS_ROT_Z = 0x20;
|
||||
|
||||
/** @var int */
|
||||
public $entityRuntimeId;
|
||||
/** @var int */
|
||||
public $flags;
|
||||
/** @var int */
|
||||
@ -67,6 +69,7 @@ class MoveEntityDeltaPacket extends DataPacket{
|
||||
}
|
||||
|
||||
protected function decodePayload(){
|
||||
$this->entityRuntimeId = $this->getEntityRuntimeId();
|
||||
$this->flags = $this->getByte();
|
||||
$this->xDiff = $this->maybeReadCoord(self::FLAG_HAS_X);
|
||||
$this->yDiff = $this->maybeReadCoord(self::FLAG_HAS_Y);
|
||||
@ -89,6 +92,7 @@ class MoveEntityDeltaPacket extends DataPacket{
|
||||
}
|
||||
|
||||
protected function encodePayload(){
|
||||
$this->putEntityRuntimeId($this->entityRuntimeId);
|
||||
$this->putByte($this->flags);
|
||||
$this->maybeWriteCoord(self::FLAG_HAS_X, $this->xDiff);
|
||||
$this->maybeWriteCoord(self::FLAG_HAS_Y, $this->yDiff);
|
||||
|
@ -146,6 +146,7 @@ class PacketPool{
|
||||
static::registerPacket(new SetLocalPlayerAsInitializedPacket());
|
||||
static::registerPacket(new UpdateSoftEnumPacket());
|
||||
static::registerPacket(new NetworkStackLatencyPacket());
|
||||
static::registerPacket(new ScriptCustomEventPacket());
|
||||
|
||||
static::registerPacket(new BatchPacket());
|
||||
}
|
||||
@ -159,6 +160,7 @@ class PacketPool{
|
||||
|
||||
/**
|
||||
* @param int $pid
|
||||
*
|
||||
* @return DataPacket
|
||||
*/
|
||||
public static function getPacketById(int $pid) : DataPacket{
|
||||
@ -167,6 +169,7 @@ class PacketPool{
|
||||
|
||||
/**
|
||||
* @param string $buffer
|
||||
*
|
||||
* @return DataPacket
|
||||
*/
|
||||
public static function getPacket(string $buffer) : DataPacket{
|
||||
|
@ -56,8 +56,6 @@ class PlayerListPacket extends DataPacket{
|
||||
$entry->uuid = $this->getUUID();
|
||||
$entry->entityUniqueId = $this->getEntityUniqueId();
|
||||
$entry->username = $this->getString();
|
||||
$entry->thirdPartyName = $this->getString();
|
||||
$entry->platform = $this->getVarInt();
|
||||
|
||||
$skinId = $this->getString();
|
||||
$skinData = $this->getString();
|
||||
@ -90,8 +88,6 @@ class PlayerListPacket extends DataPacket{
|
||||
$this->putUUID($entry->uuid);
|
||||
$this->putEntityUniqueId($entry->entityUniqueId);
|
||||
$this->putString($entry->username);
|
||||
$this->putString($entry->thirdPartyName);
|
||||
$this->putVarInt($entry->platform);
|
||||
$this->putString($entry->skin->getSkinId());
|
||||
$this->putString($entry->skin->getSkinData());
|
||||
$this->putString($entry->skin->getCapeData());
|
||||
|
@ -39,15 +39,15 @@ interface ProtocolInfo{
|
||||
/**
|
||||
* Actual Minecraft: PE protocol version
|
||||
*/
|
||||
public const CURRENT_PROTOCOL = 282;
|
||||
public const CURRENT_PROTOCOL = 291;
|
||||
/**
|
||||
* Current Minecraft PE version reported by the server. This is usually the earliest currently supported version.
|
||||
*/
|
||||
public const MINECRAFT_VERSION = 'v1.6.0';
|
||||
public const MINECRAFT_VERSION = 'v1.7.0';
|
||||
/**
|
||||
* Version number sent to clients in ping responses.
|
||||
*/
|
||||
public const MINECRAFT_VERSION_NETWORK = '1.6.0';
|
||||
public const MINECRAFT_VERSION_NETWORK = '1.7.0';
|
||||
|
||||
public const LOGIN_PACKET = 0x01;
|
||||
public const PLAY_STATUS_PACKET = 0x02;
|
||||
@ -164,5 +164,6 @@ interface ProtocolInfo{
|
||||
public const SET_LOCAL_PLAYER_AS_INITIALIZED_PACKET = 0x71;
|
||||
public const UPDATE_SOFT_ENUM_PACKET = 0x72;
|
||||
public const NETWORK_STACK_LATENCY_PACKET = 0x73;
|
||||
public const SCRIPT_CUSTOM_EVENT_PACKET = 0x75;
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
*
|
||||
* ____ _ _ __ __ _ __ __ ____
|
||||
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
||||
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
||||
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
||||
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* @author PocketMine Team
|
||||
* @link http://www.pocketmine.net/
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace pocketmine\network\mcpe\protocol;
|
||||
|
||||
#include <rules/DataPacket.h>
|
||||
|
||||
use pocketmine\network\mcpe\NetworkSession;
|
||||
|
||||
class ScriptCustomEventPacket extends DataPacket{
|
||||
public const NETWORK_ID = ProtocolInfo::SCRIPT_CUSTOM_EVENT_PACKET;
|
||||
|
||||
/** @var string */
|
||||
public $eventName;
|
||||
/** @var string json data */
|
||||
public $eventData;
|
||||
|
||||
protected function decodePayload(){
|
||||
$this->eventName = $this->getString();
|
||||
$this->eventData = $this->getString();
|
||||
}
|
||||
|
||||
protected function encodePayload(){
|
||||
$this->putString($this->eventName);
|
||||
$this->putString($this->eventData);
|
||||
}
|
||||
|
||||
public function handle(NetworkSession $session) : bool{
|
||||
return $session->handleScriptCustomEvent($this);
|
||||
}
|
||||
}
|
@ -31,8 +31,8 @@ use pocketmine\network\mcpe\protocol\types\ScorePacketEntry;
|
||||
class SetScorePacket extends DataPacket{
|
||||
public const NETWORK_ID = ProtocolInfo::SET_SCORE_PACKET;
|
||||
|
||||
public const TYPE_MODIFY_SCORE = 0;
|
||||
public const TYPE_RESET_SCORE = 1;
|
||||
public const TYPE_CHANGE = 0;
|
||||
public const TYPE_REMOVE = 1;
|
||||
|
||||
/** @var int */
|
||||
public $type;
|
||||
@ -43,9 +43,23 @@ class SetScorePacket extends DataPacket{
|
||||
$this->type = $this->getByte();
|
||||
for($i = 0, $i2 = $this->getUnsignedVarInt(); $i < $i2; ++$i){
|
||||
$entry = new ScorePacketEntry();
|
||||
$entry->uuid = $this->getUUID();
|
||||
$entry->scoreboardId = $this->getVarLong();
|
||||
$entry->objectiveName = $this->getString();
|
||||
$entry->score = $this->getLInt();
|
||||
if($this->type !== self::TYPE_REMOVE){
|
||||
$entry->type = $this->getByte();
|
||||
switch($entry->type){
|
||||
case ScorePacketEntry::TYPE_PLAYER:
|
||||
case ScorePacketEntry::TYPE_ENTITY:
|
||||
$entry->entityUniqueId = $this->getEntityUniqueId();
|
||||
break;
|
||||
case ScorePacketEntry::TYPE_FAKE_PLAYER:
|
||||
$entry->customName = $this->getString();
|
||||
break;
|
||||
default:
|
||||
throw new \UnexpectedValueException("Unknown entry type $entry->type");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,9 +67,23 @@ class SetScorePacket extends DataPacket{
|
||||
$this->putByte($this->type);
|
||||
$this->putUnsignedVarInt(count($this->entries));
|
||||
foreach($this->entries as $entry){
|
||||
$this->putUUID($entry->uuid);
|
||||
$this->putVarLong($entry->scoreboardId);
|
||||
$this->putString($entry->objectiveName);
|
||||
$this->putLInt($entry->score);
|
||||
if($this->type !== self::TYPE_REMOVE){
|
||||
$this->putByte($entry->type);
|
||||
switch($entry->type){
|
||||
case ScorePacketEntry::TYPE_PLAYER:
|
||||
case ScorePacketEntry::TYPE_ENTITY:
|
||||
$this->putEntityUniqueId($entry->entityUniqueId);
|
||||
break;
|
||||
case ScorePacketEntry::TYPE_FAKE_PLAYER:
|
||||
$this->putString($entry->customName);
|
||||
break;
|
||||
default:
|
||||
throw new \UnexpectedValueException("Unknown entry type $entry->type");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@ class SetScoreboardIdentityPacket extends DataPacket{
|
||||
$entry = new ScoreboardIdentityPacketEntry();
|
||||
$entry->scoreboardId = $this->getVarLong();
|
||||
if($this->type === self::TYPE_REGISTER_IDENTITY){
|
||||
$entry->uuid = $this->getUUID();
|
||||
$entry->entityUniqueId = $this->getEntityUniqueId();
|
||||
}
|
||||
|
||||
$this->entries[] = $entry;
|
||||
@ -58,7 +58,7 @@ class SetScoreboardIdentityPacket extends DataPacket{
|
||||
foreach($this->entries as $entry){
|
||||
$this->putVarLong($entry->scoreboardId);
|
||||
if($this->type === self::TYPE_REGISTER_IDENTITY){
|
||||
$this->putUUID($entry->uuid);
|
||||
$this->putEntityUniqueId($entry->entityUniqueId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ class StartGamePacket extends DataPacket{
|
||||
public $difficulty;
|
||||
/** @var int */
|
||||
public $spawnX;
|
||||
/** @var int*/
|
||||
/** @var int */
|
||||
public $spawnY;
|
||||
/** @var int */
|
||||
public $spawnZ;
|
||||
@ -116,6 +116,8 @@ class StartGamePacket extends DataPacket{
|
||||
public $hasLockedResourcePack = false;
|
||||
/** @var bool */
|
||||
public $isFromLockedWorldTemplate = false;
|
||||
/** @var bool */
|
||||
public $useMsaGamertagsOnly = false;
|
||||
|
||||
/** @var string */
|
||||
public $levelId = ""; //base64 string, usually the same as world folder name in vanilla
|
||||
@ -173,6 +175,7 @@ class StartGamePacket extends DataPacket{
|
||||
$this->hasLockedBehaviorPack = $this->getBool();
|
||||
$this->hasLockedResourcePack = $this->getBool();
|
||||
$this->isFromLockedWorldTemplate = $this->getBool();
|
||||
$this->useMsaGamertagsOnly = $this->getBool();
|
||||
|
||||
$this->levelId = $this->getString();
|
||||
$this->worldName = $this->getString();
|
||||
@ -232,6 +235,7 @@ class StartGamePacket extends DataPacket{
|
||||
$this->putBool($this->hasLockedBehaviorPack);
|
||||
$this->putBool($this->hasLockedResourcePack);
|
||||
$this->putBool($this->isFromLockedWorldTemplate);
|
||||
$this->putBool($this->useMsaGamertagsOnly);
|
||||
|
||||
$this->putString($this->levelId);
|
||||
$this->putString($this->worldName);
|
||||
|
@ -48,10 +48,6 @@ class TextPacket extends DataPacket{
|
||||
/** @var string */
|
||||
public $sourceName;
|
||||
/** @var string */
|
||||
public $sourceThirdPartyName = "";
|
||||
/** @var int */
|
||||
public $sourcePlatform = 0;
|
||||
/** @var string */
|
||||
public $message;
|
||||
/** @var string[] */
|
||||
public $parameters = [];
|
||||
@ -69,8 +65,6 @@ class TextPacket extends DataPacket{
|
||||
/** @noinspection PhpMissingBreakStatementInspection */
|
||||
case self::TYPE_ANNOUNCEMENT:
|
||||
$this->sourceName = $this->getString();
|
||||
$this->sourceThirdPartyName = $this->getString();
|
||||
$this->sourcePlatform = $this->getVarInt();
|
||||
case self::TYPE_RAW:
|
||||
case self::TYPE_TIP:
|
||||
case self::TYPE_SYSTEM:
|
||||
@ -101,8 +95,6 @@ class TextPacket extends DataPacket{
|
||||
/** @noinspection PhpMissingBreakStatementInspection */
|
||||
case self::TYPE_ANNOUNCEMENT:
|
||||
$this->putString($this->sourceName);
|
||||
$this->putString($this->sourceThirdPartyName);
|
||||
$this->putVarInt($this->sourcePlatform);
|
||||
case self::TYPE_RAW:
|
||||
case self::TYPE_TIP:
|
||||
case self::TYPE_SYSTEM:
|
||||
|
@ -92,6 +92,7 @@ class NetworkInventoryAction{
|
||||
|
||||
/**
|
||||
* @param InventoryTransactionPacket $packet
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function read(InventoryTransactionPacket $packet){
|
||||
|
@ -34,10 +34,6 @@ class PlayerListEntry{
|
||||
public $entityUniqueId;
|
||||
/** @var string */
|
||||
public $username;
|
||||
/** @var string */
|
||||
public $thirdPartyName = "";
|
||||
/** @var int */
|
||||
public $platform = 0;
|
||||
/** @var Skin */
|
||||
public $skin;
|
||||
/** @var string */
|
||||
@ -52,13 +48,11 @@ class PlayerListEntry{
|
||||
return $entry;
|
||||
}
|
||||
|
||||
public static function createAdditionEntry(UUID $uuid, int $entityUniqueId, string $username, string $thirdPartyName, int $platform, Skin $skin, string $xboxUserId = "", string $platformChatId = "") : PlayerListEntry{
|
||||
public static function createAdditionEntry(UUID $uuid, int $entityUniqueId, string $username, Skin $skin, string $xboxUserId = "", string $platformChatId = "") : PlayerListEntry{
|
||||
$entry = new PlayerListEntry();
|
||||
$entry->uuid = $uuid;
|
||||
$entry->entityUniqueId = $entityUniqueId;
|
||||
$entry->username = $username;
|
||||
$entry->thirdPartyName = $thirdPartyName;
|
||||
$entry->platform = $platform;
|
||||
$entry->skin = $skin;
|
||||
$entry->xboxUserId = $xboxUserId;
|
||||
$entry->platformChatId = $platformChatId;
|
||||
|
@ -23,13 +23,23 @@ declare(strict_types=1);
|
||||
|
||||
namespace pocketmine\network\mcpe\protocol\types;
|
||||
|
||||
use pocketmine\utils\UUID;
|
||||
|
||||
class ScorePacketEntry{
|
||||
/** @var UUID */
|
||||
public $uuid;
|
||||
public const TYPE_PLAYER = 1;
|
||||
public const TYPE_ENTITY = 2;
|
||||
public const TYPE_FAKE_PLAYER = 3;
|
||||
|
||||
/** @var int */
|
||||
public $scoreboardId;
|
||||
/** @var string */
|
||||
public $objectiveName;
|
||||
/** @var int */
|
||||
public $score;
|
||||
|
||||
/** @var int */
|
||||
public $type;
|
||||
|
||||
/** @var int|null (if type entity or player) */
|
||||
public $entityUniqueId;
|
||||
/** @var string|null (if type fake player) */
|
||||
public $customName;
|
||||
}
|
||||
|
@ -23,12 +23,10 @@ declare(strict_types=1);
|
||||
|
||||
namespace pocketmine\network\mcpe\protocol\types;
|
||||
|
||||
use pocketmine\utils\UUID;
|
||||
|
||||
class ScoreboardIdentityPacketEntry{
|
||||
/** @var int */
|
||||
public $scoreboardId;
|
||||
/** @var UUID|null */
|
||||
public $uuid;
|
||||
/** @var int|null */
|
||||
public $entityUniqueId;
|
||||
|
||||
}
|
||||
|
@ -119,6 +119,7 @@ class BanEntry{
|
||||
* @link https://bugs.php.net/bug.php?id=75992
|
||||
*
|
||||
* @param \DateTime $dateTime
|
||||
*
|
||||
* @throws \RuntimeException if the argument can't be parsed from a formatted date string
|
||||
*/
|
||||
private static function validateDate(\DateTime $dateTime) : void{
|
||||
|
@ -106,7 +106,7 @@ class PermissibleBase implements Permissible{
|
||||
*
|
||||
* @param Plugin $plugin
|
||||
* @param string $name
|
||||
* @param bool $value
|
||||
* @param bool $value
|
||||
*
|
||||
* @return PermissionAttachment
|
||||
*/
|
||||
|
@ -102,7 +102,7 @@ interface Plugin extends CommandExecutor{
|
||||
* Saves an embedded resource to its relative location in the data folder
|
||||
*
|
||||
* @param string $filename
|
||||
* @param bool $replace
|
||||
* @param bool $replace
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
|
@ -190,7 +190,7 @@ abstract class PluginBase implements Plugin{
|
||||
|
||||
/**
|
||||
* @param string $filename
|
||||
* @param bool $replace
|
||||
* @param bool $replace
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
|
@ -359,6 +359,7 @@ class PluginManager{
|
||||
* Returns whether a specified API version string is considered compatible with the server's API version.
|
||||
*
|
||||
* @param string ...$versions
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isCompatibleApi(string ...$versions) : bool{
|
||||
|
@ -138,6 +138,7 @@ class ResourcePackManager{
|
||||
* Returns the resource pack matching the specified UUID string, or null if the ID was not recognized.
|
||||
*
|
||||
* @param string $id
|
||||
*
|
||||
* @return ResourcePack|null
|
||||
*/
|
||||
public function getPackById(string $id){
|
||||
|
@ -32,6 +32,7 @@ class ZippedResourcePack implements ResourcePack{
|
||||
* TODO: add more manifest validation
|
||||
*
|
||||
* @param \stdClass $manifest
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function verifyManifest(\stdClass $manifest) : bool{
|
||||
|
@ -129,6 +129,7 @@ abstract class AsyncTask extends Collectable{
|
||||
* @see AsyncWorker::getFromThreadStore()
|
||||
*
|
||||
* @param string $identifier
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getFromThreadStore(string $identifier){
|
||||
|
@ -102,6 +102,7 @@ class AsyncWorker extends Worker{
|
||||
* Objects stored in this storage may ONLY be retrieved while the task is running.
|
||||
*
|
||||
* @param string $identifier
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getFromThreadStore(string $identifier){
|
||||
|
@ -101,6 +101,7 @@ class AutoUpdater{
|
||||
|
||||
/**
|
||||
* Shows a warning to a player to tell them there is an update available
|
||||
*
|
||||
* @param Player $player
|
||||
*/
|
||||
public function showPlayerUpdate(Player $player){
|
||||
|
@ -47,6 +47,7 @@ class Color{
|
||||
|
||||
/**
|
||||
* Sets the alpha (opacity) value of this colour, lower = more transparent
|
||||
*
|
||||
* @param int $a
|
||||
*/
|
||||
public function setA(int $a){
|
||||
@ -63,6 +64,7 @@ class Color{
|
||||
|
||||
/**
|
||||
* Sets the red value of this colour.
|
||||
*
|
||||
* @param int $r
|
||||
*/
|
||||
public function setR(int $r){
|
||||
@ -79,6 +81,7 @@ class Color{
|
||||
|
||||
/**
|
||||
* Sets the green value of this colour.
|
||||
*
|
||||
* @param int $g
|
||||
*/
|
||||
public function setG(int $g){
|
||||
@ -95,6 +98,7 @@ class Color{
|
||||
|
||||
/**
|
||||
* Sets the blue value of this colour.
|
||||
*
|
||||
* @param int $b
|
||||
*/
|
||||
public function setB(int $b){
|
||||
@ -105,6 +109,7 @@ class Color{
|
||||
* Mixes the supplied list of colours together to produce a result colour.
|
||||
*
|
||||
* @param Color ...$colors
|
||||
*
|
||||
* @return Color
|
||||
*/
|
||||
public static function mix(Color ...$colors) : Color{
|
||||
@ -127,6 +132,7 @@ class Color{
|
||||
|
||||
/**
|
||||
* Returns a Color from the supplied RGB colour code (24-bit)
|
||||
*
|
||||
* @param int $code
|
||||
*
|
||||
* @return Color
|
||||
|
@ -232,6 +232,7 @@ class Config{
|
||||
* Sets the options for the JSON encoding when saving
|
||||
*
|
||||
* @param int $options
|
||||
*
|
||||
* @return Config $this
|
||||
* @throws \RuntimeException if the Config is not in JSON
|
||||
* @see json_encode
|
||||
@ -250,6 +251,7 @@ class Config{
|
||||
* Enables the given option in addition to the currently set JSON options
|
||||
*
|
||||
* @param int $option
|
||||
*
|
||||
* @return Config $this
|
||||
* @throws \RuntimeException if the Config is not in JSON
|
||||
* @see json_encode
|
||||
@ -268,6 +270,7 @@ class Config{
|
||||
* Disables the given option for the JSON encoding when saving
|
||||
*
|
||||
* @param int $option
|
||||
*
|
||||
* @return Config $this
|
||||
* @throws \RuntimeException if the Config is not in JSON
|
||||
* @see json_encode
|
||||
|
@ -76,7 +76,7 @@ class Internet{
|
||||
* @param string $page
|
||||
* @param int $timeout default 10
|
||||
* @param array $extraHeaders
|
||||
* @param string &$err Will be set to the output of curl_error(). Use this to retrieve errors that occured during the operation.
|
||||
* @param string &$err Will be set to the output of curl_error(). Use this to retrieve errors that occured during the operation.
|
||||
* @param array[] &$headers
|
||||
* @param int &$httpCode
|
||||
*
|
||||
|
@ -50,7 +50,7 @@ class MainLogger extends \AttachableThreadedLogger{
|
||||
|
||||
/**
|
||||
* @param string $logFile
|
||||
* @param bool $logDebug
|
||||
* @param bool $logDebug
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
|
@ -47,6 +47,7 @@ class UUID{
|
||||
*
|
||||
* @param string $uuid
|
||||
* @param int $version
|
||||
*
|
||||
* @return UUID
|
||||
*/
|
||||
public static function fromString(string $uuid, int $version = null) : UUID{
|
||||
@ -58,6 +59,7 @@ class UUID{
|
||||
*
|
||||
* @param string $uuid
|
||||
* @param int $version
|
||||
*
|
||||
* @return UUID
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
@ -74,6 +76,7 @@ class UUID{
|
||||
* Creates an UUIDv3 from binary data or list of binary data
|
||||
*
|
||||
* @param string ...$data
|
||||
*
|
||||
* @return UUID
|
||||
*/
|
||||
public static function fromData(string ...$data) : UUID{
|
||||
|
@ -246,6 +246,7 @@ class Utils{
|
||||
|
||||
/**
|
||||
* @param bool $recalculate
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function getCoreCount(bool $recalculate = false) : int{
|
||||
@ -532,10 +533,10 @@ class Utils{
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $severity
|
||||
* @param int $severity
|
||||
* @param string $message
|
||||
* @param string $file
|
||||
* @param int $line
|
||||
* @param int $line
|
||||
*
|
||||
* @return bool
|
||||
* @throws \ErrorException
|
||||
|
Reference in New Issue
Block a user