diff --git a/src/pocketmine/Thread.php b/src/pocketmine/Thread.php index c6b83d925..d8f1ec5e4 100644 --- a/src/pocketmine/Thread.php +++ b/src/pocketmine/Thread.php @@ -26,10 +26,38 @@ namespace pocketmine; */ abstract class Thread extends \Thread{ + /** @var \ClassLoader */ + protected $classLoader; + + public function getClassLoader(){ + return $this->classLoader; + } + + public function setClassLoader(\ClassLoader $loader = null){ + if($loader === null){ + $loader = Server::getInstance()->getLoader(); + } + $this->classLoader = $loader; + } + + public function registerClassLoader(){ + if(!interface_exists("ClassLoader", false)){ + require(\pocketmine\PATH . "src/spl/ClassLoader.php"); + require(\pocketmine\PATH . "src/spl/BaseClassLoader.php"); + require(\pocketmine\PATH . "src/pocketmine/CompatibleClassLoader.php"); + } + if($this->classLoader !== null){ + $this->classLoader->register(true); + } + } + public function start($options = PTHREADS_INHERIT_ALL){ ThreadManager::getInstance()->add($this); if(!$this->isRunning() and !$this->isJoined() and !$this->isTerminated()){ + if($this->getClassLoader() === null){ + $this->setClassLoader(); + } return parent::start($options); } diff --git a/src/pocketmine/Worker.php b/src/pocketmine/Worker.php index 7f65b6e0d..58ec885ec 100644 --- a/src/pocketmine/Worker.php +++ b/src/pocketmine/Worker.php @@ -26,10 +26,38 @@ namespace pocketmine; */ abstract class Worker extends \Worker{ + /** @var \ClassLoader */ + protected $classLoader; + + public function getClassLoader(){ + return $this->classLoader; + } + + public function setClassLoader(\ClassLoader $loader = null){ + if($loader === null){ + $loader = Server::getInstance()->getLoader(); + } + $this->classLoader = $loader; + } + + public function registerClassLoader(){ + if(!interface_exists("ClassLoader", false)){ + require(\pocketmine\PATH . "src/spl/ClassLoader.php"); + require(\pocketmine\PATH . "src/spl/BaseClassLoader.php"); + require(\pocketmine\PATH . "src/pocketmine/CompatibleClassLoader.php"); + } + if($this->classLoader !== null){ + $this->classLoader->register(true); + } + } + public function start($options = PTHREADS_INHERIT_ALL){ ThreadManager::getInstance()->add($this); - if(!$this->isRunning() and !$this->isJoined() and !$this->isTerminated() and !$this->isShutdown()){ + if(!$this->isRunning() and !$this->isJoined() and !$this->isTerminated()){ + if($this->getClassLoader() === null){ + $this->setClassLoader(); + } return parent::start($options); } diff --git a/src/pocketmine/command/defaults/StatusCommand.php b/src/pocketmine/command/defaults/StatusCommand.php index e73aae953..1f7ea19ff 100644 --- a/src/pocketmine/command/defaults/StatusCommand.php +++ b/src/pocketmine/command/defaults/StatusCommand.php @@ -23,7 +23,6 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; use pocketmine\utils\TextFormat; -use pocketmine\ThreadManager; class StatusCommand extends VanillaCommand{ diff --git a/src/pocketmine/entity/Effect.php b/src/pocketmine/entity/Effect.php index ecd0b40c6..00fdb153f 100644 --- a/src/pocketmine/entity/Effect.php +++ b/src/pocketmine/entity/Effect.php @@ -180,17 +180,17 @@ class Effect{ public function canTick(){ switch($this->id){ case Effect::POISON: - if(($interval = 25 >> $this->amplifier) > 0){ + if(($interval = (25 >> $this->amplifier)) > 0){ return ($this->duration % $interval) === 0; } return true; case Effect::WITHER: - if(($interval = 50 >> $this->amplifier) > 0){ + if(($interval = (50 >> $this->amplifier)) > 0){ return ($this->duration % $interval) === 0; } return true; case Effect::REGENERATION: - if(($interval = 40 >> $this->amplifier) > 0){ + if(($interval = (40 >> $this->amplifier)) > 0){ return ($this->duration % $interval) === 0; } return true; diff --git a/src/pocketmine/entity/Living.php b/src/pocketmine/entity/Living.php index b587a5975..37cb3b8a4 100644 --- a/src/pocketmine/entity/Living.php +++ b/src/pocketmine/entity/Living.php @@ -73,6 +73,15 @@ abstract class Living extends Entity implements Damageable{ //return $this->getLevel()->rayTraceBlocks(Vector3::createVector($this->x, $this->y + $this->height, $this->z), Vector3::createVector($entity->x, $entity->y + $entity->height, $entity->z)) === null; } + public function heal($amount, EntityRegainHealthEvent $source){ + parent::heal($amount, $source); + if($source->isCancelled()){ + return; + } + + $this->attackTime = 0; + } + public function attack($damage, EntityDamageEvent $source){ if($this->attackTime > 0 or $this->noDamageTicks > 0){ $lastCause = $this->getLastDamageCause(); diff --git a/src/pocketmine/inventory/CraftingManager.php b/src/pocketmine/inventory/CraftingManager.php index 056bed28c..4abae9c04 100644 --- a/src/pocketmine/inventory/CraftingManager.php +++ b/src/pocketmine/inventory/CraftingManager.php @@ -273,7 +273,7 @@ class CraftingManager{ Item::IRON_BLOCK => Item::IRON_INGOT, Item::DIAMOND_BLOCK => Item::DIAMOND, Item::EMERALD_BLOCK => Item::EMERALD, - //Item::REDSTONE_BLOCK => Item::REDSTONE_DUST, + Item::REDSTONE_BLOCK => Item::REDSTONE_DUST, Item::COAL_BLOCK => Item::COAL, Item::HAY_BALE => Item::WHEAT, ]; diff --git a/src/pocketmine/scheduler/AsyncPool.php b/src/pocketmine/scheduler/AsyncPool.php index 39f714203..a58aac9e9 100644 --- a/src/pocketmine/scheduler/AsyncPool.php +++ b/src/pocketmine/scheduler/AsyncPool.php @@ -46,7 +46,8 @@ class AsyncPool{ for($i = 0; $i < $this->size; ++$i){ $this->workerUsage[$i] = 0; - $this->workers[$i] = new AsyncWorker($server->getLoader()); + $this->workers[$i] = new AsyncWorker; + $this->workers[$i]->setClassLoader($server->getLoader()); $this->workers[$i]->start(); } } diff --git a/src/pocketmine/scheduler/AsyncWorker.php b/src/pocketmine/scheduler/AsyncWorker.php index 3b78e1eb0..40580ef8f 100644 --- a/src/pocketmine/scheduler/AsyncWorker.php +++ b/src/pocketmine/scheduler/AsyncWorker.php @@ -25,19 +25,8 @@ use pocketmine\Worker; class AsyncWorker extends Worker{ - public $loader; - - public function __construct(\ClassLoader $loader){ - $this->loader = $loader; - } - public function run(){ - if(!interface_exists("ClassLoader", false)){ - require(\pocketmine\PATH . "src/spl/ClassLoader.php"); - require(\pocketmine\PATH . "src/spl/BaseClassLoader.php"); - require(\pocketmine\PATH . "src/pocketmine/CompatibleClassLoader.php"); - } - $this->loader->register(true); + $this->registerClassLoader(); global $store; $store = [];