mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-21 18:36:40 +00:00
Correct block breaking
This commit is contained in:
parent
30d2b41264
commit
067147f750
@ -33,175 +33,235 @@ class BlockAPI{
|
|||||||
|
|
||||||
public function init(){
|
public function init(){
|
||||||
$this->server->addHandler("world.block.update", array($this, "handle"));
|
$this->server->addHandler("world.block.update", array($this, "handle"));
|
||||||
$this->server->addHandler("player.block.action", array($this, "handle"));
|
$this->server->addHandler("player.block.break", array($this, "blockBreak"));
|
||||||
|
$this->server->addHandler("player.block.action", array($this, "blockAction"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function handle($data, $event){
|
public function blockBreak($data, $event){
|
||||||
switch($event){
|
if($event !== "player.block.break"){
|
||||||
case "player.block.action":
|
return;
|
||||||
$target = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"]);
|
|
||||||
$cancelPlace = false;
|
|
||||||
if(isset(Material::$activable[$target[0]])){
|
|
||||||
|
|
||||||
switch($target[0]){
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
case 6:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$cancelPlace = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if($cancelPlace === true or $data["face"] < 0 or $data["face"] > 5){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if(!isset(Material::$replaceable[$target[0]])){
|
|
||||||
switch($data["face"]){
|
|
||||||
case 0:
|
|
||||||
--$data["y"];
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
++$data["y"];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
--$data["z"];
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
++$data["z"];
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
--$data["x"];
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
++$data["x"];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//}
|
|
||||||
if($data["y"] >= 127){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$block = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"]);
|
|
||||||
|
|
||||||
if(!isset(Material::$replaceable[$block[0]])){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(isset(Material::$placeable[$data["block"]])){
|
|
||||||
$data["block"] = Material::$placeable[$data["block"]] === true ? $data["block"]:Material::$placeable[$data["block"]];
|
|
||||||
}else{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$direction = $this->server->api->entity->get($data["eid"])->getDirection();
|
|
||||||
|
|
||||||
switch($data["block"]){
|
|
||||||
case 50: //Torch
|
|
||||||
if(isset(Material::$transparent[$target[0]])){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$faces = array(
|
|
||||||
0 => 6,
|
|
||||||
1 => 5,
|
|
||||||
2 => 4,
|
|
||||||
3 => 3,
|
|
||||||
4 => 2,
|
|
||||||
5 => 1,
|
|
||||||
);
|
|
||||||
if(!isset($faces[$data["face"]])){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$data["meta"] = $faces[$data["face"]];
|
|
||||||
break;
|
|
||||||
case 53://Stairs
|
|
||||||
case 67:
|
|
||||||
case 108:
|
|
||||||
$faces = array(
|
|
||||||
0 => 0,
|
|
||||||
1 => 2,
|
|
||||||
2 => 1,
|
|
||||||
3 => 3,
|
|
||||||
);
|
|
||||||
$data["meta"] = $faces[$direction] & 0x03;
|
|
||||||
break;
|
|
||||||
case 96: //trapdoor
|
|
||||||
if(isset(Material::$transparent[$target[0]])){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$faces = array(
|
|
||||||
2 => 0,
|
|
||||||
3 => 1,
|
|
||||||
4 => 2,
|
|
||||||
5 => 3,
|
|
||||||
);
|
|
||||||
if(!isset($faces[$data["face"]])){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$data["meta"] = $faces[$data["face"]] & 0x03;
|
|
||||||
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
|
|
||||||
$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;
|
|
||||||
}else{
|
|
||||||
$data2 = $data;
|
|
||||||
$data2["meta"] = 0x08;
|
|
||||||
$data["meta"] = $direction & 0x03;
|
|
||||||
++$data2["y"];
|
|
||||||
$this->server->handle("player.block.place", $data2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 65: //Ladder
|
|
||||||
if(isset(Material::$transparent[$target[0]])){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$faces = array(
|
|
||||||
2 => 2,
|
|
||||||
3 => 3,
|
|
||||||
4 => 4,
|
|
||||||
5 => 5,
|
|
||||||
);
|
|
||||||
if(!isset($faces[$data["face"]])){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$data["meta"] = $faces[$data["face"]];
|
|
||||||
break;
|
|
||||||
case 59://Seeds
|
|
||||||
case 105:
|
|
||||||
$blockDown = $this->server->api->level->getBlock($data["x"], $data["y"] - 1, $data["z"]);
|
|
||||||
if($blockDown[0] !== 60){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$data["meta"] = 0;
|
|
||||||
break;
|
|
||||||
case 81: //Cactus
|
|
||||||
$blockDown = $this->server->api->level->getBlock($data["x"], $data["y"] - 1, $data["z"]);
|
|
||||||
$block0 = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"] + 1);
|
|
||||||
$block1 = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"] - 1);
|
|
||||||
$block2 = $this->server->api->level->getBlock($data["x"] + 1, $data["y"], $data["z"]);
|
|
||||||
$block3 = $this->server->api->level->getBlock($data["x"] - 1, $data["y"], $data["z"]);
|
|
||||||
if($blockDown[0] !== 12 or $block0[0] !== 0 or $block1[0] !== 0 or $block2[0] !== 0 or $block3[0] !== 0){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$this->server->handle("player.block.place", $data);
|
|
||||||
$this->updateBlocksAround($data["x"], $data["x"], $data["z"]);
|
|
||||||
}
|
}
|
||||||
|
$target = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"]);
|
||||||
|
if(isset(Material::$unbreakable[$target[0]])){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$drop = array(
|
||||||
|
$target[0], //Block
|
||||||
|
$target[1], //Meta
|
||||||
|
1, //Count
|
||||||
|
);
|
||||||
|
switch($target[0]){
|
||||||
|
case 64: //Door
|
||||||
|
$drop = array(324, 0, 1);
|
||||||
|
if(($target[1] & 0x08) === 0x08){
|
||||||
|
$down = $this->server->api->level->getBlock($data["x"], $data["y"] - 1, $data["z"]);
|
||||||
|
if($down[0] === 64){
|
||||||
|
$data2 = $data;
|
||||||
|
--$data2["y"];
|
||||||
|
$this->server->trigger("player.block.break", $data2);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
$up = $this->server->api->level->getBlock($data["x"], $data["y"] + 1, $data["z"]);
|
||||||
|
if($up[0] === 64){
|
||||||
|
$data2 = $data;
|
||||||
|
++$data2["y"];
|
||||||
|
$this->server->trigger("player.block.break", $data2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if($drop !== false and $drop[0] !== 0 and $drop[2] > 0){
|
||||||
|
$this->drop($data["x"], $data["y"], $data["z"], $drop[0], $drop[1] & 0x0F, $drop[2] & 0xFF);
|
||||||
|
}
|
||||||
|
$this->server->trigger("player.block.break", $data);
|
||||||
|
$this->updateBlocksAround($data["x"], $data["x"], $data["z"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function drop($x, $y, $z, $block, $meta, $stack = 1){
|
||||||
|
if($block === 0 or $stack <= 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$data = array(
|
||||||
|
"x" => $x,
|
||||||
|
"y" => $y,
|
||||||
|
"z" => $z,
|
||||||
|
"meta" => $meta,
|
||||||
|
"stack" => $stack,
|
||||||
|
);
|
||||||
|
$data["x"] += mt_rand(2, 8) / 10;
|
||||||
|
$data["y"] += mt_rand(2, 8) / 10;
|
||||||
|
$data["z"] += mt_rand(2, 8) / 10;
|
||||||
|
$e = $this->server->api->entity->add(ENTITY_ITEM, $block, $data);
|
||||||
|
$this->server->api->entity->spawnToAll($e->eid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function blockAction($data, $event){
|
||||||
|
if($event !== "player.block.action"){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$target = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"]);
|
||||||
|
$cancelPlace = false;
|
||||||
|
if(isset(Material::$activable[$target[0]])){
|
||||||
|
|
||||||
|
switch($target[0]){
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
case 6:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$cancelPlace = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if($cancelPlace === true or $data["face"] < 0 or $data["face"] > 5){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if(!isset(Material::$replaceable[$target[0]])){
|
||||||
|
switch($data["face"]){
|
||||||
|
case 0:
|
||||||
|
--$data["y"];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
++$data["y"];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
--$data["z"];
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
++$data["z"];
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
--$data["x"];
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
++$data["x"];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
if($data["y"] >= 127){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$block = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"]);
|
||||||
|
|
||||||
|
if(!isset(Material::$replaceable[$block[0]])){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset(Material::$placeable[$data["block"]])){
|
||||||
|
$data["block"] = Material::$placeable[$data["block"]] === true ? $data["block"]:Material::$placeable[$data["block"]];
|
||||||
|
}else{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$direction = $this->server->api->entity->get($data["eid"])->getDirection();
|
||||||
|
|
||||||
|
switch($data["block"]){
|
||||||
|
case 50: //Torch
|
||||||
|
if(isset(Material::$transparent[$target[0]])){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$faces = array(
|
||||||
|
0 => 6,
|
||||||
|
1 => 5,
|
||||||
|
2 => 4,
|
||||||
|
3 => 3,
|
||||||
|
4 => 2,
|
||||||
|
5 => 1,
|
||||||
|
);
|
||||||
|
if(!isset($faces[$data["face"]])){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$data["meta"] = $faces[$data["face"]];
|
||||||
|
break;
|
||||||
|
case 53://Stairs
|
||||||
|
case 67:
|
||||||
|
case 108:
|
||||||
|
$faces = array(
|
||||||
|
0 => 0,
|
||||||
|
1 => 2,
|
||||||
|
2 => 1,
|
||||||
|
3 => 3,
|
||||||
|
);
|
||||||
|
$data["meta"] = $faces[$direction] & 0x03;
|
||||||
|
break;
|
||||||
|
case 96: //trapdoor
|
||||||
|
if(isset(Material::$transparent[$target[0]])){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$faces = array(
|
||||||
|
2 => 0,
|
||||||
|
3 => 1,
|
||||||
|
4 => 2,
|
||||||
|
5 => 3,
|
||||||
|
);
|
||||||
|
if(!isset($faces[$data["face"]])){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$data["meta"] = $faces[$data["face"]] & 0x03;
|
||||||
|
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
|
||||||
|
$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;
|
||||||
|
}else{
|
||||||
|
$data2 = $data;
|
||||||
|
$data2["meta"] = 0x08;
|
||||||
|
$data["meta"] = $direction & 0x03;
|
||||||
|
++$data2["y"];
|
||||||
|
$this->server->trigger("player.block.place", $data2);
|
||||||
|
$this->updateBlocksAround($data2["x"], $data2["y"], $data2["z"]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 65: //Ladder
|
||||||
|
if(isset(Material::$transparent[$target[0]])){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$faces = array(
|
||||||
|
2 => 2,
|
||||||
|
3 => 3,
|
||||||
|
4 => 4,
|
||||||
|
5 => 5,
|
||||||
|
);
|
||||||
|
if(!isset($faces[$data["face"]])){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$data["meta"] = $faces[$data["face"]];
|
||||||
|
break;
|
||||||
|
case 59://Seeds
|
||||||
|
case 105:
|
||||||
|
$blockDown = $this->server->api->level->getBlock($data["x"], $data["y"] - 1, $data["z"]);
|
||||||
|
if($blockDown[0] !== 60){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$data["meta"] = 0;
|
||||||
|
break;
|
||||||
|
case 81: //Cactus
|
||||||
|
$blockDown = $this->server->api->level->getBlock($data["x"], $data["y"] - 1, $data["z"]);
|
||||||
|
$block0 = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"] + 1);
|
||||||
|
$block1 = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"] - 1);
|
||||||
|
$block2 = $this->server->api->level->getBlock($data["x"] + 1, $data["y"], $data["z"]);
|
||||||
|
$block3 = $this->server->api->level->getBlock($data["x"] - 1, $data["y"], $data["z"]);
|
||||||
|
if($blockDown[0] !== 12 or $block0[0] !== 0 or $block1[0] !== 0 or $block2[0] !== 0 or $block3[0] !== 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$this->server->trigger("player.block.place", $data);
|
||||||
|
$this->updateBlocksAround($data["x"], $data["y"], $data["z"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function updateBlocksAround($x, $y, $z){
|
public function updateBlocksAround($x, $y, $z){
|
||||||
|
@ -36,8 +36,8 @@ class LevelAPI{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function init(){
|
public function init(){
|
||||||
$this->server->addHandler("player.block.break", array($this, "handle"));
|
$this->server->event("player.block.break", array($this, "handle"));
|
||||||
$this->server->addHandler("player.block.place", array($this, "handle"));
|
$this->server->event("player.block.place", array($this, "handle"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function handle($data, $event){
|
public function handle($data, $event){
|
||||||
@ -54,14 +54,6 @@ class LevelAPI{
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$this->setBlock($data["x"], $data["y"], $data["z"], 0, 0);
|
$this->setBlock($data["x"], $data["y"], $data["z"], 0, 0);
|
||||||
$data["block"] = $block[0];
|
|
||||||
$data["meta"] = $block[1];
|
|
||||||
$data["stack"] = 1;
|
|
||||||
$data["x"] += mt_rand(2, 8) / 10;
|
|
||||||
$data["y"] += mt_rand(2, 8) / 10;
|
|
||||||
$data["z"] += mt_rand(2, 8) / 10;
|
|
||||||
$e = $this->server->api->entity->add(ENTITY_ITEM, $block[0], $data);
|
|
||||||
$this->server->api->entity->spawnToAll($e->eid);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,10 @@ the Free Software Foundation, either version 3 of the License, or
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
class Material{
|
class Material{
|
||||||
|
static $unbreakable = array(
|
||||||
|
0,
|
||||||
|
7,
|
||||||
|
);
|
||||||
static $transparent = array(
|
static $transparent = array(
|
||||||
0 => true,
|
0 => true,
|
||||||
6 => true,
|
6 => true,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user