local ADDON_NAME = "BloodyScreen"
local TLW
local rand = math.random
local splatterKeys = {}
local textures = {
"BloodyScreen/Textures/splatter13.dds",
"BloodyScreen/Textures/splatter14.dds",
"BloodyScreen/Textures/splatter15.dds",
"BloodyScreen/Textures/splatter16.dds",
"BloodyScreen/Textures/splatter26.dds",
"BloodyScreen/Textures/splatter27.dds",
"BloodyScreen/Textures/splatter28.dds",
"BloodyScreen/Textures/splatter30.dds",
"BloodyScreen/Textures/splatter31.dds",
"BloodyScreen/Textures/splatter33.dds",
"BloodyScreen/Textures/splatter34.dds",
"BloodyScreen/Textures/splatter35.dds",
"BloodyScreen/Textures/splatter36.dds",
"BloodyScreen/Textures/splatter37.dds",
"BloodyScreen/Textures/splatter38.dds",
"BloodyScreen/Textures/splatter39.dds",
"BloodyScreen/Textures/splatter40.dds",
}
local function FactoryFunction(pool)
return WINDOW_MANAGER:CreateControl(nil, TLW, CT_TEXTURE)
end
local function ResetFunction(object)
object:SetHidden(true)
end
local SplatterPool = ZO_ObjectPool:New(FactoryFunction, ResetFunction)
local function SetSplatter(splatter)
local texture = textures[rand(#textures)]
local size = rand(256, 512)
local alpha = rand(35, 75) / 100
local x = rand(GuiRoot:GetWidth() - size)
local y = rand(GuiRoot:GetHeight() - size)
splatter:SetTexture(texture)
splatter:SetDimensions(size, size)
splatter:SetAnchor(TOPLEFT, TLW, TOPLEFT, x, y)
splatter:SetAlpha(alpha)
splatter:SetHidden(false)
end
local function HideSplatters()
SplatterPool:ReleaseAllObjects()
end
local function DisplaySplatters(healthPercent)
local numSplatters = 0
if healthPercent < 0.75 then
numSplatters = zo_roundToNearest(75 - (healthPercent * 100), 5) / 5
end
local activeSplatters = SplatterPool:GetActiveObjectCount()
if numSplatters == 0 then
HideSplatters()
elseif numSplatters > activeSplatters then
for i = 1, numSplatters - activeSplatters do
local splatter, key = SplatterPool:AcquireObject()
table.insert(splatterKeys, key)
SetSplatter(splatter)
end
elseif numSplatters < activeSplatters then
for i = 1, activeSplatters - numSplatters do
local keyIndex = rand(#splatterKeys)
SplatterPool:ReleaseObject(splatterKeys[keyIndex])
table.remove(splatterKeys, keyIndex)
end
end
end
local function UpdateSplatters()
local powerValue, powerMax = GetUnitPower("player", POWERTYPE_HEALTH)
local healthPercent = 0
if powerValue and powerMax > 0 then
healthPercent = powerValue / powerMax
end
DisplaySplatters(healthPercent)
end
local function OnPowerUpdate(eventCode, unitTag, powerIndex, powerType, powerValue, powerMax)
if powerType == POWERTYPE_HEALTH and unitTag == "player" then
if IsUnitDead("player") then HideSplatters(); return end
local healthPercent = 0
if powerValue and powerMax > 0 then
healthPercent = powerValue / powerMax
end
DisplaySplatters(healthPercent)
end
end
local function OnLoaded(eventCode, addonName)
if addonName == ADDON_NAME then
EVENT_MANAGER:UnregisterForEvent(ADDON_NAME, EVENT_ADD_ON_LOADED)
TLW = WINDOW_MANAGER:CreateTopLevelWindow()
TLW:SetAnchorFill(GuiRoot)
TLW:SetDrawLayer(DL_OVERLAY)
TLW:SetMouseEnabled(false)
EVENT_MANAGER:RegisterForEvent(ADDON_NAME, EVENT_PLAYER_DEAD, HideSplatters)
EVENT_MANAGER:RegisterForEvent(ADDON_NAME, EVENT_PLAYER_ALIVE, UpdateSplatters)
EVENT_MANAGER:RegisterForEvent(ADDON_NAME, EVENT_POWER_UPDATE, OnPowerUpdate)
end
end
EVENT_MANAGER:RegisterForEvent(ADDON_NAME, EVENT_ADD_ON_LOADED, OnLoaded)