Пример #1
0
        private int ProcessAllInGameScripts(PlayfieldScriptData playfieldData, IEntity entity)
        {
            Log($"ProcessAllInGameScripts: {entity.Name}:{entity.Type} Pause:{playfieldData.PauseScripts}", LogLevel.Debug);
            if (entity.Type == EntityType.Proxy || entity.Type == EntityType.Unknown || playfieldData.PauseScripts)
            {
                return(0);
            }

            try
            {
                if (!entity.Structure.IsPowered)
                {
                    return(0);
                }

                var entityScriptData = new ScriptRootData(playfieldData, playfieldData.AllEntities, playfieldData.CurrentEntities, playfieldData.Playfield, entity,
                                                          playfieldData.PersistendData, (EventStore)playfieldData.EventStore.GetOrAdd(entity.Id, id => new EventStore(entity)));

                var deviceNames = entityScriptData.E.S.AllCustomDeviceNames.Where(N => IsScriptLCD(N)).ToArray();
                Log($"ProcessAllInGameScripts: #{deviceNames.Length}", LogLevel.Debug);

                int count = 0;
                Parallel.ForEach(deviceNames, N =>
                {
                    if (playfieldData.PauseScripts)
                    {
                        return;
                    }

                    var lcd = entity.Structure.GetDevice <ILcd>(N);
                    if (lcd == null)
                    {
                        return;
                    }

                    var scriptPriority = int.TryParse(N.Substring(0, 1), out var prio) ? prio : 0;

                    if (scriptPriority == 0)
                    {
                        var lcdBlockPos = entity.Structure.GetDevicePositions(N);
                        var lcdBlock    = lcdBlockPos.Count > 0 ? entity.Structure.GetBlock(lcdBlockPos.First()) : null;
                        if (lcdBlock != null)
                        {
                            lcdBlock.Get(out _, out _, out _, out var active);
                            if (!active)
                            {
                                return;
                            }
                        }
                    }
        private int ProcessAllInGameScripts(IEntity entity)
        {
            Log($"ProcessAllInGameScripts: {entity.Name}:{entity.Type} Pause:{PauseScripts}", LogLevel.Debug);
            if (entity.Type == EntityType.Proxy || PauseScripts)
            {
                return(0);
            }

            try
            {
                var entityScriptData = new ScriptRootData(CurrentEntities, ModApi.Playfield, entity, DeviceLockAllowed, PersistendData);

                var deviceNames = entityScriptData.E.S.AllCustomDeviceNames.Where(N => N.StartsWith(ScriptKeyword)).ToArray();
                Log($"ProcessAllInGameScripts: #{deviceNames.Length}", LogLevel.Debug);

                int count = 0;
                Parallel.ForEach(deviceNames, N =>
                {
                    if (PauseScripts)
                    {
                        return;
                    }

                    var lcd = entity.Structure.GetDevice <ILcd>(N);
                    if (lcd == null)
                    {
                        return;
                    }

                    try
                    {
                        Log($"ProcessAllInGameScripts: {N}", LogLevel.Debug);

                        var data = new ScriptRootData(entityScriptData)
                        {
                            Script = lcd.GetText(),
                            Error  = L,
                        };

                        AddTargetsAndDisplayType(data, N.Substring(ScriptKeyword.Length));

                        if (Configuration.Current.ScriptTracking)
                        {
                            var trackfile = GetTrackingFileName(entity, data.Script.GetHashCode().ToString());
                            if (!File.Exists(trackfile))
                            {
                                File.WriteAllText(trackfile, data.Script);
                            }
                        }


                        data.ScriptId = entity.Id + "/" + N;
                        ScriptExecQueue.Add(data);

                        Interlocked.Increment(ref count);
                    }
                    catch (Exception lcdError)
                    {
                        if (Configuration.Current.LogLevel >= EmpyrionNetAPIDefinitions.LogLevel.Debug)
                        {
                            ModApi.Log($"UpdateLCDs ({entity.Id}/{entity.Name}):LCD: {lcdError}");
                        }
                    }
                });

                return(count);
            }
            catch (Exception error)
            {
                File.WriteAllText(GetTrackingFileName(entity, string.Empty) + ".error", error.ToString());
                return(0);
            }
        }