private string GenerateSingleSai(int eventId, SmartEvent ev, SmartAction action, int link = 0, string comment = null)
        {
            System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
            customCulture.NumberFormat.NumberDecimalSeparator = ".";

            System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

            //if (action.Id == 188) // ACTION DEBUG MESSAGE
            //    comment = action.Comment;
            object data = new
            {
                entryorguid = "@ENTRY",
                source_type = ((int)_script.SourceType).ToString(),
                id          = eventId.ToString(),
                linkto      = link.ToString(),

                event_id     = ev.Id.ToString(),
                phasemask    = ev.Phases.GetValue().ToString(),
                chance       = ev.Chance.ToString(),
                flags        = ev.Flags.GetValue().ToString(),
                event_param1 = ev.GetParameter(0).GetValue().ToString(),
                event_param2 = ev.GetParameter(1).GetValue().ToString(),
                event_param3 = ev.GetParameter(2).GetValue().ToString(),
                event_param4 = ev.GetParameter(3).GetValue().ToString(),

                event_cooldown_min = ev.CooldownMin.GetValue().ToString(),
                event_cooldown_max = ev.CooldownMax.GetValue().ToString(),

                action_id     = action.Id.ToString(),
                action_param1 = action.GetParameter(0).GetValue().ToString(),
                action_param2 = action.GetParameter(1).GetValue().ToString(),
                action_param3 = action.GetParameter(2).GetValue().ToString(),
                action_param4 = action.GetParameter(3).GetValue().ToString(),
                action_param5 = action.GetParameter(4).GetValue().ToString(),
                action_param6 = action.GetParameter(5).GetValue().ToString(),

                action_source_id    = action.Source.Id.ToString(),
                source_param1       = action.Source.GetParameter(0).GetValue().ToString(),
                source_param2       = action.Source.GetParameter(1).GetValue().ToString(),
                source_param3       = action.Source.GetParameter(2).GetValue().ToString(),
                source_condition_id = action.Source.Condition.GetValue().ToString(),

                target_id           = action.Target.Id.ToString(),
                target_param1       = action.Target.GetParameter(0).GetValue().ToString(),
                target_param2       = action.Target.GetParameter(1).GetValue().ToString(),
                target_param3       = action.Target.GetParameter(2).GetValue().ToString(),
                target_condition_id = action.Target.Condition.GetValue().ToString(),


                x = action.Target.X.ToString(),
                y = action.Target.X.ToString(),
                z = action.Target.X.ToString(),
                o = action.Target.X.ToString(),

                comment = comment ?? (ev.Readable + " - " + action.Readable)
            };

            return(SmartFormat.Smart.Format(SAI_SQL, data));
        }
예제 #2
0
        private bool AreEventsEqual(SmartEvent a, SmartEvent b)
        {
            if (a.Id != b.Id)
            {
                return(false);
            }

            for (int i = 0; i < a.ParametersCount; ++i)
            {
                if (a.GetParameter(i).Value != b.GetParameter(i).Value)
                {
                    return(false);
                }
            }

            if (a.Chance.Value != b.Chance.Value)
            {
                return(false);
            }

            if (a.Flags.Value != b.Flags.Value)
            {
                return(false);
            }

            if (a.Phases.Value != b.Phases.Value)
            {
                return(false);
            }

            return(true);
        }
