mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-04 00:59:51 +00:00
Merge branch 'minor-next' into major-next
This commit is contained in:
commit
7cdab75b05
8
.github/workflows/build-docker-image.yml
vendored
8
.github/workflows/build-docker-image.yml
vendored
@ -52,7 +52,7 @@ jobs:
|
|||||||
context: ./pocketmine-mp
|
context: ./pocketmine-mp
|
||||||
tags: |
|
tags: |
|
||||||
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }}
|
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }}
|
||||||
# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }}
|
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }}
|
||||||
build-args: |
|
build-args: |
|
||||||
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
||||||
PMMP_REPO=${{ github.repository }}
|
PMMP_REPO=${{ github.repository }}
|
||||||
@ -65,7 +65,7 @@ jobs:
|
|||||||
context: ./pocketmine-mp
|
context: ./pocketmine-mp
|
||||||
tags: |
|
tags: |
|
||||||
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MAJOR }}
|
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MAJOR }}
|
||||||
# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MAJOR }}
|
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MAJOR }}
|
||||||
build-args: |
|
build-args: |
|
||||||
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
||||||
PMMP_REPO=${{ github.repository }}
|
PMMP_REPO=${{ github.repository }}
|
||||||
@ -78,7 +78,7 @@ jobs:
|
|||||||
context: ./pocketmine-mp
|
context: ./pocketmine-mp
|
||||||
tags: |
|
tags: |
|
||||||
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MINOR }}
|
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MINOR }}
|
||||||
# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MINOR }}
|
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.MINOR }}
|
||||||
build-args: |
|
build-args: |
|
||||||
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
||||||
PMMP_REPO=${{ github.repository }}
|
PMMP_REPO=${{ github.repository }}
|
||||||
@ -91,7 +91,7 @@ jobs:
|
|||||||
context: ./pocketmine-mp
|
context: ./pocketmine-mp
|
||||||
tags: |
|
tags: |
|
||||||
${{ steps.docker-repo-name.outputs.NAME }}:latest
|
${{ steps.docker-repo-name.outputs.NAME }}:latest
|
||||||
# ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:latest
|
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:latest
|
||||||
build-args: |
|
build-args: |
|
||||||
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
|
||||||
PMMP_REPO=${{ github.repository }}
|
PMMP_REPO=${{ github.repository }}
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/pmmp/PocketMine-MP/actions/workflows/main.yml"><img src="https://github.com/pmmp/PocketMine-MP/workflows/CI/badge.svg" alt="CI" /></a>
|
<a href="https://github.com/pmmp/PocketMine-MP/actions/workflows/main.yml"><img src="https://github.com/pmmp/PocketMine-MP/workflows/CI/badge.svg" alt="CI" /></a>
|
||||||
<a href="https://github.com/pmmp/PocketMine-MP/releases/latest"><img alt="GitHub release (latest SemVer)" src="https://img.shields.io/github/v/release/pmmp/PocketMine-MP?label=release&sort=semver"></a>
|
<a href="https://github.com/pmmp/PocketMine-MP/releases/latest"><img alt="GitHub release (latest SemVer)" src="https://img.shields.io/github/v/release/pmmp/PocketMine-MP?label=release&sort=semver"></a>
|
||||||
<a href="https://hub.docker.com/r/pmmp/pocketmine-mp"><img src="https://img.shields.io/docker/v/pmmp/pocketmine-mp?logo=docker&label=image" alt="Docker image version (latest semver)" /></a>
|
|
||||||
<a href="https://discord.gg/bmSAZBG"><img src="https://img.shields.io/discord/373199722573201408?label=discord&color=7289DA&logo=discord" alt="Discord" /></a>
|
<a href="https://discord.gg/bmSAZBG"><img src="https://img.shields.io/discord/373199722573201408?label=discord&color=7289DA&logo=discord" alt="Discord" /></a>
|
||||||
<br>
|
<br>
|
||||||
<a href="https://github.com/pmmp/PocketMine-MP/releases"><img alt="GitHub all releases" src="https://img.shields.io/github/downloads/pmmp/PocketMine-MP/total?label=downloads%40total"></a>
|
<a href="https://github.com/pmmp/PocketMine-MP/releases"><img alt="GitHub all releases" src="https://img.shields.io/github/downloads/pmmp/PocketMine-MP/total?label=downloads%40total"></a>
|
||||||
@ -24,7 +23,7 @@
|
|||||||
## Getting started
|
## Getting started
|
||||||
- [Documentation](http://pmmp.readthedocs.org/)
|
- [Documentation](http://pmmp.readthedocs.org/)
|
||||||
- [Installation instructions](https://pmmp.readthedocs.io/en/rtfd/installation.html)
|
- [Installation instructions](https://pmmp.readthedocs.io/en/rtfd/installation.html)
|
||||||
- [Docker image](https://hub.docker.com/r/pmmp/pocketmine-mp)
|
- [Docker image](https://github.com/pmmp/PocketMine-MP/pkgs/container/pocketmine-mp)
|
||||||
- [Plugin repository](https://poggit.pmmp.io/plugins)
|
- [Plugin repository](https://poggit.pmmp.io/plugins)
|
||||||
|
|
||||||
## Discussion/Help
|
## Discussion/Help
|
||||||
|
45
changelogs/4.18-alpha.md
Normal file
45
changelogs/4.18-alpha.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
**For Minecraft: Bedrock Edition 1.19.70**
|
||||||
|
|
||||||
|
### Note about API versions
|
||||||
|
Plugins which don't touch the `pocketmine\network\mcpe` namespace are compatible with any previous 4.x.y version will also run on these releases and do not need API bumps.
|
||||||
|
Plugin developers should **only** update their required API to this version if you need the changes in this build.
|
||||||
|
|
||||||
|
**WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.**
|
||||||
|
Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly.
|
||||||
|
|
||||||
|
### Alpha release warning
|
||||||
|
Alpha releases are **experimental**. Features introduced in these releases are subject to change or removal.
|
||||||
|
|
||||||
|
APIs which existed **prior** to this version will continue to work as normal, so plugins which use them will continue to work.
|
||||||
|
|
||||||
|
### Highlights
|
||||||
|
This version makes changes to the internal network system to improve server performance and reduce memory usage.
|
||||||
|
|
||||||
|
While these changes don't affect non-internal API, they are still significant enough to warrant a new minor version, as they may break plugins which use the internal network API (not recommended).
|
||||||
|
|
||||||
|
# 4.18.0-ALPHA1
|
||||||
|
Released 16th March 2023.
|
||||||
|
|
||||||
|
## General
|
||||||
|
- Improved server performance in congested areas of the world (lots of players and/or entities in the same area).
|
||||||
|
|
||||||
|
## API
|
||||||
|
### `pocketmine\event\server`
|
||||||
|
- The following new classes have been added:
|
||||||
|
- `DataPacketDecodeEvent` - called before a packet is decoded by a `NetworkSession`; useful to mitigate DoS attacks if PocketMine-MP hasn't been patched against new bugs yet
|
||||||
|
|
||||||
|
## Internals
|
||||||
|
- Introduced new system for broadcasting entity events to network sessions.
|
||||||
|
- This change improves performance when lots of players and/or entities are in the same area.
|
||||||
|
- New interface `EntityEventBroadcaster` and class `StandardEntityEventBroadcaster` have been added to implement this.
|
||||||
|
- All entity-specific `on*()` and `sync*()` methods have been removed from `NetworkSession` (BC break).
|
||||||
|
- `NetworkSession` now accepts an `EntityEventBroadcaster` instance in its constructor.
|
||||||
|
- `NetworkBroadcastUtils::broadcastEntityEvent()` can be used to efficiently broadcast events to unique broadcasters shared by several network sessions.
|
||||||
|
- All network sessions now share the same `PacketSerializerContext` and `PacketBroadcaster` by default.
|
||||||
|
- Previously, every session had its own context, meaning that broadcast optimisations were not used, causing significant performance losses compared to 3.x.
|
||||||
|
- This change improves performance in congested areas by allowing reuse of previously encoded packet buffers for all sessions sharing the same context.
|
||||||
|
- Packet broadcasts are automatically encoded separately per unique `PacketSerializerContext` instance. This allows, for example, a multi-version fork to have a separate context for each protocol version, to ensure maximum broadcast efficiency while encoding different packets for different versions.
|
||||||
|
- `PacketSerializerContext` is now passed in `NetworkSession::__construct()`, instead of being created by the session.
|
||||||
|
- `StandardPacketBroadcaster` is now locked to a single `PacketSerializer` context, reducing complexity.
|
||||||
|
- Introduced `NetworkBroadcastUtils::broadcastPackets()`, replacing `Server->broadcastPackets()`.
|
||||||
|
- `Server->broadcastPackets()` has been deprecated. It will be removed in a future version.
|
@ -31,6 +31,7 @@ use function str_repeat;
|
|||||||
|
|
||||||
final class VersionInfo{
|
final class VersionInfo{
|
||||||
public const NAME = "PocketMine-MP";
|
public const NAME = "PocketMine-MP";
|
||||||
|
|
||||||
public const BASE_VERSION = "5.0.0-BETA2";
|
public const BASE_VERSION = "5.0.0-BETA2";
|
||||||
public const IS_DEVELOPMENT_BUILD = true;
|
public const IS_DEVELOPMENT_BUILD = true;
|
||||||
public const BUILD_CHANNEL = "beta";
|
public const BUILD_CHANNEL = "beta";
|
||||||
|
@ -202,7 +202,7 @@ abstract class Entity{
|
|||||||
if($nbt !== null){
|
if($nbt !== null){
|
||||||
$this->motion = EntityDataHelper::parseVec3($nbt, self::TAG_MOTION, true);
|
$this->motion = EntityDataHelper::parseVec3($nbt, self::TAG_MOTION, true);
|
||||||
}else{
|
}else{
|
||||||
$this->motion = new Vector3(0, 0, 0);
|
$this->motion = Vector3::zero();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->resetLastMovements();
|
$this->resetLastMovements();
|
||||||
@ -1110,6 +1110,7 @@ abstract class Entity{
|
|||||||
$this->blocksAround = null;
|
$this->blocksAround = null;
|
||||||
|
|
||||||
Timings::$entityMove->startTiming();
|
Timings::$entityMove->startTiming();
|
||||||
|
Timings::$entityMoveCollision->startTiming();
|
||||||
|
|
||||||
$wantedX = $dx;
|
$wantedX = $dx;
|
||||||
$wantedY = $dy;
|
$wantedY = $dy;
|
||||||
@ -1194,6 +1195,7 @@ abstract class Entity{
|
|||||||
|
|
||||||
$this->boundingBox = $moveBB;
|
$this->boundingBox = $moveBB;
|
||||||
}
|
}
|
||||||
|
Timings::$entityMoveCollision->stopTiming();
|
||||||
|
|
||||||
$this->location = new Location(
|
$this->location = new Location(
|
||||||
($this->boundingBox->minX + $this->boundingBox->maxX) / 2,
|
($this->boundingBox->minX + $this->boundingBox->maxX) / 2,
|
||||||
|
@ -80,7 +80,7 @@ final class EntityDataHelper{
|
|||||||
public static function parseVec3(CompoundTag $nbt, string $tagName, bool $optional) : Vector3{
|
public static function parseVec3(CompoundTag $nbt, string $tagName, bool $optional) : Vector3{
|
||||||
$pos = $nbt->getTag($tagName);
|
$pos = $nbt->getTag($tagName);
|
||||||
if($pos === null && $optional){
|
if($pos === null && $optional){
|
||||||
return new Vector3(0, 0, 0);
|
return Vector3::zero();
|
||||||
}
|
}
|
||||||
if(!($pos instanceof ListTag) || ($pos->getTagType() !== NBT::TAG_Double && $pos->getTagType() !== NBT::TAG_Float)){
|
if(!($pos instanceof ListTag) || ($pos->getTagType() !== NBT::TAG_Double && $pos->getTagType() !== NBT::TAG_Float)){
|
||||||
throw new SavedDataLoadingException("'$tagName' should be a List<Double> or List<Float>");
|
throw new SavedDataLoadingException("'$tagName' should be a List<Double> or List<Float>");
|
||||||
|
@ -41,6 +41,7 @@ use pocketmine\network\mcpe\protocol\AddItemActorPacket;
|
|||||||
use pocketmine\network\mcpe\protocol\types\entity\EntityIds;
|
use pocketmine\network\mcpe\protocol\types\entity\EntityIds;
|
||||||
use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper;
|
use pocketmine\network\mcpe\protocol\types\inventory\ItemStackWrapper;
|
||||||
use pocketmine\player\Player;
|
use pocketmine\player\Player;
|
||||||
|
use pocketmine\timings\Timings;
|
||||||
use function max;
|
use function max;
|
||||||
|
|
||||||
class ItemEntity extends Entity{
|
class ItemEntity extends Entity{
|
||||||
@ -106,6 +107,9 @@ class ItemEntity extends Entity{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timings::$itemEntityBaseTick->startTiming();
|
||||||
|
try{
|
||||||
|
|
||||||
$hasUpdate = parent::entityBaseTick($tickDiff);
|
$hasUpdate = parent::entityBaseTick($tickDiff);
|
||||||
|
|
||||||
if($this->isFlaggedForDespawn()){
|
if($this->isFlaggedForDespawn()){
|
||||||
@ -157,6 +161,9 @@ class ItemEntity extends Entity{
|
|||||||
}
|
}
|
||||||
|
|
||||||
return $hasUpdate;
|
return $hasUpdate;
|
||||||
|
}finally{
|
||||||
|
Timings::$itemEntityBaseTick->stopTiming();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,7 +163,8 @@ abstract class Projectile extends Entity{
|
|||||||
protected function move(float $dx, float $dy, float $dz) : void{
|
protected function move(float $dx, float $dy, float $dz) : void{
|
||||||
$this->blocksAround = null;
|
$this->blocksAround = null;
|
||||||
|
|
||||||
Timings::$entityMove->startTiming();
|
Timings::$projectileMove->startTiming();
|
||||||
|
Timings::$projectileMoveRayTrace->startTiming();
|
||||||
|
|
||||||
$start = $this->location->asVector3();
|
$start = $this->location->asVector3();
|
||||||
$end = $start->add($dx, $dy, $dz);
|
$end = $start->add($dx, $dy, $dz);
|
||||||
@ -209,6 +210,8 @@ abstract class Projectile extends Entity{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timings::$projectileMoveRayTrace->stopTiming();
|
||||||
|
|
||||||
$this->location = Location::fromObject(
|
$this->location = Location::fromObject(
|
||||||
$end,
|
$end,
|
||||||
$this->location->world,
|
$this->location->world,
|
||||||
@ -240,7 +243,7 @@ abstract class Projectile extends Entity{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->isCollided = $this->onGround = true;
|
$this->isCollided = $this->onGround = true;
|
||||||
$this->motion = new Vector3(0, 0, 0);
|
$this->motion = Vector3::zero();
|
||||||
}else{
|
}else{
|
||||||
$this->isCollided = $this->onGround = false;
|
$this->isCollided = $this->onGround = false;
|
||||||
$this->blockHit = null;
|
$this->blockHit = null;
|
||||||
@ -256,7 +259,7 @@ abstract class Projectile extends Entity{
|
|||||||
$this->getWorld()->onEntityMoved($this);
|
$this->getWorld()->onEntityMoved($this);
|
||||||
$this->checkBlockIntersections();
|
$this->checkBlockIntersections();
|
||||||
|
|
||||||
Timings::$entityMove->stopTiming();
|
Timings::$projectileMove->stopTiming();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,7 +51,7 @@ class PlayerInteractEvent extends PlayerEvent implements Cancellable{
|
|||||||
protected int $action = PlayerInteractEvent::RIGHT_CLICK_BLOCK
|
protected int $action = PlayerInteractEvent::RIGHT_CLICK_BLOCK
|
||||||
){
|
){
|
||||||
$this->player = $player;
|
$this->player = $player;
|
||||||
$this->touchVector = $touchVector ?? new Vector3(0, 0, 0);
|
$this->touchVector = $touchVector ?? Vector3::zero();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAction() : int{
|
public function getAction() : int{
|
||||||
|
@ -566,6 +566,8 @@ class NetworkSession{
|
|||||||
$this->compressedQueue->enqueue($payload);
|
$this->compressedQueue->enqueue($payload);
|
||||||
$payload->onResolve(function(CompressBatchPromise $payload) : void{
|
$payload->onResolve(function(CompressBatchPromise $payload) : void{
|
||||||
if($this->connected && $this->compressedQueue->bottom() === $payload){
|
if($this->connected && $this->compressedQueue->bottom() === $payload){
|
||||||
|
Timings::$playerNetworkSend->startTiming();
|
||||||
|
try{
|
||||||
$this->compressedQueue->dequeue(); //result unused
|
$this->compressedQueue->dequeue(); //result unused
|
||||||
$this->sendEncoded($payload->getResult());
|
$this->sendEncoded($payload->getResult());
|
||||||
|
|
||||||
@ -581,6 +583,9 @@ class NetworkSession{
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}finally{
|
||||||
|
Timings::$playerNetworkSend->stopTiming();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -921,6 +926,7 @@ class NetworkSession{
|
|||||||
AbilitiesLayer::ABILITY_OPEN_CONTAINERS => !$for->isSpectator(),
|
AbilitiesLayer::ABILITY_OPEN_CONTAINERS => !$for->isSpectator(),
|
||||||
AbilitiesLayer::ABILITY_ATTACK_PLAYERS => !$for->isSpectator(),
|
AbilitiesLayer::ABILITY_ATTACK_PLAYERS => !$for->isSpectator(),
|
||||||
AbilitiesLayer::ABILITY_ATTACK_MOBS => !$for->isSpectator(),
|
AbilitiesLayer::ABILITY_ATTACK_MOBS => !$for->isSpectator(),
|
||||||
|
AbilitiesLayer::ABILITY_PRIVILEGED_BUILDER => false,
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->sendDataPacket(UpdateAbilitiesPacket::create(new AbilitiesData(
|
$this->sendDataPacket(UpdateAbilitiesPacket::create(new AbilitiesData(
|
||||||
|
@ -1214,6 +1214,15 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
|
|||||||
* @param Vector3 $newPos Coordinates of the player's feet, centered horizontally at the base of their bounding box.
|
* @param Vector3 $newPos Coordinates of the player's feet, centered horizontally at the base of their bounding box.
|
||||||
*/
|
*/
|
||||||
public function handleMovement(Vector3 $newPos) : void{
|
public function handleMovement(Vector3 $newPos) : void{
|
||||||
|
Timings::$playerMove->startTiming();
|
||||||
|
try{
|
||||||
|
$this->actuallyHandleMovement($newPos);
|
||||||
|
}finally{
|
||||||
|
Timings::$playerMove->stopTiming();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function actuallyHandleMovement(Vector3 $newPos) : void{
|
||||||
$this->moveRateLimit--;
|
$this->moveRateLimit--;
|
||||||
if($this->moveRateLimit < 0){
|
if($this->moveRateLimit < 0){
|
||||||
return;
|
return;
|
||||||
@ -1367,13 +1376,15 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
|
|||||||
$this->timings->startTiming();
|
$this->timings->startTiming();
|
||||||
|
|
||||||
if($this->spawned){
|
if($this->spawned){
|
||||||
|
Timings::$playerMove->startTiming();
|
||||||
$this->processMostRecentMovements();
|
$this->processMostRecentMovements();
|
||||||
$this->motion = new Vector3(0, 0, 0); //TODO: HACK! (Fixes player knockback being messed up)
|
$this->motion = Vector3::zero(); //TODO: HACK! (Fixes player knockback being messed up)
|
||||||
if($this->onGround){
|
if($this->onGround){
|
||||||
$this->inAirTicks = 0;
|
$this->inAirTicks = 0;
|
||||||
}else{
|
}else{
|
||||||
$this->inAirTicks += $tickDiff;
|
$this->inAirTicks += $tickDiff;
|
||||||
}
|
}
|
||||||
|
Timings::$playerMove->stopTiming();
|
||||||
|
|
||||||
Timings::$entityBaseTick->startTiming();
|
Timings::$entityBaseTick->startTiming();
|
||||||
$this->entityBaseTick($tickDiff);
|
$this->entityBaseTick($tickDiff);
|
||||||
|
@ -27,9 +27,7 @@ use pocketmine\block\tile\Tile;
|
|||||||
use pocketmine\entity\Entity;
|
use pocketmine\entity\Entity;
|
||||||
use pocketmine\network\mcpe\protocol\ClientboundPacket;
|
use pocketmine\network\mcpe\protocol\ClientboundPacket;
|
||||||
use pocketmine\network\mcpe\protocol\ServerboundPacket;
|
use pocketmine\network\mcpe\protocol\ServerboundPacket;
|
||||||
use pocketmine\player\Player;
|
|
||||||
use pocketmine\scheduler\TaskHandler;
|
use pocketmine\scheduler\TaskHandler;
|
||||||
use function dechex;
|
|
||||||
|
|
||||||
abstract class Timings{
|
abstract class Timings{
|
||||||
public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** ";
|
public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** ";
|
||||||
@ -63,17 +61,20 @@ abstract class Timings{
|
|||||||
public static TimingsHandler $permissibleCalculationDiff;
|
public static TimingsHandler $permissibleCalculationDiff;
|
||||||
public static TimingsHandler $permissibleCalculationCallback;
|
public static TimingsHandler $permissibleCalculationCallback;
|
||||||
public static TimingsHandler $entityMove;
|
public static TimingsHandler $entityMove;
|
||||||
|
public static TimingsHandler $entityMoveCollision;
|
||||||
|
public static TimingsHandler $projectileMove;
|
||||||
|
public static TimingsHandler $projectileMoveRayTrace;
|
||||||
public static TimingsHandler $playerCheckNearEntities;
|
public static TimingsHandler $playerCheckNearEntities;
|
||||||
public static TimingsHandler $tickEntity;
|
public static TimingsHandler $tickEntity;
|
||||||
public static TimingsHandler $tickTileEntity;
|
public static TimingsHandler $tickTileEntity;
|
||||||
public static TimingsHandler $entityBaseTick;
|
public static TimingsHandler $entityBaseTick;
|
||||||
public static TimingsHandler $livingEntityBaseTick;
|
public static TimingsHandler $livingEntityBaseTick;
|
||||||
|
public static TimingsHandler $itemEntityBaseTick;
|
||||||
|
|
||||||
public static TimingsHandler $schedulerSync;
|
public static TimingsHandler $schedulerSync;
|
||||||
public static TimingsHandler $schedulerAsync;
|
public static TimingsHandler $schedulerAsync;
|
||||||
|
|
||||||
public static TimingsHandler $playerCommand;
|
public static TimingsHandler $playerCommand;
|
||||||
|
|
||||||
public static TimingsHandler $craftingDataCacheRebuild;
|
public static TimingsHandler $craftingDataCacheRebuild;
|
||||||
|
|
||||||
public static TimingsHandler $syncPlayerDataLoad;
|
public static TimingsHandler $syncPlayerDataLoad;
|
||||||
@ -107,6 +108,8 @@ abstract class Timings{
|
|||||||
|
|
||||||
public static TimingsHandler $broadcastPackets;
|
public static TimingsHandler $broadcastPackets;
|
||||||
|
|
||||||
|
public static TimingsHandler $playerMove;
|
||||||
|
|
||||||
public static function init() : void{
|
public static function init() : void{
|
||||||
if(self::$initialized){
|
if(self::$initialized){
|
||||||
return;
|
return;
|
||||||
@ -120,21 +123,23 @@ abstract class Timings{
|
|||||||
self::$garbageCollector = new TimingsHandler("Garbage Collector", self::$memoryManager);
|
self::$garbageCollector = new TimingsHandler("Garbage Collector", self::$memoryManager);
|
||||||
self::$titleTick = new TimingsHandler("Console Title Tick");
|
self::$titleTick = new TimingsHandler("Console Title Tick");
|
||||||
|
|
||||||
self::$playerNetworkSend = new TimingsHandler("Player Network Send");
|
self::$connection = new TimingsHandler("Connection Handler");
|
||||||
|
|
||||||
|
self::$playerNetworkSend = new TimingsHandler("Player Network Send", self::$connection);
|
||||||
self::$playerNetworkSendCompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression", self::$playerNetworkSend);
|
self::$playerNetworkSendCompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression", self::$playerNetworkSend);
|
||||||
self::$playerNetworkSendCompressBroadcast = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress);
|
self::$playerNetworkSendCompressBroadcast = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Broadcast)", self::$playerNetworkSendCompress);
|
||||||
self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress);
|
self::$playerNetworkSendCompressSessionBuffer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Compression (Session Buffer)", self::$playerNetworkSendCompress);
|
||||||
self::$playerNetworkSendEncrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Encryption", self::$playerNetworkSend);
|
self::$playerNetworkSendEncrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Encryption", self::$playerNetworkSend);
|
||||||
|
|
||||||
self::$playerNetworkReceive = new TimingsHandler("Player Network Receive");
|
self::$playerNetworkReceive = new TimingsHandler("Player Network Receive", self::$connection);
|
||||||
self::$playerNetworkReceiveDecompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decompression", self::$playerNetworkReceive);
|
self::$playerNetworkReceiveDecompress = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decompression", self::$playerNetworkReceive);
|
||||||
self::$playerNetworkReceiveDecrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decryption", self::$playerNetworkReceive);
|
self::$playerNetworkReceiveDecrypt = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decryption", self::$playerNetworkReceive);
|
||||||
|
|
||||||
self::$broadcastPackets = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Broadcast Packets", self::$playerNetworkSend);
|
self::$broadcastPackets = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Broadcast Packets", self::$playerNetworkSend);
|
||||||
|
|
||||||
|
self::$playerMove = new TimingsHandler("Player Movement");
|
||||||
self::$playerChunkOrder = new TimingsHandler("Player Order Chunks");
|
self::$playerChunkOrder = new TimingsHandler("Player Order Chunks");
|
||||||
self::$playerChunkSend = new TimingsHandler("Player Send Chunks");
|
self::$playerChunkSend = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Send - Chunks", self::$playerNetworkSend);
|
||||||
self::$connection = new TimingsHandler("Connection Handler");
|
|
||||||
self::$scheduler = new TimingsHandler("Scheduler");
|
self::$scheduler = new TimingsHandler("Scheduler");
|
||||||
self::$serverCommand = new TimingsHandler("Server Command");
|
self::$serverCommand = new TimingsHandler("Server Command");
|
||||||
self::$worldLoad = new TimingsHandler("World Load");
|
self::$worldLoad = new TimingsHandler("World Load");
|
||||||
@ -148,19 +153,25 @@ abstract class Timings{
|
|||||||
self::$syncPlayerDataLoad = new TimingsHandler("Player Data Load");
|
self::$syncPlayerDataLoad = new TimingsHandler("Player Data Load");
|
||||||
self::$syncPlayerDataSave = new TimingsHandler("Player Data Save");
|
self::$syncPlayerDataSave = new TimingsHandler("Player Data Save");
|
||||||
|
|
||||||
self::$entityMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "entityMove");
|
self::$entityMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Movement");
|
||||||
self::$playerCheckNearEntities = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "checkNearEntities");
|
self::$entityMoveCollision = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Movement - Collision Checks", self::$entityMove);
|
||||||
self::$tickEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickEntity");
|
|
||||||
self::$tickTileEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickTileEntity");
|
|
||||||
|
|
||||||
self::$entityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "entityBaseTick");
|
self::$projectileMove = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Projectile Movement", self::$entityMove);
|
||||||
self::$livingEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "livingEntityBaseTick");
|
self::$projectileMoveRayTrace = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Projectile Movement - Ray Tracing", self::$projectileMove);
|
||||||
|
|
||||||
|
self::$playerCheckNearEntities = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "checkNearEntities");
|
||||||
|
self::$tickEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick");
|
||||||
|
self::$tickTileEntity = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick");
|
||||||
|
|
||||||
|
self::$entityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick");
|
||||||
|
self::$livingEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick - Living");
|
||||||
|
self::$itemEntityBaseTick = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Base Tick - ItemEntity");
|
||||||
|
|
||||||
self::$schedulerSync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Sync Tasks");
|
self::$schedulerSync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Sync Tasks");
|
||||||
self::$schedulerAsync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Async Tasks");
|
self::$schedulerAsync = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Scheduler - Async Tasks");
|
||||||
|
|
||||||
self::$playerCommand = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "playerCommand");
|
self::$playerCommand = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Command");
|
||||||
self::$craftingDataCacheRebuild = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "craftingDataCacheRebuild");
|
self::$craftingDataCacheRebuild = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Build CraftingDataPacket Cache");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,11 +196,7 @@ abstract class Timings{
|
|||||||
self::init();
|
self::init();
|
||||||
$entityType = (new \ReflectionClass($entity))->getShortName();
|
$entityType = (new \ReflectionClass($entity))->getShortName();
|
||||||
if(!isset(self::$entityTypeTimingMap[$entityType])){
|
if(!isset(self::$entityTypeTimingMap[$entityType])){
|
||||||
if($entity instanceof Player){
|
self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Entity Tick - " . $entityType, self::$tickEntity);
|
||||||
self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickEntity - EntityPlayer", self::$tickEntity);
|
|
||||||
}else{
|
|
||||||
self::$entityTypeTimingMap[$entityType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickEntity - " . $entityType, self::$tickEntity);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$entityTypeTimingMap[$entityType];
|
return self::$entityTypeTimingMap[$entityType];
|
||||||
@ -199,7 +206,7 @@ abstract class Timings{
|
|||||||
self::init();
|
self::init();
|
||||||
$tileType = (new \ReflectionClass($tile))->getShortName();
|
$tileType = (new \ReflectionClass($tile))->getShortName();
|
||||||
if(!isset(self::$tileEntityTypeTimingMap[$tileType])){
|
if(!isset(self::$tileEntityTypeTimingMap[$tileType])){
|
||||||
self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickTileEntity - " . $tileType, self::$tickTileEntity);
|
self::$tileEntityTypeTimingMap[$tileType] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Block Entity Tick - " . $tileType, self::$tickTileEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$tileEntityTypeTimingMap[$tileType];
|
return self::$tileEntityTypeTimingMap[$tileType];
|
||||||
@ -209,7 +216,7 @@ abstract class Timings{
|
|||||||
self::init();
|
self::init();
|
||||||
$pid = $pk->pid();
|
$pid = $pk->pid();
|
||||||
if(!isset(self::$packetReceiveTimingMap[$pid])){
|
if(!isset(self::$packetReceiveTimingMap[$pid])){
|
||||||
self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "receivePacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkReceive);
|
self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Receive - " . $pk->getName(), self::$playerNetworkReceive);
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$packetReceiveTimingMap[$pid];
|
return self::$packetReceiveTimingMap[$pid];
|
||||||
@ -218,7 +225,7 @@ abstract class Timings{
|
|||||||
public static function getDecodeDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{
|
public static function getDecodeDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{
|
||||||
$pid = $pk->pid();
|
$pid = $pk->pid();
|
||||||
return self::$packetDecodeTimingMap[$pid] ??= new TimingsHandler(
|
return self::$packetDecodeTimingMap[$pid] ??= new TimingsHandler(
|
||||||
self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Decode - " . $pk->getName() . " [0x" . dechex($pid) . "]",
|
self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Decode - " . $pk->getName(),
|
||||||
self::getReceiveDataPacketTimings($pk)
|
self::getReceiveDataPacketTimings($pk)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -226,7 +233,7 @@ abstract class Timings{
|
|||||||
public static function getHandleDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{
|
public static function getHandleDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{
|
||||||
$pid = $pk->pid();
|
$pid = $pk->pid();
|
||||||
return self::$packetHandleTimingMap[$pid] ??= new TimingsHandler(
|
return self::$packetHandleTimingMap[$pid] ??= new TimingsHandler(
|
||||||
self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Handler - " . $pk->getName() . " [0x" . dechex($pid) . "]",
|
self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Handler - " . $pk->getName(),
|
||||||
self::getReceiveDataPacketTimings($pk)
|
self::getReceiveDataPacketTimings($pk)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -234,7 +241,7 @@ abstract class Timings{
|
|||||||
public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{
|
public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{
|
||||||
$pid = $pk->pid();
|
$pid = $pk->pid();
|
||||||
return self::$packetEncodeTimingMap[$pid] ??= new TimingsHandler(
|
return self::$packetEncodeTimingMap[$pid] ??= new TimingsHandler(
|
||||||
self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Encode - " . $pk->getName() . " [0x" . dechex($pid) . "]",
|
self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Encode - " . $pk->getName(),
|
||||||
self::getSendDataPacketTimings($pk)
|
self::getSendDataPacketTimings($pk)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -243,7 +250,7 @@ abstract class Timings{
|
|||||||
self::init();
|
self::init();
|
||||||
$pid = $pk->pid();
|
$pid = $pk->pid();
|
||||||
if(!isset(self::$packetSendTimingMap[$pid])){
|
if(!isset(self::$packetSendTimingMap[$pid])){
|
||||||
self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "sendPacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkSend);
|
self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Send - " . $pk->getName(), self::$playerNetworkSend);
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$packetSendTimingMap[$pid];
|
return self::$packetSendTimingMap[$pid];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user