MuteBards = {} MuteBards.name = "MuteBards2" MuteBards.Version = "2.03" local currentSubZone; local defaults = { zones = { "Ebonheart", "Nimalten", "Kragenmoor", "Davon's Watch", "Stormhold", "Riften", "Velyn Harbor", "Solitude", "Rimmen", "Belkarth", "Lilmoth", "Bright-Throat Village", "Mournhold Guild Plaza", "Mournhold Residential District" }, currentZone = '' }; -- Todo how can I get the current subZone name? I could not figure that out. If I can do that, I can add a button to mute current subZone. --define Callback local function OnAddOnLoaded(eventCode, addOnName) --Check if that is your addons on Load, if not quit if (addOnName ~= MuteBards.name) then return; end --Unregister Loaded Callback EVENT_MANAGER:UnregisterForEvent(MuteBards.name, EVENT_ADD_ON_LOADED); --create the default table --create the saved variable access object here and assign it to savedVars MuteBards.savedVars = ZO_SavedVars:NewAccountWide("MuteBards_Settings", "1.0.0", "Zones", defaults, GetWorldName()); MuteBards:InitSettingsPanel(MuteBards.savedVars.zones); MuteBards:Refresh(); end --Register Loaded Callback EVENT_MANAGER:RegisterForEvent(MuteBards.name, EVENT_ADD_ON_LOADED, OnAddOnLoaded); function MuteBards_CombatState(event_id, inCombat) if inCombat then MuteBards_EnableEffects() end end function MuteBards_MuteEffects() SetSetting(SETTING_TYPE_AUDIO, AUDIO_SETTING_SFX_VOLUME, 0) end function MuteBards_EnableEffects() SetSetting(SETTING_TYPE_AUDIO, AUDIO_SETTING_SFX_VOLUME, 70) end function MuteBards:AddZone(zoneName, cb) if (MuteBards:ContainsZone(zoneName)) then d('Zone ' .. zoneName .. ' already in list'); return; end d('Adding zone ' .. zoneName); table.insert(MuteBards.savedVars.zones, zoneName); if (cb ~= nil) then cb(); end end function MuteBards:RemoveZone(zoneName, cb) if (MuteBards:ContainsZone(zoneName)) then for i, v in ipairs(MuteBards.savedVars.zones) do if (v == zoneName) then table.remove(MuteBards.savedVars.zones, i); d('Zone ' .. zoneName .. ' removed from list'); if (cb ~= nil) then cb(); end return; end end end d('Zone ' .. zoneName .. ' not found in list'); end function MuteBards:ContainsZone(zoneName) if (MuteBards.savedVars == nil or MuteBards.savedVars.zones == nil) then return false; end for i, v in ipairs(MuteBards.savedVars.zones) do if (v == zoneName) then return true; end end return false; end function MuteBards_AreaChange(eventCode, zoneName, subZoneName, newSubzone) if (MuteBards.savedVars ~= nil) then MuteBards.savedVars.currentSubZone = subZoneName; else currentSubZone = subZoneName end MuteBards_EnableEffects(); if (MuteBards:ContainsZone(subZoneName)) then MuteBards_MuteEffects(); end end -- Handle cases where you're interacting with an object? EVENT_MANAGER:RegisterForEvent("MuteBardsCombatState", EVENT_PLAYER_COMBAT_STATE, MuteBards_CombatState) EVENT_MANAGER:RegisterForEvent("MuteBardsAreaChange", EVENT_ZONE_CHANGED, MuteBards_AreaChange) function MuteBards:Refresh() MuteBards_AreaChange(nil, nil, MuteBards.savedVars.currentSubZone or currentSubZone); end