Skip to content

Commit e66a244

Browse files
committed
feat: source-verified doc pass + tutorial QA
11-agent operation: indexed 2,956 source files, verified all 101 doc pages against actual C++ source, created 6 new pages (dedicated server, DLC pipeline, telemetry, leaderboards, tutorial system, console enums). Key fixes: - Audio docs rewrote from Miles Sound System to miniaudio (wrong engine) - Rendering: fixed MAX_LEVEL_RENDER_SIZE indexing, AllowAllCuller inheritance - Entities: fixed projectile hierarchy, missing Wolf AI goal param - Dimensions: added missing ServerLevelArray expansion step - Tutorials: added missing umbrella header steps, build system steps, stdafx.h includes, fixed Container->SimpleContainer in workbench template, fixed _Tier->Item::Tier syntax in ruby-tools template - Removed fake registerAttributes() call from AI tutorial - Fixed Aether-specific slotW/slotH to LCEMP's slotSize in texture docs
1 parent f483a43 commit e66a244

67 files changed

Lines changed: 4718 additions & 483 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

SOURCE_INDEX.md

Lines changed: 1366 additions & 0 deletions
Large diffs are not rendered by default.

astro.config.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ export default defineConfig({
8686
{ label: 'PS3', slug: 'platforms/ps3' },
8787
{ label: 'PS4 (Orbis)', slug: 'platforms/orbis' },
8888
{ label: 'PS Vita', slug: 'platforms/psvita' },
89+
{ label: 'Dedicated Server', slug: 'platforms/dedicated-server' },
90+
{ label: 'DLC Pipeline', slug: 'platforms/dlc-pipeline' },
91+
{ label: 'Telemetry', slug: 'platforms/telemetry' },
92+
{ label: 'Leaderboards', slug: 'platforms/leaderboards' },
93+
{ label: 'Tutorial System', slug: 'platforms/tutorial-system' },
8994
],
9095
},
9196
{
@@ -197,6 +202,7 @@ export default defineConfig({
197202
{ label: 'Packet ID Registry', slug: 'reference/packet-ids' },
198203
{ label: 'Tile Class Index', slug: 'reference/tile-classes' },
199204
{ label: 'Complete File Index', slug: 'reference/file-index' },
205+
{ label: 'Console Enums & Structs', slug: 'reference/console-enums' },
200206
],
201207
},
202208
],

src/content/docs/client/audio.md

Lines changed: 74 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ title: "Audio"
33
description: "Sound system in LCE."
44
---
55