예제 #3
0
        private void BindEvent(SmartEvent smartEvent)
        {
            smartEvent.OnIdChanged                += SmartEventOnOnIdChanged;
            smartEvent.BulkEditingStarted         += OnBulkEditingStarted;
            smartEvent.BulkEditingFinished        += OnBulkEditingFinished;
            smartEvent.Chance.OnValueChanged      += Parameter_OnValueChanged;
            smartEvent.Flags.OnValueChanged       += Parameter_OnValueChanged;
            smartEvent.Phases.OnValueChanged      += Parameter_OnValueChanged;
            smartEvent.CooldownMin.OnValueChanged += Parameter_OnValueChanged;
            smartEvent.CooldownMax.OnValueChanged += Parameter_OnValueChanged;

            for (var i = 0; i < SmartEvent.SmartEventParamsCount; ++i)
            {
                smartEvent.GetParameter(i).OnValueChanged += Parameter_OnValueChanged;
            }

            smartEvent.Actions.CollectionChanged    += Actions_CollectionChanged;
            smartEvent.Conditions.CollectionChanged += Conditions_CollectionChanged;

            foreach (SmartAction smartAction in smartEvent.Actions)
            {
                BindAction(smartAction);
            }

            foreach (SmartCondition smartCondition in smartEvent.Conditions)
            {
                BindCondition(smartCondition);
            }
        }
        private AbstractSmartScriptLine GenerateSingleSai(int eventId, SmartEvent ev, SmartAction action, int link = 0, string comment = null)
        {
            AbstractSmartScriptLine line = new AbstractSmartScriptLine
            {
                EntryOrGuid      = _item.Entry,
                ScriptSourceType = (int)_item.SmartType,
                Id                = eventId,
                Link              = link,
                EventType         = ev.Id,
                EventPhaseMask    = ev.Phases.Value,
                EventChance       = ev.Chance.Value,
                EventFlags        = ev.Flags.Value,
                EventParam1       = ev.GetParameter(0).Value,
                EventParam2       = ev.GetParameter(1).Value,
                EventParam3       = ev.GetParameter(2).Value,
                EventParam4       = ev.GetParameter(3).Value,
                EventCooldownMin  = ev.CooldownMin.Value,
                EventCooldownMax  = ev.CooldownMax.Value,
                ActionType        = action.Id,
                ActionParam1      = action.GetParameter(0).Value,
                ActionParam2      = action.GetParameter(1).Value,
                ActionParam3      = action.GetParameter(2).Value,
                ActionParam4      = action.GetParameter(3).Value,
                ActionParam5      = action.GetParameter(4).Value,
                ActionParam6      = action.GetParameter(5).Value,
                SourceType        = action.Source.Id,
                SourceParam1      = action.Source.GetParameter(0).Value,
                SourceParam2      = action.Source.GetParameter(1).Value,
                SourceParam3      = action.Source.GetParameter(2).Value,
                SourceConditionId = action.Source.Condition.Value,
                TargetType        = action.Target.Id,
                TargetParam1      = action.Target.GetParameter(0).Value,
                TargetParam2      = action.Target.GetParameter(1).Value,
                TargetParam3      = action.Target.GetParameter(2).Value,
                TargetConditionId = action.Target.Condition.Value,
                TargetX           = action.Target.X,
                TargetY           = action.Target.Y,
                TargetZ           = action.Target.Z,
                TargetO           = action.Target.O,
                Comment           = ev.Readable + " - " + action.Readable
            };

            return(line);
        }
예제 #5
0
        private void EditEventCommand(SmartEvent ev)
        {
            ParametersEditView v = new ParametersEditView();
            List <KeyValuePair <Parameter, string> > paramss = new List <KeyValuePair <Parameter, string> >();

            paramss.Add(new KeyValuePair <Parameter, string>(ev.Chance, "General"));
            paramss.Add(new KeyValuePair <Parameter, string>(ev.Flags, "General"));
            paramss.Add(new KeyValuePair <Parameter, string>(ev.Phases, "General"));
            paramss.Add(new KeyValuePair <Parameter, string>(ev.CooldownMax, "General"));
            paramss.Add(new KeyValuePair <Parameter, string>(ev.CooldownMin, "General"));

            for (int i = 0; i < ev.ParametersCount; ++i)
            {
                if (!ev.GetParameter(i).Name.Equals("empty"))
                {
                    paramss.Add(new KeyValuePair <Parameter, string>(ev.GetParameter(i), "Event specific"));
                }
            }

            v.DataContext = new ParametersEditViewModel(itemFromListProvider, ev, paramss);
            v.ShowDialog();
        }
