63 using ItemStackNetIdChangedCallback = ::std::function<void(
int,
::ItemStack const&)>;
66 [[nodiscard]] std::string
const& getTypeName()
const {
return containerTypeMap().at(mContainerType); }
70 [[nodiscard]]
ItemStack& operator[](
int index) {
return this->getItemNonConst(index); }
72 [[nodiscard]] ItemStack
const& operator[](
int index)
const {
return this->getItem(index); }
74 using TransactionContext = std::function<void(::Container&,
int, ::ItemStack
const&, ::ItemStack
const&)>;
77 using Iterator = ContainerIterator<Container>;
78 using ConstIterator = ContainerIterator<Container const>;
80 using ReverseIterator = std::reverse_iterator<Iterator>;
81 using ConstReverseIterator = std::reverse_iterator<ConstIterator>;
83 [[nodiscard]]
constexpr Iterator begin() noexcept {
return {
this, 0}; }
84 [[nodiscard]]
constexpr ConstIterator cbegin() const noexcept {
return {
this, 0}; }
85 [[nodiscard]]
constexpr Iterator end() noexcept {
return {
this, getContainerSize()}; }
86 [[nodiscard]]
constexpr ConstIterator cend() const noexcept {
return {
this, getContainerSize()}; }
88 [[nodiscard]]
constexpr ReverseIterator rbegin() noexcept {
return ReverseIterator{end()}; }
89 [[nodiscard]]
constexpr ConstReverseIterator crbegin() const noexcept {
return ConstReverseIterator{cend()}; }
90 [[nodiscard]]
constexpr ReverseIterator rend() noexcept {
return ReverseIterator{begin()}; }
91 [[nodiscard]]
constexpr ConstReverseIterator crend() const noexcept {
return ConstReverseIterator{cbegin()}; }
96 ::SharedTypes::Legacy::ContainerType mContainerType;
97 ::SharedTypes::Legacy::ContainerType mGameplayContainerType;
98 ::std::unordered_set<::ContainerContentChangeListener*> mContentChangeListeners;
99 ::std::unordered_set<::ContainerSizeChangeListener*> mSizeChangeListeners;
100 ::std::unordered_set<::ContainerCloseListener*> mCloseListeners;
101 ::Container::PublisherWrapper mRemovedPublisher;
102 ::std::deque<TransactionContext> mTransactionContextStack;
103 ::Bedrock::Safety::RedactableString mName;
105 ::ContainerOwner mContainerOwner;
106 ::ContainerRuntimeId mContainerRuntimeId;
116 virtual ~Container();
120 virtual void serverInitItemStackIds(
123 ::std::function<
void(
int, ::ItemStack
const&)> onNetIdChanged
126 virtual void addContentChangeListener(::ContainerContentChangeListener* listener);
128 virtual void removeContentChangeListener(::ContainerContentChangeListener* listener);
130 virtual ::Bedrock::PubSub::Connector<void()>* getContainerRemovedConnector();
132 virtual bool hasRemovedSubscribers()
const;
134 virtual ::ItemStack
const& getItem(
int slot)
const = 0;
136 virtual bool hasRoomForItem(::ItemStack
const& item)
const;
138 virtual bool addItem(::ItemStack& item);
140 virtual bool addItemWithForceBalance(::ItemStack& item);
142 virtual bool addItemToFirstEmptySlot(::ItemStack
const& item);
144 virtual void setItem(
int slot, ::ItemStack
const& item) = 0;
146 virtual void setItemWithForceBalance(
int slot, ::ItemStack
const& item,
bool forceBalanced);
148 virtual void removeItem(
int slot,
int count);
150 virtual void removeAllItems();
152 virtual void removeAllItemsWithForceBalance();
154 virtual void containerRemoved();
156 virtual void dropSlotContent(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop,
int slot);
158 virtual void dropContents(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop);
160 virtual int getContainerSize()
const = 0;
162 virtual int getMaxStackSize()
const = 0;
164 virtual void startOpen(::Actor& actor) = 0;
166 virtual void stopOpen(::Actor& actor);
168 virtual ::std::vector<::ItemStack> getSlotCopies()
const;
170 virtual ::std::vector<::ItemStack const*>
const getSlots()
const;
172 virtual int getEmptySlotsCount()
const;
174 virtual int getItemCount(::ItemStack
const& compare)
const;
176 virtual int firstEmptySlot()
const;
178 virtual int firstItem()
const;
180 virtual int findFirstSlotForItem(::ItemStack
const& item)
const;
182 virtual int reverseFindFirstSlotForItem(::ItemStack
const& item)
const;
184 virtual bool canPushInItem(
int slot,
int face, ::ItemStack
const& item)
const;
186 virtual bool canPullOutItem(
int slot,
int face, ::ItemStack
const& item)
const;
188 virtual void setContainerChanged(
int slot);
190 virtual void setContainerMoved();
192 virtual void setCustomName(::Bedrock::Safety::RedactableString
const& name);
194 virtual bool hasCustomName()
const;
196 virtual void readAdditionalSaveData(::CompoundTag
const& tag);
198 virtual void addAdditionalSaveData(::CompoundTag& tag);
200 virtual void createTransactionContext(
201 ::std::function<
void(::Container&,
int, ::ItemStack
const&, ::ItemStack
const&)> callback,
202 ::std::function<
void()> execute
205 virtual void initializeContainerContents(::BlockSource& region);
207 virtual bool isEmpty()
const;
209 virtual bool isSlotDisabled(
int slot)
const;
215 MCAPI Container(::Container
const&);
217 MCAPI
explicit Container(::SharedTypes::Legacy::ContainerType type);
219 MCAPI Container(::SharedTypes::Legacy::ContainerType type, ::std::string
const& name,
bool customName);
223 ::SharedTypes::Legacy::ContainerType type,
224 ::Bedrock::Safety::RedactableString
const& name,
230 _dropSlotContent(::BlockSource& region, ::Random& random, ::Vec3
const& pos,
bool randomizeDrop,
int slot);
233 _serverInitId(
int slot, ::ItemStack& item, ::std::function<
void(
int, ::ItemStack
const&)> onNetIdChanged);
235 MCAPI
int getItemCount(::std::function<
bool(::ItemStack
const&)> comparator)
const;
237 MCAPI
int getRedstoneSignalFromContainer(::BlockSource& region);
239 MCAPI ::Container& operator=(::Container
const&);
241 MCAPI
void removeCloseListener(::ContainerCloseListener* listener);
243 MCAPI
void triggerTransactionChange(
int slot, ::ItemStack
const& oldItem, ::ItemStack
const& newItem);
249 MCAPI static ::SharedTypes::Legacy::ContainerType getContainerTypeId(::std::string
const& name);
251 MCAPI static ::std::function<bool(::ItemStack
const&)> sameItemAndAuxComparator(::ItemDescriptor
const& descriptor);
257 MCAPI static ::BidirectionalUnorderedMap<::SharedTypes::Legacy::ContainerType, ::std::string>
const&
264 MCAPI
void* $ctor(::Container
const&);
266 MCAPI
void* $ctor(::SharedTypes::Legacy::ContainerType type);
268 MCAPI
void* $ctor(::SharedTypes::Legacy::ContainerType type, ::std::string
const& name,
bool customName);
272 $ctor(::SharedTypes::Legacy::ContainerType type, ::Bedrock::Safety::RedactableString
const& name,
bool customName);
287 MCAPI
void $addContentChangeListener(::ContainerContentChangeListener* listener);
289 MCAPI
void $removeContentChangeListener(::ContainerContentChangeListener* listener);
291 MCFOLD ::Bedrock::PubSub::Connector<void()>* $getContainerRemovedConnector();
293 MCAPI
bool $hasRemovedSubscribers()
const;
295 MCAPI
bool $hasRoomForItem(::ItemStack
const& item)
const;
297 MCAPI
bool $addItem(::ItemStack& item);
299 MCAPI
bool $addItemWithForceBalance(::ItemStack& item);
301 MCAPI
bool $addItemToFirstEmptySlot(::ItemStack
const& item);
303 MCFOLD
void $setItemWithForceBalance(
int slot, ::ItemStack
const& item,
bool forceBalanced);
305 MCAPI
void $removeItem(
int slot,
int count);
307 MCAPI
void $removeAllItems();
309 MCAPI
void $removeAllItemsWithForceBalance();
311 MCAPI
void $containerRemoved();
313 MCAPI
void $dropSlotContent(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop,
int slot);
315 MCAPI
void $dropContents(::BlockSource& region, ::Vec3
const& pos,
bool randomizeDrop);
317 MCAPI
void $stopOpen(::Actor& actor);
319 MCAPI ::std::vector<::ItemStack> $getSlotCopies()
const;
321 MCAPI ::std::vector<::ItemStack const*>
const $getSlots()
const;
323 MCFOLD
int $getEmptySlotsCount()
const;
325 MCAPI
int $getItemCount(::ItemStack
const& compare)
const;
327 MCAPI
int $firstEmptySlot()
const;
329 MCAPI
int $firstItem()
const;
331 MCAPI
int $findFirstSlotForItem(::ItemStack
const& item)
const;
333 MCAPI
int $reverseFindFirstSlotForItem(::ItemStack
const& item)
const;
335 MCFOLD
bool $canPushInItem(
int slot,
int face, ::ItemStack
const& item)
const;
337 MCFOLD
bool $canPullOutItem(
int slot,
int face, ::ItemStack
const& item)
const;
339 MCAPI
void $setContainerChanged(
int slot);
341 MCAPI
void $setContainerMoved();
343 MCAPI
void $setCustomName(::Bedrock::Safety::RedactableString
const& name);
345 MCAPI
bool $hasCustomName()
const;
347 MCAPI
void $readAdditionalSaveData(::CompoundTag
const& tag);
349 MCAPI
void $addAdditionalSaveData(::CompoundTag& tag);
351 MCAPI
void $createTransactionContext(
352 ::std::function<
void(::Container&,
int, ::ItemStack
const&, ::ItemStack
const&)> callback,
353 ::std::function<
void()> execute
356 MCFOLD
void $initializeContainerContents(::BlockSource& region);
358 MCAPI
bool $isEmpty()
const;
360 MCFOLD
bool $isSlotDisabled(
int slot)
const;
368 MCAPI
static void** $vftable();