Ravengard tutorial, classes, regions and config driven items - #837
Merged
Conversation
Adds /logpackets for recording an entity rig and its per-tick transforms, /recreation hudcapture for dumping scoreboard lines and glyph usage, and a B-key toggle that dumps every component of an open container. These are what the Ravengard recreation is derived from, so they need to live alongside it.
…a path Polar worlds can now be loaded from an arbitrary path rather than only the type loader's main instance, which the tutorial world and /switch both need. The pack server serves Hypixel's untouched archive so the client resolves the real shaders and fonts, and polar display entities spawn without gravity so they stop flooding motion packets.
The pack draws the whole hud from scoreboard sidebar lines, addressing colours through team prefixes and negative space fonts. Lines are replayed verbatim from the capture with only the dynamic values substituted, and the minimap position is encoded into a tint the shader decodes. Health rides the vanilla hearts and stamina the vanilla exp bar, so both have to be fed real values for the bars to fill.
Rigs are rebuilt from packet captures as per part keyframe tracks with idle, talk and walk phases. Rotation is applied as a single rigid body delta to both the quaternion and the translation so the whole model turns together instead of each part spinning about its own origin. Roaming NPCs turn before they walk and glance around while idle, and clicking one plays its talk phase and sends its captured dialogue.
Menu buttons are itemstacks whose sprite position the pack reads out of two components: custom_name colour places the lit hover glow and dyed_color places the unlit face, both as a pixel offset from the screen centre. Buttons declare their footprint so a multi slot sprite is written once at its origin and repeated across the slots it covers, sharing one offset. Offsets are authored per button per menu rather than derived from the slot grid, so captured values take precedence over the computed fallback.
Adds the four launch classes with all twenty eight abilities, their icons resolved from the pack font and their cooldowns taken from live tooltips where these disagree with the wiki. Items follow the same shape SkyBlock uses, loaded from configuration/ravengard/items as yaml with pluggable components, including a class restriction so gear can be gated per class. Starting kits are three item ids per class rather than hardcoded stacks.
Cuboid regions resolved from two corners with the smallest overlapping region winning, backed by its own mongo collection and seeded with built in regions that only register when no stored region shadows them. SkyBlock drives region changes off its tracked player values which Ravengard has no equivalent of, so a poller fires the change event instead. Entering a region announces it as a subtitle.
New players start aboard the Nevermore with no gear until they pick a class. Diago's dialogue opens the class menu, and choosing one grants that class's kit and moves the player into the main world. Tutorial state is a datapoint so it survives a relog.
Chat lines lead with the player's class glyph and carry their level between name and message, with default rank keeping the whole line grey. Adds /class for switching class and /switch for moving between polar captures with completion.
The hud was being rasterised server side and encoded into markers, which the real pack does not do. Now that the pack is served untouched and the hud is driven through its own shader inputs, none of this is reachable.
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Idle and walk were already shared but talk was left per capture, so clicking different villagers played visibly different animations. All four now use one sixty frame talk cycle, with props only one of them carries holding their own pose resampled to the same length so every part stays on a single frame counter.
fix(ravengard): ability slots, some cleanups
…d twice RavengardView.chrome wraps whatever title() returns with the panel glyph and renders it in both font passes, so pre-baking the captured header into title() drew the panel and icon twice and the text four times.
Profiles live in their own mongo collection, one document per profile with class, level, tutorial state, playtime, crowns and ability points; the account keeps a selected pointer and the existing class, level and tutorial datapoints act as the working copy of whichever profile is active, so everything that already reads them is untouched. Creating a profile sends the player to the ship with Diago to pick a class, selecting one restores that class's equipment and moves them to the world it belongs in, and deleting the selected profile falls back to the next one or creates a fresh tutorial profile. Join announces the profile id and the create, select and delete messages match the captured ones verbatim. The profiles menu and the delete confirmation are rebuilt from captures: five statue columns with the create button filling unused columns, the selected profile marked instead of clickable, and confirm and cancel text buttons on the delete screen.
The client log flattens component colours away, so the absence of legacy codes on the captured lines said nothing about their colour; in game the line is gray.
…ass menu, dialogue skipping The bottom hud's two spell slots were replayed verbatim from a capture taken as an assassin, so every player saw Shadows and Heal Wounds regardless of class; the line is now composed from the player's own abilities via the pack's ui/spell glyphs and stays empty until a class is chosen. Fresh inventories now carry all four accessory panes (neck, earring, belt, ring) with their gray names and click protection; only the neck position is captured since the recorder truncates the player inventory, the rest follow it along the top row. The select class menu uses its captured per-class descriptions, the main world arrival faces south, and the remaining profile messages are gray. Clicking an NPC mid-dialogue now skips ahead a line instead of being swallowed, so repeated clicks speed through multi-line speech.
…uuids Items now render the tooltip the live server sends: a first line of rarity and item-kind tag glyphs, the defense value behind its icon in the stat colour, and a closing line tagging every class that can use the item, with the rarity also driving the tooltip style. The tag vocabulary comes from the pack's font, which is also how the captured Reinforced Pants turned out to be knight-restricted rather than shared. Non-placeholder items are unique the way SkyBlock's tracked items are: custom_data carries a rarity-prefixed id and a minted uuid, recorded with owner and profile to a tracker collection. SkyBlock routes this through the item tracker service; Ravengard writes straight to its own collection until traffic justifies one. The distinct uuid is also what keeps two identical items from stacking.
…imation play resets the frame counter, and onClick played the talk phase on every click, so skipping through dialogue snapped the rig back to the start of the cycle each time.
…ad space Every captured title places the header icon with a negative space of 4088 after the panel glyph; the chrome used 8192, so the icon and title text rendered four thousand pixels too far left and the panel showed no name.
The captured Ability One page fills in the whole layout: seven abilities down the panel at their grid-computed offsets, each with its wrapped highlighted description, cooldown and a state line, selected abilities marked with which slot they hold and the rest locked behind an ability point purchase. Both pages open from the main menu's ability buttons and read whichever class the player is, and block distances highlight green as the capture shows. The profile id line is dark gray with a blank line after it, matching the live join.
The client log flattens component colours, so the level looked like plain white text there; in game it renders bold gold with the colon and message returning to the rank's colour.
…xcluded from exports The exporter branded a display as moving on an exactly nonzero velocity vector or any sub-pixel position change between passes, but servers send no-op move and motion packets for stationary displays, so animated furniture like the alchemy stand plants was silently dropped from the polar. Movement now requires real displacement.
…uilt in Pages now declare only their content: RavengardView owns the layout pass, injecting the title chrome and the invisible stick every captured menu keeps in its first slot, and gives pages footprint-aware placement, click wiring and the shared back button so a new menu is a list of buttons rather than slot arithmetic. All five menus sit on the new base.
Inventories were never saved, and a plain join only synced datapoints without rebuilding the inventory, so loading straight into the lobby left it wrong. Every occupied slot now serializes into the profile document as item nbt whenever the profile saves, and joins and profile switches rebuild the inventory from the saved slots, falling back to the class defaults with the restore message only when the profile has never saved any.
They are displays like the accessory panes, so clicks on any menu-button or slot-pane model inside the player's own inventory are cancelled, scoped so the same models keep working as buttons inside the menus.
…enerated dungeons The tab list header now composes the fullscreen map from the generated layout itself: room tiles carry absolute packed positions on the 512px map canvas centred on the dungeon bounds, with player and teammate markers packed the same way, replacing the pre-made crypt segment tiles which drew the wrong map for generated instances. The minimap room tiles are redrawn in the crypt map palette with data pixels on all four texture corners so the shader routes every vertex correctly.
The generated tab map header carries several hundred glyphs and was resent every tick, flooding the client with identical component payloads.
The pack was pushed after spawn, forcing a mid-game resource reload while world data streamed in. Chunk sections received during that reload are never rendered by the client even after a manual chunk rebuild, which made generated dungeon instances appear invisible. The push now happens in the configuration phase and blocks until the client reports a terminal pack status, matching how Hypixel applies theirs before any world data is sent.
Each catalog room's map art is cropped from the crypt segment images, which align with the blueprint world at exactly one pixel per block, rotated to all four placements and packed as bitmap font grids with per-cell data pixels. The minimap and tab map now place these room shaped glyphs for discovered rooms at one pixel per block, replacing the flat placeholder squares, so generated dungeons render with the same map styling as the pre-made crypt.
The blueprint outlines every room twice on the marker plane, once at the outer wall face and once at the interior face. The extractor had turned each inner outline into a second nested room whose placement stamped a wall-less cut through the middle of the physical structure, which is what sliced buildings in half. The 54 inner duplicates are dropped from the catalog, generation targets clamp to the pool size, the maps always draw the full layout since hypixel has no discovery fog, and any remaining border column without a physical wall outside a door aperture is sealed at stamp time with the room's own dominant wall material.
Chunk sections that reach the client while a resource pack reload is in flight are dropped from its renderer and a client side rebuild cannot recover them since the stored section data itself is lost. Two seconds after the player lands in the instance the server resends every chunk in view, which restores the data and remeshes.
…er session The blueprint keeps a two hundred forty by two hundred sixty block structure at the heart of the map that rises well past the normal room roof, so it is extracted as a dedicated catalog entry with its own roof height and thirty two door apertures, always placed unrotated at the layout centre where its doors seed room growth. The admin aerial spawn hovers above its roof and its map art ships with the room glyphs. The resource pack push is now gated by a client cookie that survives backend transfers, so switching from the lobby to a game no longer triggers a redundant client resource reload.
Every static world on the stack runs on the default DynamicChunk and renders correctly, while generated instances were the only worlds using LightingChunk and their computed light payload is the one thing the client never rendered, surviving relights, materialization and chunk resends. Generated instances now use the default supplier and the lighting stages are removed from the readiness path.
The polar worlds all ship baked light from their files and render, while generated instances sent chunk packets with no light data at all and this client skips meshing such sections entirely, leaving the world collidable but invisible. Generated layouts now set full bright sky and block light on every section after stamping, matching how a lit dungeon interior plays.
Generated instances now use a dedicated ravengard dungeon dimension with full ambient light and players join a shared instance wrapping the container, exactly how skyblock islands build runtime instances that render correctly on this client. A fullbright dimension needs no light data at all, sidestepping the missing light payload that left generated worlds collidable but unrendered.
Half the blueprint's structure belongs to no outlined room, so packing rooms into a fresh void discarded the entire connective city and left the gaps hypixel does not have. Generation now loads the whole blueprint city as the instance base through the polar path and permutes rooms between slots whose footprints match under rotation, stamping only the swapped interiors. Every placement keeps its original city coordinates, so the crypt segment map art lines up verbatim and the minimap pans hypixel's own tiles with the packed player position while the tab map returns to the crypt tile path.
…b origin The player marker template renders before the minimap segment tiles and was buried under them, so a live marker with the real yaw now rides after the map glyphs at the minimap centre. The tab map origin becomes the canvas centre since map pixels equal world coordinates on the crypt canvas, placing the tab marker exactly where the player stands.
…e menu item in dungeons The dungeon stats line was missing the keybind hint runs and the map and inventory icon block that the captured hypixel hud carries after the date, which the shader positions under the ability slots, and the health and stamina used a tripled half font wrapper while the capture doubles them with the full and default fonts, which threw off their placement. The ravengard menu item is no longer given on the dungeon server.
…ur class Same shape rooms carry their doors in different positions, seventeen of the eighteen swap pairs misalign, so full mask swapping put doorways into neighbouring walls. The outer shell with its walls and doors now always belongs to the city and only cells at least two blocks inside the mask edge are restamped. The blueprint's outline colours classify room roles, white and brown standard classes plus cyan lime green orange and light blue specials, and interiors only permute between rooms of the same class.
…eons Adds a shared look-to-open system for dungeon interactables driven by the captured hypixel behaviour: an empty bossbar fills while a player looks at or clicks the target and triggers the open at full. Doors spawn from the city config's nine hundred twenty four leaf and four hundred sixty three frame positions, pair into double doors and swing ninety degrees around their hinges with the hitbox following, closing again after five seconds. Chests seed into thirty percent of rooms per generation seed with the captured two display rig, the five tick lid slide, a twenty seven slot loot inventory titled with the captured glyphs, and a poof burst that removes the rig when the inventory closes. Satchels spawn via the new spawnsatchel command with a landing smoke puff, rising skull displays while unopened, the lootbag model swap on open and the captured forty five slot dead body inventory.
Each door_1 config entry is one whole door, not a leaf, so a door now spawns a single display with two side by side hitboxes matching the captured pair and swings as one piece around its edge hinge. Clicking an interactable now updates the progress bar immediately, and satchels no longer open from looking alone: the bar fills and holds full until the player clicks.
Satchels snap to the floor beneath the spawn position instead of hovering at the player's waist, and the unopened effect now releases two to three small red tinted skulls per burst with staggered starts instead of one full size sprite.
…kulls Interactions now follow the captured flow exactly: a click starts a channel, the centre bossbar fills over roughly a second while the player keeps looking at the target, looking away cancels it, and the open only fires on completion. The click listener runs in the gameplay phase with data loaded like the generic interaction handler, which is why clicks previously did nothing. Door leaves stop translating: the hinge offset is baked into the door model's head display so a leaf swings by rotating the entity yaw alone, doorway clusters swing their leaves in mirrored directions together and park the hitboxes while open. The satchel skulls become bursts of small red dust particles rising from the bag instead of scaled item displays.
The pack blanks white bossbar sprites to a transparent pixel and routes the blue sprites to the shader's cast bar, so the interaction loading bar must be a blue progress bossbar to render at all. Satchels also spawn with zeroed pitch and yaw instead of inheriting the player's look angles.
…door swing The bossbar name in the cast bar tint colour renders above the loading bar through the pack shader, so each interactable now labels its channel. Chest ground detection sampled unloaded polar chunks and silently spawned nothing, which is why clicking chest shaped decor did nothing; it now samples the template, which shares coordinates with the loaded city. Door clusters are deep doorway faces rather than mirrored side by side leaves and now swing in a uniform direction around their model baked hinges.
Entity spawns into unloaded chunks throw and the exception was swallowed inside the readiness future, killing the door loop midway and preventing every chest from spawning. All door and chest chunk positions now load before any entity spawns and the spawn pass logs its counts or its failure.
The captured door, chest and satchel rigs carry no display context metadata, so their models render with the default context and none of the head display transforms. Forcing the head context applied the mob part scale and offset to doors and chests, which is why doors rendered oversized and displaced.
Loot rolls no longer draw equipment slot placeholders from the item registry and are weighted by the map's ring structure: the further a chest or satchel sits from the centre the more likely its rolls leave the common tier. Interactable displays carry the captured brightness override so door faces light evenly, and entity clicks log their target and resolution while the click path is under investigation.
…clearing The channel look check used a fixed angle threshold that failed at close range where aiming anywhere but the hitbox centre cancelled the channel instantly, so it now ray tests the player's line of sight against the interaction box. Door leaves spawn snapped to the closed yaw for their doorway axis since the blueprint snapshot saved some doors open or mid swing, and opening a door clears the invisible barrier blocks sealing its aperture, restoring them when it closes.
Closed leaves face across their doorway axis, not along it, so the axis to yaw mapping is inverted, and channel cancellations now log whether the target was already open or the look ray missed.
The slab ray test disagreed with the client's own raycast and cancelled every channel, so the gate now measures the look ray's miss distance from the hitbox centre against the box radius with slack. Door leaves swing ninety degrees and opposite facing leaves mirror their delta so both halves of a doorway open in the same world direction.
Doors stay open until channelled again with a closing label instead of auto closing, their hitboxes widen past the aperture barrier faces so the client raycast reaches the entity instead of the invisible block, and chests clear any barrier blocks around their spawn point since some room centres sit inside barrier fields that swallowed every click.
…rture wide door hitboxes The city ships over a thousand decorative chest displays in its polar user data, which is what players actually find and click, so those pairs are now converted into functional chests in place with silver and gold tiers boosting the loot rolls, replacing the invisible room centre seeding nobody could locate. Doors get one interaction spanning the whole aperture so every barrier face is covered, and the open state keeps its hitbox so the door can be channelled shut again.
Swofty-Developments
marked this pull request as ready for review
August 4, 2026 08:44
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.