Fixed MetadataStore

This commit is contained in:
Dylan K. Taylor 2017-08-16 17:09:03 +01:00
parent 696c67f541
commit ea414ea72d
2 changed files with 31 additions and 39 deletions

View File

@ -43,45 +43,45 @@ class BlockMetadataStore extends MetadataStore{
return $block->x . ":" . $block->y . ":" . $block->z . ":" . $metadataKey; return $block->x . ":" . $block->y . ":" . $block->z . ":" . $metadataKey;
} }
public function getMetadata($block, $metadataKey){ public function getMetadata(Metadatable $subject, string $metadataKey){
if(!($block instanceof Block)){ if(!($subject instanceof Block)){
throw new \InvalidArgumentException("Object must be a Block"); throw new \InvalidArgumentException("Object must be a Block");
} }
if($block->getLevel() === $this->owningLevel){ if($subject->getLevel() === $this->owningLevel){
return parent::getMetadata($block, $metadataKey); return parent::getMetadata($subject, $metadataKey);
}else{ }else{
throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName()); throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName());
} }
} }
public function hasMetadata($block, $metadataKey){ public function hasMetadata(Metadatable $subject, string $metadataKey) : bool{
if(!($block instanceof Block)){ if(!($subject instanceof Block)){
throw new \InvalidArgumentException("Object must be a Block"); throw new \InvalidArgumentException("Object must be a Block");
} }
if($block->getLevel() === $this->owningLevel){ if($subject->getLevel() === $this->owningLevel){
return parent::hasMetadata($block, $metadataKey); return parent::hasMetadata($subject, $metadataKey);
}else{ }else{
throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName()); throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName());
} }
} }
public function removeMetadata($block, $metadataKey, Plugin $owningPlugin){ public function removeMetadata(Metadatable $subject, string $metadataKey, Plugin $owningPlugin){
if(!($block instanceof Block)){ if(!($subject instanceof Block)){
throw new \InvalidArgumentException("Object must be a Block"); throw new \InvalidArgumentException("Object must be a Block");
} }
if($block->getLevel() === $this->owningLevel){ if($subject->getLevel() === $this->owningLevel){
parent::removeMetadata($block, $metadataKey, $owningPlugin); parent::removeMetadata($subject, $metadataKey, $owningPlugin);
}else{ }else{
throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName()); throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName());
} }
} }
public function setMetadata($block, $metadataKey, MetadataValue $newMetadatavalue){ public function setMetadata(Metadatable $subject, string $metadataKey, MetadataValue $newMetadataValue){
if(!($block instanceof Block)){ if(!($subject instanceof Block)){
throw new \InvalidArgumentException("Object must be a Block"); throw new \InvalidArgumentException("Object must be a Block");
} }
if($block->getLevel() === $this->owningLevel){ if($subject->getLevel() === $this->owningLevel){
parent::setMetadata($block, $metadataKey, $newMetadatavalue); parent::setMetadata($subject, $metadataKey, $newMetadataValue);
}else{ }else{
throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName()); throw new \InvalidStateException("Block does not belong to world " . $this->owningLevel->getName());
} }

View File

@ -30,19 +30,17 @@ use pocketmine\plugin\Plugin;
use pocketmine\plugin\PluginException; use pocketmine\plugin\PluginException;
abstract class MetadataStore{ abstract class MetadataStore{
/** @var \WeakMap[] */ /** @var \SplObjectStorage[] */
private $metadataMap; private $metadataMap;
/** /**
* Adds a metadata value to an object. * Adds a metadata value to an object.
* *
* @param mixed $subject * @param Metadatable $subject
* @param string $metadataKey * @param string $metadataKey
* @param MetadataValue $newMetadataValue * @param MetadataValue $newMetadataValue
*
* @throws \Exception
*/ */
public function setMetadata($subject, $metadataKey, MetadataValue $newMetadataValue){ public function setMetadata(Metadatable $subject, string $metadataKey, MetadataValue $newMetadataValue){
$owningPlugin = $newMetadataValue->getOwningPlugin(); $owningPlugin = $newMetadataValue->getOwningPlugin();
if($owningPlugin === null){ if($owningPlugin === null){
throw new PluginException("Plugin cannot be null"); throw new PluginException("Plugin cannot be null");
@ -50,8 +48,8 @@ abstract class MetadataStore{
$key = $this->disambiguate($subject, $metadataKey); $key = $this->disambiguate($subject, $metadataKey);
if(!isset($this->metadataMap[$key])){ if(!isset($this->metadataMap[$key])){
//$entry = new \WeakMap(); $entry = new \SplObjectStorage();
$this->metadataMap[$key] = new \SplObjectStorage();//$entry; $this->metadataMap[$key] = $entry;
}else{ }else{
$entry = $this->metadataMap[$key]; $entry = $this->metadataMap[$key];
} }
@ -62,14 +60,12 @@ abstract class MetadataStore{
* Returns all metadata values attached to an object. If multiple * Returns all metadata values attached to an object. If multiple
* have attached metadata, each will value will be included. * have attached metadata, each will value will be included.
* *
* @param mixed $subject * @param Metadatable $subject
* @param string $metadataKey * @param string $metadataKey
* *
* @return MetadataValue[] * @return MetadataValue[]
*
* @throws \Exception
*/ */
public function getMetadata($subject, $metadataKey){ public function getMetadata(Metadatable $subject, string $metadataKey){
$key = $this->disambiguate($subject, $metadataKey); $key = $this->disambiguate($subject, $metadataKey);
if(isset($this->metadataMap[$key])){ if(isset($this->metadataMap[$key])){
return $this->metadataMap[$key]; return $this->metadataMap[$key];
@ -81,27 +77,23 @@ abstract class MetadataStore{
/** /**
* Tests to see if a metadata attribute has been set on an object. * Tests to see if a metadata attribute has been set on an object.
* *
* @param mixed $subject * @param Metadatable $subject
* @param string $metadataKey * @param string $metadataKey
* *
* @return bool * @return bool
*
* @throws \Exception
*/ */
public function hasMetadata($subject, $metadataKey){ public function hasMetadata(Metadatable $subject, string $metadataKey) : bool{
return isset($this->metadataMap[$this->disambiguate($subject, $metadataKey)]); return isset($this->metadataMap[$this->disambiguate($subject, $metadataKey)]);
} }
/** /**
* Removes a metadata item owned by a plugin from a subject. * Removes a metadata item owned by a plugin from a subject.
* *
* @param mixed $subject * @param Metadatable $subject
* @param string $metadataKey * @param string $metadataKey
* @param Plugin $owningPlugin * @param Plugin $owningPlugin
*
* @throws \Exception
*/ */
public function removeMetadata($subject, $metadataKey, Plugin $owningPlugin){ public function removeMetadata(Metadatable $subject, string $metadataKey, Plugin $owningPlugin){
$key = $this->disambiguate($subject, $metadataKey); $key = $this->disambiguate($subject, $metadataKey);
if(isset($this->metadataMap[$key])){ if(isset($this->metadataMap[$key])){
unset($this->metadataMap[$key][$owningPlugin]); unset($this->metadataMap[$key][$owningPlugin]);