mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-22 00:33:59 +00:00
Door Placement, Breaking and Activation
This commit is contained in:
parent
9cdd616852
commit
a5651c0f43
@ -199,16 +199,13 @@ class BlockAPI{
|
||||
}
|
||||
break;
|
||||
}*/
|
||||
$target->onBreak($this, $item, $player);
|
||||
|
||||
if(count($drops) > 0){
|
||||
foreach($drops as $drop){
|
||||
$this->drop($target->x, $target->y, $target->z, $drop[0] & 0xFFFF, $drop[1] & 0xFFFF, $drop[2] & 0xFF);
|
||||
}
|
||||
}
|
||||
$this->server->trigger("player.block.break", array(
|
||||
"block" => $target,
|
||||
"player" => $player,
|
||||
"item" => $item,
|
||||
));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -347,46 +344,6 @@ class BlockAPI{
|
||||
$cancelPlace = true;
|
||||
}
|
||||
break;
|
||||
case 64: //Door
|
||||
if(($target[1] & 0x08) === 0x08){
|
||||
$down = $this->server->api->level->getBlock($data["x"], $data["y"] - 1, $data["z"]);
|
||||
if($down[0] === 64){
|
||||
$down[1] = $down[1] ^ 0x04;
|
||||
$data2 = array(
|
||||
"x" => $data["x"],
|
||||
"z" => $data["z"],
|
||||
"y" => $data["y"] - 1,
|
||||
"block" => $down[0],
|
||||
"meta" => $down[1],
|
||||
"eid" => $data["eid"],
|
||||
);
|
||||
if($this->server->handle("player.block.update", $data2) !== false){
|
||||
$this->updateBlocksAround($data["x"], $data["y"], $data["z"], BLOCK_UPDATE_NORMAL);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$data["block"] = $target[0];
|
||||
$data["meta"] = $target[1] ^ 0x04;
|
||||
if($this->server->handle("player.block.update", $data) !== false){
|
||||
$up = $this->server->api->level->getBlock($data["x"], $data["y"] + 1, $data["z"]);
|
||||
if($up[0] === 64){
|
||||
$data2 = $data;
|
||||
$data2["meta"] = $up[1];
|
||||
++$data2["y"];
|
||||
$this->updateBlocksAround($data2["x"], $data2["y"], $data2["z"], BLOCK_UPDATE_NORMAL);
|
||||
}
|
||||
$this->updateBlocksAround($data["x"], $data["y"], $data["z"], BLOCK_UPDATE_NORMAL);
|
||||
}
|
||||
}
|
||||
$cancelPlace = true;
|
||||
break;
|
||||
case 96: //Trapdoor
|
||||
case 107: //Fence gates
|
||||
$data["block"] = $target[0];
|
||||
$data["meta"] = $target[1] ^ 0x04;
|
||||
$this->server->handle("player.block.update", $data);
|
||||
$cancelPlace = true;
|
||||
break;
|
||||
default:
|
||||
$cancelPlace = true;
|
||||
break;
|
||||
@ -438,42 +395,6 @@ class BlockAPI{
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 107: //Fence gate
|
||||
$faces = array(
|
||||
0 => 3,
|
||||
1 => 0,
|
||||
2 => 1,
|
||||
3 => 2,
|
||||
);
|
||||
$data["meta"] = $faces[$direction] & 0x03;
|
||||
break;
|
||||
case 64://Door placing
|
||||
case 71:
|
||||
if($data["face"] !== 1){
|
||||
return false;
|
||||
}
|
||||
$blockUp = $this->server->api->level->getBlock($data["x"], $data["y"] + 1, $data["z"]);
|
||||
$blockDown = $this->server->api->level->getBlock($data["x"], $data["y"] - 1, $data["z"]);
|
||||
if(!isset(Material::$replaceable[$blockUp[0]]) or isset(Material::$transparent[$blockDown[0]])){
|
||||
return false;
|
||||
}else{
|
||||
$data2 = $data;
|
||||
$data2["meta"] = 0x08;
|
||||
$data["meta"] = $direction & 0x03;
|
||||
$face = array(
|
||||
0 => 3,
|
||||
1 => 4,
|
||||
2 => 2,
|
||||
3 => 5,
|
||||
);
|
||||
$next = $this->server->api->level->getBlockFace($block, $face[(($direction + 2) % 4)]);
|
||||
if($next[0] === $data["block"]){ //Door hinge
|
||||
$data2["meta"] = $data2["meta"] | 0x01;
|
||||
}
|
||||
++$data2["y"];
|
||||
$this->server->handle("player.block.place", $data2);
|
||||
}
|
||||
break;
|
||||
case 54:
|
||||
case 61:
|
||||
$faces = array(
|
||||
@ -561,7 +482,9 @@ class BlockAPI{
|
||||
break;
|
||||
}
|
||||
*/
|
||||
|
||||
if($this->server->gamemode === 0 or $this->server->gamemode === 2){
|
||||
$player->removeItem($item->getID(), $item->getMetadata(), 1);
|
||||
}
|
||||
//$this->server->handle("player.block.place", $data);
|
||||
return false;
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ abstract class Block{
|
||||
COBBLESTONE_STAIRS => "CobblestoneStairsBlock",
|
||||
WALL_SIGN => "WallSignBlock",
|
||||
|
||||
IRON_DOOR => "IronDoorBlock",
|
||||
IRON_DOOR_BLOCK => "IronDoorBlock",
|
||||
REDSTONE_ORE => "RedstoneOreBlock",
|
||||
GLOWING_REDSTONE_ORE => "GlowingRedstoneOreBlock",
|
||||
|
||||
@ -182,6 +182,8 @@ abstract class Block{
|
||||
);
|
||||
}
|
||||
|
||||
abstract function onBreak(BlockAPI $level, Item $item, Player $player);
|
||||
|
||||
abstract function place(BlockAPI $level, Item $item, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz);
|
||||
|
||||
abstract function onActivate(BlockAPI $level, Item $item, Player $player);
|
||||
@ -195,3 +197,4 @@ require_once("block/TransparentBlock.php");
|
||||
require_once("block/FallableBlock.php");
|
||||
require_once("block/LiquidBlock.php");
|
||||
require_once("block/StairBlock.php");
|
||||
require_once("block/DoorBlock.php");
|
||||
|
@ -111,6 +111,7 @@ define("COBBLESTONE_STAIRS", 67);
|
||||
define("WALL_SIGN", 68);
|
||||
|
||||
define("IRON_DOOR", 71);
|
||||
define("IRON_DOOR_BLOCK", 71);
|
||||
|
||||
define("REDSTONE_ORE", 73);
|
||||
define("GLOWING_REDSTONE_ORE", 74);
|
||||
|
95
src/classes/material/block/DoorBlock.php
Normal file
95
src/classes/material/block/DoorBlock.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
|
||||
-
|
||||
/ \
|
||||
/ \
|
||||
/ PocketMine \
|
||||
/ MP \
|
||||
|\ @shoghicp /|
|
||||
|. \ / .|
|
||||
| .. \ / .. |
|
||||
| .. | .. |
|
||||
| .. | .. |
|
||||
\ | /
|
||||
\ | /
|
||||
\ | /
|
||||
\ | /
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
class DoorBlock extends TransparentBlock{
|
||||
public function __construct($id, $meta = 0, $name = "Unknown"){
|
||||
parent::__construct($id, $meta, $name);
|
||||
}
|
||||
|
||||
public function place(BlockAPI $level, Item $item, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz){
|
||||
if($block->inWorld === true and $face === 1){
|
||||
$blockUp = $level->getBlockFace($block, 1);
|
||||
$blockDown = $level->getBlockFace($block, 0);
|
||||
if($blockUp->isReplaceable === false or $blockDown->isTransparent === true){
|
||||
return false;
|
||||
}
|
||||
$direction = $player->entity->getDirection();
|
||||
$face = array(
|
||||
0 => 3,
|
||||
1 => 4,
|
||||
2 => 2,
|
||||
3 => 5,
|
||||
);
|
||||
$next = $level->getBlockFace($block, $face[(($direction + 2) % 4)]);
|
||||
$metaUp = 0x08;
|
||||
if($next->getID() === $this->id){ //Door hinge
|
||||
$metaUp |= 0x01;
|
||||
}
|
||||
$level->setBlock($blockUp, $this->id, $metaUp); //Top
|
||||
|
||||
$this->meta = $direction & 0x03;
|
||||
$level->setBlock($block, $this->id, $this->meta); //Bottom
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function onBreak(BlockAPI $level, Item $item, Player $player){
|
||||
if($this->inWorld === true){
|
||||
if(($this->meta & 0x08) === 0x08){
|
||||
$down = $level->getBlockFace($this, 0);
|
||||
if($down->getID() === $this->id){
|
||||
$level->setBlock($down, 0, 0);
|
||||
}
|
||||
}else{
|
||||
$up = $level->getBlockFace($this, 1);
|
||||
if($up->getID() === $this->id){
|
||||
$level->setBlock($up, 0, 0);
|
||||
}
|
||||
}
|
||||
$level->setBlock($this, 0, 0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function onActivate(BlockAPI $level, Item $item, Player $player){
|
||||
if(($this->meta & 0x08) === 0x08){ //Top
|
||||
$down = $level->getBlockFace($this, 0);
|
||||
if($down->getID() === $this->id){
|
||||
$meta = $down->getMetadata() ^ 0x04;
|
||||
$level->setBlock($down, $this->id, $meta);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}else{
|
||||
$this->meta ^= 0x04;
|
||||
$level->setBlock($this, $this->id, $this->meta);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -38,6 +38,14 @@ class GenericBlock extends Block{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function onBreak(BlockAPI $level, Item $item, Player $player){
|
||||
if($this->inWorld === true){
|
||||
$level->setBlock($this, 0, 0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function onUpdate(BlockAPI $level, $type){
|
||||
return false;
|
||||
}
|
||||
|
@ -25,10 +25,10 @@ the Free Software Foundation, either version 3 of the License, or
|
||||
|
||||
*/
|
||||
|
||||
class IronDoorBlock extends TransparentBlock{
|
||||
class IronDoorBlock extends DoorBlock{
|
||||
public function __construct($meta = 0){
|
||||
parent::__construct(IRON_DOOR, $meta, "Iron Door");
|
||||
$this->isActivable = true;
|
||||
parent::__construct(IRON_DOOR_BLOCK, $meta, "Iron Door Block");
|
||||
//$this->isActivable = true;
|
||||
}
|
||||
public function getDrops(Item $item, Player $player){
|
||||
return array(
|
||||
|
@ -25,7 +25,7 @@ the Free Software Foundation, either version 3 of the License, or
|
||||
|
||||
*/
|
||||
|
||||
class WoodDoorBlock extends TransparentBlock{
|
||||
class WoodDoorBlock extends DoorBlock{
|
||||
public function __construct($meta = 0){
|
||||
parent::__construct(WOOD_DOOR_BLOCK, $meta, "Wood Door Block");
|
||||
$this->isActivable = true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user