Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.51 KB | None | 0 0
  1. if D3A.NW then return end -- Do not ever lua refresh this file unless you want to lose data
  2.  
  3. D3A.NW = {}
  4.  
  5. local vars = {}
  6. local mappings = {}
  7. local data = {
  8. [0] = {}
  9. }
  10. local globals = data[0]
  11. local callbacks = {}
  12.  
  13. local nw_mt = {}
  14. nw_mt.__index = nw_mt
  15.  
  16. debug.getregistry().nw = nw_mt
  17.  
  18. local bitmap = {
  19. [3] = 3,
  20. [7] = 4,
  21. [15] = 5,
  22. [31] = 6,
  23. [63] = 7,
  24. [127] = 8
  25. }
  26.  
  27. local bitcount = 2
  28.  
  29. local ENTITY = FindMetaTable 'Entity'
  30.  
  31. local pairs = pairs
  32. local Entity = Entity
  33.  
  34. local net_WriteUInt = net.WriteUInt
  35. local net_ReadUInt = net.ReadUInt
  36. local net_Start = net.Start
  37. local net_Send = (SERVER) and net.Send or net.SendToServer
  38. local net_Broadcast = net.Broadcast
  39. local net_Broadcast = net.Broadcast
  40. local player_GetAll = player.GetAll
  41. local sorted_pairs = SortedPairsByMemberValue
  42.  
  43. function D3A.NW.Register(var, info) -- You must always call this on both the client and server. It will serioulsy break shit if you don't.
  44. local t = {
  45. Name = var,
  46. NetworkString = 'nw_' .. var,
  47. WriteFunc = net.WriteType,
  48. ReadFunc = net.ReadType,
  49. SendFunc = function(self, ent, value, recipients)
  50. if (recipients ~= nil) then
  51. net_Send(recipients)
  52. else
  53. net_Broadcast()
  54. end
  55. end,
  56. }
  57. setmetatable(t, nw_mt)
  58. vars[var] = t
  59.  
  60. if (SERVER) then
  61. util.AddNetworkString(t.NetworkString)
  62. else
  63. net.Receive(t.NetworkString, function()
  64. local index, value = t:_Read()
  65.  
  66. if (not data[index]) then
  67. data[index] = {}
  68. end
  69.  
  70. data[index][var] = value
  71.  
  72. t:_CallHook(index, value)
  73. end)
  74. end
  75.  
  76. if (info ~= nil) then -- info arg is only for backwards support, plz dont use
  77. if info.Read then t:Read(info.Read) end
  78. if info.Write then t:Write(info.Write) end
  79. if info.LocalVar then t:SetLocal() end
  80. if info.GlobalVar then t:SetGlobal() end
  81. if info.Filter then t:Filter(info.Filter) end
  82. end
  83.  
  84. return t:_Construct()
  85. end
  86.  
  87. function D3A.NW.IsRegistered(var)
  88. return (vars[var] ~= nil)
  89. end
  90.  
  91. function nw_mt:Write(func, opt)
  92. self.WriteFunc = function(value)
  93. func(value, opt)
  94. end
  95. return self:_Construct()
  96. end
  97.  
  98. function nw_mt:Read(func, opt)
  99. self.ReadFunc = function()
  100. return func(opt)
  101. end
  102. return self:_Construct()
  103. end
  104.  
  105. function nw_mt:Filter(func)
  106. self.SendFunc = function(self, ent, value, recipients)
  107. net_Send(recipients or func(ent, value))
  108. end
  109. return self:_Construct()
  110. end
  111.  
  112. function nw_mt:SetPlayer()
  113. self.PlayerVar = true
  114. return self:_Construct()
  115. end
  116.  
  117. function nw_mt:SetLocalPlayer()
  118. self.LocalPlayerVar = true
  119. return self:_Construct()
  120. end
  121. nw_mt.SetLocal = nw_mt.SetLocalPlayer -- backward support
  122.  
  123. function nw_mt:SetGlobal()
  124. self.GlobalVar = true
  125. return self:_Construct()
  126. end
  127.  
  128. function nw_mt:SetNoSync()
  129. self.NoSync = true
  130. return self:_Construct()
  131. end
  132.  
  133. function nw_mt:SetHook(name)
  134. self.Hook = name
  135. return self
  136. end
  137.  
  138. function nw_mt:_Send(ent, value, recipients)
  139. net_Start(self.NetworkString)
  140. self:_Write(ent, value)
  141. self:SendFunc(ent, value, recipients)
  142. end
  143.  
  144. function nw_mt:_CallHook(index, value)
  145. if (self.Hook) then
  146. if (index != 0) then
  147. hook.Call(self.Hook, GAMEMODE, Entity(index), value)
  148. else
  149. hook.Call(self.Hook, GAMEMODE, value)
  150. end
  151. end
  152. end
  153.  
  154. function nw_mt:_Construct()
  155. local WriteFunc = self.WriteFunc
  156. local ReadFunc = self.ReadFunc
  157.  
  158. if self.PlayerVar then
  159. self._Write = function(self, ent, value)
  160. net_WriteUInt(ent:EntIndex(), 7)
  161. WriteFunc(value)
  162. end
  163. self._Read = function(self)
  164. return net_ReadUInt(7), ReadFunc()
  165. end
  166. elseif self.LocalPlayerVar then
  167. self._Write = function(self, ent, value)
  168. WriteFunc(value)
  169. end
  170. self._Read = function(self)
  171. return LocalPlayer():EntIndex(), ReadFunc()
  172. end
  173. self.SendFunc = function(self, ent, value, recipients)
  174. net_Send(ent)
  175. end
  176. elseif self.GlobalVar then
  177. self._Write = function(self, ent, value)
  178. WriteFunc(value)
  179. end
  180. self._Read = function(self)
  181. return 0, ReadFunc()
  182. end
  183. else
  184. self._Write = function(self, ent, value)
  185. net_WriteUInt(ent:EntIndex(), 12)
  186. WriteFunc(value)
  187. end
  188. self._Read = function(self)
  189. return net_ReadUInt(12), ReadFunc()
  190. end
  191. end
  192.  
  193. mappings = {}
  194. for k, v in sorted_pairs(vars, 'Name', false) do
  195. local c = #mappings + 1
  196. vars[k].ID = c
  197. mappings[c] = v
  198. if bitmap[c] then
  199. bitcount = bitmap[c]
  200. end
  201. end
  202.  
  203. return self
  204. end
  205.  
  206. function D3A.NW.GetGlobal(var)
  207. return globals[var]
  208. end
  209.  
  210. function ENTITY:GetNetVar(var)
  211. local index = self:EntIndex()
  212. return data[index] and data[index][var]
  213. end
  214.  
  215. if (SERVER) then
  216. util.AddNetworkString 'D3A.NW.PlayerSync'
  217. util.AddNetworkString 'D3A.NW.NilEntityVar'
  218. util.AddNetworkString 'D3A.NW.NilPlayerVar'
  219. util.AddNetworkString 'D3A.NW.EntityRemoved'
  220. util.AddNetworkString 'D3A.NW.PlayerRemoved'
  221.  
  222. net.Receive('D3A.NW.PlayerSync', function(len, pl)
  223. if (pl.EntityCreated ~= true) then
  224. hook.Call('PlayerEntityCreated', GAMEMODE, pl)
  225.  
  226. pl.EntityCreated = true
  227.  
  228. for index, _vars in pairs(data) do
  229. for var, value in pairs(_vars) do
  230. local ent = Entity(index)
  231. if (not vars[var].LocalPlayerVar and not vars[var].NoSync) or (ent == pl) then
  232. vars[var]:_Send(ent, value, pl)
  233. end
  234. end
  235. end
  236.  
  237. if (callbacks[pl] ~= nil) then
  238. for i = 1, #callbacks[pl] do
  239. callbacks[pl][i](pl)
  240. end
  241. end
  242. callbacks[pl] = nil
  243. end
  244. end)
  245.  
  246. hook.Add('EntityRemoved', 'D3A.NW.EntityRemoved', function(ent)
  247. local index = ent:EntIndex()
  248. if (index ~= 0) and (data[index] ~= nil) then -- For some reason this kept getting called on Entity(0), not sure why...
  249. if ent:IsPlayer() then
  250. net_Start('D3A.NW.PlayerRemoved')
  251. net_WriteUInt(index, 7)
  252. net_Broadcast()
  253. else
  254. net_Start('D3A.NW.EntityRemoved')
  255. net_WriteUInt(index, 12)
  256. net_Broadcast()
  257. end
  258.  
  259. data[index] = nil
  260. end
  261. end)
  262.  
  263. function D3A.NW.WaitForPlayer(pl, cback)
  264. if (pl.EntityCreated == true) then
  265. cback(pl)
  266. else
  267. if (callbacks[pl] == nil) then
  268. callbacks[pl] = {}
  269. end
  270. callbacks[pl][#callbacks[pl] + 1] = cback
  271. end
  272. end
  273.  
  274. function D3A.NW.SetGlobal(var, value)
  275. globals[var] = value
  276. if (value ~= nil) then
  277. vars[var]:_Send(0, value)
  278. else
  279. net_Start('D3A.NW.NilEntityVar')
  280. net_WriteUInt(0, 12)
  281. net_WriteUInt(vars[var].ID, bitcount)
  282. vars[var]:SendFunc(0, value)
  283. end
  284. end
  285.  
  286. function ENTITY:SetNetVar(var, value)
  287. local index = self:EntIndex()
  288.  
  289. if (not data[index]) then
  290. data[index] = {}
  291. end
  292.  
  293. data[index][var] = value
  294.  
  295. if (value ~= nil) then
  296. vars[var]:_Send(self, value)
  297. else
  298. if self:IsPlayer() then
  299. net_Start('D3A.NW.NilPlayerVar')
  300. net_WriteUInt(index, 7)
  301. else
  302. net_Start('D3A.NW.NilEntityVar')
  303. net_WriteUInt(index, 12)
  304. end
  305. net_WriteUInt(vars[var].ID, bitcount)
  306. vars[var]:SendFunc(self, value)
  307. end
  308. end
  309. else
  310. hook.Add('InitPostEntity', 'D3A.NW.InitPostEntity', function()
  311. net_Start('D3A.NW.PlayerSync')
  312. net_Send()
  313. end)
  314.  
  315. net.Receive('D3A.NW.NilEntityVar', function()
  316. local index, id = net_ReadUInt(12), net_ReadUInt(bitcount)
  317. if data[index] and mappings[id] then
  318. data[index][mappings[id].Name] = nil
  319. end
  320. end)
  321.  
  322. net.Receive('D3A.NW.NilPlayerVar', function()
  323. local index, id = net_ReadUInt(7), net_ReadUInt(bitcount)
  324. if data[index] and mappings[id] then
  325. data[index][mappings[id].Name] = nil
  326. end
  327. end)
  328.  
  329. net.Receive('D3A.NW.EntityRemoved', function()
  330. data[net_ReadUInt(12)] = nil
  331. end)
  332.  
  333. net.Receive('D3A.NW.PlayerRemoved', function()
  334. data[net_ReadUInt(7)] = nil
  335. end)
  336. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement