Compare commits

...

69 Commits

Author SHA1 Message Date
13e4772f98 Release 3.11.5 2020-02-02 18:31:51 +00:00
4bc2f28c6d Provide a ChunkUtils stub for PHPStan, so it doesn't get confused when the extension is loaded
for some reason the presence of the type problems were reported as
problems on ChunkUtils.php, despite being outside of the project scope
and the errors not applying to the polyfill.
2020-02-02 18:12:41 +00:00
663469dfa7 travis: remove xdebug to improve build time
xdebug is almost completely useless here.
2020-02-02 16:30:00 +00:00
963abb718f build/server-phar: compress using gzip (except stub)
this produces a 75% reduction in phar size, at the expense of a slight degradation of autoloading speed and needing a writable tmpdir.
2020-02-02 16:27:38 +00:00
1f2fb73297 updated DevTools submodule to 1.14.0 2020-02-02 10:21:32 +00:00
ff55b520b9 updated composer dependencies 2020-02-01 22:55:27 +00:00
cedd8abf0c README: no need to specify 'community' Discord [ci skip] 2020-02-01 22:19:24 +00:00
496732999c reintroduce BedrockData submodule 2020-02-01 22:05:07 +00:00
6a8105f5a0 delete BedrockData submodule 2020-02-01 22:01:22 +00:00
0a566f8218 LevelProvider::generate() accepts class-string<Generator>, not any
string
2020-02-01 20:16:05 +00:00
829dd02eea Server: fixed more bad non-nullable phpdocs 2020-02-01 19:30:47 +00:00
b11c350b2b composer: use new pocketmine/log & pocketmine/classloader classes 2020-01-31 15:51:26 +00:00
f624e36faf composer: all of these packages are now available on packagist 2020-01-31 15:49:33 +00:00
14ce9c10bb BUILDING.md: fix typo 2020-01-31 13:27:29 +00:00
b27aaaeeb2 added build instructions, close #2839 2020-01-31 11:32:28 +00:00
f1083bd9c4 SimpleCommandMap: beware case mismatches in alias recursion, closes #3281 2020-01-31 10:36:47 +00:00
199fa61aef update composer dependencies 2020-01-30 22:41:58 +00:00
af82a6bbe1 phpstan: enable checkMissingIterableValueType 2020-01-30 22:31:42 +00:00
004f7ef82e phpstan: stub out the iterable bullshit with pthreads
this isn't a perfect fix, but it's better than it whining about all the things.
2020-01-30 22:31:15 +00:00
89ebd2b880 remove some dead ignoreErrors 2020-01-30 22:30:04 +00:00
799183e13e make use of phpstan class-string in some areas 2020-01-30 22:23:11 +00:00
260ac47588 add some phpstan array types 2020-01-30 22:23:11 +00:00
4ff4434a22 build/server-phar: mark metadata as mixed[] 2020-01-30 21:49:52 +00:00
5d8bb84269 add more mixed[] to item namespace 2020-01-30 21:48:11 +00:00
9eebfa7cc3 populate missing array value types in root namespace 2020-01-30 21:43:00 +00:00
d3021c6281 populate missing array value types in utils namespace, pass 2 2020-01-30 21:39:15 +00:00
9097d6c4d3 AutoUpdater: fixed type doc for updateInfo 2020-01-30 21:34:26 +00:00
da43ae82fe populate missing array value types in utils namespace, pass 1 2020-01-30 21:30:01 +00:00
60b405d944 populate missing array value types in updater namespace 2020-01-30 21:23:05 +00:00
92a752053d populate missing array value types in tile namespace 2020-01-30 21:20:42 +00:00
0537c66849 populate missing array value types in scheduler namespace 2020-01-30 21:19:15 +00:00
d94995e161 populate missing array value types in plugin namespace 2020-01-30 21:17:13 +00:00
58bc08838b populate missing array value types in permission namespace 2020-01-30 21:14:18 +00:00
fc0619ee6e populate missing array value types in network namespace 2020-01-30 21:12:00 +00:00
a5764b3ae9 populate missing array value types in level namespace 2020-01-30 21:01:59 +00:00
8bf469f7fc populate missing array value types in lang namespace 2020-01-30 20:55:03 +00:00
3b9a5c5ccc populate missing array value types in item namespace 2020-01-30 20:54:38 +00:00
4c36ca58e2 populate missing array value types in inventory namespace 2020-01-30 20:53:41 +00:00
a67fa5c007 populate missing array value types in event namespace 2020-01-30 20:52:54 +00:00
839a789180 populate missing array value types in entity namespace 2020-01-30 20:50:24 +00:00
e61c3e8bf6 populate missing array value types in command namespace 2020-01-30 20:48:14 +00:00
7ce6c8aa13 TimingsCommand: fix confusing indentation 2020-01-30 20:47:33 +00:00
9abcc99c10 Command: fixed spacing of phpdoc on execute() 2020-01-30 20:46:25 +00:00
5c8a625d88 populate missing iterable value types in block namespace 2020-01-30 20:43:13 +00:00
259f0425a9 ClientboundMapItemDataPacket: replace assoc array with MapDecoration class
I thought I'd done this already, but it appears not.
2020-01-30 20:05:18 +00:00
9cdea43794 provide more array type information for Internet functions 2020-01-29 20:45:03 +00:00
e007fad5b8 fix return types for Utils/Internet getURL()/postURL() 2020-01-29 20:43:09 +00:00
5cf2fcbbb7 simpleCurl() second return value is string[][], not string[] 2020-01-29 20:38:19 +00:00
9e6cbb5b6a Internet: fix type information for getURL(), postURL() and simpleCurl() 2020-01-29 20:20:52 +00:00
64b3d02974 Chunk: remove useless condition from populateSkyLight()
this was detected by latest bleeding-edge PHPStan.
2020-01-29 16:42:42 +00:00
640df1003c add some Generator generics for PHPStan 2020-01-29 16:38:50 +00:00
2b402e525a add some PHPStan-specific callable prototypes 2020-01-29 15:03:55 +00:00
e2871fad8e composer.json: move require-dev next to require 2020-01-28 14:32:55 +00:00
41d02003c2 Install PHPStan and PHPUnit via dev dependencies 2020-01-27 12:04:42 +00:00
156ecd9bd8 travis: use phpstan 0.12.8 2020-01-27 09:31:27 +00:00
fa7736efbb phpstan 0.12.7 2020-01-25 17:16:14 +00:00
d71a7ff2fa travis.sh: fix indentation 2020-01-25 17:15:37 +00:00
8184a6b114 SkinImage: enforce that height/width must be positive 2020-01-22 14:58:36 +00:00
b8d44ff162 SkinImage: fix formatting error 2020-01-22 14:58:00 +00:00
f6611a38bc Explosion: fix trailing whitespace in explodeA() phpdoc 2020-01-22 14:51:49 +00:00
24ed823d96 WritableBook: remove extra line from phpdoc on setPages() 2020-01-22 14:51:14 +00:00
f624871b3f strip extra blank lines (php-cs-fixer) 2020-01-22 14:50:29 +00:00
9cd6b3e1c7 fix remaining multiline @var annotations 2020-01-22 14:44:36 +00:00
aad1eb5b3e CoreConstants: fix EOF newline 2020-01-22 14:40:03 +00:00
bff5bf25ae LegacySkinAdapter: make resource patch validity check more robust 2020-01-22 14:36:40 +00:00
cda90fd7f1 Merge pull request #3280 from pmmp/stable-phpdoc-armageddon
Mass-removal of redundant @param / @return PhpDoc annotations
2020-01-22 10:48:50 +00:00
9f44adf04a pass 2, manual removal of incorrect non-nullable @param for nullable native types 2020-01-21 15:44:34 +00:00
c4793241f5 Mass removal of useless @param/@return PHPDoc annotations, pass 1 2020-01-21 15:10:18 +00:00
7532c609fb 3.11.5 is next 2020-01-20 18:06:46 +00:00
484 changed files with 891 additions and 5906 deletions

6
.gitmodules vendored
View File

@ -7,9 +7,9 @@
[submodule "tests/plugins/PocketMine-DevTools"]
path = tests/plugins/PocketMine-DevTools
url = https://github.com/pmmp/PocketMine-DevTools.git
[submodule "src/pocketmine/resources/vanilla"]
path = src/pocketmine/resources/vanilla
url = https://github.com/pmmp/BedrockData.git
[submodule "build/php"]
path = build/php
url = https://github.com/pmmp/php-build-scripts.git
[submodule "src/pocketmine/resources/vanilla"]
path = src/pocketmine/resources/vanilla
url = https://github.com/pmmp/BedrockData.git

View File

@ -5,6 +5,7 @@ php:
- 7.3
before_script:
- phpenv config-rm xdebug.ini
# - pecl install channel://pecl.php.net/pthreads-3.1.6
- echo | pecl install channel://pecl.php.net/yaml-2.0.4
- git clone https://github.com/pmmp/pthreads.git
@ -16,9 +17,12 @@ before_script:
- make install
- cd ..
- echo "extension=pthreads.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
- composer install
script:
- composer install
- ./vendor/bin/phpstan analyze --no-progress --memory-limit=2G
- ./vendor/bin/phpunit --bootstrap vendor/autoload.php --fail-on-warning tests/phpunit
- composer install --no-dev
- ./tests/travis.sh -t4
notifications:

38
BUILDING.md Normal file
View File

