robloxmemoryapi 0.2.5__tar.gz → 0.2.6__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.5/src/robloxmemoryapi.egg-info → robloxmemoryapi-0.2.6}/PKG-INFO +1 -1
  2. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/pyproject.toml +1 -1
  3. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/offsets.py +0 -13
  4. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/rbx/instance.py +485 -31
  5. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6/src/robloxmemoryapi.egg-info}/PKG-INFO +1 -1
  6. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/LICENSE.md +0 -0
  7. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/README.md +0 -0
  8. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/setup.cfg +0 -0
  9. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/__init__.py +0 -0
  10. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/__init__.py +0 -0
  11. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/luau/__init__.py +0 -0
  12. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/luau/parser.py +0 -0
  13. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/memory.py +0 -0
  14. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/rbx/__init__.py +0 -0
  15. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/rbx/bytecode/decryptor.py +0 -0
  16. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/rbx/bytecode/encryptor.py +0 -0
  17. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/rbx/datastructures.py +0 -0
  18. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi/utils/rbx/fflags.py +0 -0
  19. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi.egg-info/SOURCES.txt +0 -0
  20. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi.egg-info/dependency_links.txt +0 -0
  21. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/src/robloxmemoryapi.egg-info/requires.txt +0 -0
  22. {robloxmemoryapi-0.2.5 → robloxmemoryapi-0.2.6}/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.5
3
+ Version: 0.2.6
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "robloxmemoryapi"
7
- version = "0.2.5"
7
+ version = "0.2.6"
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"
@@ -5,24 +5,11 @@ BASE_URL = "https://imtheo.lol/Offsets"
5
5
  # Offsets
6
6
  OffsetsRequest = requests.get(f"{BASE_URL}/Offsets.json")
7
7
 
8
- # Legacy Offsets
9
- OldOffsetsRequest = requests.get("https://offsets.ntgetwritewatch.workers.dev/offsets.json")
10
- try:
11
- OldOffsets = OldOffsetsRequest.json()
12
- except:
13
- OldOffsets = {}
14
-
15
8
  try:
16
9
  Offsets = OffsetsRequest.json()["Offsets"]
17
10
  except:
18
11
  Offsets = {}
19
12
 
20
- # Handle non-existant offsets
21
- try:
22
- Offsets["Camera"]["ViewportSize"] = int(OldOffsets["ViewportSize"], 16)
23
- except:
24
- Offsets["Camera"]["ViewportSize"] = 0x6AD28F
25
-
26
13
  # FFlag offsets (lazily loaded)
27
14
  _fflag_data = None
28
15
  _fflag_offsets = None
@@ -27,6 +27,8 @@ spawnlocation_offsets = Offsets["SpawnLocation"]
27
27
  clothing_offsets = Offsets["Clothing"]
28
28
  charactermesh_offsets = Offsets["CharacterMesh"]
29
29
  attachment_offsets = Offsets["Attachment"]
30
+ air_properties_offsets = Offsets["AirProperties"]
31
+ seat_offsets = Offsets["Seat"]
30
32
 
31
33
  ROTATION_MATRIX_FLOATS = 9
32
34
 
@@ -404,6 +406,16 @@ class RBXInstance:
404
406
  self.raw_address,
405
407
  Offsets["ColorCorrectionEffect"]["Enabled"]
406
408
  )
409
+ elif self.ClassName == "BlurEffect":
410
+ return self.memory_module.read_bool(
411
+ self.raw_address,
412
+ Offsets["BlurEffect"]["Enabled"]
413
+ )
414
+ elif self.ClassName == "ColorGradingEffect":
415
+ return self.memory_module.read_bool(
416
+ self.raw_address,
417
+ Offsets["ColorGradingEffect"]["Enabled"]
418
+ )
407
419
  elif self.ClassName == "SpawnLocation":
408
420
  return self.memory_module.read_bool(
409
421
  self.raw_address,
@@ -437,6 +449,18 @@ class RBXInstance:
437
449
  self.raw_address + Offsets["ColorCorrectionEffect"]["Enabled"],
438
450
  bool(value)
439
451
  )
