BlinkingStars

MT_API_Luau

Jun 6th, 2023
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.16 KB | Gaming | 0 0
  1. if getgenv().MTAPIMutex ~= nil then
  2.     return
  3. end
  4. local is_protosmasher_caller = is_protosmasher_caller or checkcaller
  5. local get_namecall_method = get_namecall_method or getnamecallmethod
  6. local protect_function = protect_function or newcclosure or function(...)
  7.     return ...
  8. end
  9. local type, assert = type, assert
  10. local metatable = getrawmetatable(game);
  11. (make_writeable or setreadonly or set_readonly)(metatable, false)
  12.  
  13. local d = {}
  14. local e = {}
  15. local f = {}
  16. local g = {}
  17. local h = {}
  18. local i = {}
  19. local j = {}
  20. local k = {}
  21. local __index = metatable.__index
  22. local __newindex = metatable.__newindex
  23. local __namecall = metatable.__namecall
  24. metatable.__index = protect_function(function(self, index)
  25.     if not is_protosmasher_caller() then
  26.         if d[self] and d[self][index] then
  27.             local u = d[self][index]
  28.             return u.IsCallback and u.Value(self) or u.Value
  29.         end
  30.         if g[index] then
  31.             local v = g[index]
  32.             return v.IsCallback and v.Value(self) or v.Value
  33.         end
  34.         if j[self] and j[self][index] then
  35.             return k[self][index]
  36.         end
  37.     end
  38.     return __index(self, index)
  39. end)
  40. metatable.__newindex = protect_function(function(self, index, value)
  41.     if not is_protosmasher_caller() then
  42.         if e[self] and e[self][index] then
  43.             local z = e[self][index]
  44.             return z.Callback and z.Callback(self, value) or nil
  45.         end;
  46.         if h[index] then
  47.             local A = h[index]
  48.             return A.Callback and A.Callback(self, value) or nil
  49.         end
  50.         if j[self] and j[self][index] then
  51.             local type = type(value)
  52.             local B = j[self][index]
  53.             if type ~= B["Type"] then
  54.                 error("bad argument #3 to '".. index .."' ("..B["Type"].." expected, got ".. type ..")")
  55.             end
  56.             k[self][index] = value
  57.             return
  58.         end
  59.     end
  60.     return __newindex(self, index, value)
  61. end)
  62. metatable.__namecall = protect_function(function(self, ...)
  63.     local E = {...}
  64.     local F = get_namecall_method()
  65.     if is_protosmasher_caller() then
  66.         if F == "AddGetHook" then
  67.             assert(#E > 0, "mt-api: Invalid argument count")
  68.             local G = E[1]
  69.             local H = E[2]
  70.             local I = E[3]
  71.             assert(type(G) == "string", "mt-api: Invalid hook type")
  72.             d[self] = d[self] or {}
  73.             if I then
  74.                 assert(type(H) == "function", "mt-api: Invalid callback function")
  75.             end
  76.             d[self][G] = {
  77.                 Value = H,
  78.                 IsCallback = I
  79.             }
  80.             local J = function()
  81.                 d[self][G] = nil
  82.             end
  83.             return {
  84.                 remove = J,
  85.                 Remove = J
  86.             }
  87.         end
  88.         if F == "AddGlobalGetHook" then
  89.             local K = E[1]
  90.             local L = E[2]
  91.             local M = E[3]
  92.             assert(type(K) == "string", "mt-api: Invalid hook type")
  93.             if M then
  94.                 assert(type(L) == "function", "mt-api: Invalid callback function")
  95.             end
  96.             g[K] = {
  97.                 Value = L,
  98.                 IsCallback = M
  99.             }
  100.             local N = function()
  101.                 g[K] = nil
  102.             end;
  103.             return {
  104.                 remove = N,
  105.                 Remove = N
  106.             }
  107.         end
  108.         if F == "AddSetHook" then
  109.             assert(#E > 0, "mt-api: Invalid argument count")
  110.             local O = E[1]
  111.             local P = E[2]
  112.             assert(type(O) == "string", "mt-api: Invalid hook type")
  113.             e[self] = e[self] or {}
  114.             e[self][O] = {
  115.                 Callback = type(P) == "function" and P or nil
  116.             }
  117.             local Q = function()
  118.                 e[self][O] = nil
  119.             end
  120.             return {
  121.                 remove = Q,
  122.                 Remove = Q
  123.             }
  124.         end;
  125.         if F == "AddGlobalSetHook" then
  126.             assert(#E > 0, "mt-api: Invalid argument count")
  127.             local R = E[1]
  128.             local S = E[2]
  129.             assert(type(R) == "string", "mt-api: Invalid hook type")
  130.             h[R] = {
  131.                 Callback = type(S) == "function" and S or nil
  132.             }
  133.             local T = function()
  134.                 h[R] = nil
  135.             end
  136.             return {
  137.                 remove = T,
  138.                 Remove = T
  139.             }
  140.         end;
  141.         if F == "AddCallHook" then
  142.             assert(#E > 1, "mt-api: Invalid argument count")
  143.             local U = E[1]
  144.             local V = E[2]
  145.             assert(type(U) == "string", "mt-api: Invalid hook type")
  146.             assert(type(V) == "function", "mt-api: Invalid argument #2 (not function)")
  147.             f[self] = f[self] or {}
  148.             f[self][U] = {
  149.                 Callback = V
  150.             }
  151.             local W = function()
  152.                 f[self][U] = nil
  153.             end
  154.             return {
  155.                 remove = W,
  156.                 Remove = W
  157.             }
  158.         end;
  159.         if F == "AddGlobalCallHook" then
  160.             assert(#E > 1, "mt-api: Invalid argument count")
  161.             local X = E[1]
  162.             local Y = E[2]
  163.             assert(type(X) == "string", "mt-api: Invalid hook type")
  164.             assert(type(Y) == "function", "mt-api: Invalid argument #2 (not function)")
  165.             i[X] = {
  166.                 Callback = Y
  167.             }
  168.             local Z = function()
  169.                 i[X] = nil
  170.             end
  171.             return {
  172.                 remove = Z,
  173.                 Remove = Z
  174.             }
  175.         end;
  176.         if F == "AddPropertyEmulator" then
  177.             assert(#E > 0, "mt-api: Invalid argument count")
  178.             local _ = E[1]
  179.             assert(type(_) == "string", "mt-api: Invalid hook type")
  180.             local a0 = self[_]
  181.             j[self] = j[self] or {}
  182.             k[self] = k[self] or {}
  183.             j[self][_] = {
  184.                 Type = type(a0)
  185.             }
  186.             k[self][_] = a0
  187.             local a2 = function()
  188.                 j[self][_] = nil
  189.                 k[self][_] = nil
  190.             end
  191.             return {
  192.                 remove = a2,
  193.                 Remove = a2
  194.             }
  195.         end
  196.         return __namecall(self, ...)
  197.     end
  198.     if f[self] and f[self][F] then
  199.         local a3 = f[self][F]
  200.         return a3["Callback"](self[F], unpack(E))
  201.     end
  202.     if i[F] then
  203.         local a4 = i[F]
  204.         return a4["Callback"](self, self[F], unpack(E))
  205.     end
  206.     return __namecall(self, ...)
  207. end)
  208. (make_readonly or setreadonly or set_readonly)(metatable, true)
  209. getgenv().MTAPIMutex = true
Tags: Roblox lua api MT
Add Comment
Please, Sign In to add comment