local savedPrefs = nil local isEnabled = true -- starts enabled or not? local filterAssisters = true -- filter all assisters or not? local filterDomains = true -- filter by domain or not? local filterExotics = true -- filter by exotics or not? local domainCategories = { "NAVAL", "LAND", "AIR" } local engineerIds = {} local exoticBlueprintIds = {} local exoticAssistBlueprintIds = {} local logEnabled = false function Log(msg) if logEnabled then LOG(msg) end end Log("Selection Deprioriziter Initializing..") function setEngineerIds(ids) engineerIds = ids end function setExoticBlueprintIds(ids) exoticBlueprintIds = ids end function setExoticAssistBlueprintIds(ids) exoticAssistBlueprintIds = ids end function setDomainCategories(cats) domainCategories = cats end function setSavedPrefs(prefs, verbose) savedPrefs = prefs isEnabled = savedPrefs['General']['isEnabled'] filterAssisters = savedPrefs['General']['filterAssisters'] and isEnabled filterDomains = savedPrefs['General']['filterDomains'] and isEnabled filterExotics = savedPrefs['General']['filterExotics'] and isEnabled end function arrayContains(arr, val) for _, v in ipairs(arr) do if v == val then return true end end return false end function isEngineer(unit) local blueprintId = unit:GetBlueprint().BlueprintId local isEng = arrayContains(engineerIds, blueprintId) Log(blueprintId .. " = " .. tostring(isEng)) return isEng end function isExotic(unit) local blueprintId = unit:GetBlueprint().BlueprintId local isEx = arrayContains(exoticBlueprintIds, blueprintId) Log(blueprintId .. " = " .. tostring(isEx)) return isEx end function isExoticAssist(unit) local blueprintId = unit:GetBlueprint().BlueprintId local isExAs = arrayContains(exoticAssistBlueprintIds, blueprintId) Log(blueprintId .. " = " .. tostring(isExAs)) return isExAs end function isMixedExoticness(units) local exoticFound local regularFound for entityid, unit in units do local isEx = isExotic(unit) local isExAs = isExoticAssist(unit) if isEx or isExAs then exoticFound = true else regularFound = true end end return exoticFound and regularFound end function isAssisting(unit) local isEng = isEngineer(unit) if isEng then return false end local guardedUnits = unit:GetGuardedEntity() return guardedUnits ~= nil end function filterToRegulars(units) local filtered = {} local changed = false for id, unit in units do local isEx = isExotic(unit) local isExAs = isExoticAssist(unit) if isExAs then isExAs = isAssisting(unit) end if not isEx and not isExAs then table.insert(filtered, unit) else changed = true end end return filtered, changed end function getDomain(unit) for i, domain in ipairs(domainCategories) do if unit:IsInCategory(domain) then return domain end end end function getDomains(units) local domains = {} for entityid, unit in units do local domain = getDomain(unit) if domain ~= nil then domains[domain] = true end end domains.count = 0 for i, domain in ipairs(domainCategories) do if domains[domain] ~= nil then domains.count = domains.count + 1 end end domains.isMixed = domains.count > 1 return domains end function getFirstDomain(domains) for i, domain in ipairs(domainCategories) do if domains[domain] ~= nil then return domain end end return nil end function filterToDomain(units, requiredDomain) local filtered = {} local changed = false for id, unit in units do local domain = getDomain(unit) if domain == requiredDomain then table.insert(filtered, unit) else changed = true end end return filtered, changed end local dblClickStart = false local dblClickUnit = nil function isDoubleclick(selection) -- a double click is if -- the first click is just one unit -- and the second click contains the same unit local result = false if dblClickStart then dblClickStart = false for index, unit in selection do if unit == dblClickUnit then result = true end end end dblClickStart = table.getn(selection) == 1 if dblClickStart then for index, unit in selection do dblClickUnit = unit end end return result end function filterToNonAssisters(selection) local changed = false local filtered = {} -- if its a double click on an assister, select all fellow assisters if isDoubleclick(selection) and dblClickUnit:GetGuardedEntity() then for index, unit in selection do if isEngineer(unit) then table.insert(filtered,unit) else local isSame = unit:GetGuardedEntity() == dblClickUnit:GetGuardedEntity() if isSame then table.insert(filtered,unit) else changed = true end end end else if selection and table.getn(selection) > 1 then local guardedUnit = selection[1]:GetGuardedEntity() local allSame = true for index, unit in selection do if isEngineer(unit) then table.insert(filtered,unit) else if unit:GetGuardedEntity() then if unit:GetGuardedEntity() != guardedUnit then allSame = false end changed = true else allSame = false table.insert(filtered,unit) end end end if allSame then changed = false end end end if changed then return filtered, changed else return selection, false end end function Deselect(selection) if IsKeyDown('Shift') then return selection, false end local changed, domainChanged, exoticChanged, assistersChanged if filterDomains then local domains = getDomains(selection) if domains.isMixed then domain = getFirstDomain(domains) if domain ~= nil then selection, domainChanged = filterToDomain(selection, domain) end end end if filterAssisters then selection, assistersChanged = filterToNonAssisters(selection) end changed = domainChanged or exoticChanged or assistersChanged return selection, changed end function init() local KeyMapper = import('/lua/keymap/keymapper.lua') KeyMapper.SetUserKeyAction('Toggle Selection Deprioritizer', { action = "UI_Lua import('/mods/SelectionDeprioritizer/modules/SelectionDeprioritizer.lua').ToggleEnabled()", category = 'Mods', order = 1, }) end -- if shift do nothing -- selection contains mixed domains - filter to one domain -- selection contains mix of exotics and regulars - filter to regulars