예제 #6
0
 public InspectionResult?Inspect(SmartEvent e)
 {
     if (e.GetParameter(pram).Value != 0 || (e.Flags.Value & (int)SmartEventFlag.NotRepeatable) != 0)
     {
         return(null);
     }
     return(new InspectionResult()
     {
         Line = e.LineId,
         Message = $"`{parameterName}` is 0, the event will be triggered only once. If this is on purpose, add NOT_REPEATABLE flag.",
         Severity = DiagnosticSeverity.Error
     });
 }
        private void RemoveEvent(SmartEvent smartEvent)
        {
            smartEvent.Actions.CollectionChanged -= Actions_CollectionChanged;

            smartEvent.Chance.OnValueChanged      -= Parameter_OnValueChanged;
            smartEvent.Flags.OnValueChanged       -= Parameter_OnValueChanged;
            smartEvent.Phases.OnValueChanged      -= Parameter_OnValueChanged;
            smartEvent.CooldownMin.OnValueChanged -= Parameter_OnValueChanged;
            smartEvent.CooldownMax.OnValueChanged -= Parameter_OnValueChanged;

            for (int i = 0; i < SmartEvent.SmartEventParamsCount; ++i)
            {
                smartEvent.GetParameter(i).OnValueChanged -= Parameter_OnValueChanged;
            }
        }
예제 #8
0
        public SmartEvent EventFactory(ISmartScriptLine line)
        {
            SmartEvent ev = EventFactory(line.EventType);

            ev.Chance.Value      = line.EventChance;
            ev.Phases.Value      = line.EventPhaseMask;
            ev.Flags.Value       = line.EventFlags;
            ev.CooldownMin.Value = line.EventCooldownMin;
            ev.CooldownMax.Value = line.EventCooldownMax;

            for (var i = 0; i < SmartEvent.SmartEventParamsCount; ++i)
            {
                ev.GetParameter(i).Value = line.GetEventParam(i);
            }

            return(ev);
        }
        private void UnbindEvent(SmartEvent smartEvent)
        {
            foreach (var act in smartEvent.Actions)
            {
                UnbindAction(act);
            }

            smartEvent.Actions.CollectionChanged -= Actions_CollectionChanged;

            smartEvent.Chance.OnValueChanged      -= Parameter_OnValueChanged;
            smartEvent.Flags.OnValueChanged       -= Parameter_OnValueChanged;
            smartEvent.Phases.OnValueChanged      -= Parameter_OnValueChanged;
            smartEvent.CooldownMin.OnValueChanged -= Parameter_OnValueChanged;
            smartEvent.CooldownMax.OnValueChanged -= Parameter_OnValueChanged;

            for (int i = 0; i < SmartEvent.SmartEventParamsCount; ++i)
            {
                smartEvent.GetParameter(i).OnValueChanged -= Parameter_OnValueChanged;
            }
        }
