public function execute(CommandSender $sender, array $args) { if (count($args) !== 1) { return false; } $player = $sender->getServer()->getPlayer($sender->getName()); $biome = strtoupper($args[0]); $plot = $this->getPlugin()->getPlotByPosition($player->getPosition()); if ($plot === null) { $sender->sendMessage(TextFormat::RED . "You are not standing on an island"); return true; } if ($plot->owner !== $sender->getName()) { $sender->sendMessage(TextFormat::RED . "You are not the owner of this island"); return true; } if (!isset($this->biomes[$biome])) { $sender->sendMessage(TextFormat::RED . "That biome doesn't exist"); $biomes = implode(", ", array_keys($this->biomes)); $sender->sendMessage(TextFormat::RED . "The possible biomes are: {$biomes}"); return true; } $biome = Biome::getBiome($this->biomes[$biome]); if ($this->getPlugin()->setPlotBiome($plot, $biome)) { $sender->sendMessage(TextFormat::GREEN . "Changed the island biome"); } else { $sender->sendMessage(TextFormat::RED . "Could not change the island biome"); } return true; }
public function generateChunk($chunkX, $chunkZ) { if ($this->emptyChunk !== null) { //Use the cached empty chunk instead of generating a new one $this->chunk = clone $this->emptyChunk; } else { $this->chunk = clone $this->level->getChunk($chunkX, $chunkZ); $this->chunk->setGenerated(); $c = Biome::getBiome(1)->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, 1); $this->chunk->setBiomeColor($X, $Z, $R, $G, $B); for ($y = 0; $y < 128; ++$y) { $this->chunk->setBlockId($X, $y, $Z, Block::AIR); } } } $spawn = $this->getSpawn(); if ($spawn->getX() >> 4 === $chunkX and $spawn->getZ() >> 4 === $chunkZ) { $this->chunk->setBlockId(0, 64, 0, Block::GRASS); } else { $this->emptyChunk = $this->chunk; } } $chunk = clone $this->chunk; $chunk->setX($chunkX); $chunk->setZ($chunkZ); $this->level->setChunk($chunkX, $chunkZ, $chunk); }
public function populate(ChunkManager $level, $chunkX, $chunkZ, Random $random) { $chunk = $level->getChunk($chunkX, $chunkZ); for ($x = 0; $x < 16; ++$x) { for ($z = 0; $z < 16; ++$z) { $biome = Biome::getBiome($chunk->getBiomeId($x, $z)); $cover = $biome->getGroundCover(); if (count($cover) > 0) { $diffY = 0; if (!$cover[0]->isSolid()) { $diffY = 1; } $column = $chunk->getBlockIdColumn($x, $z); for ($y = 127; $y > 0; --$y) { if ($column[$y] !== "" and !Block::get(ord($column[$y]))->isTransparent()) { break; } } $startY = min(127, $y + $diffY); $endY = $startY - count($cover); for ($y = $startY; $y > $endY and $y >= 0; --$y) { $b = $cover[$startY - $y]; if ($column[$y] === "" and $b->isSolid()) { break; } if ($b->getDamage() === 0) { $chunk->setBlockId($x, $y, $z, $b->getId()); } else { $chunk->setBlock($x, $y, $z, $b->getId(), $b->getDamage()); } } } } } }
public function execute(CommandSender $sender, array $args) { if (count($args) === 0) { $biomes = TextFormat::WHITE . implode(", ", array_keys($this->biomes)); $sender->sendMessage($this->translateString("biome.possible", [$biomes])); return true; } elseif (count($args) !== 1) { return false; } $player = $sender->getServer()->getPlayer($sender->getName()); $biome = strtoupper($args[0]); $plot = $this->getPlugin()->getPlotByPosition($player->getPosition()); if ($plot === null) { $sender->sendMessage(TextFormat::RED . $this->translateString("notinplot")); return true; } if ($plot->owner !== $sender->getName()) { $sender->sendMessage(TextFormat::RED . $this->translateString("notowner")); return true; } if (!isset($this->biomes[$biome])) { $sender->sendMessage(TextFormat::RED . $this->translateString("biome.invalid")); $biomes = implode(", ", array_keys($this->biomes)); $sender->sendMessage(TextFormat::RED . $this->translateString("biome.possible", [$biomes])); return true; } $biome = Biome::getBiome($this->biomes[$biome]); if ($this->getPlugin()->setPlotBiome($plot, $biome)) { $sender->sendMessage($this->translateString("biome.success", [$biome->getName()])); } else { $sender->sendMessage(TextFormat::RED . $this->translateString("error")); } return true; }
protected function parsePreset($preset, $chunkX, $chunkZ) { $this->preset = $preset; $preset = explode(";", $preset); $version = (int) $preset[0]; $blocks = isset($preset[1]) ? $preset[1] : ""; $biome = isset($preset[2]) ? $preset[2] : 1; $options = isset($preset[3]) ? $preset[3] : ""; preg_match_all('#^(([0-9]*x|)([0-9]{1,3})(|:[0-9]{0,2}))$#m', str_replace(",", "\n", $blocks), $matches); $y = 0; $this->structure = []; $this->chunks = []; foreach ($matches[3] as $i => $b) { $b = Item::fromString($b . $matches[4][$i]); $cnt = $matches[2][$i] === "" ? 1 : intval($matches[2][$i]); for ($cY = $y, $y += $cnt; $cY < $y; ++$cY) { $this->structure[$cY] = [$b->getId(), $b->getDamage()]; } } $this->floorLevel = $y; for (; $y < 0xff; ++$y) { $this->structure[$y] = [0, 0]; } $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]); } } } preg_match_all('#(([0-9a-z_]{1,})\\(?([0-9a-z_ =:]{0,})\\)?),?#', $options, $matches); foreach ($matches[2] as $i => $option) { $params = true; if ($matches[3][$i] !== "") { $params = []; $p = explode(" ", $matches[3][$i]); foreach ($p as $k) { $k = explode("=", $k); if (isset($k[1])) { $params[$k[0]] = $k[1]; } } } $this->options[$option] = $params; } }
protected function checkOldBiomes($data) { if (strlen($data) !== 256) { return; } for ($x = 0; $x < 16; ++$x) { for ($z = 0; $z < 16; ++$z) { $biome = Biome::getBiome(ord($data[($z << 4) + $x])); $this->setBiomeId($x, $z, $biome->getId()); $c = $biome->getColor(); $this->setBiomeColor($x, $z, $c >> 16, $c >> 8 & 0xff, $c & 0xff); } } }
public function generateChunk($chunkX, $chunkZ) { $spawn = $this->getSpawn(); // Adjust spawn so it is relative to current chunk... $spawn->x = $spawn->x - ($chunkX << 4); $spawn->z = $spawn->z - ($chunkZ << 4); $inSpawn = -$this->radius <= $spawn->x && $spawn->x < 16 + $this->radius && -$this->radius <= $spawn->z && $spawn->z < 16 + $this->radius; if ($inSpawn || $this->chunk === null) { $chunk = $this->level->getChunk($chunkX, $chunkZ); $chunk->setGenerated(); $c = Biome::getBiome($this->biome)->getColor(); $R = $c >> 16; $G = $c >> 8 & 0xff; $B = $c & 0xff; $rad2 = $this->radius * $this->radius; for ($Z = 0; $Z < 16; ++$Z) { for ($X = 0; $X < 16; ++$X) { $chunk->setBiomeId($X, $Z, $biome); $chunk->setBiomeColor($X, $Z, $R, $G, $B); $chunk->setBlock($X, 0, $Z, $this->baseFloor, 0); for ($y = 1; $y < 128; ++$y) { $chunk->setBlock($X, $y, $Z, Block::AIR, 0); } if (self::inSpawn($rad2, $spawn->x, $spawn->z, $X, $Z)) { $chunk->setBlock($X, $this->floorLevel, $Z, $this->block); } } } if (!$inSpawn) { $this->chunk = clone $chunk; } } else { $chunk = clone $this->chunk; } $chunk->setX($chunkX); $chunk->setZ($chunkZ); $this->level->setChunk($chunkX, $chunkZ, $chunk); }
public function generateChunk($chunkX, $chunkZ) { $this->chunk = clone $this->level->getChunk($chunkX, $chunkZ); $this->chunk->setGenerated(); $c = Biome::getBiome(1)->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, 1); $this->chunk->setBiomeColor($X, $Z, $R, $G, $B); for ($y = 0; $y < 128; ++$y) { $this->chunk->setBlockId($X, $y, $Z, Block::AIR); } } } $this->chunk->setBlockId(8, 64, 8, Block::GRASS); $chunk = clone $this->chunk; $chunk->setX($chunkX); $chunk->setZ($chunkZ); $this->level->setChunk($chunkX, $chunkZ, $chunk); }
public function populateChunk($chunkX, $chunkZ) { $this->random->setSeed(0xdeadbeef ^ $chunkX << 8 ^ $chunkZ ^ $this->level->getSeed()); foreach ($this->populators as $populator) { $populator->populate($this->level, $chunkX, $chunkZ, $this->random); } $chunk = $this->level->getChunk($chunkX, $chunkZ); $biome = Biome::getBiome($chunk->getBiomeId(7, 7)); $biome->populateChunk($this->level, $chunkX, $chunkZ, $this->random); }
public function generateChunk($chunkX, $chunkZ) { $shape = $this->getShape($chunkX << 4, $chunkZ << 4); $chunk = $this->level->getChunk($chunkX, $chunkZ); $chunk->setGenerated(); $c = Biome::getBiome(1)->getColor(); $R = $c >> 16; $G = $c >> 8 & 0xff; $B = $c & 0xff; $bottomBlockId = $this->bottomBlock->getId(); $bottomBlockMeta = $this->bottomBlock->getDamage(); $plotFillBlockId = $this->plotFillBlock->getId(); $plotFillBlockMeta = $this->plotFillBlock->getDamage(); $plotFloorBlockId = $this->plotFloorBlock->getId(); $plotFloorBlockMeta = $this->plotFloorBlock->getDamage(); $roadBlockId = $this->roadBlock->getId(); $roadBlockMeta = $this->roadBlock->getDamage(); $wallBlockId = $this->wallBlock->getId(); $wallBlockMeta = $this->wallBlock->getDamage(); $groundHeight = $this->groundHeight; for ($Z = 0; $Z < 16; ++$Z) { for ($X = 0; $X < 16; ++$X) { $chunk->setBiomeId($X, $Z, 1); $chunk->setBiomeColor($X, $Z, $R, $G, $B); $chunk->setBlock($X, 0, $Z, $bottomBlockId, $bottomBlockMeta); for ($y = 1; $y < $groundHeight; ++$y) { $chunk->setBlock($X, $y, $Z, $plotFillBlockId, $plotFillBlockMeta); } $type = $shape[$Z << 4 | $X]; if ($type === self::PLOT) { $chunk->setBlock($X, $groundHeight, $Z, $plotFloorBlockId, $plotFloorBlockMeta); } elseif ($type === self::ROAD) { $chunk->setBlock($X, $groundHeight, $Z, $roadBlockId, $roadBlockMeta); } else { $chunk->setBlock($X, $groundHeight, $Z, $roadBlockId, $roadBlockMeta); $chunk->setBlock($X, $groundHeight + 1, $Z, $wallBlockId, $wallBlockMeta); } } } $chunk->setX($chunkX); $chunk->setZ($chunkZ); $this->level->setChunk($chunkX, $chunkZ, $chunk); }
/** * @param int $x * @param int $z * @param bool $generate * * @return bool */ public function loadChunk($x, $z, $generate = true) { if (isset($this->chunks[$index = Level::chunkHash($x, $z)])) { return true; } $this->timings->syncChunkLoadTimer->startTiming(); $this->cancelUnloadChunkRequest($x, $z); $chunk = $this->provider->getChunk($x, $z, $generate); if ($chunk === null) { if ($generate) { throw new \InvalidStateException("Could not create new Chunk"); } return false; } if ($this->provider->getProviderName() == "mcregion") { if ($chunk->getBiomeColor(0, 0) == [0, 0, 0]) { for ($x = 0; $x < 16; ++$x) { for ($z = 0; $z < 16; ++$z) { $biome = Biome::getBiome(Biome::PLAINS); $chunk->setBiomeId($x, $z, $biome->getId()); $c = $biome->getColor(); $chunk->setBiomeColor($x, $z, $c >> 16, $c >> 8 & 0xff, $c & 0xff); } } } } $this->chunks[$index] = $chunk; $chunk->initChunk(); if ($chunk->getProvider() !== null) { $this->server->getPluginManager()->callEvent(new ChunkLoadEvent($chunk, !$chunk->isGenerated())); } else { $this->unloadChunk($x, $z, false); $this->timings->syncChunkLoadTimer->stopTiming(); return false; } if (!$chunk->isLightPopulated() and $chunk->isPopulated() and $this->getServer()->getProperty("chunk-ticking.light-updates", false)) { $this->getServer()->getScheduler()->scheduleAsyncTask(new LightPopulationTask($this, $chunk)); } if ($this->isChunkInUse($x, $z)) { foreach ($this->getChunkLoaders($x, $z) as $loader) { $loader->onChunkLoaded($chunk); } } else { $this->unloadChunkRequest($x, $z); } $this->timings->syncChunkLoadTimer->stopTiming(); return true; }
public function generateChunk($chunkX, $chunkZ) { $CX = $chunkX % 5 < 0 ? $chunkX % 5 + 5 : $chunkX % 5; $CZ = $chunkZ % 5 < 0 ? $chunkZ % 5 + 5 : $chunkZ % 5; switch ($CX . ":" . $CZ) { case '0:0': if ($this->chunk1 === null) { $this->chunk1 = clone $this->level->getChunk($chunkX, $chunkZ); $c = Biome::getBiome(1)->getColor(); $R = $c >> 16; $G = $c >> 8 & 0xff; $B = $c & 0xff; for ($x = 0; $x < 16; $x++) { for ($z = 0; $z < 16; $z++) { $this->chunk1->setBiomeColor($x, $z, $R, $G, $B); } } for ($x = 4; $x < 11; $x++) { for ($z = 4; $z < 11; $z++) { $this->chunk1->setBlockId($x, self::bedrockheight + (68 - 64), $z, Block::GRASS); } } for ($x = 5; $x < 10; $x++) { for ($z = 5; $z < 10; $z++) { $this->chunk1->setBlockId($x, self::bedrockheight + (67 - 64), $z, Block::DIRT); $this->chunk1->setBlockId($x, self::bedrockheight + (72 - 64), $z, Block::LEAVES); // 72 } } for ($x = 6; $x < 9; $x++) { for ($z = 6; $z < 9; $z++) { $this->chunk1->setBlockId($x, self::bedrockheight + (73 - 64), $z, Block::LEAVES); // 73 $this->chunk1->setBlockId($x, self::bedrockheight + (66 - 64), $z, Block::DIRT); // 66 } } $this->chunk1->setBlockId(7, self::bedrockheight + (64 - 64), 7, Block::BEDROCK); // 0 $this->chunk1->setBlockId(7, self::bedrockheight + (65 - 64), 7, Block::SAND); // 1 $this->chunk1->setBlockId(7, self::bedrockheight + (66 - 64), 7, Block::SAND); // 2 $this->chunk1->setBlockId(7, self::bedrockheight + (67 - 64), 7, Block::SAND); // 3 $this->chunk1->setBlockId(7, self::bedrockheight + (69 - 64), 7, Block::LOG); // 5 $this->chunk1->setBlockId(7, self::bedrockheight + (70 - 64), 7, Block::LOG); // 6 $this->chunk1->setBlockId(7, self::bedrockheight + (71 - 64), 7, Block::LOG); // 7 $this->chunk1->setBlockId(7, self::bedrockheight + (72 - 64), 7, Block::LOG); // 8 $this->chunk1->setBlockId(7, self::bedrockheight + (73 - 64), 7, Block::LOG); // 9 $this->chunk1->setBlockId(4, self::bedrockheight + (68 - 64), 4, Block::AIR); // 68 $this->chunk1->setBlockId(4, self::bedrockheight + (68 - 64), 10, Block::AIR); $this->chunk1->setBlockId(10, self::bedrockheight + (68 - 64), 4, Block::AIR); $this->chunk1->setBlockId(10, self::bedrockheight + (68 - 64), 10, Block::AIR); $this->chunk1->setBlockId(5, self::bedrockheight + (72 - 64), 5, Block::AIR); // 72 $this->chunk1->setBlockId(5, self::bedrockheight + (72 - 64), 9, Block::AIR); $this->chunk1->setBlockId(9, self::bedrockheight + (72 - 64), 5, Block::AIR); $this->chunk1->setBlockId(9, self::bedrockheight + (72 - 64), 9, Block::AIR); $this->chunk1->setBlockId(5, self::bedrockheight + (73 - 64), 7, Block::LEAVES); // 73 $this->chunk1->setBlockId(7, self::bedrockheight + (73 - 64), 5, Block::LEAVES); $this->chunk1->setBlockId(9, self::bedrockheight + (73 - 64), 7, Block::LEAVES); $this->chunk1->setBlockId(7, self::bedrockheight + (73 - 64), 9, Block::LEAVES); $this->chunk1->setBlockId(7, self::bedrockheight + (74 - 64), 6, Block::LEAVES); // 74 $this->chunk1->setBlockId(6, self::bedrockheight + (74 - 64), 7, Block::LEAVES); $this->chunk1->setBlockId(8, self::bedrockheight + (74 - 64), 7, Block::LEAVES); $this->chunk1->setBlockId(7, self::bedrockheight + (74 - 64), 8, Block::LEAVES); $this->chunk1->setBlockId(7, self::bedrockheight + (75 - 64), 7, Block::LEAVES); // 75 // $this->chunk1->setBlockId(7, self::bedrockheight + (69 - 64), 8, Block::CHEST); $this->chunk1->setBlockId(7, self::bedrockheight + (65 - 64), 8, Block::DIRT); // 65 $this->chunk1->setBlockId(8, self::bedrockheight + (65 - 64), 7, Block::DIRT); $this->chunk1->setBlockId(7, self::bedrockheight + (65 - 64), 6, Block::DIRT); $this->chunk1->setBlockId(6, self::bedrockheight + (65 - 64), 7, Block::DIRT); $this->chunk1->setBlockId(5, self::bedrockheight + (66 - 64), 7, Block::DIRT); // 66 $this->chunk1->setBlockId(7, self::bedrockheight + (66 - 64), 5, Block::DIRT); $this->chunk1->setBlockId(9, self::bedrockheight + (66 - 64), 7, Block::DIRT); $this->chunk1->setBlockId(7, self::bedrockheight + (66 - 64), 9, Block::DIRT); $this->chunk1->setBlockId(4, self::bedrockheight + (67 - 64), 7, Block::DIRT); // 67 $this->chunk1->setBlockId(7, self::bedrockheight + (67 - 64), 4, Block::DIRT); $this->chunk1->setBlockId(7, self::bedrockheight + (67 - 64), 10, Block::DIRT); $this->chunk1->setBlockId(10, self::bedrockheight + (67 - 64), 7, Block::DIRT); } $chunk = clone $this->chunk1; $chunk->setX($chunkX); $chunk->setZ($chunkZ); $this->level->setChunk($chunkX, $chunkZ, $chunk); break; default: if ($this->chunk2 === null) { $this->chunk2 = clone $this->level->getChunk($chunkX, $chunkZ); $c = Biome::getBiome(1)->getColor(); $R = $c >> 16; $G = $c >> 8 & 0xff; $B = $c & 0xff; for ($x = 0; $x < 16; $x++) { for ($z = 0; $z < 16; $z++) { $this->chunk2->setBiomeColor($x, $z, $R, $G, $B); } } $chunk = clone $this->chunk2; $chunk->setX($chunkX); $chunk->setZ($chunkZ); $this->level->setChunk($chunkX, $chunkZ, $chunk); break; } } }