1- import requests
1+ from .. offsets import *
22import time
3- import json
4-
5- OffsetsRequest = requests .get ("https://offsets.ntgetwritewatch.workers.dev/offsets.json" )
6- Offsets = OffsetsRequest .json ()
7-
8- for key in Offsets :
9- try :
10- Offsets [key ] = int (Offsets [key ], 16 )
11- except (ValueError , TypeError ):
12- pass
13-
14- with open ("data/offsets.json" , "r" ) as f :
15- LoadedOffsets = json .load (f )
16- f .close ()
17-
18- for key in LoadedOffsets :
19- Offsets [key ] = int (LoadedOffsets [key ], 16 )
3+ from utils .rbx .datastructures import *
204
215class RBXInstance :
226 def __init__ (self , address , memory_module ):
237 self .raw_address = address
248 self .memory_module = memory_module
259
26- # props #
27- @property
28- def parent_address (self ):
29- return self .raw_address + Offsets ["Parent" ]
10+ def __eq__ (self , value ):
11+ return value .raw_address == self .raw_address
12+
13+ def __getattr__ (self , key ):
14+ return self .FindFirstChild (key )
3015
16+ # props #
3117 @property
3218 def Parent (self ):
3319 parent_pointer = int .from_bytes (self .memory_module .read (self .raw_address + Offsets ["Parent" ], 8 ), 'little' )
34- return RBXInstance (parent_pointer , self .memory_module )
20+ instance = RBXInstance (parent_pointer , self .memory_module )
21+
22+ try :
23+ thing = instance .ClassName
24+ except Exception as e :
25+ return None
26+
27+ return instance
3528
3629 @property
3730 def Name (self ):
@@ -51,39 +44,37 @@ def ClassName(self):
5144 )
5245 return self .memory_module .read_string (class_name_address )
5346
54- # frame properties #
5547 @property
5648 def Position (self ):
57- try :
58- x = self .memory_module .read_float (self .raw_address + Offsets ["FramePositionX" ])
59- x_offset = self .memory_module .read_int (self .raw_address + Offsets ["FramePositionOffsetX " ])
60-
61- y = self .memory_module .read_float (self .raw_address + Offsets ["FramePositionY" ])
62- y_offset = self .memory_module .read_int (self .raw_address + Offsets ["FramePositionOffsetY" ])
63-
64- return (x , x_offset , y , y_offset )
65- except (KeyError , OSError ) as e :
66- print (f"Error reading position: { e } " )
67- return (0.0 , 0 , 0.0 , 0 )
49+ if "part" in self .ClassName .lower ():
50+ position_vector3 = self .memory_module .read_floats (self .raw_address + Offsets ["Position" ], 3 )
51+ return Vector3 (* position_vector3 )
52+ else :
53+ try :
54+ x = self .memory_module .read_float (self .raw_address + Offsets ["FramePositionX" ])
55+ x_offset = self .memory_module .read_int (self .raw_address + Offsets ["FramePositionOffsetX " ])
56+
57+ y = self .memory_module .read_float (self .raw_address + Offsets ["FramePositionY" ])
58+ y_offset = self .memory_module .read_int (self .raw_address + Offsets ["FramePositionOffsetY" ])
59+
60+ return UDim2 (x , x_offset , y , y_offset )
61+ except (KeyError , OSError ) as e :
62+ print (f"Error reading position: { e } " )
63+ return (0.0 , 0 , 0.0 , 0 )
6864
6965 @property
7066 def Size (self ):
71- try :
72- x = self .memory_module .read_float (self .raw_address + Offsets ["FrameSizeX" ])
73- y = self .memory_module .read_float (self .raw_address + Offsets ["FrameSizeY" ])
74- return (x , y )
75- except (KeyError , OSError ) as e :
76- print (f"Error reading position: { e } " )
77- return (0.0 , 0.0 )
78-
79- """@property
80- def ScreenPosition(self):
81- udim2_x_scale, udim2_y_scale, udim2_x_offset, udim2_y_offset = self.Position
82-
83- real_x = (udim2_x_scale * SCREEN_WIDTH) + udim2_x_offset
84- real_y = (udim2_y_scale * SCREEN_HEIGHT) + udim2_y_offset
85-
86- return (real_x, real_y)"""
67+ if "part" in self .ClassName .lower ():
68+ size_vector3 = self .memory_module .read_floats (self .raw_address + Offsets ["PartSize" ], 3 )
69+ return Vector3 (* size_vector3 )
70+ else :
71+ try :
72+ x = self .memory_module .read_float (self .raw_address + Offsets ["FrameSizeX" ])
73+ y = self .memory_module .read_float (self .raw_address + Offsets ["FrameSizeY" ])
74+ return (x , y )
75+ except (KeyError , OSError ) as e :
76+ print (f"Error reading position: { e } " )
77+ return (0.0 , 0.0 )
8778
8879 # XXXXValue props #
8980 @property
@@ -103,8 +94,7 @@ def Value(self):
10394 # text props #
10495 @property
10596 def Text (self ):
106- classname = self .ClassName
107- if classname == "TextLabel" :
97+ if "text" in self .ClassName .lower ():
10898 return self .memory_module .read_string (self .raw_address + Offsets ["Text" ])
10999
110100 return None
@@ -129,6 +119,30 @@ def GetChildren(self):
129119
130120 return children
131121
122+ def GetFullName (self ):
123+ if self .ClassName == "DataModel" :
124+ return self .Name
125+
126+ ObjectPointer = self
127+ ObjectPath = self .Name
128+
129+ while True :
130+ if ObjectPointer .Parent .ClassName == "DataModel" :
131+ break
132+
133+ ObjectPointer = ObjectPointer .Parent
134+ ObjectPath = f"{ ObjectPointer .Name } ." + ObjectPath
135+
136+ return ObjectPath
137+
138+ def GetDescendants (self ):
139+ descendants = []
140+ for child in self .GetChildren ():
141+ descendants .append (child )
142+ descendants .extend (child .GetDescendants ())
143+ return descendants
144+
145+
132146 def FindFirstChild (self , name , recursive = False ):
133147 try :
134148 children = self .GetChildren ()
0 commit comments