ShipGenerator.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. using GadgetCore.API;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using UnityEngine;
  6. namespace Ships
  7. {
  8. internal enum ShipGeneratorObjectPoolType
  9. {
  10. SmallObject = 0,
  11. LargeObject = 1,
  12. FlyingEnemy = 2,
  13. BrokenItemMod = 3,
  14. BrokenChest = 4,
  15. OldChest = 5,
  16. BrokenLaser = 6
  17. }
  18. public class ShipGenerator
  19. {
  20. private static readonly FieldInfo chunksField = typeof(SpawnerScript).GetField("chunks", BindingFlags.NonPublic | BindingFlags.Instance);
  21. private static readonly Material materialaBackLight = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("parallax.png") };
  22. private static readonly Material materialaParalex0 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg0.png") };
  23. private static readonly Material materialaParalex1 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg1.png") };
  24. private static readonly Material materialaParalex2 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg2.png") };
  25. private static readonly Material materialaParalex3 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg3.png") };
  26. private static readonly Material materialaParalexStars = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bgStars.png") };
  27. private static readonly Material materialaParalexNone = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bgNone.png") };
  28. public static readonly FieldInfo networkStuffField = typeof(Chunk).GetField("networkStuff", BindingFlags.NonPublic | BindingFlags.Instance);
  29. public static readonly FieldInfo tempField = typeof(Chunk).GetField("temp", BindingFlags.NonPublic | BindingFlags.Instance);
  30. public static void GenarateTown(SpawnerScript s, int[] param)
  31. {
  32. GameScript.isTown = true;
  33. if (GameScript.districtLevel % 2 != 0)
  34. {
  35. GameScript.districtLevel++;
  36. }
  37. s.backLights.SetActive(true);
  38. s.mainLight.SetActive(false);
  39. s.backLights.GetComponent<Renderer>().material = materialaBackLight;
  40. //s.mainLight.GetComponentInChildren<Light>().color = new Color(0.05f, 0.05f, 0.05f, 0.1f);
  41. s.bg[0].GetComponent<Renderer>().material = materialaParalexStars;
  42. s.bg[1].GetComponent<Renderer>().material = materialaParalexNone;
  43. s.bg[2].GetComponent<Renderer>().material = materialaParalexNone;
  44. s.bg[3].GetComponent<Renderer>().material = materialaParalexNone;
  45. var chunks = (GameObject[])chunksField.GetValue(s);
  46. var num = 0;
  47. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShuttleMain"), new Vector3((float)(218 + 0 * 128 + 4 * 8), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  48. num++;
  49. if (Network.isServer)
  50. {
  51. chunks[num] = new GameObject("chunk");
  52. var chunk = chunks[num].AddComponent<Chunk>();
  53. PopulateTown(chunk);
  54. num++;
  55. }
  56. }
  57. public static void Genarate(SpawnerScript s, int[] param)
  58. {
  59. try
  60. {
  61. GameScript.isTown = false;
  62. spawnLocations.Clear();
  63. s.backLights.SetActive(true);
  64. s.mainLight.SetActive(false);
  65. s.backLights.GetComponent<Renderer>().material = materialaBackLight;
  66. //s.mainLight.GetComponentInChildren<Light>().color = new Color(0.05f, 0.05f, 0.05f, 0.1f);
  67. s.bg[0].GetComponent<Renderer>().material = materialaParalexStars;
  68. s.bg[1].GetComponent<Renderer>().material = materialaParalexNone;
  69. s.bg[2].GetComponent<Renderer>().material = materialaParalexNone;
  70. s.bg[3].GetComponent<Renderer>().material = materialaParalexNone;
  71. var chunks = (GameObject[])chunksField.GetValue(s);
  72. var num = 0;
  73. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAEntrance"), new Vector3((float)(218 + 0 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  74. num++;
  75. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAMain"), new Vector3((float)(218 + 0.75 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  76. num++;
  77. spawnLocations.Add(new int[] { 7, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  78. spawnLocations.Add(new int[] { 10, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  79. spawnLocations.Add(new int[] { 16, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  80. spawnLocations.Add(new int[] { 17, 4, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  81. spawnLocations.Add(new int[] { 32, 0, (int)ShipGeneratorObjectPoolType.BrokenLaser });
  82. Add4(4, 0);
  83. Add4(4, 5);
  84. Add4Floor(4, -5);
  85. Add4(10, 0);
  86. Add4(10, 5);
  87. Add4Floor(10, -5);
  88. Add4(20, 0);
  89. Add4(20, 5);
  90. Add4Floor(20, -5);
  91. Add4(26, 0);
  92. Add4(26, 5);
  93. Add4Floor(26, -5);
  94. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAMain"), new Vector3((float)(218 + 1.75 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  95. num++;
  96. spawnLocations.Add(new int[] { 7 + 32, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  97. spawnLocations.Add(new int[] { 10 + 32, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  98. spawnLocations.Add(new int[] { 16 + 32, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  99. spawnLocations.Add(new int[] { 17 + 32, 4, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  100. spawnLocations.Add(new int[] { 32 + 32, 0, (int)ShipGeneratorObjectPoolType.BrokenLaser });
  101. Add4(4 + 32, 0);
  102. Add4(4 + 32, 5);
  103. Add4Floor(4 + 32, -5);
  104. Add4(10 + 32, 0);
  105. Add4(10 + 32, 5);
  106. Add4Floor(10 + 32, -5);
  107. Add4(20 + 32, 0);
  108. Add4(20 + 32, 5);
  109. Add4Floor(20 + 32, -5);
  110. Add4(26 + 32, 0);
  111. Add4(26 + 32, 5);
  112. Add4Floor(26 + 32, -5);
  113. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAExit"), new Vector3((float)(218 + 2.5 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  114. num++;
  115. if (Network.isServer)
  116. {
  117. chunks[num] = new GameObject("chunk");
  118. var chunk = chunks[num].AddComponent<Chunk>();
  119. PopulateWorld(chunk);
  120. num++;
  121. }
  122. }
  123. catch (System.Exception e) { Core.logger.LogConsole(e); }
  124. }
  125. private static void Add4(int x, int y)
  126. {
  127. var r = random.Next(8);
  128. switch (r)
  129. {
  130. case 0:
  131. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  132. break;
  133. case 1:
  134. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  135. break;
  136. case 2:
  137. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  138. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  139. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  140. break;
  141. case 3:
  142. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  143. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  144. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  145. break;
  146. case 4:
  147. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  148. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  149. break;
  150. case 5:
  151. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  152. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  153. break;
  154. case 6:
  155. if (random.Next(2) == 0)
  156. {
  157. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.BrokenItemMod });
  158. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.BrokenChest });
  159. }
  160. else
  161. {
  162. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.BrokenChest });
  163. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.BrokenItemMod });
  164. }
  165. break;
  166. case 7:
  167. if (random.Next(2) == 0)
  168. {
  169. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  170. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.OldChest });
  171. }
  172. else
  173. {
  174. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.OldChest });
  175. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  176. }
  177. break;
  178. }
  179. }
  180. private static void Add4Floor(int x, int y)
  181. {
  182. if (random.Next(2) == 0)
  183. Add4(x, y);
  184. else
  185. {
  186. var r = random.Next(5);
  187. switch (r)
  188. {
  189. case 0:
  190. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  191. break;
  192. case 1:
  193. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  194. break;
  195. case 2:
  196. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  197. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  198. break;
  199. case 3:
  200. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  201. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  202. break;
  203. case 4:
  204. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  205. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  206. break;
  207. }
  208. }
  209. }
  210. private static List<int[]> spawnLocations = new List<int[]>();
  211. private static System.Random random = new System.Random();
  212. public static void PopulateTown(Chunk chunk)
  213. {
  214. var networkStuff = new GameObject[400];
  215. networkStuffField.SetValue(chunk, networkStuff);
  216. try
  217. {
  218. int temp = (int)tempField.GetValue(chunk);
  219. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("npcStorage"), new Vector3(248f + 4 * 0, -6.118f, 0.3f), Quaternion.identity, 0);
  220. temp++;
  221. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("npc2103"), new Vector3(248f + 4 * 1, -6.118f, 0.3f), Quaternion.identity, 0);
  222. temp++;
  223. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("npc/npcQuest"), new Vector3(248f + 4 * 3, -6.118f, 0.3f), Quaternion.identity, 0);
  224. temp++;
  225. }
  226. catch (Exception e) { Core.logger.LogError(e); }
  227. GameScript.endPortal[0] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(248f + 4 * 5, -6.118f, 0f), Quaternion.identity, 0);
  228. GameScript.endPortalUA[0] = GameScript.endPortal[0].transform.GetChild(0).gameObject;
  229. GameScript.endPortal[0].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
  230. GameScript.endPortalUA[0].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { Core.lastBiome, 0, 0 });
  231. GameScript.endPortal[3] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(248f - 4 * 2, -6.118f, 0f), Quaternion.identity, 0);
  232. GameScript.endPortalUA[3] = GameScript.endPortal[3].transform.GetChild(0).gameObject;
  233. GameScript.endPortal[3].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
  234. GameScript.endPortalUA[3].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { 98, 0, 3 });
  235. }
  236. public static void PopulateWorld(Chunk chunk)
  237. {
  238. var networkStuff = new GameObject[400];
  239. networkStuffField.SetValue(chunk, networkStuff);
  240. try
  241. {
  242. int temp = (int)tempField.GetValue(chunk);
  243. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenTeleporter"), new Vector3(248f - 4 * 1, -4f + 0.118f, 0.3f), Quaternion.identity, 0);
  244. temp++;
  245. foreach (var e in spawnLocations)
  246. {
  247. switch ((ShipGeneratorObjectPoolType)e[2])
  248. {
  249. case ShipGeneratorObjectPoolType.SmallObject:
  250. if (random.Next(30) == 0)
  251. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenItemMod"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  252. else if (random.Next(4) == 0)
  253. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates1"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  254. else if (random.Next(3) == 0)
  255. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates2"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  256. else if (random.Next(2) == 0)
  257. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates3"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  258. else
  259. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates4"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  260. break;
  261. case ShipGeneratorObjectPoolType.LargeObject:
  262. if (random.Next(6) == 0)
  263. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate1"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  264. else if (random.Next(5) == 0)
  265. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate2"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  266. else if (random.Next(4) == 0)
  267. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate3"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  268. else if (random.Next(3) == 0)
  269. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate4"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  270. else if (random.Next(2) == 0)
  271. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate5"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  272. else
  273. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate6"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  274. break;
  275. case ShipGeneratorObjectPoolType.FlyingEnemy:
  276. Network.Instantiate(Resources.Load("e/Ships/BrokenSliver"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 1.1f + 4 * e[1], 0f), Quaternion.identity, 0);
  277. Network.Instantiate(Resources.Load("e/Ships/BrokenDroid"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 1.1f + 4 * e[1], 0f), Quaternion.identity, 0);
  278. break;
  279. case ShipGeneratorObjectPoolType.BrokenItemMod:
  280. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenItemMod"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  281. break;
  282. case ShipGeneratorObjectPoolType.BrokenChest:
  283. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenChest"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  284. break;
  285. case ShipGeneratorObjectPoolType.OldChest:
  286. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/OldChest"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  287. break;
  288. case ShipGeneratorObjectPoolType.BrokenLaser:
  289. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("haz/Ships/LazerHazard"), new Vector3(248f + 4 * (e[0] + 0.5f), 4 * (e[1]), 0.2f), Quaternion.identity, 0);
  290. break;
  291. }
  292. if (networkStuff[temp] != null)
  293. temp++;
  294. }
  295. }
  296. catch (Exception e) { Core.logger.LogError(e); }
  297. GameScript.endPortal[0] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(248f + 4 * 38 + 128, -6.118f, 0f), Quaternion.identity, 0);
  298. GameScript.endPortalUA[0] = GameScript.endPortal[0].transform.GetChild(0).gameObject;
  299. GameScript.endPortal[0].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
  300. GameScript.endPortalUA[0].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { Core.shipPlanet.GetID(), 0, 0 });
  301. }
  302. }
  303. }