52 using ItemStackNetIdChangedCallback = ::std::function<void(
int,
::ItemStack const&)>;
55 [[nodiscard]] std::string
const& getTypeName()
const {
return containerTypeMap().at(mContainerType); }
59 [[nodiscard]]
ItemStack& operator[](
int index) {
return this->getItemNonConst(index); }
61 [[nodiscard]] ItemStack
const& operator[](
int index)
const {
return this->getItem(index); }
63 using TransactionContext = std::function<void(::Container&,
int, ::ItemStack
const&, ::ItemStack
const&)>;
66 using Iterator = ContainerIterator<Container>;
67 using ConstIterator = ContainerIterator<Container const>;
69 using ReverseIterator = std::reverse_iterator<Iterator>;
70 using ConstReverseIterator = std::reverse_iterator<ConstIterator>;
72 [[nodiscard]]
constexpr Iterator begin() noexcept {
return {
this, 0}; }
73 [[nodiscard]]
constexpr ConstIterator cbegin() const noexcept {
return {
this, 0}; }
74 [[nodiscard]]
constexpr Iterator end() noexcept {
return {
this, getContainerSize()}; }
75 [[nodiscard]]
constexpr ConstIterator cend() const noexcept {
return {
this, getContainerSize()}; }
77 [[nodiscard]]
constexpr ReverseIterator rbegin() noexcept {
return ReverseIterator{end()}; }
78 [[nodiscard]]
constexpr ConstReverseIterator crbegin() const noexcept {
return ConstReverseIterator{cend()}; }
79 [[nodiscard]]
constexpr ReverseIterator rend() noexcept {
return ReverseIterator{begin()}; }
80 [[nodiscard]]
constexpr ConstReverseIterator crend() const noexcept {
return ConstReverseIterator{cbegin()}; }
85 ::SharedTypes::Legacy::ContainerType mContainerType;
86 ::SharedTypes::Legacy::ContainerType mGameplayContainerType;
87 ::std::unordered_set<::ContainerContentChangeListener*> mContentChangeListeners;
88 ::std::unordered_set<::ContainerSizeChangeListener*> mSizeChangeListeners;
89 ::std::unordered_set<::ContainerCloseListener*> mCloseListeners;
90 ::Container::PublisherWrapper mRemovedPublisher;
91 ::std::deque<TransactionContext> mTransactionContextStack;
92 ::Bedrock::Safety::RedactableString mName;
94 ::ContainerOwner mContainerOwner;
95 ::ContainerRuntimeId mContainerRuntimeId;
105 virtual ~Container();
109 virtual void serverInitItemStackIds(
112 ::std::function<
void(
int, ::ItemStack
const&)> onNetIdChanged
115 virtual void addContentChangeListener(::ContainerContentChangeListener* listener);
117 virtual void removeContentChangeListener(::ContainerContentChangeListener* listener);
119 virtual ::Bedrock::PubSub::Connector<void()>* getContainerRemovedConnector();
121 virtual bool hasRemovedSubscribers()
const;
123 virtual ::ItemStack
const& getItem(
int slot)
const = 0;
125 virtual bool hasRoomForItem(::ItemStack
const& item)
const;
127 virtual bool addItem(::ItemStack& item);
129 virtual bool addItemWithForceBalance(::ItemStack& item);
131 virtual bool addItemToFirstEmptySlot(::ItemStack
const& item);
133 virtual void setItem(
int slot, ::ItemStack
const& item) = 0;
135 virtual void setItemWithForceBalance(
int slot, ::ItemStack
const& item,
bool forceBalanced);
137 virtual void removeItem(
int slot,
int count);
139 virtual void removeAllItems();
141 virtual void removeAllItemsWithForceBalance();
143 virtual void containerRemoved();
145 virtual void dropSlotContent(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop,
int slot);
147 virtual void dropContents(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop);
149 virtual int getContainerSize()
const = 0;
151 virtual int getMaxStackSize()
const = 0;
153 virtual void startOpen(::Actor& actor) = 0;
155 virtual void stopOpen(::Actor& actor);
157 virtual ::std::vector<::ItemStack> getSlotCopies()
const;
159 virtual ::std::vector<::ItemStack const*>
const getSlots()
const;
161 virtual int getEmptySlotsCount()
const;
163 virtual int getItemCount(::ItemStack
const& compare)
const;
165 virtual int firstEmptySlot()
const;
167 virtual int firstItem()
const;
169 virtual int findFirstSlotForItem(::ItemStack
const& item)
const;
171 virtual int reverseFindFirstSlotForItem(::ItemStack
const& item)
const;
173 virtual bool canPushInItem(
int slot,
int face, ::ItemStack
const& item)
const;
175 virtual bool canPullOutItem(
int slot,
int face, ::ItemStack
const& item)
const;
177 virtual void setContainerChanged(
int slot);
179 virtual void setContainerMoved();
181 virtual void setCustomName(::Bedrock::Safety::RedactableString
const& name);
183 virtual bool hasCustomName()
const;
185 virtual void readAdditionalSaveData(::CompoundTag
const& tag);
187 virtual void addAdditionalSaveData(::CompoundTag& tag);
189 virtual void createTransactionContext(
190 ::std::function<
void(::Container&,
int, ::ItemStack
const&, ::ItemStack
const&)> callback,
191 ::std::function<
void()> execute
194 virtual void initializeContainerContents(::BlockSource& region);
196 virtual bool isEmpty()
const;
198 virtual bool isSlotDisabled(
int slot)
const;
204 MCAPI Container(::Container
const& backingContainer);
206 MCAPI
explicit Container(::SharedTypes::Legacy::ContainerType type);
208 MCAPI Container(::SharedTypes::Legacy::ContainerType type, ::std::string
const& name,
bool customName);
212 ::SharedTypes::Legacy::ContainerType type,
213 ::Bedrock::Safety::RedactableString
const& name,
219 _dropSlotContent(::BlockSource& region, ::Random& random, ::Vec3
const& pos,
bool randomizeDrop,
int slot);
221 MCAPI
int _getEmptySlotsCount(
int start,
int end)
const;
224 MCAPI
void _initRuntimeId(::ContainerRuntimeId
const& containerIdToCopy);
228 _serverInitId(
int slot, ::ItemStack& item, ::std::function<
void(
int, ::ItemStack
const&)> onNetIdChanged);
230 MCAPI
void addCloseListener(::ContainerCloseListener* listener);
232 MCFOLD ::SharedTypes::Legacy::ContainerType getContainerType()
const;
234 MCFOLD ::SharedTypes::Legacy::ContainerType getGameplayContainerType()
const;
236 MCAPI
int getItemCount(::std::function<
bool(::ItemStack
const&)> comparator)
const;
238 MCAPI
int getItemCount(::ItemDescriptor
const& descriptor)
const;
241 MCFOLD ::Bedrock::Safety::RedactableString
const& getName()
const;
244 MCAPI
int getRedstoneSignalFromContainer(::BlockSource& region);
246 MCFOLD ::ContainerRuntimeId
const& getRuntimeId()
const;
248 MCAPI
void initRuntimeId();
250 MCAPI ::Container& operator=(::Container
const&);
252 MCAPI
void receiveContainerLifetimes(::DynamicContainerTracker
const& tracker);
254 MCAPI
void removeCloseListener(::ContainerCloseListener* listener);
256 MCAPI
void serverInitItemStackIdsAll(::std::function<
void(
int, ::ItemStack
const&)> onNetIdChanged);
258 MCFOLD
void setGameplayContainerType(::SharedTypes::Legacy::ContainerType type);
260 MCAPI
void triggerTransactionChange(
int slot, ::ItemStack
const& oldItem, ::ItemStack
const& newItem);
266 MCAPI static ::SharedTypes::Legacy::ContainerType getContainerTypeId(::std::string
const& name);
268 MCAPI static ::std::string
const& getContainerTypeName(::SharedTypes::Legacy::ContainerType type);
274 MCAPI static ::BidirectionalUnorderedMap<::SharedTypes::Legacy::ContainerType, ::std::string>
const&
281 MCAPI
void* $ctor(::Container
const& backingContainer);
283 MCAPI
void* $ctor(::SharedTypes::Legacy::ContainerType type);
285 MCAPI
void* $ctor(::SharedTypes::Legacy::ContainerType type, ::std::string
const& name,
bool customName);
289 $ctor(::SharedTypes::Legacy::ContainerType type, ::Bedrock::Safety::RedactableString
const& name,
bool customName);
304 MCAPI
void $addContentChangeListener(::ContainerContentChangeListener* listener);
306 MCAPI
void $removeContentChangeListener(::ContainerContentChangeListener* listener);
308 MCFOLD ::Bedrock::PubSub::Connector<void()>* $getContainerRemovedConnector();
310 MCAPI
bool $hasRemovedSubscribers()
const;
312 MCAPI
bool $hasRoomForItem(::ItemStack
const& item)
const;
314 MCAPI
bool $addItem(::ItemStack& item);
316 MCAPI
bool $addItemWithForceBalance(::ItemStack& item);
318 MCAPI
bool $addItemToFirstEmptySlot(::ItemStack
const& item);
320 MCFOLD
void $setItemWithForceBalance(
int slot, ::ItemStack
const& item,
bool forceBalanced);
322 MCAPI
void $removeItem(
int slot,
int count);
324 MCAPI
void $removeAllItems();
326 MCAPI
void $removeAllItemsWithForceBalance();
328 MCAPI
void $containerRemoved();
330 MCAPI
void $dropSlotContent(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop,
int slot);
332 MCAPI
void $dropContents(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop);
334 MCAPI
void $stopOpen(::Actor& actor);
336 MCAPI ::std::vector<::ItemStack> $getSlotCopies()
const;
338 MCAPI ::std::vector<::ItemStack const*>
const $getSlots()
const;
340 MCAPI
int $getEmptySlotsCount()
const;
342 MCAPI
int $getItemCount(::ItemStack
const& compare)
const;
344 MCAPI
int $firstEmptySlot()
const;
346 MCAPI
int $firstItem()
const;
348 MCAPI
int $findFirstSlotForItem(::ItemStack
const& item)
const;
350 MCAPI
int $reverseFindFirstSlotForItem(::ItemStack
const& item)
const;
352 MCFOLD
bool $canPushInItem(
int slot,
int face, ::ItemStack
const& item)
const;
354 MCFOLD
bool $canPullOutItem(
int slot,
int face, ::ItemStack
const& item)
const;
356 MCAPI
void $setContainerChanged(
int slot);
358 MCAPI
void $setContainerMoved();
360 MCAPI
void $setCustomName(::Bedrock::Safety::RedactableString
const& name);
362 MCFOLD
bool $hasCustomName()
const;
364 MCAPI
void $readAdditionalSaveData(::CompoundTag
const& tag);
366 MCAPI
void $addAdditionalSaveData(::CompoundTag& tag);
368 MCAPI
void $createTransactionContext(
369 ::std::function<
void(::Container&,
int, ::ItemStack
const&, ::ItemStack
const&)> callback,
370 ::std::function<
void()> execute
373 MCFOLD
void $initializeContainerContents(::BlockSource& region);
375 MCAPI
bool $isEmpty()
const;
377 MCFOLD
bool $isSlotDisabled(
int slot)
const;
385 MCAPI
static void** $vftable();