diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 90d7a9d8e..b5626f7b8 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1813,7 +1813,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ if($packet->face >= 0 and $packet->face <= 5){ //Use Block, place $this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION, false); - if(!$this->canInteract($blockVector->add(0.5, 0.5, 0.5), 10) or $this->isSpectator()){ + if(!$this->canInteract($blockVector->add(0.5, 0.5, 0.5), 13) or $this->isSpectator()){ }elseif($this->isCreative()){ $item = $this->inventory->getItemInHand(); @@ -2084,7 +2084,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $oldItem = clone $item; - if($this->canInteract($vector->add(0.5, 0.5, 0.5), 10) and $this->level->useBreakOn($vector, $item, $this) === true){ + if($this->canInteract($vector->add(0.5, 0.5, 0.5), 13) and $this->level->useBreakOn($vector, $item, $this) === true){ if($this->isSurvival()){ if(!$item->equals($oldItem, true) or $item->getCount() !== $oldItem->getCount()){ $this->inventory->setItemInHand($item, $this); @@ -2754,7 +2754,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } public function kill(){ - if(!$this->isAlive() or $this->spawned === false){ + if(!$this->spawned){ return; } @@ -2863,10 +2863,6 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } - if(!$this->isAlive()){ - return; - } - Entity::kill(); $this->server->getPluginManager()->callEvent($ev = new PlayerDeathEvent($this, $this->getDrops(), new TranslationContainer($message, $params))); diff --git a/src/pocketmine/block/Fallable.php b/src/pocketmine/block/Fallable.php index ba0afe03a..5a7417531 100644 --- a/src/pocketmine/block/Fallable.php +++ b/src/pocketmine/block/Fallable.php @@ -47,7 +47,7 @@ abstract class Fallable extends Solid{ $fall = Entity::createEntity("FallingSand", $this->getLevel()->getChunk($this->x >> 4, $this->z >> 4), new Compound("", [ "Pos" => new Enum("Pos", [ new Double("", $this->x + 0.5), - new Double("", $this->y + 0.5), + new Double("", $this->y), new Double("", $this->z + 0.5) ]), "Motion" => new Enum("Motion", [ diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index cace4bcfb..27a17f69a 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -24,6 +24,7 @@ */ namespace pocketmine\entity; +use pocketmine\block\Block; use pocketmine\block\Water; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityDespawnEvent; @@ -568,13 +569,14 @@ abstract class Entity extends Location implements Metadatable{ * @param int $amount */ public function setHealth($amount){ + $amount = (int) $amount; if($amount === $this->health){ return; } if($amount <= 0){ - $this->health = 0; - if(!$this->isAlive()){ + if($this->isAlive()){ + $this->health = 0; $this->kill(); } }elseif($amount <= $this->getMaxHealth() or $amount < $this->health){ @@ -617,23 +619,21 @@ abstract class Entity extends Location implements Metadatable{ } protected function checkObstruction($x, $y, $z){ - $i = Math::floorFloat($x); - $j = Math::floorFloat($y); - $k = Math::floorFloat($z); + $i = (int) $x; + $j = (int) $y; + $k = (int) $z; $diffX = $x - $i; $diffY = $y - $j; $diffZ = $z - $k; - $v = new Vector3($i, $j, $k); - - if($this->level->isFullBlock($v)){ - $flag = !$this->level->isFullBlock($v->setComponents($i - 1, $j, $k)); - $flag1 = !$this->level->isFullBlock($v->setComponents($i + 1, $j, $k)); - $flag2 = !$this->level->isFullBlock($v->setComponents($i, $j - 1, $k)); - $flag3 = !$this->level->isFullBlock($v->setComponents($i, $j + 1, $k)); - $flag4 = !$this->level->isFullBlock($v->setComponents($i, $j, $k - 1)); - $flag5 = !$this->level->isFullBlock($v->setComponents($i, $j, $k + 1)); + if(Block::$solid[$this->level->getBlockIdAt($i, $j, $k)]){ + $flag = !Block::$solid[$this->level->getBlockIdAt($i - 1, $j, $k)]; + $flag1 = !Block::$solid[$this->level->getBlockIdAt($i + 1, $j, $k)]; + $flag2 = !Block::$solid[$this->level->getBlockIdAt($i, $j - 1, $k)]; + $flag3 = !Block::$solid[$this->level->getBlockIdAt($i, $j + 1, $k)]; + $flag4 = !Block::$solid[$this->level->getBlockIdAt($i, $j, $k - 1)]; + $flag5 = !Block::$solid[$this->level->getBlockIdAt($i, $j, $k + 1)]; $direction = -1; $limit = 9999; @@ -701,10 +701,9 @@ abstract class Entity extends Location implements Metadatable{ if($direction === 5){ $this->motionY = $force; + + return true; } - - return true; - } return false; @@ -1385,9 +1384,6 @@ abstract class Entity extends Location implements Metadatable{ } public function kill(){ - if(!$this->isAlive()){ - return; - } $this->setHealth(0); $this->scheduleUpdate(); } diff --git a/src/pocketmine/entity/FallingSand.php b/src/pocketmine/entity/FallingSand.php index 830719109..5e72ca8e5 100644 --- a/src/pocketmine/entity/FallingSand.php +++ b/src/pocketmine/entity/FallingSand.php @@ -95,8 +95,10 @@ class FallingSand extends Entity{ $hasUpdate = $this->entityBaseTick($tickDiff); if($this->isAlive()){ + $pos = (new Vector3($this->x - 0.5, $this->y, $this->z - 0.5))->floor(); + if($this->ticksLived === 1){ - $block = $this->level->getBlock($pos = (new Vector3($this->x - 0.5, $this->y - 0.5, $this->z - 0.5))->floor()); + $block = $this->level->getBlock($pos); if($block->getId() !== $this->blockId){ $this->kill(); return true; @@ -114,7 +116,7 @@ class FallingSand extends Entity{ $this->motionY *= 1 - $this->drag; $this->motionZ *= $friction; - $pos = (new Vector3($this->x, $this->y, $this->z))->floor(); + $pos = (new Vector3($this->x - 0.5, $this->y, $this->z - 0.5))->floor(); if($this->onGround){ $this->kill(); diff --git a/src/pocketmine/entity/Item.php b/src/pocketmine/entity/Item.php index 7c6179514..5b8068619 100644 --- a/src/pocketmine/entity/Item.php +++ b/src/pocketmine/entity/Item.php @@ -83,7 +83,7 @@ class Item extends Entity{ } public function onUpdate($currentTick){ - if($this->closed !== false){ + if($this->closed){ return false; } @@ -102,7 +102,7 @@ class Item extends Entity{ $this->motionY -= $this->gravity; - $this->checkObstruction($this->x, ($this->boundingBox->minY + $this->boundingBox->maxY) / 2, $this->z); + $this->checkObstruction($this->x, $this->y, $this->z); $this->move($this->motionX, $this->motionY, $this->motionZ); $friction = 1 - $this->drag; diff --git a/src/pocketmine/level/Explosion.php b/src/pocketmine/level/Explosion.php index 7d3ded1e2..cd5d3a0b8 100644 --- a/src/pocketmine/level/Explosion.php +++ b/src/pocketmine/level/Explosion.php @@ -130,7 +130,7 @@ class Explosion{ public function explodeB(){ $send = []; - $source = (new Vector3($this->source->x, $this->source->y, $this->source->z))->round(); + $source = (new Vector3($this->source->x, $this->source->y, $this->source->z))->floor(); $yield = (1 / $this->size) * 100; if($this->what instanceof Entity){ diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 1a8aa9dd2..8b0befbd5 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -953,12 +953,12 @@ class Level implements ChunkManager, Metadatable{ * @return AxisAlignedBB[] */ public function getCollisionCubes(Entity $entity, AxisAlignedBB $bb, $entities = true){ - $minX = Math::floorFloat($bb->minX); - $minY = Math::floorFloat($bb->minY); - $minZ = Math::floorFloat($bb->minZ); - $maxX = Math::ceilFloat($bb->maxX); - $maxY = Math::ceilFloat($bb->maxY); - $maxZ = Math::ceilFloat($bb->maxZ); + $minX = (int) $bb->minX; + $minY = (int) $bb->minY; + $minZ = (int) $bb->minZ; + $maxX = (int) ($bb->maxX + 1); + $maxY = (int) ($bb->maxY + 1); + $maxZ = (int) ($bb->maxZ + 1); $collides = []; $v = $this->temporalVector; diff --git a/src/pocketmine/level/format/generic/BaseFullChunk.php b/src/pocketmine/level/format/generic/BaseFullChunk.php index 6114c3e8c..ab9287078 100644 --- a/src/pocketmine/level/format/generic/BaseFullChunk.php +++ b/src/pocketmine/level/format/generic/BaseFullChunk.php @@ -66,6 +66,8 @@ abstract class BaseFullChunk implements FullChunk{ protected $hasChanged = false; + private $isInit = false; + /** * @param LevelProvider $provider * @param int $x @@ -106,7 +108,7 @@ abstract class BaseFullChunk implements FullChunk{ } public function initChunk(){ - if($this->getProvider() instanceof LevelProvider and $this->NBTentities !== null){ + if($this->getProvider() instanceof LevelProvider and !$this->isInit and $this->NBTentities !== null){ $this->getProvider()->getLevel()->timings->syncChunkLoadEntitiesTimer->startTiming(); foreach($this->NBTentities as $nbt){ if($nbt instanceof Compound){ @@ -154,8 +156,8 @@ abstract class BaseFullChunk implements FullChunk{ $this->NBTentities = null; $this->NBTtiles = null; - $this->hasChanged = false; + $this->isInit = true; } if(!$this->isLightPopulated() and $this->isPopulated()){ @@ -280,14 +282,14 @@ abstract class BaseFullChunk implements FullChunk{ public function addEntity(Entity $entity){ $this->entities[$entity->getId()] = $entity; - if(!($entity instanceof Player)){ + if(!($entity instanceof Player) and $this->isInit){ $this->hasChanged = true; } } public function removeEntity(Entity $entity){ unset($this->entities[$entity->getId()]); - if(!($entity instanceof Player)){ + if(!($entity instanceof Player) and $this->isInit){ $this->hasChanged = true; } } @@ -298,13 +300,17 @@ abstract class BaseFullChunk implements FullChunk{ $this->tileList[$index]->close(); } $this->tileList[$index] = $tile; - $this->hasChanged = true; + if($this->isInit){ + $this->hasChanged = true; + } } public function removeTile(Tile $tile){ unset($this->tiles[$tile->getId()]); unset($this->tileList[(($tile->z & 0x0f) << 12) | (($tile->x & 0x0f) << 8) | ($tile->y & 0xff)]); - $this->hasChanged = true; + if($this->isInit){ + $this->hasChanged = true; + } } public function getEntities(){ diff --git a/src/pocketmine/level/format/leveldb/Chunk.php b/src/pocketmine/level/format/leveldb/Chunk.php index 3c5b629ad..1597d629c 100644 --- a/src/pocketmine/level/format/leveldb/Chunk.php +++ b/src/pocketmine/level/format/leveldb/Chunk.php @@ -247,7 +247,7 @@ class Chunk extends BaseFullChunk{ if($provider instanceof LevelDB){ $nbt = new NBT(NBT::LITTLE_ENDIAN); - $entityData = $provider->getDatabase()->get(substr($data, 0, 8) . "\x32"); + $entityData = $provider->getDatabase()->get(substr($data, 0, 8) . LevelDB::ENTRY_ENTITIES); if($entityData !== false and strlen($entityData) > 0){ $nbt->read($entityData, true); $entities = $nbt->getData(); @@ -255,7 +255,7 @@ class Chunk extends BaseFullChunk{ $entities = [$entities]; } } - $tileData = $provider->getDatabase()->get(substr($data, 0, 8) . "\x31"); + $tileData = $provider->getDatabase()->get(substr($data, 0, 8) . LevelDB::ENTRY_TILES); if($tileData !== false and strlen($tileData) > 0){ $nbt->read($tileData, true); $tiles = $nbt->getData(); @@ -302,9 +302,9 @@ class Chunk extends BaseFullChunk{ } if(count($entities) > 0){ - $provider->getDatabase()->put($chunkIndex . "\x32", implode($entities)); + $provider->getDatabase()->put($chunkIndex . LevelDB::ENTRY_ENTITIES, implode($entities)); }else{ - $provider->getDatabase()->delete($chunkIndex . "\x32"); + $provider->getDatabase()->delete($chunkIndex . LevelDB::ENTRY_ENTITIES); } @@ -318,9 +318,9 @@ class Chunk extends BaseFullChunk{ } if(count($tiles) > 0){ - $provider->getDatabase()->put($chunkIndex . "\x31", implode($tiles)); + $provider->getDatabase()->put($chunkIndex . LevelDB::ENTRY_TILES, implode($tiles)); }else{ - $provider->getDatabase()->delete($chunkIndex . "\x31"); + $provider->getDatabase()->delete($chunkIndex . LevelDB::ENTRY_TILES); } diff --git a/src/pocketmine/level/generator/Flat.php b/src/pocketmine/level/generator/Flat.php index cd2071538..5ccdc8c6d 100644 --- a/src/pocketmine/level/generator/Flat.php +++ b/src/pocketmine/level/generator/Flat.php @@ -32,6 +32,7 @@ use pocketmine\block\RedstoneOre; use pocketmine\item\Item; use pocketmine\level\ChunkManager; use pocketmine\level\format\FullChunk; +use pocketmine\level\generator\biome\Biome; use pocketmine\level\generator\populator\Ore; use pocketmine\level\generator\populator\Populator; use pocketmine\math\Vector3; @@ -110,10 +111,15 @@ class Flat extends Generator{ $this->chunk = clone $this->level->getChunk($chunkX, $chunkZ); $this->chunk->setGenerated(); + $c = Biome::getBiome($biome)->getColor(); + $R = $c >> 16; + $G = ($c >> 8) & 0xff; + $B = $c & 0xff; for($Z = 0; $Z < 16; ++$Z){ for($X = 0; $X < 16; ++$X){ $this->chunk->setBiomeId($X, $Z, $biome); + $this->chunk->setBiomeColor($X, $Z, $R, $G, $B); for($y = 0; $y < 128; ++$y){ $this->chunk->setBlock($X, $y, $Z, ...$this->structure[$y]); } diff --git a/src/pocketmine/nbt/tag/Compound.php b/src/pocketmine/nbt/tag/Compound.php index 95d34f61b..1bd680285 100644 --- a/src/pocketmine/nbt/tag/Compound.php +++ b/src/pocketmine/nbt/tag/Compound.php @@ -88,4 +88,14 @@ class Compound extends NamedTag implements \ArrayAccess{ } $nbt->writeTag(new End); } + + public function __toString(){ + $str = get_class($this) . "{\n"; + foreach($this as $tag){ + if($tag instanceof Tag){ + $str .= get_class($tag) . ":" . $tag->__toString() . "\n"; + } + } + return $str . "}"; + } } \ No newline at end of file diff --git a/src/pocketmine/nbt/tag/Enum.php b/src/pocketmine/nbt/tag/Enum.php index 602fbbbb8..12e2a076b 100644 --- a/src/pocketmine/nbt/tag/Enum.php +++ b/src/pocketmine/nbt/tag/Enum.php @@ -197,4 +197,14 @@ class Enum extends NamedTag implements \ArrayAccess, \Countable{ $tag->write($nbt); } } + + public function __toString(){ + $str = get_class($this) . "{\n"; + foreach($this as $tag){ + if($tag instanceof Tag){ + $str .= get_class($tag) . ":" . $tag->__toString() . "\n"; + } + } + return $str . "}"; + } } diff --git a/src/pocketmine/nbt/tag/IntArray.php b/src/pocketmine/nbt/tag/IntArray.php index c1500fa23..6d6e13782 100644 --- a/src/pocketmine/nbt/tag/IntArray.php +++ b/src/pocketmine/nbt/tag/IntArray.php @@ -44,4 +44,10 @@ class IntArray extends NamedTag{ $nbt->putInt(count($this->value)); $nbt->put(pack($nbt->endianness === NBT::LITTLE_ENDIAN ? "V*" : "N*", ...$this->value)); } + + public function __toString(){ + $str = get_class($this) . "{\n"; + $str .= implode(", ", $this->value); + return $str . "}"; + } } \ No newline at end of file diff --git a/src/pocketmine/nbt/tag/Tag.php b/src/pocketmine/nbt/tag/Tag.php index 314d9cf70..e085f55d3 100644 --- a/src/pocketmine/nbt/tag/Tag.php +++ b/src/pocketmine/nbt/tag/Tag.php @@ -44,7 +44,7 @@ abstract class Tag extends \stdClass{ abstract public function read(NBT $nbt); - public final function __toString(){ + public function __toString(){ return (string) $this->value; } }