47 private array $caches = [];
50 $id = spl_object_id($inventory);
51 if(!isset($this->caches[$id])){
52 $inventory->getDestructorCallbacks()->
add(
function() use ($id) :
void{
53 unset($this->caches[$id]);
56 unset($this->caches[$id]);
58 $this->caches[$id] = $this->buildCacheEntry($inventory);
60 return $this->caches[$id];
70 $typeConverter = TypeConverter::getInstance();
74 $itemGroupIndexes = [];
77 $group = $entry->getGroup();
78 $category = $entry->getCategory();
80 $groupId = PHP_INT_MIN;
82 $groupId = spl_object_id($group);
83 unset($groupIndexes[$category->name][PHP_INT_MIN]);
87 if(!isset($groupIndexes[$category->name][$groupId])){
88 $groupIndexes[$category->name][$groupId] = $nextIndex++;
89 $categories[] = $category;
92 $itemGroupIndexes[$k] = $groupIndexes[$category->name][$groupId];
100 $typeConverter->coreItemStackToNet($entry->getItem()),
101 $itemGroupIndexes[$k]
109 $player = $session->getPlayer() ??
throw new \LogicException(
"Cannot prepare creative data for a session without a player");
110 $language = $player->getLanguage();
111 $forceLanguage = $player->getServer()->isLanguageForced();
112 $typeConverter = $session->getTypeConverter();
113 $cachedEntry = $this->getCacheEntry($inventory);
114 $translate =
function(
Translatable|
string $translatable) use ($session, $language, $forceLanguage) :
string{
115 if(is_string($translatable)){
116 $message = $translatable;
117 }elseif(!$forceLanguage){
120 $message = $language->translate($translatable);
126 foreach($cachedEntry->categories as $index => $category){
127 $group = $cachedEntry->groups[$index];
128 $categoryId = match ($category) {
129 CreativeCategory::CONSTRUCTION => CreativeContentPacket::CATEGORY_CONSTRUCTION,
130 CreativeCategory::NATURE => CreativeContentPacket::CATEGORY_NATURE,
131 CreativeCategory::EQUIPMENT => CreativeContentPacket::CATEGORY_EQUIPMENT,
132 CreativeCategory::ITEMS => CreativeContentPacket::CATEGORY_ITEMS
137 $groupIcon = $group->getIcon();
141 $groupIcon->getNamedTag()->setInt(
"___GroupBugWorkaround___", $index);
142 $groupName = $group->getName();
145 $translate($groupName),
146 $typeConverter->coreItemStackToNet($groupIcon)
static create(array $groups, array $items)