mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-13 23:15:29 +00:00
Sign: implement waxing using honeycomb
This commit is contained in:
parent
d44e0e87d0
commit
22778583cf
@ -49,6 +49,8 @@ abstract class BaseSign extends Transparent{
|
|||||||
use WoodTypeTrait;
|
use WoodTypeTrait;
|
||||||
|
|
||||||
protected SignText $text;
|
protected SignText $text;
|
||||||
|
private bool $waxed = false;
|
||||||
|
|
||||||
protected ?int $editorEntityRuntimeId = null;
|
protected ?int $editorEntityRuntimeId = null;
|
||||||
|
|
||||||
/** @var \Closure() : Item */
|
/** @var \Closure() : Item */
|
||||||
@ -69,6 +71,7 @@ abstract class BaseSign extends Transparent{
|
|||||||
$tile = $this->position->getWorld()->getTile($this->position);
|
$tile = $this->position->getWorld()->getTile($this->position);
|
||||||
if($tile instanceof TileSign){
|
if($tile instanceof TileSign){
|
||||||
$this->text = $tile->getText();
|
$this->text = $tile->getText();
|
||||||
|
$this->waxed = $tile->isWaxed();
|
||||||
$this->editorEntityRuntimeId = $tile->getEditorEntityRuntimeId();
|
$this->editorEntityRuntimeId = $tile->getEditorEntityRuntimeId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +83,7 @@ abstract class BaseSign extends Transparent{
|
|||||||
$tile = $this->position->getWorld()->getTile($this->position);
|
$tile = $this->position->getWorld()->getTile($this->position);
|
||||||
assert($tile instanceof TileSign);
|
assert($tile instanceof TileSign);
|
||||||
$tile->setText($this->text);
|
$tile->setText($this->text);
|
||||||
|
$tile->setWaxed($this->waxed);
|
||||||
$tile->setEditorEntityRuntimeId($this->editorEntityRuntimeId);
|
$tile->setEditorEntityRuntimeId($this->editorEntityRuntimeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,10 +151,26 @@ abstract class BaseSign extends Transparent{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function wax(Player $player, Item $item) : bool{
|
||||||
|
if($this->waxed){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->waxed = true;
|
||||||
|
$this->position->getWorld()->setBlock($this->position, $this);
|
||||||
|
$item->pop();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{
|
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{
|
||||||
if($player === null){
|
if($player === null){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if($this->waxed){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
$dyeColor = $item instanceof Dye ? $item->getColor() : match($item->getTypeId()){
|
$dyeColor = $item instanceof Dye ? $item->getColor() : match($item->getTypeId()){
|
||||||
ItemTypeIds::BONE_MEAL => DyeColor::WHITE(),
|
ItemTypeIds::BONE_MEAL => DyeColor::WHITE(),
|
||||||
ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(),
|
ItemTypeIds::LAPIS_LAZULI => DyeColor::BLUE(),
|
||||||
@ -169,12 +189,12 @@ abstract class BaseSign extends Transparent{
|
|||||||
}elseif(match($item->getTypeId()){
|
}elseif(match($item->getTypeId()){
|
||||||
ItemTypeIds::INK_SAC => $this->changeSignGlowingState(false, $player, $item),
|
ItemTypeIds::INK_SAC => $this->changeSignGlowingState(false, $player, $item),
|
||||||
ItemTypeIds::GLOW_INK_SAC => $this->changeSignGlowingState(true, $player, $item),
|
ItemTypeIds::GLOW_INK_SAC => $this->changeSignGlowingState(true, $player, $item),
|
||||||
|
ItemTypeIds::HONEYCOMB => $this->wax($player, $item),
|
||||||
default => false
|
default => false
|
||||||
}){
|
}){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: editor should not open for waxed signs
|
|
||||||
$player->openSignEditor($this->position);
|
$player->openSignEditor($this->position);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -193,6 +213,17 @@ abstract class BaseSign extends Transparent{
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the sign has been waxed using a honeycomb. If true, the sign cannot be edited by a player.
|
||||||
|
*/
|
||||||
|
public function isWaxed() : bool{ return $this->waxed; }
|
||||||
|
|
||||||
|
/** @return $this */
|
||||||
|
public function setWaxed(bool $waxed) : self{
|
||||||
|
$this->waxed = $waxed;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the runtime entity ID of the player editing this sign. Only this player will be able to edit the sign.
|
* Sets the runtime entity ID of the player editing this sign. Only this player will be able to edit the sign.
|
||||||
* This is used to prevent multiple players from editing the same sign at the same time, and to prevent players
|
* This is used to prevent multiple players from editing the same sign at the same time, and to prevent players
|
||||||
@ -223,7 +254,7 @@ abstract class BaseSign extends Transparent{
|
|||||||
$ev = new SignChangeEvent($this, $author, new SignText(array_map(function(string $line) : string{
|
$ev = new SignChangeEvent($this, $author, new SignText(array_map(function(string $line) : string{
|
||||||
return TextFormat::clean($line, false);
|
return TextFormat::clean($line, false);
|
||||||
}, $text->getLines()), $this->text->getBaseColor(), $this->text->isGlowing()));
|
}, $text->getLines()), $this->text->getBaseColor(), $this->text->isGlowing()));
|
||||||
if($this->editorEntityRuntimeId === null || $this->editorEntityRuntimeId !== $author->getId()){
|
if($this->waxed || $this->editorEntityRuntimeId === null || $this->editorEntityRuntimeId !== $author->getId()){
|
||||||
$ev->cancel();
|
$ev->cancel();
|
||||||
}
|
}
|
||||||
$ev->call();
|
$ev->call();
|
||||||
|
@ -68,6 +68,8 @@ class Sign extends Spawnable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected SignText $text;
|
protected SignText $text;
|
||||||
|
private bool $waxed = false;
|
||||||
|
|
||||||
protected ?int $editorEntityRuntimeId = null;
|
protected ?int $editorEntityRuntimeId = null;
|
||||||
|
|
||||||
public function __construct(World $world, Vector3 $pos){
|
public function __construct(World $world, Vector3 $pos){
|
||||||
@ -101,6 +103,7 @@ class Sign extends Spawnable{
|
|||||||
}
|
}
|
||||||
$this->text = new SignText($text);
|
$this->text = new SignText($text);
|
||||||
}
|
}
|
||||||
|
$this->waxed = $nbt->getByte(self::TAG_WAXED, 0) !== 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function writeSaveData(CompoundTag $nbt) : void{
|
protected function writeSaveData(CompoundTag $nbt) : void{
|
||||||
@ -113,6 +116,7 @@ class Sign extends Spawnable{
|
|||||||
$nbt->setInt(self::TAG_TEXT_COLOR, Binary::signInt($this->text->getBaseColor()->toARGB()));
|
$nbt->setInt(self::TAG_TEXT_COLOR, Binary::signInt($this->text->getBaseColor()->toARGB()));
|
||||||
$nbt->setByte(self::TAG_GLOWING_TEXT, $this->text->isGlowing() ? 1 : 0);
|
$nbt->setByte(self::TAG_GLOWING_TEXT, $this->text->isGlowing() ? 1 : 0);
|
||||||
$nbt->setByte(self::TAG_LEGACY_BUG_RESOLVE, 1);
|
$nbt->setByte(self::TAG_LEGACY_BUG_RESOLVE, 1);
|
||||||
|
$nbt->setByte(self::TAG_WAXED, $this->waxed ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getText() : SignText{
|
public function getText() : SignText{
|
||||||
@ -123,6 +127,10 @@ class Sign extends Spawnable{
|
|||||||
$this->text = $text;
|
$this->text = $text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isWaxed() : bool{ return $this->waxed; }
|
||||||
|
|
||||||
|
public function setWaxed(bool $waxed) : void{ $this->waxed = $waxed; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the entity runtime ID of the player who placed this sign. Only the player whose entity ID matches this
|
* Returns the entity runtime ID of the player who placed this sign. Only the player whose entity ID matches this
|
||||||
* one may edit the sign text.
|
* one may edit the sign text.
|
||||||
@ -153,7 +161,7 @@ class Sign extends Spawnable{
|
|||||||
->setByte(self::TAG_GLOWING_TEXT, 0)
|
->setByte(self::TAG_GLOWING_TEXT, 0)
|
||||||
->setByte(self::TAG_PERSIST_FORMATTING, 1)
|
->setByte(self::TAG_PERSIST_FORMATTING, 1)
|
||||||
);
|
);
|
||||||
$nbt->setByte(self::TAG_WAXED, 0);
|
$nbt->setByte(self::TAG_WAXED, $this->waxed ? 1 : 0);
|
||||||
$nbt->setLong(self::TAG_LOCKED_FOR_EDITING_BY, $this->editorEntityRuntimeId ?? -1);
|
$nbt->setLong(self::TAG_LOCKED_FOR_EDITING_BY, $this->editorEntityRuntimeId ?? -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user