Created
June 21, 2014 19:04
-
-
Save sbx320/f6ffb8bbb6e4987a49cc to your computer and use it in GitHub Desktop.
MTA 1.4 OOP Magic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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