Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
.idea
.idea/*
4 changes: 4 additions & 0 deletions .poggit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ projects:
path: ""
model: virion
type: library
libs:
- src: thebigsmilexd/libblockstate/libblockstate
version: ^0.1.2
branch: master
...
174 changes: 100 additions & 74 deletions src/xenialdan/dump.md
Original file line number Diff line number Diff line change
@@ -1,75 +1,101 @@
# NBT format output of exported.mcstructure
```
TAG_Compound({
'structure_world_origin': TAG_List<TAG_Int>({
1,
4,
0,
}),
'format_version': TAG_Int(1),
'size': TAG_List<TAG_Int>({
1,
1,
14,
}),
'structure': TAG_Compound({
'block_indices': TAG_List<TAG_List<TAG_Int>>({
{
0,
1,
0,
1,
0,
1,
0,
1,
1,
0,
1,
0,
1,
0,
},
{
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
},
}),
'entities': TAG_List<nil>({
}),
'palette': TAG_Compound({
'default': TAG_Compound({
'block_palette': TAG_List<TAG_Compound>({
{
'name': TAG_String(minecraft:air),
'states': TAG_Compound({
}),
'version': TAG_Int(17760256),
},
{
'name': TAG_String(minecraft:stained_glass),
'states': TAG_Compound({
'color': TAG_String(white),
}),
'version': TAG_Int(17760256),
},
}),
'block_position_data': TAG_Compound({
}),
}),
}),
}),
})
# NBT format output of room_1.mcstructure

```
TAG_Compound={
"format_version" => TAG_Int=1
"size" => TAG_List={
TAG_Int=2
TAG_Int=2
TAG_Int=2
}
"structure" => TAG_Compound={
"block_indices" => TAG_List={
TAG_List={
TAG_Int=0
TAG_Int=0
TAG_Int=1
TAG_Int=2
TAG_Int=2
TAG_Int=2
TAG_Int=3
TAG_Int=4
}
TAG_List={
TAG_Int=-1
TAG_Int=-1
TAG_Int=-1
TAG_Int=-1
TAG_Int=-1
TAG_Int=-1
TAG_Int=-1
TAG_Int=-1
}
}
"entities" => TAG_List={
}
"palette" => TAG_Compound={
"default" => TAG_Compound={
"block_palette" => TAG_List={
TAG_Compound={
"name" => TAG_String="minecraft:planks"
"states" => TAG_Compound={
"wood_type" => TAG_String="oak"
}
"version" => TAG_Int=17959425
}
TAG_Compound={
"name" => TAG_String="minecraft:log"
"states" => TAG_Compound={
"old_log_type" => TAG_String="oak"
"pillar_axis" => TAG_String="y"
}
"version" => TAG_Int=17959425
}
TAG_Compound={
"name" => TAG_String="minecraft:stonebrick"
"states" => TAG_Compound={
"stone_brick_type" => TAG_String="default"
}
"version" => TAG_Int=17959425
}
TAG_Compound={
"name" => TAG_String="minecraft:air"
"states" => TAG_Compound={
}
"version" => TAG_Int=17959425
}
TAG_Compound={
"name" => TAG_String="minecraft:jigsaw"
"states" => TAG_Compound={
"facing_direction" => TAG_Int=4
"rotation" => TAG_Int=0
}
"version" => TAG_Int=17959425
}
}
"block_position_data" => TAG_Compound={
"1072" => TAG_Compound={
"block_entity_data" => TAG_Compound={
"final_state" => TAG_String="minecraft:air"
"id" => TAG_String="JigsawBlock"
"isMovable" => TAG_Byte=1
"joint" => TAG_String="aligned"
"name" => TAG_String="test:connector"
"target" => TAG_String="test:connector"
"target_pool" => TAG_String="test:tunnel"
"x" => TAG_Int=-18
"y" => TAG_Int=4
"z" => TAG_Int=103
}
}
}
}
}
}
"structure_world_origin" => TAG_List={
TAG_Int=-32
TAG_Int=3
TAG_Int=96
}
}
```
79 changes: 35 additions & 44 deletions src/xenialdan/libstructure/PacketListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
use pocketmine\event\Listener;
use pocketmine\event\server\DataPacketReceiveEvent;
use pocketmine\network\mcpe\protocol\StructureBlockUpdatePacket;
use pocketmine\network\mcpe\protocol\StructureTemplateDataRequestPacket;
use pocketmine\network\mcpe\protocol\StructureTemplateDataResponsePacket;
use pocketmine\plugin\Plugin;
use pocketmine\plugin\PluginException;
use RuntimeException;
Expand All @@ -20,55 +18,50 @@
use xenialdan\libstructure\tile\StructureBlockTile;
use xenialdan\libstructure\window\StructureBlockInventory;

class PacketListener implements Listener
{
class PacketListener implements Listener{
/** @var Plugin|null */
private static ?Plugin $registrant = null;

public static function isRegistered(): bool
{
public static function isRegistered() : bool{
return self::$registrant instanceof Plugin;
}

public static function getRegistrant(): Plugin
{
public static function getRegistrant() : Plugin{
return self::$registrant;
}

public static function unregister(): void
{
public static function unregister() : void{
self::$registrant = null;
}

/**
* @param Plugin $plugin
* @throws PluginException|RuntimeException
*
* @throws PluginException|RuntimeException|InvalidArgumentException
*/
public static function register(Plugin $plugin): void
{
if (self::isRegistered()) {
public static function register(Plugin $plugin) : void{
if(self::isRegistered()){
return;//silent return
}

self::$registrant = $plugin;
try {
TileFactory::getInstance()->register(StructureBlockTile::class, [StructureBlockTags::TAG_ID, "minecraft:structure_block"]);
BlockFactory::getInstance()->register(new StructureBlock(new BlockIdentifier(BlockLegacyIds::STRUCTURE_BLOCK,0, null, StructureBlockTile::class), "Structure Block"), true);
} catch (InvalidArgumentException) {
}
/** @var TileFactory $tileFactory */
$tileFactory = TileFactory::getInstance();
$tileFactory->register(StructureBlockTile::class, [StructureBlockTags::TAG_ID, "minecraft:structure_block"]);
/** @var BlockFactory $blockFactory */
$blockFactory = BlockFactory::getInstance();
$blockFactory->register(new StructureBlock(new BlockIdentifier(BlockLegacyIds::STRUCTURE_BLOCK, 0, null, StructureBlockTile::class), "Structure Block"), true);
$plugin->getServer()->getPluginManager()->registerEvents(new self, $plugin);
}

public function onDataPacketReceiveEvent(DataPacketReceiveEvent $e)
{
if ($e->getPacket() instanceof StructureBlockUpdatePacket) $this->onStructureBlockUpdatePacket($e);
public function onDataPacketReceiveEvent(DataPacketReceiveEvent $e){
if($e->getPacket() instanceof StructureBlockUpdatePacket) $this->onStructureBlockUpdatePacket($e);
//if ($e->getPacket() instanceof StructureTemplateDataRequestPacket) $this->onStructureTemplateDataExportRequestPacket($e);
//if ($e->getPacket() instanceof StructureTemplateDataResponsePacket) $this->onStructureTemplateDataExportResponsePacket($e);
}

private function onStructureBlockUpdatePacket(DataPacketReceiveEvent $e)
{
if (!$e->getPacket() instanceof StructureBlockUpdatePacket) return;
private function onStructureBlockUpdatePacket(DataPacketReceiveEvent $e){
if(!$e->getPacket() instanceof StructureBlockUpdatePacket) return;
//** @var StructureBlockUpdatePacket $pk */
#var_dump($e->getPacket());//TODO remove
$session = $e->getOrigin();
Expand All @@ -79,23 +72,21 @@ private function onStructureBlockUpdatePacket(DataPacketReceiveEvent $e)
}
}

private function onStructureTemplateDataExportRequestPacket(DataPacketReceiveEvent $e)
{
/** @var StructureTemplateDataRequestPacket $pk */
$pk = $e->getPacket();
#$player = $e->getOrigin()->getPlayer();
if ($pk instanceof StructureTemplateDataRequestPacket) {
var_dump($pk);//TODO remove
}
}

private function onStructureTemplateDataExportResponsePacket(DataPacketReceiveEvent $e)
{
/** @var StructureTemplateDataResponsePacket $pk */
$pk = $e->getPacket();
#$player = $e->getOrigin()->getPlayer();
if ($pk instanceof StructureTemplateDataResponsePacket) {
var_dump($pk);//TODO remove
}
}
// private function onStructureTemplateDataExportRequestPacket(DataPacketReceiveEvent $e){
// /** @var StructureTemplateDataRequestPacket $pk */
// $pk = $e->getPacket();
// #$player = $e->getOrigin()->getPlayer();
// if($pk instanceof StructureTemplateDataRequestPacket){
// var_dump($pk);//TODO remove
// }
// }
//
// private function onStructureTemplateDataExportResponsePacket(DataPacketReceiveEvent $e){
// /** @var StructureTemplateDataResponsePacket $pk */
// $pk = $e->getPacket();
// #$player = $e->getOrigin()->getPlayer();
// if($pk instanceof StructureTemplateDataResponsePacket){
// var_dump($pk);//TODO remove
// }
// }
}
28 changes: 17 additions & 11 deletions src/xenialdan/libstructure/block/StructureBlock.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,27 @@

namespace xenialdan\libstructure\block;

use InvalidArgumentException;
use LogicException;
use pocketmine\block\Block;
use pocketmine\block\BlockBreakInfo;
use pocketmine\block\BlockIdentifier;
use pocketmine\item\Item;
use pocketmine\math\Vector3;
use pocketmine\network\mcpe\protocol\ContainerOpenPacket;
use pocketmine\network\mcpe\protocol\types\BlockPosition;
use pocketmine\network\mcpe\protocol\types\inventory\WindowTypes;
use pocketmine\network\mcpe\protocol\types\StructureEditorData;
use pocketmine\player\Player;
use pocketmine\utils\AssumptionFailedError;
use xenialdan\libstructure\tile\StructureBlockTile as TileStructureBlock;

class StructureBlock extends Block
{
private int $mode = StructureEditorData::TYPE_SAVE;//TODO validate if correct
class StructureBlock extends Block{
#private int $mode = StructureEditorData::TYPE_SAVE;//TODO validate if correct

public function __construct(BlockIdentifier $idInfo, string $name, ?BlockBreakInfo $breakInfo = null)
{
/**
* @throws InvalidArgumentException
*/
public function __construct(BlockIdentifier $idInfo, string $name, ?BlockBreakInfo $breakInfo = null){
parent::__construct($idInfo, $name, $breakInfo ?? BlockBreakInfo::indestructible());
}

Expand All @@ -38,15 +42,17 @@ public function getStateBitmask() : int{
return 0b101;
}

public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null): bool
{
if ($player instanceof Player) {
/**
* @throws LogicException|InvalidArgumentException|AssumptionFailedError
*/
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
if($player instanceof Player){
$structureBlock = $this->position->getWorld()->getTile($this->position);
if ($structureBlock instanceof TileStructureBlock and $player->isCreative(true)) {
if($structureBlock instanceof TileStructureBlock and $player->isCreative(true)){
$player->setCurrentWindow($structureBlock->getInventory());
//TODO remove once PMMP allows injecting to InventoryManager::createContainerOpen
$id = $player->getNetworkSession()->getInvManager()->getCurrentWindowId();
$pk = ContainerOpenPacket::blockInvVec3($id, WindowTypes::STRUCTURE_EDITOR, $this->position->asVector3());
$pk = ContainerOpenPacket::blockInv($id, WindowTypes::STRUCTURE_EDITOR, BlockPosition::fromVector3($this->position->asVector3()));
$player->getNetworkSession()->sendDataPacket($pk);
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/xenialdan/libstructure/exception/StructureException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use Exception;

abstract class StructureException extends Exception
{
abstract class StructureException extends Exception{

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

namespace xenialdan\libstructure\exception;

class StructureFileException extends StructureException
{
class StructureFileException extends StructureException{

}
Loading