qc_clientcore
The client without GUI: session, prediction, meshing, light, camera, textures. More...
Namespaces
Completion of a command line for the admin channel's command picker (decision E-848): the command names of the catalogue for the first word, then what the parameter at the cursor takes by its usage (QcCommandSyntax): the choices, the names of the players, the structures or biomes the server names with the command (decision E-911), or the blocks, items and creatures of the content | |
Adventure guide as the tree view shows it (decision E-924), without the GUI: which advancements a player sees, how far they are with each, and where each stands, one tree per root | |
Keeps cut-out textures (leaves, plants, torches) the same density in every mip level (decision E-300) | |
Turns a pose into bone rotations for skeleton models and into the first-person hand motion | |
Application icon: a grass block with an iron pickaxe on a rounded sky tile, drawn from the game's own procedural textures, so it needs no image files | |
What worn armour looks like (decision E-235): for each piece its layer boxes, the boxes of the reference model (the humanoid) it covers made slightly larger and cut to the layer's heights, and its extra parts, as attachments on the bones | |
Blocks the local player's actions are expected to set, as the server will set them (decision E-853): the client shows them at once and the server's acknowledgement confirms or rolls them back (QcBlockMirror) | |
Inventory icon of a block state: its boxes drawn from above at an angle (top, east and south faces), textured from the atlas and shaded like the world, so stairs, slabs and fences look different from their base block | |
Look of a boat (decision E-920): an open hull of planks with an oarlock on each side wall, built of boxes like the other static models, pointing north (-z) and turned by the boat's yaw, and two paddles turning in the oarlocks | |
Boats and their drivers as the client draws them in a frame (decision E-920): a boat where the mirror shows it (interpolated, bobbing while it floats) and its paddles rowing while its driver paddles (the boat's QcMsg::Rowing bit), and every other player who sits on a boat's driver seat drawn there facing the boat's way, their hands on the paddles in the same stroke | |
Player's character profile apart from the look itself: the colours the character screen offers, the built-in presets, random looks, and how look and presets are stored in settings.ini (decision E-231) | |
Client session's part of the health line (decision E-834) | |
Debug data as JSON (decision E-225), the same numbers the debug display shows: "client" (position, light, target, entities, chunks, memory, latency), "frame" (graphical game only: FPS and the frame phases with mean and maximum in milliseconds, meshing) and "server" (tick phases, tick, lateness, counts; once the server sent them) | |
What the dials of held items show (decision E-769), as pure functions of the session's state | |
Enchanting tables' book and runes as parts of the entity mesh (decision E-884, positions from QcEnchantingAura): the book as two quads of its atlas tile (QcRuneGlyphs::bookTile), the two halves hinged at the spine and opened towards the viewer; each rune as a quad cut from the rune pages of the texture atlas (QcRuneGlyphs), facing the viewer about the vertical and glowing in a pale violet | |
Which entities a frame builds (decision E-862): only those whose box may show in the camera's view | |
Builds the triangles of entities: static box models, animated skeleton models with outfits and hair, dropped items and the first-person hand | |
What players and items look like when drawn: shared by the world (QcEntityFrameBuilder) and the character preview, so the preview shows exactly what other players see | |
Number and the ids of the frame phases | |
View-frustum culling of axis-aligned boxes (chunk sections) against the clip planes of a view-projection matrix | |
Response of QcGamepadResponse applied to sticks and triggers | |
How the buttons of a family are drawn in hints and named in help texts (decision E-612), as plain shapes and letters, no logos: a shape (a disc with a letter, the four PlayStation shapes, a shoulder or trigger tab, a stick, the d-pad cross with one arm lit, a diamond of four dots with one lit for the face buttons of a generic pad), its text and a colour role | |
What the pad does in the world and the arithmetic behind it (decision E-541), without state and without a session: the default bindings, the walking direction of the left stick, the turn of the right stick in one frame, the triggers as buttons and the hotbar steps of the shoulders | |
Names of buttons, axes and types in the control interface and in settings ("south", "leftX", "playstation"); the lookups return nullopt for an unknown name | |
Which family a pad belongs to, from its USB/Bluetooth vendor and product id and its name (decision E-540): Microsoft is Xbox, Sony PlayStation, Nintendo's Pro Controller (and the combined Joy-Cons) Switch Pro, any other Nintendo product (a single Joy-Con) Generic; without a known vendor the name decides ("Xbox", "DualSense", "DualShock", "PS4", "PS5", "Pro Controller", "Switch"; a single "Joy-Con (L)"/"(R)" is Generic), else Generic | |
What the renderer learned about the GPU, for code that prepares textures in other threads (decision E-300): the largest texture edge | |
First-person swing (decision E-881): arm and held item move together as one rigid body, nothing bends or turns in the fist | |
Draws item frames and paintings (decisions E-790, E-791): a frame as a thin board in its item's texture with the held item in front, turned by its rotation (a block item as a small cube, any other item flat); a painting as one picture tile per block (QcPaintingMotif::tileTexture) on a board whose back and edges show its back texture | |
View of a hurt player tips away from the hit and back (decision E-971), like the reference's damage tilt | |
Index buffers of section meshes: two bytes per index whenever every vertex can be addressed with 16 bits, otherwise four (QcPackedMesh writes them) | |
Icon of every item of a content registry, keyed by item name: blocks drawn as their shape when a render table is given, everything else (and blocks with a flat icon, plants) as its texture; and the icon of every creature (QcMobIcon) under QcHandbookLinks::mobIcon(name) | |
Heights of a liquid's surface at the four top corners of its cell (decision E-885), so the surface slopes towards where the liquid flows, as in the reference game: each corner averages the surfaces of the up to four cells sharing it, sources and full cells weighing ten times as much as lower flows, open cells (air, torches, plants, thin snow; QcBlockRenderTable::Entry:: liquidMayEnter) counting as height 0 and closed cells (solid blocks, other liquids) not at all; a corner next to a full cell (liquid on top of it) is full | |
Colours maps are drawn with (decision E-801): every block definition shows the average colour of its top face's texture as the world is drawn, so texture packs colour maps too | |
Next mip level of the material atlases (decision E-908): every 2 x 2 block of texels into one | |
Materials of the procedural textures (decision E-908): a surface by pattern (stone, wood, bricks, glass, metal …), refined by words of the texture's name (the metal of a block or an ore), light for the textures of light-emitting blocks, and finally the "material" object of the definition itself (a mod's texture or a pack's spec) | |
Paints the material maps of one texture from its colour picture (decision E-908) | |
Handbook icon of a creature (decision E-944): its model standing in its rest pose, turned so that its face looks out of the icon, drawn from above at an angle like a block icon (QcBlockIcon) and scaled to fill it | |
Turns relative mouse motion (in points, y down) into view yaw and pitch | |
Finds and ranks the moving lights of a frame | |
5 x 7 pixel font of the text on signs (decision E-766), drawn by the game itself like its textures: printable ASCII, the German umlauts and ß, a few accented letters, € and °; any other character shows as '?' | |
When a character preview draws (decision E-231) | |
Poses of the character preview: the animations to check a look with (standing with the idle sway, walking on the spot, mining) and the head following the mouse pointer | |
Triangles of the character preview: the player's figure meshed exactly as the world meshes other players (QcFigureLook, QcAnimator, QcEntityMesher::appendModel), standing at the origin in full daylight, so the preview shows what other players see | |
A procedural texture definition (content/*/textures/*.json or a texture pack's spec) turned into a picture: the fields are read into a QcTextureSpec and painted at 16 x 16; larger resolutions are enlarged with the pattern's detail (QcTextureDetail, decision E-299) | |
Model of a projectile (an arrow, decision E-425): the item's icon, which lies on its diagonal from the tail at the bottom left to the head at the top right, drawn as two crossed squares whose diagonals run along the flight, so the head points where it flies and the fletching shows from every side, like the reference's arrows | |
Camera-relative rendering (decision E-883) | |
Runes of the enchanting table (decision E-884): 40 hieroglyphs after Egyptian models (ankh, eye, water, reed, vulture, scarab, djed pillar, lotus …), drawn by the game itself like its textures and its sign font (QcPixelFont), in the blocky stroke of Pixelify Sans | |
How the enchanting screen writes an offer's clue (decision E-884): every letter is either readable or hidden behind a rune (QcRuneGlyphs), and the bookshelves around the table decide how many are readable: floor(letters x shelves / 15), all of them at 15 | |
Phases of a client session's connection; the phase itself is QcSessionState (QcClientSession::State, reported by QcClientSession::stateChanged()) | |
Pure parts of the sun shadows (decision E-903): which light casts them, how far each cascade reaches, the light's axes and a box per cascade whose texels stay on a fixed grid of the world (texel snapping), so shadow edges do not crawl while the camera moves | |
Text on signs (decision E-766) as quads of the entity mesh: one quad per character, cut from the pixel font's pages in the texture atlas (QcPixelFont), on the front of the board in the ink of the text's colour (QcSignText::inkOf; dark by default, a dye's tone after decision E-830) | |
Sky as a function of the world time and the weather | |
Moving a focus between rectangles of a screen by direction (decision E-583): from the focused rectangle to the nearest one that lies in the direction | |
How a creature that swims in pulses (the squid, QcMobDefinition::pulse, decision E-974) holds its body in one frame: tilted by the pitch the server sends (QcCreature::tilt) about the middle of its height, its tentacles (QcMobPart::tentacle) open as it slows below the speed of a push and pulled in right after one | |
Luminous threads between the children of a family and their parent (decision E-839; the Kjut, a signal and slot look): a thread from the middle of one body to the middle of the other, drawn as two crossed ribbons | |
Renders a procedural texture above 16 x 16 (decision E-299): the pattern's 16 x 16 picture is enlarged in steps of two with an edge-aware pixel-art filter (Scale2x on similar colours, so diagonals and round shapes get finer steps instead of blurring), then gains detail that only the higher resolution can show: a fine grain on the surface and a bevel along strong edges (lit at the top and left, shaded at the bottom and right, also towards transparent pixels). The outlines of the enlarged picture follow its coverage alone, so the pixel variation of a thin shape cannot notch or pinch it; tools and weapons take the outline of strokes between the pixels instead (QcTextureOutline, decision E-1000) | |
Pattern "emblem" (decision E-241): pixel art from a small bitmap in the content data, on woven cloth in the primary colour | |
Smooth outline of an enlarged cut-out shape (decision E-1000) | |
Where texture packs are found (decision E-297): built into the game (:/texturepacks/<folder>), in the player's data folder (<data>/texturepacks/<folder>) and inside installed mods (<mods>/<mod>/texturepacks/<folder>, decision E-302) | |
Reads a texture pack folder (decision E-297) and checks everything in it at the system boundary (decision E-298): the manifest, file names (only textures/<namespace>/<name>.png|json, no links, no hidden files, so nothing outside the folder is read), the number and size of files, PNG signature, size and resolution, damaged images and a budget for decoded image memory | |
Pixel helpers shared by the texture patterns of QcTextureSynthesizer | |
Where each texture of the atlas comes from (decision E-297): the active packs in priority order, then the content's own definition (the base 16 x 16 textures and those of mods) | |
One switch of texture packs (decision E-301): optionally lists the pack folders again, loads the active packs that are not loaded yet, reads the previews that changed and builds the atlas for the content | |
A tidy layout of a tree read from left to right (decision E-924; the advancement tree): a node's column is its depth, children follow their parent in one column further right in the order of their indices, and every parent stands halfway between its first and its last child | |
Colours of every game screen in one place | |
Size of the HUD and the screens (decisions E-725, E-875): the player's choice (a step from 75 % to 200 %) times the window's factor, which grows the UI with large windows, and how far that may go in a window before the UI would no longer fit | |
Places the camera for a view mode | |
Look of the water in the realistic mode (decision E-906): what does not need the GPU | |
Pictures and colours of the web handbook (web/handbook/data): all item icons on one sheet, so the page loads one image instead of hundreds, and the colours of the game's screens as CSS variables, so the page looks like the handbook in the game (QcUiPalette) |
Classes
What completion takes its words from | |
An advancement in the tree: where it stands and how far the player is with it | |
One tree of the guide with its size | |
Levels (0..1) of the four ambience loops, chosen from the surroundings with simple rules: wind under the open sky (stronger up high), a cave rumble under a thick rock ceiling, water when water blocks are near, rain while it rains where the listener is (muffled under a roof, faint in a cave) | |
(0..1) of the four ambience loops | |
Time of the animated block textures in game ticks (decision E-878), advanced every frame by the frame's seconds at the server's speed (QcMsg::WorldTime::speed): smooth between ticks, faster in a /tick sprint, and standing while the server stands (pause menu, an empty server, /tick freeze; speed 0) | |
Rotations of a skeleton model's bones and of its whole body in one frame | |
Rotation of a bone around its pivot in degrees | |
Where the first-person arm and held item sit relative to their rest position, in the camera's frame (x right, y up, z backwards) in metres, and how far arm and item are turned together about the shoulder (degrees; QcHandSwing::Angles) | |
One image of a macOS .iconset | |
Geometry of the texture atlas (decision E-300) | |
Software mixer: plays sample buffers as voices with their own gain, stereo position and speed, grouped into buses with a volume each, under a master volume and a mute switch | |
How play() starts a voice | |
One playing sound | |
A quad of any size and place with the colour its texels are multiplied with (RGBA, 255 keeps a channel): a face of a creature's model (QcMobIcon) | |
One cell of a block that fills several (a bed's foot and head, decision E-885): its state's entry, drawn offset cells away from the first part | |
Block light of all loaded chunks on the client (decision E-049): the shared QcLightEngine (decision E-389) with block light only, plus immutable section snapshots for the mesher | |
What changed since the last takeChanges(): new snapshots of sections whose levels differ, and the sections whose meshes read a changed cell (also neighbours of changed border cells) | |
A new snapshot of one section's light | |
Blocks of the loaded chunks as the client shows them (decision E-853): what the server's world messages say and, on top, the local player's predicted block changes | |
What a world message changed | |
Whether the session shows the blocks of the local player's breaks and placements before the server confirms them, and the numbers of the predicted actions (decision E-853) | |
Per-state data the mesher needs, indexed by runtime block id (block state) | |
A pair of crossed planes (plants, saplings) spanning a box of the cell | |
One face of a shape box, in block-local coordinates; corners are ordered like the full cube faces (0 and 1 along the bottom edge of the texture) | |
Rectangle on a cell side in the two coordinates that span it (see QcBlockRenderTable::axes): a0..a1 along the first axis, b0..b1 along the second | |
Vertex layout shared by the mesher and the GPU pipeline: position (relative to the section's corner, QcChunkMesh::origin) and atlas coordinates as floats, shading, light and the surface as unsigned bytes (read as one UNormByte4 attribute), 24 bytes per vertex | |
How a paddle lies in its oarlock, in degrees: sweep turns its outer end towards the stern (negative towards the bow), lift tilts its outer end down towards the water | |
A boat as drawn this frame: its feet (with the bob), its yaw, the moment of the paddles' stroke (QcBoatModel::rowPhase, negative at rest) | |
Where a driver sits as drawn this frame: the boat, the feet on its seat (bobbing with it), the boat's yaw and the paddles' stroke | |
A driver figure as drawn on its seat: its pose, its feet and the way it faces | |
Legs of a creature built from static boxes (decision E-888), found in its parts, so every walking creature of the content and of mods swings its legs without naming them: a leg stands on the lowest level of the model and is at least 1.5 times as tall as it is wide and deep; a model needs at least two | |
How one part moves with the walk: turned around axis through hip by the swing angle times phase (1 or -1; 0 for parts that are not legs) | |
Legs of the box models drawn, found once per model instead of every frame | |
First-person camera | |
Smoke rising from the lit campfires near the player (decision E-772): a list of the campfires (blocks whose campfire cooks) within radius blocks, found again every rescanTicks by looking only into the chunk sections whose palette holds such a block, and a few puffs per campfire that rise, drift and shrink in a loop | |
How a figure moves, as far as its cape cares: speeds in m/s in the figure's own frame | |
Swing of a cape (decision E-240): a damped spring per axis pulls the cape towards an angle that follows from the movement: lifted backwards by walking and more by sprinting, upwards when falling, pressed to the back when rising or sneaking, held off the swinging legs when walking backwards, swaying gently when standing | |
Cape swings of the figures in the world (decision E-240), one per entity, advanced once per frame | |
A look saved under a name: a built-in preset or one the player saved | |
Presets of the character screen (decision E-231): the built-in ones, translated, followed by the player's own (at most QcCharacterProfile::maxPresets) | |
What the server sends about the loaded chunks besides their blocks: the labels floating in them (decision E-222), the creature kinds spinning in their monster spawners (decision E-520) and the items lying on their campfires (decision E-772) | |
Block light levels (0..15) of one chunk as immutable section snapshots; a missing section is dark | |
Triangle mesh of one chunk section | |
Builds the triangle mesh of one chunk section from the boxes of every block state: hidden faces are culled, every vertex gets face shading, ambient occlusion, sky light and block light | |
Client's side of the admin channel (decision E-848), part of QcClientSession: what an operator asks the server for and what came back, for the "Manage server" screen (stage 77.2) and the control interface | |
How many chat and log lines came so far (on over their limits), and how often the list was replaced (a new history or tail, following anew): a view appends only what is new (decision E-863) | |
Local player's progress in the adventure guide as the server told it (decision E-923, QcMsg::AdvancementProgress); the definitions come with the content (QcContentRegistry::advancements) | |
Anvil's screen the server opened for the local player (decision E-866): its left and right slots, the name in its field, the output and its cost as the server last sent them (state()); the player renames and takes the output | |
A screen the server opened at a block for the local player (the anvil, the enchanting table): whether it is open, where, and the way out to the server | |
A screen of the kind the server opens with the message Open, updates with the message State and closes with the message Close (either side sends Close) | |
Client's subscription to the server's debug data (QcMsg::DebugSubscribe, decision E-225) and what arrived of it | |
Enchanting table's screen the server opened for the local player (decision E-864): its item and lapis slots, the bookshelves that count and the three offers as the server last sent them (state()), and the offer the player takes | |
Client mirror of the entities the server reports, with their animation timers and the ones that play their death animation | |
Client mirror of an entity the server reported (QcMsg::EntitySpawn) | |
Local player's game mode as the server reported it (decision E-282), with the world's adventure allow-lists in adventure mode (decision E-735), and what the client does with it: the wish to fly that goes with every input (decision E-284), the pace of instant breaking in creative mode, and the requests for catalogue items (E-283) and picked blocks (E-285) | |
Local player's items as the server last reported them (QcMsg::InventoryState): inventory, selected hotbar slot, worn equipment and the crafting grid with its result; and the requests that move items between these slots or craft (the server answers with a new InventoryState) | |
Drawing a launcher on the client (a bow, decision E-425): the use button held with a launcher in the hand draws it, its release shoots | |
Client's side of the login of a network game (decision E-252): answers the server's challenge with proofs of the password and of the player's identity for this server, the content packs and the wanted view distance, and keeps what the server told about itself | |
What the client proves itself with | |
Machine or chest screen the server opened for the local player (OpenMachine, MachineState, CloseMachine): where it is (or the container minecart it belongs to), its category (empty for a storage block or cart), its slots and progress | |
Maps the server sent (decision E-802), part of the world mirror: per map id its picture (QcMapData), the markers of its last update and a revision that grows with every update, so a drawn image of the map can tell it is out of date | |
One map as the client mirrors it | |
Minecart the local player rides (decision E-382) | |
Client side of one connection: distributes the server's messages to its parts (the world mirror QcWorldMirror, the entity mirror, the screens), drives the local player's parts (clientcore/player: prediction, hand, animation, inventory) once per tick and sends their requests | |
Editor of a sign the server opened for the local player (decision E-766): the sign's position and lines (QcMsg::OpenSignEditor), and the lines the player writes (QcMsg::EditSign) | |
Sounds of a client session: the cues of the last moments (oldest first, at most recentLimit), the player's own steps and the ambience loops around them | |
Stonecutter screen the server opened for the local player (decision E-785): its input slot and the stonecutting recipe chosen for it (decision E-784) as the server last sent them, and the choices the player makes | |
Trading screen of a villager the server opened for the local player (decision E-414): the villager, its profession, level and experience and its offers (QcMsg::TradeState), and the trades the player asks for | |
What the server last told the player about themselves (QcClientSession::vitals): health and whether they burn or are dead, food, experience (decision E-398) and air under water (decision E-955) | |
Weather as the client shows it (decision E-395): the strengths of rain and thunder the server sent, eased so a step of a message never jumps; the climate where the player stands; the flash of the latest lightning; and the thunder still on its way (sound travels 343 m/s, so a strike 170 m away is heard half a second after its flash) | |
Client-side mirror of the chunks the server sent | |
What the blocks of the loaded chunks take (memory statistics, decision E-813) | |
A control request that completes on a later tick | |
Control commands of the admin channel (decision E-848), for tests and automation: admin sends one request and answers with its result and the report it brought, adminFollow chooses the topics followed, adminStatus reports what arrived of them | |
Turns the player's view like a player moving the mouse | |
Typed access to the parameters of a control request | |
Control commands by name, each served by one of the command groups | |
State the control commands share: the session, the response output, the running command and the chat lines received while it runs | |
Control commands about entities: listing them, attacking or using an item on a creature, collecting dropped items, and riding minecarts | |
Control commands for virtual gamepads (decision E-540): connect and disconnect pads and set their buttons and axes, for scenario tests with a controller | |
Machine-readable control of a client session: newline-delimited JSON requests in, one JSON response line per request out | |
Control commands on the inventory and crafting: hotbar selection, slot moves, dropping and the recipe book | |
Control commands on machine and chest screens: opening, filling, emptying, closing and their state | |
Control commands that turn, walk and wait | |
JSON views of the session state that control responses report | |
Control commands about the player and the session: status, view mode, respawn, chat, sounds, loaded packs, the advancements, the debug data, the players on the server and the own look | |
Control commands for trading with villagers (decision E-414): opening a villager's screen, listing its offers, trading and closing | |
Control commands that query blocks and act on them: block queries, mining, using the held item on a block and lighting fire | |
One end of a debug line: position in the world and colour (RGBA bytes) | |
Debug visualisations as coloured line segments in the world (decision E-225): chunk and section borders, hitboxes with the view direction, where creatures are heading, and sections that were meshed again | |
What the debug display shows (decision E-225): its level, switched by the debug key, and the visualisations, each switched on its own in the debug options (like Factorio's F4) | |
Everything the debug display, the control interface and the statistics log show, at one moment (decision E-225) | |
Entities of the mirror by kind | |
Only in the graphical game | |
Block under the crosshair | |
Mean and the maximum duration of a phase since the previous snapshot | |
Debug display's text (decision E-225), translated: one line for the compact level, the general column (position, light, target, entities, chunks, memory, server) and the time column (client frame and server tick phases, mean and maximum, aligned for a fixed-width font) for the full level | |
What the game does when the graphics device is lost (decision E-963): a lost device while the realistic mode is drawn gives coolDownMs() of classic frames, a second one within repeatWindowMs of the first draws the classic look for the rest of the session | |
Time of day the clock shows as hours and minutes, sunrise at 6:00 | |
How the game window shows and how often it draws (decision E-835): the window mode, the screen it covers, the window's place in windowed mode, VSync and the frame rate limits for playing and for menus, a paused game or a window in the background | |
Lists of precipitation drops handed to the view in turn (decision E-397): the view keeps the latest, the renderer the one it last copied, so a third is always free to be filled again and a frame allocates nothing once the lists have grown | |
Clock the world's animations run on (decision E-962): campfire smoke, the runes and book of the enchanting tables, creatures' limbs, glowing creatures, boats and capes | |
A cube of an effect cloud as the entity frame draws it at a moment (campfire smoke, ink clouds; decision E-975): its centre and its edge length | |
What the enchanting tables near the player show in the world (decision E-884), as in the reference: a book floating above each table, turning towards the viewer and opening when the viewer comes near, and runes flying in an arc from the bookshelves that count (QcEnchantingTable) to the table | |
Floating book: the middle of its spine, the direction it faces (radians about +y, 0 facing +z) and how far it is open (0 closed, 1 wide open) | |
A rune in flight: where its middle is, which rune (QcRuneGlyphs) and how large (metres) | |
A table and the bookshelves that count for it | |
Clip planes of a camera, for boxes relative to its eye (decision E-883) | |
Light of an entity: sky light (scaled by daylight in the shader) and block light, both 0..1 | |
Triangles of all entities of one frame (or of the first-person hand), alpha-tested | |
An extra textured box worn on a bone of a skeleton model, in model space like the bone's own boxes: it turns with the bone and takes the figure's light and hurt tint | |
Where a block entity stands (its feet) and how large it is drawn | |
A sprite with thickness: size metres across, in the local space of a flat sprite (x across and centred, y up from 0 to size), one texel thick along z and centred on z = 0 | |
First-person view the hand is drawn for: the camera at eye looking along yaw/pitch (degrees), and the light there | |
Draws held items, in the first-person fist and in a figure's fist | |
Where a held item sits around the grip (decision E-831), resolved from the content's hold transforms (QcHoldTransform): a point of the item (a sprite one unit across, a block one unit per edge, relative to the grip) is scaled by scale, turned by rotate (degrees: Turn by y, then Rotate by x and z) and moved by translate, in metres in the frame of the fist | |
What a dropped item looks like this frame: alpha interpolates between the last two ticks, seconds is the client clock driving the animation, light the light at the item | |
Appearance of an item: a small cube with the block's face textures for placeable cube blocks, otherwise a sprite of the item texture | |
Where an item lies flat on a block (on a campfire, decision E-772): the middle of its underside, turned by yaw degrees, in light | |
What a skeleton model looks like: the model, an outfit, an optional hair style and cape, the colours that tinted layers use, and a uniform scale (models are built for 1.8 m) | |
How a creature of static boxes looks this frame (decision E-480): sitting (each part moves by its QcMobPart::sitOffset) and the colours its tinted parts take (the collar: QcTint::Collar) | |
Rotation around the X axis (positive moves -Y towards -Z), then around Z (positive moves -Y towards +X) and then around Y (positive moves -Z towards +X), all in degrees | |
Rotation around the Y axis by a yaw in degrees: the model faces -Z; yaw 90 faces +X | |
What the animator needs to know about an entity in one frame | |
Vertex of creature, player, item and hand meshes: like QcBlockVertex plus a tint colour that the texture is multiplied with (outfit colours, the red flash of a hit) | |
Flash and smoke of the explosions the server told about (QcMsg::Explosion, decision E-604): each explosion leaves a few bright puffs of fire that burst out and fade fast and more puffs of smoke that drift up and shrink, all as small cubes the entity frame draws | |
What a puff looks like at a moment (lookAt()) | |
Camera offsets of a shake, in degrees | |
Camera's height above the player's feet: it drops to QcPhysics::sneakEyeHeight while the player crouches and rises back when he stands up, at a steady speed over transitionSeconds, like the role model (decision E-961) | |
A figure's look with what it wears | |
Two presses of the jump key in quick succession toggle flying in creative mode (decision E-284) | |
Field of view widens while the player sprints and narrows again when the sprint ends, eased over a fraction of a second, like the model's "FOV effects" (decision E-280) | |
How the player moves this frame | |
Frame pacing of the game window (decision E-835): with a limit, frames start at most that many times a second, on a grid so that early or late frames do not change the rate; without one (0), every frame is due at once | |
Pictures of the maps in item frames (decision E-809), one texture for all of them: a grid of columns x columns tiles of QcMapData::size pixels, one per map id drawn this frame, so every framed map is drawn with the same texture and a wall of them costs one draw call | |
One tile as the renderer uploads it: the picture (RGBA8888, QcMapData::size squared, null for a tile never drawn) and a version that changes with every new picture | |
Player settings of the graphical game, stored as an INI file in the data directory | |
Volumes of the sound and whether it is muted, stored as audio/<key> | |
A gamepad steering the player (decision E-541): the left stick walks with stepless speed, the right stick looks, the triggers mine (right, also attacks) and use (left), the shoulders step through the hotbar, the stick clicks sprint (left) and toggle sneaking (right; held while flying, where it descends), south jumps and a double tap of it toggles creative flight | |
A connected pad: the id stays the same while it is connected and is not reused by the source | |
Default bindings (Auftrag point 40, decisions E-541 and E-580, after the console layout of the model): south jumps (double tap: creative flight), the left stick click sprints, the right stick click sneaks, the shoulders step through the hotbar; start pauses, north opens the inventory, east drops, west picks the block in view; the d-pad holds the radial menu (left), switches the camera (up), opens the chat (down) and the handbook (right); back holds the player list | |
A button combination (decision E-692): button pressed while the button of modifier is held runs action instead of the button's own action, for that whole press | |
Forward (positive) and strafe right (positive) from the shaped left stick (y positive down) | |
What a pad does on the screens (decision E-583), without a window: the d-pad or the left stick move the focus (held: repeated after repeatDelayMs every repeatIntervalMs), south confirms, east goes back, west and north are the secondary actions (in slot screens: one item, quick move), start, and the shoulders switch tabs; the right stick scrolls | |
How one pad steers the player (decisions E-541, E-610, E-611): dead zones, outer zone and response curve of sticks and triggers (QcGamepadResponse), the turning speed of the right stick at full deflection, whether pushing it up looks down, how far a trigger is pulled before it acts, whether the pad vibrates and the buttons of the actions | |
How raw stick and trigger values become input (decision E-540): a radial dead zone around the centre (the stick's direction is kept, only its length shrinks), an outer zone that already counts as full deflection (worn sticks do not reach 1), and a response curve (length to the power exponent: 1 linear, above 1 finer control near the centre) | |
Gamepad part of the settings (decisions E-541, E-610, E-611): the profile all pads use (standard, stored as gamepad/<key> as before), the pad models with a profile of their own (by SDL's GUID, stored as gamepadControllers/<n>/<key>, at most maxControllers) and whether the hotbar shows only the slot in the hand (radialOnly, decision E-614) | |
A pad model with its own profile; name is the pad's name when the profile was made | |
Gamepads the client sees, behind one interface (decision E-540): the SDL3 backend of the game (QcSdlGamepadSource in src/app/input, polled on a Qt timer) and the virtual pads of tests and the control interface (QcVirtualGamepadSource) look the same to the input mapping | |
One pad's buttons and axes at one moment, normalised and independent of the backend | |
What the local player's hand does: the block and the entity under the crosshair, mining the targeted block (survival progress and hit sounds, instant breaking in creative mode), using the held item on a block, an entity or itself, drawing and releasing a launcher (QcClientLauncher) and attacking | |
What the hand reads of the session: the predicted player, its items and the entity mirror | |
Turn of arm and item about the shoulder in degrees, in the camera's frame: pitch positive lifts the arm (its forward end up), negative strikes down; yaw positive turns it inwards towards the crosshair; roll positive turns it in the picture's plane, counter-clockwise as seen, so the head of a tool held in the lower right corner comes down and to the left, towards the lower middle of the screen | |
Phases of a swing: the progress at which the wind-up ends (highest point), the strike ends (lowest point, the blow) and the recoil ends, and the pitch at those points | |
Progress of the own player's hand animations in one frame (QcClientSession::handTimers): switching the held item, landing and using; 0..1 while running, negative otherwise. aim is how far the hand has come to a drawn launcher (decision E-984) | |
Radial menu of the hotbar on a pad (decision E-581): held open by a button, the hotbar's slots sit on a circle, the right stick points at one and letting go of the button selects it | |
How far the view tips: pitch up and roll clockwise (the head leaning to the right), in degrees | |
Clouds of ink that struck squids leave in the water (decision E-974): a creature whose kind has an ink texture (QcMobDefinition::ink) and whose move says a blow struck it (QcMsg::EntityMove::struck: an attack, a projectile, an explosion; not burning, drowning or suffocation) leaves a few dark puffs around the middle of its body as drawn that drift apart, swell and shrink again within about two seconds, drawn as small cubes like the smoke of explosions | |
One puff of a cloud | |
Player's key table for QML: the rows of the controls page, the key texts of hints, key tests for screens and rebinding | |
Texts the UI shows for keys and actions, in the UI language | |
Servers this installation trusts (decision E-872), like SSH's known_hosts: the fingerprint of each server's certificate (QcTlsFingerprint), pinned at the first connection (trust on first use) under the normalised address (keyOf(): every spelling of one address is one pin) | |
Picks the world labels to draw (decision E-222): those within reach of the camera (titles from further away), in front of it and not hidden behind an opaque full block, at most maxShown of the nearest | |
Client's measurement of the round trip to the server (decision E-886): every half second a LatencyProbe, answered by the server at once with a LatencyEcho; the round trips go into a QcRoundTripStats of the last ten seconds | |
Sky and block light of the cells around one position, for the debug display (decision E-225): sky light shines with 15 into every cell above the highest cell of its column that stops light coming straight down (QcLightPassage) and spreads like block light, by the same rules as the mesher's light | |
Connection as the health line sees it (decision E-834): the round trip of player inputs (from sending one until a player state acknowledges it, so it includes up to one server tick) and the bytes of the connection | |
What take() hands out | |
Animation of the local player between server updates: the timers of the arm swing, using, switching the held item and landing (in ticks, negative while not running) and the distance walked for the stride | |
Sounds of the local player's own movement, made on the client without a server round trip: steps on the block underfoot, jumps, landings, swimming strokes and splashes into water | |
Material maps of the texture atlas (decision E-908): a normal atlas and a specular atlas in the labPBR encoding (QcMaterialSynthesizer), with the colour atlas's layout, so the block shader reads them at the same atlas coordinates | |
Surface of one procedural texture for its material maps (decision E-908), before it is painted per texel by QcMaterialSynthesizer | |
What the texels of a second colour get (the ore in a stone, decision E-908): the texels nearer to the definition's secondary than to its primary colour | |
Colours of the definition that tell an inclusion (the ore) from its ground (the stone) | |
Normal and specular maps of one tile, or one mip level of both material atlases (QcMaterialMips::halve) | |
Immutable snapshot of everything needed to mesh one section: the chunk and its eight neighbours (for faces and ambient occlusion across chunk borders) | |
Sky and block light of the 3 x 3 chunk neighbourhood around one section, as the chunk mesher reads it | |
Blocks of the 3 x 3 chunks around a section as the chunk mesher reads them (QcMeshInput), by chunk-local coordinates | |
Vertex and index lists of one render layer of a chunk mesh, which the chunk mesher appends its quads to | |
Keeps section meshes in sync with the client world | |
How quickly block changes reach the screen (benchmark): time from a change until every section it made dirty has a new mesh, the largest number of sections and light jobs waiting, and the time the light thread spent | |
When the mouse is captured for looking around, as a small state machine without a window: the game asks it after every change of the screens and before acting on a mouse button | |
What the game is doing now, as far as the capture cares | |
A light that moves with what carries it (decision E-902): a torch in a hand, a glowing item on the ground, a firefly | |
Background music composed from a seed: a calm piece on a pentatonic scale with a melody of varied motifs (A A' B A), a slow bass line and soft held chords, ending on the root | |
One note of a piece | |
A composed piece | |
Joins a network game (decisions E-251, E-252, E-872): connects over TLS to the address, checks the server's certificate against the pin in the known servers (pins it at the first connection), logs in with the credentials and hands over the session once the server welcomed the player | |
Moving lights as the shaders take them (the frame uniforms, decision E-902) | |
Lists of a section mesh (QcChunkMesh) packed for the GPU into one vertex and one index range (decision E-813), which the GPU mesh store places in a page shared with other sections (decision E-820) | |
Where a glyph is: its page, its cell in the page (0..3, row by row), the first column with pixels and the number of columns it takes (0 for a space) | |
Hotbar's radial menu with the mouse (decision E-614): while its key is held the mouse does not turn the view but moves a pointer from the centre, and the direction of the pointer picks the slot like the pad's right stick (QcHotbarRadial) | |
Mixer voices of positional sounds with where they sound, so that their loudness and stereo position follow the listener while they play (a thunder roll or an explosion lasts seconds, and the listener turns and walks meanwhile), and at most a few voices of one sound at a time, so that dozens of sources of the same sound (flowing water all around) never pile up | |
A voice that follows its source | |
One particle as the precipitation renderer draws it, an instance of 16 bytes: the lowest point of the particle, whether it is a snowflake (else a raindrop) and its opacity (decisions E-395, E-397) | |
Rain and snow around the camera (decision E-395): up to a budget of particles in a box around the eye, falling, each only where the sky is open above it | |
A falling particle | |
Prediction of the local player: the movement intent, the inputs the server has not acknowledged yet, the predicted motion one tick ago and now, and the reconciliation with the authoritative state (corrections, decision E-257) | |
What the preview item knows about itself and its window | |
View of the character preview: the figure stands at the origin and turns on the spot (dragging turns it), the camera looks at it from +Z along -Z and zooms from the whole body to the head | |
Test hook –preview: fixes what every character preview shows, for reproducible screenshots (one per animation, side, zoom and gaze) | |
Frame pacing of the character preview: it draws only while it is visible and at most at its frame rate, so an open screen with a preview adds a small, bounded load and a hidden one none | |
Head angles against the body in degrees: yaw positive to the figure's right, pitch positive up | |
What the preview shows of the player | |
Creatures whose bodies push the local player (decision E-882), as the tick core of the session knows them (QcSessionCore): the latest place and pose the server sent for each, not the interpolated past the entity mirror shows (QcClientEntities). The server pushes the player with the creatures as they stand after its last tick when their input arrives; the client's newest places are about a round trip older than that. So each creature is moved on along its last step (its move between the last two places the server sent; it sends every visible creature in every tick) for as many ticks as the input leads, at most maxLeadTicks and maxLead: for creatures that stand still the prediction pushes exactly as the server does, for walking ones it misses only by how much their step changed during the round trip | |
Shading, sky light and block light given to all four vertices of a quad | |
Normal and material written into the surface byte of a quad's vertices (decision E-390) | |
Reports an action the game mode refused (adventure mode, decision E-735) at most once in reportTicks ticks, so that a held button does not flood the HUD with notices | |
How the world is drawn (decision E-899): the classic look or the realistic render mode (stage 45) with its quality and exposure | |
Material maps of the realistic mode (decision E-908): relief from the normal maps, smoothness, metal and reflectance for the sun's highlight and the sky's reflection, light of its own (maps); with lightHighlights the moving lights also make highlights | |
Sun's shadow map (decision E-903): cascades side by side in one depth texture of resolution squared tiles, reaching distance blocks from the camera, filtered with filterTaps hardware-compared lookups (1, 4 or 9) per pixel | |
Water of the realistic mode (decision E-906): wave octaves of the surface's normals, how far the refraction bends the picture behind it (0: straight through), the steps of the screen-space reflections (0: sky and sun only) and the strength of the caustics on the ground under shallow water (0: none) | |
How much of a clue a reader can make out: its letters (no spaces) and how many of them are readable | |
One character of a clue as the screen draws it: a rune (its index), or the readable character (rune -1) | |
Mono PCM audio in [-1, 1] | |
Picks the screen a scripted run opens its window on (–screen / QTCRAFT_SCREEN) and places the window fully inside it | |
A screen as the platform describes it | |
A world label as drawn this frame: where on screen (pixels from the top left), how large and how opaque | |
Block and sky light of the cells of one meshed section, as the mesher saw them, for shaders that read light per cell (decision E-390; today's shaders read the light baked into the vertices) | |
What the client knows of the server's debug data (QcMsg::ServerDebug, decision E-225): the latest message and the durations of the latest ticks for the tick graph, each tick once (a message reports the ticks up to its own; those the graph already has are skipped) | |
What the session asks of its tick core (QcSessionCore), in the order it asked (decision E-560) | |
The connection (after the messages sent before) | |
Blocks the local player's action numbered sequence is expected to set, shown in the core's block mirror too (QcBlockMirror::predict, decision E-853); sent before the action | |
Forget the largest correction so far (QcPrediction::resetCorrections) | |
A message to the server | |
Player's wish to fly (QcClientGameMode::setFlightWanted) | |
Movement intent for the next ticks (already cleaned, QcPrediction::setIntent) | |
Sends Hello and starts ticking (TickMode::Timer) or waits for tick() (TickMode::Manual) | |
Part of a client session that keeps time (decision E-560): the connection to the server, the ticks on the 50 ms grid (QcTickPacer) and the local player's prediction with what it needs, its own mirror of the blocks (sharing the immutable chunks, with the player's predicted blocks, decision E-853) and of the creatures that push them (QcPushBodies, decision E-882), the game mode's wish to fly and whether the player is dead | |
What the session's tick core (QcSessionCore) tells the session, in one ordered stream (decision E-560): the server's messages as they arrived and, between them, the predicted ticks and the reconciliations of the local player | |
Connection closed; error is the protocol error or the transport's reason (may be empty) | |
Prediction as the core holds it now, and how far the core is with the session's commands | |
A message of the server (every one but PlayerState, which comes as Reconciled) | |
Server's state of the player was applied to the prediction | |
One tick ran on the core: the player was predicted (unless dead) and the input sent | |
Session's side of its tick core (decision E-560): owns the core and, when it ticks on a thread of its own, that thread | |
Thread a session's tick core runs on (decision E-560), named "session tick" | |
One cascade of the shadow map: a square box in the light's space around a sphere near the camera | |
Light's axes: right and up span the shadow map, toLight points to the light | |
Light that casts the shadows of a frame (decision E-903): the sun by day, the moon (weaker) by night, faded out near the horizon and under clouds so that the switch between them is never seen | |
Text quads of the signs of the loaded chunks (decision E-766), kept from frame to frame: a sign's quads are built again only when its text or its colour (decision E-830), its block (state) or its light changes, or when the atlas they are cut from is replaced | |
Front of a sign's board: the middle of the text, the direction to the right of a reader, and the direction the front faces (up is +y) | |
Look of the sky at a moment of the day, as a pure function of the world time: colours of the dome, where sun and moon stand, the moon's phase and how visible the stars are; how far the clouds have drifted follows the world's animation clock instead (QcSky::withCloudDrift, decision E-968) | |
Recent server snapshots of one entity's motion, by server time (decision E-271), and its pose at any moment between them: interpolated between the two around it, extrapolated along the last movement for at most extrapolationMs past the newest one, then held | |
Motion of the entity at one moment of server time | |
Chooses the moment of server time at which the client shows other players and creatures (decision E-271) | |
All sounds of the content, rendered once | |
A sound the client should play now: from a server SoundEvent or made by the client itself (the player's steps, jumps, mining strikes) | |
Loudness and stereo position of a sound at a world position, heard from a listener's ears | |
Where the listener's ears are and which way they look | |
How a sound is heard | |
A positional sound as the engine places it: where it sounds, how loud at the source (the definition's volume times the cue's) and how far it carries (the definition's range, longer for cues louder than 1, as the server sends them) | |
Renders sound definitions into PCM | |
Whether the player sprints, from the keys, as in the model (decision E-280): a press of the sprint key while moving forward, or a double tap of the forward key, starts a sprint, which then lasts while the forward key stays held, also after the sprint key is released | |
Opaque texels of an item sprite (decisions E-831, E-991): a held or dropped item is drawn as its sprite with sides one texel thick around these texels, and the hand grips it where they say | |
A corner of the solid form: point in the local space of a sprite one unit across (x across and centred, y up from 0 to 1, z through it and centred on 0), texture in the unit square of the picture (x from the left, y from the top) | |
A quad of the solid form: its corners counter-clockwise seen from outside and the light of the way it faces | |
One side of an extruded sprite, a texel long: the opaque texel and the way its side faces | |
Shapes of item sprites in a texture atlas (decision E-831), each cut from the atlas on first use, at the atlas's own resolution up to maxTexels so that sides and picture agree (decision E-991), and kept until the atlas changes | |
Statistics log (decision E-225): every interval one line "STATS {json}" in the log (category qtcraft.stats), with the debug data as QcDebugJson writes it, so scripts and agents read the same numbers as the debug display | |
A stick's deflection: x positive to the right, y positive downwards, each in [-1, 1] | |
One thread: from the middle of the parent's body to the middle of the child's, with the texture | |
Which parent each child of a family is tied to on the client, from frame to frame (decision E-839; the Kjut's threads, drawn by QcTetherMesher) | |
All content textures in one image with its mip levels (decision E-300) | |
Where the tile at an index of the layout came from (decision E-908): the index of its definition in the content's textures (-1 for the placeholder and the tiles the game draws itself) and the id of the pack that gave it ("" for the content) | |
Limits and settings for building a QcTextureAtlas | |
How much detail a pattern gains above 16 x 16 | |
A loaded texture pack (decision E-297): its manifest and the textures it brings, keyed by the content's texture name ("qtcraft:stone") | |
A pack folder found by scan() | |
A stack as loaded, and the ids that could not be loaded | |
A folder whose subfolders are texture packs | |
A checked PNG texture: the first frame at the pack's resolution and how many frames the file had, the frames after the first at the same size (a vertical strip animates, decision E-878) | |
Pack must keep, checked while loading | |
Manifest texturepack.json of a texture pack (decision E-297): what the settings show and the resolution every image of the pack must have | |
Who made (part of) the pack, for packs with material of several authors | |
One problem found while loading a texture pack: the file it concerns (relative to the pack, "" for the pack itself) and a message | |
A texture taken from the source that gives it, with its animation | |
Data description of a procedurally generated block/item texture | |
A preview image read before, with the modification time of its file | |
What one run() is asked to do | |
What one run() produced | |
Generates deterministic pixel-art textures from a QcTextureSpec | |
Due times of the client session's ticks (decision E-560): a fixed grid of one tick interval from the start, like the server's (QcTickScheduler, E-090) | |
Punctuality of the client session's ticks (decision E-560): how late each tick ran against its due time on the 50 ms grid, and how many due ticks never ran | |
Punctuality so far | |
Places of a tree and its size | |
Where a node of the tree stands | |
Text and background roles of controlPalette() that controls draw together | |
A text colour over its backgrounds: layers from the world upwards (the first one lies directly on the world) | |
Gamepads fed from outside (decision E-540): unit tests and the control interface (gamepadConnect, gamepadSet, ...) connect pads and set their buttons and axes; the input mapping cannot tell them from real ones | |
A vibration asked for (rumble()) | |
What one frame's water is drawn with | |
Std140 layout of the Water block of water.frag and water_behind.frag (decision E-906) | |
World as the server sends it (part of QcClientSession, decision E-717): the content, the blocks of the loaded chunks with the local player's predicted changes on top (QcBlockMirror, decision E-853; QcClientWorld, there from the content on), what the chunks carry besides their blocks (QcChunkExtras), the world time and the weather |
Detailed Description
Uses qc_common and qc_network; never a server header.