6-
LCE's audio system is built on the Miles Sound System (MSS) library, wrapped in a two-class hierarchy. `ConsoleSoundEngine` defines the platform interface, and `SoundEngine` provides the shared implementation. The system handles positional 3D audio, background music streaming, and UI sound effects.
6+
LCE's audio system is wrapped in a two-class hierarchy. `ConsoleSoundEngine` defines the platform interface, and `SoundEngine` provides the shared implementation. The system handles positional 3D audio, background music streaming, and UI sound effects.
7+
8+
The original console builds used the **Miles Sound System** (MSS) library from RAD Game Tools. LCEMP has replaced Miles with **miniaudio** (`miniaudio.h`), a single-header C audio library. The API surface is the same (the `ConsoleSoundEngine` interface hasn't changed), but the backend is different. Xbox 360 used native XAudio instead of Miles.
79

810
## Architecture
911

@@ -48,31 +50,28 @@ The sound name tables (`wchSoundNames` and `wchUISoundNames`) map sound type enu
4850
4951
### SoundEngine (implementation)
5052
51-
`SoundEngine` extends `ConsoleSoundEngine` with the Miles Sound System backend:
53+
`SoundEngine` extends `ConsoleSoundEngine`. In LCEMP, it uses miniaudio as the backend:
5254
5355
```cpp
5456
class SoundEngine : public ConsoleSoundEngine {
5557
static const int MAX_SAME_SOUNDS_PLAYING = 8;
5658
57-
HMSOUNDBANK m_hBank; // sound bank handle
58-
HDIGDRIVER m_hDriver; // audio driver handle
59-
HSTREAM m_hStream; // streaming handle
59+
ma_engine m_maEngine; // miniaudio engine
60+
bool m_maEngineInitialized;
61+
62+
ma_sound m_activeSounds[MA_MAX_SOUNDS]; // active sound pool (64 slots)
63+
bool m_activeSoundUsed[MA_MAX_SOUNDS];
64+
65+
ma_sound m_musicStream; // current streaming music
66+
bool m_musicStreamActive;
6067
};
6168
```
6269

63-
## Miles Sound System integration
70+
`MA_MAX_SOUNDS` is 64, the maximum number of sounds that can play at once. The engine manages this pool with `findFreeSoundSlot()` (finds a free slot) and `cleanupFinishedSounds()` (reclaims slots from finished sounds).
6471

65-
The Miles Sound System headers are included per platform:
66-
67-
| Platform | Header path |
68-
|---|---|
69-
| PS3 | `PS3/Miles/include/mss.h` |
70-
| PS Vita | `PSVITA/Miles/include/mss.h` |
71-
| Xbox One (Durango) | `Durango/Miles/include/mss.h` |
72-
| PS4 (Orbis) | `Orbis/Miles/include/mss.h` |
73-
| Windows 64 | `Windows64/Miles/include/mss.h` |
74-
75-
Xbox 360 uses the native XAudio system instead of Miles.
72+
:::note
73+
The original console builds used the Miles Sound System (MSS). The MSS headers were included per platform (`PS3/Miles/include/mss.h`, `PSVITA/Miles/include/mss.h`, `Durango/Miles/include/mss.h`, `Orbis/Miles/include/mss.h`, `Windows64/Miles/include/mss.h`). Xbox 360 used native XAudio instead of Miles. LCEMP replaced all of this with miniaudio.
74+
:::
7675

7776
## The sound pipeline
7877

@@ -93,7 +92,7 @@ SoundEngine::playUI() -- non-positional UI sound
9392
SoundEngine::playStreaming() -- music / jukebox
9493
```
9594

96-
When `SoundEngine::play()` fires, it builds a Miles event name like `"Minecraft/mob.zombie"` from the dot-separated string and enqueues it to the event system. `ConvertSoundPathToName()` handles the conversion from dots to the slash-separated event paths that Miles expects.
95+
When `SoundEngine::play()` fires, it converts the dot-separated sound name to a file path using `ConvertSoundPathToName()` and plays it through the audio backend. In the original Miles builds, this produced event names like `"Minecraft/mob.zombie"`. In LCEMP's miniaudio backend, it resolves to audio files on disk.
9796

9897
## 3D audio
9998

@@ -158,7 +157,7 @@ The `fSoundClipDist` parameter (default 16 blocks) controls how far away a sound
158157
159158
## Sound attenuation
160159
161-
All 3D sounds use a custom linear falloff function instead of the default Miles rolloff:
160+
All 3D sounds use a custom linear falloff function instead of the default engine rolloff. In the original Miles builds, this was registered as a callback. LCEMP implements the same logic in miniaudio:
162161
163162
```cpp
164163
F32 AILCALLBACK custom_falloff_function(
@@ -207,44 +206,67 @@ Ambient, hurt, death, and step sounds for every mob:
207206
| `eSoundType_MOB_WOLF_PANTING` | `mob.wolf.panting` | Tamed wolf panting |
208207
| `eSoundType_MOB_WOLF_WHINE` | `mob.wolf.whine` | Wolf whine |
209208
| `eSoundType_MOB_WOLF_SHAKE` | `mob.wolf.shake` | Wolf shaking off water |
210-
| `eSoundType_MOB_CAT_HISS` | `mob.cat.hiss` | Cat hiss |
209+
| `eSoundType_MOB_CAT_HITT` | `mob.cat.hit` | Cat hit |
211210
| `eSoundType_MOB_CAT_PURR` | `mob.cat.purr` | Cat purr |
212-
| `eSoundType_MOB_CAT_PURREOW` | `mob.cat.purreow` | Cat meow |
211+
| `eSoundType_MOB_CAT_PURREOW` | `mob.cat.purreow` | Cat purr-meow |
212+
| `eSoundType_MOB_CAT_MEOW` | `mob.cat.meow` | Cat meow |
213213
| `eSoundType_MOB_CHICKEN_AMBIENT` | `mob.chicken` | Chicken clucking |
214214
| `eSoundType_MOB_CHICKEN_HURT` | `mob.chickenhurt` | Chicken hurt |
215-
| `eSoundType_MOB_CHICKEN_PLOP` | `mob.chicken.plop` | Egg laying |
215+
| `eSoundType_MOB_CHICKENPLOP` | `mob.chickenplop` | Egg laying |
216216
| `eSoundType_MOB_COW_AMBIENT` | `mob.cow` | Cow mooing |
217217
| `eSoundType_MOB_COW_HURT` | `mob.cowhurt` | Cow hurt |
218218
| `eSoundType_MOB_PIG_AMBIENT` | `mob.pig` | Pig oinking |
219219
| `eSoundType_MOB_PIG_DEATH` | `mob.pig.death` | Pig death |
220220
| `eSoundType_MOB_SHEEP_AMBIENT` | `mob.sheep` | Sheep bleating |
221-
| `eSoundType_MOB_GHAST_AMBIENT` | `mob.ghast.moan` | Ghast moaning |
221+
| `eSoundType_MOB_GHAST_MOAN` | `mob.ghast.moan` | Ghast moaning |
222222
| `eSoundType_MOB_GHAST_DEATH` | `mob.ghast.death` | Ghast death |
223223
| `eSoundType_MOB_GHAST_FIREBALL` | `mob.ghast.fireball` | Ghast shooting |
224224
| `eSoundType_MOB_GHAST_SCREAM` | `mob.ghast.scream` | Ghast screaming |
225-
| `eSoundType_MOB_BLAZE_HIT` | `mob.blaze.hit` | Blaze hurt |
225+
| `eSoundType_MOB_GHAST_CHARGE` | `mob.ghast.charge` | Ghast charging |
226+
| `eSoundType_MOB_BLAZE_HURT` | `mob.blaze.hit` | Blaze hurt |
226227
| `eSoundType_MOB_BLAZE_DEATH` | `mob.blaze.death` | Blaze death |
227228
| `eSoundType_MOB_BLAZE_BREATHE` | `mob.blaze.breathe` | Blaze ambient |
228-
| `eSoundType_MOB_ENDERMAN_IDLE` | `mob.endermen.idle` | Enderman ambient |
229-
| `eSoundType_MOB_ENDERMAN_HIT` | `mob.endermen.hit` | Enderman hurt |
230-
| `eSoundType_MOB_ENDERMAN_DEATH` | `mob.endermen.death` | Enderman death |
231-
| `eSoundType_MOB_ENDERMAN_PORTAL` | `mob.endermen.portal` | Enderman teleport |
229+
| `eSoundType_MOB_ENDERMEN_IDLE` | `mob.endermen.idle` | Enderman ambient |
230+
| `eSoundType_MOB_ENDERMEN_HIT` | `mob.endermen.hit` | Enderman hurt |
231+
| `eSoundType_MOB_ENDERMEN_DEATH` | `mob.endermen.death` | Enderman death |
232+
| `eSoundType_MOB_ENDERMEN_PORTAL` | `mob.endermen.portal` | Enderman teleport |
233+
| `eSoundType_MOB_ZOMBIEPIG_AMBIENT` | `mob.zombiepig.zpig` | Zombie pigman idle |
234+
| `eSoundType_MOB_ZOMBIEPIG_HURT` | `mob.zombiepig.zpighurt` | Zombie pigman hurt |
235+
| `eSoundType_MOB_ZOMBIEPIG_DEATH` | `mob.zombiepig.zpigdeath` | Zombie pigman death |
236+
| `eSoundType_MOB_ZOMBIEPIG_ZPIGANGRY` | `mob.zombiepig.zpigangry` | Zombie pigman angry |
232237
| `eSoundType_MOB_ENDERDRAGON_GROWL` | `mob.enderdragon.growl` | Dragon growl |
233238
| `eSoundType_MOB_ENDERDRAGON_HIT` | `mob.enderdragon.hit` | Dragon hurt |
234-
| `eSoundType_MOB_ENDERDRAGON_WINGS` | `mob.enderdragon.wings` | Dragon wingflap |
239+
| `eSoundType_MOB_ENDERDRAGON_MOVE` | `mob.enderdragon.move` | Dragon wingflap |
235240
| `eSoundType_MOB_ENDERDRAGON_END` | `mob.enderdragon.end` | Dragon death |
236241
| `eSoundType_MOB_SILVERFISH_AMBIENT` | `mob.silverfish.say` | Silverfish ambient |
237-
| `eSoundType_MOB_SILVERFISH_HIT` | `mob.silverfish.hit` | Silverfish hurt |
242+
| `eSoundType_MOB_SILVERFISH_HURT` | `mob.silverfish.hit` | Silverfish hurt |
238243
| `eSoundType_MOB_SILVERFISH_DEATH` | `mob.silverfish.kill` | Silverfish death |
239244
| `eSoundType_MOB_SILVERFISH_STEP` | `mob.silverfish.step` | Silverfish walk |
240-
| `eSoundType_MOB_GOLEM_HIT` | `mob.irongolem.hit` | Iron golem hurt |
241-
| `eSoundType_MOB_GOLEM_DEATH` | `mob.irongolem.death` | Iron golem death |
242-
| `eSoundType_MOB_GOLEM_WALK` | `mob.irongolem.walk` | Iron golem walk |
243-
| `eSoundType_MOB_GOLEM_THROW` | `mob.irongolem.throw` | Iron golem throw |
244-
| `eSoundType_MOB_SLIME_BIG` | `mob.slime.big` | Large slime |
245-
| `eSoundType_MOB_SLIME_SMALL` | `mob.slime.small` | Small slime |
245+
| `eSoundType_MOB_SKELETON_AMBIENT` | `mob.skeleton` | Skeleton ambient |
246+
| `eSoundType_MOB_SKELETON_HURT` | `mob.skeleton.hurt` | Skeleton hurt |
247+
| `eSoundType_MOB_SPIDER_AMBIENT` | `mob.spider` | Spider ambient |
248+
| `eSoundType_MOB_SPIDER_DEATH` | `mob.spiderdeath` | Spider death |
249+
| `eSoundType_MOB_SLIME` | `mob.slime` | Slime |
250+
| `eSoundType_MOB_SLIME_ATTACK` | `mob.slimeattack` | Slime attack |
251+
| `eSoundType_MOB_CREEPER_DEATH` | `mob.creeperdeath` | Creeper death |
252+
| `eSoundType_MOB_ZOMBIE_WOOD` | `mob.zombie.wood` | Zombie hitting wood door |
253+
| `eSoundType_MOB_ZOMBIE_WOOD_BREAK` | `mob.zombie.woodbreak` | Zombie breaking wood door |
254+
| `eSoundType_MOB_ZOMBIE_METAL` | `mob.zombie.metal` | Zombie hitting metal door |
246255
| `eSoundType_MOB_MAGMACUBE_BIG` | `mob.magmacube.big` | Large magma cube |
247-
| `eSoundType_MOB_MAGMACUBE_JUMP` | `mob.magmacube.small` | Magma cube jump |
256+
| `eSoundType_MOB_MAGMACUBE_SMALL` | `mob.magmacube.small` | Small magma cube |
257+
| `eSoundType_MOB_IRONGOLEM_THROW` | `mob.irongolem.throw` | Iron golem throw |
258+
| `eSoundType_MOB_IRONGOLEM_HIT` | `mob.irongolem.hit` | Iron golem hurt |
259+
| `eSoundType_MOB_IRONGOLEM_DEATH` | `mob.irongolem.death` | Iron golem death |
260+
| `eSoundType_MOB_IRONGOLEM_WALK` | `mob.irongolem.walk` | Iron golem walk |
261+
| `eSoundType_MOB_VILLAGER_HAGGLE` | `mob.villager.haggle` | Villager trading |
262+
| `eSoundType_MOB_VILLAGER_IDLE` | `mob.villager.idle` | Villager ambient |
263+
| `eSoundType_MOB_VILLAGER_HIT` | `mob.villager.hit` | Villager hurt |
264+
| `eSoundType_MOB_VILLAGER_DEATH` | `mob.villager.death` | Villager death |
265+
| `eSoundType_MOB_VILLAGER_YES` | `mob.villager.yes` | Villager accepting trade |
266+
| `eSoundType_MOB_VILLAGER_NO` | `mob.villager.no` | Villager declining trade |
267+
| `eSoundType_MOB_ZOMBIE_INFECT` | `mob.zombie.infect` | Zombie infecting villager |
268+
| `eSoundType_MOB_ZOMBIE_UNFECT` | `mob.zombie.unfect` | Zombie villager curing |
269+
| `eSoundType_MOB_ZOMBIE_REMEDY` | `mob.zombie.remedy` | Zombie cure remedy |
248270

249271
### Block/tile sounds (`step.*`, `dig.*`, `tile.*`)
250272

@@ -254,6 +276,7 @@ Ambient, hurt, death, and step sounds for every mob:
254276
| `eSoundType_STEP_WOOD` | `step.wood` | Walking on wood |
255277
| `eSoundType_STEP_GRAVEL` | `step.gravel` | Walking on gravel |
256278
| `eSoundType_STEP_GRASS` | `step.grass` | Walking on grass |
279+
| `eSoundType_STEP_METAL` | `step.metal` | Walking on metal |
257280
| `eSoundType_STEP_CLOTH` | `step.cloth` | Walking on wool |
258281
| `eSoundType_STEP_SAND` | `step.sand` | Walking on sand |
259282
| `eSoundType_STEP_SNOW` | `step.snow` | Walking on snow |
@@ -281,7 +304,6 @@ Ambient, hurt, death, and step sounds for every mob:
281304
| `eSoundType_RANDOM_CLICK` | `random.click` | Buttons, levers |
282305
| `eSoundType_RANDOM_GLASS` | `random.glass` | Breaking glass |
283306
| `eSoundType_RANDOM_FIZZ` | `random.fizz` | Fire extinguish, lava pop |
284-
| `eSoundType_RANDOM_LEVELUP` | `random.levelup` | Experience level up |
285307
| `eSoundType_RANDOM_POP` | `random.pop` | Item pickup |
286308
| `eSoundType_RANDOM_ORB` | `random.orb` | Experience orb pickup |
287309
| `eSoundType_RANDOM_SPLASH` | `random.splash` | Water splash |
@@ -291,7 +313,9 @@ Ambient, hurt, death, and step sounds for every mob:
291313
| `eSoundType_RANDOM_ANVIL_LAND` | `random.anvil_land` | Falling anvil landing |
292314
| `eSoundType_RANDOM_ANVIL_BREAK` | `random.anvil_break` | Anvil breaking |
293315
| `eSoundType_RANDOM_FUSE` | `random.fuse` | TNT fuse |
294-
| `eSoundType_RANDOM_BOWHIT` | `random.bowhit` | Arrow hitting target |
316+
| `eSoundType_RANDOM_BOW_HIT` | `random.bowhit` | Arrow hitting target |
317+
| `eSoundType_RANDOM_BURP` | `random.burp` | Burping after eating |
318+
| `eSoundType_RANDOM_BREAK` | `random.break` | Item breaking |
295319

296320
### Ambient sounds (`ambient.*`)
297321

@@ -307,7 +331,7 @@ Ambient, hurt, death, and step sounds for every mob:
307331
|---|---|---|
308332
| `portal.*` | `portal.portal`, `portal.trigger`, `portal.travel` | Portal effects |
309333
| `fire.*` | `fire.ignite`, `fire.fire` | Fire sounds |
310-
| `damage.*` | `damage.hurtflesh`, `damage.fallsmall`, `damage.fallbig` | Player damage |
334+
| `damage.*` | `damage.hurtflesh`, `damage.fallsmall`, `damage.fallbig`, `damage.thorns` | Player damage |
311335
| `note.*` | `note.harp`, `note.bd`, `note.snare`, `note.hat`, `note.bassattack` | Note blocks |
312336
| `liquid.*` | `liquid.water`, `liquid.lava`, `liquid.lavapop` | Liquid sounds |
313337
| `minecart.*` | `minecart.base`, `minecart.inside` | Minecart movement |
@@ -450,10 +474,9 @@ The master volumes (`m_MasterMusicVolume`, `m_MasterEffectsVolume`) are set from
450474
451475
## Sound bank and driver
452476
453-
The Miles Sound System uses:
454-
- **`HMSOUNDBANK m_hBank`** is the loaded sound bank containing all SFX (`Minecraft.msscmp`)
455-
- **`HDIGDRIVER m_hDriver`** is the digital audio driver
456-
- **`HSTREAM m_hStream`** is the current streaming music handle
477+
In the original console builds, the Miles Sound System used a compiled sound bank (`Minecraft.msscmp`) containing all SFX, loaded into `HMSOUNDBANK m_hBank`. `HDIGDRIVER m_hDriver` was the audio driver handle, and `HSTREAM m_hStream` was the streaming music handle.
478+
479+
LCEMP replaces this with miniaudio. The `ma_engine` handles mixing and output, `ma_sound` instances manage individual sounds (up to 64 active in `m_activeSounds[]`), and `m_musicStream` handles the current streaming track.
457480
458481
Sound files and music files get registered through `add()`, `addMusic()`, and `addStreaming()` during initialization.
459482
@@ -467,10 +490,14 @@ Audio resources are stored in:
467490
468491
## Platform-specific notes
469492
470-
- **PS3**: `initAudioHardware()` has a platform-specific implementation for Cell audio initialization
493+
These notes apply to the original console builds, not LCEMP:
494+
495+
- **PS3**: `initAudioHardware()` has a platform-specific implementation for Cell audio initialization. There is also a `PS3_SoundEngine.cpp` with PS3-specific Miles integration.
471496
- **PS4 (Orbis)**: Uses `int32_t m_hBGMAudio` for the background music audio handle
472497
- **PS Vita**: Miles integration through a Vita-specific MSS build with `updateMiles()` called during the mixer callback
473-
- **Xbox 360**: Uses native XAudio instead of Miles (no `mss.h` include)
498+
- **Xbox 360**: Uses native XAudio instead of Miles (no `mss.h` include). Has its own `Xbox/Audio/SoundEngine.cpp` and `SoundEngine.h`
499+
500+
LCEMP uses miniaudio on all platforms. The `initAudioHardware()` method is a no-op stub that just returns its input parameter.
474501
475502
## MinecraftConsoles differences
476503
@@ -518,4 +545,4 @@ A bunch of mob step sounds are added that LCEMP was missing:
518545
519546
### Bug fix
520547
521-
`eSoundType_MOB_CAT_HITT` (typo with double T) is fixed to `eSoundType_MOB_CAT_HIT`.
548+
`eSoundType_MOB_CAT_HITT` (typo with double T in LCEMP) is renamed to `eSoundType_MOB_CAT_HIT` in MinecraftConsoles.

src/content/docs/client/input.md

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,27 @@ extern KeyboardMouseInput g_KBMInput;
3939

4040
#### Key constants
4141

42-
| Constant | Key | Value |
43-
|---|---|---|
44-
| `KEY_FORWARD` | W | `'W'` |
45-
| `KEY_BACKWARD` | S | `'S'` |
46-
| `KEY_LEFT` | A | `'A'` |
47-
| `KEY_RIGHT` | D | `'D'` |
48-
| `KEY_JUMP` | Space | `VK_SPACE` |
49-
| `KEY_SNEAK` | Left Shift | `VK_LSHIFT` |
50-
| `KEY_SPRINT` | Left Ctrl | `VK_LCONTROL` |
51-
| `KEY_INVENTORY` | E | `'E'` |
52-
| `KEY_DROP` | Q | `'Q'` |
53-
| `KEY_CRAFTING` | Tab | `VK_TAB` |
54-
| `KEY_CRAFTING_ALT` | R | `'R'` |
55-
| `KEY_CONFIRM` | Enter | `VK_RETURN` |
56-
| `KEY_CANCEL` | Backspace | `VK_BACK` |
57-
| `KEY_PAUSE` | Escape | `VK_ESCAPE` |
58-
| `KEY_THIRD_PERSON` | F5 | `VK_F5` |
59-
| `KEY_DEBUG_INFO` | F3 | `VK_F3` |
60-
61-
These are hardcoded `static const int` values on the class. They aren't remappable through the input system itself, but the `Options` class has a separate `KeyMapping` system for the Java-style key bindings (see below).
42+
| Constant | Key | Value | Mutable? |
43+
|---|---|---|---|
44+
| `KEY_FORWARD` | W | `'W'` | Yes |
45+
| `KEY_BACKWARD` | S | `'S'` | Yes |
46+
| `KEY_LEFT` | A | `'A'` | Yes |
47+
| `KEY_RIGHT` | D | `'D'` | Yes |
48+
| `KEY_JUMP` | Space | `VK_SPACE` | Yes |
49+
| `KEY_SNEAK` | Left Shift | `VK_LSHIFT` | Yes |
50+
| `KEY_SPRINT` | Left Ctrl | `VK_LCONTROL` | Yes |
51+
| `KEY_INVENTORY` | E | `'E'` | Yes |
52+
| `KEY_DROP` | Q | `'Q'` | Yes |
53+
| `KEY_CRAFTING` | Tab | `VK_TAB` | Yes |
54+
| `KEY_CRAFTING_ALT` | R | `'R'` | No (const) |
55+
| `KEY_CONFIRM` | Enter | `VK_RETURN` | Yes |
56+
| `KEY_CANCEL` | Backspace | `VK_BACK` | No (const) |
57+
| `KEY_PAUSE` | Escape | `VK_ESCAPE` | Yes |
58+
| `KEY_THIRD_PERSON` | F5 | `VK_F5` | Yes |
59+
| `KEY_DEBUG_INFO` | F3 | `VK_F3` | Yes |
60+
| `KEY_VOICE` | (varies) | (varies) | Yes |
61+
62+
Most of these are `static int` (not const), so they can be remapped at runtime. Only `KEY_CRAFTING_ALT` and `KEY_CANCEL` are `static const int`. The `Options` class has a separate `KeyMapping` system for the Java-style key bindings (see below).
6263

6364
`MAX_KEYS` = 256 covers all Windows virtual key codes.
6465

@@ -112,6 +113,7 @@ Mouse position is tracked separately:
112113
| `SetWindowFocused(bool)` | Track window focus state. `IsWindowFocused()` queries. |
113114
| `SetKBMActive(bool)` | Mark keyboard/mouse as the active input device. `IsKBMActive()` queries. |
114115
| `SetScreenCursorHidden(bool)` | Screen-level cursor hide request. `IsScreenCursorHidden()` queries. |
116+
| `HadRawMouseInput()` | Returns `m_hadRawMouseInput`, true when raw mouse delta was received this tick. Useful for detecting mouse activity independently of keyboard. |
115117
| `HasAnyInput()` | Returns `m_hasInput`, which is true when any key or mouse event has happened. Used for auto-detecting whether to switch between controller and keyboard/mouse input modes. |
116118

117119
## Controller input (EControllerActions)

src/content/docs/client/particles.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ The first dimension (3) supports rendering across multiple dimensions at the sam
5555
| `crack(int x, int y, int z, int face)` | Spawn block-cracking particles on a face |
5656
| `countParticles()` | Returns a string with particle counts for debug |
5757

58-
`render()` and `renderLit()` are called at different points in the frame. `render()` handles standard particles with additive or alpha blending. `renderLit()` handles particles that need proper world lighting (block break debris, item break debris).
58+
`render()` and `renderLit()` are called at different points in the frame. `render()` handles standard particles with additive or alpha blending, including block break debris (`TERRAIN_TEXTURE`, layer 1) and item break debris (`ITEM_TEXTURE`, layer 2). `renderLit()` renders the `ENTITY_PARTICLE_TEXTURE` layer (layer 3), which includes footstep particles and huge explosion particles. These are rendered individually instead of batched, so they can set up their own GL state.
5959

6060
### Spawning from LevelRenderer
6161

0 commit comments

Comments
 (0)