mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-14 17:59:41 +00:00
Server can be joined, again! (fixed weak references and blocks)
This commit is contained in:
parent
a2b3a4bb90
commit
5460ccf41c
@ -2431,17 +2431,22 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
||||
* Returns the created/existing window id
|
||||
*
|
||||
* @param Inventory $inventory
|
||||
* @param int $forceId
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function addWindow(Inventory $inventory){
|
||||
public function addWindow(Inventory $inventory, $forceId = null){
|
||||
if($this->windows->contains($inventory)){
|
||||
return $this->windows[$inventory];
|
||||
}
|
||||
$this->windowCnt = $cnt = max(2, ++$this->windowCnt % 99);
|
||||
if($forceId === null){
|
||||
$this->windowCnt = $cnt = max(2, ++$this->windowCnt % 99);
|
||||
}else{
|
||||
$cnt = (int) $forceId;
|
||||
}
|
||||
$this->windowIndex[$cnt] = $inventory;
|
||||
$this->windows->attach($inventory, $cnt);
|
||||
$this->inventory->onOpen($this);
|
||||
$inventory->onOpen($this);
|
||||
|
||||
return $cnt;
|
||||
}
|
||||
|
@ -682,7 +682,7 @@ abstract class Block extends Position implements Metadatable{
|
||||
return $this->getLevel()->getBlock($v);
|
||||
}
|
||||
|
||||
return $v;
|
||||
return Block::get(Item::AIR, 0, $v);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -47,6 +47,10 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
||||
|
||||
protected function initEntity(){
|
||||
$this->inventory = new PlayerInventory($this);
|
||||
if($this instanceof Player){
|
||||
$this->addWindow($this->inventory, 0);
|
||||
}
|
||||
|
||||
|
||||
if(isset($this->namedtag->NameTag)){
|
||||
$this->nameTag = $this->namedtag["NameTag"];
|
||||
|
@ -59,12 +59,6 @@ abstract class BaseInventory implements Inventory{
|
||||
$this->holder = $holder;
|
||||
$this->viewers = new \SplObjectStorage();
|
||||
|
||||
//A holder can be a plugin, or an entity
|
||||
if($this->holder instanceof Player){
|
||||
$this->holder->addWindow($this, 0);
|
||||
}
|
||||
|
||||
|
||||
$this->type = $type;
|
||||
if($overrideSize !== null){
|
||||
$this->size = (int) $overrideSize;
|
||||
@ -138,13 +132,12 @@ abstract class BaseInventory implements Inventory{
|
||||
Server::getInstance()->getPluginManager()->callEvent($ev = new EntityInventoryChangeEvent($holder, $this->getItem($index), $item, $index));
|
||||
if($ev->isCancelled()){
|
||||
$this->sendContents($this->getViewers());
|
||||
|
||||
return false;
|
||||
}
|
||||
$item = $ev->getNewItem();
|
||||
}
|
||||
|
||||
$old = $this->slots[$index];
|
||||
$old = $this->getItem($index);
|
||||
$this->slots[$index] = clone $item;
|
||||
$this->onSlotChange($index, $old);
|
||||
|
||||
|
@ -211,16 +211,16 @@ class PlayerInventory extends BaseInventory{
|
||||
|
||||
if($index >= $this->getSize()){ //Armor change
|
||||
Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $this->getItem($index), $item, $index));
|
||||
if($ev->isCancelled()){
|
||||
$this->sendArmorContents($this);
|
||||
$this->sendContents($this);
|
||||
if($ev->isCancelled() and $this->getHolder() instanceof Player){
|
||||
$this->sendArmorContents($this->getHolder());
|
||||
$this->sendContents($this->getHolder());
|
||||
|
||||
return false;
|
||||
}
|
||||
$item = $ev->getNewItem();
|
||||
}
|
||||
|
||||
$old = $this->slots[$index];
|
||||
$old = $this->getItem($index);
|
||||
$this->slots[$index] = clone $item;
|
||||
$this->onSlotChange($index, $old);
|
||||
|
||||
|
@ -479,14 +479,14 @@ class Level{
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*
|
||||
* @param Vector3 $pos
|
||||
*
|
||||
* @return Block
|
||||
*/
|
||||
public function getBlockRaw(Vector3 $pos){
|
||||
$b = $this->level->getBlock($pos->x, $pos->y, $pos->z);
|
||||
|
||||
return Block::get($b[0], $b[1], new Position($pos->x, $pos->y, $pos->z, $this));
|
||||
return $this->getBlock($pos);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -495,9 +495,6 @@ class Level{
|
||||
* @return bool|Block
|
||||
*/
|
||||
public function getBlock(Vector3 $pos){
|
||||
if($pos instanceof Position and $pos->level !== $this){
|
||||
return false;
|
||||
}
|
||||
$b = $this->level->getBlock($pos->x, $pos->y, $pos->z);
|
||||
|
||||
return Block::get($b[0], $b[1], new Position($pos->x, $pos->y, $pos->z, $this));
|
||||
|
Loading…
x
Reference in New Issue
Block a user