Gallery

Description
GlymeraRevive - Downed State & Co-op Revival
When a player would take lethal damage, they don't die. Instead they go into a downed state with a gravestone at their feet and a countdown timer. A teammate breaks the gravestone — or simply interacts with it — to revive them. If nobody comes in time, they die for real.
What is GlymeraRevive?
A co-op revival system inspired by the "downed state" mechanic from games like Left 4 Dead or Apex Legends. Instead of dying on the spot when health hits zero, players are knocked down, immobilised, and stay alive long enough for their team to rescue them.
The downed player is teleported into a hidden limbo space (near the world ceiling) the moment they go down. This stops NPCs from being able to attack them while waiting for rescue - no more bears beating on an immobilised player. Their original death position is remembered, so when revived, they're teleported right back to where they fell.
Includes its own asset pack with two custom items (a Revive Gravestone block and a Bandage healing item) and one custom UI page (the give-up screen).
Features
Downed State
- Lethal damage from any source (mobs, players, fall, void) triggers a downed state instead of death: HP forced to 1, movement frozen
- Inventory is kept intact while downed (no items lost during the rescue window)
- A gravestone marker block is spawned at the death position - this is what teammates use to revive
- A HUD page shows the countdown timer and a "Give Up & Respawn" button
Revive by Breaking OR Interacting
- A teammate can break the gravestone or simply interact with it (use key) - both revive the downed player
- The interact path makes revives work in worlds that forbid block breaking - most notably Hytale's native dungeon instances, where blocks can't be broken at all
- Each trigger can be disabled separately in the config; disabling the break trigger also makes the gravestone unbreakable
Aggro-Drop via Limbo Teleport
- The downed player is teleported to a hidden zone near the world ceiling with a floor block placed below them
- All NPCs in the original area naturally lose target lock through Hytale's built-in range filter - no NPC state hacking, no behaviour-tree manipulation
- The original death position is saved server-side. On revive, the player is teleported back exactly where they fell
- The limbo floor is cleaned up automatically when the player is revived or dies
Three Ways Out
- Revive: a teammate breaks or interacts with the gravestone → player wakes up at the original death position with a configurable share of their max HP
- Give Up: the downed player presses the Give-Up HUD button (or triggers their own gravestone) → real death, respawn at world spawn
- Timeout: the countdown reaches zero → real death
Post-Revive Protection
- Right after a revive the player is briefly immune to all damage (configurable, default 3 seconds)
- This closes the window where the reviver's follow-through swing would otherwise instantly re-down or kill the teammate they just rescued
Real Death (Give-Up / Timeout)
- Hytale's normal death pipeline fires: drops animation, respawn at the world spawn
- By default, items are lost according to the world's own GameplayConfig death settings (Hytale default: 50% of stackable items, 10% durability loss)
- Both values can be overridden in the plugin config independently of the world settings
Quit-and-Rejoin Anti-Cheat
- Persistent state file tracks every currently-downed player
- If a downed player quits and rejoins, they're killed on reconnect (no escaping death by closing the client)
- Stale entries on plugin restart are detected and cleaned up automatically
PvP Ready
- Weapon kills on PvP-enabled worlds trigger the downed state exactly like mob damage - including hits whose damage is computed from the weapon's item stats
Items
Revive Gravestone
- Custom block, plugin-only - no crafting recipe
- Spawned automatically at the death position when a player goes down
- Uses Hytale's native tombstone model and break decals
- A teammate triggers it to revive, the owner triggers it to give up
- Auto-cleaned up on revive, timeout, or death - only the gravestone block itself is ever touched, surrounding blocks are never modified
Bandage
- Custom item, asset is registered with the plugin (crafting recipe not yet wired up)
- Reserved for a future "self-revive" feature
Configuration
plugins/GlymeraRevive/config.json (auto-generated on first run, every entry has a comment right next to it):
| Field | Default | Description |
|---|---|---|
downedDurationSeconds |
60 |
How long a player can stay downed before they die automatically |
reviveByBreak |
true |
Breaking the gravestone revives (self-break = give up). false = break trigger off, gravestone can't be broken |
reviveByInteract |
true |
Interacting with the gravestone revives (self-interact = give up). Works in no-block-breaking worlds like dungeons |
revivedHealthPercent |
25 |
Percent of max HP a revived player wakes up with (1-100) |
reviveProtectionSeconds |
3 |
Seconds of full damage immunity right after being revived (0 = off) |
deathItemsLossPercent |
-1 |
Percent of stacked items lost on final death (0-100). -1 = use the world's own GameplayConfig death settings |
deathDurabilityLossPercent |
-1 |
Percent of durability lost on final death (0-100). -1 = use the world's own GameplayConfig death settings |
Installation
- Place the GlymeraRevive jar in your server's
mods/folder - Start (or restart) the server
- Done. Config is auto-generated on first run.
Compatibility
⚠️ GlymeraRevive and GlymeraDeadChest both take control of a player's inventory on death and are not compatible with each other — install one or the other, never both.
Works fine alongside protection/claim plugins: the revive triggers listen to their own gravestone only.
How It Works
Downed Flow
- A player takes lethal damage
- The plugin intercepts the damage event after armor/stats are applied but before Hytale subtracts health - so no real death ever happens (no item loss, no death animation)
- HP is set to 1, the player is immobilised, and a gravestone marker is placed at their feet
- The player is teleported to the hidden limbo zone and shown the countdown HUD
Revive Flow
- A teammate breaks or interacts with the gravestone
- The plugin identifies the downed player from the marker, teleports them back to the death position, and cleans up the gravestone and limbo floor
- The revived player gets their configured share of max HP plus a few seconds of damage immunity
Timeout / Give-Up Flow
- The timer reaches zero, or the player gives up (HUD button or triggering their own gravestone)
- Item and durability loss is applied (world settings or your config overrides)
- Hytale's normal death pipeline fires and the player respawns at the world spawn
Good to Know
- Dungeons: native dungeon instances forbid block breaking entirely - that's a Hytale gameplay config, not a bug. The interact trigger was added exactly for this, so revives work inside dungeons out of the box
- Anyone can trigger the gravestone: the plugin assumes you trust your party. Self-trigger by the owner is a deliberate give-up path
- Multiple downed players simultaneously: each player has their own marker, limbo position and timer. They don't interfere with each other
- Death drop behaviour: the plugin applies item/durability loss manually on a final death, consistent with what a normal Hytale death would do (programmatic deaths don't fire Hytale's own drop pipeline)
Made with care by Glymera for the Hytale community
Changelog
GlymeraRevive Changelog
v11.0.0 (2026-09-09)
Fixed
- Death item loss ignored
deathItemsLossPercentand was applied twice. Reported on CurseForge:
deathItemsLossPercent: 0still cost 50 % of the items on death. Confirmed and measured.
Hytale applies death loss in two engine systems that react to the DeathComponent being added
(PlayerDropItemsConfigcopies the world's gameplay config into it,DropPlayerDeathItemsthen
strips the configured share and drops it on the ground, and takes durability off every durable
item — the latter regardless of the loss mode). Neither checks where the death came from, so the
DeathComponent this plugin adds on give-up, timeout or stale-reconnect ran through the full native
loss as well, on top of the plugin's own loss — the only one the config could reach.
What that looked like in practice: with0configured, a stack of 25 food came back as 13 and a
100-durability sword as 90; with the default-1, a fresh 120-durability weapon ended at 96
(10 % taken by the plugin, another 10 % of its maximum by the engine). Blocks and most gear looked
untouched, which is why this went unnoticed for so long: the engine only drops items whose
DropOnDeathflag is set — 213 of the roughly 6900 item types, but exactly the ones players carry
in bulk (food, potions, ingredients, crops, rubble).
The plugin now switches the engine's loss off for the deaths it triggers itself, so its own loss —
and with itdeathItemsLossPercentanddeathDurabilityLossPercent— is the only one that
applies.0really means "lose nothing" now, and the default-1takes its share once instead of
twice. Deaths the plugin does not cause are untouched: in a world on thedisabledWorldslist, or
on any death outside the downed state, Hytale's own behaviour applies unchanged.
Note
- The plugin's own loss is not identical to Hytale's to the last item: it rounds instead of always
rounding down, takes durability off the item's current value rather than its maximum, and removes
the lost items instead of dropping them on the ground. The last part is deliberate — a downed
player dies away from their body, so dropped items would rain down from above the death spot. - If you had lowered
deathItemsLossPercentto compensate for the double loss, set it back to the
value you actually want; it now applies exactly once.
v10.0.0 (2026-08-28) — Hytale 0.6.0 (Update 6)
- Rebuilt for Hytale 0.6.0 (Update 6). Requires server 0.6.0 or newer; this version does not run on 0.5.x, and older versions of this plugin do not run on 0.6.0.
- Migrated to the 0.6.0 APIs (network protocol hytale/3, new command-permission API, block/chunk/entity API changes). Everything that was open to players before is open to players again.
- Upgrade: delete the old jar from
mods/, drop in the new one and keep the plugin's data folder — configs and saved data carry over unchanged. Restart the server.
v9.0.0 (2026-07-19)
Added
- World blacklist (
disabledWorlds). A new config list of world names where GlymeraRevive is
switched off entirely — players die normally there, with no gravestone and no downed state. This is
for game modes that run their own death handling and don't want Revive's lethal-damage interceptor
competing with theirs (BedWars-style arenas being the first example). An entry matches by exact
world name or as a name prefix, so a single"bedwars-"entry disables Revive in every arena
namedbedwars-…at once. The list ships with two placeholder names (worldname1,worldname2)
so it's obvious where to add yours. Leave it untouched and nothing changes — Revive stays active
everywhere, exactly as before.
v8.0.0 (2026-07-06)
Added
- Revive by interacting. The gravestone can now also be triggered with the use/interact key —
interact with a teammate's gravestone to revive them, interact with your own to give up. This makes
revives work in worlds that forbid block breaking, most notably the native dungeon instances (their
gameplay config disables block breaking entirely, so the gravestone could never be broken there —
thanks ZioMark for the report!). Breaking the gravestone still works everywhere else, as before. - New config options
reviveByBreakandreviveByInteract(both defaulttrue). Each trigger can
be disabled independently — withreviveByBreak: falsethe gravestone also becomes unbreakable, so
interact-only servers don't have to worry about stray pickaxe swings. - All gameplay values are now configurable (requested by ZioMark — thanks!):
revivedHealthPercent(default25) — percent of max HP a revived player wakes up with.reviveProtectionSeconds(default3) — seconds of full damage immunity right after being
revived (protects against the reviver's follow-through swing;0= off).deathItemsLossPercent(default-1) — percent of stacked items lost on a final death.
-1= the world's own GameplayConfig death settings apply (default Hytale behaviour).deathDurabilityLossPercent(default-1) — durability lost on a final death.-1= the
world's own GameplayConfig behaviour, exactly as before.- The rescue countdown (
downedDurationSeconds) was already configurable. - All defaults match the previous behaviour exactly — if you don't touch the config, nothing changes.
Fixed
- Reviving no longer clears blocks around the gravestone. Removing the revive marker mistakenly
wiped a 3×3 area at gravestone height (a leftover copy of the limbo-platform cleanup). In open
terrain this was invisible (the blocks were air anyway), but next to walls or furniture it could
silently delete them. Now exactly one block is removed, and only if it really is still the
gravestone.
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-setliveDownedmarker (plus a committed-component check) in both the damage hook
andputDowned. A single clean down happens and the world stays up.
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).
Only Marc can read this.