private static GameObject SpawnRoom(RoomLoader.Room room, RoomInfo position, Transform parent, bool onServer) { GameObject spawnedRoom = RoomLoader.SpawnRoom(room, new Vector3(position.Position.x * 495, position.Position.y * 277, 0), onServer); spawnedRoom.GetComponent <Room>().Position = position.Position; if (NetworkManagerCustom.IsServer && SerializationManager.World != null && SerializationManager.World.Objects[position.Position.x, position.Position.y] != null) { spawnedRoom.GetComponent <Room>().Initialized = true; } spawnedRoom.transform.parent = parent; List <GameObject> gates = Utils.GetComponentsRecursive <GateObject>(spawnedRoom).ConvertAll(x => x.gameObject); gates.ForEach(x => x.transform.Find("trigger").GetComponent <GateTrigger>().GetEventSystem <GateTrigger.EnterGateEvent>() .SubcribeEvent(y => OnGateEnter(y.Player, y.Sender, false))); foreach (GameObject gateObject in gates) { Vector2Int localPosition = GateInfo.RoomObjectToLocalPosition(gateObject.transform.localPosition); if (gateObject.GetComponent <GateObject>().gateType == 0) { gateObject.GetComponent <GateObject>().Enable = position.Gates.Exists(x => x.LocalPosition == localPosition); } } for (int x = 0; x < position.Size.x; x++) { for (int y = 0; y < position.Size.y; y++) { spawnedRooms[x + position.Position.x, y + position.Position.y] = spawnedRoom; } } spawnedRoom.SetActive(false); return(spawnedRoom); }
public static bool IsRoomValid(RoomLoader.Room room, RoomInfo position) { if (room != null && room.size == position.Size) { List <RoomObject> gatesObject = room.objects.Where(x => x.prefabName.Contains("Gate")).ToList(); foreach (RoomObject gateObject in gatesObject) { Vector2Int localPosition = GateInfo.RoomObjectToLocalPosition(gateObject.coords); int type = int.Parse(gateObject.data[0]); if (type == 1 && !position.Gates.Exists(x => x.LocalPosition == localPosition)) { return(false); } if (type == 2 && position.Gates.Exists(x => x.LocalPosition == localPosition)) { return(false); } } return(true); } return(false); }
private void Start() { if (isServer) { NetworkManagerCustomGUI gui = GameObject.Find("Manager").GetComponent <NetworkManagerCustomGUI>(); if (gui.StartArguments[0].Equals("new game")) { seedToGeneration = int.Parse(ServerEvents.singleton.SeedToGenerate); seedToSpawn = int.Parse(ServerEvents.singleton.SeedToSpawn); GenerationInfo generation = GetGeneration(seedToGeneration == 0 ? rnd.Next() : seedToGeneration); seedToSpawn = seedToSpawn == 0 ? rnd.Next() : seedToSpawn; GenerationManager.SpawnGeneration(RoomLoader.loadedRooms, generation, seedToSpawn, false); MessageManager.GetGenServerMessage.SendToServer(new EmptyMessage()); if (GameSettings.SettingVisualizeTestGeneration.Value) { GenerationManager.VisualizeGeneration(generation); } } else if (gui.StartArguments[0].Equals("load game")) { SerializationManager.LoadWorld(gui.StartArguments[1]); GenerationInfo generation = GetGeneration(SerializationManager.World.Info.SeedToGenerate); GenerationManager.SpawnGeneration(RoomLoader.loadedRooms, generation, SerializationManager.World.Info.SeedToSpawn, false); MessageManager.GetGenServerMessage.SendToServer(new EmptyMessage()); if (GameSettings.SettingVisualizeTestGeneration.Value) { GenerationManager.VisualizeGeneration(generation); } } else if (gui.StartArguments[0].Equals("test mode")) { GenerationManager.SetCurrentRoom(RoomLoader.SpawnRoom(RoomLoader.loadedRooms.Find(x => x.fileName.Equals(GameSettings.SettingTestRoomName.Value)), Vector3.zero, false)); GenerationManager.InitializeRoom(GenerationManager.currentRoom); GameObject player = Instantiate(LocalPlayer); Vector3 toPos = Vector3.zero; Transform parent = GenerationManager.currentRoom.transform.Find("Objects"); for (int i = 0; i < parent.childCount; i++) { if (parent.GetChild(i).name.Contains("playerPosition")) { toPos = parent.GetChild(i).position; } } player.transform.position = toPos + new Vector3(18, 25); if (ServerEvents.singleton.ServerOnlyProfile != null) { player.GetComponent <GameProfile>().Deserialize(ServerEvents.singleton.ServerOnlyProfile); } NetworkServer.AddPlayerForConnection(NetworkServer.connections[0], player, indexController++); } else if (gui.StartArguments[0].Equals("room editor")) { RoomLoader.Room room = RoomLoader.LoadRoom(Application.streamingAssetsPath + "/room.json", Encoding.UTF8); GenerationManager.SetCurrentRoom(RoomLoader.SpawnRoom(room, Vector3.zero, false)); RoomLoader.loadedRooms.Add(room); GenerationManager.InitializeRoom(GenerationManager.currentRoom); string[] gateInfo = File.ReadAllLines(Application.streamingAssetsPath + "/gate.txt", Encoding.UTF8); GameObject.Find("startPosition").transform.position = new Vector3(int.Parse(gateInfo[0]), int.Parse(gateInfo[1]), -1f); doStartForce = bool.Parse(gateInfo[2]); GameObject player = Instantiate(LocalPlayer); player.transform.position = GameObject.Find("startPosition").transform.position; NetworkServer.AddPlayerForConnection(NetworkServer.connections[0], player, indexController++); } } else { MessageManager.GetGenServerMessage.SendToServer(new EmptyMessage()); } }
public void CheckReservedRooms() { for (int i = 0; i < reservedRooms.Count; i++) { RoomLoader.Room roomObject = RoomLoader.loadedRooms.Find(x => x.fileName.Equals(reservedRooms[i].ReservedRoomName)); if (roomObject == null) { Debug.LogWarning("Reserved room names: " + reservedRooms[i].ReservedRoomName + " not found"); continue; } List <RoomObject> gateObjects = roomObject.objects.FindAll(x => x.prefabName.Contains("Gate")); if (gateObjects.Count % 2 == 1) { Debug.LogWarning("Gate count in room names: " + reservedRooms[i].ReservedRoomName + " is not even"); continue; } reservedRooms[i].GenerateGates(rooms); Dictionary <GateInfo, int> gateTypes = new Dictionary <GateInfo, int>(); foreach (RoomObject gateObject in gateObjects) { Vector3 coords = gateObject.coords; int side = coords.y == 0 ? 0 : (coords.y + 23) % 277 == 0 ? 1 : coords.x == 0 ? 2 : 3; int index = side == 0 || side == 1 ? ((int)coords.x - 214) / 495 : ((int)coords.y - 105) / 277; Vector2Int gateObjectLocation = new Vector2Int(side, index); GateInfo currentGate = reservedRooms[i].Gates.Find(x => x.LocalPosition == gateObjectLocation); gateTypes.Add(currentGate, int.Parse(gateObject.data[0])); } List <GateInfo> gates = gateTypes.Keys.ToList(); List <GateInfo> toRemoveWithStartEnd = new List <GateInfo>(); List <GateInfo> toRemoveWithoutStartEnd = new List <GateInfo>(); foreach (GateInfo gate in gates) { if (rooms[gate.RoomTo.x, gate.RoomTo.y] == null && gateTypes[gate] == 1) { Vector2Int vec = gate.GetScaledVector(reservedRooms[i].Size); Vector2Int newVec = reservedRooms[i].Position + vec; Rooms[newVec.x, newVec.y] = new RoomInfo(newVec); } else if (rooms[gate.RoomTo.x, gate.RoomTo.y] != null && gateTypes[gate] == 2) { bool toStartOrEnd = IsGateToStartOrEnd(gate); bool reserved = IsGateToReserved(gate); if (toStartOrEnd) { toRemoveWithStartEnd.Add(gate); } else if (!reserved) { toRemoveWithoutStartEnd.Add(gate); } else { reservedRooms[i].IsReserved = false; reservedRooms[i].ReservedRoomName = null; reservedRooms.RemoveAt(i); continue; } } } if (toRemoveWithStartEnd.Count == 1) { reservedRooms[i].IsReserved = false; reservedRooms[i].ReservedRoomName = null; reservedRooms.RemoveAt(i); continue; } if (toRemoveWithStartEnd.Count != 0) { toRemoveWithStartEnd.RemoveAt(0); } reservedRooms[i].Gates.RemoveAll(x => { bool removeWithoutStartEnd = toRemoveWithoutStartEnd.Contains(x); if (removeWithoutStartEnd) { RemoveFromGateRecursive(x); } return(removeWithoutStartEnd || toRemoveWithStartEnd.Contains(x)); }); } }