mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-15 02:09:42 +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
|
* Returns the created/existing window id
|
||||||
*
|
*
|
||||||
* @param Inventory $inventory
|
* @param Inventory $inventory
|
||||||
|
* @param int $forceId
|
||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function addWindow(Inventory $inventory){
|
public function addWindow(Inventory $inventory, $forceId = null){
|
||||||
if($this->windows->contains($inventory)){
|
if($this->windows->contains($inventory)){
|
||||||
return $this->windows[$inventory];
|
return $this->windows[$inventory];
|
||||||
}
|
}
|
||||||
|
if($forceId === null){
|
||||||
$this->windowCnt = $cnt = max(2, ++$this->windowCnt % 99);
|
$this->windowCnt = $cnt = max(2, ++$this->windowCnt % 99);
|
||||||
|
}else{
|
||||||
|
$cnt = (int) $forceId;
|
||||||
|
}
|
||||||
$this->windowIndex[$cnt] = $inventory;
|
$this->windowIndex[$cnt] = $inventory;
|
||||||
$this->windows->attach($inventory, $cnt);
|
$this->windows->attach($inventory, $cnt);
|
||||||
$this->inventory->onOpen($this);
|
$inventory->onOpen($this);
|
||||||
|
|
||||||
return $cnt;
|
return $cnt;
|
||||||
}
|
}
|
||||||
|
@ -682,7 +682,7 @@ abstract class Block extends Position implements Metadatable{
|
|||||||
return $this->getLevel()->getBlock($v);
|
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(){
|
protected function initEntity(){
|
||||||
$this->inventory = new PlayerInventory($this);
|
$this->inventory = new PlayerInventory($this);
|
||||||
|
if($this instanceof Player){
|
||||||
|
$this->addWindow($this->inventory, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(isset($this->namedtag->NameTag)){
|
if(isset($this->namedtag->NameTag)){
|
||||||
$this->nameTag = $this->namedtag["NameTag"];
|
$this->nameTag = $this->namedtag["NameTag"];
|
||||||
|
@ -59,12 +59,6 @@ abstract class BaseInventory implements Inventory{
|
|||||||
$this->holder = $holder;
|
$this->holder = $holder;
|
||||||
$this->viewers = new \SplObjectStorage();
|
$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;
|
$this->type = $type;
|
||||||
if($overrideSize !== null){
|
if($overrideSize !== null){
|
||||||
$this->size = (int) $overrideSize;
|
$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));
|
Server::getInstance()->getPluginManager()->callEvent($ev = new EntityInventoryChangeEvent($holder, $this->getItem($index), $item, $index));
|
||||||
if($ev->isCancelled()){
|
if($ev->isCancelled()){
|
||||||
$this->sendContents($this->getViewers());
|
$this->sendContents($this->getViewers());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$item = $ev->getNewItem();
|
$item = $ev->getNewItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
$old = $this->slots[$index];
|
$old = $this->getItem($index);
|
||||||
$this->slots[$index] = clone $item;
|
$this->slots[$index] = clone $item;
|
||||||
$this->onSlotChange($index, $old);
|
$this->onSlotChange($index, $old);
|
||||||
|
|
||||||
|
@ -211,16 +211,16 @@ class PlayerInventory extends BaseInventory{
|
|||||||
|
|
||||||
if($index >= $this->getSize()){ //Armor change
|
if($index >= $this->getSize()){ //Armor change
|
||||||
Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $this->getItem($index), $item, $index));
|
Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $this->getItem($index), $item, $index));
|
||||||
if($ev->isCancelled()){
|
if($ev->isCancelled() and $this->getHolder() instanceof Player){
|
||||||
$this->sendArmorContents($this);
|
$this->sendArmorContents($this->getHolder());
|
||||||
$this->sendContents($this);
|
$this->sendContents($this->getHolder());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$item = $ev->getNewItem();
|
$item = $ev->getNewItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
$old = $this->slots[$index];
|
$old = $this->getItem($index);
|
||||||
$this->slots[$index] = clone $item;
|
$this->slots[$index] = clone $item;
|
||||||
$this->onSlotChange($index, $old);
|
$this->onSlotChange($index, $old);
|
||||||
|
|
||||||
|
@ -479,14 +479,14 @@ class Level{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*
|
||||||
* @param Vector3 $pos
|
* @param Vector3 $pos
|
||||||
*
|
*
|
||||||
* @return Block
|
* @return Block
|
||||||
*/
|
*/
|
||||||
public function getBlockRaw(Vector3 $pos){
|
public function getBlockRaw(Vector3 $pos){
|
||||||
$b = $this->level->getBlock($pos->x, $pos->y, $pos->z);
|
return $this->getBlock($pos);
|
||||||
|
|
||||||
return Block::get($b[0], $b[1], new Position($pos->x, $pos->y, $pos->z, $this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -495,9 +495,6 @@ class Level{
|
|||||||
* @return bool|Block
|
* @return bool|Block
|
||||||
*/
|
*/
|
||||||
public function getBlock(Vector3 $pos){
|
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);
|
$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 Block::get($b[0], $b[1], new Position($pos->x, $pos->y, $pos->z, $this));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user