qc_server
The authoritative server: tick, world, chunks, mobs, plants, commands, saving. More...
Namespaces
Whether an event or a player's state meets the conditions of a criterion (decision E-923) | |
Rules between the blocks of a world and its block entities, checked in one place (decision E-357; tests call it after their scenarios, a broken rule is a bug) | |
Block entities of one chunk as a blob of its region file (blockentities/r.<x>.<z>.qcb; decisions E-358, E-373): containers and machines with their contents, saplings, what circuit components remember, scheduled ticks, positions the circuits wait to look at and pending block updates | |
Turns the block entities of a running world into the records saved per chunk and back (decision E-358): ticks become ticks left (or since) at now and absolute ticks again when read | |
Boats of one chunk in its entity blob (decision E-920): after the item frames and paintings (QcHangingCodec), so blobs written before boats read unchanged | |
Blocks of one chunk as a blob of a region file (decision E-373): a palette of block state names ("name[property=value,...]") local to the chunk and the sections in the protocol's chunk encoding with indices into it, compressed | |
Groups of chunks that circuits or machines connect (decision E-375): the chunks reached from one over links (QcChunkLinks::linked) load and unload as a whole, at a tick boundary, so a machine never runs with a part missing | |
Parsing of command words shared by the commands | |
Components of a saved entry (decision E-420): after the entry's header a count, then per component quint16 id, quint16 version, quint32 length, payload | |
Components of a creature entry in the entities of a chunk (QcEntityCodec, decision E-420): health and breeding (Creature), the villager record, status effects, the carried block, the enclosure, the golem's builder, the laying timer, the tame state, a creature without a mind and the parent of a child of a kept family (decision E-839) | |
Rules of the entity register, checked in one place (decision E-364) | |
Entities of one chunk as a blob of its region file (entities/r.<x>.<z>.qen; decisions E-366, E-373, E-420): persistent creatures, dropped items and waiting drops, falling blocks and lit explosives, armour stands, minecarts (E-382), experience orbs (E-398), projectiles (E-425), and whether the chunk already got its animals, then item frames and paintings (E-793) and boats (E-920) | |
Turns the entities of a running world into the records saved per chunk and back (decisions E-366, E-374) | |
How an explosion reaches blocks and bodies (decision E-602), pure so that craters and exposure are testable on their own | |
Rules of fire (decision E-392), shared by QcServerFire and the tests: where fire may stand, how readily it catches on near flammable blocks and its deterministic dice | |
Puts the world generator's chest loot, spawner kinds and minecarts (decision E-570) into a chunk that arrives (decision E-520, QcWorldGenerator::furnishingIn), once per chunk: the chunk is marked furnished and the mark is saved with its block entities, so a chest emptied since stays empty and a cart taken away does not come back | |
Game rules of a world (QcWorldInfo, world.json "gameRules") as /gamerule and the admin channel's settings see them (decision E-848): a switch or a number from 0 to highest, each with its group, its default and what it does | |
Who iron golems attack among the players (decision E-471), a light form of the reference game's popularity: a player who hurts a villager of a village, or a golem standing in a village's area, gives that village a grudge against them for the village style's grudgeSeconds (QcVillageGolemSettings), renewed by every hit; the village's golems attack them on sight while it lasts (QcGolemBrain::enemy) | |
Item frames and paintings of one chunk in its entity blob (decision E-793): after the flag whether the chunk was populated, so blobs written before them read unchanged | |
Where item frames and paintings may hang (decisions E-790, E-791): on solid blocks, in cells without collision or liquid, not over another frame or painting on the same face | |
Data of an item stack in save files (decision E-823): the components of QcItemData framed like the components of entities (QcComponentFrames, decision E-420), so a version keeps what it does not know | |
Server checks that a player can reach and see what they act on (decision E-092): the same voxel raycast the client aims with (QcRaycast, visible blocks; liquids do not block) from the eye towards sample points of the target | |
One map in the world folder (decision E-799), maps/<id>.qcmap in the save file container (QcSaveFile): its scale, centre and world ("overworld", the only one so far), the names of the blocks it shows and its pixels as indices into that list with their shades, compressed | |
How a map is revealed (decision E-800), as in the reference: a player holding a map looks at the pixels within revealRadius blocks of where it stands, each tick at every sweep-th column of pixels (another one each tick), so a map fills in over sweep ticks while its holder walks and each tick costs little | |
How minecarts meet each other and living bodies in a tick (decision E-382), worked out from the carts as they were before any of them moved, so the order of the table does not matter: carts that run into each other bounce along the line between them and pass most of their speed on, living bodies push carts away (a cart never moves a body), and after the carts moved, none of them ends deeper in a cart it overlapped, so carts pushed against a blocked cart stop instead of sinking into it | |
How a minecart moves in one tick (decision E-382), for one cart on its own: on a rail it follows the track from end to end and on into the next rail whose end meets it (also up or down a slope), keeps its momentum, speeds up downhill and slows uphill and loses speed to drag | |
Damage of crammed cells (game rule maxEntityCramming, decision E-401): creatures in a cell with more than the limit are hurt while it still holds more (counting those that died this tick), each only in every phases-th tick, staggered by its id | |
Data the creatures exchange with the rest of the server (decision E-422): what they know of the players (PlayerView), the blows and block changes their brains decide in a tick and the server carries out after it (PlayerHit, CreatureHit, BlockAction), and a persistent creature as saved with the world (Stored) | |
What frightens a creature away (decision E-480): a shy one (QcMobDefinition::shy, the ocelot) flees from players who come close unless they hold its food and move slowly; one scared of cats (QcMobDefinition::scaredOfCats) flees from creatures that frighten (cats) | |
How hovering creatures move (QcMobDefinition::hover, decision E-839; the Kjut): without gravity, at their hover height above the ground or the liquid below them (bobbing gently), lower under a low ceiling and never higher than their highest hover above the ground; they fly towards where their brain wants to go, rise over a wall in their way and turn slowly to face where they go | |
Where a creature on a long walk goes first (decision E-423): a path search reaches only so far (QcPathPlanner), so a walk to a goal farther than the routes' reach goes in legs, each to a cell the routes name (a villager's: the roads of its village, QcVillagerRoads) | |
Following a creature's path (decision E-400): it walks from waypoint to waypoint with the shared physics (jumping where the next waypoint is higher), checks that the next waypoints can still be stood on, notices when it makes no progress, and asks QcPathPlanner for a new path when the goal moved, the path is blocked or it got stuck, a chase path is old, or a partial path ended | |
How creatures of QcMobManager pick a player to chase and strike it | |
How creatures teleport (QcMobDefinition::teleport, decision E-460): to a random safe place (QcSafeSpot::randomAround) within the kind's range around them or around a point (an angry one next to its target), at most once per cooldown, never when confined or without a mind (decision E-510) | |
Rules that keep the creatures of QcMobManager in the world or take them out: despawning and leaving blocks a creature stands in | |
Name tags on creatures (decision E-866): a name tag with a custom name (written at the anvil) used on a creature gives it that name, shown above it and in its death message; a named creature is kept (QcCreature::persistent), so it never despawns and is saved with the world | |
How creatures go through open doors and trapdoors (decision E-905), part of QcMobNavigator: a panel standing in a cell (an open door's leaf is 3/16 block thick) leaves a 0.6-wide body only 1.25 cm beside it at the cell's middle, so the creature steers to the middle of the free opening beside the panel (QcPathGap) instead, and keeps to it as long as its body overlaps the cell | |
What a block state is to a walking creature looking for a path (decisions E-400, E-402), one byte per state, computed once from the content: the kind of cell, two flags and the height of a low block (or, for a solid block, whether it is slippery) | |
Standing and passing on the cells of a source with quint8 cell(QcBlockPos) and QcPathGap gap(QcBlockPos) (the cached window of QcPathWindow, or the world directly through QcPathDirectCells) | |
Who owns tame creatures (decision E-480): a player's persistent identity rather than an entity id, which changes with every login | |
Plans of pistons (QcPistonPlan) against the world before anything moves (decision E-337) | |
What is saved of a player and how it comes back (decision E-367): the state of a connected player as a QcPlayerData for QcPlayerStorage, and a saved one put onto a player who joins again | |
One tick of a projectile's flight (decision E-425), pure so that trajectories and hits are testable on their own | |
One region file of a world (decision E-373) | |
Safe places for bodies that teleport (decision E-460): a shadewalker's jump and the thrower of a shade pearl | |
Binary save file container shared by every world file except world.json: [magic][quint16 version][quint32 payload size][quint32 crc32][payload] | |
Applies a world generator's one-time setup to a world that was just created (decision E-221): time of day and game rules, persistent creatures, contents of chests and machines, block updates (queued like those of a command; they wait for their chunks) and growing saplings | |
Light test of monsters (decision E-836), as in the original game: a cell is dark enough when its sky light passes a random draw of 0..31, its block light (torches) is at most the rule's maxLight (0 for monsters) and its brightness, the larger of block light and the sky light less the darkening of the sky by time and weather, is at most a random threshold of 0..7 | |
What the server holds a spectator to (decision E-730) beyond the rules of the shared physics and the body that others do not see (QcServerClient::hasBody): which of the player's requests are dropped, and where a player who stops flying through blocks comes out | |
Properties of an armour stand that commands, structures and a later stand screen change (decision E-239), each checked here: "pose <part> <x> <y> <z>" (angles finite, normalised), "rotation <degrees>", "arms|plate|small|showname <true|false>", "name [text]" (cleaned, at most QcArmourStandManager::maxNameLength code points), "equip <set|item>" (armour into its slot, anything else into the hand), "cape <cape|none>" (an appearance of the kind cape), "clear" (takes everything off, the cape too) and "reset" (pose and flags) | |
Room for a swimming body in the water (decisions E-502, E-972): where a creature that lives in water fits with its whole box, and which moves keep it there. Shared by QcSwimRoutes and the swimmers' steering (QcFishSwimming) | |
One use of an item that wears (decision E-864): a tool mining, a weapon hitting, a bow shooting | |
A villager's record as the villager component of its creature's entry (decisions E-411, E-414, E-420): its village, home, workstation, profession, level, experience, look, the crops it brought in (version 1), then the uses and demand of its offers and its last restock (version 2), then when it last slept (version 3, decision E-470) | |
Beds and workstations of villagers in the village state (decision E-411): a villager claims a bed and a workstation under its creature's persistent id (holder, QcCreature::uid, decision E-420; QcVillage::Spot::claimedBy) and counts in the village's population | |
What a villager looks like (decision E-411): the look of its village style (the default look of its species, villagers/<name>.json, for a style without one), its profession's outfit (the style's outfit with the profession's layers, QcVillagerOutfits) and hat in place of the style's hair, and one of each of the style's hair styles and colours drawn from the villager's seed | |
Weather's course as a pure function of the world seed (decision E-395): after a clear spell comes rain or a thunderstorm, after them a clear spell again; the kind and length of each spell follow from the seed and the spell's number, so the same world has the same weather whatever happens in it, and /tick steps through it exactly | |
A copy of a saved world folder (decisions E-246, E-256) |
Classes
Who may join a world and who is an operator (decision E-244): operators, banned names and the whitelist, kept in access.json in the world directory and written at once with every change | |
A banned name: the name, the reason, who banned it, since when, and the fingerprint of the banned identity (empty until known) | |
Reports of the admin channel (decision E-848), built from the server's state as it is now: status, players, command catalogue, access lists, settings and the log's lines | |
Lines (QcMessageLog) and the number of the newest line looked at: the next call asks for the lines after it, so none comes twice | |
Status history of the admin channel (decision E-848): the durations of the ticks since the latest sample, and the samples of the last secondsKept seconds (one a second) and of the last minutesKept minutes (one a minute, the seconds of the minute folded by QcAdminSamples::folded: means of the means and rates, the highest p99 and maximum, the latest counts) | |
What the server counts at the moment of a sample | |
/advancement (decision E-923), for operators: grants or revokes an advancement of a player (every criterion of it), or all of them with "everything", and shows what a player has reached | |
A game event as the server's gameplay reports it to the adventure guide (decision E-923, QcServerAdvancements::trigger): the kind of event and the content names it involves (empty where the event has none) | |
Where a player stands, as far as the location criteria ask (each field filled only when needed) | |
/adventure (decision E-735), for operators: shows and changes the world's allow-lists of adventure mode, which item kinds may break which blocks (canBreak) and act on which blocks (canPlaceOn) | |
Brain of archers (QcMobDefinition::Ai::Archer, decision E-426): they pick a target like hostile creatures, walk towards it while it is out of sight or farther than keepDistance, back off from it within minDistance and circle it sideways in between | |
What an archer (QcMobDefinition::Ai::Archer, decision E-426) does between ticks: its draw, the side it circles to, where it last saw its target (for the lead of its shots) and its drink | |
An armour stand (decisions E-238, E-364): wears armour, holds an item and has a pose; it has no AI, no health and no physics of its own and stands where it was placed until something pushes it | |
Armour stands of a world (decision E-238): placed entities that wear armour and hold an item, with a pose, but no AI, no health and no physics; they stand where they were placed | |
Copies world snapshots in a background thread (decision E-256), one at a time, so /backup does not hold up the ticks | |
Block side of explosions (decision E-602): the cells a blast breaks wait in order and are worked through at most explosionBlocksPerTick per tick (QcServerLimits), the rest in the next ticks; nothing is ever lost on the way, but a cell whose chunk left the world in the meantime is skipped | |
What a blast does to the cells it breaks: drops each with dropChance (the reference game's 1 / power) and, with fire, lights one in three that stands on a solid block | |
What a blast does to players and creatures (decision E-602), like the reference game: a body within twice the power of the centre takes an impact of (1 - distance / (2 × power)) × exposure, the share of points of its box that see the centre past solid blocks (QcExplosionRays::exposure) | |
Bodies a blast hurt | |
Blocks around one explosion as its rays see them (decision E-602), each cell looked up in the world once and then read from a flat cache: a blast's rays cross most cells several times (steps of 0.3 blocks), and the sight lines to bodies cross them again | |
What explosions need to know about every block state of a content (decision E-600), looked up once: how much of a blast's force it soaks up, whether it stops the sight of a blast on bodies (solid blocks do) and whether it is an explosive that a blast lights instead of breaking | |
Commands that change blocks (decision E-245): /setblock, /fill (optionally only replacing one block), /clear and /regenerate | |
A dye used on a block that takes colours (decision E-765): the block's dyeProperty (the colour of the signal indicator light) becomes the dye's colour (QcItemDefinition::dye), and the player gives one dye (not in creative mode) | |
State that belongs to single blocks of the world (decision E-357), filed by chunk so that it moves, drops, is forgotten, saved and loaded with its chunk: the contents of containers (chests, barrels, hoppers with their cooldown, dispensers) and machines (furnaces), the timers of growing saplings, the memory of circuit components (torches burning out, openers last seen powered, pistons in the middle of extending) and the scheduled ticks of components | |
Everything of one chunk (a copy, see chunk()): its containers, machines, saplings and memories by position | |
Positions of a chunk's entries by kind: the entries live in one table per kind, so lookups and ticks are one hash access, and everything of a chunk is found without a scan | |
Contents of a container block (chest, barrel, hopper, dispenser) | |
State of a machine block (a furnace): its slots, fuel, work and experience | |
Growth timer of a sapling block | |
A blob that fits its limit, and the warning when the parts kept for a newer version or a mod were left out to make it fit | |
What the loaded chunks keep about their block entities besides the entities themselves (part of QcServerWorld, decision E-716); saved with the chunk and forgotten with it | |
Every table of block entities of the world, whose entries kept tails belong to | |
What the saved block entities of a chunk hold that this version does not read (decision E-440), held per chunk by QcServerWorld while the chunk is loaded and written back unchanged: tables of unknown ids and the tails of newer versions of known tables (tables, QcComponentFrames), and the tails of entries of a newer version (entries, by position; each component's id is its table) | |
What is saved of the block entities of one chunk (decision E-358), with every tick counted from the moment of saving, so clocks go on where they stopped when the world opens again | |
What a circuit component remembers; torches' recent switching is not saved | |
A scheduled tick of a circuit component: its cell, the ticks left and its priority | |
Exact positions of the loaded blocks of some marked states (Signal Hoppers, decision E-344), kept up to date as chunks arrive and blocks are set, so that a tick never scans sections for them | |
Screens of containers and machines the players have open (chests, hoppers, dispensers, furnaces, container minecarts): opening, closing, sending their state | |
Slots of an open chest (a block at pos), container minecart (cart, decision E-386) or backpack opened from the hand (heldSlot, decision E-833) | |
Per-tick block simulation of the server: queued neighbour updates (connections, lost support, starting falls through QcServerFallingBlocks, fire that lost its place going out) and liquid flow | |
Pending neighbour updates (connections, lost support, liquid flow) of the server, in a queue of player actions and a queue of commands and their cascades | |
A pending neighbour update | |
A boat (decision E-920): floats on water, falls without it and moves by the shared boat physics (QcBoatState) | |
Boats of a world (decision E-920), the table of their kind in the entity register: adding, finding and removing them within the world's limit, and the step of the boats nobody drives: they push each other apart, living bodies push them, and each moves by the shared boat physics | |
Players and creatures on fire (decision E-393) | |
Boxes sorted into the columns of a horizontal grid (decision E-920), so a box is compared only with the boxes in the columns it covers instead of with every other: the boats that push each other and the creatures a boat picks up | |
Items cooking on the lit campfires of the loaded chunks (decision E-772): one entry per campfire that holds an item, filed by chunk so that they are saved, unloaded and loaded with their chunk (QcBlockEntityRecord::Table::Campfires) | |
One place on a campfire and the item cooking there | |
Items that left a campfire with its entry, to be dropped at pos | |
Latest chat lines everyone on the server saw (decision E-848): players' chat and /say, with when and from whom, numbered in the order they came, for the admin channel's chat view | |
Commands that bend the rules for operators (decision E-243): items, creatures, health and food, armour, stands, minecarts and boats, time, game rules, the game mode and finding biomes | |
Chunks kept loaded on purpose (decision E-377): /forceload add|remove|query, by block coordinates (~ relative to the player) of one chunk or of the corners of an area | |
Chunks of one group | |
Reading and writing the chunks of a world in the background (decision E-373), so the server tick never waits for the disk: one thread owns the QcChunkStore and runs every request in the order it was made, so a chunk read after it was handed over for writing gets what was handed over | |
A chunk as read: its blocks (none: they were never changed, generate them), what was kept of its block entities and entities, and its circuit marks | |
What is kept of a chunk that leaves the world or is saved: its blocks when they changed since they were last handed over (none: what is stored stays), its block entities and entities (empty records remove what was stored) and its circuit marks | |
A finished save: the id save() returned and whether it was written | |
Which loaded chunks a circuit or machine connects across their border (decision E-375), kept up to date as chunks arrive and blocks are set, never computed per tick | |
Chunk loader blocks (decision E-377): a block whose item carries the tag qtcraft:chunk_loaders keeps its own chunk loaded, and with it the group of circuits that chunk belongs to | |
Which chunks the server keeps loaded and how they come and go (decisions E-374 to E-377) | |
Repairs chunks by generating them again (decision E-246): the blocks become what the world's generator (terrain, flat, void or showcase) makes of the chunk, its block entities go with the old blocks (QcServerWorld::regenerateChunk: chests and machines lose their contents, saplings and circuit memory are forgotten), pending block, liquid, circuit and hopper work and falling blocks in it are dropped, minecarts without a rider go and the generated ones (a mine shaft's chest minecarts) come again, players get the chunk again, players inside blocks are lifted to free space and creatures inside blocks are removed | |
What the storage holds of the chunks and how the loaded chunks stand towards it (part of QcServerWorld, decision E-716): the catalog of stored chunks, the loaded chunks whose blocks changed since they were last kept or differ from what the generator makes, and the chunks whose stored data is damaged (decision E-373) | |
Creatures of a chunk seen for the first time: its group of persistent animals (decision E-086) and the creatures of the village pieces in it (decision E-404); and the seed's sets of chunks of the kinds that spawn only in some (slime chunks) | |
Chunks of a world on disk (decision E-373): per kind (blocks, block entities, entities) one indexed region file per region (QcRegionFile), read chunk by chunk when a chunk is needed | |
Data of a chunk as stored, per kind (a kind without data is missing), and its circuit marks | |
Kind and file (relative to the world directory) open() failed on; journal: the journal of a save that broke off cannot be finished (damaged, or a staged file is lost) | |
What is kept of a chunk, without reading it | |
A whole file of the world written with a commit (world.json, blockupdates.qce); no content removes it | |
Sends each client the chunks around it (nearest first, loading missing ones in the background through QcChunkLoading, which also unloads the chunks no one needs any more) | |
Load tickets of circuits (decision E-376): chunks loaded for a while although no player is near | |
How each kind of component reacts (decision E-336), as decisions on the world before a step | |
Something lies on in this tick, those a player or creature stands on and those a minecart stands on; tripwire something touches (decision E-782) | |
What one simultaneous step of the circuits decided (decision E-335) | |
A door, trapdoor or gate at pos to set open or closed | |
A scheduled tick to plan: the component at pos ticks after delay ticks with priority | |
Work of the circuits of a world between ticks (decision E-335): block changes near circuits not yet looked at, positions waiting for chunks to load and comparators to read again | |
A block change near circuits, not yet looked at | |
Takes out every position of a chunk that leaves the world and that the circuits were going to look at (changes, positions waiting for chunks, comparators to read again); they go with the chunk's record and wait again once it is back (decision E-374) | |
How often the clients hear of the world and of the time of day (decision E-249) | |
What the clients get after a tick besides their own state: the world around them (chunks, entities, debug data) and the time of day | |
One call of a command: who runs it and the words after the command's name | |
/help (decisions E-243, E-911): without a word one line per group (QcCommandCategory) with the commands the source may run; /help <group> [page] those commands with their descriptions, pageSize to a page; /help <command> its usage, its description and the words its usage cannot name (QcCommandSpec::names, the structures of /locate) | |
All commands of a server, by name and alias | |
Who runs a command (decision E-243): a player through the chat or the server console | |
A command as the registry knows it (decision E-243) | |
What a Signal Comparator reads from a block (decision E-343): the fullness of a container or machine with the reference formula, a state property scaled to 0..15, or the fullness of a container cart on a detector rail (decision E-385), as the block's data says | |
Optional state T of one kind of creature, kept on the heap (decision E-423): only the creatures of that kind carry it (a villager its QcVillager), the others pay one pointer | |
Reads the fields of a known component of a version from a stream: a reference to a callable that outlives the read, without the allocation of a std::function | |
A component this version reads: its id, the version it writes and its reader | |
What read() keeps of one entry's components besides the known fields, and how many unknown components it dropped beyond maxKept | |
Writes the components of one entry straight into the entry's stream: the known ones in the order they are added, each followed by its kept tail, then the kept components of unknown ids | |
Bounds new connections per network address (decision E-254): a token bucket per address against connection floods, and a cap of open connections per address and in all | |
Damage of the blocks a body touches (lava, fire, magma; contactDamage of the block data) and how long they set it alight (setsAlight, decision E-393): the strongest of the loaded blocks a box overlaps | |
What touching blocks does to a body: the strongest damage and the longest burning (ticks), and whether a block of them burns items | |
Open and close sounds of storage blocks (decision E-879): a chest, barrel or placed backpack sounds when its first viewer opens it and when its last one closes it, so that two players looking into one chest make one sound each way; a backpack opened from the hand sounds when its holder opens and closes it | |
A creature (decision E-364): a mob of the content's definitions (type indexes them) with its health, behaviour timers and breeding state | |
Creatures' push on players (decision E-882): the bodies of the awake creatures that push players (QcBodyPush::pushesPlayers) in a grid of columns (QcBodyGrid) | |
What creatures with traits do to the world (decision E-460), after the creatures' tick: the blocks they took and put down (QcMobManager::takeBlockActions) become ordinary block changes of the server (QcServerBlocks: clients, light, neighbour updates, saving), the teleports since the last call (QcCreature::teleportedFrom) play their sound at both places and show the clients the new place at once, and a creature that dies drops the block it carried | |
Random-tick rules of farming (decisions E-289 to E-291), called by QcPlantGrowth for blocks with crop or soil | |
Creatures that crumble at a liquid's source (QcMobDefinition::crumbles, decision E-593; the sand golem in water), every game tick after the creatures moved: an awake one whose body (grown by touch sideways and below) reaches into a source block of its liquid is removed without loot or experience, and its build stands where it stood: body at its feet, in the middle above them and on both sides of the middle across its facing, head on the middle, facing where it looked | |
What Signal Dispensers and droppers do when their delay ends (decision E-345) | |
How creatures that open doors (QcPathRules::opensDoors, decision E-423) go through them: they open the closed wooden door on their path ahead (QcMobNavigator::Navigation::door) and close the one they opened once they are through, and they take turns at a door, one at a time (decision E-411) | |
Doors to close and to open, in this order, and the door the creature holds open afterwards | |
Air under water in the server tick (decision E-955): players and creatures with their eyes under water lose their air (QcAirSupply) and then drown while the game rule drowningDamage holds; out of the water the air comes back | |
One-pass recalculation of Signal Dust (decision E-335) | |
What a recomputation found | |
Parts of the region (dust linked to each other) that reach a chunk that is not loaded: they were not recomputed and wait for that chunk, with the seeds among them | |
/effect (decision E-450), for operators: gives a player a status effect for some seconds at a level, or takes one or all away | |
Entity register of a world (decision E-364): every entity is a QcEntity of one kind and lives in the table of its kind, which also carries the kind's own behaviour (QcMobManager: creature AI and spawning; QcItemEntityManager: items falling, merging and ageing; QcFallingBlockManager; QcArmourStandManager; QcMovingBlocks; QcMinecartManager: carts on rails; QcExperienceOrbManager; QcProjectileManager: arrows; QcPrimedExplosives: lit explosives; QcBoatManager: boats) | |
What every entity of the server has (decision E-364): an id unique among all entities of the world, its kind, where it is and how it moves (feet in the middle of the bottom face), the direction it faces and whether it rests because its chunk (QcEntities::chunkOf) is not loaded | |
What a saved entry holds that this version does not use (decision E-420), carried by the runtime object so that loading, unloading and saving lose nothing: the components it does not read and the header fields its kind leaves unused in this version (the persistent id of every kind but creatures, the type name of armour stands, minecarts and experience orbs), written back as read | |
What is saved of the entities of one chunk (decision E-366): the chunk holding each one's feet | |
An entry of the type Entry and the key of its place in its table | |
Tells each client about the entities near it (decision E-364), the same way for every kind: a spawn when one comes into view or its spawn data changed, moves for known ones and a removal when one is out of sight, rests or died | |
What the world does to bodies by itself (decision E-367): blocks with contact damage (lava, fire, magma) hurt players and creatures and burn items, and players and creatures with their eyes in a full solid block suffocate | |
/xp (decision E-398), for operators: adds to, sets or shows the experience of a player, in points (the default) or levels | |
A ball of experience lying or flying in the world (decision E-398); QcExperienceOrbManager moves, attracts, merges and ages them, and players collect them | |
Experience orbs of a world (decision E-398), the table of their kind in the entity register | |
A block falling while nothing holds it (decision E-055, E-364); QcFallingBlockManager lets it fall and land | |
Blocks that fall (sand, gravel) while nothing holds them (decision E-055) | |
A falling block that came to rest | |
What lights fire besides fire itself (decision E-393) | |
Burning fires of the loaded world and when each takes its next step (decision E-392): one entry per fire block, ordered by due tick, so a tick only looks at the fires that are due and costs the same in a world of any size | |
A burning fire with an entry in the queue | |
Dice of one step of a fire: drawn from the world's seed, the fire's position and its age, not from the tick, so the same in every run, independent of the order fires take their steps in, and the same after the fire's chunk was away for a while (decision E-374) | |
Traits of every block state of a content, indexed by block state id | |
What fire needs to know about a block state, looked up once per content | |
How water creatures move (fish, decision E-502), part of QcMobBehaviour: in water they swim without gravity along routes to goals where their body has room (QcSwimRoutes, a fleeing one away from danger), rest a moment at each goal and keep their whole body in the water (QcSwimSpace), steered also towards their school (cohesion, alignment and separation among the nearest creatures of their kind, schooling); a creature that swims in pulses (the squid, QcMobDefinition::pulse, decision E-974) pushes at the start of each pulse, glides between and tilts its body along its way (QcCreature::tilt); one without a mind (QcCreature::noAi) holds its place; out of water they fall, flop about and count their dry ticks (QcCreature::dryTicks), which QcBodyBurning turns into suffocation | |
One game rule | |
Index of the generated chunks of a world (decision E-946): every chunk that was ever in the world, whether its blocks changed or not, so a later generator change knows the explored area | |
Index as found in a world directory: the index, the file (relative to the directory) the next save writes it to, whether generated.qcg has a newer format version, and warnings for the player | |
Brain of golems (QcMobDefinition::Ai::Golem, decision E-471): an iron golem guards the villagers | |
What a golem (QcMobDefinition::Ai::Golem, decision E-471) keeps between ticks: whether a player built it (saved with the creature), the hostile creature it is after and the player it is angry with (not saved: a loaded golem looks again) | |
Zone a guardian keeps to (decision E-594): the guardian zone of a structure it came into (QcGuardSite, decision E-591), in world cells with both corners inside | |
Brain of guardians (QcMobDefinition::Ai::Guardian, decision E-594; the sand golem): a mix of the reference's iron golem and its guardians | |
Guardians that come back to the zones of structures (decision E-591; the sand golem in the cellar of a desert temple, a renewable source of sand) | |
An item frame or a painting on a block face (decisions E-790, E-791): no AI, no physics; it hangs where it was placed until its wall or its room goes (QcServerHanging::tick) | |
Item frames and paintings of a world (decision E-790): placed entities without AI, health or physics | |
What the effects of a projectile's hit on a body add up to (decision E-427) | |
What one hit does to the body | |
Which Signal Hoppers to look at when (decision E-344): those awake for the next hopper step, those waiting for a tick (their cooldown ends, an unloaded neighbour may have loaded) and the containers whose contents changed | |
Brain of hostile creatures (QcMobDefinition::Ai::Hostile): they chase the nearest player they see (and for a few seconds one they lost sight of, decision E-401) along a path and strike it in melee with a line of sight; without a target they wander like passive ones | |
Food points of one player (decision E-039) | |
Short invulnerability of a player or creature after a hurt (decision E-429), counted in game ticks (the server's simulation ticks, independent of /tick rate) | |
Player identities a world has seen (decision E-252), kept in identities.json in the world directory: the server's salt and, per player name, the identity its first login registered (trust on first use) | |
One registered identity: the player name, the identity (QcLoginCrypto::keyBytes bytes), its fingerprint and when it was registered | |
Infested blocks and the creatures that hide in them (silverfish, decision E-453) | |
Slots of containers (chests, barrels, hoppers, dispensers) and machines (furnaces) as Signal Hoppers, droppers and dispensers reach them (decision E-344) | |
One unit (or the whole stack of an item entity) going from a source into a target slot | |
A dropped item stack lying in the world (decision E-364); QcItemEntityManager moves, merges and ages them | |
Dropped item stacks lying in the world | |
An item stack that is to appear or waits in the queue: the stack, its position (feet) and velocity, the seconds before it can be picked up and its age in seconds | |
What a tick asks the server | |
Lag spikes in the server's log (decision E-834): a tick longer than 50 ms becomes a line with its duration and its longest phases | |
What a lightning strike does to the world (decision E-396), the strike hook of QcServerWeather | |
Counts since the server started (tests, measurements) | |
/limits (decisions E-349, E-848): shows the simulation limits (QcServerLimits) and changes one, within its range, or resets it to its default | |
Flowing liquids on the server (decision E-054) | |
What the steps of one tick did | |
Warnings of reading a world's saved chunks (blocks, entity and block entity records): the readers add to it as they go, so what they found before a damaged part stays | |
How machine blocks (furnaces) work (decisions E-037, E-038); their state lives in the block entities (QcBlockEntities::Machine: input, fuel and output slot, the fuel burning and the progress of the current item) | |
What one player has not received of one map yet (decision E-802): per row the span of pixels changed since, and the row to go on from | |
Maps of a world (decision E-799) by map id: kept in memory while used, read from the save when first needed (the loader), written with the next save only when changed since, and dropped from memory when nobody used them for idleTicks and they are written (tick) | |
One pixel looked at: where it is and what it shows now (QcMapPixel) | |
A minecart (decision E-382): rolls along rails with its own momentum (QcMinecartMotion), stands where it left the rails, and carries one player, or a container (a chest cart, a hopper cart, decision E-386) with its slots | |
Where a cart came to rest on a level rail, at the lower end of a slope that ends there or on the ground off the rails (not saved): while it stays there, without speed, pushes, a rider getting in or a change of that rail or of the cells beyond its track's ends (off the rails: of the cells around it), its tick has nothing to do | |
Two awake carts whose bodies overlap, by table index (first < second), and the horizontal line from the first to the second | |
How items move between minecarts and the blocks around them (decision E-387), once per tick after the carts moved, for awake carts only | |
Minecarts of a world (decision E-382), the table of their kind in the entity register: adding, finding and removing them within the world's limit, and their movement in a tick: the carts meet each other and the living bodies (QcMinecartCollisions), then every awake cart moves on its own (QcMinecartMotion), and none ends deeper in a cart it overlapped | |
What a cart carries, from its item (QcItemDefinition::cartBlock, decision E-386) | |
Track a cart is on: the cell, its ends in the world and the direction from the first to the second end, and its length | |
What the awake creatures of QcMobManager do each tick (decision E-400): each thinks with the brain of its AI (QcMobDefinition::ai, decision E-423: QcPassiveBrain, QcHostileBrain, the villagers' QcVillagerBehaviour, QcArcherBrain, QcNeutralBrain, QcGolemBrain, QcGuardianBrain); flyers drift above the ground, hoverers (QcMobHover) float after their brain's wish | |
When a tick happens: the world's time and the tick's length in seconds | |
Creatures that thought fully, throttled and not at all in the last tick (tests, measurements) | |
What decides what a creature does (decision E-423), one of each kind of AI (QcMobDefinition::ai) in QcMobBehaviour, shared by all creatures with that AI: their state is in the creature (QcCreature, its components) | |
Breeding of peaceful animals (decision E-293), on the timers of QcCreature | |
/mob (decision E-510), for operators: changes a creature the player names by nearest (the nearest within targetRange), looking (the one in the player's view) or its entity id | |
A creature cramming hurt: its kind, where it stood and its drops when it died | |
Crowds of creatures (decision E-401) | |
A creature in a cell with more than the limit of them: its id, its index in the list build() counted, its cell (an index) and the number in the cell | |
Creatures that drink to heal (QcMobDefinition::drinks, decision E-623; the witch), every game tick after the creatures thought: an archer whose health lies heal or more below its most begins to drink when its last drink is cooldownSeconds past; it holds the drink's item (QcEntitySync) and neither draws nor shoots (QcArcherBrain) for seconds, then heals by heal (up to its most) with the drink's sound | |
A block a creature takes or puts down in a tick (a shadewalker, decision E-460), which the server carries out after the tick with the usual block changes (QcCreatureTraits): taking only when block is still there, placing only into air; dropping (game rule mobGriefing off) lets the carried block fall as an item | |
A blow of one creature at another (a golem at a hostile creature, decision E-471; a pet at its owner's foe, decision E-480); the server deals it after the tick (QcServerCreatures) | |
A blow of a creature at a player; the server deals it after the tick | |
Parents and their children (QcMobDefinition::family, decision E-839; the Kjut), like a QObject and its children: a parent wounded and still alive splits off children of its family's kind (at most maxChildren of them live at once, maxSplits in its life); a child points to its parent (QcCreature::parent, and QcCreature::parentUid in a kept family) | |
What a hoverer does this tick: the steering of its brain (a horizontal wish and a speed) and, for an orbiting child, the height its feet keep instead of the hover height | |
Floor (top of the first block with a collision box or a liquid below the middle of the body) and the ceiling (bottom of the first block with a collision box above the head) around a body whose feet are at feet; no floor within reach lies reach below the feet | |
Creatures laying now and then (a chicken's eggs, decision E-452), on QcCreature::layTimer: an awake adult of a kind with QcMobDefinition::laying counts its time down and lays when it runs out, then chooses the next time evenly between the kind's minSeconds and maxSeconds | |
An item laid at a creature's feet | |
How many questions to the routes are left this tick | |
Where legs come from | |
What a walker remembers of its way between ticks | |
Cell to search a path to, and how many questions it asked the routes (the caller takes them from its budget) | |
Shore to swim to (none on dry ground or while a path leads on), and whether the routes were asked | |
Creatures on the server (decision E-422): their store, the order of their tick (behaviour in QcMobBehaviour: wander, chase along paths, attack, flee when hurt for passive mobs; despawning; natural spawning in QcNaturalSpawner; village life in QcVillagePopulation), damage, and saving and loading the persistent ones | |
What to do this tick: the steering, and a closed door on the path or in the doorway the creature stands in (only for creatures that open doors, QcPathRules::opensDoors: villagers open it, QcVillagerBehaviour) | |
Where a creature is going and the path it follows there (decision E-400) | |
A hostile creature without AI of its own (a crowd, QcMobCrowd) strikes the nearest player in melee (inMelee) when its attack is ready, so a knot of creatures is no safe place (a neutral one only the player that provoked it) | |
A creature's fate in this tick and its idle ticks after it | |
How many monsters may live around the players (decision E-836), by the original game's formula: every living player spans an area of 17 × 17 chunks around its own; the world as a whole holds at most perArea monsters (QcServerLimits monstersPer289Chunks, 70) for every 289 loaded chunks of all areas together, so players far apart each bring a full share and players close together share one | |
A block sliding where a piston moved it, as the clients see it (decisions E-337, E-364): the world holds the block at to already; the entity only shows the slide (QcMovingBlocks) | |
Blocks a piston moves, as the clients see them (decision E-337): the world holds every moved block at its new cell at once (saves, chunk borders and other players see one consistent world), while the clients get the new cells only after the move and meanwhile see the block as an entity that slides there | |
Creatures that come by themselves (decision E-422): monsters every tick around the living players by the original game's rules (decision E-836: QcSpawnLight, QcSpawnGround, QcMonsterCap; in the spawn areas of structures only their kinds, decision E-871: QcSpawnAreas), the other kinds every second up to four spawn attempts around each living player by time of day, place, light and the data's spawn rules, within the caps per player; and the creatures of a chunk seen for the first time: its group of persistent animals (decision E-086) and the creatures of the village pieces in it (decision E-404) | |
Time of day and how dark the sky is (QcSpawnLight::skyDarkening) | |
Accepts TCP connections for a QcServer in the server's thread (decision E-251): every accepted socket becomes a QcTcpTransport and a remote client of the server, which logs it in; no data is shared with another thread, so the game state needs no locks | |
Brain of neutral creatures (QcMobDefinition::Ai::Neutral, decision E-460; the shadewalker): they wander like passive ones until a player provokes them, then chase that player like hostile ones for angerSeconds, renewed while they see them | |
Which notes of note blocks may sound (decision E-767), so that a fast clock driving many note blocks cannot flood the clients with sounds: a block plays at most once every minIntervalTicks (several notes of one block in one tick become one), and all blocks together at most maxPerTick notes a tick | |
Opens and closes doors, trapdoors and gates, for players and for circuits: both halves of a door together, with the block's sound, but never onto a living body (a player or creature inside the new shape keeps it as it is) | |
Where the creature may go across the way, per horizontal axis, in world coordinates: within the openings of the doors its body overlaps and of its next waypoint; none along a free axis | |
Point of a waypoint: the middle of its cell (of the body's columns, QcPathTerrain::pointOf, and for a wide wall climber going up or down at the wall, QcPathTerrain::climbPoint), moved to the middle of the opening along the axes the gap it keeps to narrows (gap: the gap of its cell where the path goes through along the panel, else across the line of the path that of the waypoint just before or after it in line); for a waypoint right before or after a door (narrowed only by its neighbour in line), the axes it lines the creature up along | |
A stretch along one horizontal axis in world coordinates | |
What the creature steers to for its next waypoint this tick: the waypoint's point (arrival and progress are measured to it) and the lane its body keeps to on the way | |
Brain of passive creatures (QcMobDefinition::Ai::Passive, decision E-423): they wander to reachable places nearby or stand, and flee from whoever hurt them to a reachable place away from them (decision E-400) | |
Cells of every block state of a content, indexed by QcBlockId | |
Cells straight from the world, without a cache (checking a few waypoints of a path) | |
A* over the cells a creature can stand in (QcPathTerrain), bounded by a node budget and by the window around the start (QcPathWindow) | |
Where a body goes through the cell of an open door or trapdoor (decision E-905): per horizontal axis, the free opening beside its panel; none along an axis that nothing narrows | |
Where a creature walks: the world, the path cells of its blocks and the creature's path rules | |
A free stretch of a cell along one horizontal axis, in block units from the cell's corner | |
Path searches of all creatures within a budget per tick (decision E-400) | |
What one search looks for (decision E-400) | |
A path as feet cells after the start, in order | |
How a creature moves through the cells (decision E-400): its height in cells, how far it drops, whether it swims, opens doors, climbs ladders and jumps into deep water | |
One place a creature can stand in: its feet cell, how high it stands on a low block in that cell (a slab: half a block, a carpet an eighth) and whether it is in water | |
Cells of the body above the feet cell up to the top of a body standing lift high: whether they are free (clear) and whether one of them has a panel | |
Cells around the start of one search (decision E-400): a box of 64 x 32 x 64 cells, each read from the world at most once per search, and the A* bookkeeping of its nodes | |
Destructive commands wait for /confirm (decision E-245): each source (player or console) has at most one pending action, a new one replaces it, and it expires after timeoutSeconds of real time (the players' time of the server, QcServerClock::playerTimeNs) | |
Players using items on tameable creatures (decision E-480): a taming item tames a wild one with its chance (a wolf becomes a dog; the pet sits at first and belongs to the player's identity, QcPetOwners); on a tame one, healing food heals it, a dye colours its collar, and anything else (an empty hand too) makes it sit or stand up, all only for its owner except healing | |
What a tick of dropped items or experience orbs needs to know of a player: entity id, feet position and whether he is alive (decision E-975) | |
Carries out piston plans (decision E-337) | |
What a piston would do now (decision E-337), worked out against the world as it is, before anything moves: pistons that act in the same step are planned on the same world and then checked against each other (QcPistonPlanner::resolveConflicts) | |
Blocks with random ticks: plants that grow upwards by themselves (blocks with growth, e.g. sugar cane), crops and soil (QcCropGrowth) | |
Living plants on the server: leaves of trees decay when no trunk is near any more, and planted saplings grow into the tree feature they name | |
What a tick may ask of the world around the plants | |
Player management (decision E-244): the player list, kick, ban and unban, the whitelist, operators and teleporting | |
What is saved of a player (decision E-093): his body, view, inventory, armour, health, food, game mode, experience, seeds, effects, advancements and air | |
Players fishing with a rod (decision E-503; QcItemDefinition::fishing, QcMsg::ThrowItem): the first use casts the rod's bobber, a projectile that floats on water (QcProjectileDefinition::floats); the second reels it in | |
Health and food of the players (decision E-367): regeneration and starvation, damage (with armour, knockback and the short invulnerability after a hit), falls, the void, death with its drops and message, respawning, eating, and telling the player | |
A client the login admitted becomes a player (decision E-367): restored from his save (QcPlayerRecords) or spawned at the spawn point in the world's default game mode, told everything a client needs to play (Welcome, content, game mode, inventory, health, food, time, warnings about the world) and given the chunks around him | |
Parts of the server a join uses: persistence, inventory, health, game modes, chunk streaming and how to send the time | |
Players drawing and shooting launchers (a bow, decision E-425) | |
A player's saved state and the number of items of an open crafting grid that did not fit into its inventory | |
Player files of a world directory (players/<name>-<hash>.qcp, decision E-093): position, view, inventory and armour, health and food, the game mode with the kept inventory of the other mode, the experience, the advancements | |
A player as read, with the warnings of reading his file (unknown items dropped, an unknown game mode played as survival) | |
Players throwing items by hand (a snowball, decision E-427; QcMsg::ThrowItem): the selected item, when it is throwable (QcItemDefinition::throwable), leaves the eyes as its projectile at the item's speed, turned at random by up to its inaccuracy | |
A lit explosive counting down to its explosion (decision E-601); QcPrimedExplosives moves it like a falling block and counts its fuse down, QcServerExplosions sets it off | |
Lit explosives of a world (decision E-601), the table of their kind in the entity register: each falls like a falling block (the shared physics, the same size) and counts its fuse down while its chunk is loaded | |
A projectile flying or stuck in a block (decision E-425); QcProjectileManager moves, sticks and ages them | |
A body the projectile can hit: a creature or a player | |
Result of one step of a projectile | |
Projectiles of a world (decision E-425), the table of their kind in the entity register | |
A projectile met a block (a target reads where, decision E-768) | |
What the tick reports to the server | |
A projectile that hit a body this tick | |
A shot (a player's launcher, a creature's brain through QcMobBrain::Context::launches) | |
A player as the tick sees them for pickups | |
Token buckets of one player, one per kind of spammable message (decision E-091) | |
Limit of a bucket: tokens refilled per second and the bucket's size | |
Every blob of a file, and the chunks whose bytes do not match their checksum | |
Blob of a chunk to write or as read | |
Index entry of a chunk: its marks, and offset, size and checksum of its blob | |
Where to look for a place to stand around a point | |
Payload of a file and its format version (at most the newest one the reader asked for) | |
When the server saves on its own: autosaves and the identities of new players | |
Per loaded chunk and block trait, a bit for each section that may hold a block with that trait | |
Authoritative game server | |
Server's side of the admin channel (decision E-848): operators who play on the server follow its status, players, chat and log and act on it over their game connection | |
Adventure guide on the server (decision E-923): tracks per player which criteria of the content's advancements are met (QcServerClient::advancements) and tells the client | |
Players feeding animals and the births that follow (decision E-293): food from the hand makes an animal fall in love or a young one grow faster, two animals in love in sight of each other get a young one (QcMobBreeding), which is kept with the world | |
Anvil's screen in the server (decision E-866), as in the reference game: using an anvil opens it; the player puts a stack into the left slot (machineInputSlot) and optionally material, a second item of the kind or nothing into the right slot (machineFuelSlot), types a name and takes the output (QcAnvil::result) for its levels (nothing in creative mode) | |
Block changes of the server with their consequences: clients are told, neighbours queued for an update, machines and chests spill their contents, placed saplings start to grow and broken blocks drop their items | |
What players do with boats and how boats move in the server tick (decision E-920): placing a boat from its item on water or on the ground, breaking it with a hit (it drops its item), getting in with a use and out with sneak, and driving it: each input of the driver steps their boat by the shared boat physics (QcBoatState::step) with the input's keys, the same step the driver's client predicts, so driving needs no correction | |
Signal Dust circuits of the server: the tick phase "signal" (decision E-335) | |
Server-internal state of one connected client, shared by the parts of QcServer, grouped by what it is for (decision E-367) | |
Adventure guide (QcServerAdvancements, decision E-923; progress is saved): the met criteria, the advancements whose change the client has not heard of yet (with whether to announce them), whether it got the whole progress since joining, the block where the location criteria were last checked, and the chat lines about his reached ones this tick (decision E-924): those sent and those beyond the limit, folded into one line at its end | |
Open anvil (QcServerAnvil, decision E-866): where it stands, its left and right slots and the text of its name field | |
Crafting grid, row-major with three cells per row; a 2 x 2 grid uses the top-left four, a crafting table at table the whole grid | |
Open enchanting table (QcServerEnchanting, decision E-864): where it stands and the stacks in its item and lapis slots | |
With a rod (QcPlayerFishing, decision E-503; not saved): the bobber cast (entity id, 0: none) from the hotbar slot slot, the ticks until a fish bites (-1: not drawn yet, the bobber does not float) and the ticks the bite still lasts | |
Creatures this player fought lately (decision E-480): the last that hurt them and the last they struck (entity ids, 0: none) with the tick it happened; their pets defend them (QcMobManager::PlayerView::hurtBy and struck) | |
Machine, container or villager whose screen the player has open, and what the client was last told about it | |
What the client may send: inputs refilled each tick by the real time it stands for, one per 50 ms (decision E-249), so other tick rates and sprints keep the player's pace; budgets of the other spammable messages; the latest input applied; positions whose true block was resent in tick miningResendTick after a dropped mining message | |
Login (decision E-252): where the client connects from (address and port of a network client; empty in-process), the program it reports, since when (the login must finish within loginTimeoutMs), the nonce of the challenge and the fingerprint of the proven identity (remote clients) | |
Block being mined, since which tick and players' time (QcServerClock::playerTimeNs) | |
Screens the player has open and what the client was last told about them | |
What a client knows of an entity: the stack count of an item, the position of its last move and whether that move came in the last tick (QcEntitySync) | |
Open stonecutter (QcServerStonecutter, decision E-785): where it stands, the stack in its input slot and the stonecutting recipe chosen for it (empty: none) | |
What the client has been told about the world: chunks streamed around the player within distance, entities it knows (SentEntity), known entities whose spawn data changed and must be sent again, and the debug data it subscribed to (QcMsg::DebugSubscribe) and when that was last sent | |
Time of the server (decision E-249): simulated ticks, and the real time as the players live it | |
Players attacking creatures (decision E-367): reach and sight, the attack cooldown, the damage of the held item and its wear, the creature's sounds and the loot it drops when it dies | |
A blow or a hit on a creature: from where, and the player who dealt it (only then it gives experience and provokes a neutral creature, decision E-460, and villages and golems remember them: QcGolemGrudges, decision E-471) | |
Command layer of the server (decision E-243), shared by the chat of every player and the server console: plain chat lines go to everyone, lines starting with '/' run a command of the registry or a macro of the content (decision E-248) after the source's rights are checked | |
Configuration of a game server: the world, its generation and storage, the streaming, operators, limits and the login of remote clients | |
Crafting of the players (decision E-367): the 2 x 2 grid of the inventory and the 3 x 3 grid of a crafting table near them, recipes and repairs taken from the grid (once or as often as possible), recipes crafted straight from the inventory (CraftRecipe) and the grid's items going back into the inventory when it closes | |
Creatures in the server tick (decision E-367): their behaviour and spawning (QcMobManager) with what they need to know about the players, the blows they deal to players, their ambient sounds and the damage of crammed cells (game rule maxEntityCramming, decision E-401), what villagers do to the world (QcServerVillagers, decision E-411), what creatures with traits do (QcCreatureTraits, decision E-460: blocks taken and placed, teleports), creatures hiding in blocks (QcInfestation, decision E-453), monster spawners (QcSpawnerRules, decision E-520), the guardians of structure zones (QcGuardians, decision E-591), creatures that crumble at water (QcCrumbling, decision E-593), creatures that drink to heal (QcMobDrinking, decision E-623) and families of parents and children (QcMobFamilies, decision E-839) | |
Debug data for the clients that ask for it (QcMsg::DebugSubscribe, decision E-225): the tick phases of the server's window, its counts and, on request, where the creatures near the player are heading | |
Status effects of players and creatures in the server tick (decision E-450): every effect counts down and does what its kind (QcEffectDefinition) says at its level; poison hurts every QcEffectDefinition::periodAt ticks without taking the health below its minHealth, players through QcPlayerHealth::damage (unblockable), creatures through QcServerCombat::hurtCreature (no push, QcMobManager::damage); hunger exhausts players' food (decision E-838; slowness acts where bodies move, QcStatusEffects::speedFactor) | |
Enchanting table's screen in the server (decision E-864), as in the reference game: using a table opens it; the player puts an item into the item slot (machineInputSlot) and lapis lazuli into the lapis slot (machineFuelSlot) and sees three offers, whose levels depend on the bookshelves around the table (QcEnchantingTable::shelvesAround) and whose enchantments follow from the player's enchantment seed | |
Experience in the server tick (decision E-398): orbs move, merge and despawn (QcExperienceOrbManager), players collect them with a sound, a level gained plays the level-up sound, and every player whose experience changed gets it (QcMsg::PlayerExperience) at the end of the step | |
Explosives and explosions in the server tick (decisions E-600 to E-604) | |
An explosion of power at centre; with breaksBlocks (the game rule, and for a creature also mobGriefing) it breaks blocks, with fire it lights fires among them | |
Falling blocks in the server tick (decisions E-055, E-288): a block that loses its hold becomes a falling-block entity (QcFallingBlockManager, a kind of the entity register) or, when too many fall, drops straight to its resting cell; one that comes to rest becomes its block again (concrete powder hardens in water) or breaks into items when the cell is taken or a body is in it | |
Fire in the server tick (decision E-392) | |
Game modes of the players (decisions E-282 to E-285): the mode of new players, changing a player's mode with the inventory set that belongs to it, the items of the creative catalogue and picking blocks with the middle mouse button | |
Players and golems (decision E-471): building a golem from blocks and repairing one | |
Cells of a built golem: its head, the middle and foot of its body and its two arms | |
What players and the world do to item frames and paintings (decisions E-790 to E-792): hanging one from its item on a block face, putting an item into a frame and turning it, hitting (a frame's item drops first, then the frame) and dropping them when their wall or room goes | |
Signal Hoppers of the server (decision E-344), run at the end of the signal phase | |
What the hoppers did in the latest tick | |
What players do to the world: mining blocks, using blocks and items (opening machines, toggling doors, switching levers, tilling, carving, lighting fire, placing blocks and building golems from them, scooping liquids) and using creatures (feeding, repairing golems, catching) | |
Inventories of the players: moving items between the inventory, the crafting grid, armour slots and an open machine or chest or the input slot of the open stonecutter (decision E-785), throwing and dropping items, armour worn and taken off | |
Dropped items in the server tick: they move, merge and despawn (QcItemEntityManager), and players pick them up | |
Cake and campfires in the server (decisions E-772, E-773) | |
Budgets and bounds of the server's simulation that an operator may tune (decision E-349): read from the object "limits" of server.json on a dedicated server, of world.json in a single-player world (a dedicated server ignores the world's) | |
One limit as /limits, the files and the admin channel see it | |
Server's side of the handshake (decision E-252) | |
Machines (furnaces) in the server tick: they work by QcMachineRules, tell comparators and hoppers when their slots changed, and crackle while they burn | |
What players do with maps in the server (decisions E-800 to E-804, E-807, E-808): using an empty map makes a filled map of the land around its user, holding a filled map reveals the land around its holder, and the holder and the players near an item frame showing the map receive what changed of it, at most pixelBudget pixels per player and tick, with the players who carry the map and the frames showing it as markers | |
What players do with minecarts and how carts move in the server tick (decision E-382): placing a cart from its item on a rail, breaking it with a hit (it drops its item and what it carries), getting in with a use and out with sneak (a use of a container cart opens its screen instead), pushing it along with the forward key while riding, and the tick: carts move (QcMinecartManager), their riders go with them and hopper carts and hoppers under carts move items (QcMinecartHoppers) | |
Whether the server's tick loop pauses (decision E-877) | |
Opening and saving the world of the server: world info, chunks with their block entities and entities (through QcChunkIo, read when they are needed), pending block updates and players | |
Plants in the server tick: growing saplings and decaying leaves (QcPlantManager), random ticks of plants that grow upwards like sugar cane, of crops and soil (QcPlantGrowth), items that plant themselves (despawning saplings, seeds lying on free soil; decision E-294), and players tilling soil with a hoe (decision E-290), making paths with a shovel (decision E-406), bone meal on crops and saplings (decision E-426) and carving pumpkins with shears (decision E-472) | |
Projectiles in the server tick (decision E-425): the shots of the creatures' brains of this tick (QcMobManager::takeLaunches) become projectiles, then every projectile flies against the blocks and the bodies of creatures and players | |
Settings of a dedicated server (decision E-255), kept in server.json in the data directory (or a file given with –server-config) and overridden by command line options: name, message of the day, port and bind address, player limit, password, world, view distance limit and the connection limits | |
Players writing on signs (decision E-766) | |
Sends sound events to the clients that can hear them | |
What players do to armour stands (decision E-238): placing one from its item, putting armour and the held item on or taking them off, and breaking it (two quick hits) with its drops | |
World, the clients and the entities of the authoritative server, shared by its parts (decision E-367): each part is reached through its own accessor and keeps its data behind its own interface; what changes at the level of the whole server (the clock, the player list) changes through a named function | |
Stonecutter's screen in the server (decision E-785), with slots as in the reference: using a stonecutter opens it; the player puts stone into the input slot (QcServerInventory, slot machineInputSlot), chooses one of its stonecutting recipes (decision E-784) and takes the result from the output slot (machineOutputSlot), which uses up one input item; a shift-click takes as often as the input and the inventory's room allow | |
Gameplay systems of a server: each runs its own part of the tick on the world and its bodies (fire, weather, health, minecarts, boats, experience, projectiles, circuits, explosions, the players' mining and using) | |
Trading with villagers (decision E-414), server-authoritative | |
Vehicles of the server, minecarts (decision E-382) and boats (decision E-920), and what the server asks of both at once: a hit or a use of an entity, the input of a rider, getting out, the tick, which vehicle a player is in | |
What villagers do to the world (decision E-411), carried out after the creatures' tick: the wooden doors they open and close (QcOpeners: both halves, the door's sound, never onto a body; a door that cannot close yet is tried again), the ripe crops farmers harvest and plant again in one step (the crop goes back to its first stage; the harvest counts as the farmer's produce, no items drop), the food adult villagers pick up from the ground every foodTicks ticks (QcVillagerBreedingSettings::foods, decision E-490: it counts as produce, so throwing bread feeds them), and clients learning a villager's new look | |
Weather in the server tick (decision E-395) | |
Block screens with slots of their own that the player fills from the inventory and that give their items back on closing: the stonecutter (decision E-785) and the enchanting table (decision E-864) and the anvil (decision E-866) | |
Authoritative block world of the server | |
Text on the signs of the loaded chunks (decision E-766): up to four lines per sign block, filed by chunk so that they are saved, unloaded and loaded with their chunk (QcBlockEntityRecord::Table::Signs), like the monster spawners | |
Chunks the signals of the circuits concern (decisions E-376, E-378, E-410), for QcChunkLoading: the chunks signals wait for that are not loaded, the chunks of signals waiting for one on its way, the chunks with signals on their way, and the unneeded chunks a signal passes through, held for at most the time of a load ticket | |
Who powers what (decision E-333), read from the world as it is | |
Scheduled ticks of circuit components (decision E-335): a component asks to be looked at again after a delay (a torch after 2 ticks, a repeater after its delay, a button when it springs back) | |
What the signal engine reads from one block state, decoded once from the state's properties so that circuits never compare strings while they run (decision E-335) | |
QcSignalState of every block state of a content, indexed by block state id, and the states circuits switch to | |
Snow settling on the ground (decision E-396) | |
Spawn areas of structures around the living players (decision E-871, the original game's spawn overrides): in the footprint of a witch hut over the whole height of the world the natural monster spawns bring forth only witches, by the monsters' rules of light, ground, distance and cap (QcNaturalSpawner) | |
An area with its kinds as indices; kinds that are no monsters are left out | |
Sky light, block light and darkening of a cell, and the brightest block light allowed | |
Where players appear in the world, when they join for the first time and when they respawn: on the surface of the generator's spawn column (or the configured one, QcServerConfig::spawnColumn) as the world stores it; when that is no natural ground (a tree, a building, water), on the nearest natural ground around it | |
How monster spawners work (decision E-520), every game tick: a spawner with a creature kind counts its delay down while a player is within its block's range; at 0 it runs a cycle: unless maxNearby creatures of its kind are within nearbyRange of its block or the world holds QcServerLimits::spawnerCreatures creatures of spawners, it tries count random cells of its area and spawns a creature on each fitting one (room for the body's height and width, ground below unless it flies, block light at most maxLight for every kind, sky light not counted) | |
Monster spawners of the loaded chunks (decision E-520): one entry per spawner block with the creature kind it brings forth and the ticks left until its next cycle, filed by chunk so that they are saved, unloaded and loaded with their chunk (QcBlockEntityRecord::Table::Spawners) | |
Reads item stacks of one save file by name (written by QcSaveFile::writeStack) with their data (QcItemDataCodec); an unknown item is dropped with one warning per name (QcLoadWarnings::addOnce), counts and damage are clamped to what the item allows (a stack with contents holds one item) | |
A stack as saved, before it is fitted to what its item allows now: item, count, damage and data | |
Chat commands for armour stands and armour (decision E-239) | |
Routes of creatures that swim (decisions E-502, E-972), like the swimming goals of the role model: a goal only in a cell of water where the whole body has room (QcSwimSpace::fits), reached through such cells | |
Brain of tameable creatures (QcMobDefinition::tameable, decision E-480): a wild one thinks with the brain of its AI (wild: a wolf is neutral, a cat passive); a tame one belongs to its owner (QcTameState::owner, a player identity) | |
What a tame creature is (QcMobDefinition::tameable, decision E-480): whose it is, whether it sits and the colour of its collar, saved with it (component Tame of QcEntityCodec); and whom it attacks for its owner now, which is not saved | |
/tick (decision E-249): freezing the world, single steps, the tick rate, sprints and a query | |
Whether a tick simulates the world (decision E-249) | |
Permanent, cheap phase counters of the server tick (decision E-225): one monotonic clock read per phase, no allocation per tick | |
Measures the lifetime of a scope as message time of the timer it was made with | |
Deadline-based tick schedule (decision E-090): tick n is due at start + n * interval on a monotonic clock, so late timers never shift the grid | |
A sprint that ended: the ticks it ran and its real time in nanoseconds | |
Timing of the server ticks: how long they ran, how late they started against their due time on the tick grid (QcTickScheduler), and how many were skipped | |
Systems of the server tick as one list (decision E-700) | |
One system: the phase its time goes to, when it runs and what it runs | |
Asks the system for timers to the millisecond while it lives | |
Tripwire hooks and the tripwire between them (decision E-782), as decisions of a circuit step on the world before it | |
What bone meal grows on a block that growsVegetation (a grass block, decision E-814), as in the reference: attempts tries each walk from the cell above it up to attempt / 16 random steps (one block sideways, sometimes one up or down) over cells whose block below also grows vegetation and that are not solid; a try ending in air plants a flower of the biome there with one chance in flowerOdds (if the biome has flowers), otherwise its grass | |
A village as the server knows it (decision E-403): where it is, its beds and workstations and who lives there | |
Players who hurt its villagers or golems and the world time the grudge ends: its golems attack them (QcGolemGrudges, decision E-471) | |
What fromJson() accepts: the box at most extent blocks wide (a plan never leaves its region, so the region's edge), each spot list cut to its own limit | |
Persistent ids of the villagers its population counts, known once its claims were reconciled in this run (QcVillagePopulation): a villager that was away then (its claims lapsed) is not among them, so it neither leaves the population again nor stays a villager here | |
A bed (its head) or workstation; claimedBy is the persistent id (QcCreature::uid, decision E-420) of the villager that uses it (0: free) | |
Commands about villages (decision E-403): /locate village names the nearest village with its style and street plan (decision E-409) for operators, /locate <structure> the nearest copy of a structure the generator places by itself (decision E-590) or the nearest mine shaft (with its way in), dungeon or coastal tower (decision E-911; /help locate names what the world has), /village answers the state of the nearest village as one line of JSON (tests, bots through the control interface's console request, debugging), /profession gives the nearest villager a profession and level (decision E-414; trading tests and bots, summoned villagers) | |
A word of /locate that names a place of the generator rather than a structure, with the name the answer shows (a server message key, translated by the client) | |
Villagers summon iron golems like in the reference game (decision E-470), checked every few seconds by QcVillagePopulation | |
A golem the villagers summon | |
Villagers of the villages among the creatures (decisions E-411, E-415, E-422): one moves in beside each free bed when a chunk of its village is seen for the first time, the claims of a village are reconciled once per run when all its villagers' chunks are loaded, every villageLifeTicks ticks villagers move between villages (QcVillagerRelocation, decision E-490), get children (QcVillagerBreeding) and summon iron golems (QcVillageGolems, decision E-470), and a villager that leaves the world for good (QcMobManager::Departure: died, removed, despawned, void) frees its claims | |
A villager as it lives in the world: its record and what it is doing (not saved; a villager loaded from its chunk decides anew) | |
What villagers do (decision E-411): the brain of the villager AI (QcMobDefinition::Ai::Villager, decision E-423), called by QcMobBehaviour for creatures of a villager kind | |
Something a villager does to the world, carried out by the server (QcServerVillagers) | |
Villagers getting children (decision E-415), checked every few seconds by QcVillagePopulation | |
A child to spawn at position that moves into bed of village | |
Where and how a villager lies in the bed whose head is at head: on top of it, the head on the pillow, facing the foot (the client lays it on its back, QcAnimator) | |
State of one of a villager's offers (decision E-414), by the offer's id: how often it was traded since the last restock and how far demand raised its price | |
What is saved of a villager (decisions E-411, E-414): the village it lives in, its bed (head) and workstation (claimed there under its creature's persistent id, QcCreature::uid, decision E-420), its profession with level and experience, the state of its offers and when it last restocked, the seed and village style of its look, the crops it brought in (food for breeding, stage 37.3) and when it last slept (decision E-470) | |
Villagers moving between villages (decision E-490), checked every few seconds by QcVillagePopulation | |
What a relocation reads | |
Long walks through a village (decision E-411): a path search covers only 64 x 64 cells around the walker (QcPathWindow, decision E-400), so a villager whose goal lies farther first walks to the cell of the village's roads that brings it closest to the goal along the roads, and from there on (legs) | |
Offers of the villagers (decision E-414): the offers of each profession from the trade sets of the content (QcTradeSet; offers naming an unknown item are left out with a warning), which of them a villager has, their price, the villager's experience and level, and restocking | |
An offer with its items resolved; costs at the base price | |
Villages of a world (decision E-403), loaded or not: kept in villages.json | |
Bounds of the villages (QcServerLimits) | |
/weather (decision E-395): everyone may ask for the weather, operators set it, for a number of seconds or as long as the world's course says (QcWeatherCycle) | |
Random draws of one tick for purpose (strikes, snowfall), from the seed and the tick the weather has reached: the same world draws the same in the same tick, whenever the server was started | |
A world frozen for its copy: the staging folder with its files and where the backup goes | |
A finished backup: its folder, the number of files and their size in bytes | |
Maintenance of the world (decisions E-245, E-246): saving, backups, the world's numbers, removing entities and stopping the server | |
Reads and writes the files of one world directory besides its chunks: world.json, players (players/<name>-<hash>.qcp) and pending neighbour updates (blockupdates.qce) |
Detailed Description
Uses qc_common, qc_network and qc_worldgen.