Sign: implement waxing using honeycomb

This commit is contained in:
Dylan K. Taylor 2023-08-21 16:28:17 +01:00
parent d44e0e87d0
commit 22778583cf
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
2 changed files with 42 additions and 3 deletions

View File

@ -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();

View File

@ -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);
} }
} }