Guest User

Untitled

a guest
Jan 19th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.86 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Darkages.Common;
  5. using Darkages.Storage;
  6. using Darkages.Types;
  7. using Newtonsoft.Json;
  8.  
  9. namespace Darkages.Network.Object
  10. {
  11. [Serializable]
  12. public sealed class ObjectService : IDisposable
  13. {
  14. [JsonIgnore] private static readonly object syncLock = new object();
  15.  
  16. [JsonIgnore] private static ObjectService context;
  17.  
  18. [JsonIgnore] private readonly HashSet<Sprite> _aislings = new HashSet<Sprite>();
  19.  
  20. [JsonIgnore] private readonly HashSet<Sprite> _monsters = new HashSet<Sprite>();
  21.  
  22. [JsonIgnore] private readonly HashSet<Sprite> _mundanes = new HashSet<Sprite>();
  23.  
  24. [JsonProperty] private HashSet<Sprite> _items = new HashSet<Sprite>();
  25.  
  26. [JsonProperty] private HashSet<Sprite> _money = new HashSet<Sprite>();
  27.  
  28. private bool disposedValue; // To detect redundant calls
  29.  
  30.  
  31. [JsonIgnore] private static bool CacheLoaded { get; set; }
  32.  
  33. [JsonIgnore]
  34. private HashSet<Sprite> Aislings
  35. {
  36. get
  37. {
  38. lock (syncLock)
  39. {
  40. return new HashSet<Sprite>(_aislings);
  41. }
  42. }
  43. }
  44.  
  45. [JsonIgnore]
  46. private HashSet<Sprite> Monsters
  47. {
  48. get
  49. {
  50. lock (syncLock)
  51. {
  52. return new HashSet<Sprite>(_monsters);
  53. }
  54. }
  55. }
  56.  
  57. [JsonIgnore]
  58. private HashSet<Sprite> Mundanes
  59. {
  60. get
  61. {
  62. lock (syncLock)
  63. {
  64. return new HashSet<Sprite>(_mundanes);
  65. }
  66. }
  67. }
  68.  
  69. [JsonIgnore]
  70. private HashSet<Sprite> Money
  71. {
  72. get
  73. {
  74. lock (syncLock)
  75. {
  76. return new HashSet<Sprite>(_money);
  77. }
  78. }
  79. }
  80.  
  81. [JsonIgnore]
  82. private HashSet<Sprite> Items
  83. {
  84. get
  85. {
  86. lock (syncLock)
  87. {
  88. return new HashSet<Sprite>(_items);
  89. }
  90. }
  91. }
  92.  
  93. [JsonIgnore]
  94. public static ObjectService Context
  95. {
  96. get
  97. {
  98. if (context == null)
  99. context = new ObjectService();
  100.  
  101. return context;
  102. }
  103. }
  104.  
  105. public void Dispose()
  106. {
  107. disposedValue = !disposedValue;
  108. Dispose(true);
  109. }
  110.  
  111. public event ObjectEvent<Sprite> ObjectAdded;
  112. public event ObjectEvent<Sprite> ObjectChanged;
  113. public event ObjectEvent<Sprite> ObjectRemoved;
  114.  
  115.  
  116. public T Query<T>(Predicate<T> predicate) where T : Sprite, new()
  117. {
  118. var obj = new T();
  119.  
  120.  
  121. if (obj is Aisling)
  122. {
  123. if (Aislings == null)
  124. return null;
  125.  
  126. return Aislings.Cast<T>().FirstOrDefault(i => predicate(i));
  127. }
  128.  
  129. if (obj is Monster)
  130. {
  131. if (Monsters == null)
  132. return null;
  133.  
  134. return Monsters.Cast<T>().FirstOrDefault(i => predicate(i));
  135. }
  136.  
  137. if (obj is Mundane)
  138. {
  139. if (Mundanes == null)
  140. return null;
  141.  
  142. return Mundanes.Cast<T>().FirstOrDefault(i => predicate(i));
  143. }
  144.  
  145. if (obj is Money)
  146. {
  147. if (Money == null)
  148. return null;
  149.  
  150. return Money.Cast<T>().FirstOrDefault(i => predicate(i));
  151. }
  152.  
  153. if (obj is Item)
  154. {
  155. if (Items == null)
  156. return null;
  157.  
  158. return Items.Cast<T>().FirstOrDefault(i => predicate(i));
  159. }
  160.  
  161.  
  162. return null;
  163. }
  164.  
  165. public T[] QueryAll<T>(Predicate<T> predicate) where T : Sprite, new()
  166. {
  167. var obj = new T();
  168.  
  169. if (obj is Aisling)
  170. {
  171. if (Aislings == null)
  172. return null;
  173.  
  174. return Aislings.Cast<T>().Where(i => predicate(i)).ToArray();
  175. }
  176.  
  177. if (obj is Monster)
  178. {
  179. if (Monsters == null)
  180. return null;
  181.  
  182. return Monsters.Cast<T>().Where(i => predicate(i)).ToArray();
  183. }
  184.  
  185. if (obj is Mundane)
  186. {
  187. if (Mundanes == null)
  188. return null;
  189.  
  190. return Mundanes.Cast<T>().Where(i => predicate(i)).ToArray();
  191. }
  192.  
  193. if (obj is Money)
  194. {
  195. if (Money == null)
  196. return null;
  197.  
  198. return Money.Cast<T>().Where(i => predicate(i)).ToArray();
  199. }
  200.  
  201. if (obj is Item)
  202. {
  203. if (Items == null)
  204. return null;
  205.  
  206. return Items.Cast<T>().Where(i => predicate(i)).ToArray();
  207. }
  208.  
  209.  
  210. return null;
  211. }
  212.  
  213. public void Save<T>(T reference, Predicate<T> predicate)
  214. where T : Sprite
  215. {
  216. if (reference == null)
  217. return;
  218.  
  219. ObjectChanged?.Invoke(reference);
  220. }
  221.  
  222. public void Insert<T>(T obj) where T : Sprite
  223. {
  224. if (obj == null)
  225. return;
  226.  
  227. lock (Generator.Random)
  228. {
  229. obj.Serial = Generator.GenerateNumber();
  230. }
  231.  
  232. lock (syncLock)
  233. {
  234. if (obj is Aisling)
  235. _aislings.Add(obj);
  236.  
  237. if (obj is Monster)
  238. _monsters.Add(obj);
  239.  
  240. if (obj is Mundane)
  241. _mundanes.Add(obj);
  242.  
  243. if (obj is Money)
  244. _money.Add(obj);
  245.  
  246. if (obj is Item)
  247. _items.Add(obj);
  248.  
  249. ObjectAdded?.Invoke(obj);
  250. }
  251. }
  252.  
  253. public void RemoveAll<T>(T[] objects) where T : Sprite
  254. {
  255. if (objects == null)
  256. return;
  257.  
  258. for (uint i = 0; i < objects.Length; i++)
  259. Remove(objects[i]);
  260. }
  261.  
  262.  
  263. public void Remove<T>(T obj) where T : Sprite
  264. {
  265. if (obj == null)
  266. return;
  267.  
  268. lock (syncLock)
  269. {
  270. if (obj is Aisling)
  271. _aislings.Remove(obj);
  272.  
  273. if (obj is Monster)
  274. _monsters.Remove(obj);
  275.  
  276. if (obj is Mundane)
  277. _mundanes.Remove(obj);
  278.  
  279. if (obj is Money)
  280. _money.Remove(obj);
  281.  
  282. if (obj is Item)
  283. _items.Remove(obj);
  284.  
  285. ObjectRemoved?.Invoke(obj);
  286. }
  287. }
  288.  
  289. public void Cache()
  290. {
  291. StorageManager.Save(this);
  292. }
  293.  
  294. private void Dispose(bool disposing)
  295. {
  296. if (!disposedValue)
  297. {
  298. if (disposing)
  299. {
  300. var removables = Aislings.Concat(Money).Concat(Mundanes).Concat(Monsters).Concat(Items)
  301. .Reverse();
  302.  
  303. foreach (var obj in removables)
  304. obj.Remove();
  305.  
  306. _items?.Clear();
  307. _money?.Clear();
  308. _monsters?.Clear();
  309. _aislings?.Clear();
  310. _mundanes?.Clear();
  311. }
  312.  
  313. disposedValue = true;
  314. }
  315. }
  316.  
  317. internal static void Set(ObjectService cache_)
  318. {
  319. if (CacheLoaded)
  320. return;
  321.  
  322. foreach (var obj in cache_.Items)
  323. Context.Insert(obj);
  324.  
  325. foreach (var obj in cache_.Money)
  326. Context.Insert(obj);
  327.  
  328. CacheLoaded = true;
  329. }
  330. }
  331. }
Add Comment
Please, Sign In to add comment