2022-07-09 22:09:37 +00:00

223 lines
5.8 KiB
Lua

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)