Correct block breaking

This commit is contained in:
Shoghi Cervantes Pueyo 2012-12-24 13:07:35 +01:00
parent 30d2b41264
commit 067147f750
3 changed files with 232 additions and 176 deletions

View File

@ -33,12 +33,72 @@ class BlockAPI{
public function init(){
$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){
switch($event){
case "player.block.action":
public function blockBreak($data, $event){
if($event !== "player.block.break"){
return;
}
$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]])){
@ -162,7 +222,8 @@ class BlockAPI{
$data2["meta"] = 0x08;
$data["meta"] = $direction & 0x03;
++$data2["y"];
$this->server->handle("player.block.place", $data2);
$this->server->trigger("player.block.place", $data2);
$this->updateBlocksAround($data2["x"], $data2["y"], $data2["z"]);
}
break;
case 65: //Ladder
@ -199,9 +260,8 @@ class BlockAPI{
}
break;
}
$this->server->handle("player.block.place", $data);
$this->updateBlocksAround($data["x"], $data["x"], $data["z"]);
}
$this->server->trigger("player.block.place", $data);
$this->updateBlocksAround($data["x"], $data["y"], $data["z"]);
}
public function updateBlocksAround($x, $y, $z){

View File

@ -36,8 +36,8 @@ class LevelAPI{
}
public function init(){
$this->server->addHandler("player.block.break", array($this, "handle"));
$this->server->addHandler("player.block.place", array($this, "handle"));
$this->server->event("player.block.break", array($this, "handle"));
$this->server->event("player.block.place", array($this, "handle"));
}
public function handle($data, $event){
@ -54,14 +54,6 @@ class LevelAPI{
break;
}
$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;
}
}

View File

@ -26,6 +26,10 @@ the Free Software Foundation, either version 3 of the License, or
*/
class Material{
static $unbreakable = array(
0,
7,
);
static $transparent = array(
0 => true,
6 => true,