Ejemplo n.º 1
0
        public void SetActiveModifiers(Dictionary <NetInfo, List <NetworkSkinModifier> > prefabsWithModifiers)
        {
            var possiblyUnusedSkins = new List <NetworkSkin>(_activeSkins.Values);

            _activeSkins.Clear();

            foreach (var pair in prefabsWithModifiers)
            {
                var prefab    = pair.Key;
                var modifiers = pair.Value;

                if (modifiers.Count == 0)
                {
                    continue;
                }

                var matchingActiveSkin = NetworkSkin.GetMatchingSkinFromList(possiblyUnusedSkins, prefab, modifiers);
                if (matchingActiveSkin != null)
                {
                    // exact same skin was already generated and is ready to use,
                    // use that one instead of generating a new skin!
                    _activeSkins[prefab] = matchingActiveSkin;
                    possiblyUnusedSkins.Remove(matchingActiveSkin);
                    continue;
                }

                var matchingAppliedSkin = NetworkSkin.GetMatchingSkinFromList(AppliedSkins, prefab, modifiers);
                if (matchingAppliedSkin != null)
                {
                    // exact same skin is already present in the city,
                    // use that one instead of generating a new skin!
                    _activeSkins[prefab] = matchingAppliedSkin;
                    continue;
                }

                // generate and use a new skin!
                _activeSkins[prefab] = new NetworkSkin(prefab, modifiers);
            }

            // Destroy all unused skins that are not present in the city
            foreach (var skin in possiblyUnusedSkins)
            {
                if (skin.UseCount <= 0)
                {
                    Debug.Log($"Destroying unused skin {skin}");
                    skin.Destroy();
                }
            }
        }
Ejemplo n.º 2
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);
            }
        }