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);
        }
        public static bool TryToISmartScriptLine(this string str, out ISmartScriptLine line)
        {
            line = new AbstractSmartScriptLine();

            Match m = SAI_LINE_REGEX.Match(str);

            if (!m.Success || m.Groups.Count != 28)
            {
                return(false);
            }

            line.EntryOrGuid      = int.Parse(m.Groups[1].ToString());
            line.ScriptSourceType = int.Parse(m.Groups[2].ToString());
            line.Id             = int.Parse(m.Groups[3].ToString());
            line.Link           = int.Parse(m.Groups[4].ToString());
            line.EventType      = int.Parse(m.Groups[5].ToString());
            line.EventPhaseMask = int.Parse(m.Groups[6].ToString());
            line.EventChance    = int.Parse(m.Groups[7].ToString());
            line.EventFlags     = int.Parse(m.Groups[8].ToString());
            line.EventParam1    = int.Parse(m.Groups[9].ToString());
            line.EventParam2    = int.Parse(m.Groups[10].ToString());
            line.EventParam3    = int.Parse(m.Groups[11].ToString());
            line.EventParam4    = int.Parse(m.Groups[12].ToString());
            line.ActionType     = int.Parse(m.Groups[13].ToString());
            line.ActionParam1   = int.Parse(m.Groups[14].ToString());
            line.ActionParam2   = int.Parse(m.Groups[15].ToString());
            line.ActionParam3   = int.Parse(m.Groups[16].ToString());
            line.ActionParam4   = int.Parse(m.Groups[17].ToString());
            line.ActionParam5   = int.Parse(m.Groups[18].ToString());
            line.ActionParam6   = int.Parse(m.Groups[19].ToString());
            line.TargetType     = int.Parse(m.Groups[20].ToString());
            line.TargetParam1   = int.Parse(m.Groups[21].ToString());
            line.TargetParam2   = int.Parse(m.Groups[22].ToString());
            line.TargetParam3   = int.Parse(m.Groups[23].ToString());
            line.TargetX        = float.Parse(m.Groups[24].ToString(), CultureInfo.InvariantCulture);
            line.TargetY        = float.Parse(m.Groups[25].ToString(), CultureInfo.InvariantCulture);
            line.TargetZ        = float.Parse(m.Groups[26].ToString(), CultureInfo.InvariantCulture);
            line.TargetO        = float.Parse(m.Groups[27].ToString(), CultureInfo.InvariantCulture);
            line.Comment        = m.Groups[28].ToString();

            return(true);
        }
        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());
        }