Merge 'stable' into 'minor-next'

Automatic merge performed by: https://github.com/pmmp/RestrictedActions/actions/runs/14565559872
This commit is contained in:
pmmp-admin-bot[bot] 2025-04-21 01:45:17 +00:00
commit cfafb584a8
3 changed files with 15 additions and 3 deletions

View File

@ -61,6 +61,7 @@ use pocketmine\player\Player;
use pocketmine\Server; use pocketmine\Server;
use pocketmine\timings\Timings; use pocketmine\timings\Timings;
use pocketmine\timings\TimingsHandler; use pocketmine\timings\TimingsHandler;
use pocketmine\utils\Limits;
use pocketmine\utils\Utils; use pocketmine\utils\Utils;
use pocketmine\VersionInfo; use pocketmine\VersionInfo;
use pocketmine\world\format\Chunk; use pocketmine\world\format\Chunk;
@ -77,6 +78,7 @@ use function floatval;
use function floor; use function floor;
use function fmod; use function fmod;
use function get_class; use function get_class;
use function min;
use function sin; use function sin;
use function spl_object_id; use function spl_object_id;
use const M_PI_2; use const M_PI_2;
@ -701,9 +703,16 @@ abstract class Entity{
* @throws \InvalidArgumentException * @throws \InvalidArgumentException
*/ */
public function setFireTicks(int $fireTicks) : void{ public function setFireTicks(int $fireTicks) : void{
if($fireTicks < 0 || $fireTicks > 0x7fff){ if($fireTicks < 0){
throw new \InvalidArgumentException("Fire ticks must be in range 0 ... " . 0x7fff . ", got $fireTicks"); throw new \InvalidArgumentException("Fire ticks cannot be negative");
} }
//Since the max value is not externally obvious or intuitive, many plugins use this without being aware that
//reasonably large values are not accepted. We even have such usages within PM itself. It doesn't make sense
//to force all those calls to be aware of this limitation, as it's not a functional limit but a limitation of
//the Mojang save format. Truncating this to the max acceptable value is the next best thing we can do.
$fireTicks = min($fireTicks, Limits::INT16_MAX);
if(!$this->isFireProof()){ if(!$this->isFireProof()){
$this->fireTicks = $fireTicks; $this->fireTicks = $fireTicks;
$this->networkPropertiesDirty = true; $this->networkPropertiesDirty = true;

View File

@ -28,6 +28,7 @@ use pocketmine\item\enchantment\ItemEnchantmentTags as Tags;
use pocketmine\item\enchantment\VanillaEnchantments as Enchantments; use pocketmine\item\enchantment\VanillaEnchantments as Enchantments;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\utils\SingletonTrait; use pocketmine\utils\SingletonTrait;
use pocketmine\utils\Utils;
use function array_filter; use function array_filter;
use function array_values; use function array_values;
use function count; use function count;
@ -129,6 +130,7 @@ final class AvailableEnchantmentRegistry{
if(!$this->isRegistered($enchantment)){ if(!$this->isRegistered($enchantment)){
throw new \LogicException("Cannot set primary item tags for non-registered enchantment"); throw new \LogicException("Cannot set primary item tags for non-registered enchantment");
} }
Utils::validateArrayValueType($tags, fn(string $v) => 1);
$this->primaryItemTags[spl_object_id($enchantment)] = array_values($tags); $this->primaryItemTags[spl_object_id($enchantment)] = array_values($tags);
} }
@ -152,6 +154,7 @@ final class AvailableEnchantmentRegistry{
if(!$this->isRegistered($enchantment)){ if(!$this->isRegistered($enchantment)){
throw new \LogicException("Cannot set secondary item tags for non-registered enchantment"); throw new \LogicException("Cannot set secondary item tags for non-registered enchantment");
} }
Utils::validateArrayValueType($tags, fn(string $v) => 1);
$this->secondaryItemTags[spl_object_id($enchantment)] = array_values($tags); $this->secondaryItemTags[spl_object_id($enchantment)] = array_values($tags);
} }

View File

@ -584,7 +584,7 @@ final class Utils{
/** /**
* @phpstan-template TMemberType * @phpstan-template TMemberType
* @phpstan-param array<mixed, TMemberType> $array * @phpstan-param array<mixed, TMemberType> $array
* @phpstan-param \Closure(TMemberType) : void $validator * @phpstan-param \Closure(TMemberType) : mixed $validator
*/ */
public static function validateArrayValueType(array $array, \Closure $validator) : void{ public static function validateArrayValueType(array $array, \Closure $validator) : void{
foreach(Utils::promoteKeys($array) as $k => $v){ foreach(Utils::promoteKeys($array) as $k => $v){