public TLTransitSession(ShipBase leader, int direction, Tradelane currentTradelane) { Passengers = new List <ShipBase>(); PassengerTargetRotations = new Dictionary <ShipBase, Quaternion>(); PassengerTargetPositions = new Dictionary <ShipBase, RelLoc>(); Party = leader.MyAI.MyParty; LeaderPassenger = leader; Direction = direction; Stage = TLSessionStage.None; CurrentTradelane = currentTradelane; if (Direction == -1) { CurrentTrigger = CurrentTradelane.TriggerA; } else { CurrentTrigger = CurrentTradelane.TriggerB; } if (leader == GameManager.Inst.PlayerControl.PlayerShip) { GameManager.Inst.PlayerControl.CurrentTradelaneSession = this; } }
public FrayteTradelane SaveTradelane(FrayteTradelane frateTradelane) { try { Tradelane tradelane; if (frateTradelane.TradelaneId > 0) { tradelane = dbContext.Tradelanes.Where(p => p.TradelaneId == frateTradelane.TradelaneId).FirstOrDefault(); tradelane.OriginatingAgentId = frateTradelane.OriginatingAgent.UserId; tradelane.OriginCountryId = frateTradelane.OriginatingCountry.CountryId; tradelane.DestinationAgentId = frateTradelane.DestinationAgent.UserId; tradelane.DestinationCountryId = frateTradelane.DestinationCountry.CountryId; tradelane.Direct = frateTradelane.Direct; tradelane.Deffered = frateTradelane.Deffered; tradelane.CarrierId = frateTradelane.Carrier.CarrierId; tradelane.TransitTime = frateTradelane.TransitTime; dbContext.SaveChanges(); frateTradelane.TradelaneId = tradelane.TradelaneId; } else { tradelane = new Tradelane(); tradelane.OriginatingAgentId = frateTradelane.OriginatingAgent.UserId; tradelane.OriginCountryId = frateTradelane.OriginatingCountry.CountryId; tradelane.DestinationAgentId = frateTradelane.DestinationAgent.UserId; tradelane.DestinationCountryId = frateTradelane.DestinationCountry.CountryId; tradelane.Direct = frateTradelane.Direct; tradelane.Deffered = frateTradelane.Deffered; tradelane.CarrierId = frateTradelane.Carrier.CarrierId; tradelane.TransitTime = frateTradelane.TransitTime; dbContext.Tradelanes.Add(tradelane); dbContext.SaveChanges(); frateTradelane.TradelaneId = tradelane.TradelaneId; } return(frateTradelane); } catch (Exception ex) { return(null); } }
public FrayteResult DeleteTradelane(int tradelaneId) { FrayteResult result = new FrayteResult(); try { var tradelane = new Tradelane { TradelaneId = tradelaneId }; dbContext.Tradelanes.Attach(tradelane); dbContext.Tradelanes.Remove(tradelane); dbContext.SaveChanges(); result.Status = true; } catch (Exception ex) { result.Status = false; result.Errors = new List <string>(); result.Errors.Add(ex.Message); } return(result); }
public override BTResult Process() { if (MyParty == null) { return(Exit(BTResult.Fail)); } if (MyParty.IsPlayerParty && !GameManager.Inst.PlayerControl.IsAutopilot) { Debug.Log("autopilot disabled!"); return(Exit(BTResult.Fail)); } bool isFollowerDock = false; if (Parameters.Count > 0 && Parameters[0] == "LeaderDockedStation") { isFollowerDock = true; } if (!isFollowerDock) { if (MyParty.NextNode == null) { //Debug.Log("isdocked " + MyAI.IsDocked + " my party null? " + (MyParty == null) + " next node null? " + (MyParty.NextNode == null)); return(Exit(BTResult.Fail)); } } if (isFollowerDock || MyParty.NextNode.NavNodeType == NavNodeType.Station) { NavNode dockNode; if (isFollowerDock) { //Debug.Log(MyParty.DockedStationID + " I am " + MyAI.MyShip.name); dockNode = GameManager.Inst.WorldManager.AllNavNodes[MyParty.DockedStationID]; if (MyParty.SpawnedShipsLeader.DockedStationID == "") { return(Exit(BTResult.Fail)); } } else { dockNode = MyParty.NextNode; //if not destination then don't dock, just get close enough and move on to next node in GoTo if (MyParty.CurrentTask.TravelDestNodeID != dockNode.ID) { return(Exit(BTResult.Fail)); } } //GameObject.Find("Sphere").transform.position = (Vector3)MyAI.Whiteboard.Parameters["Destination"]; //if too far away from station then go to node if (Vector3.Distance(MyAI.MyShip.transform.position, dockNode.Location.RealPos) > 40) { _dockingStage = 0; MyAI.Whiteboard.Parameters["Destination"] = dockNode.Location.RealPos; //Debug.Log("BTDockAtNextNode: running, going towards station position " + MyParty.NextNode.Location.RealPos); return(Running()); } else if (_dockingStage == 0) { _dockingStage = 1; } if (MyAI.MyShip.DockedStationID == dockNode.ID) { MyAI.MyShip.Hide(); MyParty.DockedStationID = dockNode.ID; //Debug.Log("Finished docking, " + MyParty.DockedStationID); if (MyAI.MyShip == MyParty.SpawnedShipsLeader) { bool allDocked = true; foreach (ShipBase member in MyAI.MyParty.SpawnedShips) { if (member != MyAI.MyShip && member.DockedStationID == "") { allDocked = false; } } if (allDocked) { Debug.LogError("Everyone has docked! " + MyParty.DockedStationID); return(Exit(BTResult.Success)); } else { //Debug.Log("Dock at station running"); return(Running()); } } else { return(Exit(BTResult.Success)); } } if (_currentSession == null) { DockRequestResult result = GameManager.Inst.WorldManager.CurrentSystem.GetStationByID(dockNode.ID).Dock(MyAI.MyShip, out _currentSession); if (result == DockRequestResult.Busy) { //Debug.Log("Dock at station running"); MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; return(Running()); } else if (result == DockRequestResult.Deny) { return(Exit(BTResult.Fail)); } else { //Debug.Log("BTDockAtNextNode: running"); return(Running()); } } else { //find dock start DockingSession session = (DockingSession)_currentSession; Vector3 dockStartV3 = session.GetDockEnterTarget(); _dockStart = new RelLoc(_origin.position, dockStartV3, _origin); if (!MyAI.MyShip.IsInPortal) { if (Vector3.Distance(MyAI.MyShip.transform.position, _dockStart.RealPos) >= 3) { //fly towards docking target MyAI.Whiteboard.Parameters["Destination"] = _dockStart.RealPos; } else { MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; } } //Debug.Log("BTDockAtNextNode: running"); return(Running()); } } else if (MyParty.NextNode.NavNodeType == NavNodeType.Tradelane) { if (MyParty.DestNode.ID == MyParty.NextNode.ID && MyParty.CurrentTLSession == null) { return(Exit(BTResult.Fail)); } if (MyAI.IsDocked) { return(Exit(BTResult.Fail)); } //Debug.Log("Docking stage " + _dockingStage + " - " + MyAI.name); //if already in tradelane then do a midway dock on prevNode tradelane if (Vector3.Distance(MyAI.MyShip.transform.position, GameManager.Inst.PlayerControl.PlayerShip.transform.position) > 500 && MyParty.PrevNode != null && MyParty.PrevNode.NavNodeType == NavNodeType.Tradelane && MyParty.NextNode.NavNodeType == NavNodeType.Tradelane && !MyAI.MyShip.IsInPortal && MyParty.CurrentTLSession == null) { int direction = 0; TradelaneData prevTL = (TradelaneData)MyParty.PrevNode; TradelaneData nextTL = (TradelaneData)MyParty.NextNode; if (prevTL.NeighborAID == nextTL.ID) { direction = -1; } else if (prevTL.NeighborBID == nextTL.ID) { direction = 1; } if (direction != 0) { Tradelane currentLane = GameManager.Inst.WorldManager.CurrentSystem.GetTradelaneByID(prevTL.ID); DockSessionBase s; Debug.LogError("Start midway dock I am " + MyAI.MyShip.name); DockRequestResult result = currentLane.MidwayDock(MyAI.MyShip, out s, direction); if (result == DockRequestResult.Busy) { MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; //Debug.Log("Dock at station running"); return(Running()); } else if (result == DockRequestResult.Deny) { return(Exit(BTResult.Fail)); } else { //Debug.Log("BTDockAtNextNode: midway dock granted, running"); MyParty.CurrentTLSession = (TLTransitSession)s; _dockingStage = 2; return(Running()); } } } if (MyParty.CurrentTLSession == null) { //if too far away from station then go to float distToNextNode = Vector3.Distance(MyAI.MyShip.transform.position, MyParty.NextNode.Location.RealPos); if (distToNextNode > 40) { //Debug.Log("BTDockAtNextNode: distToNextNode " + distToNextNode); _dockingStage = 0; MyAI.Whiteboard.Parameters["Destination"] = MyParty.NextNode.Location.RealPos; //Debug.Log("BTDockAtNextNode: running next node " + MyParty.NextNode.ID); return(Running()); } else if (_dockingStage == 0) { _dockingStage = 1; } Tradelane currentLane = GameManager.Inst.WorldManager.CurrentSystem.GetTradelaneByID(MyParty.NextNode.ID); if (_dockStart == null) { //need to decide if we want to dock here. find the next node after the tradelane, if it's //a trade lane and is this tradelane's neighbor then dock. if not, return fail NavNode nextNextNode = MyParty.NextNextNode; Vector3 dockStartV3 = Vector3.zero; if (nextNextNode != null && nextNextNode.NavNodeType == NavNodeType.Tradelane) { if (nextNextNode.ID == currentLane.NeighborAID) { dockStartV3 = currentLane.TriggerA.transform.position - (currentLane.TriggerA.transform.forward + new Vector3(UnityEngine.Random.Range(-0.3f, 0.3f), UnityEngine.Random.Range(-0.3f, 0.3f), UnityEngine.Random.Range(-0.3f, 0.3f))).normalized * UnityEngine.Random.Range(10f, 30f); } else if (nextNextNode.ID == currentLane.NeighborBID) { dockStartV3 = currentLane.TriggerB.transform.position - (currentLane.TriggerB.transform.forward + new Vector3(UnityEngine.Random.Range(-0.3f, 0.3f), UnityEngine.Random.Range(-0.3f, 0.3f), UnityEngine.Random.Range(-0.3f, 0.3f))).normalized * UnityEngine.Random.Range(10f, 30f); } else { return(Exit(BTResult.Fail)); } } else { return(Exit(BTResult.Fail)); } _dockStart = new RelLoc(_origin.position, dockStartV3, _origin); } //GameObject.Find("Sphere").transform.position = _dockStart.RealPos; if (_dockingStage == 1) { if (Vector3.Distance(_dockStart.RealPos, MyAI.MyShip.transform.position) > 5) { MyAI.Whiteboard.Parameters["Destination"] = _dockStart.RealPos; //Debug.Log("BTDockAtNextNode: going to dock start " + Vector3.Distance(_dockStart.RealPos, MyAI.MyShip.transform.position)); return(Running()); } else { MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; _dockingStage = 2; } } } MyAI.Whiteboard.Parameters["IgnoreAvoidance"] = true; if (MyParty.CurrentTLSession != null && MyAI.MyShip.IsInPortal) { float distToNextNode = Vector3.Distance(MyAI.MyShip.transform.position, MyParty.NextNode.Location.RealPos); //Debug.Log(distToNextNode + " next node " + MyParty.NextNode.ID); if (distToNextNode < 10) { if (MyParty.NextNextNode == null || MyParty.NextNextNode.NavNodeType != NavNodeType.Tradelane) { MyParty.CurrentTLSession.Stage = TLSessionStage.Cancelling; Debug.LogError("BTDockAtNextNode tradelane: cancel sent"); } MyParty.PrevNode = MyParty.NextNode; Debug.LogError("BTDockAtNextNode tradelane: Successful " + MyParty.NextNode.ID); return(Exit(BTResult.Success)); } else { //Debug.Log("Dock at station running"); return(Running()); } } if (MyParty.CurrentTLSession == null) { Tradelane currentLane = GameManager.Inst.WorldManager.CurrentSystem.GetTradelaneByID(MyParty.NextNode.ID); DockSessionBase s; DockRequestResult result = currentLane.Dock(MyAI.MyShip, out s); if (result == DockRequestResult.Busy) { //Debug.Log("tradelane is busy"); MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; return(Running()); } else if (result == DockRequestResult.Deny) { return(Exit(BTResult.Fail)); } else { //Debug.Log("BTDockAtNextNode: dock request granted, running"); MyParty.CurrentTLSession = (TLTransitSession)s; return(Running()); } } else { if (!MyAI.MyShip.IsInPortal) { if (MyAI.MyShip.RB.velocity.magnitude < 0.1f || _dockingStage == 3) { Tradelane currentLane = GameManager.Inst.WorldManager.CurrentSystem.GetTradelaneByID(MyParty.NextNode.ID); if (currentLane.GetTLSessionDockingStage(MyParty.CurrentTLSession) >= 2) { //fly towards docking trigger Vector3 dockingTrigger = MyParty.CurrentTLSession.CurrentTrigger.transform.position; MyAI.Whiteboard.Parameters["Destination"] = dockingTrigger; _dockingStage = 3; } } else if (_dockingStage == 2) { MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; } } //Debug.Log("BTDockAtNextNode: running"); return(Running()); } } else if (MyParty.NextNode.NavNodeType == NavNodeType.JumpGate) { //if destination is in same system then don't dock if (MyParty.CurrentTask.TravelDestSystemID == GameManager.Inst.WorldManager.CurrentSystem.ID || MyAI.IsDocked) { return(Exit(BTResult.Fail)); } //Debug.Log("Trying to dock at jump gate"); JumpGate jg = (JumpGate)GameManager.Inst.WorldManager.CurrentSystem.GetStationByID(MyParty.NextNode.ID); if (_waitDistance == 0) { _waitDistance = UnityEngine.Random.Range(25f, 40f); } Vector3 dockStartV3 = jg.DockingTrigger.transform.position + jg.DockingTrigger.transform.up * 20; _dockStart = new RelLoc(_origin.position, dockStartV3, _origin); //if too far away from station then go to if (Vector3.Distance(MyAI.MyShip.transform.position, MyParty.NextNode.Location.RealPos) > _waitDistance) { MyAI.Whiteboard.Parameters["Destination"] = _dockStart.RealPos; //Debug.Log("BTDockAtNextNode: running " + _waitDistance); return(Running()); } MyParty.PrevNode = MyParty.NextNode; if (!jg.IsGateActive && !jg.IsPortalReady) { DockSessionBase session; jg.Dock(MyAI.MyShip, out session); } if (jg.IsGateActive && jg.IsPortalReady) { //first go to docking trigger Y + 10 and then towards docking trigger if (_dockingStage <= 0) { MyAI.Whiteboard.Parameters["Destination"] = _dockStart.RealPos; if (Vector3.Distance(MyAI.MyShip.transform.position, _dockStart.RealPos) <= 5) { _dockingStage = 1; } //Debug.Log("Going to dockstart"); } else if (_dockingStage == 1) { Debug.Log("Tring to stop at dock start " + MyAI.MyShip.RB.velocity.magnitude); if (MyAI.MyShip.RB.velocity.magnitude > 0.1f) { MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; } else { _dockingStage = 2; } } else if (_dockingStage >= 2) { MyAI.Whiteboard.Parameters["IgnoreAvoidance"] = true; MyAI.Whiteboard.Parameters["Destination"] = jg.DockingTrigger.transform.position; //Debug.Log("Going to dock trigger"); } //GameObject.Find("Sphere").transform.position = (Vector3)MyAI.Whiteboard.Parameters["Destination"]; //Debug.Log("BTDockAtNextNode: running"); return(Running()); } else { if (Vector3.Distance(MyAI.MyShip.transform.position, _dockStart.RealPos) <= 5) { MyAI.Whiteboard.Parameters["Destination"] = Vector3.zero; } else { MyAI.Whiteboard.Parameters["Destination"] = _dockStart.RealPos; } //Debug.Log("BTDOckAtNextNode: waiting for jumpgate to start"); return(Running()); } } return(Exit(BTResult.Fail)); }
public void UpdateTransit() { //Debug.Log("TLTransit stage " + Stage + " parent lane " + CurrentTradelane.ID + " party " + Party.PartyNumber); if (Party == null || Party.SpawnedShips.Count <= 0) { CurrentTradelane.ClearSession(Direction); if (NextTrigger != null) { ((Tradelane)NextTrigger.ParentStation).ClearSession(Direction); } Stage = TLSessionStage.None; return; } if (Stage == TLSessionStage.Initializing) { SetupPassengers(); Stage = TLSessionStage.Entering; } if (Stage == TLSessionStage.Entering) { //move leader to current lane's detector's position LeaderPassenger.transform.position = Vector3.Lerp(LeaderPassenger.transform.position, PassengerTargetPositions[LeaderPassenger].RealPos, Time.fixedDeltaTime * 1); //make leader look towards trigger's up LeaderPassenger.transform.rotation = Quaternion.Lerp(LeaderPassenger.transform.rotation, PassengerTargetRotations[LeaderPassenger], Time.fixedDeltaTime * 1); //check if all passengers are in place if (CheckPassengersInPosition()) { foreach (ShipBase passenger in Passengers) { passenger.IsInPortal = true; passenger.InPortalStationType = StationType.Tradelane; } Stage = TLSessionStage.FindingDest; } } else if (Stage == TLSessionStage.FindingDest) { if (Direction == -1) { if (CurrentTradelane.NeighborToA != null) { NextTrigger = CurrentTradelane.NeighborToA.TriggerA; Stage = TLSessionStage.Sending; } else { //this is the terminal NextTrigger = CurrentTradelane.TriggerA; Stage = TLSessionStage.Exiting; } } else { if (CurrentTradelane.NeighborToB != null) { NextTrigger = CurrentTradelane.NeighborToB.TriggerB; Stage = TLSessionStage.Sending; } else { Debug.Log("exiting!"); //this is the terminal NextTrigger = CurrentTradelane.TriggerB; Stage = TLSessionStage.Exiting; } } } else if (Stage == TLSessionStage.Sending) { float topSpeed = 90f; float acceleration = 20f; _currentSpeed = Mathf.Clamp(_currentSpeed + acceleration * Time.fixedDeltaTime, 0, topSpeed); float totalDist = Vector3.Distance(NextTrigger.ParentStation.transform.position, CurrentTradelane.transform.position); Vector3 direction = (NextTrigger.transform.position - LeaderPassenger.transform.position).normalized; LeaderPassenger.transform.position = LeaderPassenger.transform.position + direction * _currentSpeed * Time.fixedDeltaTime; LeaderPassenger.transform.LookAt(NextTrigger.transform); UpdatePassengersPositionRotation(); LeaderPassenger.InPortalSpeed = _currentSpeed; //unbusy the current lane float myDist = Vector3.Distance(LeaderPassenger.transform.position, NextTrigger.transform.position); if (myDist / totalDist < 0.66f && myDist / totalDist > 0.2f) { if (CurrentTradelane.IsSessionOnMe(this)) { CurrentTradelane.ClearSession(Direction); } ((Tradelane)NextTrigger.ParentStation).AssignLiveSession(Direction, this); } //if 4/5 way in, go back to FindingDest if (myDist / totalDist <= 0.2f) { CurrentTradelane = ((Tradelane)NextTrigger.ParentStation); Stage = TLSessionStage.FindingDest; } } else if (Stage == TLSessionStage.Exiting) { float acceleration = -40f; float slowAcceleration = -25f; Vector3 direction = CurrentTrigger.transform.forward; if (NextTrigger != null) { direction = (NextTrigger.transform.position - LeaderPassenger.transform.position); //float distToTrigger = Vector3.Distance(NextTrigger.transform.position, LeaderPassenger.transform.position); if (direction.magnitude < 50) { direction = NextTrigger.transform.forward; } if (Vector3.Angle((LeaderPassenger.transform.position - NextTrigger.transform.position), NextTrigger.transform.forward) < 90) { _currentSpeed = Mathf.Clamp(_currentSpeed + acceleration * Time.fixedDeltaTime, 0, 100); } else { _currentSpeed = Mathf.Clamp(_currentSpeed + slowAcceleration * Time.fixedDeltaTime, 20, 100); } } LeaderPassenger.transform.position = LeaderPassenger.transform.position + direction.normalized * _currentSpeed * Time.fixedDeltaTime; UpdatePassengersPositionRotation(); LeaderPassenger.InPortalSpeed = _currentSpeed; if (_currentSpeed <= 0) { LeaderPassenger.InPortalSpeed = 0; LeaderPassenger.IsInPortal = false; foreach (ShipBase passenger in Passengers) { passenger.IsInPortal = false; } CurrentTradelane.ClearSession(Direction); Stage = TLSessionStage.None; if (LeaderPassenger == GameManager.Inst.PlayerControl.PlayerShip) { GameManager.Inst.PlayerControl.CurrentTradelaneSession = null; } else { LeaderPassenger.MyAI.MyParty.CurrentTLSession = null; } } } else if (Stage == TLSessionStage.Cancelling) { float acceleration = -60f; Vector3 direction = CurrentTrigger.transform.forward; if (NextTrigger != null) { direction = (NextTrigger.transform.position - LeaderPassenger.transform.position); if (Vector3.Angle((LeaderPassenger.transform.position - NextTrigger.transform.position), NextTrigger.transform.forward) < 90) { direction = NextTrigger.transform.forward; } } _currentSpeed = Mathf.Clamp(_currentSpeed + acceleration * Time.fixedDeltaTime, 0, 100); LeaderPassenger.transform.position = LeaderPassenger.transform.position + direction.normalized * _currentSpeed * Time.fixedDeltaTime; UpdatePassengersPositionRotation(); LeaderPassenger.InPortalSpeed = _currentSpeed; //Debug.LogError(_currentSpeed); if (_currentSpeed <= 0) { LeaderPassenger.InPortalSpeed = 0; LeaderPassenger.IsInPortal = false; foreach (ShipBase passenger in Passengers) { passenger.IsInPortal = false; } CurrentTradelane.ClearSession(Direction); if (NextTrigger != null) { ((Tradelane)NextTrigger.ParentStation).ClearSession(Direction); } Stage = TLSessionStage.None; if (LeaderPassenger == GameManager.Inst.PlayerControl.PlayerShip) { GameManager.Inst.PlayerControl.CurrentTradelaneSession = null; } LeaderPassenger.MyAI.MyParty.CurrentTLSession = null; } } }
public StarSystem GenerateSystemScene(string id) { string path = Application.dataPath + "/GameData/StarSystem/" + id + ".xml"; StarSystemData system = LoadStarSystemData(path, true); StarSystem starSystem = new StarSystem(system.ID, system.DisplayName); RenderSettings.skybox = Resources.Load <Material>(system.SkyboxName); RenderSettings.ambientLight = system.AmbientColor; starSystem.AmbientColor = system.AmbientColor; foreach (SunData sunData in system.Suns) { GameObject sunObject = GameObject.Instantiate(Resources.Load(sunData.ID)) as GameObject; sunObject.name = sunData.ID; Sun sun = sunObject.GetComponent <Sun>(); sun.transform.position = sunData.Location.RealPos; sun.transform.localScale = sunData.Scale; sun.Sunlight.color = sunData.Color; sun.Sunlight.intensity = sunData.Intensity; starSystem.Suns.Add(sun); } foreach (PlanetData planetData in system.Planets) { GameObject planetObject = GameObject.Instantiate(Resources.Load(planetData.ID)) as GameObject; planetObject.name = planetData.ID; Planet planet = planetObject.GetComponent <Planet>(); planet.transform.position = planetData.Location.RealPos; planet.transform.localScale = planetData.OriginalScale; planet.OriginalScale = planetData.OriginalScale; starSystem.Planets.Add(planet); } foreach (StationData stationData in system.Stations) { GameObject stationObject = GameObject.Instantiate(Resources.Load(stationData.ID)) as GameObject; stationObject.name = stationData.ID; StationBase station = stationObject.GetComponent <StationBase>(); station.transform.position = stationData.Location.RealPos; station.transform.eulerAngles = stationData.EulerAngles; starSystem.Stations.Add(station); } foreach (JumpGateData jumpGateData in system.JumpGates) { GameObject stationObject = GameObject.Instantiate(Resources.Load("JumpGate")) as GameObject; stationObject.name = jumpGateData.ID; JumpGate gate = stationObject.GetComponent <JumpGate>(); gate.ID = jumpGateData.ID; gate.transform.position = jumpGateData.Location.RealPos; gate.transform.eulerAngles = jumpGateData.EulerAngles; gate.TargetSystem = jumpGateData.TargetSystem; gate.ExitGateID = jumpGateData.ExitGateID; starSystem.Stations.Add(gate); } foreach (TradelaneData tradelaneData in system.Tradelanes) { GameObject tlObject = GameObject.Instantiate(Resources.Load("Tradelane")) as GameObject; tlObject.name = tradelaneData.ID; Tradelane tl = tlObject.transform.Find("TradelaneBody").GetComponent <Tradelane>(); tlObject.transform.position = tradelaneData.Location.RealPos; tlObject.transform.eulerAngles = tradelaneData.EulerAngles; tl.ID = tradelaneData.ID; tl.DisplayName = tradelaneData.DisplayName; tl.IsTerminalAorB = tradelaneData.IsTerminalAorB; tl.NeighborAID = tradelaneData.NeighborAID; tl.NeighborBID = tradelaneData.NeighborBID; tl.NeighborToA = null; tl.NeighborToB = null; starSystem.Tradelanes.Add(tl); } //now assign neighbors to tradelanes List <Tradelane> tradelanes = starSystem.Tradelanes; foreach (Tradelane tl in tradelanes) { foreach (Tradelane neighbor in tradelanes) { if (tl.NeighborAID == neighbor.ID) { tl.NeighborToA = neighbor; } if (tl.NeighborBID == neighbor.ID) { tl.NeighborToB = neighbor; } } } return(starSystem); }