mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-20 16:00:20 +00:00
This commit is contained in:
parent
21f5be27b6
commit
9c36e0cd1c
@ -45,8 +45,6 @@ use pocketmine\event\TranslationContainer;
|
|||||||
use pocketmine\inventory\CraftingManager;
|
use pocketmine\inventory\CraftingManager;
|
||||||
use pocketmine\inventory\InventoryType;
|
use pocketmine\inventory\InventoryType;
|
||||||
use pocketmine\inventory\Recipe;
|
use pocketmine\inventory\Recipe;
|
||||||
use pocketmine\inventory\ShapedRecipe;
|
|
||||||
use pocketmine\inventory\ShapelessRecipe;
|
|
||||||
use pocketmine\item\enchantment\Enchantment;
|
use pocketmine\item\enchantment\Enchantment;
|
||||||
use pocketmine\item\Item;
|
use pocketmine\item\Item;
|
||||||
use pocketmine\lang\BaseLang;
|
use pocketmine\lang\BaseLang;
|
||||||
@ -78,7 +76,6 @@ use pocketmine\nbt\tag\StringTag;
|
|||||||
use pocketmine\network\CompressBatchedTask;
|
use pocketmine\network\CompressBatchedTask;
|
||||||
use pocketmine\network\Network;
|
use pocketmine\network\Network;
|
||||||
use pocketmine\network\protocol\BatchPacket;
|
use pocketmine\network\protocol\BatchPacket;
|
||||||
use pocketmine\network\protocol\CraftingDataPacket;
|
|
||||||
use pocketmine\network\protocol\DataPacket;
|
use pocketmine\network\protocol\DataPacket;
|
||||||
use pocketmine\network\protocol\Info as ProtocolInfo;
|
use pocketmine\network\protocol\Info as ProtocolInfo;
|
||||||
use pocketmine\network\protocol\PlayerListPacket;
|
use pocketmine\network\protocol\PlayerListPacket;
|
||||||
@ -2102,7 +2099,7 @@ class Server{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->sendFullPlayerListData($player);
|
$this->sendFullPlayerListData($player);
|
||||||
$this->sendRecipeList($player);
|
$player->dataPacket($this->craftingManager->getCraftingDataPacket());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addPlayer($identifier, Player $player){
|
public function addPlayer($identifier, Player $player){
|
||||||
@ -2154,25 +2151,6 @@ class Server{
|
|||||||
$p->dataPacket($pk);
|
$p->dataPacket($pk);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function sendRecipeList(Player $p){
|
|
||||||
$pk = new CraftingDataPacket();
|
|
||||||
$pk->cleanRecipes = true;
|
|
||||||
|
|
||||||
foreach($this->getCraftingManager()->getRecipes() as $recipe){
|
|
||||||
if($recipe instanceof ShapedRecipe){
|
|
||||||
$pk->addShapedRecipe($recipe);
|
|
||||||
}elseif($recipe instanceof ShapelessRecipe){
|
|
||||||
$pk->addShapelessRecipe($recipe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($this->getCraftingManager()->getFurnaceRecipes() as $recipe){
|
|
||||||
$pk->addFurnaceRecipe($recipe);
|
|
||||||
}
|
|
||||||
|
|
||||||
$p->dataPacket($pk);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function checkTickUpdates($currentTick, $tickTime){
|
private function checkTickUpdates($currentTick, $tickTime){
|
||||||
foreach($this->players as $p){
|
foreach($this->players as $p){
|
||||||
if(!$p->loggedIn and ($tickTime - $p->creationTime) >= 10){
|
if(!$p->loggedIn and ($tickTime - $p->creationTime) >= 10){
|
||||||
|
@ -104,6 +104,9 @@ abstract class Timings{
|
|||||||
/** @var TimingsHandler */
|
/** @var TimingsHandler */
|
||||||
public static $playerCommandTimer;
|
public static $playerCommandTimer;
|
||||||
|
|
||||||
|
/** @var TimingsHandler */
|
||||||
|
public static $craftingDataCacheRebuildTimer;
|
||||||
|
|
||||||
/** @var TimingsHandler[] */
|
/** @var TimingsHandler[] */
|
||||||
public static $entityTypeTimingMap = [];
|
public static $entityTypeTimingMap = [];
|
||||||
/** @var TimingsHandler[] */
|
/** @var TimingsHandler[] */
|
||||||
@ -158,6 +161,7 @@ abstract class Timings{
|
|||||||
self::$schedulerAsyncTimer = new TimingsHandler("** Scheduler - Async Tasks");
|
self::$schedulerAsyncTimer = new TimingsHandler("** Scheduler - Async Tasks");
|
||||||
|
|
||||||
self::$playerCommandTimer = new TimingsHandler("** playerCommand");
|
self::$playerCommandTimer = new TimingsHandler("** playerCommand");
|
||||||
|
self::$craftingDataCacheRebuildTimer = new TimingsHandler("** craftingDataCacheRebuild");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
|
|
||||||
namespace pocketmine\inventory;
|
namespace pocketmine\inventory;
|
||||||
|
|
||||||
|
use pocketmine\event\Timings;
|
||||||
use pocketmine\item\Item;
|
use pocketmine\item\Item;
|
||||||
|
use pocketmine\network\protocol\CraftingDataPacket;
|
||||||
use pocketmine\Server;
|
use pocketmine\Server;
|
||||||
use pocketmine\utils\Config;
|
use pocketmine\utils\Config;
|
||||||
use pocketmine\utils\MainLogger;
|
use pocketmine\utils\MainLogger;
|
||||||
@ -40,6 +42,9 @@ class CraftingManager{
|
|||||||
|
|
||||||
private static $RECIPE_COUNT = 0;
|
private static $RECIPE_COUNT = 0;
|
||||||
|
|
||||||
|
/** @var CraftingDataPacket */
|
||||||
|
private $craftingDataCache;
|
||||||
|
|
||||||
public function __construct(){
|
public function __construct(){
|
||||||
// load recipes from src/pocketmine/resources/recipes.json
|
// load recipes from src/pocketmine/resources/recipes.json
|
||||||
$recipes = new Config(Server::getInstance()->getFilePath() . "src/pocketmine/resources/recipes.json", Config::JSON, []);
|
$recipes = new Config(Server::getInstance()->getFilePath() . "src/pocketmine/resources/recipes.json", Config::JSON, []);
|
||||||
@ -84,6 +89,48 @@ class CraftingManager{
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->buildCraftingDataCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rebuilds the cached CraftingDataPacket.
|
||||||
|
*/
|
||||||
|
public function buildCraftingDataCache(){
|
||||||
|
Timings::$craftingDataCacheRebuildTimer->startTiming();
|
||||||
|
$pk = new CraftingDataPacket();
|
||||||
|
$pk->cleanRecipes = true;
|
||||||
|
|
||||||
|
foreach($this->recipes as $recipe){
|
||||||
|
if($recipe instanceof ShapedRecipe){
|
||||||
|
$pk->addShapedRecipe($recipe);
|
||||||
|
}elseif($recipe instanceof ShapelessRecipe){
|
||||||
|
$pk->addShapelessRecipe($recipe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($this->furnaceRecipes as $recipe){
|
||||||
|
$pk->addFurnaceRecipe($recipe);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pk->encode();
|
||||||
|
$pk->isEncoded = true;
|
||||||
|
|
||||||
|
$this->craftingDataCache = $pk;
|
||||||
|
Timings::$craftingDataCacheRebuildTimer->stopTiming();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a CraftingDataPacket for sending to players. Rebuilds the cache if it is outdated.
|
||||||
|
*
|
||||||
|
* @return CraftingDataPacket
|
||||||
|
*/
|
||||||
|
public function getCraftingDataPacket() : CraftingDataPacket{
|
||||||
|
if($this->craftingDataCache === null){
|
||||||
|
$this->buildCraftingDataCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->craftingDataCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function sort(Item $i1, Item $i2){
|
public function sort(Item $i1, Item $i2){
|
||||||
@ -162,6 +209,7 @@ class CraftingManager{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->recipeLookup[$result->getId() . ":" . $result->getDamage()][$hash] = $recipe;
|
$this->recipeLookup[$result->getId() . ":" . $result->getDamage()][$hash] = $recipe;
|
||||||
|
$this->craftingDataCache = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -177,6 +225,7 @@ class CraftingManager{
|
|||||||
$hash .= $item->getId() . ":" . ($item->hasAnyDamageValue() ? "?" : $item->getDamage()) . "x" . $item->getCount() . ",";
|
$hash .= $item->getId() . ":" . ($item->hasAnyDamageValue() ? "?" : $item->getDamage()) . "x" . $item->getCount() . ",";
|
||||||
}
|
}
|
||||||
$this->recipeLookup[$result->getId() . ":" . $result->getDamage()][$hash] = $recipe;
|
$this->recipeLookup[$result->getId() . ":" . $result->getDamage()][$hash] = $recipe;
|
||||||
|
$this->craftingDataCache = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -185,6 +234,7 @@ class CraftingManager{
|
|||||||
public function registerFurnaceRecipe(FurnaceRecipe $recipe){
|
public function registerFurnaceRecipe(FurnaceRecipe $recipe){
|
||||||
$input = $recipe->getInput();
|
$input = $recipe->getInput();
|
||||||
$this->furnaceRecipes[$input->getId() . ":" . ($input->hasAnyDamageValue() ? "?" : $input->getDamage())] = $recipe;
|
$this->furnaceRecipes[$input->getId() . ":" . ($input->hasAnyDamageValue() ? "?" : $input->getDamage())] = $recipe;
|
||||||
|
$this->craftingDataCache = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user