예제 #1
0
        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);
                        });
                    }
                }
            }
        }
예제 #2
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
            }
        }