452
+ elif self.ClassName == "BlurEffect":
453
+ self._ensure_writable()
454
+ self.memory_module.write_bool(
455
+ self.raw_address + Offsets["BlurEffect"]["Enabled"],
456
+ bool(value)
457
+ )
458
+ elif self.ClassName == "ColorGradingEffect":
459
+ self._ensure_writable()
460
+ self.memory_module.write_bool(
461
+ self.raw_address + Offsets["ColorGradingEffect"]["Enabled"],
462
+ bool(value)
463
+ )
440
464
  elif self.ClassName == "SpawnLocation":
441
465
  self._ensure_writable()
442
466
  self.memory_module.write_bool(
@@ -444,7 +468,7 @@ class RBXInstance:
444
468
  bool(value)
445
469
  )
446
470
  else:
447
- raise AttributeError("Enabled is only available on ScreenGui, ProximityPrompt, Tool, ColorCorrectionEffect, or SpawnLocation instances.")
471
+ raise AttributeError("Enabled is only available on ScreenGui, ProximityPrompt, Tool, ColorCorrectionEffect, BlurEffect, ColorGradingEffect, or SpawnLocation instances.")
448
472
 
449
473
  @property
450
474
  def Visible(self):
@@ -536,6 +560,12 @@ class RBXInstance:
536
560
  (vec.X, vec.Y)
537
561
  )
538
562
 
563
+ @property
564
+ def AbsoluteRotation(self):
565
+ return self.memory_module.read_float(
566
+ self.raw_address + gui_2d_offsets["AbsoluteRotation"]
567
+ )
568
+
539
569
  @property
540
570
  def Transparency(self):
541
571
  if "part" not in self.ClassName.lower():
@@ -937,15 +967,15 @@ class RBXInstance:
937
967
  self.raw_address + gui_offsets["BackgroundColor3"],
938
968
  3
939
969
  )
940
- return Vector3(*color_data)
970
+ return Color3(*color_data)
941
971
 
942
972
  @BackgroundColor3.setter
943
973
  def BackgroundColor3(self, value):
944
974
  self._ensure_writable()
945
- vec = self._as_vector3(value, "BackgroundColor3")
975
+ vec = self._as_color3(value, "BackgroundColor3")
946
976
  self.memory_module.write_floats(
947
977
  self.raw_address + gui_offsets["BackgroundColor3"],
948
- (vec.X, vec.Y, vec.Z)
978
+ (vec.R, vec.G, vec.B)
949
979
  )
950
980
 
951
981
  @property
@@ -954,15 +984,15 @@ class RBXInstance:
954
984
  self.raw_address + gui_offsets["BorderColor3"],
955
985
  3
956
986
  )
957
- return Vector3(*color_data)
987
+ return Color3(*color_data)
958
988
 
959
989
  @BorderColor3.setter
960
990
  def BorderColor3(self, value):
961
991
  self._ensure_writable()
962
- vec = self._as_vector3(value, "BorderColor3")
992
+ vec = self._as_color3(value, "BorderColor3")
963
993
  self.memory_module.write_floats(
964
994
  self.raw_address + gui_offsets["BorderColor3"],
965
- (vec.X, vec.Y, vec.Z)
995
+ (vec.R, vec.G, vec.B)
966
996
  )
967
997
 
968
998
  @property
@@ -971,15 +1001,15 @@ class RBXInstance:
971
1001
  self.raw_address + gui_offsets["TextColor3"],
972
1002
  3
973
1003
  )
974
- return Vector3(*color_data)
1004
+ return Color3(*color_data)
975
1005
 
976
1006
  @TextColor3.setter
977
1007
  def TextColor3(self, value):
978
1008
  self._ensure_writable()
979
- vec = self._as_vector3(value, "TextColor3")
1009
+ vec = self._as_color3(value, "TextColor3")
980
1010
  self.memory_module.write_floats(
981
1011
  self.raw_address + gui_offsets["TextColor3"],
982
- (vec.X, vec.Y, vec.Z)
1012
+ (vec.R, vec.G, vec.B)
983
1013
  )
984
1014
 
985
1015
  @property
@@ -1008,8 +1038,7 @@ class RBXInstance:
1008
1038
  @property
1009
1039
  def BackgroundTransparency(self):
1010
1040
  return self.memory_module.read_float(
1011
- self.raw_address,
1012
- gui_offsets["BackgroundTransparency"]
1041
+ self.raw_address + gui_offsets["BackgroundTransparency"]
1013
1042
  )
1014
1043
 
1015
1044
  @BackgroundTransparency.setter
@@ -1023,8 +1052,7 @@ class RBXInstance:
1023
1052
  @property
