public override void Apply(NetworkSkin skin) { if (skin.m_lanes == null) { return; } for (var l = 0; l < skin.m_lanes.Length; l++) { var laneProps = skin.m_lanes[l]?.m_laneProps?.m_props; if (laneProps == null) { continue; } for (var p = 0; p < laneProps.Length; p++) { if (StreetLightUtils.IsStreetLightProp(laneProps[p]?.m_finalProp)) { skin.UpdateLaneProp(l, p, laneProp => { laneProp.m_prop = StreetLight; laneProp.m_finalProp = StreetLight; laneProp.m_repeatDistance = RepeatDistance; StreetLightUtils.CorrectStreetLightPropAngleAndPosition(skin.Prefab, laneProp, skin.Prefab.m_halfWidth, skin.m_lanes[l].m_position); }); } } } }
private Dictionary <NetInfo, PropInfo> GetDefaultStreetLights() { var defaultStreetLights = new Dictionary <NetInfo, PropInfo>(); var groundStreetLight = StreetLightUtils.GetDefaultStreetLight(Prefab); if (groundStreetLight != null) { defaultStreetLights[Prefab] = groundStreetLight; } var elevatedPrefab = NetUtils.GetElevatedPrefab(Prefab); if (elevatedPrefab != null) { var elevatedStreetLight = StreetLightUtils.GetDefaultStreetLight(elevatedPrefab); if (elevatedStreetLight != null) { defaultStreetLights[elevatedPrefab] = elevatedStreetLight; } } var bridgePrefab = NetUtils.GetBridgePrefab(Prefab); if (bridgePrefab != null) { var bridgeStreetLight = StreetLightUtils.GetDefaultStreetLight(bridgePrefab); if (bridgeStreetLight != null) { defaultStreetLights[bridgePrefab] = bridgeStreetLight; } } return(defaultStreetLights); }
protected override void BuildWithModifiers(List <NetworkSkinModifier> modifiers) { base.BuildWithModifiers(modifiers); DefaultRepeatDistance = StreetLightUtils.GetDefaultRepeatDistance(Prefab); SelectedRepeatDistance = GetSelectedRepeatDistanceFromModifiers(modifiers) ?? DefaultRepeatDistance; SaveSelectedRepeatDistance(); }
protected override void Build() { base.Build(); // Use repeat distance of the ground version of the road DefaultRepeatDistance = StreetLightUtils.GetDefaultRepeatDistance(Prefab); SelectedRepeatDistance = LoadSelectedRepeatDistance() ?? DefaultRepeatDistance; }
protected override List <Item> BuildItems(ref Item defaultItem) { var defaultStreetLights = GetDefaultStreetLights(); if (defaultStreetLights.Count == 0) { return(new List <Item>()); } var items = new List <Item> { new SimpleItem("#NONE#", null) }; PropInfo singleDefaultStreetLight = null; var uniqueDefaultStreetLights = new HashSet <PropInfo>(defaultStreetLights.Values); if (uniqueDefaultStreetLights.Count == 1) { singleDefaultStreetLight = uniqueDefaultStreetLights.First(); } else { defaultItem = new DefaultVariantItem(); items.Add(defaultItem); } var streetLights = StreetLightUtils.GetAvailableStreetLights(); foreach (var streetLight in streetLights) { var item = new SimpleItem(streetLight.name, streetLight); items.Add(item); if (streetLight == singleDefaultStreetLight) { defaultItem = item; } } //Debug.Log($"Built {items.Count} street light items with default {singleDefaultStreetLight}"); return(items); }
protected override Dictionary <NetInfo, List <NetworkSkinModifier> > BuildModifiers() { var modifiers = new Dictionary <NetInfo, List <NetworkSkinModifier> >(); if (SelectedItem != null && SelectedItem is SimpleItem item) { // fix for nature trail with repeat distance 0f! var repeatDistance = DefaultRepeatDistance >= 2.0f ? SelectedRepeatDistance : DefaultRepeatDistance; if (item != DefaultItem || repeatDistance != DefaultRepeatDistance) { var prefabModifiers = new List <NetworkSkinModifier> { new StreetLightModifier(item.Value, repeatDistance) }; if (StreetLightUtils.HasSingularStreetLight(Prefab)) { modifiers[Prefab] = prefabModifiers; } var elevatedPrefab = NetUtils.GetElevatedPrefab(Prefab); if (StreetLightUtils.HasSingularStreetLight(elevatedPrefab)) { modifiers[elevatedPrefab] = prefabModifiers; } var bridgePrefab = NetUtils.GetBridgePrefab(Prefab); if (StreetLightUtils.HasSingularStreetLight(bridgePrefab)) { modifiers[bridgePrefab] = prefabModifiers; } } } return(modifiers); }
private void LoadLegacySkinData() { Debug.Log("NS: Loading legacy skin data!"); try { var data = SimulationManager.instance.m_SerializableDataWrapper.LoadData(LegacyDataKey); if (data == null) { Debug.Log("NS: No legacy data found!"); return; } LegacySegmentData[] legacyData; using (var stream = new MemoryStream(data)) { legacyData = DataSerializer.DeserializeArray <LegacySegmentData>(stream, DataSerializer.Mode.Memory, LegacySegmentData.ResolveSerializedType); } var netManager = new GameNetManager(); var length = Math.Min(legacyData.Length, SegmentSkins.Length); for (ushort segment = 0; segment < length; segment++) { var segmentData = legacyData[segment]; if (segmentData != null && netManager.IsSegmentCreated(segment)) { segmentData.FindPrefabs(); var prefab = netManager.GetSegmentInfo(segment); var modifiers = new List <NetworkSkinModifier>(); var customRepeatDistances = (segmentData.Features & LegacySegmentData.FeatureFlags.RepeatDistances) != 0; if ((segmentData.Features & LegacySegmentData.FeatureFlags.StreetLight) != 0) { var repeatDistance = customRepeatDistances ? segmentData.RepeatDistances.w : StreetLightUtils.GetDefaultRepeatDistance(prefab); modifiers.Add(new StreetLightModifier(segmentData.StreetLightPrefab, repeatDistance)); } if ((segmentData.Features & LegacySegmentData.FeatureFlags.TreeLeft) != 0) { var repeatDistance = customRepeatDistances ? segmentData.RepeatDistances.x : TreeUtils.GetDefaultRepeatDistance(prefab, LanePosition.Left); modifiers.Add(new TreeModifier(LanePosition.Left, segmentData.TreeLeftPrefab, repeatDistance)); } if ((segmentData.Features & LegacySegmentData.FeatureFlags.TreeMiddle) != 0) { var repeatDistance = customRepeatDistances ? segmentData.RepeatDistances.y : TreeUtils.GetDefaultRepeatDistance(prefab, LanePosition.Middle); modifiers.Add(new TreeModifier(LanePosition.Middle, segmentData.TreeMiddlePrefab, repeatDistance)); } if ((segmentData.Features & LegacySegmentData.FeatureFlags.TreeRight) != 0) { var repeatDistance = customRepeatDistances ? segmentData.RepeatDistances.z : TreeUtils.GetDefaultRepeatDistance(prefab, LanePosition.Right); modifiers.Add(new TreeModifier(LanePosition.Right, segmentData.TreeRightPrefab, repeatDistance)); } if (modifiers.Count > 0) { var skin = NetworkSkin.GetMatchingSkinFromList(AppliedSkins, prefab, modifiers); if (skin == null) { skin = new NetworkSkin(prefab, modifiers); } SegmentSkins[segment] = skin; UsageAdded(skin); } } } SimulationManager.instance.m_SerializableDataWrapper.EraseData(LegacyDataKey); Debug.Log("NS: Legacy data imported and erased"); } catch (Exception e) { _loadErrors = new NetworkSkinLoadErrors(); _loadErrors.MajorException(e); } }