Gallery

Description
GlymeraObelisk - Defensive Lightning Obelisk
A 17-block gold-brick monument that automatically fires glowing energy bolts at hostile or aggressive creatures within a configurable 3D cube radius. Owner-protected, craftable, with custom sound and particle effects.
What is GlymeraObelisk?
GlymeraObelisk gives you a static defensive structure you can plant in your base, your farm, your trade outpost, anywhere you want to keep hostile mobs out. Place a single item, and a full 17-block gold-brick obelisk rises from the ground. From the moment it stands, it will quietly scan the area around it and pick off any creature that is hostile to players, or any creature that can become hostile to players (predators, mythic beasts) - while leaving peaceful livestock and prey alone.
It is built from native Hytale blocks, hooks into the native NPC attitude system to decide who is a valid target, and uses a custom particle and sound pair so you can clearly tell when one of your obelisks is engaging.
How It Works
Placement
Craft or pick up an Obelisk item. Right-click any block to place. The item triggers placement of a 17-block structure at that position:
- 7 stacked Rock_Gold_Brick_Ornate blocks form the central column
- 4 Rock_Gold_Brick_Roof blocks form a sloped base around the bottom
- 4 Rock_Gold_Brick_Beam blocks form a cross at the top
- 1 Rock_Gold_Brick_Pillar_Base + 1 Rock_Gold_Brick_Beam crown the tip
The block layout is captured 1:1 from a hand-built template, so the orientations are guaranteed to be correct.
Targeting
Every second, each obelisk scans a 3D cube around its anchor (default: 16-block half-edge, i.e. 33x33x33 blocks centered on the bottom ornate) and looks for valid targets.
A creature is a valid target if:
- Its default attitude toward players is HOSTILE (always-aggressive: zombies, skeletons, goblins, troops...), OR
- Its default attitude toward players is NEUTRAL AND its AttitudeGroup is not "Prey" or "Livestock" (predators that can be provoked: bears, wolves, mythic beasts...)
Peaceful animals like armadillos, rabbits, sheep, chickens, cows, pigs etc. are never targeted, even when they have NEUTRAL attitude, because their AttitudeGroup marks them as Prey/Livestock.
The closest valid target is selected per tick.
Firing
The obelisk fires from its tip (top beam):
- A laser-flash sound and a chain of golden energy spheres travel from the tip toward the target
- A delayed impact (based on distance and projectile speed, default 50 blocks/s) plays an explosion sound and applies damage at the target
- Damage is dealt as
PHYSICALand is environmental-sourced ("Obelisk")
Default damage: 50 HP per shot. Default fire interval: 1 second.
Sound
Two custom sound events are bundled:
SFX_Obelisk_Shot- the laser-flash at the obelisk tipSFX_Obelisk_Impact- the explosion at the target
Both have 3D positional attenuation (full volume from 0-1 blocks, fading to silence at 20 blocks).
Particles
A custom particle system ObeliskBolt is bundled. It uses the round Ball6.png texture, square-scaled with ScaleRatioConstraint: OneToOne so the particle reads as a small glowing sphere from any angle. Coloured gold (255, 215, 0) per spawn via the packet's color modifier.
Crafting
Craft at the Workbench in the Survival category:
- 3x Greater Essence of Life (
Ingredient_Life_Essence_Concentrated) - 5x Gold Bar (
Ingredient_Bar_Gold) - 5-second craft time, yields 1 Obelisk
The recipe can be disabled via config; OPs can still spawn Obelisks via /obelisk spawn.
Commands
| Command | Who | Description |
|---|---|---|
/obelisk spawn |
OP only | Spawn an obelisk at your current position |
/obelisk remove |
OP only | Remove the nearest obelisk in this world |
/obelisk list |
Anyone | Show how many obelisks you own and the world total |
/obelisk capture <halfWidth> <height> |
OP only | (Build tool) capture a volume of blocks as the placement template |
/obelisk captureat <x> <y> <z> <halfWidth> <height> |
OP only | (Build tool) capture from explicit world coordinates |
The capture commands are how the template was built originally. They write to plugins/GlymeraObelisk/template.json. Most servers will never need them - the bundled template is correct out of the box.
Block Protection
- Only the obelisk's owner (the player who placed it) or an OP can damage or break it.
- Damage from other players is silently cancelled.
- Breaking by owner/OP removes the entire 17-block structure and returns 1 Obelisk item to the breaker's hotbar inventory (with a
/givefallback if the hotbar is full).
Each block of the obelisk is marked as "deco" via BlockPhysics.markDeco so the cross arms and decorative pieces don't fall when a neighbour changes.
Config
File: plugins/GlymeraObelisk/config.json (created on first start).
| Setting | Default | Description |
|---|---|---|
guardRadius |
16 |
3D Chebyshev (cube) half-edge in blocks. Total covered = (2*r+1)^3. |
attackNeutral |
true |
If true, also target NEUTRAL creatures (predators that can be provoked). Peaceful prey is always excluded regardless. |
fireTickMs |
1000 |
How often each obelisk scans + shoots, in milliseconds. |
damage |
50.0 |
HP damage per shot. |
projectileSpeed |
50.0 |
Visual projectile speed in blocks/second. Controls impact delay only. |
recipesEnabled |
true |
Whether the Workbench recipe is allowed. Set to false to gate access to /obelisk spawn only. |
Persistence
plugins/GlymeraObelisk/obelisks.json- placed obelisks (world, anchor position, rotation quarter, owner UUID). Atomically written viatmp + fsync + atomic rename, survives crashes.plugins/GlymeraObelisk/template.json- the captured block template (overrides the bundled default if present).plugins/GlymeraObelisk/config.json- settings (above).
Features
- 17-block structure from a single item - placement triggers a multi-block layout with correct rotations
- 3D cube targeting with configurable radius (no infinite vertical range)
- Attitude-aware filtering - hostile + provoke-able predators, never peaceful prey
- Custom particle + sound system bundled in the JAR
- Owner protection - only owner or OP can damage/break
- Item-on-break - breaking returns the item to the breaker's hotbar
- Physics-stable -
BlockPhysics.markDecoprevents the cross-arms from falling - Recipe toggle via config
- Persistent + atomic save of placed obelisks
Installation
- Place
GlymeraObelisk-2.0.0.jarin your server'smods/folder. - Start (or restart) the server.
- Everything is embedded in the JAR - no external asset folders needed.
Sound Credits
- Shot sound based on "flash-laser-gun" by the freesound community
- Impact sound based on "pixel-explosion" by Lumora Studios
Both samples have been trimmed and re-encoded to OGG.
Made with care by Glymera for the Hytale community
Changelog
GlymeraObelisk - Changelog
v4.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.
v2.0.0 - 2026-05-19
Bug Fixes
- Obelisk no longer fails to spawn on a fresh install: Placing the Obelisk block item on a freshly installed server used to result in nothing happening — only the single gold-brick marker block stayed where the item was used, and the rest of the 17-block structure never appeared. Reported by a CurseForge customer. The plugin now ships a built-in default template inside the JAR and writes it out to the data directory on first start, so the structure spawns correctly out of the box.
Root Cause
- The placement logic in
placeObelisk()returns silently when the in-memory template has no blocks:if (blocks.isEmpty()) return;. The template is loaded from<dataDirectory>/template.json, which v1.0.0 expected an OP to create by running/obelisk capture <halfWidth> <height>against a manually built sample obelisk. - On the development server this file existed (Marc captured it once during plugin development), so the bug was invisible there. On a customer's server the file was missing, no error was logged, the
PlaceBlockEventsystem fired normally, the scheduledplaceObelisk()call exited immediately, and the player just saw the placed marker block with no further structure.
Changes
- Default template shipped inside the JAR: A
default-template.json(the 17-block gold-brick obelisk layout matching the header comment in the source) now lives in the JAR root as a Java resource. loadTemplate()extended: If<dataDirectory>/template.jsonis missing at plugin startup, the plugin now extractsdefault-template.jsonfrom the classpath into the data directory before parsing it. If the file already exists, it is loaded as before — admins keep any customizations they made via/obelisk capture.- Config defaults aligned with the documented values:
fireTickMsdefault changed from1500to1000(1-second scan + fire interval),damagedefault changed from5.0fto50.0f(per-shot damage). Previously the in-code defaults disagreed with the CurseForge description, so a fresh install behaved much weaker than advertised. Servers that already wroteconfig.jsonkeep their existing values; the change only affects fresh data directories. - No behavioural change for existing installs: Servers that already have a
template.json(whether captured by an OP or copied in manually) load that file unchanged. The extraction step only runs when the file is genuinely missing. - Header comment + manifest bumped to v2.0.0.
Migration
- No migration required. Existing
template.json,obelisks.json, andconfig.jsonfiles are read as before. Already-placed obelisks remain registered and continue to fire.
Coverage
- Verified on Dev: moved the existing
template.jsonaside, restarted the server, observed the plugin re-create it from the JAR resource. The extracted file was byte-identical to the original, and the previously placed obelisks on Dev loaded and functioned without errors.
v1.0.0 - 2026-05-18
Initial release.
Features
- Multi-block placement: a single Obelisk item spawns a 17-block gold-brick structure (7 ornate column + 4 sloped roof base + 4 cross-arm beams + pillar base + tip)
- 3D cube targeting with configurable Chebyshev half-edge radius (default 16, total 33x33x33 blocks)
- Attitude-aware filtering:
Attitude.HOSTILEcreatures (zombies, skeletons, troops...) - always targetedAttitude.NEUTRALcreatures - targeted only whenattackNeutral=trueAND theirAttitudeGroupis not "Prey" or "Livestock"- Peaceful animals (armadillo, rabbit, sheep, chicken, cow, pig...) are never targeted
- Custom particle: golden round
ObeliskBolt(usesBall6.png, square-scaled, billboard) chains from tip to target - Custom sounds:
SFX_Obelisk_Shot- laser-flash at the obelisk tipSFX_Obelisk_Impact- explosion at the target- 3D positional attenuation (1 block full → 20 block silent)
- Owner protection via
DamageBlockEvent+BreakBlockEvent(only owner or OP can damage or break) - Item-on-break: owner/OP breaking returns 1 Obelisk to their hotbar (with
/givefallback) - Workbench recipe: 3x
Ingredient_Life_Essence_Concentrated+ 5xIngredient_Bar_Gold, 5s, toggleable viarecipesEnabled - Block physics: every placed block of the structure is marked deco via
BlockPhysics.markDecoso the cross-arms don't fall when neighbours change - Atomic persistence:
obelisks.jsonwritten via tmp + atomic rename
Commands
/obelisk spawn(OP) - place an obelisk at your position/obelisk remove(OP) - remove the nearest obelisk in this world/obelisk list- count of obelisks (yours + total)/obelisk capture <halfWidth> <height>(OP) - rebuild the placement template from blocks around you/obelisk captureat <x> <y> <z> <halfWidth> <height>(OP) - capture from explicit coordinates
Config
guardRadius(default 16) - cube half-edge in blocksattackNeutral(default true) - also target provoke-able predatorsfireTickMs(default 1000) - scan + fire intervaldamage(default 50.0) - HP per shotprojectileSpeed(default 50.0) - blocks/s, controls impact delay onlyrecipesEnabled(default true) - allow the Workbench recipe
Only Marc can read this.