mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-03 16:49:53 +00:00
Merge branch 'api3/network' into api3/network-mcpe-1.1
This commit is contained in:
commit
179210aa27
36
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
36
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
## Introduction
|
||||||
|
<!-- Explain existing problems or why this pull request is necessary -->
|
||||||
|
|
||||||
|
### Relevant issues
|
||||||
|
<!-- List relevant issues here -->
|
||||||
|
<!--
|
||||||
|
|
||||||
|
* Fixes #1
|
||||||
|
* Fixes #2
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
### API changes
|
||||||
|
<!-- Any additions to the API that should be documented in release notes? -->
|
||||||
|
|
||||||
|
### Behavioural changes
|
||||||
|
<!-- Any change in how the server behaves, or its performance? -->
|
||||||
|
|
||||||
|
## Backwards compatibility
|
||||||
|
<!-- Any possible backwards incompatible changes? How are they solved, or how can they be solved? -->
|
||||||
|
|
||||||
|
## Follow-up
|
||||||
|
<!-- Suggest any actions to be done before/after merging this pull request -->
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Requires translations:
|
||||||
|
|
||||||
|
| Name | Value in eng.ini |
|
||||||
|
| :--: | :---: |
|
||||||
|
| `foo.bar` | `Foo bar` |
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
<!-- Attach scripts or actions to test this pull request, as well as the result -->
|
@ -1335,7 +1335,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
public function sendSettings(){
|
public function sendSettings(){
|
||||||
$pk = new AdventureSettingsPacket();
|
$pk = new AdventureSettingsPacket();
|
||||||
$pk->flags = 0;
|
$pk->flags = 0;
|
||||||
$pk->worldImmutable = $this->isAdventure();
|
$pk->worldImmutable = $this->isSpectator();
|
||||||
$pk->autoJump = $this->autoJump;
|
$pk->autoJump = $this->autoJump;
|
||||||
$pk->allowFlight = $this->allowFlight;
|
$pk->allowFlight = $this->allowFlight;
|
||||||
$pk->noClip = $this->isSpectator();
|
$pk->noClip = $this->isSpectator();
|
||||||
@ -1582,6 +1582,15 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
$this->teleport($ev->getTo());
|
$this->teleport($ev->getTo());
|
||||||
}else{
|
}else{
|
||||||
$this->level->addEntityMovement($this->x >> 4, $this->z >> 4, $this->getId(), $this->x, $this->y + $this->getEyeHeight(), $this->z, $this->yaw, $this->pitch, $this->yaw);
|
$this->level->addEntityMovement($this->x >> 4, $this->z >> 4, $this->getId(), $this->x, $this->y + $this->getEyeHeight(), $this->z, $this->yaw, $this->pitch, $this->yaw);
|
||||||
|
|
||||||
|
$distance = $from->distance($to);
|
||||||
|
|
||||||
|
//TODO: check swimming (adds 0.015 exhaustion in MCPE)
|
||||||
|
if($this->isSprinting()){
|
||||||
|
$this->exhaust(0.1 * $distance, PlayerExhaustEvent::CAUSE_SPRINTING);
|
||||||
|
}else{
|
||||||
|
$this->exhaust(0.01 * $distance, PlayerExhaustEvent::CAUSE_WALKING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2693,9 +2702,13 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
$this->deadTicks = 0;
|
$this->deadTicks = 0;
|
||||||
$this->noDamageTicks = 60;
|
$this->noDamageTicks = 60;
|
||||||
|
|
||||||
|
$this->removeAllEffects();
|
||||||
$this->setHealth($this->getMaxHealth());
|
$this->setHealth($this->getMaxHealth());
|
||||||
|
|
||||||
$this->removeAllEffects();
|
foreach($this->attributeMap->getAll() as $attr){
|
||||||
|
$attr->resetToDefault();
|
||||||
|
}
|
||||||
|
|
||||||
$this->sendData($this);
|
$this->sendData($this);
|
||||||
|
|
||||||
$this->sendSettings();
|
$this->sendSettings();
|
||||||
@ -2706,6 +2719,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
$this->scheduleUpdate();
|
$this->scheduleUpdate();
|
||||||
break;
|
break;
|
||||||
case PlayerActionPacket::ACTION_JUMP:
|
case PlayerActionPacket::ACTION_JUMP:
|
||||||
|
$this->jump();
|
||||||
return true;
|
return true;
|
||||||
case PlayerActionPacket::ACTION_START_SPRINT:
|
case PlayerActionPacket::ACTION_START_SPRINT:
|
||||||
$ev = new PlayerToggleSprintEvent($this, true);
|
$ev = new PlayerToggleSprintEvent($this, true);
|
||||||
@ -3561,7 +3575,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
* @param string $reason Reason showed in console
|
* @param string $reason Reason showed in console
|
||||||
* @param bool $notify
|
* @param bool $notify
|
||||||
*/
|
*/
|
||||||
public final function close($message = "", $reason = "generic reason", $notify = true){
|
final public function close($message = "", $reason = "generic reason", $notify = true){
|
||||||
if($this->connected and !$this->closed){
|
if($this->connected and !$this->closed){
|
||||||
if($notify and strlen((string) $reason) > 0){
|
if($notify and strlen((string) $reason) > 0){
|
||||||
$pk = new DisconnectPacket();
|
$pk = new DisconnectPacket();
|
||||||
@ -3704,6 +3718,17 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parent::kill();
|
||||||
|
|
||||||
|
$pk = new RespawnPacket();
|
||||||
|
$pos = $this->getSpawn();
|
||||||
|
$pk->x = $pos->x;
|
||||||
|
$pk->y = $pos->y;
|
||||||
|
$pk->z = $pos->z;
|
||||||
|
$this->dataPacket($pk);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function callDeathEvent(){
|
||||||
$message = "death.attack.generic";
|
$message = "death.attack.generic";
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
@ -3813,10 +3838,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity::kill();
|
|
||||||
|
|
||||||
$this->server->getPluginManager()->callEvent($ev = new PlayerDeathEvent($this, $this->getDrops(), new TranslationContainer($message, $params)));
|
$this->server->getPluginManager()->callEvent($ev = new PlayerDeathEvent($this, $this->getDrops(), new TranslationContainer($message, $params)));
|
||||||
|
|
||||||
if(!$ev->getKeepInventory()){
|
if(!$ev->getKeepInventory()){
|
||||||
@ -3834,13 +3858,6 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
|||||||
if($ev->getDeathMessage() != ""){
|
if($ev->getDeathMessage() != ""){
|
||||||
$this->server->broadcast($ev->getDeathMessage(), Server::BROADCAST_CHANNEL_USERS);
|
$this->server->broadcast($ev->getDeathMessage(), Server::BROADCAST_CHANNEL_USERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
$pk = new RespawnPacket();
|
|
||||||
$pos = $this->getSpawn();
|
|
||||||
$pk->x = $pos->x;
|
|
||||||
$pk->y = $pos->y;
|
|
||||||
$pk->z = $pos->z;
|
|
||||||
$this->dataPacket($pk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function attack($damage, EntityDamageEvent $source){
|
public function attack($damage, EntityDamageEvent $source){
|
||||||
|
@ -132,7 +132,7 @@ abstract class Command{
|
|||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public abstract function execute(CommandSender $sender, $commandLabel, array $args);
|
abstract public function execute(CommandSender $sender, $commandLabel, array $args);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
|
@ -70,7 +70,7 @@ class PluginCommand extends Command implements PluginIdentifiableCommand{
|
|||||||
* @param CommandExecutor $executor
|
* @param CommandExecutor $executor
|
||||||
*/
|
*/
|
||||||
public function setExecutor(CommandExecutor $executor){
|
public function setExecutor(CommandExecutor $executor){
|
||||||
$this->executor = ($executor != null) ? $executor : $this->owningPlugin;
|
$this->executor = $executor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -165,6 +165,10 @@ class Attribute{
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function resetToDefault(){
|
||||||
|
$this->setValue($this->getDefaultValue());
|
||||||
|
}
|
||||||
|
|
||||||
public function getValue(){
|
public function getValue(){
|
||||||
return $this->currentValue;
|
return $this->currentValue;
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,9 @@ class AttributeMap implements \ArrayAccess{
|
|||||||
return $this->attributes[$id] ?? null;
|
return $this->attributes[$id] ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Attribute[]
|
||||||
|
*/
|
||||||
public function getAll(): array{
|
public function getAll(): array{
|
||||||
return $this->attributes;
|
return $this->attributes;
|
||||||
}
|
}
|
||||||
|
@ -373,6 +373,7 @@ abstract class Entity extends Location implements Metadatable{
|
|||||||
$this->invulnerable = $this->namedtag["Invulnerable"] > 0 ? true : false;
|
$this->invulnerable = $this->namedtag["Invulnerable"] > 0 ? true : false;
|
||||||
|
|
||||||
$this->attributeMap = new AttributeMap();
|
$this->attributeMap = new AttributeMap();
|
||||||
|
$this->addAttributes();
|
||||||
|
|
||||||
$this->chunk->addEntity($this);
|
$this->chunk->addEntity($this);
|
||||||
$this->level->addEntity($this);
|
$this->level->addEntity($this);
|
||||||
@ -710,8 +711,6 @@ abstract class Entity extends Location implements Metadatable{
|
|||||||
|
|
||||||
$this->scheduleUpdate();
|
$this->scheduleUpdate();
|
||||||
|
|
||||||
$this->addAttributes();
|
|
||||||
|
|
||||||
if(isset($this->namedtag->ActiveEffects)){
|
if(isset($this->namedtag->ActiveEffects)){
|
||||||
foreach($this->namedtag->ActiveEffects->getValue() as $e){
|
foreach($this->namedtag->ActiveEffects->getValue() as $e){
|
||||||
$amplifier = $e["Amplifier"] & 0xff; //0-255 only
|
$amplifier = $e["Amplifier"] & 0xff; //0-255 only
|
||||||
@ -1179,7 +1178,7 @@ abstract class Entity extends Location implements Metadatable{
|
|||||||
//return !($this instanceof Player);
|
//return !($this instanceof Player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final function scheduleUpdate(){
|
final public function scheduleUpdate(){
|
||||||
$this->level->updateEntities[$this->id] = $this;
|
$this->level->updateEntities[$this->id] = $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,6 +99,15 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
|||||||
$this->skinId = $skinId;
|
$this->skinId = $skinId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function jump(){
|
||||||
|
parent::jump();
|
||||||
|
if($this->isSprinting()){
|
||||||
|
$this->exhaust(0.8, PlayerExhaustEvent::CAUSE_SPRINT_JUMPING);
|
||||||
|
}else{
|
||||||
|
$this->exhaust(0.2, PlayerExhaustEvent::CAUSE_JUMPING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function getFood() : float{
|
public function getFood() : float{
|
||||||
return $this->attributeMap->getAttribute(Attribute::HUNGER)->getValue();
|
return $this->attributeMap->getAttribute(Attribute::HUNGER)->getValue();
|
||||||
}
|
}
|
||||||
@ -355,31 +364,35 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
|||||||
if($this->isAlive()){
|
if($this->isAlive()){
|
||||||
$food = $this->getFood();
|
$food = $this->getFood();
|
||||||
$health = $this->getHealth();
|
$health = $this->getHealth();
|
||||||
if($food >= 18){
|
$difficulty = $this->server->getDifficulty();
|
||||||
$this->foodTickTimer++;
|
|
||||||
if($this->foodTickTimer >= 80 and $health < $this->getMaxHealth()){
|
|
||||||
$this->heal(1, new EntityRegainHealthEvent($this, 1, EntityRegainHealthEvent::CAUSE_SATURATION));
|
|
||||||
$this->exhaust(3.0, PlayerExhaustEvent::CAUSE_HEALTH_REGEN);
|
|
||||||
$this->foodTickTimer = 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
}elseif($food === 0){
|
|
||||||
$this->foodTickTimer++;
|
$this->foodTickTimer++;
|
||||||
if($this->foodTickTimer >= 80){
|
if($this->foodTickTimer >= 80){
|
||||||
$diff = $this->server->getDifficulty();
|
$this->foodTickTimer = 0;
|
||||||
$can = false;
|
|
||||||
if($diff === 1){
|
|
||||||
$can = $health > 10;
|
|
||||||
}elseif($diff === 2){
|
|
||||||
$can = $health > 1;
|
|
||||||
}elseif($diff === 3){
|
|
||||||
$can = true;
|
|
||||||
}
|
}
|
||||||
if($can){
|
|
||||||
|
if($difficulty === 0 and $this->foodTickTimer % 10 === 0){ //Peaceful
|
||||||
|
if($food < 20){
|
||||||
|
$this->addFood(1.0);
|
||||||
|
}
|
||||||
|
if($this->foodTickTimer % 20 === 0 and $health < $this->getMaxHealth()){
|
||||||
|
$this->heal(1, new EntityRegainHealthEvent($this, 1, EntityRegainHealthEvent::CAUSE_SATURATION));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->foodTickTimer === 0){
|
||||||
|
if($food >= 18){
|
||||||
|
if($health < $this->getMaxHealth()){
|
||||||
|
$this->heal(1, new EntityRegainHealthEvent($this, 1, EntityRegainHealthEvent::CAUSE_SATURATION));
|
||||||
|
$this->exhaust(3.0, PlayerExhaustEvent::CAUSE_HEALTH_REGEN);
|
||||||
|
}
|
||||||
|
}elseif($food <= 0){
|
||||||
|
if(($difficulty === 1 and $health > 10) or ($difficulty === 2 and $health > 1) or $difficulty === 3){
|
||||||
$this->attack(1, new EntityDamageEvent($this, EntityDamageEvent::CAUSE_STARVATION, 1));
|
$this->attack(1, new EntityDamageEvent($this, EntityDamageEvent::CAUSE_STARVATION, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($food <= 6){
|
if($food <= 6){
|
||||||
if($this->isSprinting()){
|
if($this->isSprinting()){
|
||||||
$this->setSprinting(false);
|
$this->setSprinting(false);
|
||||||
|
@ -43,6 +43,8 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
|
|
||||||
protected $invisible = false;
|
protected $invisible = false;
|
||||||
|
|
||||||
|
protected $jumpVelocity = 0.42;
|
||||||
|
|
||||||
protected function initEntity(){
|
protected function initEntity(){
|
||||||
parent::initEntity();
|
parent::initEntity();
|
||||||
|
|
||||||
@ -68,7 +70,7 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
public function setHealth($amount){
|
public function setHealth($amount){
|
||||||
$wasAlive = $this->isAlive();
|
$wasAlive = $this->isAlive();
|
||||||
parent::setHealth($amount);
|
parent::setHealth($amount);
|
||||||
$this->attributeMap->getAttribute(Attribute::HEALTH)->setValue($this->getHealth());
|
$this->attributeMap->getAttribute(Attribute::HEALTH)->setValue($this->getHealth(), true);
|
||||||
if($this->isAlive() and !$wasAlive){
|
if($this->isAlive() and !$wasAlive){
|
||||||
$pk = new EntityEventPacket();
|
$pk = new EntityEventPacket();
|
||||||
$pk->eid = $this->getId();
|
$pk->eid = $this->getId();
|
||||||
@ -98,7 +100,7 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
$this->namedtag->Health = new ShortTag("Health", $this->getHealth());
|
$this->namedtag->Health = new ShortTag("Health", $this->getHealth());
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract function getName();
|
abstract public function getName();
|
||||||
|
|
||||||
public function hasLineOfSight(Entity $entity){
|
public function hasLineOfSight(Entity $entity){
|
||||||
//TODO: head height
|
//TODO: head height
|
||||||
@ -115,6 +117,23 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
$this->attackTime = 0;
|
$this->attackTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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)->getAmplifier() + 1) / 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the entity jumps from the ground. This method adds upwards velocity to the entity.
|
||||||
|
*/
|
||||||
|
public function jump(){
|
||||||
|
if($this->onGround){
|
||||||
|
$this->motionY = $this->getJumpVelocity(); //Y motion should already be 0 if we're jumping from the ground.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function attack($damage, EntityDamageEvent $source){
|
public function attack($damage, EntityDamageEvent $source){
|
||||||
if($this->attackTime > 0 or $this->noDamageTicks > 0){
|
if($this->attackTime > 0 or $this->noDamageTicks > 0){
|
||||||
$lastCause = $this->getLastDamageCause();
|
$lastCause = $this->getLastDamageCause();
|
||||||
@ -183,6 +202,10 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
parent::kill();
|
parent::kill();
|
||||||
|
$this->callDeathEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function callDeathEvent(){
|
||||||
$this->server->getPluginManager()->callEvent($ev = new EntityDeathEvent($this, $this->getDrops()));
|
$this->server->getPluginManager()->callEvent($ev = new EntityDeathEvent($this, $this->getDrops()));
|
||||||
foreach($ev->getDrops() as $item){
|
foreach($ev->getDrops() as $item){
|
||||||
$this->getLevel()->dropItem($this, $item);
|
$this->getLevel()->dropItem($this, $item);
|
||||||
|
@ -43,8 +43,8 @@ class Squid extends WaterAnimal implements Ageable{
|
|||||||
private $switchDirectionTicker = 0;
|
private $switchDirectionTicker = 0;
|
||||||
|
|
||||||
public function initEntity(){
|
public function initEntity(){
|
||||||
|
$this->setMaxHealth(10);
|
||||||
parent::initEntity();
|
parent::initEntity();
|
||||||
$this->setMaxHealth(5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getName(){
|
public function getName(){
|
||||||
|
@ -34,19 +34,21 @@ class PlayerExhaustEvent extends PlayerEvent implements Cancellable{
|
|||||||
const CAUSE_HEALTH_REGEN = 4;
|
const CAUSE_HEALTH_REGEN = 4;
|
||||||
const CAUSE_POTION = 5;
|
const CAUSE_POTION = 5;
|
||||||
const CAUSE_WALKING = 6;
|
const CAUSE_WALKING = 6;
|
||||||
const CAUSE_SNEAKING = 7;
|
const CAUSE_SPRINTING = 7;
|
||||||
const CAUSE_SWIMMING = 8;
|
const CAUSE_SWIMMING = 8;
|
||||||
const CAUSE_JUMPING = 10;
|
const CAUSE_JUMPING = 9;
|
||||||
|
const CAUSE_SPRINT_JUMPING = 10;
|
||||||
const CAUSE_CUSTOM = 11;
|
const CAUSE_CUSTOM = 11;
|
||||||
|
|
||||||
const CAUSE_FLAG_SPRINT = 0x10000;
|
|
||||||
|
|
||||||
/** @var float */
|
/** @var float */
|
||||||
private $amount;
|
private $amount;
|
||||||
|
/** @var int */
|
||||||
|
private $cause;
|
||||||
|
|
||||||
public function __construct(Human $human, float $amount, int $cause){
|
public function __construct(Human $human, float $amount, int $cause){
|
||||||
$this->player = $human;
|
$this->player = $human;
|
||||||
$this->amount = $amount;
|
$this->amount = $amount;
|
||||||
|
$this->cause = $cause;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -63,4 +65,12 @@ class PlayerExhaustEvent extends PlayerEvent implements Cancellable{
|
|||||||
public function setAmount(float $amount){
|
public function setAmount(float $amount){
|
||||||
$this->amount = $amount;
|
$this->amount = $amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an int cause of the exhaustion - one of the constants at the top of this class.
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getCause() : int{
|
||||||
|
return $this->cause;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -685,7 +685,7 @@ class Item implements ItemIds, \JsonSerializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function setLore(array $lines){
|
public function setLore(array $lines){
|
||||||
$tag = $this->getNamedTag();
|
$tag = $this->getNamedTag() ?? new CompoundTag("", []);
|
||||||
if(!isset($tag->display)){
|
if(!isset($tag->display)){
|
||||||
$tag->display = new CompoundTag("display", []);
|
$tag->display = new CompoundTag("display", []);
|
||||||
}
|
}
|
||||||
@ -945,7 +945,7 @@ class Item implements ItemIds, \JsonSerializable{
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public final function equals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{
|
final public function equals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{
|
||||||
if($this->id === $item->getId() and ($checkDamage === false or $this->getDamage() === $item->getDamage())){
|
if($this->id === $item->getId() and ($checkDamage === false or $this->getDamage() === $item->getDamage())){
|
||||||
if($checkCompound){
|
if($checkCompound){
|
||||||
if($item->getCompoundTag() === $this->getCompoundTag()){
|
if($item->getCompoundTag() === $this->getCompoundTag()){
|
||||||
@ -971,7 +971,7 @@ class Item implements ItemIds, \JsonSerializable{
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public final function deepEquals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{
|
final public function deepEquals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{
|
||||||
return $this->equals($item, $checkDamage, $checkCompound);
|
return $this->equals($item, $checkDamage, $checkCompound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1544,6 +1544,25 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
$ev->setCancelled();
|
$ev->setCancelled();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($player->isAdventure(true) and !$ev->isCancelled()){
|
||||||
|
$tag = $item->getNamedTagEntry("CanDestroy");
|
||||||
|
$canBreak = false;
|
||||||
|
if($tag instanceof ListTag){
|
||||||
|
foreach($tag as $v){
|
||||||
|
if($v instanceof StringTag){
|
||||||
|
$entry = Item::fromString($v->getValue());
|
||||||
|
if($entry->getId() > 0 and $entry->getBlock() !== null and $entry->getBlock()->getId() === $target->getId()){
|
||||||
|
$canBreak = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ev->setCancelled(!$canBreak);
|
||||||
|
}
|
||||||
|
|
||||||
$this->server->getPluginManager()->callEvent($ev);
|
$this->server->getPluginManager()->callEvent($ev);
|
||||||
if($ev->isCancelled()){
|
if($ev->isCancelled()){
|
||||||
return false;
|
return false;
|
||||||
@ -1589,24 +1608,6 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tag = $item->getNamedTagEntry("CanDestroy");
|
|
||||||
if($tag instanceof ListTag){
|
|
||||||
$canBreak = false;
|
|
||||||
foreach($tag as $v){
|
|
||||||
if($v instanceof StringTag){
|
|
||||||
$entry = Item::fromString($v->getValue());
|
|
||||||
if($entry->getId() > 0 and $entry->getBlock() !== null and $entry->getBlock()->getId() === $target->getId()){
|
|
||||||
$canBreak = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$canBreak){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($createParticles){
|
if($createParticles){
|
||||||
$this->addParticle(new DestroyBlockParticle($target->add(0.5, 0.5, 0.5), $target));
|
$this->addParticle(new DestroyBlockParticle($target->add(0.5, 0.5, 0.5), $target));
|
||||||
}
|
}
|
||||||
@ -1681,6 +1682,25 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
$ev->setCancelled();
|
$ev->setCancelled();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($player->isAdventure(true) and !$ev->isCancelled()){
|
||||||
|
$canPlace = false;
|
||||||
|
$tag = $item->getNamedTagEntry("CanPlaceOn");
|
||||||
|
if($tag instanceof ListTag){
|
||||||
|
foreach($tag as $v){
|
||||||
|
if($v instanceof StringTag){
|
||||||
|
$entry = Item::fromString($v->getValue());
|
||||||
|
if($entry->getId() > 0 and $entry->getBlock() !== null and $entry->getBlock()->getId() === $target->getId()){
|
||||||
|
$canPlace = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ev->setCancelled(!$canPlace);
|
||||||
|
}
|
||||||
|
|
||||||
$this->server->getPluginManager()->callEvent($ev);
|
$this->server->getPluginManager()->callEvent($ev);
|
||||||
if(!$ev->isCancelled()){
|
if(!$ev->isCancelled()){
|
||||||
$target->onUpdate(self::BLOCK_UPDATE_TOUCH);
|
$target->onUpdate(self::BLOCK_UPDATE_TOUCH);
|
||||||
@ -1743,24 +1763,6 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tag = $item->getNamedTagEntry("CanPlaceOn");
|
|
||||||
if($tag instanceof ListTag){
|
|
||||||
$canPlace = false;
|
|
||||||
foreach($tag as $v){
|
|
||||||
if($v instanceof StringTag){
|
|
||||||
$entry = Item::fromString($v->getValue());
|
|
||||||
if($entry->getId() > 0 and $entry->getBlock() !== null and $entry->getBlock()->getId() === $target->getId()){
|
|
||||||
$canPlace = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$canPlace){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if($player !== null){
|
if($player !== null){
|
||||||
$ev = new BlockPlaceEvent($player, $hand, $block, $target, $item);
|
$ev = new BlockPlaceEvent($player, $hand, $block, $target, $item);
|
||||||
|
@ -101,7 +101,7 @@ class Anvil extends McRegion{
|
|||||||
public function nbtDeserialize(string $data){
|
public function nbtDeserialize(string $data){
|
||||||
$nbt = new NBT(NBT::BIG_ENDIAN);
|
$nbt = new NBT(NBT::BIG_ENDIAN);
|
||||||
try{
|
try{
|
||||||
$nbt->readCompressed($data, ZLIB_ENCODING_DEFLATE);
|
$nbt->readCompressed($data);
|
||||||
|
|
||||||
$chunk = $nbt->getData();
|
$chunk = $nbt->getData();
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ class McRegion extends BaseLevelProvider{
|
|||||||
public function nbtDeserialize(string $data){
|
public function nbtDeserialize(string $data){
|
||||||
$nbt = new NBT(NBT::BIG_ENDIAN);
|
$nbt = new NBT(NBT::BIG_ENDIAN);
|
||||||
try{
|
try{
|
||||||
$nbt->readCompressed($data, ZLIB_ENCODING_DEFLATE);
|
$nbt->readCompressed($data);
|
||||||
|
|
||||||
$chunk = $nbt->getData();
|
$chunk = $nbt->getData();
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ class PMAnvil extends Anvil{
|
|||||||
public function nbtDeserialize(string $data){
|
public function nbtDeserialize(string $data){
|
||||||
$nbt = new NBT(NBT::BIG_ENDIAN);
|
$nbt = new NBT(NBT::BIG_ENDIAN);
|
||||||
try{
|
try{
|
||||||
$nbt->readCompressed($data, ZLIB_ENCODING_DEFLATE);
|
$nbt->readCompressed($data);
|
||||||
|
|
||||||
$chunk = $nbt->getData();
|
$chunk = $nbt->getData();
|
||||||
|
|
||||||
|
@ -233,17 +233,17 @@ abstract class Generator{
|
|||||||
return $noiseArray;
|
return $noiseArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract function __construct(array $settings = []);
|
abstract public function __construct(array $settings = []);
|
||||||
|
|
||||||
public abstract function init(ChunkManager $level, Random $random);
|
abstract public function init(ChunkManager $level, Random $random);
|
||||||
|
|
||||||
public abstract function generateChunk($chunkX, $chunkZ);
|
abstract public function generateChunk($chunkX, $chunkZ);
|
||||||
|
|
||||||
public abstract function populateChunk($chunkX, $chunkZ);
|
abstract public function populateChunk($chunkX, $chunkZ);
|
||||||
|
|
||||||
public abstract function getSettings();
|
abstract public function getSettings();
|
||||||
|
|
||||||
public abstract function getName();
|
abstract public function getName();
|
||||||
|
|
||||||
public abstract function getSpawn();
|
abstract public function getSpawn();
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,7 @@ abstract class Biome{
|
|||||||
return $this->id;
|
return $this->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract function getName();
|
abstract public function getName();
|
||||||
|
|
||||||
public function getMinElevation(){
|
public function getMinElevation(){
|
||||||
return $this->minElevation;
|
return $this->minElevation;
|
||||||
|
@ -28,5 +28,5 @@ use pocketmine\level\ChunkManager;
|
|||||||
use pocketmine\utils\Random;
|
use pocketmine\utils\Random;
|
||||||
|
|
||||||
abstract class Populator{
|
abstract class Populator{
|
||||||
public abstract function populate(ChunkManager $level, $chunkX, $chunkZ, Random $random);
|
abstract public function populate(ChunkManager $level, $chunkX, $chunkZ, Random $random);
|
||||||
}
|
}
|
@ -136,5 +136,5 @@ abstract class MetadataStore{
|
|||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
*/
|
*/
|
||||||
public abstract function disambiguate(Metadatable $subject, $metadataKey);
|
abstract public function disambiguate(Metadatable $subject, $metadataKey);
|
||||||
}
|
}
|
@ -43,11 +43,11 @@ abstract class MetadataValue{
|
|||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public abstract function value();
|
abstract public function value();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invalidates this metadata item, forcing it to recompute when next
|
* Invalidates this metadata item, forcing it to recompute when next
|
||||||
* accessed.
|
* accessed.
|
||||||
*/
|
*/
|
||||||
public abstract function invalidate();
|
abstract public function invalidate();
|
||||||
}
|
}
|
@ -423,11 +423,11 @@ class NBT{
|
|||||||
$this->buffer = "";
|
$this->buffer = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function readCompressed($buffer, $compression = ZLIB_ENCODING_GZIP){
|
public function readCompressed($buffer){
|
||||||
$this->read(zlib_decode($buffer));
|
$this->read(zlib_decode($buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function readNetworkCompressed($buffer, $compression = ZLIB_ENCODING_GZIP){
|
public function readNetworkCompressed($buffer){
|
||||||
$this->read(zlib_decode($buffer), false, true);
|
$this->read(zlib_decode($buffer), false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ abstract class Tag extends \stdClass{
|
|||||||
return $this->value;
|
return $this->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract function getType();
|
abstract public function getType();
|
||||||
|
|
||||||
public function setValue($value){
|
public function setValue($value){
|
||||||
$this->value = $value;
|
$this->value = $value;
|
||||||
|
@ -72,14 +72,14 @@ abstract class PluginBase implements Plugin{
|
|||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public final function isEnabled(){
|
final public function isEnabled(){
|
||||||
return $this->isEnabled === true;
|
return $this->isEnabled === true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param bool $boolean
|
* @param bool $boolean
|
||||||
*/
|
*/
|
||||||
public final function setEnabled($boolean = true){
|
final public function setEnabled($boolean = true){
|
||||||
if($this->isEnabled !== $boolean){
|
if($this->isEnabled !== $boolean){
|
||||||
$this->isEnabled = $boolean;
|
$this->isEnabled = $boolean;
|
||||||
if($this->isEnabled === true){
|
if($this->isEnabled === true){
|
||||||
@ -93,19 +93,19 @@ abstract class PluginBase implements Plugin{
|
|||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public final function isDisabled(){
|
final public function isDisabled(){
|
||||||
return $this->isEnabled === false;
|
return $this->isEnabled === false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final function getDataFolder(){
|
final public function getDataFolder(){
|
||||||
return $this->dataFolder;
|
return $this->dataFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final function getDescription(){
|
final public function getDescription(){
|
||||||
return $this->description;
|
return $this->description;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final function init(PluginLoader $loader, Server $server, PluginDescription $description, $dataFolder, $file){
|
final public function init(PluginLoader $loader, Server $server, PluginDescription $description, $dataFolder, $file){
|
||||||
if($this->initialized === false){
|
if($this->initialized === false){
|
||||||
$this->initialized = true;
|
$this->initialized = true;
|
||||||
$this->loader = $loader;
|
$this->loader = $loader;
|
||||||
@ -128,7 +128,7 @@ abstract class PluginBase implements Plugin{
|
|||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public final function isInitialized(){
|
final public function isInitialized(){
|
||||||
return $this->initialized;
|
return $this->initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,21 +267,21 @@ abstract class PluginBase implements Plugin{
|
|||||||
/**
|
/**
|
||||||
* @return Server
|
* @return Server
|
||||||
*/
|
*/
|
||||||
public final function getServer(){
|
final public function getServer(){
|
||||||
return $this->server;
|
return $this->server;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public final function getName(){
|
final public function getName(){
|
||||||
return $this->description->getName();
|
return $this->description->getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public final function getFullName(){
|
final public function getFullName(){
|
||||||
return $this->description->getFullName();
|
return $this->description->getFullName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ abstract class AsyncTask extends Collectable{
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public abstract function onRun();
|
abstract public function onRun();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Actions to execute when completed (on main thread)
|
* Actions to execute when completed (on main thread)
|
||||||
|
@ -41,7 +41,7 @@ abstract class PluginTask extends Task{
|
|||||||
/**
|
/**
|
||||||
* @return Plugin
|
* @return Plugin
|
||||||
*/
|
*/
|
||||||
public final function getOwner(){
|
final public function getOwner(){
|
||||||
return $this->owner;
|
return $this->owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,14 +32,14 @@ abstract class Task{
|
|||||||
/**
|
/**
|
||||||
* @return TaskHandler
|
* @return TaskHandler
|
||||||
*/
|
*/
|
||||||
public final function getHandler(){
|
final public function getHandler(){
|
||||||
return $this->taskHandler;
|
return $this->taskHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public final function getTaskId(){
|
final public function getTaskId(){
|
||||||
if($this->taskHandler !== null){
|
if($this->taskHandler !== null){
|
||||||
return $this->taskHandler->getTaskId();
|
return $this->taskHandler->getTaskId();
|
||||||
}
|
}
|
||||||
@ -50,7 +50,7 @@ abstract class Task{
|
|||||||
/**
|
/**
|
||||||
* @param TaskHandler $taskHandler
|
* @param TaskHandler $taskHandler
|
||||||
*/
|
*/
|
||||||
public final function setHandler($taskHandler){
|
final public function setHandler($taskHandler){
|
||||||
if($this->taskHandler === null or $taskHandler === null){
|
if($this->taskHandler === null or $taskHandler === null){
|
||||||
$this->taskHandler = $taskHandler;
|
$this->taskHandler = $taskHandler;
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ abstract class Task{
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public abstract function onRun($currentTick);
|
abstract public function onRun($currentTick);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Actions to execute if the Task is cancelled
|
* Actions to execute if the Task is cancelled
|
||||||
|
@ -75,7 +75,7 @@ abstract class Spawnable extends Tile{
|
|||||||
/**
|
/**
|
||||||
* @return CompoundTag
|
* @return CompoundTag
|
||||||
*/
|
*/
|
||||||
public abstract function getSpawnCompound();
|
abstract public function getSpawnCompound();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a player updates a block entity's NBT data
|
* Called when a player updates a block entity's NBT data
|
||||||
|
@ -170,7 +170,7 @@ abstract class Tile extends Position{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final function scheduleUpdate(){
|
final public function scheduleUpdate(){
|
||||||
$this->level->updateTiles[$this->id] = $this;
|
$this->level->updateTiles[$this->id] = $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user