User:ArceusInator/Sandbox
From Legacy Roblox Wiki
Jump to navigationJump to search
Some useful functions...
--- shared:RealType( v ) function shared:RealType(v) local libraries = {Axes, BrickColor, CFrame, Color3, Faces, Ray, Region3, UDim, UDim2, Vector2, Vector3, Instance, math, table, string, coroutine} if type(v) == "userdata" then for _,i in pairs(libraries) do if v == i then return string.lower(tostring(i)) end end if pcall(function() i = v:IsA("Instance") end) then return "object" elseif pcall(function() x = v.X end) then if pcall(function() z = v.Z end) then if Axes.new(v.X, v.Y, v.Z) == v then return "axes" elseif pcall(function() comp = v:components() end) then return "coordinateframe" else return "vector3" end elseif Vector2.new(v.X, v.Y) == v then return "vector2" elseif pcall(function() xo = v.X.Offset end) then return "universaldimension2" end elseif pcall(function() r = v.r end) then if BrickColor.new(v.r, v.g, v.b) == v then return "brickcolor" elseif Color3.new(v.r, v.g, v.b) == v then return "color3" end elseif pcall(function() top = v.Top) then if Faces.new(v.Back, v.Bottom, v.Front, v.Left, v.Right, v.Top) == v then return "faces" end elseif pcall(function() connect = v.connected end) then return "rbxscriptconnection" elseif pcall(function() conn = v:connect(function()end)end) then return "rbxscriptsignal" elseif pcall(function() origin = v.Origin end) then return "ray" elseif pcall(function() cf = v.CFrame end) then return "region3" elseif pcall(function() o = v.Offset end) then return "universaldimension" end end return type(v) end --- shared:ToupleToTable( ... ) function shared:ToupleToTable(...) assert(loadstring("return {" .. ... .. "}"))() end function r(v) -- for me return shared:RealType(v) end --- math.curt(v) function math.curt(v) if r(v) ~= "number" then error("Number expected",1) end return v^(1/3) end function t(...) -- for me return shared:ToupleToTable(...) end --- math.add(...) function math.add(...) local fin = 0 for i,v in pairs(t(...)) do if r(v) ~= "number" then error("Number expected",1) end fin = fin + v end return fin end --- math.sub(...) function math.sub(...) local fin = 0 for i,v in pairs(t(...)) do if r(v) ~= "number" then error("Number expected",1) end fin = fin - v end return fin end --- math.factorial(v) function math.factorial(v) local fin = v for i=1, v do if r(v) ~= "number" then error("Number expected",1) end if i >= v or v - i <= 0 then break end fin = fin * (v - i) end return fin end --- math.mul(...) function math.mul(...) local fin = 0 for i,v in pairs(t(...)) do if r(v) ~= "number" then error("Number expected",1) end fin = fin * v end return fin end --- math.div(...) function math.div(...) local fin = 0 for i,v in pairs(t(...)) do if r(v) ~= "number" then error("Number expected",1) end fin = fin / v end return fin end --- string.concat(...) function string.concat(...) local fin = "" for i,v in pairs(t(...)) do if r(v) ~= "string" then error("String expected",1) end fin = fin .. tostring(v) end return fin end --- math.concat(...) function math.concat(...) local fin = "" for i,v in pairs(t(...)) do if r(v) ~= "number" and r(v) ~= "string" then error("String or Number expected",1) end fin = fin .. tostring(v) end return fin end
CustomEvent library
This library _should_ allow you to create, fire, connect, etc. custom events.
local g = {} local events = { -- eventName = { firstConnections, connections, lastConnections } } function g:CreateEvent(eventName) if not eventName then error("String expected for eventName when calling CreateEvent",1) end if events[tostring(eventName)] ~= nil then error("There is already a customevent with name " .. '"' .. tostring(eventName) .. '".',1) end events[tostring(eventName)] = {{},{},{}} function events[tostring(eventName)]:connect(func) local index = #events[2]+1 local r = {} function r:disconnect() events[2][index] = nil end r.connected = false events[2][#events[2]+1] = {func,r} return r end function events[tostring(eventName)]:connectFirst(func) local index = #events[1]+1 local r = {} function r:disconnect() events[1][index] = nil end r.connected = false events[1][#events[1]+1] = {func,r} return r end function events[tostring(eventName)]:connectLast(func) local index = #events[3]+1 local r = {} function r:disconnect() events[3][index] = nil end r.connected = false events[3][#events[3]+1] = {func,r} return r end function events[tostring(eventName)]:fire() for i,v in pairs(events[1]) do v[2].connected=true v[1]() v[2].connected=false end for i,v in pairs(events[2]) do v[2].connected=true v[1]() v[2].connected=false end for i,v in pairs(events[3]) do v[2].connected=true v[1]() v[2].connected=false end end end function g:GetEvent(eventName) return events[tostring(eventName)] or nil end return g -- This may not work yet...