I want to find a way to identify if an Instance Has Certain Properties, for example:
Rather than doing this :
for i,v in pairs(script.Parent:GetDescendants()) do
if v:IsA("Part") or v:IsA("MeshPart") or v:IsA("UnionOperation") or v:IsA("Decal") then
-- Do Something --
end
end
Maybe i can just check if an Instance has Properties Called Transparency, if it has then set the transparency to 1
i tried to use something like
if v.Transparency ~= nil then
-- Do Something--
end
if v.Transparency then
-- Do Something
end
but it didnt work, so maybe someone know how to check if an Instance has Certain Properties. if you do know how to do this, Please Reply!
Perhaps a way to do this is, using pcall. You can do some hacky trickery, by calling a function that’s supposed to just do object.Transparency, if Transparency didn’t exist, pcall will return false (because the function errored), if it existed it returns true (because it functioned correctly).
local function hasProperty(object, prop)
local t = object[prop] --this is just done to check if the property existed, if it did nothing would happen, if it didn't an error will pop, the object[prop] is a different way of writing object.prop, (object.Transparency or object["Transparency"])
end
for i,v in pairs(script.Parent:GetDescendants()) do
local success = pcall(function() hasProperty(v, "Transparency") end)) --this is the part checking if the transparency existed, make sure you write the property's name correctly
if success then
--the rest of your code
end
end
All though I do think that this is quite costly, and you can simply reduce your original code by this, since Unions, Mesh Parts, Parts… All have one common class which is the "BasePart" class. (the decal class gotta say though)
if v:IsA("BasePart") or v:IsA("Decal") then
-- Do Something --
end
If you need to run this multiple times, you could probably also place these objects in to their own tables bas based on their class. Instead of doing GetDescendants()
Instances like Part and Decal both have a Transparency property. I want to set them. I have no idea how to test for the existence of this field, but it seems pretty basic.
Like the answer above concedes, I have no way of distinguishing a child Transparency instance from a property with Part[“Transparency”], except maybe if I also check Part[“Transparency”].Parent = nil. Seems convoluted.
local Knit = require(game:GetService("ReplicatedStorage"):WaitForChild("Knit"))
local Players = game:GetService("Players")
local DataStructure = require(script.DataStructure)
local Promise = require(Knit.Util.Promise)
local TableUtil = require(Knit.Util.TableUtil)
local PlayerService = Knit.CreateService {
Name = "PlayerService";
Client = {};
}
local PlayersTable = {}
function ObjectHasPropertyPromise(object:Instance, prop)
return Promise.new(function(resolve, reject, onCancel)
local t = object[prop]
resolve()
end)
end
local function PlayerAdded(Player:Player)
if PlayersTable[Player] == nil then
local PlayerTable = TableUtil.Copy(DataStructure)
for Key, Value in pairs(DataStructure) do
ObjectHasPropertyPromise(Player, Key):Then(function(Value)
PlayerTable[Key] = Player[Key]
end):Catch(function()
PlayerTable[Key] = Value
end)
end
if Player then
PlayersTable[Player] = PlayerTable
print(PlayersTable[Player])
end
end
end
function PlayerService:KnitInit()
Players.PlayerAdded:Connect(PlayerAdded)
for _, Player in pairs(Players:GetPlayers()) do
task.spawn(function()
PlayerAdded(Player)
end)
end
end
return PlayerService