1024
1053
  def ZIndex(self):
1025
1054
  return self.memory_module.read_int(
1026
- self.raw_address,
1027
- gui_offsets["ZIndex"]
1055
+ self.raw_address + gui_offsets["ZIndex"]
1028
1056
  )
1029
1057
 
1030
1058
  @ZIndex.setter
@@ -1070,8 +1098,7 @@ class RBXInstance:
1070
1098
  if self.ClassName != "Tool":
1071
1099
  return None
1072
1100
  return self.memory_module.read_bool(
1073
- self.raw_address,
1074
- tool_offsets["ManualActivationOnly"]
1101
+ self.raw_address + tool_offsets["ManualActivationOnly"]
1075
1102
  )
1076
1103
 
1077
1104
  @ManualActivationOnly.setter
@@ -1202,15 +1229,66 @@ class RBXInstance:
1202
1229
  (vec.X, vec.Y, vec.Z)
1203
1230
  )
1204
1231
 
1232
+ # blureffect props #
1233
+ @property
1234
+ def BlurSize(self):
1235
+ if self.ClassName != "BlurEffect":
1236
+ return None
1237
+ return self.memory_module.read_float(
1238
+ self.raw_address + Offsets["BlurEffect"]["Size"]
1239
+ )
1240
+
1241
+ @BlurSize.setter
1242
+ def BlurSize(self, value: float):
1243
+ if self.ClassName != "BlurEffect":
1244
+ raise AttributeError("BlurSize is only available on BlurEffect instances.")
1245
+ self._ensure_writable()
1246
+ self.memory_module.write_float(
1247
+ self.raw_address + Offsets["BlurEffect"]["Size"],
1248
+ float(value)
1249
+ )
1250
+
1251
+ # colorgradingeffect props #
1252
+ @property
1253
+ def TonemapperPreset(self):
1254
+ if self.ClassName != "ColorGradingEffect":
1255
+ return None
1256
+ return self.memory_module.read_int(
1257
+ self.raw_address + Offsets["ColorGradingEffect"]["TonemapperPreset"]
1258
+ )
1259
+
1260
+ @TonemapperPreset.setter
1261
+ def TonemapperPreset(self, value: int):
1262
+ if self.ClassName != "ColorGradingEffect":
1263
+ raise AttributeError("TonemapperPreset is only available on ColorGradingEffect instances.")
1264
+ self._ensure_writable()
1265
+ self.memory_module.write_int(
1266
+ self.raw_address + Offsets["ColorGradingEffect"]["TonemapperPreset"],
1267
+ int(value)
1268
+ )
1269
+
1270
+ # seat props #
1271
+ @property
1272
+ def Occupant(self):
1273
+ if self.ClassName != "Seat":
1274
+ return None
1275
+ ptr = self.memory_module.get_pointer(
1276
+ self.raw_address,
1277
+ seat_offsets["Occupant"]
1278
+ )
1279
+ if ptr == 0:
1280
+ return None
1281
+ return RBXInstance(ptr, self.memory_module)
1205
1282
 
1206
1283
  # charactermesh props #
1207
1284
  @property
1208
1285
  def BaseTextureId(self):
1209
1286
  if self.ClassName != "CharacterMesh":
1210
1287
  return None
