Fixed invalid metadata and updated weak references on PluginManager

This commit is contained in:
Shoghi Cervantes 2014-05-23 22:30:37 +02:00
parent 53749483c3
commit 683ab8d2cd
6 changed files with 61 additions and 26 deletions

View File

@ -33,8 +33,10 @@ class BlockMetadataStore extends MetadataStore{
$this->owningLevel = $owningLevel; $this->owningLevel = $owningLevel;
} }
/** @noinspection PhpHierarchyChecksInspection */ public function disambiguate(Metadatable $block, $metadataKey){
public function disambiguate(Block $block, $metadataKey){ if(!($block instanceof Block)){
throw new \InvalidArgumentException("Argument must be a Block instance");
}
return $block->x . ":" . $block->y . ":" . $block->z . ":" . $metadataKey; return $block->x . ":" . $block->y . ":" . $block->z . ":" . $metadataKey;
} }

View File

@ -25,8 +25,10 @@ use pocketmine\entity\Entity;
class EntityMetadataStore extends MetadataStore{ class EntityMetadataStore extends MetadataStore{
/** @noinspection PhpHierarchyChecksInspection */ public function disambiguate(Metadatable $entity, $metadataKey){
public function disambiguate(Entity $entity, $metadataKey){ if(!($entity instanceof Entity)){
throw new \InvalidArgumentException("Argument must be an Entity instance");
}
return $entity->getID() . ":" . $metadataKey; return $entity->getID() . ":" . $metadataKey;
} }
} }

View File

@ -25,8 +25,10 @@ use pocketmine\level\Level;
class LevelMetadataStore extends MetadataStore{ class LevelMetadataStore extends MetadataStore{
/** @noinspection PhpHierarchyChecksInspection */ public function disambiguate(Metadatable $level, $metadataKey){
public function disambiguate(Level $level, $metadataKey){ if(!($level instanceof Level)){
throw new \InvalidArgumentException("Argument must be a Level instance");
}
return strtolower($level->getName()) . ":" . $metadataKey; return strtolower($level->getName()) . ":" . $metadataKey;
} }
} }

View File

