I’m designing a plugin that’ll facilitate the place building process on Roblox. This plugin is to interact with Studio’s Selection
service. This is the code I implemented to account for individual additions and removals:
function addSel(p)
--Code your desires here.
end
function removeSel(p)
--Code your desires here.
end
local studioSels={}
game.Selection.SelectionChanged:connect(function()
local logs={}
local old=studioSels
studioSels=game.Selection:Get()
for i,p1 in next,studioSels do
local b='add'
for I,p2 in next,old do
if p1==p2 then
b='keep'
break
end
end
logs[p1]=b
end
for i,p in next,old do
if not logs[p] then
logs[p]='remove'
end
end
for p,l in next,logs do
if l=='remove' then
addSel(p)
elseif l=='add' then
removeSel(p)
end
end
end)
Not only done this piece of code iterate over the selection table through a nested loop to check for additions, but it also iterates again just to check for removals. In addition, I had to create a proxy table to keep a log of which elements got added and removed. This is disastrous for builders who rely on intricate details; we have use cases where hundreds or even thousands of parts are selected at a time. I’m also required to evaluate both this code snippet’s efficiency and correctness.
Since Roblox’s Selection
API probably works directly with the underlying C++, I believe the Studio team have the capability to implement these events:
game.Selection.SelectionAdded:connect(addSel)
game.Selection.SelectionRemoved:connect(removeSel)
Or if you’re inclined to modify the pre-existing SelectionChanged
method:
game.Selection.SelectionChanged:connect(function(addT,remT)
for i,p in next,addT do
addSel(p)
end
for i,p in next,remT do
removeSel(p)
end
end)
or:
game.Selection.SelectionChanged:connect(function(parts)
for i,p in next,parts.Add do
addSel(p)
end
for i,p in next,parts.Remove do
removeSel(p)
end
end)