56 lines
2.3 KiB
Python
56 lines
2.3 KiB
Python
"""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)
|