diff --git a/src/API/BlockAPI.php b/src/API/BlockAPI.php index 505ccba4f..e29486cc0 100644 --- a/src/API/BlockAPI.php +++ b/src/API/BlockAPI.php @@ -39,6 +39,111 @@ define("BLOCK_UPDATE_TOUCH", 4); class BlockAPI{ private $server; private $scheduledUpdates = array(); + public static $creative = array( + array(COBBLESTONE, 0), + array(STONE_BRICKS, 0), + array(STONE_BRICKS, 1), + array(STONE_BRICKS, 2), + array(MOSS_STONE, 0), + array(WOODEN_PLANKS, 0), + array(BRICKS, 0), + array(STONE, 0), + array(DIRT, 0), + array(GRASS, 0), + array(CLAY_BLOCK, 0), + array(SANDSTONE, 0), + array(SANDSTONE, 1), + array(SANDSTONE, 2), + array(SAND, 0), + array(GRAVEL, 0), + array(TRUNK, 0), + array(TRUNK, 1), + array(TRUNK, 2), + array(NETHER_BRICKS, 0), + array(NETHERRACK, 0), + array(COBBLESTONE_STAIRS, 0), + array(WOODEN_STAIRS, 0), + array(BRICK_STAIRS, 0), + array(SANDSTONE_STAIRS, 0), + array(STONE_BRICK_STAIRS, 0), + array(NETHER_BRICKS_STAIRS, 0), + array(QUARTZ_STAIRS, 0), + array(SLAB, 0), + array(SLAB, 1), + array(SLAB, 2), + array(SLAB, 3), + array(SLAB, 4), + array(SLAB, 5), + array(QUARTZ_BLOCK, 0), + array(QUARTZ_BLOCK, 1), + array(QUARTZ_BLOCK, 2), + array(COAL_ORE, 0), + array(IRON_ORE, 0), + array(GOLD_ORE, 0), + array(DIAMOND_ORE, 0), + array(LAPIS_ORE, 0), + array(REDSTONE_ORE, 0), + array(GOLD_BLOCK, 0), + array(IRON_BLOCK, 0), + array(DIAMOND_BLOCK, 0), + array(LAPIS_BLOCK, 0), + array(OBSIDIAN, 0), + array(SNOW_BLOCK, 0), + array(GLASS, 0), + array(GLOWSTONE_BLOCK, 0), + array(NETHER_REACTOR, 0), + array(WOOL, 0), + array(WOOL, 7), + array(WOOL, 6), + array(WOOL, 5), + array(WOOL, 4), + array(WOOL, 3), + array(WOOL, 2), + array(WOOL, 1), + array(WOOL, 15), + array(WOOL, 14), + array(WOOL, 13), + array(WOOL, 12), + array(WOOL, 11), + array(WOOL, 10), + array(WOOL, 9), + array(WOOL, 8), + array(LADDER, 0), + array(TORCH, 0), + array(GLASS_PANE, 0), + array(WOODEN_DOOR, 0), + array(TRAPDOOR, 0), + array(FENCE, 0), + array(FENCE_GATE, 0), + array(BED, 0), + array(BOOKSHELF, 0), + array(PAINTING, 0), + array(WORKBENCH, 0), + array(STONECUTTER, 0), + array(CHEST, 0), + array(FURNACE, 0), + array(TNT, 0), + array(DANDELION, 0), + array(CYAN_FLOWER, 0), + array(BROWN_MUSHROOM, 0), + array(RED_MUSHROOM, 0), + array(CACTUS, 0), + array(MELON_BLOCK, 0), + array(SUGARCANE, 0), + array(SAPLING, 0), + array(SAPLING, 1), + array(SAPLING, 2), + array(LEAVES, 0), + array(LEAVES, 1), + array(LEAVES, 2), + array(SEEDS, 0), + array(MELON_SEEDS, 0), + array(DYE, 15), //Bonemeal + array(IRON_HOE, 0), + array(IRON_SWORD, 0), + array(BOW, 0), + array(SIGN, 0), + ); public static function fromString($str, $multiple = false){ if($multiple === true){ @@ -151,6 +256,10 @@ class BlockAPI{ } if($player instanceof Player){ + if($player->gamemode === CREATIVE){ + $output .= "Player is in creative mode.\n"; + break; + } if($this->server->api->getProperty("item-enforcement") === false){ $this->drop(new Vector3($player->entity->x - 0.5, $player->entity->y, $player->entity->z - 0.5), $item, true); }else{ @@ -158,7 +267,7 @@ class BlockAPI{ } $output .= "Giving ".$item->count." of ".$item->getName()." (".$item->getID().":".$item->getMetadata().") to ".$player->username."\n"; }else{ - $output .= "Unknown player\n"; + $output .= "Unknown player.\n"; } break; @@ -241,7 +350,7 @@ class BlockAPI{ $block = $this->getBlockFace($target, $face); $item = $player->equipment; - if($target->getID() === AIR and $this->server->api->dhandle("player.block.place.invalid", array("player" => $player, "block" => $block, "target" => $target, "item" => $item)) !== true){ //If no block exists + if($target->getID() === AIR and $this->server->api->dhandle("player.block.place.invalid", array("player" => $player, "block" => $block, "target" => $target, "item" => $item)) !== true){ //If no block exists or not allowed in CREATIVE $this->cancelAction($target, $player); return $this->cancelAction($block, $player); } diff --git a/src/Player.php b/src/Player.php index 1a080ee05..e21789d79 100644 --- a/src/Player.php +++ b/src/Player.php @@ -61,6 +61,7 @@ class Player{ private $chunksLoaded = array(); private $chunksOrder = array(); private $lag = array(0, 0); + public $itemEnforcement; public $lastCorrect; function __construct($clientID, $ip, $port, $MTU){ @@ -71,6 +72,7 @@ class Player{ $this->CID = $this->server->clientID($ip, $port); $this->ip = $ip; $this->port = $port; + $this->itemEnforcement = $this->server->api->getProperty("item-enforcement"); $this->timeout = microtime(true) + 20; $this->inventory = array_fill(0, 36, array(AIR, 0, 0)); $this->armor = array_fill(0, 4, array(AIR, 0, 0)); @@ -268,9 +270,14 @@ class Player{ return true; } + public function setSlot($slot, Item $item){ + $this->inventory[(int) $slot] = array($item->getID(), $item->getMetadata(), $item->count); + return true; + } + public function sendInventorySlot($s){ $s = (int) $s; - if(!isset($this->inventory[$s]) or $this->server->api->getProperty("item-enforcement") === false){ + if(!isset($this->inventory[$s]) or ($this->itemEnforcement === false and $this->gamemode !== CREATIVE)){ return false; } @@ -337,11 +344,6 @@ class Player{ $this->dataPacket(MC_PLAYER_ARMOR_EQUIPMENT, $data); } break; - case "player.block.place": - if($data["eid"] === $this->eid and ($this->gamemode === SURVIVAL or $this->gamemode === ADVENTURE)){ - $this->removeItem($data["original"]->getID(), $data["original"]->getMetadata(), 1); - } - break; case "player.pickup": if($data["eid"] === $this->eid){ $data["eid"] = 0; @@ -557,6 +559,7 @@ class Player{ }else{ $this->blocked = true; $this->gamemode = $gm; + $this->inventory = array_fill(0, 36, array(AIR, 0, 0)); $this->eventHandler("Your gamemode has been changed to ".$this->getGamemode().", you've to do a forced reconnect.", "server.chat"); $this->server->schedule(30, array($this, "close"), "gamemode change"); //Forces a kick } @@ -733,6 +736,13 @@ class Player{ $this->auth = true; if(!$this->data->exists("inventory") or $this->gamemode === CREATIVE){ + if($this->gamemode === CREATIVE){ + $this->itemEnforcement = true; + $this->inventory = array(); + foreach(BlockAPI::$creative as $item){ + $this->inventory[] = array($item[0], $item[1], 1); + } + } $this->data->set("inventory", $this->inventory); } $this->data->set("caseusername", $this->username); @@ -780,7 +790,6 @@ class Player{ $this->evid[] = $this->server->event("player.armor", array($this, "eventHandler")); $this->evid[] = $this->server->event("player.pickup", array($this, "eventHandler")); $this->evid[] = $this->server->event("block.change", array($this, "eventHandler")); - $this->evid[] = $this->server->event("player.block.place", array($this, "eventHandler")); $this->evid[] = $this->server->event("tile.container.slot", array($this, "eventHandler")); $this->server->schedule(40, array($this, "measureLag"), array(), true); console("[INFO] \x1b[33m".$this->username."\x1b[0m[/".$this->ip.":".$this->port."] logged in with entity id ".$this->eid." at (".round($this->entity->x, 2).", ".round($this->entity->y, 2).", ".round($this->entity->z, 2).")"); @@ -846,7 +855,7 @@ class Player{ $data["eid"] = $this->eid; $data["player"] = $this; $data["item"] = BlockAPI::getItem($data["block"], $data["meta"]); - if(($this->hasItem($data["block"], $data["meta"]) or $this->server->api->getProperty("item-enforcement") !== true) and $this->server->handle("player.equipment.change", $data) !== false){ + if(($this->hasItem($data["block"], $data["meta"]) or $this->itemEnforcement !== true) and $this->server->handle("player.equipment.change", $data) !== false){ $this->equipment = $data["item"]; } break; @@ -862,7 +871,7 @@ class Player{ $data["eid"] = $this->eid; if($this->blocked === true or Utils::distance($this->entity->position, $data) > 10){ break; - }elseif(($this->gamemode === SURVIVAL or $this->gamemode === ADVENTURE) and !$this->hasItem($data["block"], $data["meta"]) and $this->server->api->getProperty("item-enforcement") === true){ + }elseif(!$this->hasItem($data["block"], $data["meta"]) and $this->itemEnforcement === true){ break; } $this->server->api->block->playerBlockAction($this, new Vector3($data["x"], $data["y"], $data["z"]), $data["face"], $data["fx"], $data["fy"], $data["fz"]); @@ -1007,7 +1016,7 @@ class Player{ 364 => 8, ); if(isset($items[$this->equipment->getID()])){ - if($this->removeItem($this->equipment->getID(), $this->equipment->getMetadata(), 1) === true or $this->server->api->getProperty("item-enforcement") !== true){ + if($this->removeItem($this->equipment->getID(), $this->equipment->getMetadata(), 1) === true or $this->itemEnforcement !== true){ $this->dataPacket(MC_ENTITY_EVENT, array( "eid" => 0, "event" => 9, @@ -1025,7 +1034,7 @@ class Player{ $item = BlockAPI::getItem($data["block"], $data["meta"], $data["stack"]); $data["item"] = $item; if($this->blocked === false and $this->server->handle("player.drop", $data) !== false){ - if($this->removeItem($item->getID(), $item->getMetadata(), $item->count) === true or $this->server->api->getProperty("item-enforcement") !== true){ + if($this->removeItem($item->getID(), $item->getMetadata(), $item->count) === true or $this->itemEnforcement !== true){ $this->server->api->block->drop(new Vector3($this->entity->x - 0.5, $this->entity->y, $this->entity->z - 0.5), $item); } } @@ -1105,14 +1114,14 @@ class Player{ } if($item->getID() !== AIR and $slot->getID() == $item->getID()){ if($slot->count < $item->count){ - if($this->removeItem($item->getID(), $item->getMetadata(), $item->count - $slot->count) === false and $this->server->api->getProperty("item-enforcement") === true){ + if($this->removeItem($item->getID(), $item->getMetadata(), $item->count - $slot->count) === false and $this->itemEnforcement === true){ break; } }elseif($slot->count > $item->count){ $this->addItem($item->getID(), $item->getMetadata(), $slot->count - $item->count); } }else{ - if($this->removeItem($item->getID(), $item->getMetadata(), $item->count) === false and $this->server->api->getProperty("item-enforcement") === true){ + if($this->removeItem($item->getID(), $item->getMetadata(), $item->count) === false and $this->itemEnforcement === true){ break; } $this->addItem($slot->getID(), $slot->getMetadata(), $slot->count); diff --git a/src/constants/BlockIDs.php b/src/constants/BlockIDs.php index 4e0805583..1e139b215 100644 --- a/src/constants/BlockIDs.php +++ b/src/constants/BlockIDs.php @@ -34,6 +34,7 @@ define("COBBLE", 4); define("PLANK", 5); define("PLANKS", 5); define("WOODEN_PLANK", 5); +define("WOODEN_PLANKS", 5); define("SAPLING", 6); define("SAPLINGS", 6); define("BEDROCK", 7); diff --git a/src/material/item/generic/Painting.php b/src/material/item/generic/Painting.php index d1234c844..d0ff70e8e 100644 --- a/src/material/item/generic/Painting.php +++ b/src/material/item/generic/Painting.php @@ -60,7 +60,9 @@ class PaintingItem extends Item{ $server = ServerAPI::request(); $e = $server->api->entity->add(ENTITY_OBJECT, OBJECT_PAINTING, $data); $server->api->entity->spawnToAll($e->eid); - $player->removeItem($this->getID(), $this->getMetadata(), 1); + if($player->gamemode !== CREATIVE){ + $player->removeItem($this->getID(), $this->getMetadata(), 1); + } return true; } return false;