From 22928dd0fc513a57dbddb547ecce0282a2e575e0 Mon Sep 17 00:00:00 2001 From: IvanTheScript <122665922+IvanTheProtogen@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:49:03 +0300 Subject: [PATCH 1/4] Update main.lua --- main.lua | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/main.lua b/main.lua index 9fa6385..5d28fea 100644 --- a/main.lua +++ b/main.lua @@ -1,6 +1,71 @@ -local Players = game:GetService("Players") -local LocalPlayer = Players.LocalPlayer -local Event = LocalPlayer.Character:FindFirstChild("ServerEndpoint", true) or LocalPlayer:FindFirstChild("ServerEndpoint", true) +local HttpService = game:GetService("Players") +local LocalPlayer = game:GetService("Players").LocalPlayer +local Event = { + InvokeServer = function(_, ...) + local Remote + repeat + Remote = LocalPlayer.Character:FindFirstChild("ServerEndpoint", true) or LocalPlayer:FindFirstChild("ServerEndpoint", true) + if not Remote then + task.wait(0.1) + end + until Remote + return Remote:InvokeServer(...) + end +} + +local api +local getproperties = getproperties or function(Object) + -- Fetch API + if not api then + local success + repeat + success,api = pcall(game.HttpGet, game, "http://github.com/MaximumADHD/Roblox-Client-Tracker/raw/roblox/Full-API-Dump.json") + if success and api then + -- Check if parsable via JSON + success,api = pcall(HttpService.JSONDecode, HttpService, api) + if success and api then + -- Validate structure + xpcall(function() + assert(type(api.Classes[1]) == "table") + end, function() + success = false + task.wait() + end) + else + success = false + task.wait() + end + else + task.wait() + end + until success and api + end + -- Main part + local properties = {} + for _,class in next,api.Classes do + -- Find class structure + if class.Name == Object.ClassName then + for __,member in next,class.Members do + for ___=1,1 do + -- Validate member info + if member.MemberType ~= "Property" then break end + if member.Security.Read ~= "None" then break end + if member.Security.Write ~= "None" then break end + if member.Tags then + if table.find(member.Tags, "ReadOnly") then break end + if table.find(member.Tags, "NotScriptable") then break end + end + properties[member.Name] = Object[member.Name] + end + end + end + end + return { -- Fallback + Name = Object.Name, + Parent = Object.Parent, + Archivable = Object.Archivable + } +end local ClassNames = { Part = "Normal", @@ -65,7 +130,7 @@ function F3X.Object(Object) end function F3X.Edit(Object, Properties) - spawn(function() + task.spawn(function() if Object:IsA("BasePart") then for Property, Value in pairs(Properties) do if Edit[Property] then From 5550d0d3930b4adec5ac988b91a4bcf9dc3bfa8b Mon Sep 17 00:00:00 2001 From: IvanTheScript <122665922+IvanTheProtogen@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:58:00 +0300 Subject: [PATCH 2/4] Update main.lua --- main.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/main.lua b/main.lua index 5d28fea..245b846 100644 --- a/main.lua +++ b/main.lua @@ -14,7 +14,7 @@ local Event = { } local api -local getproperties = getproperties or function(Object) +local getproperties = getproperties or function(Object) -- Fallback to custom `getproperties` -- Fetch API if not api then local success @@ -174,6 +174,8 @@ function F3X.Edit(Object, Properties) end end end) -end +end + +task.spawn(pcall, getproperties, game) -- Load API asynchronously return F3X From 7bfb709ea17db749b417368d73162e99f27b7b67 Mon Sep 17 00:00:00 2001 From: IvanTheScript <122665922+IvanTheProtogen@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:58:29 +0300 Subject: [PATCH 3/4] Update main.lua --- main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.lua b/main.lua index 245b846..62297d2 100644 --- a/main.lua +++ b/main.lua @@ -1,4 +1,4 @@ -local HttpService = game:GetService("Players") +local HttpService = game:GetService("HttpService") local LocalPlayer = game:GetService("Players").LocalPlayer local Event = { InvokeServer = function(_, ...) From 9f58bef9b712c7f6e1ac4ce4a0cddd9e3522b45e Mon Sep 17 00:00:00 2001 From: IvanTheScript <122665922+IvanTheProtogen@users.noreply.github.com> Date: Mon, 7 Jul 2025 17:39:44 +0300 Subject: [PATCH 4/4] Update main.lua --- main.lua | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/main.lua b/main.lua index 62297d2..6d401b6 100644 --- a/main.lua +++ b/main.lua @@ -132,30 +132,30 @@ end function F3X.Edit(Object, Properties) task.spawn(function() if Object:IsA("BasePart") then - for Property, Value in pairs(Properties) do - if Edit[Property] then - Property, Value = Edit[Property](Value) - end + for Property, Value in pairs(Properties) do + task.spawn(function() + if Edit[Property] then + Property, Value = Edit[Property](Value) + end - local Sync = SyncProperties[Property] + local Sync = SyncProperties[Property] - if Sync == "SyncSurface" then - Event:InvokeServer(Sync, {{Part = Object, Surfaces = {[Property] = Value}}}) - elseif Sync == "SetName" or Sync == "SetParent" then - Event:InvokeServer(Sync, {Object}, Value) - elseif Sync == "SyncShape" then - F3X.Object(Object):AddMesh().MeshType = tostring(Value) == "Ball" and "Sphere" or Value - elseif Sync == "SyncTexture" then - if Object.ClassName == "Decal" then - Event:InvokeServer(Sync, {{Part = Object, TextureType = "Decal", [Property] = Value}}) - elseif Object.ClassName == "Texture" then - Event:InvokeServer(Sync, {{Part = Object, TextureType = "Texture", [Property] = Value}}) - end - else - pcall(function() + if Sync == "SyncSurface" then + Event:InvokeServer(Sync, {{Part = Object, Surfaces = {[Property] = Value}}}) + elseif Sync == "SetName" or Sync == "SetParent" then + Event:InvokeServer(Sync, {Object}, Value) + elseif Sync == "SyncShape" then + F3X.Object(Object):AddMesh().MeshType = tostring(Value) == "Ball" and "Sphere" or Value + elseif Sync == "SyncTexture" then + if Object.ClassName == "Decal" then + Event:InvokeServer(Sync, {{Part = Object, TextureType = "Decal", [Property] = Value}}) + elseif Object.ClassName == "Texture" then + Event:InvokeServer(Sync, {{Part = Object, TextureType = "Texture", [Property] = Value}}) + end + else Event:InvokeServer(Sync, {{Part = Object, [Property] = Value}}) - end) - end + end + end) end else Properties.Part = Object.Parent @@ -176,6 +176,8 @@ function F3X.Edit(Object, Properties) end) end -task.spawn(pcall, getproperties, game) -- Load API asynchronously +F3X.getproperties = getproperties -- Miscellaneous + +task.spawn(pcall, getproperties, game) -- Preload API return F3X