Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local _FindMetaTable=FindMetaTable
- local NewMetas={
- Entity={},
- Player={},
- NPC={},
- Weapon={},
- Vehicle={},
- }
- -- don't copy these
- local bad={
- __index=true,
- __newindex=true,
- __tostring=true,
- }
- -- empty actual metatable, transfer functions to ours
- -- old meta is only used to set the new meta on the entities
- for name,new_meta in next,NewMetas do
- local garrymeta = FindMetaTable(name)
- for k,v in next,garrymeta do
- garrymeta[k]=nil
- if not bad[k] then
- new_meta[k]=v
- end
- end
- new_meta.GarryGetTable=new_meta.GetTable
- local function assign_meta(self)
- local entdata = new_meta.GarryGetTable and new_meta.GarryGetTable(self) or {} -- fucking garry's data
- local entdata_meta = {__index=new_meta}
- setmetatable(entdata,entdata_meta)
- local meta = {
- __newindex=entdata,
- __index=entdata,
- __tostring=entdata.__tostring -- :(
- }
- debug.setmetatable(self,meta)
- end
- garrymeta.__index=function(self,key)
- assign_meta(self)
- return self[key]
- end
- garrymeta.__newindex=function(self,key,value)
- assign_meta(self)
- self[key] = value
- end
- garrymeta.__tostring=function(self)
- assign_meta(self)
- return tostring(self)
- end
- end
- -- setup inheritance
- local base = NewMetas.Entity
- for name,v in next,NewMetas do
- setmetatable(v,v)
- if v~=base then
- v.__index=base
- end
- end
- -- setup ~custom~ tostring
- for name,v in next,NewMetas do
- v.__tostring = function(self)
- return string.format("%s <%d>[%s]",name,self.EntIndex and self:EntIndex() or "ERROR",self.GetClass and self:GetClass() or "ERROR")
- end
- end
- NewMetas.Player.__tostring = function(self)
- return string.format("%s <%d>[%s]",name,self.EntIndex and self:EntIndex() or "ERROR",self.GetName and self:GetName() or "ERROR")
- end
- -- GetTable "fix"
- NewMetas.Entity.GetTable=function(self)
- return getmetatable(self).__newindex
- end
- -- Override the future
- FindMetaTable=function(name)
- local t= NewMetas[name]
- if t then
- return t
- end
- return _FindMetaTable(name)
- end
Advertisement
Add Comment
Please, Sign In to add comment