From 953d057c4924bad99a5a3bb634f1f63286bb79d8 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Wed, 25 Feb 2026 19:14:06 +0100 Subject: [PATCH 01/10] Preserve skill selection on character reimport --- src/Classes/ImportTab.lua | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index 609beec5db..d7fc757ae8 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -729,6 +729,43 @@ function ImportTabClass:ImportPassiveTreeAndJewels(json, charData) main:SetWindowTitleSubtext(string.format("%s (%s, %s, %s)", self.build.buildName, charData.name, charData.class, charData.league)) end +local SOCKET_GROUP_REIMPORT_KEY_SEPARATOR = "\31" + +local function getSocketGroupReimportKey(socketGroup) + -- Use a rarely-used separator to avoid accidental collisions when concatenating fields. + local gemNameParts = { } + for _, gem in ipairs(socketGroup.gemList) do + t_insert(gemNameParts, (gem.nameSpec or ""):lower()) + end + return table.concat({ + socketGroup.slot or "", + socketGroup.source or "", + tostring(#socketGroup.gemList), + table.concat(gemNameParts, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR), + }, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR) +end + +local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) + return { + enabled = socketGroup.enabled, + includeInFullDPS = socketGroup.includeInFullDPS, + groupCount = socketGroup.groupCount, + label = socketGroup.label, + mainActiveSkill = socketGroup.mainActiveSkill, + mainActiveSkillCalcs = socketGroup.mainActiveSkillCalcs, + isMainGroup = isMainGroup, + } +end + +local function applySocketGroupReimportState(socketGroup, state) + socketGroup.enabled = state.enabled + socketGroup.includeInFullDPS = state.includeInFullDPS + socketGroup.groupCount = state.groupCount + socketGroup.label = state.label + socketGroup.mainActiveSkill = state.mainActiveSkill + socketGroup.mainActiveSkillCalcs = state.mainActiveSkillCalcs +end + function ImportTabClass:ImportItemsAndSkills(json) --local out = io.open("get-items.json", "w") --out:write(json) @@ -748,8 +785,10 @@ function ImportTabClass:ImportItemsAndSkills(json) local mainSkillEmpty = #self.build.skillsTab.socketGroupList == 0 local skillOrder + local preservedSocketGroupStateByKey if self.controls.charImportItemsClearSkills.state then skillOrder = { } + preservedSocketGroupStateByKey = { } for _, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do for _, gem in ipairs(socketGroup.gemList) do if gem.grantedEffect and not gem.grantedEffect.support then @@ -757,6 +796,11 @@ function ImportTabClass:ImportItemsAndSkills(json) end end end + for index, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do + local key = getSocketGroupReimportKey(socketGroup) + preservedSocketGroupStateByKey[key] = preservedSocketGroupStateByKey[key] or { } + t_insert(preservedSocketGroupStateByKey[key], snapshotSocketGroupReimportState(socketGroup, index == self.build.mainSocketGroup)) + end wipeTable(self.build.skillsTab.socketGroupList) end self.charImportStatus = colorCodes.POSITIVE.."Items and skills successfully imported." @@ -801,6 +845,22 @@ function ImportTabClass:ImportItemsAndSkills(json) end end) end + if preservedSocketGroupStateByKey then + local restoredMainSocketGroup + for index, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do + local stateList = preservedSocketGroupStateByKey[getSocketGroupReimportKey(socketGroup)] + if stateList and stateList[1] then + local state = t_remove(stateList, 1) + applySocketGroupReimportState(socketGroup, state) + if state.isMainGroup then + restoredMainSocketGroup = index + end + end + end + if restoredMainSocketGroup then + self.build.mainSocketGroup = restoredMainSocketGroup + end + end if mainSkillEmpty then self.build.mainSocketGroup = self:GuessMainSocketGroup() end From bb59e6fde27bbdb61efadb532d6553d40fcb802a Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Wed, 8 Apr 2026 18:07:28 +0200 Subject: [PATCH 02/10] Preserve disabled gems on reimport --- src/Classes/ImportTab.lua | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index d7fc757ae8..97a727299a 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -746,6 +746,10 @@ local function getSocketGroupReimportKey(socketGroup) end local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) + local gemEnabledStates = { } + for gemIndex, gem in ipairs(socketGroup.gemList) do + gemEnabledStates[gemIndex] = gem.enabled + end return { enabled = socketGroup.enabled, includeInFullDPS = socketGroup.includeInFullDPS, @@ -753,6 +757,7 @@ local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) label = socketGroup.label, mainActiveSkill = socketGroup.mainActiveSkill, mainActiveSkillCalcs = socketGroup.mainActiveSkillCalcs, + gemEnabledStates = gemEnabledStates, isMainGroup = isMainGroup, } end @@ -764,6 +769,13 @@ local function applySocketGroupReimportState(socketGroup, state) socketGroup.label = state.label socketGroup.mainActiveSkill = state.mainActiveSkill socketGroup.mainActiveSkillCalcs = state.mainActiveSkillCalcs + if state.gemEnabledStates then + for gemIndex, enabled in ipairs(state.gemEnabledStates) do + if socketGroup.gemList[gemIndex] then + socketGroup.gemList[gemIndex].enabled = enabled + end + end + end end function ImportTabClass:ImportItemsAndSkills(json) @@ -1291,4 +1303,4 @@ function ImportTabClass:SetPredefinedBuildName() local charData = charSelect.list[charSelect.selIndex].char local charName = charData.name main.predefinedBuildName = accountName.." - "..charName -end \ No newline at end of file +end From df0d27420f1bf2a2c52479023164889098fa80b8 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Tue, 14 Apr 2026 11:04:40 +0200 Subject: [PATCH 03/10] test: preserve full DPS state on reimport --- spec/System/TestImportReimport_spec.lua | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 spec/System/TestImportReimport_spec.lua diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua new file mode 100644 index 0000000000..67442f9f6e --- /dev/null +++ b/spec/System/TestImportReimport_spec.lua @@ -0,0 +1,83 @@ +describe("TestImportReimport", function() + before_each(function() + newBuild() + end) + + it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 Default 1 +Heavy Strike 1/0 Default 1 +Added Fire Damage 1/0 Default DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills([=[ +{ + "character": { + "level": 12 + }, + "items": [ + { + "id": "helm-1", + "frameType": 0, + "name": "", + "typeLine": "Iron Hat", + "inventoryId": "Helm", + "ilvl": 10, + "properties": [], + "sockets": [ + { "group": 0, "sColour": "R" }, + { "group": 0, "sColour": "R" }, + { "group": 0, "sColour": "R" } + ], + "socketedItems": [ + { + "socket": 0, + "support": false, + "typeLine": "Cleave", + "properties": [ + { "name": "Level", "values": [["1", 0]] }, + { "name": "Quality", "values": [["+0%", 0]] } + ] + }, + { + "socket": 1, + "support": false, + "typeLine": "Heavy Strike", + "properties": [ + { "name": "Level", "values": [["1", 0]] }, + { "name": "Quality", "values": [["+0%", 0]] } + ] + }, + { + "socket": 2, + "support": true, + "typeLine": "Added Fire Damage Support", + "properties": [ + { "name": "Level", "values": [["2", 0]] }, + { "name": "Quality", "values": [["+0%", 0]] } + ] + } + ] + } + ] +} +]=]) + runCallback("OnFrame") + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) +end) From 0dda872cd71219a9cc8d450c1bce5fa36017e6d0 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Tue, 14 Apr 2026 11:09:39 +0200 Subject: [PATCH 04/10] fix: preserve skill substate on reimport --- spec/System/TestImportReimport_spec.lua | 73 +++++++++++++++++++++++++ src/Classes/ImportTab.lua | 30 ++++++++-- 2 files changed, 97 insertions(+), 6 deletions(-) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index 67442f9f6e..399d32887a 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -3,6 +3,67 @@ describe("TestImportReimport", function() newBuild() end) + local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(string.format([=[ +{ + "character": { + "level": 12 + }, + "items": [ + { + "id": "item-1", + "frameType": 0, + "name": "", + "typeLine": "%s", + "inventoryId": "%s", + "ilvl": 10, + "properties": [], + "sockets": [ + { "group": 0, "sColour": "R" } + ], + "socketedItems": [ + { + "socket": 0, + "support": false, + "typeLine": "%s", + "properties": [ + { "name": "Level", "values": [["20", 0]] }, + { "name": "Quality", "values": [["+0%%", 0]] } + ] + } + ] + } + ] +} +]=], itemTypeLine, inventoryId, gemName)) + runCallback("OnFrame") + end + + local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) + build.skillsTab:PasteSocketGroup(string.format([[ +Slot: %s +%s 20/0 Default 1 +]], slotName, gemName)) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + local srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + srcInstance[fieldName] = fieldValue + srcInstance[fieldName.."Calcs"] = fieldValue + build.modFlag = true + build.buildFlag = true + runCallback("OnFrame") + + reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + + socketGroup = build.skillsTab.socketGroupList[1] + srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + assert.are.equal(fieldValue, srcInstance[fieldName]) + assert.are.equal(fieldValue, srcInstance[fieldName.."Calcs"]) + end + it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() build.skillsTab:PasteSocketGroup([[ Slot: Helmet @@ -80,4 +141,16 @@ Added Fire Damage 1/0 Default DISABLED 1 assert.are.equal(2, socketGroup.gemList[3].level) assert.is_false(socketGroup.gemList[3].enabled) end) + + it("preserves skill part selection when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) + end) + + it("preserves stage count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Weapon 1", "Driftwood Wand", "Weapon", "Scorching Ray", "skillStageCount", 8) + end) + + it("preserves mine count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Pyroclast Mine", "skillMineCount", 12) + end) end) diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index 97a727299a..49204bfa0d 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -746,9 +746,17 @@ local function getSocketGroupReimportKey(socketGroup) end local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) - local gemEnabledStates = { } + local gemStates = { } for gemIndex, gem in ipairs(socketGroup.gemList) do - gemEnabledStates[gemIndex] = gem.enabled + gemStates[gemIndex] = { + enabled = gem.enabled, + skillPart = gem.skillPart, + skillPartCalcs = gem.skillPartCalcs, + skillStageCount = gem.skillStageCount, + skillStageCountCalcs = gem.skillStageCountCalcs, + skillMineCount = gem.skillMineCount, + skillMineCountCalcs = gem.skillMineCountCalcs, + } end return { enabled = socketGroup.enabled, @@ -757,11 +765,21 @@ local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) label = socketGroup.label, mainActiveSkill = socketGroup.mainActiveSkill, mainActiveSkillCalcs = socketGroup.mainActiveSkillCalcs, - gemEnabledStates = gemEnabledStates, + gemStates = gemStates, isMainGroup = isMainGroup, } end +local function applyGemReimportState(gem, state) + gem.enabled = state.enabled + gem.skillPart = state.skillPart + gem.skillPartCalcs = state.skillPartCalcs + gem.skillStageCount = state.skillStageCount + gem.skillStageCountCalcs = state.skillStageCountCalcs + gem.skillMineCount = state.skillMineCount + gem.skillMineCountCalcs = state.skillMineCountCalcs +end + local function applySocketGroupReimportState(socketGroup, state) socketGroup.enabled = state.enabled socketGroup.includeInFullDPS = state.includeInFullDPS @@ -769,10 +787,10 @@ local function applySocketGroupReimportState(socketGroup, state) socketGroup.label = state.label socketGroup.mainActiveSkill = state.mainActiveSkill socketGroup.mainActiveSkillCalcs = state.mainActiveSkillCalcs - if state.gemEnabledStates then - for gemIndex, enabled in ipairs(state.gemEnabledStates) do + if state.gemStates then + for gemIndex, gemState in ipairs(state.gemStates) do if socketGroup.gemList[gemIndex] then - socketGroup.gemList[gemIndex].enabled = enabled + applyGemReimportState(socketGroup.gemList[gemIndex], gemState) end end end From d7ea06a03d9f17aabf71862bcd05148d28a4a661 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Tue, 14 Apr 2026 12:15:10 +0200 Subject: [PATCH 05/10] test: clarify import reimport fixture --- spec/System/TestImportReimport_spec.lua | 142 ++++++++++-------------- 1 file changed, 58 insertions(+), 84 deletions(-) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index 399d32887a..3d34ada5f1 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -1,43 +1,64 @@ describe("TestImportReimport", function() + local dkjson = require "dkjson" + local DEFAULT_CHARACTER_LEVEL = 12 + local DEFAULT_ITEM_LEVEL = 10 + local TEST_IMPORT_ITEM_ID = "test-import-item-1" + local DEFAULT_SOCKET_COLOR = "R" + before_each(function() newBuild() end) + local function makeGemProperties(level) + return { + { name = "Level", values = { { tostring(level), 0 } } }, + { name = "Quality", values = { { "+0%", 0 } } }, + } + end + + local function makeSocketedGemEntry(socket, support, typeLine, level) + return { + socket = socket, + support = support, + typeLine = typeLine, + properties = makeGemProperties(level), + } + end + + -- Build a minimal import payload so the tests stay focused on state, not fixture noise. + local function buildImportPayload(itemTypeLine, inventoryId, socketedItems) + local maxSocketIndex = 0 + for _, socketedItem in ipairs(socketedItems) do + maxSocketIndex = math.max(maxSocketIndex, socketedItem.socket + 1) + end + local sockets = {} + for index = 1, maxSocketIndex do + sockets[index] = { group = 0, sColour = DEFAULT_SOCKET_COLOR } + end + return dkjson.encode({ + character = { level = DEFAULT_CHARACTER_LEVEL }, + items = { + { + id = TEST_IMPORT_ITEM_ID, + frameType = 0, + name = "", + typeLine = itemTypeLine, + inventoryId = inventoryId, + ilvl = DEFAULT_ITEM_LEVEL, + properties = {}, + sockets = sockets, + socketedItems = socketedItems, + } + }, + }) + end + local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) build.importTab.controls.charImportItemsClearSkills.state = true build.importTab.controls.charImportItemsClearItems.state = false - build.importTab:ImportItemsAndSkills(string.format([=[ -{ - "character": { - "level": 12 - }, - "items": [ - { - "id": "item-1", - "frameType": 0, - "name": "", - "typeLine": "%s", - "inventoryId": "%s", - "ilvl": 10, - "properties": [], - "sockets": [ - { "group": 0, "sColour": "R" } - ], - "socketedItems": [ - { - "socket": 0, - "support": false, - "typeLine": "%s", - "properties": [ - { "name": "Level", "values": [["20", 0]] }, - { "name": "Quality", "values": [["+0%%", 0]] } - ] - } - ] - } - ] -} -]=], itemTypeLine, inventoryId, gemName)) + build.importTab:ImportItemsAndSkills(buildImportPayload(itemTypeLine, inventoryId, { + makeSocketedGemEntry(0, false, gemName, 20), + })) runCallback("OnFrame") end @@ -80,58 +101,11 @@ Added Fire Damage 1/0 Default DISABLED 1 build.importTab.controls.charImportItemsClearSkills.state = true build.importTab.controls.charImportItemsClearItems.state = false - build.importTab:ImportItemsAndSkills([=[ -{ - "character": { - "level": 12 - }, - "items": [ - { - "id": "helm-1", - "frameType": 0, - "name": "", - "typeLine": "Iron Hat", - "inventoryId": "Helm", - "ilvl": 10, - "properties": [], - "sockets": [ - { "group": 0, "sColour": "R" }, - { "group": 0, "sColour": "R" }, - { "group": 0, "sColour": "R" } - ], - "socketedItems": [ - { - "socket": 0, - "support": false, - "typeLine": "Cleave", - "properties": [ - { "name": "Level", "values": [["1", 0]] }, - { "name": "Quality", "values": [["+0%", 0]] } - ] - }, - { - "socket": 1, - "support": false, - "typeLine": "Heavy Strike", - "properties": [ - { "name": "Level", "values": [["1", 0]] }, - { "name": "Quality", "values": [["+0%", 0]] } - ] - }, - { - "socket": 2, - "support": true, - "typeLine": "Added Fire Damage Support", - "properties": [ - { "name": "Level", "values": [["2", 0]] }, - { "name": "Quality", "values": [["+0%", 0]] } - ] - } - ] - } - ] -} -]=]) + build.importTab:ImportItemsAndSkills(buildImportPayload("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + })) runCallback("OnFrame") socketGroup = build.skillsTab.socketGroupList[1] From d1ca46e27787e83a62a32b553ecbb78479af10e4 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Tue, 14 Apr 2026 12:38:28 +0200 Subject: [PATCH 06/10] test: cover clear-items reimport --- spec/System/TestImportReimport_spec.lua | 46 ++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index 3d34ada5f1..cd2e2aacad 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -53,15 +53,23 @@ describe("TestImportReimport", function() }) end - local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + local function reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, socketedItems, clearItems) build.importTab.controls.charImportItemsClearSkills.state = true - build.importTab.controls.charImportItemsClearItems.state = false - build.importTab:ImportItemsAndSkills(buildImportPayload(itemTypeLine, inventoryId, { - makeSocketedGemEntry(0, false, gemName, 20), - })) + build.importTab.controls.charImportItemsClearItems.state = clearItems + build.importTab:ImportItemsAndSkills(buildImportPayload(itemTypeLine, inventoryId, socketedItems)) runCallback("OnFrame") end + local function reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, clearItems) + reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, { + makeSocketedGemEntry(0, false, gemName, 20), + }, clearItems) + end + + local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, false) + end + local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) build.skillsTab:PasteSocketGroup(string.format([[ Slot: %s @@ -116,6 +124,34 @@ Added Fire Damage 1/0 Default DISABLED 1 assert.is_false(socketGroup.gemList[3].enabled) end) + it("preserves full DPS state and disabled gems when reimporting with deleted equipment", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 Default 1 +Heavy Strike 1/0 Default 1 +Added Fire Damage 1/0 Default DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + reimportSocketedItemsWithOptions("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, true) + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) + it("preserves skill part selection when reimporting items and skills", function() assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) end) From 5c4b39a4d595a1b5d4908ca3fbfab08363e64582 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Tue, 14 Apr 2026 12:58:41 +0200 Subject: [PATCH 07/10] test: expand import reimport coverage --- spec/System/TestImportReimport_spec.lua | 96 +++++++++++++++++++------ 1 file changed, 76 insertions(+), 20 deletions(-) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index cd2e2aacad..ffbcd12c61 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -25,8 +25,8 @@ describe("TestImportReimport", function() } end - -- Build a minimal import payload so the tests stay focused on state, not fixture noise. - local function buildImportPayload(itemTypeLine, inventoryId, socketedItems) + -- Build a minimal import item so the tests stay focused on state, not fixture noise. + local function makeImportItem(itemTypeLine, inventoryId, socketedItems, itemId) local maxSocketIndex = 0 for _, socketedItem in ipairs(socketedItems) do maxSocketIndex = math.max(maxSocketIndex, socketedItem.socket + 1) @@ -35,28 +35,33 @@ describe("TestImportReimport", function() for index = 1, maxSocketIndex do sockets[index] = { group = 0, sColour = DEFAULT_SOCKET_COLOR } end + return { + id = itemId or TEST_IMPORT_ITEM_ID, + frameType = 0, + name = "", + typeLine = itemTypeLine, + inventoryId = inventoryId, + ilvl = DEFAULT_ITEM_LEVEL, + properties = {}, + sockets = sockets, + socketedItems = socketedItems, + } + end + + -- Build a minimal import payload so the tests stay focused on state, not fixture noise. + local function buildImportPayload(items) return dkjson.encode({ character = { level = DEFAULT_CHARACTER_LEVEL }, - items = { - { - id = TEST_IMPORT_ITEM_ID, - frameType = 0, - name = "", - typeLine = itemTypeLine, - inventoryId = inventoryId, - ilvl = DEFAULT_ITEM_LEVEL, - properties = {}, - sockets = sockets, - socketedItems = socketedItems, - } - }, + items = items, }) end local function reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, socketedItems, clearItems) build.importTab.controls.charImportItemsClearSkills.state = true build.importTab.controls.charImportItemsClearItems.state = clearItems - build.importTab:ImportItemsAndSkills(buildImportPayload(itemTypeLine, inventoryId, socketedItems)) + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem(itemTypeLine, inventoryId, socketedItems), + })) runCallback("OnFrame") end @@ -109,10 +114,12 @@ Added Fire Damage 1/0 Default DISABLED 1 build.importTab.controls.charImportItemsClearSkills.state = true build.importTab.controls.charImportItemsClearItems.state = false - build.importTab:ImportItemsAndSkills(buildImportPayload("Iron Hat", "Helm", { - makeSocketedGemEntry(0, false, "Cleave", 1), - makeSocketedGemEntry(1, false, "Heavy Strike", 1), - makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }), })) runCallback("OnFrame") @@ -152,6 +159,55 @@ Added Fire Damage 1/0 Default DISABLED 1 assert.is_false(socketGroup.gemList[3].enabled) end) + it("preserves two socket groups when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 Default 1 +Heavy Strike 1/0 Default 1 +Added Fire Damage 1/0 Default DISABLED 1 +]]) + runCallback("OnFrame") + + build.skillsTab:PasteSocketGroup([[ +Slot: Gloves +Blight 20/0 Default 1 +]]) + runCallback("OnFrame") + + local helmetGroup = build.skillsTab.socketGroupList[1] + helmetGroup.includeInFullDPS = true + helmetGroup.mainActiveSkill = 2 + local glovesGroup = build.skillsTab.socketGroupList[2] + glovesGroup.enabled = false + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, "test-import-item-helmet"), + makeImportItem("Rawhide Gloves", "Gloves", { + makeSocketedGemEntry(0, false, "Blight", 20), + }, "test-import-item-gloves"), + })) + runCallback("OnFrame") + + local groupsBySlot = {} + for _, socketGroup in ipairs(build.skillsTab.socketGroupList) do + groupsBySlot[socketGroup.slot] = socketGroup + end + + assert.are.equal(2, #build.skillsTab.socketGroupList) + assert.is_not_nil(groupsBySlot.Helmet) + assert.is_not_nil(groupsBySlot.Gloves) + assert.is_true(groupsBySlot.Helmet.includeInFullDPS) + assert.are.equal(2, groupsBySlot.Helmet.mainActiveSkill) + assert.is_false(groupsBySlot.Gloves.enabled) + end) + it("preserves skill part selection when reimporting items and skills", function() assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) end) From e7bcbcbcbaf4f466c0b6cf962aab9926c5a014df Mon Sep 17 00:00:00 2001 From: Wires77 Date: Tue, 14 Apr 2026 23:10:47 -0500 Subject: [PATCH 08/10] Adding a few more fields to save off --- src/Classes/ImportTab.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index 95808abbb0..fc02019fd5 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -756,6 +756,10 @@ local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) skillStageCountCalcs = gem.skillStageCountCalcs, skillMineCount = gem.skillMineCount, skillMineCountCalcs = gem.skillMineCountCalcs, + skillMinionSkill = gem.skillMinionSkill, + skillMinionSkillCalcs = gem.skillMinionSkillCalcs, + enableGlobal1 = gem.enableGlobal1, + enableGlobal2 = gem.enableGlobal2, } end return { @@ -778,6 +782,10 @@ local function applyGemReimportState(gem, state) gem.skillStageCountCalcs = state.skillStageCountCalcs gem.skillMineCount = state.skillMineCount gem.skillMineCountCalcs = state.skillMineCountCalcs + gem.skillMinionSkill = state.skillMinionSkill + gem.skillMinionSkillCalcs = state.skillMinionSkillCalcs + gem.enableGlobal1 = state.enableGlobal1 + gem.enableGlobal2 = state.enableGlobal2 end local function applySocketGroupReimportState(socketGroup, state) From 02a8ed3fc3fb2df93ca139aa06e9a4716ea194c3 Mon Sep 17 00:00:00 2001 From: Wires77 Date: Tue, 14 Apr 2026 23:55:59 -0500 Subject: [PATCH 09/10] Fix skill copy/paste and test failures --- spec/System/TestAilments_spec.lua | 4 +- spec/System/TestDefence_spec.lua | 20 ++-- spec/System/TestImpale_spec.lua | 2 +- spec/System/TestImportReimport_spec.lua | 22 ++-- spec/System/TestItemMods_spec.lua | 22 ++-- spec/System/TestSkills_spec.lua | 14 +-- spec/System/TestTriggers_spec.lua | 128 ++++++++++++------------ src/Classes/SkillsTab.lua | 4 +- 8 files changed, 108 insertions(+), 108 deletions(-) diff --git a/spec/System/TestAilments_spec.lua b/spec/System/TestAilments_spec.lua index 33fc61adaa..0940ac095b 100644 --- a/spec/System/TestAilments_spec.lua +++ b/spec/System/TestAilments_spec.lua @@ -9,7 +9,7 @@ describe("TestAilments", function() it("maximum shock value", function() -- Shock Nova - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 1\n") runCallback("OnFrame") assert.are.equals(round(50 + 10), build.calcsTab.mainOutput.MaximumShock) @@ -23,7 +23,7 @@ describe("TestAilments", function() it("bleed is buffed by bleed chance", function() build.itemsTab:CreateDisplayItemFromRaw("New Item\nKarui Chopper") build.itemsTab:AddDisplayItem() - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 1\n") build.configTab.input.customMods = "\z attacks have 10% chance to cause bleeding\n\z " diff --git a/spec/System/TestDefence_spec.lua b/spec/System/TestDefence_spec.lua index 8a0d4daa3f..4cbca313db 100644 --- a/spec/System/TestDefence_spec.lua +++ b/spec/System/TestDefence_spec.lua @@ -132,8 +132,8 @@ describe("TestDefence", function() build.configTab.input.enemyIsBoss = "None" -- Petrified blood build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z - Arrogance 21/0 Default 1\n\z + Petrified Blood 20/0 1\n\z + Arrogance 21/0 1\n\z ") -- 50% petrified effect, when exactly half of the life is reserved, should make the life pool be equivalent to no petrified effect and full life. build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -155,8 +155,8 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z - Arrogance 21/0 Default 1\n\z + Petrified Blood 20/0 1\n\z + Arrogance 21/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -180,7 +180,7 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") -- 80% petrified effect, starting from full life, should make the life pool be equivalent to 0.5 * life (unprotected upper half) and then 5 * 0.5 * life (protected lower half), making it 3* bigger in total build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -238,8 +238,8 @@ describe("TestDefence", function() -- Progenesis + petrified blood build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z - Arrogance 21/0 Default 1\n\z + Petrified Blood 20/0 1\n\z + Arrogance 21/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -263,7 +263,7 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -286,7 +286,7 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -315,7 +315,7 @@ describe("TestDefence", function() assert.are.equals(20, poolsRemaining.LifeBelowHalfLossLostOverTime) build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z diff --git a/spec/System/TestImpale_spec.lua b/spec/System/TestImpale_spec.lua index 95c4a4f33d..84b2db0018 100644 --- a/spec/System/TestImpale_spec.lua +++ b/spec/System/TestImpale_spec.lua @@ -286,7 +286,7 @@ describe("TestAttacks", function() it("impale dual wield simultaneous attack", function() newBuild() - build.skillsTab:PasteSocketGroup("Cleave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cleave 20/0 1\n") -- exactly 100 build.itemsTab:CreateDisplayItemFromRaw("New Item\nVaal Blade\nQuality: 0\nAdds 54 to 14 physical damage\n50% chance to Impale Enemies on Hit with Attacks") build.itemsTab:AddDisplayItem() diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index ffbcd12c61..f6f23a9007 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -78,7 +78,7 @@ describe("TestImportReimport", function() local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) build.skillsTab:PasteSocketGroup(string.format([[ Slot: %s -%s 20/0 Default 1 +%s 20/0 1 ]], slotName, gemName)) runCallback("OnFrame") @@ -101,9 +101,9 @@ Slot: %s it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() build.skillsTab:PasteSocketGroup([[ Slot: Helmet -Cleave 1/0 Default 1 -Heavy Strike 1/0 Default 1 -Added Fire Damage 1/0 Default DISABLED 1 +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 ]]) runCallback("OnFrame") @@ -134,9 +134,9 @@ Added Fire Damage 1/0 Default DISABLED 1 it("preserves full DPS state and disabled gems when reimporting with deleted equipment", function() build.skillsTab:PasteSocketGroup([[ Slot: Helmet -Cleave 1/0 Default 1 -Heavy Strike 1/0 Default 1 -Added Fire Damage 1/0 Default DISABLED 1 +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 ]]) runCallback("OnFrame") @@ -162,15 +162,15 @@ Added Fire Damage 1/0 Default DISABLED 1 it("preserves two socket groups when reimporting items and skills", function() build.skillsTab:PasteSocketGroup([[ Slot: Helmet -Cleave 1/0 Default 1 -Heavy Strike 1/0 Default 1 -Added Fire Damage 1/0 Default DISABLED 1 +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 ]]) runCallback("OnFrame") build.skillsTab:PasteSocketGroup([[ Slot: Gloves -Blight 20/0 Default 1 +Blight 20/0 1 ]]) runCallback("OnFrame") diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index b7a24e7b49..3c185d98ac 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -8,7 +8,7 @@ describe("TetsItemMods", function() end) it("Dialla's socket mods", function() - build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 Default 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 1\nArc 20/0 1\n") runCallback("OnFrame") build.itemsTab:CreateDisplayItemFromRaw([[Dialla's Malefaction @@ -61,7 +61,7 @@ describe("TetsItemMods", function() local lightningResBefore = build.calcsTab.mainOutput.LightningResist - build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 1\n") runCallback("OnFrame") assert.are_not.equals(lightningResBefore, build.calcsTab.mainOutput.LightningResist) @@ -96,7 +96,7 @@ describe("TetsItemMods", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") runCallback("OnFrame") assert.is_true(build.calcsTab.mainEnv.keystonesAdded["Vaal Pact"]) @@ -124,7 +124,7 @@ describe("TetsItemMods", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nNightblade 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\nNightblade 20/0 1\n") runCallback("OnFrame") local nonElusiveCritMult = build.calcsTab.mainOutput.CritMultiplier @@ -160,7 +160,7 @@ describe("TetsItemMods", function() build.configTab:BuildModList() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cyclone 20/0 Default 1\nClose Combat 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cyclone 20/0 1\nClose Combat 20/0 1\n") runCallback("OnFrame") local farDPS = build.calcsTab.mainOutput.TotalDPS @@ -200,7 +200,7 @@ describe("TetsItemMods", function() it("Kalandra's Touch influence copy", function() - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") runCallback("OnFrame") local dmg = build.calcsTab.mainOutput.AverageDamage @@ -527,7 +527,7 @@ describe("TetsItemMods", function() {range:1}(15-20)% increased Cold Damage per 1% Missing Cold Resistance, up to a maximum of 300% {range:1}(15-20)% increased Fire Damage per 1% Missing Fire Resistance, up to a maximum of 300%]]) build.itemsTab:AddDisplayItem() - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 1\n") runCallback("OnFrame") assert.are_not.equals(340, build.calcsTab.mainEnv.modDB:Sum("INC", "FireDamage")) @@ -547,7 +547,7 @@ describe("TetsItemMods", function() Armour: 32 ]]) build.itemsTab:AddDisplayItem() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1") + build.skillsTab:PasteSocketGroup("Arc 20/0 1") assert.are_not.equals(40, build.calcsTab.mainEnv.modDB:Sum("INC", { flags = ModFlag.Cast }, "Speed")) assert.are_not.equals(64, build.calcsTab.mainOutput.Armour) @@ -555,7 +555,7 @@ describe("TetsItemMods", function() end) it("Heralds apply exposure with Heraldry", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nHerald of Thunder 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nHerald of Thunder 20/0 1\n") runCallback("OnFrame") assert.are.equals(0.5, build.calcsTab.calcsOutput.LightningEffMult) @@ -572,7 +572,7 @@ describe("TetsItemMods", function() end) it("Enemy self curse effect", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nConductivity 14/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nConductivity 14/0 1\n") runCallback("OnFrame") assert.are.equals(0.8, build.calcsTab.calcsOutput.LightningEffMult) @@ -587,7 +587,7 @@ describe("TetsItemMods", function() end) it("Max charges with conditional mod", function() -- see #9442 - build.skillsTab:PasteSocketGroup("Grace 20/20 Default 1\n") + build.skillsTab:PasteSocketGroup("Grace 20/20 1\n") runCallback("OnFrame") local baseFrenzyChargesMax = build.calcsTab.calcsOutput.FrenzyChargesMax diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index 0e67ddc80d..9c846685df 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -13,11 +13,11 @@ describe("TestAttacks", function() runCallback("OnFrame") assert.are.equals(205, build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 1\n") runCallback("OnFrame") assert.are.equals(round(205 * 1.43), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 1\n") runCallback("OnFrame") -- No Envy level increase, so base should still be 205 assert.are.equals(round(205 * 1.44), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) @@ -43,10 +43,10 @@ describe("TestAttacks", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 Default 1\nRain of Arrows 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 1\nRain of Arrows 20/0 1\nManaforged Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) @@ -71,14 +71,14 @@ describe("TestAttacks", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Power Siphon 20/0 Default 1\nSacred Wisps 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Power Siphon 20/0 1\nSacred Wisps 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) end) it("Test Scorching ray applying exposure at max stages", function() - build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -101,7 +101,7 @@ describe("TestAttacks", function() end) it("Test Adrenaline affecting blight max stage count", function() - build.skillsTab:PasteSocketGroup("Blight 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Blight 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] diff --git a/spec/System/TestTriggers_spec.lua b/spec/System/TestTriggers_spec.lua index 3006513dad..3f21d2e94d 100644 --- a/spec/System/TestTriggers_spec.lua +++ b/spec/System/TestTriggers_spec.lua @@ -28,7 +28,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -56,7 +56,7 @@ describe("TestTriggers", function() build.mainSocketGroup = 2 build.modFlag = true build.buildFlag = true - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -84,7 +84,7 @@ describe("TestTriggers", function() build.mainSocketGroup = 2 build.modFlag = true build.buildFlag = true - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -197,7 +197,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -248,7 +248,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -294,7 +294,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -322,7 +322,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -348,7 +348,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -371,7 +371,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -398,7 +398,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -421,7 +421,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -449,7 +449,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -485,7 +485,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -507,7 +507,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -535,7 +535,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -557,7 +557,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -579,7 +579,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -600,10 +600,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -643,10 +643,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -687,10 +687,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -740,10 +740,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -766,10 +766,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Despair 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -820,10 +820,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -872,10 +872,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Ice Nova 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Ice Nova 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -909,10 +909,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -940,10 +940,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -971,7 +971,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -999,7 +999,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") runCallback("OnFrame") build.configTab.input["conditionKilledRecently"] = true @@ -1010,24 +1010,24 @@ describe("TestTriggers", function() end) it("Trigger Holy Relic", function() - build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.Minion.SkillTriggerRate ~= nil) end) it("Trigger Cast when Damage Taken", function() - build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 Default 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 1\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Cast when Stunned", function() - build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 Default 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 1\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1055,27 +1055,27 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nSpellslinger 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nSpellslinger 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Mark On Hit", function() - build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 Default 1\nAlchemist's Mark 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 1\nAlchemist's Mark 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Hextouch", function() - build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\nHextouch 20/0 Default 1\nSmite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Despair 20/0 1\nHextouch 20/0 1\nSmite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1103,7 +1103,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1132,7 +1132,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1161,7 +1161,7 @@ describe("TestTriggers", function() end) it("Trigger Combust", function() - build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1170,14 +1170,14 @@ describe("TestTriggers", function() build.buildFlag = true runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Prismatic Burst", function() - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nPrismatic Burst 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\nPrismatic Burst 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1211,7 +1211,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nShockwave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\nShockwave 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1243,24 +1243,24 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\nManaforged Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Doom Blast", function() - build.skillsTab:PasteSocketGroup("Impending Doom 20/0 Default 1\nDespair 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Impending Doom 20/0 1\nDespair 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Cast while Channelling", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1285,14 +1285,14 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Flamewood", function() - build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 Default 1\nFlamewood 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 1\nFlamewood 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1305,7 +1305,7 @@ describe("TestTriggers", function() end) it("Trigger Automation", function() - build.skillsTab:PasteSocketGroup("Steelskin 20/0 Default 1\nAutomation 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Steelskin 20/0 1\nAutomation 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1334,7 +1334,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1351,17 +1351,17 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Triggerbots CWCHandler", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") runCallback("OnFrame") local baseRate = build.calcsTab.mainOutput.SkillTriggerRate assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1396,7 +1396,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") runCallback("OnFrame") local baseRate = build.calcsTab.mainOutput.SkillTriggerRate diff --git a/src/Classes/SkillsTab.lua b/src/Classes/SkillsTab.lua index ea65069bc5..1a1dcbbd61 100644 --- a/src/Classes/SkillsTab.lua +++ b/src/Classes/SkillsTab.lua @@ -591,7 +591,7 @@ function SkillsTabClass:CopySocketGroup(socketGroup) skillText = skillText .. "Slot: " .. socketGroup.slot .. "\r\n" end for _, gemInstance in ipairs(socketGroup.gemList) do - skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "ENABLED" or "DISABLED", gemInstance.count or 1) + skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "" or "DISABLED", gemInstance.count or 1) end Copy(skillText) end @@ -608,7 +608,7 @@ function SkillsTabClass:PasteSocketGroup(testInput) if slot then newGroup.slot = slot end - for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) (%a+%d?) ?(%a*) (%d+)") do + for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) ?(%a*) (%d+)") do t_insert(newGroup.gemList, { nameSpec = nameSpec, level = tonumber(level) or 20, From c9e543a5c19553c6848164386a1574fe0568b19b Mon Sep 17 00:00:00 2001 From: Wires77 Date: Tue, 14 Apr 2026 23:59:10 -0500 Subject: [PATCH 10/10] Add minion test case --- spec/System/TestImportReimport_spec.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index f6f23a9007..24663900d5 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -219,4 +219,8 @@ Blight 20/0 1 it("preserves mine count when reimporting items and skills", function() assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Pyroclast Mine", "skillMineCount", 12) end) + + it("preserves minion skill when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Summon Chaos Golem", "skillMinionSkill", 3) + end) end)