From 8ae4389a2a6131ad579f2558c6c9842b39647786 Mon Sep 17 00:00:00 2001 From: Nattsu39 Date: Thu, 14 Nov 2024 15:04:05 +0800 Subject: [PATCH 1/5] fix tools.extractor type hints --- UnityPy/tools/extractor.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/UnityPy/tools/extractor.py b/UnityPy/tools/extractor.py index cbe729a7..16a13f6c 100644 --- a/UnityPy/tools/extractor.py +++ b/UnityPy/tools/extractor.py @@ -2,7 +2,7 @@ import os from io import BytesIO from pathlib import Path -from typing import Callable, Dict, List, Union +from typing import Callable, Dict, List, Optional, Tuple, Union import UnityPy from UnityPy.classes import ( @@ -19,6 +19,7 @@ Texture2D, ) from UnityPy.enums.ClassIDType import ClassIDType +from UnityPy.files import SerializedFile def export_obj( @@ -27,8 +28,8 @@ def export_obj( append_name: bool = False, append_path_id: bool = False, export_unknown_as_typetree: bool = False, - asset_filter: Callable[[Object], bool] = None, -) -> List[int]: + asset_filter: Optional[Callable[[Object], bool]] = None, +) -> List[Tuple[SerializedFile, int]]: """Exports the given object to the given filepath. Args: @@ -76,8 +77,8 @@ def extract_assets( ignore_first_container_dirs: int = 0, append_path_id: bool = False, export_unknown_as_typetree: bool = False, - asset_filter: Callable[[Object], bool] = None, -) -> List[int]: + asset_filter: Optional[Callable[[Object], bool]] = None, +) -> List[Tuple[SerializedFile, int]]: """Extracts some or all assets from the given source. Args: @@ -90,7 +91,7 @@ def extract_assets( asset_filter (func(object)->bool, optional): Determines whether to export an object. Defaults to all objects. Returns: - List[int]: [description] + List[Tuple[SerializedFile, int]]: [description] """ # load source env = UnityPy.load(src) @@ -153,7 +154,7 @@ def defaulted_export_index(type: ClassIDType): ############################################################################### -def exportTextAsset(obj: TextAsset, fp: str, extension: str = ".txt") -> List[int]: +def exportTextAsset(obj: TextAsset, fp: str, extension: str = ".txt") -> List[Tuple[SerializedFile, int]]: if not extension: extension = ".txt" with open(f"{fp}{extension}", "wb") as f: @@ -161,7 +162,7 @@ def exportTextAsset(obj: TextAsset, fp: str, extension: str = ".txt") -> List[in return [(obj.assets_file, obj.object_reader.path_id)] -def exportFont(obj: Font, fp: str, extension: str = "") -> List[int]: +def exportFont(obj: Font, fp: str, extension: str = "") -> List[Tuple[SerializedFile, int]]: # TODO - export glyphs if obj.m_FontData: extension = ".ttf" @@ -172,7 +173,7 @@ def exportFont(obj: Font, fp: str, extension: str = "") -> List[int]: return [(obj.assets_file, obj.object_reader.path_id)] -def exportMesh(obj: Mesh, fp: str, extension=".obj") -> List[int]: +def exportMesh(obj: Mesh, fp: str, extension=".obj") -> List[Tuple[SerializedFile, int]]: if not extension: extension = ".obj" with open(f"{fp}{extension}", "wt", encoding="utf8", newline="") as f: @@ -180,7 +181,7 @@ def exportMesh(obj: Mesh, fp: str, extension=".obj") -> List[int]: return [(obj.assets_file, obj.object_reader.path_id)] -def exportShader(obj: Shader, fp: str, extension=".txt") -> List[int]: +def exportShader(obj: Shader, fp: str, extension=".txt") -> List[Tuple[SerializedFile, int]]: if not extension: extension = ".txt" with open(f"{fp}{extension}", "wt", encoding="utf8", newline="") as f: @@ -190,7 +191,7 @@ def exportShader(obj: Shader, fp: str, extension=".txt") -> List[int]: def exportMonoBehaviour( obj: Union[MonoBehaviour, Object], fp: str, extension: str = "" -) -> List[int]: +) -> List[Tuple[SerializedFile, int]]: export = None if obj.object_reader.serialized_type.node: @@ -224,7 +225,7 @@ def exportMonoBehaviour( return [(obj.assets_file, obj.object_reader.path_id)] -def exportAudioClip(obj: AudioClip, fp: str, extension: str = "") -> List[int]: +def exportAudioClip(obj: AudioClip, fp: str, extension: str = "") -> List[Tuple[SerializedFile, int]]: samples = obj.samples if len(samples) == 0: pass @@ -239,7 +240,7 @@ def exportAudioClip(obj: AudioClip, fp: str, extension: str = "") -> List[int]: return [(obj.assets_file, obj.object_reader.path_id)] -def exportSprite(obj: Sprite, fp: str, extension: str = ".png") -> List[int]: +def exportSprite(obj: Sprite, fp: str, extension: str = ".png") -> List[Tuple[SerializedFile, int]]: if not extension: extension = ".png" obj.image.save(f"{fp}{extension}") @@ -254,7 +255,7 @@ def exportSprite(obj: Sprite, fp: str, extension: str = ".png") -> List[int]: return exported -def exportTexture2D(obj: Texture2D, fp: str, extension: str = ".png") -> List[int]: +def exportTexture2D(obj: Texture2D, fp: str, extension: str = ".png") -> List[Tuple[SerializedFile, int]]: if not extension: extension = ".png" if obj.m_Width: @@ -262,8 +263,7 @@ def exportTexture2D(obj: Texture2D, fp: str, extension: str = ".png") -> List[in obj.image.save(f"{fp}{extension}") return [(obj.assets_file, obj.path_id)] - -def exportGameObject(obj: GameObject, fp: str, extension: str = "") -> List[int]: +def exportGameObject(obj: GameObject, fp: str, extension: str = "") -> List[Tuple[SerializedFile, int]]: exported = [(obj.assets_file, obj.path_id)] refs = crawl_obj(obj) if refs: @@ -299,7 +299,7 @@ def exportGameObject(obj: GameObject, fp: str, extension: str = "") -> List[int] MONOBEHAVIOUR_TYPETREES: Dict["Assembly-Name.dll", Dict["Class-Name", List[Dict]]] = {} -def crawl_obj(obj: Object, ret: dict = None) -> Dict[int, Union[Object, PPtr]]: +def crawl_obj(obj: Object, ret: Optional[dict] = None) -> Dict[int, Union[Object, PPtr]]: """Crawls through the data struture of the object and returns a list of all the components.""" if not ret: ret = {} From aaa564533c5157bde5e25336bc2c05e0cf377de3 Mon Sep 17 00:00:00 2001 From: Nattsu39 Date: Thu, 14 Nov 2024 21:16:58 +0800 Subject: [PATCH 2/5] classes.generated - add legacy patch type hints --- UnityPy/classes/generated.py | 61 +++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/UnityPy/classes/generated.py b/UnityPy/classes/generated.py index 5a8d209b..2d75d4fa 100644 --- a/UnityPy/classes/generated.py +++ b/UnityPy/classes/generated.py @@ -2,7 +2,7 @@ from __future__ import annotations from abc import ABC -from typing import List, Optional, Tuple, TypeVar, Union +from typing import List, Optional, Tuple, TypeVar, Union, TYPE_CHECKING from attrs import define as attrs_define @@ -2041,6 +2041,10 @@ class Pipeline(Component): class Renderer(Component): m_GameObject: PPtr[GameObject] + if TYPE_CHECKING: + from .legacy_patch.Renderer import export as _export + export = _export + @unitypy_define class BillboardRenderer(Renderer): @@ -2744,6 +2748,32 @@ class GameObject(EditorExtension): m_Name: str m_Tag: int + if TYPE_CHECKING: + from .legacy_patch.GameObject import ( + _GameObject_Components, _GameObject_GetComponent + ) + from ..enums import ClassIDType + + m_Components = property(_GameObject_Components) + m_Animator = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Animator) + ) + m_Animation = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Animation) + ) + m_Transform = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Transform) + ) + m_MeshRenderer = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.MeshRenderer) + ) + m_SkinnedMeshRenderer = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.SkinnedMeshRenderer) + ) + m_MeshFilter = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.MeshFilter) + ) + @unitypy_define class NamedObject(EditorExtension, ABC): @@ -4054,6 +4084,11 @@ class AudioClip(SampleClip): m_Type: Optional[int] = None m_UseHardware: Optional[bool] = None + if TYPE_CHECKING: + from .legacy_patch.AudioClip import _AudioClip_extension, _AudioClip_samples + extension = property(_AudioClip_extension) + samples = property(_AudioClip_samples) + @unitypy_define class Avatar(NamedObject): @@ -4451,6 +4486,10 @@ class Mesh(NamedObject): m_VertexData: Optional[VertexData] = None m_Vertices: Optional[List[Vector3f]] = None + if TYPE_CHECKING: + from .legacy_patch.Mesh import _Mesh_export + export = _Mesh_export + @unitypy_define class Motion(NamedObject, ABC): @@ -4657,6 +4696,10 @@ class Shader(NamedObject): platforms: Optional[List[int]] = None stageCounts: Optional[List[int]] = None + if TYPE_CHECKING: + from .legacy_patch.Shader import _Shader_export + export = _Shader_export + @unitypy_define class ShaderVariantCollection(NamedObject): @@ -4691,6 +4734,10 @@ class Sprite(NamedObject): m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None + if TYPE_CHECKING: + from .legacy_patch.Sprite import _Sprite_image + image = property(_Sprite_image) + @unitypy_define class SpriteAtlas(NamedObject): @@ -4988,6 +5035,14 @@ class Texture2D(Texture): m_StreamingMipmaps: Optional[bool] = None m_StreamingMipmapsPriority: Optional[int] = None + if TYPE_CHECKING: + from .legacy_patch.Texture2D import ( + _Texture2d_get_image, _Texture2D_get_image_data, _Texture2d_set_image + ) + image = property(_Texture2d_get_image, _Texture2d_set_image) + set_image = _Texture2d_set_image + get_image_data = _Texture2D_get_image_data + @unitypy_define class Cubemap(Texture2D): @@ -5043,6 +5098,10 @@ class Texture2DArray(Texture): m_StreamData: Optional[StreamingInfo] = None m_UsageMode: Optional[int] = None + if TYPE_CHECKING: + from legacy_patch.Texture2DArray import _Texture2DArray_get_images + images = property(_Texture2DArray_get_images) + @unitypy_define class Texture3D(Texture): From 0bfedf0e030c07bcc30594315521adddbd9fa86a Mon Sep 17 00:00:00 2001 From: Nattsu39 Date: Sat, 16 Nov 2024 16:46:31 +0800 Subject: [PATCH 3/5] Creating type stubs for legacy patches This is better than putting all patched classes into __init__.pyi, and may be worth it given the backwards-compatible immutability of the legacy patch. --- UnityPy/classes/generated.py | 61 +------------------ UnityPy/classes/legacy_patch/AudioClip.pyi | 31 ++++++++++ UnityPy/classes/legacy_patch/GameObject.pyi | 35 +++++++++++ UnityPy/classes/legacy_patch/Mesh.pyi | 52 ++++++++++++++++ UnityPy/classes/legacy_patch/Renderer.pyi | 13 ++++ UnityPy/classes/legacy_patch/Shader.pyi | 28 +++++++++ UnityPy/classes/legacy_patch/Sprite.pyi | 30 +++++++++ UnityPy/classes/legacy_patch/Texture2D.pyi | 47 ++++++++++++++ .../classes/legacy_patch/Texture2DArray.pyi | 30 +++++++++ 9 files changed, 267 insertions(+), 60 deletions(-) create mode 100644 UnityPy/classes/legacy_patch/AudioClip.pyi create mode 100644 UnityPy/classes/legacy_patch/GameObject.pyi create mode 100644 UnityPy/classes/legacy_patch/Mesh.pyi create mode 100644 UnityPy/classes/legacy_patch/Renderer.pyi create mode 100644 UnityPy/classes/legacy_patch/Shader.pyi create mode 100644 UnityPy/classes/legacy_patch/Sprite.pyi create mode 100644 UnityPy/classes/legacy_patch/Texture2D.pyi create mode 100644 UnityPy/classes/legacy_patch/Texture2DArray.pyi diff --git a/UnityPy/classes/generated.py b/UnityPy/classes/generated.py index 2d75d4fa..5a8d209b 100644 --- a/UnityPy/classes/generated.py +++ b/UnityPy/classes/generated.py @@ -2,7 +2,7 @@ from __future__ import annotations from abc import ABC -from typing import List, Optional, Tuple, TypeVar, Union, TYPE_CHECKING +from typing import List, Optional, Tuple, TypeVar, Union from attrs import define as attrs_define @@ -2041,10 +2041,6 @@ class Pipeline(Component): class Renderer(Component): m_GameObject: PPtr[GameObject] - if TYPE_CHECKING: - from .legacy_patch.Renderer import export as _export - export = _export - @unitypy_define class BillboardRenderer(Renderer): @@ -2748,32 +2744,6 @@ class GameObject(EditorExtension): m_Name: str m_Tag: int - if TYPE_CHECKING: - from .legacy_patch.GameObject import ( - _GameObject_Components, _GameObject_GetComponent - ) - from ..enums import ClassIDType - - m_Components = property(_GameObject_Components) - m_Animator = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Animator) - ) - m_Animation = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Animation) - ) - m_Transform = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Transform) - ) - m_MeshRenderer = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.MeshRenderer) - ) - m_SkinnedMeshRenderer = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.SkinnedMeshRenderer) - ) - m_MeshFilter = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.MeshFilter) - ) - @unitypy_define class NamedObject(EditorExtension, ABC): @@ -4084,11 +4054,6 @@ class AudioClip(SampleClip): m_Type: Optional[int] = None m_UseHardware: Optional[bool] = None - if TYPE_CHECKING: - from .legacy_patch.AudioClip import _AudioClip_extension, _AudioClip_samples - extension = property(_AudioClip_extension) - samples = property(_AudioClip_samples) - @unitypy_define class Avatar(NamedObject): @@ -4486,10 +4451,6 @@ class Mesh(NamedObject): m_VertexData: Optional[VertexData] = None m_Vertices: Optional[List[Vector3f]] = None - if TYPE_CHECKING: - from .legacy_patch.Mesh import _Mesh_export - export = _Mesh_export - @unitypy_define class Motion(NamedObject, ABC): @@ -4696,10 +4657,6 @@ class Shader(NamedObject): platforms: Optional[List[int]] = None stageCounts: Optional[List[int]] = None - if TYPE_CHECKING: - from .legacy_patch.Shader import _Shader_export - export = _Shader_export - @unitypy_define class ShaderVariantCollection(NamedObject): @@ -4734,10 +4691,6 @@ class Sprite(NamedObject): m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None - if TYPE_CHECKING: - from .legacy_patch.Sprite import _Sprite_image - image = property(_Sprite_image) - @unitypy_define class SpriteAtlas(NamedObject): @@ -5035,14 +4988,6 @@ class Texture2D(Texture): m_StreamingMipmaps: Optional[bool] = None m_StreamingMipmapsPriority: Optional[int] = None - if TYPE_CHECKING: - from .legacy_patch.Texture2D import ( - _Texture2d_get_image, _Texture2D_get_image_data, _Texture2d_set_image - ) - image = property(_Texture2d_get_image, _Texture2d_set_image) - set_image = _Texture2d_set_image - get_image_data = _Texture2D_get_image_data - @unitypy_define class Cubemap(Texture2D): @@ -5098,10 +5043,6 @@ class Texture2DArray(Texture): m_StreamData: Optional[StreamingInfo] = None m_UsageMode: Optional[int] = None - if TYPE_CHECKING: - from legacy_patch.Texture2DArray import _Texture2DArray_get_images - images = property(_Texture2DArray_get_images) - @unitypy_define class Texture3D(Texture): diff --git a/UnityPy/classes/legacy_patch/AudioClip.pyi b/UnityPy/classes/legacy_patch/AudioClip.pyi new file mode 100644 index 00000000..6ea924fd --- /dev/null +++ b/UnityPy/classes/legacy_patch/AudioClip.pyi @@ -0,0 +1,31 @@ +from typing import List, Optional + +from UnityPy.classes.generated import SampleClip, StreamedResource + +def _AudioClip_extension(self: AudioClip) -> str: ... +def _AudioClip_samples(self: AudioClip) -> dict: ... + +class AudioClip(SampleClip): + m_Name: str + m_3D: Optional[bool] = None + m_Ambisonic: Optional[bool] = None + m_AudioData: Optional[List[int]] = None + m_BitsPerSample: Optional[int] = None + m_Channels: Optional[int] = None + m_CompressionFormat: Optional[int] = None + m_Format: Optional[int] = None + m_Frequency: Optional[int] = None + m_IsTrackerFormat: Optional[bool] = None + m_Legacy3D: Optional[bool] = None + m_Length: Optional[float] = None + m_LoadInBackground: Optional[bool] = None + m_LoadType: Optional[int] = None + m_PreloadAudioData: Optional[bool] = None + m_Resource: Optional[StreamedResource] = None + m_Stream: Optional[int] = None + m_SubsoundIndex: Optional[int] = None + m_Type: Optional[int] = None + m_UseHardware: Optional[bool] = None + extension = property(_AudioClip_extension) + samples = property(_AudioClip_samples) + ... diff --git a/UnityPy/classes/legacy_patch/GameObject.pyi b/UnityPy/classes/legacy_patch/GameObject.pyi new file mode 100644 index 00000000..daed126e --- /dev/null +++ b/UnityPy/classes/legacy_patch/GameObject.pyi @@ -0,0 +1,35 @@ +from typing import List, Tuple, Union + +from UnityPy.classes import Component, PPtr +from UnityPy.classes.generated import ComponentPair, EditorExtension +from UnityPy.enums import ClassIDType + +def _GameObject_Components(self) -> List[PPtr[Component]]: ... +def _GameObject_GetComponent(self, type: ClassIDType) -> Union[PPtr[Component], None]: ... + +class GameObject(EditorExtension): + m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] + m_IsActive: Union[bool, int] + m_Layer: int + m_Name: str + m_Tag: int + m_Components = property(_GameObject_Components) + m_Animator = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Animator) + ) + m_Animation = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Animation) + ) + m_Transform = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Transform) + ) + m_MeshRenderer = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.MeshRenderer) + ) + m_SkinnedMeshRenderer = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.SkinnedMeshRenderer) + ) + m_MeshFilter = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.MeshFilter) + ) + ... diff --git a/UnityPy/classes/legacy_patch/Mesh.pyi b/UnityPy/classes/legacy_patch/Mesh.pyi new file mode 100644 index 00000000..e7233052 --- /dev/null +++ b/UnityPy/classes/legacy_patch/Mesh.pyi @@ -0,0 +1,52 @@ +from typing import List, Optional, Union + +from UnityPy.classes.generated import (AABB, BlendShapeData, BoneInfluence, + BoneWeights4, CompressedMesh, + MeshBlendShape, MeshBlendShapeVertex, + MinMaxAABB, NamedObject, StreamingInfo, + SubMesh, VariableBoneCountWeights, + VertexData) +from UnityPy.classes.math import (ColorRGBA, Matrix4x4f, Vector2f, Vector3f, + Vector4f) + +def _Mesh_export(self: Mesh, format: str = "obj") -> str: ... + +class Mesh(NamedObject): + m_BindPose: List[Matrix4x4f] + m_CompressedMesh: CompressedMesh + m_IndexBuffer: List[int] + m_LocalAABB: AABB + m_MeshCompression: int + m_MeshUsageFlags: int + m_Name: str + m_SubMeshes: List[SubMesh] + m_BakedConvexCollisionMesh: Optional[List[int]] = None + m_BakedTriangleCollisionMesh: Optional[List[int]] = None + m_BoneNameHashes: Optional[List[int]] = None + m_BonesAABB: Optional[List[MinMaxAABB]] = None + m_CollisionTriangles: Optional[List[int]] = None + m_CollisionVertexCount: Optional[int] = None + m_Colors: Optional[List[ColorRGBA]] = None + m_CookingOptions: Optional[int] = None + m_IndexFormat: Optional[int] = None + m_IsReadable: Optional[bool] = None + m_KeepIndices: Optional[bool] = None + m_KeepVertices: Optional[bool] = None + m_MeshMetrics_0_: Optional[float] = None + m_MeshMetrics_1_: Optional[float] = None + m_Normals: Optional[List[Vector3f]] = None + m_RootBoneNameHash: Optional[int] = None + m_ShapeVertices: Optional[List[MeshBlendShapeVertex]] = None + m_Shapes: Optional[Union[BlendShapeData, List[MeshBlendShape]]] = None + m_Skin: Optional[Union[List[BoneInfluence], List[BoneWeights4]]] = None + m_StreamCompression: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_Tangents: Optional[List[Vector4f]] = None + m_UV: Optional[List[Vector2f]] = None + m_UV1: Optional[List[Vector2f]] = None + m_Use16BitIndices: Optional[int] = None + m_VariableBoneCountWeights: Optional[VariableBoneCountWeights] = None + m_VertexData: Optional[VertexData] = None + m_Vertices: Optional[List[Vector3f]] = None + export = _Mesh_export + ... diff --git a/UnityPy/classes/legacy_patch/Renderer.pyi b/UnityPy/classes/legacy_patch/Renderer.pyi new file mode 100644 index 00000000..6cbf276f --- /dev/null +++ b/UnityPy/classes/legacy_patch/Renderer.pyi @@ -0,0 +1,13 @@ +from UnityPy.classes import PPtr +from UnityPy.classes.generated import Component +from UnityPy.classes.legacy_patch import GameObject + + +def export(self, export_dir: str) -> None: ... + +_Renderer_export = export + +class Renderer(Component): + m_GameObject: PPtr[GameObject] + export = _Renderer_export + ... diff --git a/UnityPy/classes/legacy_patch/Shader.pyi b/UnityPy/classes/legacy_patch/Shader.pyi new file mode 100644 index 00000000..0c0371dd --- /dev/null +++ b/UnityPy/classes/legacy_patch/Shader.pyi @@ -0,0 +1,28 @@ +from typing import List, Optional, Tuple, Union + +from UnityPy.classes import PPtr +from UnityPy.classes.generated import (GUID, NamedObject, SerializedShader, + Texture) + +def _Shader_export(self: Shader) -> str: ... + +class Shader(NamedObject): + m_Name: str + compressedBlob: Optional[List[int]] = None + compressedLengths: Optional[Union[List[int], List[List[int]]]] = None + decompressedLengths: Optional[Union[List[int], List[List[int]]]] = None + decompressedSize: Optional[int] = None + m_AssetGUID: Optional[GUID] = None + m_Dependencies: Optional[List[PPtr[Shader]]] = None + m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_ParsedForm: Optional[SerializedShader] = None + m_PathName: Optional[str] = None + m_Script: Optional[str] = None + m_ShaderIsBaked: Optional[bool] = None + m_SubProgramBlob: Optional[List[int]] = None + offsets: Optional[Union[List[int], List[List[int]]]] = None + platforms: Optional[List[int]] = None + stageCounts: Optional[List[int]] = None + export = _Shader_export + ... + diff --git a/UnityPy/classes/legacy_patch/Sprite.pyi b/UnityPy/classes/legacy_patch/Sprite.pyi new file mode 100644 index 00000000..6c43cf05 --- /dev/null +++ b/UnityPy/classes/legacy_patch/Sprite.pyi @@ -0,0 +1,30 @@ +from typing import List, Optional, Tuple + +from PIL.Image import Image + +from UnityPy.classes import PPtr +from UnityPy.classes.generated import (GUID, MonoBehaviour, NamedObject, Rectf, + SpriteAtlas, SpriteBone, + SpriteRenderData) +from UnityPy.classes.math import Vector2f, Vector4f + +def _Sprite_image(self: Sprite) -> Image: ... + +class Sprite(NamedObject): + m_Extrude: int + m_Name: str + m_Offset: Vector2f + m_PixelsToUnits: float + m_RD: SpriteRenderData + m_Rect: Rectf + m_AtlasTags: Optional[List[str]] = None + m_Bones: Optional[List[SpriteBone]] = None + m_Border: Optional[Vector4f] = None + m_IsPolygon: Optional[bool] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_Pivot: Optional[Vector2f] = None + m_RenderDataKey: Optional[Tuple[GUID, int]] = None + m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None + m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None + image = property(_Sprite_image) + ... diff --git a/UnityPy/classes/legacy_patch/Texture2D.pyi b/UnityPy/classes/legacy_patch/Texture2D.pyi new file mode 100644 index 00000000..8540588a --- /dev/null +++ b/UnityPy/classes/legacy_patch/Texture2D.pyi @@ -0,0 +1,47 @@ +from typing import BinaryIO, List, Optional, Union + +from PIL.Image import Image + +from UnityPy.classes.generated import GLTextureSettings, StreamingInfo, Texture + +def _Texture2d_get_image(self: Texture2D) -> Image: ... +def _Texture2d_set_image( + self: Texture2D, + img: Union[Image, str, BinaryIO], + target_format: Optional[int] = None, + mipmap_count: int = 1, +) -> None: ... +def _Texture2D_get_image_data(self: Texture2D) -> bytes: ... + +class Texture2D(Texture): + image_data: bytes + m_CompleteImageSize: int + m_Height: int + m_ImageCount: int + m_IsReadable: bool + m_LightmapFormat: int + m_Name: str + m_TextureDimension: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[bool] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsPreProcessed: Optional[bool] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_PlatformBlob: Optional[List[int]] = None + m_ReadAllowed: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None + image = property(_Texture2d_get_image, _Texture2d_set_image) + set_image = _Texture2d_set_image + get_image_data = _Texture2D_get_image_data + ... diff --git a/UnityPy/classes/legacy_patch/Texture2DArray.pyi b/UnityPy/classes/legacy_patch/Texture2DArray.pyi new file mode 100644 index 00000000..ea3c2d1e --- /dev/null +++ b/UnityPy/classes/legacy_patch/Texture2DArray.pyi @@ -0,0 +1,30 @@ +from typing import List, Optional + +from PIL.Image import Image + +from UnityPy.classes.generated import GLTextureSettings, StreamingInfo, Texture + +def _Texture2DArray_get_images(self: Texture2DArray) -> List[Image]: ... + +class Texture2DArray(Texture): + image_data: bytes + m_ColorSpace: int + m_DataSize: int + m_Depth: int + m_Format: int + m_Height: int + m_IsReadable: bool + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_UsageMode: Optional[int] = None + images = property(_Texture2DArray_get_images) + ... From 21d592a23f9a8a58c4439035243ca845a16bafb2 Mon Sep 17 00:00:00 2001 From: Nattsu39 Date: Sun, 17 Nov 2024 17:17:13 +0800 Subject: [PATCH 4/5] better legacy patch stub style --- UnityPy/classes/legacy_patch/AudioClip.pyi | 14 +++---- UnityPy/classes/legacy_patch/GameObject.pyi | 39 +++++++------------ UnityPy/classes/legacy_patch/Mesh.pyi | 6 +-- UnityPy/classes/legacy_patch/Renderer.pyi | 9 +---- UnityPy/classes/legacy_patch/Shader.pyi | 5 +-- UnityPy/classes/legacy_patch/Sprite.pyi | 5 ++- UnityPy/classes/legacy_patch/Texture2D.pyi | 24 ++++++------ .../classes/legacy_patch/Texture2DArray.pyi | 7 ++-- 8 files changed, 44 insertions(+), 65 deletions(-) diff --git a/UnityPy/classes/legacy_patch/AudioClip.pyi b/UnityPy/classes/legacy_patch/AudioClip.pyi index 6ea924fd..6f8da3c1 100644 --- a/UnityPy/classes/legacy_patch/AudioClip.pyi +++ b/UnityPy/classes/legacy_patch/AudioClip.pyi @@ -1,10 +1,7 @@ -from typing import List, Optional +from typing import Dict, List, Optional from UnityPy.classes.generated import SampleClip, StreamedResource -def _AudioClip_extension(self: AudioClip) -> str: ... -def _AudioClip_samples(self: AudioClip) -> dict: ... - class AudioClip(SampleClip): m_Name: str m_3D: Optional[bool] = None @@ -26,6 +23,9 @@ class AudioClip(SampleClip): m_SubsoundIndex: Optional[int] = None m_Type: Optional[int] = None m_UseHardware: Optional[bool] = None - extension = property(_AudioClip_extension) - samples = property(_AudioClip_samples) - ... + + @property + def extension(self) -> str: ... + + @property + def samples(self) -> Dict[str, bytes]: ... diff --git a/UnityPy/classes/legacy_patch/GameObject.pyi b/UnityPy/classes/legacy_patch/GameObject.pyi index daed126e..1a414316 100644 --- a/UnityPy/classes/legacy_patch/GameObject.pyi +++ b/UnityPy/classes/legacy_patch/GameObject.pyi @@ -2,10 +2,6 @@ from typing import List, Tuple, Union from UnityPy.classes import Component, PPtr from UnityPy.classes.generated import ComponentPair, EditorExtension -from UnityPy.enums import ClassIDType - -def _GameObject_Components(self) -> List[PPtr[Component]]: ... -def _GameObject_GetComponent(self, type: ClassIDType) -> Union[PPtr[Component], None]: ... class GameObject(EditorExtension): m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] @@ -13,23 +9,18 @@ class GameObject(EditorExtension): m_Layer: int m_Name: str m_Tag: int - m_Components = property(_GameObject_Components) - m_Animator = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Animator) - ) - m_Animation = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Animation) - ) - m_Transform = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.Transform) - ) - m_MeshRenderer = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.MeshRenderer) - ) - m_SkinnedMeshRenderer = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.SkinnedMeshRenderer) - ) - m_MeshFilter = property( - lambda self: _GameObject_GetComponent(self, ClassIDType.MeshFilter) - ) - ... + + @property + def m_Components(self) -> List[PPtr[Component]]: ... + @property + def m_Animator(self) -> Union[PPtr[Component], None]: ... + @property + def m_Animation(self) -> Union[PPtr[Component], None]: ... + @property + def m_Transform(self) -> Union[PPtr[Component], None]: ... + @property + def m_SkinnedMeshRenderer(self) -> Union[PPtr[Component], None]: ... + @property + def m_MeshRenderer(self) -> Union[PPtr[Component], None]: ... + @property + def m_MeshFilter(self) -> Union[PPtr[Component], None]: ... diff --git a/UnityPy/classes/legacy_patch/Mesh.pyi b/UnityPy/classes/legacy_patch/Mesh.pyi index e7233052..9d047012 100644 --- a/UnityPy/classes/legacy_patch/Mesh.pyi +++ b/UnityPy/classes/legacy_patch/Mesh.pyi @@ -9,8 +9,6 @@ from UnityPy.classes.generated import (AABB, BlendShapeData, BoneInfluence, from UnityPy.classes.math import (ColorRGBA, Matrix4x4f, Vector2f, Vector3f, Vector4f) -def _Mesh_export(self: Mesh, format: str = "obj") -> str: ... - class Mesh(NamedObject): m_BindPose: List[Matrix4x4f] m_CompressedMesh: CompressedMesh @@ -48,5 +46,5 @@ class Mesh(NamedObject): m_VariableBoneCountWeights: Optional[VariableBoneCountWeights] = None m_VertexData: Optional[VertexData] = None m_Vertices: Optional[List[Vector3f]] = None - export = _Mesh_export - ... + + def export(self, format: str = "obj") -> str: ... diff --git a/UnityPy/classes/legacy_patch/Renderer.pyi b/UnityPy/classes/legacy_patch/Renderer.pyi index 6cbf276f..a5e8c2c4 100644 --- a/UnityPy/classes/legacy_patch/Renderer.pyi +++ b/UnityPy/classes/legacy_patch/Renderer.pyi @@ -2,12 +2,7 @@ from UnityPy.classes import PPtr from UnityPy.classes.generated import Component from UnityPy.classes.legacy_patch import GameObject - -def export(self, export_dir: str) -> None: ... - -_Renderer_export = export - class Renderer(Component): m_GameObject: PPtr[GameObject] - export = _Renderer_export - ... + + def export(self, export_dir: str) -> None: ... diff --git a/UnityPy/classes/legacy_patch/Shader.pyi b/UnityPy/classes/legacy_patch/Shader.pyi index 0c0371dd..5b433964 100644 --- a/UnityPy/classes/legacy_patch/Shader.pyi +++ b/UnityPy/classes/legacy_patch/Shader.pyi @@ -4,8 +4,6 @@ from UnityPy.classes import PPtr from UnityPy.classes.generated import (GUID, NamedObject, SerializedShader, Texture) -def _Shader_export(self: Shader) -> str: ... - class Shader(NamedObject): m_Name: str compressedBlob: Optional[List[int]] = None @@ -23,6 +21,5 @@ class Shader(NamedObject): offsets: Optional[Union[List[int], List[List[int]]]] = None platforms: Optional[List[int]] = None stageCounts: Optional[List[int]] = None - export = _Shader_export - ... + def export(self) -> str: ... diff --git a/UnityPy/classes/legacy_patch/Sprite.pyi b/UnityPy/classes/legacy_patch/Sprite.pyi index 6c43cf05..ac9252f5 100644 --- a/UnityPy/classes/legacy_patch/Sprite.pyi +++ b/UnityPy/classes/legacy_patch/Sprite.pyi @@ -26,5 +26,6 @@ class Sprite(NamedObject): m_RenderDataKey: Optional[Tuple[GUID, int]] = None m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None - image = property(_Sprite_image) - ... + + @property + def image(self) -> Image: ... diff --git a/UnityPy/classes/legacy_patch/Texture2D.pyi b/UnityPy/classes/legacy_patch/Texture2D.pyi index 8540588a..40f26fa2 100644 --- a/UnityPy/classes/legacy_patch/Texture2D.pyi +++ b/UnityPy/classes/legacy_patch/Texture2D.pyi @@ -4,15 +4,6 @@ from PIL.Image import Image from UnityPy.classes.generated import GLTextureSettings, StreamingInfo, Texture -def _Texture2d_get_image(self: Texture2D) -> Image: ... -def _Texture2d_set_image( - self: Texture2D, - img: Union[Image, str, BinaryIO], - target_format: Optional[int] = None, - mipmap_count: int = 1, -) -> None: ... -def _Texture2D_get_image_data(self: Texture2D) -> bytes: ... - class Texture2D(Texture): image_data: bytes m_CompleteImageSize: int @@ -41,7 +32,14 @@ class Texture2D(Texture): m_StreamData: Optional[StreamingInfo] = None m_StreamingMipmaps: Optional[bool] = None m_StreamingMipmapsPriority: Optional[int] = None - image = property(_Texture2d_get_image, _Texture2d_set_image) - set_image = _Texture2d_set_image - get_image_data = _Texture2D_get_image_data - ... + + @property + def image(self) -> Image: ... + def set_image( + self, + img: Union[Image, str, BinaryIO], + target_format: Optional[int] = None, + mipmap_count: int = 1, + ) -> None: ... + def get_image_data(self) -> bytes: ... + diff --git a/UnityPy/classes/legacy_patch/Texture2DArray.pyi b/UnityPy/classes/legacy_patch/Texture2DArray.pyi index ea3c2d1e..987f97fe 100644 --- a/UnityPy/classes/legacy_patch/Texture2DArray.pyi +++ b/UnityPy/classes/legacy_patch/Texture2DArray.pyi @@ -4,8 +4,6 @@ from PIL.Image import Image from UnityPy.classes.generated import GLTextureSettings, StreamingInfo, Texture -def _Texture2DArray_get_images(self: Texture2DArray) -> List[Image]: ... - class Texture2DArray(Texture): image_data: bytes m_ColorSpace: int @@ -26,5 +24,6 @@ class Texture2DArray(Texture): m_MipsStripped: Optional[int] = None m_StreamData: Optional[StreamingInfo] = None m_UsageMode: Optional[int] = None - images = property(_Texture2DArray_get_images) - ... + + @property + def images(self: Texture2DArray) -> List[Image]: ... From 07a723bfcdb0640217d8334006ae282d22f5265f Mon Sep 17 00:00:00 2001 From: Nattsu39 Date: Sun, 17 Nov 2024 17:25:06 +0800 Subject: [PATCH 5/5] Remove meaningless stub definitions for legacy patches. --- UnityPy/classes/legacy_patch/Sprite.pyi | 2 -- UnityPy/classes/legacy_patch/Texture2DArray.pyi | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/UnityPy/classes/legacy_patch/Sprite.pyi b/UnityPy/classes/legacy_patch/Sprite.pyi index ac9252f5..3b3b18c1 100644 --- a/UnityPy/classes/legacy_patch/Sprite.pyi +++ b/UnityPy/classes/legacy_patch/Sprite.pyi @@ -8,8 +8,6 @@ from UnityPy.classes.generated import (GUID, MonoBehaviour, NamedObject, Rectf, SpriteRenderData) from UnityPy.classes.math import Vector2f, Vector4f -def _Sprite_image(self: Sprite) -> Image: ... - class Sprite(NamedObject): m_Extrude: int m_Name: str diff --git a/UnityPy/classes/legacy_patch/Texture2DArray.pyi b/UnityPy/classes/legacy_patch/Texture2DArray.pyi index 987f97fe..3f396ae7 100644 --- a/UnityPy/classes/legacy_patch/Texture2DArray.pyi +++ b/UnityPy/classes/legacy_patch/Texture2DArray.pyi @@ -26,4 +26,4 @@ class Texture2DArray(Texture): m_UsageMode: Optional[int] = None @property - def images(self: Texture2DArray) -> List[Image]: ... + def images(self) -> List[Image]: ...