robloxmemoryapi 0.2.4__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. {robloxmemoryapi-0.2.4/src/robloxmemoryapi.egg-info → robloxmemoryapi-0.2.5}/PKG-INFO +3 -1
  2. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/README.md +2 -0
  3. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/pyproject.toml +1 -1
  4. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/memory.py +6 -6
  5. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/rbx/instance.py +60 -29
  6. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5/src/robloxmemoryapi.egg-info}/PKG-INFO +3 -1
  7. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/LICENSE.md +0 -0
  8. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/setup.cfg +0 -0
  9. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/__init__.py +0 -0
  10. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/__init__.py +0 -0
  11. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/luau/__init__.py +0 -0
  12. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/luau/parser.py +0 -0
  13. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/offsets.py +0 -0
  14. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/rbx/__init__.py +0 -0
  15. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/rbx/bytecode/decryptor.py +0 -0
  16. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/rbx/bytecode/encryptor.py +0 -0
  17. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/rbx/datastructures.py +0 -0
  18. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi/utils/rbx/fflags.py +0 -0
  19. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi.egg-info/SOURCES.txt +0 -0
  20. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi.egg-info/dependency_links.txt +0 -0
  21. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi.egg-info/requires.txt +0 -0
  22. {robloxmemoryapi-0.2.4 → robloxmemoryapi-0.2.5}/src/robloxmemoryapi.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robloxmemoryapi
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: Python Library that abstracts reading and writing data from the Roblox DataModel
5
5
  Author-email: upio <notpoiu@users.noreply.github.com>, mstudio45 <mstudio45@users.noreply.github.com>, ActualMasterOogway <ActualMasterOogway@users.noreply.github.com>
6
6
  License: Copyright 2025 upio, mstudio45, master oogway
@@ -35,6 +35,8 @@ Dynamic: license-file
35
35
 