예제 #10
0
        public (ISmartScriptLine[], IConditionLine[]) ToDatabaseCompatibleSmartScript(SmartScript script)
        {
            if (script.Events.Count == 0)
            {
                return(new ISmartScriptLine[0], null);
            }

            var  eventId         = 0;
            var  lines           = new List <ISmartScriptLine>();
            var  conditions      = new List <IConditionLine>();
            var  previousWasWait = false;
            long nextTriggerId   = script.Events.Where(e => e.Id == SmartConstants.EventTriggerTimed)
                                   .Select(e => e.GetParameter(0).Value)
                                   .DefaultIfEmpty(0)
                                   .Max() + 1;

            foreach (SmartEvent e in script.Events)
            {
                if (e.Actions.Count == 0)
                {
                    continue;
                }

                e.ActualId = eventId;

                for (var index = 0; index < e.Actions.Count; ++index)
                {
                    SmartEvent actualEvent = e;

                    if (previousWasWait)
                    {
                        actualEvent = smartFactory.EventFactory(SmartConstants.EventTriggerTimed);
                        actualEvent.GetParameter(0).Value = nextTriggerId++;
                    }
                    else if (index > 0)
                    {
                        actualEvent = smartFactory.EventFactory(SmartConstants.EventLink);
                    }

                    int linkTo = e.Actions.Count - 1 == index ? 0 : eventId + 1;

                    SmartAction actualAction = e.Actions[index].Copy();

                    if (actualAction.Id == SmartConstants.ActionWait)
                    {
                        linkTo = 0;
                        SmartAction waitAction = actualAction;
                        actualAction = smartFactory.ActionFactory(SmartConstants.ActionTriggerTimed,
                                                                  smartFactory.SourceFactory(SmartConstants.SourceNone),
                                                                  smartFactory.TargetFactory(SmartConstants.TargetNone));
                        actualAction.GetParameter(0).Value = nextTriggerId;
                        actualAction.GetParameter(1).Value = waitAction.GetParameter(0).Value;
                        actualAction.GetParameter(2).Value = waitAction.GetParameter(0).Value;
                        actualAction.Comment = SmartConstants.CommentWait;
                        previousWasWait      = true;
                    }
                    else
                    {
                        if (actualAction.Id == SmartConstants.ActionComment)
                        {
                            SmartAction commentAction = actualAction;
                            actualAction = smartFactory.ActionFactory(SmartConstants.ActionNone,
                                                                      smartFactory.SourceFactory(SmartConstants.SourceNone),
                                                                      smartFactory.TargetFactory(SmartConstants.TargetNone));
                            actualAction.Comment = commentAction.Comment;
                        }
                        previousWasWait = false;
                    }

                    var actionData = smartDataManager.GetRawData(SmartType.SmartAction, actualAction.Id);

                    if (actionData.TargetIsSource)
                    {
                        smartFactory.UpdateTarget(actualAction.Target, actualAction.Source.Id);
                        for (int i = 0; i < actualAction.Target.ParametersCount; ++i)
                        {
                            actualAction.Target.GetParameter(i).Copy(actualAction.Source.GetParameter(i));
                        }

                        smartFactory.UpdateSource(actualAction.Source, 0);
                    }

                    if (actionData.ImplicitSource != null)
                    {
                        smartFactory.UpdateSource(actualAction.Source, smartDataManager.GetDataByName(SmartType.SmartSource, actionData.ImplicitSource).Id);
                    }
                    else if (actionData.SourceStoreInAction)
                    {
                        actualAction.GetParameter(2).Value = actualAction.Source.Id;
                        actualAction.GetParameter(3).Value = actualAction.Source.GetParameter(0).Value;
                        actualAction.GetParameter(4).Value = actualAction.Source.GetParameter(1).Value;
                        actualAction.GetParameter(5).Value = actualAction.Source.GetParameter(2).Value;
                    }

                    SmartEvent eventToSerialize = actualEvent.ShallowCopy();
                    eventToSerialize.Parent = script;
                    eventToSerialize.Actions.Add(actualAction);

                    var serialized           = eventToSerialize.ToSmartScriptLines(script.EntryOrGuid, script.SourceType, eventId, linkTo);
                    var serializedConditions = actualEvent.ToConditionLines(script.EntryOrGuid, script.SourceType, eventId);

                    if (serialized.Length != 1)
                    {
                        throw new InvalidOperationException();
                    }

                    lines.Add(serialized[0]);
                    if (serializedConditions != null)
                    {
                        conditions.AddRange(serializedConditions);
                    }

                    eventId++;
                }
            }

            return(lines.ToArray(), conditions.ToArray());
        }
