private void CreateCustomEffects()
        {
            Logging.Log("Creating effect objects");

            var t = gameObject.transform;

            // Wrappers
            CustomVehicleEffect.CreateEffectObject(t);
            CustomVehicleMultiEffect.CreateEffectObject(t);

            // Custom particles
            VehicleSteam.CreateEffectObject(t);
            DieselSmoke.CreateEffectObject(t);

            // Custom sounds
            //SteamTrainMovement.CreateEffectObject(t);
            //DieselTrainMovement.CreateEffectObject(t);
            //RollingTrainMovement.CreateEffectObject(t);
            //TrainHorn.CreateEffectObject(t);
            //TrainWhistle.CreateEffectObject(t);
            //TrainBell.CreateEffectObject(t);

            // Planes
            PropAircraftMovement.CreateEffectObject(t);
            //PropellerEffectManager.CreateEffectObject(t);

            // Custom lights
            TrainDitchLight.CreateEffectObject(t);

            // Initialize the options menu.
            foreach (var option in soundEffectOptions)
            {
                option.Initialize();
            }

            Logging.Log("Done creating effect objects");
        }
Exemple #2
0
        public static void ParseEffectDefinition(VehicleEffectsDefinition.Vehicle vehicleDef, VehicleEffectsDefinition.Effect effectDef, List <VehicleInfo.Effect> effectsList, ref HashSet <string> parseErrors)
        {
            if (effectDef?.Name == null)
            {
                parseErrors.Add(vehicleDef.Name + " - Effect name missing.");
                return;
            }

            string effectName = (effectDef.Replacment == null) ? effectDef.Name : effectDef.Replacment;

            effectName += (effectDef.Base != null) ? " - " + effectDef.Base : "";

            var effectPrefab = FindEffect(effectName);

            if (effectPrefab == null)
            {
                //This effect is either a 'special' effect or simply non existent

                if (effectName.StartsWith("Vehicle Effect Wrapper"))
                {
                    // Wrapper for effects
                    if (effectDef.Base != null)
                    {
                        var baseEffect = FindEffect(effectDef.Base);
                        if (baseEffect != null)
                        {
                            effectPrefab = CustomVehicleEffect.CreateEffect(effectDef, baseEffect);
                            if (effectPrefab == null)
                            {
                                parseErrors.Add(vehicleDef.Name + ": An error occured trying to create a custom effect. Check debug log for details.");
                                return;
                            }
                        }
                        else
                        {
                            // Try fallback
                            if (effectDef.Fallback != null)
                            {
                                Logging.Log(vehicleDef.Name + ": trying to use fallback " + effectDef.Fallback + " for " + effectName);
                                if (effectDef.Fallback.StartsWith("None"))
                                {
                                    // None specified as fallback, just exit
                                    return;
                                }
                                else if (effectDef.Fallback.StartsWith("Remove") && effectDef.Replacment != null)
                                {
                                    // Remove the existing effect
                                    effectName   = "Remove";
                                    effectPrefab = null;
                                }
                                else
                                {
                                    baseEffect = FindEffect(effectDef.Fallback);
                                    if (baseEffect != null)
                                    {
                                        effectPrefab = CustomVehicleEffect.CreateEffect(effectDef, baseEffect);
                                        if (effectPrefab == null)
                                        {
                                            parseErrors.Add(vehicleDef.Name + ": An error occured trying to create a custom effect. Check debug log for details.");
                                            return;
                                        }
                                    }
                                    else
                                    {
                                        parseErrors.Add(vehicleDef.Name + ": Vehicle Effect Wrapper fallback " + effectDef.Fallback + " was needed for " + effectDef.Base + " but not loaded either!");
                                    }
                                }
                            }
                            else
                            {
                                parseErrors.Add(vehicleDef.Name + ": Vehicle Effect Wrapper base effect " + effectDef.Base + " was not loaded and no fallback was specified!");
                                return;
                            }
                        }
                    }
                    else
                    {
                        parseErrors.Add(vehicleDef.Name + ": Vehicle Effect Wrapper requires a base effect but it wasn't given");
                        return;
                    }
                }
                else if (effectName.StartsWith("Vehicle Effect Multi"))
                {
                    // Custom MultiEffect defined in the xml
                    if (effectDef.SubEffects != null)
                    {
                        List <MultiEffect.SubEffect> loadedSubEffects = new List <MultiEffect.SubEffect>();
                        foreach (var subEffect in effectDef.SubEffects)
                        {
                            var dummyList = new List <VehicleInfo.Effect>();
                            ParseEffectDefinition(vehicleDef, subEffect.Effect, dummyList, ref parseErrors);
                            if (dummyList.Count > 0)
                            {
                                loadedSubEffects.Add(new MultiEffect.SubEffect()
                                {
                                    m_effect      = dummyList[0].m_effect,
                                    m_endTime     = subEffect.EndTime,
                                    m_startTime   = subEffect.StartTime,
                                    m_probability = subEffect.Probability
                                });
                            }
                        }
                        effectPrefab = CustomVehicleMultiEffect.CreateEffect(effectDef, loadedSubEffects.ToArray(), effectDef.Duration, effectDef.UseSimulationTime);
                    }
                    else
                    {
                        parseErrors.Add(vehicleDef.Name + " Vehicle Effect Multi with no sub effects!");
                        return;
                    }
                }
                else if (effectName.StartsWith("None") || effectName.StartsWith("Remove"))
                {
                    // Not a real effect, but keywords used for removal of an existing effect.
                    // 'None' included for < 1.2c compatibility
                    effectName   = "Remove";
                    effectPrefab = null;
                }
                else
                {
                    // Try fallback
                    if (effectDef.Fallback != null)
                    {
                        Logging.Log(vehicleDef.Name + ": trying to use fallback " + effectDef.Fallback + " for " + effectName);
                        if (effectDef.Fallback.StartsWith("None"))
                        {
                            // None specified as fallback, just exit
                            return;
                        }
                        else if (effectDef.Fallback.StartsWith("Remove") && effectDef.Replacment != null)
                        {
                            // Remove the existing effect
                            effectName   = "Remove";
                            effectPrefab = null;
                        }
                        else
                        {
                            effectPrefab = FindEffect(effectDef.Fallback);
                            if (effectPrefab == null)
                            {
                                parseErrors.Add(vehicleDef.Name + " requested non-existing effect " + effectName + " and fallback " + effectDef.Fallback + " could not be found either!");
                                return;
                            }
                        }
                    }
                    else
                    {
                        parseErrors.Add(vehicleDef.Name + " requested non-existing effect " + effectName + " and no fallback was specified");
                        return;
                    }
                }
            }

            if (effectPrefab == null && !effectName.Equals("Remove"))
            {
                parseErrors.Add(vehicleDef.Name + " - Effect with name " + effectDef.Name + " not loaded.");
                return;
            }

            var vehicleInfoEffect = new VehicleInfo.Effect
            {
                m_effect = effectPrefab,
                m_parkedFlagsForbidden  = VehicleParked.Flags.Created,
                m_parkedFlagsRequired   = VehicleParked.Flags.None,
                m_vehicleFlagsForbidden = (Vehicle.Flags)effectDef.ForbiddenFlags,
                m_vehicleFlagsRequired  = ((Vehicle.Flags)effectDef.RequiredFlags) | Vehicle.Flags.Created
            };

            if (effectDef.Replacment == null)
            {
                effectsList.Add(vehicleInfoEffect);
            }
            else
            {
                int indexToRemove = -1;

                for (int i = 0; i < effectsList.Count; i++)
                {
                    if (effectsList[i].m_effect.name.Equals(effectDef.Name))
                    {
                        if (effectDef.Replacment.Equals("Remove"))
                        {
                            indexToRemove = i;
                            break;
                        }

                        effectsList[i] = vehicleInfoEffect;
                        break;
                    }
                }

                if (indexToRemove >= 0)
                {
                    effectsList.RemoveAt(indexToRemove);
                }
            }
        }