36
36
  This was made by [upio](https://github.com/notpoiu), [mstudio45](https://github.com/mstudio45), and [Master Oogway](https://github.com/ActualMasterOogway) and created for the [Dig Macro](https://github.com/mstudio45/digmacro) project (external mode and not the computer vision mode).
37
37
 
38
+ Offsets are sourced from [imtheo.lol](https://imtheo.lol/Offsets). This project is not affilated with imtheo.lol in any way.
39
+
38
40
  ## Installation
39
41
 
40
42
  PyPI:
@@ -4,6 +4,8 @@
4
4
 
5
5
  This was made by [upio](https://github.com/notpoiu), [mstudio45](https://github.com/mstudio45), and [Master Oogway](https://github.com/ActualMasterOogway) and created for the [Dig Macro](https://github.com/mstudio45/digmacro) project (external mode and not the computer vision mode).
6
6
 
7
+ Offsets are sourced from [imtheo.lol](https://imtheo.lol/Offsets). This project is not affilated with imtheo.lol in any way.
8
+
7
9
  ## Installation
8
10
 
9
11
  PyPI:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "robloxmemoryapi"
7
- version = "0.2.4"
7
+ version = "0.2.5"
8
8
  description = "Python Library that abstracts reading and writing data from the Roblox DataModel"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.9"
@@ -290,15 +290,15 @@ class EvasiveProcess:
290
290
  # numbers #
291
291
  def read_int(self, address: int, offset: int = 0) -> int:
292
292
  buffer = self.read(address + offset, 4)
293
- return int.from_bytes(buffer, 'little') if len(buffer) == 4 else 0
293
+ return int.from_bytes(buffer, 'little', signed=True) if len(buffer) == 4 else 0
294
294
 
295
295
  def read_int64(self, address: int, offset: int = 0) -> int:
296
296
  buffer = self.read(address + offset, 8)
297
- return int.from_bytes(buffer, 'little') if len(buffer) == 8 else 0
297
+ return int.from_bytes(buffer, 'little', signed=True) if len(buffer) == 8 else 0
298
298
 
299
299
  def read_long(self, address: int, offset: int = 0) -> int:
300
300
  buffer = self.read(address + offset, 8)
301
- return int.from_bytes(buffer, 'little') if len(buffer) == 8 else 0
301
+ return int.from_bytes(buffer, 'little', signed=True) if len(buffer) == 8 else 0
302
302
 
303
303
  def read_double(self, address: int, offset: int = 0) -> float:
304
304
  try:
@@ -332,13 +332,13 @@ class EvasiveProcess:
332
332
  return [0.0]
333
333
 
334
334
  def write_int(self, address: int, value: int) -> None:
335
- self.write(address, struct.pack('<I', value & 0xFFFFFFFF))
335
+ self.write(address, struct.pack('<i', value & 0xFFFFFFFF))
336
336
 
337
337
  def write_int64(self, address: int, value: int) -> None:
338
- self.write(address, struct.pack('<Q', value & 0xFFFFFFFFFFFFFFFF))
338
+ self.write(address, struct.pack('<q', value & 0xFFFFFFFFFFFFFFFF))
339
339
 
340
340
  def write_long(self, address: int, value: int) -> None:
341
- self.write(address, struct.pack('<Q', value & 0xFFFFFFFFFFFFFFFF))
341
+ self.write(address, struct.pack('<q', value & 0xFFFFFFFFFFFFFFFF))
342
342
 
343
343
  def write_double(self, address: int, value: float) -> None:
344
344
  self.write(address, struct.pack('<d', value))
@@ -10,6 +10,7 @@ basepart_offsets = Offsets["BasePart"]
10
10
  primitive_offsets = Offsets["Primitive"]
11
11
  camera_offsets = Offsets["Camera"]
12
12
  gui_offsets = Offsets["GuiObject"]
13
+ gui_2d_offsets = Offsets["GuiBase2D"]
13
14
  misc_offsets = Offsets["Misc"]
14
15
  humanoid_offsets = Offsets["Humanoid"]
15
16
  model_offsets = Offsets["Model"]
@@ -265,6 +266,12 @@ class RBXInstance:
265
266
  3
266
267
  )
267
268
  return Vector3(*position_vector3)
269
+ elif className == "attachment":
270
+ position_vector3 = self.memory_module.read_floats(
271
+ self.raw_address + attachment_offsets["Position"],
272
+ 3
273
+ )
274
+ return Vector3(*position_vector3)
268
275
  else:
269
276
  return self._read_udim2(self.raw_address + gui_offsets["Position"])
270
277
 
@@ -287,6 +294,13 @@ class RBXInstance:
287
294
  (vec.X, vec.Y, vec.Z)
288
295
  )
289
296
 
297
+ elif className == "attachment":
298
+ vec = self._as_vector3(value, "Position")
299
+ self.memory_module.write_floats(
300
+ self.raw_address + attachment_offsets["Position"],
301
+ (vec.X, vec.Y, vec.Z)
302
+ )
303
+
290
304
  else:
291
305
  udim2_value = self._as_udim2(value, "Position")
292
306
  self._write_udim2(self.raw_address + gui_offsets["Position"], udim2_value)
@@ -486,6 +500,42 @@ class RBXInstance:
486
500
  gui_size = self._as_udim2(value, "Size")
487
501
  self._write_udim2(self.raw_address + gui_offsets["Size"], gui_size)
488
502
 
503
+ @property
504
+ def AbsoluteSize(self):
505
+ SizeData = self.memory_module.read_floats(
506
+ self.raw_address + gui_2d_offsets["AbsoluteSize"],
507
+ 2
508
+ )
509
+
510
+ return Vector2(*SizeData)
511
+
512
+ @AbsoluteSize.setter
513
+ def AbsoluteSize(self, value):
514
+ self._ensure_writable()
515
+ vec = self._as_vector2(value, "AbsoluteSize")
516
+ self.memory_module.write_floats(
517
+ self.raw_address + gui_2d_offsets["AbsoluteSize"],
518
+ (vec.X, vec.Y)
519
+ )
520
+
521
+ @property
522
+ def AbsolutePosition(self):
523
+ PositionData = self.memory_module.read_floats(
524
+ self.raw_address + gui_2d_offsets["AbsolutePosition"],
525
+ 2
526
+ )
527
+
528
+ return Vector2(*PositionData)
529
+
530
+ @AbsolutePosition.setter
531
+ def AbsolutePosition(self, value):
532
+ self._ensure_writable()
533
+ vec = self._as_vector2(value, "AbsolutePosition")
534
+ self.memory_module.write_floats(
535
+ self.raw_address + gui_2d_offsets["AbsolutePosition"],
536
+ (vec.X, vec.Y)
537
+ )
538
+
489
539
  @property
490
540
  def Transparency(self):
491
541
  if "part" not in self.ClassName.lower():
@@ -512,11 +562,11 @@ class RBXInstance:
512
562
  if "part" not in self.ClassName.lower():
513
563
  return None
514
564
 
515
- color_data = self.memory_module.read_floats(
516
- self.raw_address + basepart_offsets["Color3"],
517
- 3
518
- )
519
- return Color3(*color_data)
565
+ # Color is stored as 3 bytes (R, G, B) rather than floats
566
+ color_bytes = self.memory_module.read(self.raw_address + basepart_offsets["Color3"], 3)
567
+ if len(color_bytes) == 3:
568
+ return Color3(color_bytes[0] / 255.0, color_bytes[1] / 255.0, color_bytes[2] / 255.0)
569
+ return Color3(0, 0, 0)
520
570
 
521
571
  @Color.setter
522
572
  def Color(self, value):
@@ -525,9 +575,11 @@ class RBXInstance:
525
575
  self._ensure_writable()
526
576
 
527
577
  vec = self._as_color3(value, "Color3")
528
- self.memory_module.write_floats(
529
- self.primitive_address + basepart_offsets["Color3"],
530
- (vec.X, vec.Y, vec.Z)
578
+ r, g, b = int(vec.R * 255), int(vec.G * 255), int(vec.B * 255)
579
+ # Write 3 bytes directly
580
+ self.memory_module.write(
581
+ self.raw_address + basepart_offsets["Color3"],
582
+ bytes([r & 0xFF, g & 0xFF, b & 0xFF])
531
583
  )
532
584
 
533
585
  def _read_primitive_flags(self):
@@ -1150,27 +1202,6 @@ class RBXInstance:
1150
1202
  (vec.X, vec.Y, vec.Z)
1151
1203
  )
1152
1204
 
1153
- # attachment props #
1154
- @property
1155
- def AttachmentPosition(self):
1156
- if self.ClassName != "Attachment":
1157
- return None
1158
- pos_data = self.memory_module.read_floats(
1159
- self.raw_address + attachment_offsets["Position"],
1160
- 3
1161
- )
1162
- return Vector3(*pos_data)
1163
-
1164
- @AttachmentPosition.setter
1165
- def AttachmentPosition(self, value):
1166
- if self.ClassName != "Attachment":
1167
- raise AttributeError("AttachmentPosition is only available on Attachment instances.")
1168
- self._ensure_writable()
1169
- vec = self._as_vector3(value, "AttachmentPosition")
1170
- self.memory_module.write_floats(
1171
- self.raw_address + attachment_offsets["Position"],
1172
- (vec.X, vec.Y, vec.Z)
1173
- )
1174
1205
 
1175
1206
  # charactermesh props #
1176
1207
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robloxmemoryapi
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: Python Library that abstracts reading and writing data from the Roblox DataModel
5
5
  Author-email: upio <notpoiu@users.noreply.github.com>, mstudio45 <mstudio45@users.noreply.github.com>, ActualMasterOogway <ActualMasterOogway@users.noreply.github.com>
6
6
  License: Copyright 2025 upio, mstudio45, master oogway
@@ -35,6 +35,8 @@ Dynamic: license-file
35
35
 
36
36
  This was made by [upio](https://github.com/notpoiu), [mstudio45](https://github.com/mstudio45), and [Master Oogway](https://github.com/ActualMasterOogway) and created for the [Dig Macro](https://github.com/mstudio45/digmacro) project (external mode and not the computer vision mode).
37
37
 
38
+ Offsets are sourced from [imtheo.lol](https://imtheo.lol/Offsets). This project is not affilated with imtheo.lol in any way.
39
+
38
40
  ## Installation
39
41
 
40
42
  PyPI: