Fixed mirrored chunk sending

This commit is contained in:
Shoghi Cervantes 2014-07-06 12:36:23 +02:00
parent 643a4c1ef5
commit 6b361389ad
5 changed files with 24 additions and 16 deletions

View File

@ -1212,6 +1212,9 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
if(($this->gamemode & 0x01) === 0x01){
$this->inventory->setHeldItemSlot(0);
$this->inventory->setItemInHand(Item::get(Item::STONE, 0, 1));
}else{
$this->inventory->setHeldItemSlot(0);
$this->inventory->setItemInHand(Item::get(Item::AIR, 0, 1));
}
$pk = new LoginStatusPacket;
@ -1516,8 +1519,11 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
}
break;
}
$this->inventory->sendContents($this);
$target = $this->getLevel()->getBlock($vector);
$tile = $this->getLevel()->getTile($vector);
$pk = new UpdateBlockPacket;
$pk->x = $target->x;
$pk->y = $target->y;
@ -1525,7 +1531,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
$pk->block = $target->getID();
$pk->meta = $target->getDamage();
$this->dataPacket($pk);
//TODO: priority
if($tile instanceof Spawnable){
$tile->spawnTo($this);
}
@ -1538,18 +1544,18 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
for($i = 0; $i < 4; ++$i){
$s = $packet->slots[$i];
if($s === 0 or $s === 255){
$s = Item::get(Item::AIR, 0, 0);
$s = Item::get(Item::AIR, 0, 1);
}else{
$s = Item::get($s + 256, 0, 1);
}
$slot = $this->inventory->getArmorItem($i);
if($slot->getID() !== Item::AIR and $s->getID() === Item::AIR){
$this->inventory->setArmorItem($i, Item::get(Item::AIR, 0, 0));
$this->inventory->setArmorItem($i, Item::get(Item::AIR, 0, 1));
}elseif($s->getID() !== Item::AIR and $slot->getID() === Item::AIR and ($sl = $this->inventory->first($s)) !== -1){
if($this->inventory->setArmorItem($i, $this->inventory->getItem($sl)) === false){
$this->inventory->sendContents($this);
}else{
$this->inventory->setItem($sl, Item::get(Item::AIR, 0, 0));
$this->inventory->setItem($sl, Item::get(Item::AIR, 0, 1));
}
}elseif($s->getID() !== Item::AIR and $slot->getID() !== Item::AIR and ($slot->getID() !== $s->getID() or $slot->getDamage() !== $s->getDamage()) and ($sl = $this->inventory->first($s)) !== -1){
if($this->inventory->setArmorItem($i, $this->inventory->getItem($sl)) === false){
@ -1647,7 +1653,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
$target->harm($damage, $this->id);
if($slot->isTool() === true and ($this->gamemode & 0x01) === 0){
if($slot->useOn($target) and $slot->getDamage() >= $slot->getMaxDurability()){
$this->setSlot($this->getCurrentEquipment(), new Item(AIR, 0, 0));
$this->setSlot($this->getCurrentEquipment(), new Item(AIR, 0, 1));
}
}
}
@ -1765,7 +1771,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
break;
}
$this->inventory->setItemInHand(Item::get(Item::AIR, 0, 0));
$this->inventory->setItemInHand(Item::get(Item::AIR, 0, 1));
$motion = $this->getDirectionVector()->multiply(10);
$this->getLevel()->dropItem($this->add(0, 1, 0), $item, $motion);

View File

@ -750,9 +750,9 @@ abstract class Block extends Position implements Metadatable{
if(!isset(self::$list[$this->id])){ //Unknown blocks
return [];
}else{
return array(
return [
array($this->id, $this->meta, 1),
);
];
}
}

View File

@ -36,9 +36,9 @@ class Grass extends Solid{
}
public function getDrops(Item $item){
return array(
array(Item::DIRT, 0, 1),
);
return [
[Item::DIRT, 0, 1],
];
}
public function onUpdate($type){

View File

@ -100,8 +100,8 @@ class ChunkRequestTask extends AsyncTask{
$orderedSkyLight = "";
$orderedLight = "";
for($z = 0; $z < 16; ++$z){
for($x = 0; $x < 16; ++$x){
for($x = 0; $x < 16; ++$x){
for($z = 0; $z < 16; ++$z){
$orderedIds .= $this->getColumn($this->ids, $x, $z);
$orderedData .= $this->getHalfColumn($this->meta, $x, $z);
$orderedSkyLight .= $this->getHalfColumn($this->skyLight, $x, $z);

View File

@ -767,12 +767,11 @@ class Level implements ChunkManager, Metadatable{
$ev = new BlockBreakEvent($player, $target, $item, ($player->getGamemode() & 0x01) === 1 ? true : false);
$lastTime = $player->lastBreak - 0.1; //TODO: replace with true lag
if(($player->getGamemode() & 0x01)){
if(($player->getGamemode() & 0x01) > 0){
$ev->setInstaBreak(true);
}elseif(($lastTime + $target->getBreakTime($item)) >= microtime(true)){
$ev->setCancelled(true);
$ev->setCancelled();
}
$player->lastBreak = microtime(true);
if($item instanceof Item and !$target->isBreakable($item) and $ev->getInstaBreak() === false){
$ev->setCancelled();
@ -788,6 +787,9 @@ class Level implements ChunkManager, Metadatable{
if($ev->isCancelled()){
return false;
}
$player->lastBreak = microtime(true);
}elseif($item instanceof Item and !$target->isBreakable($item)){
return false;
}