Gnome Runner addon
unknown
lua
2 years ago
10 kB
10
Indexable
-- Create a local table for your addon namespace
local GnomeRunner = {}
-- Add your variables to the table
GnomeRunner.frame = CreateFrame("Frame", "GnomeRunnerFrame")
GnomeRunner.flareSpellIDs = {
30263, -- Red Smoke Flare
30262, -- White Smoke Flare
32812, -- Purple Smoke Flare
30264 -- Green Smoke Flare
}
GnomeRunner.prizePot = 0
GnomeRunner.payoutSet = false
GnomeRunner.raceInProgress = false
GnomeRunner.raceStartTime = 0
GnomeRunner.elapsedTime = 0
GnomeRunner.raceName = "Race Event"
GnomeRunner.timerUpdateInterval = 30 -- Update every 30 seconds
GnomeRunner.countdownInProgress = false
GnomeRunner.countdownSeconds = 10
GnomeRunner.totalDeaths = 0
GnomeRunner.totalRacers = 0
GnomeRunner.totalGoldDistributed = 0
GnomeRunner.playerGUID = UnitGUID("player")
local function UpdateTimer()
if GnomeRunner.raceInProgress then
local currentTime = GetServerTime()
GnomeRunner.elapsedTime = math.max(currentTime - GnomeRunner.raceStartTime, 60) -- Ensure at least 1 minute is displayed
local minutesElapsed = math.floor(GnomeRunner.elapsedTime / 60)
local secondsElapsed = GnomeRunner.elapsedTime % 60
-- Check if the elapsed time is a multiple of 30 minutes
if secondsElapsed == 0 and minutesElapsed > 0 and minutesElapsed % 30 == 0 then
SendChatMessage("Elapsed Time: " .. minutesElapsed .. " minutes", "RAID")
end
end
end
local function EndRace()
if GnomeRunner.raceInProgress then
SendChatMessage("Thank you for coming to \"" .. GnomeRunner.raceName .. "\". This is the race's final stats:", "RAID")
SendChatMessage("Deaths: " .. GnomeRunner.totalDeaths, "RAID")
SendChatMessage("Total Elapsed Time: " .. math.floor(GnomeRunner.elapsedTime / 60) .. " minutes", "RAID")
SendChatMessage("Total Racers: " .. GnomeRunner.totalRacers, "RAID")
SendChatMessage("Total Gold Distributed: " .. GnomeRunner.prizePot .. " gold", "RAID")
GnomeRunner.raceInProgress = false
GnomeRunner.raceStartTime = 0
GnomeRunner.elapsedTime = 0
GnomeRunner.totalDeaths = 0
GnomeRunner.totalRacers = 0
GnomeRunner.totalGoldDistributed = 0
else
print("No race in progress.")
end
end
local function CheckPlayer()
local playerName = UnitName("player")
local inRaid = IsInRaid()
local _, instanceType, _, _, _, _, _, instanceMapID = GetInstanceInfo()
if inRaid and instanceType == "raid" then
GnomeRunner.totalRacers = 0 -- Reset totalRacers
GnomeRunner.totalDeaths = 0 -- Reset totalDeaths
for i = 1, GetNumGroupMembers() do
local unit = "raid" .. i
if UnitIsDeadOrGhost(unit) and UnitName(unit) == playerName then
GnomeRunner.totalDeaths = GnomeRunner.totalDeaths + 1
SendChatMessage(playerName .. " has died!", "RAID_WARNING")
end
GnomeRunner.totalRacers = GnomeRunner.totalRacers + 1
end
end
end
function GnomeRunner.frame.OnEvent(self, event, ...)
if event == "RAID_ROSTER_UPDATE" then
CheckPlayer()
elseif event == "UNIT_SPELLCAST_SUCCEEDED" then
local unit, _, _, _, spellID = ...
if unit == "player" then
local spellName, _, _, _, _, _, _, spellID = UnitCastingInfo("player")
if spellName then
for _, flareSpellID in ipairs(GnomeRunner.flareSpellIDs) do
if flareSpellID == spellID then
local playerName = UnitName("player")
SendChatMessage(playerName .. " used a flare!", "RAID")
SendChatMessage(playerName .. " used a flare!", "RAID_WARNING")
return
end
end
end
else
local playerName = UnitName(unit)
-- Check if the event is for a friendly player
if UnitIsPlayer(unit) and UnitInRaid(unit) then
local isAssistant = false
local isLeader = false
for i = 1, GetNumGroupMembers() do
local _, _, subgroup, _, _, _, _, _, _, _, _, isAssistant, isLeader = GetRaidRosterInfo(i)
if isAssistant or isLeader then
-- Ignore assistants and raid leaders
return
end
end
local buffs = {}
for i = 1, 40 do
local _, _, _, _, _, _, _, _, _, spellId = UnitAura(unit, i, "HELPFUL")
if spellId then
local spellName = GetSpellInfo(spellId)
table.insert(buffs, spellName)
else
break
end
end
local debuffs = {}
for i = 1, 40 do
local _, _, _, _, _, _, _, _, _, spellId = UnitAura(unit, i, "HARMFUL")
if spellId then
local spellName = GetSpellInfo(spellId)
table.insert(debuffs, spellName)
else
break
end
end
if #buffs > 0 then
SendChatMessage(playerName .. " gained buffs: " .. table.concat(buffs, ", "), "RAID")
end
if #debuffs > 0 then
SendChatMessage(playerName .. " gained debuffs: " .. table.concat(debuffs, ", "), "RAID")
end
end
end
elseif event == "UNIT_AURA" then
local unit = ...
local playerName = UnitName(unit)
-- Check if the event is for a friendly player
if UnitIsPlayer(unit) and UnitInRaid(unit) then
local isAssistant = false
local isLeader = false
for i = 1, GetNumGroupMembers() do
local _, _, subgroup, _, _, _, _, _, _, _, _, isAssistant, isLeader = GetRaidRosterInfo(i)
if isAssistant or isLeader then
-- Ignore assistants and raid leaders
return
end
end
local buffs = {}
for i = 1, 40 do
local _, _, _, _, _, _, _, _, _, spellId = UnitAura(unit, i, "HELPFUL")
if spellId then
local spellName = GetSpellInfo(spellId)
table.insert(buffs, spellName)
else
break
end
end
local debuffs = {}
for i = 1, 40 do
local _, _, _, _, _, _, _, _, _, spellId = UnitAura(unit, i, "HARMFUL")
if spellId then
local spellName = GetSpellInfo(spellId)
table.insert(debuffs, spellName)
else
break
end
end
if #buffs > 0 then
SendChatMessage(playerName .. " gained buffs: " .. table.concat(buffs, ", "), "RAID")
end
if #debuffs > 0 then
SendChatMessage(playerName .. " gained debuffs: " .. table.concat(debuffs, ", "), "RAID")
end
end
end
end
GnomeRunner.frame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
GnomeRunner.frame:RegisterEvent("UNIT_AURA")
GnomeRunner.frame:RegisterEvent("RAID_ROSTER_UPDATE")
GnomeRunner.frame:SetScript("OnEvent", GnomeRunner.frame.OnEvent)
SLASH_START_RACE1 = "/race"
SlashCmdList["START_RACE"] = function(msg)
if msg == "" then
if not IsInRaid() then
print("You are not in a raid. You must be in a raid to use /race.")
return
end
if not GnomeRunner.payoutSet or GnomeRunner.raceName == "Race Event" then
print("Payout or Race Name not set. Use /payout and /racename to set the prize pot and race name.")
return
end
if not GnomeRunner.raceInProgress then
print("Starting the race!")
GnomeRunner.raceInProgress = true
GnomeRunner.raceStartTime = GetServerTime()
GnomeRunner.countdownInProgress = true
C_Timer.NewTicker(1, function()
if GnomeRunner.countdownInProgress then
GnomeRunner.countdownSeconds = GnomeRunner.countdownSeconds - 1
if GnomeRunner.countdownSeconds > 0 then
SendChatMessage("Race starting in " .. GnomeRunner.countdownSeconds .. " seconds!", "RAID_WARNING")
else
SendChatMessage("GO GO GO! The race has started for \"" .. GnomeRunner.raceName .. "\"!", "RAID_WARNING")
GnomeRunner.countdownInProgress = false
GnomeRunner.countdownSeconds = 10
end
end
end)
-- Add the following line to update the timer every 30 seconds
C_Timer.NewTicker(GnomeRunner.timerUpdateInterval, UpdateTimer)
else
print("Race is already in progress.")
end
else
print("Invalid command. Usage: /race")
end
end
SLASH_SET_PAYOUT1 = "/payout"
SlashCmdList["SET_PAYOUT"] = function(msg)
local amount = tonumber(string.match(msg:lower(), "%d+"))
if amount and amount > 0 then
GnomeRunner.prizePot = amount
GnomeRunner.payoutSet = true
print("Prize pot set to " .. amount .. " gold. You can now use /race.")
SendChatMessage("The prize pot for the race has been set to " .. amount .. " gold!", "RAID_WARNING")
else
print("Invalid command. Usage: /payout gold amount")
end
end
SLASH_SET_RACENAME1 = "/racename"
SlashCmdList["SET_RACENAME"] = function(msg)
if msg ~= "" then
GnomeRunner.raceName = msg
SendChatMessage("Welcome to " .. GnomeRunner.raceName .. "! The race will start shortly.", "RAID_WARNING")
print("Race name set to: " .. GnomeRunner.raceName)
else
print("Invalid command. Usage: /racename <message>")
end
end
SLASH_END_RACE1 = "/endrace"
SlashCmdList["END_RACE"] = function()
EndRace()
end
Editor is loading...
Leave a Comment