Upload files to "/"

This commit is contained in:
2026-09-18 09:12:31 +00:00
parent f018f64409
commit 1a62e0f7ab
4 changed files with 1528 additions and 2 deletions
+1366
View File
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
## Interface: 11200
## Title: OSRS Hit Splashes
## Notes: Old School RuneScape-style combat hit splashes for OctoWoW
## Version: 1.2.6
## SavedVariables: OSHSDB
## OptionalDeps: pfUI, !!!ClassicAPI
Core.lua
Options.lua
+143
View File
@@ -0,0 +1,143 @@
local HS = OSHS
local panel = CreateFrame("Frame", "OSHSOptions", UIParent)
panel:SetWidth(500); panel:SetHeight(620)
panel:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
panel:SetFrameStrata("DIALOG")
panel:SetBackdrop({ bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 32, edgeSize = 32, insets = { left = 11, right = 12, top = 12, bottom = 11 } })
panel:Hide(); panel:SetMovable(true); panel:EnableMouse(true); panel:RegisterForDrag("LeftButton")
panel:SetScript("OnDragStart", function() this:StartMoving() end)
panel:SetScript("OnDragStop", function()
this:StopMovingOrSizing()
local point, _, _, x, y = this:GetPoint(1)
HS.db.optionsPoint, HS.db.optionsX, HS.db.optionsY = point or "CENTER", x or 0, y or 0
end)
local title = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
title:SetPoint("TOP", panel, "TOP", 0, -18); title:SetText("OSRS Hit Splashes")
local subtitle = panel:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
subtitle:SetPoint("TOP", title, "BOTTOM", 0, -7); subtitle:SetText("/oshs test previews the current style")
local close = CreateFrame("Button", nil, panel, "UIPanelCloseButton")
close:SetPoint("TOPRIGHT", panel, "TOPRIGHT", -5, -5)
local checks = {}
local function addCheck(label, key, x, y, callback)
local button = CreateFrame("CheckButton", nil, panel, "UICheckButtonTemplate")
button:SetPoint("TOPLEFT", panel, "TOPLEFT", x, y)
button.text = button:CreateFontString(nil, "OVERLAY", "GameFontNormal")
button.text:SetPoint("LEFT", button, "RIGHT", 2, 0); button.text:SetText(label)
button.key = key
button:SetScript("OnClick", function()
HS.db[key] = this:GetChecked() and true or false
if callback then callback() end
end)
table.insert(checks, button)
end
addCheck("Enable hitsplats", "enabled", 22, -62)
addCheck("Show damage", "showDamage", 178, -62)
addCheck("Show healing", "showHealing", 334, -62)
addCheck("Show misses as 0", "showMisses", 22, -94)
addCheck("Damage-school splats", "colorBySchool", 178, -94)
addCheck("Gold critical numbers", "critColor", 334, -94)
addCheck("Show damage taken", "showDamageTaken", 22, -126)
addCheck("Target-frame fallback", "useTargetFrame", 178, -126)
addCheck("Hide native damage", "hideBlizzardDamage", 350, -126, function() HS:ApplyNativeTextSetting() end)
addCheck("Show interrupt messages", "showInterrupts", 22, -154)
local sliders, sliderCount = {}, 0
local function formatValue(value, step)
if step >= 1 then return tostring(math.floor(value + .5)) end
return string.format("%.2f", value)
end
local function addSlider(label, key, minValue, maxValue, step, x, y)
sliderCount = sliderCount + 1
local slider = CreateFrame("Slider", "OSHSSlider" .. sliderCount, panel, "OptionsSliderTemplate")
slider:SetWidth(205); slider:SetPoint("TOPLEFT", panel, "TOPLEFT", x, y)
slider:SetMinMaxValues(minValue, maxValue); slider:SetValueStep(step)
getglobal(slider:GetName() .. "Low"):SetText(tostring(minValue))
getglobal(slider:GetName() .. "High"):SetText(tostring(maxValue))
slider.label = getglobal(slider:GetName() .. "Text")
slider.key, slider.baseLabel, slider.step = key, label, step
slider:SetScript("OnValueChanged", function()
local value = this:GetValue()
if step >= 1 then value = math.floor(value + .5) else value = math.floor(value * 20 + .5) / 20 end
HS.db[key] = value
this.label:SetText(label .. ": " .. formatValue(value, step))
end)
table.insert(sliders, slider)
end
addSlider("Overall scale", "scale", .65, 1.5, .05, 25, -199)
addSlider("Text size", "textSize", 12, 34, 1, 270, -199)
addSlider("Hold duration", "duration", .5, 3, .05, 25, -259)
addSlider("Vertical offset", "offsetY", -100, 50, 1, 270, -259)
addSlider("Horizontal offset", "offsetX", -100, 100, 1, 25, -319)
addSlider("Side spacing", "horizontalSpacing", 10, 50, 1, 270, -319)
addSlider("Row spacing", "verticalSpacing", 10, 50, 1, 25, -379)
local statusTitle = panel:CreateFontString(nil, "OVERLAY", "GameFontNormal")
statusTitle:SetPoint("TOPLEFT", panel, "TOPLEFT", 22, -420)
statusTitle:SetText("Scrolling status effects")
addCheck("Show buff, debuff, and fade messages", "showStatusEffects", 22, -438)
addCheck("Show status icons", "statusShowIcons", 292, -438)
addSlider("Status text size", "statusTextSize", 12, 28, 1, 25, -486)
addSlider("Status duration", "statusDuration", .5, 4, .05, 270, -486)
addSlider("Status rise", "statusRiseDistance", 0, 100, 5, 25, -546)
local preview = CreateFrame("Button", nil, panel, "UIPanelButtonTemplate")
preview:SetWidth(105); preview:SetHeight(24); preview:SetPoint("BOTTOMLEFT", panel, "BOTTOMLEFT", 22, 14); preview:SetText("Hitsplat test")
preview:SetScript("OnClick", function() HS:Preview() end)
local statusPreview = CreateFrame("Button", nil, panel, "UIPanelButtonTemplate")
statusPreview:SetWidth(105); statusPreview:SetHeight(24); statusPreview:SetPoint("LEFT", preview, "RIGHT", 10, 0); statusPreview:SetText("Status test")
statusPreview:SetScript("OnClick", function()
HS:ShowStatusEffect("+ Arcane Intellect", .45, 1, .55, "Interface\\Icons\\Spell_Holy_MagicalSentry", "preview:buff")
HS:ShowStatusEffect("- Poison", 1, .3, .45, "Interface\\Icons\\Spell_Nature_CorrosiveBreath", "preview:debuff")
HS:ShowStatusEffect("-Blessing faded", .65, .65, .65, nil, "preview:fade")
end)
local anchorButton = CreateFrame("Button", nil, panel, "UIPanelButtonTemplate")
anchorButton:SetWidth(130); anchorButton:SetHeight(24); anchorButton:SetPoint("LEFT", statusPreview, "RIGHT", 10, 0)
anchorButton:SetScript("OnClick", function() HS:SetStatusAnchorLocked(not HS.db.statusAnchorLocked) end)
local reset = CreateFrame("Button", nil, panel, "UIPanelButtonTemplate")
reset:SetWidth(85); reset:SetHeight(24); reset:SetPoint("LEFT", anchorButton, "RIGHT", 10, 0); reset:SetText("Reset")
reset:SetScript("OnClick", function() HS:ResetSettings(); HS:RefreshOptions(); HS:Preview() end)
function HS:UpdateStatusAnchorButton()
anchorButton:SetText(self.db.statusAnchorLocked and "Move anchor" or "Lock anchor")
end
function HS:RefreshOptions()
local _, check, slider
for _, check in ipairs(checks) do check:SetChecked(self.db[check.key]) end
for _, slider in ipairs(sliders) do
slider:SetValue(self.db[slider.key])
slider.label:SetText(slider.baseLabel .. ": " .. formatValue(self.db[slider.key], slider.step))
end
self:UpdateStatusAnchorButton()
end
panel:SetScript("OnShow", function()
panel:ClearAllPoints()
panel:SetPoint(HS.db.optionsPoint or "CENTER", UIParent, HS.db.optionsPoint or "CENTER", HS.db.optionsX or 0, HS.db.optionsY or 0)
HS:RefreshOptions()
end)
function HS:ToggleOptions()
if panel:IsShown() then panel:Hide() else panel:Show() end
end
function HS:ApplyPfUISkin()
if panel.pfUISkinned or not pfUI or not pfUI.api then return end
local api = pfUI.api
if not api.CreateBackdrop or not api.SkinButton then return end
panel:SetBackdrop(nil); api.CreateBackdrop(panel, nil, true, .88)
if api.CreateBackdropShadow then api.CreateBackdropShadow(panel) end
if api.SkinCloseButton then api.SkinCloseButton(close, panel.backdrop, -4, -4) end
local _, widget
if api.SkinCheckbox then for _, widget in ipairs(checks) do api.SkinCheckbox(widget) end end
api.SkinButton(preview); api.SkinButton(statusPreview); api.SkinButton(anchorButton); api.SkinButton(reset)
if api.SkinSlider then for _, widget in ipairs(sliders) do api.SkinSlider(widget) end end
panel.pfUISkinned = true
end
if pfUI then pcall(function() HS:ApplyPfUISkin() end) end
+10 -2
View File
@@ -1,3 +1,11 @@
# OldSchool-HitSplashes
# OSRS Hit Splashes
OSRS themed/styled hitsplashes
OSHS is a focused Octo WoW addon that displays Old School RuneScape-style hit splashes plus an optional scrolling buff/debuff status stream. It excludes CleanDamage's general floating-combat-text, sound, resource, combo-point, and warning modules.
It supports outgoing player damage and DoTs; pet and totem damage; incoming damage; direct and periodic healing; critical hits; avoided attacks as blue zero splats; `Immune!` results above enemy nameplates; optional yellow interrupt notifications; damage-school artwork; default and pfUI nameplates; ClassicAPI nameplate tokens; and Nampower combat events when available. Successful interrupts are detected through the exact combat-log event when available, Nampower's interrupted victim state or correlated enemy cast failure, and the Vanilla chat line as fallback. With Nampower and ClassicAPI, AoE results are routed by GUID so same-named enemies receive hits on their own nameplates. Controlled-unit ownership is resolved through the caster's owner GUID, covering ordinary pets, guardians, and totems such as Magma Totem.
Each target can hold four simultaneous splats. Existing splats remain for their configured duration while fewer than four are visible; only a fifth incoming result replaces the oldest occupied slot.
Use `/oshs` or `/hitsplats` to open settings. Use `/oshs test` for a hitsplat preview, `/oshs interrupt` or `/oshs immune` to preview those messages on your current target's visible nameplate, and `/oshs reset` to restore defaults.
The settings window controls outgoing and incoming damage visibility, interrupt messages, damage-school artwork, critical-number coloring, native Blizzard damage suppression, target-frame fallback, overall scale, text size, duration, offsets, and cluster spacing. It also controls the scrolling buff, debuff, and fade notification stream, including its icons, text size, duration, rise distance, and movable screen anchor.