@ -0,0 +1,38 @@
# Building
## Pre-requisites
- A bash shell (git bash is sufficient for Windows)
- [`git`](https://git-scm.com) available in your shell
- PHP 7.2 or newer available in your shell
- [`composer`](https://getcomposer.org) available in your shell
## Custom PHP binaries
Because PocketMine-MP requires several non-standard PHP extensions and configuration, PMMP provides scripts to build custom binaries for running PocketMine-MP, as well as prebuilt binaries.
- [Prebuilt binaries](https://jenkins.pmmp.io/job/PHP-7.3-Aggregate)
- [Compile scripts](https://github.com/pmmp/php-build-scripts) are provided as a submodule in the path `build/php`
If you use a custom binary, you'll need to replace `composer` usages in this guide with `path/to/your/php path/to/your/composer.phar`.
## Setting up environment
1. `git clone --recursive https://github.com/pmmp/PocketMine-MP.git`
2. `composer install`
## Checking out a different branch to build
1. `git checkout <branch to checkout>`
2. `git submodule update --init`
3. Re-run `composer install` to synchronize dependencies.
## Optimizing for release builds
1. Add the flags `--no-dev --classmap-authoritative` to your `composer install` command. This will reduce build size and improve autoloading speed.
2. Preprocess the source code by running `build/preprocessor/PreProcessor.php`. Usage instructions are provided in `build/preprocessor/README.md`.
### Note
Preprocessor requires that the `cpp` (c preprocessor) is available in your PATH.
## Building `PocketMine-MP.phar`
Run `build/server.phar` using your preferred PHP binary. It'll drop a `PocketMine-MP.phar` into the current working directory.
You can also use the `--out` option to change the output filename.
## Running PocketMine-MP from source code
Run `src/pocketmine/PocketMine.php` using your preferred PHP binary.

View File

@ -13,10 +13,11 @@
## Discussion/Help
- [Forums](https://forums.pmmp.io/)
- [Community Discord](https://discord.gg/bmSAZBG)
- [Discord](https://discord.gg/bmSAZBG)
- [StackOverflow](https://stackoverflow.com/tags/pocketmine)
## For developers
* [Building and running from source](BUILDING.md)
* [Latest API documentation](https://jenkins.pmmp.io/job/PocketMine-MP-doc/doxygen/) - Doxygen documentation generated from development
* [DevTools](https://github.com/pmmp/PocketMine-DevTools/) - Development tools plugin for creating plugins
* [ExamplePlugin](https://github.com/pmmp/ExamplePlugin/) - Example plugin demonstrating some basic API features

View File

@ -41,10 +41,11 @@ function preg_quote_array(array $strings, string $delim = null) : array{
* @param string $pharPath
* @param string $basePath
* @param string[] $includedPaths
* @param array $metadata
* @param mixed[] $metadata
* @param string $stub
* @param int $signatureAlgo
* @param int|null $compression
* @phpstan-param array<string, mixed> $metadata
*
* @return \Generator|string[]
*/
@ -103,14 +104,9 @@ function buildPhar(string $pharPath, string $basePath, array $includedPaths, arr
yield "Added $count files";
if($compression !== null){
yield "Checking for compressible files...";
foreach($phar as $file => $finfo){
/** @var \PharFileInfo $finfo */
if($finfo->getSize() > (1024 * 512)){
yield "Compressing " . $finfo->getFilename();
$finfo->compress($compression);
}
}
yield "Compressing files...";
$phar->compressFiles($compression);
yield "Finished compression";
}
$phar->stopBuffering();
@ -136,7 +132,23 @@ function main() : void{
[
'git' => $gitHash
],
'<?php require("phar://" . __FILE__ . "/src/pocketmine/PocketMine.php"); __HALT_COMPILER();'
<<<'STUB'
<?php
$tmpDir = sys_get_temp_dir();
if(!is_readable($tmpDir) or !is_writable($tmpDir)){
echo "ERROR: tmpdir $tmpDir is not accessible." . PHP_EOL;
echo "Check that the directory exists, and that the current user has read/write permissions for it." . PHP_EOL;
echo "Alternatively, set 'sys_temp_dir' to a different directory in your php.ini file." . PHP_EOL;
exit(1);
}
require("phar://" . __FILE__ . "/src/pocketmine/PocketMine.php");
__HALT_COMPILER();
STUB
,
\Phar::SHA1,
\Phar::GZ
) as $line){
echo $line . PHP_EOL;
}

View File

@ -53,3 +53,16 @@ Plugin developers should **only** update their required API to this version if y
- Populate type information in lots of places where it was previously missing; this will improve the quality of static analysis for plugins.
- `MainLogger::logException()` now logs previous exceptions recursively.
- `MainLogger::logException()` now always logs exceptions as `critical`.
# 3.11.5
- PHPStan and PHPUnit are now managed as Composer dev dependencies.
- Core code is now analyzed using PHPStan level 6 (full, including iterable types checking).
- Improved type information available to PHPStan in many areas.
- Mass-removal of useless PHPDoc.
- Fixed incorrect documentation of `Internet::getURL()`, `Internet::postURL()` and `Internet::simpleCurl()`.
- Fixed crash on use of case-mismatched recursive command aliases.
- Basic build instructions are now provided in `BUILDING.md`.
- `build/server-phar.php` now uses GZIP compression on created phars, providing a 75% size reduction.
- `ClientboundMapItemDataPacket` now uses `MapDecoration` objects for decorations instead of associative arrays.
- Updated Composer dependencies to get bug fixes in `pocketmine/nbt` and other libraries.
- Packages `pocketmine/classloader` and `pocketmine/log` are now required; these provide classes previously part of `pocketmine/spl`. This change has no effect on API compatibility.

View File

@ -24,15 +24,21 @@
"ext-yaml": ">=2.0.0",
"ext-zip": "*",
"ext-zlib": ">=1.2.11",
"pocketmine/raklib": "^0.12.5",
"pocketmine/spl": "^0.3.5",
"pocketmine/raklib": "^0.12.7",
"pocketmine/spl": "^0.4.0",
"pocketmine/binaryutils": "^0.1.9",
"pocketmine/nbt": "^0.2.10",
"pocketmine/math": "^0.2.0",
"pocketmine/snooze": "^0.1.0",
"pocketmine/classloader": "^0.1.0",
"pocketmine/log": "^0.1.0",
"daverandom/callback-validator": "dev-master",
"adhocore/json-comment": "^0.0.7"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8",
"irstea/phpunit-shim": "^7.5"
},
"autoload": {
"psr-4": {
"": ["src"]
@ -47,31 +53,5 @@
"psr-4": {
"pocketmine\\": "tests/phpunit/"
}
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/pmmp/RakLib"
},
{
"type": "vcs",
"url": "https://github.com/pmmp/SPL"
},
{
"type": "vcs",
"url": "https://github.com/pmmp/BinaryUtils"
},
{
"type": "vcs",
"url": "https://github.com/pmmp/NBT"
},
{
"type": "vcs",
"url": "https://github.com/pmmp/Math"
},
{
"type": "vcs",
"url": "https://github.com/pmmp/Snooze"
}
]
}
}

294
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "f693f278b3bb9c1d266079fa17644dcb",
"content-hash": "e75353b6127ffbd846cdbad57b83a65f",
"packages": [
{
"name": "adhocore/json-comment",
@ -92,84 +92,159 @@
},
{
"name": "pocketmine/binaryutils",
"version": "0.1.10",
"version": "0.1.11",
"source": {
"type": "git",
"url": "https://github.com/pmmp/BinaryUtils.git",
"reference": "435f2ee265bce75ef1aa9563f9b60ff36d705e80"
"reference": "e8cb65db1b7998eebb739b124f2a989fe87366eb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/BinaryUtils/zipball/435f2ee265bce75ef1aa9563f9b60ff36d705e80",
"reference": "435f2ee265bce75ef1aa9563f9b60ff36d705e80",
"url": "https://api.github.com/repos/pmmp/BinaryUtils/zipball/e8cb65db1b7998eebb739b124f2a989fe87366eb",
"reference": "e8cb65db1b7998eebb739b124f2a989fe87366eb",
"shasum": ""
},
"require": {
"php": ">=7.2",
"php-64bit": "*"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
"psr-4": {
"pocketmine\\utils\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0"
],
"description": "Classes and methods for conveniently handling binary data",
"support": {
"source": "https://github.com/pmmp/BinaryUtils/tree/0.1.10",
"issues": "https://github.com/pmmp/BinaryUtils/issues"
},
"time": "2019-10-21T14:40:32+00:00"
"time": "2020-01-28T12:09:56+00:00"
},
{
"name": "pocketmine/math",
"version": "0.2.3",
"name": "pocketmine/classloader",
"version": "0.1.0",
"source": {
"type": "git",
"url": "https://github.com/pmmp/Math.git",
"reference": "68be8a79fd0169043ef514797c304517cb8a6071"
"url": "https://github.com/pmmp/ClassLoader.git",
"reference": "4ccdb30e48f030bfcad04bb0a208d198ec631993"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/Math/zipball/68be8a79fd0169043ef514797c304517cb8a6071",
"reference": "68be8a79fd0169043ef514797c304517cb8a6071",
"url": "https://api.github.com/repos/pmmp/ClassLoader/zipball/4ccdb30e48f030bfcad04bb0a208d198ec631993",
"reference": "4ccdb30e48f030bfcad04bb0a208d198ec631993",
"shasum": ""
},
"require": {
"ext-pthreads": "~3.2.0",
"ext-reflection": "*",
"php": ">=7.2.0"
},
"conflict": {
"pocketmine/spl": "<0.4"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
"classmap": [
"./src"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0"
],
"description": "Ad-hoc autoloading components used by PocketMine-MP",
"time": "2020-01-31T14:25:52+00:00"
},
{
"name": "pocketmine/log",
"version": "0.1.0",
"source": {
"type": "git",
"url": "https://github.com/pmmp/Log.git",
"reference": "62c1f0ea5a5c0ae4b308f9bd231fb11638ff866e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/Log/zipball/62c1f0ea5a5c0ae4b308f9bd231fb11638ff866e",
"reference": "62c1f0ea5a5c0ae4b308f9bd231fb11638ff866e",
"shasum": ""
},
"require": {
"ext-pthreads": "~3.2.0",
"php": ">=7.2"
},
"conflict": {
"pocketmine/spl": "<0.4"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
"classmap": [
"./src"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0"
],
"description": "Logging components used by PocketMine-MP and related projects",
"time": "2020-01-31T14:31:47+00:00"
},
{
"name": "pocketmine/math",
"version": "0.2.4",
"source": {
"type": "git",
"url": "https://github.com/pmmp/Math.git",
"reference": "b1c28b236df8b795d7b06cf8421f9962b12ac410"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/Math/zipball/b1c28b236df8b795d7b06cf8421f9962b12ac410",
"reference": "b1c28b236df8b795d7b06cf8421f9962b12ac410",
"shasum": ""
},
"require": {
"php": ">=7.2.0",
"php-64bit": "*"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
"psr-4": {
"pocketmine\\math\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0"
],
"description": "PHP library containing math related code used in PocketMine-MP",
"support": {
"source": "https://github.com/pmmp/Math/tree/0.2.3",
"issues": "https://github.com/pmmp/Math/issues"
},
"time": "2019-10-21T14:35:10+00:00"
"time": "2020-01-28T14:11:54+00:00"
},
{
"name": "pocketmine/nbt",
"version": "0.2.12",
"version": "0.2.13",
"source": {
"type": "git",
"url": "https://github.com/pmmp/NBT.git",
"reference": "b5777265329753b74dd40bb105eedabeefb98724"
"reference": "6fc56f864a5375471f6e2d0f9f89f2462a1d8433"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/NBT/zipball/b5777265329753b74dd40bb105eedabeefb98724",
"reference": "b5777265329753b74dd40bb105eedabeefb98724",
"url": "https://api.github.com/repos/pmmp/NBT/zipball/6fc56f864a5375471f6e2d0f9f89f2462a1d8433",
"reference": "6fc56f864a5375471f6e2d0f9f89f2462a1d8433",
"shasum": ""
},
"require": {
@ -178,39 +253,35 @@
"php-64bit": "*",
"pocketmine/binaryutils": "^0.1.9"
},
"require-dev": {
"irstea/phpunit-shim": "^7.5",
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
"psr-4": {
"pocketmine\\nbt\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"pocketmine\\nbt\\": "tests/phpunit/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0"
],
"description": "PHP library for working with Named Binary Tags",
"support": {
"source": "https://github.com/pmmp/NBT/tree/0.2",
"issues": "https://github.com/pmmp/NBT/issues"
},
"time": "2019-12-01T08:20:26+00:00"
"time": "2020-01-28T17:03:46+00:00"
},
{
"name": "pocketmine/raklib",
"version": "0.12.6",
"version": "0.12.7",
"source": {
"type": "git",
"url": "https://github.com/pmmp/RakLib.git",
"reference": "18450e01185e6064790bda563ac672e7141c6992"
"reference": "01abb4e78e2ef69a83d50037d558e0b274f8245b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/RakLib/zipball/18450e01185e6064790bda563ac672e7141c6992",
"reference": "18450e01185e6064790bda563ac672e7141c6992",
"url": "https://api.github.com/repos/pmmp/RakLib/zipball/01abb4e78e2ef69a83d50037d558e0b274f8245b",
"reference": "01abb4e78e2ef69a83d50037d558e0b274f8245b",
"shasum": ""
},
"require": {
@ -221,8 +292,11 @@
"php-64bit": "*",
"php-ipv6": "*",
"pocketmine/binaryutils": "^0.1.9",
"pocketmine/snooze": "^0.1.0",
"pocketmine/spl": "^0.3.0"
"pocketmine/log": "^0.1.0",
"pocketmine/snooze": "^0.1.0"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
@ -230,82 +304,170 @@
"raklib\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-3.0"
],
"description": "A RakNet server implementation written in PHP",
"support": {
"source": "https://github.com/pmmp/RakLib/tree/0.12.6",
"issues": "https://github.com/pmmp/RakLib/issues"
},
"time": "2019-12-07T13:43:34+00:00"
"time": "2020-01-31T15:33:05+00:00"
},
{
"name": "pocketmine/snooze",
"version": "0.1.1",
"version": "0.1.2",
"source": {
"type": "git",
"url": "https://github.com/pmmp/Snooze.git",
"reference": "b7bd231bdb75e69300cac89ccd515fc731c38c40"
"reference": "88420da3d9335dbcb3ee2decfd5e5453d057dcdf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/Snooze/zipball/b7bd231bdb75e69300cac89ccd515fc731c38c40",
"reference": "b7bd231bdb75e69300cac89ccd515fc731c38c40",
"url": "https://api.github.com/repos/pmmp/Snooze/zipball/88420da3d9335dbcb3ee2decfd5e5453d057dcdf",
"reference": "88420da3d9335dbcb3ee2decfd5e5453d057dcdf",
"shasum": ""
},
"require": {
"ext-pthreads": ">=3.1.7dev",
"php-64bit": ">=7.2.0"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
"psr-4": {
"pocketmine\\snooze\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0"
],
"description": "Thread notification management library for code using the pthreads extension",
"support": {
"source": "https://github.com/pmmp/Snooze/tree/0.1.1",
"issues": "https://github.com/pmmp/Snooze/issues"
},
"time": "2019-01-04T15:54:45+00:00"
"time": "2020-01-28T19:08:10+00:00"
},
{
"name": "pocketmine/spl",
"version": "0.3.5",
"version": "0.4.1",
"source": {
"type": "git",
"url": "https://github.com/pmmp/SPL.git",
"reference": "88052c67d3df2cc2dc2d99ebeae3d7ede3fc64ab"
"reference": "ff0579a0be41bbe65d3637607715c0f87728a838"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/SPL/zipball/88052c67d3df2cc2dc2d99ebeae3d7ede3fc64ab",
"reference": "88052c67d3df2cc2dc2d99ebeae3d7ede3fc64ab",
"url": "https://api.github.com/repos/pmmp/SPL/zipball/ff0579a0be41bbe65d3637607715c0f87728a838",
"reference": "ff0579a0be41bbe65d3637607715c0f87728a838",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"require-dev": {
"phpstan/phpstan": "^0.12.8"
},
"type": "library",
"autoload": {
"classmap": [
"./"
"./src"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0"
],
"description": "Standard library files required by PocketMine-MP and related projects",
"support": {
"source": "https://github.com/pmmp/SPL/tree/0.3",
"issues": "https://github.com/pmmp/SPL/issues"
},
"time": "2020-01-14T16:23:26+00:00"
"time": "2020-01-31T16:18:03+00:00"
}
],
"packages-dev": [
{
"name": "irstea/phpunit-shim",
"version": "7.5.20",
"source": {
"type": "git",
"url": "https://gitlab.irstea.fr/pole-is/tools/phpunit-shim.git",
"reference": "81cd2d11e12165fddd2731033187dce4fbe8e013"
},
"require": {
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"php": "^7.1"
},
"replace": {
"phpunit/phpunit": "self.version"
},
"suggest": {
"ext-soap": "*",
"ext-xdebug": "*"
},
"bin": [
"phpunit"
],
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Shim repository for phpunit/phpunit",
"homepage": "https://phpunit.de/",
"keywords": [
"phpunit",
"shim",
"testing",
"xunit"
],
"time": "2020-01-09T03:20:19+00:00"
},
{
"name": "phpstan/phpstan",
"version": "0.12.8",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "62a552602b7586d82826231f2fd4cbfe39fe0b1d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/62a552602b7586d82826231f2fd4cbfe39fe0b1d",
"reference": "62a552602b7586d82826231f2fd4cbfe39fe0b1d",
"shasum": ""
},
"require": {
"php": "^7.1"
},
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "0.12-dev"
}
},
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
"time": "2020-01-26T23:36:48+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {

View File

@ -18,8 +18,10 @@ parameters:
dynamicConstantNames:
- pocketmine\IS_DEVELOPMENT_BUILD
- pocketmine\DEBUG
stubFiles:
- tests/phpstan/stubs/pthreads.stub
- tests/phpstan/stubs/chunkutils.stub
reportUnmatchedIgnoredErrors: false #no other way to silence platform-specific non-warnings
checkMissingIterableValueType: false #TODO: pthreads Threaded base for too many things, fix this later
ignoreErrors:
-
message: "#^Cannot instantiate interface pocketmine\\\\level\\\\format\\\\io\\\\LevelProvider\\.$#"
@ -32,16 +34,6 @@ parameters:
path: src/pocketmine/command/defaults/TeleportCommand.php
# comment: "not actually possible, but high cost to fix warning"
-
message: "#^Array \\(array\\<string\\>\\) does not accept pocketmine\\\\entity\\\\Entity\\.$#"
count: 2
path: src/pocketmine/entity/Entity.php
-
message: "#^Invalid array key type pocketmine\\\\entity\\\\Entity\\.$#"
count: 1
path: src/pocketmine/entity/Entity.php
-
message: "#^Method pocketmine\\\\event\\\\entity\\\\EntityDeathEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\Living but returns pocketmine\\\\entity\\\\Entity\\.$#"
count: 1

View File

@ -30,9 +30,7 @@ use pocketmine\utils\TextFormat;
* Handles the achievement list and a bit more
*/
abstract class Achievement{
/**
* @var array[]
*/
/** @var array[] */
public static $list = [
/*"openInventory" => array(
"name" => "Taking Inventory",
@ -106,13 +104,6 @@ abstract class Achievement{
];
/**
* @param Player $player
* @param string $achievementId
*
* @return bool
*/
public static function broadcast(Player $player, string $achievementId) : bool{
if(isset(Achievement::$list[$achievementId])){
$translation = new TranslationContainer("chat.type.achievement", [$player->getDisplayName(), TextFormat::GREEN . Achievement::$list[$achievementId]["name"] . TextFormat::RESET]);
@ -129,11 +120,7 @@ abstract class Achievement{
}
/**
* @param string $achievementId
* @param string $achievementName
* @param array $requires
*
* @return bool
* @param string[] $requires
*/
public static function add(string $achievementId, string $achievementName, array $requires = []) : bool{
if(!isset(Achievement::$list[$achievementId])){

View File

@ -30,4 +30,4 @@ if(defined('pocketmine\_CORE_CONSTANTS_INCLUDED')){
define('pocketmine\_CORE_CONSTANTS_INCLUDED', true);
define('pocketmine\PATH', dirname(__DIR__, 2) . '/');
define('pocketmine\RESOURCE_PATH', __DIR__ . '/resources/');
define('pocketmine\RESOURCE_PATH', __DIR__ . '/resources/');

View File

@ -100,7 +100,10 @@ class CrashDump{
private $fp;
/** @var int */
private $time;
/** @var mixed[] */
/**
* @var mixed[]
* @phpstan-var array<string, mixed>
*/
private $data = [];
/** @var string */
private $encodedData = "";
@ -144,6 +147,10 @@ class CrashDump{
return $this->encodedData;
}
/**
* @return mixed[]
* @phpstan-return array<string, mixed>
*/
public function getData() : array{
return $this->data;
}

View File

@ -27,36 +27,20 @@ use pocketmine\permission\ServerOperator;
interface IPlayer extends ServerOperator{
/**
* @return bool
*/
public function isOnline() : bool;
/**
* @return string
*/
public function getName() : string;
/**
* @return bool
*/
public function isBanned() : bool;
/**
* @param bool $banned
*
* @return void
*/
public function setBanned(bool $banned);
/**
* @return bool
*/
public function isWhitelisted() : bool;
/**
* @param bool $value
*
* @return void
*/
public function setWhitelisted(bool $value);
@ -76,9 +60,6 @@ interface IPlayer extends ServerOperator{
*/
public function getLastPlayed();
/**
* @return bool
*/
public function hasPlayedBefore() : bool;
}

View File

@ -169,26 +169,16 @@ class MemoryManager{
gc_enable();
}
/**
* @return bool
*/
public function isLowMemory() : bool{
return $this->lowMemory;
}
/**
* @return bool
*/
public function canUseChunkCache() : bool{
return !$this->lowMemory or !$this->lowMemDisableChunkCache;
}
/**
* Returns the allowed chunk radius based on the current memory usage.
*
* @param int $distance
*
* @return int
*/
public function getViewDistance(int $distance) : int{
return ($this->lowMemory and $this->lowMemChunkRadiusOverride > 0) ? (int) min($this->lowMemChunkRadiusOverride, $distance) : $distance;
@ -197,11 +187,6 @@ class MemoryManager{
/**
* Triggers garbage collection and cache cleanup to try and free memory.
*
* @param int $memory
* @param int $limit
* @param bool $global
* @param int $triggerCount
*
* @return void
*/
public function trigger(int $memory, int $limit, bool $global = false, int $triggerCount = 0){
@ -272,9 +257,6 @@ class MemoryManager{
Timings::$memoryManagerTimer->stopTiming();
}
/**
* @return int
*/
public function triggerGarbageCollector() : int{
Timings::$garbageCollectorTimer->startTiming();
@ -298,10 +280,6 @@ class MemoryManager{
/**
* Dumps the server memory into the specified output folder.
*
* @param string $outputFolder
* @param int $maxNesting
* @param int $maxStringSize
*
* @return void
*/
public function dumpServerMemory(string $outputFolder, int $maxNesting, int $maxStringSize){
@ -320,10 +298,6 @@ class MemoryManager{
* Static memory dumper accessible from any thread.
*
* @param mixed $startingObject
* @param string $outputFolder
* @param int $maxNesting
* @param int $maxStringSize
* @param \Logger $logger
*
* @return void
* @throws \ReflectionException
@ -458,7 +432,6 @@ class MemoryManager{
fwrite($obData, "$hash@$className: " . json_encode($info, JSON_UNESCAPED_SLASHES) . "\n");
}
}while($continue);
$logger->info("[Dump] Wrote " . count($objects) . " objects");
@ -482,9 +455,6 @@ class MemoryManager{
* @param mixed $data reference parameter
* @param object[] $objects reference parameter
* @param int[] $refCounts reference parameter
* @param int $recursion
* @param int $maxNesting
* @param int $maxStringSize
*/
private static function continueDump($from, &$data, array &$objects, array &$refCounts, int $recursion, int $maxNesting, int $maxStringSize) : void{
if($maxNesting <= 0){

View File

@ -37,10 +37,6 @@ class OfflinePlayer implements IPlayer, Metadatable{
/** @var CompoundTag|null */
private $namedtag = null;
/**
* @param Server $server
* @param string $name
*/
public function __construct(Server $server, string $name){
$this->server = $server;
$this->name = $name;

View File

@ -202,7 +202,6 @@ use const M_PI;
use const M_SQRT3;
use const PHP_INT_MAX;
/**
* Main class that handles networking, recovery, and packet sending to the server part
*/
@ -216,10 +215,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Validates the given username.
*
* @param string $name
*
* @return bool
*/
public static function isValidUserName(?string $name) : bool{
if($name === null){
@ -231,7 +226,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return $lname !== "rcon" and $lname !== "console" and $len >= 1 and $len <= 16 and preg_match("/[^A-Za-z0-9_ ]/", $name) === 0;
}
/** @var SourceInterface */
protected $interface;
@ -258,7 +252,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
*/
protected $lastPingMeasure = 1;
/** @var float */
public $creationTime = 0;
@ -432,8 +425,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* If the player is logged into Xbox Live, returns their Xbox user ID (XUID) as a string. Returns an empty string if
* the player is not logged into Xbox Live.
*
* @return string
*/
public function getXuid() : string{
return $this->xuid;
@ -453,8 +444,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
* (In the olden days this method used to return a fake UUID computed by the server, which was used by plugins such
* as SimpleAuth for authentication. This is NOT SAFE anymore as this UUID is now what was given by the client, NOT
* a server-computed UUID.)
*
* @return UUID|null
*/
public function getUniqueId() : ?UUID{
return parent::getUniqueId();
@ -477,8 +466,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param bool $value
*
* @return void
*/
public function setAllowFlight(bool $value){
@ -491,8 +478,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param bool $value
*
* @return void
*/
public function setFlying(bool $value){
@ -508,8 +493,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param bool $value
*
* @return void
*/
public function setAutoJump(bool $value){
@ -526,17 +509,12 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param bool $value
*
* @return void
*/
public function setAllowMovementCheats(bool $value = true){
$this->allowMovementCheats = $value;
}
/**
* @param Player $player
*/
public function spawnTo(Player $player) : void{
if($this->spawned and $player->spawned and $this->isAlive() and $player->isAlive() and $player->getLevel() === $this->level and $player->canSee($this) and !$this->isSpectator()){
parent::spawnTo($player);
@ -550,16 +528,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return $this->server;
}
/**
* @return bool
*/
public function getRemoveFormat() : bool{
return $this->removeFormat;
}
/**
* @param bool $remove
*
* @return void
*/
public function setRemoveFormat(bool $remove = true){
@ -577,18 +550,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$this->lineHeight = $height;
}
/**
* @param Player $player
*
* @return bool
*/
public function canSee(Player $player) : bool{
return !isset($this->hiddenPlayers[$player->getRawUniqueId()]);
}
/**
* @param Player $player
*
* @return void
*/
public function hidePlayer(Player $player){
@ -600,8 +566,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param Player $player
*
* @return void
*/
public function showPlayer(Player $player){
@ -632,8 +596,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param int $distance
*
* @return void
*/
public function setViewDistance(int $distance){
@ -650,23 +612,15 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$this->server->getLogger()->debug("Setting view distance for " . $this->getName() . " to " . $this->viewDistance . " (requested " . $distance . ")");
}
/**
* @return bool
*/
public function isOnline() : bool{
return $this->isConnected() and $this->loggedIn;
}
/**
* @return bool
*/
public function isOp() : bool{
return $this->server->isOp($this->getName());
}
/**
* @param bool $value
*
* @return void
*/
public function setOp(bool $value){
@ -685,8 +639,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* @param permission\Permission|string $name
*
* @return bool
*/
public function isPermissionSet($name) : bool{
return $this->perm->isPermissionSet($name);
@ -695,8 +647,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* @param permission\Permission|string $name
*
* @return bool
*
* @throws \InvalidStateException if the player is closed
*/
public function hasPermission($name) : bool{
@ -706,20 +656,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return $this->perm->hasPermission($name);
}
/**
* @param Plugin $plugin
* @param string $name
* @param bool $value
*
* @return PermissionAttachment
*/
public function addAttachment(Plugin $plugin, string $name = null, bool $value = null) : PermissionAttachment{
return $this->perm->addAttachment($plugin, $name, $value);
}
/**
* @param PermissionAttachment $attachment
*
* @return void
*/
public function removeAttachment(PermissionAttachment $attachment){
@ -797,11 +738,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param SourceInterface $interface
* @param string $ip
* @param int $port
*/
public function __construct(SourceInterface $interface, string $ip, int $port){
$this->interface = $interface;
$this->perm = new PermissibleBase($this);
@ -823,40 +759,29 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$this->sessionAdapter = new PlayerNetworkSessionAdapter($this->server, $this);
}
/**
* @return bool
*/
public function isConnected() : bool{
return $this->sessionAdapter !== null;
}
/**
* Gets the username
* @return string
*/
public function getName() : string{
return $this->username;
}
/**
* @return string
*/
public function getLowerCaseName() : string{
return $this->iusername;
}
/**
* Returns the "friendly" display name of this player to use in the chat.
*
* @return string
*/
public function getDisplayName() : string{
return $this->displayName;
}
/**
* @param string $name
*
* @return void
*/
public function setDisplayName(string $name){
@ -868,7 +793,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Returns the player's locale, e.g. en_US.
* @return string
*/
public function getLocale() : string{
return $this->locale;
@ -877,12 +801,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Called when a player changes their skin.
* Plugin developers should not use this, use setSkin() and sendSkin() instead.
*
* @param Skin $skin
* @param string $newSkinName
* @param string $oldSkinName
*
* @return bool
*/
public function changeSkin(Skin $skin, string $newSkinName, string $oldSkinName) : bool{
if(!$skin->isValid()){
@ -913,16 +831,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Gets the player IP address
*
* @return string
*/
public function getAddress() : string{
return $this->ip;
}
/**
* @return int
*/
public function getPort() : int{
return $this->port;
}
@ -930,8 +843,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Returns the last measured latency for this player, in milliseconds. This is measured automatically and reported
* back by the network interface.
*
* @return int
*/
public function getPing() : int{
return $this->lastPingMeasure;
@ -942,17 +853,12 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
*
* @internal Plugins should not use this method.
*
* @param int $pingMS
*
* @return void
*/
public function updatePing(int $pingMS){
$this->lastPingMeasure = $pingMS;
}
/**
* @return Position
*/
public function getNextPosition() : Position{
return $this->newPosition !== null ? Position::fromObject($this->newPosition, $this->level) : $this->getPosition();
}
@ -963,15 +869,12 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Returns whether the player is currently using an item (right-click and hold).
* @return bool
*/
public function isUsingItem() : bool{
return $this->getGenericFlag(self::DATA_FLAG_ACTION) and $this->startAction > -1;
}
/**
* @param bool $value
*
* @return void
*/
public function setUsingItem(bool $value){
@ -982,8 +885,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Returns how long the player has been using their currently-held item for. Used for determining arrow shoot force
* for bows.
*
* @return int
*/
public function getItemUseDuration() : int{
return $this->startAction === -1 ? -1 : ($this->server->getTick() - $this->startAction);
@ -991,10 +892,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Returns whether the player has a cooldown period left before it can use the given item again.
*
* @param Item $item
*
* @return bool
*/
public function hasItemCooldown(Item $item) : bool{
$this->checkItemCooldowns();
@ -1003,8 +900,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Resets the player's cooldown time for the given item back to the maximum.
*
* @param Item $item
*/
public function resetItemCooldown(Item $item) : void{
$ticks = $item->getCooldownTicks();
@ -1044,10 +939,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param int $x
* @param int $z
* @param Level|null $level
*
* @return void
*/
protected function unloadChunk(int $x, int $z, Level $level = null){
@ -1067,10 +958,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param int $x
* @param int $z
* @param BatchPacket $payload
*
* @return void
*/
public function sendChunk(int $x, int $z, BatchPacket $payload){
@ -1185,9 +1072,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param Vector3 $pos
* @param int $respawnState
*
* @return void
*/
protected function sendRespawnPacket(Vector3 $pos, int $respawnState = RespawnPacket::SEARCHING_FOR_SPAWN){
@ -1241,7 +1125,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
unset($unloadChunks[$index]);
/* Bottom left quadrant */
if(!isset($this->usedChunks[$index = Level::chunkHash($centerX - $x - 1, $centerZ - $z - 1)]) or $this->usedChunks[$index] === false){
$newOrder[$index] = true;
@ -1307,9 +1190,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
}
/**
* @return bool
*/
public function hasValidSpawnPosition() : bool{
return $this->spawnPosition !== null and $this->spawnPosition->isValid();
}
@ -1338,18 +1218,10 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$this->dataPacket($pk);
}
/**
* @return bool
*/
public function isSleeping() : bool{
return $this->sleeping !== null;
}
/**
* @param Vector3 $pos
*
* @return bool
*/
public function sleepOn(Vector3 $pos) : bool{
if(!$this->isOnline()){
return false;
@ -1404,11 +1276,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
}
/**
* @param string $achievementId
*
* @return bool
*/
public function hasAchievement(string $achievementId) : bool{
if(!isset(Achievement::$list[$achievementId])){
return false;
@ -1417,11 +1284,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return $this->achievements[$achievementId] ?? false;
}
/**
* @param string $achievementId
*
* @return bool
*/
public function awardAchievement(string $achievementId) : bool{
if(isset(Achievement::$list[$achievementId]) and !$this->hasAchievement($achievementId)){
foreach(Achievement::$list[$achievementId]["requires"] as $requirementId){
@ -1445,8 +1307,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param string $achievementId
*
* @return void
*/
public function removeAchievement(string $achievementId){
@ -1455,9 +1315,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
}
/**
* @return int
*/
public function getGamemode() : int{
return $this->gamemode;
}
@ -1469,10 +1326,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
* This function takes care of handling gamemodes known to MCPE (as of 1.1.0.3, that includes Survival, Creative and Adventure)
*
* TODO: remove this when Spectator Mode gets added properly to MCPE
*
* @param int $gamemode
*
* @return int
*/
public static function getClientFriendlyGamemode(int $gamemode) : int{
$gamemode &= 0x03;
@ -1486,10 +1339,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Sets the gamemode, and if needed, kicks the Player.
*
* @param int $gm
* @param bool $client if the client made this change in their GUI
*
* @return bool
*/
public function setGamemode(int $gm, bool $client = false) : bool{
if($gm < 0 or $gm > 3 or $this->gamemode === $gm){
@ -1572,8 +1422,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
* in Adventure Mode. Supply the $literal parameter as true to force a literal Survival Mode check.
*
* @param bool $literal whether a literal check should be performed
*
* @return bool
*/
public function isSurvival(bool $literal = false) : bool{
if($literal){
@ -1588,8 +1436,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
* in Spectator Mode. Supply the $literal parameter as true to force a literal Creative Mode check.
*
* @param bool $literal whether a literal check should be performed
*
* @return bool
*/
public function isCreative(bool $literal = false) : bool{
if($literal){
@ -1604,8 +1450,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
* in Spectator Mode. Supply the $literal parameter as true to force a literal Adventure Mode check.
*
* @param bool $literal whether a literal check should be performed
*
* @return bool
*/
public function isAdventure(bool $literal = false) : bool{
if($literal){
@ -1615,9 +1459,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
}
/**
* @return bool
*/
public function isSpectator() : bool{
return $this->gamemode === Player::SPECTATOR;
}
@ -1670,8 +1511,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param int $tickDiff
*
* @return void
*/
protected function processMovement(int $tickDiff){
@ -1817,8 +1656,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param bool $sendAll
*
* @return void
*/
public function sendAttributes(bool $sendAll = false){
@ -1952,11 +1789,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Returns whether the player can interact with the specified position. This checks distance and direction.
*
* @param Vector3 $pos
* @param float $maxDistance
* @param float $maxDiff defaults to half of the 3D diagonal width of a block
*
* @return bool
*/
public function canInteract(Vector3 $pos, float $maxDistance, float $maxDiff = M_SQRT3 / 2) : bool{
$eyePos = $this->getPosition()->add(0, $this->getEyeHeight(), 0);
@ -2078,9 +1911,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param int $status
* @param bool $immediate
*
* @return void
*/
public function sendPlayStatus(int $status, bool $immediate = false){
@ -2342,10 +2172,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Sends a chat message as this player. If the message begins with a / (forward-slash) it will be treated
* as a command.
*
* @param string $message
*
* @return bool
*/
public function chat(string $message) : bool{
if(!$this->spawned or !$this->isAlive()){
@ -2445,10 +2271,6 @@ 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{
if(!$this->spawned or !$this->isAlive()){
@ -3054,8 +2876,6 @@ 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{
@ -3267,8 +3087,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Called when a packet is received from the client. This method will call DataPacketReceiveEvent.
*
* @param DataPacket $packet
*
* @return void
*/
public function handleDataPacket(DataPacket $packet){
@ -3279,10 +3097,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Batch a Data packet into the channel list to send at the end of the tick
*
* @param DataPacket $packet
*
* @return bool
*/
public function batchDataPacket(DataPacket $packet) : bool{
if(!$this->isConnected()){
@ -3304,10 +3118,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param DataPacket $packet
* @param bool $needACK
* @param bool $immediate
*
* @return bool|int
*/
public function sendDataPacket(DataPacket $packet, bool $needACK = false, bool $immediate = false){
@ -3343,9 +3153,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param DataPacket $packet
* @param bool $needACK
*
* @return bool|int
*/
public function dataPacket(DataPacket $packet, bool $needACK = false){
@ -3353,9 +3160,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param DataPacket $packet
* @param bool $needACK
*
* @return bool|int
*/
public function directDataPacket(DataPacket $packet, bool $needACK = false){
@ -3390,11 +3194,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Kicks a player from the server
*
* @param string $reason
* @param bool $isAdmin
* @param TextContainer|string $quitMessage
*
* @return bool
*/
public function kick(string $reason = "", bool $isAdmin = true, $quitMessage = null) : bool{
$ev = new PlayerKickEvent($this, $reason, $quitMessage ?? $this->getLeaveMessage());
@ -3422,8 +3222,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Adds a title text to the user's screen, with an optional subtitle.
*
* @param string $title
* @param string $subtitle
* @param int $fadeIn Duration in ticks for fade-in. If -1 is given, client-sided defaults will be used.
* @param int $stay Duration in ticks to stay on screen for
* @param int $fadeOut Duration in ticks for fade-out.
@ -3441,8 +3239,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Sets the subtitle message, without sending a title.
*
* @param string $subtitle
*
* @return void
*/
public function addSubTitle(string $subtitle){
@ -3452,8 +3248,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Adds small text to the user's screen.
*
* @param string $message
*
* @return void
*/
public function addActionBarMessage(string $message){
@ -3505,9 +3299,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Internal function used for sending titles.
*
* @param string $title
* @param int $type
*
* @return void
*/
protected function sendTitleText(string $title, int $type){
@ -3540,7 +3331,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param string $message
* @param string[] $parameters
*
* @return void
@ -3567,7 +3357,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
*
* TODO: add translation type popups
*
* @param string $message
* @param string $subtitle @deprecated
*
* @return void
@ -3580,8 +3369,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param string $message
*
* @return void
*/
public function sendTip(string $message){
@ -3592,9 +3379,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param string $sender
* @param string $message
*
* @return void
*/
public function sendWhisper(string $sender, string $message){
@ -3607,8 +3391,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Sends a Form to the player, or queue to send it if a form is already open.
*
* @param Form $form
*/
public function sendForm(Form $form) : void{
$id = $this->formIdCounter++;
@ -3624,10 +3406,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param int $formId
* @param mixed $responseData
*
* @return bool
*/
public function onFormSubmit(int $formId, $responseData) : bool{
if(!isset($this->forms[$formId])){
@ -3653,7 +3432,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
*
* @param TextContainer|string $message Message to be broadcasted
* @param string $reason Reason showed in console
* @param bool $notify
*/
final public function close($message = "", string $reason = "generic reason", bool $notify = true) : void{
if($this->isConnected() and !$this->closed){
@ -3921,10 +3699,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
/**
* @param Vector3 $pos
* @param float|null $yaw
* @param float|null $pitch
* @param int $mode
* @param Player[]|null $targets
*
* @return void
@ -4004,9 +3778,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return $this->craftingGrid;
}
/**
* @param CraftingGrid $grid
*/
public function setCraftingGrid(CraftingGrid $grid) : void{
$this->craftingGrid = $grid;
}
@ -4033,10 +3804,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Returns the window ID which the inventory has for this player, or -1 if the window is not open to the player.
*
* @param Inventory $inventory
*
* @return int
*/
public function getWindowId(Inventory $inventory) : int{
return $this->windows[spl_object_hash($inventory)] ?? ContainerIds::NONE;
@ -4046,8 +3813,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
* Returns the inventory window open to the player with the specified window ID, or null if no window is open with
* that ID.
*
* @param int $windowId
*
* @return Inventory|null
*/
public function getWindow(int $windowId){
@ -4058,12 +3823,9 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
* Opens an inventory window to the player. Returns the ID of the created window, or the existing window ID if the
* player is already viewing the specified inventory.
*
* @param Inventory $inventory
* @param int|null $forceId Forces a special ID for the window
* @param bool $isPermanent Prevents the window being removed if true.
*
* @return int
*
* @throws \InvalidArgumentException if a forceID which is already in use is specified
* @throws \InvalidStateException if trying to add a window without forceID when no slots are free
*/
@ -4105,7 +3867,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/**
* Removes an inventory window from the player.
*
* @param Inventory $inventory
* @param bool $force Forces removal of permanent windows such as normal inventory, cursor
*
* @return void

View File

@ -314,7 +314,10 @@ class Server{
/** @var string */
private $pluginPath;
/** @var string[] */
/**
* @var string[]
* @phpstan-var array<string, string>
*/
private $uniquePlayers = [];
/** @var QueryHandler */
@ -346,72 +349,42 @@ class Server{
/** @var Level */
private $levelDefault = null;
/**
* @return string
*/
public function getName() : string{
return \pocketmine\NAME;
}
/**
* @return bool
*/
public function isRunning() : bool{
return $this->isRunning;
}
/**
* @return string
*/
public function getPocketMineVersion() : string{
return \pocketmine\VERSION;
}
/**
* @return string
*/
public function getVersion() : string{
return ProtocolInfo::MINECRAFT_VERSION;
}
/**
* @return string
*/
public function getApiVersion() : string{
return \pocketmine\BASE_VERSION;
}
/**
* @return string
*/
public function getFilePath() : string{
return \pocketmine\PATH;
}
/**
* @return string
*/
public function getResourcePath() : string{
return \pocketmine\RESOURCE_PATH;
}
/**
* @return string
*/
public function getDataPath() : string{
return $this->dataPath;
}
/**
* @return string
*/
public function getPluginPath() : string{
return $this->pluginPath;
}
/**
* @return int
*/
public function getMaxPlayers() : int{
return $this->maxPlayers;
}
@ -419,8 +392,6 @@ class Server{
/**
* Returns whether the server requires that players be authenticated to Xbox Live. If true, connecting players who
* are not logged into Xbox Live will be disconnected.
*
* @return bool
*/
public function getOnlineMode() : bool{
return $this->onlineMode;
@ -428,40 +399,26 @@ class Server{
/**
* Alias of {@link #getOnlineMode()}.
* @return bool
*/
public function requiresAuthentication() : bool{
return $this->getOnlineMode();
}
/**
* @return int
*/
public function getPort() : int{
return $this->getConfigInt("server-port", 19132);
}
/**
* @return int
*/
public function getViewDistance() : int{
return max(2, $this->getConfigInt("view-distance", 8));
}
/**
* Returns a view distance up to the currently-allowed limit.
*
* @param int $distance
*
* @return int
*/
public function getAllowedViewDistance(int $distance) : int{
return max(2, min($distance, $this->memoryManager->getViewDistance($this->getViewDistance())));
}
/**
* @return string
*/
public function getIp() : string{
$str = $this->getConfigString("server-ip");
return $str !== "" ? $str : "0.0.0.0";
@ -474,16 +431,11 @@ class Server{
return $this->serverID;
}
/**
* @return bool
*/
public function getAutoSave() : bool{
return $this->autoSave;
}
/**
* @param bool $value
*
* @return void
*/
public function setAutoSave(bool $value){
@ -493,40 +445,24 @@ class Server{
}
}
/**
* @return string
*/
public function getLevelType() : string{
return $this->getConfigString("level-type", "DEFAULT");
}
/**
* @return bool
*/
public function getGenerateStructures() : bool{
return $this->getConfigBool("generate-structures", true);
}
/**
* @return int
*/
public function getGamemode() : int{
return $this->getConfigInt("gamemode", 0) & 0b11;
}
/**
* @return bool
*/
public function getForceGamemode() : bool{
return $this->getConfigBool("force-gamemode", false);
}
/**
* Returns the gamemode text name
*
* @param int $mode
*
* @return string
*/
public static function getGamemodeString(int $mode) : string{
switch($mode){
@ -560,10 +496,6 @@ class Server{
/**
* Parses a string and returns a gamemode integer, -1 if not found
*
* @param string $str
*
* @return int
*/
public static function getGamemodeFromString(string $str) : int{
switch(strtolower(trim($str))){
@ -593,51 +525,34 @@ class Server{
/**
* Returns Server global difficulty. Note that this may be overridden in individual Levels.
* @return int
*/
public function getDifficulty() : int{
return $this->getConfigInt("difficulty", Level::DIFFICULTY_NORMAL);
}
/**
* @return bool
*/
public function hasWhitelist() : bool{
return $this->getConfigBool("white-list", false);
}
/**
* @return int
*/
public function getSpawnRadius() : int{
return $this->getConfigInt("spawn-protection", 16);
}
/**
* @deprecated
* @return bool
*/
public function getAllowFlight() : bool{
return true;
}
/**
* @return bool
*/
public function isHardcore() : bool{
return $this->getConfigBool("hardcore", false);
}
/**
* @return int
*/
public function getDefaultGamemode() : int{
return $this->getConfigInt("gamemode", 0) & 0b11;
}
/**
* @return string
*/
public function getMotd() : string{
return $this->getConfigString("motd", \pocketmine\NAME . " Server");
}
@ -698,9 +613,6 @@ class Server{
return $this->craftingManager;
}
/**
* @return ResourcePackManager
*/
public function getResourcePackManager() : ResourcePackManager{
return $this->resourceManager;
}
@ -709,17 +621,12 @@ class Server{
return $this->asyncPool;
}
/**
* @return int
*/
public function getTick() : int{
return $this->tickCounter;
}
/**
* Returns the last server TPS measure
*
* @return float
*/
public function getTicksPerSecond() : float{
return round($this->currentTPS, 2);
@ -727,8 +634,6 @@ class Server{
/**
* Returns the last server TPS average measure
*
* @return float
*/
public function getTicksPerSecondAverage() : float{
return round(array_sum($this->tickAverage) / count($this->tickAverage), 2);
@ -736,8 +641,6 @@ class Server{
/**
* Returns the TPS usage/load in %
*
* @return float
*/
public function getTickUsage() : float{
return round($this->currentUse * 100, 2);
@ -745,8 +648,6 @@ class Server{
/**
* Returns the TPS usage/load average in %
*
* @return float
*/
public function getTickUsageAverage() : float{
return round((array_sum($this->useAverage) / count($this->useAverage)) * 100, 2);
@ -778,8 +679,6 @@ class Server{
}
/**
* @param string $name
*
* @return OfflinePlayer|Player
*/
public function getOfflinePlayer(string $name){
@ -795,21 +694,12 @@ class Server{
/**
* Returns whether the server has stored any saved data for this player.
*
* @param string $name
*
* @return bool
*/
public function hasOfflinePlayerData(string $name) : bool{
$name = strtolower($name);
return file_exists($this->getDataPath() . "players/$name.dat");
}
/**
* @param string $name
*
* @return CompoundTag
*/
public function getOfflinePlayerData(string $name) : CompoundTag{
$name = strtolower($name);
$path = $this->getDataPath() . "players/";
@ -874,9 +764,6 @@ class Server{
}
/**
* @param string $name
* @param CompoundTag $nbtTag
*
* @return void
*/
public function saveOfflinePlayerData(string $name, CompoundTag $nbtTag){
@ -902,8 +789,6 @@ class Server{
*
* @see Server::getPlayerExact()
*
* @param string $name
*
* @return Player|null
*/
public function getPlayer(string $name){
@ -929,8 +814,6 @@ class Server{
/**
* Returns an online player with the given name (case insensitive), or null if not found.
*
* @param string $name
*
* @return Player|null
*/
public function getPlayerExact(string $name){
@ -948,8 +831,6 @@ class Server{
* Returns a list of online players whose names contain with the given string (case insensitive).
* If an exact match is found, only that match is returned.
*
* @param string $partialName
*
* @return Player[]
*/
public function matchPlayer(string $partialName) : array{
@ -969,10 +850,6 @@ class Server{
/**
* Returns the player online with the specified raw UUID, or null if not found
*
* @param string $rawUUID
*
* @return null|Player
*/
public function getPlayerByRawUUID(string $rawUUID) : ?Player{
return $this->playerList[$rawUUID] ?? null;
@ -980,10 +857,6 @@ class Server{
/**
* Returns the player online with a UUID equivalent to the specified UUID object, or null if not found
*
* @param UUID $uuid
*
* @return null|Player
*/
public function getPlayerByUUID(UUID $uuid) : ?Player{
return $this->getPlayerByRawUUID($uuid->toBinary());
@ -996,9 +869,6 @@ class Server{
return $this->levels;
}
/**
* @return Level|null
*/
public function getDefaultLevel() : ?Level{
return $this->levelDefault;
}
@ -1007,8 +877,6 @@ class Server{
* Sets the default level to a different level
* This won't change the level-name property,
* it only affects the server on runtime
*
* @param Level|null $level
*/
public function setDefaultLevel(?Level $level) : void{
if($level === null or ($this->isLevelLoaded($level->getFolderName()) and $level !== $this->levelDefault)){
@ -1016,30 +884,16 @@ class Server{
}
}
/**
* @param string $name
*
* @return bool
*/
public function isLevelLoaded(string $name) : bool{
return $this->getLevelByName($name) instanceof Level;
}
/**
* @param int $levelId
*
* @return Level|null
*/
public function getLevel(int $levelId) : ?Level{
return $this->levels[$levelId] ?? null;
}
/**
* NOTE: This matches levels based on the FOLDER name, NOT the display name.
*
* @param string $name
*
* @return Level|null
*/
public function getLevelByName(string $name) : ?Level{
foreach($this->getLevels() as $level){
@ -1052,11 +906,6 @@ class Server{
}
/**
* @param Level $level
* @param bool $forceUnload
*
* @return bool
*
* @throws \InvalidStateException
*/
public function unloadLevel(Level $level, bool $forceUnload = false) : bool{
@ -1069,8 +918,6 @@ class Server{
/**
* @internal
*
* @param Level $level
*/
public function removeLevel(Level $level) : void{
unset($this->levels[$level->getId()]);
@ -1079,10 +926,6 @@ class Server{
/**
* Loads a level from the data directory
*
* @param string $name
*
* @return bool
*
* @throws LevelException
*/
public function loadLevel(string $name) : bool{
@ -1136,12 +979,9 @@ class Server{
/**
* Generates a new level if it does not exist
*
* @param string $name
* @param int|null $seed
* @param string|null $generator Class name that extends pocketmine\level\generator\Generator
* @param array $options
*
* @return bool
* @phpstan-param class-string<Generator> $generator
* @phpstan-param array<string, mixed> $options
*/
public function generateLevel(string $name, int $seed = null, $generator = null, array $options = []) : bool{
if(trim($name) === "" or $this->isLevelGenerated($name)){
@ -1205,11 +1045,6 @@ class Server{
return true;
}
/**
* @param string $name
*
* @return bool
*/
public function isLevelGenerated(string $name) : bool{
if(trim($name) === ""){
return false;
@ -1228,7 +1063,6 @@ class Server{
* Searches all levels for the entity with the specified ID.
* Useful for tracking entities across multiple worlds without needing strong references.
*
* @param int $entityId
* @param Level|null $expectedLevel @deprecated Level to look in first for the target
*
* @return Entity|null
@ -1245,7 +1079,6 @@ class Server{
}
/**
* @param string $variable
* @param mixed $defaultValue
*
* @return mixed
@ -1263,12 +1096,6 @@ class Server{
return $this->propertyCache[$variable] ?? $defaultValue;
}
/**
* @param string $variable
* @param string $defaultValue
*
* @return string
*/
public function getConfigString(string $variable, string $defaultValue = "") : string{
$v = getopt("", ["$variable::"]);
if(isset($v[$variable])){
@ -1279,21 +1106,12 @@ class Server{
}
/**
* @param string $variable
* @param string $value
*
* @return void
*/
public function setConfigString(string $variable, string $value){
$this->properties->set($variable, $value);
}
/**
* @param string $variable
* @param int $defaultValue
*
* @return int
*/
public function getConfigInt(string $variable, int $defaultValue = 0) : int{
$v = getopt("", ["$variable::"]);
if(isset($v[$variable])){
@ -1304,21 +1122,12 @@ class Server{
}
/**
* @param string $variable
* @param int $value
*
* @return void
*/
public function setConfigInt(string $variable, int $value){
$this->properties->set($variable, $value);
}
/**
* @param string $variable
* @param bool $defaultValue
*
* @return bool
*/
public function getConfigBool(string $variable, bool $defaultValue = false) : bool{
$v = getopt("", ["$variable::"]);
if(isset($v[$variable])){
@ -1342,9 +1151,6 @@ class Server{
}
/**
* @param string $variable
* @param bool $value
*
* @return void
*/
public function setConfigBool(string $variable, bool $value){
@ -1352,8 +1158,6 @@ class Server{
}
/**
* @param string $name
*
* @return PluginIdentifiableCommand|null
*/
public function getPluginCommand(string $name){
@ -1379,8 +1183,6 @@ class Server{
}
/**
* @param string $name
*
* @return void
*/
public function addOp(string $name){
@ -1393,8 +1195,6 @@ class Server{
}
/**
* @param string $name
*
* @return void
*/
public function removeOp(string $name){
@ -1407,8 +1207,6 @@ class Server{
}
/**
* @param string $name
*
* @return void
*/
public function addWhitelist(string $name){
@ -1417,8 +1215,6 @@ class Server{
}
/**
* @param string $name
*
* @return void
*/
public function removeWhitelist(string $name){
@ -1426,20 +1222,10 @@ class Server{
$this->whitelist->save();
}
/**
* @param string $name
*
* @return bool
*/
public function isWhitelisted(string $name) : bool{
return !$this->hasWhitelist() or $this->operators->exists($name, true) or $this->whitelist->exists($name, true);
}
/**
* @param string $name
*
* @return bool
*/
public function isOp(string $name) : bool{
return $this->operators->exists($name, true);
}
@ -1487,9 +1273,6 @@ class Server{
return $result;
}
/**
* @return Server
*/
public static function getInstance() : Server{
if(self::$instance === null){
throw new \RuntimeException("Attempt to retrieve Server instance outside server thread");
@ -1498,8 +1281,6 @@ class Server{
}
/**
* @param int $microseconds
*
* @return void
*/
public static function microSleep(int $microseconds){
@ -1508,12 +1289,6 @@ class Server{
}, $microseconds);
}
/**
* @param \ClassLoader $autoloader
* @param \AttachableThreadedLogger $logger
* @param string $dataPath
* @param string $pluginPath
*/
public function __construct(\ClassLoader $autoloader, \AttachableThreadedLogger $logger, string $dataPath, string $pluginPath){
if(self::$instance !== null){
throw new \InvalidStateException("Only one server instance can exist at once");
@ -1628,7 +1403,6 @@ class Server{
$this->doTitleTick = ((bool) $this->getProperty("console.title-tick", true)) && Terminal::hasFormattingCodes();
$consoleSender = new ConsoleCommandSender();
PermissionManager::getInstance()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $consoleSender);
@ -1708,14 +1482,12 @@ class Server{
$this->network = new Network($this);
$this->network->setName($this->getMotd());
$this->logger->info($this->getLanguage()->translateString("pocketmine.server.info", [
$this->getName(),
(\pocketmine\IS_DEVELOPMENT_BUILD ? TextFormat::YELLOW : "") . $this->getPocketMineVersion() . TextFormat::RESET
]));
$this->logger->info($this->getLanguage()->translateString("pocketmine.server.license", [$this->getName()]));
Timings::init();
TimingsHandler::setEnabled((bool) $this->getProperty("settings.enable-profiling", false));
@ -1816,9 +1588,7 @@ class Server{
/**
* @param TextContainer|string $message
* @param CommandSender[] $recipients
*
* @return int
* @param CommandSender[]|null $recipients
*/
public function broadcastMessage($message, array $recipients = null) : int{
if(!is_array($recipients)){
@ -1833,10 +1603,7 @@ class Server{
}
/**
* @param string $tip
* @param Player[] $recipients
*
* @return int
* @param Player[]|null $recipients
*/
public function broadcastTip(string $tip, array $recipients = null) : int{
if(!is_array($recipients)){
@ -1857,10 +1624,7 @@ class Server{
}
/**
* @param string $popup
* @param Player[] $recipients
*
* @return int
* @param Player[]|null $recipients
*/
public function broadcastPopup(string $popup, array $recipients = null) : int{
if(!is_array($recipients)){
@ -1882,14 +1646,10 @@ class Server{
}
/**
* @param string $title
* @param string $subtitle
* @param int $fadeIn Duration in ticks for fade-in. If -1 is given, client-sided defaults will be used.
* @param int $stay Duration in ticks to stay on screen for
* @param int $fadeOut Duration in ticks for fade-out.
* @param Player[]|null $recipients
*
* @return int
*/
public function broadcastTitle(string $title, string $subtitle = "", int $fadeIn = -1, int $stay = -1, int $fadeOut = -1, array $recipients = null) : int{
if(!is_array($recipients)){
@ -1912,9 +1672,6 @@ class Server{
/**
* @param TextContainer|string $message
* @param string $permissions
*
* @return int
*/
public function broadcast($message, string $permissions) : int{
/** @var CommandSender[] $recipients */
@ -1938,7 +1695,6 @@ class Server{
* Broadcasts a Minecraft packet to a list of players
*
* @param Player[] $players
* @param DataPacket $packet
*
* @return void
*/
@ -1952,8 +1708,6 @@ class Server{
*
* @param Player[] $players
* @param DataPacket[] $packets
* @param bool $forceSync
* @param bool $immediate
*
* @return void
*/
@ -1991,9 +1745,7 @@ class Server{
}
/**
* @param BatchPacket $pk
* @param Player[] $players
* @param bool $immediate
*
* @return void
*/
@ -2007,10 +1759,7 @@ class Server{
}
}
/**
* @param int $type
*
* @return void
*/
public function enablePlugins(int $type){
@ -2027,8 +1776,6 @@ class Server{
}
/**
* @param Plugin $plugin
*
* @return void
*/
public function enablePlugin(Plugin $plugin){
@ -2044,12 +1791,6 @@ class Server{
/**
* Executes a command from a CommandSender
*
* @param CommandSender $sender
* @param string $commandLine
* @param bool $internal
*
* @return bool
*/
public function dispatchCommand(CommandSender $sender, string $commandLine, bool $internal = false) : bool{
if(!$internal){
@ -2066,7 +1807,6 @@ class Server{
return true;
}
$sender->sendMessage($this->getLanguage()->translateString(TextFormat::RED . "%commands.generic.notFound"));
return false;
@ -2223,7 +1963,6 @@ class Server{
$this->sendUsage(SendUsageTask::TYPE_OPEN);
}
if($this->getProperty("network.upnp-forwarding", false)){
$this->logger->info("[UPnP] Trying to port forward...");
try{
@ -2263,8 +2002,8 @@ class Server{
}
/**
* @param \Throwable $e
* @param array|null $trace
* @param mixed[][]|null $trace
* @phpstan-param list<array<string, mixed>>|null $trace
*
* @return void
*/
@ -2408,8 +2147,6 @@ class Server{
}
/**
* @param Player $player
*
* @return void
*/
public function onPlayerLogin(Player $player){
@ -2421,8 +2158,6 @@ class Server{
}
/**
* @param Player $player
*
* @return void
*/
public function onPlayerLogout(Player $player){
@ -2430,8 +2165,6 @@ class Server{
}
/**
* @param Player $player
*
* @return void
*/
public function addPlayer(Player $player){
@ -2439,8 +2172,6 @@ class Server{
}
/**
* @param Player $player
*
* @return void
*/
public function removePlayer(Player $player){
@ -2448,8 +2179,6 @@ class Server{
}
/**
* @param Player $player
*
* @return void
*/
public function addOnlinePlayer(Player $player){
@ -2459,8 +2188,6 @@ class Server{
}
/**
* @param Player $player
*
* @return void
*/
public function removeOnlinePlayer(Player $player){
@ -2472,11 +2199,6 @@ class Server{
}
/**
* @param UUID $uuid
* @param int $entityId
* @param string $name
* @param Skin $skin
* @param string $xboxUserId
* @param Player[]|null $players
*
* @return void
@ -2491,7 +2213,6 @@ class Server{
}
/**
* @param UUID $uuid
* @param Player[]|null $players
*
* @return void
@ -2504,8 +2225,6 @@ class Server{
}
/**
* @param Player $p
*
* @return void
*/
public function sendFullPlayerListData(Player $p){
@ -2575,7 +2294,6 @@ class Server{
$this->uniquePlayers = [];
}
/**
* @return BaseLang
*/
@ -2583,9 +2301,6 @@ class Server{
return $this->baseLang;
}
/**
* @return bool
*/
public function isLanguageForced() : bool{
return $this->forceLanguage;
}
@ -2624,11 +2339,6 @@ class Server{
}
/**
* @param AdvancedSourceInterface $interface
* @param string $address
* @param int $port
* @param string $payload
*
* @return void
*
* TODO: move this to Network
@ -2648,7 +2358,6 @@ class Server{
//TODO: add raw packet events
}
/**
* Tries to execute a server tick
*/

View File

@ -44,8 +44,6 @@ abstract class Thread extends \Thread{
}
/**
* @param \ClassLoader|null $loader
*
* @return void
*/
public function setClassLoader(\ClassLoader $loader = null){

View File

@ -30,8 +30,7 @@ if(defined('pocketmine\_VERSION_INFO_INCLUDED')){
}
const _VERSION_INFO_INCLUDED = true;
const NAME = "PocketMine-MP";
const BASE_VERSION = "3.11.4";
const BASE_VERSION = "3.11.5";
const IS_DEVELOPMENT_BUILD = false;
const BUILD_NUMBER = 0;

View File

@ -44,8 +44,6 @@ abstract class Worker extends \Worker{
}
/**
* @param \ClassLoader|null $loader
*
* @return void
*/
public function setClassLoader(\ClassLoader $loader = null){

View File

@ -26,7 +26,6 @@ namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
/**
* Air block
*/

View File

@ -99,6 +99,11 @@ abstract class BaseRail extends Flowable{
return false;
}
/**
* @param int[] $connections
* @param int[][] $lookup
* @phpstan-param array<int, list<int>> $lookup
*/
protected static function searchState(array $connections, array $lookup) : int{
$meta = array_search($connections, $lookup, true);
if($meta === false){
@ -114,9 +119,7 @@ abstract class BaseRail extends Flowable{
/**
* Returns a meta value for the rail with the given connections.
*
* @param array $connections
*
* @return int
* @param int[] $connections
*
* @throws \InvalidArgumentException if no state matches the given connections
*/
@ -164,6 +167,12 @@ abstract class BaseRail extends Flowable{
return $connections;
}
/**
* @param int[] $constraints
*
* @return true[]
* @phpstan-return array<int, true>
*/
private function getPossibleConnectionDirections(array $constraints) : array{
switch(count($constraints)){
case 0:
@ -188,6 +197,10 @@ abstract class BaseRail extends Flowable{
}
}
/**
* @return true[]
* @phpstan-return array<int, true>
*/
protected function getPossibleConnectionDirectionsOneConstraint(int $constraint) : array{
$opposite = Vector3::getOppositeSide($constraint & ~self::FLAG_ASCEND);
@ -247,6 +260,9 @@ abstract class BaseRail extends Flowable{
}
}
/**
* @param int[] $connections
*/
private function updateState(array $connections) : void{
if(count($connections) === 1){
$connections[] = Vector3::getOppositeSide($connections[0] & ~self::FLAG_ASCEND);

View File

@ -69,16 +69,11 @@ class Bed extends Transparent{
return ($this->meta & self::BITFLAG_HEAD) !== 0;
}
/**
* @return bool
*/
public function isOccupied() : bool{
return ($this->meta & self::BITFLAG_OCCUPIED) !== 0;
}
/**
* @param bool $occupied
*
* @return void
*/
public function setOccupied(bool $occupied = true){
@ -95,12 +90,6 @@ class Bed extends Transparent{
}
}
/**
* @param int $meta
* @param bool $isHead
*
* @return int
*/
public static function getOtherHalfSide(int $meta, bool $isHead = false) : int{
$rotation = $meta & 0x03;
$side = -1;
@ -127,9 +116,6 @@ class Bed extends Transparent{
return $side;
}
/**
* @return Bed|null
*/
public function getOtherHalf() : ?Bed{
$other = $this->getSide(self::getOtherHalfSide($this->meta, $this->isHeadPart()));
if($other instanceof Bed and $other->getId() === $this->getId() and $other->isHeadPart() !== $this->isHeadPart() and (($other->getDamage() & 0x03) === ($this->getDamage() & 0x03))){

View File

@ -50,12 +50,6 @@ class Block extends Position implements BlockIds, Metadatable{
* Returns a new Block instance with the specified ID, meta and position.
*
* This function redirects to {@link BlockFactory#get}.
*
* @param int $id
* @param int $meta
* @param Position|null $pos
*
* @return Block
*/
public static function get(int $id, int $meta = 0, Position $pos = null) : Block{
return BlockFactory::get($id, $meta, $pos);
@ -73,7 +67,6 @@ class Block extends Position implements BlockIds, Metadatable{
/** @var AxisAlignedBB|null */
protected $boundingBox = null;
/** @var AxisAlignedBB[]|null */
protected $collisionBoxes = null;
@ -90,16 +83,10 @@ class Block extends Position implements BlockIds, Metadatable{
$this->itemId = $itemId;
}
/**
* @return string
*/
public function getName() : string{
return $this->fallbackName ?? "Unknown";
}
/**
* @return int
*/
final public function getId() : int{
return $this->id;
}
@ -107,8 +94,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the ID of the item form of the block.
* Used for drops for blocks (some blocks such as doors have a different item ID).
*
* @return int
*/
public function getItemId() : int{
return $this->itemId ?? $this->getId();
@ -116,22 +101,15 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* @internal
* @return int
*/
public function getRuntimeId() : int{
return RuntimeBlockMapping::toStaticRuntimeId($this->getId(), $this->getDamage());
}
/**
* @return int
*/
final public function getDamage() : int{
return $this->meta;
}
/**
* @param int $meta
*/
final public function setDamage(int $meta) : void{
if($meta < 0 or $meta > 0xf){
throw new \InvalidArgumentException("Block damage values must be 0-15, not $meta");
@ -145,8 +123,6 @@ class Block extends Position implements BlockIds, Metadatable{
*
* If your block should not have any meta value when it's dropped as an item, override this to return 0 in
* descendent classes.
*
* @return int
*/
public function getVariantBitmask() : int{
return -1;
@ -154,24 +130,18 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the block meta, stripped of non-variant flags.
* @return int
*/
public function getVariant() : int{
return $this->meta & $this->getVariantBitmask();
}
/**
* AKA: Block->isPlaceable
* @return bool
*/
public function canBePlaced() : bool{
return true;
}
/**
* @return bool
*/
public function canBeReplaced() : bool{
return false;
}
@ -182,15 +152,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Places the Block, using block space and block target, and side. Returns if the block has been placed.
*
* @param Item $item
* @param Block $blockReplace
* @param Block $blockClicked
* @param int $face
* @param Vector3 $clickVector
* @param Player|null $player
*
* @return bool
*/
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, Player $player = null) : bool{
return $this->getLevel()->setBlock($this, $this, true, true);
@ -198,18 +159,11 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns if the block can be broken with an specific Item
*
* @param Item $item
*
* @return bool
*/
public function isBreakable(Item $item) : bool{
return true;
}
/**
* @return int
*/
public function getToolType() : int{
return BlockToolType::TYPE_NONE;
}
@ -223,8 +177,6 @@ class Block extends Position implements BlockIds, Metadatable{
* Otherwise, 1 should be returned if a tool is required, 0 if not.
*
* @see Item::getBlockToolHarvestLevel()
*
* @return int
*/
public function getToolHarvestLevel() : int{
return 0;
@ -236,10 +188,6 @@ class Block extends Position implements BlockIds, Metadatable{
*
* In most cases this is also used to determine whether block drops should be created or not, except in some
* special cases such as vines.
*
* @param Item $tool
*
* @return bool
*/
public function isCompatibleWithTool(Item $tool) : bool{
if($this->getHardness() < 0){
@ -254,23 +202,14 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Do the actions needed so the block is broken with the Item
*
* @param Item $item
* @param Player|null $player
*
* @return bool
*/
public function onBreak(Item $item, Player $player = null) : bool{
return $this->getLevel()->setBlock($this, BlockFactory::get(Block::AIR), true, true);
}
/**
* Returns the seconds that this block takes to be broken using an specific Item
*
* @param Item $item
*
* @return float
* @throws \InvalidArgumentException if the item efficiency is not a positive number
*/
public function getBreakTime(Item $item) : float{
@ -300,8 +239,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns whether random block updates will be done on this block.
*
* @return bool
*/
public function ticksRandomly() : bool{
return false;
@ -324,11 +261,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Do actions when activated by Item. Returns if it has done anything
*
* @param Item $item
* @param Player|null $player
*
* @return bool
*/
public function onActivate(Item $item, Player $player = null) : bool{
return false;
@ -336,7 +268,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns a base value used to compute block break times.
* @return float
*/
public function getHardness() : float{
return 10;
@ -344,15 +275,11 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the block's resistance to explosions. Usually 5x hardness.
* @return float
*/
public function getBlastResistance() : float{
return $this->getHardness() * 5;
}
/**
* @return float
*/
public function getFrictionFactor() : float{
return 0.6;
}
@ -380,16 +307,11 @@ class Block extends Position implements BlockIds, Metadatable{
* Examples of this behaviour include leaves and cobwebs.
*
* Light-diffusing blocks are included by the heightmap.
*
* @return bool
*/
public function diffusesSkyLight() : bool{
return false;
}
/**
* @return bool
*/
public function isTransparent() : bool{
return false;
}
@ -400,7 +322,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* AKA: Block->isFlowable
* @return bool
*/
public function canBeFlowedInto() : bool{
return false;
@ -416,21 +337,17 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns whether entities can climb up this block.
* @return bool
*/
public function canClimb() : bool{
return false;
}
public function addVelocityToEntity(Entity $entity, Vector3 $vector) : void{
}
/**
* Sets the block position to a new Position object
*
* @param Position $v
*/
final public function position(Position $v) : void{
$this->x = (int) $v->x;
@ -443,8 +360,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns an array of Item objects to be dropped
*
* @param Item $item
*
* @return Item[]
*/
public function getDrops(Item $item) : array{
@ -462,8 +377,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns an array of Items to be dropped when the block is broken using the correct tool type.
*
* @param Item $item
*
* @return Item[]
*/
public function getDropsForCompatibleTool(Item $item) : array{
@ -475,8 +388,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns an array of Items to be dropped when the block is broken using a compatible Silk Touch-enchanted tool.
*
* @param Item $item
*
* @return Item[]
*/
public function getSilkTouchDrops(Item $item) : array{
@ -487,10 +398,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns how much XP will be dropped by breaking this block with the given item.
*
* @param Item $item
*
* @return int
*/
public function getXpDropForTool(Item $item) : int{
if($item->hasEnchantment(Enchantment::SILK_TOUCH) or !$this->isCompatibleWithTool($item)){
@ -502,8 +409,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns how much XP this block will drop when broken with an appropriate tool.
*
* @return int
*/
protected function getXpDropAmount() : int{
return 0;
@ -512,8 +417,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns whether Silk Touch enchanted tools will cause this block to drop as itself. Since most blocks drop
* themselves anyway, this is implicitly true.
*
* @return bool
*/
public function isAffectedBySilkTouch() : bool{
return true;
@ -521,7 +424,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the item that players will equip when middle-clicking on this block.
* @return Item
*/
public function getPickedItem() : Item{
return ItemFactory::get($this->getItemId(), $this->getVariant());
@ -529,7 +431,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the time in ticks which the block will fuel a furnace for.
* @return int
*/
public function getFuelTime() : int{
return 0;
@ -538,8 +439,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the chance that the block will catch fire from nearby fire sources. Higher values lead to faster catching
* fire.
*
* @return int
*/
public function getFlameEncouragement() : int{
return 0;
@ -547,8 +446,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the base flammability of this block. Higher values lead to the block burning away more quickly.
*
* @return int
*/
public function getFlammability() : int{
return 0;
@ -556,8 +453,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns whether fire lit on this block will burn indefinitely.
*
* @return bool
*/
public function burnsForever() : bool{
return false;
@ -565,8 +460,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns whether this block can catch fire.
*
* @return bool
*/
public function isFlammable() : bool{
return $this->getFlammability() > 0;
@ -582,9 +475,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Returns the Block on the side $side, works like Vector3::getSide()
*
* @param int $side
* @param int $step
*
* @return Block
*/
public function getSide(int $side, int $step = 1){
@ -643,10 +533,6 @@ class Block extends Position implements BlockIds, Metadatable{
/**
* Checks for collision against an AxisAlignedBB
*
* @param AxisAlignedBB $bb
*
* @return bool
*/
public function collidesWithBB(AxisAlignedBB $bb) : bool{
foreach($this->getCollisionBoxes() as $bb2){
@ -658,9 +544,6 @@ class Block extends Position implements BlockIds, Metadatable{
return false;
}
/**
* @param Entity $entity
*/
public function onEntityCollide(Entity $entity) : void{
}
@ -687,9 +570,6 @@ class Block extends Position implements BlockIds, Metadatable{
return [];
}
/**
* @return AxisAlignedBB|null
*/
public function getBoundingBox() : ?AxisAlignedBB{
if($this->boundingBox === null){
$this->boundingBox = $this->recalculateBoundingBox();
@ -697,9 +577,6 @@ class Block extends Position implements BlockIds, Metadatable{
return $this->boundingBox;
}
/**
* @return AxisAlignedBB|null
*/
protected function recalculateBoundingBox() : ?AxisAlignedBB{
return new AxisAlignedBB(
$this->x,
@ -720,12 +597,6 @@ class Block extends Position implements BlockIds, Metadatable{
$this->collisionBoxes = null;
}
/**
* @param Vector3 $pos1
* @param Vector3 $pos2
*
* @return RayTraceResult|null
*/
public function calculateIntercept(Vector3 $pos1, Vector3 $pos2) : ?RayTraceResult{
$bbs = $this->getCollisionBoxes();
if(count($bbs) === 0){

View File

@ -334,7 +334,6 @@ class BlockFactory{
* NOTE: If you are registering a new block type, you will need to add it to the creative inventory yourself - it
* will not automatically appear there.
*
* @param Block $block
* @param bool $override Whether to override existing registrations
*
* @throws \RuntimeException if something attempted to override an already-registered block without specifying the
@ -364,12 +363,6 @@ class BlockFactory{
/**
* Returns a new Block instance with the specified ID, meta and position.
*
* @param int $id
* @param int $meta
* @param Position $pos
*
* @return Block
*/
public static function get(int $id, int $meta = 0, Position $pos = null) : Block{
if($meta < 0 or $meta > 0xf){
@ -398,7 +391,6 @@ class BlockFactory{
/**
* @internal
* @return \SplFixedArray
*/
public static function getBlockStatesArray() : \SplFixedArray{
return self::$fullList;
@ -406,10 +398,6 @@ 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{
$b = self::$fullList[$id << 4];
@ -419,11 +407,6 @@ class BlockFactory{
/**
* @internal
* @deprecated
*
* @param int $id
* @param int $meta
*
* @return int
*/
public static function toStaticRuntimeId(int $id, int $meta = 0) : int{
return RuntimeBlockMapping::toStaticRuntimeId($id, $meta);
@ -433,8 +416,6 @@ class BlockFactory{
* @deprecated
* @internal
*
* @param int $runtimeId
*
* @return int[] [id, meta]
*/
public static function fromStaticRuntimeId(int $runtimeId) : array{

View File

@ -112,8 +112,6 @@ class CobblestoneWall extends Transparent{
}
/**
* @param Block $block
*
* @return bool
*/
public function canConnect(Block $block){

View File

@ -53,16 +53,10 @@ class ConcretePowder extends Fallable{
}
}
/**
* @return null|Block
*/
public function tickFalling() : ?Block{
return $this->checkAdjacentWater();
}
/**
* @return null|Block
*/
private function checkAdjacentWater() : ?Block{
for($i = 1; $i < 6; ++$i){ //Do not check underneath
if($this->getSide($i) instanceof Water){

View File

@ -41,7 +41,6 @@ abstract class Crops extends Flowable{
return false;
}
public function onActivate(Item $item, Player $player = null) : bool{
if($this->meta < 7 and $item->getId() === Item::DYE and $item->getDamage() === 0x0F){ //Bonemeal
$block = clone $this;

View File

@ -39,7 +39,6 @@ class Dandelion extends Flowable{
return "Dandelion";
}
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === Block::GRASS or $down->getId() === Block::DIRT or $down->getId() === Block::FARMLAND){

View File

@ -29,7 +29,6 @@ use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Vector3;
use pocketmine\Player;
abstract class Door extends Transparent{
public function isSolid() : bool{

View File

@ -68,7 +68,6 @@ class DoublePlant extends Flowable{
/**
* Returns whether this double-plant has a corresponding other half.
* @return bool
*/
public function isValidHalfPlant() : bool{
if($this->meta & self::BITFLAG_TOP){

View File

@ -45,9 +45,6 @@ abstract class Fallable extends Solid{
}
}
/**
* @return null|Block
*/
public function tickFalling() : ?Block{
return null;
}

View File

@ -48,7 +48,6 @@ class Farmland extends Transparent{
return BlockToolType::TYPE_SHOVEL;
}
protected function recalculateBoundingBox() : ?AxisAlignedBB{
return new AxisAlignedBB(
$this->x,

View File

@ -104,8 +104,6 @@ abstract class Fence extends Transparent{
}
/**
* @param Block $block
*
* @return bool
*/
public function canConnect(Block $block){

View File

@ -39,7 +39,6 @@ class FenceGate extends Transparent{
return BlockToolType::TYPE_AXE;
}
protected function recalculateBoundingBox() : ?AxisAlignedBB{
if(($this->getDamage() & 0x04) > 0){

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
class Furnace extends BurningFurnace{
protected $id = self::FURNACE;

View File

@ -1,6 +1,5 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\TieredTool;
class GlowingObsidian extends Solid{

View File

@ -90,7 +90,6 @@ class Ladder extends Transparent{
);
}
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, Player $player = null) : bool{
if(!$blockClicked->isTransparent()){
$faces = [

View File

@ -68,7 +68,10 @@ class Leaves extends Transparent{
return true;
}
/**
* @param true[] $visited reference parameter
* @phpstan-param array<string, true> $visited
*/
protected function findLog(Block $pos, array &$visited, int $distance, ?int $fromSide = null) : bool{
$index = $pos->x . "." . $pos->y . "." . $pos->z;
if(isset($visited[$index])){

View File

@ -211,8 +211,6 @@ abstract class Liquid extends Transparent{
/**
* Returns how many liquid levels are lost per block flowed horizontally. Affects how far the liquid can flow.
*
* @return int
*/
public function getFlowDecayPerBlock() : int{
return 1;

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
class MossyCobblestone extends Cobblestone{
protected $id = self::MOSSY_COBBLESTONE;

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;

View File

@ -57,7 +57,6 @@ class SignPost extends Transparent{
return null;
}
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, Player $player = null) : bool{
if($face !== Vector3::SIDE_DOWN){

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
class Sponge extends Solid{
protected $id = self::SPONGE;

View File

@ -75,8 +75,6 @@ class TNT extends Solid{
}
/**
* @param int $fuse
*
* @return void
*/
public function ignite(int $fuse = 80){

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
abstract class Transparent extends Block{
public function isTransparent() : bool{

View File

@ -55,7 +55,6 @@ class WaterLily extends Flowable{
);
}
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, Player $player = null) : bool{
if($blockClicked instanceof Water){
$up = $blockClicked->getSide(Vector3::SIDE_UP);

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
class Wood2 extends Wood{
public const ACACIA = 0;

View File

@ -50,9 +50,7 @@ abstract class Command{
/** @var string[] */
private $aliases = [];
/**
* @var string[]
*/
/** @var string[] */
private $activeAliases = [];
/** @var CommandMap|null */
@ -74,9 +72,6 @@ abstract class Command{
public $timings;
/**
* @param string $name
* @param string $description
* @param string $usageMessage
* @param string[] $aliases
*/
public function __construct(string $name, string $description = "", string $usageMessage = null, array $aliases = []){
@ -88,18 +83,13 @@ abstract class Command{
}
/**
* @param CommandSender $sender
* @param string $commandLabel
* @param string[] $args
* @param string[] $args
*
* @return mixed
* @throws CommandException
*/
abstract public function execute(CommandSender $sender, string $commandLabel, array $args);
/**
* @return string
*/
public function getName() : string{
return $this->name;
}
@ -111,21 +101,13 @@ abstract class Command{
return $this->permission;
}
/**
* @param string|null $permission
*
* @return void
*/
public function setPermission(string $permission = null){
$this->permission = $permission;
}
/**
* @param CommandSender $target
*
* @return bool
*/
public function testPermission(CommandSender $target) : bool{
if($this->testPermissionSilent($target)){
return true;
@ -140,11 +122,6 @@ abstract class Command{
return false;
}
/**
* @param CommandSender $target
*
* @return bool
*/
public function testPermissionSilent(CommandSender $target) : bool{
if($this->permission === null or $this->permission === ""){
return true;
@ -159,9 +136,6 @@ abstract class Command{
return false;
}
/**
* @return string
*/
public function getLabel() : string{
return $this->label;
}
@ -183,10 +157,6 @@ abstract class Command{
/**
* Registers the command into a Command map
*
* @param CommandMap $commandMap
*
* @return bool
*/
public function register(CommandMap $commandMap) : bool{
if($this->allowChangesFrom($commandMap)){
@ -198,11 +168,6 @@ abstract class Command{
return false;
}
/**
* @param CommandMap $commandMap
*
* @return bool
*/
public function unregister(CommandMap $commandMap) : bool{
if($this->allowChangesFrom($commandMap)){
$this->commandMap = null;
@ -215,18 +180,10 @@ abstract class Command{
return false;
}
/**
* @param CommandMap $commandMap
*
* @return bool
*/
private function allowChangesFrom(CommandMap $commandMap) : bool{
return $this->commandMap === null or $this->commandMap === $commandMap;
}
/**
* @return bool
*/
public function isRegistered() : bool{
return $this->commandMap !== null;
}
@ -238,23 +195,14 @@ abstract class Command{
return $this->activeAliases;
}
/**
* @return string|null
*/
public function getPermissionMessage() : ?string{
return $this->permissionMessage;
}
/**
* @return string
*/
public function getDescription() : string{
return $this->description;
}
/**
* @return string
*/
public function getUsage() : string{
return $this->usageMessage;
}
@ -272,8 +220,6 @@ abstract class Command{
}
/**
* @param string $description
*
* @return void
*/
public function setDescription(string $description){
@ -281,8 +227,6 @@ abstract class Command{
}
/**
* @param string $permissionMessage
*
* @return void
*/
public function setPermissionMessage(string $permissionMessage){
@ -290,8 +234,6 @@ abstract class Command{
}
/**
* @param string $usage
*
* @return void
*/
public function setUsage(string $usage){
@ -299,9 +241,7 @@ abstract class Command{
}
/**
* @param CommandSender $source
* @param TextContainer|string $message
* @param bool $sendToSource
*
* @return void
*/
@ -338,9 +278,6 @@ abstract class Command{
}
}
/**
* @return string
*/
public function __toString() : string{
return $this->name;
}

View File

@ -23,16 +23,10 @@ declare(strict_types=1);
namespace pocketmine\command;
interface CommandExecutor{
/**
* @param CommandSender $sender
* @param Command $command
* @param string $label
* @param string[] $args
*
* @return bool
*/
public function onCommand(CommandSender $sender, Command $command, string $label, array $args) : bool;

View File

@ -23,32 +23,17 @@ declare(strict_types=1);
namespace pocketmine\command;
interface CommandMap{
/**
* @param string $fallbackPrefix
* @param Command[] $commands
*
* @return void
*/
public function registerAll(string $fallbackPrefix, array $commands);
/**
* @param string $fallbackPrefix
* @param Command $command
* @param string|null $label
*
* @return bool
*/
public function register(string $fallbackPrefix, Command $command, string $label = null) : bool;
/**
* @param CommandSender $sender
* @param string $cmdLine
*
* @return bool
*/
public function dispatch(CommandSender $sender, string $cmdLine) : bool;
/**
@ -57,11 +42,8 @@ interface CommandMap{
public function clearCommands();
/**
* @param string $name
*
* @return Command|null
*/
public function getCommand(string $name);
}

View File

@ -116,8 +116,6 @@ class CommandReader extends Thread{
* Checks if the specified stream is a FIFO pipe.
*
* @param resource $stream
*
* @return bool
*/
private function isPipe($stream) : bool{
return is_resource($stream) and (!stream_isatty($stream) or ((fstat($stream)["mode"] & 0170000) === 0010000));

View File

@ -41,24 +41,17 @@ interface CommandSender extends Permissible{
*/
public function getServer();
/**
* @return string
*/
public function getName() : string;
/**
* Returns the line height of the command-sender's screen. Used for determining sizes for command output pagination
* such as in the /help command.
*
* @return int
*/
public function getScreenLineHeight() : int;
/**
* Sets the line height used for command output pagination for this command sender. `null` will reset it to default.
*
* @param int|null $height
*
* @return void
*/
public function setScreenLineHeight(int $height = null);

View File

@ -49,8 +49,6 @@ class ConsoleCommandSender implements CommandSender{
/**
* @param Permission|string $name
*
* @return bool
*/
public function isPermissionSet($name) : bool{
return $this->perm->isPermissionSet($name);
@ -58,27 +56,16 @@ class ConsoleCommandSender implements CommandSender{
/**
* @param Permission|string $name
*
* @return bool
*/
public function hasPermission($name) : bool{
return $this->perm->hasPermission($name);
}
/**
* @param Plugin $plugin
* @param string $name
* @param bool $value
*
* @return PermissionAttachment
*/
public function addAttachment(Plugin $plugin, string $name = null, bool $value = null) : PermissionAttachment{
return $this->perm->addAttachment($plugin, $name, $value);
}
/**
* @param PermissionAttachment $attachment
*
* @return void
*/
public function removeAttachment(PermissionAttachment $attachment){
@ -120,23 +107,15 @@ class ConsoleCommandSender implements CommandSender{
}
}
/**
* @return string
*/
public function getName() : string{
return "CONSOLE";
}
/**
* @return bool
*/
public function isOp() : bool{
return true;
}
/**
* @param bool $value
*
* @return void
*/
public function setOp(bool $value){

View File

@ -36,7 +36,6 @@ class FormattedCommandAlias extends Command{
private $formatStrings = [];
/**
* @param string $alias
* @param string[] $formatStrings
*/
public function __construct(string $alias, array $formatStrings){
@ -66,10 +65,7 @@ class FormattedCommandAlias extends Command{
}
/**
* @param string $formatString
* @param array $args
*
* @return string
* @param string[] $args
*/
private function buildCommand(string $formatString, array $args) : string{
$index = strpos($formatString, '$');
@ -144,13 +140,6 @@ class FormattedCommandAlias extends Command{
return $formatString;
}
/**
* @param int $i
* @param int $j
* @param int $k
*
* @return bool
*/
private static function inRange(int $i, int $j, int $k) : bool{
return $i >= $j and $i <= $k;
}

View File

@ -34,10 +34,6 @@ class PluginCommand extends Command implements PluginIdentifiableCommand{
/** @var CommandExecutor */
private $executor;
/**
* @param string $name
* @param Plugin $owner
*/
public function __construct(string $name, Plugin $owner){
parent::__construct($name);
$this->owningPlugin = $owner;
@ -69,17 +65,12 @@ class PluginCommand extends Command implements PluginIdentifiableCommand{
}
/**
* @param CommandExecutor $executor
*
* @return void
*/
public function setExecutor(CommandExecutor $executor){
$this->executor = $executor;
}
/**
* @return Plugin
*/
public function getPlugin() : Plugin{
return $this->owningPlugin;
}

View File

@ -27,8 +27,5 @@ use pocketmine\plugin\Plugin;
interface PluginIdentifiableCommand{
/**
* @return Plugin
*/
public function getPlugin() : Plugin;
}

View File

@ -72,6 +72,7 @@ use function explode;
use function implode;
use function min;
use function preg_match_all;
use function strcasecmp;
use function stripslashes;
use function strpos;
use function strtolower;
@ -79,9 +80,7 @@ use function trim;
class SimpleCommandMap implements CommandMap{
/**
* @var Command[]
*/
/** @var Command[] */
protected $knownCommands = [];
/** @var Server */
@ -137,20 +136,12 @@ class SimpleCommandMap implements CommandMap{
]);
}
public function registerAll(string $fallbackPrefix, array $commands){
foreach($commands as $command){
$this->register($fallbackPrefix, $command);
}
}
/**
* @param string $fallbackPrefix
* @param Command $command
* @param string|null $label
*
* @return bool
*/
public function register(string $fallbackPrefix, Command $command, string $label = null) : bool{
if($label === null){
$label = $command->getName();
@ -177,11 +168,6 @@ class SimpleCommandMap implements CommandMap{
return $registered;
}
/**
* @param Command $command
*
* @return bool
*/
public function unregister(Command $command) : bool{
foreach($this->knownCommands as $lbl => $cmd){
if($cmd === $command){
@ -194,14 +180,6 @@ class SimpleCommandMap implements CommandMap{
return true;
}
/**
* @param Command $command
* @param bool $isAlias
* @param string $fallbackPrefix
* @param string $label
*
* @return bool
*/
private function registerAlias(Command $command, bool $isAlias, string $fallbackPrefix, string $label) : bool{
$this->knownCommands[$fallbackPrefix . ":" . $label] = $command;
if(($command instanceof VanillaCommand or $isAlias) and isset($this->knownCommands[$label])){
@ -296,7 +274,6 @@ class SimpleCommandMap implements CommandMap{
return $this->knownCommands;
}
/**
* @return void
*/
@ -318,10 +295,9 @@ class SimpleCommandMap implements CommandMap{
$commandName = "";
$command = $this->matchCommand($commandName, $args);
if($command === null){
$bad[] = $commandString;
}elseif($commandName === $alias){
}elseif(strcasecmp($commandName, $alias) === 0){
$recursive[] = $commandString;
}else{
$targets[] = $commandString;

View File

@ -124,7 +124,6 @@ class EffectCommand extends VanillaCommand{
self::broadcastCommandMessage($sender, new TranslationContainer("%commands.effect.success", [$effect->getName(), $instance->getAmplifier(), $player->getDisplayName(), $instance->getDuration() / 20, $effect->getId()]));
}
return true;
}
}

View File

@ -88,7 +88,6 @@ class EnchantCommand extends VanillaCommand{
$item->addEnchantment(new EnchantmentInstance($enchantment, $level));
$player->getInventory()->setItemInHand($item);
self::broadcastCommandMessage($sender, new TranslationContainer("%commands.enchant.success", [$player->getName()]));
return true;
}

View File

@ -68,7 +68,6 @@ class KickCommand extends VanillaCommand{
$sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.player.notFound"));
}
return true;
}
}

View File

@ -119,7 +119,6 @@ class ParticleCommand extends VanillaCommand{
return true;
}
$sender->sendMessage(new TranslationContainer("commands.particle.success", [$name, $count]));
$random = new Random((int) (microtime(true) * 1000) + mt_rand());
@ -137,13 +136,6 @@ class ParticleCommand extends VanillaCommand{
}
/**
* @param string $name
* @param Vector3 $pos
* @param float $xd
* @param float $yd
* @param float $zd
* @param int|null $data
*
* @return Particle|null
*/
private function getParticle(string $name, Vector3 $pos, float $xd, float $yd, float $zd, int $data = null){

View File

@ -85,7 +85,6 @@ class TimeCommand extends VanillaCommand{
return true;
}
if(count($args) < 2){
throw new InvalidCommandSyntaxException();
}

View File

@ -126,18 +126,25 @@ class TimingsCommand extends VanillaCommand{
/** @var string */
private $host;
/**
* @param string[] $data
* @phpstan-param array<string, string> $data
*/
public function __construct(CommandSender $sender, string $host, string $agent, array $data){
parent::__construct([
["page" => "https://$host?upload=true", "extraOpts" => [
CURLOPT_HTTPHEADER => [
"User-Agent: $agent",
"Content-Type: application/x-www-form-urlencoded"
],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_AUTOREFERER => false,
CURLOPT_FOLLOWLOCATION => false
]]
[
"page" => "https://$host?upload=true",
"extraOpts" => [
CURLOPT_HTTPHEADER => [
"User-Agent: $agent",
"Content-Type: application/x-www-form-urlencoded"
],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_AUTOREFERER => false,
CURLOPT_FOLLOWLOCATION => false
]
]
], $sender);
$this->host = $host;
}

View File

@ -21,10 +21,8 @@
declare(strict_types=1);
namespace pocketmine\command\defaults;
use pocketmine\command\CommandSender;
use pocketmine\command\utils\InvalidCommandSyntaxException;
use pocketmine\Player;

View File

@ -36,12 +36,7 @@ abstract class VanillaCommand extends Command{
public const MIN_COORD = -30000000;
/**
* @param CommandSender $sender
* @param mixed $value
* @param int $min
* @param int $max
*
* @return int
*/
protected function getInteger(CommandSender $sender, $value, int $min = self::MIN_COORD, int $max = self::MAX_COORD) : int{
$i = (int) $value;
@ -55,15 +50,6 @@ abstract class VanillaCommand extends Command{
return $i;
}
/**
* @param float $original
* @param CommandSender $sender
* @param string $input
* @param float $min
* @param float $max
*
* @return float
*/
protected function getRelativeDouble(float $original, CommandSender $sender, string $input, float $min = self::MIN_COORD, float $max = self::MAX_COORD) : float{
if($input[0] === "~"){
$value = $this->getDouble($sender, substr($input, 1));
@ -75,12 +61,7 @@ abstract class VanillaCommand extends Command{
}
/**
* @param CommandSender $sender
* @param mixed $value
* @param float $min
* @param float $max
*
* @return float
*/
protected function getDouble(CommandSender $sender, $value, float $min = self::MIN_COORD, float $max = self::MAX_COORD) : float{
$i = (double) $value;

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
interface Ageable{
public function isBaby() : bool;
}

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
abstract class Animal extends Creature implements Ageable{
public function isBaby() : bool{

View File

@ -87,15 +87,6 @@ class Attribute{
}
/**
* @param int $id
* @param string $name
* @param float $minValue
* @param float $maxValue
* @param float $defaultValue
* @param bool $shouldSend
*
* @return Attribute
*
* @throws \InvalidArgumentException
*/
public static function addAttribute(int $id, string $name, float $minValue, float $maxValue, float $defaultValue, bool $shouldSend = true) : Attribute{
@ -106,20 +97,10 @@ class Attribute{
return self::$attributes[$id] = new Attribute($id, $name, $minValue, $maxValue, $defaultValue, $shouldSend);
}
/**
* @param int $id
*
* @return Attribute|null
*/
public static function getAttribute(int $id) : ?Attribute{
return isset(self::$attributes[$id]) ? clone self::$attributes[$id] : null;
}
/**
* @param string $name
*
* @return Attribute|null
*/
public static function getAttributeByName(string $name) : ?Attribute{
foreach(self::$attributes as $a){
if($a->getName() === $name){
@ -146,8 +127,6 @@ class Attribute{
}
/**
* @param float $minValue
*
* @return $this
*/
public function setMinValue(float $minValue){
@ -167,8 +146,6 @@ class Attribute{
}
/**
* @param float $maxValue
*
* @return $this
*/
public function setMaxValue(float $maxValue){
@ -188,8 +165,6 @@ class Attribute{
}
/**
* @param float $defaultValue
*
* @return $this
*/
public function setDefaultValue(float $defaultValue){
@ -213,10 +188,6 @@ class Attribute{
}
/**
* @param float $value
* @param bool $fit
* @param bool $forceSend
*
* @return $this
*/
public function setValue(float $value, bool $fit = false, bool $forceSend = false){

View File

@ -36,11 +36,6 @@ class AttributeMap implements \ArrayAccess{
$this->attributes[$attribute->getId()] = $attribute;
}
/**
* @param int $id
*
* @return Attribute|null
*/
public function getAttribute(int $id) : ?Attribute{
return $this->attributes[$id] ?? null;
}
@ -63,8 +58,6 @@ class AttributeMap implements \ArrayAccess{
/**
* @param int $offset
*
* @return bool
*/
public function offsetExists($offset) : bool{
return isset($this->attributes[$offset]);
@ -72,8 +65,6 @@ class AttributeMap implements \ArrayAccess{
/**
* @param int $offset
*
* @return float
*/
public function offsetGet($offset) : float{
return $this->attributes[$offset]->getValue();

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
abstract class Creature extends Living{
}

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
interface Damageable{
}

View File

@ -32,112 +32,68 @@ use function is_string;
class DataPropertyManager{
/** @var mixed[][] */
/**
* @var mixed[][]
* @phpstan-var array<int, array{0: int, 1: mixed}>
*/
private $properties = [];
/** @var mixed[][] */
/**
* @var mixed[][]
* @phpstan-var array<int, array{0: int, 1: mixed}>
*/
private $dirtyProperties = [];
public function __construct(){
}
/**
* @param int $key
*
* @return int|null
*/
public function getByte(int $key) : ?int{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_BYTE);
assert(is_int($value) or $value === null);
return $value;
}
/**
* @param int $key
* @param int $value
* @param bool $force
*/
public function setByte(int $key, int $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_BYTE, $value, $force);
}
/**
* @param int $key
*
* @return int|null
*/
public function getShort(int $key) : ?int{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_SHORT);
assert(is_int($value) or $value === null);
return $value;
}
/**
* @param int $key
* @param int $value
* @param bool $force
*/
public function setShort(int $key, int $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_SHORT, $value, $force);
}
/**
* @param int $key
*
* @return int|null
*/
public function getInt(int $key) : ?int{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_INT);
assert(is_int($value) or $value === null);
return $value;
}
/**
* @param int $key
* @param int $value
* @param bool $force
*/
public function setInt(int $key, int $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_INT, $value, $force);
}
/**
* @param int $key
*
* @return float|null
*/
public function getFloat(int $key) : ?float{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_FLOAT);
assert(is_float($value) or $value === null);
return $value;
}
/**
* @param int $key
* @param float $value
* @param bool $force
*/
public function setFloat(int $key, float $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_FLOAT, $value, $force);
}
/**
* @param int $key
*
* @return null|string
*/
public function getString(int $key) : ?string{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_STRING);
assert(is_string($value) or $value === null);
return $value;
}
/**
* @param int $key
* @param string $value
* @param bool $force
*/
public function setString(int $key, string $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_STRING, $value, $force);
}
@ -152,87 +108,44 @@ class DataPropertyManager{
$this->setPropertyValue($key, Entity::DATA_TYPE_COMPOUND_TAG, $value, $force);
}
/**
* @param int $key
*
* @return null|Vector3
*/
public function getBlockPos(int $key) : ?Vector3{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_POS);
assert($value instanceof Vector3 or $value === null);
return $value;
}
/**
* @param int $key
* @param null|Vector3 $value
* @param bool $force
*/
public function setBlockPos(int $key, ?Vector3 $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_POS, $value ? $value->floor() : null, $force);
}
/**
* @param int $key
*
* @return int|null
*/
public function getLong(int $key) : ?int{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_LONG);
assert(is_int($value) or $value === null);
return $value;
}
/**
* @param int $key
* @param int $value
* @param bool $force
*/
public function setLong(int $key, int $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_LONG, $value, $force);
}
/**
* @param int $key
*
* @return null|Vector3
*/
public function getVector3(int $key) : ?Vector3{
$value = $this->getPropertyValue($key, Entity::DATA_TYPE_VECTOR3F);
assert($value instanceof Vector3 or $value === null);
return $value;
}
/**
* @param int $key
* @param null|Vector3 $value
* @param bool $force
*/
public function setVector3(int $key, ?Vector3 $value, bool $force = false) : void{
$this->setPropertyValue($key, Entity::DATA_TYPE_VECTOR3F, $value ? $value->asVector3() : null, $force);
}
/**
* @param int $key
*/
public function removeProperty(int $key) : void{
unset($this->properties[$key]);
}
/**
* @param int $key
*
* @return bool
*/
public function hasProperty(int $key) : bool{
return isset($this->properties[$key]);
}
/**
* @param int $key
*
* @return int
*/
public function getPropertyType(int $key) : int{
if(isset($this->properties[$key])){
return $this->properties[$key][0];
@ -248,9 +161,6 @@ class DataPropertyManager{
}
/**
* @param int $key
* @param int $type
*
* @return mixed
*/
public function getPropertyValue(int $key, int $type){
@ -261,10 +171,7 @@ class DataPropertyManager{
}
/**
* @param int $key
* @param int $type
* @param mixed $value
* @param bool $force
*/
public function setPropertyValue(int $key, int $type, $value, bool $force = false) : void{
if(!$force){
@ -276,7 +183,8 @@ class DataPropertyManager{
/**
* Returns all properties.
*
* @return array
* @return mixed[][]
* @phpstan-return array<int, array{0: int, 1: mixed}>
*/
public function getAll() : array{
return $this->properties;
@ -285,7 +193,8 @@ class DataPropertyManager{
/**
* Returns properties that have changed and need to be broadcasted.
*
* @return array
* @return mixed[][]
* @phpstan-return array<int, array{0: int, 1: mixed}>
*/
public function getDirty() : array{
return $this->dirtyProperties;

View File

@ -93,27 +93,14 @@ class Effect{
self::registerEffect(new Effect(Effect::CONDUIT_POWER, "%potion.conduitPower", new Color(0x1d, 0xc2, 0xd1)));
}
/**
* @param Effect $effect
*/
public static function registerEffect(Effect $effect) : void{
self::$effects[$effect->getId()] = $effect;
}
/**
* @param int $id
*
* @return Effect|null
*/
public static function getEffect(int $id) : ?Effect{
return self::$effects[$id] ?? null;
}
/**
* @param string $name
*
* @return Effect|null
*/
public static function getEffectByName(string $name) : ?Effect{
$const = self::class . "::" . strtoupper($name);
if(defined($const)){
@ -154,7 +141,6 @@ class Effect{
/**
* Returns the effect ID as per Minecraft PE
* @return int
*/
public function getId() : int{
return $this->id;
@ -162,7 +148,6 @@ class Effect{
/**
* Returns the translation key used to translate this effect's name.
* @return string
*/
public function getName() : string{
return $this->name;
@ -170,7 +155,6 @@ class Effect{
/**
* Returns a Color object representing this effect's particle colour.
* @return Color
*/
public function getColor() : Color{
return clone $this->color;
@ -179,8 +163,6 @@ class Effect{
/**
* Returns whether this effect is harmful.
* TODO: implement inverse effect results for undead mobs
*
* @return bool
*/
public function isBad() : bool{
return $this->bad;
@ -188,7 +170,6 @@ class Effect{
/**
* Returns whether the effect is by default an instant effect.
* @return bool
*/
public function isInstantEffect() : bool{
return $this->defaultDuration <= 1;
@ -196,8 +177,6 @@ class Effect{
/**
* Returns the default duration (in ticks) this effect will apply for if a duration is not specified.
*
* @return int
*/
public function getDefaultDuration() : int{
return $this->defaultDuration;
@ -205,7 +184,6 @@ class Effect{
/**
* Returns whether this effect will give the subject potion bubbles.
* @return bool
*/
public function hasBubbles() : bool{
return $this->hasBubbles;
@ -213,10 +191,6 @@ class Effect{
/**
* Returns whether the effect will do something on the current tick.
*
* @param EffectInstance $instance
*
* @return bool
*/
public function canTick(EffectInstance $instance) : bool{
switch($this->id){
@ -249,12 +223,6 @@ class Effect{
/**
* Applies effect results to an entity. This will not be called unless canTick() returns true.
*
* @param Living $entity
* @param EffectInstance $instance
* @param float $potency
* @param null|Entity $source
* @param null|Entity $sourceOwner
*/
public function applyEffect(Living $entity, EffectInstance $instance, float $potency = 1.0, ?Entity $source = null, ?Entity $sourceOwner = null) : void{
switch($this->id){
@ -315,9 +283,6 @@ class Effect{
/**
* Applies effects to the entity when the effect is first added.
*
* @param Living $entity
* @param EffectInstance $instance
*/
public function add(Living $entity, EffectInstance $instance) : void{
switch($this->id){
@ -348,9 +313,6 @@ class Effect{
/**
* Removes the effect from the entity, resetting any changed values back to their original defaults.
*
* @param Living $entity
* @param EffectInstance $instance
*/
public function remove(Living $entity, EffectInstance $instance) : void{
switch($this->id){

View File

@ -47,12 +47,7 @@ class EffectInstance{
private $color;
/**
* @param Effect $effectType
* @param int|null $duration Passing null will use the effect type's default duration
* @param int $amplifier
* @param bool $visible
* @param bool $ambient
* @param null|Color $overrideColor
*/
public function __construct(Effect $effectType, ?int $duration = null, int $amplifier = 0, bool $visible = true, bool $ambient = false, ?Color $overrideColor = null){
$this->effectType = $effectType;
@ -67,17 +62,12 @@ class EffectInstance{
return $this->effectType->getId();
}
/**
* @return Effect
*/
public function getType() : Effect{
return $this->effectType;
}
/**
* Returns the number of ticks remaining until the effect expires.
*
* @return int
*/
public function getDuration() : int{
return $this->duration;
@ -86,8 +76,6 @@ class EffectInstance{
/**
* Sets the number of ticks remaining until the effect expires.
*
* @param int $duration
*
* @throws \InvalidArgumentException
*
* @return $this
@ -104,8 +92,6 @@ class EffectInstance{
/**
* Decreases the duration by the given number of ticks, without dropping below zero.
*
* @param int $ticks
*
* @return $this
*/
public function decreaseDuration(int $ticks) : EffectInstance{
@ -116,32 +102,23 @@ class EffectInstance{
/**
* Returns whether the duration has run out.
*
* @return bool
*/
public function hasExpired() : bool{
return $this->duration <= 0;
}
/**
* @return int
*/
public function getAmplifier() : int{
return $this->amplifier;
}
/**
* Returns the level of this effect, which is always one higher than the amplifier.
*
* @return int
*/
public function getEffectLevel() : int{
return $this->amplifier + 1;
}
/**
* @param int $amplifier
*
* @return $this
*/
public function setAmplifier(int $amplifier) : EffectInstance{
@ -152,16 +129,12 @@ class EffectInstance{
/**
* Returns whether this effect will produce some visible effect, such as bubbles or particles.
*
* @return bool
*/
public function isVisible() : bool{
return $this->visible;
}
/**
* @param bool $visible
*
* @return $this
*/
public function setVisible(bool $visible = true) : EffectInstance{
@ -174,16 +147,12 @@ class EffectInstance{
* Returns whether the effect originated from the ambient environment.
* Ambient effects can originate from things such as a Beacon's area of effect radius.
* If this flag is set, the amount of visible particles will be reduced by a factor of 5.
*
* @return bool
*/
public function isAmbient() : bool{
return $this->ambient;
}
/**
* @param bool $ambient
*
* @return $this
*/
public function setAmbient(bool $ambient = true) : EffectInstance{
@ -195,8 +164,6 @@ class EffectInstance{
/**
* Returns the particle colour of this effect instance. This can be overridden on a per-EffectInstance basis, so it
* is not reflective of the default colour of the effect.
*
* @return Color
*/
public function getColor() : Color{
return clone $this->color;
@ -204,10 +171,6 @@ class EffectInstance{
/**
* Sets the colour of this EffectInstance.
*
* @param Color $color
*
* @return EffectInstance
*/
public function setColor(Color $color) : EffectInstance{
$this->color = clone $color;
@ -217,8 +180,6 @@ class EffectInstance{
/**
* Resets the colour of this EffectInstance to the default specified by its type.
*
* @return EffectInstance
*/
public function resetColor() : EffectInstance{
$this->color = $this->effectType->getColor();

View File

@ -319,9 +319,15 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/** @var int */
public static $entityCount = 1;
/** @var string[] */
/**
* @var string[]
* @phpstan-var array<int|string, class-string<Entity>>
*/
private static $knownEntities = [];
/** @var string[][] */
/**
* @var string[][]
* @phpstan-var array<class-string<Entity>, list<string>>
*/
private static $saveNames = [];
/**
@ -353,17 +359,12 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
PaintingMotive::init();
}
/**
* Creates an entity with the specified type, level and NBT, with optional additional arguments to pass to the
* entity's constructor
*
* @param int|string $type
* @param Level $level
* @param CompoundTag $nbt
* @param mixed ...$args
*
* @return Entity|null
*/
public static function createEntity($type, Level $level, CompoundTag $nbt, ...$args) : ?Entity{
if(isset(self::$knownEntities[$type])){
@ -381,15 +382,12 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
* @param string $className Class that extends Entity
* @param bool $force Force registration even if the entity does not have a valid network ID
* @param string[] $saveNames An array of save names which this entity might be saved under. Defaults to the short name of the class itself if empty.
* @phpstan-param class-string<Entity> $className
*
* NOTE: The first save name in the $saveNames array will be used when saving the entity to disk. The reflection
* name of the class will be appended to the end and only used if no other save names are specified.
*
* @return bool
*/
public static function registerEntity(string $className, bool $force = false, array $saveNames = []) : bool{
/** @var Entity $className */
$class = new \ReflectionClass($className);
if(is_a($className, Entity::class, true) and !$class->isAbstract()){
if($className::NETWORK_ID !== -1){
@ -417,13 +415,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Helper function which creates minimal NBT needed to spawn an entity.
*
* @param Vector3 $pos
* @param Vector3|null $motion
* @param float $yaw
* @param float $pitch
*
* @return CompoundTag
*/
public static function createBaseNBT(Vector3 $pos, ?Vector3 $motion = null, float $yaw = 0.0, float $pitch = 0.0) : CompoundTag{
return new CompoundTag("", [
@ -444,9 +435,7 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
]);
}
/**
* @var Player[]
*/
/** @var Player[] */
protected $hasSpawned = [];
/** @var int */
@ -481,7 +470,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/** @var Vector3 */
public $temporalVector;
/** @var float */
public $lastYaw;
/** @var float */
@ -652,73 +640,42 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
}
/**
* @return string
*/
public function getNameTag() : string{
return $this->propertyManager->getString(self::DATA_NAMETAG);
}
/**
* @return bool
*/
public function isNameTagVisible() : bool{
return $this->getGenericFlag(self::DATA_FLAG_CAN_SHOW_NAMETAG);
}
/**
* @return bool
*/
public function isNameTagAlwaysVisible() : bool{
return $this->propertyManager->getByte(self::DATA_ALWAYS_SHOW_NAMETAG) === 1;
}
/**
* @param string $name
*/
public function setNameTag(string $name) : void{
$this->propertyManager->setString(self::DATA_NAMETAG, $name);
}
/**
* @param bool $value
*/
public function setNameTagVisible(bool $value = true) : void{
$this->setGenericFlag(self::DATA_FLAG_CAN_SHOW_NAMETAG, $value);
}
/**
* @param bool $value
*/
public function setNameTagAlwaysVisible(bool $value = true) : void{
$this->propertyManager->setByte(self::DATA_ALWAYS_SHOW_NAMETAG, $value ? 1 : 0);
}
/**
* @return string|null
*/
public function getScoreTag() : ?string{
return $this->propertyManager->getString(self::DATA_SCORE_TAG);
}
/**
* @param string $score
*/
public function setScoreTag(string $score) : void{
$this->propertyManager->setString(self::DATA_SCORE_TAG, $score);
}
/**
* @return float
*/
public function getScale() : float{
return $this->propertyManager->getFloat(self::DATA_SCALE);
}
/**
* @param float $value
*/
public function setScale(float $value) : void{
if($value <= 0){
throw new \InvalidArgumentException("Scale must be greater than 0");
@ -789,7 +746,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns whether the entity is able to climb blocks such as ladders or vines.
* @return bool
*/
public function canClimb() : bool{
return $this->getGenericFlag(self::DATA_FLAG_CAN_CLIMB);
@ -797,8 +753,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Sets whether the entity is able to climb climbable blocks.
*
* @param bool $value
*/
public function setCanClimb(bool $value = true) : void{
$this->setGenericFlag(self::DATA_FLAG_CAN_CLIMB, $value);
@ -806,8 +760,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns whether this entity is climbing a block. By default this is only true if the entity is climbing a ladder or vine or similar block.
*
* @return bool
*/
public function canClimbWalls() : bool{
return $this->getGenericFlag(self::DATA_FLAG_WALLCLIMBING);
@ -815,8 +767,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Sets whether the entity is climbing a block. If true, the entity can climb anything.
*
* @param bool $value
*/
public function setCanClimbWalls(bool $value = true) : void{
$this->setGenericFlag(self::DATA_FLAG_WALLCLIMBING, $value);
@ -824,7 +774,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns the entity ID of the owning entity, or null if the entity doesn't have an owner.
* @return int|null
*/
public function getOwningEntityId() : ?int{
return $this->propertyManager->getLong(self::DATA_OWNER_EID);
@ -832,7 +781,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns the owning entity, or null if the entity was not found.
* @return Entity|null
*/
public function getOwningEntity() : ?Entity{
$eid = $this->getOwningEntityId();
@ -846,8 +794,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Sets the owner of the entity. Passing null will remove the current owner.
*
* @param Entity|null $owner
*
* @throws \InvalidArgumentException if the supplied entity is not valid
*/
public function setOwningEntity(?Entity $owner) : void{
@ -862,7 +808,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns the entity ID of the entity's target, or null if it doesn't have a target.
* @return int|null
*/
public function getTargetEntityId() : ?int{
return $this->propertyManager->getLong(self::DATA_TARGET_EID);
@ -871,8 +816,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns the entity's target entity, or null if not found.
* This is used for things like hostile mobs attacking entities, and for fishing rods reeling hit entities in.
*
* @return Entity|null
*/
public function getTargetEntity() : ?Entity{
$eid = $this->getTargetEntityId();
@ -886,8 +829,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Sets the entity's target entity. Passing null will remove the current target.
*
* @param Entity|null $target
*
* @throws \InvalidArgumentException if the target entity is not valid
*/
public function setTargetEntity(?Entity $target) : void{
@ -902,7 +843,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns whether this entity will be saved when its chunk is unloaded.
* @return bool
*/
public function canSaveWithChunk() : bool{
return $this->savedWithChunk;
@ -911,8 +851,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Sets whether this entity will be saved when its chunk is unloaded. This can be used to prevent the entity being
* saved to disk.
*
* @param bool $value
*/
public function setCanSaveWithChunk(bool $value) : void{
$this->savedWithChunk = $value;
@ -920,8 +858,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns the short save name
*
* @return string
*/
public function getSaveId() : string{
if(!isset(self::$saveNames[static::class])){
@ -987,9 +923,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
}
/**
* @param EntityDamageEvent $source
*/
public function attack(EntityDamageEvent $source) : void{
$source->call();
if($source->isCancelled()){
@ -1001,9 +934,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$this->setHealth($this->getHealth() - $source->getFinalDamage());
}
/**
* @param EntityRegainHealthEvent $source
*/
public function heal(EntityRegainHealthEvent $source) : void{
$source->call();
if($source->isCancelled()){
@ -1020,10 +950,6 @@ 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{
return true;
@ -1033,17 +959,12 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
return $this->health > 0;
}
/**
* @return float
*/
public function getHealth() : float{
return $this->health;
}
/**
* Sets the health of the Entity. This won't send any update to the players
*
* @param float $amount
*/
public function setHealth(float $amount) : void{
if($amount == $this->health){
@ -1062,30 +983,18 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
}
}
/**
* @return int
*/
public function getMaxHealth() : int{
return $this->maxHealth;
}
/**
* @param int $amount
*/
public function setMaxHealth(int $amount) : void{
$this->maxHealth = $amount;
}
/**
* @param EntityDamageEvent $type
*/
public function setLastDamageCause(EntityDamageEvent $type) : void{
$this->lastDamageCause = $type;
}
/**
* @return EntityDamageEvent|null
*/
public function getLastDamageCause() : ?EntityDamageEvent{
return $this->lastDamageCause;
}
@ -1148,15 +1057,11 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$this->setGenericFlag(self::DATA_FLAG_ONFIRE, $this->isOnFire());
}
/**
* @return int
*/
public function getFireTicks() : int{
return $this->fireTicks;
}
/**
* @param int $fireTicks
* @throws \InvalidArgumentException
*/
public function setFireTicks(int $fireTicks) : void{
@ -1397,9 +1302,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
return false;
}
/**
* @return int|null
*/
public function getDirection() : ?int{
$rotation = ($this->yaw - 90) % 360;
if($rotation < 0){
@ -1418,9 +1320,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
}
}
/**
* @return Vector3
*/
public function getDirectionVector() : Vector3{
$y = -sin(deg2rad($this->pitch));
$xz = cos(deg2rad($this->pitch));
@ -1458,7 +1357,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
return true;
}
$this->timings->startTiming();
if($this->hasMovementUpdate()){
@ -1487,7 +1385,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$hasUpdate = $this->entityBaseTick($tickDiff);
Timings::$timerEntityBaseTick->stopTiming();
$this->timings->stopTiming();
//if($this->isStatic())
@ -1510,8 +1407,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Flags the entity as needing a movement update on the next tick. Setting this forces a movement update even if the
* entity's motion is zero. Used to trigger movement updates when blocks change near entities.
*
* @param bool $value
*/
final public function setForceMovementUpdate(bool $value = true) : void{
$this->forceMovementUpdate = $value;
@ -1521,7 +1416,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns whether the entity needs a movement update on the next tick.
* @return bool
*/
public function hasMovementUpdate() : bool{
return (
@ -1541,10 +1435,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$this->fallDistance = 0.0;
}
/**
* @param float $distanceThisTick
* @param bool $onGround
*/
protected function updateFallState(float $distanceThisTick, bool $onGround) : void{
if($onGround){
if($this->fallDistance > 0){
@ -1558,8 +1448,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Called when a falling entity hits the ground.
*
* @param float $fallDistance
*/
public function fall(float $fallDistance) : void{
@ -1625,7 +1513,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$this->isCollided = $this->onGround;
$this->updateFallState($dy, $this->onGround);
Timings::$entityMoveTimer->stopTiming();
return true;
@ -1710,7 +1597,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$this->boundingBox->offset(0, 0, $dz);
if($this->stepHeight > 0 and $fallingFlag and $this->ySize < 0.05 and ($movX != $dx or $movZ != $dz)){
$cx = $dx;
$cy = $dy;
@ -1823,8 +1709,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns whether this entity can be moved by currents in liquids.
*
* @return bool
*/
public function canBeMovedByCurrents() : bool{
return true;
@ -1960,10 +1844,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* @param Vector3|Position|Location $pos
* @param float|null $yaw
* @param float|null $pitch
*
* @return bool
*/
public function teleport(Vector3 $pos, ?float $yaw = null, ?float $pitch = null) : bool{
if($pos instanceof Location){
@ -2032,8 +1912,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Called by spawnTo() to send whatever packets needed to spawn the entity to the client.
*
* @param Player $player
*/
protected function sendSpawnPacket(Player $player) : void{
$pk = new AddActorPacket();
@ -2050,9 +1928,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$player->dataPacket($pk);
}
/**
* @param Player $player
*/
public function spawnTo(Player $player) : void{
if(!isset($this->hasSpawned[$player->getLoaderId()]) and $this->chunk !== null and isset($player->usedChunks[Level::chunkHash($this->chunk->getX(), $this->chunk->getZ())])){
$this->hasSpawned[$player->getLoaderId()] = $player;
@ -2082,9 +1957,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* @deprecated WARNING: This function DOES NOT permanently hide the entity from the player. As soon as the entity or
* player moves, the player will once again be able to see the entity.
*
* @param Player $player
* @param bool $send
*/
public function despawnFrom(Player $player, bool $send = true) : void{
if(isset($this->hasSpawned[$player->getLoaderId()])){
@ -2121,7 +1993,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Returns whether the entity has been "closed".
* @return bool
*/
public function isClosed() : bool{
return $this->closed;
@ -2161,12 +2032,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
}
}
/**
* @param int $propertyId
* @param int $flagId
* @param bool $value
* @param int $propertyType
*/
public function setDataFlag(int $propertyId, int $flagId, bool $value = true, int $propertyType = self::DATA_TYPE_LONG) : void{
if($this->getDataFlag($propertyId, $flagId) !== $value){
$flags = (int) $this->propertyManager->getPropertyValue($propertyId, $propertyType);
@ -2175,22 +2040,12 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
}
}
/**
* @param int $propertyId
* @param int $flagId
*
* @return bool
*/
public function getDataFlag(int $propertyId, int $flagId) : bool{
return (((int) $this->propertyManager->getPropertyValue($propertyId, -1)) & (1 << $flagId)) > 0;
}
/**
* Wrapper around {@link Entity#getDataFlag} for generic data flag reading.
*
* @param int $flagId
*
* @return bool
*/
public function getGenericFlag(int $flagId) : bool{
return $this->getDataFlag($flagId >= 64 ? self::DATA_FLAGS2 : self::DATA_FLAGS, $flagId % 64);
@ -2198,9 +2053,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* Wrapper around {@link Entity#setDataFlag} for generic data flag setting.
*
* @param int $flagId
* @param bool $value
*/
public function setGenericFlag(int $flagId, bool $value = true) : void{
$this->setDataFlag($flagId >= 64 ? self::DATA_FLAGS2 : self::DATA_FLAGS, $flagId % 64, $value, self::DATA_TYPE_LONG);
@ -2208,7 +2060,8 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/**
* @param Player[]|Player $player
* @param array $data Properly formatted entity data, defaults to everything
* @param mixed[][] $data Properly formatted entity data, defaults to everything
* @phpstan-param array<int, array{0: int, 1: mixed}> $data
*/
public function sendData($player, ?array $data = null) : void{
if(!is_array($player)){
@ -2231,6 +2084,9 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
}
}
/**
* @param Player[]|null $players
*/
public function broadcastEntityEvent(int $eventId, ?int $eventData = null, ?array $players = null) : void{
$pk = new ActorEventPacket();
$pk->entityRuntimeId = $this->id;

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
interface Explosive{
/**

View File

@ -116,9 +116,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
}
/**
* @param CompoundTag $skinTag
*
* @return Skin
* @throws \InvalidArgumentException
*/
protected static function deserializeSkinNBT(CompoundTag $skinTag) : Skin{
@ -137,32 +134,21 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
* @deprecated
*
* Checks the length of a supplied skin bitmap and returns whether the length is valid.
*
* @param string $skin
*
* @return bool
*/
public static function isValidSkin(string $skin) : bool{
return in_array(strlen($skin), Skin::ACCEPTED_SKIN_SIZES, true);
}
/**
* @return UUID|null
*/
public function getUniqueId() : ?UUID{
return $this->uuid;
}
/**
* @return string
*/
public function getRawUniqueId() : string{
return $this->rawUUID;
}
/**
* Returns a Skin object containing information about this human's skin.
* @return Skin
*/
public function getSkin() : Skin{
return $this->skin;
@ -171,8 +157,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Sets the human's skin. This will not send any update to viewers, you need to do that manually using
* {@link sendSkin}.
*
* @param Skin $skin
*/
public function setSkin(Skin $skin) : void{
$skin->validate();
@ -210,8 +194,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
* WARNING: This method does not check if full and may throw an exception if out of bounds.
* Use {@link Human::addFood()} for this purpose
*
* @param float $new
*
* @throws \InvalidArgumentException
*/
public function setFood(float $new) : void{
@ -241,8 +223,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Returns whether this Human may consume objects requiring hunger.
*
* @return bool
*/
public function isHungry() : bool{
return $this->getFood() < $this->getMaxFood();
@ -256,8 +236,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
* WARNING: This method does not check if saturated and may throw an exception if out of bounds.
* Use {@link Human::addSaturation()} for this purpose
*
* @param float $saturation
*
* @throws \InvalidArgumentException
*/
public function setSaturation(float $saturation) : void{
@ -276,8 +254,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* WARNING: This method does not check if exhausted and does not consume saturation/food.
* Use {@link Human::exhaust()} for this purpose.
*
* @param float $exhaustion
*/
public function setExhaustion(float $exhaustion) : void{
$this->attributeMap->getAttribute(Attribute::EXHAUSTION)->setValue($exhaustion);
@ -286,9 +262,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Increases a human's exhaustion level.
*
* @param float $amount
* @param int $cause
*
* @return float the amount of exhaustion level increased
*/
public function exhaust(float $amount, int $cause = PlayerExhaustEvent::CAUSE_CUSTOM) : float{
@ -336,7 +309,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Returns the player's experience level.
* @return int
*/
public function getXpLevel() : int{
return (int) $this->attributeMap->getAttribute(Attribute::EXPERIENCE_LEVEL)->getValue();
@ -344,10 +316,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Sets the player's experience level. This does not affect their total XP or their XP progress.
*
* @param int $level
*
* @return bool
*/
public function setXpLevel(int $level) : bool{
return $this->setXpAndProgress($level, null);
@ -355,11 +323,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Adds a number of XP levels to the player.
*
* @param int $amount
* @param bool $playSound
*
* @return bool
*/
public function addXpLevels(int $amount, bool $playSound = true) : bool{
$oldLevel = $this->getXpLevel();
@ -379,10 +342,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Subtracts a number of XP levels from the player.
*
* @param int $amount
*
* @return bool
*/
public function subtractXpLevels(int $amount) : bool{
return $this->addXpLevels(-$amount);
@ -390,7 +349,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Returns a value between 0.0 and 1.0 to indicate how far through the current level the player is.
* @return float
*/
public function getXpProgress() : float{
return $this->attributeMap->getAttribute(Attribute::EXPERIENCE)->getValue();
@ -398,10 +356,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Sets the player's progress through the current level to a value between 0.0 and 1.0.
*
* @param float $progress
*
* @return bool
*/
public function setXpProgress(float $progress) : bool{
return $this->setXpAndProgress(null, $progress);
@ -409,7 +363,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Returns the number of XP points the player has progressed into their current level.
* @return int
*/
public function getRemainderXp() : int{
return (int) (ExperienceUtils::getXpToCompleteLevel($this->getXpLevel()) * $this->getXpProgress());
@ -419,8 +372,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
* Returns the amount of XP points the player currently has, calculated from their current level and progress
* through their current level. This will be reduced by enchanting deducting levels and is used to calculate the
* amount of XP the player drops on death.
*
* @return int
*/
public function getCurrentTotalXp() : int{
return ExperienceUtils::getXpToReachLevel($this->getXpLevel()) + $this->getRemainderXp();
@ -429,10 +380,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Sets the current total of XP the player has, recalculating their XP level and progress.
* Note that this DOES NOT update the player's lifetime total XP.
*
* @param int $amount
*
* @return bool
*/
public function setCurrentTotalXp(int $amount) : bool{
$newLevel = ExperienceUtils::getLevelFromXp($amount);
@ -444,10 +391,7 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
* Adds an amount of XP to the player, recalculating their XP level and progress. XP amount will be added to the
* player's lifetime XP.
*
* @param int $amount
* @param bool $playSound Whether to play level-up and XP gained sounds.
*
* @return bool
*/
public function addXp(int $amount, bool $playSound = true) : bool{
$this->totalXp += $amount;
@ -478,10 +422,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Takes an amount of XP from the player, recalculating their XP level and progress.
*
* @param int $amount
*
* @return bool
*/
public function subtractXp(int $amount) : bool{
return $this->addXp(-$amount);
@ -514,8 +454,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Returns the total XP the player has collected in their lifetime. Resets when the player dies.
* XP levels being removed in enchanting do not reduce this number.
*
* @return int
*/
public function getLifetimeTotalXp() : int{
return $this->totalXp;
@ -524,8 +462,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Sets the lifetime total XP of the player. This does not recalculate their level or progress. Used for player
* score when they die. (TODO: add this when MCPE supports it)
*
* @param int $amount
*/
public function setLifetimeTotalXp(int $amount) : void{
if($amount < 0){
@ -537,7 +473,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Returns whether the human can pickup XP orbs (checks cooldown time)
* @return bool
*/
public function canPickupXp() : bool{
return $this->xpCooldown === 0;
@ -581,8 +516,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Sets the duration in ticks until the human can pick up another XP orb.
*
* @param int $value
*/
public function resetXpCooldown(int $value = 2) : void{
$this->xpCooldown = $value;
@ -902,10 +835,6 @@ 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{
return $this->getDataFlag(self::DATA_PLAYER_FLAGS, $flagId);
@ -913,9 +842,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
/**
* Wrapper around {@link Entity#setDataFlag} for player-specific data flag setting.
*
* @param int $flagId
* @param bool $value
*/
public function setPlayerFlag(int $flagId, bool $value = true) : void{
$this->setDataFlag(self::DATA_PLAYER_FLAGS, $flagId, $value, self::DATA_TYPE_BYTE);

View File

@ -187,7 +187,6 @@ abstract class Living extends Entity implements Damageable{
}
}
public function hasLineOfSight(Entity $entity) : bool{
//TODO: head height
return true;
@ -213,8 +212,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Removes the effect with the specified ID from the mob.
*
* @param int $effectId
*/
public function removeEffect(int $effectId) : void{
if(isset($this->effects[$effectId])){
@ -240,10 +237,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns the effect instance active on this entity with the specified ID, or null if the mob does not have the
* effect.
*
* @param int $effectId
*
* @return EffectInstance|null
*/
public function getEffect(int $effectId) : ?EffectInstance{
return $this->effects[$effectId] ?? null;
@ -251,10 +244,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns whether the specified effect is active on the mob.
*
* @param int $effectId
*
* @return bool
*/
public function hasEffect(int $effectId) : bool{
return isset($this->effects[$effectId]);
@ -262,7 +251,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns whether the mob has any active effects.
* @return bool
*/
public function hasEffects() : bool{
return count($this->effects) > 0;
@ -273,8 +261,6 @@ abstract class Living extends Entity implements Damageable{
* If a weaker effect of the same type is already applied, it will be replaced.
* If a weaker or equal-strength effect is already applied but has a shorter duration, it will be replaced.
*
* @param EffectInstance $effect
*
* @return bool whether the effect has been successfully applied.
*/
public function addEffect(EffectInstance $effect) : bool{
@ -345,8 +331,6 @@ 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{
foreach($this->effects as $effect){
@ -373,10 +357,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Causes the mob to consume the given Consumable object, applying applicable effects, health bonuses, food bonuses,
* etc.
*
* @param Consumable $consumable
*
* @return bool
*/
public function consumeObject(Consumable $consumable) : bool{
foreach($consumable->getAdditionalEffects() as $effect){
@ -390,7 +370,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns the initial upwards velocity of a jumping entity in blocks/tick, including additional velocity due to effects.
* @return float
*/
public function getJumpVelocity() : float{
return $this->jumpVelocity + ($this->hasEffect(Effect::JUMP) ? ($this->getEffect(Effect::JUMP)->getEffectLevel() / 10) : 0);
@ -417,8 +396,6 @@ abstract class Living extends Entity implements Damageable{
* Returns how many armour points this mob has. Armour points provide a percentage reduction to damage.
* For mobs which can wear armour, this should return the sum total of the armour points provided by their
* equipment.
*
* @return int
*/
public function getArmorPoints() : int{
$total = 0;
@ -431,10 +408,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns the highest level of the specified enchantment on any armour piece that the entity is currently wearing.
*
* @param int $enchantmentId
*
* @return int
*/
public function getHighestArmorEnchantmentLevel(int $enchantmentId) : int{
$result = 0;
@ -445,9 +418,6 @@ abstract class Living extends Entity implements Damageable{
return $result;
}
/**
* @return ArmorInventory
*/
public function getArmorInventory() : ArmorInventory{
return $this->armorInventory;
}
@ -459,8 +429,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Called prior to EntityDamageEvent execution to apply modifications to the event's damage, such as reduction due
* to effects or armour.
*
* @param EntityDamageEvent $source
*/
public function applyDamageModifiers(EntityDamageEvent $source) : void{
if($source->canBeReducedByArmor()){
@ -488,8 +456,6 @@ abstract class Living extends Entity implements Damageable{
* Called after EntityDamageEvent execution to apply post-hurt effects, such as reducing absorption or modifying
* armour durability.
* This will not be called by damage sources causing death.
*
* @param EntityDamageEvent $source
*/
protected function applyPostDamageEffects(EntityDamageEvent $source) : void{
$this->setAbsorption(max(0, $this->getAbsorption() + $source->getModifier(EntityDamageEvent::MODIFIER_ABSORPTION)));
@ -519,8 +485,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Damages the worn armour according to the amount of damage given. Each 4 points (rounded down) deals 1 damage
* point to each armour piece, but never less than 1 total.
*
* @param float $damage
*/
public function damageArmor(float $damage) : void{
$durabilityRemoved = (int) max(floor($damage / 4), 1);
@ -720,10 +684,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Ticks the entity's air supply, consuming it when underwater and regenerating it when out of water.
*
* @param int $tickDiff
*
* @return bool
*/
protected function doAirSupplyTick(int $tickDiff) : bool{
$ticks = $this->getAirSupplyTicks();
@ -759,7 +719,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns whether the entity can currently breathe.
* @return bool
*/
public function canBreathe() : bool{
return $this->hasEffect(Effect::WATER_BREATHING) or $this->hasEffect(Effect::CONDUIT_POWER) or !$this->isUnderwater();
@ -767,7 +726,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns whether the entity is currently breathing or not. If this is false, the entity's air supply will be used.
* @return bool
*/
public function isBreathing() : bool{
return $this->getGenericFlag(self::DATA_FLAG_BREATHING);
@ -776,8 +734,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Sets whether the entity is currently breathing. If false, it will cause the entity's air supply to be used.
* For players, this also shows the oxygen bar.
*
* @param bool $value
*/
public function setBreathing(bool $value = true) : void{
$this->setGenericFlag(self::DATA_FLAG_BREATHING, $value);
@ -786,8 +742,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns the number of ticks remaining in the entity's air supply. Note that the entity may survive longer than
* this amount of time without damage due to enchantments such as Respiration.
*
* @return int
*/
public function getAirSupplyTicks() : int{
return $this->propertyManager->getShort(self::DATA_AIR);
@ -795,8 +749,6 @@ 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{
$this->propertyManager->setShort(self::DATA_AIR, $ticks);
@ -804,7 +756,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns the maximum amount of air ticks the entity's air supply can contain.
* @return int
*/
public function getMaxAirSupplyTicks() : int{
return $this->propertyManager->getShort(self::DATA_MAX_AIR);
@ -812,8 +763,6 @@ 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{
$this->propertyManager->setShort(self::DATA_MAX_AIR, $ticks);
@ -837,16 +786,14 @@ abstract class Living extends Entity implements Damageable{
/**
* Returns the amount of XP this mob will drop on death.
* @return int
*/
public function getXpDropAmount() : int{
return 0;
}
/**
* @param int $maxDistance
* @param int $maxLength
* @param array $transparent
* @param true[] $transparent
* @phpstan-param array<int, true> $transparent
*
* @return Block[]
*/
@ -888,10 +835,8 @@ abstract class Living extends Entity implements Damageable{
}
/**
* @param int $maxDistance
* @param array $transparent
*
* @return Block|null
* @param true[] $transparent
* @phpstan-param array<int, true> $transparent
*/
public function getTargetBlock(int $maxDistance, array $transparent = []) : ?Block{
$line = $this->getLineOfSight($maxDistance, 1, $transparent);
@ -905,8 +850,6 @@ abstract class Living extends Entity implements Damageable{
/**
* Changes the entity's yaw and pitch to make it look at the specified Vector3 position. For mobs, this will cause
* their heads to turn.
*
* @param Vector3 $target
*/
public function lookAt(Vector3 $target) : void{
$horizontal = sqrt(($target->x - $this->x) ** 2 + ($target->z - $this->z) ** 2);

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
abstract class Monster extends Creature{
}

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
interface NPC{
}

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
interface Rideable{
}

View File

@ -57,7 +57,6 @@ class Skin{
/**
* @deprecated
* @return bool
*/
public function isValid() : bool{
try{
@ -85,37 +84,22 @@ class Skin{
//TODO: validate geometry
}
/**
* @return string
*/
public function getSkinId() : string{
return $this->skinId;
}
/**
* @return string
*/
public function getSkinData() : string{
return $this->skinData;
}
/**
* @return string
*/
public function getCapeData() : string{
return $this->capeData;
}
/**
* @return string
*/
public function getGeometryName() : string{
return $this->geometryName;
}
/**
* @return string
*/
public function getGeometryData() : string{
return $this->geometryData;
}

View File

@ -78,7 +78,6 @@ class Squid extends WaterAnimal{
return new Vector3(mt_rand(-1000, 1000) / 1000, mt_rand(-500, 500) / 1000, mt_rand(-1000, 1000) / 1000);
}
public function entityBaseTick(int $tickDiff = 1) : bool{
if($this->closed){
return false;

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity;
abstract class Vehicle extends Entity implements Rideable{
}

View File

@ -59,8 +59,6 @@ class Villager extends Creature implements NPC, Ageable{
/**
* Sets the villager profession
*
* @param int $profession
*/
public function setProfession(int $profession) : void{
$this->propertyManager->setInt(self::DATA_VARIANT, $profession);

View File

@ -49,10 +49,6 @@ class ExperienceOrb extends Entity{
/**
* Returns the largest size of normal XP orb that will be spawned for the specified amount of XP. Used to split XP
* up into multiple orbs when an amount of XP is dropped.
*
* @param int $amount
*
* @return int
*/
public static function getMaxOrbSize(int $amount) : int{
foreach(self::ORB_SPLIT_SIZES as $split){
@ -67,8 +63,6 @@ class ExperienceOrb extends Entity{
/**
* Splits the specified amount of XP into an array of acceptable XP orb sizes.
*
* @param int $amount
*
* @return int[]
*/
public static function splitIntoOrbSizes(int $amount) : array{

View File

@ -67,7 +67,6 @@ class ItemEntity extends Entity{
$this->owner = $this->namedtag->getString("Owner", $this->owner);
$this->thrower = $this->namedtag->getString("Thrower", $this->thrower);
$itemTag = $this->namedtag->getCompoundTag("Item");
if($itemTag === null){
throw new \UnexpectedValueException("Invalid " . get_class($this) . " entity: expected \"Item\" NBT tag not found");
@ -78,7 +77,6 @@ class ItemEntity extends Entity{
throw new \UnexpectedValueException("Item for " . get_class($this) . " is invalid");
}
(new ItemSpawnEvent($this))->call();
}
@ -134,9 +132,6 @@ class ItemEntity extends Entity{
}
}
/**
* @return Item
*/
public function getItem() : Item{
return $this->item;
}
@ -149,44 +144,26 @@ class ItemEntity extends Entity{
return false;
}
/**
* @return int
*/
public function getPickupDelay() : int{
return $this->pickupDelay;
}
/**
* @param int $delay
*/
public function setPickupDelay(int $delay) : void{
$this->pickupDelay = $delay;
}
/**
* @return string
*/
public function getOwner() : string{
return $this->owner;
}
/**
* @param string $owner
*/
public function setOwner(string $owner) : void{
$this->owner = $owner;
}
/**
* @return string
*/
public function getThrower() : string{
return $this->thrower;
}
/**
* @param string $thrower
*/
public function setThrower(string $thrower) : void{
$this->thrower = $thrower;
}

View File

@ -168,7 +168,6 @@ class Painting extends Entity{
/**
* Returns the painting motive (which image is displayed on the painting)
* @return PaintingMotive
*/
public function getMotive() : PaintingMotive{
return PaintingMotive::getMotiveByName($this->motive);
@ -180,12 +179,6 @@ class Painting extends Entity{
/**
* Returns the bounding-box a painting with the specified motive would have at the given position and direction.
*
* @param Vector3 $blockIn
* @param int $facing
* @param PaintingMotive $motive
*
* @return AxisAlignedBB
*/
private static function getPaintingBB(Vector3 $blockIn, int $facing, PaintingMotive $motive) : AxisAlignedBB{
$width = $motive->getWidth();
@ -241,14 +234,6 @@ class Painting extends Entity{
/**
* Returns whether a painting with the specified motive can be placed at the given position.
*
* @param Level $level
* @param Vector3 $blockIn
* @param int $facing
* @param bool $checkOverlap
* @param PaintingMotive $motive
*
* @return bool
*/
public static function canFit(Level $level, Vector3 $blockIn, int $facing, bool $checkOverlap, PaintingMotive $motive) : bool{
$width = $motive->getWidth();

View File

@ -64,18 +64,10 @@ class PaintingMotive{
}
}
/**
* @param PaintingMotive $motive
*/
public static function registerMotive(PaintingMotive $motive) : void{
self::$motives[$motive->getName()] = $motive;
}
/**
* @param string $name
*
* @return PaintingMotive|null
*/
public static function getMotiveByName(string $name) : ?PaintingMotive{
return self::$motives[$name] ?? null;
}
@ -94,30 +86,20 @@ class PaintingMotive{
/** @var int */
protected $height;
public function __construct(int $width, int $height, string $name){
$this->name = $name;
$this->width = $width;
$this->height = $height;
}
/**
* @return string
*/
public function getName() : string{
return $this->name;
}
/**
* @return int
*/
public function getWidth() : int{
return $this->width;
}
/**
* @return int
*/
public function getHeight() : int{
return $this->height;
}

View File

@ -48,7 +48,6 @@ class PrimedTNT extends Entity implements Explosive{
public $canCollide = false;
public function attack(EntityDamageEvent $source) : void{
if($source->getCause() === EntityDamageEvent::CAUSE_VOID){
parent::attack($source);
@ -70,7 +69,6 @@ class PrimedTNT extends Entity implements Explosive{
$this->level->broadcastLevelEvent($this, LevelEventPacket::EVENT_SOUND_IGNITE);
}
public function canCollideWith(Entity $entity) : bool{
return false;
}

View File

@ -102,16 +102,10 @@ class Arrow extends Projectile{
}
}
/**
* @return float
*/
public function getPunchKnockback() : float{
return $this->punchKnockback;
}
/**
* @param float $punchKnockback
*/
public function setPunchKnockback(float $punchKnockback) : void{
$this->punchKnockback = $punchKnockback;
}
@ -157,16 +151,10 @@ class Arrow extends Projectile{
}
}
/**
* @return int
*/
public function getPickupMode() : int{
return $this->pickupMode;
}
/**
* @param int $pickupMode
*/
public function setPickupMode(int $pickupMode) : void{
$this->pickupMode = $pickupMode;
}

View File

@ -120,8 +120,6 @@ abstract class Projectile extends Entity{
/**
* Returns the base damage applied on collision. This is multiplied by the projectile's speed to give a result
* damage.
*
* @return float
*/
public function getBaseDamage() : float{
return $this->damage;
@ -129,8 +127,6 @@ abstract class Projectile extends Entity{
/**
* Sets the base amount of damage applied by the projectile.
*
* @param float $damage
*/
public function setBaseDamage(float $damage) : void{
$this->damage = $damage;
@ -138,7 +134,6 @@ abstract class Projectile extends Entity{
/**
* Returns the amount of damage this projectile will deal to the entity it hits.
* @return int
*/
public function getResultDamage() : int{
return (int) ceil($this->motion->length() * $this->damage);
@ -270,7 +265,6 @@ abstract class Projectile extends Entity{
$this->checkChunks();
$this->checkBlockCollision();
Timings::$entityMoveTimer->stopTiming();
}
@ -279,10 +273,6 @@ abstract class Projectile extends Entity{
* This can be overridden by other projectiles to allow altering the blocks which are collided with (for example
* some projectiles collide with any non-air block).
*
* @param Block $block
* @param Vector3 $start
* @param Vector3 $end
*
* @return RayTraceResult|null the result of the ray trace if successful, or null if no interception is found.
*/
protected function calculateInterceptWithBlock(Block $block, Vector3 $start, Vector3 $end) : ?RayTraceResult{
@ -292,8 +282,6 @@ abstract class Projectile extends Entity{
/**
* Called when the projectile hits something. Override this to perform non-target-specific effects when the
* projectile hits something.
*
* @param ProjectileHitEvent $event
*/
protected function onHit(ProjectileHitEvent $event) : void{
@ -301,9 +289,6 @@ abstract class Projectile extends Entity{
/**
* Called when the projectile collides with an Entity.
*
* @param Entity $entityHit
* @param RayTraceResult $hitResult
*/
protected function onHitEntity(Entity $entityHit, RayTraceResult $hitResult) : void{
$damage = $this->getResultDamage();
@ -331,9 +316,6 @@ abstract class Projectile extends Entity{
/**
* Called when the projectile collides with a Block.
*
* @param Block $blockHit
* @param RayTraceResult $hitResult
*/
protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{
$this->blockHit = $blockHit->asVector3();

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\entity\projectile;
interface ProjectileSource{
}

View File

@ -131,22 +131,17 @@ class SplashPotion extends Throwable{
/**
* Returns the meta value of the potion item that this splash potion corresponds to. This decides what effects will be applied to the entity when it collides with its target.
* @return int
*/
public function getPotionId() : int{
return $this->propertyManager->getShort(self::DATA_POTION_AUX_VALUE) ?? 0;
}
/**
* @param int $id
*/
public function setPotionId(int $id) : void{
$this->propertyManager->setShort(self::DATA_POTION_AUX_VALUE, $id);
}
/**
* Returns whether this splash potion will create an area-effect cloud when it lands.
* @return bool
*/
public function willLinger() : bool{
return $this->getDataFlag(self::DATA_FLAGS, self::DATA_FLAG_LINGER);
@ -154,8 +149,6 @@ 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{
$this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_LINGER, $value);

View File

@ -30,10 +30,6 @@ 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{
if($level <= 16){
@ -47,10 +43,6 @@ abstract class ExperienceUtils{
/**
* Returns the amount of XP needed to reach $level + 1.
*
* @param int $level
*
* @return int
*/
public static function getXpToCompleteLevel(int $level) : int{
if($level <= 15){
@ -65,10 +57,6 @@ abstract class ExperienceUtils{
/**
* Calculates and returns the number of XP levels the specified amount of XP points are worth.
* This returns a floating-point number, the decimal part being the progress through the resulting level.
*
* @param int $xp
*
* @return float
*/
public static function getLevelFromXp(int $xp) : float{
if($xp <= self::getXpToReachLevel(16)){

View File

@ -23,19 +23,13 @@ declare(strict_types=1);
namespace pocketmine\event;
/**
* Events that can be cancelled must use the interface Cancellable
*/
interface Cancellable{
/**
* @return bool
*/
public function isCancelled() : bool;
/**
* @param bool $value
*
* @return void
*/
public function setCancelled(bool $value = true);

View File

@ -39,16 +39,11 @@ abstract class Event{
/** @var bool */
private $isCancelled = false;
/**
* @return string
*/
final public function getEventName() : string{
return $this->eventName ?? get_class($this);
}
/**
* @return bool
*
* @throws \BadMethodCallException
*/
public function isCancelled() : bool{
@ -60,8 +55,6 @@ abstract class Event{
}
/**
* @param bool $value
*
* @throws \BadMethodCallException
*/
public function setCancelled(bool $value = true) : void{

View File

@ -76,10 +76,6 @@ abstract class EventPriority{
public const MONITOR = 0;
/**
* @param string $name
*
* @return int
*
* @throws \InvalidArgumentException
*/
public static function fromString(string $name) : int{

Some files were not shown because too many files have changed in this diff Show More