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);
$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);
@ -1807,6 +1807,11 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
$packet->eid = $this->id;
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
if($this->inventory->getItemInHand()->getId() === Item::BOW){
$bow = $this->inventory->getItemInHand();

View File

@ -32,6 +32,12 @@ use pocketmine\Player;
class PlayerInteractEvent extends PlayerEvent implements Cancellable{
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;
*/
@ -43,11 +49,18 @@ class PlayerInteractEvent extends PlayerEvent implements Cancellable{
/** @var \pocketmine\item\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->player = $player;
$this->item = $item;
$this->blockFace = (int) $face;
$this->action = (int) $action;
}
public function getAction(){
return $this->action;
}
public function getItem(){

View File

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

View File

@ -95,6 +95,8 @@ use pocketmine\utils\LevelException;
use pocketmine\utils\MainLogger;
use pocketmine\utils\ReversePriorityQueue;
use pocketmine\utils\TextFormat;
use pocketmine\level\particle\Particle;
use pocketmine\level\particle\DestroyBlockParticle;
#include <rules/Level.h>
@ -356,6 +358,13 @@ class Level implements ChunkManager, Metadatable{
$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
*/
@ -1243,7 +1252,7 @@ class Level implements ChunkManager, Metadatable{
return false;
}
$player->lastBreak = microtime(true);
$player->lastBreak = PHP_INT_MAX;
}elseif($item instanceof Item and !$target->isBreakable($item)){
return false;
}
@ -1259,7 +1268,11 @@ class Level implements ChunkManager, Metadatable{
}
}
$drops = $target->getDrops($item); //Fixes tile entities being deleted before getting drops
$this->addParticle(new DestroyBlockParticle($target, $target));
$target->onBreak($item);
$tile = $this->getTile($target);
if($tile instanceof Tile){
if($tile instanceof InventoryHolder){
@ -1319,7 +1332,7 @@ class Level implements ChunkManager, Metadatable{
}
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){
$t = new Vector2($target->x, $target->z);
$s = new Vector2($this->getSpawnLocation()->x, $this->getSpawnLocation()->z);

View File

@ -189,8 +189,8 @@ class RegionLoader{
$sectors = (int) ceil(($length + 4) / 4096);
$index = self::getChunkOffset($x, $z);
if($this->locationTable[$index][1] < $sectors){
$this->locationTable[$index][0] = $this->lastSector + 1;
$this->lastSector += $sectors; //The GC will clean this shift "later"
$this->locationTable[$index][0] = $this->lastSector;
}
$this->locationTable[$index][1] = $sectors;
$this->locationTable[$index][2] = time();
@ -247,7 +247,8 @@ class RegionLoader{
$chunk = Binary::writeInt(strlen($chunk)) . $chunk;
$sectors = (int) ceil(strlen($chunk) / 4096);
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);
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 TILE_EVENT_PACKET = 0x97;
const ENTITY_EVENT_PACKET = 0x98;
//const MOB_EFFECT_paCKET = 0x99;
//const MOB_EFFECT_PACKET = 0x99;
const PLAYER_EQUIPMENT_PACKET = 0x9a;
const PLAYER_ARMOR_EQUIPMENT_PACKET = 0x9b;

View File

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