Added new methods of Block properties (WiP)

This commit is contained in:
Shoghi Cervantes Pueyo 2013-02-02 13:36:18 +01:00
parent 4c06b384c7
commit 5a054a8ab4
6 changed files with 236 additions and 25 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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;

View File

@ -0,0 +1,41 @@
<?php
/*
-
/ \
/ \
/ PocketMine \
/ MP \
|\ @shoghicp /|
|. \ / .|
| .. \ / .. |
| .. | .. |
| .. | .. |
\ | /
\ | /
\ | /
\ | /
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
*/
class AirBlock extends TransparentBlock{
public function __construct(){
parent::__construct(AIR, 0, "Air");
$this->isActivable = false;
$this->isBreakable = false;
$this->isFlowable = true;
$this->isTransparent = true;
$this->isReplaceable = true;
$this->isPlaceable = false;
$this->inWorld = false;
$this->hasPhysics = false;
}
}

View File

@ -0,0 +1,52 @@
<?php
/*
-
/ \
/ \
/ PocketMine \
/ MP \
|\ @shoghicp /|
|. \ / .|
| .. \ / .. |
| .. | .. |
| .. | .. |
\ | /
\ | /
\ | /
\ | /
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
*/
class WoolBlock extends SolidBlock{
public function __construct($type = 0){
parent::__construct(WOOL, $type, "Wool");
$names = array(
0 => "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];
}
}

View File

@ -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{