using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using JXHelper.Config; using JXHelper.Core; namespace JXHelper.UI; /// /// Hộp thoại Chiêu thức hỗ trợ & Phái đặc thù (Mô phỏng 100% chuẩn giao diện và cơ chế AutoVLBS). /// Quản lý 4 phân hệ: /// 1. Chiêu trấn phái + hỗ trợ (#1, #2, #3) /// 2. Chiêu thức luân chuyển (#4, #5 - Bùa chú Ngũ Độc / Debuff theo thời gian) /// 3. Gán chiêu thức mặc định khi bắt đầu (Trái / Phải) /// 4. Phân hệ Nga My (Từ Hàng Phổ Độ bơm cả nhóm + Hỗ trợ Lưu Thủy - Mộng Điệp) /// public partial class SupportSkillsForm : Form { private readonly BotConfig _config; private readonly string _characterName; private readonly string _sect; private readonly CharacterSkillProfile _profile; public event Action? OnConfigSaved; public SupportSkillsForm(BotConfig config, string characterName, string? sect = null) { InitializeComponent(); _config = config; _characterName = characterName; _sect = !string.IsNullOrEmpty(sect) ? sect : (!string.IsNullOrEmpty(config.DetectedSect) ? config.DetectedSect : "Cái Bang"); _profile = SkillScanner.ScanCharacterSkills(_characterName, _sect); Text = $"Chieu thuc ho tro - [{_characterName} ({_sect})]"; PopulateSkillDropdowns(); LoadConfigToUi(); btnSave.Click += (s, e) => SaveUiToConfig(); btnClose.Click += (s, e) => Close(); } private void PopulateSkillDropdowns() { // 1. Chiêu hỗ trợ (#1, #2, #3) var buffList = new List { "" }; foreach (var sk in _profile.BuffSkills) { if (!buffList.Contains(sk.Name)) buffList.Add(sk.Name); } foreach (var def in SkillDatabase.GetSkillsBySect(_sect).Where(s => s.IsBuff)) { if (!buffList.Contains(def.Name)) buffList.Add(def.Name); } cboBuff1Skill.Items.AddRange(buffList.ToArray()); cboBuff2Skill.Items.AddRange(buffList.ToArray()); cboBuff3Skill.Items.AddRange(buffList.ToArray()); // 2. Chiêu thức luân chuyển (#4, #5 - Bùa chú / Curses cho Ngũ Độc hoặc chiêu buff) var curseList = new List { "" }; foreach (var sk in _profile.CurseSkills) { if (!curseList.Contains(sk.Name)) curseList.Add(sk.Name); } foreach (var def in SkillDatabase.GetCurseSkillsBySect(_sect)) { if (!curseList.Contains(def.Name)) curseList.Add(def.Name); } // Nếu không phải Ngũ Độc, cho phép chọn bất kỳ chiêu nào trong môn phái foreach (var def in SkillDatabase.GetSkillsBySect(_sect)) { if (!curseList.Contains(def.Name)) curseList.Add(def.Name); } cboCurse1Skill.Items.AddRange(curseList.ToArray()); cboCurse2Skill.Items.AddRange(curseList.ToArray()); // 3. Chiêu mặc định Trái & Phải var attackList = new List { "" }; foreach (var sk in _profile.AttackSkills) { if (!attackList.Contains(sk.Name)) attackList.Add(sk.Name); } foreach (var def in SkillDatabase.GetSkillsBySect(_sect).Where(s => !s.IsPassive)) { if (!attackList.Contains(def.Name)) attackList.Add(def.Name); } cboLeftSkill.Items.AddRange(attackList.ToArray()); cboRightSkill.Items.AddRange(curseList.Union(buffList).Union(attackList).Distinct().ToArray()); } private void LoadConfigToUi() { // Nhóm 1: Trấn phái + hỗ trợ chkBuff1.Checked = _config.Buff1Enabled; SelectComboItem(cboBuff1Skill, _config.Buff1SkillName); numBuff1Ms.Value = Math.Clamp(_config.Buff1IntervalSeconds * 1000, numBuff1Ms.Minimum, numBuff1Ms.Maximum); chkBuff2.Checked = _config.Buff2Enabled; SelectComboItem(cboBuff2Skill, _config.Buff2SkillName); numBuff2Ms.Value = Math.Clamp(_config.Buff2IntervalSeconds * 1000, numBuff2Ms.Minimum, numBuff2Ms.Maximum); chkBuff3.Checked = _config.Buff3Enabled; SelectComboItem(cboBuff3Skill, _config.Buff3SkillName); numBuff3Ms.Value = Math.Clamp(_config.Buff3IntervalSeconds * 1000, numBuff3Ms.Minimum, numBuff3Ms.Maximum); // Nhóm 2: Chiêu thức luân chuyển radCurseTime.Checked = _config.CurseTriggerMode == 0; radCurseHp.Checked = _config.CurseTriggerMode == 1; radCurseMp.Checked = _config.CurseTriggerMode == 2; chkCurse1.Checked = _config.Curse1Enabled; SelectComboItem(cboCurse1Skill, _config.Curse1SkillName); numCurse1Ms.Value = Math.Clamp(_config.Curse1IntervalMs, numCurse1Ms.Minimum, numCurse1Ms.Maximum); chkCurse2.Checked = _config.Curse2Enabled; SelectComboItem(cboCurse2Skill, _config.Curse2SkillName); numCurse2Ms.Value = Math.Clamp(_config.Curse2IntervalMs, numCurse2Ms.Minimum, numCurse2Ms.Maximum); // Nhóm 3: Gán chiêu mặc định chkAssignLeft.Checked = _config.AssignLeftSkillEnabled; SelectComboItem(cboLeftSkill, _config.DefaultLeftSkillName); chkAssignRight.Checked = _config.AssignRightSkillEnabled; SelectComboItem(cboRightSkill, _config.DefaultRightSkillName); // Nhóm 4: Nga My chkNgaMySupport.Checked = _config.NgaMySupportComboEnabled; cboNgaMyCombo.SelectedIndex = Math.Clamp(_config.NgaMySupportComboMode, 0, 2); chkNgaMyHeal.Checked = _config.NgaMyHealEnabled; numNgaMyHp.Value = Math.Clamp(_config.NgaMyHealHpPercent, numNgaMyHp.Minimum, numNgaMyHp.Maximum); numNgaMyDelay.Value = Math.Clamp(_config.NgaMyHealDelayMs, numNgaMyDelay.Minimum, numNgaMyDelay.Maximum); chkNgaMyParty.Checked = _config.NgaMyHealParty; // Nhóm 5: Ngũ Độc (Chuẩn Auto Kim Yến) chkNguDocCurseChain.Checked = _config.NguDocCurseChainEnabled; chkNguDocBossOnly.Checked = _config.NguDocBossOnly; chkNguDocUHon.Checked = _config.NguDocCurseUHon; chkNguDocVanCo.Checked = _config.NguDocCurseVanCo; chkNguDocThiDoc.Checked = _config.NguDocCurseThiDoc; chkNguDocHoaCot.Checked = _config.NguDocCurseHoaCot; numNguDocDelay.Value = Math.Clamp(_config.NguDocCurseDelayMs, numNguDocDelay.Minimum, numNguDocDelay.Maximum); numNguDocDuration.Value = Math.Clamp(_config.NguDocCurseDurationSec, numNguDocDuration.Minimum, numNguDocDuration.Maximum); // Tự động kích hoạt tab tương ứng với môn phái của nhân vật if (_sect.Equals("Nga My", StringComparison.OrdinalIgnoreCase)) { tabSkills.SelectedTab = tabNgaMy; grpNgaMy.ForeColor = System.Drawing.Color.MidnightBlue; } else if (_sect.Equals("Ngũ Độc", StringComparison.OrdinalIgnoreCase)) { tabSkills.SelectedTab = tabNguDoc; grpNguDoc.ForeColor = System.Drawing.Color.DarkGreen; } else { tabSkills.SelectedTab = tabBuff; } } private void SelectComboItem(ComboBox cbo, string? value) { if (!string.IsNullOrEmpty(value) && cbo.Items.Contains(value)) { cbo.SelectedItem = value; } else if (cbo.Items.Count > 0) { cbo.SelectedIndex = 0; } } public void SaveUiToConfig(bool silent = false) { // 1. Trấn phái + hỗ trợ _config.Buff1Enabled = chkBuff1.Checked; _config.Buff1SkillName = cboBuff1Skill.SelectedItem?.ToString() ?? ""; _config.Buff1IntervalSeconds = Math.Max(5, (int)(numBuff1Ms.Value / 1000)); _config.Buff2Enabled = chkBuff2.Checked; _config.Buff2SkillName = cboBuff2Skill.SelectedItem?.ToString() ?? ""; _config.Buff2IntervalSeconds = Math.Max(5, (int)(numBuff2Ms.Value / 1000)); _config.Buff3Enabled = chkBuff3.Checked; _config.Buff3SkillName = cboBuff3Skill.SelectedItem?.ToString() ?? ""; _config.Buff3IntervalSeconds = Math.Max(5, (int)(numBuff3Ms.Value / 1000)); // 2. Chiêu thức luân chuyển (Curse Rotation) _config.CurseTriggerMode = radCurseTime.Checked ? 0 : (radCurseHp.Checked ? 1 : 2); _config.Curse1Enabled = chkCurse1.Checked; _config.Curse1SkillName = cboCurse1Skill.SelectedItem?.ToString() ?? ""; _config.Curse1IntervalMs = (int)numCurse1Ms.Value; _config.Curse2Enabled = chkCurse2.Checked; _config.Curse2SkillName = cboCurse2Skill.SelectedItem?.ToString() ?? ""; _config.Curse2IntervalMs = (int)numCurse2Ms.Value; _config.CurseRotationEnabled = _config.Curse1Enabled || _config.Curse2Enabled; // 3. Gán chiêu mặc định _config.AssignLeftSkillEnabled = chkAssignLeft.Checked; _config.DefaultLeftSkillName = cboLeftSkill.SelectedItem?.ToString() ?? ""; _config.AssignRightSkillEnabled = chkAssignRight.Checked; _config.DefaultRightSkillName = cboRightSkill.SelectedItem?.ToString() ?? ""; // 4. Nga My _config.NgaMySupportComboEnabled = chkNgaMySupport.Checked; _config.NgaMySupportComboMode = cboNgaMyCombo.SelectedIndex >= 0 ? cboNgaMyCombo.SelectedIndex : 0; _config.NgaMyHealEnabled = chkNgaMyHeal.Checked; _config.NgaMyHealHpPercent = (int)numNgaMyHp.Value; _config.NgaMyHealDelayMs = (int)numNgaMyDelay.Value; _config.NgaMyHealParty = chkNgaMyParty.Checked; // 5. Ngũ Độc (Chuẩn Auto Kim Yến) _config.NguDocCurseChainEnabled = chkNguDocCurseChain.Checked; _config.NguDocBossOnly = chkNguDocBossOnly.Checked; _config.NguDocCurseUHon = chkNguDocUHon.Checked; _config.NguDocCurseVanCo = chkNguDocVanCo.Checked; _config.NguDocCurseThiDoc = chkNguDocThiDoc.Checked; _config.NguDocCurseHoaCot = chkNguDocHoaCot.Checked; _config.NguDocCurseDelayMs = (int)numNguDocDelay.Value; _config.NguDocCurseDurationSec = (int)numNguDocDuration.Value; if (_config.NguDocCurseChainEnabled) { _config.CurseRotationEnabled = true; } // Lưu cấu hình độc lập cho nhân vật _config.SaveForCharacter(_characterName); OnConfigSaved?.Invoke(_config); if (!silent) { MessageBox.Show(this, $"Đã lưu cấu hình chiêu thức hỗ trợ thành công cho nhân vật '{_characterName}'!", "JXHelper - Thành công", MessageBoxButtons.OK, MessageBoxIcon.Information); } DialogResult = DialogResult.OK; Close(); } }