mirror of
https://github.com/Steffo99/lihzahrd.git
synced 2024-11-25 01:24:21 +00:00
Parse Tile Entities and Weighed Pressure Plate data
This commit is contained in:
parent
7fac0d3be5
commit
49382e811c
13 changed files with 162 additions and 15 deletions
|
@ -1,5 +1,5 @@
|
||||||
from .npc import NPC
|
from .npc import NPC
|
||||||
from .mob import Mob
|
from .mob import Mob
|
||||||
from .entitytype import EntityType
|
from .npctype import EntityType
|
||||||
|
|
||||||
__all__ = ["NPC", "Mob", "EntityType"]
|
__all__ = ["NPC", "Mob", "EntityType"]
|
|
@ -1,10 +1,13 @@
|
||||||
import typing
|
import typing
|
||||||
from .entitytype import EntityType
|
from .npctype import EntityType
|
||||||
from ..fileutils import Coordinates
|
from ..fileutils import Coordinates
|
||||||
|
|
||||||
|
|
||||||
class Mob:
|
class Mob:
|
||||||
"""A Mob somewhere in the world."""
|
"""A Mob somewhere in the world."""
|
||||||
|
|
||||||
|
__slots__ = "type", "position"
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
type_: int,
|
type_: int,
|
||||||
position: Coordinates, ):
|
position: Coordinates, ):
|
|
@ -1,10 +1,13 @@
|
||||||
import typing
|
import typing
|
||||||
from .entitytype import EntityType
|
from .npctype import EntityType
|
||||||
from ..fileutils import Coordinates
|
from ..fileutils import Coordinates
|
||||||
|
|
||||||
|
|
||||||
class NPC:
|
class NPC:
|
||||||
"""A NPC somewhere in the world."""
|
"""A NPC somewhere in the world."""
|
||||||
|
|
||||||
|
__slots__ = "type", "name", "position", "home"
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
type_: EntityType,
|
type_: EntityType,
|
||||||
name: str,
|
name: str,
|
3
lihzahrd/pressureplates/__init__.py
Normal file
3
lihzahrd/pressureplates/__init__.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from .weighedpressureplate import WeighedPressurePlate
|
||||||
|
|
||||||
|
__all__ = ["WeighedPressurePlate"]
|
13
lihzahrd/pressureplates/weighedpressureplate.py
Normal file
13
lihzahrd/pressureplates/weighedpressureplate.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from ..fileutils import Coordinates
|
||||||
|
|
||||||
|
|
||||||
|
class WeighedPressurePlate:
|
||||||
|
"""A single pressure plate placed in the world."""
|
||||||
|
|
||||||
|
__slots__ = "position"
|
||||||
|
|
||||||
|
def __init__(self, position: Coordinates):
|
||||||
|
self.position: Coordinates = position
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"PressurePlate(position={self.position})"
|
|
@ -3,6 +3,9 @@ from ..fileutils import Coordinates
|
||||||
|
|
||||||
class Sign:
|
class Sign:
|
||||||
"""A sign with something written on it."""
|
"""A sign with something written on it."""
|
||||||
|
|
||||||
|
__slots__ = "position", "text"
|
||||||
|
|
||||||
def __init__(self, position: Coordinates, text: str = ""):
|
def __init__(self, position: Coordinates, text: str = ""):
|
||||||
self.position: Coordinates = position
|
self.position: Coordinates = position
|
||||||
self.text: str = text
|
self.text: str = text
|
||||||
|
|
6
lihzahrd/tileentities/__init__.py
Normal file
6
lihzahrd/tileentities/__init__.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from .tileentity import TileEntity
|
||||||
|
from .itemframe import ItemFrame
|
||||||
|
from .logicsensor import LogicSensor
|
||||||
|
from .targetdummy import TargetDummy
|
||||||
|
|
||||||
|
__all__ = ["TileEntity", "ItemFrame", "LogicSensor", "TargetDummy"]
|
11
lihzahrd/tileentities/itemframe.py
Normal file
11
lihzahrd/tileentities/itemframe.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from ..chests import ItemStack
|
||||||
|
|
||||||
|
|
||||||
|
class ItemFrame:
|
||||||
|
__slots__ = "item"
|
||||||
|
|
||||||
|
def __init__(self, item: ItemStack):
|
||||||
|
self.item: ItemStack = item
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<ItemFrame with {repr(self.item)} inside>"
|
11
lihzahrd/tileentities/logicsensor.py
Normal file
11
lihzahrd/tileentities/logicsensor.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
class LogicSensor:
|
||||||
|
"""Data pertaining to a Logic Sensor (https://terraria.gamepedia.com/Sensors)."""
|
||||||
|
|
||||||
|
__slots__ = "logic_check", "enabled"
|
||||||
|
|
||||||
|
def __init__(self, logic_check: int, enabled: bool):
|
||||||
|
self.logic_check: int = logic_check
|
||||||
|
self.enabled: bool = enabled
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"LogicSensor(logic_check={self.logic_check}, enabled={self.enabled})"
|
8
lihzahrd/tileentities/targetdummy.py
Normal file
8
lihzahrd/tileentities/targetdummy.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
class TargetDummy:
|
||||||
|
"""Data pertaining to a Target Dummy (https://terraria.gamepedia.com/Target_Dummy)"""
|
||||||
|
|
||||||
|
def __init__(self, npc: int):
|
||||||
|
self.npc: int = npc
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"{self.__class__.__name__}(npc={self.npc})"
|
22
lihzahrd/tileentities/tileentity.py
Normal file
22
lihzahrd/tileentities/tileentity.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import typing
|
||||||
|
from ..fileutils import Coordinates
|
||||||
|
from .targetdummy import TargetDummy
|
||||||
|
from .itemframe import ItemFrame
|
||||||
|
from .logicsensor import LogicSensor
|
||||||
|
|
||||||
|
|
||||||
|
class TileEntity:
|
||||||
|
"""A TileEntity, such as a Training Dummy, an Item Frame or a Logic Sensor."""
|
||||||
|
|
||||||
|
__slots__ = "id", "position", "data"
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
id_: int,
|
||||||
|
position: Coordinates,
|
||||||
|
extra: typing.Union[TargetDummy, ItemFrame, LogicSensor]):
|
||||||
|
self.id: int = id_
|
||||||
|
self.position: Coordinates = position
|
||||||
|
self.data: typing.Union[TargetDummy, ItemFrame, LogicSensor] = extra
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<TileEntity {self.id} at {self.position} ({repr(self.data)})>"
|
|
@ -6,7 +6,9 @@ from .header import *
|
||||||
from .tiles import *
|
from .tiles import *
|
||||||
from .chests import *
|
from .chests import *
|
||||||
from .signs import *
|
from .signs import *
|
||||||
from .entities import *
|
from .npcs import *
|
||||||
|
from .tileentities import *
|
||||||
|
from .pressureplates import *
|
||||||
from .timer import Timer
|
from .timer import Timer
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,10 +50,18 @@ class World:
|
||||||
signs: typing.List[Sign],
|
signs: typing.List[Sign],
|
||||||
npcs: typing.List[NPC],
|
npcs: typing.List[NPC],
|
||||||
mobs: typing.List[Mob],
|
mobs: typing.List[Mob],
|
||||||
unknown_file_format_data: bytearray,
|
tile_entities: typing.List[TileEntity],
|
||||||
unknown_world_header_data: bytearray,
|
weighed_pressure_plates: typing.List[WeighedPressurePlate],
|
||||||
unknown_world_tiles_data: bytearray,
|
unknown_file_format_data: bytes = b"",
|
||||||
unknown_chests_data: bytearray):
|
unknown_world_header_data: bytes = b"",
|
||||||
|
unknown_world_tiles_data: bytes = b"",
|
||||||
|
unknown_chests_data: bytes = b"",
|
||||||
|
unknown_signs_data: bytes = b"",
|
||||||
|
unknown_npcs_data: bytes = b"",
|
||||||
|
unknown_tile_entities_data: bytes = b"",
|
||||||
|
unknown_pressure_plates_data: bytes = b"",
|
||||||
|
unknown_town_manager_data: bytes = b"",
|
||||||
|
unknown_footer_data: bytes = b""):
|
||||||
|
|
||||||
self.version: Version = version
|
self.version: Version = version
|
||||||
"""The game version when this savefile was last saved."""
|
"""The game version when this savefile was last saved."""
|
||||||
|
@ -147,13 +157,26 @@ class World:
|
||||||
"""A list of all the NPCs currently living in the world, including the Old Man."""
|
"""A list of all the NPCs currently living in the world, including the Old Man."""
|
||||||
|
|
||||||
self.mobs: typing.List[Mob] = mobs
|
self.mobs: typing.List[Mob] = mobs
|
||||||
|
"""A list of mobs in the world...?"""
|
||||||
|
|
||||||
|
self.tile_entities: typing.List[TileEntity] = tile_entities
|
||||||
|
"""A list of tile entities in the world, such as Training Dummies, Item Frames and Logic Sensors."""
|
||||||
|
|
||||||
|
self.weighed_pressure_plates: typing.List[WeighedPressurePlate] = weighed_pressure_plates
|
||||||
|
"""A list of all Weighed Pressure Plates in the world."""
|
||||||
|
|
||||||
self.clouds: Clouds = clouds
|
self.clouds: Clouds = clouds
|
||||||
self.cultist_delay: int = cultist_delay
|
self.cultist_delay: int = cultist_delay
|
||||||
self.unknown_file_format_data: bytearray = unknown_file_format_data
|
self.unknown_file_format_data: bytes = unknown_file_format_data
|
||||||
self.unknown_world_header_data: bytearray = unknown_world_header_data
|
self.unknown_world_header_data: bytes = unknown_world_header_data
|
||||||
self.unknown_world_tiles_data: bytearray = unknown_world_tiles_data
|
self.unknown_world_tiles_data: bytes = unknown_world_tiles_data
|
||||||
self.unknown_chests_data: bytearray = unknown_chests_data
|
self.unknown_chests_data: bytes = unknown_chests_data
|
||||||
|
self.unknown_signs_data: bytes = unknown_signs_data
|
||||||
|
self.unknown_npcs_data: bytes = unknown_npcs_data
|
||||||
|
self.unknown_tile_entities_data: bytes = unknown_tile_entities_data
|
||||||
|
self.unknown_pressure_plates_data: bytes = unknown_pressure_plates_data
|
||||||
|
self.unknown_town_manager_data: bytes = unknown_town_manager_data
|
||||||
|
self.unknown_footer_data: bytes = unknown_footer_data
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'<World "{self.name}">'
|
return f'<World "{self.name}">'
|
||||||
|
@ -568,7 +591,41 @@ class World:
|
||||||
position=npc_position)
|
position=npc_position)
|
||||||
mobs.append(mob)
|
mobs.append(mob)
|
||||||
|
|
||||||
unknown_npcs_data = f.read_until(pointers)
|
unknown_npcs_data = f.read_until(pointers.tile_entities)
|
||||||
|
|
||||||
|
with Timer("Tile Entities", display=True):
|
||||||
|
tile_entities_count = f.int4()
|
||||||
|
tile_entities = []
|
||||||
|
|
||||||
|
for _ in range(tile_entities_count):
|
||||||
|
te_type = f.uint1()
|
||||||
|
te_id = f.int4()
|
||||||
|
te_position = Coordinates(f.int2(), f.int2())
|
||||||
|
if te_type == 0:
|
||||||
|
te_extra = TargetDummy(npc=f.int2())
|
||||||
|
elif te_type == 1:
|
||||||
|
te_extra = ItemFrame(item=ItemStack(type_=ItemType(f.int2()),
|
||||||
|
modifier=f.uint1(),
|
||||||
|
quantity=f.int2()))
|
||||||
|
elif te_type == 2:
|
||||||
|
te_extra = LogicSensor(logic_check=f.uint1(), enabled=f.bool())
|
||||||
|
tile_entity = TileEntity(id_=te_id, position=te_position, extra=te_extra)
|
||||||
|
tile_entities.append(tile_entity)
|
||||||
|
|
||||||
|
unknown_tile_entities_data = f.read_until(pointers.pressure_plates)
|
||||||
|
|
||||||
|
with Timer("Weighed Pressure Plates", display=True):
|
||||||
|
weighed_pressure_plates_count = f.int4()
|
||||||
|
weighed_pressure_plates = []
|
||||||
|
|
||||||
|
for _ in range(weighed_pressure_plates_count):
|
||||||
|
wpp = WeighedPressurePlate(position=Coordinates(f.int4(), f.int4()))
|
||||||
|
weighed_pressure_plates.append(wpp)
|
||||||
|
|
||||||
|
unknown_pressure_plates_data = f.read_until(pointers.town_manager)
|
||||||
|
|
||||||
|
# with Timer("Town Manager", display=True):
|
||||||
|
|
||||||
|
|
||||||
world = World(version=version, savefile_type=savefile_type, revision=revision, is_favorite=is_favorite,
|
world = World(version=version, savefile_type=savefile_type, revision=revision, is_favorite=is_favorite,
|
||||||
name=name, generator=generator, uuid_=uuid_, id_=id_, bounds=bounds, size=world_size,
|
name=name, generator=generator, uuid_=uuid_, id_=id_, bounds=bounds, size=world_size,
|
||||||
|
@ -577,9 +634,16 @@ class World:
|
||||||
time=time, events=events, dungeon_point=dungeon_point, world_evil=world_evil,
|
time=time, events=events, dungeon_point=dungeon_point, world_evil=world_evil,
|
||||||
saved_npcs=saved_npcs, altars_smashed=altars_smashed, is_hardmode=is_hardmode,
|
saved_npcs=saved_npcs, altars_smashed=altars_smashed, is_hardmode=is_hardmode,
|
||||||
shadow_orbs=shadow_orbs, bosses_defeated=bosses_defeated, anglers_quest=anglers_quest,
|
shadow_orbs=shadow_orbs, bosses_defeated=bosses_defeated, anglers_quest=anglers_quest,
|
||||||
clouds=clouds, cultist_delay=cultist_delay, tiles=tiles, chests=chests,
|
clouds=clouds, cultist_delay=cultist_delay, tiles=tiles, chests=chests, npcs=npcs, mobs=mobs,
|
||||||
|
tile_entities=tile_entities, weighed_pressure_plates=weighed_pressure_plates,
|
||||||
unknown_file_format_data=unknown_file_format_data,
|
unknown_file_format_data=unknown_file_format_data,
|
||||||
unknown_world_header_data=unknown_world_header_data,
|
unknown_world_header_data=unknown_world_header_data,
|
||||||
unknown_world_tiles_data=unknown_world_tiles_data,
|
unknown_world_tiles_data=unknown_world_tiles_data,
|
||||||
unknown_chests_data=unknown_chests_data)
|
unknown_chests_data=unknown_chests_data,
|
||||||
|
unknown_signs_data=unknown_signs_data,
|
||||||
|
unknown_npcs_data=unknown_npcs_data,
|
||||||
|
unknown_tile_entities_data=unknown_tile_entities_data,
|
||||||
|
unknown_pressure_plates_data=unknown_pressure_plates_data,
|
||||||
|
unknown_town_manager_data=unknown_town_manager_data,
|
||||||
|
unknown_footer_data=unknown_footer_data)
|
||||||
return world
|
return world
|
||||||
|
|
Loading…
Reference in a new issue