diff --git a/hippolyzer/lib/base/objects.py b/hippolyzer/lib/base/objects.py index 06213c0..93172b5 100644 --- a/hippolyzer/lib/base/objects.py +++ b/hippolyzer/lib/base/objects.py @@ -42,7 +42,7 @@ class Object(recordclass.RecordClass, use_weakref=True): # type: ignore CRC: Optional[int] = None PCode: Optional[tmpls.PCode] = None Material: Optional[tmpls.MCode] = None - ClickAction: Optional[int] = None + ClickAction: Optional[tmpls.ClickAction] = None Scale: Optional[Vector3] = None ParentID: Optional[int] = None # Actually contains a weakref proxy @@ -243,6 +243,7 @@ def normalize_object_update(block: Block, handle: int): "NameValue": block.deserialize_var("NameValue", make_copy=False), "TextureAnim": block.deserialize_var("TextureAnim", make_copy=False), "ExtraParams": block.deserialize_var("ExtraParams", make_copy=False) or {}, + "ClickAction": block.deserialize_var("ClickAction", make_copy=False), "PSBlock": block.deserialize_var("PSBlock", make_copy=False).value, "UpdateFlags": block.deserialize_var("UpdateFlags", make_copy=False), "State": block.deserialize_var("State", make_copy=False), @@ -435,8 +436,8 @@ class FastObjectUpdateCompressedDataDeserializer: "PCode": pcode, "State": state, "CRC": crc, - "Material": material, - "ClickAction": click_action, + "Material": tmpls.MCode(material), + "ClickAction": tmpls.ClickAction(click_action), "Scale": scale, "Position": pos, "Rotation": rot, diff --git a/hippolyzer/lib/base/templates.py b/hippolyzer/lib/base/templates.py index 1b55552..adc04ef 100644 --- a/hippolyzer/lib/base/templates.py +++ b/hippolyzer/lib/base/templates.py @@ -980,6 +980,7 @@ class MCode(IntEnum): # What's in the high nybble, anything? STONE = 0 METAL = 1 + GLASS = 2 WOOD = 3 FLESH = 4 PLASTIC = 5 @@ -1688,6 +1689,24 @@ class SoundFlags(IntFlag): STOP = 1 << 5 +@se.enum_field_serializer("ObjectClickAction", "ObjectData", "ClickAction") +@se.enum_field_serializer("ObjectUpdate", "ObjectData", "ClickAction") +class ClickAction(IntEnum): + # "NONE" is also used as an alias for "TOUCH" + TOUCH = 0 + SIT = 1 + BUY = 2 + PAY = 3 + OPEN = 4 + PLAY = 5 + OPEN_MEDIA = 6 + ZOOM = 7 + DISABLED = 8 + IGNORE = 9 + # I've seen this in practice, not clear what it is. + UNKNOWN = 255 + + class CompressedFlags(IntFlag): SCRATCHPAD = 1 TREE = 1 << 1 @@ -1722,7 +1741,7 @@ class ObjectUpdateCompressedDataSerializer(se.SimpleSubfieldSerializer): "State": ObjectStateAdapter(se.U8), "CRC": se.U32, "Material": se.IntEnum(MCode, se.U8), - "ClickAction": se.U8, + "ClickAction": se.IntEnum(ClickAction, se.U8), "Scale": se.Vector3, "Position": se.Vector3, "Rotation": se.PackedQuat(se.Vector3),