LibZoneTemp (2.3.11)
# LibZoneTemp
**Version:** 2.3.11 | **API Version:** 101049 101050 | **Type:** Library
*by @Kreksar5 and Claude.ai*
> **AI-ASSISTED ADDON.** Written with Claude.ai and has not yet been
> independently validated in-game for correctness or performance. This
> notice will be removed once the library has seen real play-testing.
A library for *The Elder Scrolls Online* that calculates ambient temperatures for all overland zones and hundreds of sub-zones (delves, dungeons, trials, starter zones, and Daedric realms) based on lore-accurate climate data, the current in-game time of day (via LibClockTST), weather probability, and whether the player is swimming.
—
## Table of Contents
– (#overview)
– (#whats-new-in-2311)
– (#whats-new-in-2310)
– (#whats-new-in-239)
– (#whats-new-in-238)
– (#whats-new-in-237)
– (#whats-new-in-236)
– (#whats-new-in-235)
– (#whats-new-in-231)
– (#whats-new-in-230)
– (#whats-new-in-220)
– (#whats-new-in-210)
– (#whats-new-in-200)
– (#features)
– (#dependencies)
– (#installation)
– (#public-api)
– (#slash-command)
– (#settings-panel)
– (#zone-coverage)
– (#temperature-model)
– (#design-notes)
– (#for-addon-authors)
– (#disclaimer)
—
## Overview
LibZoneTemp provides a single, consistent source for ambient temperature data across ESO zones. It is intended to be consumed by other addons that want to display, react to, or simulate temperature-driven gameplay such as weather mods, survival systems, immersion HUDs, or RP tools.
All internal calculations are performed in **Celsius**. Fahrenheit conversion is available for display purposes via `lib.FormatTemperature()` and the user-facing settings panel.
—
## What’s New in 2.3.11
– **Fixed the settings panel’s author field**, which was still the literal
placeholder text `”YourName”` never actually updated even after the
`## Author` manifest field itself was corrected. Also bumped the internal
`LIB_VERSION` guard (previously stale at `12`) to match the manifest
`## AddOnVersion`, since the panel’s displayed version reads directly
from that constant.
—
## What’s New in 2.3.10
– **Standardized the author credit** to `@Kreksar5 and Claude.ai` in the
`## Author` manifest field and this README’s byline, and named Claude.ai
specifically (rather than generic “AI assistance”) in the manifest
description and the AI-assistance disclosure above, matching the crediting
convention used across this addon’s companion libraries.
—
## What’s New in 2.3.9
– **Fixed zone temperature overrides not applying to delves, dungeons, and
trials.** Interior zones have no climate-table entry of their own and
inherit their base temperature from their overland parent zone; the
override lookup only ever checked the *parent’s* ID, so an override set
on the interior zone itself (as offered in the settings dropdown) was
saved but silently never read back. The override lookup now checks the
player’s exact current zone first, before falling back to the climate
zone used for the base-temperature table.
– **Added a live “Currently Active Overrides” list** to the settings panel,
showing every zone with an override currently set, in both C and F.
– **Added a Celsius/Fahrenheit reference chart** to the override section’s
description, with a short note on the kind of zone each range typically
represents, to help you pick a sensible override value.
—
## What’s New in 2.3.8
– **Corrected the `## Author` manifest field**, which was still the literal
placeholder text “YourName” never actually filled in. Fixed to the real
author.
– **Added the required AI-assistance disclosure** to the manifest description
and this README, per ESOUI’s addon release rules.
– **Added a version floor (`>=1`) to the `LibClockTST` dependency**, which
previously had none.
—
## What’s New in 2.3.7
– **Full API audit against the official ESOUI API 101050 documentation.**
Every function call, method call, and constant referenced across the
library was cross-checked against the API doc and, where the doc didn’t
cover it (third-party libraries), against the live ESOUI source. No
invalid or deprecated API usage found the `LibZone`/`LibClockTST` calls
(`GetAllZoneData`, `GetCurrentZoneIds`, `GetCurrentZoneAndGroupStatus`,
`Instance`, `GetTime`, `RegisterForTime`) are all legitimate calls into
those libraries and correctly used. No code changes required.
—
## What’s New in 2.3.6
– **Corrected `LibAddonMenu-2.0` dependency floor**: was mistakenly bumped to
`>=45` in 2.3.5, but LibAddonMenu’s own manifest documentation shows `43`
as the latest available version, not `45`. Fixed to `>=43`. The 2.3.5 entry
below has also been corrected to reflect the right number.
—
## What’s New in 2.3.5
ESOUI release-rules compliance pass no zone-data changes.
– **`## APIVersion` updated** from the stale `101040` to `101049 101050` (current Live/PTS).
– **`LibAddonMenu-2.0` dependency floor bumped** from `>=30` to `>=43`, matching the version cited as current in LibAddonMenu’s own manifest documentation.
– **Fixed a version-string mismatch**: this README’s header said `2.3.0` while the manifest’s `## Version` already said `2.3.4` now synced.
– **Fixed a duplicate/mislabeled changelog section** (see below the second “What’s New in 2.3.0” entry has been relabeled `2.3.1`, since it describes a separate, later correction pass).
– **Reviewed for global variable leaks** none found; the library already follows the single-global-table pattern (`LibZoneTemp = LibZoneTemp or {}` / `local lib = LibZoneTemp`).
– **Reviewed against “what addons cannot do”** none found. This library only reads zone/time/weather state to compute a number; it doesn’t touch any restricted behavior.
—
## What’s New in 2.3.0
Version 2.3.0 is the second UESP-verified correction pass, covering the remaining **405 zones** (rows 301705). **38 corrections** were applied.
### Key Correction Themes
**Solstice (tropical island) zones** all Solstice locations introduced in Seasons of the Worm Cult were assigned incorrect cold-zone temperatures. Solstice is a tropical island south of Murkmire (~32 C); affected zones corrected include Tarnur Mine (−8 C → 30 C), Li-Xal Pass (4 C → 28 C), Vosgah Shrine (4 C → 30 C), and Vale of Revelry (20 C → 28 C).
**Nordic barrow/crypt zone mis-assignments** Shroud Hearth Barrow, Taarengrav Barrow, and Nimalten Barrow were all in **The Rift** (6 C), not the arctic; corrected from −8 C → 4 C each. Wittestadr Crypts and Trolhetta Cave are in **Eastmarch** (−2 C), not arctic.
**Clockwork City** Slag Town Outlaws Refuge reassigned from 4 C → 22 C (mechanically regulated Brass Fortress environment).
**Cyrodiil/Stormhaven/Deshaan** Underpall Cave (Cyrodiil, 14 C), Pariah Catacombs (Stormhaven, 10 C), Reservoir of Souls (Deshaan, 15 C) all corrected from −8 C.
**Fargrave/Mirrormoor** Shattered Mirror Isle (20 C → 36 C) and Loom of the Untraveled Road (15 C → 32 C) correctly placed in Ithelia’s hot Oblivion realm.
**Western Skyrim interior calibration** Proudspire Manor, Solitude Outlaws Refuge, Snowmelt Suite, and Tzinghalis’s Tower all adjusted downward to reflect WS = −10 C with appropriate interior insulation offsets.
—
## What’s New in 2.3.1
Version 2.3.1 is the third UESP-verified correction pass (rows 301400). **16 zone entries** were corrected after cross-referencing confirmed locations against UESP.
### Notable Fixes
– **Kingscrest Cavern**: NE Cyrodiil cave (was 36C → 15C; not Bangkorai)
– **Kushalit Sanctuary**: N Vvardenfell/Red Mountain slopes (note corrected to Vvardenfell)
– **Lipsand Tarn**: Colovian Highlands Ayleid ruin in NW Cyrodiil (was 4C → 14C; not a mountain tarn)
– **Lucky Cat Landing**: Senchal player house in S Elsweyr (was 22C → 28C)
– **Nighthollow Keep**: Blackreach: Arkthzand Cavern deep interior (was 8C → −4C)
– **Nikolvara’s Kennel**: Wrothgar cave SW of Orsinium (was 5C → −5C)
– **Obsidian Scar**: Rivenspire volcanic cave (was 28C → 18C; geothermally warm but still Rivenspire)
– **Odious Chapel**: Shadowfen (Stillrise Village chapel, was 12C → 28C)
– **Old Coin Fort**: N tip of Amenos tropical island (was 16C → 24C)
– **Maelstrom Arena**: Pocket realm of Fa-Nuit-Hen (was 10C → 20C; not cold Wrothgar)
—
## What’s New in 2.2.0
Version 2.2.0 is a UESP-verified correction pass. **48 zone entries** from the v2.1.0 expansion have been corrected after cross-referencing each zone’s confirmed location against UESP wiki sources.
### Corrections Summary
The primary error pattern was zones assigned to the wrong parent region entirely, producing temperatures that were wildly off most commonly cold-zone values (−8 C) applied to locations in Bangkorai, Greenshade, Summerset, Southern Elsweyr, or Amenos, and vice versa. Notable individual fixes include:
– **Coldrock Diggings**: Alik’r Desert mine (was −8 C → 36 C)
– **Forsaken Citadel**: Southern Elsweyr (was 4 C → 28 C)
– **Ghost Haven Bay**: Amenos tropical cove (was 8 C → 24 C)
– **Halls of the Highmane**: Southern Elsweyr Khajiiti ruin (was 8 C → 26 C)
– **Hildune’s Secret Refuge**: Rivenspire cave (was 32 C → 6 C)
– **Istirus Outpost / Arena**: West Weald/Cyrodiil battleground, not Reaper’s March (was 35 C → 18 C)
– **Destruction’s Solace**: Deadlands capital fortress (was 40 C → 50 C)
– All 48 corrections include matching water temperature updates.
—
## What’s New in 2.1.0
Version 2.1.0 is a UESP-verified data expansion. The zone database has grown from ~317 entries to over **1,000 named zones**, adding **705 new entries** sourced directly from the UESP wiki and covering the full breadth of ESO’s explorable areas.
### New Coverage
– **Delves, trials, arenas, and public dungeons** across all chapters and DLC
– **Instanced interiors**: manors, Outlaws Refuges, city districts, crypts, and tombs
– **Daedric and Oblivion sub-realms**: Colored Rooms, Spiral Skein, Hunting Grounds, and more
– **Aquatic zones**: Abecean Sea and other ocean/coastal surfaces
– **Player housing areas** with climate appropriate to their region
– Air temperatures derived from lore-accurate UESP climate descriptions
– Water temperatures for all new entries
All new entries include a descriptive comment drawn from UESP source notes.
—
## What’s New in 2.0.0
Version 2.0.0 is a major data expansion. The zone temperature tables now cover **all overland zones plus hundreds of named sub-zones**, including:
### New Overland / Chapter Zones
– **West Weald** (19 C) southwestern Cyrodiil woodlands and rolling hills
– **Bleakrock Isle** (−8 C) frozen starter island in the Sea of Ghosts
– **Bal Foyen** (20 C) warm coastal Morrowind delta
– **Stros M’Kai** (34 C) arid sun-baked Hammerfell island
– **Betnikh** (15 C) temperate Orc island off Glenumbra
– **Khenarthi’s Roost** (30 C) warm tropical Khajiit island
– **Blackreach: Arkthzand Cavern** (−5 C) cold underground Dwemer Blackreach beneath The Reach
### Fire / Lava Sub-Zones
These zones receive **explicit high temperatures** rather than inheriting from their parent, because they contain active lava, dragon fire, Oblivion portals, or extreme geothermal activity:
| Zone | C | Notes |
|—|—|—|
| City of Ash II | 55 | Deepest Mehrunes Dagon Oblivion plane |
| The Path of Cinders | 53 | Lava-bordered Deadlands path |
| Tormented Spire Summit | 54 | Summit of most active Stonefalls volcanic vent |
| The Deadlands: Testing Grounds | 52 | Deadlands sub-region |
| Burning Gyre Keep | 52 | Deadlands fortification |
| City of Ash I | 50 | Mehrunes Dagon Oblivion plane |
| Bloodroot Forge | 48 | Hircine’s ancient forge; lava channels in The Reach |
| The Cauldron | 44 | Deep underground Blackwood forge dungeon |
| Blessed Crucible | 44 | Rift arena over a volcanic vent |
| Ashalmawia | 42 | Vvardenfell Daedric shrine on volcanic vent |
| Sunspire | 42 | Northern Elsweyr dragon trial; desert sun + dragon fire |
| Dragonhold | 46 | Southern Elsweyr dragon lair; volcanic peak |
| Khaj Rawlith | 30 | Ancient underground Anequine temple in hot Reaper’s March; warm, stuffy, dark-fire corruption |
### Ice / Frozen Sub-Zones
These zones receive **explicit low temperatures** below their parent zone:
| Zone | C | Notes |
|—|—|—|
| Icereach | −16 | Frigid isle in the Sea of Ghosts; polar cold |
| Frostvault | −14 | Dwarven vault buried in a thawing glacier |
| Ice-Heart’s Lair | −14 | Frozen bandit cave in high Wrothgar peaks |
| Kyne’s Aegis | −12 | Offshore Norse sea fortress trial; freezing winds |
| Frostbreak Fortress | −12 | Frost-covered Orc fortress in Wrothgar |
| Frozen Coast | −12 | Western Skyrim coastal; sea ice and blizzards |
| Direfrost Keep | −10 | Ancient Nord ice fortress; permafrosted interior |
| The Frigid Grotto | −10 | Eastmarch; frost atronachs throughout |
| Stone Garden | −8 | Underground frozen lycanthrope lab under Skyrim |
| Bleakridge Barrow | −8 | Frozen Nord barrow in Western Skyrim |
| Icehammer’s Vault | −8 | Sealed ice vault in Eastmarch |
| Chillwind Depths | −8 | Underground frozen depths in Western Skyrim |
| Coldwind’s Den | −8 | High mountain den in Wrothgar; extreme cold |
| Greymoor Keep | −8 | Half-buried in Western Skyrim’s frozen earth |
| Scalecaller Peak | −6 | Icy Wrothgar mountain summit with dragon |
| Castle Thorn | −6 | Vampire stronghold in Western Skyrim |
| Labyrinthian | −6 | Ancient ruins; deeply cold |
| The Chill Hollow | −6 | Ice-filled Eastmarch hollow cave |
### Underground / Dungeon Coverage
Hundreds of delves, public dungeons, group dungeons, and trials across all zones now have explicit entries rather than falling back to the overland default. Key examples:
– **Fungal Grotto I & II** (24 C) warm, damp sea cavern in Stonefalls
– **Darkshade Caverns I & II** (2022 C) geothermal kwama mine
– **Ruins of Mazzatun** (28 C) hot, humid Hist-tree complex in Black Marsh
– **Cloudrest** (14 C) Summerset trial near the summit of Eton Nir; cold at altitude
– **Halls of Fabrication** (24 C) Vvardenfell trial; heat from fabricant manufacturing
– **All Vvardenfell egg mines and Dwemer ruins** (3034 C) geothermal Morrowind underground
– **All Clockwork City sub-zones** (2022 C) temperature-controlled mechanical realm
### Water Temperature Expansion
All newly added zones also include specific **water temperatures**, from −1 C (Frostvault glacier meltwater, Icereach polar water) to 60 C (Deadlands and City of Ash II).
### Weather Profile Expansion
Newly added zones include weather profiles:
– **Icereach**: 5% rain / 80% snow constant blizzard conditions
– **Kyne’s Aegis**: 10% rain / 70% snow
– **Bleakrock Isle**: 15% rain / 60% snow
– **Scalecaller Peak**: 5% rain / 70% snow
– **Frozen Coast**: 10% rain / 60% snow
– All underground, Oblivion, and enclosed zones: 0% rain / 0% snow
—
## Features
– **Lore-accurate base temperatures** for every overland zone and hundreds of sub-zones through West Weald (2024)
– **Explicit overrides for fire/lava zones** City of Ash, Deadlands, Tormented Spire, Bloodroot Forge, The Cauldron, and more
– **Explicit overrides for ice/frozen zones** Icereach, Frostvault, Direfrost Keep, Kyne’s Aegis, and more
– **Time-of-day modifiers** using the in-game Tamriel clock (dawn, day, dusk, night)
– **Climate/weather modifiers** derived from zone lore
– **Water temperature** when the player is swimming (`IsUnitSwimming`)
– **Interior/dungeon penalty** delves, group dungeons, public dungeons, and trials are shielded from weather; many now have their own explicit temperatures
– **Parent zone inheritance** unlisted child zones fall back to their parent’s climate data
– **Per-zone user overrides** via the LibAddonMenu-2.0 settings panel
– **Celsius / Fahrenheit toggle** in settings
– **Live updates** via LibClockTST subscription and `EVENT_PLAYER_ACTIVATED`
– **Debug slash command** `/ztemp` for on-demand snapshots
—
## Dependencies
| Library | Minimum Version | Purpose |
|—|—|—|
| (https://www.esoui.com/downloads/info1496-LibZone.html) | 077 | Resolves zone IDs and zone group status (delve/dungeon detection) |
| (https://www.esoui.com/downloads/info7-LibAddonMenu.html) | 30 | Settings panel UI |
| (https://www.esoui.com/downloads/info2360-LibClockTST.html) | | In-game lore time (hour/minute) for time-of-day modifiers |
All three dependencies must be installed and loaded for full functionality. The library degrades gracefully if LibClockTST is unavailable (defaulting to noon), and will print a warning in the settings panel if LibZone data cannot be loaded.
—
## Installation
1. Download and unzip `LibZoneTemp` into your addons folder:
“`
liveAddOnsLibZoneTemp
“`
The folder should contain:
“`
LibZoneTemp/
├── LibZoneTemp.lua
├── LibZoneTemp.txt
└── README.md
“`
2. Ensure all three (#dependencies) are also installed.
3. Launch ESO. LibZoneTemp will initialise automatically on the `EVENT_ADD_ON_LOADED` event.
4. Optionally access settings via the in-game **Settings → Addons → LibZoneTemp Settings** panel, or by typing `/libzonetemp` in chat.
—
## Public API
“`lua
— Returns the current ambient temperature for the player’s zone.
— When the player is swimming, returns the zone’s water temperature.
— formattedString respects the user’s unit preference (“23.4C” / “74.1F”).
local tempC, zoneName, tempF, formatted = lib.GetCurrentTemperature()
— Returns the base temperature for a given zone ID (before time/weather modifiers).
local baseTemp = lib.GetBaseTemperatureForZone(zoneId, isInterior)
— Returns the full temperature for arbitrary input values. Always Celsius.
— Pass isSwimming = true to get the zone’s water temperature instead.
local temp = lib.CalculateTemperature(zoneId, isInterior, loreHour, isSwimming)
— Converts and formats a Celsius value using the user’s saved unit preference.
— Safe to call before savedVars is loaded (falls back to Celsius).
local str = lib.FormatTemperature(celsius)
“`
—
## Slash Command
Type `/ztemp` in chat to print a debug snapshot:
“`
Zone: City of Ash I
Temperature : 50.0C (50.0C / 122.0F)
Lore time : 14:30
Zone ID : 176
Swimming : false
“`
—
## Settings Panel
Access via `/libzonetemp` or **Settings → Addons → LibZoneTemp Settings**:
– **Display in Fahrenheit** toggle between C and F display
– **Zone Temperature Overrides** pick any zone from a dropdown and set a custom base temperature (C). Set to 0 or blank to revert to the library default.
—
## Zone Coverage
### Overland Zones (all factions + DLC/Chapter through West Weald)
All 40+ overland zones have explicit base temperatures, weather profiles, and water temperatures.
### Sub-Zones with Explicit Temperatures
Over 200 named sub-zones now have their own entries, overriding parent-zone inheritance where the environment is meaningfully different. These fall into three categories:
**Fire / Lava / Volcanic** zones containing active lava rivers, Oblivion fire planes, volcanic vents, or draconic flame. Temperatures range from 30 C (warm underground ruins near volcanic activity) to 60 C (deep Deadlands and City of Ash II).
**Ice / Frozen / Arctic** zones buried in glaciers, located on polar islands, or containing permafrost and frost atronachs. Temperatures range from −16 C (Icereach) to −2 C (March of Sacrifices).
**Underground / Dungeons** most inherit from their parent zone via the existing fallback, but dungeons with notable microclimates (geothermal heat, deep cold, enclosed Daedric environments) have their own entry.
### Fallback Behaviour
Any zone not found in the tables falls back to `DEFAULT_TEMP` (20 C) for air and `DEFAULT_WATER_TEMP` (16 C) for water. Sub-zones will first try their specific `zoneId`, then fall back to their `parentZoneId`, before reaching the global default.
—
## Temperature Model
“`
finalTemp = baseTemp
+ interiorModifier (−3 C, reduced weather/time swing indoors)
+ timeOfDayModifier (−5 to +3 C based on lore hour)
+ weatherModifier (rain: up to −4 C; snow: up to −6 C)
“`
Water temperature bypasses all modifiers it returns the zone’s static water value directly.
—
## Design Notes
**Why names and not integer IDs?** ESO zone IDs are large non-sequential integers that can change between API updates. The only stable, human-readable identifier is the English zone name. At initialisation, `BuildZoneIdMaps()` calls `LibZone:GetAllZoneData()` and inverts the name→ID mapping.
**Why static weather and not live weather?** The ESO addon API does not expose a function to read the current client-side weather state. Weather is entirely client-side and visual only. LibZoneTemp therefore uses a static probability table derived from zone lore.
**Why not cover every delve?** Most delves inherit cleanly from their parent overland zone. Only delves with a meaningfully different microclimate (volcanic heat, glacial cold, Daedric environment) receive their own entry. This keeps the table maintainable while covering all cases where inheritance would produce a wrong result.
—
## For Addon Authors
“`lua
— Minimal usage: get the current zone temperature
local temp, zoneName, tempF, formatted = LibZoneTemp.GetCurrentTemperature()
if temp then
d(“Current temperature in ” .. zoneName .. “: ” .. formatted)
end
— Check if the player is in a hot zone (e.g. for survival gameplay)
local zoneId = LibZoneTemp._currentZoneId
local base = LibZoneTemp.GetBaseTemperatureForZone(zoneId, false)
if base >= 40 then
— Apply heat exhaustion debuff
end
“`
—
## Disclaimer
This Add-on is not created by, affiliated with, or sponsored by ZeniMax Media Inc. or its affiliates. The Elder Scrolls and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries. All rights reserved.