예제 #11
0
        public (ISmartScriptLine[], IConditionLine[]) ToDatabaseCompatibleSmartScript(SmartScript script)
        {
            if (script.Events.Count == 0)
            {
                return(new ISmartScriptLine[0], null);
            }

            var  eventId         = 0;
            var  lines           = new List <ISmartScriptLine>();
            var  conditions      = new List <IConditionLine>();
            var  previousWasWait = false;
            long nextTriggerId   = script.Events.Where(e => e.Id == SmartConstants.EventTriggerTimed)
                                   .Select(e => e.GetParameter(0).Value)
                                   .DefaultIfEmpty(0)
                                   .Max() + 1;

            var usedTimedActionLists = script.Events
                                       .SelectMany(e => e.Actions)
                                       .Where(a => a.Id == SmartConstants.ActionCallTimedActionList ||
                                              a.Id == SmartConstants.ActionCallRandomTimedActionList ||
                                              a.Id == SmartConstants.ActionCallRandomRangeTimedActionList)
                                       .SelectMany(a =>
            {
                if (a.Id == SmartConstants.ActionCallRandomTimedActionList)
                {
                    return new int[]
                    {
                        (int)a.GetParameter(0).Value,
                        (int)a.GetParameter(1).Value,
                        (int)a.GetParameter(2).Value,
                        (int)a.GetParameter(3).Value,
                        (int)a.GetParameter(4).Value,
                        (int)a.GetParameter(5).Value,
                    }
                }
                ;
                if (a.Id == SmartConstants.ActionCallRandomRangeTimedActionList &&
                    a.GetParameter(1).Value - a.GetParameter(0).Value < 20)
                {
                    return(Enumerable.Range((int)a.GetParameter(0).Value, (int)(a.GetParameter(1).Value - a.GetParameter(0).Value + 1)));
                }
                return(new int[] { (int)a.GetParameter(0).Value });
            })
                                       .Where(id => id != 0)
                                       .ToHashSet();

            int firstUnusedActionList = Math.Abs(script.EntryOrGuid) * 100 - 1;

            int GetNextUnusedTimedActionList()
            {
                do
                {
                    firstUnusedActionList++;
                } while (usedTimedActionLists.Contains(firstUnusedActionList));

                usedTimedActionLists.Add(firstUnusedActionList);
                return(firstUnusedActionList);
            }

            foreach (var gv in script.GlobalVariables)
            {
                lines.Add(gv.ToMetaSmartScriptLine(script.EntryOrGuid, script.SourceType, eventId++));
            }

            if (script.SourceType == SmartScriptType.TimedActionList)
            {
                foreach (SmartEvent e in script.Events)
                {
                    for (var index = 0; index < e.Actions.Count; ++index)
                    {
                        SmartEvent eventToSerialize = index == 0 ? e.ShallowCopy() : smartFactory.EventFactory(SmartConstants.EventUpdateInCombat);

                        SmartAction actualAction = e.Actions[index].Copy();
                        AdjustCoreCompatibleAction(actualAction);

                        eventToSerialize.Parent = script;
                        eventToSerialize.Actions.Add(actualAction);

                        var serialized = eventToSerialize.ToSmartScriptLines(script.EntryOrGuid, script.SourceType, eventId++, false, 0);

                        if (serialized.Length != 1)
                        {
                            throw new InvalidOperationException();
                        }

                        lines.Add(serialized[0]);
                    }
                }
            }
            else
            {
                SmartEvent        originalEvent;
                List <SmartEvent> additionalEvents = new();

                void FlushLines(SmartEvent?eventForConditions)
                {
                    if (eventForConditions != null)
                    {
                        var serializedConditions = eventForConditions.ToConditionLines(SmartConstants.ConditionSourceSmartScript, script.EntryOrGuid, script.SourceType, eventId);
                        if (serializedConditions != null)
                        {
                            conditions.AddRange(serializedConditions);
                        }
                    }

                    foreach (var toSerialize in new SmartEvent[] { originalEvent }.Concat(additionalEvents))
                    {
                        if (toSerialize.Actions.Count == 0)
                        {
                            continue;
                        }
                        var serialized = toSerialize.ToSmartScriptLines(script.EntryOrGuid, script.SourceType, eventId, true);
                        eventId += serialized.Length;
                        lines.AddRange(serialized);
                    }
                    additionalEvents.ForEach(d => d.Actions.Clear());
                    originalEvent.Actions.Clear();
                }

                foreach (SmartEvent e in script.Events)
                {
                    if (e.Actions.Count == 0)
                    {
                        continue;
                    }

                    originalEvent        = e.ShallowCopy();
                    originalEvent.Parent = script;
                    additionalEvents.Clear();
                    SmartEvent lastEvent = originalEvent;

                    long accumulatedWaits = 0;
                    for (var index = 0; index < e.Actions.Count; ++index)
                    {
                        if (previousWasWait)
                        {
                            var eventTimed = smartFactory.EventFactory(SmartConstants.EventTriggerTimed);
                            eventTimed.Parent = script;
                            eventTimed.GetParameter(0).Value = nextTriggerId++;
                            additionalEvents.Add(eventTimed);
                            lastEvent = eventTimed;
                        }

                        if (e.Actions[index].Id == SmartConstants.ActionBeginInlineActionList ||
                            e.Actions[index].Id == SmartConstants.ActionAfter)
                        {
                            var         timedActionListId   = GetNextUnusedTimedActionList();
                            SmartAction callTimedActionList = smartFactory.ActionFactory(SmartConstants.ActionCallTimedActionList,
                                                                                         smartFactory.SourceFactory(SmartConstants.SourceSelf),
                                                                                         smartFactory.TargetFactory(SmartConstants.TargetSelf));
                            callTimedActionList.GetParameter(0).Value = timedActionListId;
                            if (e.Actions[index].Id == SmartConstants.ActionBeginInlineActionList)
                            {
                                callTimedActionList.GetParameter(1).Value = e.Actions[index].GetParameter(0).Value;
                                callTimedActionList.GetParameter(2).Value = e.Actions[index].GetParameter(1).Value;
                                index++;
                            }
                            callTimedActionList.Comment = SmartConstants.CommentInlineActionList;
                            lastEvent.AddAction(callTimedActionList);

                            FlushLines(e);

                            long afterTimeMin = 0;
                            long afterTimeMax = 0;
                            int  timedEventId = 0;
                            for (; index < e.Actions.Count; ++index)
                            {
                                if (e.Actions[index].Id == SmartConstants.ActionAfter || e.Actions[index].Id == SmartConstants.ActionWait)
                                {
                                    afterTimeMin += e.Actions[index].GetParameter(0).Value;
                                    afterTimeMax += e.Actions[index].GetParameter(1).Value;
                                    if (e.Actions[index].GetParameter(1).Value == 0)
                                    {
                                        afterTimeMax += e.Actions[index].GetParameter(0).Value;
                                    }
                                }
                                else if (e.Actions[index].Id == SmartConstants.ActionAfterMovement && index > 0)
                                {
                                    afterTimeMin = 0;
                                    afterTimeMax = 0;
                                    var pathId = e.Actions[index - 1].GetParameter(1).Value;
                                    timedActionListId = GetNextUnusedTimedActionList();

                                    var eventFinishedMovement =
                                        smartFactory.EventFactory(SmartConstants.EventWaypointsEnded);
                                    eventFinishedMovement.Parent = script;
                                    eventFinishedMovement.GetParameter(1).Value = pathId;

                                    var callAnotherTimedActionList = smartFactory.ActionFactory(SmartConstants.ActionCallTimedActionList,
                                                                                                smartFactory.SourceFactory(SmartConstants.SourceSelf),
                                                                                                smartFactory.TargetFactory(SmartConstants.TargetSelf));
                                    callAnotherTimedActionList.GetParameter(0).Value = timedActionListId;
                                    callAnotherTimedActionList.Comment = SmartConstants.CommentInlineMovementActionList;

                                    eventFinishedMovement.AddAction(callAnotherTimedActionList);
                                    additionalEvents.Add(eventFinishedMovement);
                                    FlushLines(null);
                                }
                                else
                                {
                                    SmartEvent after = smartFactory.EventFactory(SmartConstants.EventUpdateInCombat);
                                    after.GetParameter(0).Value = afterTimeMin;
                                    after.GetParameter(1).Value = afterTimeMax;
                                    SmartAction actualAction = e.Actions[index].Copy();
                                    AdjustCoreCompatibleAction(actualAction);

                                    after.Parent = new SmartScript(new SmartScriptSolutionItem(timedActionListId, SmartScriptType.TimedActionList), smartFactory, smartDataManager, messageBoxService);
                                    after.AddAction(actualAction);

                                    var serialized = after.ToSmartScriptLines(timedActionListId, SmartScriptType.TimedActionList, timedEventId++, false, 0);

                                    if (serialized.Length != 1)
                                    {
                                        throw new InvalidOperationException();
                                    }

                                    lines.Add(serialized[0]);
                                    afterTimeMin = 0;
                                    afterTimeMax = 0;
                                }
                            }
                        }
                        else if (e.Actions[index].Id == SmartConstants.ActionWait)
                        {
                            accumulatedWaits += e.Actions[index].GetParameter(0).Value;

                            if (index == e.Actions.Count - 1 || e.Actions[index + 1].Id == SmartConstants.ActionWait)
                            {
                                continue;
                            }

                            SmartAction createTimedAction = smartFactory.ActionFactory(SmartConstants.ActionCreateTimed,
                                                                                       smartFactory.SourceFactory(SmartConstants.SourceNone),
                                                                                       smartFactory.TargetFactory(SmartConstants.TargetNone));
                            createTimedAction.GetParameter(0).Value = nextTriggerId;
                            createTimedAction.GetParameter(1).Value = accumulatedWaits;
                            createTimedAction.GetParameter(2).Value = accumulatedWaits;
                            createTimedAction.Comment = SmartConstants.CommentWait;
                            previousWasWait           = true;

                            originalEvent.AddAction(createTimedAction);
                        }
                        else
                        {
                            previousWasWait = false;
                            SmartAction actualAction = e.Actions[index].Copy();
                            AdjustCoreCompatibleAction(actualAction);
                            lastEvent.AddAction(actualAction);
                        }
                    }

                    if (originalEvent.Actions.Count == 0)
                    {
                        continue;
                    }

                    FlushLines(e);
                }
            }

            return(lines.ToArray(), conditions.ToArray());
        }
        public static ISmartScriptLine[] ToSmartScriptLines(this SmartEvent e, int scriptEntryOrGuid, SmartScriptType scriptSourceType, int id, int?linkTo = null)
        {
            List <ISmartScriptLine>   lines   = new List <ISmartScriptLine>();
            IEnumerable <SmartAction> actions = e.Actions.Count == 0 ? new List <SmartAction>()
            {
                new SmartAction(-1, new SmartSource(-1)
                {
                    ReadableHint = ""
                }, new SmartTarget(-1)
                {
                    ReadableHint = ""
                })
                {
                    ReadableHint = ""
                }
            } : e.Actions;

            foreach (var a in actions)
            {
                var line = new AbstractSmartScriptLine()
                {
                    EntryOrGuid      = scriptEntryOrGuid,
                    ScriptSourceType = (int)scriptSourceType,
                    Id                = id,
                    Link              = linkTo ?? 0,
                    EventType         = e.Id,
                    EventPhaseMask    = e.Phases.Value,
                    EventChance       = e.Chance.Value,
                    EventFlags        = e.Flags.Value,
                    EventParam1       = e.GetParameter(0).Value,
                    EventParam2       = e.GetParameter(1).Value,
                    EventParam3       = e.GetParameter(2).Value,
                    EventParam4       = e.GetParameter(3).Value,
                    EventCooldownMin  = e.CooldownMin.Value,
                    EventCooldownMax  = e.CooldownMax.Value,
                    ActionType        = a.Id,
                    ActionParam1      = a.GetParameter(0).Value,
                    ActionParam2      = a.GetParameter(1).Value,
                    ActionParam3      = a.GetParameter(2).Value,
                    ActionParam4      = a.GetParameter(3).Value,
                    ActionParam5      = a.GetParameter(4).Value,
                    ActionParam6      = a.GetParameter(5).Value,
                    SourceType        = a.Source.Id,
                    SourceParam1      = a.Source.GetParameter(0).Value,
                    SourceParam2      = a.Source.GetParameter(1).Value,
                    SourceParam3      = a.Source.GetParameter(2).Value,
                    SourceConditionId = 0,
                    TargetType        = a.Target.Id,
                    TargetParam1      = a.Target.GetParameter(0).Value,
                    TargetParam2      = a.Target.GetParameter(1).Value,
                    TargetParam3      = a.Target.GetParameter(2).Value,
                    TargetConditionId = 0,
                    TargetX           = a.Target.X,
                    TargetY           = a.Target.Y,
                    TargetZ           = a.Target.Z,
                    TargetO           = a.Target.O,
                    Comment           = e.Readable + " - " + a.Readable + (string.IsNullOrEmpty(a.Comment) ? "" : (" // " + a.Comment)),
                };
                lines.Add(line);
            }

            return(lines.ToArray());
        }