Server can be joined, again! (fixed weak references and blocks)

This commit is contained in:
Shoghi Cervantes 2014-05-23 23:12:15 +02:00
parent a2b3a4bb90
commit 5460ccf41c
6 changed files with 21 additions and 22 deletions

View File

@ -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];
} }
$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->windowIndex[$cnt] = $inventory;
$this->windows->attach($inventory, $cnt); $this->windows->attach($inventory, $cnt);
$this->inventory->onOpen($this); $inventory->onOpen($this);
return $cnt; return $cnt;
} }

View File

@ -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);
} }
/** /**

View File

@ -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"];

View File

@ -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);

View File

@ -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);

View File

@ -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));