Python1320

gggghhhhhh

Mar 21st, 2014
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.02 KB | None | 0 0
  1. local _FindMetaTable=FindMetaTable
  2. local NewMetas={
  3.         Entity={},
  4.         Player={},
  5.         NPC={},
  6.         Weapon={},
  7.         Vehicle={},
  8.     }
  9.  
  10. -- don't copy these
  11. local bad={
  12.     __index=true,
  13.     __newindex=true,
  14.     __tostring=true,
  15. }
  16.  
  17. -- empty actual metatable, transfer functions to ours
  18. -- old meta is only used to set the new meta on the entities
  19. for name,new_meta in next,NewMetas do
  20.     local garrymeta = FindMetaTable(name)
  21.    
  22.     for k,v in next,garrymeta do
  23.         garrymeta[k]=nil
  24.         if not bad[k] then
  25.             new_meta[k]=v
  26.         end
  27.     end
  28.     new_meta.GarryGetTable=new_meta.GetTable
  29.    
  30.     local function assign_meta(self)
  31.         local entdata = new_meta.GarryGetTable and new_meta.GarryGetTable(self) or {} -- fucking garry's data
  32.         local entdata_meta = {__index=new_meta}
  33.         setmetatable(entdata,entdata_meta)
  34.        
  35.         local meta = {
  36.                     __newindex=entdata,
  37.                     __index=entdata,
  38.                     __tostring=entdata.__tostring -- :(
  39.                     }
  40.         debug.setmetatable(self,meta)      
  41.     end
  42.    
  43.     garrymeta.__index=function(self,key)
  44.         assign_meta(self)
  45.         return self[key]
  46.     end
  47.     garrymeta.__newindex=function(self,key,value)
  48.         assign_meta(self)
  49.         self[key] = value
  50.     end
  51.     garrymeta.__tostring=function(self)
  52.         assign_meta(self)
  53.         return tostring(self)
  54.     end
  55. end
  56.  
  57. -- setup inheritance
  58. local base = NewMetas.Entity
  59. for name,v in next,NewMetas do
  60.     setmetatable(v,v)
  61.     if v~=base then
  62.         v.__index=base
  63.     end
  64. end
  65.  
  66.  
  67. -- setup ~custom~ tostring
  68. for name,v in next,NewMetas do
  69.     v.__tostring = function(self)
  70.         return string.format("%s <%d>[%s]",name,self.EntIndex and self:EntIndex() or "ERROR",self.GetClass and self:GetClass() or "ERROR")
  71.     end
  72. end
  73.  
  74. NewMetas.Player.__tostring = function(self)
  75.     return string.format("%s <%d>[%s]",name,self.EntIndex and self:EntIndex() or "ERROR",self.GetName and self:GetName() or "ERROR")
  76. end
  77.  
  78. -- GetTable "fix"
  79. NewMetas.Entity.GetTable=function(self)
  80.     return getmetatable(self).__newindex
  81. end
  82.  
  83. -- Override the future
  84. FindMetaTable=function(name)
  85.     local t= NewMetas[name]
  86.     if t then
  87.         return t
  88.     end
  89.     return _FindMetaTable(name)
  90. end
Advertisement
Add Comment
Please, Sign In to add comment