1211
- return self.memory_module.read_long(
1212
- self.raw_address,
1213
- charactermesh_offsets["BaseTextureId"]
1288
+ offset = charactermesh_offsets.get("BaseTextureId", 0)
1289
+ if offset == 0: return None
1290
+ return self.memory_module.read_string(
1291
+ self.raw_address + offset
1214
1292
  )
1215
1293
 
1216
1294
  @BaseTextureId.setter
@@ -1218,18 +1296,21 @@ class RBXInstance:
1218
1296
  if self.ClassName != "CharacterMesh":
1219
1297
  raise AttributeError("BaseTextureId is only available on CharacterMesh instances.")
1220
1298
  self._ensure_writable()
1221
- self.memory_module.write_long(
1222
- self.raw_address + charactermesh_offsets["BaseTextureId"],
1223
- int(value)
1299
+ offset = charactermesh_offsets.get("BaseTextureId", 0)
1300
+ if offset == 0: return
1301
+ self.memory_module.write_string(
1302
+ self.raw_address + offset,
1303
+ str(value)
1224
1304
  )
1225
1305
 
1226
1306
  @property
1227
1307
  def OverlayTextureId(self):
1228
1308
  if self.ClassName != "CharacterMesh":
1229
1309
  return None
1230
- return self.memory_module.read_long(
1231
- self.raw_address,
1232
- charactermesh_offsets["OverlayTextureId"]
1310
+ offset = charactermesh_offsets.get("OverlayTextureId", 0)
1311
+ if offset == 0: return None
1312
+ return self.memory_module.read_string(
1313
+ self.raw_address + offset
1233
1314
  )
1234
1315
 
1235
1316
  @OverlayTextureId.setter
@@ -1237,9 +1318,11 @@ class RBXInstance:
1237
1318
  if self.ClassName != "CharacterMesh":
1238
1319
  raise AttributeError("OverlayTextureId is only available on CharacterMesh instances.")
1239
1320
  self._ensure_writable()
1240
- self.memory_module.write_long(
1241
- self.raw_address + charactermesh_offsets["OverlayTextureId"],
1242
- int(value)
1321
+ offset = charactermesh_offsets.get("OverlayTextureId", 0)
1322
+ if offset == 0: return
1323
+ self.memory_module.write_string(
1324
+ self.raw_address + offset,
1325
+ str(value)
1243
1326
  )
1244
1327
 
1245
1328
  @property
@@ -1255,9 +1338,10 @@ class RBXInstance:
1255
1338
  def CharacterMeshId(self):
1256
1339
  if self.ClassName != "CharacterMesh":
1257
1340
  return None
1258
- return self.memory_module.read_long(
1259
- self.raw_address,
1260
- charactermesh_offsets["MeshId"]
1341
+ offset = charactermesh_offsets.get("MeshId", 0)
1342
+ if offset == 0: return None
1343
+ return self.memory_module.read_string(
1344
+ self.raw_address + offset
1261
1345
  )
1262
1346
 
1263
1347
  # clothing props (Shirt/Pants) #
@@ -1735,6 +1819,272 @@ class RBXInstance:
1735
1819
  bool(value)
1736
1820
  )
1737
1821
 
1822
+ @property
1823
+ def AutoJumpEnabled(self):
1824
+ if self.ClassName != "Humanoid":
1825
+ return None
1826
+ return self.memory_module.read_bool(
1827
+ self.raw_address,
1828
+ humanoid_offsets["AutoJumpEnabled"]
1829
+ )
1830
+
1831
+ @AutoJumpEnabled.setter
1832
+ def AutoJumpEnabled(self, value: bool):
1833
+ if self.ClassName != "Humanoid":
1834
+ raise AttributeError("AutoJumpEnabled is only available on Humanoid instances.")
1835
+ self._ensure_writable()
1836
+ self.memory_module.write_bool(
1837
+ self.raw_address + humanoid_offsets["AutoJumpEnabled"],
1838
+ bool(value)
1839
+ )
1840
+
1841
+ @property
1842
+ def BreakJointsOnDeath(self):
1843
+ if self.ClassName != "Humanoid":
1844
+ return None
1845
+ return self.memory_module.read_bool(
1846
+ self.raw_address,
1847
+ humanoid_offsets["BreakJointsOnDeath"]
1848
+ )
1849
+
1850
+ @BreakJointsOnDeath.setter
1851
+ def BreakJointsOnDeath(self, value: bool):
1852
+ if self.ClassName != "Humanoid":
1853
+ raise AttributeError("BreakJointsOnDeath is only available on Humanoid instances.")
1854
+ self._ensure_writable()
1855
+ self.memory_module.write_bool(
1856
+ self.raw_address + humanoid_offsets["BreakJointsOnDeath"],
1857
+ bool(value)
1858
+ )
1859
+
1860
+ @property
1861
+ def CameraOffset(self):
1862
+ if self.ClassName != "Humanoid":
1863
+ return None
1864
+ data = self.memory_module.read_floats(
1865
+ self.raw_address + humanoid_offsets["CameraOffset"],
1866
+ 3
1867
+ )
1868
+ return Vector3(*data)
1869
+
1870
+ @CameraOffset.setter
1871
+ def CameraOffset(self, value):
1872
+ if self.ClassName != "Humanoid":
1873
+ raise AttributeError("CameraOffset is only available on Humanoid instances.")
1874
+ self._ensure_writable()
1875
+ vec = self._as_vector3(value, "CameraOffset")
1876
+ self.memory_module.write_floats(
1877
+ self.raw_address + humanoid_offsets["CameraOffset"],
1878
+ (vec.X, vec.Y, vec.Z)
1879
+ )
1880
+
1881
+ @property
1882
+ def DisplayName(self):
1883
+ """Humanoid display name label. Use PlayerClass.DisplayName for the player display name."""
1884
+ if self.ClassName != "Humanoid":
1885
+ return None
1886
+ return self.memory_module.read_string(
1887
+ self.raw_address,
1888
+ humanoid_offsets["DisplayName"]
1889
+ )
1890
+
1891
+ @property
1892
+ def EvaluateStateMachine(self):
1893
+ if self.ClassName != "Humanoid":
1894
+ return None
1895
+ return self.memory_module.read_bool(
1896
+ self.raw_address,
1897
+ humanoid_offsets["EvaluateStateMachine"]
1898
+ )
1899
+
1900
+ @EvaluateStateMachine.setter
1901
+ def EvaluateStateMachine(self, value: bool):
1902
+ if self.ClassName != "Humanoid":
1903
+ raise AttributeError("EvaluateStateMachine is only available on Humanoid instances.")
1904
+ self._ensure_writable()
1905
+ self.memory_module.write_bool(
1906
+ self.raw_address + humanoid_offsets["EvaluateStateMachine"],
1907
+ bool(value)
1908
+ )
1909
+
1910
+ @property
1911
+ def HealthDisplayDistance(self):
1912
+ if self.ClassName != "Humanoid":
1913
+ return None
1914
+ return self.memory_module.read_float(
1915
+ self.raw_address,
1916
+ humanoid_offsets["HealthDisplayDistance"]
1917
+ )
1918
+
1919
+ @HealthDisplayDistance.setter
1920
+ def HealthDisplayDistance(self, value: float):
1921
+ if self.ClassName != "Humanoid":
1922
+ raise AttributeError("HealthDisplayDistance is only available on Humanoid instances.")
1923
+ self._ensure_writable()
1924
+ self.memory_module.write_float(
1925
+ self.raw_address + humanoid_offsets["HealthDisplayDistance"],
1926
+ float(value)
1927
+ )
1928
+
1929
+ @property
1930
+ def HealthDisplayType(self):
1931
+ if self.ClassName != "Humanoid":
1932
+ return None
1933
+ return self.memory_module.read_int(
1934
+ self.raw_address,
1935
+ humanoid_offsets["HealthDisplayType"]
1936
+ )
1937
+
1938
+ @HealthDisplayType.setter
1939
+ def HealthDisplayType(self, value: int):
1940
+ if self.ClassName != "Humanoid":
1941
+ raise AttributeError("HealthDisplayType is only available on Humanoid instances.")
1942
+ self._ensure_writable()
1943
+ self.memory_module.write_int(
1944
+ self.raw_address + humanoid_offsets["HealthDisplayType"],
1945
+ int(value)
1946
+ )
1947
+
1948
+ @property
1949
+ def HumanoidRootPart(self):
1950
+ if self.ClassName != "Humanoid":
1951
+ return None
1952
+ ptr = self.memory_module.get_pointer(
1953
+ self.raw_address,
1954
+ humanoid_offsets["HumanoidRootPart"]
1955
+ )
1956
+ if ptr == 0:
1957
+ return None
1958
+ return RBXInstance(ptr, self.memory_module)
1959
+
1960
+ @property
1961
+ def NameDisplayDistance(self):
1962
+ if self.ClassName != "Humanoid":
1963
+ return None
1964
+ return self.memory_module.read_float(
1965
+ self.raw_address,
1966
+ humanoid_offsets["NameDisplayDistance"]
1967
+ )
1968
+
1969
+ @NameDisplayDistance.setter
1970
+ def NameDisplayDistance(self, value: float):
1971
+ if self.ClassName != "Humanoid":
1972
+ raise AttributeError("NameDisplayDistance is only available on Humanoid instances.")
1973
+ self._ensure_writable()
1974
+ self.memory_module.write_float(
1975
+ self.raw_address + humanoid_offsets["NameDisplayDistance"],
1976
+ float(value)
1977
+ )
1978
+
1979
+ @property
1980
+ def NameOcclusion(self):
1981
+ if self.ClassName != "Humanoid":
1982
+ return None
1983
+ return self.memory_module.read_int(
1984
+ self.raw_address,
1985
+ humanoid_offsets["NameOcclusion"]
1986
+ )
1987
+
1988
+ @NameOcclusion.setter
1989
+ def NameOcclusion(self, value: int):
1990
+ if self.ClassName != "Humanoid":
1991
+ raise AttributeError("NameOcclusion is only available on Humanoid instances.")
1992
+ self._ensure_writable()
1993
+ self.memory_module.write_int(
1994
+ self.raw_address + humanoid_offsets["NameOcclusion"],
1995
+ int(value)
1996
+ )
1997
+
1998
+ @property
1999
+ def PlatformStand(self):
2000
+ if self.ClassName != "Humanoid":
2001
+ return None
2002
+ return self.memory_module.read_bool(
2003
+ self.raw_address,
2004
+ humanoid_offsets["PlatformStand"]
2005
+ )
2006
+
2007
+ @PlatformStand.setter
2008
+ def PlatformStand(self, value: bool):
2009
+ if self.ClassName != "Humanoid":
2010
+ raise AttributeError("PlatformStand is only available on Humanoid instances.")
2011
+ self._ensure_writable()
2012
+ self.memory_module.write_bool(
2013
+ self.raw_address + humanoid_offsets["PlatformStand"],
2014
+ bool(value)
2015
+ )
2016
+
2017
+ @property
2018
+ def RequiresNeck(self):
2019
+ if self.ClassName != "Humanoid":
2020
+ return None
2021
+ return self.memory_module.read_bool(
2022
+ self.raw_address,
2023
+ humanoid_offsets["RequiresNeck"]
2024
+ )
2025
+
2026
+ @RequiresNeck.setter
2027
+ def RequiresNeck(self, value: bool):
2028
+ if self.ClassName != "Humanoid":
2029
+ raise AttributeError("RequiresNeck is only available on Humanoid instances.")
2030
+ self._ensure_writable()
2031
+ self.memory_module.write_bool(
2032
+ self.raw_address + humanoid_offsets["RequiresNeck"],
2033
+ bool(value)
2034
+ )
2035
+
2036
+ @property
2037
+ def SeatPart(self):
2038
+ if self.ClassName != "Humanoid":
2039
+ return None
2040
+ ptr = self.memory_module.get_pointer(
2041
+ self.raw_address,
2042
+ humanoid_offsets["SeatPart"]
2043
+ )
2044
+ if ptr == 0:
2045
+ return None
2046
+ return RBXInstance(ptr, self.memory_module)
2047
+
2048
+ @property
2049
+ def Sit(self):
2050
+ if self.ClassName != "Humanoid":
2051
+ return None
2052
+ return self.memory_module.read_bool(
2053
+ self.raw_address,
2054
+ humanoid_offsets["Sit"]
2055
+ )
2056
+
2057
+ @Sit.setter
2058
+ def Sit(self, value: bool):
2059
+ if self.ClassName != "Humanoid":
2060
+ raise AttributeError("Sit is only available on Humanoid instances.")
2061
+ self._ensure_writable()
2062
+ self.memory_module.write_bool(
2063
+ self.raw_address + humanoid_offsets["Sit"],
2064
+ bool(value)
2065
+ )
2066
+
2067
+ @property
2068
+ def TargetPoint(self):
2069
+ if self.ClassName != "Humanoid":
2070
+ return None
2071
+ data = self.memory_module.read_floats(
2072
+ self.raw_address + humanoid_offsets["TargetPoint"],
2073
+ 3
2074
+ )
2075
+ return Vector3(*data)
2076
+
2077
+ @TargetPoint.setter
2078
+ def TargetPoint(self, value):
2079
+ if self.ClassName != "Humanoid":
2080
+ raise AttributeError("TargetPoint is only available on Humanoid instances.")
2081
+ self._ensure_writable()
2082
+ vec = self._as_vector3(value, "TargetPoint")
2083
+ self.memory_module.write_floats(
2084
+ self.raw_address + humanoid_offsets["TargetPoint"],
2085
+ (vec.X, vec.Y, vec.Z)
2086
+ )
2087
+
1738
2088
  @property
1739
2089
  def HumanoidState(self):
1740
2090
  if self.ClassName != "Humanoid":
@@ -2959,6 +3309,93 @@ class WorkspaceService(ServiceBase):
2959
3309
  float(value)
2960
3310
  )
2961
3311
 
3312
+ @property
3313
+ def FallenPartsDestroyHeight(self):
3314
+ if self.failed:
3315
+ return 0.0
3316
+
3317
+ World = self.memory_module.get_pointer(
3318
+ self.instance.raw_address,
3319
+ self.offset_base["World"]
3320
+ )
3321
+
3322
+ return self.memory_module.read_float(
3323
+ World,
3324
+ world_offsets["FallenPartsDestroyHeight"]
3325
+ )
3326
+
3327
+ @FallenPartsDestroyHeight.setter
3328
+ def FallenPartsDestroyHeight(self, value: float):
3329
+ self._ensure_writable()
3330
+
3331
+ World = self.memory_module.get_pointer(
3332
+ self.instance.raw_address,
3333
+ self.offset_base["World"]
3334
+ )
3335
+
3336
+ self.memory_module.write_float(
3337
+ World + world_offsets["FallenPartsDestroyHeight"],
3338
+ float(value)
3339
+ )
3340
+
3341
+ def _get_air_properties(self):
3342
+ """Returns the AirProperties pointer from World."""
3343
+ World = self.memory_module.get_pointer(
3344
+ self.instance.raw_address,
3345
+ self.offset_base["World"]
3346
+ )
3347
+ return self.memory_module.get_pointer(
3348
+ World,
3349
+ world_offsets["AirProperties"]
3350
+ )
3351
+
3352
+ @property
3353
+ def AirDensity(self):
3354
+ if self.failed:
3355
+ return 0.0
3356
+
3357
+ air = self._get_air_properties()
3358
+ return self.memory_module.read_float(
3359
+ air,
3360
+ air_properties_offsets["AirDensity"]
3361
+ )
3362
+
3363
+ @AirDensity.setter
3364
+ def AirDensity(self, value: float):
3365
+ self._ensure_writable()
3366
+ air = self._get_air_properties()
3367
+ self.memory_module.write_float(
3368
+ air + air_properties_offsets["AirDensity"],
3369
+ float(value)
3370
+ )
3371
+
3372
+ @property
3373
+ def GlobalWind(self):
3374
+ if self.failed:
3375
+ return None
3376
+
3377
+ air = self._get_air_properties()
3378
+ data = self.memory_module.read_floats(
3379
+ air + air_properties_offsets["GlobalWind"],
3380
+ 3
3381
+ )
3382
+ return Vector3(*data)
3383
+
3384
+ @GlobalWind.setter
3385
+ def GlobalWind(self, value):
3386
+ self._ensure_writable()
3387
+ if isinstance(value, Vector3):
3388
+ v = value
3389
+ elif isinstance(value, (tuple, list)) and len(value) == 3:
3390
+ v = Vector3(*value)
3391
+ else:
3392
+ raise TypeError("GlobalWind must be a Vector3 or iterable of 3 numbers.")
3393
+ air = self._get_air_properties()
3394
+ self.memory_module.write_floats(
3395
+ air + air_properties_offsets["GlobalWind"],
3396
+ (v.X, v.Y, v.Z)
3397
+ )
3398
+
2962
3399
  class LightingService(ServiceBase):
2963
3400
  def __init__(self, memory_module, game: DataModel):
2964
3401
  super().__init__()
@@ -3230,6 +3667,23 @@ class LightingService(ServiceBase):
3230
3667
  float(value)
3231
3668
  )
3232
3669
 
3670
+ @property
3671
+ def GlobalShadows(self):
3672
+ if self.failed: return None
3673
+ return self.memory_module.read_bool(
3674
+ self.instance.raw_address,
3675
+ self.offset_base["GlobalShadows"]
3676
+ )
3677
+
3678
+ @GlobalShadows.setter
3679
+ def GlobalShadows(self, value: bool):
3680
+ if self.failed: return
3681
+ self._ensure_writable()
3682
+ self.memory_module.write_bool(
3683
+ self.instance.raw_address + self.offset_base["GlobalShadows"],
3684
+ bool(value)
3685
+ )
3686
+
3233
3687
  class InputObject(RBXInstance):
3234
3688
  def __init__(self, raw_address: int, memory_module):
3235
3689
  super().__init__(raw_address, memory_module)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robloxmemoryapi
3
- Version: 0.2.5
3
+ Version: 0.2.6
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