public void AddScript(SmartScript script, bool listViewOnly = false, bool selectNewItem = false) { base.AddScript(script, listViewOnly, selectNewItem); if (Settings.Default.PhaseHighlighting && script.event_phase_mask != 0) { if (!_phaseColors.ContainsKey(script.event_phase_mask)) { if (_colors.Count == 0) { MessageBox.Show("There are not enough colors in the application because you are using too many different phasemasks.", "Not enough colors!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _phaseColors.Add(script.event_phase_mask, _colors.Pop()); } _oListView.Refresh(); ResizeColumns(); } ListView.SelectObject(script); _oListView.Select(); _oListView.EnsureModelVisible(script); }
public int AddScript(SmartScript script, bool listViewOnly = false, bool selectNewItem = false) { int index = base.AddScript(script, listViewOnly, selectNewItem); ListViewItem newItem = Items[index]; if (Settings.Default.PhaseHighlighting && script.event_phase_mask != 0) { if (!_phaseColors.ContainsKey(script.event_phase_mask)) { if (_colors.Count == 0) { MessageBox.Show("There are not enough colors in the application because you are using too many different phasemasks.", "Not enough colors!", MessageBoxButtons.OK, MessageBoxIcon.Error); return -1; } _phaseColors.Add(script.event_phase_mask, _colors.Pop()); } newItem.BackColor = _phaseColors[script.event_phase_mask]; } newItem.Selected = selectNewItem; Select(); EnsureVisible(index); return index; }
public int AddSmartScript(SmartScript script, bool listViewOnly = false, bool selectNewItem = false) { SmartScriptListViewItem lvi = new SmartScriptListViewItem(script.entryorguid.ToString()); lvi.Script = script; lvi.Name = script.entryorguid.ToString(); foreach (PropertyInfo propInfo in _pinfo.Where(p => !p.Name.Equals("entryorguid"))) { if (_excludedProperties.Contains(propInfo.Name)) continue; lvi.SubItems.Add(propInfo.GetValue(script).ToString()); } if (!listViewOnly) _smartScripts.Add(script); ListViewItem newItem = Items.Add(lvi); if (Settings.Default.PhaseHighlighting && script.event_phase_mask != 0) { if (!_phaseColors.ContainsKey(script.event_phase_mask)) { if (_colors.Count == 0) { MessageBox.Show("There are not enough colors in the application because you are using too many different phasemasks.", "Not enough colors!", MessageBoxButtons.OK, MessageBoxIcon.Error); return -1; } _phaseColors.Add(script.event_phase_mask, _colors.Pop()); } newItem.BackColor = _phaseColors[script.event_phase_mask]; } newItem.Selected = selectNewItem; return newItem.Index; }
private SmartScript GetInitialSmartScriptLink(SmartScript smartScript) { if (smartScript == null || (SmartEvent)smartScript.event_type != SmartEvent.SMART_EVENT_LINK) return null; SmartScript smartScriptLink = null; int idToCheck = smartScript.id; GetLinkForCurrentSmartScriptLink: foreach (SmartScript smartScriptInListView in listViewSmartScripts.SmartScripts) { if (smartScriptInListView.link == idToCheck) { smartScriptLink = smartScriptInListView; break; } } if (smartScriptLink != null && (SmartEvent)smartScriptLink.event_type == SmartEvent.SMART_EVENT_LINK) { idToCheck = smartScriptLink.id; smartScriptLink = null; goto GetLinkForCurrentSmartScriptLink; } return smartScriptLink; }
private async Task GenerateCommentForAllEventsLinkingFromAndToSmartScript(SmartScript smartScript) { if (smartScript == null || !Settings.Default.GenerateComments) return; for (int i = 0; i < listViewSmartScripts.SmartScripts.Count; ++i) { SmartScript smartScriptListView = listViewSmartScripts.SmartScripts[i]; if (smartScriptListView.entryorguid != smartScript.entryorguid) continue; if (smartScript.link == smartScriptListView.id) { smartScriptListView.comment = await CommentGenerator.Instance.GenerateCommentFor(smartScriptListView, originalEntryOrGuidAndSourceType, true, GetInitialSmartScriptLink(smartScriptListView)); listViewSmartScripts.ReplaceSmartScript(smartScriptListView); } else if (smartScriptListView.link == smartScript.id) { smartScript.comment = await CommentGenerator.Instance.GenerateCommentFor(smartScript, originalEntryOrGuidAndSourceType, true, GetInitialSmartScriptLink(smartScript)); listViewSmartScripts.ReplaceSmartScript(smartScript); } } }
private async Task GenerateCommentForAllEventsLinkingFromSmartScript(SmartScript smartScript) { if (smartScript == null || !Settings.Default.GenerateComments || smartScript.link == 0) return; List<SmartScript> smartScriptsLinkedFrom = GetAllSmartScriptThatLinkFrom(smartScript); if (smartScriptsLinkedFrom == null || smartScriptsLinkedFrom.Count == 0) return; for (int i = 0; i < smartScriptsLinkedFrom.Count; ++i) { SmartScript smartScriptListView = smartScriptsLinkedFrom[i]; if (smartScriptListView.entryorguid != smartScript.entryorguid) continue; smartScriptListView.comment = await CommentGenerator.Instance.GenerateCommentFor(smartScriptListView, originalEntryOrGuidAndSourceType, true, smartScript); listViewSmartScripts.ReplaceSmartScript(smartScriptListView); } }
private async Task GenerateCommentForSmartScript(SmartScript smartScript, bool resize = true) { if (smartScript == null || !Settings.Default.GenerateComments) return; string newComment = smartScript.comment; if (!updatingFieldsBasedOnSelectedScript) { newComment = await CommentGenerator.Instance.GenerateCommentFor(smartScript, originalEntryOrGuidAndSourceType, true, GetInitialSmartScriptLink(smartScript)); if (smartScript.link != 0 && (SmartEvent)smartScript.event_type != SmartEvent.SMART_EVENT_LINK) await GenerateCommentForAllEventsLinkingFromSmartScript(smartScript); } //! For some reason we have to re-check it here... if (listViewSmartScripts.SelectedItems.Count == 0) return; string oldComment = smartScript.comment; smartScript.comment = newComment; listViewSmartScripts.ReplaceSmartScript(smartScript); if (!updatingFieldsBasedOnSelectedScript) FillFieldsBasedOnSelectedScript(); if (oldComment != newComment) ResizeColumns(); }
private async void buttonNewLine_Click(object sender, EventArgs e) { if (listViewSmartScripts.Items.Count == 0) { if (!Settings.Default.UseWorldDatabase) { TryToCreateScript(true); return; } string aiName = await SAI_Editor_Manager.Instance.worldDatabase.GetObjectAiName(XConverter.ToInt32(textBoxEntryOrGuid.Text), (int)GetSourceTypeByIndex()); if (!SAI_Editor_Manager.Instance.IsAiNameSmartAi(aiName)) { DialogResult dialogResult = MessageBox.Show("Are you sure you want to create a new script for the given entry and sourcetype?", "Something went wrong", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) TryToCreateScript(true); } else TryToCreateScript(true); return; } buttonNewLine.Enabled = false; SmartScript newSmartScript = new SmartScript(); newSmartScript.entryorguid = originalEntryOrGuidAndSourceType.entryOrGuid; newSmartScript.source_type = (int)originalEntryOrGuidAndSourceType.sourceType; if (checkBoxLockEventId.Checked) newSmartScript.id = ++lastSmartScriptIdOfScript; else newSmartScript.id = -1; if (Settings.Default.GenerateComments && Settings.Default.UseWorldDatabase) newSmartScript.comment = await CommentGenerator.Instance.GenerateCommentFor(newSmartScript, originalEntryOrGuidAndSourceType); else newSmartScript.comment = SAI_Editor_Manager.Instance.GetDefaultCommentForSourceType((SourceTypes)newSmartScript.source_type); newSmartScript.event_chance = 100; int index = listViewSmartScripts.AddSmartScript(newSmartScript); HandleShowBasicInfo(); listViewSmartScripts.Items[index].Selected = true; listViewSmartScripts.Select(); listViewSmartScripts.EnsureVisible(index); buttonNewLine.Enabled = textBoxEntryOrGuid.Text.Length > 0; }
private async Task<string> GetStringByTargetType(SmartScript smartScript, WorldDatabase worldDatabase) { switch ((SmartTarget)smartScript.target_type) { case SmartTarget.SMART_TARGET_SELF: return "Self"; case SmartTarget.SMART_TARGET_VICTIM: return "Victim"; case SmartTarget.SMART_TARGET_HOSTILE_SECOND_AGGRO: return "Second On Threatlist"; case SmartTarget.SMART_TARGET_HOSTILE_LAST_AGGRO: return "Last On Threatlist"; case SmartTarget.SMART_TARGET_HOSTILE_RANDOM: return "Random On Threatlist"; case SmartTarget.SMART_TARGET_HOSTILE_RANDOM_NOT_TOP: return "Random On Threatlist Not Top"; case SmartTarget.SMART_TARGET_ACTION_INVOKER: return "Invoker"; case SmartTarget.SMART_TARGET_POSITION: return "Position"; case SmartTarget.SMART_TARGET_CREATURE_RANGE: case SmartTarget.SMART_TARGET_CREATURE_DISTANCE: case SmartTarget.SMART_TARGET_CLOSEST_CREATURE: return "Closest Creature '" + await worldDatabase.GetCreatureNameById(smartScript.target_param1) + "'"; case SmartTarget.SMART_TARGET_CREATURE_GUID: return "Closest Creature '" + await worldDatabase.GetCreatureNameByGuid(smartScript.target_param1) + "'"; case SmartTarget.SMART_TARGET_GAMEOBJECT_RANGE: case SmartTarget.SMART_TARGET_GAMEOBJECT_DISTANCE: case SmartTarget.SMART_TARGET_CLOSEST_GAMEOBJECT: return "Closest Gameobject '" + await worldDatabase.GetGameobjectNameById(smartScript.target_param1) + "'"; case SmartTarget.SMART_TARGET_GAMEOBJECT_GUID: return "Closest Gameobject '" + await worldDatabase.GetGameobjectNameByGuid(smartScript.target_param1) + "'"; case SmartTarget.SMART_TARGET_INVOKER_PARTY: return "Invoker's Party"; case SmartTarget.SMART_TARGET_PLAYER_RANGE: case SmartTarget.SMART_TARGET_PLAYER_DISTANCE: case SmartTarget.SMART_TARGET_CLOSEST_PLAYER: return "Closest Player"; case SmartTarget.SMART_TARGET_ACTION_INVOKER_VEHICLE: return "Invoker's Vehicle"; case SmartTarget.SMART_TARGET_OWNER_OR_SUMMONER: return "Owner Or Summoner"; case SmartTarget.SMART_TARGET_THREAT_LIST: return "First Unit On Threatlist"; case SmartTarget.SMART_TARGET_CLOSEST_ENEMY: return "Closest Enemy"; case SmartTarget.SMART_TARGET_CLOSEST_FRIENDLY: return "Closest Friendly Unit"; default: return "<unsupported target type>"; } }
public void ReplaceSmartScript(SmartScript script) { SmartScriptListViewItem lvi = Items.Cast<SmartScriptListViewItem>().SingleOrDefault(p => p.Script == script); if (lvi == null) return; lvi.SubItems.Clear(); lvi.Name = script.entryorguid.ToString(); lvi.Text = script.entryorguid.ToString(); foreach (PropertyInfo propInfo in _pinfo.Where(p => !p.Name.Equals("entryorguid"))) { if (_excludedProperties.Contains(propInfo.Name)) continue; lvi.SubItems.Add(propInfo.GetValue(script).ToString()); } _smartScripts[_smartScripts.IndexOf(lvi.Script)] = script; if (Settings.Default.PhaseHighlighting && script.event_phase_mask != 0) { if (!_phaseColors.ContainsKey(script.event_phase_mask)) { if (_colors.Count == 0) { MessageBox.Show("There are not enough colors in the application because you are using too many different phasemasks.", "Not enough colors!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _phaseColors.Add(script.event_phase_mask, _colors.Pop()); } lvi.BackColor = _phaseColors[script.event_phase_mask]; } }
private SmartScript GetLinkForCurrentSmartScriptLink(int idToCheck, ref SmartScript smartScriptLink) { foreach (SmartScript smartScriptInListView in ListViewList.SmartScripts) { if (smartScriptInListView.link == idToCheck) { smartScriptLink = smartScriptInListView; break; } } return null; }
private SmartScript GetInitialSmartScriptLink(SmartScript smartScript) { if (smartScript == null || (SmartEvent)smartScript.event_type != SmartEvent.SMART_EVENT_LINK) return null; SmartScript smartScriptLink = null; int idToCheck = smartScript.id; GetLinkForCurrentSmartScriptLink(idToCheck, ref smartScriptLink); while (smartScriptLink != null && (SmartEvent)smartScriptLink.event_type == SmartEvent.SMART_EVENT_LINK) { idToCheck = smartScriptLink.id; smartScriptLink = null; GetLinkForCurrentSmartScriptLink(idToCheck, ref smartScriptLink); } return smartScriptLink; }
private async void buttonNewLine_Click(object sender, EventArgs e) { if (customObjectListView.Items.Count == 0) { if (!Settings.Default.UseWorldDatabase) { TryToCreateScript(true); return; } string aiName = await SAI_Editor_Manager.Instance.worldDatabase.GetObjectAiName(CustomConverter.ToInt32(textBoxEntryOrGuid.Text), (int)GetSourceTypeByIndex()); if (!SAI_Editor_Manager.Instance.IsAiNameSmartAi(aiName)) { DialogResult dialogResult = MessageBox.Show("Are you sure you want to create a new script for the given entry and sourcetype?", "Something went wrong", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) TryToCreateScript(true); } else TryToCreateScript(true); return; } buttonNewLine.Enabled = false; SmartScript newSmartScript = new SmartScript(); newSmartScript.entryorguid = originalEntryOrGuidAndSourceType.entryOrGuid; newSmartScript.source_type = (int)originalEntryOrGuidAndSourceType.sourceType; if (checkBoxLockEventId.Checked) newSmartScript.id = ++lastSmartScriptIdOfScript; else newSmartScript.id = -1; if (Settings.Default.GenerateComments && Settings.Default.UseWorldDatabase) newSmartScript.comment = await CommentGenerator.Instance.GenerateCommentFor(newSmartScript, originalEntryOrGuidAndSourceType); else newSmartScript.comment = SAI_Editor_Manager.Instance.GetDefaultCommentForSourceType((SourceTypes)newSmartScript.source_type); newSmartScript.event_chance = 100; //! All strings have to be initialized otherwise they become null and give cause an exception in the future. newSmartScript.target_x = "0"; newSmartScript.target_y = "0"; newSmartScript.target_z = "0"; newSmartScript.target_o = "0"; ListViewList.AddScript(newSmartScript, selectNewItem: true); HandleShowBasicInfo(); ResizeColumns(); buttonNewLine.Enabled = textBoxEntryOrGuid.Text.Length > 0; }
public async Task<List<EntryOrGuidAndSourceType>> GetTimedActionlistsOrEntries(SmartScript smartScript, SourceTypes sourceType) { List<EntryOrGuidAndSourceType> timedActionListOrEntries = new List<EntryOrGuidAndSourceType>(); if (sourceType == SourceTypes.SourceTypeScriptedActionlist) { List<SmartScript> smartScriptsCallingActionlist = await worldDatabase.GetSmartScriptsCallingActionLists(); if (smartScriptsCallingActionlist != null) { foreach (SmartScript _smartScript in smartScriptsCallingActionlist) { switch ((SmartAction)_smartScript.action_type) { case SmartAction.SMART_ACTION_CALL_TIMED_ACTIONLIST: case SmartAction.SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST: if (_smartScript.action_param1 == smartScript.entryorguid || _smartScript.action_param2 == smartScript.entryorguid || _smartScript.action_param3 == smartScript.entryorguid || _smartScript.action_param4 == smartScript.entryorguid || _smartScript.action_param5 == smartScript.entryorguid || _smartScript.action_param6 == smartScript.entryorguid) { timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(_smartScript.entryorguid, (SourceTypes)_smartScript.source_type)); } break; case SmartAction.SMART_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST: for (int param = _smartScript.action_param1; param <= _smartScript.action_param2; ++param) { EntryOrGuidAndSourceType entryOrGuidAndSourceType = new EntryOrGuidAndSourceType(param, (SourceTypes)_smartScript.source_type); if (param == smartScript.entryorguid && !timedActionListOrEntries.Contains(entryOrGuidAndSourceType)) { timedActionListOrEntries.Add(entryOrGuidAndSourceType); break; } } break; } } } } else { switch ((SmartAction)smartScript.action_type) { case SmartAction.SMART_ACTION_CALL_TIMED_ACTIONLIST: timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(smartScript.action_param1, SourceTypes.SourceTypeScriptedActionlist)); break; case SmartAction.SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST: timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(smartScript.action_param1, SourceTypes.SourceTypeScriptedActionlist)); timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(smartScript.action_param2, SourceTypes.SourceTypeScriptedActionlist)); if (smartScript.action_param3 > 0) timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(smartScript.action_param3, SourceTypes.SourceTypeScriptedActionlist)); if (smartScript.action_param4 > 0) timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(smartScript.action_param4, SourceTypes.SourceTypeScriptedActionlist)); if (smartScript.action_param5 > 0) timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(smartScript.action_param5, SourceTypes.SourceTypeScriptedActionlist)); if (smartScript.action_param6 > 0) timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(smartScript.action_param6, SourceTypes.SourceTypeScriptedActionlist)); break; case SmartAction.SMART_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST: for (int param = smartScript.action_param1; param <= smartScript.action_param2; ++param) timedActionListOrEntries.Add(new EntryOrGuidAndSourceType(param, SourceTypes.SourceTypeScriptedActionlist)); break; } } return timedActionListOrEntries; }
public void ReplaceScript(SmartScript script) { base.ReplaceScript(script); CustomListViewItem lvi = Items.Cast<CustomListViewItem>().SingleOrDefault(p => p.Script == script); if (Settings.Default.PhaseHighlighting && script.event_phase_mask != 0) { if (!_phaseColors.ContainsKey(script.event_phase_mask)) { if (_colors.Count == 0) { MessageBox.Show("There are not enough colors in the application because you are using too many different phasemasks.", "Not enough colors!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _phaseColors.Add(script.event_phase_mask, _colors.Pop()); } lvi.BackColor = _phaseColors[script.event_phase_mask]; } }
//! MUST take initial smartscript of linkings private List<SmartScript> GetAllSmartScriptThatLinkFrom(SmartScript smartScriptInitial) { if (smartScriptInitial == null || smartScriptInitial.link == 0) return null; List<SmartScript> smartScriptsLinking = new List<SmartScript>(); smartScriptsLinking.Add(smartScriptInitial); SmartScript lastInitialSmartScript = smartScriptInitial; foreach (SmartScript smartScriptInListView in listViewSmartScripts.SmartScripts) { if ((SmartEvent)smartScriptInListView.event_type != SmartEvent.SMART_EVENT_LINK) continue; if (smartScriptInListView.id == lastInitialSmartScript.link) { smartScriptsLinking.Add(smartScriptInListView); lastInitialSmartScript = smartScriptInListView; } } return smartScriptsLinking; }
public void RemoveSmartScript(SmartScript script) { foreach (SmartScriptListViewItem item in Items.Cast<SmartScriptListViewItem>().Where(item => item.Script == script)) { Items.Remove(item); break; } _smartScripts.Remove(script); }
bool ListContainsSmartScript(List<SmartScript> smartScriptsToReturn, SmartScript item) { return smartScriptsToReturn.Any(itemToReturn => itemToReturn.entryorguid == item.entryorguid && itemToReturn.id == item.id); }
public async void TryToCreateScript(bool fromNewLine = false) { if (!pictureBoxCreateScript.Enabled || String.IsNullOrWhiteSpace(textBoxEntryOrGuid.Text) || comboBoxSourceType.SelectedIndex == -1) return; if (listViewSmartScripts.Items.Count > 0) { DialogResult dialogResult = MessageBox.Show("There is already a script loaded at this moment. Do you want to overwrite this?\n\nWarning: overwriting means local unsaved changes will also be discarded!", "Are you sure?", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (dialogResult != DialogResult.Yes) return; ResetFieldsToDefault(); } int entryorguid = 0; try { entryorguid = Int32.Parse(textBoxEntryOrGuid.Text); } catch (OverflowException) { MessageBox.Show("The entryorguid is either too big or too small.", "Something went wrong!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } catch (FormatException) { MessageBox.Show("The entryorguid field does not contain a valid number.", "Something went wrong!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } lastSmartScriptIdOfScript = 0; int source_type = (int)GetSourceTypeByIndex(); string sourceTypeString = GetSourceTypeString((SourceTypes)source_type); if (!Settings.Default.UseWorldDatabase) goto SkipWorldDatabaseChecks; string aiName = await SAI_Editor_Manager.Instance.worldDatabase.GetObjectAiName(entryorguid, source_type); List<SmartScript> smartScripts = await SAI_Editor_Manager.Instance.worldDatabase.GetSmartScripts(entryorguid, source_type); //! Allow adding new lines even if the AIName is already set if ((SourceTypes)source_type == SourceTypes.SourceTypeAreaTrigger) { if (aiName != String.Empty) { string errorMessage = "This areatrigger already has its "; if (aiName != "SmartTrigger") errorMessage += "ScriptName set to '" + aiName + "'"; else errorMessage += "AIName set (for SmartAI)! Do you want to load it instead?"; DialogResult dialogResult = MessageBox.Show(errorMessage, "Something went wrong", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) TryToLoadScript(); return; } } else { if (aiName != String.Empty) { string strAlreadyHasAiName = String.Empty; bool aiNameIsSmart = SAI_Editor_Manager.Instance.IsAiNameSmartAi(aiName); if (aiNameIsSmart) { if (smartScripts == null || smartScripts.Count == 0) goto SkipWorldDatabaseChecks; if (fromNewLine) goto SkipAiNameAndScriptNameChecks; strAlreadyHasAiName += "This " + sourceTypeString + " already has its AIName set to '" + aiName + "'"; strAlreadyHasAiName += "! Do you want to load it instead?"; } else { strAlreadyHasAiName += "This " + sourceTypeString + " already has its AIName set to '" + aiName + "'"; strAlreadyHasAiName += " and can therefore not have any SmartAI. Do you want to get rid of this AIName right now?"; } DialogResult dialogResult = MessageBox.Show(strAlreadyHasAiName, "Something went wrong", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) { if (!aiNameIsSmart) { //! We don't have to target areatrigger_scripts here, as we've already done this a few lines up string sqlOutput = "UPDATE `" + GetTemplateTableBySourceType((SourceTypes)source_type) + "` SET `AIName`=" + '"' + '"' + " WHERE `entry`=" + entryorguid + ";\n"; using (SqlOutputForm sqlOutputForm = new SqlOutputForm(sqlOutput)) sqlOutputForm.ShowDialog(this); } else TryToLoadScript(); } return; } string scriptName = await SAI_Editor_Manager.Instance.worldDatabase.GetObjectScriptName(entryorguid, source_type); if (scriptName != String.Empty) { MessageBox.Show("This " + sourceTypeString + " already has a ScriptName set (to '" + scriptName + "')!", "Something went wrong", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } SkipAiNameAndScriptNameChecks: if (smartScripts != null && smartScripts.Count > 0) { string errorMessage = "This " + sourceTypeString + " already has smart scripts";// (without its AIName set to SmartAI)! Do you want to load it instead?"; if ((SourceTypes)source_type != SourceTypes.SourceTypeScriptedActionlist) errorMessage += " (without its AIName set to SmartAI)!"; else errorMessage += "!"; errorMessage += " Do you want to load it instead?"; DialogResult dialogResult = MessageBox.Show(errorMessage, "Something went wrong", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) TryToLoadScript(); return; } SkipWorldDatabaseChecks: buttonNewLine.Enabled = false; checkBoxListActionlistsOrEntries.Text = GetSourceTypeByIndex() == SourceTypes.SourceTypeScriptedActionlist ? "List entries too" : "List actionlists too"; pictureBoxLoadScript.Enabled = false; pictureBoxCreateScript.Enabled = false; originalEntryOrGuidAndSourceType.entryOrGuid = entryorguid; originalEntryOrGuidAndSourceType.sourceType = (SourceTypes)source_type; listViewSmartScripts.ReplaceSmartScripts(new List<SmartScript>()); SmartScript newSmartScript = new SmartScript(); newSmartScript.entryorguid = entryorguid; newSmartScript.source_type = source_type; if (checkBoxLockEventId.Checked) newSmartScript.id = 0; else newSmartScript.id = -1; newSmartScript.link = XConverter.ToInt32(textBoxLinkTo.Text); newSmartScript.event_type = XConverter.ToInt32(textBoxEventType.Text); newSmartScript.event_phase_mask = XConverter.ToInt32(textBoxEventPhasemask.Text); newSmartScript.event_chance = XConverter.ToInt32(textBoxEventChance.Value); newSmartScript.event_flags = XConverter.ToInt32(textBoxEventFlags.Text); newSmartScript.event_param1 = XConverter.ToInt32(textBoxEventParam1.Text); newSmartScript.event_param2 = XConverter.ToInt32(textBoxEventParam2.Text); newSmartScript.event_param3 = XConverter.ToInt32(textBoxEventParam3.Text); newSmartScript.event_param4 = XConverter.ToInt32(textBoxEventParam4.Text); newSmartScript.action_type = XConverter.ToInt32(textBoxActionType.Text); newSmartScript.action_param1 = XConverter.ToInt32(textBoxActionParam1.Text); newSmartScript.action_param2 = XConverter.ToInt32(textBoxActionParam2.Text); newSmartScript.action_param3 = XConverter.ToInt32(textBoxActionParam3.Text); newSmartScript.action_param4 = XConverter.ToInt32(textBoxActionParam4.Text); newSmartScript.action_param5 = XConverter.ToInt32(textBoxActionParam5.Text); newSmartScript.action_param6 = XConverter.ToInt32(textBoxActionParam6.Text); newSmartScript.target_type = XConverter.ToInt32(textBoxTargetType.Text); newSmartScript.target_param1 = XConverter.ToInt32(textBoxTargetParam1.Text); newSmartScript.target_param2 = XConverter.ToInt32(textBoxTargetParam2.Text); newSmartScript.target_param3 = XConverter.ToInt32(textBoxTargetParam3.Text); newSmartScript.target_x = textBoxTargetX.Text; newSmartScript.target_y = textBoxTargetY.Text; newSmartScript.target_z = textBoxTargetZ.Text; newSmartScript.target_o = textBoxTargetO.Text; if (Settings.Default.GenerateComments && Settings.Default.UseWorldDatabase) newSmartScript.comment = await CommentGenerator.Instance.GenerateCommentFor(newSmartScript, originalEntryOrGuidAndSourceType); else if (textBoxComments.Text.Contains(" - Event - Action (phase) (dungeon difficulty)")) newSmartScript.comment = SAI_Editor_Manager.Instance.GetDefaultCommentForSourceType((SourceTypes)newSmartScript.source_type); else newSmartScript.comment = textBoxComments.Text; listViewSmartScripts.AddSmartScript(newSmartScript); HandleShowBasicInfo(); listViewSmartScripts.Items[0].Selected = true; listViewSmartScripts.Select(); buttonNewLine.Enabled = textBoxEntryOrGuid.Text.Length > 0; SetGenerateCommentsEnabled(listViewSmartScripts.Items.Count > 0 && Settings.Default.UseWorldDatabase); pictureBoxLoadScript.Enabled = textBoxEntryOrGuid.Text.Length > 0 && Settings.Default.UseWorldDatabase; pictureBoxCreateScript.Enabled = textBoxEntryOrGuid.Text.Length > 0; }
public async Task<string> GenerateCommentFor(SmartScript smartScript, EntryOrGuidAndSourceType entryOrGuidAndSourceType, bool forced = false, SmartScript smartScriptLink = null) { //! Don't generate a comment when: //- The world database is not supposed to be used; //- The setting to generate comments is turned off and the comment generating was not FORCED. if (!Settings.Default.UseWorldDatabase || (!forced && !Settings.Default.GenerateComments)) return !String.IsNullOrWhiteSpace(smartScript.comment) ? smartScript.comment : SAI_Editor_Manager.Instance.GetDefaultCommentForSourceType((SourceTypes)smartScript.source_type); string fullLine = String.Empty; try { WorldDatabase worldDatabase = SAI_Editor_Manager.Instance.worldDatabase; SQLiteDatabase sqliteDatabase = SAI_Editor_Manager.Instance.sqliteDatabase; int entry = smartScript.entryorguid; switch (smartScript.source_type) { case 0: //! Creature fullLine += await worldDatabase.GetObjectNameByIdOrGuidAndSourceType(SourceTypes.SourceTypeCreature, smartScript.entryorguid, true) + " - "; fullLine += smartEventStrings[(SmartEvent)smartScript.event_type]; break; case 1: //! Gameobject fullLine += await worldDatabase.GetObjectNameByIdOrGuidAndSourceType(SourceTypes.SourceTypeGameobject, smartScript.entryorguid, true) + " - "; fullLine += smartEventStrings[(SmartEvent)smartScript.event_type]; break; case 2: //! Areatrigger fullLine += "Areatrigger - "; switch ((SmartEvent)smartScript.event_type) { case SmartEvent.SMART_EVENT_AREATRIGGER_ONTRIGGER: case SmartEvent.SMART_EVENT_LINK: fullLine += "On Trigger"; break; default: fullLine += "INCORRECT EVENT TYPE"; break; } break; case 9: //! Actionlist if (entryOrGuidAndSourceType.sourceType == SourceTypes.SourceTypeScriptedActionlist) { List<EntryOrGuidAndSourceType> timedActionListOrEntries = await SAI_Editor_Manager.Instance.GetTimedActionlistsOrEntries(smartScript, SourceTypes.SourceTypeScriptedActionlist); if (timedActionListOrEntries != null && timedActionListOrEntries.Count > 0) fullLine += await worldDatabase.GetObjectNameByIdOrGuidAndSourceType(timedActionListOrEntries[0].sourceType, timedActionListOrEntries[0].entryOrGuid, true) + " - "; } else fullLine += await worldDatabase.GetObjectNameByIdOrGuidAndSourceType(entryOrGuidAndSourceType.sourceType, entryOrGuidAndSourceType.entryOrGuid, true) + " - "; fullLine += (SmartEvent)smartScript.event_type != SmartEvent.SMART_EVENT_UPDATE_IC ? "INCORRECT EVENT TYPE" : "On Script"; break; } if (fullLine.Contains("_previousLineComment_") && smartScriptLink != null) { fullLine = fullLine.Replace("_previousLineComment_", smartEventStrings[(SmartEvent)smartScriptLink.event_type]); smartScript.event_param1 = smartScriptLink.event_param1; smartScript.event_param2 = smartScriptLink.event_param2; smartScript.event_param3 = smartScriptLink.event_param3; smartScript.event_param4 = smartScriptLink.event_param4; } fullLine = fullLine.Replace("_previousLineComment_", "MISSING LINK"); //! This must be called AFTER we check for _previousLineComment_ so that copied event types don't need special handling if (fullLine.Contains("_eventParamOne_")) fullLine = fullLine.Replace("_eventParamOne_", smartScript.event_param1.ToString()); if (fullLine.Contains("_eventParamTwo_")) fullLine = fullLine.Replace("_eventParamTwo_", smartScript.event_param2.ToString()); if (fullLine.Contains("_eventParamThree_")) fullLine = fullLine.Replace("_eventParamThree_", smartScript.event_param3.ToString()); if (fullLine.Contains("_eventParamFour_")) fullLine = fullLine.Replace("_eventParamFour_", smartScript.event_param4.ToString()); if (fullLine.Contains("_spellNameEventParamOne_")) { if (smartScript.event_param1 > 0) fullLine = fullLine.Replace("_spellNameEventParamOne_", await sqliteDatabase.GetSpellNameById(smartScript.event_param1)); else fullLine = fullLine.Replace(" '_spellNameEventParamOne_'", String.Empty); } if (fullLine.Contains("_targetCastingSpellName_")) { if (smartScript.event_param3.ToString() != "0") fullLine = fullLine.Replace("_targetCastingSpellName_", await sqliteDatabase.GetSpellNameById(smartScript.event_param3)); else fullLine = fullLine.Replace(" '_targetCastingSpellName_'", String.Empty); } if (fullLine.Contains("_questNameEventParamOne_")) { if (smartScript.event_param1 == 0) //! Any quest (SMART_EVENT_ACCEPTED_QUEST / SMART_EVENT_REWARD_QUEST) fullLine = fullLine.Replace(" '_questNameEventParamOne_'", String.Empty); else fullLine = fullLine.Replace("_questNameEventParamOne_", await worldDatabase.GetQuestTitleById(smartScript.event_param1)); } if (fullLine.Contains("_hasAuraEventParamOne_")) fullLine = fullLine.Replace("_hasAuraEventParamOne_", smartScript.event_param1 > 0 ? "Has Aura" : "Aura Not Present"); //! Action type fullLine += " - " + smartActionStrings[(SmartAction)smartScript.action_type]; if (fullLine.Contains("_actionParamOne_")) fullLine = fullLine.Replace("_actionParamOne_", smartScript.action_param1.ToString()); if (fullLine.Contains("_actionParamTwo_")) fullLine = fullLine.Replace("_actionParamTwo_", smartScript.action_param2.ToString()); if (fullLine.Contains("_actionParamThree_")) fullLine = fullLine.Replace("_actionParamThree_", smartScript.action_param3.ToString()); if (fullLine.Contains("_actionParamFour_")) fullLine = fullLine.Replace("_actionParamFour_", smartScript.action_param4.ToString()); if (fullLine.Contains("_actionParamFive_")) fullLine = fullLine.Replace("_actionParamFive_", smartScript.action_param5.ToString()); if (fullLine.Contains("_actionParamSix_")) fullLine = fullLine.Replace("_actionParamSix_", smartScript.action_param6.ToString()); if (fullLine.Contains("_spellNameActionParamOne_")) { if (smartScript.action_param1.ToString() != "0") fullLine = fullLine.Replace("_spellNameActionParamOne_", await sqliteDatabase.GetSpellNameById(smartScript.action_param1)); else fullLine = fullLine.Replace(" '_spellNameActionParamOne_'", String.Empty); } if (fullLine.Contains("_spellNameActionParamTwo_")) { if (smartScript.action_param2.ToString() != "0") fullLine = fullLine.Replace("_spellNameActionParamTwo_", await sqliteDatabase.GetSpellNameById(smartScript.action_param2)); else fullLine = fullLine.Replace(" '_spellNameActionParamTwo_'", String.Empty); } if (fullLine.Contains("_questNameActionParamOne_")) fullLine = fullLine.Replace("_questNameActionParamOne_", await worldDatabase.GetQuestTitleById(smartScript.action_param1)); if (fullLine.Contains("_questNameCastCreatureOrGo_")) fullLine = fullLine.Replace("_questNameCastCreatureOrGo_", await worldDatabase.GetQuestTitleByCriteria(smartScript.action_param1, smartScript.action_param1, smartScript.action_param1, smartScript.action_param1, smartScript.action_param2)); if (fullLine.Contains("_questNameKillCredit_")) fullLine = fullLine.Replace("_questNameKillCredit_", await worldDatabase.GetQuestTitleByCriteria(smartScript.action_param1, smartScript.action_param1, smartScript.action_param1, smartScript.action_param1)); if (fullLine.Contains("_reactStateParamOne_")) { switch (smartScript.action_param1) { case 0: fullLine = fullLine.Replace("_reactStateParamOne_", "Passive"); break; case 1: fullLine = fullLine.Replace("_reactStateParamOne_", "Defensive"); break; case 2: fullLine = fullLine.Replace("_reactStateParamOne_", "Aggressive"); break; default: fullLine = fullLine.Replace("_reactStateParamOne_", "<Unknown Reactstate>"); break; } } if (fullLine.Contains("_actionRandomParameters_")) { string randomEmotes = smartScript.action_param1 + ", " + smartScript.action_param2; if (smartScript.action_param3 > 0) randomEmotes += ", " + smartScript.action_param3; if (smartScript.action_param4 > 0) randomEmotes += ", " + smartScript.action_param4; if (smartScript.action_param5 > 0) randomEmotes += ", " + smartScript.action_param5; if (smartScript.action_param6 > 0) randomEmotes += ", " + smartScript.action_param6; fullLine = fullLine.Replace("_actionRandomParameters_", randomEmotes); } if (fullLine.Contains("_creatureNameActionParamOne_")) fullLine = fullLine.Replace("_creatureNameActionParamOne_", await worldDatabase.GetCreatureNameById(smartScript.action_param1)); if (fullLine.Contains("_getUnitFlags_")) { string commentUnitFlag = ""; int unitFlags = smartScript.action_param1; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SERVER_CONTROLLED) != 0) commentUnitFlag += "Server Controlled & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_NON_ATTACKABLE) != 0) commentUnitFlag += "Not Attackable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_DISABLE_MOVE) != 0) commentUnitFlag += "Disable Movement & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PVP_ATTACKABLE) != 0) commentUnitFlag += "Pvp Attackable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_RENAME) != 0) commentUnitFlag += "Rename & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PREPARATION) != 0) commentUnitFlag += "Preparation & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_NOT_ATTACKABLE_1) != 0) commentUnitFlag += "Not Attackable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_IMMUNE_TO_PC) != 0) commentUnitFlag += "Immune To Players & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_IMMUNE_TO_NPC) != 0) commentUnitFlag += "Immune To NPC's & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_LOOTING) != 0) commentUnitFlag += "Looting & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PET_IN_COMBAT) != 0) commentUnitFlag += "Pet In Combat & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PVP) != 0) commentUnitFlag += "PvP & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SILENCED) != 0) commentUnitFlag += "Silenced & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PACIFIED) != 0) commentUnitFlag += "Pacified & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_STUNNED) != 0) commentUnitFlag += "Stunned & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_IN_COMBAT) != 0) commentUnitFlag += "In Combat & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_DISARMED) != 0) commentUnitFlag += "Disarmed & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_CONFUSED) != 0) commentUnitFlag += "Confused & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_FLEEING) != 0) commentUnitFlag += "Fleeing & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PLAYER_CONTROLLED) != 0) commentUnitFlag += "Player Controlled & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_NOT_SELECTABLE) != 0) commentUnitFlag += "Not Selectable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SKINNABLE) != 0) commentUnitFlag += "Skinnable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_MOUNT) != 0) commentUnitFlag += "Mounted & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SHEATHE) != 0) commentUnitFlag += "Sheathed & "; commentUnitFlag = commentUnitFlag.Trim(new[] { ' ', '&', ' ' }); //! Trim last ' & ' from the comment.. if (commentUnitFlag.Contains("&")) fullLine = fullLine.Replace("_getUnitFlags_", "s_getUnitFlags_"); fullLine = fullLine.Replace("_getUnitFlags_", " " + commentUnitFlag); } if (fullLine.Contains("_getNpcFlags_")) { string commentNpcFlag = ""; int npcFlags = smartScript.action_param1; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_NONE) != 0) commentNpcFlag += "None & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_GOSSIP) != 0) commentNpcFlag += "Gossip & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_QUESTGIVER) != 0) commentNpcFlag += "Questgiver & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_UNK1) != 0) commentNpcFlag += "Unknown 1 & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_UNK2) != 0) commentNpcFlag += "Unknown 2 & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_TRAINER) != 0) commentNpcFlag += "Trainer & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_TRAINER_CLASS) != 0) commentNpcFlag += "Class Trainer & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_TRAINER_PROFESSION) != 0) commentNpcFlag += "Profession Trainer & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_VENDOR) != 0) commentNpcFlag += "Vendor & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_VENDOR_AMMO) != 0) commentNpcFlag += "Ammo Vendor & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_VENDOR_FOOD) != 0) commentNpcFlag += "Food Vendor & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_VENDOR_POISON) != 0) commentNpcFlag += "Poison Vendor & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_VENDOR_REAGENT) != 0) commentNpcFlag += "Reagent Vendor & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_REPAIR) != 0) commentNpcFlag += "Repair Vendor & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_FLIGHTMASTER) != 0) commentNpcFlag += "Flightmaster & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_SPIRITHEALER) != 0) commentNpcFlag += "Spirithealer & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_SPIRITGUIDE) != 0) commentNpcFlag += "Spiritguide & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_INNKEEPER) != 0) commentNpcFlag += "Innkeeper & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_BANKER) != 0) commentNpcFlag += "Banker & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_PETITIONER) != 0) commentNpcFlag += "Petitioner & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_TABARDDESIGNER) != 0) commentNpcFlag += "Tabard Designer & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_BATTLEMASTER) != 0) commentNpcFlag += "Battlemaster & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_AUCTIONEER) != 0) commentNpcFlag += "Auctioneer & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_STABLEMASTER) != 0) commentNpcFlag += "Stablemaster & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_GUILD_BANKER) != 0) commentNpcFlag += "Guild Banker & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_SPELLCLICK) != 0) commentNpcFlag += "Spellclick & "; if ((npcFlags & (int)NpcFlags.UNIT_NPC_FLAG_PLAYER_VEHICLE) != 0) commentNpcFlag += "Player Vehicle & "; commentNpcFlag = commentNpcFlag.Trim(new[] { ' ', '&', ' ' }); //! Trim last ' & ' from the comment.. if (commentNpcFlag.Contains("&")) fullLine = fullLine.Replace("_getNpcFlags_", "s_getNpcFlags_"); fullLine = fullLine.Replace("_getNpcFlags_", " " + commentNpcFlag); } if (fullLine.Contains("_startOrStopActionParamOne_")) { if (smartScript.action_param1.ToString() == "0") fullLine = fullLine.Replace("_startOrStopActionParamOne_", "Stop"); else //! Even if above 1 or below 0 we start attacking/allow-combat-movement fullLine = fullLine.Replace("_startOrStopActionParamOne_", "Start"); } if (fullLine.Contains("_enableDisableActionParamOne_")) { if (smartScript.action_param1.ToString() == "0") fullLine = fullLine.Replace("_enableDisableActionParamOne_", "Disable"); else //! Even if above 1 or below 0 we start attacking/allow-combat-movement fullLine = fullLine.Replace("_enableDisableActionParamOne_", "Enable"); } if (fullLine.Contains("_incrementOrDecrementActionParamOne_")) { if (smartScript.action_param1.ToString() == "1") fullLine = fullLine.Replace("_incrementOrDecrementActionParamOne_", "Increment"); else if (smartScript.action_param2.ToString() == "1") fullLine = fullLine.Replace("_incrementOrDecrementActionParamOne_", "Decrement"); //else //? What to do? } if (fullLine.Contains("_sheathActionParamOne_")) { switch (smartScript.action_param1) { case 0: fullLine = fullLine.Replace("_sheathActionParamOne_", "Unarmed"); break; case 1: fullLine = fullLine.Replace("_sheathActionParamOne_", "Melee"); break; case 2: fullLine = fullLine.Replace("_sheathActionParamOne_", "Ranged"); break; default: fullLine = fullLine.Replace("_sheathActionParamOne_", "<Unknown Sheath>"); break; } } if (fullLine.Contains("_forceDespawnActionParamOne_")) { if (smartScript.action_param1 > 2) fullLine = fullLine.Replace("_forceDespawnActionParamOne_", "In " + smartScript.action_param1 + " ms"); else fullLine = fullLine.Replace("_forceDespawnActionParamOne_", "Instant"); } if (fullLine.Contains("_invincibilityHpActionParamsOneTwo_")) { if (smartScript.action_param1 > 0) fullLine = fullLine.Replace("_invincibilityHpActionParamsOneTwo_", "Set Invincibility Hp " + smartScript.action_param1.ToString()); else if (smartScript.action_param2 > 0) fullLine = fullLine.Replace("_invincibilityHpActionParamsOneTwo_", "Set Invincibility Hp " + smartScript.action_param2 + "%"); else if (smartScript.action_param1 == 0 && smartScript.action_param2 == 0) fullLine = fullLine.Replace("_invincibilityHpActionParamsOneTwo_", "Reset Invincibility Hp"); else fullLine = fullLine.Replace("_invincibilityHpActionParamsOneTwo_", "<Unsupported parameters>"); } if (fullLine.Contains("_onOffActionParamOne_")) { if (smartScript.action_param1 == 1) fullLine = fullLine.Replace("_onOffActionParamOne_", "On"); else fullLine = fullLine.Replace("_onOffActionParamOne_", "Off"); } if (fullLine.Contains("_gameobjectNameActionParamOne_")) fullLine = fullLine.Replace("_gameobjectNameActionParamOne_", await worldDatabase.GetGameobjectNameById(smartScript.action_param1)); if (fullLine.Contains("_addItemBasedOnActionParams_")) { fullLine = fullLine.Replace("_addItemBasedOnActionParams_", "'" + await worldDatabase.GetItemNameById(smartScript.action_param1) + "' "); if (smartScript.action_param2 > 1) fullLine += smartScript.action_param2 + " Times"; else fullLine += "1 Time"; } if (fullLine.Contains("_updateAiTemplateActionParamOne_")) { switch ((SmartAiTemplates)smartScript.action_param1) { case SmartAiTemplates.SMARTAI_TEMPLATE_BASIC: fullLine = fullLine.Replace("_updateAiTemplateActionParamOne_", "Basic"); break; case SmartAiTemplates.SMARTAI_TEMPLATE_CASTER: fullLine = fullLine.Replace("_updateAiTemplateActionParamOne_", "Caster"); break; case SmartAiTemplates.SMARTAI_TEMPLATE_TURRET: fullLine = fullLine.Replace("_updateAiTemplateActionParamOne_", "Turret"); break; case SmartAiTemplates.SMARTAI_TEMPLATE_PASSIVE: fullLine = fullLine.Replace("_updateAiTemplateActionParamOne_", "Passive"); break; case SmartAiTemplates.SMARTAI_TEMPLATE_CAGED_GO_PART: fullLine = fullLine.Replace("_updateAiTemplateActionParamOne_", "Caged Gameobject Part"); break; case SmartAiTemplates.SMARTAI_TEMPLATE_CAGED_NPC_PART: fullLine = fullLine.Replace("_updateAiTemplateActionParamOne_", "Caged Creature Part"); break; default: fullLine = fullLine.Replace("_updateAiTemplateActionParamOne_", "<_updateAiTemplateActionParamOne_ Unknown ai template>"); break; } } if (fullLine.Contains("_setOrientationTargetType_")) { switch ((SmartTarget)smartScript.target_type) { case SmartTarget.SMART_TARGET_SELF: fullLine = fullLine.Replace("_setOrientationTargetType_", "Home Position"); break; case SmartTarget.SMART_TARGET_POSITION: fullLine = fullLine.Replace("_setOrientationTargetType_", smartScript.target_o.ToString()); break; default: fullLine = fullLine.Replace("_setOrientationTargetType_", await GetStringByTargetType(smartScript, worldDatabase)); break; } } if (fullLine.Contains("_getTargetType_")) fullLine = fullLine.Replace("_getTargetType_", await GetStringByTargetType(smartScript, worldDatabase)); if (fullLine.Contains("_goStateActionParamOne_")) { switch (smartScript.action_param1) { case 0: fullLine = fullLine.Replace("_goStateActionParamOne_", "Not Ready"); break; case 1: fullLine = fullLine.Replace("_goStateActionParamOne_", "Ready"); break; case 2: fullLine = fullLine.Replace("_goStateActionParamOne_", "Activated"); break; case 3: fullLine = fullLine.Replace("_goStateActionParamOne_", "Deactivated"); break; default: fullLine = fullLine.Replace("_goStateActionParamOne_", "<Unknown Gameobject State>"); break; } } if (fullLine.Contains("_getGoFlags_")) { string commentGoFlag = ""; int goFlags = smartScript.action_param1; if ((goFlags & (int)GoFlags.GO_FLAG_IN_USE) != 0) commentGoFlag += "In Use & "; if ((goFlags & (int)GoFlags.GO_FLAG_LOCKED) != 0) commentGoFlag += "Locked & "; if ((goFlags & (int)GoFlags.GO_FLAG_INTERACT_COND) != 0) commentGoFlag += "Interact Condition & "; if ((goFlags & (int)GoFlags.GO_FLAG_TRANSPORT) != 0) commentGoFlag += "Transport & "; if ((goFlags & (int)GoFlags.GO_FLAG_NOT_SELECTABLE) != 0) commentGoFlag += "Not Selectable & "; if ((goFlags & (int)GoFlags.GO_FLAG_NODESPAWN) != 0) commentGoFlag += "No Despawn & "; if ((goFlags & (int)GoFlags.GO_FLAG_TRIGGERED) != 0) commentGoFlag += "Triggered & "; if ((goFlags & (int)GoFlags.GO_FLAG_DAMAGED) != 0) commentGoFlag += "Damaged & "; if ((goFlags & (int)GoFlags.GO_FLAG_DESTROYED) != 0) commentGoFlag += "Destroyed & "; commentGoFlag = commentGoFlag.Trim(new[] { ' ', '&', ' ' }); //! Trim last ' & ' from the comment.. if (commentGoFlag.Contains("&")) fullLine = fullLine.Replace("_getGoFlags_", "s_getGoFlags_"); fullLine = fullLine.Replace("_getGoFlags_", " " + commentGoFlag); } if (fullLine.Contains("_getDynamicFlags_")) { string commentDynamicFlag = ""; int dynamicFlags = smartScript.action_param1; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_NONE) != 0) commentDynamicFlag += "None & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_LOOTABLE) != 0) commentDynamicFlag += "Lootable & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_TRACK_UNIT) != 0) commentDynamicFlag += "Track Units & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_TAPPED) != 0) commentDynamicFlag += "Tapped & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_TAPPED_BY_PLAYER) != 0) commentDynamicFlag += "Tapped By Player & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_SPECIALINFO) != 0) commentDynamicFlag += "Special Info & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_DEAD) != 0) commentDynamicFlag += "Dead & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_REFER_A_FRIEND) != 0) commentDynamicFlag += "Refer A Friend & "; if ((dynamicFlags & (int)DynamicFlags.UNIT_DYNFLAG_TAPPED_BY_ALL_THREAT_LIST) != 0) commentDynamicFlag += "Tapped By Threatlist & "; commentDynamicFlag = commentDynamicFlag.Trim(new[] { ' ', '&', ' ' }); //! Trim last ' & ' from the comment.. if (commentDynamicFlag.Contains("&")) fullLine = fullLine.Replace("_getDynamicFlags_", "s_getDynamicFlags_"); fullLine = fullLine.Replace("_getDynamicFlags_", " " + commentDynamicFlag); } if (fullLine.Contains("_getBytes1Flags_")) { switch ((UnitFieldBytes1Types)smartScript.action_param2) { case UnitFieldBytes1Types.UNIT_STAND_STAND_STATE_TYPE: { switch ((UnitStandStateType)smartScript.action_param1) { case UnitStandStateType.UNIT_STAND_STATE_STAND: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Stand Up"); break; case UnitStandStateType.UNIT_STAND_STATE_SIT: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Sit Down"); break; case UnitStandStateType.UNIT_STAND_STATE_SIT_CHAIR: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Sit Down Chair"); break; case UnitStandStateType.UNIT_STAND_STATE_SLEEP: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Sleep"); break; case UnitStandStateType.UNIT_STAND_STATE_SIT_LOW_CHAIR: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Sit Low Chair"); break; case UnitStandStateType.UNIT_STAND_STATE_SIT_MEDIUM_CHAIR: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Sit Medium Chair"); break; case UnitStandStateType.UNIT_STAND_STATE_SIT_HIGH_CHAIR: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Sit High Chair"); break; case UnitStandStateType.UNIT_STAND_STATE_DEAD: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Dead"); break; case UnitStandStateType.UNIT_STAND_STATE_KNEEL: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Kneel"); break; case UnitStandStateType.UNIT_STAND_STATE_SUBMERGED: fullLine = fullLine.Replace("_getBytes1Flags_", "Standstate Submerged"); break; default: fullLine = fullLine.Replace("_getBytes1Flags_", "<Unknown bytes1 (UnitStandStateType)>"); break; } break; } case UnitFieldBytes1Types.UNIT_PET_TALENTS_TYPE: { fullLine = fullLine.Replace("_getBytes1Flags_", "<Unknown bytes1 type>"); break; } case UnitFieldBytes1Types.UNIT_STAND_FLAGS_TYPE: { switch ((UnitStandFlags)smartScript.action_param1) { case UnitStandFlags.UNIT_STAND_FLAGS_UNK1: case UnitStandFlags.UNIT_STAND_FLAGS_UNK4: case UnitStandFlags.UNIT_STAND_FLAGS_UNK5: fullLine = fullLine.Replace("_getBytes1Flags_", "<Unknown>"); break; case UnitStandFlags.UNIT_STAND_FLAGS_CREEP: fullLine = fullLine.Replace("_getBytes1Flags_", "Creep"); break; case UnitStandFlags.UNIT_STAND_FLAGS_UNTRACKABLE: fullLine = fullLine.Replace("_getBytes1Flags_", "Untrackable"); break; default: fullLine = fullLine.Replace("_getBytes1Flags_", "<Unknown bytes1 (UnitStandFlags)>"); break; } break; } case UnitFieldBytes1Types.UNIT_BYTES1_FLAGS_TYPE: { switch ((UnitBytes1_Flags)smartScript.action_param1) { case UnitBytes1_Flags.UNIT_BYTE1_FLAG_UNK_3: fullLine = fullLine.Replace("_getBytes1Flags_", "<Unknown>"); break; case UnitBytes1_Flags.UNIT_BYTE1_FLAG_HOVER: fullLine = fullLine.Replace("_getBytes1Flags_", "Hover"); break; case UnitBytes1_Flags.UNIT_BYTE1_FLAG_ALWAYS_STAND: fullLine = fullLine.Replace("_getBytes1Flags_", "Always Stand"); break; default: fullLine = fullLine.Replace("_getBytes1Flags_", "<Unknown bytes1 (UnitBytes1_Flags)>"); break; } break; } default: break; } } if (fullLine.Contains("_powerTypeActionParamOne_")) { switch (smartScript.action_param1) { case 0: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "Mana"); break; case 1: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "Rage"); break; case 2: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "Focus"); break; case 3: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "Energy"); break; case 4: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "Happiness"); break; case 5: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "Rune"); break; case 6: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "Runic Power"); break; default: fullLine = fullLine.Replace("_powerTypeActionParamOne_", "<Unknown Powertype>"); break; } } if (fullLine.Contains("_getUnitFlags_")) { string commentUnitFlag = ""; int unitFlags = smartScript.action_param1; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SERVER_CONTROLLED) != 0) commentUnitFlag += "Server Controlled & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_NON_ATTACKABLE) != 0) commentUnitFlag += "Not Attackable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_DISABLE_MOVE) != 0) commentUnitFlag += "Disable Move & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PVP_ATTACKABLE) != 0) commentUnitFlag += "PvP Attackable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_RENAME) != 0) commentUnitFlag += "Rename & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PREPARATION) != 0) commentUnitFlag += "Preparation & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_NOT_ATTACKABLE_1) != 0) commentUnitFlag += "Not Attackable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_IMMUNE_TO_PC) != 0) commentUnitFlag += "Immune To Players & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_IMMUNE_TO_NPC) != 0) commentUnitFlag += "Immune To Creatures & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_LOOTING) != 0) commentUnitFlag += "Looting & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PET_IN_COMBAT) != 0) commentUnitFlag += "Pet In Combat & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PVP) != 0) commentUnitFlag += "PvP & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SILENCED) != 0) commentUnitFlag += "Silenced & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PACIFIED) != 0) commentUnitFlag += "Pacified & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_STUNNED) != 0) commentUnitFlag += "Stunned & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_IN_COMBAT) != 0) commentUnitFlag += "In Combat & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_TAXI_FLIGHT) != 0) commentUnitFlag += "Taxi Flight & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_DISARMED) != 0) commentUnitFlag += "Disarmed & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_CONFUSED) != 0) commentUnitFlag += "Confused & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_FLEEING) != 0) commentUnitFlag += "Fleeing & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_PLAYER_CONTROLLED) != 0) commentUnitFlag += "Player Controlled & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_NOT_SELECTABLE) != 0) commentUnitFlag += "Not Selectable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SKINNABLE) != 0) commentUnitFlag += "Skinnable & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_MOUNT) != 0) commentUnitFlag += "Mounted & "; if ((unitFlags & (int)UnitFlags.UNIT_FLAG_SHEATHE) != 0) commentUnitFlag += "Sheathed & "; commentUnitFlag = commentUnitFlag.Trim(new[] { ' ', '&', ' ' }); //! Trim last ' & ' from the comment.. if (commentUnitFlag.Contains("&")) fullLine = fullLine.Replace("_getUnitFlags_", "s_getUnitFlags_"); fullLine = fullLine.Replace("_getUnitFlags_", " " + commentUnitFlag); } if (fullLine.Contains("_morphToEntryOrModelActionParams_")) { if (smartScript.action_param1 > 0) fullLine = fullLine.Replace("_morphToEntryOrModelActionParams_", "Morph To Creature " + await worldDatabase.GetCreatureNameById(smartScript.action_param1)); else if (smartScript.action_param2 > 0) fullLine = fullLine.Replace("_morphToEntryOrModelActionParams_", "Morph To Model " + smartScript.action_param2); else fullLine = fullLine.Replace("_morphToEntryOrModelActionParams_", "Demorph"); } if (fullLine.Contains("_mountToEntryOrModelActionParams_")) { if (smartScript.action_param1 > 0) fullLine = fullLine.Replace("_mountToEntryOrModelActionParams_", "Mount To Creature " + await worldDatabase.GetCreatureNameById(smartScript.action_param1)); else if (smartScript.action_param2 > 0) fullLine = fullLine.Replace("_mountToEntryOrModelActionParams_", "Mount To Model " + smartScript.action_param2); else fullLine = fullLine.Replace("_mountToEntryOrModelActionParams_", "Dismount"); } if (fullLine.Contains("_startOrStopBasedOnTargetType_")) { if (smartScript.target_type == 0) { fullLine = fullLine.Replace("_startOrStopBasedOnTargetType_", "Stop"); fullLine = fullLine.Replace("_getTargetType_", String.Empty); } else fullLine = fullLine.Replace("_startOrStopBasedOnTargetType_", "Start"); } int event_phase_mask = smartScriptLink != null ? smartScriptLink.event_phase_mask : smartScript.event_phase_mask; if ((SmartPhaseMasks)event_phase_mask != SmartPhaseMasks.SMART_EVENT_PHASE_ALWAYS) { List<int> listOfSplitPhases = new List<int>(); int event_phase_mask2 = event_phase_mask; int log2 = 0; while (event_phase_mask2 >= 2) { event_phase_mask2 /= 2; log2++; } for (int l2 = log2; l2 >= 0; l2--) { int power = (int)Math.Pow(2, l2); if (event_phase_mask >= power) { event_phase_mask -= power; listOfSplitPhases.Add(power); } } int[] arrayOfSplitPhases = listOfSplitPhases.ToArray(); Array.Reverse(arrayOfSplitPhases); //! Reverse them so they are ascending fullLine += " (Phase"; if (listOfSplitPhases.Count > 1) fullLine += "s"; fullLine += " " + String.Join(" & ", arrayOfSplitPhases) + ")"; } SmartEventFlags event_flags = (SmartEventFlags)(smartScriptLink != null ? smartScriptLink.event_flags : smartScript.event_flags); if (event_flags != SmartEventFlags.EVENT_FLAG_NONE) { if (((event_flags & SmartEventFlags.EVENT_FLAG_NOT_REPEATABLE) != 0)) fullLine += " (No Repeat)"; if (((event_flags & SmartEventFlags.EVENT_FLAG_NORMAL_DUNGEON) != 0) && ((event_flags & SmartEventFlags.EVENT_FLAG_HEROIC_DUNGEON) != 0) && ((event_flags & SmartEventFlags.EVENT_FLAG_NORMAL_RAID) != 0) && ((event_flags & SmartEventFlags.EVENT_FLAG_HEROIC_RAID) != 0)) fullLine += " (Dungeon & Raid)"; else { if (((event_flags & SmartEventFlags.EVENT_FLAG_NORMAL_DUNGEON) != 0) && ((event_flags & SmartEventFlags.EVENT_FLAG_HEROIC_DUNGEON) != 0)) fullLine += " (Dungeon)"; else { if (((event_flags & SmartEventFlags.EVENT_FLAG_NORMAL_DUNGEON) != 0)) fullLine += " (Normal Dungeon)"; else if (((event_flags & SmartEventFlags.EVENT_FLAG_HEROIC_DUNGEON) != 0)) fullLine += " (Heroic Dungeon)"; } if (((event_flags & SmartEventFlags.EVENT_FLAG_NORMAL_RAID) != 0) && ((event_flags & SmartEventFlags.EVENT_FLAG_HEROIC_RAID) != 0)) fullLine += " (Raid)"; else { if (((event_flags & SmartEventFlags.EVENT_FLAG_NORMAL_RAID) != 0)) fullLine += " (Normal Raid)"; else if (((event_flags & SmartEventFlags.EVENT_FLAG_HEROIC_RAID) != 0)) fullLine += " (Heroic Raid)"; } } if (((event_flags & SmartEventFlags.EVENT_FLAG_DEBUG_ONLY) != 0)) fullLine += " (Debug)"; } return fullLine; } catch (Exception ex) { MessageBox.Show(ex.Message, "Something went wrong!", MessageBoxButtons.OK, MessageBoxIcon.Error); } return fullLine; }