diff --git a/src/API/BlockAPI.php b/src/API/BlockAPI.php index 7778a204f..e1c32aa6e 100644 --- a/src/API/BlockAPI.php +++ b/src/API/BlockAPI.php @@ -32,10 +32,129 @@ define("BLOCK_UPDATE_WEAK", 3); + + class BlockAPI{ + public static $class = array(); private $server; function __construct(PocketMinecraftServer $server){ $this->server = $server; + BlockAPI::$class = array( + AIR => new AirBlock(), + STONE => new StoneBlock(), + GRASS => new GrassBlock(), + DIRT => new DirtBlock(), + COBBLESTONE => new CobblestoneBlock(), + PLANKS => new PlanksBlock(), + SAPLING => new SaplingBlock(0), + BEDROCK => new BedrockBlock(), + WATER => new GenericBlock(WATER, 0, ""), + STILL_WATER => new GenericBlock(STILL_WATER, 0, ""), + LAVA => new GenericBlock(LAVA, 0, ""), + STILL_LAVA => new GenericBlock(STILL_LAVA, 0, ""), + SAND => new SandBlock(), + GRAVEL => new GravelBlock(), + GOLD_ORE => new GoldOreBlock(), + IRON_ORE => new IronOreBlock(), + COAL_ORE => new CoalOreBlock(), + WOOD => new WoodBlock(0), + LEAVES => new LeavesBlock(0), + GLASS => new GlassBlock(), + LAPIS_ORE => new LapisOreBlock(), + LAPIS_BLOCK => new LapisBlock(), + SANDSTONE => new SandstoneBlock(0), + BED_BLOCK => new BedBlock(0), + COBWEB => new CobwebBlock(), + TALL_GRASS => new TallGrassBlock(1), + DEAD_BUSH => new DeadBushBlock(), + WOOL => new WoolBlock(0), + DANDELION => new DandelionBlock(), + CYAN_FLOWER => new CyanFlowerBlock(), + BROWN_MUSHROOM => new BrownMushroomBlock(), + RED_MUSHROOM => new RedMushRoomBlock(), + GOLD_BLOCK => new GoldBlock(), + IRON_BLOCK => new IronBlock(), + DOUBLE_SLAB => new GenericBlock(DOUBLE_SLAB, 0, ""), + DOUBLE_SLABS => new GenericBlock(DOUBLE_SLABS, 0, ""), + SLAB => new GenericBlock(SLAB, 0, ""), + SLABS => new GenericBlock(SLABS, 0, ""), + BICKS => new GenericBlock(BICKS, 0, ""), + TNT => new GenericBlock(TNT, 0, ""), + BOOKSHELF => new GenericBlock(BOOKSHELF, 0, ""), + MOSS_STONE => new GenericBlock(MOSS_STONE, 0, ""), + MOSSY_STONE => new GenericBlock(MOSSY_STONE, 0, ""), + OBSIDIAN => new GenericBlock(OBSIDIAN, 0, ""), + TORCH => new GenericBlock(TORCH, 0, ""), + FiRE => new GenericBlock(FiRE, 0, ""), + + WOOD_STAIRS => new GenericBlock(WOOD_STAIRS, 0, ""), + CHEST => new GenericBlock(CHEST, 0, ""), + + DIAMOND_ORE => new GenericBlock(DIAMOND_ORE, 0, ""), + DIAMOND_BLOCK => new GenericBlock(DIAMOND_BLOCK, 0, ""), + CRAFTING_TABLE => new GenericBlock(CRAFTING_TABLE, 0, ""), + WORKBENCH => new GenericBlock(WORKBENCH, 0, ""), + WHEAT => new GenericBlock(WHEAT, 0, ""), + FARMLAND => new GenericBlock(FARMLAND, 0, ""), + FURNACE => new GenericBlock(FURNACE, 0, ""), + BURNING_FURNACE => new GenericBlock(BURNING_FURNACE, 0, ""), + LIT_FURNACE => new GenericBlock(LIT_FURNACE, 0, ""), + SIGN => new GenericBlock(SIGN, 0, ""), + SIGN_POST => new GenericBlock(SIGN_POST, 0, ""), + DOOR => new GenericBlock(DOOR, 0, ""), + WOODEN_DOOR => new GenericBlock(WOODEN_DOOR, 0, ""), + WOOD_DOOR => new GenericBlock(WOOD_DOOR, 0, ""), + LADDER => new GenericBlock(LADDER, 0, ""), + + COBBLE_STAIRS => new GenericBlock(COBBLE_STAIRS, 0, ""), + COBBLESTONE_STAIRS => new GenericBlock(COBBLESTONE_STAIRS, 0, ""), + WALL_SIGN => new GenericBlock(WALL_SIGN, 0, ""), + + IRON_DOOR => new GenericBlock(IRON_DOOR, 0, ""), + REDSTONE_ORE => new GenericBlock(REDSTONE_ORE, 0, ""), + GLOWING_REDSTONE_ORE => new GenericBlock(GLOWING_REDSTONE_ORE, 0, ""), + LIT_REDSTONE_ORE => new GenericBlock(LIT_REDSTONE_ORE, 0, ""), + + SNOW => new GenericBlock(SNOW, 0, ""), + ICE => new GenericBlock(ICE, 0, ""), + SNOW_BLOCK => new GenericBlock(SNOW_BLOCK, 0, ""), + CACTUS => new GenericBlock(CACTUS, 0, ""), + CLAY_BLOCK => new GenericBlock(CLAY_BLOCK, 0, ""), + SUGARCANE_BLOCK => new GenericBlock(SUGARCANE_BLOCK, 0, ""), + + FENCE => new GenericBlock(FENCE, 0, ""), + + NETHERRACK => new GenericBlock(NETHERRACK, 0, ""), + SOUL_SAND => new GenericBlock(SOUL_SAND, 0, ""), + GLOWSTONE_BLOCK => new GenericBlock(GLOWSTONE_BLOCK, 0, ""), + + TRAPDOOR => new GenericBlock(TRAPDOOR, 0, ""), + + STONE_BRICKS => new GenericBlock(STONE_BRICKS, 0, ""), + + GLASS_PANE => new GenericBlock(GLASS_PANE, 0, ""), + GLASS_PANEL => new GenericBlock(GLASS_PANEL, 0, ""), + MELON => new GenericBlock(MELON, 0, ""), + + MELON_STEM => new GenericBlock(MELON_STEM, 0, ""), + + FENCE_GATE => new GenericBlock(FENCE_GATE, 0, ""), + BRICK_STAIRS => new GenericBlock(BRICK_STAIRS, 0, ""), + STONE_BRICK_STAIRS => new GenericBlock(STONE_BRICK_STAIRS, 0, ""), + + NETHER_BRICK => new GenericBlock(NETHER_BRICK, 0, ""), + + NETHER_BRICK_STAIRS => new GenericBlock(NETHER_BRICK_STAIRS, 0, ""), + + SANDSTONE_STAIRS => new GenericBlock(SANDSTONE_STAIRS, 0, ""), + + QUARTZ_BLOCK => new GenericBlock(QUARTZ_BLOCK, 0, ""), + QUARTZ_STAIRS => new GenericBlock(QUARTZ_STAIRS, 0, ""), + + STONECUTTER => new GenericBlock(STONECUTTER, 0, ""), + GLOWING_OBSIDIAN => new GenericBlock(GLOWING_OBSIDIAN, 0, ""), + NETHER_REACTOR => new GenericBlock(NETHER_REACTOR, 0, ""), + ); } public function init(){ @@ -95,6 +214,7 @@ class BlockAPI{ if($event !== "player.block.break"){ return; } + $target = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"]); if(isset(Material::$unbreakable[$target[0]]) or $this->server->gamemode === 2){ return $this->cancelAction($target); @@ -262,6 +382,10 @@ class BlockAPI{ } $data["original"] = array($data["block"], $data["meta"]); $target = $this->server->api->level->getBlock($data["x"], $data["y"], $data["z"]); + $entity = $this->server->api->entity->get($data["eid"]); + if(($entity instanceof Entity) !== true){ + return $this->cancelAction($block); //No Entity WTF? + } if($target[0] === 0){ //If no block exists $this->cancelAction($target); $block = $this->server->api->level->getBlockFace($target, $data["face"]); @@ -298,7 +422,9 @@ class BlockAPI{ break; case 6: if($data["block"] === 351 and $data["meta"] === 0x0F){ //Bonemeal - Sapling::growTree($this->server->api->level, $target, $target[1] & 0x03); + $s = new SaplingBlock($target[1] & 0x03); + $s->position(new Vector3($target[2][0], $target[2][1], $target[2][2])); + $s->onActivate($this->server->api->level, new Item($data["block"], $data["meta"]), $entity->player); $cancelPlace = true; } break; @@ -452,10 +578,6 @@ class BlockAPI{ }else{ return $this->cancelAction($block); } - $entity = $this->server->api->entity->get($data["eid"]); - if(($entity instanceof Entity) !== true){ - return $this->cancelAction($block); //No Entity WTF? - } if(!isset(Material::$transparent[$data["block"]]) and $entity->inBlock($block[2][0], $block[2][1], $block[2][2])){ return $this->cancelAction($block); //Entity in block diff --git a/src/classes/PocketMinecraftServer.php b/src/classes/PocketMinecraftServer.php index ebc8da799..4ce371d31 100644 --- a/src/classes/PocketMinecraftServer.php +++ b/src/classes/PocketMinecraftServer.php @@ -29,7 +29,7 @@ class PocketMinecraftServer{ public $tCnt; var $version, $invisible, $api, $tickMeasure, $preparedSQL, $seed, $gamemode, $name, $maxClients, $clients, $eidCnt, $custom, $description, $motd, $timePerSecond, $spawn, $entities, $mapDir, $mapName, $map, $levelData, $tileEntities; private $database, $interface, $evCnt, $handCnt, $events, $eventsID, $handlers, $serverType, $lastTick, $ticker; - + private function load(){ $this->version = new VersionString(); console("[INFO] \x1b[33;1mPocketMine-MP ".MAJOR_VERSION." #".$this->version->getNumber()." by @shoghicp, LGPL License", true, true, 0); @@ -46,7 +46,7 @@ class PocketMinecraftServer{ console("[INFO] Loading database..."); $this->startDatabase(); $this->doTick = false; - $this->api = false; + $this->api = false; $this->tCnt = 1; $this->mapDir = false; $this->mapName = false; @@ -78,9 +78,9 @@ class PocketMinecraftServer{ $this->reloadConfig(); console("[INFO] Server Name: \x1b[36m".$this->name."\x1b[0m"); console("[DEBUG] Server ID: ".$this->serverID, true, true, 2); - $this->stop = false; + $this->stop = false; } - + function __construct($name, $gamemode = 1, $seed = false, $port = 19132, $serverID = false){ $this->port = (int) $port; //19132 - 19135 $this->gamemode = (int) $gamemode; @@ -244,7 +244,7 @@ class PocketMinecraftServer{ } console("[ERROR] Event \"$event\" has been deprecated.$sub [Handler]"); } - + if($result !== false){ $this->trigger($event, $data); } @@ -295,7 +295,7 @@ class PocketMinecraftServer{ console("[INFO] Gamemode: \x1b[36m".$this->getGamemode()."\x1b[0m"); } } - + public function getGamemode(){ switch($this->gamemode){ case 0: @@ -376,7 +376,7 @@ class PocketMinecraftServer{ "Rotation" => array( 0 => $entity->yaw, 1 => $entity->pitch, - ), + ), ); }elseif($entity->class === ENTITY_ITEM){ $entities[] = array( @@ -395,8 +395,8 @@ class PocketMinecraftServer{ "Rotation" => array( 0 => 0, 1 => 0, - ), - ); + ), + ); } } file_put_contents($this->mapDir."entities.dat", serialize($entities)); @@ -433,7 +433,7 @@ class PocketMinecraftServer{ console("[INFO] Server started!"); $this->process(); } - + public function dumpError(){ console("[ERROR] An Unrecovereable has ocurred and the server has Crashed. Creating an Error Dump"); $dump = "# PocketMine-MP Error Dump ".date("D M j H:i:s T Y")."\r\n"; @@ -616,7 +616,7 @@ class PocketMinecraftServer{ $ev[0]->$method($data, $event); }else{ $ev($data, $event); - } + } } }elseif(isset(Deprecation::$events[$event])){ $sub = ""; @@ -641,7 +641,7 @@ class PocketMinecraftServer{ return $chcnt; } - public function action($microseconds, $code, $repeat = true){ + public function action($microseconds, $code, $repeat = true){ $this->query("INSERT INTO actions (interval, last, code, repeat) VALUES(".($microseconds / 1000000).", ".microtime(true).", '".base64_encode($code)."', ".($repeat === true ? 1:0).");"); console("[INTERNAL] Attached to action ".$microseconds, true, true, 3); } diff --git a/src/classes/material/Block.php b/src/classes/material/Block.php index fd314ae94..509c3add3 100644 --- a/src/classes/material/Block.php +++ b/src/classes/material/Block.php @@ -27,10 +27,6 @@ the Free Software Foundation, either version 3 of the License, or abstract class Block{ - /*public static $name = array( - AIR => "GenericBlock", - - );*/ protected $id; protected $meta; diff --git a/src/classes/material/block/misc/Air.php b/src/classes/material/block/misc/Air.php new file mode 100644 index 000000000..c33e54cab --- /dev/null +++ b/src/classes/material/block/misc/Air.php @@ -0,0 +1,41 @@ +isActivable = false; + $this->isBreakable = false; + $this->isFlowable = true; + $this->isTransparent = true; + $this->isReplaceable = true; + $this->isPlaceable = false; + $this->inWorld = false; + $this->hasPhysics = false; + } + +} \ No newline at end of file diff --git a/src/classes/material/block/solid/Wool.php b/src/classes/material/block/solid/Wool.php new file mode 100644 index 000000000..809dad2fe --- /dev/null +++ b/src/classes/material/block/solid/Wool.php @@ -0,0 +1,52 @@ + "White Wool", + 1 => "Orange Wool", + 2 => "Magenta Wool", + 3 => "Light Blue Wool", + 4 => "Yellow Wool", + 5 => "Lime Wool", + 6 => "Pink Wool", + 7 => "Gray Wool", + 8 => "Light Gray Wool", + 9 => "Cyan Wool", + 10 => "Purple Wool", + 11 => "Blue Wool", + 12 => "Brown Wool", + 13 => "Green Wool", + 14 => "Red Wool", + 15 => "Black Wool", + ); + $this->name = $names[$this->type]; + } + +} \ No newline at end of file diff --git a/src/classes/world/generator/object/tree/TreeObject.php b/src/classes/world/generator/object/tree/TreeObject.php index a9afba782..dd5892ffd 100644 --- a/src/classes/world/generator/object/tree/TreeObject.php +++ b/src/classes/world/generator/object/tree/TreeObject.php @@ -35,19 +35,19 @@ class TreeObject{ ); public static function growTree(LevelAPI $level, Block $block){ switch($block->getMetadata() & 0x03){ - case Sapling::SPRUCE: + case SaplingBlock::SPRUCE: if(mt_rand(0,1) == 1){ $tree = new SpruceTreeObject(); }else{ $tree = new PineTreeObject(); } break; - case Sapling::BIRCH: + case SaplingBlock::BIRCH: $tree = new SmallTreeObject(); - $tree->type = Sapling::BIRCH; + $tree->type = SaplingBlock::BIRCH; break; default: - case Sapling::OAK: + case SaplingBlock::OAK: if(mt_rand(0,9) === 0){ $tree = new BigTreeObject(); }else{