| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465 |
- using GadgetCore.API;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using UnityEngine;
- using Random = System.Random;
- namespace SpacePlanet
- {
- public static class GameObjectSpaceWorldGeneratorExtension
- {
- public static void AddToWorld(this GameObject obj, GameObject g)
- {
- obj.transform.parent = g.transform;
- }
- public static void AddObjectToWorld(this GameObject obj, GameObject g, List<GameObject> objList)
- {
- obj.transform.parent = g.transform;
- objList.Add(obj);
- }
- }
- public class SpaceWorldGenerator
- {
- private static int W = 32; //128 + 64;
- private static int H = 32;//128 - 32;
- private static GameObject GetBaseBlock(float w, float h, float posX, float posY, Texture2D texture)
- {
- GameObject gameObject = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/midChunk0"), new Vector3((float)(242 + posX - 60), posY - 60, 5f), Quaternion.Euler(0f, 180f, 180f));
- gameObject.transform.localScale = new Vector3(w, h, 1);
- BoxCollider collider = gameObject.GetComponentInChildren<BoxCollider>();
- collider.size = new Vector3(2, 2, 5);
- Renderer renderer = gameObject.GetComponentInChildren<Renderer>();
- renderer.material = new Material(Shader.Find("Transparent/Diffuse"))
- {
- mainTexture = texture
- };
- return gameObject;
- }
- private static GameObject GetBorderBlock(float w, float h, float posX, float posY, float moveX, float moveY)
- {
- GameObject gameObject = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/midChunk0"), new Vector3((float)(242 + posX), posY, 5f), Quaternion.Euler(0f, 180f, 180f));
- gameObject.transform.localScale = new Vector3(w, h, 1);
- BoxCollider collider = gameObject.GetComponentInChildren<BoxCollider>();
- collider.isTrigger = true;
- collider.size = new Vector3(2, 2, 1);
- Renderer renderer = gameObject.GetComponentInChildren<Renderer>();
- renderer.material = new Material(Shader.Find("Transparent/Diffuse"))
- {
- mainTexture = null
- };
- return gameObject;
- }
- private static GameObject GetStarTextureObject(Texture2D texture)
- {
- GameObject gameObject = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/midChunk0"), new Vector3(0f, 0f, 20f), Quaternion.Euler(0f, 180f, 180f));
- gameObject.layer = 0;
- gameObject.transform.localScale = new Vector3(32, 32, 1);
- BoxCollider collider = gameObject.GetComponentInChildren<BoxCollider>();
- collider.isTrigger = true;
- collider.size = new Vector3(2, 2, 1);
- Renderer renderer = gameObject.GetComponentInChildren<Renderer>();
- renderer.material = new Material(Shader.Find("Transparent/Diffuse"))
- {
- mainTexture = texture
- };
- gameObject.AddComponent<StarTextureScript>();
- return gameObject;
- }
- private static float GetSizeForPixels(int px)
- {
- return 1f / 16f * px;
- }
- private static void MarkGeneration(int x, int y, int[][] arr)
- {
- if (x >= 0 && x < W && y >= 0 && y < H)
- arr[x][y] = 1;
- }
- private static bool CheckGeneration(int x, int y, int[][] arr)
- {
- if (x >= 0 && x < W && y >= 0 && y < H)
- if (arr[x][y] == 0)
- return true;
- else return false;
- return true;
- }
- private static IEnumerator SpawnEnemy(string s, Vector3 pos)
- {
- yield return new WaitForSeconds(1);
- Network.Instantiate(Resources.Load(s), pos, Quaternion.identity, 0);
- yield break;
- }
- public static void StartGenarateWorld(SpawnerScript s, int[] param)
- {
- s.StartCoroutine(GenarateWorld(s, param));
- }
- public static IEnumerator GenarateWorld(SpawnerScript s, int[] param)
- {
- yield return new WaitForSeconds(0.1f);
- long seed = 0;
- string seedString = "";
- for (int i = 1; i < param.Length; i++)
- {
- seed += param[i];
- seed *= 10;
- }
- for (int i = 1; i < param.Length; i++)
- seedString += " " + param[i];
- Core.logger.Log("Generating world with seed:" + seed + " - " + seed.GetHashCode() + " - " + seedString);
- Random random = new Random(seed.GetHashCode());
- Random serverRandom = new Random();
- //s.backLights.SetActive(true);
- s.mainLight.SetActive(true);
- s.mainLight.GetComponentInChildren<Light>().color = new Color(1f, 1f, 1f, 1f);
- Texture2D textureParalex0 = GadgetCoreAPI.LoadTexture2D("bSpacebg0.png");
- Texture2D textureMeteor1 = GadgetCoreAPI.LoadTexture2D("meteor1.png");
- Texture2D textureMeteor3 = GadgetCoreAPI.LoadTexture2D("meteor3.png");
- Texture2D textureMeteor4 = GadgetCoreAPI.LoadTexture2D("meteor4.png");
- Texture2D textureStars = GadgetCoreAPI.LoadTexture2D("stars.png");
- var fieldChunks = typeof(SpawnerScript).GetField("chunks", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
- var chunks = fieldChunks.GetValue(s) as GameObject[];
- var baseObject = new GameObject();
- var chunk = baseObject.AddComponent<Chunk>();
- chunks[0] = baseObject;
- var objects = new List<GameObject>();
- GetStarTextureObject(textureStars).AddToWorld(baseObject);
- int[][] genSpots = new int[W][];
- for (int i = 0; i < W; i++)
- genSpots[i] = new int[H];
- {
- int x = 15;
- int y = 10;
- for (int xOff = -2; xOff < 3; xOff++)
- for (int yOff = -2; yOff < 6; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(54), GetSizeForPixels(54), x * 4, y * 4, textureMeteor1).AddToWorld(baseObject);
- }
- {
- int r = 0;
- int overflow = 0;
- int x = random.Next(W / 2) + W / 2;
- int y = random.Next(H / 2) + H / 2;
- bool addLoopPortal = false;
- foreach (var gadget in GadgetCore.API.Gadgets.ListAllEnabledGadgets())
- if (gadget.Info?.ModName == "Loop Portal")
- {
- addLoopPortal = true;
- break;
- }
- while (overflow < 1000 && r < 3)
- {
- overflow++;
- bool noGen = false;
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 4; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- if (!noGen)
- {
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 4; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(54), GetSizeForPixels(54), x * 4, y * 4, textureMeteor1).AddToWorld(baseObject);
- if (Network.isServer)
- {
- GameScript.endPortal[r] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(242 + x * 4 - 60, y * 4 - 60 + GetSizeForPixels(54) + 1.85f, 0f), Quaternion.identity, 0);
- GameScript.endPortalUA[r] = GameScript.endPortal[r].transform.GetChild(0).gameObject;
- GameScript.endPortal[r].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
- GameScript.endPortalUA[r].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { 0, 0, r });
- GameScript.endPortal[r].AddToWorld(baseObject);
- }
- r++;
- }
- x = Mathf.Min(x + random.Next(5) - 2, W);
- y = Mathf.Min(y + random.Next(5) - 2, H);
- }
- while (addLoopPortal && overflow < 5000)
- {
- overflow++;
- bool noGen = false;
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 4; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- if (!noGen)
- {
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 4; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(54), GetSizeForPixels(54), x * 4, y * 4, textureMeteor1).AddToWorld(baseObject);
- if (Network.isServer)
- {
- var i = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(242 + x * 4 - 60, y * 4 - 60 + GetSizeForPixels(54) + 1.85f, 0f), Quaternion.identity, 0);
- var iUA = i.transform.GetChild(0).gameObject;
- i.GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
- iUA.GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { SpawnerScript.curBiome, 0, 4 });
- i.transform.parent = GameScript.endPortal[0].transform;
- }
- break;
- }
- x = Mathf.Min(x + random.Next(5) - 2, W);
- y = Mathf.Min(y + random.Next(5) - 2, H);
- }
- }
- {
- int r = 0;
- int overflow = 0;
- while (overflow < 15000 && r < 700)
- {
- overflow++;
- int i = random.Next(6);
- int x = random.Next(W);
- int y = random.Next(H);
- bool noGen = false;
- switch (i)
- {
- case 0:
- case 1:
- case 2:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- break;
- case 3:
- case 4:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- break;
- case 5:
- for (int xOff = -2; xOff < 3; xOff++)
- for (int yOff = -2; yOff < 3; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- break;
- }
- if (!noGen)
- {
- r++;
- switch (i)
- {
- case 0:
- case 1:
- case 2:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(54), GetSizeForPixels(54), x * 4, y * 4, textureMeteor1).AddToWorld(baseObject);
- if (Network.isServer)
- {
- var position = new Vector3((float)(242 + x * 4 - 60), y * 4 - 60 + GetSizeForPixels(54) + 0.425f, 0f);
- //s.StartCoroutine(SpawnEnemy("e/wasp", position + new Vector3(0, 2, 0)));
- //var emeny = (GameObject)Network.Instantiate((GameObject)Resources.Load("e/axelarkBall"), position, Quaternion.identity, 0);
- if(serverRandom.Next(2) == 0)
- {
- var obj = (GameObject)Network.Instantiate(Core.objectSpaceOre.Object, position, Quaternion.identity, 0);
- obj.AddObjectToWorld(baseObject, objects);
- }
- else
- {
- var obj = (GameObject)Network.Instantiate(Core.objectSpaceOreBig.Object, position, Quaternion.identity, 0);
- obj.AddObjectToWorld(baseObject, objects);
- }
- //(GameObject)Resources.Load("obj/bugspot0")
- //bugspot.GetComponentInChildren<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
- //bugspot.GetComponentInChildren<EnemyScript>().enabled = true;
- //enemy.SetActive(true);
- //enemy.layer = 9;
- // Network.Instantiate(Resources.Load("e/pirate"), position + new Vector3(0, 2, 0), Quaternion.identity, 0);
- //s.StartCoroutine(SpawnEnemy("e/pirate", position + new Vector3(0, 2, 0)));
- }
- break;
- case 3:
- case 4:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(38), GetSizeForPixels(38), x * 4, y * 4, textureMeteor3).AddToWorld(baseObject);
- break;
- case 5:
- for (int xOff = -2; xOff < 3; xOff++)
- for (int yOff = -2; yOff < 3; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(128), GetSizeForPixels(128), x * 4, y * 4, textureMeteor4).AddToWorld(baseObject);
- break;
- }
- }
- }
- }
- var objArray = objects.ToArray();
- chunk.objectiveSpawn = objArray;
- yield break;
- }
- public static void GenarateTown(SpawnerScript s, int[] param)
- {
- long seed = 0;
- string seedString = "";
- for (int i = 1; i < param.Length; i++)
- {
- seed += param[i];
- seed *= 10;
- }
- for (int i = 1; i < param.Length; i++)
- seedString += " " + param[i];
- Core.logger.Log("Generating town with seed:" + seed + " - " + seedString);
- Random random = new Random((int)seed);
- //s.backLights.SetActive(true);
- s.mainLight.SetActive(true);
- s.mainLight.GetComponentInChildren<Light>().color = new Color(1f, 1f, 1f, 1f);
- Texture2D textureParalex0 = GadgetCoreAPI.LoadTexture2D("bSpacebg0.png");
- Texture2D textureMeteor1 = GadgetCoreAPI.LoadTexture2D("meteor1.png");
- Texture2D textureMeteor3 = GadgetCoreAPI.LoadTexture2D("meteor3.png");
- Texture2D textureMeteor4 = GadgetCoreAPI.LoadTexture2D("meteor4.png");
- Texture2D textureStars = GadgetCoreAPI.LoadTexture2D("stars.png");
- var fieldChunks = typeof(SpawnerScript).GetField("chunks", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
- var chunks = fieldChunks.GetValue(s) as GameObject[];
- var baseObject = new GameObject();
- chunks[0] = baseObject;
- GetStarTextureObject(textureStars).AddToWorld(baseObject);
- int[][] genSpots = new int[W][];
- for (int i = 0; i < W; i++)
- genSpots[i] = new int[H];
- if (false)
- {
- int x = 15;
- int y = 10;
- for (int xOff = -2; xOff < 3; xOff++)
- for (int yOff = -2; yOff < 6; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(54), GetSizeForPixels(54), x * 4, y * 4, textureMeteor1).AddToWorld(baseObject);
- }
- {
- int x = 22;
- int y = 10;
- GetBaseBlock(GetSizeForPixels(54), GetSizeForPixels(54), x * 4, y * 4, textureMeteor1).AddToWorld(baseObject);
- if (Network.isServer)
- {
- GameScript.endPortal[1] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(242 + x * 4 - 60, y * 4 - 60 + GetSizeForPixels(54) + 1.85f, 0f), Quaternion.identity, 0);
- GameScript.endPortalUA[1] = GameScript.endPortal[1].transform.GetChild(0).gameObject;
- GameScript.endPortal[1].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
- GameScript.endPortalUA[1].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { Core.spacePlanetId, 0, 1 });
- }
- }
- {
- int x = 15;
- int y = 10;
- GetBaseBlock(GetSizeForPixels(128), GetSizeForPixels(128), x * 4, y * 4, textureMeteor4).AddToWorld(baseObject);
- if (Network.isServer)
- {
- GameScript.endPortal[3] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(242 + x * 4 - 60, y * 4 - 60 + GetSizeForPixels(128) + 1.85f, 0f), Quaternion.identity, 0);
- GameScript.endPortalUA[3] = GameScript.endPortal[3].transform.GetChild(0).gameObject;
- GameScript.endPortal[3].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
- GameScript.endPortalUA[3].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { 98, 0, 3 });
- }
- }
- if (false)
- {
- int r = 0;
- int overflow = 0;
- while (overflow < 15000 && r < 700)
- {
- overflow++;
- int i = random.Next(6);
- int x = random.Next(W);
- int y = random.Next(H);
- bool noGen = false;
- switch (i)
- {
- case 0:
- case 1:
- case 2:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- break;
- case 3:
- case 4:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- break;
- case 5:
- for (int xOff = -2; xOff < 3; xOff++)
- for (int yOff = -2; yOff < 3; yOff++)
- if (!CheckGeneration(x + xOff, y + yOff, genSpots))
- noGen = true;
- break;
- }
- if (!noGen)
- {
- r++;
- switch (i)
- {
- case 0:
- case 1:
- case 2:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(54), GetSizeForPixels(54), x * 4, y * 4, textureMeteor1).AddToWorld(baseObject);
- break;
- case 3:
- case 4:
- for (int xOff = -1; xOff < 2; xOff++)
- for (int yOff = -1; yOff < 2; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(38), GetSizeForPixels(38), x * 4, y * 4, textureMeteor3).AddToWorld(baseObject);
- break;
- case 5:
- for (int xOff = -2; xOff < 3; xOff++)
- for (int yOff = -2; yOff < 3; yOff++)
- MarkGeneration(x + xOff, y + yOff, genSpots);
- GetBaseBlock(GetSizeForPixels(128), GetSizeForPixels(128), x * 4, y * 4, textureMeteor4).AddToWorld(baseObject);
- break;
- }
- }
- }
- }
- }
- }
- }
|