Merge branch 'mcpe-0.11' of bitbucket.org:pocketmine/pocketmine-mp into mcpe-0.11

This commit is contained in:
Shoghi Cervantes 2015-03-14 02:39:12 +01:00
commit 284958a21e
No known key found for this signature in database
GPG Key ID: 78464DB0A7837F89
11 changed files with 219 additions and 20 deletions

View File

@ -1749,7 +1749,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
} }
$target = $this->level->getBlock($blockVector); $target = $this->level->getBlock($blockVector);
$ev = new PlayerInteractEvent($this, $item, $target, $packet->face); $ev = new PlayerInteractEvent($this, $item, $target, $packet->face, PlayerInteractEvent::RIGHT_CLICK_AIR);
$this->server->getPluginManager()->callEvent($ev); $this->server->getPluginManager()->callEvent($ev);
@ -1807,6 +1807,11 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
$packet->eid = $this->id; $packet->eid = $this->id;
switch($packet->action){ switch($packet->action){
case 0: //Start break
$target = $this->level->getBlock(new Vector3($packet->x, $packet->y, $packet->z));
$ev = new PlayerInteractEvent($this, $this->inventory->getItemInHand(), $target, $packet->face, $target->getId() === 0 ? PlayerInteractEvent::LEFT_CLICK_AIR : PlayerInteractEvent::LEFT_CLICK_BLOCK);
$this->lastBreak = microtime(true);
break;
case 5: //Shot arrow case 5: //Shot arrow
if($this->inventory->getItemInHand()->getId() === Item::BOW){ if($this->inventory->getItemInHand()->getId() === Item::BOW){
$bow = $this->inventory->getItemInHand(); $bow = $this->inventory->getItemInHand();

View File

@ -32,6 +32,12 @@ use pocketmine\Player;
class PlayerInteractEvent extends PlayerEvent implements Cancellable{ class PlayerInteractEvent extends PlayerEvent implements Cancellable{
public static $handlerList = null; public static $handlerList = null;
const LEFT_CLICK_BLOCK = 0;
const RIGHT_CLICK_BLOCK = 1;
const LEFT_CLICK_AIR = 2;
const RIGHT_CLICK_AIR = 3;
const PHYSICAL = 4;
/** /**
* @var \pocketmine\block\Block; * @var \pocketmine\block\Block;
*/ */
@ -43,11 +49,18 @@ class PlayerInteractEvent extends PlayerEvent implements Cancellable{
/** @var \pocketmine\item\Item */ /** @var \pocketmine\item\Item */
protected $item; protected $item;
public function __construct(Player $player, Item $item, Block $block, $face){ protected $action;
public function __construct(Player $player, Item $item, Block $block, $face, $action = PlayerInteractEvent::RIGHT_CLICK){
$this->blockTouched = $block; $this->blockTouched = $block;
$this->player = $player; $this->player = $player;
$this->item = $item; $this->item = $item;
$this->blockFace = (int) $face; $this->blockFace = (int) $face;
$this->action = (int) $action;
}
public function getAction(){
return $this->action;
} }
public function getItem(){ public function getItem(){

View File

@ -146,9 +146,7 @@ class PlayerInventory extends BaseInventory{
foreach($target as $player){ foreach($target as $player){
if($player === $this->getHolder()){ if($player === $this->getHolder()){
//TODO: Check if Mojang enabled sending a single slot this $this->sendSlot($this->getHeldItemSlot());
//$this->sendSlot($this->getHeldItemSlot());
$this->sendContents($player);
}else{ }else{
$player->dataPacket($pk); $player->dataPacket($pk);
} }
@ -393,9 +391,6 @@ class PlayerInventory extends BaseInventory{
foreach($target as $player){ foreach($target as $player){
if($player === $this->getHolder()){ if($player === $this->getHolder()){
/** @var Player $player */ /** @var Player $player */
//$pk2 = clone $pk;
//$pk2->eid = 0;
$pk2 = new ContainerSetSlotPacket(); $pk2 = new ContainerSetSlotPacket();
$pk2->windowid = 0x78; //Armor window id constant $pk2->windowid = 0x78; //Armor window id constant
$pk2->slot = $index; $pk2->slot = $index;
@ -454,7 +449,8 @@ class PlayerInventory extends BaseInventory{
foreach($target as $player){ foreach($target as $player){
if($player === $this->getHolder()){ if($player === $this->getHolder()){
/** @var Player $player */ /** @var Player $player */
$this->sendContents($player); //#blamemojang $pk->windowid = 0;
$player->dataPacket(clone $pk);
}else{ }else{
if(($id = $player->getWindowId($this)) === -1){ if(($id = $player->getWindowId($this)) === -1){
$this->close($player); $this->close($player);

View File

@ -95,6 +95,8 @@ use pocketmine\utils\LevelException;
use pocketmine\utils\MainLogger; use pocketmine\utils\MainLogger;
use pocketmine\utils\ReversePriorityQueue; use pocketmine\utils\ReversePriorityQueue;
use pocketmine\utils\TextFormat; use pocketmine\utils\TextFormat;
use pocketmine\level\particle\Particle;
use pocketmine\level\particle\DestroyBlockParticle;
#include <rules/Level.h> #include <rules/Level.h>
@ -356,6 +358,13 @@ class Level implements ChunkManager, Metadatable{
$this->temporalPosition = null; $this->temporalPosition = null;
} }
public function addParticle(Particle $particle){
$pk = $particle->encode();
if($pk !== null){
Server::broadcastPacket($this->getUsingChunk($particle->x >> 4, $particle->z >> 4), $pk);
}
}
/** /**
* @return bool * @return bool
*/ */
@ -1243,7 +1252,7 @@ class Level implements ChunkManager, Metadatable{
return false; return false;
} }
$player->lastBreak = microtime(true); $player->lastBreak = PHP_INT_MAX;
}elseif($item instanceof Item and !$target->isBreakable($item)){ }elseif($item instanceof Item and !$target->isBreakable($item)){
return false; return false;
} }
@ -1259,7 +1268,11 @@ class Level implements ChunkManager, Metadatable{
} }
} }
$drops = $target->getDrops($item); //Fixes tile entities being deleted before getting drops $drops = $target->getDrops($item); //Fixes tile entities being deleted before getting drops
$this->addParticle(new DestroyBlockParticle($target, $target));
$target->onBreak($item); $target->onBreak($item);
$tile = $this->getTile($target); $tile = $this->getTile($target);
if($tile instanceof Tile){ if($tile instanceof Tile){
if($tile instanceof InventoryHolder){ if($tile instanceof InventoryHolder){
@ -1319,7 +1332,7 @@ class Level implements ChunkManager, Metadatable{
} }
if($player instanceof Player){ if($player instanceof Player){
$ev = new PlayerInteractEvent($player, $item, $target, $face); $ev = new PlayerInteractEvent($player, $item, $target, $face, $target->getId() === 0 ? PlayerInteractEvent::RIGHT_CLICK_AIR : PlayerInteractEvent::RIGHT_CLICK_BLOCK);
if(!$player->isOp() and ($distance = $this->server->getSpawnRadius()) > -1){ if(!$player->isOp() and ($distance = $this->server->getSpawnRadius()) > -1){
$t = new Vector2($target->x, $target->z); $t = new Vector2($target->x, $target->z);
$s = new Vector2($this->getSpawnLocation()->x, $this->getSpawnLocation()->z); $s = new Vector2($this->getSpawnLocation()->x, $this->getSpawnLocation()->z);

View File

@ -189,8 +189,8 @@ class RegionLoader{
$sectors = (int) ceil(($length + 4) / 4096); $sectors = (int) ceil(($length + 4) / 4096);
$index = self::getChunkOffset($x, $z); $index = self::getChunkOffset($x, $z);
if($this->locationTable[$index][1] < $sectors){ if($this->locationTable[$index][1] < $sectors){
$this->locationTable[$index][0] = $this->lastSector + 1;
$this->lastSector += $sectors; //The GC will clean this shift "later" $this->lastSector += $sectors; //The GC will clean this shift "later"
$this->locationTable[$index][0] = $this->lastSector;
} }
$this->locationTable[$index][1] = $sectors; $this->locationTable[$index][1] = $sectors;
$this->locationTable[$index][2] = time(); $this->locationTable[$index][2] = time();
@ -247,7 +247,8 @@ class RegionLoader{
$chunk = Binary::writeInt(strlen($chunk)) . $chunk; $chunk = Binary::writeInt(strlen($chunk)) . $chunk;
$sectors = (int) ceil(strlen($chunk) / 4096); $sectors = (int) ceil(strlen($chunk) / 4096);
if($sectors > $this->locationTable[$i][1]){ if($sectors > $this->locationTable[$i][1]){
$this->locationTable[$i][0] = $this->lastSector += $sectors; $this->locationTable[$i][0] = $this->lastSector + 1;
$this->lastSector += $sectors;
} }
fseek($this->filePointer, $this->locationTable[$i][0] << 12); fseek($this->filePointer, $this->locationTable[$i][0] << 12);
fwrite($this->filePointer, str_pad($chunk, $sectors << 12, "\x00", STR_PAD_RIGHT)); fwrite($this->filePointer, str_pad($chunk, $sectors << 12, "\x00", STR_PAD_RIGHT));

View File

@ -0,0 +1,47 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* 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.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
namespace pocketmine\level\particle;
use pocketmine\network\protocol\LevelEventPacket;
use pocketmine\block\Block;
use pocketmine\math\Vector3;
class DestroyBlockParticle extends Particle{
protected $data;
public function __construct(Vector3 $pos, Block $b){
parent::__construct($pos->x, $pos->y, $pos->z);
$this->data = $b->getId() + ($b->getDamage() << 12);
}
public function encode(){
$pk = new LevelEventPacket;
$pk->evid = 2001;
$pk->x = $this->x;
$pk->y = $this->y;
$pk->z = $this->z;
$pk->data = $this->data;
return $pk;
}
}

View File

@ -0,0 +1,42 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* 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.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
namespace pocketmine\level\particle;
use pocketmine\network\protocol\ExplodePacket;
use pocketmine\math\Vector3;
class ExplodeParticle extends Particle{
public function __construct(Vector3 $pos){
parent::__construct($pos->x, $pos->y, $pos->z);
}
public function encode(){
$pk = new ExplodePacket;
$pk->x = $this->x;
$pk->y = $this->y;
$pk->z = $this->z;
$pk->radius = 0;
return $pk;
}
}

View File

@ -0,0 +1,48 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* 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.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
namespace pocketmine\level\particle;
use pocketmine\network\protocol\LevelEventPacket;
use pocketmine\math\Vector3;
class MobSpawnParticle extends Particle{
protected $width;
protected $height;
public function __construct(Vector3 $pos, $width = 0, $height = 0){
parent::__construct($pos->x, $pos->y, $pos->z);
$this->width = $width;
$this->height = $height;
}
public function encode(){
$pk = new LevelEventPacket;
$pk->evid = 2004;
$pk->x = $this->x;
$pk->y = $this->y;
$pk->z = $this->z;
$pk->data = ($this->width & 0xff) + (($this->height & 0xff) << 8);
return $pk;
}
}

View File

@ -0,0 +1,34 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* 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.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
namespace pocketmine\level\particle;
use pocketmine\math\Vector3;
use pocketmine\network\protocol\DataPacket;
abstract class Particle extends Vector3{
/**
* @return DataPacket
*/
abstract public function encode();
}

View File

@ -65,7 +65,7 @@ interface Info{
const LEVEL_EVENT_PACKET = 0x96; const LEVEL_EVENT_PACKET = 0x96;
const TILE_EVENT_PACKET = 0x97; const TILE_EVENT_PACKET = 0x97;
const ENTITY_EVENT_PACKET = 0x98; const ENTITY_EVENT_PACKET = 0x98;
//const MOB_EFFECT_paCKET = 0x99; //const MOB_EFFECT_PACKET = 0x99;
const PLAYER_EQUIPMENT_PACKET = 0x9a; const PLAYER_EQUIPMENT_PACKET = 0x9a;
const PLAYER_ARMOR_EQUIPMENT_PACKET = 0x9b; const PLAYER_ARMOR_EQUIPMENT_PACKET = 0x9b;

View File

@ -46,7 +46,7 @@ class LevelEventPacket extends DataPacket{
$this->reset(); $this->reset();
$this->putShort($this->evid); $this->putShort($this->evid);
$this->putInt($this->x); $this->putInt($this->x);
$this->putShort($this->y); $this->putByte($this->y);
$this->putInt($this->z); $this->putInt($this->z);
$this->putInt($this->data); $this->putInt($this->data);
} }