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