作者:LegionP
项目:LegionPE-Et
public static function log($logger, $flag, $msg, $timeout = 5)
{
if (isset(self::$msgs[$flag])) {
if (microtime(true) - self::$msgs[$flag] < $timeout) {
return;
}
}
self::$msgs[$flag] = microtime(true);
if ($logger instanceof \Logger) {
$logger->notice($msg);
} else {
MainLogger::getLogger()->notice($msg);
}
}
作者:ianj
项目:PocketMine-M
public function __construct()
{
// load recipes from src/pocketmine/recipes.json
$recipes = new Config(Server::getInstance()->getFilePath() . "src/pocketmine/resources/recipes.json", Config::JSON, []);
MainLogger::getLogger()->info("Loading recipes...");
foreach ($recipes->getAll() as $recipe) {
switch ($recipe["Type"]) {
case 0:
// TODO: handle multiple result items
if (count($recipe["Result"]) == 1) {
$first = $recipe["Result"][0];
$result = new ShapelessRecipe(Item::get($first["ID"], $first["Damage"], $first["Count"]));
foreach ($recipe["Ingredients"] as $ingredient) {
$result->addIngredient(Item::get($ingredient["ID"], $ingredient["Damage"], $ingredient["Count"]));
}
$this->registerRecipe($result);
}
break;
case 1:
// TODO: handle multiple result items
if (count($recipe["Result"]) == 1) {
$first = $recipe["Result"][0];
$result = new ShapedRecipe(Item::get($first["ID"], $first["Damage"], $first["Count"]), $recipe["Height"], $recipe["Width"]);
$shape = array_chunk($recipe["Ingredients"], $recipe["Width"]);
foreach ($shape as $y => $row) {
foreach ($row as $x => $ingredient) {
$result->addIngredient($x, $y, Item::get($ingredient["ID"], $ingredient["Damage"] < 0 ? null : $ingredient["Damage"], $ingredient["Count"]));
}
}
$this->registerRecipe($result);
}
break;
case 2:
$result = $recipe["Result"];
$resultItem = Item::get($result["ID"], $result["Damage"], $result["Count"]);
$this->registerRecipe(new FurnaceRecipe($resultItem, Item::get($recipe["Ingredients"], 0, 1)));
break;
case 3:
$result = $recipe["Result"];
$resultItem = Item::get($result["ID"], $result["Damage"], $result["Count"]);
$this->registerRecipe(new FurnaceRecipe($resultItem, Item::get($recipe["Ingredients"]["ID"], $recipe["Ingredients"]["Damage"], 1)));
break;
default:
break;
}
}
}
作者:boyboo
项目:PocketMine-M
public function parseInfo()
{
$this->seek(0);
if (fread($this->fp, 3) !== "PMF") {
return false;
}
$this->version = ord($this->read(1));
switch ($this->version) {
case 0x1:
$this->type = ord($this->read(1));
break;
default:
MainLogger::getLogger()->alert("Tried loading non-supported PMF version " . $this->version . " on file " . $this->file);
return false;
}
return true;
}
作者:LegionP
项目:LegionPE-Et
public function query($msg, $fetch, ...$args)
{
foreach ($args as &$arg) {
if (is_string($arg)) {
$arg = "'" . $this->mysqli->escape_string($arg) . "'";
} else {
$arg = "{$arg}";
}
}
if (count($args) > 0) {
try {
if ($fetch !== 3) {
$result = $this->mysqli->query($query = sprintf($msg, ...$args));
} else {
return sprintf($msg, ...$args);
}
} catch (\RuntimeException $e) {
MainLogger::getLogger()->alert($e->getTraceAsString());
MainLogger::getLogger()->alert("Query: " . TextFormat::YELLOW . $msg);
MainLogger::getLogger()->alert("Args: " . var_export($args, true));
return null;
}
} else {
$result = $this->mysqli->query($query = $msg);
// to make it faster
}
if ($result === false) {
$server = Server::getInstance();
$server->getLogger()->warning("Query failed! Query:");
$server->getLogger()->warning($query);
$server->getLogger()->warning("Message: " . $this->mysqli->error);
}
if ($result instanceof \mysqli_result) {
if ($fetch === self::ASSOC) {
return $result->fetch_assoc();
} elseif ($fetch === self::ALL) {
return $result->fetch_all(MYSQLI_ASSOC);
}
return $result;
}
return $result;
}
作者:VonHirsc
项目:PocketMine-0.13.
\ini_set("display_errors", 1);
\ini_set("display_startup_errors", 1);
\ini_set("default_charset", "utf-8");
\ini_set("memory_limit", -1);
\define("pocketmine\\START_TIME", \microtime(\true));
$opts = \getopt("", ["data:", "plugins:", "no-wizard", "enable-profiler"]);
\define("pocketmine\\DATA", isset($opts["data"]) ? $opts["data"] . DIRECTORY_SEPARATOR : \getcwd() . DIRECTORY_SEPARATOR);
\define("pocketmine\\PLUGIN_PATH", isset($opts["plugins"]) ? $opts["plugins"] . DIRECTORY_SEPARATOR : \getcwd() . DIRECTORY_SEPARATOR . "plugins" . DIRECTORY_SEPARATOR);
Terminal::init();
\define("pocketmine\\ANSI", Terminal::hasFormattingCodes());
if (!\file_exists(\pocketmine\DATA)) {
\mkdir(\pocketmine\DATA, 0777, \true);
}
//Logger has a dependency on timezone, so we'll set it to UTC until we can get the actual timezone.
\date_default_timezone_set("UTC");
$logger = new MainLogger(\pocketmine\DATA . "server.log", \pocketmine\ANSI);
if (!\ini_get("date.timezone")) {
if ($timezone = detect_system_timezone() and \date_default_timezone_set($timezone)) {
//Success! Timezone has already been set and validated in the if statement.
//This here is just for redundancy just in case some program wants to read timezone data from the ini.
\ini_set("date.timezone", $timezone);
} else {
//If system timezone detection fails or timezone is an invalid value.
if ($response = Utils::getURL("http://ip-api.com/json") and $ip_geolocation_data = \json_decode($response, \true) and $ip_geolocation_data['status'] != 'fail' and \date_default_timezone_set($ip_geolocation_data['timezone'])) {
//Again, for redundancy.
\ini_set("date.timezone", $ip_geolocation_data['timezone']);
} else {
\ini_set("date.timezone", "UTC");
\date_default_timezone_set("UTC");
$logger->warning("Timezone could not be automatically determined. An incorrect timezone will result in incorrect timestamps on console logs. It has been set to \"UTC\" by default. You can change it on the php.ini file.");
}
作者:applqpa
项目:plugin-remake
/**
* @param Plugin $plugin
*/
public function disablePlugin(Plugin $plugin)
{
if ($plugin instanceof PluginBase and $plugin->isEnabled()) {
MainLogger::getLogger()->info("Disabling " . $plugin->getDescription()->getFullName());
Server::getInstance()->getPluginManager()->callEvent(new PluginDisableEvent($plugin));
$plugin->setEnabled(false);
}
}
作者:LegionP
项目:LegionPE-Et
/**
* Send to the subscriber a message
* @param string $msg a string message, could be formatted in the sprintf() method
* @param string ...$args arguments to be formatted in sprintf()
* @return void
*/
public function tell($msg, ...$args)
{
try {
MainLogger::getLogger()->info(sprintf($msg, ...$args));
} catch (\RuntimeException $e) {
var_dump($msg, $args, $e);
}
}
作者:rry
项目:PocketMine-M
public function readChunk($x, $z, $generate = true, $forward = false)
{
$index = self::getChunkOffset($x, $z);
if ($index < 0 or $index >= 4096) {
//Regenerate chunk due to corruption
$this->locationTable[$index][0] = 0;
$this->locationTable[$index][1] = 1;
}
if (!$this->isChunkGenerated($index)) {
if ($generate === true) {
//Allocate space
$this->locationTable[$index][0] = ++$this->lastSector;
$this->locationTable[$index][1] = 1;
fseek($this->filePointer, $this->locationTable[$index][0] << 12);
fwrite($this->filePointer, str_pad(Binary::writeInt(-1) . chr(self::COMPRESSION_ZLIB), 4096, "", STR_PAD_RIGHT));
$this->writeLocationIndex($index);
} else {
return false;
}
}
fseek($this->filePointer, $this->locationTable[$index][0] << 12);
$length = Binary::readInt(fread($this->filePointer, 4));
$compression = ord(fgetc($this->filePointer));
if ($length <= 0) {
//Not yet generated
$this->generateChunk($x, $z);
fseek($this->filePointer, $this->locationTable[$index][0] << 12);
$length = Binary::readInt(fread($this->filePointer, 4));
$compression = ord(fgetc($this->filePointer));
}
if ($length > $this->locationTable[$index][1] << 12) {
//Invalid chunk, bigger than defined number of sectors
MainLogger::getLogger()->error("Corrupted chunk detected");
$this->locationTable[$index][1] = $length >> 12;
$this->writeLocationIndex($index);
} elseif ($compression !== self::COMPRESSION_ZLIB and $compression !== self::COMPRESSION_GZIP) {
MainLogger::getLogger()->error("Invalid compression type");
return false;
}
$chunk = Chunk::fromBinary(fread($this->filePointer, $length - 1), $this->levelProvider);
if ($chunk instanceof Chunk) {
return $chunk;
} elseif ($forward === false) {
MainLogger::getLogger()->error("Corrupted chunk detected");
$this->generateChunk($x, $z);
return $this->readChunk($x, $z, $generate, true);
} else {
return null;
}
}
作者:kniffo8
项目:Genisy
/**
* @param string $str
*
* @return BanEntry
*/
public static function fromString($str)
{
if (strlen($str) < 2) {
return null;
} else {
$str = explode("|", trim($str));
$entry = new BanEntry(trim(array_shift($str)));
if (count($str) > 0) {
$datetime = \DateTime::createFromFormat(self::$format, array_shift($str));
if (!$datetime instanceof \DateTime) {
MainLogger::getLogger()->alert("Error parsing date for BanEntry for player \"" . $entry->getName() . "\", the format may be invalid!");
return $entry;
}
$entry->setCreated($datetime);
if (count($str) > 0) {
$entry->setSource(trim(array_shift($str)));
if (count($str) > 0) {
$expire = trim(array_shift($str));
if (strtolower($expire) !== "forever" and strlen($expire) > 0) {
$entry->setExpires(\DateTime::createFromFormat(self::$format, $expire));
}
if (count($str) > 0) {
$entry->setReason(trim(array_shift($str)));
}
}
}
}
return $entry;
}
}
作者:ClearSkyTea
项目:ClearSk
/**
* @param string $message
*/
public function sendMessage($message)
{
if ($message instanceof TextContainer) {
$message = $this->getServer()->getLanguage()->translate($message);
} else {
$message = $this->getServer()->getLanguage()->translateString($message);
}
foreach (explode("\n", trim($message)) as $line) {
MainLogger::getLogger()->info($line);
}
}
作者:rry
项目:PocketMine-M
public function loadChunk($X, $Z)
{
if ($this->isChunkLoaded($X, $Z)) {
return true;
}
$index = self::getIndex($X, $Z);
$path = $this->getChunkPath($X, $Z);
if (!file_exists($path)) {
if ($this->generateChunk($X, $Z) === false) {
return false;
}
if ($this->isGenerating === 0) {
$this->populateChunk($X, $Z);
}
return true;
}
$chunk = file_get_contents($path);
if ($chunk === false) {
return false;
}
$chunk = zlib_decode($chunk);
$offset = 0;
$this->chunkInfo[$index] = [0 => ord($chunk[0]), 1 => Binary::readInt(substr($chunk, 1, 4))];
$offset += 5;
$len = Binary::readInt(substr($chunk, $offset, 4));
$offset += 4;
$nbt = new NBT(NBT::BIG_ENDIAN);
$nbt->read(substr($chunk, $offset, $len));
$this->chunkInfo[$index][2] = $nbt->getData();
$offset += $len;
$this->chunks[$index] = [];
$this->chunkChange[$index] = [-1 => false];
$this->chunkInfo[$index][3] = substr($chunk, $offset, 256);
//Biome data
$offset += 256;
for ($Y = 0; $Y < 8; ++$Y) {
if (($this->chunkInfo[$index][0] & 1 << $Y) !== 0) {
// 4096 + 2048 + 2048, Block Data, Meta, Light
if (strlen($this->chunks[$index][$Y] = substr($chunk, $offset, 8192)) < 8192) {
MainLogger::getLogger()->notice("Empty corrupt chunk detected [{$X},{$Z},:{$Y}], recovering contents");
$this->fillMiniChunk($X, $Z, $Y);
}
$offset += 8192;
} else {
$this->chunks[$index][$Y] = false;
}
}
if ($this->isGenerating === 0 and !$this->isPopulated($X, $Z)) {
$this->populateChunk($X, $Z);
}
return true;
}
作者:ChiefArt
项目:AntiFl
public function onDisable()
{
MainLogger::getLogger()->info(TextFormat::LIGHT_PURPLE . "AntiFly disabled.");
}
作者:legoboy021
项目:LegionPE-Theta-Bas
/**
* @param Player $player
* @param mixed[]|null $loginData
* @return bool
*/
public function newSession(Player $player, $loginData = null)
{
if ($loginData === null) {
$player->sendMessage(Phrases::VAR_wait . "Welcome to Legion PE! Please wait while we are preparing to register an account for you.");
new NewUserQuery($this, $player);
return false;
}
try {
$this->sessions[$player->getId()] = $this->createSession($player, $loginData);
return true;
} catch (\Exception $e) {
$this->getLogger()->error("An error occurred while trying to initialize session for player {$player->getName()}: ");
MainLogger::getLogger()->logException($e);
return false;
}
}
作者:xpyctu
项目:PocketMinePlusPlu
public function save($flag = \true)
{
$this->removeExpired();
$fp = @\fopen($this->file, "w");
if (\is_resource($fp)) {
if ($flag === \true) {
\fwrite($fp, "# Updated " . \strftime("%x %H:%M", \time()) . " by " . Server::getInstance()->getName() . " " . Server::getInstance()->getPocketMineVersion() . "\n");
\fwrite($fp, "# victim name | ban date | banned by | banned until | reason\n\n");
}
foreach ($this->list as $entry) {
\fwrite($fp, $entry->getString() . "\n");
}
\fclose($fp);
} else {
MainLogger::getLogger()->error("Could not save ban list");
}
}
作者:xpyctu
项目:PocketMinePlusPlu
public function readChunk($x, $z)
{
$index = self::getChunkOffset($x, $z);
if ($index < 0 or $index >= 4096) {
return \null;
}
$this->lastUsed = \time();
if (!$this->isChunkGenerated($index)) {
return \null;
}
\fseek($this->filePointer, $this->locationTable[$index][0] << 12);
$length = \unpack("N", \fread($this->filePointer, 4))[1] << 32 >> 32;
$compression = \ord(\fgetc($this->filePointer));
if ($length <= 0 or $length > self::MAX_SECTOR_LENGTH) {
//Not yet generated / corrupted
if ($length >= self::MAX_SECTOR_LENGTH) {
$this->locationTable[$index][0] = ++$this->lastSector;
$this->locationTable[$index][1] = 1;
MainLogger::getLogger()->error("Corrupted chunk header detected");
}
return \null;
}
if ($length > $this->locationTable[$index][1] << 12) {
//Invalid chunk, bigger than defined number of sectors
MainLogger::getLogger()->error("Corrupted bigger chunk detected");
$this->locationTable[$index][1] = $length >> 12;
$this->writeLocationIndex($index);
} elseif ($compression !== self::COMPRESSION_ZLIB and $compression !== self::COMPRESSION_GZIP) {
MainLogger::getLogger()->error("Invalid compression type");
return \null;
}
$chunk = $this->unserializeChunk(\fread($this->filePointer, $length - 1));
if ($chunk instanceof FullChunk) {
return $chunk;
} else {
MainLogger::getLogger()->error("Corrupted chunk detected");
return \null;
}
}
作者:Edwardthedog
项目:Steadfast
/**
* @param string $message
*/
public function sendMessage($message)
{
foreach (\explode("\n", \trim($message)) as $line) {
MainLogger::getLogger()->info($line);
}
}
作者:boyboo
项目:PocketMine-M
public function import()
{
if (file_exists($this->path . "tileEntities.dat")) {
//OldPM
$level = unserialize(file_get_contents($this->path . "level.dat"));
MainLogger::getLogger()->info("Importing OldPM level \"" . $level["LevelName"] . "\" to PMF format");
$entities = new Config($this->path . "entities.yml", Config::YAML, unserialize(file_get_contents($this->path . "entities.dat")));
$entities->save();
$tiles = new Config($this->path . "tiles.yml", Config::YAML, unserialize(file_get_contents($this->path . "tileEntities.dat")));
$tiles->save();
} elseif (file_exists($this->path . "chunks.dat") and file_exists($this->path . "level.dat")) {
//Pocket
$nbt = new NBT(NBT::LITTLE_ENDIAN);
$nbt->read(substr(file_get_contents($this->path . "level.dat"), 8));
$level = $nbt->getData();
if ($level["LevelName"] == "") {
$level["LevelName"] = "world" . time();
}
MainLogger::getLogger()->info("Importing Pocket level \"" . $level->LevelName . "\" to PMF format");
unset($level->Player);
$nbt->read(substr(file_get_contents($this->path . "entities.dat"), 12));
$entities = $nbt->getData();
if (!isset($entities->TileEntities)) {
$entities->TileEntities = [];
}
$tiles = $entities->TileEntities;
$entities = $entities->Entities;
$entities = new Config($this->path . "entities.yml", Config::YAML, $entities);
$entities->save();
$tiles = new Config($this->path . "tiles.yml", Config::YAML, $tiles);
$tiles->save();
} else {
return false;
}
$pmf = new LevelFormat($this->path . "level.pmf", ["name" => $level->LevelName, "seed" => $level->RandomSeed, "time" => $level->Time, "spawnX" => $level->SpawnX, "spawnY" => $level->SpawnY, "spawnZ" => $level->SpawnZ, "height" => 8, "generator" => "default", "generatorSettings" => "", "extra" => ""]);
$chunks = new PocketChunkParser();
$chunks->loadFile($this->path . "chunks.dat");
$chunks->loadMap();
for ($Z = 0; $Z < 16; ++$Z) {
for ($X = 0; $X < 16; ++$X) {
$chunk = [0 => "", 1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => "", 7 => ""];
$pmf->initCleanChunk($X, $Z);
for ($z = 0; $z < 16; ++$z) {
for ($x = 0; $x < 16; ++$x) {
$block = $chunks->getChunkColumn($X, $Z, $x, $z, 0);
$meta = $chunks->getChunkColumn($X, $Z, $x, $z, 1);
for ($Y = 0; $Y < 8; ++$Y) {
$chunk[$Y] .= substr($block, $Y << 4, 16);
$chunk[$Y] .= substr($meta, $Y << 3, 8);
$chunk[$Y] .= "";
}
}
}
foreach ($chunk as $Y => $data) {
$pmf->setMiniChunk($X, $Z, $Y, $data);
}
$pmf->setPopulated($X, $Z);
$pmf->saveChunk($X, $Z);
}
MainLogger::getLogger()->notice("Importing level " . ceil(($Z + 1) / 0.16) . "%");
}
$chunks->map = null;
$chunks = null;
@unlink($this->path . "level.dat");
@unlink($this->path . "level.dat_old");
@unlink($this->path . "player.dat");
@unlink($this->path . "entities.dat");
@unlink($this->path . "chunks.dat");
@unlink($this->path . "chunks.dat.gz");
@unlink($this->path . "tiles.dat");
unset($chunks, $level, $entities, $tiles, $nbt);
return true;
}
作者:ZenaGamingsk
项目:Steadfast
public function readChunk($x, $z, $generate = true, $forward = false)
{
$index = self::getChunkOffset($x, $z);
if ($index < 0 or $index >= 4096) {
return null;
}
$this->lastUsed = time();
if (!$this->isChunkGenerated($index)) {
if ($generate === true) {
//Allocate space
$this->locationTable[$index][0] = ++$this->lastSector;
$this->locationTable[$index][1] = 1;
fseek($this->filePointer, $this->locationTable[$index][0] << 12);
fwrite($this->filePointer, str_pad(pack("N", 0) . chr(self::COMPRESSION_ZLIB), 4096, "", STR_PAD_RIGHT));
$this->writeLocationIndex($index);
} else {
return null;
}
}
fseek($this->filePointer, $this->locationTable[$index][0] << 12);
$length = PHP_INT_SIZE === 8 ? unpack("N", fread($this->filePointer, 4))[1] << 32 >> 32 : unpack("N", fread($this->filePointer, 4))[1];
$compression = ord(fgetc($this->filePointer));
if ($length <= 0 or $length > self::MAX_SECTOR_LENGTH) {
//Not yet generated / corrupted
if ($length >= self::MAX_SECTOR_LENGTH) {
$this->locationTable[$index][0] = ++$this->lastSector;
$this->locationTable[$index][1] = 1;
MainLogger::getLogger()->error("Corrupted chunk header detected");
}
$this->generateChunk($x, $z);
fseek($this->filePointer, $this->locationTable[$index][0] << 12);
$length = PHP_INT_SIZE === 8 ? unpack("N", fread($this->filePointer, 4))[1] << 32 >> 32 : unpack("N", fread($this->filePointer, 4))[1];
$compression = ord(fgetc($this->filePointer));
}
if ($length > $this->locationTable[$index][1] << 12) {
//Invalid chunk, bigger than defined number of sectors
MainLogger::getLogger()->error("Corrupted bigger chunk detected");
$this->locationTable[$index][1] = $length >> 12;
$this->writeLocationIndex($index);
} elseif ($compression !== self::COMPRESSION_ZLIB and $compression !== self::COMPRESSION_GZIP) {
MainLogger::getLogger()->error("Invalid compression type");
return null;
}
$chunk = Chunk::fromBinary(fread($this->filePointer, $length - 1), $this->levelProvider);
if ($chunk instanceof Chunk) {
return $chunk;
} elseif ($forward === false) {
MainLogger::getLogger()->error("Corrupted chunk detected");
$this->generateChunk($x, $z);
return $this->readChunk($x, $z, $generate, true);
} else {
return null;
}
}
作者:MrDoni9
项目:Genisy
/**
* @param $content
*/
private function parseProperties($content)
{
if (preg_match_all('/([a-zA-Z0-9\\-_\\.]*)=([^\\r\\n]*)/u', $content, $matches) > 0) {
//false or 0 matches
foreach ($matches[1] as $i => $k) {
$v = trim($matches[2][$i]);
switch (strtolower($v)) {
case "on":
case "true":
case "yes":
$v = true;
break;
case "off":
case "false":
case "no":
$v = false;
break;
}
if (isset($this->config[$k])) {
MainLogger::getLogger()->debug("[Config] Repeated property " . $k . " on file " . $this->file);
}
$this->config[$k] = $v;
}
}
}
作者:PepbookPv
项目:Genisy
public function __construct(bool $useJson = false)
{
$this->registerBrewingStand();
if ($useJson) {
// load recipes from src/pocketmine/recipes.json
$recipes = new Config(Server::getInstance()->getFilePath() . "src/pocketmine/resources/recipes.json", Config::JSON, []);
MainLogger::getLogger()->Info("Loading recipes...");
foreach ($recipes->getAll() as $recipe) {
switch ($recipe["Type"]) {
case 0:
// TODO: handle multiple result items
if (count($recipe["Result"]) == 1) {
$first = $recipe["Result"][0];
$result = new ShapelessRecipe(Item::get($first["ID"], $first["Damage"], $first["Count"]));
foreach ($recipe["Ingredients"] as $ingredient) {
$result->addIngredient(Item::get($ingredient["ID"], $ingredient["Damage"], $ingredient["Count"]));
}
$this->registerRecipe($result);
}
break;
case 1:
// TODO: handle multiple result items
if (count($recipe["Result"]) == 1) {
$first = $recipe["Result"][0];
$result = new ShapedRecipeFromJson(Item::get($first["ID"], $first["Damage"], $first["Count"]), $recipe["Height"], $recipe["Width"]);
$shape = array_chunk($recipe["Ingredients"], $recipe["Width"]);
foreach ($shape as $y => $row) {
foreach ($row as $x => $ingredient) {
$result->addIngredient($x, $y, Item::get($ingredient["ID"], $ingredient["Damage"] < 0 ? null : $ingredient["Damage"], $ingredient["Count"]));
}
}
$this->registerRecipe($result);
}
break;
case 2:
$result = $recipe["Result"];
$resultItem = Item::get($result["ID"], $result["Damage"], $result["Count"]);
$this->registerRecipe(new FurnaceRecipe($resultItem, Item::get($recipe["Ingredients"], 0, 1)));
break;
case 3:
$result = $recipe["Result"];
$resultItem = Item::get($result["ID"], $result["Damage"], $result["Count"]);
$this->registerRecipe(new FurnaceRecipe($resultItem, Item::get($recipe["Ingredients"]["ID"], $recipe["Ingredients"]["Damage"], 1)));
break;
default:
break;
}
}
} else {
$this->registerStonecutter();
$this->registerFurnace();
$this->registerDyes();
$this->registerIngots();
$this->registerTools();
$this->registerWeapons();
$this->registerArmor();
$this->registerFood();
$this->registerBrewingStand();
$this->registerRecipe((new ShapedRecipe(Item::get(Item::CLAY_BLOCK, 0, 1), "X"))->setIngredient("X", Item::get(Item::CLAY, 0, 4)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WORKBENCH, 0, 1), "XX", "XX"))->setIngredient("X", Item::get(Item::WOODEN_PLANK, null)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::GLOWSTONE_BLOCK, 0, 1), "XX", "XX"))->setIngredient("X", Item::get(Item::GLOWSTONE_DUST, 0, 4)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::LIT_PUMPKIN, 0, 1), "X ", "Y "))->setIngredient("X", Item::get(Item::PUMPKIN, 0, 1))->setIngredient("Y", Item::get(Item::TORCH, 0, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::SNOW_BLOCK, 0, 1), "XX", "XX"))->setIngredient("X", Item::get(Item::SNOWBALL)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::SNOW_LAYER, 0, 6), "X"))->setIngredient("X", Item::get(Item::SNOW_BLOCK, 0, 3)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::STICK, 0, 4), "X ", "X "))->setIngredient("X", Item::get(Item::WOODEN_PLANK, null)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::STONECUTTER, 0, 1), "XX", "XX"))->setIngredient("X", Item::get(Item::COBBLESTONE)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WOODEN_PLANK, Planks::OAK, 4), "X"))->setIngredient("X", Item::get(Item::WOOD, Wood::OAK, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WOODEN_PLANK, Planks::SPRUCE, 4), "X"))->setIngredient("X", Item::get(Item::WOOD, Wood::SPRUCE, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WOODEN_PLANK, Planks::BIRCH, 4), "X"))->setIngredient("X", Item::get(Item::WOOD, Wood::BIRCH, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WOODEN_PLANK, Planks::JUNGLE, 4), "X"))->setIngredient("X", Item::get(Item::WOOD, Wood::JUNGLE, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WOODEN_PLANK, Planks::ACACIA, 4), "X"))->setIngredient("X", Item::get(Item::WOOD2, Wood2::ACACIA, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WOODEN_PLANK, Planks::DARK_OAK, 4), "X"))->setIngredient("X", Item::get(Item::WOOD2, Wood2::DARK_OAK, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::WOOL, 0, 1), "XX", "XX"))->setIngredient("X", Item::get(Item::STRING, 0, 4)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::TORCH, 0, 4), "C ", "S"))->setIngredient("C", Item::get(Item::COAL, 0, 1))->setIngredient("S", Item::get(Item::STICK, 0, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::TORCH, 0, 4), "C ", "S"))->setIngredient("C", Item::get(Item::COAL, 1, 1))->setIngredient("S", Item::get(Item::STICK, 0, 1)));
$this->registerRecipe((new ShapedRecipe(Item::get(Item::SUGAR, 0, 1), "S"))->setIngredient("S", Item::get(Item::SUGARCANE, 0, 1)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::BED, 0, 1), "WWW", "PPP"))->setIngredient("W", Item::get(Item::WOOL, null, 3))->setIngredient("P", Item::get(Item::WOODEN_PLANK, null, 3)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::CHEST, 0, 1), "PPP", "P P", "PPP"))->setIngredient("P", Item::get(Item::WOODEN_PLANK, null, 8)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE, 0, 3), "PSP", "PSP"))->setIngredient("S", Item::get(Item::STICK, 0, 2))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::OAK, 4)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE, Planks::SPRUCE, 3), "PSP", "PSP"))->setIngredient("S", Item::get(Item::STICK, 0, 2))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::SPRUCE, 4)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE, Planks::BIRCH, 3), "PSP", "PSP"))->setIngredient("S", Item::get(Item::STICK, 0, 2))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::BIRCH, 4)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE, Planks::JUNGLE, 3), "PSP", "PSP"))->setIngredient("S", Item::get(Item::STICK, 0, 2))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::JUNGLE, 4)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE, Planks::ACACIA, 3), "PSP", "PSP"))->setIngredient("S", Item::get(Item::STICK, 0, 2))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::ACACIA, 4)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE, Planks::DARK_OAK, 3), "PSP", "PSP"))->setIngredient("S", Item::get(Item::STICK, 0, 2))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::DARK_OAK, 4)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE_GATE, 0, 1), "SPS", "SPS"))->setIngredient("S", Item::get(Item::STICK, 0, 4))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::OAK, 2)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE_GATE_SPRUCE, 0, 1), "SPS", "SPS"))->setIngredient("S", Item::get(Item::STICK, 0, 4))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::SPRUCE, 2)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE_GATE_BIRCH, 0, 1), "SPS", "SPS"))->setIngredient("S", Item::get(Item::STICK, 0, 4))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::BIRCH, 2)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE_GATE_JUNGLE, 0, 1), "SPS", "SPS"))->setIngredient("S", Item::get(Item::STICK, 0, 4))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::JUNGLE, 2)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE_GATE_DARK_OAK, 0, 1), "SPS", "SPS"))->setIngredient("S", Item::get(Item::STICK, 0, 4))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::DARK_OAK, 2)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FENCE_GATE_ACACIA, 0, 1), "SPS", "SPS"))->setIngredient("S", Item::get(Item::STICK, 0, 4))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::ACACIA, 2)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::FURNACE, 0, 1), "CCC", "C C", "CCC"))->setIngredient("C", Item::get(Item::COBBLESTONE, 0, 8)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::GLASS_PANE, 0, 16), "GGG", "GGG"))->setIngredient("G", Item::get(Item::GLASS, 0, 6)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::LADDER, 0, 2), "S S", "SSS", "S S"))->setIngredient("S", Item::get(Item::STICK, 0, 7)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::NETHER_REACTOR, 0, 1), "IDI", "IDI", "IDI"))->setIngredient("D", Item::get(Item::DIAMOND, 0, 3))->setIngredient("I", Item::get(Item::IRON_INGOT, 0, 6)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::TRAPDOOR, 0, 2), "PPP", "PPP"))->setIngredient("P", Item::get(Item::WOODEN_PLANK, null, 6)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::WOODEN_DOOR, 0, 1), "PP", "PP", "PP"))->setIngredient("P", Item::get(Item::WOODEN_PLANK, null, 6)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::BIRCH_DOOR, 0, 1), "PP", "PP", "PP"))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::BIRCH, 6)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::SPRUCE_DOOR, 0, 1), "PP", "PP", "PP"))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::SPRUCE, 6)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::JUNGLE_DOOR, 0, 1), "PP", "PP", "PP"))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::JUNGLE, 6)));
$this->registerRecipe((new BigShapedRecipe(Item::get(Item::ACACIA_DOOR, 0, 1), "PP", "PP", "PP"))->setIngredient("P", Item::get(Item::WOODEN_PLANK, Planks::ACACIA, 6)));
//.........这里部分代码省略.........