local panelName = "alarms" local ui = setupUI([[ Panel height: 19 BotSwitch id: title anchors.top: parent.top anchors.left: parent.left text-align: center width: 130 !text: tr('Alarms') Button id: alerts anchors.top: prev.top anchors.left: prev.right anchors.right: parent.right margin-left: 3 height: 17 text: Edit ]]) ui:setId(panelName) if not storage[panelName] then storage[panelName] = {} end local config = storage[panelName] ui.title:setOn(config.enabled) ui.title.onClick = function(widget) config.enabled = not config.enabled widget:setOn(config.enabled) end local window = UI.createWindow("AlarmsWindow") window:hide() ui.alerts.onClick = function() window:show() window:raise() window:focus() end local widgets = { "AlarmCheckBox", "AlarmCheckBoxAndSpinBox", "AlarmCheckBoxAndTextEdit" } local parents = { window.list, window.settingsList } -- type addAlarm = function(id, title, defaultValue, alarmType, parent, tooltip) local widget = UI.createWidget(widgets[alarmType], parents[parent]) widget:setId(id) if type(config[id]) ~= 'table' then config[id] = {} end widget.tick:setText(title) widget.tick:setChecked(config[id].enabled) widget.tick:setTooltip(tooltip) widget.tick.onClick = function() config[id].enabled = not config[id].enabled widget.tick:setChecked(config[id].enabled) end if alarmType > 1 and type(config[id].value) == 'nil' then config[id].value = defaultValue end if alarmType == 2 then widget.value:setValue(config[id].value) widget.value.onValueChange = function(widget, value) config[id].value = value end elseif alarmType == 3 then widget.text:setText(config[id].value) widget.text.onTextChange = function(widget, newText) config[id].value = newText end end end -- settings addAlarm("ignoreFriends", "Ignore Friends", true, 1, 2) addAlarm("flashClient", "Flash Client", true, 1, 2) -- alarm list addAlarm("damageTaken", "Damage Taken", false, 1, 1) addAlarm("lowHealth", "Low Health", 20, 2, 1) addAlarm("lowMana", "Low Mana", 20, 2, 1) addAlarm("playerAttack", "Player Attack", false, 1, 1) UI.Separator(window.list) addAlarm("privateMsg", "Private Message", false, 1, 1) addAlarm("defaultMsg", "Default Message", false, 1, 1) addAlarm("customMessage", "Custom Message:", "", 3, 1, "You can add text, that if found in any incoming message will trigger alert.\n You can add many, just separate them by comma.") UI.Separator(window.list) addAlarm("creatureDetected", "Creature Detected", false, 1, 1) addAlarm("playerDetected", "Player Detected", false, 1, 1) addAlarm("creatureName", "Creature Name:", "", 3, 1, "You can add a name or part of it, that if found in any visible creature name will trigger alert.\nYou can add many, just separate them by comma.") local lastCall = now local function alarm(file, windowText) if now - lastCall < 2000 then return end -- 2s delay lastCall = now if not g_resources.fileExists(file) then file = "/sounds/alarm.ogg" lastCall = now + 4000 -- alarm.ogg length is 6s end if modules.game_bot.g_app.getOs() == "windows" and config.flashClient.enabled then g_window.flash() end g_window.setTitle(player:getName() .. " - " .. windowText) playSound(file) end -- damage taken & custom message onTextMessage(function(mode, text) if not config.enabled then return end if mode == 22 and config.damageTaken.enabled then return alarm('/sounds/magnum.ogg', "Damage Received!") end if config.customMessage.enabled then local alertText = config.customMessage.value if alertText:len() > 0 then text = text:lower() local parts = string.split(alertText, ",") for i=1,#parts do local part = parts[i] part = part:trim() part = part:lower() if text:find(part) then return alarm('/sounds/magnum.ogg', "Special Message!") end end end end end) -- default & private message onTalk(function(name, level, mode, text, channelId, pos) if not config.enabled then return end if name == player:getName() then return end -- ignore self messages if config.ignoreFriends.enabled and isFriend(name) then return end -- ignore friends if enabled if mode == 1 and config.defaultMsg.enabled then return alarm("/sounds/magnum.ogg", "Default Message!") end if mode == 4 and config.privateMsg.enabled then return alarm("/sounds/Private_Message.ogg", "Private Message!") end end) -- health & mana macro(100, function() if not config.enabled then return end if config.lowHealth.enabled then if hppercent() < config.lowHealth.value then return alarm("/sounds/Low_Health.ogg", "Low Health!") end end if config.lowMana.enabled then if hppercent() < config.lowMana.value then return alarm("/sounds/Low_Mana.ogg", "Low Mana!") end end for i, spec in ipairs(getSpectators()) do if not spec:isLocalPlayer() and not (config.ignoreFriends.enabled and isFriend(spec)) then if config.creatureDetected.enabled then return alarm("/sounds/magnum.ogg", "Creature Detected!") end if spec:isPlayer() then if spec:isTimedSquareVisible() and config.playerAttack.enabled then return alarm("/sounds/Player_Attack.ogg", "Player Attack!") end if config.playerDetected.enabled then return alarm("/sounds/Player_Detected.ogg", "Player Detected!") end end if config.creatureName.enabled then local name = spec:getName():lower() local fragments = string.split(config.creatureName.value, ",") for i=1,#fragments do local frag = fragments[i]:trim():lower() if name:lower():find(frag) then return alarm("/sounds/alarm.ogg", "Special Creature Detected!") end end end end end end)