"""Minimal 26.3 inventory synchronization for legacy read-only commands.""" from mosfet.protocol.types import Slot from minecraft.networking.modern import ( ContainerSetContentPacket, ContainerSetSlotPacket, SetCursorItemPacket, ) class ModernInventoryManager: def __init__(self, global_state): self.g = global_state self.g.inv = self.g.get('inv') or {} self.g.inventory_state_ids = self.g.get('inventory_state_ids') or {} self.g.inventory_partial = False self.g.cursor = Slot(present=False) register = self.g.connection.register_packet_listener register(self.handle_content, ContainerSetContentPacket) register(self.handle_slot, ContainerSetSlotPacket) register(self.handle_cursor, SetCursorItemPacket) @staticmethod def to_slot(item): return Slot(item.present, item.item_id, item.item_count, components=item.components, component_ids=item.component_ids, removed_components=item.removed_components, components_unknown=item.components_unknown) def handle_content(self, packet): slots = {index: self.to_slot(item) for index, item in enumerate(packet.items)} self.g.inventory_state_ids[packet.container_id] = packet.state_id if packet.container_id == 0: self.g.inv = slots self.g.inventory_partial = packet.partial self.g.cursor = self.to_slot(packet.carried_item) elif self.g.get('window'): self.g.window.contents = slots self.g.cursor = self.to_slot(packet.carried_item) def handle_slot(self, packet): self.g.inventory_state_ids[packet.container_id] = packet.state_id item = self.to_slot(packet.item) if packet.item.components_unknown: self.g.inventory_partial = True if packet.container_id == 0: self.g.inv[packet.slot] = item elif packet.container_id == -1 and packet.slot == -1: self.g.cursor = item elif self.g.get('window'): self.g.window.contents[packet.slot] = item def handle_cursor(self, packet): if packet.item.components_unknown: self.g.inventory_partial = True self.g.cursor = self.to_slot(packet.item)