File Details
GlymeraRevive-7.0.0.jar
- R
- Jun 16, 2026
- 30.81 KB
- 86
- 0.5
File Name
GlymeraRevive-7.0.0.jar
Supported Versions
- 0.5
GlymeraRevive Changelog
v7.0.0 (2026-06-16)
Fixed
Weapon kills bypassed the downed state in PvP. On a PvP-enabled world, killing a player with a weapon (e.g. a sword) made them die normally instead of entering the downed state — no gravestone, no chance to be revived. Damage from mobs, fists, fall, etc. downed them correctly, so the gap was weapon-specific and easy to miss (PvP is off by default on most worlds, so it never showed up in normal co-op play).
- Cause: the lethal-damage interceptor only declared "run before ApplyDamage" and was scheduled too early — before the damage value was finalised. A weapon attack carries only a damage class in its interaction; the actual number is computed later from the held item's stats. The interceptor therefore read an unset/partial amount, never recognised the hit as lethal, and let the engine kill the player normally. Mob/fist/fall damage carries a flat amount that is set early, so those were always caught.
- Fix: the interceptor now runs AFTER the gather and filter damage groups (still before ApplyDamage), reading the final, post-armor amount — the exact value the engine is about to apply — and uses the same rounding and min-health check. Lethal hits from any source (sword, fist, mob, fall, void) now reliably trigger the downed state. The hit is still cancelled before any health is subtracted, so no real death occurs → no item loss and no DeadChest grave when a player is downed.
The reviver instantly re-downed or killed the teammate they just revived. After a gravestone was broken, the revived player reappeared on that spot at 1 HP with no protection. The reviver's follow-through swing landed immediately and re-downed (bare hands) or killed (weapon) them — a loop.
- Fix: a revived player is now immune to all incoming damage for 3 seconds, and their HP is restored immediately (no more 2.5 s window stuck at 1 HP). The immunity is a plain cancel in the damage interceptor, so it blocks every damage source, weapons included.
Notes
- No config changes. Existing worlds, downed-state persistence and config are unaffected.
- Coexists with GlymeraDeadChest exactly as before: a down never triggers a real death, so DeadChest still only spawns a grave on a genuine death (give-up / timeout).
v6.0.0 (2026-06-15)
Fixed
- Server world crash when several enemies downed a player at the same moment. If two or more
lethal hits landed on the same player within the same server tick — for example a pack of bears
piling on at once — the world could crash and everyone on it was disconnected with the message
"The world you were on has crashed".
- Cause: the downed state is applied by attaching a component that only commits at the end of the
tick. A second simultaneous lethal hit didn't see it yet and tried to apply the downed state a
second time, which the engine rejects at commit (
Entity already contains component type) — and the exception, thrown on the world thread, took the whole world down. - Fix: the down is now guarded so a player can only ever be put into the downed state once per
down, no matter how many attackers hit at the same instant. The guard uses the
synchronously-set
liveDownedmarker (plus a committed-component check) in both the damage hook andputDowned. A single clean down happens and the world stays up.
- Cause: the downed state is applied by attaching a component that only commits at the end of the
tick. A second simultaneous lethal hit didn't see it yet and tried to apply the downed state a
second time, which the engine rejects at commit (
Notes
- No config changes, no behaviour change for normal play — this release only removes the multi-attacker crash. Existing worlds, downed-state persistence and config are unaffected.
v5.0.0 / v4.0.0
Maintenance releases (per the full-major version-bump policy; no player-facing changes documented).
v3.1.0 — 2026-05-03
Adds the missing immobilization + visual marker for downed players.
- Immobilization: when a player is downed,
MovementManager.setDefaultSettingsis called withbaseSpeed=0,acceleration=0,jumpForce=0,swimJumpForce=0. The settings are pushed to the client viaapplyDefaultSettings+update. The player can no longer walk, run, or jump — only look around. On revive or give-up, the default movement is restored (any race/speed plugin like GlymeraRaces re-applies its own modifiers afterwards via its post-respawn hook). - Visual marker — death puff on go-down: when a player enters the downed state, the native Hytale
Effect_Deathparticle system is spawned once at their position (the same effect Hytale uses when something dies). Makes the moment of falling visually unambiguous. - Visual marker — stars over the head: the
Stunnedparticle (cartoon stars) is spawned every 4 s on top of the downed player's head. Visible from far away, makes downed teammates easy to find. - Re-apply on login: the existing 5 s post-start scan now also re-applies immobilization to anyone still downed from before a restart. The HUD page is reopened as before.
v3.0.0 — 2026-05-03
Architecture rewrite to a "downed" state pattern (inspired by ReviveMe). Replaces v2.0.0's lethal-damage + post-death corpse approach. Players now never enter the actual death state until either the downed timer runs out or they press the give-up button — which makes the body interactable with a normal hitbox so a teammate can left-click them with a healing potion.
What changed
Lethal damage is intercepted before Hytale's
DamageSystems.ApplyDamageruns. If the incoming damage would reduce a player to 0 HP, the plugin instead:- Forces HP to 1
- Adds a custom
DownedComponent(with a millisecond timer) - Cancels the original damage
- Opens a persistent HUD page on the downed player
While downed, all incoming damage on the player is cancelled and all outgoing damage from the player is cancelled. The player keeps their normal hitbox + inventory (so teammates can target them and they don't lose items unless they actually die).
DownedTickSystemdecrements the timer every tick. When it reaches 0, the player is killed for real (realDeathComponentis added directly viatryAddComponent, so all of Hytale's normal death logic runs — items drop, death-screen appears, the player can respawn normally).Give-up button (
Common/UI/Custom/Pages/GlymeraReviveDownedPage.ui) on the persistent HUD page lets the downed player choose to die early. Same effect as the timer running out. Solves the "I'm alone, no one is coming, and I'd rather just respawn" case.Heal-hit (left-click on downed body with a healing potion in hand): same handler as v2.0.0, but the target is now in
DownedComponentinstead ofDeathComponent. On heal: removeDownedComponent, close HUD, set HP via the 2.5s-delayed schedule (still GlymeraRaces-safe).Custom component registration:
GlymeraRevive_DownedComponentis registered viagetEntityStoreRegistry().registerComponent(...). Component is persisted via codec, so a player who logs out while downed will still be downed when they log back in.No more JSON corpse persistence. The downed state lives on the entity itself; v2.0.0's
plugins/GlymeraRevive/data/directory is wiped on first start of v3.0.0.No items parked. Items stay in the player's inventory the entire time they are downed. They drop only on actual death (timeout or give-up), and Hytale's default drop logic handles it.
Configuration (plugins/GlymeraRevive/config.json)
downedDurationSeconds(default 300) — seconds the player stays downed before timeout.useDistanceBlocks(default 3) — Chebyshev block distance the reviver may stand from the body.hpReapplyDelayMillis(default 2500) — delay before HP is set after revive (lets stat-reapplying plugins like GlymeraRaces finish).healPercentByPotion— map of potion id → percent of MaxHP after revive.
Notes
- The downed player is currently not visually crouched — Hytale doesn't expose a server-side force-crouch. They appear standing but are functionally incapacitated. The persistent HUD page makes their state unambiguous.
- The custom block asset (
GlymeraRevive_Gravestone.json) is still in the JAR for backward compatibility with leftover v1 blocks in any world; the plugin no longer reacts to it.
v2.0.0 — 2026-05-03
Architecture rewrite. The custom-block "gravestone" is gone — the dead player's body itself is the revive target. Players in Hytale are not auto-removed on death (the engine's CorpseRemoval tick explicitly excludes player entities), so the body stays in the world until the player respawns. That makes a separate marker block unnecessary and avoids two bugs in v1.0.0 (the gravestone block had no usable interaction surface, and OP could break the block which dropped the items).
What changed
- No custom block, no UseBlockEvent, no BreakBlockEvent, no DamageBlockEvent, no despawn timer. All gone.
- Revive trigger: left-click the dead player's body while holding a healing potion. The plugin listens on the
DamageECS event inDamageModule.getFilterDamageGroup(), cancels the damage, validates (target is a Player corpse + held item is a known potion + reviver within configured distance), then runs the revive. - HP override timing: applied with a configurable delay (default 2.5 s) after respawn. This lets
GlymeraRaces(or any other plugin that adjusts MaxHP via modifiers on a post-respawn reapply) finish first, so the percentage is calculated from the correct final MaxHP. Without the delay the revived player could end up with the wrong HP fraction when their race changes the pool. - Items: still parked into plugin state at death (so the
DropPlayerDeathItemssystem can't drop them on the ground). On co-op revive: returned to the inventory, no durability loss. On self-respawn: dropped at the death position (Hytale-default-style). - Persistence: now keyed by player UUID instead of grave id. One JSON file per dead player under
plugins/GlymeraRevive/data/<uuid>.json. Removed on revive or self-respawn. - The custom block asset is still in the JAR for backward compatibility with any leftover v1 gravestone in an existing world; the plugin no longer reacts to it. Old
data/files from v1.0.0 are not migrated and are wiped on first start of v2.0.0.
Configuration (plugins/GlymeraRevive/config.json)
useDistanceBlocks(default 3) — Chebyshev block distance the reviver may stand from the body.hpReapplyDelayMillis(default 2500) — delay after respawn before HP is set toMaxHP × healPercent. Tune higher if other plugins do their stat reapply later.healPercentByPotion— map of potion id → percent of MaxHP.
Heal percentages (default, unchanged)
| Potion ID | Heal % of MaxHP |
|---|---|
| Potion_Health_Small | 15 |
| Potion_Health_Lesser | 15 |
| Potion_Health | 25 |
| Potion_Health_Greater | 25 |
| Potion_Health_Large | 35 |
v1.0.0 — 2026-05-03
Initial release. Co-op revival system: when a player dies, a gravestone is placed at the death position. A teammate can apply a healing potion to the gravestone to revive the dead player at that spot.
Mechanics
- On death: a
GlymeraRevive_Gravestoneblock is placed at the death position. The dying player's full inventory (hotbar, armor, tools, backpack) is moved into the grave — nothing drops on the ground, no durability is lost. The player sees a message that the gravestone has been placed. - Co-op revive: any player who right-clicks the gravestone while holding a healing potion (Potion_Health_Small, Potion_Health_Lesser, Potion_Health, Potion_Health_Greater, Potion_Health_Large) within 3 blocks consumes one potion and revives the dead player. The dead player respawns at the gravestone with HP =
MaxHP × potionHealPercent, gets the full inventory back (no durability loss), and the gravestone disappears. Both participants get a chat message and a confirmation sound. - Self-respawn: if the dead player chooses to respawn from the death screen instead of waiting, the gravestone disappears and the items drop on the ground at the gravestone position. From there, Hytale's default respawn behavior applies.
- Despawn timer: if neither side acts, the gravestone disappears automatically after
despawnMinutes(default 5). Items drop at the gravestone position. - Block protection: the gravestone cannot be mined, broken, or right-clicked by anyone except its owner (the dead player) or an OP. The owner breaking it gets all stored items back into their inventory.
Heal percentages (default)
| Potion ID | Heal % of MaxHP |
|---|---|
| Potion_Health_Small | 15 |
| Potion_Health_Lesser | 15 |
| Potion_Health | 25 |
| Potion_Health_Greater | 25 |
| Potion_Health_Large | 35 |
These match the native Hytale potion values and are configurable.
Configuration (plugins/GlymeraRevive/config.json)
despawnMinutes(default 5) — how long a gravestone stays before auto-despawn.useDistanceBlocks(default 3) — Chebyshev block distance the reviver may stand from the gravestone (a 7×7×7 cube centered on the block).healPercentByPotion— map of potion ID → heal percentage.
Internals
- Death hook runs
BEFORE DeathSystems.DropPlayerDeathItemsand empties the inventory into the grave before Hytale's default drop logic can act. - Respawn hook runs
AFTER RespawnSystems.ResetStatsRespawnSystem, so HP can be set to the desired percentage of MaxHP without being overwritten by the default reset. - Co-op revive sets a
Teleportcomponent on the dead player's entity, then triggersDeathComponent.respawn(). The default respawn controller picks up the teleport target and respawns the player there. - Three-layer block protection (DamageBlockEvent + BreakBlockEvent + UseBlockEvent.Pre). Blocks are also marked as deco via reflection, identical to GlymeraDeadChest.
- Persistence: each grave is a JSON file under
plugins/GlymeraRevive/data/. Survives server restarts; expired graves are pruned at startup. - Only one active grave per player. If a player dies again before reviving, the previous grave is removed (items lost — same as a despawn).