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); } }
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); } }
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); } } } }