Throw an exception before calling base entity constructor if skin is not set or invalid, close #835 (#855)

This commit is contained in:
Dylan K. Taylor 2017-04-24 09:50:55 +01:00 committed by GitHub
parent 6ece57e23e
commit 559504225a
2 changed files with 25 additions and 5 deletions

View File

@ -27,6 +27,7 @@ use pocketmine\event\player\PlayerExhaustEvent;
use pocketmine\inventory\InventoryHolder;
use pocketmine\inventory\PlayerInventory;
use pocketmine\item\Item as ItemItem;
use pocketmine\level\Level;
use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag;
@ -61,13 +62,21 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
public $eyeHeight = 1.62;
protected $skinId;
protected $skin;
protected $skin = null;
protected $foodTickTimer = 0;
protected $totalXp = 0;
protected $xpSeed;
public function __construct(Level $level, CompoundTag $nbt){
if($this->skin === null and (!isset($nbt->Skin) or !isset($nbt->Skin->Data) or !Player::isValidSkin($nbt->Skin->Data->getValue()))){
throw new \InvalidStateException((new \ReflectionClass($this))->getShortName() . " must have a valid skin set");
}
parent::__construct($level, $nbt);
}
public function getSkinData(){
return $this->skin;
}
@ -95,6 +104,10 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
* @param string $skinId
*/
public function setSkin($str, $skinId){
if(!Player::isValidSkin($str)){
throw new \InvalidStateException("Specified skin is not valid, must be 8KiB or 16KiB");
}
$this->skin = $str;
$this->skinId = $skinId;
}
@ -483,7 +496,7 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
if($player !== $this and !isset($this->hasSpawned[$player->getLoaderId()])){
$this->hasSpawned[$player->getLoaderId()] = $player;
if(strlen($this->skin) < 64 * 32 * 4){
if(!Player::isValidSkin($this->skin)){
throw new \InvalidStateException((new \ReflectionClass($this))->getShortName() . " must have a valid skin set");
}

View File

@ -697,9 +697,16 @@ class Chunk{
continue; //Fixes entities allocated in wrong chunks.
}
if(($entity = Entity::createEntity($nbt["id"], $level, $nbt)) instanceof Entity){
$entity->spawnToAll();
}else{
try{
$entity = Entity::createEntity($nbt["id"], $level, $nbt);
if($entity instanceof Entity){
$entity->spawnToAll();
}else{
$changed = true;
continue;
}
}catch(\Throwable $t){
$level->getServer()->getLogger()->logException($t);
$changed = true;
continue;
}