Ejemplo n.º 1
0
        public void OnPreUpdateData()
        {
            try
            {
                lightPropsDefParseErrors = new HashSet <string>();
                var checkedPaths = new List <string>();

                for (uint i = 0; i < PrefabCollection <PropInfo> .LoadedCount(); i++)
                {
                    var prefab = PrefabCollection <PropInfo> .GetLoaded(i);

                    if (prefab == null)
                    {
                        continue;
                    }

                    // search for LightPropDefinition.xml
                    var asset = PackageManager.FindAssetByName(prefab.name);

                    var crpPath = asset?.package?.packagePath;
                    if (crpPath == null)
                    {
                        continue;
                    }

                    var lightPropsDefPath = Path.Combine(Path.GetDirectoryName(crpPath) ?? "",
                                                         "LightPropsDefinition.xml");

                    // skip files which were already parsed
                    if (checkedPaths.Contains(lightPropsDefPath))
                    {
                        continue;
                    }
                    checkedPaths.Add(lightPropsDefPath);

                    if (!File.Exists(lightPropsDefPath))
                    {
                        continue;
                    }

                    LightPropsDefinition lightPropsDef = null;

                    var xmlSerializer = new XmlSerializer(typeof(LightPropsDefinition));
                    try
                    {
                        using (var streamReader = new System.IO.StreamReader(lightPropsDefPath))
                        {
                            lightPropsDef = xmlSerializer.Deserialize(streamReader) as LightPropsDefinition;
                        }
                    }
                    catch (Exception e)
                    {
                        Debug.LogException(e);
                        lightPropsDefParseErrors.Add(asset.package.packageName + " - " + e.Message);
                        continue;
                    }

                    if (lightPropsDef?.Props == null || lightPropsDef.Props.Count == 0)
                    {
                        lightPropsDefParseErrors.Add(asset.package.packageName + " - lightPropDef is null or empty.");
                        continue;
                    }

                    foreach (var propDef in lightPropsDef.Props)
                    {
                        if (propDef?.Name == null)
                        {
                            lightPropsDefParseErrors.Add(asset.package.packageName + " - Prop name missing.");
                            continue;
                        }

                        var propDefPrefab = FindProp(propDef.Name, asset.package.packageName);

                        if (propDefPrefab == null)
                        {
                            /*
                             * lightPropsDefParseErrors.Add(asset.package.packageName + " - Prop with name " + propDef.Name +
                             *                           " not loaded.");
                             */
                            continue;
                        }

                        if (propDef.Effects == null || propDef.Effects.Count == 0)
                        {
                            lightPropsDefParseErrors.Add(asset.package.packageName + " - No effects specified for " +
                                                         propDef.Name + ".");
                            continue;
                        }

                        var effects = new List <PropInfo.Effect>();

                        foreach (var effectDef in propDef.Effects)
                        {
                            if (effectDef?.Name == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect name missing.");
                                continue;
                            }

                            var effectPrefab = EffectCollection.FindEffect(effectDef.Name);

                            if (effectPrefab == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect with name " + effectDef.Name +
                                                             " not loaded.");
                                continue;
                            }

                            if (effectDef.Position == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect position not set.");
                                continue;
                            }

                            if (effectDef.Direction == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect direction not set.");
                                continue;
                            }

                            var effect = new PropInfo.Effect
                            {
                                m_effect    = effectPrefab,
                                m_position  = effectDef.Position.ToUnityVector(),
                                m_direction = effectDef.Direction.ToUnityVector().normalized
                            };

                            effects.Add(effect);
                        }

                        if (effects.Count == 0)
                        {
                            lightPropsDefParseErrors.Add("No effects specified for " + propDef.Name + ".");
                            continue;
                        }

                        propDefPrefab.m_effects = effects.ToArray();

                        // taken from PropInfo.InitializePrefab
                        if (propDefPrefab.m_effects != null)
                        {
                            propDefPrefab.m_hasEffects = (propDefPrefab.m_effects.Length != 0);
                            for (var j = 0; j < propDefPrefab.m_effects.Length; j++)
                            {
                                if (propDefPrefab.m_effects[j].m_effect == null)
                                {
                                    continue;
                                }

                                propDefPrefab.m_effects[j].m_effect.InitializeEffect();
                                var layer = propDefPrefab.m_effects[j].m_effect.GroupLayer();
                                if (layer != -1)
                                {
                                    propDefPrefab.m_effectLayer = layer;
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
            }
        }
Ejemplo n.º 2
0
        public void UpdateData(SimulationManager.UpdateMode mode)
        {
            try
            {

                lightPropsDefParseErrors = new HashSet<string>();
                var checkedPaths = new List<string>();

                for (uint i = 0; i < PrefabCollection<PropInfo>.LoadedCount(); i++)
                {
                    var prefab = PrefabCollection<PropInfo>.GetLoaded(i);

                    if (prefab == null) continue;

                    // search for LightPropDefinition.xml
                    var asset = PackageManager.FindAssetByName(prefab.name);

                    var crpPath = asset?.package?.packagePath;
                    if (crpPath == null) continue;

                    var lightPropsDefPath = Path.Combine(Path.GetDirectoryName(crpPath) ?? "",
                        "LightPropsDefinition.xml");

                    // skip files which were already parsed
                    if (checkedPaths.Contains(lightPropsDefPath)) continue;
                    checkedPaths.Add(lightPropsDefPath);

                    if (!File.Exists(lightPropsDefPath)) continue;

                    LightPropsDefinition lightPropsDef = null;

                    var xmlSerializer = new XmlSerializer(typeof (LightPropsDefinition));
                    try
                    {
                        using (var streamReader = new System.IO.StreamReader(lightPropsDefPath))
                        {
                            lightPropsDef = xmlSerializer.Deserialize(streamReader) as LightPropsDefinition;
                        }
                    }
                    catch (Exception e)
                    {
                        Debug.LogException(e);
                        lightPropsDefParseErrors.Add(asset.package.packageName + " - " + e.Message);
                        continue;
                    }

                    if (lightPropsDef?.Props == null || lightPropsDef.Props.Count == 0)
                    {
                        lightPropsDefParseErrors.Add(asset.package.packageName + " - lightPropDef is null or empty.");
                        continue;
                    }

                    foreach (var propDef in lightPropsDef.Props)
                    {
                        if (propDef?.Name == null)
                        {
                            lightPropsDefParseErrors.Add(asset.package.packageName + " - Prop name missing.");
                            continue;
                        }

                        var propDefPrefab = FindProp(propDef.Name, asset.package.packageName);

                        if (propDefPrefab == null)
                        {
                            lightPropsDefParseErrors.Add(asset.package.packageName + " - Prop with name " + propDef.Name +
                                                         " not loaded.");
                            continue;
                        }

                        if (propDef.Effects == null || propDef.Effects.Count == 0)
                        {
                            lightPropsDefParseErrors.Add(asset.package.packageName + " - No effects specified for " +
                                                         propDef.Name + ".");
                            continue;
                        }

                        var effects = new List<PropInfo.Effect>();

                        foreach (var effectDef in propDef.Effects)
                        {
                            if (effectDef?.Name == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect name missing.");
                                continue;
                            }

                            var effectPrefab = EffectCollection.FindEffect(effectDef.Name);

                            if (effectPrefab == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect with name " + effectDef.Name +
                                                             " not loaded.");
                                continue;
                            }

                            if (effectDef.Position == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect position not set.");
                                continue;
                            }

                            if (effectDef.Direction == null)
                            {
                                lightPropsDefParseErrors.Add(propDef.Name + " - Effect direction not set.");
                                continue;
                            }

                            var effect = new PropInfo.Effect
                            {
                                m_effect = effectPrefab,
                                m_position = effectDef.Position.ToUnityVector(),
                                m_direction = effectDef.Direction.ToUnityVector().normalized
                            };

                            effects.Add(effect);
                        }

                        if (effects.Count == 0)
                        {
                            lightPropsDefParseErrors.Add("No effects specified for " + propDef.Name + ".");
                            continue;
                        }

                        propDefPrefab.m_effects = effects.ToArray();

                        // taken from PropInfo.InitializePrefab
                        if (propDefPrefab.m_effects != null)
                        {
                            propDefPrefab.m_hasEffects = (propDefPrefab.m_effects.Length != 0);
                            for (var j = 0; j < propDefPrefab.m_effects.Length; j++)
                            {
                                if (propDefPrefab.m_effects[j].m_effect == null) continue;

                                propDefPrefab.m_effects[j].m_effect.InitializeEffect();
                                var layer = propDefPrefab.m_effects[j].m_effect.GroupLayer();
                                if (layer != -1)
                                {
                                    propDefPrefab.m_effectLayer = layer;
                                }
                            }
                        }
                    }
                }
            }
            catch(Exception e)
            {
                Debug.LogException(e);
            }
        }
Ejemplo n.º 3
0
        public static void OnAssetLoadedImpl(string name, object asset, Dictionary <string, byte[]> userData)
        {
            if (!userData.TryGetValue(DataKey, out var bytes))
            {
                return;
            }

            Debug.Log($"Found custom effect data for {name}");

            var propEffectsDict    = new Dictionary <string, PropInfo.Effect[]>();
            var vehicleEffectsDict = new Dictionary <string, VehicleInfo.Effect[]>();

            using (var stream = new MemoryStream(bytes))
            {
                using (var reader = new PackageReader(stream))
                {
                    var propEffectsDictCount = reader.ReadInt32();
                    for (var p = 0; p < propEffectsDictCount; p++)
                    {
                        var prefabName  = reader.ReadString();
                        var effectCount = reader.ReadInt32();

                        var propEffects = new List <PropInfo.Effect>(effectCount);
                        for (var e = 0; e < effectCount; e++)
                        {
                            var effectName = reader.ReadString();

                            var propEffect = new PropInfo.Effect
                            {
                                m_effect    = EffectCollection.FindEffect(effectName),
                                m_position  = reader.ReadVector3(),
                                m_direction = reader.ReadVector3()
                            };

                            if (propEffect.m_effect != null)
                            {
                                propEffects.Add(propEffect);
                                Debug.LogError($"Adding effect \"{effectName}\" for ${prefabName}");
                            }
                            else
                            {
                                Debug.LogError($"Effect \"{effectName}\" not found while loading {prefabName}!");
                            }
                        }

                        propEffectsDict[prefabName] = propEffects.ToArray();
                    }

                    var vehicleEffectsDictCount = reader.ReadInt32();
                    for (var v = 0; v < vehicleEffectsDictCount; v++)
                    {
                        var prefabName  = reader.ReadString();
                        var effectCount = reader.ReadInt32();

                        var propEffects = new List <VehicleInfo.Effect>(effectCount);
                        for (var e = 0; e < effectCount; e++)
                        {
                            var effectName = reader.ReadString();

                            var vehicleEffect = new VehicleInfo.Effect
                            {
                                m_effect = EffectCollection.FindEffect(effectName),
                                m_vehicleFlagsRequired  = (Vehicle.Flags)reader.ReadInt32(),
                                m_vehicleFlagsForbidden = (Vehicle.Flags)reader.ReadInt32(),
                                m_parkedFlagsRequired   = (VehicleParked.Flags)reader.ReadInt32(),
                                m_parkedFlagsForbidden  = (VehicleParked.Flags)reader.ReadInt32()
                            };

                            if (vehicleEffect.m_effect != null)
                            {
                                propEffects.Add(vehicleEffect);
                            }
                            else
                            {
                                Debug.LogError($"Effect \"{effectName}\" not found while loading {prefabName}!");
                            }
                        }

                        vehicleEffectsDict[prefabName] = propEffects.ToArray();
                    }
                }
            }

            if (asset is PropInfo propPrefab)
            {
                ApplyCustomEffects(propPrefab, propEffectsDict);

                if (propPrefab.m_variations != null)
                {
                    foreach (var variation in propPrefab.m_variations)
                    {
                        ApplyCustomEffects(variation.m_prop, propEffectsDict);
                    }
                }
            }
            else if (asset is VehicleInfo vehiclePrefab)
            {
                ApplyCustomEffects(vehiclePrefab, vehicleEffectsDict);

                if (vehiclePrefab.m_trailers != null)
                {
                    foreach (var trailer in vehiclePrefab.m_trailers)
                    {
                        ApplyCustomEffects(trailer.m_info, vehicleEffectsDict);
                    }
                }
            }
        }