@ -45,7 +45,7 @@ abstract class MetadataStore{
return; return;
} }
$key = $this->disambiguate($subject, $newMetadataValue); $key = $this->disambiguate($subject, $metadataKey);
if(!isset($this->metadataMap[$key])){ if(!isset($this->metadataMap[$key])){
$entry = new \WeakMap(); $entry = new \WeakMap();
$this->metadataMap[$key] = $entry; $this->metadataMap[$key] = $entry;
@ -122,10 +122,12 @@ abstract class MetadataStore{
* Creates a unique name for the object receiving metadata by combining * Creates a unique name for the object receiving metadata by combining
* unique data from the subject with a metadataKey. * unique data from the subject with a metadataKey.
* *
* @param mixed $subject * @param Metadatable $subject
* @param string $metadataKey * @param string $metadataKey
* *
* @return string * @return string
*
* @throws \InvalidArgumentException
*/ */
public abstract function disambiguate($subject, $metadataKey); public abstract function disambiguate(Metadatable $subject, $metadataKey);
} }

View File

@ -25,8 +25,10 @@ use pocketmine\OfflinePlayer;
class PlayerMetadataStore extends MetadataStore{ class PlayerMetadataStore extends MetadataStore{
/** @noinspection PhpHierarchyChecksInspection */ public function disambiguate(Metadatable $player, $metadataKey){
public function disambiguate(OfflinePlayer $player, $metadataKey){ if(!($player instanceof OfflinePlayer)){
throw new \InvalidArgumentException("Argument must be an OfflinePlayer instance");
}
return strtolower($player->getName()) . ":" . $metadataKey; return strtolower($player->getName()) . ":" . $metadataKey;
} }
} }

View File

@ -70,12 +70,12 @@ class PluginManager{
/** /**
* @var Permissible[] * @var Permissible[]
*/ */
protected $defSubs; protected $defSubs = [];
/** /**
* @var Permissible[] * @var Permissible[]
*/ */
protected $defSubsOp; protected $defSubsOp = [];
/** /**
* @var PluginLoader[] * @var PluginLoader[]
@ -89,8 +89,6 @@ class PluginManager{
public function __construct(Server $server, SimpleCommandMap $commandMap){ public function __construct(Server $server, SimpleCommandMap $commandMap){
$this->server = $server; $this->server = $server;
$this->commandMap = $commandMap; $this->commandMap = $commandMap;
$this->defSubs = new \WeakMap();
$this->defSubsOp = new \WeakMap();
} }
/** /**
@ -408,9 +406,9 @@ class PluginManager{
*/ */
public function subscribeToPermission($permission, Permissible $permissible){ public function subscribeToPermission($permission, Permissible $permissible){
if(!isset($this->permSubs[$permission])){ if(!isset($this->permSubs[$permission])){
$this->permSubs[$permission] = new \WeakRef(); $this->permSubs[$permission] = [];
} }
$this->permSubs[$permission][$permissible] = true; $this->permSubs[$permission][spl_object_hash($permissible)] = new \WeakRef($permissible);
} }
/** /**
@ -419,7 +417,7 @@ class PluginManager{
*/ */
public function unsubscribeFromPermission($permission, Permissible $permissible){ public function unsubscribeFromPermission($permission, Permissible $permissible){
if(isset($this->permSubs[$permission])){ if(isset($this->permSubs[$permission])){
unset($this->permSubs[$permission][$permissible]); unset($this->permSubs[$permission][spl_object_hash($permissible)]);
} }
} }
@ -430,7 +428,16 @@ class PluginManager{
*/ */
public function getPermissionSubscriptions($permission){ public function getPermissionSubscriptions($permission){
if(isset($this->permSubs[$permission])){ if(isset($this->permSubs[$permission])){
return $this->permSubs[$permission]; $subs = [];
foreach($this->permSubs[$permission] as $k => $perm){
/** @var \WeakRef $perm */
if($perm->valid()){
$subs[] = $perm->get();
}else{
unset($this->permSubs[$permission][$k]);
}
}
return $subs;
} }
return []; return [];
@ -442,9 +449,9 @@ class PluginManager{
*/ */
public function subscribeToDefaultPerms($op, Permissible $permissible){ public function subscribeToDefaultPerms($op, Permissible $permissible){
if($op === true){ if($op === true){
$this->defSubsOp[$permissible] = true; $this->defSubsOp[spl_object_hash($permissible)] = new \WeakRef($permissible);
}else{ }else{
$this->defSubs[$permissible] = true; $this->defSubs[spl_object_hash($permissible)] = new \WeakRef($permissible);
} }
} }
@ -454,9 +461,9 @@ class PluginManager{
*/ */
public function unsubscribeFromDefaultPerms($op, Permissible $permissible){ public function unsubscribeFromDefaultPerms($op, Permissible $permissible){
if($op === true){ if($op === true){
unset($this->defSubsOp[$permissible]); unset($this->defSubsOp[spl_object_hash($permissible)]);
}else{ }else{
unset($this->defSubs[$permissible]); unset($this->defSubs[spl_object_hash($permissible)]);
} }
} }
@ -466,12 +473,30 @@ class PluginManager{
* @return Permissible[] * @return Permissible[]
*/ */
public function getDefaultPermSubscriptions($op){ public function getDefaultPermSubscriptions($op){
$subs = [];
if($op === true){ if($op === true){
return $this->defSubsOp; foreach($this->defSubsOp as $k => $perm){
/** @var \WeakRef $perm */
if($perm->valid()){
$subs[] = $perm->get();
}else{ }else{
return $this->defSubs; unset($this->defSubsOp[$k]);
} }
} }
}else{
foreach($this->defSubs as $k => $perm){
/** @var \WeakRef $perm */
if($perm->valid()){
$subs[] = $perm->get();
}else{
unset($this->defSubs[$k]);
}
}
}
return $subs;
}
/** /**
* @return Permission[] * @return Permission[]