Skip to content

Instantly share code, notes, and snippets.

@sbx320
Created June 21, 2014 19:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sbx320/f6ffb8bbb6e4987a49cc to your computer and use it in GitHub Desktop.
Save sbx320/f6ffb8bbb6e4987a49cc to your computer and use it in GitHub Desktop.
MTA 1.4 OOP Magic
-- Magic to allow MTA elements to be used as data storage
-- e.g. localPlayer.foo = 12
oop = {}
oop.mta_metatable = {}
oop.elementInfo = setmetatable({}, { __mode = "k" })
oop.getMTATypeMetatable = function(t)
local element = false
if t == "player" then return debug.getmetatable(localPlayer or getRandomPlayer())
elseif t == "vehicle" then element = createVehicle(411, 0, 0, 0)
elseif t == "colshape" then element = createColCircle(0, 0, 1)
elseif t == "element" then element = createElement("oopelement")
elseif t == "marker" then element = createMarker(0, 0, 0, "ring")
elseif t == "object" then element = createObject(1337, 0, 0, 0)
elseif t == "ped" then element = createPed(0, 0, 0, 0)
elseif t == "pickup" then element = createPickup(0, 0, 0, 0, 0)
elseif t == "radarArea" then element = createRadarArea(0, 0, 1, 1)
elseif t == "water" then element = createWater(0, 0, 0, 2, 2, 2, 4, 4, 4)
elseif t == "weapon" then element = createWeapon("m4", 0, 0, 0)
elseif SERVER then
if t == "team" then element = createTeam("oopteam") end
elseif CLIENT then
if t == "sound" then element = playSFX("feet", 1, 1)
elseif t == "camera" then return debug.getmetatable(getCamera())
elseif t == "effect" then element = createEffect("fire", 0, 0, 0)
-- todo: check if GUI elements have OOP
end
end
assert(element, t)
local mt = debug.getmetatable(element)
destroyElement(element)
return mt
end
oop.prepareClass = function(name)
local mt = oop.mta_metatable[name]
mt.__mtaindex = mt.__index
mt.__mtanewindex = mt.__newindex
mt.__index = function(self, key)
local value = debug.getmetatable(self).__mtaindex(self, key)
if value ~= nil then
return value
end
return (oop.elementInfo[self] or {})[key]
end
mt.__newindex = function(self, key, value)
local mt = debug.getmetatable(self)
if mt.__set[key] ~= nil then
debug.getmetatable(self).__mtanewindex(self, key, value)
return
end
if not oop.elementInfo[self] then
oop.elementInfo[self] = {}
end
oop.elementInfo[self][key] = value
end
end
oop.initClasses = function()
oop.mta_metatable["vehicle"] = oop.getMTATypeMetatable("vehicle")
oop.mta_metatable["colshape"] = oop.getMTATypeMetatable("colshape")
oop.mta_metatable["element"] = oop.getMTATypeMetatable("element")
oop.mta_metatable["marker"] = oop.getMTATypeMetatable("marker")
oop.mta_metatable["object"] = oop.getMTATypeMetatable("object")
oop.mta_metatable["ped"] = oop.getMTATypeMetatable("ped")
oop.mta_metatable["pickup"] = oop.getMTATypeMetatable("pickup")
oop.mta_metatable["radarArea"] = oop.getMTATypeMetatable("radarArea")
oop.mta_metatable["water"] = oop.getMTATypeMetatable("water")
oop.mta_metatable["weapon"] = oop.getMTATypeMetatable("weapon")
if SERVER then
oop.mta_metatable["team"] = oop.getMTATypeMetatable("team")
end
if CLIENT then
oop.mta_metatable["sound"] = oop.getMTATypeMetatable("sound")
oop.mta_metatable["camera"] = oop.getMTATypeMetatable("camera")
oop.mta_metatable["effect"] = oop.getMTATypeMetatable("effect")
end
for k, v in pairs(oop.mta_metatable) do
oop.prepareClass(k)
end
if SERVER then
if getPlayerCount() >= 1 then
oop.initPlayerClass()
else
addEventHandler("onPlayerConnect", root, oop.initPlayerClass)
end
else
oop.initPlayerClass()
end
end
oop.initPlayerClass = function()
oop.mta_metatable["player"] = oop.getMTATypeMetatable("player")
removeEventHandler("onPlayerConnect", root, oop.initPlayerClass)
oop.prepareClass("player")
end
oop.initClasses()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment