mirror of
https://github.com/horizon-rust/horizon.git
synced 2026-11-10 02:21:33 -10:00
Merge origin/main into vr/aim-ray
lan_pvp.rs: keep main's mace::Spared import, drop view_vector (aim() replaces it). Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
commit
70b51333d3
138 files changed
+18861
-227
No files matched your search
@@ -0,0 +1,76 @@
|
||||
---
|
||||
name: vanilla-parity
|
||||
description: Fix a Horizon bug or gap so it behaves 1:1 like vanilla 26.3, starting from the port ledger (tools/port_ledger.py) instead of grepping. Use for any issue, Discord report or PR that makes Horizon match vanilla: "X doesn't work like in Java", a missing sound, particle, animation, mob behaviour, block rule, screen or packet.
|
||||
---
|
||||
|
||||
# Vanilla parity with the port ledger
|
||||
|
||||
The port ledger pairs every vanilla method with the Rust fn that ports it (or says it is missing, or needs
|
||||
no port) and lists where a port isn't wired like vanilla. Ask it first; grep only for what it can't answer.
|
||||
Full reference: `docs/port-ledger.md`.
|
||||
|
||||
## 0. Have a fresh ledger
|
||||
|
||||
```sh
|
||||
python3 tools/port_ledger.py build # ~20 s; again after pulling main
|
||||
```
|
||||
|
||||
It needs the vanilla jar (the launcher's `versions/26.3/26.3.jar`, or `--jar`) and/or the lab's decompiled
|
||||
sources (`python3 tools/lab.py decompile`, or `--sources DIR`). If `build` says it has no vanilla code, run
|
||||
the lab first; don't guess vanilla from memory.
|
||||
|
||||
## 1. From the report to the code
|
||||
|
||||
```sh
|
||||
python3 tools/port_ledger.py issue 3236 # a GitHub issue number
|
||||
python3 tools/port_ledger.py issue "mooshroom stays red after lightning" # or the report's text
|
||||
```
|
||||
|
||||
It ranks the vanilla classes the report names and lists, per class, its Rust home files, where each method is
|
||||
ported, and the known gaps (`missing` rows from the verdict map, seam/client/drift gaps). Often the cause is
|
||||
already written there ("Type is not saved"). Then drill in:
|
||||
|
||||
```sh
|
||||
python3 tools/port_ledger.py where MushroomCow.readAdditionalSaveData # ports, callers, callees, gaps
|
||||
python3 tools/port_ledger.py class MushroomCow # every method: where, or missing
|
||||
python3 tools/port_ledger.py what crates/horizon-client/src/mobs/farm.rs:120 # which vanilla method a fn ports
|
||||
```
|
||||
|
||||
A ledger answer is a lead, not a verdict: about 1 in 12 map rows is wrong. Read the vanilla method (path and
|
||||
line are in the output) and the Rust fn before changing anything.
|
||||
|
||||
## 2. Port it the vanilla way
|
||||
|
||||
- Translate the vanilla method, don't reinvent it: same order of operations, same constants, the same random
|
||||
draws in the same order (`horizon_core::random`), Java `Math` through `horizon_core::jmath`.
|
||||
- Open the fn's doc with the vanilla method it ports: `` /// `MushroomCow.readAdditionalSaveData`: ... ``.
|
||||
That one line is what makes the next agent find it.
|
||||
- Fix the path players run: single player is a client of the integrated server, so server logic lives in
|
||||
`game/lan*.rs` and `src/lan/`, and what only the client's copy shows (particles, local sounds, hand
|
||||
animation) must be reached from `game/remote*.rs`. A fix on the old in-frame path alone fixes nothing.
|
||||
- Look at the neighbours the ledger lists for the same class: a `client` or `seam` gap next to your fix is
|
||||
usually the same bug on the other path.
|
||||
|
||||
## 3. Before the PR
|
||||
|
||||
```sh
|
||||
python3 tools/port_ledger.py check --base origin/main
|
||||
```
|
||||
|
||||
It lists the ports your branch touches with their open gaps, citations to add, stale citations, and (against
|
||||
the base) the gaps the branch closes and opens. Close what belongs to your fix, cite what you ported, leave
|
||||
no new stale citation. If you ported a method the verdict map called `missing`, change its row in
|
||||
`tools/port_map/*.tsv` to `port` with the fn (`file.rs::Owner::fn`) and run
|
||||
`python3 tools/port_ledger.py map-check tools/port_map/<file>.tsv`.
|
||||
|
||||
Then the usual: the harness for the area (`docs/architecture.md`), `cargo check`/tests per `AGENTS.md`, and
|
||||
a small PR that says which vanilla method it now matches.
|
||||
|
||||
## Finding work
|
||||
|
||||
```sh
|
||||
python3 tools/port_ledger.py gaps --kind seam # ported on two paths, wired on one: the best leads
|
||||
python3 tools/port_ledger.py gaps --kind client # client-only effects the server path never reaches
|
||||
python3 tools/port_ledger.py gaps --kind drift # a port missing a sound, particle, item or constant
|
||||
rg -n "player:" tools/port_map/*.tsv # missing behaviour a player would see
|
||||
```
|
||||
@@ -100,6 +100,9 @@ python3 tools/agent_control_e2e.py # horizon-ctl / MCP end to end
|
||||
|
||||
## Vanilla reference
|
||||
|
||||
- Start parity work from the port ledger, not grep: `python3 tools/port_ledger.py issue N` (or `where
|
||||
Class.method`, `what file:line`), and `check --base origin/main` before the PR. How:
|
||||
[.claude/skills/vanilla-parity/SKILL.md](.claude/skills/vanilla-parity/SKILL.md), [docs/port-ledger.md](docs/port-ledger.md).
|
||||
- Decompiled sources: `.local/minecraft/26.3/sources/{client,server}/` (`python3 tools/lab.py decompile`).
|
||||
- Bytecode queries (callers through lambdas, every overload):
|
||||
`python3 tools/rea_vanilla.py method net.minecraft.world.level.block.DispenserBlock dispenseFrom`
|
||||
|
||||
@@ -40,6 +40,10 @@ static BIDIRECTIONAL: AtomicBool = AtomicBool::new(false);
|
||||
/// A source of resource files: the prepared root plus packs, highest priority last.
|
||||
pub trait ResourceSource {
|
||||
fn read(&self, path: &str) -> Option<Vec<u8>>;
|
||||
/// Whether `path` is there, without reading it where the source can tell.
|
||||
fn exists(&self, path: &str) -> bool {
|
||||
self.read(path).is_some()
|
||||
}
|
||||
/// The namespaces under `assets/` (resource packs may add their own).
|
||||
fn namespaces(&self) -> Vec<String> {
|
||||
vec!["minecraft".into()]
|
||||
@@ -68,6 +72,9 @@ impl ResourceSource for std::path::PathBuf {
|
||||
fn read(&self, path: &str) -> Option<Vec<u8>> {
|
||||
std::fs::read(self.join(path)).ok()
|
||||
}
|
||||
fn exists(&self, path: &str) -> bool {
|
||||
self.join(path).is_file()
|
||||
}
|
||||
fn namespaces(&self) -> Vec<String> {
|
||||
std::fs::read_dir(self.join("assets"))
|
||||
.into_iter()
|
||||
@@ -190,7 +197,7 @@ pub fn available(sources: &[&dyn ResourceSource]) -> Vec<LanguageInfo> {
|
||||
for (code, info) in value["language"].as_object().into_iter().flatten() {
|
||||
// Only languages whose file exists somewhere are selectable.
|
||||
let file = format!("assets/minecraft/lang/{code}.json");
|
||||
if code != DEFAULT && !sources.iter().any(|s| s.read(&file).is_some()) {
|
||||
if code != DEFAULT && !sources.iter().any(|s| s.exists(&file)) {
|
||||
continue;
|
||||
}
|
||||
found.insert(
|
||||
@@ -284,4 +291,26 @@ mod tests {
|
||||
);
|
||||
assert_eq!(langs[1].label(), "Français (France)");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn languages_are_listed_without_reading_their_files() {
|
||||
struct NoLangReads;
|
||||
impl ResourceSource for NoLangReads {
|
||||
fn read(&self, path: &str) -> Option<Vec<u8>> {
|
||||
assert!(!path.contains("/lang/"), "read {path}");
|
||||
(path == "assets/pack.mcmeta").then(|| {
|
||||
br#"{"language":{"fr_fr":{"name":"French"},"de_de":{"name":"German"}}}"#
|
||||
.to_vec()
|
||||
})
|
||||
}
|
||||
fn exists(&self, path: &str) -> bool {
|
||||
path == "assets/minecraft/lang/fr_fr.json"
|
||||
}
|
||||
}
|
||||
let langs = available(&[&NoLangReads]);
|
||||
assert_eq!(
|
||||
langs.iter().map(|l| l.code.as_str()).collect::<Vec<_>>(),
|
||||
["en_us", "fr_fr"]
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -196,7 +196,7 @@ impl Assets {
|
||||
impl RenderAssets {
|
||||
pub fn load(root: &Path, assets: &Assets) -> Result<Self> {
|
||||
let registry = assets.registry;
|
||||
let mut sprites = crate::sprites::Sprites::default();
|
||||
let mut sprites = crate::sprites::Sprites::with_disk_cache(root);
|
||||
for name in MATERIALS {
|
||||
sprites.insert(root, &format!("minecraft:block/{name}"))?;
|
||||
}
|
||||
@@ -217,6 +217,7 @@ impl RenderAssets {
|
||||
for stage in 0..10 {
|
||||
sprites.insert(root, &format!("minecraft:block/destroy_stage_{stage}"))?;
|
||||
}
|
||||
sprites.save_disk_cache();
|
||||
sprites.finish();
|
||||
// `finish` grows the buffer by doubling: keep only the bytes in use.
|
||||
sprites.pixels.shrink_to_fit();
|
||||
|
||||
@@ -187,7 +187,14 @@ pub fn list_textures(root: &Path) -> Vec<String> {
|
||||
};
|
||||
for e in entries.flatten() {
|
||||
let p = e.path();
|
||||
if p.is_dir() {
|
||||
// `file_type` comes with the listing; `Path::is_dir` is a stat per
|
||||
// entry, kept for links (which it follows).
|
||||
let dir = match e.file_type() {
|
||||
Ok(t) if t.is_symlink() => p.is_dir(),
|
||||
Ok(t) => t.is_dir(),
|
||||
Err(_) => p.is_dir(),
|
||||
};
|
||||
if dir {
|
||||
stack.push(p);
|
||||
} else if p.extension().is_some_and(|x| x == "png")
|
||||
&& let Ok(rel) = p.strip_prefix(&base)
|
||||
|
||||
@@ -70,6 +70,7 @@ pub mod skins;
|
||||
pub mod sound_engine;
|
||||
pub mod sound_events;
|
||||
pub mod spans;
|
||||
mod sprite_cache;
|
||||
pub mod sprites;
|
||||
pub mod streaming;
|
||||
pub mod tab_list;
|
||||
|
||||
@@ -0,0 +1,345 @@
|
||||
//! Decoded block sprites kept on disk between launches (M-11): reading and
|
||||
//! decoding ~1300 small PNGs is most of `Sprites::load`. One file per resource
|
||||
//! root, valid only while the `textures` trees still have the same paths,
|
||||
//! sizes and modification times and the format version is the same; anything
|
||||
//! else (missing, corrupt, stale, unwritable) means the normal decoding path.
|
||||
use crate::mipmap::Strategy;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
fs,
|
||||
hash::{DefaultHasher, Hash, Hasher},
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
|
||||
const MAGIC: &[u8; 4] = b"HSPR";
|
||||
/// Bump when `Decoded` or the decoding in `Sprites::decode` changes.
|
||||
const VERSION: u32 = 1;
|
||||
const FILE: &str = "horizon-sprites.cache";
|
||||
|
||||
/// What decoding one texture gives, before it takes a layer.
|
||||
#[derive(Clone)]
|
||||
pub(crate) struct Decoded {
|
||||
pub side: u32,
|
||||
pub frames: Vec<Vec<u8>>,
|
||||
/// The `.mcmeta` `animation` value, as text.
|
||||
pub animation: Option<String>,
|
||||
pub strategy: Strategy,
|
||||
pub alpha_cutoff_bias: f32,
|
||||
pub has_transparent: bool,
|
||||
pub opaque: bool,
|
||||
pub translucent: bool,
|
||||
}
|
||||
|
||||
pub(crate) struct SpriteCache {
|
||||
path: PathBuf,
|
||||
fingerprint: u64,
|
||||
entries: HashMap<String, Decoded>,
|
||||
dirty: bool,
|
||||
}
|
||||
|
||||
/// Paths, sizes and modification times of every file under `assets/*/textures`,
|
||||
/// summed so the directory order does not matter.
|
||||
fn fingerprint(root: &Path) -> Option<u64> {
|
||||
fn walk(dir: &Path, base: &Path, sum: &mut u64) -> Option<()> {
|
||||
for entry in fs::read_dir(dir).ok()? {
|
||||
let entry = entry.ok()?;
|
||||
let meta = entry.metadata().ok()?;
|
||||
if meta.is_dir() {
|
||||
walk(&entry.path(), base, sum)?;
|
||||
continue;
|
||||
}
|
||||
let mut hasher = DefaultHasher::new();
|
||||
entry.path().strip_prefix(base).ok()?.hash(&mut hasher);
|
||||
meta.len().hash(&mut hasher);
|
||||
meta.modified().ok()?.hash(&mut hasher);
|
||||
*sum = sum.wrapping_add(hasher.finish());
|
||||
}
|
||||
Some(())
|
||||
}
|
||||
let mut sum = 0;
|
||||
for namespace in fs::read_dir(root.join("assets")).ok()? {
|
||||
let textures = namespace.ok()?.path().join("textures");
|
||||
if textures.is_dir() {
|
||||
walk(&textures, root, &mut sum)?;
|
||||
}
|
||||
}
|
||||
Some(sum)
|
||||
}
|
||||
|
||||
impl SpriteCache {
|
||||
/// The cache of `root`: its stored entries when still valid, else empty.
|
||||
/// `None` when the textures cannot be fingerprinted (no caching then).
|
||||
pub fn open(root: &Path) -> Option<Self> {
|
||||
let fingerprint = fingerprint(root)?;
|
||||
let path = root.join(FILE);
|
||||
let entries = fs::read(&path)
|
||||
.ok()
|
||||
.and_then(|bytes| parse(&bytes, fingerprint))
|
||||
.unwrap_or_default();
|
||||
Some(Self {
|
||||
path,
|
||||
fingerprint,
|
||||
entries,
|
||||
dirty: false,
|
||||
})
|
||||
}
|
||||
pub fn get(&self, name: &str) -> Option<&Decoded> {
|
||||
self.entries.get(name)
|
||||
}
|
||||
pub fn insert(&mut self, name: &str, decoded: Decoded) {
|
||||
self.entries.insert(name.to_owned(), decoded);
|
||||
self.dirty = true;
|
||||
}
|
||||
/// Write new entries; a failure only costs the next launch the decoding.
|
||||
pub fn save(&mut self) {
|
||||
if !self.dirty {
|
||||
return;
|
||||
}
|
||||
self.dirty = false;
|
||||
let temporary = self
|
||||
.path
|
||||
.with_extension(format!("{}.tmp", std::process::id()));
|
||||
if fs::write(&temporary, serialize(self.fingerprint, &self.entries)).is_ok()
|
||||
&& fs::rename(&temporary, &self.path).is_err()
|
||||
{
|
||||
let _ = fs::remove_file(&temporary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn serialize(fingerprint: u64, entries: &HashMap<String, Decoded>) -> Vec<u8> {
|
||||
let mut out = Vec::new();
|
||||
out.extend_from_slice(MAGIC);
|
||||
out.extend_from_slice(&VERSION.to_le_bytes());
|
||||
out.extend_from_slice(&fingerprint.to_le_bytes());
|
||||
out.extend_from_slice(&(entries.len() as u32).to_le_bytes());
|
||||
for (name, d) in entries {
|
||||
put_bytes(&mut out, name.as_bytes());
|
||||
out.extend_from_slice(&d.side.to_le_bytes());
|
||||
out.extend_from_slice(&(d.frames.len() as u32).to_le_bytes());
|
||||
for frame in &d.frames {
|
||||
put_bytes(&mut out, frame);
|
||||
}
|
||||
put_bytes(&mut out, d.animation.as_deref().unwrap_or("").as_bytes());
|
||||
out.push(u8::from(d.animation.is_some()));
|
||||
out.push(d.strategy as u8);
|
||||
out.extend_from_slice(&d.alpha_cutoff_bias.to_bits().to_le_bytes());
|
||||
out.push(
|
||||
u8::from(d.has_transparent) | u8::from(d.opaque) << 1 | u8::from(d.translucent) << 2,
|
||||
);
|
||||
}
|
||||
out
|
||||
}
|
||||
fn put_bytes(out: &mut Vec<u8>, bytes: &[u8]) {
|
||||
out.extend_from_slice(&(bytes.len() as u32).to_le_bytes());
|
||||
out.extend_from_slice(bytes);
|
||||
}
|
||||
|
||||
struct Reader<'a>(&'a [u8]);
|
||||
impl<'a> Reader<'a> {
|
||||
fn take(&mut self, n: usize) -> Option<&'a [u8]> {
|
||||
let (head, tail) = self.0.split_at_checked(n)?;
|
||||
self.0 = tail;
|
||||
Some(head)
|
||||
}
|
||||
fn u32(&mut self) -> Option<u32> {
|
||||
Some(u32::from_le_bytes(self.take(4)?.try_into().ok()?))
|
||||
}
|
||||
fn bytes(&mut self) -> Option<&'a [u8]> {
|
||||
let n = self.u32()? as usize;
|
||||
self.take(n)
|
||||
}
|
||||
}
|
||||
fn parse(bytes: &[u8], fingerprint: u64) -> Option<HashMap<String, Decoded>> {
|
||||
let mut r = Reader(bytes);
|
||||
if r.take(4)? != MAGIC || r.u32()? != VERSION {
|
||||
return None;
|
||||
}
|
||||
if u64::from_le_bytes(r.take(8)?.try_into().ok()?) != fingerprint {
|
||||
return None;
|
||||
}
|
||||
let count = r.u32()?;
|
||||
let mut entries = HashMap::new();
|
||||
for _ in 0..count {
|
||||
let name = String::from_utf8(r.bytes()?.to_vec()).ok()?;
|
||||
let side = r.u32()?;
|
||||
let frame_count = r.u32()?;
|
||||
let mut frames = Vec::new();
|
||||
for _ in 0..frame_count {
|
||||
frames.push(r.bytes()?.to_vec());
|
||||
}
|
||||
let animation = String::from_utf8(r.bytes()?.to_vec()).ok()?;
|
||||
let has_animation = r.take(1)?[0] != 0;
|
||||
let strategy = match r.take(1)?[0] {
|
||||
0 => Strategy::Auto,
|
||||
1 => Strategy::Mean,
|
||||
2 => Strategy::Cutout,
|
||||
3 => Strategy::StrictCutout,
|
||||
4 => Strategy::DarkCutout,
|
||||
_ => return None,
|
||||
};
|
||||
let alpha_cutoff_bias = f32::from_bits(r.u32()?);
|
||||
let flags = r.take(1)?[0];
|
||||
let frame_len = (side as usize).checked_mul(side as usize)?.checked_mul(4)?;
|
||||
if frames.is_empty() || frames.iter().any(|f| f.len() != frame_len) {
|
||||
return None;
|
||||
}
|
||||
entries.insert(
|
||||
name,
|
||||
Decoded {
|
||||
side,
|
||||
frames,
|
||||
animation: has_animation.then_some(animation),
|
||||
strategy,
|
||||
alpha_cutoff_bias,
|
||||
has_transparent: flags & 1 != 0,
|
||||
opaque: flags & 2 != 0,
|
||||
translucent: flags & 4 != 0,
|
||||
},
|
||||
);
|
||||
}
|
||||
r.0.is_empty().then_some(entries)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn sample(blue: u8, animation: Option<&str>) -> Decoded {
|
||||
Decoded {
|
||||
side: 2,
|
||||
frames: vec![vec![blue; 16], vec![blue + 1; 16]],
|
||||
animation: animation.map(str::to_owned),
|
||||
strategy: Strategy::Cutout,
|
||||
alpha_cutoff_bias: 0.25,
|
||||
has_transparent: true,
|
||||
opaque: false,
|
||||
translucent: true,
|
||||
}
|
||||
}
|
||||
fn scratch(tag: &str) -> PathBuf {
|
||||
let dir =
|
||||
std::env::temp_dir().join(format!("horizon-sprite-cache-{tag}-{}", std::process::id()));
|
||||
let _ = fs::remove_dir_all(&dir);
|
||||
fs::create_dir_all(dir.join("assets/minecraft/textures/block")).unwrap();
|
||||
dir
|
||||
}
|
||||
#[test]
|
||||
fn round_trips() {
|
||||
let mut entries = HashMap::new();
|
||||
entries.insert("a:b".to_owned(), sample(1, Some("{\"frametime\":2}")));
|
||||
entries.insert("a:c".to_owned(), sample(9, None));
|
||||
let back = parse(&serialize(7, &entries), 7).unwrap();
|
||||
for (name, d) in &entries {
|
||||
let e = &back[name];
|
||||
assert_eq!(
|
||||
(d.side, &d.frames, &d.animation),
|
||||
(e.side, &e.frames, &e.animation)
|
||||
);
|
||||
assert_eq!(d.alpha_cutoff_bias, e.alpha_cutoff_bias);
|
||||
assert_eq!(
|
||||
(d.has_transparent, d.opaque, d.translucent, d.strategy as u8),
|
||||
(e.has_transparent, e.opaque, e.translucent, e.strategy as u8)
|
||||
);
|
||||
}
|
||||
}
|
||||
#[test]
|
||||
fn wrong_fingerprint_truncation_and_garbage_are_misses() {
|
||||
let mut entries = HashMap::new();
|
||||
entries.insert("a:b".to_owned(), sample(1, None));
|
||||
let bytes = serialize(7, &entries);
|
||||
assert!(parse(&bytes, 8).is_none());
|
||||
for cut in 0..bytes.len() {
|
||||
assert!(parse(&bytes[..cut], 7).is_none(), "cut {cut}");
|
||||
}
|
||||
assert!(parse(b"garbage", 7).is_none());
|
||||
let mut extra = bytes.clone();
|
||||
extra.push(0);
|
||||
assert!(parse(&extra, 7).is_none());
|
||||
}
|
||||
#[test]
|
||||
fn changed_texture_invalidates_and_corrupt_file_is_ignored() {
|
||||
let root = scratch("invalidate");
|
||||
let png = root.join("assets/minecraft/textures/block/x.png");
|
||||
fs::write(&png, b"one").unwrap();
|
||||
let mut cache = SpriteCache::open(&root).unwrap();
|
||||
cache.insert("minecraft:block/x", sample(1, None));
|
||||
cache.save();
|
||||
assert!(
|
||||
SpriteCache::open(&root)
|
||||
.unwrap()
|
||||
.get("minecraft:block/x")
|
||||
.is_some()
|
||||
);
|
||||
// Same length, new content and time: still stale.
|
||||
std::thread::sleep(std::time::Duration::from_millis(30));
|
||||
fs::write(&png, b"two").unwrap();
|
||||
assert!(
|
||||
SpriteCache::open(&root)
|
||||
.unwrap()
|
||||
.get("minecraft:block/x")
|
||||
.is_none()
|
||||
);
|
||||
// A new file also invalidates.
|
||||
let mut cache = SpriteCache::open(&root).unwrap();
|
||||
cache.insert("minecraft:block/x", sample(1, None));
|
||||
cache.save();
|
||||
fs::write(root.join("assets/minecraft/textures/block/y.png"), b"y").unwrap();
|
||||
assert!(
|
||||
SpriteCache::open(&root)
|
||||
.unwrap()
|
||||
.get("minecraft:block/x")
|
||||
.is_none()
|
||||
);
|
||||
// Corrupt cache file: empty, no error.
|
||||
fs::write(root.join(FILE), b"HSPR junk").unwrap();
|
||||
assert!(
|
||||
SpriteCache::open(&root)
|
||||
.unwrap()
|
||||
.get("minecraft:block/x")
|
||||
.is_none()
|
||||
);
|
||||
let _ = fs::remove_dir_all(&root);
|
||||
}
|
||||
fn write_png(path: &Path, rgba: [u8; 4]) {
|
||||
let mut encoder = png::Encoder::new(fs::File::create(path).unwrap(), 16, 16);
|
||||
encoder.set_color(png::ColorType::Rgba);
|
||||
encoder.set_depth(png::BitDepth::Eight);
|
||||
let pixels: Vec<u8> = rgba.iter().copied().cycle().take(16 * 16 * 4).collect();
|
||||
encoder
|
||||
.write_header()
|
||||
.unwrap()
|
||||
.write_image_data(&pixels)
|
||||
.unwrap();
|
||||
}
|
||||
fn sprite_pixels(root: &Path) -> Vec<u8> {
|
||||
let mut sprites = crate::sprites::Sprites::with_disk_cache(root);
|
||||
sprites.insert(root, "minecraft:block/x").unwrap();
|
||||
sprites.save_disk_cache();
|
||||
sprites.finish();
|
||||
sprites.pixels
|
||||
}
|
||||
#[test]
|
||||
fn altered_png_is_not_served_stale_and_cache_matches_decoding() {
|
||||
let root = scratch("stale");
|
||||
let png = root.join("assets/minecraft/textures/block/x.png");
|
||||
write_png(&png, [255, 0, 0, 255]);
|
||||
let decoded = sprite_pixels(&root);
|
||||
assert!(root.join(FILE).exists());
|
||||
assert_eq!(
|
||||
sprite_pixels(&root),
|
||||
decoded,
|
||||
"cache hit differs from decoding"
|
||||
);
|
||||
std::thread::sleep(std::time::Duration::from_millis(30));
|
||||
write_png(&png, [0, 255, 0, 255]);
|
||||
let fresh = sprite_pixels(&root);
|
||||
assert_eq!(&fresh[..4], &[0, 255, 0, 255]);
|
||||
// Corrupt and deleted caches fall back to decoding.
|
||||
fs::write(root.join(FILE), b"HSPR\x01\0\0\0 junk").unwrap();
|
||||
assert_eq!(sprite_pixels(&root), fresh);
|
||||
fs::remove_file(root.join(FILE)).unwrap();
|
||||
assert_eq!(sprite_pixels(&root), fresh);
|
||||
let _ = fs::remove_dir_all(&root);
|
||||
}
|
||||
}
|
||||
@@ -89,6 +89,8 @@ pub struct Sprites {
|
||||
/// textures under their own names, and one layer serves them all (the
|
||||
/// GPU's array may hold as few as 2048).
|
||||
still: std::collections::HashMap<(Vec<u8>, u32, [u32; 2], [bool; 4]), u32>,
|
||||
/// Decoded textures kept on disk between launches ([`Sprites::with_disk_cache`]).
|
||||
disk: Option<crate::sprite_cache::SpriteCache>,
|
||||
}
|
||||
/// Edge length of vanilla's block textures: the smallest array layer.
|
||||
pub const SPRITE_SIZE: u32 = 16;
|
||||
@@ -111,6 +113,20 @@ pub(crate) fn resample(frame: &[u8], from: u32, to: u32) -> Vec<u8> {
|
||||
out
|
||||
}
|
||||
impl Sprites {
|
||||
/// Sprites that reuse textures decoded by an earlier launch, kept in a
|
||||
/// cache file in `root`.
|
||||
pub fn with_disk_cache(root: &Path) -> Self {
|
||||
Self {
|
||||
disk: crate::sprite_cache::SpriteCache::open(root),
|
||||
..Self::default()
|
||||
}
|
||||
}
|
||||
/// Write what this run decoded to the cache file.
|
||||
pub fn save_disk_cache(&mut self) {
|
||||
if let Some(disk) = &mut self.disk {
|
||||
disk.save();
|
||||
}
|
||||
}
|
||||
/// How many array layers the textures take.
|
||||
pub fn count(&self) -> usize {
|
||||
self.native.len()
|
||||
@@ -201,6 +217,21 @@ impl Sprites {
|
||||
}
|
||||
}
|
||||
fn load(&mut self, root: &Path, name: &str) -> Result<u32> {
|
||||
let cached = self.disk.as_ref().and_then(|d| d.get(name)).cloned();
|
||||
let decoded = match cached {
|
||||
Some(decoded) => decoded,
|
||||
None => {
|
||||
let decoded = Self::decode(root, name)?;
|
||||
if let Some(disk) = &mut self.disk {
|
||||
disk.insert(name, decoded.clone());
|
||||
}
|
||||
decoded
|
||||
}
|
||||
};
|
||||
self.register(name, decoded)
|
||||
}
|
||||
/// Read and decode one texture and its `.mcmeta`.
|
||||
fn decode(root: &Path, name: &str) -> Result<crate::sprite_cache::Decoded> {
|
||||
let (namespace, path) = name.split_once(':').ok_or("invalid sprite identifier")?;
|
||||
let path = root.join(format!("assets/{namespace}/textures/{path}.png"));
|
||||
let metadata = match fs::read_to_string(path.with_extension("png.mcmeta")) {
|
||||
@@ -210,10 +241,13 @@ impl Sprites {
|
||||
Err(error) if error.kind() == std::io::ErrorKind::NotFound => None,
|
||||
Err(error) => return Err(error.into()),
|
||||
};
|
||||
let animation = metadata
|
||||
let animation_text = metadata
|
||||
.as_ref()
|
||||
.and_then(|v| v.get("animation"))
|
||||
.map(|v| AnimationMetadata::from_json(v.get()))
|
||||
.map(|v| v.get().to_owned());
|
||||
let animation = animation_text
|
||||
.as_deref()
|
||||
.map(AnimationMetadata::from_json)
|
||||
.transpose()?;
|
||||
let mut decoder = png::Decoder::new(BufReader::new(File::open(path)?));
|
||||
decoder.set_transformations(png::Transformations::EXPAND | png::Transformations::STRIP_16);
|
||||
@@ -247,7 +281,6 @@ impl Sprites {
|
||||
};
|
||||
pixels.extend(rgba);
|
||||
}
|
||||
let layer = u32::try_from(self.native.len())?;
|
||||
let columns = info.width / width;
|
||||
let count = columns * (info.height / height);
|
||||
// Layers are square; a frame of another shape is nearest-resampled to
|
||||
@@ -268,28 +301,56 @@ impl Sprites {
|
||||
}
|
||||
frames.push(frame);
|
||||
}
|
||||
let settings = crate::mipmap::Settings {
|
||||
native_size: side,
|
||||
strategy: texture_section(metadata.as_ref())
|
||||
let texture = texture_section(metadata.as_ref());
|
||||
Ok(crate::sprite_cache::Decoded {
|
||||
side,
|
||||
frames,
|
||||
animation: animation_text,
|
||||
strategy: texture
|
||||
.as_ref()
|
||||
.and_then(|t| t["mipmap_strategy"].as_str())
|
||||
.and_then(crate::mipmap::Strategy::parse)
|
||||
.unwrap_or_default(),
|
||||
alpha_cutoff_bias: texture_section(metadata.as_ref())
|
||||
alpha_cutoff_bias: texture
|
||||
.as_ref()
|
||||
.and_then(|t| t["alpha_cutoff_bias"].as_f64())
|
||||
.unwrap_or(0.0) as f32,
|
||||
has_transparent: pixels.as_chunks::<4>().0.iter().any(|p| p[3] == 0),
|
||||
opaque: pixels.as_chunks::<4>().0.iter().all(|p| p[3] == 255),
|
||||
translucent: pixels
|
||||
.as_chunks::<4>()
|
||||
.0
|
||||
.iter()
|
||||
.any(|p| p[3] != 0 && p[3] != 255),
|
||||
})
|
||||
}
|
||||
/// Give a decoded texture its layer (or the one an identical still has).
|
||||
fn register(&mut self, name: &str, decoded: crate::sprite_cache::Decoded) -> Result<u32> {
|
||||
let crate::sprite_cache::Decoded {
|
||||
side,
|
||||
frames,
|
||||
animation: animation_text,
|
||||
strategy,
|
||||
alpha_cutoff_bias,
|
||||
has_transparent,
|
||||
opaque,
|
||||
translucent,
|
||||
} = decoded;
|
||||
let animation = animation_text
|
||||
.as_deref()
|
||||
.map(AnimationMetadata::from_json)
|
||||
.transpose()?;
|
||||
let count = frames.len() as u32;
|
||||
let layer = u32::try_from(self.native.len())?;
|
||||
let settings = crate::mipmap::Settings {
|
||||
native_size: side,
|
||||
strategy,
|
||||
alpha_cutoff_bias,
|
||||
has_transparent,
|
||||
item: name
|
||||
.split_once(':')
|
||||
.is_some_and(|(_, p)| p.starts_with("item/")),
|
||||
};
|
||||
let opaque = pixels.as_chunks::<4>().0.iter().all(|p| p[3] == 255);
|
||||
let translucent = pixels
|
||||
.as_chunks::<4>()
|
||||
.0
|
||||
.iter()
|
||||
.any(|p| p[3] != 0 && p[3] != 255);
|
||||
let still = (animation.is_none() && frames.len() == 1).then(|| {
|
||||
(
|
||||
frames[0].clone(),
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
//! M-11 gate: block assets loaded through the sprite disk cache are byte-identical
|
||||
//! to the ones decoded from the PNGs. Deletes the cache file in ROOT, loads (decodes
|
||||
//! and writes it), loads again (reads it) and compares the sprite arrays.
|
||||
//! cargo run --profile fast -p horizon-client --example sprite_cache_parity -- ROOT
|
||||
use horizon_client::assets::{Assets, RenderAssets};
|
||||
use std::{
|
||||
hash::{DefaultHasher, Hash, Hasher},
|
||||
path::Path,
|
||||
time::Instant,
|
||||
};
|
||||
|
||||
fn digest(render: &RenderAssets) -> u64 {
|
||||
let mut h = DefaultHasher::new();
|
||||
render.pixels.hash(&mut h);
|
||||
(
|
||||
render.sprite_size,
|
||||
render.sprite_minimum_size,
|
||||
render.texture_layers,
|
||||
)
|
||||
.hash(&mut h);
|
||||
render.sprite_layers.hash(&mut h);
|
||||
render.translucent_layers.hash(&mut h);
|
||||
format!("{:?}", render.sprite_mips).hash(&mut h);
|
||||
for animation in &render.animations {
|
||||
animation.layer.hash(&mut h);
|
||||
for frame in 0..animation.frame_count() {
|
||||
animation.pixels(frame).hash(&mut h);
|
||||
}
|
||||
for tick in 0..400 {
|
||||
format!("{:?}", animation.blend(tick)).hash(&mut h);
|
||||
}
|
||||
}
|
||||
h.finish()
|
||||
}
|
||||
|
||||
fn main() -> horizon_client::Result<()> {
|
||||
let root = std::env::args()
|
||||
.nth(1)
|
||||
.ok_or("usage: sprite_cache_parity ROOT")?;
|
||||
let root = Path::new(&root);
|
||||
let assets = Assets::load(root)?;
|
||||
let _ = std::fs::remove_file(root.join("horizon-sprites.cache"));
|
||||
let start = Instant::now();
|
||||
let cold = digest(&assets.reload(root)?);
|
||||
let cold_ms = start.elapsed().as_secs_f64() * 1000.;
|
||||
let size = std::fs::metadata(root.join("horizon-sprites.cache"))?.len();
|
||||
let start = Instant::now();
|
||||
let warm = digest(&assets.reload(root)?);
|
||||
let warm_ms = start.elapsed().as_secs_f64() * 1000.;
|
||||
println!(
|
||||
"cold={cold:016x} ({cold_ms:.1} ms) warm={warm:016x} ({warm_ms:.1} ms) cache_bytes={size}"
|
||||
);
|
||||
if cold != warm {
|
||||
return Err("cached sprites differ from decoded sprites".into());
|
||||
}
|
||||
println!("PARITY OK");
|
||||
Ok(())
|
||||
}
|
||||
+118
-119
@@ -8586,7 +8586,11 @@ impl Game<'_> {
|
||||
/// strength and whether it is a critical hit): the weapon and effects
|
||||
/// scaled by the attack strength, a mace's smash, the critical hit, then
|
||||
/// enchantments.
|
||||
pub(super) fn melee_damage(&mut self, target_kind: &str) -> (f32, f32, bool, bool) {
|
||||
pub(super) fn melee_damage(
|
||||
&mut self,
|
||||
target_kind: &str,
|
||||
living: bool,
|
||||
) -> (f32, f32, bool, bool) {
|
||||
let hand_damage = 1.0 + self.attack_item_info().map_or(0.0, |i| i.attack_damage);
|
||||
// Riptide's spin replaces the attack damage attribute.
|
||||
let spin = self.player.as_ref().map_or(0.0, |p| p.auto_spin_attack_dmg);
|
||||
@@ -8596,27 +8600,19 @@ impl Game<'_> {
|
||||
hand_damage + self.effect_attack_bonus()
|
||||
};
|
||||
let scale = self.attack_strength_scale();
|
||||
// getEnchantedDamage(target, damage, source) - damage, taken before the
|
||||
// attack strength scales the base damage.
|
||||
let enchant_bonus = self.enchanted_damage(target_kind, damage) - damage;
|
||||
let mut amount = damage * (0.2 + scale * scale * 0.8);
|
||||
// Item.getAttackDamageBonus (a mace's smash), before the critical hit.
|
||||
amount += self.smash_damage_bonus(target_kind);
|
||||
let player = self.player.as_ref();
|
||||
// Player.canCriticalAttack: falling, off the ground, not in water,
|
||||
// not blind (isMobilityRestricted), not riding, not sprinting.
|
||||
let falling = player.is_some_and(|p| {
|
||||
!p.ground.on_ground
|
||||
&& p.fall_distance > 0.0
|
||||
&& !p.fluids.was_touching_water
|
||||
&& !p.sprinting
|
||||
});
|
||||
let restricted = self.potions.effects.get("blindness").is_some() || self.riding.is_some();
|
||||
let crit = scale > 0.9 && falling && !restricted;
|
||||
let crit = living && self.critical_attack(scale);
|
||||
if crit {
|
||||
amount *= 1.5;
|
||||
}
|
||||
// Enchantment damage (sharpness, smite, bane) scaled by the attack strength.
|
||||
let magic_boost = self.enchant_damage_bonus(target_kind) * scale;
|
||||
amount += magic_boost;
|
||||
(amount, scale, crit, magic_boost > 0.0)
|
||||
amount += enchant_bonus * scale;
|
||||
(amount, scale, crit, enchant_bonus * scale > 0.0)
|
||||
}
|
||||
/// `Player.getAttackStrengthScale(0.5)`.
|
||||
fn attack_strength_scale(&self) -> f32 {
|
||||
@@ -8624,7 +8620,14 @@ impl Game<'_> {
|
||||
((self.attack_ticks as f32 + 0.5) / delay).clamp(0.0, 1.0)
|
||||
}
|
||||
/// `Player.isSweepAttack`: a charged, grounded sword hit below the movement limit.
|
||||
pub(super) fn sweep_attack_position(&self, scale: f32, crit: bool) -> Option<[f64; 3]> {
|
||||
pub(super) fn sweep_attack_position(&mut self, scale: f32, crit: bool) -> Option<[f64; 3]> {
|
||||
// Player.getSpeed: the movement speed attribute as it is now (the
|
||||
// field is only refreshed by the local movement step, never for a
|
||||
// server's player).
|
||||
let p = self.player.as_mut()?;
|
||||
if let Ok(speed) = p.attribute("minecraft:movement_speed") {
|
||||
p.speed = speed as f32;
|
||||
}
|
||||
let p = self.player.as_ref()?;
|
||||
let sword = self.held().is_some_and(|s| {
|
||||
self.res
|
||||
@@ -8636,120 +8639,116 @@ impl Game<'_> {
|
||||
if !p.is_sweep_attack(scale, crit, sword) {
|
||||
return None;
|
||||
}
|
||||
let yaw = f64::from(self.yaw.to_radians());
|
||||
// Mth.sin / Mth.cos of yRot * (PI / 180), from its sine table.
|
||||
use horizon_core::geometry::trig;
|
||||
let yaw = f64::from(self.yaw * trig::DEG_TO_RAD);
|
||||
Some([
|
||||
p.position.x - yaw.sin(),
|
||||
p.position.x - f64::from(trig::sin(yaw)),
|
||||
p.position.y + f64::from(p.dimensions.height) * 0.5,
|
||||
p.position.z + yaw.cos(),
|
||||
p.position.z + f64::from(trig::cos(yaw)),
|
||||
])
|
||||
}
|
||||
/// The visual and sound part of `Player.doSweepAttack` after a successful hit.
|
||||
pub(super) fn sweep_attack(&mut self, at: [f64; 3], from: Option<[f64; 3]>) {
|
||||
let sweep = horizon_client::particles::ParticleOptions::simple(
|
||||
/// `Player.doSweepAttack` after a successful hit, in vanilla's order: the
|
||||
/// sweep sound, the victims around `target` (its box, and the mob that
|
||||
/// was hit, when there is one) and then the arc.
|
||||
pub(super) fn sweep_attack(
|
||||
&mut self,
|
||||
at: [f64; 3],
|
||||
from: Option<[f64; 3]>,
|
||||
target: Option<(Aabb, mace::Spared)>,
|
||||
scale: f32,
|
||||
) {
|
||||
self.audio
|
||||
.play("minecraft:entity.player.attack.sweep", from, 1.0, 1.0);
|
||||
if let Some((area, mob)) = target {
|
||||
self.sweep_damage(area, mob, scale);
|
||||
}
|
||||
let arc = horizon_client::particles::ParticleOptions::simple(
|
||||
horizon_client::particles::ParticleType::SweepAttack,
|
||||
);
|
||||
self.particles.add(&sweep, at, [0.0; 3]);
|
||||
self.particles.add(&arc, at, [0.0; 3]);
|
||||
// Player.sweepAttack's `sendParticles(SWEEP_ATTACK, ..., 0, dx, 0, dz, 0)`:
|
||||
// the offset is the one from the player to the particle.
|
||||
let origin = from.unwrap_or(at);
|
||||
let spread = [at[0] - origin[0], 0.0, at[2] - origin[2]];
|
||||
self.lan_send_particles(&sweep, at, spread, 0.0, 0);
|
||||
self.audio
|
||||
.play("minecraft:entity.player.attack.sweep", from, 1.0, 1.0);
|
||||
}
|
||||
/// What `Player.doSweepAttack` deals before the target's enchantment
|
||||
/// bonus and the attack strength: `1 + sweeping_damage_ratio * baseDamage`.
|
||||
pub(super) fn sweep_base_damage(&self, scale: f32) -> f32 {
|
||||
// `baseDamage` of `Player.attack` before a critical hit (a sweep has
|
||||
// none) and the enchantments: the attack damage attribute with the
|
||||
// strength and weakness effects, scaled by the attack strength.
|
||||
let hand_damage = 1.0 + self.attack_item_info().map_or(0.0, |i| i.attack_damage);
|
||||
let base_damage = (hand_damage + self.effect_attack_bonus()) * (0.2 + scale * scale * 0.8);
|
||||
// The enchantment's attribute modifier on the attribute's 0 to 1 range.
|
||||
let ratio = self
|
||||
.res
|
||||
.stations()
|
||||
.enchantments
|
||||
.attribute_add(
|
||||
self.inventory[self.selected].as_ref(),
|
||||
"minecraft:sweeping_damage_ratio",
|
||||
)
|
||||
.clamp(0.0, 1.0) as f32;
|
||||
1.0 + ratio * base_damage
|
||||
}
|
||||
/// The damage and knockback part of `Player.doSweepAttack` after a sweep
|
||||
/// hit on the mob at `target`: every other living mob in its box grown by
|
||||
/// (1, 0.25, 1) and closer than 3 blocks (`distanceToSqr < 9`, in creative
|
||||
/// too), but the player's allies
|
||||
/// (`isAlliedTo`), takes `1 + sweeping_damage_ratio * baseDamage` with the
|
||||
/// weapon's enchantments, scaled by the attack strength, and is pushed 0.4
|
||||
/// along the player's yaw.
|
||||
pub(super) fn sweep_damage(&mut self, target: usize, scale: f32) {
|
||||
let Some(p) = self.player.as_ref() else {
|
||||
return;
|
||||
};
|
||||
let from = [p.position.x, p.position.y, p.position.z];
|
||||
let sweep_damage = self.sweep_base_damage(scale);
|
||||
let hit_box = self.mobs[target]
|
||||
.bounds()
|
||||
.inflate(horizon_core::geometry::Vec3::new(1.0, 0.25, 1.0));
|
||||
let (uuid, allies) = (
|
||||
self.level.player_uuid.or(Some([0, 0, 0, 1])),
|
||||
self.player_allies(),
|
||||
);
|
||||
let nearby: Vec<usize> = self
|
||||
.mobs
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter(|(i, m)| {
|
||||
*i != target
|
||||
&& m.alive()
|
||||
&& !m.removed
|
||||
&& !allies.contains(&m.id)
|
||||
&& !mace::ally_of_player(m, uuid)
|
||||
&& m.bounds().intersects(hit_box)
|
||||
&& m.position.distance_squared(p.position) < 9.0
|
||||
})
|
||||
.map(|(i, _)| i)
|
||||
.collect();
|
||||
let (xd, zd) = self.extra_knockback_direction();
|
||||
for i in nearby {
|
||||
let kind = self.mobs[i].kind.id.clone();
|
||||
let kind = format!("minecraft:{}", kind.trim_start_matches("minecraft:"));
|
||||
let damage = (sweep_damage + self.enchant_damage_bonus(&kind)) * scale;
|
||||
let source = self.attack_source(from);
|
||||
if self.hurt_by_player(i, damage, source) {
|
||||
self.mobs[i].knockback(0.4, xd, zd);
|
||||
self.last_hurt_by_player
|
||||
.insert(self.mobs[i].id, self.lan_acting);
|
||||
}
|
||||
}
|
||||
// `getEntitiesOfClass(LivingEntity.class)` takes the other players too.
|
||||
let mut sweep = self.player_sweep(sweep_damage, scale);
|
||||
sweep.hit_box = hit_box;
|
||||
self.sweep_other_players(sweep);
|
||||
self.lan_send_particles(&arc, at, spread, 0.0, 0);
|
||||
}
|
||||
/// `Player.attack`'s sounds when a vehicle takes the hit (it always does,
|
||||
/// and can't be hit critically): knockback when sprinting at full
|
||||
/// strength, then strong or weak. Before `swing_arm` resets the charge.
|
||||
pub(super) fn vehicle_attack_sounds(&mut self) {
|
||||
let full = self.attack_strength_scale() > 0.9;
|
||||
/// strength, then strong or weak, or the sweep around the vehicle's
|
||||
/// box `area`. Before `swing_arm` resets the charge.
|
||||
pub(super) fn vehicle_attack_sounds(&mut self, area: Aabb, magic: Option<i32>) {
|
||||
self.attack_effects(area, None, mace::Spared::Nothing, magic);
|
||||
}
|
||||
/// `Player.attack` after a target that is not a mob took the hit:
|
||||
/// the sprint knockback sound, a living target's critical hit (`living`:
|
||||
/// its entity id, which makes the hit critical when the player falls),
|
||||
/// the sweep around the target's box `area` and the strong or weak sound.
|
||||
pub(super) fn attack_effects(
|
||||
&mut self,
|
||||
area: Aabb,
|
||||
living: Option<i32>,
|
||||
spared: mace::Spared,
|
||||
magic: Option<i32>,
|
||||
) {
|
||||
let scale = self.attack_strength_scale();
|
||||
let full = scale > 0.9;
|
||||
let player = self.player.as_ref();
|
||||
let from = player.map(|p| [p.position.x, p.position.y, p.position.z]);
|
||||
if full && player.is_some_and(|p| p.sprinting) {
|
||||
self.audio
|
||||
.play("minecraft:entity.player.attack.knockback", from, 1.0, 1.0);
|
||||
}
|
||||
let sound = if full {
|
||||
"minecraft:entity.player.attack.strong"
|
||||
} else {
|
||||
"minecraft:entity.player.attack.weak"
|
||||
};
|
||||
if let Some(at) = self.sweep_attack_position(self.attack_strength_scale(), false) {
|
||||
self.sweep_attack(at, from);
|
||||
} else {
|
||||
let crit = living.is_some() && self.critical_attack(scale);
|
||||
let sweep = self.sweep_attack_position(scale, crit);
|
||||
if let Some(at) = sweep {
|
||||
self.sweep_attack(at, from, Some((area, spared)), scale);
|
||||
}
|
||||
if crit {
|
||||
self.audio
|
||||
.play("minecraft:entity.player.attack.crit", from, 1.0, 1.0);
|
||||
if let Some(id) = living {
|
||||
self.area_critical_hit(id, area, false);
|
||||
}
|
||||
} else if sweep.is_none() {
|
||||
let sound = if full {
|
||||
"minecraft:entity.player.attack.strong"
|
||||
} else {
|
||||
"minecraft:entity.player.attack.weak"
|
||||
};
|
||||
self.audio.play(sound, from, 1.0, 1.0);
|
||||
}
|
||||
// Player.magicCrit: the enchantments added damage.
|
||||
if let Some(id) = magic {
|
||||
self.area_critical_hit(id, area, true);
|
||||
}
|
||||
}
|
||||
/// `critical_hit` around the box `area` of entity `id` (`magic`: the
|
||||
/// enchanted hit instead of the crit).
|
||||
fn area_critical_hit(&mut self, id: i32, area: Aabb, magic: bool) {
|
||||
let (feet, size) = (area.bottom_center(), area.size());
|
||||
self.critical_hit(
|
||||
self.lan_acting,
|
||||
id,
|
||||
[feet.x, feet.y, feet.z],
|
||||
size.x,
|
||||
size.y,
|
||||
magic,
|
||||
);
|
||||
}
|
||||
/// `Player.canCriticalAttack` for a living target at attack strength
|
||||
/// `scale`: falling, off the ground, not in water, not blind (mobility
|
||||
/// restricted), not riding, not sprinting.
|
||||
pub(super) fn critical_attack(&self, scale: f32) -> bool {
|
||||
let player = self.player.as_ref();
|
||||
let falling = player.is_some_and(|p| {
|
||||
!p.ground.on_ground
|
||||
&& p.fall_distance > 0.0
|
||||
&& !p.fluids.was_touching_water
|
||||
&& !p.sprinting
|
||||
});
|
||||
let restricted = self.potions.effects.get("blindness").is_some() || self.riding.is_some();
|
||||
scale > 0.9 && falling && !restricted
|
||||
}
|
||||
/// Player.attack with the attack-strength charge, crits and knockback.
|
||||
fn attack(&mut self) -> bool {
|
||||
@@ -8775,16 +8774,11 @@ impl Game<'_> {
|
||||
if self.attack_redirectable() {
|
||||
return true;
|
||||
}
|
||||
let hand_damage = 1.0
|
||||
+ self
|
||||
.held()
|
||||
.and_then(|h| self.res.items().get(&h.item))
|
||||
.map_or(0.0, |i| i.attack_damage);
|
||||
if self.attack_frame()
|
||||
|| self.attack_armor_stand()
|
||||
|| self.attack_cushion()
|
||||
|| self.attack_boat(hand_damage)
|
||||
|| self.attack_cart(hand_damage)
|
||||
|| self.attack_boat()
|
||||
|| self.attack_cart()
|
||||
|| self.attack_dragon()
|
||||
|| self.attack_guest()
|
||||
{
|
||||
@@ -8813,7 +8807,7 @@ impl Game<'_> {
|
||||
pub(super) fn attack_mob(&mut self, index: usize) {
|
||||
let target_kind = self.mobs[index].kind.id.clone();
|
||||
let target_kind = format!("minecraft:{}", target_kind.trim_start_matches("minecraft:"));
|
||||
let (amount, scale, crit, magic) = self.melee_damage(&target_kind);
|
||||
let (amount, scale, crit, magic) = self.melee_damage(&target_kind, true);
|
||||
let sweep = self.sweep_attack_position(scale, crit);
|
||||
let (knockback, knockback_attack) = self.extra_knockback(&target_kind, scale);
|
||||
self.attack_ticks = 0;
|
||||
@@ -8925,8 +8919,11 @@ impl Game<'_> {
|
||||
};
|
||||
// Player.playServerSideSound: at the player.
|
||||
if let Some(at) = sweep {
|
||||
self.sweep_attack(at, from);
|
||||
self.sweep_damage(index, scale);
|
||||
let target = (
|
||||
self.mobs[index].bounds(),
|
||||
mace::Spared::Mob(self.mobs[index].id),
|
||||
);
|
||||
self.sweep_attack(at, from, Some(target), scale);
|
||||
} else {
|
||||
self.audio.play(sound, from, 1.0, 1.0);
|
||||
}
|
||||
@@ -9159,6 +9156,7 @@ impl Game<'_> {
|
||||
self.rand_sequences = rand_sequences;
|
||||
self.border = Default::default();
|
||||
self.set_mode_id(level.mode());
|
||||
self.previous_mode = level.previous_game_mode.map(game_mode::mode_from_id);
|
||||
let mut inventory = vec![None; 36];
|
||||
self.armor = [None, None, None, None];
|
||||
self.offhand = None;
|
||||
@@ -11541,6 +11539,7 @@ impl Game<'_> {
|
||||
let level = &mut self.level;
|
||||
level.creative = self.creative;
|
||||
level.game_mode = mode;
|
||||
level.previous_game_mode = self.previous_mode.map(game_mode::mode_id_of);
|
||||
// PrimaryLevelData.setDifficulty: /difficulty and the options button change it.
|
||||
level.difficulty =
|
||||
horizon_client::title::DIFFICULTIES[usize::from(self.ui.difficulty) & 3].into();
|
||||
|
||||
@@ -510,6 +510,25 @@ impl Game<'_> {
|
||||
if !self.before_block(d) || self.mob_hit().is_some_and(|m| m.1 < d) {
|
||||
return false;
|
||||
}
|
||||
// The stand's box and id, before the hit may remove it.
|
||||
let (area, id) = (self.armor_stands[i].bounds(), self.armor_stands[i].id);
|
||||
let (_, _, _, magic) = self.melee_damage("minecraft:armor_stand", true);
|
||||
let hurt = self.punch_armor_stand(i);
|
||||
if hurt {
|
||||
self.attack_effects(
|
||||
area,
|
||||
Some(id as i32),
|
||||
super::mace::Spared::Stand(id),
|
||||
magic.then_some(id as i32),
|
||||
);
|
||||
self.swing_arm();
|
||||
}
|
||||
hurt
|
||||
}
|
||||
/// `ArmorStand.hurtServer` for a player's attack (also a sweep's): a
|
||||
/// creative player breaks it, otherwise the first hit wobbles it and a
|
||||
/// second within five ticks breaks it.
|
||||
pub(super) fn punch_armor_stand(&mut self, i: usize) -> bool {
|
||||
let time = self.world.game_time;
|
||||
let at = self.armor_stands[i].position;
|
||||
let at = [at.x, at.y, at.z];
|
||||
|
||||
@@ -809,15 +809,19 @@ impl Game<'_> {
|
||||
true
|
||||
}
|
||||
/// `VehicleEntity.hurtServer` from the player's attack.
|
||||
pub(super) fn attack_boat(&mut self, damage: f32) -> bool {
|
||||
pub(super) fn attack_boat(&mut self) -> bool {
|
||||
let Some((i, d)) = self.boat_hit() else {
|
||||
return false;
|
||||
};
|
||||
if !self.before_block(d) || self.mob_hit().is_some_and(|m| m.1 < d) {
|
||||
return false;
|
||||
}
|
||||
self.vehicle_attack_sounds();
|
||||
let area = self.boats[i].bounds();
|
||||
// Player.attack's full damage against the boat's entity type.
|
||||
let (kind, id) = (self.boats[i].entity_type(), self.boats[i].id as i32);
|
||||
let (damage, _, _, magic) = self.melee_damage(&kind, false);
|
||||
self.hurt_boat(i, damage, self.creative);
|
||||
self.vehicle_attack_sounds(area, magic.then_some(id));
|
||||
self.swing_arm();
|
||||
true
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ impl MapData {
|
||||
m.unlimited = self.unlimited;
|
||||
m
|
||||
}
|
||||
/// `MapItemSavedData.locked`: the same pixels, locked.
|
||||
/// `MapItemSavedData.locked`: the same pixels and banner markers, locked.
|
||||
pub(super) fn locked_copy(&self) -> MapData {
|
||||
let mut m = MapData::fresh(
|
||||
f64::from(self.center[0]),
|
||||
@@ -165,6 +165,7 @@ impl MapData {
|
||||
);
|
||||
m.center = self.center;
|
||||
m.colors = self.colors.clone();
|
||||
m.banners = self.banners.clone();
|
||||
m.tracking = self.tracking;
|
||||
m.unlimited = self.unlimited;
|
||||
m.locked = true;
|
||||
|
||||
@@ -51,6 +51,9 @@ pub(super) struct CombatTracker {
|
||||
/// stand and the seconds their weapon disables a shield for
|
||||
/// (`getSecondsToDisableBlocking`).
|
||||
pub(super) player_attacker: Option<([f64; 3], f32)>,
|
||||
/// While set, a sweep attack's reach to the other players is kept here
|
||||
/// instead of landing, for the caller that holds the LAN host.
|
||||
pub(super) sweeps: Option<Vec<super::lan_pvp::Sweep>>,
|
||||
/// The mob exploding now (`ServerExplosion.source`): its team's friendly
|
||||
/// fire decides whom the blast may hurt.
|
||||
pub(super) explosion_source: Option<u32>,
|
||||
|
||||
@@ -1122,22 +1122,21 @@ impl Game<'_> {
|
||||
if !self.before_block(d) || self.mob_hit().is_some_and(|m| m.1 < d) {
|
||||
return false;
|
||||
}
|
||||
let hand_damage = self.attack_item_info().map_or(0.0, |i| i.attack_damage);
|
||||
let delay = horizon_client::attack_strength::delay(self.main_hand_attack_speed());
|
||||
let scale = ((self.attack_ticks as f32 + 0.5) / delay).clamp(0.0, 1.0);
|
||||
let mut amount =
|
||||
(1.0 + hand_damage + self.effect_attack_bonus()) * (0.2 + scale * scale * 0.8);
|
||||
let falling = self
|
||||
.player
|
||||
.as_ref()
|
||||
.is_some_and(|p| !p.ground.on_ground && p.velocity.y < 0.0 && !p.sprinting);
|
||||
if scale > 0.9 && falling {
|
||||
amount *= 1.5;
|
||||
}
|
||||
amount += self.enchant_damage_bonus("minecraft:ender_dragon") * scale;
|
||||
self.attack_ticks = 0;
|
||||
// A dragon part is no LivingEntity: `canCriticalAttack` is false.
|
||||
let (amount, _, _, _) = self.melee_damage("minecraft:ender_dragon", false);
|
||||
self.swing_arm();
|
||||
self.hit_special(id, amount, true, false);
|
||||
// The part's box.
|
||||
let area = self
|
||||
.special_targets()
|
||||
.into_iter()
|
||||
.find(|(part, _)| *part == id)
|
||||
.map(|(_, b)| b);
|
||||
let hurt = self.hit_special(id, amount, true, false);
|
||||
// The sweep and the sounds read the charge, which the hit then spends.
|
||||
if let (Some(area), Hurt::Landed { .. }) = (area, hurt) {
|
||||
self.attack_effects(area, None, super::mace::Spared::Nothing, None);
|
||||
}
|
||||
self.attack_ticks = 0;
|
||||
true
|
||||
}
|
||||
/// The 24 nodes (`findClosestNode` builds them on first use).
|
||||
|
||||
@@ -82,8 +82,13 @@ impl Game<'_> {
|
||||
}
|
||||
/// `getEnchantedDamage - base`: damage bonus of the held weapon against a mob type.
|
||||
pub(super) fn enchant_damage_bonus(&mut self, target: &str) -> f32 {
|
||||
self.enchanted_damage(target, 0.0)
|
||||
}
|
||||
/// `Player.getEnchantedDamage`: `base` run through the held weapon's
|
||||
/// damage effects against a mob type.
|
||||
pub(super) fn enchanted_damage(&mut self, target: &str, base: f32) -> f32 {
|
||||
let Some(held) = self.held().cloned() else {
|
||||
return 0.0;
|
||||
return base;
|
||||
};
|
||||
let ctx = EffectContext {
|
||||
this: Some(target),
|
||||
@@ -99,7 +104,7 @@ impl Game<'_> {
|
||||
"minecraft:damage",
|
||||
&ctx,
|
||||
&mut self.world.random,
|
||||
0.0,
|
||||
base,
|
||||
)
|
||||
}
|
||||
/// Strength / weakness on the attack damage attribute.
|
||||
|
||||
@@ -3,6 +3,22 @@
|
||||
use super::{Game, Screen};
|
||||
use horizon_client::command::args::GameMode;
|
||||
|
||||
pub(super) fn mode_id_of(mode: GameMode) -> i32 {
|
||||
match mode {
|
||||
GameMode::Survival => 0,
|
||||
GameMode::Creative => 1,
|
||||
GameMode::Adventure => 2,
|
||||
GameMode::Spectator => 3,
|
||||
}
|
||||
}
|
||||
pub(super) fn mode_from_id(id: i32) -> GameMode {
|
||||
match id {
|
||||
1 => GameMode::Creative,
|
||||
2 => GameMode::Adventure,
|
||||
3 => GameMode::Spectator,
|
||||
_ => GameMode::Survival,
|
||||
}
|
||||
}
|
||||
impl Game<'_> {
|
||||
pub(super) fn spectator(&self) -> bool {
|
||||
self.mode == GameMode::Spectator
|
||||
@@ -12,21 +28,10 @@ impl Game<'_> {
|
||||
matches!(self.mode, GameMode::Survival | GameMode::Creative)
|
||||
}
|
||||
pub(super) fn mode_id(&self) -> i32 {
|
||||
match self.mode {
|
||||
GameMode::Survival => 0,
|
||||
GameMode::Creative => 1,
|
||||
GameMode::Adventure => 2,
|
||||
GameMode::Spectator => 3,
|
||||
}
|
||||
mode_id_of(self.mode)
|
||||
}
|
||||
pub(super) fn set_mode_id(&mut self, id: i32) {
|
||||
let mode = match id {
|
||||
1 => GameMode::Creative,
|
||||
2 => GameMode::Adventure,
|
||||
3 => GameMode::Spectator,
|
||||
_ => GameMode::Survival,
|
||||
};
|
||||
self.set_mode(mode);
|
||||
self.set_mode(mode_from_id(id));
|
||||
}
|
||||
/// `ServerPlayer.setGameMode` and `GameType.updatePlayerAbilities`.
|
||||
pub(super) fn set_mode(&mut self, mode: GameMode) {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
//! attack (blocking, armour, knockback), when the `pvp` game rule allows it
|
||||
//! (`ServerPlayer.canHarmPlayer`, `isPvpAllowed`). A player's arrow on
|
||||
//! another player lands the same way.
|
||||
use super::{Game, lan::LanHost, lan_mobs::guest_bounds, ray_box};
|
||||
use super::{Game, lan::LanHost, lan_mobs::guest_bounds, mace::Spared, ray_box};
|
||||
|
||||
use horizon_client::{
|
||||
Result,
|
||||
@@ -50,8 +50,6 @@ pub(super) struct Strike {
|
||||
knockback_attack: bool,
|
||||
/// The attacker's team, for the victim's `Player.canHarmPlayer`.
|
||||
team: Option<horizon_client::scoreboard::Team>,
|
||||
/// The sweep's damage to the players around the victim.
|
||||
sweep_hit: Option<Sweep>,
|
||||
}
|
||||
|
||||
/// A sweep attack's reach to the other players (`Player.doSweepAttack`),
|
||||
@@ -68,8 +66,8 @@ pub(super) struct Sweep {
|
||||
team: Option<horizon_client::scoreboard::Team>,
|
||||
/// The target's box grown by (1, 0.25, 1).
|
||||
pub(super) hit_box: Aabb,
|
||||
/// The player the sweep started from, which it spares.
|
||||
skip: Option<Victim>,
|
||||
/// The entity id of the player the sweep started from, which it spares.
|
||||
pub(super) skip: Option<i32>,
|
||||
}
|
||||
|
||||
impl Strike {
|
||||
@@ -145,12 +143,8 @@ impl Game<'_> {
|
||||
pub(super) fn pvp_strike(&mut self) -> Option<Strike> {
|
||||
let p = self.player.as_ref()?;
|
||||
let from = [p.position.x, p.position.y, p.position.z];
|
||||
let (amount, scale, crit, magic) = self.melee_damage("minecraft:player");
|
||||
let (amount, scale, crit, magic) = self.melee_damage("minecraft:player", true);
|
||||
let sweep = self.sweep_attack_position(scale, crit);
|
||||
let sweep_hit = sweep.map(|_| {
|
||||
let base = self.sweep_base_damage(scale);
|
||||
self.player_sweep(base, scale)
|
||||
});
|
||||
let (strength, knockback_attack) = self.extra_knockback("minecraft:player", scale);
|
||||
let (xd, zd) = self.extra_knockback_direction();
|
||||
self.attack_ticks = 0;
|
||||
@@ -175,7 +169,6 @@ impl Game<'_> {
|
||||
knockback: (strength, xd, zd),
|
||||
knockback_attack,
|
||||
team: self.player_team().cloned(),
|
||||
sweep_hit,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -368,21 +361,29 @@ impl Game<'_> {
|
||||
(true, false, false) => "minecraft:entity.player.attack.weak",
|
||||
};
|
||||
if let Some(at) = s.sweep.filter(|_| hurt) {
|
||||
self.sweep_attack(at, Some(s.from));
|
||||
// The other players next to the victim (Player.doSweepAttack).
|
||||
let bounds = match victim {
|
||||
Victim::Host => self.player.as_ref().map(|p| p.bounds()),
|
||||
Victim::Guest(conn) => host.hub.guest(conn).map(guest_bounds),
|
||||
// The sweep around the player that was hit, as its attacker.
|
||||
let (area, id) = match victim {
|
||||
Victim::Host => (self.player.as_ref().map(|p| p.bounds()), host.host_entity),
|
||||
Victim::Guest(conn) => {
|
||||
let g = host.hub.guest(conn);
|
||||
(g.map(guest_bounds), g.map_or(-1, |g| g.entity_id))
|
||||
}
|
||||
};
|
||||
if let (Some(sweep), Some(bounds)) = (&s.sweep_hit, bounds) {
|
||||
self.sweep_players(
|
||||
host,
|
||||
&Sweep {
|
||||
hit_box: bounds.inflate(Vec3::new(1.0, 0.25, 1.0)),
|
||||
skip: Some(victim),
|
||||
..sweep.clone()
|
||||
},
|
||||
);
|
||||
let target = area.map(|area| (area, Spared::Player(id)));
|
||||
match s.attacker {
|
||||
None => {
|
||||
// The host is checked out here: collect the sweep for the players.
|
||||
self.combat.sweeps = Some(Vec::new());
|
||||
self.sweep_attack(at, Some(s.from), target, s.scale);
|
||||
for sweep in self.combat.sweeps.take().unwrap_or_default() {
|
||||
self.sweep_players(host, &sweep);
|
||||
}
|
||||
}
|
||||
Some(conn) => {
|
||||
self.as_guest(host, conn, |g| {
|
||||
g.sweep_attack(at, Some(s.from), target, s.scale)
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.audio.play(sound, Some(s.from), 1.0, 1.0);
|
||||
@@ -399,7 +400,7 @@ impl Game<'_> {
|
||||
.player
|
||||
.as_ref()
|
||||
.map_or([0.0; 3], |p| [p.position.x, p.position.y, p.position.z]);
|
||||
let damage = (base + self.enchant_damage_bonus("minecraft:player")) * scale;
|
||||
let damage = self.enchanted_damage("minecraft:player", base) * scale;
|
||||
Sweep {
|
||||
attacker: self.lan_acting,
|
||||
from,
|
||||
@@ -415,7 +416,9 @@ impl Game<'_> {
|
||||
/// turn the host holds the other players (`as_guest`), so it waits for
|
||||
/// the turn to end.
|
||||
pub(super) fn sweep_other_players(&mut self, sweep: Sweep) {
|
||||
if self.lan_acting.is_some() {
|
||||
if let Some(collect) = self.combat.sweeps.as_mut() {
|
||||
collect.push(sweep);
|
||||
} else if self.lan_acting.is_some() {
|
||||
self.creatures.sweeps.push(sweep);
|
||||
} else if let Some(mut host) = self.lan.take() {
|
||||
self.sweep_players(&mut host, &sweep);
|
||||
@@ -445,7 +448,7 @@ impl Game<'_> {
|
||||
&& p.bounds().intersects(sweep.hit_box)
|
||||
&& p.position.distance_squared(from) < 9.0
|
||||
{
|
||||
victims.push((Victim::Host, self.player_team().cloned()));
|
||||
victims.push((Victim::Host, host.host_entity, self.player_team().cloned()));
|
||||
}
|
||||
for g in &host.hub.guests {
|
||||
if host.hub.here(g)
|
||||
@@ -458,7 +461,7 @@ impl Game<'_> {
|
||||
< 9.0
|
||||
{
|
||||
let team = self.score.board.players_team(&g.name).cloned();
|
||||
victims.push((Victim::Guest(g.conn), team));
|
||||
victims.push((Victim::Guest(g.conn), g.entity_id, team));
|
||||
}
|
||||
}
|
||||
let (xd, zd) = sweep.knockback;
|
||||
@@ -468,8 +471,8 @@ impl Game<'_> {
|
||||
g.knock_back_player(0.4, xd, zd);
|
||||
}
|
||||
};
|
||||
for (victim, team) in victims {
|
||||
if sweep.skip == Some(victim)
|
||||
for (victim, id, team) in victims {
|
||||
if sweep.skip == Some(id)
|
||||
|| horizon_client::scoreboard::teams_allied(team.as_ref(), sweep.team.as_ref())
|
||||
|| !self.ui.rules.bool("pvp")
|
||||
{
|
||||
|
||||
@@ -10,7 +10,11 @@ use horizon_client::{
|
||||
mobs::{Damage, Mob, Species},
|
||||
particles::{ParticleOptions, ParticleType},
|
||||
};
|
||||
use horizon_core::{geometry::Vec3, position::BlockPos, random::RandomSource};
|
||||
use horizon_core::{
|
||||
geometry::{Aabb, Vec3},
|
||||
position::BlockPos,
|
||||
random::RandomSource,
|
||||
};
|
||||
use horizon_world::registry::BlockStateId;
|
||||
|
||||
/// `MaceItem.SMASH_ATTACK_FALL_THRESHOLD`.
|
||||
@@ -38,6 +42,22 @@ pub(super) fn ally_of_player(m: &Mob, player: Option<[i32; 4]>) -> bool {
|
||||
|| m.species() == Species::Allay && m.extra.tame
|
||||
}
|
||||
|
||||
/// The entity a sweep leaves out: the one the attack hit (`target` of
|
||||
/// `Player.doSweepAttack`).
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
pub(super) enum Spared {
|
||||
Nothing,
|
||||
Mob(u32),
|
||||
Stand(u32),
|
||||
/// A player of the open world, by entity id.
|
||||
Player(i32),
|
||||
}
|
||||
|
||||
/// `Player.doSweepAttack`'s `1 + ratio * f`, where `f` is the attack damage
|
||||
/// after `baseDamageScaleFactor` (0.2 + strength^2 * 0.8).
|
||||
fn sweep_base_damage(ratio: f32, attack_damage: f32, scale: f32) -> f32 {
|
||||
1.0 + ratio * attack_damage * (0.2 + scale * scale * 0.8)
|
||||
}
|
||||
/// A smash's knockback on the players, put off while a guest's turn holds
|
||||
/// the other players.
|
||||
pub(super) struct SmashPush {
|
||||
@@ -340,6 +360,136 @@ impl Game<'_> {
|
||||
resistance,
|
||||
);
|
||||
}
|
||||
/// `Player.doSweepAttack`'s victims: every other living mob and every
|
||||
/// armor stand (but a marker one) in `target`'s box inflated by
|
||||
/// (1, 0.25, 1) and under three blocks from the player takes
|
||||
/// `getEnchantedDamage(1 + sweeping ratio * attack damage) * strength`,
|
||||
/// knocked back 0.4 along the player's yaw. The player's allies and the
|
||||
/// target (`spared`) are spared.
|
||||
pub(super) fn sweep_damage(&mut self, target: Aabb, spared: Spared, scale: f32) {
|
||||
let Some(player) = self.player.as_ref() else {
|
||||
return;
|
||||
};
|
||||
let from = [player.position.x, player.position.y, player.position.z];
|
||||
let area = target.inflate(Vec3::new(1.0, 0.25, 1.0));
|
||||
let near = |at: Vec3| {
|
||||
(0..3)
|
||||
.map(|a| [at.x, at.y, at.z][a] - from[a])
|
||||
.map(|d| d * d)
|
||||
.sum::<f64>()
|
||||
< 9.0
|
||||
};
|
||||
// The enchantment's `sweeping_damage_ratio` attribute modifier (level /
|
||||
// (level + 1)) on the attribute's 0 to 1 range.
|
||||
let ratio = self
|
||||
.res
|
||||
.stations()
|
||||
.enchantments
|
||||
.attribute_add(
|
||||
self.inventory[self.selected].as_ref(),
|
||||
"minecraft:sweeping_damage_ratio",
|
||||
)
|
||||
.clamp(0.0, 1.0) as f32;
|
||||
// `f` of doSweepAttack: the attack damage attribute after
|
||||
// baseDamageScaleFactor (a sweep is never a smash or a critical hit).
|
||||
let spin = self.player.as_ref().map_or(0.0, |p| p.auto_spin_attack_dmg);
|
||||
let attribute = if spin > 0.0 {
|
||||
spin
|
||||
} else {
|
||||
1.0 + self.attack_item_info().map_or(0.0, |i| i.attack_damage)
|
||||
+ self.effect_attack_bonus()
|
||||
};
|
||||
let base = sweep_base_damage(ratio, attribute, scale);
|
||||
let (xd, zd) = self.extra_knockback_direction();
|
||||
let uuid = self.level.player_uuid.or(Some([0, 0, 0, 1]));
|
||||
let allies = self.player_allies();
|
||||
// getEntitiesOfClass walks the entity sections (x, then z, then y)
|
||||
// under the box, each in the order its entities were added.
|
||||
let section = |at: Vec3| {
|
||||
(
|
||||
(at.x.floor() as i32) >> 4,
|
||||
(at.z.floor() as i32) >> 4,
|
||||
(at.y.floor() as i32) >> 4,
|
||||
)
|
||||
};
|
||||
let mut victims: Vec<((i32, i32, i32), u32, bool)> = Vec::new();
|
||||
for m in &self.mobs {
|
||||
if spared != Spared::Mob(m.id)
|
||||
&& m.alive()
|
||||
&& !m.removed
|
||||
&& !allies.contains(&m.id)
|
||||
&& !ally_of_player(m, uuid)
|
||||
&& m.bounds().intersects(area)
|
||||
&& near(m.position)
|
||||
{
|
||||
victims.push((section(m.position), m.id, false));
|
||||
}
|
||||
}
|
||||
for s in &self.armor_stands {
|
||||
if !s.marker
|
||||
&& spared != Spared::Stand(s.id)
|
||||
&& s.bounds().intersects(area)
|
||||
&& near(s.position)
|
||||
{
|
||||
victims.push((section(s.position), s.id, true));
|
||||
}
|
||||
}
|
||||
victims.sort_by_key(|&(key, id, _)| (key, id));
|
||||
for (_, id, is_stand) in victims {
|
||||
if is_stand {
|
||||
let Some(i) = self.armor_stands.iter().position(|s| s.id == id) else {
|
||||
continue;
|
||||
};
|
||||
// knockback(0.4, ..) follows a hurtServer that landed, on a
|
||||
// stand that is still there (LivingEntity.knockback).
|
||||
if !self.punch_armor_stand(i) {
|
||||
continue;
|
||||
}
|
||||
let (mut kx, mut kz) = (xd, zd);
|
||||
while kx * kx + kz * kz < f64::from(1.0e-5_f32) {
|
||||
let r = &mut self.world.random;
|
||||
kx = (r.next_double() - r.next_double()) * 0.01;
|
||||
kz = (r.next_double() - r.next_double()) * 0.01;
|
||||
}
|
||||
let len = (kx * kx + kz * kz).sqrt();
|
||||
if let Some(s) = self.armor_stands.iter_mut().find(|s| s.id == id) {
|
||||
s.velocity = Vec3::new(
|
||||
s.velocity.x / 2.0 - kx / len * 0.4,
|
||||
if s.on_ground {
|
||||
(s.velocity.y / 2.0 + 0.4).min(0.4)
|
||||
} else {
|
||||
s.velocity.y
|
||||
},
|
||||
s.velocity.z / 2.0 - kz / len * 0.4,
|
||||
);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
let Some(i) = self.mobs.iter().position(|m| m.id == id) else {
|
||||
continue;
|
||||
};
|
||||
let kind = self.mobs[i].kind.id.clone();
|
||||
let kind = format!("minecraft:{}", kind.trim_start_matches("minecraft:"));
|
||||
let amount = self.enchanted_damage(&kind, base) * scale;
|
||||
let source = self.attack_source(from);
|
||||
// hurtServer first; the knockback and post-attack effects follow
|
||||
// only when it landed.
|
||||
if self.hurt_by_player(i, amount, source) {
|
||||
self.mobs[i].knockback(0.4, xd, zd);
|
||||
self.last_hurt_by_player
|
||||
.insert(self.mobs[i].id, self.lan_acting);
|
||||
self.post_attack(i);
|
||||
}
|
||||
}
|
||||
// `getEntitiesOfClass(LivingEntity.class)` takes the other players too.
|
||||
let mut sweep = self.player_sweep(base, scale);
|
||||
sweep.hit_box = area;
|
||||
sweep.skip = match spared {
|
||||
Spared::Player(id) => Some(id),
|
||||
_ => None,
|
||||
};
|
||||
self.sweep_other_players(sweep);
|
||||
}
|
||||
/// `ServerPlayer.checkFallDamage` after a smash on a grounded target:
|
||||
/// the landing block's particles, 50 for every block fallen (200 at most).
|
||||
pub(super) fn smash_landing_particles(
|
||||
@@ -409,3 +559,19 @@ impl Game<'_> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn sweep_damage_is_one_without_the_enchantment() {
|
||||
// A fully charged diamond sword (8 attack damage): neighbours take 1.
|
||||
assert_eq!(sweep_base_damage(0.0, 8.0, 1.0), 1.0);
|
||||
// Sweeping Edge III adds the ratio of the (charged) attack damage.
|
||||
assert_eq!(sweep_base_damage(0.75, 8.0, 1.0), 7.0);
|
||||
// baseDamageScaleFactor at 0.95 strength.
|
||||
let scaled = sweep_base_damage(0.5, 8.0, 0.95);
|
||||
assert!((scaled - (1.0 + 0.5 * 8.0 * (0.2 + 0.95 * 0.95 * 0.8))).abs() < 1e-6);
|
||||
}
|
||||
}
|
||||
@@ -66,6 +66,10 @@ pub(super) struct MapData {
|
||||
pub unlimited: bool,
|
||||
pub colors: Vec<u8>,
|
||||
pub decorations: Vec<Decoration>,
|
||||
/// `MapBanner` and `MapFrame` entries as saved (`banners`, `frames`), kept
|
||||
/// so a save does not drop them.
|
||||
pub banners: Vec<Tag>,
|
||||
frames: Vec<Tag>,
|
||||
holders: Vec<Holder>,
|
||||
/// Changed since the last save / texture upload.
|
||||
dirty: bool,
|
||||
@@ -85,6 +89,8 @@ impl MapData {
|
||||
unlimited: false,
|
||||
colors: vec![0; 128 * 128],
|
||||
decorations: Vec::new(),
|
||||
banners: Vec::new(),
|
||||
frames: Vec::new(),
|
||||
holders: Vec::new(),
|
||||
dirty: true,
|
||||
texture_dirty: true,
|
||||
@@ -234,8 +240,8 @@ impl MapData {
|
||||
("trackingPosition", flag(self.tracking)),
|
||||
("unlimitedTracking", flag(self.unlimited)),
|
||||
("colors", Tag::ByteArray(self.colors.clone())),
|
||||
("banners", Tag::List(Vec::new())),
|
||||
("frames", Tag::List(Vec::new())),
|
||||
("banners", Tag::List(self.banners.clone())),
|
||||
("frames", Tag::List(self.frames.clone())),
|
||||
]),
|
||||
),
|
||||
("DataVersion", Tag::Int(horizon_world::DATA_VERSION)),
|
||||
@@ -257,6 +263,10 @@ impl MapData {
|
||||
_ => Vec::new(),
|
||||
};
|
||||
colors.resize(128 * 128, 0);
|
||||
let list = |k: &str| match d.get(k) {
|
||||
Some(Tag::List(l)) => l.clone(),
|
||||
_ => Vec::new(),
|
||||
};
|
||||
Some(Self {
|
||||
center: [int("xCenter")?, int("zCenter")?],
|
||||
scale: int("scale").unwrap_or(0).clamp(0, 4) as u8,
|
||||
@@ -266,6 +276,8 @@ impl MapData {
|
||||
unlimited: int("unlimitedTracking").unwrap_or(0) != 0,
|
||||
colors,
|
||||
decorations: Vec::new(),
|
||||
banners: list("banners"),
|
||||
frames: list("frames"),
|
||||
holders: Vec::new(),
|
||||
dirty: false,
|
||||
texture_dirty: true,
|
||||
|
||||
@@ -1146,7 +1146,7 @@ impl Game<'_> {
|
||||
})
|
||||
}
|
||||
/// `VehicleEntity.hurtServer` from the player's attack.
|
||||
pub(super) fn attack_cart(&mut self, damage: f32) -> bool {
|
||||
pub(super) fn attack_cart(&mut self) -> bool {
|
||||
let Some((i, d)) = self.cart_hit() else {
|
||||
return false;
|
||||
};
|
||||
@@ -1156,8 +1156,12 @@ impl Game<'_> {
|
||||
let burning = self
|
||||
.held()
|
||||
.is_some_and(|s| s.enchantment_level("minecraft:fire_aspect") > 0);
|
||||
self.vehicle_attack_sounds();
|
||||
let area = self.carts[i].bounds();
|
||||
// Player.attack's full damage against the cart's entity type.
|
||||
let id = self.carts[i].id as i32;
|
||||
let (damage, _, _, magic) = self.melee_damage(self.carts[i].kind.id(), false);
|
||||
self.hurt_cart(i, damage, self.creative, burning);
|
||||
self.vehicle_attack_sounds(area, magic.then_some(id));
|
||||
self.swing_arm();
|
||||
true
|
||||
}
|
||||
|
||||
@@ -49,6 +49,10 @@ impl Game<'_> {
|
||||
fn scoreboard_path(&self) -> std::path::PathBuf {
|
||||
self.world_root.join("data/minecraft/scoreboard.dat")
|
||||
}
|
||||
fn border_path(&self) -> std::path::PathBuf {
|
||||
save::dimension_dir(&self.world_root, "minecraft:overworld")
|
||||
.join("data/minecraft/world_border.dat")
|
||||
}
|
||||
/// `ScoreboardSaveData` read from `data/minecraft/scoreboard.dat`.
|
||||
pub(super) fn load_scoreboard(&mut self) {
|
||||
if self.score.loaded || self.remote.is_some() {
|
||||
@@ -62,7 +66,12 @@ impl Game<'_> {
|
||||
}
|
||||
self.score.storage =
|
||||
horizon_client::command_storage::CommandStorage::load(&self.world_root);
|
||||
if let Some(root) = save::read_dat(&self.world_root.join("data/minecraft/world_border.dat"))
|
||||
// ServerLevel.getWorldBorder: each dimension's data/minecraft/world_border.dat. Horizon
|
||||
// keeps one border, so the overworld's file stands for it; the root file is what
|
||||
// older Horizon builds wrote.
|
||||
let border_path = self.border_path();
|
||||
if let Some(root) = save::read_dat(&border_path)
|
||||
.or_else(|| save::read_dat(&self.world_root.join("data/minecraft/world_border.dat")))
|
||||
&& let Some(data) = root.get("data")
|
||||
{
|
||||
self.border = horizon_client::worldborder::WorldBorder::unpack(data);
|
||||
@@ -78,7 +87,7 @@ impl Game<'_> {
|
||||
self.score.stopwatches.save(&self.world_root);
|
||||
if self.border != horizon_client::worldborder::WorldBorder::default() {
|
||||
let _ = save::write_dat(
|
||||
&self.world_root.join("data/minecraft/world_border.dat"),
|
||||
&self.border_path(),
|
||||
Tag::compound([
|
||||
("data", self.border.pack()),
|
||||
("DataVersion", Tag::Int(horizon_world::DATA_VERSION)),
|
||||
|
||||
@@ -1727,7 +1727,7 @@ fn compress_records(
|
||||
let compress = |record: &Record| {
|
||||
record
|
||||
.tag()
|
||||
.map(|tag| ChunkRecord::from_nbt(&tag, Compression::Zlib, timestamp, Limits::default()))
|
||||
.map(|tag| ChunkRecord::from_nbt(&tag, Compression::Zlib, timestamp, Limits::saved()))
|
||||
.transpose()
|
||||
};
|
||||
let helpers = std::thread::available_parallelism()
|
||||
@@ -1844,7 +1844,7 @@ fn read_region_record(
|
||||
.map_err(|_| "region file poisoned")?
|
||||
.read(ChunkPos::new(x, z))?;
|
||||
Ok(match record {
|
||||
Some(r) => Some(r.nbt(Limits::default())?),
|
||||
Some(r) => Some(r.nbt(Limits::saved())?),
|
||||
None => None,
|
||||
})
|
||||
}
|
||||
@@ -2275,11 +2275,51 @@ impl Drop for SaveDir {
|
||||
|
||||
pub fn read_dat(path: &Path) -> Option<Tag> {
|
||||
let bytes = fs::read(path).ok()?;
|
||||
let raw = match Compression::Gzip.decode(&bytes, 64 << 20) {
|
||||
let raw = match Compression::Gzip.decode(&bytes, Limits::saved().max_bytes) {
|
||||
Ok(raw) => raw,
|
||||
Err(_) => bytes,
|
||||
};
|
||||
Some(nbt::read_named(&raw, Limits::default()).ok()?.0.tag)
|
||||
Some(nbt::read_named(&raw, Limits::saved()).ok()?.0.tag)
|
||||
}
|
||||
/// `FileNameDateFormatter`: the time in the names of backed-up unreadable files.
|
||||
fn backup_stamp() -> String {
|
||||
chrono::Local::now().format("%Y-%m-%d_%H-%M-%S").to_string()
|
||||
}
|
||||
/// `LevelStorageSource.readLevelDataTagFixed`: level.dat, else level.dat_old.
|
||||
fn read_level_dat(dir: &Path) -> Option<Tag> {
|
||||
read_dat(&dir.join("level.dat")).or_else(|| read_dat(&dir.join("level.dat_old")))
|
||||
}
|
||||
/// `restoreLevelDataFromOld`: an unreadable level.dat is kept as
|
||||
/// `level.dat_corrupted_<time>` and level.dat_old takes its place, so the next
|
||||
/// write does not bury either file.
|
||||
fn restore_level_dat(dir: &Path) {
|
||||
let path = dir.join("level.dat");
|
||||
if read_dat(&path).is_some() {
|
||||
return;
|
||||
}
|
||||
if path.exists() {
|
||||
let _ = fs::rename(
|
||||
&path,
|
||||
dir.join(format!("level.dat_corrupted_{}", backup_stamp())),
|
||||
);
|
||||
}
|
||||
let old = dir.join("level.dat_old");
|
||||
if read_dat(&old).is_some() {
|
||||
let _ = fs::rename(old, path);
|
||||
}
|
||||
}
|
||||
/// `PlayerDataStorage.backup`: a player file that fails to load is copied to
|
||||
/// `<uuid>_corrupted_<time>.dat` before it is written over.
|
||||
fn back_up_unreadable_player(path: &Path) {
|
||||
if path.is_file()
|
||||
&& read_dat(path).is_none()
|
||||
&& let Some(stem) = path.file_stem().and_then(|s| s.to_str())
|
||||
{
|
||||
let _ = fs::copy(
|
||||
path,
|
||||
path.with_file_name(format!("{stem}_corrupted_{}.dat", backup_stamp())),
|
||||
);
|
||||
}
|
||||
}
|
||||
/// Write a gzip NBT file the way vanilla does (`<name>_new`, keep `_old`).
|
||||
pub fn write_dat(path: &Path, tag: Tag) -> Result<()> {
|
||||
@@ -2291,7 +2331,7 @@ pub fn write_dat(path: &Path, tag: Tag) -> Result<()> {
|
||||
name: "".into(),
|
||||
tag,
|
||||
},
|
||||
Limits::default(),
|
||||
Limits::saved(),
|
||||
)
|
||||
.map_err(|e| e.to_string())?;
|
||||
let compressed = Compression::Gzip.encode(&bytes)?;
|
||||
@@ -2647,6 +2687,9 @@ pub struct Level {
|
||||
/// The game mode id (0 survival, 1 creative, 2 adventure, 3 spectator);
|
||||
/// `creative` wins when the two disagree.
|
||||
pub game_mode: i32,
|
||||
/// `previousPlayerGameType`: the mode the player left last (the F3+F4 switcher's
|
||||
/// return mode), when it has one.
|
||||
pub previous_game_mode: Option<i32>,
|
||||
pub time: i64,
|
||||
pub day_time: i64,
|
||||
/// Where the player respawns when it has no bed or anchor: its forced
|
||||
@@ -2755,7 +2798,7 @@ impl Level {
|
||||
}
|
||||
}
|
||||
pub fn read(dir: &Path) -> Option<Self> {
|
||||
let root = read_dat(&dir.join("level.dat"))?;
|
||||
let root = read_level_dat(dir)?;
|
||||
let data = root.get("Data")?;
|
||||
let n = |t: Option<&Tag>| number(t).unwrap_or(0);
|
||||
let mut level = Self {
|
||||
@@ -2843,7 +2886,12 @@ impl Level {
|
||||
// file of a server world, or the legacy Data.Player.
|
||||
let uuid = uuid_from_tag(data.get("singleplayer_uuid"));
|
||||
let player_dir = dir.join("players").join("data");
|
||||
let owner = uuid.and_then(|u| read_dat(&player_dir.join(format!("{}.dat", uuid_text(u)))));
|
||||
// PlayerDataStorage.load: the player's file, else its .dat_old.
|
||||
let owner = uuid.and_then(|u| {
|
||||
let name = uuid_text(u);
|
||||
read_dat(&player_dir.join(format!("{name}.dat")))
|
||||
.or_else(|| read_dat(&player_dir.join(format!("{name}.dat_old"))))
|
||||
});
|
||||
let player = owner
|
||||
.or_else(|| {
|
||||
fs::read_dir(&player_dir)
|
||||
@@ -2901,6 +2949,7 @@ impl Level {
|
||||
self.creative = mode == 1;
|
||||
self.game_mode = mode as i32;
|
||||
}
|
||||
self.previous_game_mode = n("previousPlayerGameType").map(|m| m as i32);
|
||||
self.flying = p
|
||||
.get("abilities")
|
||||
.and_then(|a| number(a.get("flying")))
|
||||
@@ -2998,6 +3047,7 @@ impl Level {
|
||||
"respawn",
|
||||
"recipeBook",
|
||||
"LastDeathLocation",
|
||||
"previousPlayerGameType",
|
||||
] {
|
||||
map.remove(&JavaString::from(key));
|
||||
}
|
||||
@@ -3166,6 +3216,10 @@ impl Level {
|
||||
));
|
||||
}
|
||||
}
|
||||
// ServerPlayer.storeGameTypes: storeNullable, so absent without one.
|
||||
if let Some(mode) = self.previous_game_mode {
|
||||
entries.push(("previousPlayerGameType", Tag::Int(mode)));
|
||||
}
|
||||
for (key, value) in entries {
|
||||
put(&mut p, key, value);
|
||||
}
|
||||
@@ -3191,6 +3245,7 @@ impl Level {
|
||||
/// Write every file; a world without a player UUID gets a random one.
|
||||
pub fn write(&mut self, dir: &Path) -> Result<()> {
|
||||
fs::create_dir_all(dir)?;
|
||||
restore_level_dat(dir);
|
||||
let existing = read_dat(&dir.join("level.dat")).and_then(|r| r.get("Data").cloned());
|
||||
let legacy = existing
|
||||
.as_ref()
|
||||
@@ -3381,12 +3436,12 @@ impl Level {
|
||||
}
|
||||
write_saved_data(dir, "game_rules", rules)?;
|
||||
}
|
||||
write_dat(
|
||||
&dir.join("players")
|
||||
.join("data")
|
||||
.join(format!("{}.dat", uuid_text(uuid))),
|
||||
self.player_tag(),
|
||||
)?;
|
||||
let player_file = dir
|
||||
.join("players")
|
||||
.join("data")
|
||||
.join(format!("{}.dat", uuid_text(uuid)));
|
||||
back_up_unreadable_player(&player_file);
|
||||
write_dat(&player_file, self.player_tag())?;
|
||||
write_dat(&dir.join("level.dat"), Tag::compound([("Data", data)]))?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -4495,11 +4550,13 @@ mod tests {
|
||||
let dir = std::env::temp_dir().join(format!("horizon-lock-{}", std::process::id()));
|
||||
let first = super::SessionLock::acquire(&dir).expect("first lock");
|
||||
assert!(super::SessionLock::acquire(&dir).is_err());
|
||||
drop(first);
|
||||
// Windows refuses a read through another handle while the file is
|
||||
// locked, so the bytes are read once the lock is released.
|
||||
assert_eq!(
|
||||
std::fs::read(dir.join("session.lock")).unwrap(),
|
||||
[0x26, 0x03]
|
||||
);
|
||||
drop(first);
|
||||
assert!(super::SessionLock::acquire(&dir).is_ok());
|
||||
let _ = std::fs::remove_dir_all(&dir);
|
||||
}
|
||||
|
||||
@@ -111,6 +111,18 @@ impl Limits {
|
||||
}
|
||||
}
|
||||
|
||||
/// Chunks, entities, POI and the world's `.dat` files: vanilla reads and
|
||||
/// writes them with `NbtAccounter.unlimitedHeap()` (`NbtIo.read`), so a
|
||||
/// chunk past the default node cap (a few thousand full containers) still
|
||||
/// loads. The byte cap stays as the only guard on the decompressed data.
|
||||
pub fn saved() -> Self {
|
||||
Self {
|
||||
max_bytes: 1 << 30,
|
||||
max_nodes: usize::MAX,
|
||||
max_depth: 512,
|
||||
}
|
||||
}
|
||||
|
||||
/// Structure templates (`structure/*.nbt`): vanilla reads them with
|
||||
/// `NbtAccounter.unlimitedHeap()` (TemplateSource.readStructure), and
|
||||
/// mods ship templates past the default node cap (YUNG's Better Ocean
|
||||
|
||||
@@ -29,6 +29,7 @@ To play, use [the launcher](../launcher/README.md); the project site is [playhor
|
||||
- [Rust rewrite status](rust-parity.md): completion criteria, how to reproduce the validation, and per-area scope.
|
||||
- [Parity workflow](parity-workflow.md): `tools/parity.py`, the gate, other machines, merging.
|
||||
- Area notes: [block behaviours and ticking](parity/blocks.md), [section meshing](parity/meshing.md).
|
||||
- [Port ledger](port-ledger.md): `tools/port_ledger.py`, every vanilla method next to the Rust functions that port it, both ways, with the gaps where a port isn't wired like vanilla.
|
||||
- [Version ports](version-ports.md): how a new Minecraft release is detected, diffed against the pinned one and ported, and what stays manual.
|
||||
- [Decompilation and research lab](research-lab.md) and [decompilation status](decompilation-status.md): the local game inspection workspace the harnesses build on.
|
||||
|
||||
|
||||
@@ -174,11 +174,11 @@ MCP: `account_skin`.
|
||||
|
||||
## `horizon-launcher settings`
|
||||
|
||||
Show the launcher's settings, or set one (the Settings page): selected-version TAG, minecraft-dir PATH, server-dir PATH ("default" resets a folder), install-new-versions on|off, opening-animation on|off, proxy http://host:port ("default" removes it), while-playing stay|minimize|hide (what the window does while the game runs), language system|en|fr|ru (the window's language; system follows the computer's), accent violet|blue|teal|green|amber|red|pink, background PATH (a picture behind Home; "default" shows Horizon's landscape).
|
||||
Show the launcher's settings, or set one (the Settings page): selected-version TAG, minecraft-dir PATH, server-dir PATH ("default" resets a folder), install-new-versions on|off, prune-old-versions on|off (delete old versions after an install, keeping the selected one, the ones instances use and the newest few), keep-versions N (how many of the newest to keep; "default" is 2), opening-animation on|off, proxy http://host:port ("default" removes it), while-playing stay|minimize|hide (what the window does while the game runs), language system|en|fr|ru (the window's language; system follows the computer's), accent violet|blue|teal|green|amber|red|pink, background PATH (a picture behind Home; "default" shows Horizon's landscape).
|
||||
|
||||
horizon-launcher settings [KEY] [VALUE]
|
||||
|
||||
- `KEY` (selected-version, minecraft-dir, server-dir, install-new-versions, opening-animation, proxy, while-playing, language, accent, background)
|
||||
- `KEY` (selected-version, minecraft-dir, server-dir, install-new-versions, prune-old-versions, keep-versions, opening-animation, proxy, while-playing, language, accent, background)
|
||||
- `VALUE`: The new value (with KEY)
|
||||
|
||||
MCP: `settings`.
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
# Port ledger
|
||||
|
||||
`tools/port_ledger.py` lists every vanilla method next to the Horizon functions that port it, both ways, and
|
||||
points at the places where a port exists but isn't wired like vanilla. It answers the questions every parity
|
||||
fix starts with, without searching:
|
||||
|
||||
- where is vanilla's `Class.method` in Horizon (`where`), and which vanilla method does this Rust function
|
||||
port (`what`);
|
||||
- which vanilla code and which Rust functions a bug report is about (`issue`);
|
||||
- what a branch touches, and which gaps it opens or closes (`check`).
|
||||
|
||||
`vanilla_map.py` maps classes to files for version ports; the ledger works one level down, per method and per
|
||||
Rust function with its line span.
|
||||
|
||||
## Use
|
||||
|
||||
```sh
|
||||
python3 tools/port_ledger.py build # about 20 s; again after pulling
|
||||
python3 tools/port_ledger.py where KineticWeapon.damageEntities # its ports, callees, callers, gaps
|
||||
python3 tools/port_ledger.py where ShulkerBulletRenderer # every method of a class, with status
|
||||
python3 tools/port_ledger.py what crates/horizon-client/src/game/spear.rs:150
|
||||
python3 tools/port_ledger.py class IronGolem # method by method: where, or missing
|
||||
python3 tools/port_ledger.py issue 3123 # a GitHub issue (or the report's text)
|
||||
python3 tools/port_ledger.py check --base origin/main # what this branch touches
|
||||
python3 tools/port_ledger.py coverage --package world/entity --depth 3
|
||||
python3 tools/port_ledger.py gaps --kind seam # see the kinds below
|
||||
python3 tools/port_ledger.py report # .local/port-ledger/report.{md,html}
|
||||
python3 tools/port_ledger.py diff old/ledger.json # against another build
|
||||
python3 tools/port_ledger.py todo --package world/entity/animal # the next methods with no answer
|
||||
```
|
||||
|
||||
`--json` on any query gives machine output for agents.
|
||||
|
||||
`build` reads the vanilla game jar (the lab's, or the launcher's `versions/<version>/<version>.jar`; `--jar`
|
||||
picks one, `--no-jar` skips it) and the lab's decompiled sources (`.local/minecraft/<version>/sources/
|
||||
{client,server}`, from `python3 tools/lab.py decompile`; `--sources DIR` takes any directory of decompiled
|
||||
Java). The jar's bytecode gives the exact call targets, constants and ids; the sources give line numbers and
|
||||
the cases the bytecode can't name. Nothing from either is written outside `.local/`.
|
||||
|
||||
`report` writes `report.md` and `report.html`, a single offline page with a search over every method (by class,
|
||||
method, Rust function or file), the gaps by kind, and coverage by package.
|
||||
|
||||
## How a method is matched
|
||||
|
||||
1. **Ported:** a Rust function whose doc comment opens with the method, the house style
|
||||
(`` /// `KineticWeapon.damageEntities`: one tick of the spear in use. ``). `Class.method`, `Class::method` and
|
||||
`Class#method` all count, as in `vanilla_map.py`; `Outer.Inner.method` names a nested class. A method a
|
||||
class inherits resolves to the class that declares it.
|
||||
2. **Named:** a function with the method's own name (`tickRain` → `tick_rain`) in a file that cites the class,
|
||||
in an `impl` of a type named for the class (`impl ShulkerBullet`), or in a file named for it
|
||||
(`shulker_bullet.rs`). A function in `impl HurtByTarget` is never taken for `AvoidEntityGoal.canUse`: its
|
||||
type must be named for the class, a sub- or superclass of it, or be one of Horizon's own containers
|
||||
(`Game`, `Sim`, `MotionWorld`).
|
||||
3. **Mapped, skipped, absent:** a row in the verdict map (below) says where it is, why it needs no port, or
|
||||
that Horizon doesn't do it.
|
||||
4. **Mentioned:** the method appears in some other comment of a function (often a caller explaining a step).
|
||||
5. **Linked:** where `X` is ported as `A`, a callee of `X` with no port and a callee of `A` nothing cites,
|
||||
whose names agree less Java's `get` (`getFlyingSpeed` → `flying_speed`).
|
||||
6. **Structural:** in the class's home files (below), the function that touches the same state (the fields the
|
||||
method reads and writes, by their Rust names) and reaches the ports of the same callees, weighed against its
|
||||
length so one long function doesn't take every method.
|
||||
7. **Inferred:** nothing names it, but a function shares what is hard to share by chance: rare numbers
|
||||
(`0.458`, `72000`) and game ids (`SoundEvents.ENTITY_SHULKER_BULLET_HIT` against
|
||||
`"entity.shulker_bullet.hit"`, `Blocks.DETECTOR_RAIL` against `"minecraft:detector_rail"`).
|
||||
8. **Trivial:** an accessor, an abstract method, a few instructions, or a constructor that only sets fields
|
||||
(the struct's initialiser): nothing to port on its own. Coverage leaves these out of its percentage.
|
||||
9. **Missing:** none of these: no answer yet.
|
||||
|
||||
Every class also gets a **home**: the Rust files it lives in, weighed from all of the above, the files citing
|
||||
it, files named for it and `impl`s of a type named for it (a nested class without one lives with its outer
|
||||
class). `where Class`, `class` and `issue` show it.
|
||||
|
||||
`coverage` gives two shares: *found*, the methods worth porting (not trivial, not skipped) that have a port,
|
||||
and *answered*, all methods with any answer (a port, a reason to skip, trivial, or known to be missing).
|
||||
|
||||
Citing the vanilla method in the first line of a function's doc is what makes it findable, by people, agents
|
||||
and this tool alike; `check` lists the functions a branch changed that look like ports but cite nothing. Test
|
||||
code (`#[test]`, `mod tests`, fixtures, probes, examples) never counts as a port.
|
||||
|
||||
## Gaps
|
||||
|
||||
Java calls come from the bytecode (`invokevirtual`, `invokestatic`, method handles in lambdas), so each names
|
||||
its exact owner; a call also reaches the overrides in subclasses. Rust calls resolve through the receiver's
|
||||
type where it is known (`self`, a parameter, a `let`, a struct field, a trait to its impls), else by name.
|
||||
|
||||
| Kind | Means | Example it found |
|
||||
|---|---|---|
|
||||
| `seam` | A vanilla method ported on two paths (the in-frame game, the server-client side in `game/remote*.rs`, the server in `game/lan*.rs` and `src/lan/`), where one path reaches the port of a callee and the other doesn't. Single player runs on the server thread, so this is where most player-visible bugs sit; a gap on the old in-frame path sorts last. | `remote_use` ported `Minecraft.startUseItem` without `LocalPlayer.itemUsed`: the held block never dipped after a placement on a server |
|
||||
| `client` | A vanilla method with an effect only the client's copy of the world shows (`addParticle`, `playLocalSound`, `itemUsed`, an `isClientSide()` branch), whose port nothing in `game/remote*.rs` reaches. | `AbstractHorse.handleEating`'s happy-villager particle, drawn only on the server's level |
|
||||
| `drift` | A port that never names a sound, particle, item, block, effect or game event its vanilla method uses, or lacks one of its rare numbers. Names count however Rust spells them (`Sound::AnvilLand`, `"block.anvil.land"`). | `throw_ender_eye`, the port of `EnderEyeItem.use`, names neither the `used_ender_eye` trigger nor the `projectile_shoot` game event (a lead, not yet checked) |
|
||||
| `class` | A whole class nothing ports while most of its package is ported. Renderers, sound instances and goals are reached by registration, so no call graph shows them. | `ShulkerBulletRenderer`, `ElytraOnPlayerSoundInstance` |
|
||||
| `callee` | A ported method whose ported callee its port never reaches. Noisier: a port may get the value as an argument instead. | `Projectile.shootFromRotation` without `Entity.getKnownMovement`: throws added a stale server velocity; `ServerPlayer.getKnownMovement` without `getVehicle`: a spear's charge ignored the horse |
|
||||
| `stale` | A citation whose class or method the pinned version doesn't have (renamed, removed, or a typo). | |
|
||||
| `map` | A verdict-map row whose class, method or Rust fn doesn't exist, or whose verdict isn't one of the above. | |
|
||||
| `unported` | (`gaps --kind unported`) Vanilla methods with no port, ranked by how many vanilla methods call them. | |
|
||||
|
||||
Calls to maths, geometry, randomness and text (`Mth`, `AABB`, `Vec3`, `RandomSource`, `Component`) never make
|
||||
a `seam` or `callee` gap: every path does those its own way.
|
||||
|
||||
A gap is a lead, not a verdict: read the vanilla method and the Rust function it names before changing
|
||||
anything.
|
||||
|
||||
## The verdict map
|
||||
|
||||
What no automatic match finds, someone reads and decides. `tools/port_map/*.tsv` holds those answers, one
|
||||
file per batch, tab-separated:
|
||||
|
||||
```
|
||||
Class.method verdict where note
|
||||
XoroshiroRandomSource.nextInt port crates/horizon-core/src/random.rs::XoroshiroRandom::next_int_bound bounded form
|
||||
ArmadilloAi.initIdleActivity inline crates/horizon-client/src/mobs/armadillo.rs::register gap: no AnimalMakeLove, so armadillos never breed
|
||||
MushroomCow.addAdditionalSaveData missing Type is not saved: a mooshroom turned brown by lightning loads red
|
||||
NoiseRouterData skip:data a class row covers the class's methods without a row of their own
|
||||
```
|
||||
|
||||
Verdicts: `port` (the fn that does the method's job), `inline` (the bigger fn its behaviour is folded into),
|
||||
`missing`, `skip:<reason>` with a reason from `java`, `data`, `ui`, `debug`, `service`, `server`, `other`, and on
|
||||
a class row `home` with the class's files. `where` names a fn by file, impl type and name, not by line, so rows
|
||||
survive edits around them; a row whose class, method or fn doesn't exist shows up as a `map` gap.
|
||||
|
||||
`todo [--package P] [--limit N] [--after CLASS]` prints the next batch of methods with no answer, whole classes
|
||||
at a time, with each class's Java source, home files, and Rust functions in them with similar names: the input
|
||||
for whoever (or whichever agent) writes the next batch file. Set `PORT_LEDGER_OUT` to build into another
|
||||
directory, so several people can check their own rows at once.
|
||||
|
||||
## Bug reports and branches
|
||||
|
||||
`issue N` reads a GitHub issue (`gh issue view`), or takes the report's text (`-` reads stdin), drops the
|
||||
bug-report template, and ranks the vanilla classes it names the way players write them ("shulker bullet",
|
||||
"eye of ender", and registry names from the entity, block and item registries: "mooshroom" is `MushroomCow`), then the methods its words name in those classes. For each class it lists where Horizon ports
|
||||
it and the gaps around it: on #3123 ("an iron golem you built no longer attacks you") it points at
|
||||
`IronGolem.isPlayerCreated` and `setPlayerCreated`, both missing.
|
||||
|
||||
`check --base origin/main` takes the branch's changes since its merge base (uncommitted work too), rebuilds the
|
||||
ledger if it is older than them, and lists the ports the changes touch with their vanilla source and open gaps,
|
||||
citations to add, and stale ones. It then builds the base in a throwaway worktree and lists the gaps the
|
||||
branch opens and closes and the methods it newly ports (`--no-compare` skips that half, about 20 s).
|
||||
@@ -181,5 +181,9 @@
|
||||
"These mods will run with full access to your computer": "Diese Mods erhalten vollen Zugriff auf deinen Computer",
|
||||
"They can read, change or delete your files, and use your accounts and network, like any program you run. Build them only if you trust their authors: the Mods page names them.": "Sie können deine Dateien lesen, ändern oder löschen und deine Konten sowie dein Netzwerk nutzen wie jedes andere Programm, das du ausführst. Kompiliere sie nur, wenn du ihren Autoren vertraust: Die Mods-Seite nennt sie.",
|
||||
"Mods: {mods}": "Mods: {mods}",
|
||||
"The build compiles the game: about ten minutes and a few GB of disk the first time, a few minutes after that.": "Der Build kompiliert das Spiel: beim ersten Mal etwa zehn Minuten und einige GB Speicherplatz, danach einige Minuten."
|
||||
"The build compiles the game: about ten minutes and a few GB of disk the first time, a few minutes after that.": "Der Build kompiliert das Spiel: beim ersten Mal etwa zehn Minuten und einige GB Speicherplatz, danach einige Minuten.",
|
||||
"Delete old versions automatically": "Alte Versionen automatisch löschen",
|
||||
"Keeps the {count} newest, the one in use and the ones your instances use. Deleted versions install again from the Versions page.": "Behält die {count} neuesten, die verwendete und die von deinen Instanzen genutzten. Gelöschte Versionen lassen sich auf der Seite Versionen wieder installieren.",
|
||||
"Installed versions use {size}.": "Installierte Versionen belegen {size}.",
|
||||
"{size} on disk": "{size} auf dem Datenträger"
|
||||
}
|
||||
@@ -173,6 +173,10 @@
|
||||
"Not prepared. Horizon can download Minecraft {version} from Mojang for your account, or use your own install.": "Pas préparé. Horizon peut télécharger Minecraft {version} depuis Mojang pour votre compte, ou utiliser votre propre installation.",
|
||||
"Not prepared. Sign in with the Microsoft account that owns Minecraft {version} first.": "Pas préparé. Connectez-vous d'abord avec le compte Microsoft qui possède Minecraft {version}.",
|
||||
"Cancel": "Annuler",
|
||||
"Delete old versions automatically": "Supprimer automatiquement les anciennes versions",
|
||||
"Keeps the {count} newest, the one in use and the ones your instances use. Deleted versions install again from the Versions page.": "Garde les {count} plus récentes, celle utilisée et celles de vos instances. Une version supprimée se réinstalle depuis la page Versions.",
|
||||
"Installed versions use {size}.": "Les versions installées occupent {size}.",
|
||||
"{size} on disk": "{size} sur le disque",
|
||||
"Native mods (experimental)": "Mods natifs (expérimental)",
|
||||
"Native mods from the Mods page compile into the game with the launcher's own Rust. Not sandboxed: they can do anything you can on this computer.": "Les mods natifs de la page Mods sont compilés dans le jeu avec le Rust du launcher. Sans bac à sable : ils peuvent faire tout ce que vous pouvez faire sur cet ordinateur.",
|
||||
"{version} plays in this instance.": "Cette instance joue {version}.",
|
||||
|
||||
@@ -173,6 +173,10 @@
|
||||
"Not prepared. Horizon can download Minecraft {version} from Mojang for your account, or use your own install.": "Не подготовлено. Horizon может скачать Minecraft {version} у Mojang для вашего аккаунта или взять вашу установку.",
|
||||
"Not prepared. Sign in with the Microsoft account that owns Minecraft {version} first.": "Не подготовлено. Сначала войдите в аккаунт Microsoft, у которого есть Minecraft {version}.",
|
||||
"Cancel": "Отмена",
|
||||
"Delete old versions automatically": "Автоматически удалять старые версии",
|
||||
"Keeps the {count} newest, the one in use and the ones your instances use. Deleted versions install again from the Versions page.": "Оставляет {count} самых новых, используемую и те, что нужны вашим сборкам. Удалённую версию можно снова установить на странице «Версии».",
|
||||
"Installed versions use {size}.": "Установленные версии занимают {size}.",
|
||||
"{size} on disk": "{size} на диске",
|
||||
"Native mods (experimental)": "Нативные моды (экспериментально)",
|
||||
"Native mods from the Mods page compile into the game with the launcher's own Rust. Not sandboxed: they can do anything you can on this computer.": "Нативные моды со страницы «Моды» компилируются в игру собственным Rust лаунчера. Без песочницы: они могут делать на этом компьютере всё, что можете вы.",
|
||||
"{version} plays in this instance.": "В этой сборке запускается {version}.",
|
||||
|
||||
@@ -666,6 +666,23 @@ pub fn remove(tag: &str) -> Result<(), String> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// The bytes an installed version takes on disk.
|
||||
pub fn disk_use(tag: &str) -> u64 {
|
||||
fn size(dir: &Path) -> u64 {
|
||||
fs::read_dir(dir)
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.flatten()
|
||||
.map(|e| match e.metadata() {
|
||||
Ok(m) if m.is_dir() => size(&e.path()),
|
||||
Ok(m) => m.len(),
|
||||
Err(_) => 0,
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
size(&version_dir(tag))
|
||||
}
|
||||
|
||||
/// The Minecraft version a Horizon build targets, from its research-lock.json.
|
||||
pub fn game_version(tag: &str) -> String {
|
||||
game_version_at(&version_dir(tag))
|
||||
@@ -1968,6 +1985,72 @@ pub fn remove_version(tag: &str) -> Result<(), String> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// How many of the newest release versions stay installed when the player has not said.
|
||||
const KEEP_NEWEST: usize = 2;
|
||||
|
||||
/// The release versions to delete: all but the `keep` newest of `installed` (newest first), and
|
||||
/// never one of `protected`. Nightly builds are left out: `nightly::after_update` removes the
|
||||
/// older ones.
|
||||
fn stale_versions(installed: &[String], keep: usize, protected: &[String]) -> Vec<String> {
|
||||
installed
|
||||
.iter()
|
||||
.filter(|t| is_game_tag(t))
|
||||
.skip(keep)
|
||||
.filter(|t| !protected.contains(t))
|
||||
.cloned()
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Whether a running program was started from the version's folder: the game and a server take
|
||||
/// their program and `--resources` from it. Windows refuses to delete a running program's files,
|
||||
/// so there the delete itself fails. With no answer from `ps` the version counts as running.
|
||||
#[cfg(unix)]
|
||||
fn in_use(tag: &str) -> bool {
|
||||
let dir = format!("{}/", version_dir(tag).display());
|
||||
Command::new("ps")
|
||||
.args(["-A", "-ww", "-o", "args="])
|
||||
.output()
|
||||
.ok()
|
||||
.is_none_or(|out| String::from_utf8_lossy(&out.stdout).contains(&dir))
|
||||
}
|
||||
|
||||
#[cfg(not(unix))]
|
||||
fn in_use(_tag: &str) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
/// Deletes the release versions nothing needs after an install or update, unless the player
|
||||
/// turned that off: all but the newest few (`Settings::keep_newest`), the selected version, the
|
||||
/// ones instances pin and the ones a program is running from. A version that does not delete
|
||||
/// is logged and the rest still go. Returns the versions deleted. They install again from GitHub.
|
||||
pub fn prune_old_versions() -> Vec<String> {
|
||||
let settings = Settings::load();
|
||||
if !settings.auto_prune() {
|
||||
return Vec::new();
|
||||
}
|
||||
let mut protected: Vec<String> = settings.selected.iter().cloned().collect();
|
||||
protected.extend(
|
||||
crate::instances::list()
|
||||
.into_iter()
|
||||
.filter_map(|i| i.version),
|
||||
);
|
||||
let mut gone = Vec::new();
|
||||
for tag in stale_versions(&installed(), settings.keep_newest(), &protected) {
|
||||
if in_use(&tag) {
|
||||
eprintln!("Keeping old version {tag}: the game is running from it.");
|
||||
continue;
|
||||
}
|
||||
match remove(&tag) {
|
||||
Ok(()) => {
|
||||
eprintln!("Removed old version {tag}.");
|
||||
gone.push(tag);
|
||||
}
|
||||
Err(e) => eprintln!("Could not remove old version {tag}: {e}"),
|
||||
}
|
||||
}
|
||||
gone
|
||||
}
|
||||
|
||||
/// The Minecraft folder to prepare from: the one given, the one chosen in the launcher, or the
|
||||
/// official launcher's default. It may be absent when imported files can be reused.
|
||||
pub fn minecraft_dir(requested: Option<PathBuf>) -> Result<PathBuf, String> {
|
||||
@@ -2238,6 +2321,7 @@ pub fn install_tag(tag: &str, as_update: bool, progress: impl Fn(f32)) -> Result
|
||||
if as_update && release.nightly.is_some() {
|
||||
crate::nightly::after_update(&release.tag);
|
||||
}
|
||||
prune_old_versions();
|
||||
Ok(release.tag.clone())
|
||||
}
|
||||
|
||||
@@ -2563,6 +2647,10 @@ pub enum Msg {
|
||||
Installed(String, Result<(), String>),
|
||||
/// A version's files are gone (or could not be deleted).
|
||||
Removed(String, Result<(), String>),
|
||||
/// `prune_old_versions` ended; these versions were deleted.
|
||||
Pruned(Vec<String>),
|
||||
/// What each installed version takes on disk (`disk_use`).
|
||||
DiskUse(Vec<(String, u64)>),
|
||||
Line(Job, String),
|
||||
Exit(Job, Result<(), String>),
|
||||
/// Boxed: two releases, the largest message by far.
|
||||
@@ -2724,6 +2812,13 @@ pub struct Settings {
|
||||
/// `auto_install` (off by default) for everyone, so this is a new key and that one is ignored.
|
||||
#[serde(default)]
|
||||
pub install_new_versions: Option<bool>,
|
||||
/// Unset means on: after an install the launcher deletes the release versions nothing needs
|
||||
/// (`prune_old_versions`). Only a player who turned it off has `false` here.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub prune_old_versions: Option<bool>,
|
||||
/// How many of the newest release versions pruning keeps. Unset means [`KEEP_NEWEST`].
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub keep_versions: Option<usize>,
|
||||
/// Off by default, so the opening animation shows unless the player turns it off.
|
||||
#[serde(default)]
|
||||
pub skip_opening: bool,
|
||||
@@ -2830,6 +2925,14 @@ impl Settings {
|
||||
pub fn auto_install(&self) -> bool {
|
||||
self.install_new_versions.unwrap_or(true)
|
||||
}
|
||||
/// Whether old versions are deleted after an install.
|
||||
pub fn auto_prune(&self) -> bool {
|
||||
self.prune_old_versions.unwrap_or(true)
|
||||
}
|
||||
/// How many of the newest release versions pruning keeps: at least the newest.
|
||||
pub fn keep_newest(&self) -> usize {
|
||||
self.keep_versions.unwrap_or(KEEP_NEWEST).max(1)
|
||||
}
|
||||
pub fn save(&self) {
|
||||
let _ = fs::create_dir_all(data_dir());
|
||||
let _ = fs::write(
|
||||
@@ -4279,6 +4382,24 @@ mod tests {
|
||||
let _ = fs::remove_dir_all(&dir);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pruning_keeps_the_newest_and_the_protected() {
|
||||
let tags = |t: &[&str]| t.iter().map(|s| s.to_string()).collect::<Vec<_>>();
|
||||
let installed = tags(&[
|
||||
"v0.2.91", "v0.2.90", "v0.2.88", "v0.2.85", "v0.2.80", "nightly",
|
||||
]);
|
||||
assert_eq!(
|
||||
stale_versions(&installed, 2, &tags(&["v0.2.85"])),
|
||||
tags(&["v0.2.88", "v0.2.80"])
|
||||
);
|
||||
// A protected version among the newest still leaves the newest `keep` in place.
|
||||
assert_eq!(
|
||||
stale_versions(&installed, 2, &tags(&["v0.2.91"])),
|
||||
tags(&["v0.2.88", "v0.2.85", "v0.2.80"])
|
||||
);
|
||||
assert!(stale_versions(&installed, 9, &[]).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn crash_reports_are_found_and_summarised() {
|
||||
let dir =
|
||||
|
||||
+21
-3
@@ -675,8 +675,10 @@ enum Cmd {
|
||||
},
|
||||
/// Show the launcher's settings, or set one (the Settings page): selected-version TAG,
|
||||
/// minecraft-dir PATH, server-dir PATH ("default" resets a folder), install-new-versions
|
||||
/// on|off, opening-animation on|off, proxy http://host:port ("default" removes it),
|
||||
/// while-playing stay|minimize|hide (what the window does while the game runs), language
|
||||
/// on|off, prune-old-versions on|off (delete old versions after an install, keeping the
|
||||
/// selected one, the ones instances use and the newest few), keep-versions N (how many of the
|
||||
/// newest to keep; "default" is 2), opening-animation on|off, proxy http://host:port
|
||||
/// ("default" removes it), while-playing stay|minimize|hide (what the window does while the game runs), language
|
||||
/// system|en|fr|ru (the window's language; system follows the computer's), accent
|
||||
/// violet|blue|teal|green|amber|red|pink, background PATH (a picture behind Home; "default"
|
||||
/// shows Horizon's landscape)
|
||||
@@ -827,11 +829,13 @@ pub fn command() -> clap::Command {
|
||||
pub const AI_COMMANDS: [&str; 2] = ["mcp", "agent-config"];
|
||||
|
||||
/// The keys `settings` sets.
|
||||
const SETTING_KEYS: [&str; 10] = [
|
||||
const SETTING_KEYS: [&str; 12] = [
|
||||
"selected-version",
|
||||
"minecraft-dir",
|
||||
"server-dir",
|
||||
"install-new-versions",
|
||||
"prune-old-versions",
|
||||
"keep-versions",
|
||||
"opening-animation",
|
||||
"proxy",
|
||||
"while-playing",
|
||||
@@ -855,6 +859,18 @@ fn set_setting(s: &mut backend::Settings, key: &str, value: &str) -> Result<(),
|
||||
"minecraft-dir" => s.minecraft_dir = folder(value),
|
||||
"server-dir" => s.server_dir = folder(value),
|
||||
"install-new-versions" => s.install_new_versions = Some(on_off(value)?),
|
||||
"prune-old-versions" => s.prune_old_versions = Some(on_off(value)?),
|
||||
"keep-versions" => {
|
||||
s.keep_versions = match value {
|
||||
"default" => None,
|
||||
n => Some(
|
||||
n.parse::<usize>()
|
||||
.ok()
|
||||
.filter(|n| *n > 0)
|
||||
.ok_or_else(|| format!("{value}: say a number from 1, or default"))?,
|
||||
),
|
||||
}
|
||||
}
|
||||
"opening-animation" => s.skip_opening = !on_off(value)?,
|
||||
"while-playing" => {
|
||||
s.while_playing = backend::WhilePlaying::parse(value)
|
||||
@@ -907,6 +923,8 @@ fn settings_json(s: &backend::Settings) -> serde_json::Value {
|
||||
"minecraft_dir": s.minecraft_dir,
|
||||
"server_dir": backend::server_dir(None),
|
||||
"install_new_versions": s.install_new_versions.unwrap_or(true),
|
||||
"prune_old_versions": s.auto_prune(),
|
||||
"keep_versions": s.keep_newest(),
|
||||
"opening_animation": !s.skip_opening,
|
||||
"game_args": s.game_args,
|
||||
"proxy": s.proxy,
|
||||
|
||||
+71
-1
@@ -170,6 +170,10 @@ struct Launcher {
|
||||
/// The version being deleted on a background thread. It is already out of `installed`, so
|
||||
/// nothing can launch, select or prepare it, and its row can't install or remove it again.
|
||||
removing: Option<String>,
|
||||
/// What each installed version takes on disk, measured on a thread for the Versions page, and
|
||||
/// the installed list it was measured for.
|
||||
disk: Vec<(String, u64)>,
|
||||
disk_for: Vec<String>,
|
||||
install_error: Option<(String, String)>,
|
||||
/// Native mods (`native_mods`): the build's step while it runs, why it failed, and the
|
||||
/// warning before a build while it is open, with the mods it names.
|
||||
@@ -391,6 +395,8 @@ impl Launcher {
|
||||
installed,
|
||||
installing: None,
|
||||
removing: None,
|
||||
disk: Vec::new(),
|
||||
disk_for: Vec::new(),
|
||||
install_error: None,
|
||||
native_step: None,
|
||||
native_error: None,
|
||||
@@ -777,6 +783,11 @@ impl Launcher {
|
||||
self.settings.selected = Some(tag);
|
||||
}
|
||||
self.settings.save();
|
||||
// After the save: the selected version is never pruned.
|
||||
let tx = self.tx.clone();
|
||||
std::thread::spawn(move || {
|
||||
let _ = tx.send(Msg::Pruned(backend::prune_old_versions()));
|
||||
});
|
||||
}
|
||||
Err(e) => self.install_error = Some((tag, e)),
|
||||
}
|
||||
@@ -792,6 +803,12 @@ impl Launcher {
|
||||
self.install_error = Some((tag, e));
|
||||
}
|
||||
}
|
||||
Msg::DiskUse(disk) => self.disk = disk,
|
||||
Msg::Pruned(gone) => {
|
||||
if !gone.is_empty() {
|
||||
self.installed = backend::installed();
|
||||
}
|
||||
}
|
||||
Msg::Updates(Ok(updates)) => {
|
||||
self.update_error = None;
|
||||
self.updates = *updates;
|
||||
@@ -2897,6 +2914,13 @@ impl Launcher {
|
||||
cx.notify();
|
||||
}),
|
||||
);
|
||||
let prune = switch("auto-prune", self.settings.auto_prune(), &t).on_click(cx.listener(
|
||||
|this, _: &ClickEvent, _, cx| {
|
||||
this.settings.prune_old_versions = Some(!this.settings.auto_prune());
|
||||
this.settings.save();
|
||||
cx.notify();
|
||||
},
|
||||
));
|
||||
let opening = switch("opening", !self.settings.skip_opening, &t).on_click(cx.listener(
|
||||
|this, _: &ClickEvent, _, cx| {
|
||||
this.settings.skip_opening = !this.settings.skip_opening;
|
||||
@@ -3047,6 +3071,20 @@ impl Launcher {
|
||||
Some(toggle.into_any_element()),
|
||||
&t,
|
||||
))
|
||||
.child(index_row(
|
||||
n + 2,
|
||||
tr("Delete old versions automatically"),
|
||||
Some(
|
||||
div()
|
||||
.child(trf(
|
||||
"Keeps the {count} newest, the one in use and the ones your instances use. Deleted versions install again from the Versions page.",
|
||||
&[("count", &self.settings.keep_newest().to_string())],
|
||||
))
|
||||
.into_any_element(),
|
||||
),
|
||||
Some(prune.into_any_element()),
|
||||
&t,
|
||||
))
|
||||
.child(group("Launcher", "monitor"))
|
||||
.child(index_row(
|
||||
n + 3,
|
||||
@@ -3664,7 +3702,36 @@ impl Launcher {
|
||||
"Builds from GitHub. Each one installs into its own folder.",
|
||||
&t,
|
||||
);
|
||||
let page = div().flex().flex_col().gap(px(32.)).child(header);
|
||||
// Measured again when the installed versions change.
|
||||
if self.disk_for != self.installed {
|
||||
self.disk_for = self.installed.clone();
|
||||
let (tags, tx) = (self.installed.clone(), self.tx.clone());
|
||||
std::thread::spawn(move || {
|
||||
let disk = tags.into_iter().map(|t| {
|
||||
let n = backend::disk_use(&t);
|
||||
(t, n)
|
||||
});
|
||||
let _ = tx.send(Msg::DiskUse(disk.collect()));
|
||||
});
|
||||
}
|
||||
let on_disk = |tag: &String| {
|
||||
let found = self.disk.iter().find(|(t, _)| t == tag);
|
||||
found
|
||||
.filter(|_| self.installed.contains(tag))
|
||||
.map(|(_, n)| *n)
|
||||
};
|
||||
let used: u64 = self.installed.iter().filter_map(on_disk).sum();
|
||||
let page = div()
|
||||
.flex()
|
||||
.flex_col()
|
||||
.gap(px(32.))
|
||||
.child(header)
|
||||
.children((used > 0).then(|| {
|
||||
text(theme::UI).text_color(t.muted).child(trf(
|
||||
"Installed versions use {size}.",
|
||||
&[("size", &megabytes(used))],
|
||||
))
|
||||
}));
|
||||
let releases = match &self.releases {
|
||||
Load::Loading => return page.child(centered("Loading releases…", &t)),
|
||||
Load::Failed(e) => {
|
||||
@@ -3702,6 +3769,9 @@ impl Launcher {
|
||||
if let Some((_, size)) = release.asset {
|
||||
meta.push(megabytes(size));
|
||||
}
|
||||
if let Some(n) = on_disk(&tag) {
|
||||
meta.push(trf("{size} on disk", &[("size", &megabytes(n))]));
|
||||
}
|
||||
let summary = release
|
||||
.name
|
||||
.split_once(": ")
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,143 @@
|
||||
AgeableWaterCreature.handleAirSupply inline crates/horizon-client/src/mobs/ai.rs::base_tick the needs_water branch of base_tick; dolphins override it to nothing and refill air in aquatic.rs
|
||||
AgeableWaterCreature.checkSurfaceAgeableWaterCreatureSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::surface_water
|
||||
Animal.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt InLove is read; LoveCause is not kept
|
||||
Animal.canMate port crates/horizon-client/src/mobs/animal_brain.rs::can_mate_with brain breeding; the Breed goal in goals.rs does the same for goal-driven animals
|
||||
Animal.handleEntityEvent port crates/horizon-client/src/particles.rs::entity_event_burst event 18 love hearts
|
||||
Animal.getDismountLocationForPassenger port crates/horizon-client/src/game/mounts.rs::Game::dismount_mount gap: tries both sides by the mob's yaw, then on top; not DismountHelper's offsets and pose boxes
|
||||
Allay.createAttributes skip:data attributes come from entity-types.json
|
||||
Allay.createNavigation port crates/horizon-client/src/mobs/allay.rs::register flying navigation, required path length 48
|
||||
Allay.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta dancing and can_duplicate
|
||||
Allay.isLikedPlayer inline crates/horizon-client/src/mobs/ai.rs::accepts_damage a tame allay ignores damage from any player (not compared by UUID); considersEntityAsAlly is not ported
|
||||
Allay.setJukeboxPlaying inline crates/horizon-client/src/game/allays.rs::Game::tick_allays polls playing jukeboxes within 10 blocks every tick instead of listening for jukebox events; no remembered jukebox
|
||||
Allay.wantsToPickUp inline crates/horizon-client/src/game/allays.rs::Game::tick_allays same item within 32 blocks, mob_griefing on
|
||||
Allay.allayConsidersItemEqual inline crates/horizon-client/src/game/allays.rs::Game::tick_allays gap: compares item ids only, the held item keeps no potion contents
|
||||
Allay.hasNonMatchingPotion missing an allay holding a potion also fetches other potion types; the held item is only an id
|
||||
Allay.updateDynamicGameEventListener inline crates/horizon-client/src/game/allays.rs::Game::tick_allays jukebox is polled; there is no vibration listener
|
||||
Allay.setDancing inline crates/horizon-client/src/game/allays.rs::Game::tick_allays dancing set while a jukebox plays and not panicking
|
||||
Allay.shouldStopDancing inline crates/horizon-client/src/game/allays.rs::Game::tick_allays no jukebox within 10 blocks stops the dance
|
||||
Allay.isSpinning inline crates/horizon-client/src/mobs/allay.rs::animate dance clock modulo 55 below 15
|
||||
Allay.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt inventory, DuplicationCooldown and liked player; vibration listener data is not written
|
||||
Allay.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt
|
||||
Allay.updateDuplicationCooldown inline crates/horizon-client/src/mobs/allay.rs::ai_step egg_time counts down
|
||||
Allay.setDuplicationCooldown inline crates/horizon-client/src/game/allays.rs::Game::interact_allay 6000 set here; can_duplicate is derived from egg_time in mob_meta
|
||||
Allay.getLeashOffset missing lead hangs at the default offset (eye height), not 0.6 of it; leash::leash_offset only special-cases llamas
|
||||
Allay.handleEntityEvent port crates/horizon-client/src/particles.rs::entity_event_burst event 18, three hearts
|
||||
Allay.spawnHeartParticle port crates/horizon-client/src/particles.rs::around_self one heart's random placement
|
||||
Allay.VibrationUser.canReceiveVibration missing allays never listen for vibrations: a note block played near one is not remembered
|
||||
AllayAi.initCoreActivity inline crates/horizon-client/src/mobs/allay.rs::register panic goal; the cooldown countdowns are plain ints
|
||||
AllayAi.initIdleActivity inline crates/horizon-client/src/mobs/allay.rs::register fetch, deliver, stay close, stroll and look as goals instead of a brain
|
||||
AllayAi.hearNoteblock missing no liked note block: an allay never learns one, so items always go to the player
|
||||
AllayAi.getItemDepositPosition port crates/horizon-client/src/mobs/allay.rs::deposit
|
||||
AllayAi.shouldDepositItemsAtLikedNoteblock inline crates/horizon-client/src/mobs/allay.rs::deposit cooldown test only; the note block's existence and distance are not rechecked
|
||||
AllayAi.getLikedPlayerPositionTracker port crates/horizon-client/src/game/allays.rs::Game::allay_liked_player
|
||||
Armadillo.shouldSwitchToScaredState inline crates/horizon-client/src/mobs/armadillo.rs::ball_up_tick rolling past its animation length
|
||||
Armadillo.onSyncedDataUpdated port crates/horizon-client/src/mobs/armadillo.rs::set_state resets in_state_ticks on a state change
|
||||
Armadillo.checkArmadilloSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules
|
||||
Armadillo.brushOffScute port crates/horizon-client/src/game/creatures.rs::Game::interact_armadillo brush use; dispenser.rs dispense_brush does the same for a dispenser
|
||||
ArmadilloAi.initCoreActivity inline crates/horizon-client/src/mobs/armadillo.rs::register float and panic goals; rolling out is in server_ai_step
|
||||
ArmadilloAi.initIdleActivity inline crates/horizon-client/src/mobs/armadillo.rs::register gap: only look, stroll and random look; no AnimalMakeLove, FollowTemptation or BabyFollowAdult, so armadillos never seek a partner, follow food or have babies follow adults
|
||||
ArmadilloAi.initScaredActivity inline crates/horizon-client/src/mobs/armadillo.rs::server_ai_step the PANIC activity and ArmadilloBallUp
|
||||
Axolotl.<init> port crates/horizon-client/src/mobs/aquatic.rs::register the Axolotl arm: smooth swimming move and look control, amphibious navigation, water malus 0
|
||||
Axolotl.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta variant and playing_dead; from_bucket is not synced
|
||||
Axolotl.addAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt Variant is written; FromBucket is not
|
||||
Axolotl.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::read_variant Variant is read; FromBucket is not
|
||||
Axolotl.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize group variants and baby age
|
||||
Axolotl.tickBabyAnimations inline crates/horizon-client/src/mobs/axolotl.rs::Animation::tick the baby branch
|
||||
Axolotl.soloAnimation inline crates/horizon-client/src/mobs/axolotl.rs::Animation::tick one state started, the rest stopped
|
||||
Axolotl.tickAdultAnimations inline crates/horizon-client/src/mobs/axolotl.rs::Animation::tick the binary animators
|
||||
Axolotl.rehydrate missing a thrown water bottle does not refill an axolotl's air; splash water has no effect on mobs
|
||||
Axolotl.get port crates/horizon-client/src/entity_nbt.rs::bucket_components axolotl/variant component written to the bucket
|
||||
Axolotl.applyImplicitComponent port crates/horizon-client/src/entity_nbt.rs::load_bucket_data axolotl/variant read from the bucket
|
||||
Axolotl.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed gap: baby takes the first parent's colour; no random parent, no 1-in-1200 blue, not set persistent
|
||||
Axolotl.createAttributes skip:data attributes come from entity-types.json
|
||||
Axolotl.mobInteract port crates/horizon-client/src/game/creatures.rs::Game::interact_mob a water bucket scoops it up (bucketable)
|
||||
Axolotl.loadFromBucketTag port crates/horizon-client/src/entity_nbt.rs::load_bucket_data age, age lock and hunting cooldown
|
||||
Axolotl.applySupportingEffects inline crates/horizon-client/src/game/creatures.rs::Game::handle_mob_events the AxolotlSupportPlayer event: regeneration and no mining fatigue, host player only
|
||||
Axolotl.usePlayerItem missing feeding a tropical fish bucket uses up the whole bucket; vanilla hands back a water bucket
|
||||
Axolotl.Variant.getSpawnVariant port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize gap: the common pick for spawn groups only; the rare (blue) pick is never drawn
|
||||
AxolotlAi.initPlayDeadActivity port crates/horizon-client/src/mobs/animal_brain.rs::axolotl_package
|
||||
AxolotlAi.initFightActivity port crates/horizon-client/src/mobs/animal_brain.rs::axolotl_package
|
||||
AxolotlAi.initCoreActivity port crates/horizon-client/src/mobs/animal_brain.rs::axolotl_package
|
||||
AxolotlAi.initIdleActivity port crates/horizon-client/src/mobs/animal_brain.rs::axolotl_package
|
||||
AxolotlAi.canSetWalkTargetFromLookTarget port crates/horizon-client/src/mobs/animal_brain.rs::axolotl_action the WalkFromLook arm
|
||||
PlayDead.canStillUse inline crates/horizon-client/src/mobs/animal_brain.rs::B::tick_or_stop the PlayDead behaviour: in water and ticks present
|
||||
PlayDead.start inline crates/horizon-client/src/mobs/animal_brain.rs::B::try_start clears targets, regeneration for 200 ticks
|
||||
Bee.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta flags and anger end time
|
||||
Bee.registerGoals port crates/horizon-client/src/mobs/bee.rs::register
|
||||
Bee.spawnFluidParticle port crates/horizon-client/src/mobs/ambient.rs::client_particles the nectar drip
|
||||
Bee.updateRollAmount inline crates/horizon-client/src/mobs/bee.rs::tick
|
||||
Bee.isHiveNearFire port crates/horizon-client/src/mobs/bee.rs::hive_near_fire
|
||||
Bee.doesHiveHaveSpace inline crates/horizon-client/src/mobs/bee.rs::hives_with_space the beehive's full() filter
|
||||
Bee.getFlag port crates/horizon-client/src/mobs/bee.rs::flag
|
||||
Bee.createAttributes skip:data attributes come from entity-types.json
|
||||
Bee.createNavigation port crates/horizon-client/src/mobs/bee.rs::register flying navigation; stable_destination is the isStableDestination override
|
||||
Bee.isFlapping missing a flying bee gives off no flap vibration, so sculk sensors never hear it
|
||||
Bee.getLeashOffset missing lead hangs at the default offset, not half the eye height
|
||||
Bee.registerDebugValues skip:debug
|
||||
Bee.BaseBeeGoal.canContinueToUse port crates/horizon-client/src/mobs/bee.rs::calm not angry
|
||||
Bee.BeeBecomeAngryTargetGoal.canContinueToUse port crates/horizon-client/src/mobs/bee.rs::BecomeAngryTarget::can_continue
|
||||
Bee.BeeGoToHiveGoal.blacklistTarget inline crates/horizon-client/src/mobs/bee.rs::GoToHive::drop_and_blacklist keeps the last three
|
||||
Bee.BeeLocateHiveGoal.findNearbyHivesWithSpace port crates/horizon-client/src/mobs/bee.rs::hives_with_space
|
||||
Bee.BeePollinateGoal.canBeeContinueToUse port crates/horizon-client/src/mobs/bee.rs::Pollinate::can_continue
|
||||
Bee.BeePollinateGoal.setWantedPos port crates/horizon-client/src/mobs/bee.rs::Pollinate::set_wanted
|
||||
Bee.BeeWanderGoal.findPos inline crates/horizon-client/src/mobs/bee.rs::Wander::start
|
||||
Bee.BeeWanderGoal.getWanderThreshold inline crates/horizon-client/src/mobs/bee.rs::Wander::start always 24: it only applies with a valid hive
|
||||
Bee.ValidateHiveGoal.canBeeUse port crates/horizon-client/src/mobs/bee.rs::ValidateHive::can_use
|
||||
Camel.addAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt LastPoseTick is written as -1 or 0, not the real tick
|
||||
Camel.readAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_from_nbt sitting is read from the sign of LastPoseTick
|
||||
Camel.createAttributes skip:data attributes come from entity-types.json
|
||||
Camel.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta dash and last pose change tick
|
||||
Camel.checkCamelSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules
|
||||
Camel.getDefaultDimensions missing a sitting camel keeps its standing hitbox; Mob::dims has no sitting size
|
||||
Camel.updateWalkAnimation missing legs use the default walk animation: no zero while sitting or dashing, 0.4 smoothing, no x3 for babies
|
||||
Camel.travel inline crates/horizon-client/src/mobs/camel.rs::ai_step refuse_to_move zeroes horizontal motion and input
|
||||
Camel.getRiddenSpeed inline crates/horizon-client/src/mobs/equine.rs::ridden_step 0.1 sprint bonus when the dash is ready
|
||||
Camel.getRiddenRotation missing a ridden camel that is sitting or changing pose still turns with the rider's view; vanilla holds its rotation
|
||||
Camel.onPlayerJump inline crates/horizon-client/src/mobs/camel.rs::dash the cooldown, ground and refuse_to_move gates
|
||||
Camel.handleStartJump port crates/horizon-client/src/mobs/camel.rs::dash dash sound and dashing flag; no entity_action game event
|
||||
Camel.mobInteract port crates/horizon-client/src/game/mounts.rs::Game::interact_mount inventory on sneak, feeding, riding
|
||||
Camel.onElasticLeashPull missing a leashed sitting camel does not stand up when the lead pulls
|
||||
Camel.canMate port crates/horizon-client/src/mobs/goals.rs::Breed::can_use gap: no canParent checks for camels (full health, not ridden)
|
||||
Camel.getBodyAnchorAnimationYOffset port crates/horizon-client/src/game/mounts.rs::Game::position_rider gap: sitting or standing height only, no sit/stand transition interpolation
|
||||
Camel.getLeashOffset missing lead hangs at the default offset, not at the camel's body anchor
|
||||
Camel.isCamelSitting port crates/horizon-client/src/mobs/camel.rs::sitting
|
||||
Camel.isCamelVisuallySitting inline crates/horizon-client/src/mobs/camel.rs::animation_states
|
||||
Camel.isInPoseTransition port crates/horizon-client/src/mobs/camel.rs::in_transition
|
||||
Camel.isVisuallySittingDown inline crates/horizon-client/src/mobs/camel.rs::animation_states
|
||||
Camel.getEquipSound port crates/horizon-client/src/game/dispenser.rs::equip_sound gap: saddling by hand in interact_mount plays the horse sound for camels
|
||||
CamelAi.initCoreActivity inline crates/horizon-client/src/mobs/camel.rs::register float and CamelPanic goals
|
||||
CamelAi.initIdleActivity inline crates/horizon-client/src/mobs/camel.rs::register breed, tempt, follow parent, stroll, random sitting, look
|
||||
CamelAi.CamelPanic.checkExtraStartConditions port crates/horizon-client/src/mobs/camel.rs::CamelPanic::can_use
|
||||
CamelAi.RandomSitting.checkExtraStartConditions port crates/horizon-client/src/mobs/camel.rs::RandomSitting::can_use gap: no leash or suffocation (canCamelChangePose) check
|
||||
Chicken.registerGoals port crates/horizon-client/src/mobs/farm.rs::register
|
||||
Chicken.getSoundSet inline crates/horizon-client/src/mobs/ai.rs::voice_sounds gap: baby sets only; the picky sound variant is stored but never used
|
||||
Chicken.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed gap: baby copies the first parent's variant, no random parent
|
||||
Chicken.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize variant by biome and a random sound variant
|
||||
Chicken.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: variant is synced, sound variant is not
|
||||
Chicken.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt EggLayTime, variant, sound_variant; jockey in riders.rs
|
||||
Chicken.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt
|
||||
Chicken.get port crates/horizon-client/src/mobs/finalize.rs::variant_component gap: chicken/variant only, no chicken/sound_variant
|
||||
Chicken.applyImplicitComponents missing variant components on a spawn egg or item are ignored; the mob gets its biome variant
|
||||
Chicken.applyImplicitComponent missing see applyImplicitComponents
|
||||
Chicken.positionRider inline crates/horizon-client/src/game/passengers.rs::Game::position_riders every mob rider copies its vehicle's body yaw, not only chicken riders
|
||||
ChickenVariants skip:data chicken variants come from the registry data files
|
||||
AbstractCow.registerGoals port crates/horizon-client/src/mobs/farm.rs::register
|
||||
AbstractCow.mobInteract port crates/horizon-client/src/game/creatures.rs::Game::interact_mob the Cow/Mooshroom bucket arm gives milk
|
||||
Cow.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: variant is synced, sound variant is not
|
||||
Cow.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt
|
||||
Cow.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt
|
||||
Cow.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed gap: baby copies the first parent's variant, no random parent
|
||||
Cow.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize variant by biome and a random sound variant
|
||||
CowVariants skip:data cow variants come from the registry data files
|
||||
MushroomCow.getWalkTargetValue port crates/horizon-client/src/mobs/spawn_selection.rs::mob_spawn_rules gap: only the spawn check has the mycelium rule; ai.rs walk_target_value uses the grass rule for strolling
|
||||
MushroomCow.checkMushroomSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules
|
||||
MushroomCow.thunderHit port crates/horizon-client/src/game/lightning.rs::Game::thunder_hit swaps colour once per bolt, convert sound
|
||||
MushroomCow.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta the type entry
|
||||
MushroomCow.mobInteract port crates/horizon-client/src/game/creatures.rs::Game::interact_mob gap: bowl stew and shearing are done; feeding a flower to a brown mooshroom (suspicious stew) is missing
|
||||
MushroomCow.addAdditionalSaveData missing Type and stew_effects are not written from the live mob: a colour change (lightning) is not saved
|
||||
MushroomCow.readAdditionalSaveData missing Type is not read: a saved brown mooshroom loads red
|
||||
MushroomCow.getEffectsFromItemStack missing no suspicious stew effects from flowers: a brown mooshroom never takes a flower
|
||||
MushroomCow.get missing mooshroom/variant component is not reported; species_variant_component has no mooshroom
|
||||
MushroomCow.applyImplicitComponent missing mooshroom/variant component on a spawn egg is ignored
|
||||
MushroomCow.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed see getOffspringVariant
|
||||
MushroomCow.getOffspringVariant missing baby copies the first parent's colour: no 50/50 mix, no 1-in-1024 chance of the other colour
|
||||
|
@@ -0,0 +1,220 @@
|
||||
GlowSquid.aiStep missing player: glow squids shed no glow particles and their dark timer is not kept, so a hit squid does not dim
|
||||
GlowSquid.checkGlowSquidSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::GlowSquid arm: 33 blocks below sea level, dark, in water
|
||||
GlowSquid.hurtServer missing player: a glow squid hit does not get the 100-tick dark timer, so it does not dim
|
||||
WolfSoundVariants skip:data registry bootstrap of the wolf sound sets; sounds are in species.rs and finalize.rs
|
||||
AbstractDragonPhaseInstance.getTurnSpeed inline crates/horizon-client/src/game/dragon.rs::Game::tick_dragon 0.7 / dist / rot turn for every phase but Landing; only applied while a fly target is set
|
||||
DragonChargePlayerPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Charging arm: 10-tick countdown once close; gap: minor: no collision re-target
|
||||
DragonDeathPhase.doClientTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_dragon_death gap: player: the phase's explosion puff every 10 ticks through the whole dying flight is missing; only the tickDeath bursts at 180 to 200 are drawn
|
||||
DragonDeathPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Dying arm sets health 1 or 0; gap: minor: egg found with the leaves-excluded heightmap, vanilla uses MOTION_BLOCKING
|
||||
DragonHoldingPatternPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Holding arm; gap: minor: horizontal and vertical collision re-target not tracked (always false)
|
||||
DragonHoldingPatternPhase.findNewTarget inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Holding arm: landing roll, strafe pick by egg distance, ring path
|
||||
DragonHoldingPatternPhase.navigateToNextPathNode port crates/horizon-client/src/game/dragon.rs::Game::next_target
|
||||
DragonHoldingPatternPhase.onCrystalDestroyed inline crates/horizon-client/src/game/dragon.rs::Game::destroy_crystal sets strafe_request for the killer or the nearest; tick_phase strafes from Holding only
|
||||
DragonHoldingPatternPhase.strafePlayer inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase phase switch to Strafe and setTarget (strafe_begin) in the Holding arm and the strafe_request block
|
||||
DragonLandingApproachPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase LandingApproach arm; gap: minor: no collision re-target
|
||||
DragonLandingApproachPhase.findNewTarget inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase LandingApproach arm: path to the node by the nearest enemy to the egg, last node is the podium
|
||||
DragonLandingApproachPhase.navigateToNextPathNode port crates/horizon-client/src/game/dragon.rs::Game::next_target
|
||||
DragonLandingPhase.doClientTick missing player: while the dragon comes down to land its head breathes a fan of dragon-breath particles; none are spawned
|
||||
DragonLandingPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Landing arm: sets flame count 0 and goes to Scanning on reaching the podium
|
||||
DragonLandingPhase.getTurnSpeed inline crates/horizon-client/src/game/dragon.rs::Game::tick_dragon Landing turn min(rot,40)/rot, the one turn formula that differs from the default
|
||||
DragonSittingAttackingPhase.doClientTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase gap: player: the growl is played once at the start of the 40 ticks; vanilla replays it on every client tick
|
||||
DragonSittingAttackingPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Attacking arm: 40 ticks then Flaming
|
||||
DragonSittingFlamingPhase.doClientTick missing player: during the first 10 ticks of a flame attack the head breathes dragon-breath particles in a fan; none are spawned
|
||||
DragonSittingFlamingPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Flaming arm: the flame cloud at tick 10, 200 ticks, flame count 4 leads to Takeoff
|
||||
DragonSittingScanningPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Scanning arm; gap: minor: turns every tick, vanilla skips the turn while the target is within 10 degrees of the facing
|
||||
DragonTakeoffPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Takeoff arm: first tick finds a new target, later ticks go to Holding once 10 blocks from the podium
|
||||
DragonTakeoffPhase.findNewTarget inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Takeoff arm; gap: minor: no path leaves an empty path, vanilla leaves none and searches again next tick
|
||||
DragonTakeoffPhase.navigateToNextPathNode port crates/horizon-client/src/game/dragon.rs::Game::next_target
|
||||
EnderDragonPhase.create skip:data phase registry; the ids are fixed in Phase::id
|
||||
EnderDragonPhase.createInstance port crates/horizon-client/src/game/dragon.rs::Phase::from_id builds the default instance for an id
|
||||
EnderDragonPhase.getById port crates/horizon-client/src/game/dragon.rs::Phase::from_id id to phase, unknown ids fall back to Holding
|
||||
Mannequin.addAdditionalSaveData missing player: a saved mannequin is written without its profile, so after a reload it wears the default skin
|
||||
Mannequin.applyImplicitComponent missing minor: the profile from a spawning item is not applied; Horizon has no mannequin item, only summon with a profile tag
|
||||
Mannequin.defineSynchedData inline crates/horizon-client/src/game/remote_mob_data.rs::apply gap: player: reads the profile (slot 17) only; DATA_IMMOVABLE and DATA_DESCRIPTION are not read
|
||||
Mannequin.get skip:other data-component getter for the PROFILE component; the profile is Mob.profile, read directly
|
||||
Mannequin.readAdditionalSaveData missing player: the profile is not read back, so a reloaded mannequin wears the default skin
|
||||
Mannequin.updateDescription missing player: the mannequin's description (default 'Mannequin') is never drawn under its name
|
||||
Giant.createAttributes skip:data attributes come from entity-types.json
|
||||
ShootWhenStuck.checkExtraStartConditions inline crates/horizon-client/src/mobs/breeze.rs::register
|
||||
Evoker.createAttributes skip:data attributes come from entity-types.json
|
||||
Evoker.registerGoals port crates/horizon-client/src/mobs/illager.rs::register_evoker
|
||||
Evoker.EvokerCastingSpellGoal.tick port crates/horizon-client/src/mobs/illager.rs::CastingSpell::tick looks at the target, else the wololo sheep
|
||||
Pillager.applyRaidBuffs port crates/horizon-client/src/game/mob_gear.rs::Game::apply_raid_buffs
|
||||
Pillager.createAttributes skip:data attributes come from entity-types.json
|
||||
Pillager.finalizeSpawn inline crates/horizon-client/src/mobs/finalize.rs::Ctx::mob crossbow in the main hand via populate; the enchant roll is in Ctx::enchant
|
||||
Pillager.getArmPose port crates/horizon-client/src/mobs/illager.rs::arm_pose
|
||||
Pillager.getSlot missing minor: the pillager's five spare slots (ids 300 and up, used by /item) are not modelled
|
||||
Pillager.pickUpItem missing player: during a raid a pillager does not pick up a white banner lying on the ground
|
||||
Pillager.registerGoals port crates/horizon-client/src/mobs/illager.rs::register_pillager
|
||||
Pillager.wantsItem missing player: the raid banner pickup check is missing (see pickUpItem)
|
||||
PiglinBrute.createAttributes skip:data attributes come from entity-types.json
|
||||
PiglinBrute.customServerAiStep inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: the brain tick is replaced by the goals set in register_brute; the activity update is in PiglinBruteAi rows
|
||||
PiglinBrute.finalizeSpawn inline crates/horizon-client/src/mobs/finalize.rs::Ctx::mob golden axe in the main hand via populate; initMemories is missing
|
||||
PiglinBrute.hurtServer inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: retaliation is the HurtByTarget goal; no PiglinAi.maybeRetaliate for non-piglin attackers
|
||||
PiglinBrute.wantsToPickUp missing player: a piglin brute does not pick up a golden axe lying on the ground; piglin_pickups only serves piglins
|
||||
PiglinBruteAi.createIdleLookBehaviors inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: looks at players only (LookAtPlayer); no look at piglins, random look or do-nothing pause
|
||||
PiglinBruteAi.createIdleMovementBehaviors inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: strolls anywhere; no visits to piglins and no return to its home point
|
||||
PiglinBruteAi.findNearestValidAttackTarget inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: targets nearest player or wither skeleton through the target goals; no anger memory first
|
||||
PiglinBruteAi.initCoreActivity inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: no door opening and no stop-anger-when-target-dead rule; panic-free float only
|
||||
PiglinBruteAi.initFightActivity inline crates/horizon-client/src/mobs/piglin.rs::register_brute melee goal at priority 2; attacks as the MeleeAttack goal does
|
||||
PiglinBruteAi.initIdleActivity inline crates/horizon-client/src/mobs/piglin.rs::register_brute idle behaviour as goals: stroll, look at player, targets
|
||||
PiglinBruteAi.initMemories missing minor: no home point is remembered, so the brute never returns to where it spawned
|
||||
PiglinBruteAi.isNearestValidAttackTarget missing minor: the brute never drops a target for a nearer one; target goals keep theirs until it dies or is lost
|
||||
PiglinBruteAi.maybePlayActivitySound missing player: a piglin brute never growls while it fights; the angry sound is not in Horizon
|
||||
PiglinBruteAi.playActivitySound missing player: no angry sound when a piglin brute starts a fight (entity.piglin_brute.angry is not played)
|
||||
PiglinBruteAi.setAngerTarget missing minor: no 600-tick anger memory; the target goals keep the target instead
|
||||
PiglinBruteAi.updateActivity inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: no fight and idle activity switch; the melee goal sets the aggressive flag
|
||||
StartAdmiringItemIfSeen.create inline crates/horizon-client/src/game/piglins.rs::Game::piglin_pickups gap: player: a piglin takes a wanted item and admires it in hand; it does not stop to admire one it only sees on the ground
|
||||
StopAdmiringIfItemTooFarAway.create missing minor: no admire-on-the-ground phase, so no stop when the wanted item moves away
|
||||
StopAdmiringIfTiredOfTryingToReachItem.create missing minor: no time limit on walking to an admired item; the piglin walks to the item as GoToWantedItem does
|
||||
Parched.getArrow inline crates/horizon-client/src/mobs/undead.rs::perform_ranged_attack Parched arrows carry weakness for 600 ticks
|
||||
Stray.checkStraySpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::Stray arm: powder snow skipped, sky must be visible
|
||||
Stray.getArrow inline crates/horizon-client/src/mobs/undead.rs::perform_ranged_attack Stray arrows carry slowness for 600 ticks
|
||||
CaveSpider.getVehicleAttachmentPoint port crates/horizon-client/src/mobs/riders.rs::vehicle_attachment gap: minor: rides at 0 height; vanilla uses 0.21875 when the vehicle is not wider
|
||||
VillagerDataHolder.finalizeVillagerType inline crates/horizon-client/src/mobs/finalize.rs::Ctx::villager_type
|
||||
Abilities.apply port crates/horizon-client/src/game/remote.rs::Game::apply_remote_abilities gap: minor: invulnerable, flying, may fly and flying speed only; instabuild, may build and walk speed are not applied
|
||||
Abilities.pack skip:java record copy for the abilities packet; the flags are read in remote.rs
|
||||
PlayerSkin.with missing minor: skin patches (body, cape, elytra and model overrides) are not applied on top of a profile skin
|
||||
PlayerSkin.Patch.create skip:java record factory for the patch; the patch itself is missing (see PlayerSkin.with)
|
||||
SpectralArrow.doPostHurtEffects missing player: a spectral arrow shot from a bow or crossbow does not make its target glow; release_bow and crossbow use no effect
|
||||
SpectralArrow.tick missing player: a spectral arrow in flight leaves no yellow effect trail
|
||||
Fireball.getSlot missing minor: the fireball's item slot (its displayed fire charge) is not modelled
|
||||
Fireball.readAdditionalSaveData missing unsure: fireball_from_nbt reads no Item key, so the displayed item is not restored
|
||||
Fireball.setItem missing minor: the displayed item of a fireball is not set
|
||||
Fireball.shouldRenderAtSqrDistance skip:ui render distance rule for the first two ticks; Horizon draws the projectile as its own pass
|
||||
LargeFireball.onHit port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit LargeFireball arm: explosion of the given power, then the projectile is gone
|
||||
LargeFireball.onHitEntity port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit LargeFireball arm: 6 damage to the entity
|
||||
SmallFireball.onHitEntity port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit SmallFireball arm: ignites for 5 seconds and deals 5 damage
|
||||
AbstractThrownPotion.affectEntitiesAround missing player: a splash water potion does not hurt water-sensitive mobs or put out burning entities nearby
|
||||
AbstractThrownPotion.calculateHorizontalHurtKnockbackDirection missing minor: the splash hurt pushes nothing away from the potion's position
|
||||
AbstractThrownPotion.douseFire missing player: a splash water potion does not put out fire blocks, candles or campfires around where it lands
|
||||
AbstractThrownPotion.onHitBlock missing player: a water splash that lands on a block does not douse fire, candles or campfires next to it
|
||||
Snowball.getParticle port crates/horizon-client/src/game/creatures.rs::Game::item_burst snowball item burst on break
|
||||
Snowball.handleEntityEvent port crates/horizon-client/src/game/creatures.rs::Game::thrown_break_event break event 3 for thrown items
|
||||
Snowball.onHit inline crates/horizon-client/src/game/creatures.rs::Game::projectile_hit Snowball arm: 3 damage to blazes, then the break burst
|
||||
ThrowableItemProjectile.readAdditionalSaveData missing minor: the thrown item is not read back from the save
|
||||
Activity.equals skip:java value equality of a named activity; no Horizon counterpart needed
|
||||
ModelAndTexture.codec skip:data codec for the variant model and texture asset; Horizon reads variant data from files
|
||||
MoonBrightnessCheck.test inline crates/horizon-client/src/mobs/finalize.rs::VariantRegistry::select Condition::Moon arm: moon brightness of the phase against the range
|
||||
PriorityProvider.select port crates/horizon-client/src/mobs/finalize.rs::VariantRegistry::select highest priority entries whose conditions hold, one picked at random
|
||||
SpawnConditions.bootstrap skip:data registry bootstrap of spawn condition codecs; Horizon reads variant conditions from files
|
||||
SpawnContext.create inline crates/horizon-client/src/mobs/finalize.rs::VariantRegistry::select the level and position passed to select; no separate context object
|
||||
variant/StructureCheck.test inline crates/horizon-client/src/mobs/finalize.rs::VariantRegistry::select Condition::Structure arm: structures with a piece at the position
|
||||
AbstractMinecartContainer.applyNaturalSlowdown inline crates/horizon-client/src/game/minecarts.rs::Game::natural_slowdown gap: minor: plain cart friction 0.96; the container's 0.98 plus 0.001 per empty redstone level is missing
|
||||
AbstractMinecartContainer.createMenu inline crates/horizon-client/src/game/minecarts.rs::Game::interact_cart gap: minor: opens the chest for anyone; no refusal of a loot-table cart for spectators
|
||||
AbstractMinecartContainer.remove inline crates/horizon-client/src/game/minecarts.rs::Game::hurt_cart contents spill when the cart breaks, if entity_drops is on
|
||||
MinecartChest.interact inline crates/horizon-client/src/game/minecarts.rs::Game::interact_cart chest arm: opens the cart's items and plays the chest sound
|
||||
MinecartCommandBlock.activateMinecart inline crates/horizon-client/src/game/minecarts.rs::Game::activate_cart gap: minor: no command ever runs; the cart holds no command since its editor is missing
|
||||
MinecartCommandBlock.defineSynchedData missing minor: the command text and last output are not synced; no command cart holds a command
|
||||
MinecartCommandBlock.interact missing player: a creative player right-clicking a command minecart gets no command editor; vanilla opens it
|
||||
MinecartCommandBlock.onSyncedDataUpdated missing minor: no synced command text to load into the cart
|
||||
MinecartCommandBlock.readAdditionalSaveData inline crates/horizon-client/src/game/minecarts.rs::Minecart::from_nbt gap: minor: the saved Command text is not read
|
||||
MinecartCommandBlock.MinecartCommandBase.createCommandSourceStack missing minor: no command runs from a cart, so no source stack is built
|
||||
MinecartCommandBlock.MinecartCommandBase.onUpdated missing minor: no command text changes to push to the cart
|
||||
MinecartFurnace.addAdditionalSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::to_nbt
|
||||
MinecartFurnace.addFuel inline crates/horizon-client/src/game/minecarts.rs::Game::interact_cart furnace arm: coal or charcoal adds 3600 ticks of fuel up to 32000
|
||||
MinecartFurnace.applyNaturalSlowdown port crates/horizon-client/src/game/minecarts.rs::Game::natural_slowdown
|
||||
MinecartFurnace.calculateNewPushAlong inline crates/horizon-client/src/game/minecarts.rs::Game::natural_slowdown the push projected on the velocity, inside natural_slowdown
|
||||
MinecartFurnace.getDefaultDisplayBlockState port crates/horizon-client/src/game/minecarts.rs::Game::display_state lit furnace while it has fuel
|
||||
MinecartFurnace.getMaxSpeed port crates/horizon-client/src/game/minecarts.rs::Game::max_speed half speed on land, three quarters of 0.2 in water
|
||||
MinecartFurnace.interact inline crates/horizon-client/src/game/minecarts.rs::Game::interact_cart furnace arm
|
||||
MinecartFurnace.readAdditionalSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::from_nbt
|
||||
MinecartFurnace.tick inline crates/horizon-client/src/game/minecarts.rs::Game::tick_cart furnace variant: fuel counts down, push clears at zero, smoke puffs
|
||||
MinecartSpawner missing player: spawner minecarts do not exist in Horizon: no cart kind, so a spawner minecart item does nothing on a rail
|
||||
NewMinecartBehavior skip:other experimental minecart_improvements physics; Horizon always runs the old behaviour in minecarts.rs and writes that pack disabled in save.rs
|
||||
NewMinecartBehavior.TrackIteration skip:other part of the experimental minecart_improvements physics; see NewMinecartBehavior
|
||||
FeatureFlagRegistry skip:data name table of the feature packs (functions.rs FEATURE_PACKS); codecs are not needed
|
||||
FeatureFlagRegistry.Builder skip:java builder for the flag registry
|
||||
FeatureFlagSet skip:java bit set of feature flags; Horizon only tracks the built-in packs by name
|
||||
FeatureFlags skip:server message text for the server's pack feature check
|
||||
AbstractCraftingMenu.addCraftingGridSlots skip:ui slot positions of the crafting grid; menu.rs keeps the vanilla slot indices
|
||||
AbstractCraftingMenu.addResultSlot skip:ui result slot position; menu.rs keeps the vanilla slot index
|
||||
AbstractCraftingMenu.handlePlacement port crates/horizon-client/src/menu/place.rs::Menu::place_recipe recipe placement from the book
|
||||
ChestMenu.addChestGrid skip:ui slot grid layout of the chest screen, drawn by storage.rs
|
||||
ChestMenu.quickMoveStack port crates/horizon-client/src/game/storage.rs::Game::container_quick_move
|
||||
ChestMenu.sixRows skip:ui constructor shorthand for the six-row chest layout
|
||||
ChestMenu.threeRows skip:ui constructor shorthand for the three-row chest layout
|
||||
ContainerLevelAccess.execute skip:java level access wrapper for menus; Horizon's menus hold the game state directly
|
||||
DataSlot.checkAndClearUpdateFlag skip:java dirty flag for data slot syncing; Horizon sends menu data as it changes
|
||||
FurnaceFuelSlot.mayPlace inline crates/horizon-client/src/menu.rs::Menu::may_place fuel slot: only items that burn (is_fuel)
|
||||
ItemCombinerMenuSlotDefinition.Builder.build skip:java builder for anvil and smithing slot definitions
|
||||
ItemCombinerMenuSlotDefinition.Builder.withResultSlot skip:java builder for anvil and smithing slot definitions
|
||||
ItemCombinerMenuSlotDefinition.Builder.withSlot skip:java builder for anvil and smithing slot definitions
|
||||
PlayerEnderChestContainer.fromSlots skip:java builds the ender chest from saved slots; Horizon keeps ender_items
|
||||
PlayerEnderChestContainer.startOpen port crates/horizon-client/src/game/storage.rs::Game::open_ender_chest
|
||||
PlayerEnderChestContainer.stillValid inline crates/horizon-client/src/game/storage.rs::Game::tick_container_reach closes the chest when the player walks away
|
||||
PlayerEnderChestContainer.stopOpen port crates/horizon-client/src/game/storage.rs::Game::close_ender_chest
|
||||
PlayerEnderChestContainer.storeAsSlots skip:java saves the ender chest as slots; Horizon writes ender_items
|
||||
RecipeCraftingHolder.setRecipeUsed missing minor: the last recipe used by a crafting block is not remembered
|
||||
RemoteSlot.Synchronized.matches skip:java compares a slot with its last synced copy; Horizon sends the slot when it changes
|
||||
ResultContainer.isEmpty port crates/horizon-client/src/menu.rs::Menu::has_item the result slot is empty when it has no item
|
||||
ShulkerBoxMenu.quickMoveStack port crates/horizon-client/src/game/storage.rs::Game::container_quick_move
|
||||
TransientCraftingContainer.fillStackedContents port crates/horizon-client/src/menu/place.rs::Menu::stacked_contents
|
||||
TransientCraftingContainer.getItem skip:java slot read of a menu-owned grid; Horizon reads menu slots directly
|
||||
TransientCraftingContainer.isEmpty skip:java emptiness of a menu-owned grid; Horizon reads menu slots directly
|
||||
TransientCraftingContainer.removeItem skip:java slot removal of a menu-owned grid; Horizon takes from menu slots directly
|
||||
TransientCraftingContainer.setItem skip:java slot write of a menu-owned grid; Horizon writes menu slots directly
|
||||
AdventureModePredicate missing unsure: no can_place_on or can_break list check found in the client
|
||||
ArrayItemProvider.findNext inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ArrayItemProvider.next inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ArrayItemProvider.peek inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ArrayItemProvider.setPosition inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ArrayItemProvider.Cycled.computeNextItem inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ArrayItemProvider.Cycled.findNext inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
BottleItem.use port crates/horizon-client/src/game/potions.rs::Game::use_potion_item glass bottle arm
|
||||
CreativeModeTab.buildContents port crates/horizon-client/src/creative.rs::Creative::items
|
||||
CreativeModeTab.getIconItem inline crates/horizon-client/src/creative.rs::Creative::tab_headers tab header carries the icon
|
||||
CreativeModeTab.shouldDisplay inline crates/horizon-client/src/creative.rs::Creative::tab_headers tabs listed from the data file
|
||||
CreativeModeTab.Builder.build skip:java builder for tab properties
|
||||
CreativeModeTab.ItemDisplayBuilder.accept skip:data tab contents are read from the creative data file
|
||||
CreativeModeTab.ItemDisplayParameters.needsUpdate skip:java cache check for tab contents
|
||||
CreativeModeTab.Output.accept skip:data tab contents are read from the creative data file
|
||||
CreativeModeTab.Output.acceptAll skip:data tab contents are read from the creative data file
|
||||
CreativeModeTabs.buildAllTabContents port crates/horizon-client/src/creative.rs::Creative::from_json tabs and their items built from the data
|
||||
CreativeModeTabs.copperBlockFamilies skip:data copper family list is in the data file
|
||||
CreativeModeTabs.generateEnchantmentBookTypesAllLevels skip:data creative contents come from the data file
|
||||
CreativeModeTabs.generateEnchantmentBookTypesOnlyMaxLevel skip:data creative contents come from the data file
|
||||
CreativeModeTabs.generateFireworksAllDurations skip:data creative contents come from the data file
|
||||
CreativeModeTabs.generateInstrumentTypes skip:data creative contents come from the data file
|
||||
CreativeModeTabs.generateOminousBottles skip:data creative contents come from the data file
|
||||
CreativeModeTabs.generatePotionEffectTypes skip:data creative contents come from the data file
|
||||
CreativeModeTabs.generatePresetPaintings skip:data creative contents come from the data file
|
||||
CreativeModeTabs.generateSuspiciousStews skip:data creative contents come from the data file
|
||||
CreativeModeTabs.registerColoredItems skip:data creative contents come from the data file
|
||||
CreativeModeTabs.tryRebuildTabContents port crates/horizon-client/src/creative.rs::Creative::items contents rebuilt on demand
|
||||
DebugStickItem missing player: the debug stick does nothing in creative; no block state cycling or marker
|
||||
DoubleHighBlockItem.placeBlock missing unsure: no code found that places the upper half of a tall block
|
||||
DyeItem.interactLivingEntity missing unsure: no dye use on mobs (sheep, collars) found in the client
|
||||
DyeItem.tryApplyToSign inline crates/horizon-client/src/game/sign_edit.rs::Game::use_sign_applicator dye colours the sign text
|
||||
EggItem.asProjectile port crates/horizon-client/src/game/creatures.rs::Game::throw_item egg kinds in throw_item
|
||||
EggItem.use inline crates/horizon-client/src/game/creatures.rs::Game::throw_item egg throw
|
||||
EnderpearlItem.use inline crates/horizon-client/src/game/creatures.rs::Game::throw_item ender pearl throw
|
||||
ExperienceBottleItem.asProjectile port crates/horizon-client/src/game/potions.rs::Game::thrown_kind thrown bottle entity type
|
||||
ExperienceBottleItem.createDispenseConfig port crates/horizon-client/src/game/dispenser.rs::Game::dispense_projectile dispensed bottle flight
|
||||
ExperienceBottleItem.use inline crates/horizon-client/src/game/potions.rs::Game::use_potion_item thrown bottle path
|
||||
FireChargeItem.asProjectile port crates/horizon-client/src/game/dispenser.rs::Game::shoot_projectile_item fire charge becomes a small fireball
|
||||
FireChargeItem.createDispenseConfig port crates/horizon-client/src/game/dispenser.rs::Game::dispense_projectile dispensed fire charge flight
|
||||
FireChargeItem.useOn missing unsure: no fire charge use on blocks found in the client
|
||||
GameMasterBlockItem.getPlacementState port crates/horizon-client/src/game/block_items.rs::Game::apply_item_block_state default state for the placed block
|
||||
GlowInkSacItem.tryApplyToSign inline crates/horizon-client/src/game/sign_edit.rs::Game::use_sign_applicator glow ink on a sign
|
||||
HangingSignItem.canPlace missing unsure: no hanging sign placement check found
|
||||
InkSacItem.tryApplyToSign inline crates/horizon-client/src/game/sign_edit.rs::Game::use_sign_applicator ink on a sign
|
||||
InstrumentItem.create skip:java builds the horn stack
|
||||
InstrumentItem.getInstrument skip:data instrument read from the item data
|
||||
InstrumentItem.getUseDuration port crates/horizon-client/src/game/item_draw.rs::use_duration goat horn use duration 72000
|
||||
InstrumentItem.play missing player: using a goat horn plays no sound; Horizon has no horn playback
|
||||
InstrumentItem.use missing player: using a goat horn plays no sound and does not start the horn cooldown
|
||||
Instruments.bootstrap skip:data registry bootstrap of the instrument list
|
||||
Instruments.register skip:data registry bootstrap of the instrument list
|
||||
ItemFrameItem.mayPlace port crates/horizon-client/src/game/frames.rs::Game::place_item_frame
|
||||
ItemProvider.cycle inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot shows its items in turn
|
||||
ItemProvider.of inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ItemProvider.FallbackItemProvider.findNext inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ItemProvider.FallbackItemProvider.next inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
ItemProvider.FallbackItemProvider.peek inline crates/horizon-client/src/game/recipe_book.rs::Game::draw_ghost ghost slot item list
|
||||
JukeboxSongs skip:data registry of jukebox songs; song data is read from files
|
||||
KnowledgeBookItem.use missing minor: using a knowledge book (recipe unlock) does nothing in Horizon
|
||||
LingeringPotionItem.createPotion port crates/horizon-client/src/game/potions.rs::thrown_kind lingering entity type
|
||||
LingeringPotionItem.use inline crates/horizon-client/src/game/potions.rs::Game::use_potion_item lingering potion throw
|
||||
NameTagItem.interactLivingEntity missing unsure: name tag use on a mob is only forwarded on remote games (remote_mob_use.rs); no local rename found
|
||||
PlaceOnWaterBlockItem.use inline crates/horizon-client/src/game/block_items.rs::Game::apply_placed_item placed by generic block placement; the water rule is not checked here
|
||||
|
@@ -0,0 +1,158 @@
|
||||
PlayerHeadItem.getName missing minor: a head whose profile has a name should read "<name>'s Head"; Horizon shows the plain item name
|
||||
ShearsItem.createToolProperties skip:data tool rules (cobweb speed, shears breaking-speed tags) come from item data; items.rs reads minecraft:tool
|
||||
ShearsItem.mineBlock port crates/horizon-client/src/game.rs::Game::mine_block_with_held shears wear one damage_per_block on any block but fire
|
||||
ShearsItem.useOn missing unsure: SHEARS_TRIM is a NeoForge ability that no block in the pinned sources registers; pumpkin carving is a separate path (game/pumpkin.rs)
|
||||
SnowballItem.asProjectile port crates/horizon-client/src/game/dispenser.rs::Game::shoot_projectile_item a dispensed snowball or egg is shot with the dispenser's own config
|
||||
SnowballItem.use port crates/horizon-client/src/game/creatures.rs::Game::throw_item throw at 1.5 power, throw sound, use cooldown, one consumed
|
||||
SplashPotionItem.createPotion port crates/horizon-client/src/game/potions.rs::Game::launch_thrown the thrown splash potion entity is launched with the stack
|
||||
SplashPotionItem.use port crates/horizon-client/src/game/potions.rs::Game::use_potion_item splash throw sound, throw at -20 degrees, one consumed
|
||||
ThrowablePotionItem.createDispenseConfig port crates/horizon-client/src/game/dispenser.rs::Game::dispense_projectile splash, lingering and XP bottle: uncertainty 3.0 and power 1.375
|
||||
ThrowablePotionItem.use port crates/horizon-client/src/game/potions.rs::Game::use_potion_item throw at -20 degrees, one consumed
|
||||
StandingAndWallBlockItem.getPlacementState port crates/horizon-world/src/level/place.rs::Sim::placement standing or wall state by nearest looking direction, with survival and unobstructed checks
|
||||
StandingAndWallBlockItem.registerBlocks skip:data wall block to item bindings come from the generated item table (level/data.rs)
|
||||
SwingAnimationType.byName skip:data swing names are data; Horizon hardcodes spear swings (spear.rs) and reads no swing_animation component
|
||||
ToolMaterial.applyCommonProperties skip:data material numbers come from item data (items.rs), not built in code
|
||||
ToolMaterial.applySwordProperties skip:data sword properties come from item data (items.rs)
|
||||
ToolMaterial.applyToolProperties skip:data tool properties come from item data (items.rs)
|
||||
ToolMaterial.createSwordAttributes skip:data sword attribute modifiers come from item data (items.rs)
|
||||
ToolMaterial.createToolAttributes skip:data tool attribute modifiers come from item data (items.rs)
|
||||
TippedArrowItem.getDefaultInstance skip:data creative entries come from the exported creative list (creative.rs), not a default stack built in code
|
||||
TippedArrowItem.getName port crates/horizon-client/src/game/commands.rs::Game::stack_display_name the hover name takes the potion's name key for a tipped arrow
|
||||
BlockTransformers.axe skip:data axe rules are built in code; Horizon loads block transforms from data (block_transform.rs)
|
||||
BlockTransformers.axeStrippables skip:data stripping table is data; Horizon loads it from block_transform.rs
|
||||
BlockTransformers.bootstrap skip:data registry bootstrap; transforms are read from data
|
||||
CustomData.equals skip:java
|
||||
CustomData.set inline crates/horizon-client/src/game/commands/items.rs::edit_components gap: minor: does not remove the component when the tag ends up empty
|
||||
CustomData.update inline crates/horizon-client/src/game/commands/items.rs::edit_components gap: minor: does not remove the component when the tag ends up empty
|
||||
CustomModelData.getSafe port crates/horizon-assets/src/item_model.rs::custom_data_at index bounds check for flags, floats, strings and colors
|
||||
DeathProtection.applyEffects port crates/horizon-client/src/game/totem.rs::Game::apply_totem totem use: clears effects, then the totem's regeneration, absorption and fire resistance
|
||||
GrowableMutableContainer.replaceSlotItems inline crates/horizon-items/src/bundle.rs::Contents::try_insert gap: minor: the loop that adds slots while items remain is not ported; bundles insert one stack at a time
|
||||
ItemAttributeModifiers.compute inline crates/horizon-world/src/attributes/mod.rs::Instance::value item modifiers are added to the attribute instance and summed by operation; slot filtering is in the equipment code
|
||||
ItemAttributeModifiers.forEach inline crates/horizon-client/src/item_tooltip.rs::attribute_lines tooltip lines per slot group
|
||||
ItemAttributeModifiers.withModifierAdded missing minor: the loot set_attributes function (SetAttributesFunction) is not ported; no loot path adds a modifier to a stack
|
||||
ItemAttributeModifiers.Builder.add skip:java
|
||||
ItemAttributeModifiers.Entry.matches inline crates/horizon-world/src/attributes/mod.rs::Instance::add_or_replace_permanent modifier identity by id within one attribute
|
||||
OminousBottleAmplifier.addToTooltip missing player: an ominous bottle's tooltip shows no Bad Omen line for its level; Horizon's potion tooltip covers potion items only
|
||||
SimpleMutableContainer.modifySlots port crates/horizon-client/src/game/commands/items.rs::Game::cmd_item_modify each slot is visited and set
|
||||
SimpleMutableContainer.replaceSlotItems port crates/horizon-client/src/game/commands/items.rs::Game::cmd_item /item replace fills slots from the item list
|
||||
SulfurCubeContent.addToTooltip missing minor: Horizon never writes sulfur_cube_content, so no item shows the absorbed block line
|
||||
SuspiciousStewEffects.addToTooltip missing player: in creative, a suspicious stew's tooltip should list its effects; Horizon's stack tooltip shows none
|
||||
TypedEntityData.addToTooltip missing player: in Peaceful, a hostile mob's spawn egg should show a red Peaceful line; Horizon shows only the OP-only warning
|
||||
TypedEntityData.equals skip:java
|
||||
TypedEntityData.stripId skip:other the stored entity data keeps its id; block_entity_item.rs reads it from the tag
|
||||
WritableBookContent.getPages missing minor: the filtered page text (chat filter) is not ported; pages always show raw text
|
||||
PlaySoundConsumeEffect.apply port crates/horizon-world/src/consume_effect.rs::ConsumeEffect::apply the play_sound arm
|
||||
RemoveStatusEffectsConsumeEffect.apply port crates/horizon-world/src/consume_effect.rs::ConsumeEffect::apply the remove_status arm
|
||||
AbstractCookingRecipe.cookingStreamCodec skip:java
|
||||
AbstractCookingRecipe.display port crates/horizon-client/src/recipe_book.rs::Book::build furnace display (Display::Furnace) for each cooking recipe
|
||||
BannerDuplicateRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble copies the patterns of the banner onto a blank one
|
||||
BannerDuplicateRecipe.getRemainingItems port crates/horizon-client/src/crafting.rs::Recipes::remainders a patterned banner stays as one copy
|
||||
BannerDuplicateRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
BlastingRecipe.recipeBookCategory skip:data book category comes from the recipe JSON (Recipes::load keeps recipes.meta)
|
||||
BrewingInput.getItem skip:java
|
||||
BrewingRecipe.matches port crates/horizon-client/src/brewing.rs::Brewing::find input and reagent both tested
|
||||
CraftingRecipe.recipeBookCategory skip:java
|
||||
DecoratedPotRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble
|
||||
DecoratedPotRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches four sherds or bricks in the four pattern cells
|
||||
DyeRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble
|
||||
DyeRecipe.display port crates/horizon-client/src/crafting.rs::Special::book_displays
|
||||
DyeRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
FireworkRocketRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble
|
||||
FireworkRocketRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
FireworkStarFadeRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble
|
||||
FireworkStarFadeRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
FireworkStarRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble
|
||||
FireworkStarRecipe.findShape inline crates/horizon-client/src/crafting.rs::Special::assemble the shape is looked up from the shapes table while assembling
|
||||
FireworkStarRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
ImbueRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble tipped arrows
|
||||
ImbueRecipe.createPlacementInfo port crates/horizon-client/src/crafting.rs::Recipes::placement
|
||||
ImbueRecipe.display port crates/horizon-client/src/crafting.rs::Special::book_displays
|
||||
ImbueRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
MapExtendingRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble
|
||||
MapExtendingRecipe.findFilledMap inline crates/horizon-client/src/crafting.rs::Special::matches the filled map must have scale under 4
|
||||
MapExtendingRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
RecipeCache.compute skip:java
|
||||
RecipeCache.insert skip:java
|
||||
RecipeCache.moveEntryToFront skip:java
|
||||
RecipeCache.validateRecipeManager skip:java
|
||||
RecipeCache.Entry.matches skip:java
|
||||
RecipeHolder.equals skip:java
|
||||
RecipeInput.isEmpty skip:java
|
||||
RecipeMap.create skip:java
|
||||
RecipeMap.getRecipesFor port crates/horizon-client/src/crafting.rs::Recipes::find_with the recipes that match the input, in order
|
||||
RecipePropertySet.create skip:java
|
||||
SelectableRecipe.noRecipeCodec skip:java
|
||||
SelectableRecipe.SingleInputSet.acceptsInput port crates/horizon-client/src/stations.rs::StationRecipes::stonecutter any stonecutting recipe takes the input
|
||||
SelectableRecipe.SingleInputSet.selectByInput port crates/horizon-client/src/stations.rs::StationRecipes::stonecutter the stonecutting recipes that take the input
|
||||
ShapedRecipe.display port crates/horizon-client/src/recipe_book.rs::Book::build shaped grid display
|
||||
ShapelessRecipe.display port crates/horizon-client/src/recipe_book.rs::Book::build shapeless display
|
||||
ShapelessRecipe.matches port crates/horizon-client/src/crafting.rs::Recipes::recipe_matches
|
||||
ShieldDecorationRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble
|
||||
ShieldDecorationRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches
|
||||
SingleItemRecipe.placementInfo port crates/horizon-client/src/crafting.rs::Recipes::placement
|
||||
SingleItemRecipe.simpleMapCodec skip:java
|
||||
SingleItemRecipe.simpleStreamCodec skip:java
|
||||
SingleRecipeInput.getItem skip:java
|
||||
SmeltingRecipe.recipeBookCategory skip:data book category comes from the recipe JSON (Recipes::load keeps recipes.meta)
|
||||
SmithingRecipe.matches port crates/horizon-client/src/stations.rs::StationRecipes::smithing_result template, base and addition tested together; the result is shown only when they match
|
||||
SmithingRecipeInput.getItem skip:java
|
||||
SmithingRecipeInput.isEmpty skip:java
|
||||
StonecutterRecipe.display port crates/horizon-client/src/stations.rs::StationRecipes::stonecutter stonecutting recipe with its input and result
|
||||
TransmuteResult.fromTemplate inline crates/horizon-client/src/crafting.rs::Template::create the transmute result is kept as the template
|
||||
TransmuteResult.resolve port crates/horizon-client/src/crafting.rs::Template::over item from the input when the template has none; count and components from the template
|
||||
DisplayContentsFactory.ForStacks.forStack skip:java
|
||||
FurnaceRecipeDisplay.isEnabled skip:data feature flags: Horizon's recipe set is the pinned pack's, with no flags to check
|
||||
ShapedCraftingRecipeDisplay.isEnabled skip:data feature flags: Horizon's recipe set is the pinned pack's, with no flags to check
|
||||
ShapelessCraftingRecipeDisplay.isEnabled skip:data feature flags: Horizon's recipe set is the pinned pack's, with no flags to check
|
||||
SlotDisplays.bootstrap skip:data registry bootstrap
|
||||
ConditionalEffect.codec skip:java
|
||||
ConditionalEffect.matches inline crates/horizon-client/src/game/enchant_effects.rs::Game::post_attack the requirements check is repeated per hook: post_attack, post_attack_bursts, thorns_damage, bow_projectile_ignite
|
||||
ItemEnchantments.addToTooltip port crates/horizon-client/src/game/stations.rs::Game::stack_tooltip_lines enchantment lines; stored enchantments for books
|
||||
ItemEnchantments.equals skip:java
|
||||
ItemEnchantments.getTagOrEmpty skip:java
|
||||
TargetedConditionalEffect.equipmentDropsCodec skip:java
|
||||
TargetedConditionalEffect.matches port crates/horizon-world/src/loot.rs::LootData::equipment_drops equipment_drops (Looting) checks the requirements per enchanted slot
|
||||
AllOf.codec skip:java
|
||||
AllOf.EntityEffects.apply inline crates/horizon-client/src/game/enchant_effects.rs::Game::apply_piercing_effect gap: minor: nested all_of is walked only for the post-piercing hook
|
||||
AllOf.LocationBasedEffects.onChangedBlock inline crates/horizon-client/src/game/enchant_effects.rs::Game::location_changed_effects gap: minor: only the replace_disk effect is handled; the nested list is not walked
|
||||
AllOf.LocationBasedEffects.onDeactivated inline crates/horizon-client/src/game/enchant_effects.rs::Game::location_changed_effects gap: minor: only the replace_disk effect is handled; the nested list is not walked
|
||||
AllOf.ValueEffects.process port crates/horizon-items/src/enchant.rs::Enchantments::modify_value_with each value effect in turn
|
||||
ApplyEntityImpulse.apply port crates/horizon-client/src/game/enchant_effects.rs::Game::apply_piercing_effect impulse along the look direction on the post-piercing hook
|
||||
ApplyExhaustion.apply port crates/horizon-client/src/game/enchant_effects.rs::Game::apply_piercing_effect food exhaustion on the post-piercing hook
|
||||
DamageEntity.apply port crates/horizon-client/src/game/enchant_effects.rs::Game::thorns_damage thorns damage, random between min and max
|
||||
ExplodeEffect.apply port crates/horizon-client/src/game/enchant_effects.rs::Game::post_attack_bursts wind burst at the player's feet
|
||||
ExplodeEffect.getDamageSource inline crates/horizon-client/src/game/enchant_effects.rs::Game::post_attack_bursts gap: minor: the burst builds no damage source; it knocks back and triggers blocks only
|
||||
PlaySoundEffect.apply port crates/horizon-client/src/game/enchant_effects.rs::Game::apply_piercing_effect sound by level, heard by all
|
||||
RemoveBinomial.process port crates/horizon-items/src/enchant.rs::apply_value_effect the binomial drop count for unbreaking
|
||||
ReplaceBlock.apply missing minor: no enchantment in the pinned data uses replace_block
|
||||
RunFunction.apply missing minor: no enchantment in the pinned data uses run_function
|
||||
ScaleExponentially.process missing minor: no enchantment in the pinned data uses the exponential value effect
|
||||
SetBlockProperties.apply missing minor: no enchantment in the pinned data uses set_block_properties
|
||||
SpawnParticlesEffect.apply port crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed gap: minor: soul speed's particles are hardcoded, not read from the effect data
|
||||
SpawnParticlesEffect.PositionSource.getCoordinate inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed gap: minor: the particle position is hardcoded
|
||||
SpawnParticlesEffect.VelocitySource.getVelocity inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed gap: minor: the particle velocity is hardcoded
|
||||
SummonEntityEffect.apply port crates/horizon-client/src/game/trident.rs::Game::channel_lightning gap: minor: only the lightning bolt of channeling; other summon_entity types are not ported
|
||||
EnchantmentProviderTypes.bootstrap skip:data registry bootstrap
|
||||
EnchantmentsByCost.enchant port crates/horizon-world/src/loot.rs::LootData::select_enchantments EnchantmentHelper.selectEnchantment with a cost budget
|
||||
SingleEnchantment.enchant port crates/horizon-world/src/loot.rs::enchant one enchantment at a level
|
||||
VanillaEnchantmentProviders.bootstrap skip:data registry bootstrap
|
||||
ArmorMaterials.makeDefense skip:data armour defence values come from item data
|
||||
ArmorTrim.addToTooltip port crates/horizon-client/src/game/stations.rs::Game::stack_tooltip_lines upgrade title, trim pattern and material lines
|
||||
TrimMaterials.bootstrap skip:data registry bootstrap
|
||||
TrimMaterials.register skip:data trim materials are read from data
|
||||
TrimPatterns.bootstrap skip:data registry bootstrap
|
||||
TrimPatterns.register skip:data trim patterns are read from data
|
||||
CompositeSlotSource.createCodec skip:java
|
||||
CompositeSlotSource.group missing minor: composite slot groups (loot-style term lists) are not ported; /item takes one slot name
|
||||
CountingModifier.accept port crates/horizon-client/src/game/commands/items.rs::Game::cmd_item_modify counts each slot set, limited to the max stack size
|
||||
RangeSlotSource.provide port crates/horizon-client/src/game/commands/items.rs::Game::slots_named gap: minor: slots by name pattern only, no slot_range argument
|
||||
SlotCollection.concat inline crates/horizon-client/src/game/commands/items.rs::Game::slots_named the slots of several names become one list
|
||||
SlotCollection.of port crates/horizon-client/src/game/commands/items.rs::Game::slot_get
|
||||
SlotCollection.FlatMapped.modifySlots inline crates/horizon-client/src/game/commands/items.rs::Game::cmd_item_modify per-target slot loop
|
||||
SlotCollection.FlatMapped.replaceSlotItems inline crates/horizon-client/src/game/commands/items.rs::Game::cmd_item per-target slot loop
|
||||
SlotSelector.FilteringSelector.trySelectSlot inline crates/horizon-client/src/game/commands/items.rs::Game::cmd_item_modify gap: minor: only the non-empty filter (SlotSelector.NON_EMPTY_SLOTS); predicate filters are not ported
|
||||
SlotSelector.TrackingSelector.filter missing minor: slot limit selectors are not ported
|
||||
SlotSelector.TrackingSelector.trySelectSlot missing minor: slot limit selectors are not ported
|
||||
SlotSources.bootstrap skip:data registry bootstrap
|
||||
TransformedSlotSource.commonFields skip:java
|
||||
TradeCost.toItemCost port crates/horizon-client/src/merchant.rs::cost count plus the extra cost, clamped to the max stack size
|
||||
|
Can't render this file because it contains an unexpected character in line 1 and column 84.
|
@@ -0,0 +1,316 @@
|
||||
TradeRebalanceVillagerTrades skip:data rebalanced villager trade definitions are data; Horizon reads trade_set JSON (merchant.rs Trades::load)
|
||||
TradeSets skip:data registry bootstrap; trade sets come from the trade_set data (merchant.rs Trades::load)
|
||||
VillagerTrades skip:data trade definitions are data; read from data/minecraft/trade_set and villager_trade (merchant.rs Trades::load)
|
||||
BlockCollisions.<init> port crates/horizon-world/src/block_collision_scan.rs::BlockCollisionScan::new scan set-up over the box
|
||||
BlockCollisions.computeNext port crates/horizon-world/src/block_collision_scan.rs::BlockCollisionScan::find_next next block shape along the box
|
||||
BlockCollisions.getChunk inline crates/horizon-world/src/block_collision_scan.rs::BlockCollisionScan::find_next chunk fetch through collision_chunk inside find_next
|
||||
CardinalLighting.byFace port crates/horizon-client/src/mesher/lighting.rs::cardinal per-face directional shade; nether flag handled in the same fn
|
||||
ClipContext.getFluidShape inline crates/horizon-world/src/world_ray.rs::clip_world pick_fluid decides canPick; the shape is clipped in clip_world
|
||||
ColorMapColorUtil.get port crates/horizon-client/src/biome.rs::sample colormap lookup by temperature and downfall
|
||||
EntityBasedExplosionDamageCalculator.getBlockExplosionResistance missing unsure: source-entity overrides (wither skull, minecart TNT, primed TNT keeping nether portals) are not read; explosion_hit_block uses the block's own resistance
|
||||
ExplosionDamageCalculator.getEntityDamageAmount inline crates/horizon-client/src/game/explosion.rs::Game::explosion_hurt_entities damage formula inline; the player copy is in explosion_hurt_player
|
||||
LevelSettings.copy skip:java immutable record copy; Horizon keeps level fields on its own struct
|
||||
LevelSettings.parse port crates/horizon-client/src/save.rs::Level::read reads difficulty, lock, allowCommands and game type from level.dat
|
||||
LevelSettings.withAllowCommands skip:java immutable record builder
|
||||
LevelSettings.withDataConfiguration skip:java immutable record builder
|
||||
LevelSettings.withDifficulty skip:java immutable record builder
|
||||
LevelSettings.withDifficultyLock skip:java immutable record builder
|
||||
LevelSettings.withGameType skip:java immutable record builder
|
||||
PathNavigationRegion skip:other pathfinding reads the live level (mobs/path.rs); no region snapshot is built
|
||||
SimpleExplosionDamageCalculator.getBlockExplosionResistance inline crates/horizon-client/src/game/wind.rs::Game::wind_positions gap: minor: only the wind charge tag stops the rays; enchantment immune_blocks are not read
|
||||
SimpleExplosionDamageCalculator.getKnockbackMultiplier inline crates/horizon-client/src/game/wind.rs::Game::wind_push_player creative-flying zero is here; the enchantment multiplier is in post_attack_bursts (enchant_effects.rs)
|
||||
TicketStorage.activateAllDeactivatedTickets skip:other no deactivated-ticket state; ticket_levels.rs recomputes from players and forced chunks
|
||||
TicketStorage.addTicket missing unsure: portal and teleport tickets are not modelled; ticket_levels.rs counts only players and forced chunks
|
||||
TicketStorage.addTicketWithRadius missing unsure: radius tickets (portal, teleport) are not modelled; ticket_levels.rs counts only players and forced chunks
|
||||
TicketStorage.canTicketExpire skip:other ticket expiry is not modelled; no timed tickets in ticket_levels.rs
|
||||
TicketStorage.deactivateTicketsOnClosing skip:other chunk-unload bookkeeping; no per-ticket state
|
||||
TicketStorage.forEachTicket skip:other iteration over stored tickets; ticket_levels.rs walks its own sources
|
||||
TicketStorage.fromPacked skip:other saved tickets are not read; Horizon does not save chunk tickets
|
||||
TicketStorage.getAllChunksWithTicketThat skip:other query over stored tickets; ticket_levels.rs answers per chunk
|
||||
TicketStorage.getLowestTicket port crates/horizon-client/src/ticket_levels.rs::Map::get gap: minor: lowest level from player and forced sources only
|
||||
TicketStorage.getOrCreateTickets skip:java per-chunk cache of tickets
|
||||
TicketStorage.getTicketDebugString skip:debug debug text
|
||||
TicketStorage.getTicketLevelAt port crates/horizon-client/src/ticket_levels.rs::Map::get gap: minor: levels from player and forced sources only
|
||||
TicketStorage.isTicketSameTypeAndLevel skip:other compares stored tickets; Horizon stores none, levels come from ticket_levels.rs
|
||||
TicketStorage.packTickets skip:other saves stored tickets; Horizon saves forced chunks as their own file (save.rs save_forced_chunks)
|
||||
TicketStorage.purgeStaleTickets skip:other drops expired tickets; ticket_levels.rs has no timed tickets
|
||||
TicketStorage.removeTicket inline crates/horizon-client/src/game/commands/terrain_cmds.rs::Game::cmd_forceload gap: minor: only the forced-chunk path; portal and teleport tickets are not modelled
|
||||
TicketStorage.removeTicketIf skip:other predicate removal over stored tickets; forced chunks are changed by cmd_forceload
|
||||
TicketStorage.removeTicketWithRadius missing unsure: radius tickets (portal, teleport) are not modelled
|
||||
TicketStorage.replaceTicketLevelOfType skip:other re-levels stored tickets; ticket_levels.rs computes levels from positions
|
||||
TicketStorage.shouldKeepDimensionActive missing unsure: whether a dimension stays ticking because of forced chunks was not checked
|
||||
TicketStorage.updateChunkForced inline crates/horizon-client/src/game/commands/terrain_cmds.rs::Game::cmd_forceload the per-chunk add or remove of a forced chunk
|
||||
TicketStorage.updateForcedChunks inline crates/horizon-client/src/save.rs::SaveDir::load_forced_chunks gap: minor: restores the saved forced set on load; no forced-chunk packet is sent here
|
||||
BiomeSpecialEffects.Builder.build skip:java builder for biome effects; Horizon reads the effects from biome data (biome.rs)
|
||||
CheckerboardColumnBiomeSource.getNoiseBiome port crates/horizon-world/src/worldgen/biome_source.rs::CheckerboardBiomeSource::noise_biome checkerboard column pick
|
||||
FeatureSorter.buildFeaturesPerStep port crates/horizon-world/src/worldgen/feature_sort.rs::build_features_per_step
|
||||
MobSpawnSettings.Builder skip:java builder for spawn data; Horizon reads spawn costs and entries from biome data (biome.rs, spawn_selection.rs)
|
||||
MultiNoiseBiomeSourceParameterList skip:data knownPresets is the datagen preset table; Horizon reads biome-parameters copied by horizon-prepare
|
||||
MultiNoiseBiomeSourceParameterList.Preset skip:data preset biome lists are datagen output; read from biome-parameters data
|
||||
MultiNoiseBiomeSourceParameterLists skip:data bootstrap of the datagen parameter lists; Horizon reads biome-parameters
|
||||
OverworldBiomeBuilder skip:data builds the overworld parameter tree at datagen time; Horizon reads biome-parameters JSON
|
||||
TheEndBiomeSource.collectPossibleBiomes skip:java the five End biomes are fields of EndBiomeSource; no collection step
|
||||
TheEndBiomeSource.create skip:java factory; the End source is built from the dimension data
|
||||
TheEndBiomeSource.getNoiseBiome port crates/horizon-world/src/worldgen/biome_source.rs::EndBiomeSource::noise_biome central circle, then erosion bands
|
||||
AbstractFurnaceBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
AbstractFurnaceBlock.createFurnaceTicker port crates/horizon-client/src/game/block_entity_ticks.rs::Game::tick_furnace furnace ticker
|
||||
AbstractFurnaceBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
AmethystBlock missing player: an arrow or other projectile that hits an amethyst block plays no chime (vanilla plays block.amethyst_block.chime)
|
||||
AmethystClusterBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
AmethystClusterBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
AmethystClusterBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state waterlogged state from block data
|
||||
AmethystClusterBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
AmethystClusterBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
AmethystClusterBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
AttachedStemBlock.getCloneItemStack missing unsure: middle-click pick of an attached stem; pick_item.rs was not checked for block-to-item picks
|
||||
AttachedStemBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
AttachedStemBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
AzaleaBlock.isBonemealSuccess port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_success
|
||||
AzaleaBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
AzaleaBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
BambooSaplingBlock.growBamboo port crates/horizon-world/src/level/tick.rs::Sim::bamboo_grow sets the stalk above with small leaves
|
||||
BambooSaplingBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
BambooSaplingBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::bamboo_sapling_grow
|
||||
BambooSaplingBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
BarrelBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
BarrelBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
BarrelBlock.tick port crates/horizon-client/src/game/block_entity_anims.rs::Game::barrel_openers_changed gap: minor: recheckOpen is the open-viewer count, checked where the lid state is set
|
||||
BarrelBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
BarrierBlock.canPlaceLiquid port crates/horizon-world/src/level/fluids.rs::Sim::can_place_liquid
|
||||
BarrierBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
BarrierBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
BarrierBlock.pickupBlock port crates/horizon-world/src/level/fluids.rs::Sim::pickup_block gap: minor: vanilla lets only a creative player pick it up; that rule is not checked here
|
||||
BarrierBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
BaseCoralWallFanBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
BaseCoralWallFanBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
BaseCoralWallFanBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
BaseCoralWallFanBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
BaseCoralWallFanBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
BaseEntityBlock.getMenuProvider port crates/horizon-world/src/level/interact.rs::Sim::use_without_item menu opened from the block's use action
|
||||
BaseEntityBlock.triggerEvent port crates/horizon-world/src/level/pistons.rs::Sim::trigger_event
|
||||
BaseTorchBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
BeetrootBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::crop_random_tick
|
||||
BigDripleafStemBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
BigDripleafStemBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
BigDripleafStemBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
BigDripleafStemBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
BigDripleafStemBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
BigDripleafStemBlock.place port crates/horizon-world/src/level/bonemeal.rs::Sim::dripleaf_stem_place places the stem with waterlogging and facing
|
||||
BigDripleafStemBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::big_dripleaf_tick
|
||||
BigDripleafStemBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
BlastFurnaceBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick lit blast furnace smoke and flame
|
||||
BlastFurnaceBlock.openContainer port crates/horizon-world/src/level/interact.rs::Sim::use_without_item opens the blast furnace menu
|
||||
BonemealableFeaturePlacerBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Behaviours::place_feature places the configured feature
|
||||
BrewingStandBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick brewing bubbles
|
||||
BrewingStandBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
BrewingStandBlock.getTicker port crates/horizon-client/src/brewing.rs::BrewingStand::brew the stand's brewing step
|
||||
BuddingAmethystBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::budding_amethyst_tick
|
||||
BushBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
CactusFlowerBlock.mayPlaceOn port crates/horizon-world/src/level/survive.rs::Sim::may_place_on
|
||||
CakeBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CakeBlock.useItemOn port crates/horizon-world/src/level/interact.rs::Behaviours::use_item_on
|
||||
CakeBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
CalibratedSculkSensorBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
CalibratedSculkSensorBlock.getSignal port crates/horizon-world/src/level/sculk.rs::Behaviours::calibrated_back_signal
|
||||
CalibratedSculkSensorBlock.getTicker port crates/horizon-world/src/level/sculk.rs::Sim::sculk_sensor_tick
|
||||
CalibratedSculkSensorBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
CarpetBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CartographyTableBlock.getMenuProvider port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
CartographyTableBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
CaveVines.hasGlowBerries port crates/horizon-world/src/level/interact.rs::Sim::use_without_item berries check on the pick branch
|
||||
CaveVinesBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
CaveVinesBlock.getGrowIntoState port crates/horizon-world/src/level/tick.rs::Sim::growing_plant_grow_into_state 11% berries roll
|
||||
CaveVinesPlantBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
CeilingHangingSignBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
CeilingHangingSignBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
CeilingHangingSignBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
CeilingHangingSignBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror
|
||||
CeilingHangingSignBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
CeilingHangingSignBlock.shouldTryToChainAnotherHangingSign inline crates/horizon-world/src/level/place.rs::Sim::placement_class chain check sits in the ceiling sign arm
|
||||
CeilingHangingSignBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CeilingHangingSignBlock.useItemOn port crates/horizon-world/src/level/interact.rs::Behaviours::use_item_on
|
||||
CocoaBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
CocoaBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
CocoaBlock.getShape skip:data block shape is a per-state table from the vanilla data
|
||||
CocoaBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
CocoaBlock.isRandomlyTicking port crates/horizon-world/src/level/mod.rs::Behaviours::is_randomly_ticking
|
||||
CocoaBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
CocoaBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
CocoaBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block
|
||||
CocoaBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
ColorCollection skip:data registry helper for colour families of blocks and items; the variants are data in horizon-items
|
||||
ConduitBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
ConduitBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
ConduitBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CoralBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
CoralBlock.scanForWater port crates/horizon-world/src/level/shapes.rs::Sim::coral_scan_for_water
|
||||
CoralBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
CoralBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CoralFanBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
CoralFanBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CoralPlantBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
CoralPlantBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CoralWallFanBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
CoralWallFanBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
CrossCollisionBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
CrossCollisionBlock.makeShapes skip:java builds the VoxelShape arrays; shapes are data
|
||||
CrossCollisionBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror
|
||||
CrossCollisionBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
CryingObsidianBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick crying tear particles
|
||||
DropExperienceBlock.spawnAfterBreak port crates/horizon-world/src/level/removal.rs::break_experience
|
||||
EnchantingTableBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick book and rune particles
|
||||
EnchantingTableBlock.getMenuProvider port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
EnchantingTableBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
EndRodBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick
|
||||
EndRodBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
EnderChestBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick
|
||||
EnderChestBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
EnderChestBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
EnderChestBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
EnderChestBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
EnderChestBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
EnderChestBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
FenceGateBlock.connectsToDirection port crates/horizon-world/src/level/shapes.rs::Sim::fence_connects_to
|
||||
FenceGateBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
FenceGateBlock.getBlockSupportShape skip:data block shape is a per-state table from the vanilla data
|
||||
FenceGateBlock.getCollisionShape skip:data block shape is a per-state table from the vanilla data
|
||||
FenceGateBlock.getOcclusionShape skip:data block shape is a per-state table from the vanilla data
|
||||
FenceGateBlock.getShape skip:data block shape is a per-state table from the vanilla data
|
||||
FenceGateBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
FenceGateBlock.isPathfindable skip:data path types come from the per-state path data (mobs/path.rs)
|
||||
FenceGateBlock.neighborChanged port crates/horizon-world/src/level/redstone.rs::Sim::gate_neighbor_changed
|
||||
FenceGateBlock.onExplosionHit missing player: an explosion (TNT, creeper) does not open a closed, unpowered fence gate; vanilla toggles it open
|
||||
FenceGateBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
FenceGateBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
FireflyBushBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
FlowerBedBlock.canBeReplaced port crates/horizon-world/src/level/place.rs::Sim::can_be_replaced
|
||||
FlowerBedBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
FlowerBedBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
FlowerBedBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
FlowerBlock.makeEffectList skip:data suspicious stew effects are item data (stew_effects component)
|
||||
FrogspawnBlock.mayPlaceOn port crates/horizon-world/src/level/survive.rs::Sim::frogspawn_may_place_on
|
||||
FrogspawnBlock.spawnTadpoles port crates/horizon-client/src/game.rs::Game::process_level_events handles the hatch block event: 2 to 5 tadpoles
|
||||
FrogspawnBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
FrogspawnBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
FrostedIceBlock.fewerNeigboursThan port crates/horizon-world/src/level/hooks.rs::Sim::frosted_ice_fewer_neighbours_than
|
||||
FrostedIceBlock.neighborChanged port crates/horizon-world/src/level/hooks.rs::Sim::neighbor_changed
|
||||
FrostedIceBlock.slightlyMelt port crates/horizon-world/src/level/tick.rs::Sim::frosted_slightly_melt
|
||||
FrostedIceBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::frosted_ice_tick
|
||||
FurnaceBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick lit furnace smoke and flame
|
||||
FurnaceBlock.openContainer port crates/horizon-world/src/level/interact.rs::Sim::use_without_item opens the furnace menu
|
||||
GlowLichenBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
GrindstoneBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
GrindstoneBlock.getMenuProvider port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
GrindstoneBlock.makeShapes skip:java builds the VoxelShape arrays; shapes are data
|
||||
GrindstoneBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
GrindstoneBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
HalfTransparentBlock.skipRendering port crates/horizon-world/src/block_render.rs::FaceVisibility::skips neighbour faces of the same block
|
||||
HangingRootsBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
HangingRootsBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
HangingRootsBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
HangingRootsBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
HangingSignBlock.getAttachmentPoint inline crates/horizon-world/src/level/place.rs::Sim::placement_class attach point is the wall or ceiling arm of placement_class
|
||||
HeavyCoreBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
HeavyCoreBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
HeavyCoreBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
HopperBlock.checkPoweredState port crates/horizon-world/src/level/redstone.rs::Sim::hopper_check_powered
|
||||
HopperBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
HopperBlock.entityInside inline crates/horizon-client/src/game/machines.rs::Game::suck_item_entities gap: minor: the hopper pulls item entities every tick, not on contact
|
||||
HopperBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
HopperBlock.makeShapes skip:java builds the VoxelShape arrays; shapes are data
|
||||
HopperBlock.onPlace port crates/horizon-world/src/level/hooks.rs::Sim::on_place
|
||||
HopperBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
HopperBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
HorizontalDirectionalBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
HugeMushroomBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
HugeMushroomBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
HugeMushroomBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror
|
||||
HugeMushroomBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
HugeMushroomBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
KelpBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
LadderBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
LadderBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
LadderBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
LadderBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
LadderBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
LadderBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
LanternBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
LanternBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
LanternBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
LanternBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
LanternBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
LeafLitterBlock.canBeReplaced port crates/horizon-world/src/level/place.rs::Sim::can_be_replaced
|
||||
LeafLitterBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
LeafLitterBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
LeafLitterBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
LilyPadBlock.entityInside missing player: a boat that drives over a lily pad does not break it; vanilla destroys it
|
||||
LilyPadBlock.mayPlaceOn port crates/horizon-world/src/level/survive.rs::Sim::may_place_on
|
||||
MagmaBlock.stepOn missing player: standing on magma does not hurt (vanilla deals 1 hot-floor damage unless sneaking)
|
||||
MangrovePropaguleBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
MangrovePropaguleBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
MangrovePropaguleBlock.createNewHangingPropagule inline crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal hanging state set when a propagule grows down
|
||||
MangrovePropaguleBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
MangrovePropaguleBlock.getShape skip:data block shape is a per-state table from the vanilla data
|
||||
MangrovePropaguleBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
MangrovePropaguleBlock.isBonemealSuccess port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_success
|
||||
MangrovePropaguleBlock.isFullyGrown inline crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid age 4 check in the propagule arm
|
||||
MangrovePropaguleBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
MangrovePropaguleBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block
|
||||
MangrovePropaguleBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
MangroveRootsBlock.getFluidState port crates/horizon-world/src/registry_fluid.rs::RegistryFluidWorld::fluid_state
|
||||
MangroveRootsBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
MangroveRootsBlock.skipRendering port crates/horizon-world/src/block_render.rs::FaceVisibility::skips
|
||||
MangroveRootsBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
MyceliumBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick mycelium spore particles
|
||||
NetherFungusBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
NetherFungusBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
NetherWartBlock.isRandomlyTicking port crates/horizon-world/src/level/mod.rs::Behaviours::is_randomly_ticking
|
||||
NetherWartBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block
|
||||
NetherrackBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid netherrack beside nylium
|
||||
NetherrackBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
NyliumBlock.canBeNylium port crates/horizon-world/src/level/tick.rs::Sim::can_be_nylium
|
||||
NyliumBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
NyliumBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
NyliumBlock.place inline crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal fungus placement folded into the bonemeal step
|
||||
NyliumBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block
|
||||
ObserverBlock.affectNeighborsAfterRemoval port crates/horizon-world/src/level/hooks.rs::Sim::affect_neighbors_after_removal
|
||||
ObserverBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
ObserverBlock.getSignal port crates/horizon-world/src/level/redstone.rs::Sim::signal
|
||||
ObserverBlock.onPlace port crates/horizon-world/src/level/hooks.rs::Sim::on_place
|
||||
ObserverBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
ObserverBlock.startSignal port crates/horizon-world/src/level/redstone.rs::Sim::observer_start_signal
|
||||
ObserverBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
ObserverBlock.updateNeighborsInFront port crates/horizon-world/src/level/redstone.rs::Sim::observer_update_in_front
|
||||
ObserverBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
PipeBlock skip:java makeShapes builds the VoxelShape arrays; shapes are data
|
||||
PlainSignBlock skip:java constant accessor for the attach point; sign placement picks standing or wall signs in place.rs
|
||||
PoweredRailBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
PoweredRailBlock.findPoweredRailSignal port crates/horizon-world/src/level/rails.rs::Sim::powered_rail_find
|
||||
PoweredRailBlock.isSameRailWithPower port crates/horizon-world/src/level/rails.rs::Sim::powered_rail_same_with_power
|
||||
PoweredRailBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror
|
||||
PoweredRailBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
PoweredRailBlock.updateState port crates/horizon-world/src/level/rails.rs::Sim::powered_rail_update
|
||||
PressurePlateBlock.getSignalStrength port crates/horizon-world/src/level/redstone.rs::Sim::plate_signal_strength
|
||||
PressurePlateBlock.setSignalForState port crates/horizon-world/src/level/redstone.rs::Sim::plate_signal_for_state
|
||||
RedstoneLampBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
RedstoneLampBlock.neighborChanged port crates/horizon-world/src/level/hooks.rs::Sim::neighbor_changed
|
||||
RedstoneLampBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
RedstoneTorchBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick redstone torch smoke
|
||||
RedstoneTorchBlock.getDirectSignal port crates/horizon-world/src/level/redstone.rs::Sim::direct_signal
|
||||
RedstoneTorchBlock.getSignal port crates/horizon-world/src/level/redstone.rs::Sim::signal
|
||||
RedstoneTorchBlock.isToggledTooFrequently port crates/horizon-world/src/level/redstone.rs::Sim::torch_toggled_too_frequently
|
||||
RedstoneTorchBlock.neighborChanged port crates/horizon-world/src/level/hooks.rs::Sim::neighbor_changed
|
||||
RedstoneTorchBlock.notifyNeighbors port crates/horizon-world/src/level/redstone.rs::Sim::torch_notify_neighbors
|
||||
RedstoneTorchBlock.tick port crates/horizon-world/src/level/redstone.rs::Sim::torch_tick
|
||||
RedstoneWallTorchBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick
|
||||
RedstoneWallTorchBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
RedstoneWallTorchBlock.getSignal port crates/horizon-world/src/level/redstone.rs::Sim::signal
|
||||
RedstoneWallTorchBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
RedstoneWallTorchBlock.hasNeighborSignal port crates/horizon-world/src/level/redstone.rs::Sim::torch_has_neighbor_signal
|
||||
RedstoneWallTorchBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
RedstoneWallTorchBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
RepeaterBlock.createBlockStateDefinition skip:data block state definition is data (blocks table in horizon-items)
|
||||
RepeaterBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
RepeaterBlock.shouldRedstoneWireConnectTo port crates/horizon-world/src/level/redstone.rs::Sim::should_wire_connect_to
|
||||
RepeaterBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
RepeaterBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
|
@@ -0,0 +1,231 @@
|
||||
RodBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror rod facing mirrored through the state table
|
||||
RodBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate rod facing turned through the state table
|
||||
RootedDirtBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid needs air below
|
||||
RotatedPillarBlock.rotatePillar port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate axis swap is in the rotate table
|
||||
SandBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick desert sand ambient sound
|
||||
SeagrassBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
SeagrassBlock.mayPlaceOn port crates/horizon-world/src/level/survive.rs::Sim::may_place_on
|
||||
SeagrassBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
SeagrassBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SegmentableBlock.canBeReplaced port crates/horizon-world/src/level/place.rs::Sim::can_be_replaced leaf litter and flower bed segments
|
||||
SegmentableBlock.getShapeCalculator port crates/horizon-world/src/interaction_shapes.rs::InteractionShapes::shape shape per state from the table
|
||||
SegmentableBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
ShelfMushroomBlock.bounceOn port crates/horizon-world/src/block_landing.rs::BlockLandingRegistry::fall_on shelf bounce flag of the landing rule
|
||||
ShelfMushroomBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
ShelfMushroomBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
ShelfMushroomBlock.getShape port crates/horizon-world/src/interaction_shapes.rs::InteractionShapes::shape shape per state from the table
|
||||
ShelfMushroomBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
ShelfMushroomBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
ShelfMushroomBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
ShelfMushroomBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SimpleWaterloggedBlock.pickupBlock port crates/horizon-world/src/level/fluids.rs::Sim::pickup_block
|
||||
SimpleWaterloggedBlock.placeLiquid port crates/horizon-world/src/level/fluids.rs::Sim::place_liquid
|
||||
SkullBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
SkullBlock.getShape port crates/horizon-world/src/interaction_shapes.rs::InteractionShapes::shape shape per state from the table
|
||||
SkullBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
SkullBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror
|
||||
SkullBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
SlabBlock.canBeReplaced port crates/horizon-world/src/level/place.rs::Sim::can_be_replaced
|
||||
SlabBlock.canPlaceLiquid port crates/horizon-world/src/level/fluids.rs::Sim::can_place_liquid
|
||||
SlabBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
SlabBlock.getFluidState port crates/horizon-world/src/fluid.rs::FluidStateTable::get
|
||||
SlabBlock.getShape port crates/horizon-world/src/interaction_shapes.rs::InteractionShapes::shape shape per state from the table
|
||||
SlabBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
SlabBlock.isPathfindable skip:data per-state path type is exported state data (StateData.path)
|
||||
SlabBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SlimeBlock.fallOn port crates/horizon-world/src/block_landing.rs::BlockLandingRegistry::fall_on slime landing rule
|
||||
SmallDripleafBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
SmallDripleafBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
SmallDripleafBlock.getFluidState port crates/horizon-world/src/fluid.rs::FluidStateTable::get
|
||||
SmallDripleafBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
SmallDripleafBlock.mayPlaceOn port crates/horizon-world/src/level/survive.rs::Sim::may_place_on
|
||||
SmallDripleafBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
SmallDripleafBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
SmallDripleafBlock.setPlacedBy port crates/horizon-world/src/level/place.rs::Sim::set_placed_by
|
||||
SmallDripleafBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SmithingTableBlock.getMenuProvider inline crates/horizon-world/src/level/interact.rs::Sim::use_without_item station menu is opened by the use arm
|
||||
SmithingTableBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
SmokerBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick lit smoker smoke
|
||||
SmokerBlock.openContainer inline crates/horizon-world/src/level/interact.rs::Sim::use_without_item furnace-family arm, which the smoker shares
|
||||
SnowyBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
SnowyBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SoulFireBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SporeBlossomBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick
|
||||
SporeBlossomBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
SporeBlossomBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SpreadingSnowyBlock.canPropagate inline crates/horizon-world/src/level/tick.rs::Sim::spreading_snowy_tick spread test folded into the tick
|
||||
SpreadingSnowyBlock.canStayAlive inline crates/horizon-world/src/level/tick.rs::Sim::spreading_snowy_tick survival test folded into the tick
|
||||
SpreadingSnowyBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::spreading_snowy_tick
|
||||
StandingSignBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
StandingSignBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
StandingSignBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror
|
||||
StandingSignBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
StandingSignBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
StemBlock.getCloneItemStack missing unsure: minor: middle-click on a stem may not return its seed item; no stem case found in the pick code
|
||||
StemBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid
|
||||
StemBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal
|
||||
StemBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::stem_random_tick
|
||||
StonecutterBlock.getMenuProvider inline crates/horizon-world/src/level/interact.rs::Sim::use_without_item station menu opened by the use arm
|
||||
StonecutterBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
StonecutterBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
SugarCaneBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block growth arm of the random tick
|
||||
SugarCaneBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block
|
||||
SugarCaneBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
SuspiciousEffectHolder.tryGet skip:data the effect comes from the item's stew effects data (item_data.rs)
|
||||
TallSeagrassBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
TallSeagrassBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
TallSeagrassBlock.mayPlaceOn port crates/horizon-world/src/level/survive.rs::Sim::may_place_on
|
||||
TestBlock missing minor: game-test block for operators; Horizon keeps only its NBT
|
||||
TestInstanceBlock missing minor: game-test instance block; Horizon keeps only its NBT
|
||||
TintedParticleLeavesBlock.spawnFallingLeavesParticle port crates/horizon-client/src/animate_tick.rs::block_animate_tick falling tinted leaf particle
|
||||
TorchBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick torch flame
|
||||
TorchflowerCropBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block growth arm
|
||||
TrapDoorBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
TrapDoorBlock.getFluidState port crates/horizon-world/src/fluid.rs::FluidStateTable::get
|
||||
TrapDoorBlock.getShape port crates/horizon-world/src/interaction_shapes.rs::InteractionShapes::shape shape per state from the table
|
||||
TrapDoorBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
TrapDoorBlock.isPathfindable skip:data per-state path type is exported state data (StateData.path)
|
||||
TrapDoorBlock.neighborChanged port crates/horizon-world/src/level/hooks.rs::Sim::neighbor_changed redstone update arm for trapdoors
|
||||
TrapDoorBlock.onExplosionHit missing player: a wind burst or explosion that could open a trapdoor leaves it shut; the explosion code has no trapdoor case
|
||||
TrapDoorBlock.playSound port crates/horizon-world/src/level/redstone.rs::Sim::trapdoor_sound
|
||||
TrapDoorBlock.toggle inline crates/horizon-world/src/level/interact.rs::Sim::use_without_item the trapdoor arm cycles the open state
|
||||
TrapDoorBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
TrapDoorBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item
|
||||
TrappedChestBlock.getDirectSignal port crates/horizon-world/src/level/redstone.rs::Sim::state_direct_signal
|
||||
WallBannerBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
WallBannerBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
WallBannerBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
WallBannerBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
WallHangingSignBlock.canAttachTo inline crates/horizon-world/src/level/place.rs::Sim::wall_hanging_sign_can_place attach test folded into the placement check
|
||||
WallHangingSignBlock.canPlace port crates/horizon-world/src/level/place.rs::Sim::wall_hanging_sign_can_place
|
||||
WallHangingSignBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
WallHangingSignBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
WallHangingSignBlock.isHittingEditableSide missing unsure: player: a hanging sign clicked on its side may not chain onto a wall hanging sign
|
||||
WallHangingSignBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
WallHangingSignBlock.shouldTryToChainAnotherHangingSign missing unsure: player: a second hanging sign used on a wall sign may not chain on
|
||||
WallHangingSignBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
WallHangingSignBlock.useItemOn port crates/horizon-world/src/level/interact.rs::Behaviours::use_item_on gap: player: chaining a hanging sign onto a wall hanging sign is not ported here
|
||||
WallSignBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
WallSignBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
WallSignBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
WallSignBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
WallSignBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
WallSkullBlock.createBlockStateDefinition skip:data states come from the generated block state table
|
||||
WallSkullBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
WallSkullBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
WallTorchBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick wall torch flame
|
||||
WallTorchBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class
|
||||
WallTorchBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
WallTorchBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate
|
||||
WallTorchBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
WaterloggedTransparentBlock.getFluidState port crates/horizon-world/src/fluid.rs::FluidStateTable::get
|
||||
WaterloggedTransparentBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class
|
||||
WaterloggedTransparentBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class
|
||||
WeatheringCopperChestBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block oxidation through the weathering interface branch
|
||||
WeatheringCopperCollection skip:data block family registry; oxidation links come from the block data
|
||||
WeatheringCopperCollection.ByState skip:data helper over the oxidation stages of the block family registry
|
||||
WeatheringCopperDoorBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block oxidation through the weathering interface branch
|
||||
WeightedPressurePlateBlock.getSignalStrength port crates/horizon-world/src/level/redstone.rs::Sim::plate_signal_strength
|
||||
WetSpongeBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick wet sponge drip
|
||||
WetSpongeBlock.onPlace port crates/horizon-world/src/level/hooks.rs::Sim::on_place wet sponge drying arm
|
||||
BannerPatternLayers.removeLast inline crates/horizon-client/src/cauldron.rs::interact banner wash pops the last pattern in its arm
|
||||
BannerPatternLayers.Builder skip:java builder for banner pattern layers
|
||||
BannerPatterns skip:data registry bootstrap
|
||||
BarrelBlockEntity.loadAdditional port crates/horizon-client-core/src/block_entity_nbt.rs::canonical gap: minor: canonical NBT form only, no load step of its own
|
||||
BarrelBlockEntity.recheckOpen missing unsure: player: a barrel lid may stay open after a player walks away; only golem openers are rechecked on a timer
|
||||
BarrelBlockEntity.saveAdditional port crates/horizon-client-core/src/block_entity_nbt.rs::canonical gap: minor: canonical NBT form only
|
||||
BarrelBlockEntity.startOpen port crates/horizon-client/src/game/block_entity_anims.rs::Game::barrel_openers_changed
|
||||
BarrelBlockEntity.stopOpen port crates/horizon-client/src/game/block_entity_anims.rs::Game::barrel_openers_changed
|
||||
BarrelBlockEntity.updateBlockState inline crates/horizon-client/src/game/block_entity_anims.rs::Game::barrel_openers_changed sets the open property when the count crosses zero
|
||||
BlockEntityTicker skip:java ticker combinator; Horizon ticks each block entity directly
|
||||
BlockEntityType.getBlockEntity skip:java factory that makes the block entity object for a state
|
||||
BlockEntityTypes skip:data registry
|
||||
BoundingBoxRenderable.RenderableBox skip:debug test box outline renderer
|
||||
CopperGolemStatueBlockEntity.createStatue port crates/horizon-client/src/game/copper_golems.rs::Game::golem_turn_to_statue gap: minor: the golem's custom name is not copied onto the statue
|
||||
CopperGolemStatueBlockEntity.getItem port crates/horizon-client/src/game/block_items.rs::Game::picked_stack statue pose on the picked item
|
||||
CopperGolemStatueBlockEntity.initCopperGolem port crates/horizon-client/src/game/copper_golems.rs::Game::use_golem_statue axe on an unaffected statue brings the golem back
|
||||
DecoratedPotPatterns skip:data bootstrap and asset registration
|
||||
EnchantingTableBlockEntity.bookAnimationTick port crates/horizon-client/src/block_entity_anim.rs::EnchantingBook::tick
|
||||
ListBackedContainer skip:java slot helpers over a plain list
|
||||
PotDecorations.addSideDetailsToTooltip port crates/horizon-client/src/item_tooltip.rs::TooltipDisplay::detail_lines sherd lines of the decorated pot tooltip
|
||||
PotDecorations.allBrick skip:data constant brick decoration set
|
||||
PotentSulfurBlockEntity.applyNauseaEffect missing player: standing in potent sulfur gas gives no nausea, since the geyser never erupts
|
||||
PotentSulfurBlockEntity.canBeReachedByNoxiousGas missing player: gas from a potent sulfur geyser never reaches players
|
||||
PotentSulfurBlockEntity.findNoxiousGasSourceBlock missing minor: helper of the geyser gas, not ported
|
||||
PotentSulfurBlockEntity.getNearbyLivingEntities missing minor: helper of the geyser gas, not ported
|
||||
PotentSulfurBlockEntity.getUnobstructedBlockCount missing minor: helper of the geyser gas, not ported
|
||||
PotentSulfurBlockEntity.geyserPositional missing player: no potent sulfur geyser eruption, so no geyser plume or sound
|
||||
PotentSulfurBlockEntity.haveLineOfSight missing minor: helper of the geyser gas, not ported
|
||||
PotentSulfurBlockEntity.isGeyserPassableBlock missing minor: helper of the geyser, not ported
|
||||
PotentSulfurBlockEntity.loadAdditional missing minor: the eruption timer is not loaded; Horizon keeps only the countdown in NBT
|
||||
PotentSulfurBlockEntity.setLevel missing minor: the eruption timer is not started on load
|
||||
PotentSulfurBlockEntity.spawnGeyserParticle missing player: no geyser particles over a potent sulfur block
|
||||
PotentSulfurBlockEntity.spawnNoxiousGasCloudParticle missing player: no noxious gas cloud particles over a potent sulfur block
|
||||
RandomizableContainerBlockEntity.applyImplicitComponents missing minor: a chest item does not hand its loot table back to the block
|
||||
RandomizableContainerBlockEntity.canOpen missing unsure: minor: the spectator and loot-table open checks were not found
|
||||
RandomizableContainerBlockEntity.collectImplicitComponents missing minor: a container does not save its loot table onto the item it drops
|
||||
RandomizableContainerBlockEntity.createMenu port crates/horizon-client/src/game.rs::Game::open_menu gap: minor: the spectator and loot-table checks are not ported here
|
||||
SculkSensorBlockEntity.loadAdditional port crates/horizon-client/src/sculk.rs::SculkEntity::load
|
||||
SculkSensorBlockEntity.saveAdditional port crates/horizon-client/src/sculk.rs::SculkEntity::to_nbt
|
||||
SculkSensorBlockEntity.VibrationUser.canReceiveVibration port crates/horizon-client/src/sculk.rs::valid_vibration
|
||||
SculkSensorBlockEntity.VibrationUser.onReceiveVibration port crates/horizon-client/src/sculk.rs::Data::schedule
|
||||
TestBlockEntity missing minor: game-test block entity; reset, trigger and logging are not ported, NBT only
|
||||
TestInstanceBlockEntity missing minor: game-test structure tooling; export and chunk forcing are not ported
|
||||
TrialSpawnerConfig.calculateTargetSimultaneousMobs port crates/horizon-client/src/mobs/trial_spawner.rs::TrialConfig::target_simultaneous_mobs
|
||||
TrialSpawnerConfig.calculateTargetTotalMobs port crates/horizon-client/src/mobs/trial_spawner.rs::TrialConfig::target_total_mobs
|
||||
TrialSpawnerConfig.withSpawning skip:java builder-style setter on the config record
|
||||
TrialSpawnerConfig.Builder skip:java builder for the trial config
|
||||
TrialSpawnerConfigs skip:data registry bootstrap and equipment spawn data
|
||||
SolidDebugger skip:debug debug dump of a block state
|
||||
StateDefinition skip:java codecs and state builders; states come from the generated block state table
|
||||
StateDefinition.Builder skip:java state builder
|
||||
StateDefinition.StateCollection skip:data neighbour tables of the state graph are generated data
|
||||
BlockInWorld skip:java accessor over the level's state and block entity
|
||||
BlockPattern.matches port crates/horizon-client/src/game/golems.rs::Game::find_golem golem head and body patterns only, not a generic pattern matcher
|
||||
BlockPattern.translateAndRotate inline crates/horizon-client/src/game/golems.rs::Game::find_golem pattern placement folded into golem search
|
||||
BlockPattern.BlockPatternMatch skip:java match result accessor
|
||||
BlockPatternBuilder skip:java builder for block patterns
|
||||
BlockStatePredicate skip:java predicate builder
|
||||
BooleanProperty skip:java property accessor
|
||||
ChestType skip:java enum helper
|
||||
EnumProperty skip:java property factory and hashing
|
||||
IntegerProperty skip:java property accessor
|
||||
BlockMatcher skip:java block scan helpers; Horizon scans with direct loops
|
||||
BoxBlockMatcher skip:java block scan helpers; Horizon scans with direct loops
|
||||
FilteredSectionCache skip:java section cache for block scans
|
||||
OrderedBlockMatcher skip:java block scan helpers; Horizon scans with direct loops
|
||||
BulkSectionAccess skip:java section cache for bulk writes
|
||||
ChunkGenerators skip:data bootstrap
|
||||
ChunkSource.hasChunk port crates/horizon-client/src/game.rs::GameLevel::is_loaded
|
||||
GlobalPalette skip:java palette storage; Horizon's chunk.rs keeps block ids in plain arrays
|
||||
HashMapPalette skip:java palette storage; Horizon's chunk.rs keeps block ids in plain arrays
|
||||
ImposterProtoChunk skip:other wrapper so the vanilla status pipeline can read a loaded chunk; streaming keeps its own protos
|
||||
LinearPalette skip:java palette storage; Horizon's chunk.rs keeps block ids in plain arrays
|
||||
PalettedContainerFactory skip:java factory for palette storage; Horizon's chunk.rs keeps block ids in plain arrays
|
||||
SingleValuePalette skip:java palette storage; Horizon's chunk.rs keeps block ids in plain arrays
|
||||
UpgradeData missing unsure: minor: block upgrades of old chunks on load are not ported
|
||||
ChunkDependencies.getRadiusOf inline crates/horizon-client/src/streaming.rs::Ranges::margins fixed margins instead of a per-status radius
|
||||
ChunkPyramid.Builder skip:java builder for the status pyramid; Horizon uses fixed margins
|
||||
ChunkStatusTasks.buildTerrain inline crates/horizon-world/src/worldgen/generator.rs::Pipeline::generate_with_context terrain pass
|
||||
ChunkStatusTasks.collectPossibleBiomes inline crates/horizon-world/src/worldgen/generator.rs::Pipeline::biome_chunk biome set folded into the biome pass
|
||||
ChunkStatusTasks.full skip:other turns the proto into the finished chunk; the generator returns the finished chunk
|
||||
ChunkStatusTasks.generateBiomes port crates/horizon-world/src/worldgen/generator.rs::Pipeline::biome_chunk
|
||||
ChunkStatusTasks.generateFeatures port crates/horizon-world/src/worldgen/generator_decoration.rs::Decoration::decorate
|
||||
ChunkStatusTasks.generateSpawn port crates/horizon-world/src/worldgen/spawn_finder.rs::find_spawn_position
|
||||
ChunkStatusTasks.generateStructureReferences port crates/horizon-world/src/worldgen/generator_structures.rs::StructureState::references
|
||||
ChunkStatusTasks.generateStructureStarts port crates/horizon-world/src/worldgen/generator_structures.rs::StructureState::starts_at
|
||||
ChunkStatusTasks.initializeLight port crates/horizon-client/src/light.rs::light_chunk
|
||||
ChunkStatusTasks.isLighted skip:other status check; streaming tracks which chunks are lit
|
||||
ChunkStep.apply inline crates/horizon-client/src/streaming.rs::Streaming::update stage advance
|
||||
ChunkStep.completeChunkGeneration inline crates/horizon-client/src/streaming.rs::Streaming::update final stage hand-over
|
||||
ChunkStep.getAccumulatedRadiusOf inline crates/horizon-client/src/streaming.rs::Ranges::margins fixed margins
|
||||
ChunkStep.Builder skip:java builder for chunk steps
|
||||
ChunkIOErrorReporter.createMisplacedChunkReport skip:other report text for a chunk saved at another position; Horizon logs its own load error
|
||||
RecreatingSimpleRegionStorage skip:java close: Rust closes the file on drop
|
||||
RegionFileStorage.cache port crates/horizon-client/src/save.rs::cached_region
|
||||
RegionFileStorage.close skip:java files close on drop
|
||||
RegionFileStorage.flush port crates/horizon-world/src/region.rs::RegionFile::sync
|
||||
RegionFileStorage.getRegionFile port crates/horizon-client/src/save.rs::cached_region
|
||||
RegionFileStorage.read port crates/horizon-world/src/region.rs::RegionFile::read
|
||||
RegionFileStorage.scanChunk port crates/horizon-client/src/save.rs::read_region_record
|
||||
RegionFileStorage.write port crates/horizon-world/src/region.rs::RegionFile::write
|
||||
|
@@ -0,0 +1,227 @@
|
||||
RegionFileVersion.configure missing minor: region-file-compression is read from server.properties (horizon-server-files properties.rs) but nothing applies it; chunk saves always write zlib (save.rs compress_records)
|
||||
RegionFileVersion.register skip:data static version table; Horizon's codecs are the Compression enum (compression.rs)
|
||||
RegionFileVersion.wrap port crates/horizon-world/src/compression.rs::Compression::encode whole-buffer codec; output side (input side is Compression::decode)
|
||||
RegionStorageInfo.withTypeSuffix port crates/horizon-client/src/save.rs::Folder::name folder name per region kind; only the fixed region, entities and poi folders exist, none is suffixed
|
||||
EntityLookup.add skip:java index insert; Horizon keeps entities in per-kind Vecs (game.rs) and a uuid map (game/persist.rs)
|
||||
EntityLookup.getEntities port crates/horizon-client/src/mobs/seen_grid.rs::SeenGrid::candidates gap: minor: returns mob candidates only (only mobs are indexed); callers test the boxes exactly
|
||||
EntityLookup.getEntity skip:java lookup by id or uuid over Horizon's per-kind lists and the uuid map
|
||||
EntityLookup.remove skip:java index removal; Horizon removes the entity from its per-kind list
|
||||
EntitySection skip:java section container; Horizon has no section index, only the mob grid (mobs/seen_grid.rs)
|
||||
EntitySectionStorage skip:java spatial section index; Horizon has no section storage, the mob grid is its only spatial index
|
||||
EntityTickList skip:java ticking list; Horizon ticks its per-kind Vecs in order (game.rs)
|
||||
LevelEntityGetterAdapter skip:java adapter over the section storage; no equivalent needed
|
||||
PersistentEntitySectionManager.addEntity skip:java section and visibility bookkeeping; Horizon spawns entities into its per-kind Vecs (game.rs)
|
||||
PersistentEntitySectionManager.addEntityUuid skip:java uuid set kept in persist.uuids (game/persist.rs)
|
||||
PersistentEntitySectionManager.addLegacyChunkEntities port crates/horizon-client/src/game/persist.rs::Game::spawn_loaded_entities saved chunk entity tags are spawned here once the chunk's entities arrive
|
||||
PersistentEntitySectionManager.addWorldGenChunkEntities port crates/horizon-client/src/game/persist.rs::Game::spawn_loaded_entities worldgen entities arrive as saved tags and are spawned the same way
|
||||
PersistentEntitySectionManager.canPositionTick port crates/horizon-client/src/ticket_levels.rs::Levels::entity_ticking_at a position ticks entities when its chunk is entity ticking
|
||||
PersistentEntitySectionManager.dumpSections skip:debug section dump for debugging
|
||||
PersistentEntitySectionManager.ensureChunkQueuedForLoad skip:other async load queue; Horizon's streaming hands the saved entity tags over with the chunk
|
||||
PersistentEntitySectionManager.gatherStats skip:debug statistics string
|
||||
PersistentEntitySectionManager.getAllChunksToSave inline crates/horizon-client/src/game/persist.rs::Game::save_entities the resident chunk keys that save_entities writes
|
||||
PersistentEntitySectionManager.processChunkUnload port crates/horizon-client/src/game/persist.rs::Game::unload_entities saves and removes the entities of an unloaded chunk
|
||||
PersistentEntitySectionManager.processUnloads inline crates/horizon-client/src/game/persist.rs::Game::unload_entities the batch of unloaded chunks handed over by the tick
|
||||
PersistentEntitySectionManager.requestChunkLoad port crates/horizon-client/src/save.rs::SaveDir::load_entities reads the saved entity record of the chunk; the chunk load itself is streaming
|
||||
PersistentEntitySectionManager.saveAll port crates/horizon-client/src/game/persist.rs::Game::save_entities the waiting form (quit path) writes every resident chunk and flushes
|
||||
PersistentEntitySectionManager.storeChunkSections port crates/horizon-client/src/game/persist.rs::Game::entity_chunks the saved entity tags of a chunk; with remove the entities leave the world
|
||||
PersistentEntitySectionManager.updateChunkStatus skip:other visibility per chunk status; Horizon derives entity ticking from ticket levels (ticket_levels.rs) instead of storing it
|
||||
PersistentEntitySectionManager.Callback.onMove skip:java section membership change; Horizon has no sections
|
||||
PersistentEntitySectionManager.Callback.onRemove port crates/horizon-client/src/game/persist.rs::Game::prune_entity_memory gap: minor: removal is batched; dead ids are dropped from persist memory on save, not per removal
|
||||
PersistentEntitySectionManager.Callback.updateStatus skip:other visibility changes are chunk ticket levels in Horizon (ticket_levels.rs)
|
||||
TransientEntitySectionManager skip:java sections for entities that are not saved; Horizon keeps them in its per-kind lists (game.rs)
|
||||
TransientEntitySectionManager.Callback skip:java section callbacks of the transient manager; no sections in Horizon
|
||||
DynamicGameEventListener.ifChunkExists port crates/horizon-client/src/game/sculk.rs::Game::sculk_listen a sensor in an unloaded chunk has no entity, so the listener is dropped
|
||||
DynamicGameEventListener.move skip:other listeners are fixed block positions in Horizon; sculk blocks do not move
|
||||
DynamicGameEventListener.remove port crates/horizon-client/src/game/sculk.rs::Game::sculk_sync_index drops the listener's index entry when its block is gone
|
||||
EntityPositionSource.getId skip:java accessor; Horizon's listeners hold the source as a Who (sculk.rs Info)
|
||||
EntityPositionSource.getPosition port crates/horizon-client/src/mobs/warden.rs::listen gap: minor: covers the warden's eye-height listener only; no other position source is used
|
||||
EntityPositionSource.getUuid skip:java accessor; Horizon holds the source as a Who
|
||||
EntityPositionSource.resolveEntity skip:other the source is a Who held by the listener, so there is no entity lookup to port
|
||||
EuclideanGameEventListenerRegistry.getPostableListenerPosition inline crates/horizon-client/src/game/sculk.rs::Game::post_game_event the in-range distance test that picks the listeners
|
||||
EuclideanGameEventListenerRegistry.register port crates/horizon-client/src/game/sculk.rs::Game::sculk_scan_chunk a sculk block found in a loaded chunk enters the index
|
||||
EuclideanGameEventListenerRegistry.sendDebugInfo skip:debug debug rendering of listeners
|
||||
EuclideanGameEventListenerRegistry.unregister port crates/horizon-client/src/game/sculk.rs::Game::sculk_sync_index index entries of removed sculk blocks are dropped
|
||||
EuclideanGameEventListenerRegistry.visitInRangeListeners port crates/horizon-client/src/game/sculk.rs::Game::post_game_event walks the index for listeners in range, then the wardens
|
||||
VibrationInfo.getEntity port crates/horizon-client/src/game/sculk.rs::Game::sculk_receive the source is held as a Who and read there
|
||||
VibrationInfo.getProjectileOwner port crates/horizon-client/src/game/sculk.rs::Game::sculk_receive the projectile owner is captured when posted (info.owner) and read there
|
||||
VibrationSelector.addCandidate port crates/horizon-client/src/sculk.rs::Selector::add_candidate
|
||||
VibrationSelector.chosenCandidate port crates/horizon-client/src/sculk.rs::Selector::chosen_candidate
|
||||
VibrationSelector.shouldReplaceVibration port crates/horizon-client/src/sculk.rs::Selector::should_replace
|
||||
GameRuleCategory.register skip:data static category table; Horizon's rule categories are static strings (gamerules.rs)
|
||||
GameRuleMap.equals skip:java value equality of the map
|
||||
GameRuleMap.of port crates/horizon-client-core/src/gamerules.rs::GameRules::get no stored map: a rule that was never set reads its table default
|
||||
GameRuleMap.setFromIf skip:other no caller in the pinned sources (only withOther uses it)
|
||||
GameRuleMap.withOther skip:other no caller in the pinned sources
|
||||
BlendingData missing player: in worlds upgraded from before 1.18 the old/new chunk border is not blended (datafix/fixes_c.rs drops blending_data), so a seam can show
|
||||
BlendingData.Packed.validateArraySize skip:java codec size check
|
||||
AllOfPredicate.test port crates/horizon-world/src/worldgen/block_predicate.rs::BlockPredicate::test_inner the All arm
|
||||
AnyOfPredicate.test port crates/horizon-world/src/worldgen/block_predicate.rs::BlockPredicate::test_inner the Any arm
|
||||
CombiningPredicate.codec skip:java codec
|
||||
HasSturdyFacePredicate.test port crates/horizon-world/src/worldgen/block_predicate.rs::BlockPredicate::test_inner the HasSturdyFace arm
|
||||
HeightRangePredicate.test port crates/horizon-world/src/worldgen/block_predicate.rs::BlockPredicate::test_inner the HeightRange arm
|
||||
StateTestingPredicate.stateTestingCodec skip:java codec
|
||||
VolumeMatchPredicate.test port crates/horizon-world/src/worldgen/block_predicate.rs::BlockPredicate::test_inner the Volume arm
|
||||
CanyonWorldCarver.carve port crates/horizon-world/src/worldgen/carver/canyon.rs::CanyonCarver::carve
|
||||
CanyonWorldCarver.doCarve inline crates/horizon-world/src/worldgen/carver/canyon.rs::CanyonCarver::carve the per-tunnel walk inside carve
|
||||
CanyonWorldCarver.initWidthFactors inline crates/horizon-world/src/worldgen/carver/canyon.rs::CanyonCarver::carve the width factors are built at the start of carve
|
||||
CanyonWorldCarver.shouldSkip inline crates/horizon-world/src/worldgen/carver/canyon.rs::CanyonCarver::carve the width-factor test in the carve_ellipsoid closure
|
||||
CanyonWorldCarver.updateVerticalRadius inline crates/horizon-world/src/worldgen/carver/canyon.rs::CanyonCarver::carve center-weighted vertical factor times the random 0.75 to 1.0 scale
|
||||
CaveWorldCarver.carve port crates/horizon-world/src/worldgen/carver.rs::CaveCarver::carve
|
||||
CaveWorldCarver.createRoom inline crates/horizon-world/src/worldgen/carver.rs::CaveCarver::carve the room branch of carve, which calls CaveRun::ellipsoid
|
||||
CaveWorldCarver.createTunnel port crates/horizon-world/src/worldgen/carver.rs::CaveRun::tunnel
|
||||
CaveWorldCarver.getThickness inline crates/horizon-world/src/worldgen/carver.rs::CaveCarver::carve thickness sample and the weird thickness bias
|
||||
CaveWorldCarver.shouldSkip inline crates/horizon-world/src/worldgen/carver.rs::CaveRun::ellipsoid the floor and unit sphere test in the skip closure
|
||||
WorldCarverTypes.bootstrap skip:data registry bootstrap; carvers are read from JSON (carver.rs, canyon.rs)
|
||||
DensityBuffer.copyFrom skip:java buffers are plain slices; the samplers copy slices directly
|
||||
DensityBufferPool skip:java buffer pool; Horizon's scratch Vecs in SamplerContext (density/mod.rs) play that role
|
||||
DensityFunction.axesFrom inline crates/horizon-core/src/density/graph/mod.rs::DensityGraph::domain_axes the axis bit (1 << axis) is set inline in the Gradient and Slice arms
|
||||
DensityFunction.pow port crates/horizon-world/src/worldgen/density.rs::Loader::decode the minecraft:pow token builds a Power node
|
||||
DensityFunctionCompiler.optimizeAndCompile port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::get_sampler optimize, then compile_raw, cached per function id
|
||||
DensityFunctionCompiler.prepareCache port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::prepare cache arm: compile the input, bind its range and axes
|
||||
DensityFunctionCompiler.reuseOrPrepareCache inline crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::prepare the prepared-map lookup in the cache arm
|
||||
DensityFunctions.ceil port crates/horizon-world/src/worldgen/density.rs::Loader::decode minecraft:ceil token; multiple defaults to 1
|
||||
DensityFunctions.floor port crates/horizon-world/src/worldgen/density.rs::Loader::decode minecraft:floor token; multiple defaults to 1
|
||||
DensityFunctions.lerp port crates/horizon-world/src/worldgen/density.rs::Loader::decode minecraft:lerp token
|
||||
DensityFunctions.mappedNoise skip:data bootstrap helper that composes noise and remap; Horizon reads the finished graph from data
|
||||
DensityFunctions.noise port crates/horizon-world/src/worldgen/density.rs::Loader::decode minecraft:noise token
|
||||
DensityFunctions.remap skip:data bootstrap composition of clamp and arithmetic; Horizon reads the finished graph from data
|
||||
DensityFunctions.round port crates/horizon-world/src/worldgen/density.rs::Loader::decode floor, round, ceil and truncate share one token arm
|
||||
DensityFunctions.truncate port crates/horizon-world/src/worldgen/density.rs::Loader::decode minecraft:truncate token in the same arm as floor, round and ceil
|
||||
DensityFunctions.HolderHolder.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children the Reference arm rewrites its input only
|
||||
DfRewriteRule.SliceUniformAxes.getExistingRemovedAxes inline crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::slice_uniform_axes the walk over existing slice nodes
|
||||
DfRewriteRule.SliceUniformAxes.removeAxes inline crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::slice_uniform_axes the remove mask and the X, Z, Y slice insertion
|
||||
DfRewriteRule.SliceUniformAxes.rewrite port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::slice_uniform_axes
|
||||
ScopedDensityBuffer.close port crates/horizon-core/src/density/mod.rs::SamplerContext::with_buffer the scratch buffer goes back when the scope ends
|
||||
ScopedDensityBuffer.restore skip:java reuse of a pooled buffer's size and flags; scratch Vecs are simply reused
|
||||
DistanceToPointFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw DistanceToPoint arm
|
||||
DistanceToPointFunction.Sampler.sampleValue port crates/horizon-core/src/density/terrain_noise.rs::DistanceToPointSampler::sample_value
|
||||
DistanceToPointFunction.Sampler.sampleVolume port crates/horizon-core/src/density/mod.rs::visit the trait default sample_volume, which visits each position
|
||||
EndIslandFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw EndIslands arm, islands from the seeded context
|
||||
EndIslandFunction.getHeightValue port crates/horizon-core/src/density/end_islands.rs::EndIslandSampler::height
|
||||
EndIslandFunction.Sampler.sampleValue port crates/horizon-core/src/density/end_islands.rs::EndIslandSampler::sample_value
|
||||
EndIslandFunction.Sampler.sampleVolume port crates/horizon-core/src/density/end_islands.rs::EndIslandSampler::sample_volume
|
||||
GradientFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Gradient arm builds a GradientSampler
|
||||
GradientFunction.validate port crates/horizon-world/src/worldgen/density.rs::Loader::decode the gradient arm rejects invalid coordinates
|
||||
GradientFunction.ClampedSampler.compute port crates/horizon-core/src/density/mod.rs::GradientSampler::compute clamped tiling
|
||||
GradientFunction.MirroredRepeatSampler.compute port crates/horizon-core/src/density/mod.rs::GradientSampler::compute mirrored repeat tiling
|
||||
GradientFunction.RepeatSampler.compute port crates/horizon-core/src/density/mod.rs::GradientSampler::compute repeat tiling
|
||||
NoiseFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Noise arm; nonzero shifts select the shifted sampler
|
||||
NoiseFunction.domainAxes port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::domain_axes
|
||||
NoiseFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
NoiseFunction.Sampler.sampleValue port crates/horizon-core/src/density/mod.rs::NoiseSampler::sample_value
|
||||
NoiseFunction.Sampler.sampleVolume port crates/horizon-core/src/density/mod.rs::NoiseSampler::sample_volume
|
||||
NoiseFunction.ShiftedXyzSampler.sampleValue port crates/horizon-core/src/density/mod.rs::ShiftedNoiseSampler::sample_value shift_y present
|
||||
NoiseFunction.ShiftedXyzSampler.sampleVolume port crates/horizon-core/src/density/mod.rs::ShiftedNoiseSampler::sample_volume shift_y present
|
||||
NoiseFunction.ShiftedXzSampler.sampleValue port crates/horizon-core/src/density/mod.rs::ShiftedNoiseSampler::sample_value shift_y absent
|
||||
NoiseFunction.ShiftedXzSampler.sampleVolume port crates/horizon-core/src/density/mod.rs::ShiftedNoiseSampler::sample_volume shift_y absent
|
||||
ShiftNoiseFunction.Shift.compileSampler port crates/horizon-core/src/density/terrain_noise.rs::compile_shift_noise
|
||||
ShiftNoiseFunction.ShiftA.compileSampler port crates/horizon-core/src/density/terrain_noise.rs::compile_shift_noise
|
||||
ShiftNoiseFunction.ShiftB.compileSampler port crates/horizon-core/src/density/terrain_noise.rs::compile_shift_noise ShiftB gets ShiftBSampler
|
||||
SimpleDensityFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw WorldField arm (blend alpha and offset, end islands)
|
||||
SimpleDensityFunction.domainAxes port crates/horizon-core/src/density/world_fields.rs::WorldField::domain_axes
|
||||
SimpleDensityFunction.range port crates/horizon-core/src/density/world_fields.rs::WorldField::range
|
||||
BinaryFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_binary constant operands become unary ops
|
||||
BinaryFunction.range port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::range Binary arm
|
||||
BinaryFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
BinaryFunction.warnNonIntersecting skip:debug log-only warning when min or max ranges never meet; Horizon returns the surviving side silently in compile_binary
|
||||
BinaryFunction.AddSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_value BinaryOp::Add
|
||||
BinaryFunction.AddSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_volume BinaryOp::Add
|
||||
BinaryFunction.ConstAddSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::Add with a constant
|
||||
BinaryFunction.ConstAddSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::Add with a constant
|
||||
BinaryFunction.ConstDivSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::DivideInto (constant over input)
|
||||
BinaryFunction.ConstDivSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::DivideInto
|
||||
BinaryFunction.ConstMaxSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::Maximum
|
||||
BinaryFunction.ConstMaxSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::Maximum
|
||||
BinaryFunction.ConstMinSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::Minimum
|
||||
BinaryFunction.ConstMinSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::Minimum
|
||||
BinaryFunction.ConstMulSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::Multiply (a constant divisor becomes 1/c, as in vanilla)
|
||||
BinaryFunction.ConstMulSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::Multiply
|
||||
BinaryFunction.ConstSubSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::SubtractFrom (constant minus input)
|
||||
BinaryFunction.ConstSubSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::SubtractFrom
|
||||
BinaryFunction.DivSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_value BinaryOp::Divide; a zero left gives zero
|
||||
BinaryFunction.DivSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_volume BinaryOp::Divide
|
||||
BinaryFunction.MaxSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_value BinaryOp::Maximum with the right-max shortcut
|
||||
BinaryFunction.MaxSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_volume BinaryOp::Maximum
|
||||
BinaryFunction.MinSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_value BinaryOp::Minimum with the right-min shortcut
|
||||
BinaryFunction.MinSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_volume BinaryOp::Minimum
|
||||
BinaryFunction.MulSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_value BinaryOp::Multiply; a zero left gives zero
|
||||
BinaryFunction.MulSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_volume BinaryOp::Multiply
|
||||
BinaryFunction.SubSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_value BinaryOp::Subtract
|
||||
BinaryFunction.SubSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::BinarySampler::sample_volume BinaryOp::Subtract
|
||||
BlendDensityFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
BlendDensityFunction.Sampler.sampleValue port crates/horizon-core/src/density/world_fields.rs::BlendDensitySampler::sample_value
|
||||
BlendDensityFunction.Sampler.sampleVolume port crates/horizon-core/src/density/world_fields.rs::BlendDensitySampler::sample_volume
|
||||
CacheFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children the cache node itself is prepared in DensityCompiler::prepare
|
||||
ClampFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Clamp arm: a UnarySampler with UnaryOp::Clamp
|
||||
ClampFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
ClampFunction.validate port crates/horizon-world/src/worldgen/density.rs::Loader::decode the clamp arm rejects max below min
|
||||
ClampFunction.Sampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::Clamp
|
||||
ClampFunction.Sampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::Clamp
|
||||
FindTopSurfaceFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Surface arm, built by compile_surface_search
|
||||
FindTopSurfaceFunction.range port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::range Surface arm
|
||||
FindTopSurfaceFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
FindTopSurfaceFunction.Sampler.findSurfaceFrom port crates/horizon-core/src/density/surface.rs::FindTopSurfaceSampler::find_surface_from
|
||||
FindTopSurfaceFunction.Sampler.sampleValue port crates/horizon-core/src/density/surface.rs::FindTopSurfaceSampler::sample_value
|
||||
FindTopSurfaceFunction.Sampler.sampleVolume port crates/horizon-core/src/density/surface.rs::FindTopSurfaceSampler::sample_volume
|
||||
InterpolatedFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Interpolated arm
|
||||
InterpolatedFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
InterpolatedFunction.Sampler.fillCell port crates/horizon-core/src/density/interpolation.rs::InterpolatedSampler::fill_cell
|
||||
InterpolatedFunction.Sampler.sampleValue port crates/horizon-core/src/density/interpolation.rs::InterpolatedSampler::sample_value
|
||||
InterpolatedFunction.Sampler.sampleVolume port crates/horizon-core/src/density/interpolation.rs::InterpolatedSampler::sample_volume
|
||||
InterpolatedFunction.Sampler.sampleWithBlockStep port crates/horizon-core/src/density/interpolation.rs::InterpolatedSampler::sample_block_volume
|
||||
InterpolatedFunction.Sampler.sampleWithNonBlockStep inline crates/horizon-core/src/density/interpolation.rs::InterpolatedSampler::sample_volume the sparse and arbitrary-step branches of sample_volume
|
||||
IntervalSelectFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw IntervalSelect arm
|
||||
IntervalSelectFunction.domainAxes port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::domain_axes
|
||||
IntervalSelectFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
IntervalSelectFunction.validate port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::insert the branch and threshold counts are checked when the node is inserted
|
||||
IntervalSelectFunction.Sampler.sampleValue port crates/horizon-core/src/density/selection.rs::IntervalSelectSampler::sample_value
|
||||
IntervalSelectFunction.Sampler.sampleVolume port crates/horizon-core/src/density/selection.rs::IntervalSelectSampler::sample_volume
|
||||
IntervalSelectFunction.Sampler.selectSamplerIndex port crates/horizon-core/src/density/selection.rs::IntervalSelectSampler::select
|
||||
IntervalSelectFunction.SingleThresholdSampler.sampleValue inline crates/horizon-core/src/density/selection.rs::IntervalSelectSampler::select no one-threshold class; the generic select covers it
|
||||
IntervalSelectFunction.SingleThresholdSampler.sampleVolume inline crates/horizon-core/src/density/selection.rs::IntervalSelectSampler::sample_volume no one-threshold class; the generic path covers it
|
||||
densityfunction/op/LerpFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Lerp arm; constant ends become DensityValue::Constant
|
||||
densityfunction/op/LerpFunction.domainAxes port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::domain_axes
|
||||
densityfunction/op/LerpFunction.range port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::range Lerp arm
|
||||
densityfunction/op/LerpFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
LerpFunction.ConstFirstSampler.sampleValue port crates/horizon-core/src/density/selection.rs::DensityValue::sample_value constant first end
|
||||
LerpFunction.ConstFirstSampler.sampleVolume port crates/horizon-core/src/density/selection.rs::DensityValue::with_volume constant first end
|
||||
LerpFunction.ConstSecondSampler.sampleValue port crates/horizon-core/src/density/selection.rs::DensityValue::sample_value constant second end
|
||||
LerpFunction.ConstSecondSampler.sampleVolume port crates/horizon-core/src/density/selection.rs::DensityValue::with_volume constant second end
|
||||
LerpFunction.Sampler.sampleValue port crates/horizon-core/src/density/selection.rs::LerpSampler::sample_value
|
||||
LerpFunction.Sampler.sampleVolume port crates/horizon-core/src/density/selection.rs::LerpSampler::sample_volume
|
||||
PowFunction.compileConstExponent port crates/horizon-core/src/density/power.rs::compile_constant_exponent 0.5, 1, 2, 3 and negatives get their own ops
|
||||
PowFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Power arm
|
||||
PowFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
PowFunction.ConstBaseSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::PowerBase
|
||||
PowFunction.ConstBaseSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::PowerBase
|
||||
PowFunction.ConstExponentSampler.sampleValue port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value UnaryOp::PowerExponent or the specialised ops
|
||||
PowFunction.ConstExponentSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::PowerExponent or the specialised ops
|
||||
PowFunction.Sampler.sampleValue port crates/horizon-core/src/density/power.rs::PowerSampler::sample_value
|
||||
PowFunction.Sampler.sampleVolume port crates/horizon-core/src/density/power.rs::PowerSampler::sample_volume
|
||||
RangeChoiceFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Choice arm; constant branches become UnaryOp::ConstantRangeChoice
|
||||
RangeChoiceFunction.domainAxes port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::domain_axes
|
||||
RangeChoiceFunction.range port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::range Choice arm
|
||||
RangeChoiceFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
RangeChoiceFunction.ConstSampler.choose port crates/horizon-core/src/density/arithmetic.rs::UnaryOp::apply UnaryOp::ConstantRangeChoice
|
||||
RangeChoiceFunction.ConstSampler.sampleVolume port crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume UnaryOp::ConstantRangeChoice
|
||||
RangeChoiceFunction.Sampler.sampleValue port crates/horizon-core/src/density/selection.rs::RangeChoiceSampler::sample_value
|
||||
RangeChoiceFunction.Sampler.sampleVolume port crates/horizon-core/src/density/selection.rs::RangeChoiceSampler::sample_volume
|
||||
RoundFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Round arm; a multiple of 1 skips the multiply
|
||||
RoundFunction.range port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::range Round arm
|
||||
RoundFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
RoundFunction.roundToInteger port crates/horizon-core/src/density/rounding.rs::RoundMode::apply the multiple-of-1 case
|
||||
RoundFunction.IntegerMultipleSampler.sampleValue port crates/horizon-core/src/density/rounding.rs::RoundSampler::sample_value multiple absent
|
||||
RoundFunction.IntegerMultipleSampler.sampleVolume port crates/horizon-core/src/density/rounding.rs::RoundSampler::sample_volume multiple absent
|
||||
RoundFunction.Sampler.apply port crates/horizon-core/src/density/rounding.rs::RoundMode::apply
|
||||
RoundFunction.Sampler.sampleValue port crates/horizon-core/src/density/rounding.rs::RoundSampler::sample_value
|
||||
RoundFunction.Sampler.sampleVolume port crates/horizon-core/src/density/rounding.rs::RoundSampler::sample_volume
|
||||
SliceFunction.compileSampler port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw Slice arm; an X and a Z slice fuse into one Xz sampler
|
||||
SliceFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
SliceFunction.XSampler.sampleVolume port crates/horizon-core/src/density/slice.rs::SliceSampler::sample_volume SliceAxes::X
|
||||
SliceFunction.XzSampler.sampleVolume port crates/horizon-core/src/density/slice.rs::SliceSampler::sample_volume SliceAxes::Xz
|
||||
SliceFunction.YSampler.sampleVolume port crates/horizon-core/src/density/slice.rs::SliceSampler::sample_volume SliceAxes::Y
|
||||
SliceFunction.ZSampler.sampleVolume port crates/horizon-core/src/density/slice.rs::SliceSampler::sample_volume SliceAxes::Z
|
||||
SplineFunction.domainAxes port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::domain_axes
|
||||
SplineFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children spline coordinates are children too (GraphNode::children_mut)
|
||||
SplineFunction.BufferSplineInput.close port crates/horizon-core/src/density/spline.rs::SplineSampler::sample_volume coordinate buffers go back to context.scratch when sample_volume ends
|
||||
SplineFunction.BufferSplineInput.sampleCoordinate port crates/horizon-core/src/density/spline.rs::SplineSampler::sample_volume each coordinate buffer is filled on first use
|
||||
|
@@ -0,0 +1,188 @@
|
||||
SplineFunction.PointSplineInput.sampleCoordinate inline crates/horizon-core/src/density/spline.rs::SplineSampler::sample_value per-point coordinate lookup in the sample closure
|
||||
SplineFunction.Sampler.sampleValue port crates/horizon-core/src/density/spline.rs::SplineSampler::sample_value
|
||||
SplineFunction.Sampler.sampleVolume port crates/horizon-core/src/density/spline.rs::SplineSampler::sample_volume
|
||||
UnaryFunction.compileSampler inline crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::compile_raw unary arm of compile_raw
|
||||
UnaryFunction.range port crates/horizon-core/src/density/graph/mod.rs::DensityGraph::range unary interval arm
|
||||
UnaryFunction.rewriteChildren port crates/horizon-core/src/density/graph/compiler.rs::DensityCompiler::rewrite_children
|
||||
UnaryFunction.AbsSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler; Abs is a UnaryOp arm
|
||||
UnaryFunction.CubeSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.LeakyReLUSampler.sampleValue inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value LeakyRelu arm of UnaryOp::apply
|
||||
UnaryFunction.LeakyReLUSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.LogSampler.sampleValue inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_value Log arm of UnaryOp::apply
|
||||
UnaryFunction.LogSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.NegateSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.ReciprocalSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.SignSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.SqrtSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.SquareSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
UnaryFunction.SqueezeSampler.apply inline crates/horizon-core/src/density/arithmetic.rs::UnaryOp::apply Squeeze arm
|
||||
UnaryFunction.SqueezeSampler.sampleVolume inline crates/horizon-core/src/density/arithmetic.rs::UnarySampler::sample_volume one generic unary sampler
|
||||
AbstractHugeMushroomFeature.getTreeHeight inline crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::place height roll at the start of place
|
||||
AbstractHugeMushroomFeature.isValidPosition inline crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::place base and clearance checks
|
||||
AbstractHugeMushroomFeature.place port crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::place
|
||||
AbstractHugeMushroomFeature.placeMushroomBlock port crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::place_block
|
||||
AbstractHugeMushroomFeature.placeTrunk inline crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::place stem loop
|
||||
AbstractOreFeature.canPlaceOre inline crates/horizon-world/src/worldgen/ore_feature.rs::OreFeature::do_place target rule test and air check in the block loop
|
||||
AbstractOreFeature.checkNeighbors inline crates/horizon-world/src/worldgen/ore_feature.rs::OreFeature::do_place six-neighbour air scan
|
||||
AbstractOreFeature.makeCodec skip:java codec builder
|
||||
AbstractOreFeature.shouldSkipAirCheck port crates/horizon-world/src/worldgen/ore_feature.rs::skip_air_check
|
||||
CoralClawFeature.place port crates/horizon-world/src/worldgen/vegetation.rs::CoralFeature::place
|
||||
CoralTreeFeature.place port crates/horizon-world/src/worldgen/vegetation.rs::CoralFeature::place
|
||||
CuboidPlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner Cuboid arm
|
||||
FeatureCountTracker skip:debug feature count debug log, no game behaviour
|
||||
HugeBrownMushroomFeature.makeCap inline crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::place non-red cap branch
|
||||
HugeRedMushroomFeature.getTreeRadiusForHeight port crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::radius_for_height
|
||||
HugeRedMushroomFeature.makeCap inline crates/horizon-world/src/worldgen/vegetation.rs::HugeMushroomFeature::place red cap loop
|
||||
ProjectedRandomPatchySquare.place port crates/horizon-world/src/worldgen/projected.rs::ProjectedPatchySquareFeature::place
|
||||
RandomBooleanSelectorFeature.getSubFeatures port crates/horizon-world/src/worldgen/live.rs::nested_features gap: minor: walks nested feature names from the JSON, not feature objects
|
||||
RandomBooleanSelectorFeature.place port crates/horizon-world/src/worldgen/feature_graph.rs::FeatureDefinition::evaluate BooleanChoice arm
|
||||
RandomNeighborSpreadFeature.place port crates/horizon-world/src/worldgen/feature_graph.rs::FeatureDefinition::evaluate NeighborSpread arm
|
||||
RandomSelectorFeature.getSubFeatures port crates/horizon-world/src/worldgen/live.rs::nested_features gap: minor: walks nested feature names from the JSON, not feature objects
|
||||
RandomSelectorFeature.place port crates/horizon-world/src/worldgen/feature_graph.rs::FeatureDefinition::evaluate RandomChoice arm
|
||||
SequenceFeature.getSubFeatures port crates/horizon-world/src/worldgen/live.rs::nested_features gap: minor: walks nested feature names from the JSON, not feature objects
|
||||
SequenceFeature.place port crates/horizon-world/src/worldgen/feature_graph.rs::FeatureDefinition::evaluate Sequence arm
|
||||
SimpleRandomSelectorFeature.getSubFeatures port crates/horizon-world/src/worldgen/live.rs::nested_features gap: minor: walks nested feature names from the JSON, not feature objects
|
||||
SimpleRandomSelectorFeature.place port crates/horizon-world/src/worldgen/feature_graph.rs::FeatureDefinition::evaluate RandomChoice arm (simple selector decodes there)
|
||||
SingleBlockPillarFeature.place port crates/horizon-world/src/worldgen/feature_graph.rs::FeatureDefinition::evaluate Pillar arm
|
||||
VoidStartPlatformFeature.place port crates/horizon-world/src/worldgen/feature.rs::BasicFeature::place VoidStartPlatform arm
|
||||
WeightedRandomSelectorFeature.getSubFeatures port crates/horizon-world/src/worldgen/live.rs::nested_features gap: minor: walks nested feature names from the JSON, not feature objects
|
||||
WeightedRandomSelectorFeature.place port crates/horizon-world/src/worldgen/feature_graph.rs::FeatureDefinition::evaluate WeightedChoice arm
|
||||
ThreeLayersFeatureSize.getSizeAtHeight port crates/horizon-world/src/worldgen/tree.rs::FeatureSize::size_at_height ThreeLayers arm
|
||||
AcaciaFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Acacia arm
|
||||
AcaciaFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip Acacia arm
|
||||
BlobFoliagePlacer.blobParts skip:java codec part builder
|
||||
BlobFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Blob arm
|
||||
BlobFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip Blob arm
|
||||
BushFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Bush arm
|
||||
BushFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip Bush arm
|
||||
CherryFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Cherry arm
|
||||
CherryFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip Cherry arm
|
||||
DarkOakFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage DarkOak arm
|
||||
DarkOakFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip DarkOak arm
|
||||
DarkOakFoliagePlacer.shouldSkipLocationSigned port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip_signed
|
||||
FancyFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Fancy arm
|
||||
FancyFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip Fancy arm
|
||||
MegaJungleFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage MegaJungle arm
|
||||
MegaJungleFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip MegaJungle arm
|
||||
MegaPineFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage MegaPine arm
|
||||
MegaPineFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip MegaPine arm
|
||||
PineFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Pine arm
|
||||
PineFoliagePlacer.foliageRadius port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::foliage_radius
|
||||
PineFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip Pine arm
|
||||
PoplarFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Poplar arm
|
||||
PoplarFoliagePlacer.getCornerBlocksToCutForRhombusShape port crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::corner_cut
|
||||
PoplarFoliagePlacer.isLeftLowerCornerOrRightTopCorner inline crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::corner_cut corner tests inlined in corner_cut
|
||||
PoplarFoliagePlacer.isLeftTopCornerOrRightLowerCorner inline crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::corner_cut corner tests inlined in corner_cut
|
||||
PoplarFoliagePlacer.isWithinRhombusShape port crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::within
|
||||
PoplarFoliagePlacer.placeLeavesRow port crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::row
|
||||
PoplarFoliagePlacer.replaceLeavesWithLog port crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::replace_with_log
|
||||
PoplarFoliagePlacer.shouldRowBePartialRhombusShape port crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::partial_row
|
||||
PoplarFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::skip
|
||||
PoplarFoliagePlacer.tryPlaceLog inline crates/horizon-world/src/worldgen/tree/foliage.rs::Poplar::replace_with_log log set inside the replace loop
|
||||
RandomSpreadFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage RandomSpread arm
|
||||
SpruceFoliagePlacer.createFoliage port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::create_foliage Spruce arm
|
||||
SpruceFoliagePlacer.shouldSkipLocation port crates/horizon-world/src/worldgen/tree/foliage.rs::FoliagePlacer::skip Spruce arm
|
||||
MangroveRootPlacer.canPlaceRoot port crates/horizon-world/src/worldgen/tree.rs::RootPlacer::can_place_root
|
||||
MangroveRootPlacer.placeRoot port crates/horizon-world/src/worldgen/tree.rs::RootPlacer::place_root
|
||||
MangroveRootPlacer.placeRoots port crates/horizon-world/src/worldgen/tree.rs::RootPlacer::place_roots
|
||||
MangroveRootPlacer.potentialRootPositions port crates/horizon-world/src/worldgen/tree.rs::RootPlacer::potential
|
||||
MangroveRootPlacer.simulateRoots port crates/horizon-world/src/worldgen/tree.rs::RootPlacer::simulate
|
||||
CopyPropertiesProvider.getState port crates/horizon-world/src/worldgen/state_provider.rs::BlockStateProvider::get_optional_state CopyProperties arm
|
||||
DualNoiseProvider.getSlowNoiseValue inline crates/horizon-world/src/worldgen/state_provider/noise.rs::NoiseProvider::sample slow noise sampled in the Dual arm
|
||||
DualNoiseProvider.getState port crates/horizon-world/src/worldgen/state_provider/noise.rs::NoiseProvider::sample Dual arm
|
||||
NoiseBasedStateProvider.getNoiseValue inline crates/horizon-world/src/worldgen/state_provider/noise.rs::NoiseProvider::sample fast noise sample shared by all noise kinds
|
||||
NoiseBasedStateProvider.noiseCodec skip:java codec builder
|
||||
NoiseThresholdProvider.getState port crates/horizon-world/src/worldgen/state_provider/noise.rs::NoiseProvider::sample Threshold arm
|
||||
RandomBlockProvider.getState port crates/horizon-world/src/worldgen/state_provider.rs::BlockStateProvider::get_optional_state RandomBlock arm
|
||||
RandomizedIntStateProvider.findProperty inline crates/horizon-world/src/worldgen/state_provider.rs::BlockStateProvider::get_optional_state property lookup in the RandomizedInt arm
|
||||
RandomizedIntStateProvider.getState port crates/horizon-world/src/worldgen/state_provider.rs::BlockStateProvider::get_optional_state RandomizedInt arm
|
||||
RotatedBlockProvider.getState port crates/horizon-world/src/worldgen/state_provider.rs::BlockStateProvider::get_optional_state Rotated arm
|
||||
RuleBasedStateProvider.builder skip:java builder API; Horizon decodes rule_based JSON
|
||||
RuleBasedStateProvider.getOptionalState port crates/horizon-world/src/worldgen/state_provider.rs::BlockStateProvider::get_optional_state RuleBased arm
|
||||
RuleBasedStateProvider.getState port crates/horizon-world/src/worldgen/state_provider.rs::BlockStateProvider::get_optional_state RuleBased arm
|
||||
RuleBasedStateProvider.ifTrueThenProvide skip:java builder API; Horizon decodes rule_based JSON
|
||||
RuleBasedStateProvider.Builder skip:java builder API; Horizon decodes rule_based JSON
|
||||
AlterGroundDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place AlterGround arm
|
||||
AlterGroundDecorator.placeBlockAt inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::circle single set inside the circle loop
|
||||
AlterGroundDecorator.placeCircle port crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::circle
|
||||
AttachedToLeavesDecorator.hasRequiredEmptyBlocks inline crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place required_empty check in AttachedToLeaves arm
|
||||
AttachedToLeavesDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place AttachedToLeaves arm
|
||||
AttachedToLogsDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place AttachedToLogs arm
|
||||
CocoaDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place Cocoa arm
|
||||
CreakingHeartDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place CreakingHeart arm
|
||||
LeaveVineDecorator.addHangingVine port crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::place_vine
|
||||
LeaveVineDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place LeaveVine arm
|
||||
PaleMossDecorator.addMossHanger port crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::moss_hanger
|
||||
PaleMossDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place PaleMoss arm
|
||||
PlaceOnGroundDecorator.attemptToPlaceBlockAbove inline crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place PlaceOnGround arm
|
||||
PlaceOnGroundDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place PlaceOnGround arm
|
||||
ShelfMushroomDecorator.hasHorizontallyAdjacentShelfMushroom port crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::adjacent_mushroom
|
||||
ShelfMushroomDecorator.isBlockReplaceableWithShelfMushroom port crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::mushroom_replaceable
|
||||
ShelfMushroomDecorator.isFallenLog inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom fallen-log test (all logs at one y)
|
||||
ShelfMushroomDecorator.isWithinDecoratableHeight inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom height offset 1 to 4 test
|
||||
ShelfMushroomDecorator.perpendicularToFallenLog inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom fallen-log facings
|
||||
ShelfMushroomDecorator.pickTwoPerpendicularDirections inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom standing-tree facings
|
||||
ShelfMushroomDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom
|
||||
ShelfMushroomDecorator.placeMushroom port crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::place_mushroom
|
||||
ShelfMushroomDecorator.placeOnFallenLog inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom fallen-log branch
|
||||
ShelfMushroomDecorator.placeOnStandingTree inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom standing-tree branch
|
||||
ShelfMushroomDecorator.tryPlaceMushroomOnFallenTree inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom fallen-log branch test and place
|
||||
ShelfMushroomDecorator.tryPlaceMushroomOnStandingTree inline crates/horizon-world/src/worldgen/tree/decorator.rs::Decorate::shelf_mushroom standing-tree branch test and place
|
||||
TrunkVineDecorator.place port crates/horizon-world/src/worldgen/tree/decorator.rs::TreeDecorator::place TrunkVine arm
|
||||
BendingTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::place_trunk Bending arm
|
||||
CherryTrunkPlacer.generateBranch inline crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::cherry branch loop in cherry
|
||||
CherryTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::cherry
|
||||
DarkOakTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::dark_oak
|
||||
FancyTrunkPlacer.getLogAxis port crates/horizon-world/src/worldgen/tree/trunk.rs::log_axis
|
||||
FancyTrunkPlacer.getSteps inline crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::make_limb step count inside make_limb
|
||||
FancyTrunkPlacer.makeBranches inline crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::fancy branch loop at the end of fancy
|
||||
FancyTrunkPlacer.makeLimb port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::make_limb
|
||||
FancyTrunkPlacer.treeShape port crates/horizon-world/src/worldgen/tree/trunk.rs::tree_shape
|
||||
FancyTrunkPlacer.trimBranches port crates/horizon-world/src/worldgen/tree/trunk.rs::trim_branches
|
||||
ForkingTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::forking
|
||||
GiantTrunkPlacer.placeLogIfFreeWithOffset port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::place_log_if_free gap: minor: the offset is added by giant before this call
|
||||
GiantTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::giant
|
||||
MegaJungleTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::place_trunk MegaJungle arm
|
||||
PoplarTrunkPlacer.getShuffledBranchDirections inline crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::place_trunk shuffle of horizontal directions in the Poplar arm
|
||||
PoplarTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::place_trunk Poplar arm
|
||||
StraightTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::place_trunk Straight arm
|
||||
UpwardsBranchingTrunkPlacer.placeBranch port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::upwards_branch
|
||||
UpwardsBranchingTrunkPlacer.placeTrunk port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::place_trunk UpwardsBranching arm
|
||||
UpwardsBranchingTrunkPlacer.validTreePos port crates/horizon-world/src/worldgen/tree/trunk.rs::TrunkPlacer::valid_tree_pos
|
||||
FlatLayerInfo.heightLimited missing minor: no per-layer clamp to the max height; flat settings only cap the total at the build height
|
||||
FlatLayerInfo.toString skip:debug debug text
|
||||
FlatLevelGeneratorPresets.Bootstrap skip:data registry bootstrap of the preset list
|
||||
BiasedToBottomHeight.sample port crates/horizon-world/src/worldgen/height_provider.rs::HeightProvider::sample BiasedToBottom arm
|
||||
TrapezoidHeight.of skip:java factory helper; Horizon decodes the trapezoid JSON
|
||||
TrapezoidHeight.sample port crates/horizon-world/src/worldgen/height_provider.rs::HeightProvider::sample Trapezoid arm
|
||||
TrapezoidHeight.toString skip:debug debug text
|
||||
UniformHeight.sample port crates/horizon-world/src/worldgen/height_provider.rs::HeightProvider::sample Uniform arm
|
||||
VeryBiasedToBottomHeight.sample port crates/horizon-world/src/worldgen/height_provider.rs::HeightProvider::sample VeryBiasedToBottom arm
|
||||
MaterialRules skip:data rule builders for the vanilla surface-rule bootstrap; Horizon reads the material rule JSON
|
||||
BiomeCondition.canNeverMatch inline crates/horizon-world/src/worldgen/material_condition.rs::Compiled::compile Biome arm, constant false when biomes are disjoint
|
||||
BiomeCondition.compile port crates/horizon-world/src/worldgen/material_condition.rs::Compiled::compile Biome arm
|
||||
BiomeCondition.willAlwaysMatch inline crates/horizon-world/src/worldgen/material_condition.rs::Compiled::compile Biome arm, constant true when biomes are a subset
|
||||
NoiseThresholdCondition.compile port crates/horizon-world/src/worldgen/material_condition.rs::Compiled::compile Noise arm
|
||||
NotCondition.compile port crates/horizon-world/src/worldgen/material_condition.rs::Compiled::compile Not arm
|
||||
StoneDepthCondition.compile port crates/horizon-world/src/worldgen/material_condition.rs::Compiled::compile keeps the StoneDepth config; the depth test is Compiled::test
|
||||
VerticalGradientCondition.compile port crates/horizon-world/src/worldgen/material_condition.rs::Compiled::compile Gradient arm
|
||||
ConditionRule.compile port crates/horizon-world/src/worldgen/material_condition/rule.rs::CompiledRule::compile Condition arm
|
||||
OreVeinRule.compile port crates/horizon-world/src/worldgen/material_condition/rule.rs::CompiledRule::compile OreVein arm
|
||||
OreVeinRule.VeinType.create skip:data factory the bootstrap uses for vein rules; Horizon reads the ore vein JSON
|
||||
SequenceRule.compile port crates/horizon-world/src/worldgen/material_condition/rule.rs::CompiledRule::compile Sequence arm
|
||||
BiomeFilter.shouldPlace port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner Biome arm
|
||||
CountOnEveryLayerPlacement.findOnGroundYPosition port crates/horizon-world/src/worldgen/placement/layer.rs::ground
|
||||
CountOnEveryLayerPlacement.isEmpty inline crates/horizon-world/src/level/feature_world.rs::LevelFeatureWorld::layer_block empty layer test (air, water, lava)
|
||||
CountOnEveryLayerPlacement.modify port crates/horizon-world/src/worldgen/placement/layer.rs::modify
|
||||
EnvironmentScanPlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner EnvironmentScan arm
|
||||
EnvironmentScanPlacement.scanningFor skip:java factory helper; Horizon decodes the environment_scan JSON
|
||||
FixedPlacement.isSameChunk inline crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner chunk test in the Fixed arm
|
||||
FixedPlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner Fixed arm
|
||||
HeightmapPlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner Heightmap arm
|
||||
InSquarePlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner InSquare arm
|
||||
NoiseBasedCountPlacement.count port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::repetitions NoiseBasedCount arm
|
||||
NoiseThresholdCountPlacement.count port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::repetitions NoiseThresholdCount arm
|
||||
OffsetPlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner Offset arm
|
||||
OffsetPlacement.of skip:java factory helper; Horizon decodes the offset JSON
|
||||
RandomlySelectedPlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner RandomlySelected arm
|
||||
RarityFilter.shouldPlace port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner Rarity arm
|
||||
|
@@ -0,0 +1,189 @@
|
||||
RepeatingPlacement.modify port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner repeat arm for Count and the noise counts emits the count
|
||||
SurfaceRelativeThresholdFilter.shouldPlace port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner SurfaceRelative arm: y between heightmap plus min and max
|
||||
SurfaceWaterDepthFilter.shouldPlace port crates/horizon-world/src/worldgen/placement.rs::PlacementModifier::modify_inner SurfaceWaterDepth arm
|
||||
WorldPreset skip:data data-pack preset record; bundled world_presets carry the dimensions and generator.rs builds one dimension by name
|
||||
WorldPresets.fromSettings skip:data names a preset from its dimensions; Horizon loads presets by name
|
||||
WorldPresets.getNormalOverworld port crates/horizon-world/src/worldgen/generator.rs::OverworldGenerator::new builds the normal preset's overworld directly; no LevelStem object
|
||||
WorldPresets.Bootstrap skip:data datagen bootstrap that registers the presets
|
||||
SinglePieceStructure.findGenerationPoint port crates/horizon-world/src/worldgen/structure/start.rs::try_generate DesertPyramid/JungleTemple arm: valid biome, sea-level check, stub on the surface
|
||||
SinglePieceStructure.generatePieces port crates/horizon-world/src/worldgen/structure/start.rs::try_generate same arm builds the piece at the chunk corner
|
||||
structure/StructureCheck.canCreateStructure port crates/horizon-world/src/worldgen/structure/start.rs::try_generate no start when the arm returns None
|
||||
structure/StructureCheck.checkStart missing player: an explorer map (skip_existing_chunks, default on) can point at a structure the player already reached; the reference check is not ported
|
||||
structure/StructureCheck.checkStructureInfo missing player: requireUnreferenced is ignored, so explorer maps do not skip known structures (see checkStart)
|
||||
structure/StructureCheck.incrementReference missing player: no reference counts per chunk, so explorer maps do not skip structures already reached
|
||||
structure/StructureCheck.loadStructures skip:other reads saved starts for the storage cache; Horizon places saved starts with use_saved_start
|
||||
structure/StructureCheck.onStructureLoad missing player: starts loaded in a chunk do not record references (see incrementReference)
|
||||
structure/StructureCheck.storeFullResults skip:other cache write for the storage check
|
||||
structure/StructureCheck.tryLoadFromStorage skip:other chunk NBT scan for the storage cache; Horizon places saved starts with use_saved_start
|
||||
PiecesContainer.isInsidePiece inline crates/horizon-world/src/worldgen/generator_decoration.rs::World::add_entity start-piece box test that feeds the mob finalize hook
|
||||
PiecesContainer.load port crates/horizon-world/src/worldgen/generator_structures.rs::StructureState::use_saved_start gap: minor: only jigsaw pool pieces are read back; legacy piece types are not
|
||||
PiecesContainer.save port crates/horizon-world/src/worldgen/structure/start.rs::StructureStart::save writes the Children list of the start
|
||||
StructurePieceSerializationContext skip:java record bundling server services for piece NBT; Horizon passes its resources explicitly
|
||||
StructurePiecesBuilder.moveBelowSeaLevel inline crates/horizon-world/src/worldgen/structure/mineshaft.rs::generate sea-level drop of the pieces; stronghold::generate has the same step
|
||||
StructurePiecesBuilder.offsetPiecesVertically inline crates/horizon-world/src/worldgen/structure/mineshaft.rs::generate moves every piece by the same dy
|
||||
AbstractSpreadingStructurePlacement.applyAdditionalChunkRestrictions inline crates/horizon-world/src/worldgen/structure/start.rs::StructureRegistry::structure_chunk frequency reduction step of the chunk test
|
||||
AbstractSpreadingStructurePlacement.applyInteractionsWithOtherStructures inline crates/horizon-world/src/worldgen/structure/start.rs::StructureRegistry::structure_chunk exclusion zone and avoid checks
|
||||
AbstractSpreadingStructurePlacement.isStructureChunk port crates/horizon-world/src/worldgen/structure/start.rs::StructureRegistry::is_structure_chunk
|
||||
AbstractSpreadingStructurePlacement.legacyArbitrarySaltProbabilityReducer port crates/horizon-world/src/worldgen/structure/start.rs::reduce Legacy2 arm
|
||||
AbstractSpreadingStructurePlacement.legacyPillagerOutpostReducer port crates/horizon-world/src/worldgen/structure/start.rs::reduce Legacy1 arm
|
||||
AbstractSpreadingStructurePlacement.legacyProbabilityReducerWithDouble port crates/horizon-world/src/worldgen/structure/start.rs::reduce Legacy3 arm
|
||||
AbstractSpreadingStructurePlacement.probabilityReducer port crates/horizon-world/src/worldgen/structure/start.rs::reduce Default arm
|
||||
ConcentricRingsStructurePlacement.isPlacementChunk port crates/horizon-world/src/worldgen/structure/start.rs::StructureRegistry::structure_chunk ConcentricRings arm: chunk must be in the set's ring positions
|
||||
DimensionOriginStructurePlacement missing minor: dimension_origin placement decodes as Unsupported in start.rs, so such a structure never places; no bundled structure file in the repo uses it
|
||||
RandomSpreadType.evaluate inline crates/horizon-world/src/worldgen/structure/start.rs::StructureRegistry::potential_chunk spread closure: linear, or triangular as the mean of two draws
|
||||
StructurePlacements skip:data registers placement codecs; Horizon decodes placement type names in start.rs
|
||||
FeaturePoolElement.getBoundingBox port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::bounding_box Feature arm, zero size
|
||||
FeaturePoolElement.getShuffledJigsawBlocks port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::shuffled_jigsaws Feature arm: one rollable empty jigsaw
|
||||
JigsawJunction.equals skip:java value equality
|
||||
JigsawJunction.hashCode skip:java hashing for Java collections
|
||||
JigsawJunction.toString skip:debug debug text
|
||||
LegacySinglePoolElement.getSettings port crates/horizon-world/src/worldgen/structure/jigsaw.rs::place_element Single arm, legacy branch: structure-block ignore is replaced by structure and air ignore after jigsaw replacement
|
||||
ListPoolElement.getBoundingBox port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::bounding_box List arm, skips empty elements
|
||||
ListPoolElement.getShuffledJigsawBlocks port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::shuffled_jigsaws List arm: first element only
|
||||
ListPoolElement.getSize port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::size List arm: per-axis maximum
|
||||
ListPoolElement.place port crates/horizon-world/src/worldgen/structure/jigsaw.rs::place_element List arm
|
||||
ListPoolElement.setProjectionOnEachElement port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::decode children take the list's projection while decoding
|
||||
ListPoolElement.toString skip:debug debug text
|
||||
StructurePoolElement.getProjection port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::projection
|
||||
StructurePoolElement.legacy port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::decode legacy_single_pool_element kind
|
||||
StructurePoolElement.single port crates/horizon-world/src/worldgen/structure/jigsaw.rs::PoolElement::decode single_pool_element kind
|
||||
StructureTemplatePool.<init> port crates/horizon-world/src/worldgen/structure/jigsaw.rs::Pools::get builds each Pool from its raw templates
|
||||
StructureTemplatePool.getMaxSize port crates/horizon-world/src/worldgen/structure/jigsaw.rs::Pool::max_size
|
||||
StructureTemplatePool.getRandomTemplate port crates/horizon-world/src/worldgen/structure/jigsaw.rs::Pool::random_template
|
||||
PoolAliasBinding.direct port crates/horizon-world/src/worldgen/structure/start.rs::resolve_aliases minecraft:direct arm
|
||||
PoolAliasBinding.random port crates/horizon-world/src/worldgen/structure/start.rs::resolve_aliases minecraft:random arm: weighted pick
|
||||
PoolAliasBindings skip:data datagen bootstrap that registers alias targets as pools
|
||||
RandomGroupPoolAlias.allTargets skip:data lists alias targets for bootstrap registration
|
||||
RandomGroupPoolAlias.forEachResolved port crates/horizon-world/src/worldgen/structure/start.rs::resolve_aliases minecraft:random_group arm
|
||||
BuriedTreasureStructure.generatePieces port crates/horizon-world/src/worldgen/structure/start.rs::try_generate BuriedTreasure arm
|
||||
EndCityStructure.findGenerationPoint port crates/horizon-world/src/worldgen/structure/start.rs::try_generate EndCity arm: biome column and height checks
|
||||
EndCityStructure.generatePieces port crates/horizon-world/src/worldgen/structure/start.rs::try_generate EndCity arm calls end_city::pieces
|
||||
IglooStructure.findGenerationPoint port crates/horizon-world/src/worldgen/structure/start.rs::try_generate Igloo arm
|
||||
IglooStructure.generatePieces port crates/horizon-world/src/worldgen/structure/start.rs::try_generate Igloo arm
|
||||
JigsawStructure.findGenerationPoint port crates/horizon-world/src/worldgen/structure/start.rs::try_generate Jigsaw arm: start height, checks, assembly
|
||||
JigsawStructure.verifyRange skip:java codec validation of the size limit
|
||||
NetherFortressPieces.findAndCreateBridgePieceFactory port crates/horizon-world/src/worldgen/structure/fortress.rs::Builder::create Kind dispatch to the bridge piece
|
||||
NetherFortressPieces.PieceWeight.doPlace inline crates/horizon-world/src/worldgen/structure/fortress.rs::Builder::generate_piece placement check: max is 0 or count below max
|
||||
NetherFortressPieces.PieceWeight.isValid inline crates/horizon-world/src/worldgen/structure/fortress.rs::Builder::generate_piece entry is dropped once count reaches max
|
||||
OceanMonumentPieces.FitDoubleXRoom.create inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleX branch of the layout chain
|
||||
OceanMonumentPieces.FitDoubleXRoom.fits inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleX branch condition
|
||||
OceanMonumentPieces.FitDoubleXYRoom.create inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleXY branch of the layout chain
|
||||
OceanMonumentPieces.FitDoubleXYRoom.fits inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleXY branch condition
|
||||
OceanMonumentPieces.FitDoubleYRoom.create inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleY branch of the layout chain
|
||||
OceanMonumentPieces.FitDoubleYRoom.fits inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleY branch condition
|
||||
OceanMonumentPieces.FitDoubleYZRoom.create inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleYZ branch of the layout chain
|
||||
OceanMonumentPieces.FitDoubleYZRoom.fits inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleYZ branch condition
|
||||
OceanMonumentPieces.FitDoubleZRoom.create inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleZ branch of the layout chain
|
||||
OceanMonumentPieces.FitDoubleZRoom.fits inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new DoubleZ branch condition
|
||||
OceanMonumentPieces.FitSimpleTopRoom.fits inline crates/horizon-world/src/worldgen/structure/monument.rs::MonumentBuilding::new SimpleTop branch: no openings
|
||||
OceanMonumentPieces.OceanMonumentCoreRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room Core arm
|
||||
OceanMonumentPieces.OceanMonumentDoubleXRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room DoubleX arm
|
||||
OceanMonumentPieces.OceanMonumentDoubleXYRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room DoubleXY arm
|
||||
OceanMonumentPieces.OceanMonumentDoubleYRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room DoubleY arm
|
||||
OceanMonumentPieces.OceanMonumentDoubleYZRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room DoubleYZ arm
|
||||
OceanMonumentPieces.OceanMonumentDoubleZRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room DoubleZ arm
|
||||
OceanMonumentPieces.OceanMonumentEntryRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room Entry arm
|
||||
OceanMonumentPieces.OceanMonumentPenthouse.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room Penthouse arm
|
||||
OceanMonumentPieces.OceanMonumentSimpleRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room Simple arm
|
||||
OceanMonumentPieces.OceanMonumentSimpleTopRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room SimpleTop arm
|
||||
OceanMonumentPieces.OceanMonumentWingRoom.postProcess port crates/horizon-world/src/worldgen/structure/monument.rs::room Wing arms
|
||||
OceanMonumentPieces.RoomDefinition.countOpenings inline crates/horizon-world/src/worldgen/structure/monument.rs::room count of open sides inside the Simple arm
|
||||
OceanMonumentPieces.RoomDefinition.findSource port crates/horizon-world/src/worldgen/structure/monument.rs::Graph::find_source
|
||||
OceanMonumentPieces.RoomDefinition.setConnection port crates/horizon-world/src/worldgen/structure/monument.rs::Graph::connect
|
||||
OceanMonumentPieces.RoomDefinition.updateOpenings port crates/horizon-world/src/worldgen/structure/monument.rs::Graph::update_openings
|
||||
OceanRuinStructure.findGenerationPoint port crates/horizon-world/src/worldgen/structure/start.rs::try_generate OceanRuin arm
|
||||
OceanRuinStructure.generatePieces port crates/horizon-world/src/worldgen/structure/start.rs::try_generate OceanRuin arm
|
||||
ShipwreckStructure.findGenerationPoint port crates/horizon-world/src/worldgen/structure/start.rs::try_generate Shipwreck arm: world surface when beached
|
||||
ShipwreckStructure.generatePieces port crates/horizon-world/src/worldgen/structure/start.rs::try_generate Shipwreck arm, including the too-big height
|
||||
SwampHutStructure.generatePieces port crates/horizon-world/src/worldgen/structure/start.rs::try_generate SwampHut arm
|
||||
AllOfRuleTest.test port crates/horizon-world/src/worldgen/rule_test.rs::RuleTest::test All arm
|
||||
AnyOfRuleTest.test port crates/horizon-world/src/worldgen/rule_test.rs::RuleTest::test Any arm
|
||||
AxisAlignedLinearPosTest.test port crates/horizon-world/src/worldgen/structure/processor.rs::PosRule::test Linear arm with an axis
|
||||
BlockAgeProcessor.getRandomBlock inline crates/horizon-world/src/worldgen/structure/processor.rs::block_age random pick inside the mossy branch
|
||||
BlockAgeProcessor.getRandomFacingStairs inline crates/horizon-world/src/worldgen/structure/processor.rs::block_age random stairs with facing, inside the stairs branch
|
||||
BlockAgeProcessor.maybeReplaceFullStoneBlock inline crates/horizon-world/src/worldgen/structure/processor.rs::block_age full stone branch
|
||||
BlockAgeProcessor.maybeReplaceSlab inline crates/horizon-world/src/worldgen/structure/processor.rs::block_age slab branch
|
||||
BlockAgeProcessor.maybeReplaceStairs inline crates/horizon-world/src/worldgen/structure/processor.rs::block_age stairs branch
|
||||
BlockAgeProcessor.maybeReplaceWall inline crates/horizon-world/src/worldgen/structure/processor.rs::block_age wall branch
|
||||
BlockAgeProcessor.processBlock port crates/horizon-world/src/worldgen/structure/processor.rs::process_block BlockAge arm calls block_age
|
||||
BlockIgnoreProcessor.processBlock port crates/horizon-world/src/worldgen/structure/processor.rs::process_block BlockIgnore arm
|
||||
BlockRotProcessor.processBlock port crates/horizon-world/src/worldgen/structure/processor.rs::process_block BlockRot arm
|
||||
CappedProcessor.finalizeProcessing inline crates/horizon-world/src/worldgen/structure/processor.rs::process_infos post-pass over the Capped processors, after the block loop
|
||||
GravityProcessor.processBlock port crates/horizon-world/src/worldgen/structure/processor.rs::process_block Gravity arm
|
||||
HeightMatchTest.test port crates/horizon-world/src/worldgen/rule_test.rs::RuleTest::test Height arm
|
||||
LavaSubmergedBlockProcessor.processBlock port crates/horizon-world/src/worldgen/structure/processor.rs::process_block LavaSubmerged arm
|
||||
LinearPosTest.test port crates/horizon-world/src/worldgen/structure/processor.rs::PosRule::test Linear arm
|
||||
NotRuleTest.test port crates/horizon-world/src/worldgen/rule_test.rs::RuleTest::test Not arm
|
||||
ProcessorRule.test port crates/horizon-world/src/worldgen/structure/processor.rs::process_block Rule arm: input, location and position tests
|
||||
ProtectedBlockProcessor.processBlock port crates/horizon-world/src/worldgen/structure/processor.rs::process_block Protected arm
|
||||
RandomBlockMatchTest.test port crates/horizon-world/src/worldgen/rule_test.rs::RuleTest::test RandomStates arm
|
||||
RandomBlockStateMatchTest.test port crates/horizon-world/src/worldgen/rule_test.rs::RuleTest::test RandomState arm
|
||||
RuleProcessor.processBlock port crates/horizon-world/src/worldgen/structure/processor.rs::process_block Rule arm
|
||||
RuleTest.either skip:java builder over allOf, anyOf and not; bundled data holds the expanded form
|
||||
DirectoryTemplateSource skip:data loads templates from a datapack folder; Horizon reads its prepared template bundle (structure.rs StructureResources::template)
|
||||
ResourceManagerTemplateSource skip:data loads templates through the resource manager; Horizon reads its prepared template bundle
|
||||
TemplatePathFactory skip:data builds file paths for template loading; Horizon reads a prepared bundle
|
||||
TemplateSource skip:data template file loading and SNBT reading; Horizon reads a prepared bundle
|
||||
AppendLoot.apply port crates/horizon-world/src/worldgen/structure/processor.rs::Modifier::apply AppendLoot arm
|
||||
AppendStatic.apply port crates/horizon-world/src/worldgen/structure/processor.rs::Modifier::apply AppendStatic arm
|
||||
GradientNoise.wrap port crates/horizon-core/src/noise/mod.rs::wrap Far Lands off
|
||||
GradientNoise.Gradient.dot port crates/horizon-core/src/noise/mod.rs::dot 3D dot of a gradient
|
||||
GradientNoise.Gradient.dotXz inline crates/horizon-core/src/noise/perlin.rs::SmearedPerlinNoise::get2 2D dot: get2 samples the 3D corner dots at y 0; no separate dotXz
|
||||
LegacyFbmInitializer.createForLegacyNetherBiome port crates/horizon-core/src/noise/normal.rs::create_legacy_fbm
|
||||
NoiseUtils.biasTowardsExtreme skip:other no caller in the vanilla 26.3 sources
|
||||
NoiseUtils.parityNoiseOctaveConfigString skip:debug debug text
|
||||
BlockLightEngine.checkNode inline crates/horizon-client/src/light.rs::relight_layer neighbour checks in both passes
|
||||
BlockLightEngine.getEmission port crates/horizon-client/src/light.rs::LightTables::emission
|
||||
BlockLightEngine.propagateDecrease port crates/horizon-client/src/light.rs::relight_layer decrease pass, sky false
|
||||
BlockLightEngine.propagateIncrease port crates/horizon-client/src/light.rs::relight_layer increase pass, sky false
|
||||
BlockLightEngine.propagateLightSources inline crates/horizon-client/src/light.rs::relight_layer emission seeds for cleared cells
|
||||
BlockLightSectionStorage.getLightValue port crates/horizon-client/src/light.rs::level
|
||||
DataLayerStorageMap skip:java cache of light data layers keyed by section
|
||||
DynamicGraphMinFixedPoint.checkEdge inline crates/horizon-client/src/light.rs::relight_layer edge test inside the passes
|
||||
DynamicGraphMinFixedPoint.checkNeighbor inline crates/horizon-client/src/light.rs::relight_layer neighbour test inside the passes
|
||||
DynamicGraphMinFixedPoint.removeFromQueue skip:java queue bookkeeping; the passes never remove queued entries
|
||||
DynamicGraphMinFixedPoint.removeIf skip:java queue bookkeeping
|
||||
DynamicGraphMinFixedPoint.runUpdates port crates/horizon-client/src/light.rs::relight_layer runs the decrease and increase passes
|
||||
LayerLightSectionStorage skip:other per-section light data bookkeeping; Horizon keeps light in chunk sections (light.rs apply_lighting, light_chunk)
|
||||
LayerLightSectionStorage.SectionState skip:other section state flags of the light storage; no Horizon equivalent needed
|
||||
LeveledPriorityQueue skip:java priority queue of light levels; relight_layer runs two FIFO passes
|
||||
SkyLightEngine.addSourcesAbove inline crates/horizon-client/src/light.rs::relight_region column sources loop
|
||||
SkyLightEngine.checkNode inline crates/horizon-client/src/light.rs::relight_layer neighbour checks in the sky passes
|
||||
SkyLightEngine.countEmptySectionsBelowIfAtBorder skip:java shortcut over empty sections; Horizon relights a region directly
|
||||
SkyLightEngine.crossedSectionEdge port crates/horizon-client/src/light.rs::LightChanges::class edge flags of a changed cell
|
||||
SkyLightEngine.getChunkSources skip:java per-chunk source cache; lowest_sky_source computes each column on demand
|
||||
SkyLightEngine.getLowestSourceY port crates/horizon-client/src/light.rs::lowest_sky_source
|
||||
SkyLightEngine.propagateDecrease port crates/horizon-client/src/light.rs::relight_layer decrease pass, sky true
|
||||
SkyLightEngine.propagateFromEmptySections inline crates/horizon-client/src/light.rs::relight_region sky seeds below the source in each column
|
||||
SkyLightEngine.propagateIncrease port crates/horizon-client/src/light.rs::relight_layer increase pass, sky true
|
||||
SkyLightEngine.propagateLightSources inline crates/horizon-client/src/light.rs::relight_layer sky sources inside the cleared area
|
||||
SkyLightEngine.removeSourcesBelow inline crates/horizon-client/src/light.rs::relight_region column sources loop
|
||||
SkyLightEngine.setLightEnabled skip:other light is computed when a chunk loads (light_chunk); no per-chunk enable flag
|
||||
SkyLightSectionStorage skip:other sky data layer bookkeeping per section; Horizon keeps light in chunk sections
|
||||
SkyLightSectionStorage.SkyDataLayerStorageMap skip:java copy of sky data layers; collection plumbing
|
||||
SpatialLongSet.InternalMap skip:java hash set internals for section positions
|
||||
NodeEvaluator.getNode port crates/horizon-client/src/mobs/path.rs::Finder::node
|
||||
NodeEvaluator.getPathType port crates/horizon-client/src/mobs/path.rs::Finder::path_type
|
||||
NodeEvaluator.getTargetNodeAt port crates/horizon-client/src/mobs/path.rs::Finder::node target lookup is the same arena lookup
|
||||
NodeEvaluator.prepare port crates/horizon-client/src/mobs/path.rs::Finder::new per-query state
|
||||
PathTypeCache.compute port crates/horizon-client/src/mobs/path.rs::Finder::compute_path_type
|
||||
PathTypeCache.get port crates/horizon-client/src/mobs/path.rs::Finder::cached
|
||||
PathTypeCache.getOrCompute port crates/horizon-client/src/mobs/path.rs::Finder::cached
|
||||
PathTypeCache.invalidate skip:java the cache lives for one query, so nothing is invalidated
|
||||
SwimNodeEvaluator.findAcceptedNode port crates/horizon-client/src/mobs/path.rs::Finder::swim_accepted
|
||||
SwimNodeEvaluator.getCachedBlockType port crates/horizon-client/src/mobs/path.rs::Finder::cached
|
||||
SwimNodeEvaluator.getNeighbors port crates/horizon-client/src/mobs/path.rs::Finder::swim_neighbors
|
||||
SwimNodeEvaluator.getPathTypeOfMob port crates/horizon-client/src/mobs/path.rs::Finder::path_type_of_mob
|
||||
SwimNodeEvaluator.getStart port crates/horizon-client/src/mobs/path.rs::Finder::start Swim arm
|
||||
SwimNodeEvaluator.hasMalus inline crates/horizon-client/src/mobs/path.rs::Finder::swim_neighbors diagonal check on both sides
|
||||
CollectingNeighborUpdater.addAndRun port crates/horizon-world/src/level/update.rs::Sim::add_and_run
|
||||
CollectingNeighborUpdater.neighborChanged port crates/horizon-world/src/level/update.rs::Sim::neighbor_changed_at Simple update
|
||||
CollectingNeighborUpdater.runUpdates port crates/horizon-world/src/level/update.rs::Sim::run_updates
|
||||
CollectingNeighborUpdater.shapeUpdate port crates/horizon-world/src/level/update.rs::Sim::neighbor_shape_changed
|
||||
CollectingNeighborUpdater.updateNeighborsAtExceptFromFacing port crates/horizon-world/src/level/update.rs::Sim::update_neighbors_at_except
|
||||
CollectingNeighborUpdater.FullNeighborUpdate.runNext port crates/horizon-world/src/level/update.rs::Update::next Full arm
|
||||
CollectingNeighborUpdater.MultiNeighborUpdate.forEachUpdatedPos inline crates/horizon-world/src/level/update.rs::Update::next Multi arm steps the index and skips the facing side
|
||||
CollectingNeighborUpdater.MultiNeighborUpdate.runNext port crates/horizon-world/src/level/update.rs::Update::next Multi arm
|
||||
CollectingNeighborUpdater.ShapeUpdate.runNext port crates/horizon-world/src/level/update.rs::Update::next Shape arm
|
||||
CollectingNeighborUpdater.SimpleNeighborUpdate.runNext port crates/horizon-world/src/level/update.rs::Update::next Simple arm
|
||||
ExperimentalRedstoneUtils.initialOrientation skip:other returns null unless the Redstone Experiments feature flag is on; Horizon has no such flag
|
||||
|
@@ -0,0 +1,154 @@
|
||||
ExperimentalRedstoneWireEvaluator missing minor: only worlds with the Redstone Experiments flag use this evaluator; Horizon has no experimental wire evaluator
|
||||
InstantNeighborUpdater skip:other never instantiated in vanilla 26.3; Level always uses CollectingNeighborUpdater
|
||||
NeighborUpdater.executeShapeUpdate port crates/horizon-world/src/level/update.rs::Sim::execute Shape arm: wire skip flag, then update_shape and update_or_destroy
|
||||
NeighborUpdater.executeUpdate port crates/horizon-world/src/level/hooks.rs::Sim::neighbor_changed per-block neighbour change dispatch
|
||||
NeighborUpdater.updateNeighborsAtExceptFromFacing port crates/horizon-world/src/level/update.rs::Sim::update_neighbors_at_except
|
||||
Orientation.<init> skip:java constructor of the experimental redstone orientation value
|
||||
Orientation.generateContext missing minor: builds the orientation lookup of the experimental wire evaluator only
|
||||
Orientation.generateIndex skip:java index arithmetic for the orientation table
|
||||
Orientation.toString skip:debug debug string
|
||||
Orientation.withFrontAdjustSideBias missing minor: experimental redstone orientation transform; only the experimental evaluator uses it
|
||||
Orientation.withFrontPreserveUp missing minor: experimental redstone orientation transform; only the experimental evaluator uses it
|
||||
RedstoneWireEvaluator.getIncomingWireSignal port crates/horizon-world/src/level/redstone.rs::Sim::wire_incoming_signal
|
||||
RedstoneWireEvaluator.getWireSignal port crates/horizon-world/src/level/redstone.rs::Sim::wire_power_of
|
||||
SavedDataType skip:java equals over the saved-data type record; Horizon keys saved data by name
|
||||
WanderingTraderData.setSpawnChance inline crates/horizon-client/src/game/wandering_trader.rs::Game::tick_wandering_trader field write of spawn_chance inside the tick; no setter
|
||||
WanderingTraderData.setSpawnDelay inline crates/horizon-client/src/game/wandering_trader.rs::Game::tick_wandering_trader field write of spawn_delay inside the tick; no setter
|
||||
MapBanner.fromWorld missing player: using a map on a placed banner adds no banner marker to the map (MapItem.useOn toggle is not ported)
|
||||
MapBanner.getDecoration missing player: banner markers would show the dye colour icon; maps.rs has no banner decoration types
|
||||
MapBanner.getId missing minor: key string of a banner marker, only used by the marker feature
|
||||
MapDecorationTypes skip:data registry of map decoration types; maps.rs keeps its own DECORATION_TYPES table
|
||||
MapId.addToTooltip missing player: map tooltips show no 'Map #id', 'Locked' or advanced scale lines
|
||||
MapIndex.getNextMapId port crates/horizon-client/src/game/maps.rs::Game::next_map_id
|
||||
DerivedLevelData skip:debug crash report category
|
||||
LevelData skip:debug crash report category
|
||||
LevelStorageSource.createAccess port crates/horizon-client/src/save.rs::SessionLock::acquire gap: minor: takes the folder's session lock; there is no separate access object
|
||||
LevelStorageSource.createDefault skip:java factory for the source with its symlink validator
|
||||
LevelStorageSource.findLevelCandidates inline crates/horizon-client/src/title.rs::list_worlds folders with a readable level.dat
|
||||
LevelStorageSource.getFileModificationTime inline crates/horizon-client/src/title.rs::list_worlds level.dat mtime, used when LastPlayed is absent
|
||||
LevelStorageSource.getLevelDataAndDimensions port crates/horizon-client/src/save.rs::Level::read gap: minor: reads level.dat; dimension and world-gen registry setup happen elsewhere
|
||||
LevelStorageSource.isNewLevelIdAcceptable port crates/horizon-client/src/title.rs::Title::target_folder gap: minor: sanitises the name and picks a free folder instead of rejecting it
|
||||
LevelStorageSource.levelExists inline crates/horizon-client/src/title.rs::Title::target_folder folder-exists check
|
||||
LevelStorageSource.loadLevelSummaries port crates/horizon-client/src/title.rs::list_worlds
|
||||
LevelStorageSource.makeLevelSummary inline crates/horizon-client/src/title.rs::list_worlds per-folder name, version, mode and last played
|
||||
LevelStorageSource.parseFeatureFlagsFromSummary missing unsure: list_worlds does not read enabled_features, so experimental worlds are not flagged
|
||||
LevelStorageSource.parseValidator skip:other symlink allow-list (allowed_symlinks.txt); Horizon does not read that file
|
||||
LevelStorageSource.readDataConfig missing minor: the world's own enabled datapacks and features are not read back from level.dat
|
||||
LevelSummary.backupStatus missing player: opening a world from an older version gives no 'back up first' prompt; the upgrade runs straight away (world_loading.rs)
|
||||
LevelSummary.compareTo inline crates/horizon-client/src/title.rs::list_worlds newest first by last played
|
||||
LevelSummary.createInfo missing unsure: row status text (locked, needs conversion) is not carried in WorldEntry
|
||||
LevelSummary.getLevelName inline crates/horizon-client/src/title.rs::list_worlds WorldEntry.name
|
||||
LevelSummary.getWorldVersionName inline crates/horizon-client/src/title.rs::list_worlds WorldEntry.version from Version.Name
|
||||
LevelSummary.isDisabled missing unsure: list_worlds drops folders whose level.dat does not read instead of showing them disabled
|
||||
LevelVersion.parse inline crates/horizon-client/src/title.rs::list_worlds reads Version.Name only
|
||||
PrimaryLevelData.createTag port crates/horizon-client/src/save.rs::Level::write
|
||||
PrimaryLevelData.setModdedInfo inline crates/horizon-client/src/save.rs::Level::write gap: minor: writes WasModded 0 and the brand list; there is no modded save state
|
||||
PrimaryLevelData.stringCollectionToTag inline crates/horizon-client/src/save.rs::Level::write ServerBrands and DataPacks lists
|
||||
PrimaryLevelData.writeLastPlayed inline crates/horizon-client/src/save.rs::Level::write LastPlayed
|
||||
PrimaryLevelData.writeVersionHistory inline crates/horizon-client/src/save.rs::Level::write version_history
|
||||
PrimaryLevelData.writeVersionTag inline crates/horizon-client/src/save.rs::Level::write Version compound
|
||||
ServerLevelData skip:debug crash report category
|
||||
TagValueInput skip:java NBT read helpers; Horizon reads Tag values directly
|
||||
TagValueInput.CompoundListWrapper skip:java NBT list wrapper; Horizon reads Tag values directly
|
||||
TagValueInput.ListWrapper skip:java NBT list wrapper; Horizon reads Tag values directly
|
||||
TagValueInput.TypedListWrapper skip:java NBT list wrapper; Horizon reads Tag values directly
|
||||
TagValueOutput skip:java NBT write helpers; Horizon writes Tag values directly
|
||||
TagValueOutput.ListWrapper skip:java NBT write wrapper
|
||||
TagValueOutput.TypedListWrapper skip:java NBT write wrapper
|
||||
WorldData skip:debug crash report category
|
||||
BuiltInLootTables.register skip:data registers built-in loot table keys; Horizon reads tables from data files
|
||||
ContainerComponentManipulator missing minor: set_contents and modify_contents, which no vanilla loot table uses
|
||||
ContainerComponentManipulator.ComponentSlotCollection missing minor: slot helpers of set_contents and modify_contents, which no vanilla loot table uses
|
||||
FloatRangePredicate.Line.createPredicate missing minor: float range with number-provider bounds; Horizon does not evaluate these bounds
|
||||
FloatRangePredicate.Line.test missing minor: float range check with number-provider bounds
|
||||
FloatRangePredicate.Line.validate skip:data validation at datapack load
|
||||
IntLimit.createLimiter port crates/horizon-world/src/loot.rs::Context::run gap: minor: limit_count arm reads literal min and max only
|
||||
IntLimit.validate skip:data validation at datapack load
|
||||
IntRangePredicate.Line.createPredicate inline crates/horizon-world/src/loot.rs::int_bounds gap: minor: literal bounds only; number-provider bounds are not evaluated
|
||||
IntRangePredicate.Line.test port crates/horizon-world/src/loot.rs::int_bounds gap: minor: literal bounds only
|
||||
IntRangePredicate.Line.validate skip:data validation at datapack load
|
||||
LootContextArg.ArgCodecBuilder skip:java codec builders for context arguments
|
||||
LootContextArg.Getter.get skip:java codec getter for a context argument
|
||||
LootDataType skip:data validation of loot data at datapack load
|
||||
LootParams.addDynamicDrops port crates/horizon-client/src/game/spill.rs::Pending::dynamic gap: minor: decorated pot sherds only; shulker contents are attached by Pending::attach
|
||||
LootParams.Builder skip:java builder for loot params
|
||||
Validatable skip:data validation at datapack load
|
||||
ValidationContext skip:data validation at datapack load
|
||||
ValidationContextSource skip:data validation at datapack load
|
||||
AlternativesEntry.alternatives skip:java builder
|
||||
AlternativesEntry.compose port crates/horizon-world/src/loot.rs::Context::expand alternatives arm
|
||||
AlternativesEntry.validate skip:data validation at datapack load
|
||||
ComposableEntryContainer skip:java container combinators; Horizon expands entries in Context::expand
|
||||
CompositeEntryBase.createCodec skip:java codec
|
||||
CompositeEntryBase.validate skip:data validation at datapack load
|
||||
DynamicLoot.dynamicEntry skip:java builder
|
||||
EntryGroup.compose port crates/horizon-world/src/loot.rs::Context::expand group arm
|
||||
ExpandableContainerBase.expandRaw inline crates/horizon-world/src/loot.rs::Context::expand expansion of raw entries
|
||||
ExpandableContainerBase.expandableFields skip:java codec fields
|
||||
NestedLootTable.addExpandedEntries inline crates/horizon-world/src/loot.rs::Context::expand loot_table arm
|
||||
NestedLootTable.lootTableReference skip:java codec factory
|
||||
SequentialEntry.compose port crates/horizon-world/src/loot.rs::Context::expand sequence arm
|
||||
SlotLoot.createItemStack missing minor: slot entries (copies of container slot items); no vanilla loot table uses one
|
||||
UniformContainerBase.uniformFields skip:java codec fields
|
||||
UniformContainerBase.DummyBuilder.build skip:java builder
|
||||
UniformContainerBase.EntryBase.getWeight inline crates/horizon-world/src/loot.rs::Context::add_random_item weight with luck, in add_random_item
|
||||
ApplyBonusCount.addBonusBinomialDistributionCount skip:java builder
|
||||
ApplyBonusCount.addUniformBonusCount skip:java builder
|
||||
ApplyBonusCount.run port crates/horizon-items/src/items.rs::LootContext::modifiers apply_bonus arm
|
||||
ApplyBonusCount.BinomialWithBonusCount.calculateNewCount inline crates/horizon-items/src/items.rs::LootContext::modifiers binomial_with_bonus_count formula
|
||||
ApplyBonusCount.OreDrops.calculateNewCount inline crates/horizon-items/src/items.rs::LootContext::modifiers ore_drops formula
|
||||
ApplyBonusCount.UniformBonusCount.calculateNewCount inline crates/horizon-items/src/items.rs::LootContext::modifiers uniform_bonus_count formula
|
||||
ApplyExplosionDecay.run port crates/horizon-items/src/items.rs::LootContext::modifiers explosion_decay arm
|
||||
CopyBlockState.run port crates/horizon-items/src/items.rs::LootContext::modifiers copy_state arm; copies the listed properties
|
||||
CopyBlockState.Builder skip:java builder (build, copy)
|
||||
CopyComponentsFunction.run port crates/horizon-client/src/game/spill.rs::Pending::record gap: minor: copies only what spill.rs keeps for block entities (shulker, banner, names, heads, bees)
|
||||
CopyComponentsFunction.Builder skip:java builder (build, exclude, include)
|
||||
CopyCustomDataFunction.run missing minor: no vanilla loot table or item modifier uses copy_custom_data
|
||||
CopyCustomDataFunction.copyData skip:java builder factory
|
||||
CopyCustomDataFunction.Builder.copy skip:java builder
|
||||
CopyCustomDataFunction.CopyOperation.apply missing minor: part of copy_custom_data, which is not ported
|
||||
CopyNameFunction.run missing minor: no vanilla loot table uses copy_name
|
||||
EnchantedCountIncreaseFunction.run port crates/horizon-world/src/loot.rs::Context::run enchanted_count_increase arm
|
||||
EnchantedCountIncreaseFunction.Builder.build skip:java builder
|
||||
FillPlayerHead.run missing minor: no vanilla loot table uses fill_player_head
|
||||
FilteredFunction.run port crates/horizon-world/src/loot.rs::Context::run filtered arm
|
||||
FilteredFunction.Builder.build skip:java builder
|
||||
FunctionUserBuilder skip:java builder interface (apply, buildFunction)
|
||||
LimitCount.run port crates/horizon-world/src/loot.rs::Context::run gap: minor: limit_count arm reads literal min and max only
|
||||
LootItemConditionalFunction.apply port crates/horizon-world/src/loot.rs::Context::modify condition check, then run
|
||||
LootItemConditionalFunction.commonFields skip:java codec fields
|
||||
LootItemFunction.decorate port crates/horizon-world/src/loot.rs::Context::modify function applied to a drop
|
||||
ModifyContainerContents.run missing minor: no vanilla loot table uses modify_contents
|
||||
SequenceFunction.compose port crates/horizon-world/src/loot.rs::Context::run sequence arm
|
||||
SetAttributesFunction missing minor: set_attributes is not ported; no vanilla loot table uses it
|
||||
SetAttributesFunction.ModifierBuilder.build skip:java builder
|
||||
SetBannerPatternFunction.run missing minor: banner pattern layers from loot are not set; no vanilla loot table uses set_banner_pattern
|
||||
SetBannerPatternFunction.Builder skip:java builder
|
||||
SetBookCoverFunction.apply missing minor: no vanilla loot table uses set_book_cover
|
||||
SetComponentsFunction.run port crates/horizon-client/src/game/commands/items.rs::Game::apply_item_modifier gap: player: only /item modify runs it; loot tables (trial chamber copper trim) do not apply the components
|
||||
SetComponentsFunction.setComponent skip:java builder factory
|
||||
SetContainerContents.run missing minor: no vanilla loot table uses set_contents
|
||||
SetContainerContents.Builder skip:java builder
|
||||
SetContainerLootTable missing minor: no vanilla loot table uses set_loot_table
|
||||
SetCustomDataFunction.run port crates/horizon-client/src/game/commands/items.rs::Game::apply_item_modifier gap: minor: only /item modify runs it; no loot table uses set_custom_data
|
||||
SetCustomModelDataFunction.apply missing minor: custom_model_data changes from loot; no vanilla loot table uses it
|
||||
SetCustomModelDataFunction.run missing minor: custom_model_data changes from loot; no vanilla loot table uses it
|
||||
SetCustomModelDataFunction.validate skip:data validation at datapack load
|
||||
SetEnchantmentsFunction.run port crates/horizon-world/src/loot.rs::Context::run set_enchantments arm
|
||||
SetEnchantmentsFunction.validate skip:data validation at datapack load
|
||||
SetEnchantmentsFunction.Builder skip:java builder
|
||||
SetFireworkExplosionFunction.apply missing minor: no vanilla loot table uses set_firework_explosion
|
||||
SetFireworksFunction.apply missing minor: no vanilla loot table uses set_fireworks
|
||||
SetInstrumentFunction.run port crates/horizon-world/src/loot.rs::Context::run gap: player: only draws the random option; the goat horn's instrument component is never set (pillager outpost horns)
|
||||
SetItemCountFunction.run port crates/horizon-world/src/loot.rs::Context::run set_count arm
|
||||
SetItemCountFunction.setCount skip:java builder factory
|
||||
SetItemDamageFunction.run port crates/horizon-world/src/loot.rs::Context::run set_damage arm
|
||||
SetItemDamageFunction.setDamage skip:java builder factory
|
||||
SetLoreFunction.run port crates/horizon-client/src/game/commands/items.rs::Game::apply_item_modifier gap: minor: only /item modify runs set_lore; no loot table uses it
|
||||
SetLoreFunction.updateLore inline crates/horizon-client/src/game/commands/items.rs::Game::apply_item_modifier set_lore arm, list_operation
|
||||
SetLoreFunction.getReferencedContextParams skip:data validation of referenced context params
|
||||
SetLoreFunction.Builder skip:java builder
|
||||
SetOminousBottleAmplifierFunction.run port crates/horizon-world/src/loot.rs::Context::run set_ominous_bottle_amplifier arm
|
||||
SetRandomDyesFunction.run port crates/horizon-client/src/merchant.rs::Trades::apply_modifier set_random_dyes arm
|
||||
SetRandomPotionFunction.run port crates/horizon-client/src/merchant.rs::Trades::apply_modifier set_random_potion arm
|
||||
SetStewEffectFunction.run port crates/horizon-world/src/loot.rs::Context::run set_stew_effect arm
|
||||
|
@@ -0,0 +1,156 @@
|
||||
SetStewEffectFunction.Builder skip:java builder for the stew effect list; Horizon keeps the effects in loot.rs Context::run (set_stew_effect)
|
||||
SetWritableBookPagesFunction missing minor: no vanilla loot table uses set_writable_book_pages; Horizon's loot run has no arm for it
|
||||
SetWrittenBookPagesFunction missing minor: no vanilla loot table uses set_written_book_pages; Horizon's loot run has no arm for it
|
||||
SmeltItemFunction.run port crates/horizon-world/src/loot.rs::Context::run furnace_smelt arm: smelting recipe, use_input_count and stack cap
|
||||
SmeltItemFunction.smelted skip:java static builder factory
|
||||
ToggleTooltips missing minor: no vanilla loot table uses toggle_tooltips; Horizon's loot run has no arm for it
|
||||
LootContextParamSets skip:data loot parameter set registry and validation; Horizon reads its loot tables
|
||||
AllOfCondition.allOf skip:java static builder
|
||||
AllOfCondition.combine inline crates/horizon-items/src/items.rs::LootContext::condition all_of arm: every term must hold
|
||||
AnyOfCondition.combine inline crates/horizon-items/src/items.rs::LootContext::condition any_of arm: one term must hold
|
||||
AnyOfCondition.Builder skip:java builder (or)
|
||||
BonusLevelTableCondition.bonusLevelFlatChance skip:java static builder
|
||||
BonusLevelTableCondition.test port crates/horizon-items/src/items.rs::LootContext::condition table_bonus arm: chance by enchantment level, capped at the last entry
|
||||
CompositeLootItemCondition skip:java codec only
|
||||
CompositeLootItemCondition.Builder skip:java builder (addTerm)
|
||||
ConditionUserBuilder skip:java builder interface for loot conditions
|
||||
DamageSourceCondition.test port crates/horizon-world/src/loot.rs::Context::condition damage_source_properties arm (mob death loot)
|
||||
EnchantmentActiveCheck.test inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed the soul speed modifiers switch on and off here; the ENCHANTMENT_ACTIVE flag itself is not read as a condition
|
||||
EntityHasScoreCondition.hasScore missing minor: no vanilla loot table uses entity_scores
|
||||
EntityHasScoreCondition.test missing minor: no vanilla loot table uses entity_scores
|
||||
EntityHasScoreCondition.validate skip:data datapack validation
|
||||
EnvironmentAttributeCheck.createCodec skip:java codec
|
||||
EnvironmentAttributeCheck.test missing minor: no vanilla data uses environment_attribute_check
|
||||
ExplosionCondition.test port crates/horizon-items/src/items.rs::LootContext::condition survives_explosion arm: 1 / radius under an explosion (block loot; only block tables use it)
|
||||
FloatValueCheck.validate skip:data datapack validation
|
||||
IntValueCheck.validate skip:data datapack validation
|
||||
InvertedLootItemCondition.invert skip:java static builder
|
||||
InvertedLootItemCondition.test port crates/horizon-world/src/loot.rs::Context::condition inverted arm
|
||||
LocationCheck.checkLocation skip:java static builder
|
||||
LocationCheck.test port crates/horizon-world/src/loot.rs::Context::condition gap: minor: biome lists only; block predicate and offsetY are not read here, and block loot (items.rs) passes location_check unconditionally
|
||||
LootItemCondition.Builder skip:java builders (and, or)
|
||||
LootItemEntityPropertyCondition.hasProperties skip:java static builder
|
||||
LootItemEntityPropertyCondition.test port crates/horizon-world/src/loot.rs::Context::condition entity_properties arm (mob loot); the block-loot arm covers only a bare 'this' check
|
||||
LootItemRandomChanceCondition.test port crates/horizon-world/src/loot.rs::Context::condition random_chance arm
|
||||
LootItemRandomChanceWithEnchantedBonusCondition.randomChanceAndLootingBoost skip:java static builder
|
||||
LootItemRandomChanceWithEnchantedBonusCondition.test port crates/horizon-world/src/loot.rs::Context::condition random_chance_with_enchanted_bonus arm: living attacker's enchantment level
|
||||
LootPredicates skip:data registry bootstrap; loot conditions are matched in loot.rs and items.rs
|
||||
MatchBlock.blockMatches skip:java static builder
|
||||
MatchBlock.getReferencedContextParams skip:data validation metadata for context params
|
||||
MatchBlock.test port crates/horizon-items/src/items.rs::LootContext::condition match_block arm: block id, state and property ranges; gap: minor: the block-entity part of the predicate is not read
|
||||
MatchTool.test port crates/horizon-items/src/items.rs::LootContext::condition match_tool arm; gap: minor: item ids, tags and enchantment levels only, other ItemPredicate parts are not read
|
||||
TimeCheck missing minor: time_check is used by no vanilla data file (datapacks only)
|
||||
WeatherCheck.test port crates/horizon-client/src/game/trident.rs::Game::channel_lightning channeling's thunder check (thundering only); gap: minor: raining is not read, channeling only uses thundering
|
||||
NbtProviders skip:data registry bootstrap
|
||||
AggregateProvider skip:java codec only
|
||||
BinaryProvider.mapCodec skip:java codec
|
||||
BinaryProvider.validate skip:data datapack validation
|
||||
ConditionalProvider.selectValue port crates/horizon-client/src/game/commands/compute.rs::Game::provider_select conditional arm: on_true or on_false by the condition
|
||||
DispatcherProvider.mapCodec skip:java codec
|
||||
DispatcherProvider.selectValue port crates/horizon-client/src/game/commands/compute.rs::Game::provider_select number_dispatcher arm: first case whose condition holds, else default
|
||||
DispatcherProvider.validate skip:data datapack validation
|
||||
DispatcherProvider.Case.codec skip:java codec
|
||||
DispatcherProvider.Case.validate skip:data datapack validation
|
||||
DistributionProvider.mapCodec skip:java codec
|
||||
DistributionProvider.validate skip:data datapack validation
|
||||
EnvironmentAttributeProvider skip:java codec only
|
||||
PowerProvider.mapCodec skip:java codec
|
||||
PowerProvider.validate skip:data datapack validation
|
||||
RangeProvider.mapCodec skip:java codec
|
||||
RangeProvider.validate skip:data datapack validation
|
||||
StoredNumberAccess missing minor: storage-backed numbers; no vanilla data uses storage providers
|
||||
UnaryProvider skip:java codec only
|
||||
floats/Average.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float avg arm
|
||||
floats/ContextFloatProviders skip:data registry bootstrap
|
||||
floats/Difference.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float sub arm
|
||||
floats/EnchantmentLevelProvider.getFloatUnsafe port crates/horizon-items/src/enchant.rs::Enchantments::condition random_chance arm: chance at the enchantment level; gap: minor: only the random_chance use is read
|
||||
floats/EnvironmentAttributeValue missing minor: no vanilla data uses environment_attribute providers
|
||||
floats/Length.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float length arm
|
||||
floats/Maximum.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float max arm
|
||||
floats/Minimum.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float min arm
|
||||
floats/Modulus.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float mod arm
|
||||
floats/Product.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float mul arm
|
||||
floats/Quotient.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float div arm
|
||||
ResolvableFloat.getFromItem port crates/horizon-client/src/providers.rs::Providers::speed furnace fuel speed multiplier (COOKING_FUEL); gap: minor: only the furnace fuel component is read
|
||||
ResolvableFloat.wrap skip:java codec helper
|
||||
floats/StorageValue missing minor: no vanilla data uses storage providers
|
||||
floats/Sum.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float add arm
|
||||
floats/Truncate.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_float truncate arm
|
||||
floats/UniformGenerator.getFloatUnsafe port crates/horizon-world/src/loot.rs::Context::float uniform arm: min + random * (max - min)
|
||||
floats/WeightedListValue.getFloatUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_select weighted list pick (the default branch)
|
||||
ints/Average.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int avg arm
|
||||
ints/BinomialDistributionGenerator.getIntUnsafe port crates/horizon-world/src/loot.rs::Context::int binomial arm
|
||||
ints/BinomialDistributionGenerator.validate skip:data datapack validation
|
||||
ints/ContextIntProviders.bootstrap skip:data registry bootstrap
|
||||
ints/ContextIntProviders.compostable port crates/horizon-client/src/game/composter.rs::Game::compostable the item's compostable layer provider; evaluated when the composter takes it (Game::composter_add)
|
||||
ints/ContextIntProviders.cooking port crates/horizon-client/src/providers.rs::Providers::burn_time fuel burn times (the cooking/time_* providers)
|
||||
ints/Difference.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int sub arm
|
||||
ints/EnvironmentAttributeValue missing minor: no vanilla data uses environment_attribute providers
|
||||
ints/FloorModulus.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int floor_mod arm
|
||||
ints/FloorQuotient.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int floor_div arm
|
||||
ints/Maximum.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int max arm
|
||||
ints/Minimum.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int min arm
|
||||
ints/Modulus.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int mod arm
|
||||
ints/Product.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int mul arm
|
||||
ints/Quotient.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int div arm
|
||||
ResolvableInt.getFromItem port crates/horizon-client/src/providers.rs::Providers::burn_time furnace fuel burn time (COOKING_FUEL); gap: minor: only the furnace fuel component is read
|
||||
ResolvableInt.wrap skip:java codec helper
|
||||
ints/ScoreboardValue.getIntUnsafe missing minor: no vanilla data uses score providers
|
||||
ints/ScoreboardValue.getScoreInfo missing minor: no vanilla data uses score providers
|
||||
ints/ScoreboardValue.validate skip:data datapack validation
|
||||
ints/StorageValue missing minor: no vanilla data uses storage providers
|
||||
ints/Sum.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_int add arm
|
||||
ints/UniformGenerator.getIntUnsafe port crates/horizon-world/src/loot.rs::Context::int uniform arm: inclusive random int between min and max
|
||||
ints/WeightedListValue.getIntUnsafe port crates/horizon-client/src/game/commands/compute.rs::Game::provider_select weighted list pick (the default branch)
|
||||
ScoreboardNameProviders skip:data registry bootstrap
|
||||
FunctionCallback.handle port crates/horizon-client/src/game/functions.rs::Game::run_function_by_id runs the function by id when its time comes
|
||||
FunctionTagCallback.handle inline crates/horizon-client/src/game/functions.rs::Game::tick_functions tag branch: runs every function in the tag
|
||||
TimerQueue.createComparator inline crates/horizon-client/src/game/functions.rs::Game::tick_functions ordering by (time, seq) in the due-event search
|
||||
TimerQueue.pack port crates/horizon-client/src/game/functions.rs::Game::save_schedule writes data/minecraft/scheduled_events.dat sorted by (time, seq)
|
||||
TimerQueue.remove port crates/horizon-client/src/game/functions.rs::Game::cmd_schedule schedule clear arm
|
||||
TimerQueue.schedule port crates/horizon-client/src/game/functions.rs::Game::cmd_schedule schedule function arm
|
||||
TimerQueue.tick port crates/horizon-client/src/game/functions.rs::Game::tick_functions runs due events in (time, seq) order, then the tick tag
|
||||
TimerQueue.Event.Packed.codec skip:java codec
|
||||
TimerQueue.Packed.codec skip:java codec
|
||||
ContentValidationException.getMessage skip:java exception message getter
|
||||
DirectoryValidator.validateDirectory skip:server server check of symlinks in world and resource folders (allowed_symlinks.txt)
|
||||
DirectoryValidator.validateSymlink skip:server server check of symlinks in world and resource folders (allowed_symlinks.txt)
|
||||
PathAllowList.getForFileSystem skip:server server file allow-list
|
||||
PathAllowList.readPlain skip:server server file allow-list
|
||||
PathAllowList.ConfigEntry.parse skip:server server file allow-list
|
||||
BlockHitResult.hitBorder missing minor: BlockHit has no world-border flag; vanilla projectiles check it on a border hit
|
||||
BlockHitResult.withDirection skip:java copy helper (Rust struct update)
|
||||
BlockHitResult.withPosition skip:java copy helper (Rust struct update)
|
||||
HitResult.distanceTo missing minor: only the fishing bobber's block-hit bounce uses it; Horizon's bobber does not bounce back on a block hit
|
||||
Vec2.add skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.distanceToSqr skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.dot skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.length skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.lengthSquared skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.normalized skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.rotate skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.scale skip:other 2D vector maths; Horizon has no Vec2 type and keeps 2D maths in its callers
|
||||
Vec2.equals skip:java Object equality; Rust derives it
|
||||
Vec2.hashCode skip:java Object hashing; Rust derives it
|
||||
ArrayVoxelShape.getCoords port crates/horizon-core/src/geometry/shape.rs::VoxelShape::coordinates
|
||||
BitSetDiscreteVoxelShape.<init> port crates/horizon-core/src/geometry/shape.rs::VoxelShape::from_cube gap: minor: takes the occupancy from the caller; there is no empty-grid constructor
|
||||
BitSetDiscreteVoxelShape.clearZStrip port crates/horizon-core/src/geometry/shape.rs::clear_strip
|
||||
BitSetDiscreteVoxelShape.fillUpdateBounds inline crates/horizon-core/src/geometry/shape.rs::VoxelShape::build bounds computed from the filled grid
|
||||
BitSetDiscreteVoxelShape.forAllBoxes port crates/horizon-core/src/geometry/shape.rs::VoxelShape::decompose
|
||||
BitSetDiscreteVoxelShape.getIndex port crates/horizon-core/src/geometry/shape.rs::index
|
||||
BitSetDiscreteVoxelShape.isInterior skip:other no vanilla caller outside its own class
|
||||
BitSetDiscreteVoxelShape.isXZRectangleFull inline crates/horizon-core/src/geometry/shape.rs::VoxelShape::decompose the greedy x-z merge inside decompose
|
||||
BitSetDiscreteVoxelShape.isZStripFull port crates/horizon-core/src/geometry/shape.rs::strip_full
|
||||
BitSetDiscreteVoxelShape.join port crates/horizon-core/src/geometry/shape/create.rs::VoxelShape::join
|
||||
BitSetDiscreteVoxelShape.withFilledBounds port crates/horizon-core/src/geometry/shape.rs::VoxelShape::with_discrete_bounds
|
||||
CubeVoxelShape.findIndex port crates/horizon-core/src/geometry/shape.rs::VoxelShape::find_index
|
||||
DiscreteCubeMerger.forMergedIndexes port crates/horizon-core/src/geometry/shape/join.rs::merge
|
||||
IdenticalMerger.forMergedIndexes port crates/horizon-core/src/geometry/shape/join.rs::merge
|
||||
IndirectMerger.<init> skip:java list wrapper constructor
|
||||
IndirectMerger.forMergedIndexes port crates/horizon-core/src/geometry/shape/join.rs::merge
|
||||
IndirectMerger.getList skip:java list accessor
|
||||
MinecartCollisionContext missing player: vanilla lets a rail cart pass through the block under its rail and the slope block of an ascending rail (MinecartCollisionContext); minecarts.rs move_cart has no such exclusion, so carts may bump on those blocks (read from code, not checked in game)
|
||||
NonOverlappingMerger.forMergedIndexes port crates/horizon-core/src/geometry/shape/join.rs::disjoint
|
||||
NonOverlappingMerger.forNonSwappedIndexes port crates/horizon-core/src/geometry/shape/join.rs::disjoint
|
||||
NonOverlappingMerger.getDouble skip:java list accessor
|
||||
PositionCollisionContext.isAbove port crates/horizon-world/src/collision_context.rs::CollisionContext::is_above
|
||||
|
@@ -0,0 +1,18 @@
|
||||
SubShape.clampToShape inline crates/horizon-core/src/geometry/shape/face.rs::VoxelShape::calculate_face clamps the parent's discrete extrema to the slice (face.rs:43-46)
|
||||
SubShape.fill skip:other write path on a read-only slice; vanilla calls fill only on fresh BitSetDiscreteVoxelShape (Shapes.java:25, DiscreteVoxelShape.java:43), never on a SubShape; Horizon shapes are immutable
|
||||
SubShape.isFull inline crates/horizon-core/src/geometry/shape/face.rs::VoxelShape::calculate_face slice occupancy is copied from the parent plane when the face is built (face.rs:61-68)
|
||||
PlayerScores.getOrCreate port crates/horizon-client-core/src/scoreboard.rs::Scoreboard::score_mut creates the score and tracks the holder (holder_order.insert)
|
||||
PlayerScores.listScores port crates/horizon-client-core/src/scoreboard.rs::Scoreboard::holder_scores one holder's (objective, value) pairs
|
||||
ScoreboardSaveData.setData inline crates/horizon-client/src/game/scoreboard.rs::Game::save_scoreboard gap: minor: no in-memory save-data copy and no equality/dirty check; the file is rewritten from board.pack() on each save
|
||||
LevelChunkTicks.count port crates/horizon-core/src/ticks/mod.rs::ChunkTicks::count
|
||||
LevelChunkTicks.pack port crates/horizon-core/src/ticks/mod.rs::ChunkTicks::pack
|
||||
LevelChunkTicks.poll port crates/horizon-core/src/ticks/mod.rs::ChunkTicks::poll
|
||||
LevelChunkTicks.removeIf port crates/horizon-core/src/ticks/mod.rs::ChunkTicks::remove_if
|
||||
LevelChunkTicks.scheduleUnchecked inline crates/horizon-core/src/ticks/mod.rs::ChunkTicks::schedule gap: minor: push only, no duplicate check (the unpack path is in ChunkTicks::unpack); the onTickAdded deadline update is in LevelTicks::schedule
|
||||
LevelChunkTicks.unpack port crates/horizon-core/src/ticks/mod.rs::ChunkTicks::unpack gap: minor: the deadline refresh is in LevelTicks::unpack_chunk
|
||||
AttributeTrack.bakeSampler inline crates/horizon-client/src/environment.rs::Environment::load_dimension gap: minor: builds the day timeline's tracks only (keyframes, easing, multiply); the clock holder is implicit
|
||||
AttributeTrack.createCodec skip:java codec; Horizon parses the timeline JSON in Environment::load_dimension and patrol.rs GameplayAttributes::load
|
||||
AttributeTrack.createCodecWithModifier skip:java codec; same parsing as createCodec
|
||||
AttributeTrack.validatePeriod skip:data load-time check of keyframes against period_ticks; Horizon reads the vanilla timeline files without it
|
||||
AttributeTrackSampler.applyTimeBased port crates/horizon-client/src/environment.rs::Environment::value gap: minor: multiply and override only; star_brightness 'maximum' reads as override (same value at base 0); booleans are in patrol.rs BoolTrack or hardcoded per consumer; no per-tick cache
|
||||
Timelines.bootstrap skip:data registers the timelines in code; Horizon reads data/minecraft/timeline/*.json, and the few day-cycle numbers it needs are in level/timeline.rs
|
||||
|
@@ -0,0 +1,117 @@
|
||||
AccountProfileKeyPairManager.prepareKeyPair skip:service Mojang profile key pair for chat signing; Horizon fetches none
|
||||
AccountProfileKeyPairManager.shouldRefreshKeyPair skip:service profile key refresh timer; no chat signing key pair
|
||||
AccountProfileKeyPairManager.readOrFetchProfileKeyPair skip:service profile key pair fetch; no chat signing
|
||||
AccountProfileKeyPairManager.readProfileKeyPair skip:service reads the cached profile key pair file; no chat signing
|
||||
AccountProfileKeyPairManager.writeProfileKeyPair skip:service writes the cached profile key pair file; no chat signing
|
||||
AccountProfileKeyPairManager.fetchProfileKeyPair skip:service fetches a profile key pair from the Mojang API
|
||||
AccountProfileKeyPairManager.parsePublicKey skip:service parses a profile public key from the Mojang API
|
||||
CacheSlot.compute skip:java memo slot for a computed value; Horizon has no per-context cache slot
|
||||
ChunkBatchSizeCalculator.onBatchFinished missing minor: Horizon answers every ChunkBatchFinished with a fixed 64 chunks per tick (remote.rs), so the server's batch pace is never tuned to batch timing
|
||||
ClientAdvancements.setSelectedTab port crates/horizon-client/src/game/advancements_screen.rs::Game::advancements_mouse gap: minor: the tab change is local; the openedTab packet to the server is not sent
|
||||
ClientAdvancements.setListener skip:ui listener plumbing for the advancements screen; Horizon's screen reads its state each frame
|
||||
ClientAdvancements.get port crates/horizon-client/src/advancements.rs::Tree::get returns the advancement by id; holder wrapper is not needed
|
||||
ClientChunkCache.isValidChunk skip:other chunks are stored by position, so there is no ring slot to check
|
||||
ClientChunkCache.drop port crates/horizon-client/src/streaming.rs::Streaming::forget gap: minor: no ChunkEvent unload hook; block entities and renderer columns are cleared in Game::handle_packet
|
||||
ClientChunkCache.getChunk skip:java lookup of a loaded chunk; Horizon reads world.chunks directly
|
||||
ClientChunkCache.replaceBiomes missing minor: ChunksBiomes (id 13) has no arm in Game::handle_packet, so server biome changes (e.g. /fillbiome) do not reach the client until the chunk is resent
|
||||
ClientChunkCache.flipUpdateTrackingSets skip:other double-buffered change lists for LevelRenderer; Horizon hands changed columns to the renderer directly
|
||||
ClientChunkCache.Storage.getIndex skip:java ring-buffer index into the view range; Horizon keys chunks by position
|
||||
ClientChunkCache.Storage.replace port crates/horizon-client/src/game/remote_chunks.rs::Game::remote_chunk gap: minor: old chunk unload is in Streaming::forget, not here
|
||||
ClientChunkCache.Storage.drop port crates/horizon-client/src/streaming.rs::Streaming::forget forgets the chunk at the index
|
||||
ClientChunkCache.Storage.onSectionEmptinessChanged skip:java empty-section sets for the renderer's culling; Horizon's mesher works from block data
|
||||
ClientChunkCache.Storage.onChunkRemoved skip:java empty-section bookkeeping when a chunk leaves; see Storage.onSectionEmptinessChanged
|
||||
ClientChunkCache.Storage.onChunkAdded skip:java empty-section bookkeeping when a chunk arrives; see Storage.onSectionEmptinessChanged
|
||||
ClientChunkCache.Storage.refreshEmptySections skip:java empty-section bookkeeping; see Storage.onSectionEmptinessChanged
|
||||
ClientChunkCache.Storage.markSectionEmpty skip:java empty-section set update; see Storage.onSectionEmptinessChanged
|
||||
ClientChunkCache.Storage.markSectionNotEmpty skip:java empty-section set update; see Storage.onSectionEmptinessChanged
|
||||
ClientChunkCache.Storage.dumpChunks skip:debug writes a chunk list file for debugging
|
||||
ClientCommonPacketListenerImpl.onPacketError missing minor: Horizon logs an undecodable packet and carries on (Event::DecodeError) instead of disconnecting with a report
|
||||
ClientCommonPacketListenerImpl.createDisconnectionInfo skip:debug builds the disconnect crash report and its file
|
||||
ClientCommonPacketListenerImpl.storeDisconnectionReport skip:debug writes the disconnect report file under debug/
|
||||
ClientCommonPacketListenerImpl.shouldHandleMessage inline crates/horizon-client/src/net.rs::receive_play minor: receive_play returns at Transfer, so nothing else is read after a transfer starts
|
||||
ClientCommonPacketListenerImpl.handleKeepAlive port crates/horizon-client/src/net.rs::receive_play gap: minor: the keep-alive reply is sent at once; vanilla defers it while the game is frozen at poll events
|
||||
ClientCommonPacketListenerImpl.handleCustomPayload port crates/horizon-client/src/net.rs::receive_brand gap: minor: reads the brand only; other custom payloads go to the game and are ignored
|
||||
ClientCommonPacketListenerImpl.handleResourcePackPush port crates/horizon-client/src/game/server_packs.rs::Game::handle_pack_push
|
||||
ClientCommonPacketListenerImpl.handleResourcePackPop port crates/horizon-client/src/game/server_packs.rs::Game::handle_pack_pop
|
||||
ClientCommonPacketListenerImpl.handlePostEffects missing player: a server's screen post effect (ClientboundPostEffectsPacket, set by /posteffect and on join) is not drawn on remote servers; Horizon's /posteffect only works in its own game
|
||||
ClientCommonPacketListenerImpl.preparePackPrompt port crates/horizon-client/src/game/server_packs.rs::PackPrompt::texts builds the server prompt line from the header and the server's prompt
|
||||
ClientCommonPacketListenerImpl.handleStoreCookie port crates/horizon-client/src/net.rs::receive_play stores the cookie for a later transfer or cookie request
|
||||
ClientCommonPacketListenerImpl.handleCustomReportDetails skip:debug extra lines for crash reports only
|
||||
ClientCommonPacketListenerImpl.showDialog port crates/horizon-client/src/game/dialogs.rs::Game::show_play_dialog shows a direct or registry dialog
|
||||
ClientCommonPacketListenerImpl.clearDialog port crates/horizon-client/src/game/dialogs.rs::Game::clear_dialog closes the dialog screen
|
||||
ClientCommonPacketListenerImpl.sendDeferredPackets missing minor: no deferred-packet queue; keep-alive and other packets are sent at once
|
||||
ClientCommonPacketListenerImpl.onDisconnect port crates/horizon-client/src/game/remote.rs::Game::leave_server shows the disconnect reason on the multiplayer screen; no telemetry
|
||||
ClientCommonPacketListenerImpl.fillListenerSpecificCrashDetails skip:debug crash report details only
|
||||
ClientCommonPacketListenerImpl.createDisconnectScreen port crates/horizon-client/src/game/remote.rs::Game::leave_server disconnected view with the reason (Screen::Disconnected)
|
||||
ClientCommonPacketListenerImpl.sendWhen missing minor: no deferred sends; packets go out at once (see handleKeepAlive)
|
||||
ClientCommonPacketListenerImpl.addOrUpdatePackPrompt port crates/horizon-client/src/game/server_packs.rs::Game::handle_pack_push one prompt holds every pack pushed before it is answered
|
||||
ClientCommonPacketListenerImpl.PackConfirmScreen.<init> port crates/horizon-client/src/game/server_packs.rs::Game::handle_pack_push creates the prompt with its pending requests
|
||||
ClientCommonPacketListenerImpl.PackConfirmScreen.update port crates/horizon-client/src/game/server_packs.rs::Game::handle_pack_push adds the new request to the open prompt
|
||||
ClientConfigurationPacketListenerImpl.handleRegistryData port crates/horizon-client/src/net.rs::configure registry entries are collected in configuration
|
||||
ClientConfigurationPacketListenerImpl.handleUpdateTags missing minor: UpdateTags is not read in configure (net.rs); Horizon uses its built-in tags, which match vanilla unless a datapack changes them
|
||||
ClientConfigurationPacketListenerImpl.handleSelectKnownPacks port crates/horizon-client/src/net.rs::configure gap: minor: always answers with no known packs, so the server sends every registry entry
|
||||
ClientConfigurationPacketListenerImpl.runWithResources skip:data resource loading for known packs; Horizon reads its data from tables
|
||||
ClientConfigurationPacketListenerImpl.handleCodeOfConduct port crates/horizon-client/src/net.rs::configure gap: player: accepts the server's code of conduct at once; the player never sees its text or can decline
|
||||
ClientConfigurationPacketListenerImpl.handleConfigurationFinished port crates/horizon-client/src/net.rs::configure gap: minor: no registry filter for an integrated server (see filterRegistries)
|
||||
ClientConfigurationPacketListenerImpl.filterRegistries skip:data Horizon's registries come from its own data; nothing to filter
|
||||
ClientDebugSubscriber.requestedSubscriptions missing minor: Horizon never requests debug subscriptions; vanilla asks for server tick time while the F3+2 chart is on
|
||||
ClientDebugSubscriber.tick missing minor: no subscriptions to purge
|
||||
ClientDebugSubscriber.onSubscriptionsChanged missing minor: no ServerboundDebugSubscriptionRequest is sent
|
||||
ClientDebugSubscriber.initializeSubscriptions skip:java creates empty value maps per subscription
|
||||
ClientDebugSubscriber.getValueMap skip:java map accessor for debug values
|
||||
ClientDebugSubscriber.getValue skip:java value accessor for debug values
|
||||
ClientDebugSubscriber.pushEvent missing minor: server debug events are dropped
|
||||
ClientDebugSubscriber.updateMap missing minor: server debug updates are dropped
|
||||
ClientDebugSubscriber.forEachValue skip:java iterates debug values
|
||||
ClientDebugSubscriber.dropChunk missing minor: no server debug values to drop with a chunk
|
||||
ClientDebugSubscriber.dropEntity missing minor: no server debug values to drop with an entity
|
||||
ClientDebugSubscriber.ValueMap.getValue skip:java value accessor
|
||||
ClientDebugSubscriber.ValueMap.apply missing minor: applies server debug updates, which Horizon never receives
|
||||
ClientDebugSubscriber.ValueMap.forEach skip:java iteration helper
|
||||
ClientDebugSubscriber.ValueMaps.purgeExpired missing minor: expiry of server debug values; none are received
|
||||
ClientDebugSubscriber.ValueMaps.dropChunkAndBlocks missing minor: drops server debug values per chunk; none are received
|
||||
ClientDebugSubscriber.ValueWrapper.hasExpired skip:java timestamp check on a debug value wrapper
|
||||
ClientExplosionTracker.track inline crates/horizon-client/src/particles.rs::ParticleEngine::explosion gap: minor: the debris is thrown at once instead of queued for later ticks
|
||||
ClientExplosionTracker.addParticle port crates/horizon-client/src/particles.rs::ParticleEngine::explosion_blocks gap: minor: always the default poof and smoke list; the explode packet's own block particle list is not read
|
||||
ClientHandshakePacketListenerImpl.switchState inline crates/horizon-client/src/net.rs::run login steps run in packet order in run(); no state machine
|
||||
ClientHandshakePacketListenerImpl.handleHello port crates/horizon-client/src/net.rs::run gap: minor: the session join and server check are in auth.rs (join_server); the encryption setup is in run
|
||||
ClientHandshakePacketListenerImpl.setEncryption port crates/horizon-client/src/net.rs::run enables the connection cipher
|
||||
ClientHandshakePacketListenerImpl.handleLoginFinished port crates/horizon-client/src/net.rs::run login finished; play starts after configuration
|
||||
ClientHandshakePacketListenerImpl.onDisconnect port crates/horizon-client/src/net.rs::run a login disconnect returns the reason to the connect screen
|
||||
ClientHandshakePacketListenerImpl.handleCompression port crates/horizon-client/src/net.rs::run sets the compression threshold
|
||||
ClientHandshakePacketListenerImpl.handleCustomQuery port crates/horizon-client/src/net.rs::run answers an unknown custom query with no data
|
||||
ClientHandshakePacketListenerImpl.fillListenerSpecificCrashDetails skip:debug crash report details only
|
||||
ClientLevel.handleBlockChangedAck port crates/horizon-client/src/game/remote.rs::Game::end_predictions settles the predicted block actions up to the sequence
|
||||
ClientLevel.onBlockEntityAdded port crates/horizon-client/src/game.rs::Game::entity_geometry off-screen block entities (beacon, end gateway, structure and test blocks) are drawn without a view test
|
||||
ClientLevel.syncBlockState port crates/horizon-client/src/game/remote.rs::Game::end_predictions gap: minor: writes the server's state but does not move the player out when the block would sit on them (absSnapTo)
|
||||
ClientLevel.setBlock port crates/horizon-client/src/game/remote.rs::Game::set_block gap: minor: the prediction bookkeeping is in Game::server_block
|
||||
ClientLevel.<init> port crates/horizon-client/src/game/remote.rs::Game::enter_remote_dimension gap: minor: the environment layers are applied in Game::render
|
||||
ClientLevel.addEnvironmentAttributeLayers port crates/horizon-client/src/game.rs::Game::render sky colour and sky light move during a lightning flash
|
||||
ClientLevel.pollLightUpdates skip:other light is applied when it arrives or relit at once (light.rs relight); there is no queue to poll
|
||||
ClientLevel.getPrecipitationAt port crates/horizon-client/src/game.rs::GameLevel::precipitation gap: minor: no check that the chunk is loaded; vanilla answers none for an unloaded column
|
||||
ClientLevel.removeBlockBreakingProgress inline crates/horizon-client/src/game.rs::Game::destroy_block_progress minor: the 400-tick expiry runs on every update, not every 20 ticks
|
||||
ClientLevel.removeProgress inline crates/horizon-client/src/game.rs::Game::destroy_block_progress cracks are keyed by breaker id, so there are no per-position sets to tidy
|
||||
ClientLevel.shouldTickDeath missing minor: death animations tick for every remote mob held; no simulation-distance check
|
||||
ClientLevel.tickNonPassenger port crates/horizon-client/src/game/remote.rs::Game::tick_remote_entities ticks each remote entity
|
||||
ClientLevel.tickPassenger port crates/horizon-client/src/game/passengers.rs::Game::position_riders gap: minor: passengers are placed on their vehicle; no per-passenger tick
|
||||
ClientLevel.update skip:other runs the light queue each tick; Horizon relights when changes arrive
|
||||
ClientLevel.unload inline crates/horizon-client/src/game/remote.rs::Game::handle_packet minor: the ForgetLevelChunk arm clears block entities and renderer columns; light and entity ticking are not toggled
|
||||
ClientLevel.onChunkLoaded inline crates/horizon-client/src/game/remote_chunks.rs::Game::remote_chunk minor: chunks are meshed on arrival; no tint cache to clear and no entity-ticking gate
|
||||
ClientLevel.removeEntity port crates/horizon-client/src/game/remote.rs::Game::remove_entity removes the entity and its passengers
|
||||
ClientLevel.getPushableEntities missing minor: the client does not push the local player with nearby mobs or boats; the server's position correction moves it
|
||||
ClientLevel.disconnect port crates/horizon-client/src/game/remote.rs::Game::leave_server gap: minor: no presence update
|
||||
ClientLevel.spawnParticle port crates/horizon-client/src/animate_tick.rs::try_spawn_drip drip particle from a block shape (doAnimateTick)
|
||||
ClientLevel.spawnFluidParticle port crates/horizon-client/src/animate_tick.rs::try_spawn_drip drip particle over a solid top (doAnimateTick)
|
||||
ClientLevel.fillReportDetails skip:debug crash report details only
|
||||
ClientLevel.playPlayerSound skip:other no caller in the 26.3 client sources
|
||||
ClientLevel.playSound missing player: distance-delayed sounds (over 10 blocks, sqrt(distance)/40 s) play at once, so far fireworks and similar sounds arrive early; audio.rs has no delay
|
||||
ClientLevel.getRelativeTickSpeed skip:other no caller in the 26.3 client sources
|
||||
ClientLevel.destroyBlockProgress port crates/horizon-client/src/game.rs::Game::destroy_block_progress sets or clears another player's crack on a block
|
||||
ClientLevel.addAlwaysVisibleParticle port crates/horizon-client/src/particles.rs::ParticleEngine::add_with always-show flag set
|
||||
ClientLevel.doAddParticle port crates/horizon-client/src/particles.rs::ParticleEngine::add_with drops particles beyond 32 blocks and at minimal particle level
|
||||
ClientLevel.getSkyFlashTime inline crates/horizon-client/src/game.rs::Game::render the flash check with the hideLightningFlashes option
|
||||
ClientLevel.calculateBlockTint port crates/horizon-client/src/mesher.rs::MeshTables::terrain_particle_tint gap: minor: returns none for grass-block tints
|
||||
ClientLevel.playBreakingSound port crates/horizon-client/src/game/level_particles.rs::Game::breaking_block_effects the block's hit sound while digging
|
||||
ClientLevel.getClientLeafTintColor port crates/horizon-client/src/animate_tick.rs::AnimateContext::foliage leaf tint for tinted leaves particles; the caller is TintedParticleLeavesBlock
|
||||
ClientLevel.EntityCallbacks.onTrackingStart inline crates/horizon-client/src/game/remote.rs::Game::spawn_entity minor: ender dragon parts are placed by the dragon module, with no tracked parts list
|
||||
ClientLevel.EntityCallbacks.onTrackingEnd port crates/horizon-client/src/game/remote.rs::Game::remove_entity minor: detaches passengers and removes the dragon's parts; the leave-level event is not posted
|
||||
|
@@ -0,0 +1,147 @@
|
||||
ClientPacketListener.<init> port crates/horizon-client/src/game/remote.rs::Game::join_server gap: minor: clears the chat on join; vanilla restores chat state kept across a reconfiguration
|
||||
ClientPacketListener.clearCacheSlots skip:java weak-reference cache slots; Horizon has no such cache
|
||||
ClientPacketListener.handleAddEntity inline crates/horizon-client/src/game/remote.rs::Game::handle_packet AddEntity arm: spawn_entity, then object or projectile spawn, then motion
|
||||
ClientPacketListener.createEntityFromPacket inline crates/horizon-client/src/game/remote.rs::Game::handle_packet gap: minor: the player spawns without checking that its profile is known
|
||||
ClientPacketListener.handleSetEntityData port crates/horizon-client/src/game/remote.rs::Game::handle_packet gap: minor: only the data indexes Horizon reads are applied (flags, names, sleep, crouch, mob fields)
|
||||
ClientPacketListener.handleEntityPositionSync port crates/horizon-client/src/game/remote.rs::Game::move_entity absolute move with the packet rotation and on-ground flag
|
||||
ClientPacketListener.handleTeleportEntity inline crates/horizon-client/src/game/remote.rs::Game::handle_packet TeleportEntity arm works out the relative position, then move_entity; gap: minor: a teleport of the player's former vehicle is not applied to the player
|
||||
ClientPacketListener.handleTickingState port crates/horizon-client/src/game/remote.rs::Game::handle_packet TickingState arm: clock rate and frozen flag
|
||||
ClientPacketListener.handleTickingStep port crates/horizon-client/src/game/remote.rs::Game::handle_packet TickingStep arm: frozen ticks to run
|
||||
ClientPacketListener.handleMoveEntity port crates/horizon-client/src/game/remote.rs::Game::move_entity relative move and rotation from the Pos, PosRot and Rot packets
|
||||
ClientPacketListener.handleMinecartAlongTrack missing player: the server's rail steps for a minecart are dropped, so a cart on a dedicated server follows the client's own rail physics and can drift from where the server has it
|
||||
ClientPacketListener.handleRemoveEntities port crates/horizon-client/src/game/remote.rs::Game::remove_entity gap: minor: a removed vehicle carrying the player is not remembered for a later teleport
|
||||
ClientPacketListener.setValuesFromPositionPacket port crates/horizon-client/src/game/remote.rs::Game::remote_teleport gap: minor: the entity case (TeleportEntity) is in the handle_packet arm, not here
|
||||
ClientPacketListener.handleRotatePlayer port crates/horizon-client/src/game/remote.rs::Game::handle_packet PlayerRotation arm; gap: minor: no ServerboundMovePlayerPacket.Rot reply is sent
|
||||
ClientPacketListener.handleChunkBlocksUpdate port crates/horizon-client/src/game/remote.rs::Game::handle_packet SectionBlocksUpdate arm: each change through the block update
|
||||
ClientPacketListener.handleChunksBiomes missing player: biome updates for loaded chunks are dropped, so grass, leaves and water keep the old biome colour
|
||||
ClientPacketListener.enableChunkLight inline crates/horizon-client/src/streaming.rs::Streaming::insert_remote gap: minor: the air-only section status is not set; every section of the 3x3 columns is marked dirty
|
||||
ClientPacketListener.handleForgetLevelChunk port crates/horizon-client/src/game/remote.rs::Game::handle_packet ForgetLevelChunk arm: Streaming::forget, block entities and renderer columns dropped
|
||||
ClientPacketListener.queueLightRemoval inline crates/horizon-client/src/streaming.rs::Streaming::forget gap: minor: the column's light state is dropped with the column; no per-section light clearing
|
||||
ClientPacketListener.handleBlockUpdate port crates/horizon-client/src/game/remote.rs::Game::server_block
|
||||
ClientPacketListener.handleConfigurationStart port crates/horizon-client/src/net.rs::receive_play gap: player: no reconfiguring screen is shown and the chat state is not stored
|
||||
ClientPacketListener.handleSystemChat port crates/horizon-client/src/game/remote.rs::Game::handle_packet SystemChat arm: overlay to the action bar, otherwise the chat
|
||||
ClientPacketListener.handlePlayerChat port crates/horizon-client/src/game/remote.rs::Game::handle_packet PlayerChat arm; gap: minor: no signature, chat index or validity checks
|
||||
ClientPacketListener.handleDisguisedChat port crates/horizon-client/src/game/remote.rs::Game::handle_packet DisguisedChat arm
|
||||
ClientPacketListener.handleDeleteChat missing player: a chat line the server deletes (moderation) stays on screen
|
||||
ClientPacketListener.handleAnimate port crates/horizon-client/src/game/remote.rs::Game::remote_animate action 0 stops sleeping, 1 and 2 emit crit and enchanted hit particles
|
||||
ClientPacketListener.handleHurtAnimation port crates/horizon-client/src/game/remote.rs::Game::handle_packet HurtAnimation arm: own player's hurt tilt, or a mob's hurt time
|
||||
ClientPacketListener.handleSetSpawn port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetDefaultSpawnPosition arm; gap: minor: only an overworld spawn is kept, other dimensions are dropped
|
||||
ClientPacketListener.handleAddTransientBlockPacket missing minor: the transient block shown while a falling block lands is not drawn; the block update still arrives
|
||||
ClientPacketListener.findTotem missing player: the totem of undying pop-up over the screen is not shown when death protection triggers; Horizon has no item activation
|
||||
ClientPacketListener.handleSetExperience port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetExperience arm
|
||||
ClientPacketListener.determineLevelLoadingReason port crates/horizon-client/src/game.rs::Game::loading_reason gap: player: only the in-frame game picks a reason; a dedicated server join or dimension change shows no level loading screen
|
||||
ClientPacketListener.handleOpenScreen port crates/horizon-client/src/game/remote.rs::Game::remote_open_screen
|
||||
ClientPacketListener.handleSetCursorItem port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetCursorItem arm; gap: minor: sets the carried stack even while the creative screen is open
|
||||
ClientPacketListener.handleSetPlayerInventory port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetPlayerInventory arm: slots 0-35, armour 36-39, off hand 40
|
||||
ClientPacketListener.handleContainerContent port crates/horizon-client/src/game/remote.rs::Game::handle_packet ContainerSetContent arm: each slot, then the carried stack
|
||||
ClientPacketListener.handleBlockEntityData port crates/horizon-client/src/game/remote.rs::Game::remote_block_entity_data
|
||||
ClientPacketListener.handleContainerSetData port crates/horizon-client/src/game/remote.rs::Game::handle_packet ContainerSetData arms (lectern, furnace, crafter, brewing); station containers go to remote_stations.rs::Game::remote_station_data
|
||||
ClientPacketListener.handleContainerClose port crates/horizon-client/src/game/remote.rs::Game::handle_packet ContainerClose arm: closes the inventory screen; gap: minor: a server close while the creative screen is open is ignored
|
||||
ClientPacketListener.handleBlockEvent port crates/horizon-client/src/game/remote.rs::Game::handle_packet BlockEvent arm: client block event, then the block entity event
|
||||
ClientPacketListener.handleGameEvent port crates/horizon-client/src/game/remote.rs::Game::handle_packet GameEvent arm; gap: player: no handling for 0 (no spawn point message), 6 (arrow hit sound), 9 (puffer fish sting), 12 (limited crafting); 5 (demo) and 13 (chunk load start) are minor
|
||||
ClientPacketListener.openDemoIntroScreen skip:other demo mode only (GameEvent 5); Horizon has no demo mode
|
||||
ClientPacketListener.startWaitingForNewLevel missing player: no level loading screen after a dimension change or respawn on a dedicated server; a join shows only the 'Loading terrain' status text
|
||||
ClientPacketListener.handleMapItemData port crates/horizon-client/src/game/maps.rs::Game::remote_map_item_data
|
||||
ClientPacketListener.handleUpdateAdvancementsPacket port crates/horizon-client/src/game/advancements.rs::Game::remote_advancements UpdateAdvancements arm passes the added icons
|
||||
ClientPacketListener.handleSelectAdvancementsTab missing minor: the server's advancement tab choice is ignored
|
||||
ClientPacketListener.handleCommands port crates/horizon-client/src/game/remote.rs::Game::handle_packet Commands arm: command tree from the packet, merged with Horizon's own
|
||||
ClientPacketListener.handleStopSoundEvent port crates/horizon-client/src/game/remote.rs::Game::handle_packet StopSound arm: audio stop_sounds
|
||||
ClientPacketListener.handleUpdateRecipes skip:data Horizon reads recipes from its own tables; the server's list is not read
|
||||
ClientPacketListener.handleLookAt missing player: a server command that turns the camera (/faceplayer, /tp with facing) does not turn this player's view
|
||||
ClientPacketListener.handleTagQueryPacket skip:debug answer to a debug NBT query; Horizon sends none
|
||||
ClientPacketListener.handleAwardStats port crates/horizon-client/src/game/remote.rs::Game::handle_packet AwardStats arm: known stat keys into the stats values
|
||||
ClientPacketListener.handleRecipeBookAdd port crates/horizon-client/src/game/recipe_book.rs::Game::remote_recipe_book_add
|
||||
ClientPacketListener.handleRecipeBookRemove port crates/horizon-client/src/game/recipe_book.rs::Game::remote_recipe_book_remove
|
||||
ClientPacketListener.handleRecipeBookSettings port crates/horizon-client/src/game/recipe_book.rs::Game::remote_recipe_book_settings
|
||||
ClientPacketListener.refreshRecipeBook inline crates/horizon-client/src/game/recipe_book.rs::Game::remote_recipe_book_add the collections rebuild lazily through the client version bump
|
||||
ClientPacketListener.updateTags skip:data the server's tag payload is not read; tags come from Horizon's own data (net.rs configure ignores UpdateTags)
|
||||
ClientPacketListener.handleUpdateTags skip:data the server's tag payload is not read; tags come from Horizon's own data (net.rs configure ignores UpdateTags)
|
||||
ClientPacketListener.handleChangeDifficulty port crates/horizon-client/src/game/remote.rs::Game::handle_packet ChangeDifficulty arm
|
||||
ClientPacketListener.handleSetCamera missing player: a spectator's view does not attach to the entity it spectates (for example /spectate)
|
||||
ClientPacketListener.handleInitializeBorder port crates/horizon-client/src/game/remote.rs::Game::handle_packet InitializeBorder arm: centre, size or lerp, absolute max, warnings
|
||||
ClientPacketListener.handleSetBorderCenter port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetBorderCenter arm
|
||||
ClientPacketListener.handleSetBorderLerpSize port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetBorderLerpSize arm
|
||||
ClientPacketListener.handleSetBorderSize port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetBorderSize arm
|
||||
ClientPacketListener.handleSetBorderWarningDistance port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetBorderWarningDistance arm
|
||||
ClientPacketListener.handleSetBorderWarningDelay port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetBorderWarningDelay arm
|
||||
ClientPacketListener.handleTitlesClear port crates/horizon-client/src/game/remote.rs::Game::handle_packet ClearTitles arm: clear, optionally reset the times
|
||||
ClientPacketListener.handleCustomChatCompletions missing minor: server-sent custom chat completions are not used
|
||||
ClientPacketListener.setTitleText port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetTitleText arm
|
||||
ClientPacketListener.setSubtitleText port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetSubtitleText arm
|
||||
ClientPacketListener.setTitlesAnimation port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetTitlesAnimation arm
|
||||
ClientPacketListener.handleTabListCustomisation port crates/horizon-client/src/game/remote.rs::Game::handle_packet TabList arm: empty text clears the header or footer
|
||||
ClientPacketListener.handleRemoveMobEffect port crates/horizon-client/src/game/remote.rs::Game::handle_packet RemoveMobEffect arm; gap: minor: only the player's own effects are removed
|
||||
ClientPacketListener.handlePlayerInfoRemove port crates/horizon-client/src/game/remote.rs::Game::handle_packet PlayerInfoRemove arm
|
||||
ClientPacketListener.handlePlayerInfoUpdate port crates/horizon-client/src/game/remote.rs::Game::handle_packet PlayerInfoUpdate arm: new entries, then listing, latency, name, hat, list order and game mode for tab players
|
||||
ClientPacketListener.applyPlayerInfoUpdate inline crates/horizon-client/src/game/remote.rs::Game::handle_packet gap: minor: the own player's game-mode update does not change the local mode; INITIALIZE_CHAT is ignored
|
||||
ClientPacketListener.initializeChatSession missing minor: other players' chat keys are not kept or checked, so no signature check is made on their messages
|
||||
ClientPacketListener.enforcesSecureChat missing minor: the Login flag enforces_secure_chat is not read
|
||||
ClientPacketListener.handleGameRuleValues port crates/horizon-client/src/game/lan_screen.rs::Game::remote_world_options_rules
|
||||
ClientPacketListener.handleSoundEntityEvent missing unsure: no SoundEntity arm; a sound attached to an entity would be silent unless mob_sounds.rs plays it
|
||||
ClientPacketListener.handleAddObjective port crates/horizon-client/src/game/remote.rs::Game::remote_objective add, remove and update of an objective
|
||||
ClientPacketListener.handleSetScore port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetScore arm
|
||||
ClientPacketListener.handleResetScore port crates/horizon-client/src/game/remote.rs::Game::handle_packet ResetScore arm
|
||||
ClientPacketListener.handleSetDisplayObjective port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetDisplayObjective arm: display slot names
|
||||
ClientPacketListener.handleSetPlayerTeamPacket port crates/horizon-client/src/game/remote.rs::Game::remote_team
|
||||
ClientPacketListener.tryAddParticle skip:other the try/catch that drops one particle that fails to add; Horizon's particle ids are typed, so nothing is caught
|
||||
ClientPacketListener.handlePlaceRecipe port crates/horizon-client/src/game/recipe_book.rs::Game::remote_ghost_recipe
|
||||
ClientPacketListener.handleLightUpdatePacket port crates/horizon-client/src/game/remote_chunks.rs::Game::remote_light_update
|
||||
ClientPacketListener.handleMerchantOffers port crates/horizon-client/src/game/remote.rs::Game::remote_merchant_offers
|
||||
ClientPacketListener.handleSetChunkCacheRadius port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetChunkCacheRadius arm: streaming radius, columns out of range dropped
|
||||
ClientPacketListener.handleSetSimulationDistance missing minor: the server's simulation distance is not read
|
||||
ClientPacketListener.handleSetChunkCacheCenter port crates/horizon-client/src/game/remote.rs::Game::handle_packet SetChunkCacheCenter arm
|
||||
ClientPacketListener.handleBlockChangedAck port crates/horizon-client/src/game/remote.rs::Game::end_predictions
|
||||
ClientPacketListener.handleBundlePacket inline crates/horizon-client/src/net.rs::receive_play bundle delimiters are dropped; the packets inside arrive as a stream and are handled one by one, in order
|
||||
ClientPacketListener.handleProjectilePowerPacket missing minor: the projectile's acceleration power is not read (ProjectilePower has no arm)
|
||||
ClientPacketListener.handleChunkBatchFinished port crates/horizon-client/src/game/remote.rs::Game::handle_packet ChunkBatchFinished arm; gap: minor: answers with a fixed 64 chunks per tick, not a measured rate
|
||||
ClientPacketListener.handleTestInstanceBlockStatus skip:debug status for the test instance block editor (developer blocks); Horizon has no editor
|
||||
ClientPacketListener.handleDebugChunkValue skip:debug debug overlay values from the server
|
||||
ClientPacketListener.handleDebugBlockValue skip:debug debug overlay values from the server
|
||||
ClientPacketListener.handleDebugEntityValue skip:debug debug overlay values from the server
|
||||
ClientPacketListener.handleDebugEvent skip:debug debug overlay events from the server
|
||||
ClientPacketListener.handleGameTestHighlightPos skip:debug game test block highlight (developer tool)
|
||||
ClientPacketListener.isAcceptingMessages inline crates/horizon-client/src/game/remote.rs::Game::send_chat gap: minor: only the chat abilities are checked; no connection-open check
|
||||
ClientPacketListener.getPlayerInfo skip:java a map lookup by UUID; Horizon keeps the player list in remote.tab_players and remote.players
|
||||
ClientPacketListener.getPlayerInfoIgnoreCase missing unsure: a case-insensitive name lookup for profiles (LocalPlayerResolver); Horizon has none
|
||||
ClientPacketListener.markMessageAsProcessed missing minor: no secure-chat acknowledgement tracking; Horizon's chat is unsigned
|
||||
ClientPacketListener.sendChatAcknowledgement missing minor: no ChatAck is sent; Horizon's chat is unsigned
|
||||
ClientPacketListener.sendCommand port crates/horizon-client/src/game/remote.rs::Game::send_chat gap: player: commands are sent unsigned, including ones with signable arguments such as /msg
|
||||
ClientPacketListener.verifyCommand missing minor: no parse or permission check before a command is sent, so the confirmation screens never show
|
||||
ClientPacketListener.isValidCommand missing minor: only used by verifyCommand, which is missing
|
||||
ClientPacketListener.openSendConfirmationWindow missing minor: the confirmation screen before a command with problems is not shown
|
||||
ClientPacketListener.openCommandSendConfirmationWindow missing minor: the same confirmation screen for click-to-run commands is not shown
|
||||
ClientPacketListener.openSignedCommandSendConfirmationWindow missing minor: no confirmation screen for a command that needs a signature
|
||||
ClientPacketListener.broadcastClientInformation port crates/horizon-client/src/game/remote.rs::Game::tick_remote_level gap: minor: only view distance and chat visibility are sent, and only when they change
|
||||
ClientPacketListener.notifyPlayerLoaded port crates/horizon-client/src/game/remote.rs::Game::tick_remote_level gap: minor: gated on the player's column being lit, not on its sections being compiled
|
||||
ClientPacketListener.setKeyPair missing player: no chat key pair is ever set, so chat and commands stay unsigned
|
||||
ClientRegistryLayer.createRegistryAccess skip:data registry layers come from Horizon's own tables
|
||||
ClientSuggestionProvider.getOnlinePlayerNames port crates/horizon-client/src/game/remote.rs::Game::remote_online_names sorted names of the server's player list
|
||||
ClientSuggestionProvider.getCustomTabSuggestions missing minor: server-sent custom completions are not used
|
||||
ClientSuggestionProvider.getSelectedEntities missing minor: no suggestion for the entity under the crosshair
|
||||
ClientSuggestionProvider.suggestRegistryElements port crates/horizon-command/src/args.rs::suggest_resources registry ids come from Horizon's registry tables
|
||||
ClientSuggestionProvider.getRelevantCoordinates port crates/horizon-command/src/args.rs::suggest_coordinates the block under the crosshair for block positions
|
||||
ClientSuggestionProvider.getAbsoluteCoordinates port crates/horizon-command/src/args.rs::suggest_coordinates gap: minor: the exact hit point is not offered; Vec3 arguments only get ~
|
||||
ClientSuggestionProvider.modifyCustomCompletions missing minor: server-sent custom completions are not stored
|
||||
KnownPacksManager.trySelectingPacks skip:data Horizon answers SelectKnownPacks with no packs, so the server sends full registries (net.rs configure)
|
||||
LegacyServerPinger.channelActive skip:other legacy pre-1.7 server-list ping, not used by this client
|
||||
LegacyServerPinger.channelRead0 skip:other legacy pre-1.7 server-list ping, not used by this client
|
||||
LevelLoadTracker.startClientLoad inline crates/horizon-client/src/game/remote.rs::Game::tick_remote_level gap: player: no loading screen state; the wait is only for the player's column to be lit
|
||||
LevelLoadTracker.isLevelReady inline crates/horizon-client/src/game/remote.rs::Game::tick_remote_level gap: minor: readiness is the player's column being lit; vanilla's close delay is not kept
|
||||
LevelLoadTracker.getPlayerCompiledSectionCallback inline crates/horizon-client/src/game/remote.rs::Game::tick_remote_level gap: minor: the gate is the column being lit, not the section being compiled
|
||||
LevelLoadTracker.WaitingForPlayerChunk.isReady inline crates/horizon-client/src/game/remote.rs::Game::tick_remote_level gap: minor: no timeout and no spectator or dead exemption
|
||||
LevelLoadTracker.WaitingForServer.loadingPacketsReceived missing minor: the server's level-chunks-start event (GameEvent 13) is ignored
|
||||
MultiPlayerGameMode.startPrediction port crates/horizon-client/src/game/remote.rs::Game::next_sequence gap: minor: only the sequence number; each caller builds and sends its own packet
|
||||
MultiPlayerGameMode.ensureHasSentCarriedItem inline crates/horizon-client/src/game/remote.rs::Game::remote_send_state the SetCarriedItem check, made on every send
|
||||
MultiPlayerGameMode.performUseItemOn port crates/horizon-client/src/game/remote.rs::Game::remote_use_block gap: minor: no world-border check, and UseItemOn always sends world_border false
|
||||
MultiPlayerGameMode.createPlayer port crates/horizon-client/src/game/remote.rs::Game::remote_teleport gap: minor: the player is created on the first position packet, not at login
|
||||
MultiPlayerGameMode.handleCreativeModeItemAdd inline crates/horizon-client/src/game/remote.rs::Game::remote_send_state gap: minor: the creative inventory is sent as a per-tick diff, with no feature-flag check
|
||||
MultiPlayerGameMode.handleCreativeModeItemDrop port crates/horizon-client/src/game/remote.rs::Game::remote_creative_drop gap: minor: no check that another container screen is open
|
||||
MultiPlayerGameMode.getDestroyStage port crates/horizon-client/src/first_person.rs::Destroying::stage
|
||||
RegistryDataCollector.appendContents skip:data registry data for the configuration handshake; Horizon reads its own tables
|
||||
RegistryDataCollector.appendTags skip:data registry tags for the configuration handshake; Horizon reads its own tables
|
||||
RegistryDataCollector.loadNewElementsAndTags skip:data registry loading for the configuration handshake; Horizon reads its own tables
|
||||
RegistryDataCollector.addCrashDetails skip:debug crash report details
|
||||
RegistryDataCollector.loadOnlyTags skip:data registry tags for the configuration handshake; Horizon reads its own tables
|
||||
RegistryDataCollector.updateComponents skip:data data component registry; Horizon reads its own tables
|
||||
RegistryDataCollector.collectGameRegistries skip:data registry collection for the configuration handshake; Horizon reads its own tables
|
||||
RegistryDataCollector.ContentsCollector.append skip:data registry contents collector; Horizon reads its own tables
|
||||
|
@@ -0,0 +1,150 @@
|
||||
ServerData.write port crates/horizon-protocol/src/servers.rs::ServerEntry::to_tag gap: minor: no acceptedCodeOfConduct entry (Horizon never stores code of conduct acceptance)
|
||||
ServerData.read port crates/horizon-protocol/src/servers.rs::ServerEntry::from_tag gap: minor: acceptedCodeOfConduct is not read
|
||||
ServerData.copyNameIconFrom inline crates/horizon-client/src/multiplayer.rs::Screen::click the Edit save writes name, ip and pack setting and keeps the icon
|
||||
ServerData.copyFrom inline crates/horizon-client/src/multiplayer.rs::Screen::click Edit opens the form pre-filled from the entry (name, ip, pack setting)
|
||||
ServerData.validateIcon port crates/horizon-client/src/multiplayer.rs::icon_pixels gap: minor: only 64x64 PNGs are kept; vanilla keeps any PNG up to 1024x1024 in servers.dat
|
||||
ServerList.get missing minor: Direct Connect never looks up a saved entry by address, so its saved pack setting and icon are not used
|
||||
ServerList.unhide missing minor: no hidden-server list (vanilla keeps up to 16 direct-join entries)
|
||||
ServerList.remove port crates/horizon-client/src/multiplayer.rs::Screen::click Delete confirm removes the selected row and saves
|
||||
ServerList.add port crates/horizon-client/src/multiplayer.rs::Screen::click gap: minor: direct-join entries are not kept hidden (hidden=true)
|
||||
ServerList.swap port crates/horizon-client/src/multiplayer.rs::Screen::click arrow click on a row swaps it with its neighbour and saves
|
||||
ServerList.set missing minor: no write-back of one saved entry by name and address (only the code-of-conduct save uses it)
|
||||
ServerStatusPinger.pingServer port crates/horizon-client/src/multiplayer.rs::ping_all gap: minor: no unknown-host message; one thread per server with a 5 s timeout
|
||||
ServerStatusPinger.onPingFailed port crates/horizon-client/src/multiplayer.rs::ping_all failed ping stores Ping::Failed, shown as can't-connect in the row
|
||||
ServerStatusPinger.pingLegacyServer missing player: a server that answers only the old legacy ping shows as incompatible with its version and player count in vanilla; Horizon shows it as unreachable
|
||||
ServerStatusPinger.tick skip:other Horizon pings on plain threads, so there are no connections to tick
|
||||
ServerStatusPinger.removeAll skip:other pings are not cancelled on screen close; threads end on their own timeout
|
||||
SessionSearchTrees.rebuildAfterLanguageChange skip:java creative search reads names at query time, so there are no trees to rebuild
|
||||
SessionSearchTrees.getTooltipLines inline crates/horizon-client/src/creative.rs::Creative::from_json search lines come pre-stripped from the export and are read here
|
||||
SessionSearchTrees.updateCreativeTags inline crates/horizon-client/src/creative.rs::Creative::from_json tag index comes from the export's tag lists
|
||||
SessionSearchTrees.updateCreativeTooltips inline crates/horizon-client/src/creative.rs::Creative::from_json name index comes from the export's tooltip lines
|
||||
ChatAbilities.selectVisibleMessages port crates/horizon-client/src/chat.rs::ChatAbilities::shows source filter: client lines always, player and server lines per the abilities
|
||||
ChatAbilities.Builder.build inline crates/horizon-client/src/chat.rs::ChatAbilities::new restrictions come from the Chat option alone; new() maps the visibility to them
|
||||
ChatListener.tick missing player: the Chat Delay option does nothing; lines show at once instead of after the delay
|
||||
ChatListener.setMessageDelay missing player: no delayed-message queue, so Chat Delay has no effect
|
||||
ChatListener.flushQueue missing player: no queue to flush (part of Chat Delay)
|
||||
ChatListener.removeFromDelayedMessageQueue missing minor: only matters while a delayed message is queued
|
||||
ChatListener.handleMessage missing player: nothing is held back, so Chat Delay is ignored
|
||||
ChatListener.handlePlayerChatMessage port crates/horizon-client/src/game/remote.rs::Game::handle_packet gap: player: no Only Show Secure Chat filter, no server filter-mask text, no block or friend-only hiding of chat lines
|
||||
ChatListener.handleChatMessageError missing player: a signed chat line that fails validation shows no red chat.validation_error line; Horizon checks no chat signatures (rare on most servers)
|
||||
ChatListener.handleDisguisedChatMessage port crates/horizon-client/src/game/remote.rs::Game::handle_packet gap: minor: no narration and no chat log entry
|
||||
ChatListener.showMessageToPlayer port crates/horizon-client/src/game/remote.rs::Game::chat_line gap: player: trust, block, friend-only and secure-only checks are not run before showing
|
||||
ChatListener.evaluateTrustLevel missing player: no secure, modified or not-secure marking, so unsigned lines show with no Not Secure bar and Only Show Secure Chat does nothing
|
||||
ChatListener.logPlayerMessage skip:service feeds the chat log that chat reports read
|
||||
ChatListener.logSystemMessage skip:service feeds the chat log that chat reports read
|
||||
ChatListener.handleSystemMessage port crates/horizon-client/src/game/remote.rs::Game::handle_packet gap: minor: hide-matched-names and friend filtering are not applied to system lines
|
||||
ChatListener.guessChatUUID skip:service social lookup of a name in a system line, used only for blocking and hiding
|
||||
ChatListener.isSenderLocalPlayer missing minor: only feeds the trust level check
|
||||
ChatLog.codec skip:java serializer of the chat log
|
||||
ChatLog.loggedChatEvents skip:service chat log for chat reports
|
||||
ChatLog.push skip:service chat log for chat reports
|
||||
ChatLog.lookup skip:service chat log for chat reports
|
||||
ChatTrustLevel.evaluate missing player: no Not Secure or Modified marking on chat lines, and Only Show Secure Chat does nothing (see createTag)
|
||||
ChatTrustLevel.isModified missing minor: only feeds the Modified marking
|
||||
ChatTrustLevel.containsModifiedStyle missing minor: only feeds the Modified marking
|
||||
ChatTrustLevel.createTag missing player: no grey Not Secure bar or Modified tag on player chat lines
|
||||
GuiMessage.splitLines port crates/horizon-client/src/chat.rs::Chat::add_lines gap: minor: no width reserved for a tag icon; Horizon draws no icon tags
|
||||
GuiMessageTag.chatModified missing minor: no Modified tag text or icon (needs the trust check)
|
||||
GuiMessageTag.Icon.extractRenderState missing minor: the chat_modified icon is never drawn
|
||||
LoggedChatMessage.Player.toContentComponent skip:service chat report view of a logged line
|
||||
LoggedChatMessage.Player.toNarrationComponent skip:service chat report view of a logged line
|
||||
LoggedChatMessage.Player.toHeadingComponent skip:service chat report view of a logged line
|
||||
LoggedChatMessage.Player.getTimeComponent skip:service chat report view of a logged line
|
||||
AbuseReportSender.Services.send skip:service chat and player reporting
|
||||
AbuseReportSender.Services.getErrorDescription skip:service chat and player reporting
|
||||
BanReason.byId skip:service chat and player reporting
|
||||
ChatReport.toggleReported skip:service chat and player reporting
|
||||
ChatReport.copy skip:service chat and player reporting
|
||||
ChatReport.Builder.hasContent skip:service chat and player reporting
|
||||
ChatReport.Builder.checkBuildable skip:service chat and player reporting
|
||||
ChatReport.Builder.build skip:service chat and player reporting
|
||||
ChatReport.Builder.buildEvidence skip:service chat and player reporting
|
||||
ChatReport.Builder.buildReportedChatMessage skip:service chat and player reporting
|
||||
ChatReportContextBuilder.collectAllContext skip:service chat and player reporting
|
||||
ChatReportContextBuilder.acceptContext skip:service chat and player reporting
|
||||
ChatReportContextBuilder.Collector.accept skip:service chat and player reporting
|
||||
ChatReportContextBuilder.Collector.isComplete skip:service chat and player reporting
|
||||
NameReport.copy skip:service chat and player reporting
|
||||
NameReport.Builder.checkBuildable skip:service chat and player reporting
|
||||
NameReport.Builder.build skip:service chat and player reporting
|
||||
ReportEnvironment.thirdPartyServerInfo skip:service chat and player reporting
|
||||
ReportEnvironment.realmInfo skip:service chat and player reporting
|
||||
ReportEnvironment.getClientVersion skip:service chat and player reporting
|
||||
ReportReason.getIncompatibleCategories skip:service chat and player reporting
|
||||
ReportingContext.create skip:service chat and player reporting
|
||||
ReportingContext.draftReportHandled skip:service chat and player reporting
|
||||
ReportingContext.hasDraftReportFor skip:service chat and player reporting
|
||||
SkinReport.copy skip:service chat and player reporting
|
||||
SkinReport.Builder.hasContent skip:service chat and player reporting
|
||||
SkinReport.Builder.checkBuildable skip:service chat and player reporting
|
||||
SkinReport.Builder.build skip:service chat and player reporting
|
||||
BlockStatePredictionHandler.updateKnownServerState port crates/horizon-client/src/game/remote.rs::Game::server_block a predicted block keeps its predicted state; the server state is remembered
|
||||
BlockStatePredictionHandler.startPredicting port crates/horizon-client/src/game/remote.rs::Game::predict_break gap: minor: the sequence number is passed in by the caller instead of counted here
|
||||
AddressCheck.createFromService missing minor: no block-list suppliers are loaded, so no address is refused on connect
|
||||
ServerAddress.isValidAddress port crates/horizon-protocol/src/servers.rs::parse_address gap: minor: no IDN check on the host name
|
||||
ServerAddress.equals skip:java value equality; Horizon compares the strings
|
||||
ServerNameResolver.resolveAddress port crates/horizon-protocol/src/resolver.rs::resolve gap: minor: no block-list check on the resolved address
|
||||
ServerRedirectHandler.createDnsSrvRedirectHandler port crates/horizon-protocol/src/resolver.rs::srv_redirect SRV lookup of _minecraft._tcp on port 25565
|
||||
AbstractBoatRenderer.submit port crates/horizon-client/src/game/boats.rs::Game::boat_geometry gap: player: no bubble-column wobble (bubbleAngle tilt); the rest of the transform, hurt tilt and paddles are drawn
|
||||
AbstractBoatRenderer.extractRenderState inline crates/horizon-client/src/game/boats.rs::Game::boat_geometry gap: player: bubbleAngle is not read, so boats in bubble columns do not wobble
|
||||
AbstractCubeMobRenderer.downscaleSlightly port crates/horizon-client/src/mobs/cube.rs::scale slime only: the 0.999 scale and small lift
|
||||
AbstractCubeMobRenderer.applySizeAndSquish port crates/horizon-client/src/mobs/cube.rs::scale size and squish scale
|
||||
AbstractCubeMobRenderer.extractRenderState port crates/horizon-client/src/mobs/cube.rs::scale squish and size are read from the mob at draw time
|
||||
AbstractHoglinRenderer.extractRenderState port crates/horizon-client/src/mobs/piglin.rs::hoglin_anim the headbutt count (anim_ticks) drives the head pose
|
||||
AbstractHorseRenderer.extractRenderState port crates/horizon-client/src/mobs/equine.rs::anim eat, stand and mouth poses; saddle and armour come from render.rs layers
|
||||
AbstractMinecartRenderer.submit port crates/horizon-client/src/game/minecarts.rs::Game::cart_geometry gap: player: no hurt tilt when a cart is hit (hurt_time is not read here); minor: no per-cart offset jitter
|
||||
AbstractMinecartRenderer.newRender missing minor: experimental minecart movement (new render path) is not implemented
|
||||
AbstractMinecartRenderer.oldRender port crates/horizon-client/src/game/minecarts.rs::Game::cart_geometry rail-based draw is the path Horizon has
|
||||
AbstractMinecartRenderer.newExtractState missing minor: experimental minecart movement (new render path) is not implemented
|
||||
AbstractMinecartRenderer.oldExtractState port crates/horizon-client/src/game/minecarts.rs::Game::cart_geometry rail front and back points are taken from the cart's rail position
|
||||
AbstractMinecartRenderer.getRenderOffset missing minor: only the new render path offsets the cart
|
||||
AbstractSkeletonRenderer.extractRenderState port crates/horizon-client/src/mobs/anim.rs::setup gap: player: a skeleton's freeze-conversion shake (its isShaking) is not drawn; the aggressive and bow flags are read in setup
|
||||
AbstractSkeletonRenderer.getArmPose port crates/horizon-client/src/mobs/anim.rs::setup bow-and-arrow arm pose when aggressive with a bow
|
||||
AbstractZombieRenderer.extractRenderState port crates/horizon-client/src/mobs/anim.rs::setup aggressive arms (zombie arm pose)
|
||||
AbstractZombieRenderer.isShaking port crates/horizon-client/src/mobs/render.rs::shaking converting zombies and husks shake
|
||||
AgeableMobRenderer.submit port crates/horizon-client/src/mobs/render.rs::body baby or adult model choice
|
||||
AllayRenderer.extractRenderState port crates/horizon-client/src/mobs/allay.rs::animate dance, spin and hold clocks
|
||||
ArmadilloRenderer.extractRenderState port crates/horizon-client/src/mobs/armadillo.rs::animate roll-out, roll-up and peek states; hiding_in_shell covers the shell flag
|
||||
ArmorModelSet.get skip:java container lookup of baked models
|
||||
ArmorModelSet.map skip:java container of baked models
|
||||
ArmorModelSet.putFrom skip:java container of baked models
|
||||
ArmorModelSet.bake skip:data models are loaded from Horizon's assets, not baked from layer locations
|
||||
ArmorStandRenderer.extractRenderState port crates/horizon-client/src/game/armor_stands.rs::Game::armor_stand_geometry wiggle, small, marker and poses are read there
|
||||
ArmorStandRenderer.submit port crates/horizon-client/src/game/armor_stands.rs::Game::armor_stand_geometry small or big model
|
||||
ArmorStandRenderer.setupRotations port crates/horizon-client/src/game/armor_stands.rs::Game::armor_stand_geometry the wiggle turn after a hit
|
||||
ArmorStandRenderer.getRenderType port crates/horizon-client/src/game/armor_stands.rs::Game::armor_stand_geometry gap: minor: the translucent marker variant is not split out
|
||||
ArrowRenderer.submit inline crates/horizon-client/src/game/creatures.rs::Game::mob_geometry the arrow model is drawn here, turned by its yaw and pitch
|
||||
ArrowRenderer.extractRenderState inline crates/horizon-client/src/game/creatures.rs::Game::mob_geometry arrow yaw and pitch are read here
|
||||
AxolotlRenderer.extractRenderState port crates/horizon-client/src/mobs/axolotl.rs::Animation::tick in-water, on-ground, moving and playing-dead factors are updated here; poses in body_anim::axolotl
|
||||
BatRenderer.extractRenderState port crates/horizon-client/src/mobs/bat.rs::setup_animation_states flying and resting states; resting() is the flag
|
||||
BeeRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::bee stinger, wings on the ground, angry and roll read there
|
||||
BreezeRenderer.extractRenderState port crates/horizon-client/src/mobs/breeze.rs::anim idle, shoot, slide, inhale and long-jump states
|
||||
CamelRenderer.createCamelSaddleLayer port crates/horizon-client/src/mobs/render.rs::layers camel uses the equine saddle branch
|
||||
CamelRenderer.extractAdditionalState port crates/horizon-client/src/mobs/camel.rs::animation_states sit, stand, idle and dash states; the dash cooldown is in dash()
|
||||
CatRenderer.extractRenderState port crates/horizon-client/src/mobs/tame.rs::anim gap: player: sitting and roll poses are drawn; lie-down (lieDownAmount) and relaxed poses are not, so a cat never lies down
|
||||
ChickenRenderer.bakeModels skip:data models are loaded from Horizon's assets
|
||||
ChickenRenderer.submit port crates/horizon-client/src/mobs/render.rs::body adult, baby and cold model choice
|
||||
ChickenRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body texture by variant and age
|
||||
ChickenRenderer.extractRenderState port crates/horizon-client/src/mobs/anim.rs::setup wing flap and flap speed; the variant is read in render.rs::body
|
||||
CodRenderer.setupRotations missing player: a cod out of water is not turned onto its side and in water does not sway; salmon and tropical fish share this
|
||||
CopperGolemRenderer.extractRenderState port crates/horizon-client/src/mobs/copper_golem.rs::anim chest and idle animation states; the weathering texture comes from texture()
|
||||
CowRenderer.bakeModels skip:data models are loaded from Horizon's assets
|
||||
CowRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body variant texture, baby texture for babies
|
||||
CowRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::body variant is read there
|
||||
CowRenderer.submit port crates/horizon-client/src/mobs/render.rs::body model per variant and age
|
||||
CreakingRenderer.extractRenderState port crates/horizon-client/src/mobs/creaking.rs::animate attack, invulnerability and death clocks
|
||||
CreeperRenderer.extractRenderState port crates/horizon-client/src/overlay.rs::creeper_progress white flash from swelling; the charged layer is in render.rs (energy swirl)
|
||||
CushionRenderer.extractRenderState port crates/horizon-client/src/game/cushions.rs::Game::cushion_geometry yaw and colour texture are read there
|
||||
CushionRenderer.submit port crates/horizon-client/src/game/cushions.rs::Game::cushion_geometry turned to its facing and drawn
|
||||
DisplayRenderer.getSkyLightLevel port crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry brightness override
|
||||
DisplayRenderer.getBlockLightLevel port crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry brightness override
|
||||
DisplayRenderer.getShadowRadius missing minor: display shadows are not drawn (shadow_radius is stored and not read)
|
||||
DisplayRenderer.getShadowStrength missing minor: display shadows are not drawn (shadow_strength is stored and not read)
|
||||
DisplayRenderer.submit port crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry gap: player: only text displays are drawn; block and item displays are not
|
||||
DisplayRenderer.calculateOrientation port crates/horizon-client/src/text_display.rs::TextDisplayData::matrix billboard orientation (fixed, horizontal, vertical, center)
|
||||
DisplayRenderer.extractRenderState port crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry interpolation progress and the entity yaw and pitch are read there
|
||||
DisplayRenderer.BlockDisplayRenderer.extractRenderState missing player: block display entities are invisible; the remote path tracks only text displays
|
||||
DisplayRenderer.ItemDisplayRenderer.extractRenderState missing player: item display entities are invisible
|
||||
DisplayRenderer.ItemDisplayRenderer.submitInner missing player: item displays draw nothing
|
||||
DisplayRenderer.TextDisplayRenderer.extractRenderState port crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry render state comes from the text display's metadata
|
||||
DisplayRenderer.TextDisplayRenderer.submitInner port crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry text, background and opacity
|
||||
|
@@ -0,0 +1,149 @@
|
||||
DolphinRenderer.extractRenderState port crates/horizon-client/src/game/mob_blocks.rs::Game::held_item_geometry gap: minor: isMoving (dolphin motion flag) is not read
|
||||
DragonFireballRenderer.submit port crates/horizon-client/src/game/dragon.rs::Game::dragon_fireball_geometry
|
||||
DragonFireballRenderer.buildQuad inline crates/horizon-client/src/game/dragon.rs::Game::dragon_fireball_geometry quad built inline
|
||||
DragonFireballRenderer.vertex inline crates/horizon-client/src/game/dragon.rs::Game::dragon_fireball_geometry vertex built inline
|
||||
EndCrystalRenderer.submit port crates/horizon-client/src/game/end.rs::Game::end_crystal_geometry model at scale 2 and the beam to the target
|
||||
EndCrystalRenderer.extractRenderState inline crates/horizon-client/src/game/end.rs::Game::end_crystal_geometry age, show-bottom and beam target read from the crystal there
|
||||
EndCrystalRenderer.shouldRender inline crates/horizon-client/src/game/end.rs::Game::end_crystal_geometry gap: minor: no frustum test; crystals within 256 blocks always draw, beam included
|
||||
EnderDragonRenderer.submit port crates/horizon-client/src/game/dragon.rs::Game::dragon_geometry
|
||||
EnderDragonRenderer.submitRays port crates/horizon-client/src/game/dragon.rs::Game::dragon_rays
|
||||
EnderDragonRenderer.submitCrystalBeams port crates/horizon-client/src/game/dragon.rs::Game::crystal_beam
|
||||
EnderDragonRenderer.extractRenderState inline crates/horizon-client/src/game/dragon.rs::Game::dragon_geometry flap, death fade, hurt overlay, nearest-crystal beam and egg distance read there
|
||||
EndermanRenderer.getRenderOffset missing player: an angry enderman does not jitter sideways (vanilla random offset each frame); no such offset in the mob draw path
|
||||
EndermanRenderer.extractRenderState inline crates/horizon-client/src/mobs/enderman.rs::anim gap: minor: carried block is drawn by game/mob_blocks.rs, not from this pose
|
||||
EntityRenderDispatcher.getRenderer skip:other renderer lookup; Horizon dispatches by mob kind in game.rs::Game::entity_geometry and game/creatures.rs::Game::mob_geometry
|
||||
EntityRenderDispatcher.getAvatarRenderer port crates/horizon-client/src/mobs/render.rs::body slim or wide arm model by skin
|
||||
EntityRenderDispatcher.shouldRender skip:other frustum culling only; Horizon culls with its own entity culler
|
||||
EntityRenderDispatcher.extractEntity skip:other render-state wrapper with a crash report; Horizon has no separate extraction stage
|
||||
EntityRenderDispatcher.fillRendererDetails skip:debug crash report detail
|
||||
EntityRenderDispatcher.onResourceManagerReload skip:data renderer rebuild on resource reload; Horizon loads its assets from files
|
||||
EntityRenderer.getBlockLightLevel port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry burning mobs drawn at full light (game/creatures.rs::Game::mob_geometry); other entities use world light
|
||||
EntityRenderer.submit inline crates/horizon-client/src/game.rs::Game::entity_geometry leash ropes and name tags drawn in their own passes from there
|
||||
EntityRenderer.shouldShowName port crates/horizon-client/src/game/names.rs::Game::name_tags named mob under the crosshair
|
||||
EntityRenderer.submitNameDisplay port crates/horizon-client/src/game/names.rs::Game::name_tag_geometry
|
||||
EntityRenderer.createRenderState skip:java allocates the render-state object
|
||||
EntityRenderer.extractRenderState inline crates/horizon-client/src/game.rs::Game::entity_geometry positions, invisibility, leash state, outline colour and light read there
|
||||
EntityRenderer.finalizeRenderState inline crates/horizon-client/src/game.rs::Game::entity_geometry shadow pass after the entities
|
||||
EntityRenderer.extractShadowPiece port crates/horizon-client/src/shadows.rs::shadow block-top shadow pieces with fall-off
|
||||
EntityRenderer.getServerSideEntity skip:other no callers in vanilla (dead code)
|
||||
EntityRenderers.createEntityRenderers skip:data renderer registration table
|
||||
EntityRenderers.createAvatarRenderers skip:data renderer registration table
|
||||
EntityRenderers.validateRegistrations skip:debug startup check that every type has a renderer
|
||||
EvokerFangsRenderer.submit port crates/horizon-client/src/game/fangs.rs::Game::fangs_geometry bite progress and facing
|
||||
EvokerFangsRenderer.extractRenderState inline crates/horizon-client/src/game/fangs.rs::Game::fangs_geometry yaw and bite progress read there
|
||||
ExperienceOrbRenderer.submit inline crates/horizon-client/src/game.rs::Game::entity_geometry orb billboards with the pulsing colour, in the entity pass
|
||||
ExperienceOrbRenderer.vertex inline crates/horizon-client/src/game.rs::Game::entity_geometry vertex built inline
|
||||
FallingBlockRenderer.shouldRender missing minor: a falling block inside an identical block (vanilla hides it that tick) is still drawn; no such check in game.rs or falling_block.rs
|
||||
FallingBlockRenderer.submit inline crates/horizon-client/src/game.rs::Game::entity_geometry falling block pass with its baked block model
|
||||
FallingBlockRenderer.extractRenderState inline crates/horizon-client/src/game.rs::Game::entity_geometry position, state, biome tint and light read there
|
||||
FireworkEntityRenderer.extractRenderState port crates/horizon-client/src/game/fireworks.rs::Game::rocket_geometry angled rocket keeps its direction
|
||||
FishingHookRenderer.shouldRender inline crates/horizon-client/src/game/fishing.rs::Game::fishing_geometry hook drawn only with an owner
|
||||
FishingHookRenderer.submit port crates/horizon-client/src/game/fishing.rs::Game::fishing_geometry hook quad and line
|
||||
FishingHookRenderer.vertex inline crates/horizon-client/src/game/fishing.rs::Game::fishing_geometry hook quad vertex
|
||||
FishingHookRenderer.stringVertex inline crates/horizon-client/src/game/fishing.rs::Game::fishing_line line strip vertices
|
||||
FishingHookRenderer.extractRenderState port crates/horizon-client/src/game/fishing.rs::Game::rod_hand_position line origin from the rod hand
|
||||
FoxRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::fox crouch, sleep, sit, faceplant, pounce and head roll
|
||||
FrogRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::frog jump, croak, tongue and swim animations; climate texture in mobs/render.rs::body
|
||||
GiantMobRenderer.extractRenderState port crates/horizon-client/src/mobs/anim.rs::humanoid gap: minor: giant model comes from the species table (giant#main), not a separate renderer
|
||||
GlowSquidRenderer.getBlockLightLevel port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry gap: player: glow squid dark-tick light is not read, so its body never brightens in the dark
|
||||
GoatRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::goat horns and ramming head pitch
|
||||
GuardianRenderer.shouldRender skip:other frustum culling of the beam only; the guardian body is culled by the entity culler
|
||||
GuardianRenderer.getPosition inline crates/horizon-client/src/mobs/guardian.rs::beam_geometry target and eye positions
|
||||
GuardianRenderer.submit port crates/horizon-client/src/mobs/guardian.rs::beam_geometry beam to the attack target
|
||||
GuardianRenderer.vertex inline crates/horizon-client/src/mobs/guardian.rs::beam_geometry vertex built inline
|
||||
GuardianRenderer.extractRenderState port crates/horizon-client/src/mobs/guardian.rs::beam beam attack scale and time
|
||||
HappyGhastRenderer.getBoundingBoxForCulling skip:other culling box only
|
||||
HappyGhastRenderer.extractRenderState port crates/horizon-client/src/mobs/happy_ghast.rs::wearing_harness gap: player: the body item (harness) is not drawn on the ghast; only the harnessed state is read
|
||||
HoglinRenderer.isShaking port crates/horizon-client/src/mobs/render.rs::shaking converting hoglin shakes
|
||||
HorseRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body variant and baby texture
|
||||
HorseRenderer.extractRenderState port crates/horizon-client/src/mobs/equine.rs::markings variant, markings and armour layer
|
||||
HumanoidMobRenderer.getArmPose port crates/horizon-client/src/mobs/anim.rs::pose_arm spear and empty arm poses
|
||||
HumanoidMobRenderer.usesSpearPose inline crates/horizon-client/src/mobs/anim.rs::pose_arm spear pose check folded into the arm pose
|
||||
HumanoidMobRenderer.extractRenderState port crates/horizon-client/src/mobs/anim.rs::humanoid arm poses for both arms
|
||||
HumanoidMobRenderer.extractHumanoidRenderState port crates/horizon-client/src/mobs/anim.rs::humanoid crouch, swim, use-item hand, elytra and armour state
|
||||
HumanoidMobRenderer.getEquipmentIfRenderable port crates/horizon-client/src/mobs/render.rs::humanoid_armor armour slot shown only when renderable
|
||||
IllagerRenderer.extractRenderState port crates/horizon-client/src/mobs/illager.rs::holding_crossbow crossbow charge and aggressive pose
|
||||
IllusionerRenderer.extractRenderState port crates/horizon-client/src/mobs/illusioner.rs::offsets mirror-image offsets; casting flag
|
||||
IronGolemRenderer.extractRenderState port crates/horizon-client/src/mobs/golem.rs::client_tick gap: player: the offered poppy is not drawn in the golem hand and cracks from damage are not drawn
|
||||
IronGolemRenderer.setupRotations missing player: an iron golem does not tilt side to side as it walks (IronGolemRenderer.setupRotations); only arm and leg swing is ported in mobs/golem.rs
|
||||
ItemEntityRenderer.extractRenderState port crates/horizon-client/src/game/item_draw.rs::Game::dropped_item_geometry bob offset, spin and spread
|
||||
ItemEntityRenderer.renderMultipleFromCount port crates/horizon-client/src/item_render.rs::cluster_poses copies of a stack laid out by depth
|
||||
ItemFrameRenderer.submit port crates/horizon-client/src/game/frames.rs::Game::frame_geometry frame model, item or map
|
||||
ItemFrameRenderer.getRenderOffset inline crates/horizon-client/src/game/frames.rs::Game::frame_geometry offset in front of the wall
|
||||
ItemFrameRenderer.extractRenderState inline crates/horizon-client/src/game/frames.rs::Game::frame_geometry direction, item, rotation, glow and map read there
|
||||
LeashKnotRenderer.submit port crates/horizon-client/src/game/leads.rs::Game::leash_geometry knot drawn with the rope pass
|
||||
LightningBoltRenderer.quad inline crates/horizon-client/src/gfx/lightning.rs::geometry quad built inline
|
||||
LivingEntityRenderer.getBoundingBoxForCulling skip:other culling box only (dragon-head inflate)
|
||||
LivingEntityRenderer.isEntityUpsideDown port crates/horizon-client/src/mobs/render.rs::base_transform_at upside-down flip for Dinnerbone and Grumm
|
||||
LivingEntityRenderer.isUpsideDownName inline crates/horizon-client/src/mobs/render.rs::base_transform_at name check folded into the flip
|
||||
LivingEntityRenderer.extractNameTags port crates/horizon-client/src/game/names.rs::Game::name_tags gap: minor: unsure whether the name-tag distance attributes are read
|
||||
LivingEntityRenderer.solveBodyRot missing minor: unsure: no rider body-rotation clamp (85 degrees, 50 degree lag) found; mob AI turn limits only
|
||||
LlamaRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body variant and baby texture
|
||||
LlamaRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::llama chest flag; decor layers in mobs/render.rs::layers
|
||||
LlamaSpitRenderer.submit port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry gap: minor: drawn as a camera-facing sprite, not the spit model with its rotation
|
||||
LlamaSpitRenderer.extractRenderState inline crates/horizon-client/src/game/creatures.rs::Game::mob_geometry rotation read there
|
||||
MobRenderer.checkMagicName inline crates/horizon-client/src/mobs/render.rs::body gap: player: Toast is handled; a sheep named jeb_ does not get rainbow wool
|
||||
MushroomCowRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body variant and baby texture
|
||||
MushroomCowRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::body gap: player: the mushroom block on the back is not drawn
|
||||
NautilusRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::layers saddle and armour layers
|
||||
OcelotRenderer.extractRenderState missing player: an ocelot keeps the standing pose when crouching or sprinting; no ocelot pose code in mobs/
|
||||
OminousItemSpawnerRenderer.extractRenderState inline crates/horizon-client/src/game/ominous_item_spawner.rs::Game::ominous_item_spawner_geometry item and age read there
|
||||
OminousItemSpawnerRenderer.submit port crates/horizon-client/src/game/ominous_item_spawner.rs::Game::ominous_item_spawner_geometry spinning item cluster, scaled in during the first 50 ticks
|
||||
PaintingRenderer.submit port crates/horizon-client/src/game/paintings.rs::Game::painting_geometry
|
||||
PaintingRenderer.extractRenderState inline crates/horizon-client/src/game/paintings.rs::Game::painting_geometry per-segment light read there
|
||||
PaintingRenderer.renderPainting port crates/horizon-client/src/game/paintings.rs::Game::painting_geometry front, back and edge quads
|
||||
PaintingRenderer.vertex inline crates/horizon-client/src/game/paintings.rs::Game::painting_geometry vertex built inline
|
||||
PandaRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::panda sit, lie, sneeze and roll states
|
||||
ParrotRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::parrot pose and flap angle
|
||||
PhantomRenderer.extractRenderState port crates/horizon-client/src/mobs/phantom.rs::anim gap: player: phantom size is not read, so phantoms never grow
|
||||
PhantomRenderer.scale missing player: phantoms are never drawn larger (vanilla scale 1 + 0.15 x size); no phantom size in mobs/render.rs::species_scale
|
||||
PhantomRenderer.setupRotations port crates/horizon-client/src/mobs/phantom.rs::anim gap: minor: body pitch (xRot) is not applied; wings and tail are
|
||||
PigRenderer.bakeModels skip:data model baking; Horizon loads model data from files
|
||||
PigRenderer.submit port crates/horizon-client/src/mobs/render.rs::body cold or normal model by variant
|
||||
PigRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body variant and baby texture
|
||||
PigRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::layers saddle layer and variant
|
||||
PiglinRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body brute, baby and zombified texture
|
||||
PiglinRenderer.extractRenderState port crates/horizon-client/src/mobs/anim.rs::humanoid brute flag, arm pose and crossbow charge
|
||||
PiglinRenderer.isShaking port crates/horizon-client/src/mobs/render.rs::shaking converting piglin shakes
|
||||
PolarBearRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::polar_bear standing scale
|
||||
PufferfishRenderer.submit port crates/horizon-client/src/mobs/render.rs::body small, medium or big model by size
|
||||
PufferfishRenderer.setupRotations missing player: a pufferfish does not bob up and down (cos bob, 0.08 blocks); no such offset in mobs/anim.rs, body_anim.rs or aquatic.rs
|
||||
RabbitRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::rabbit hop and idle head-tilt animations; Toast name in mobs/render.rs::body
|
||||
RavagerRenderer.extractRenderState port crates/horizon-client/src/mobs/ravager.rs::anim stun, bite and roar clocks
|
||||
SalmonRenderer.setupRotations missing player: salmon do not wiggle their body while swimming or flop on land (SalmonRenderer.setupRotations); no 4.3 amplitude or flop pose in mobs/
|
||||
SheepRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::sheep_wool_rgb gap: player: sheep named jeb_ do not cycle their wool colour; head eat and sheared state read elsewhere
|
||||
ShulkerBulletRenderer.submit port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry gap: minor: drawn as a spark sprite, not the spinning two-layer model
|
||||
ShulkerBulletRenderer.extractRenderState inline crates/horizon-client/src/game/creatures.rs::Game::mob_geometry rotation read there
|
||||
ShulkerRenderer.shouldRender skip:other frustum culling only
|
||||
ShulkerRenderer.getTextureLocation port crates/horizon-client/src/mobs/shulker.rs::texture colour texture
|
||||
ShulkerRenderer.extractRenderState port crates/horizon-client/src/mobs/shulker.rs::rotations peek and head angles
|
||||
SnifferRenderer.extractRenderState port crates/horizon-client/src/mobs/sniffer.rs::anim searching state and animation clocks
|
||||
SnowGolemRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::snow_golem gap: player: a carved pumpkin on the head is not drawn; the pumpkin flag is not read
|
||||
SquidRenderer.extractRenderState port crates/horizon-client/src/mobs/aquatic.rs::squid_ai_step tentacle cycle clock
|
||||
SquidRenderer.setupRotations missing player: a squid does not tilt its body while swimming (xBodyRot, zBodyRot); only the vector rotation for ink exists in mobs/aquatic.rs
|
||||
StriderRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body cold texture when suffocating
|
||||
StriderRenderer.getShadowRadius missing minor: a baby strider keeps the full shadow (shadows.rs::shadow_params takes the species only)
|
||||
StriderRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::strider saddle, suffocating and ridden states
|
||||
StriderRenderer.isShaking port crates/horizon-client/src/mobs/render.rs::shaking suffocating strider shakes
|
||||
SulfurCubeRenderer.submit port crates/horizon-client/src/mobs/sulfur_cube.rs::body normal or small model
|
||||
SulfurCubeRenderer.extractRenderState port crates/horizon-client/src/game/sulfur_cubes.rs::Game::sulfur_cube_body_geometry fuse flash, contained block and worn head
|
||||
SulfurCubeRenderer.applySizeAndSquish port crates/horizon-client/src/mobs/sulfur_cube.rs::scale size and squish scale
|
||||
ThrownItemRenderer.submit port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry thrown item sprite at its scale
|
||||
ThrownItemRenderer.extractRenderState inline crates/horizon-client/src/game/creatures.rs::Game::mob_geometry item sprite read there
|
||||
ThrownTridentRenderer.submit port crates/horizon-client/src/game/trident.rs::Game::trident_geometry gap: minor: foil glint is not drawn on a thrown trident
|
||||
ThrownTridentRenderer.extractRenderState inline crates/horizon-client/src/game/trident.rs::Game::trident_geometry yaw, pitch and foil read there
|
||||
TippableArrowRenderer.extractRenderState missing player: a tipped arrow looks like a plain arrow; no potion colour on arrows in game/creatures.rs or projectiles.rs
|
||||
TntMinecartRenderer.submitMinecartContents port crates/horizon-client/src/game/minecarts.rs::Game::cart_geometry TNT block swell and white flash
|
||||
TntMinecartRenderer.submitWhiteSolidBlock inline crates/horizon-client/src/game/minecarts.rs::Game::cart_geometry white overlay built inline
|
||||
TntMinecartRenderer.extractRenderState inline crates/horizon-client/src/game/minecarts.rs::Game::cart_geometry fuse read from the cart
|
||||
TntRenderer.submit port crates/horizon-client/src/game/tnt.rs::Game::tnt_geometry swell and white flash
|
||||
TntRenderer.getSwellAmount inline crates/horizon-client/src/game/tnt.rs::Game::tnt_geometry swell curve folded in
|
||||
TntRenderer.isLit inline crates/horizon-client/src/game/tnt.rs::Game::tnt_geometry flash every 5 ticks
|
||||
TntRenderer.extractRenderState inline crates/horizon-client/src/game/tnt.rs::Game::tnt_geometry fuse read there
|
||||
TropicalFishRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body small or large texture
|
||||
TropicalFishRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::body_color pattern colours
|
||||
TropicalFishRenderer.submit port crates/horizon-client/src/mobs/render.rs::body small or large model
|
||||
TropicalFishRenderer.setupRotations missing player: a tropical fish does not wiggle its body while swimming or flop on land (see SalmonRenderer.setupRotations); no 4.3 amplitude in mobs/
|
||||
TurtleRenderer.getShadowRadius missing minor: a baby turtle keeps the full shadow (shadows.rs::shadow_params takes the species only)
|
||||
TurtleRenderer.extractRenderState port crates/horizon-client/src/mobs/body_anim.rs::turtle on-land, laying and egg states
|
||||
VexRenderer.extractRenderState port crates/horizon-client/src/mobs/vex.rs::anim charging pose; held item in mobs/render.rs::hand_base
|
||||
|
@@ -0,0 +1,149 @@
|
||||
VillagerRenderer.getShadowRadius missing minor: baby villagers keep the full shadow radius; shadows.rs shadow_params takes no baby flag
|
||||
VillagerRenderer.extractRenderState port crates/horizon-client/src/mobs/villager.rs::anim unhappy head shake read here; gap: player: no held item is read (Horizon villagers carry none)
|
||||
WanderingTraderRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::render_with the trader's unhappy counter is never ticked in vanilla (only Villager ticks it), so nothing is read
|
||||
WardenRenderer.<init> port crates/horizon-client/src/mobs/warden.rs::emissive_layers the four emissive layers: bioluminescent, pulsating spots, tendrils, heart
|
||||
WardenRenderer.extractRenderState port crates/horizon-client/src/mobs/warden.rs::anim tendril and heart clocks and the animation states (roar, sniff, emerge, dig, attack, sonic boom)
|
||||
WindChargeRenderer.submit port crates/horizon-client/src/game/wind.rs::Game::wind_charge_geometry gap: player: the wind texture does not scroll (no xOffset), the charge is drawn with a fixed texture
|
||||
WitchRenderer.extractRenderState port crates/horizon-client/src/mobs/witch.rs::anim nose wobble; gap: player: the held potion is not drawn (see WitchItemLayer.applyTranslation)
|
||||
WitherBossRenderer.getTextureLocation port crates/horizon-client/src/mobs/wither.rs::texture invulnerable blink texture
|
||||
WitherBossRenderer.extractRenderState port crates/horizon-client/src/mobs/wither.rs::anim invulnerable clock feeds the texture and scale; the powered glow is render.rs::energy_swirl
|
||||
WitherSkullRenderer.createSkullLayer skip:data the skull model is baked into entity-models.json
|
||||
WitherSkullRenderer.submit port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry gap: player: the skull is drawn as a flat sprite (Projectile::item_sprite), not the 3D skull model
|
||||
WitherSkullRenderer.extractRenderState port crates/horizon-client/src/projectiles.rs::Projectile::item_sprite the dangerous (blue) skull texture is chosen here; gap: player: skull turns are not drawn (sprite only)
|
||||
WolfRenderer.getModelTint port crates/horizon-client/src/mobs/tame.rs::tint wet shade as a vertex colour
|
||||
WolfRenderer.extractRenderState port crates/horizon-client/src/mobs/tame.rs::anim tail angle, head roll and shake body roll; texture, collar and armour are read at draw
|
||||
ZombieNautilusRenderer.bakeModels skip:data models are baked into entity-models.json
|
||||
ZombieNautilusRenderer.submit port crates/horizon-client/src/mobs/render.rs::body model chosen by variant
|
||||
ZombieNautilusRenderer.getTextureLocation port crates/horizon-client/src/mobs/render.rs::body texture by variant
|
||||
ZombieNautilusRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::layers saddle and armour layers
|
||||
ZombieVillagerRenderer.extractRenderState port crates/horizon-client/src/mobs/render.rs::shaking converting shake; type and profession are in layers, aggressive arms in anim
|
||||
ZombieVillagerRenderer.isShaking port crates/horizon-client/src/mobs/render.rs::shaking converting zombie villagers shake
|
||||
BlockDecorationLayer.submit missing player: a block placed on a copper golem's antenna is not drawn; Horizon reads the antenna slot only as the flower
|
||||
BreezeEyesLayer.submit port crates/horizon-client/src/mobs/render.rs::layers breeze eyes layer, full bright
|
||||
BreezeWindLayer.submit port crates/horizon-client/src/mobs/render.rs::layers gap: player: the wind layer does not scroll (no texture offset, as noted in layers)
|
||||
CapeLayer.hasLayer missing player: capes are never drawn; skin cape textures are downloaded (skins.rs) but no draw reads them
|
||||
CapeLayer.submit missing player: capes are never drawn (see CapeLayer.hasLayer)
|
||||
CarriedBlockLayer.submit port crates/horizon-client/src/game/mob_blocks.rs::Game::mob_block_geometry the enderman's carried block
|
||||
CatCollarLayer.submit port crates/horizon-client/src/mobs/render.rs::layers dyed collar
|
||||
CrossedArmsItemLayer.submit missing player: a villager or wandering trader never shows an item in its folded arms (Horizon villagers carry nothing and the villager model has no right_arm for the hand lookup)
|
||||
CrossedArmsItemLayer.applyTranslation missing player: no crossed-arms item placement (see CrossedArmsItemLayer.submit)
|
||||
CustomHeadLayer.submit missing player: a skull or head in the head slot (player, zombie, creeper, dragon heads) is not drawn on players or mobs; only the snow golem pumpkin and mooshroom mushrooms are placed
|
||||
CustomHeadLayer.resolveSkullRenderType missing player: player-head skins on worn heads are never resolved (no worn heads are drawn, see CustomHeadLayer.submit)
|
||||
Deadmau5EarsLayer.submit missing minor: only a player named deadmau5 gets ears; the name tag lift for them is missing too
|
||||
DolphinCarryingItemLayer.submit missing player: a dolphin carrying an item shows nothing (the dolphin model has no arm bones for the hand lookup)
|
||||
DrownedOuterLayer.submit port crates/horizon-client/src/mobs/render.rs::layers drowned outer layer, adult and baby
|
||||
EnergySwirlLayer.submit port crates/horizon-client/src/mobs/render.rs::energy_swirl charged creeper and powered wither swirl, drawn in render_visible
|
||||
EquipmentLayerRenderer.renderLayers port crates/horizon-client/src/game/armor_stands.rs::Game::armor_layers gap: player: the leather overlay (layer 1 of the equipment asset) is never drawn, only layer 0
|
||||
EquipmentLayerRenderer.getColorForLayer port crates/horizon-client/src/game/armor_stands.rs::Game::armor_layers gap: player: a dyed leather piece is drawn in the undyed brown; the stack's dyed colour is not read
|
||||
EquipmentLayerRenderer.TrimTextureKey.createTextureWithNoPalette port crates/horizon-client/src/trims.rs::TrimTexture::generate a trim with no palette is used as its own texture
|
||||
EyesLayer.submit port crates/horizon-client/src/mobs/render.rs::layers spider, enderman and phantom eyes
|
||||
FoxHeldItemLayer.submit missing player: a fox's food in its mouth (berries, fish) is not drawn; the fox model has no arm bones for the hand lookup
|
||||
HorseMarkingLayer.submit port crates/horizon-client/src/mobs/render.rs::layers horse markings layer
|
||||
HumanoidArmorLayer.shouldRender port crates/horizon-client/src/mobs/render.rs::humanoid_armor slot read from the item id suffix (_helmet and so on); players use Game::armor_layers
|
||||
HumanoidArmorLayer.submit port crates/horizon-client/src/mobs/render.rs::humanoid_armor armour for mobs; players use Game::armor_layers
|
||||
HumanoidArmorLayer.renderArmorPiece port crates/horizon-client/src/mobs/render.rs::humanoid_armor one armour piece per slot with its layer model
|
||||
HumanoidArmorLayer.getArmorModel port crates/horizon-client/src/mobs/render.rs::humanoid_armor armour model is the body's #helmet, #chestplate, #leggings or #boots part
|
||||
IronGolemCrackinessLayer.submit port crates/horizon-client/src/mobs/render.rs::layers crack levels via golem::crackiness
|
||||
IronGolemFlowerLayer.submit missing player: an iron golem offering a poppy raises its arm (golem anim) but no poppy is drawn in it
|
||||
ItemInHandLayer.submit port crates/horizon-client/src/game/mob_blocks.rs::Game::held_item_geometry both hands through the item pipeline
|
||||
ItemInHandLayer.useBabyOffset port crates/horizon-client/src/mobs/render.rs::hand_base baby hand offset
|
||||
LivingEntityEmissiveLayer.submit port crates/horizon-client/src/mobs/render.rs::layers emissive layers drawn full bright; warden alpha is in warden::emissive_layers
|
||||
LlamaDecorLayer.submit port crates/horizon-client/src/mobs/llama.rs::decor carpet, or the trader llama's blanket
|
||||
LlamaDecorLayer.renderEquipment port crates/horizon-client/src/mobs/llama.rs::decor same decor model and texture
|
||||
MushroomCowMushroomLayer.submitMushroomBlock port crates/horizon-client/src/game/mob_blocks.rs::Game::worn_block_geometry mushrooms on an adult mooshroom
|
||||
PandaHoldsItemLayer.submit port crates/horizon-client/src/mobs/panda.rs::item_offset item in the mouth of a sitting panda, with the eating bob
|
||||
ParrotOnShoulderLayer.submit missing player: a tamed parrot on a player's shoulder is not drawn
|
||||
ParrotOnShoulderLayer.submitOnShoulder missing player: a parrot on a player's shoulder is not drawn (see ParrotOnShoulderLayer.submit)
|
||||
PlayerItemInHandLayer.submitArmWithItem port crates/horizon-client/src/game/mob_blocks.rs::Game::held_item_geometry gap: player: the spyglass raised to the eye is not drawn (see renderItemHeldToEye)
|
||||
PlayerItemInHandLayer.renderItemHeldToEye missing player: another player using a spyglass does not hold it at the eye in third person; Horizon has no held-on-head state
|
||||
RenderLayer.coloredCutoutModelCopyLayerRender port crates/horizon-client/src/mobs/render.rs::render_visible coloured cutout layers drawn in render_visible
|
||||
RenderLayer.renderColoredCutoutModel port crates/horizon-client/src/mobs/render.rs::render_visible coloured cutout layers drawn in render_visible
|
||||
RopesLayer.submit missing player: a harnessed happy ghast that holds a leash shows no rope model on its body
|
||||
SheepWoolLayer.submit port crates/horizon-client/src/mobs/render.rs::layers gap: minor: the outline-only pass for an invisible glowing sheep is not drawn
|
||||
SheepWoolUndercoatLayer.submit port crates/horizon-client/src/mobs/render.rs::layers gap: player: a sheep named jeb_ gets no undercoat while its wool is white (vanilla always draws it for jeb_)
|
||||
SimpleEquipmentLayer.submit port crates/horizon-client/src/mobs/render.rs::layers pig, strider and nautilus saddles and the happy ghast harness
|
||||
SkeletonClothingLayer.submit port crates/horizon-client/src/mobs/render.rs::layers stray and bogged overlay
|
||||
SlimeOuterLayer.submit port crates/horizon-client/src/mobs/render.rs::layers translucent outer slime cube
|
||||
SnowGolemHeadLayer.submit port crates/horizon-client/src/game/mob_blocks.rs::Game::worn_block_geometry carved pumpkin on the snow golem
|
||||
SpinAttackEffectLayer.submit port crates/horizon-client/src/game/perspective.rs::Game::spin_attack_geometry riptide spin model
|
||||
StuckInBodyLayer.submitStuckItem missing player: arrows stuck in a player's body are not drawn (Horizon keeps no stuck-arrow count)
|
||||
StuckInBodyLayer.submit missing player: arrows stuck in a player's body are not drawn (see submitStuckItem)
|
||||
SulfurCubeInnerLayer.submit port crates/horizon-client/src/mobs/render.rs::layers gap: player: a block swallowed by a sulfur cube is not drawn inside the shell (sulfur_cube::inner returns nothing when the cube has a body)
|
||||
TropicalFishPatternLayer.submit port crates/horizon-client/src/mobs/render.rs::layers pattern on the small or large model, tinted
|
||||
VillagerProfessionLayer.submit port crates/horizon-client/src/mobs/render.rs::layers type, profession and level layers; hat masks applied in render_visible
|
||||
VillagerProfessionLayer.getIdentifier port crates/horizon-client/src/mobs/render.rs::layers texture paths built per type, profession and level
|
||||
VillagerProfessionLayer.getHatData port crates/horizon-client/src/mobs/villager_hats.rs::VillagerHats::load hat metadata read from the resources
|
||||
WingsLayer.submit port crates/horizon-client/src/game/perspective.rs::Game::player_elytra_geometry gap: minor: the wings texture comes from the equipment asset; a skin's own elytra or cape texture is not used
|
||||
WingsLayer.getPlayerElytraTexture port crates/horizon-client/src/game/perspective.rs::Game::player_elytra_geometry gap: minor: a skin elytra or cape texture is never chosen
|
||||
WitchItemLayer.applyTranslation missing player: a witch's potion (drunk or about to be thrown) is not drawn; the witch model has no right_arm for the hand lookup
|
||||
WolfArmorLayer.submit port crates/horizon-client/src/mobs/render.rs::layers gap: minor: the armour texture is fixed to the armadillo scute; the equipment asset is not read
|
||||
WolfArmorLayer.maybeRenderCracks port crates/horizon-client/src/mobs/render.rs::layers cracks at three damage levels
|
||||
WolfCollarLayer.submit port crates/horizon-client/src/mobs/render.rs::layers dyed collar
|
||||
AvatarRenderer.<init> port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry gap: player: no cape, ears, worn head, parrot or stuck-arrow layer; armour, held items, wings and spin are drawn
|
||||
AvatarRenderer.getRenderOffset port crates/horizon-client/src/game/perspective.rs::Game::tick_player_model gap: minor: other players are not lowered 0.125 when sneaking; only the local model is
|
||||
AvatarRenderer.submitNameDisplay port crates/horizon-client/src/game/names.rs::Game::name_tag_geometry gap: minor: the 10 unit lift for ears is not applied (no ears)
|
||||
AvatarRenderer.extractRenderState port crates/horizon-client/src/mobs.rs::Mob::tick_avatar_pose glide count, wings and swim read here; gap: player: arrow and stinger counts, parrots, cape, ears and the spyglass use are not read
|
||||
AvatarRenderer.shouldShowName port crates/horizon-client/src/game/names.rs::Game::name_tags name tags for players and named mobs
|
||||
AvatarRenderer.extractFlightData port crates/horizon-client/src/mobs/render.rs::base_transform_at glide time drives the tilt; gap: player: the body does not turn toward the flight direction (no flying yaw)
|
||||
AvatarRenderer.extractCapeState missing player: capes are never drawn, so the cape flap and lean are never used
|
||||
AvatarRenderer.renderRightHand port crates/horizon-client/src/game.rs::Game::hand_geometry first-person arm; gap: minor: no 0.1 radian arm tilt or sleeve toggle in hand_geometry
|
||||
AvatarRenderer.renderLeftHand port crates/horizon-client/src/game.rs::Game::hand_geometry first-person arm; gap: minor: no 0.1 radian arm tilt or sleeve toggle in hand_geometry
|
||||
AvatarRenderer.renderHand port crates/horizon-client/src/game.rs::Game::hand_geometry first-person arm; gap: minor: no 0.1 radian arm tilt or sleeve toggle in hand_geometry
|
||||
AvatarRenderer.isEntityUpsideDown port crates/horizon-client/src/mobs/render.rs::base_transform_at Dinnerbone and Grumm flip; gap: minor: the cape-shown check is missing and the flip applies to every mob
|
||||
ArmedEntityRenderState.getArmPose port crates/horizon-client/src/mobs/anim.rs::setup arm poses are chosen per species and hand inside setup
|
||||
ArmedEntityRenderState.extractArmedEntityRenderState port crates/horizon-client/src/mobs/anim.rs::state swing and main arm; the held items are read in Game::held_item_geometry
|
||||
AvatarRenderState.fallFlyingScale port crates/horizon-client/src/mobs/render.rs::base_transform_at glide scale: ticks squared over 100, clamped to 1
|
||||
EnderDragonRenderState.getHeadPartYOffset port crates/horizon-client/src/game/dragon.rs::Game::dragon_geometry sitting, landing and the part 6 cases
|
||||
EntityRenderState.fillCrashReportCategory skip:debug crash report detail only
|
||||
HumanoidRenderState.ticksUsingItem port crates/horizon-client/src/game/mob_blocks.rs::Game::held_item_geometry use time for the hand that is using an item
|
||||
ItemClusterRenderState.extractItemGroupRenderState port crates/horizon-client/src/item_render.rs::rendered_amount rendered count of the stack; the seed is taken in cluster_poses
|
||||
SheepRenderState.getWoolColor port crates/horizon-client/src/mobs/render.rs::sheep_wool_rgb gap: player: a jeb_ sheep does not cycle through the rainbow (ColorLerper)
|
||||
BabyModelTransform.apply skip:data baby meshes are baked into entity-models.json
|
||||
HumanoidModel.createMesh skip:data humanoid mesh is baked into entity-models.json
|
||||
HumanoidModel.createArmorMeshSet skip:data armour meshes are baked into entity-models.json
|
||||
HumanoidModel.createBaseArmorMesh skip:data armour mesh is baked into entity-models.json
|
||||
HumanoidModel.createBabyArmorMesh skip:data baby armour mesh is baked into entity-models.json
|
||||
HumanoidModel.setupAttackAnimation port crates/horizon-client/src/mobs/anim.rs::humanoid body sway and the swinging arm
|
||||
Model.resetPose port crates/horizon-client/src/mobs/anim.rs::Poses::reset resets every part to its rest pose
|
||||
QuadrupedModel.createBodyMesh skip:data quadruped mesh is baked into entity-models.json
|
||||
QuadrupedModel.createLegs skip:data leg meshes are baked into entity-models.json
|
||||
BatModel.createBodyLayer skip:data bat model is baked into entity-models.json
|
||||
AllayModel.createBodyLayer skip:data allay model is baked into entity-models.json
|
||||
AllayModel.translateToHand port crates/horizon-client/src/mobs/render.rs::held_item_transform gap: player: the allay's own hand transform (0.7 scale, forearm offset) is not applied; the humanoid hand offset is used
|
||||
AdultArmadilloModel.createBodyLayer skip:data armadillo model is baked into entity-models.json
|
||||
BabyArmadilloModel.createBodyLayer skip:data baby armadillo model is baked into entity-models.json
|
||||
AdultAxolotlModel.setupAnim port crates/horizon-client/src/mobs/body_anim.rs::axolotl the axolotl pose dispatch
|
||||
AdultAxolotlModel.setupLayStillOnGroundAnimation port crates/horizon-client/src/mobs/body_anim.rs::axolotl_lay lay-still pose on the ground
|
||||
AdultAxolotlModel.setupGroundCrawlingAnimation port crates/horizon-client/src/mobs/body_anim.rs::axolotl_crawl ground crawl pose
|
||||
AdultAxolotlModel.setupWaterHoveringAnimation port crates/horizon-client/src/mobs/body_anim.rs::axolotl_hover hovering in water
|
||||
AdultAxolotlModel.setupSwimmingAnimation port crates/horizon-client/src/mobs/body_anim.rs::axolotl_swim swimming pose
|
||||
AdultAxolotlModel.setupPlayDeadAnimation port crates/horizon-client/src/mobs/body_anim.rs::axolotl_dead playing dead
|
||||
AdultAxolotlModel.applyMirrorLegRotations port crates/horizon-client/src/mobs/body_anim.rs::axolotl mirrored leg rotations, inline in axolotl
|
||||
AdultBeeModel.bobUpAndDown port crates/horizon-client/src/mobs/body_anim.rs::bee adult antennae wiggle (not for babies)
|
||||
BeeModel.bobUpAndDown port crates/horizon-client/src/mobs/body_anim.rs::bee bone, bob and leg swing
|
||||
BeeStingerModel.createBodyLayer skip:data stinger model is baked into entity-models.json
|
||||
AdultCamelModel.createBodyMesh skip:data camel mesh is baked into entity-models.json
|
||||
BabyCamelModel.createBodyLayer skip:data baby camel model is baked into entity-models.json
|
||||
CamelModel.applyHeadRotation port crates/horizon-client/src/mobs/camel.rs::anim head clamp and the jump cooldown lift
|
||||
CamelSaddleModel.createSaddleLayer skip:data saddle model is baked into entity-models.json
|
||||
AdultChickenModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::head head pitch and yaw from the state
|
||||
AdultChickenModel.createBaseChickenModel skip:data chicken mesh is baked into entity-models.json
|
||||
BabyChickenModel.createBodyLayer skip:data baby chicken model is baked into entity-models.json
|
||||
ChickenModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::setup leg swing and wing flap
|
||||
ColdChickenModel.createBodyLayer skip:data cold chicken model is baked into entity-models.json
|
||||
BabyCowModel.createBodyLayer skip:data baby cow model is baked into entity-models.json
|
||||
ColdCowModel.createBodyLayer skip:data cold cow model is baked into entity-models.json
|
||||
CowModel.createBaseCowModel skip:data cow mesh is baked into entity-models.json
|
||||
WarmCowModel.createBodyLayer skip:data warm cow model is baked into entity-models.json
|
||||
BabyDolphinModel.createBodyLayer skip:data baby dolphin model is baked into entity-models.json
|
||||
DolphinModel.createBodyLayer skip:data dolphin model is baked into entity-models.json
|
||||
DolphinModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim body turn and, while moving, the tail and fin swing; gap: minor: moving is read from horizontal velocity, not the isMoving flag
|
||||
AbstractEquineModel.createBodyMesh skip:data equine mesh is baked into entity-models.json
|
||||
AbstractEquineModel.animateHeadPartsPlacement port crates/horizon-client/src/mobs/equine.rs::anim head part placement while eating and standing
|
||||
BabyDonkeyModel.setupAnim port crates/horizon-client/src/mobs/equine.rs::anim baby donkey head pitch of -30 degrees and head part pose
|
||||
BabyDonkeyModel.offsetLegPositionWhenStanding port crates/horizon-client/src/mobs/equine.rs::anim hind leg heights when standing
|
||||
BabyDonkeyModel.animateHeadPartsPlacement port crates/horizon-client/src/mobs/equine.rs::anim baby donkey head part placement
|
||||
BabyHorseModel.createBabyMesh skip:data baby horse mesh is baked into entity-models.json
|
||||
BabyHorseModel.animateHeadPartsPlacement port crates/horizon-client/src/mobs/equine.rs::anim baby horse head part placement
|
||||
DonkeyModel.createBodyLayer skip:data donkey model is baked into entity-models.json
|
||||
DonkeyModel.setupAnim port crates/horizon-client/src/mobs/equine.rs::anim donkey pose
|
||||
|
@@ -0,0 +1,150 @@
|
||||
EquineSaddleModel.createSaddleLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
EquineSaddleModel.setupAnim missing player: a saddled horse with nobody riding it shows its reins (left and right saddle lines); vanilla hides them until it is ridden (render.rs draws the whole #saddle layer)
|
||||
AdultFelineModel.createBodyMesh skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyFelineModel.createBabyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CodModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CodModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
PufferfishBigModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
PufferfishMidModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
PufferfishSmallModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PufferfishSmallModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
SalmonModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SalmonModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
TropicalFishLargeModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
TropicalFishLargeModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
TropicalFishSmallModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
TropicalFishSmallModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
AdultFoxModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
AdultFoxModel.setSittingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
AdultFoxModel.setSleepingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
AdultFoxModel.setWalkingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
AdultFoxModel.setCrouchingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
AdultFoxModel.setPouncingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
BabyFoxModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyFoxModel.setSittingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
BabyFoxModel.setSleepingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
BabyFoxModel.setWalkingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
BabyFoxModel.setCrouchingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
FoxModel.setSleepingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
FoxModel.setWalkingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
FoxModel.setCrouchingPose port crates/horizon-client/src/mobs/body_anim.rs::fox fox pose branch (adult and baby) in the one fox pose function
|
||||
FrogModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
TadpoleModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
TadpoleModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
HappyGhastHarnessModel.createHarnessLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
HappyGhastModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyGoatModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
GoatModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
GoatModel.setupAnim port crates/horizon-client/src/mobs/body_anim.rs::goat horn visibility and ramming head pitch
|
||||
CopperGolemModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CopperGolemModel.createRunningPoseBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CopperGolemModel.createSittingPoseBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CopperGolemModel.createStarPoseBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CopperGolemModel.translateToHand missing player: an item a copper golem holds sits at the humanoid hand offset; vanilla turns it (IDLE) or scales it to 0.55 with its own grip (mobs/render.rs hand_base has only the vex case)
|
||||
CopperGolemModel.translateToHead skip:other only CustomHeadLayer calls it, and a copper golem has no head slot (its only extra slot is the antenna)
|
||||
CopperGolemModel.applyBlockOnAntennaTransform missing player: a block or flower on the copper golem antenna is not drawn; vanilla draws it with BlockDecorationLayer (nothing in mobs/render.rs draws the antenna item)
|
||||
IronGolemModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SnowGolemModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
LlamaSpitModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
NautilusArmorModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
NautilusModel.createBodyMesh skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
NautilusModel.createBabyBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
NautilusModel.applyBodyRotation inline crates/horizon-client/src/mobs/nautilus.rs::anim body yaw/pitch clamped to 10 degrees, inside the nautilus setupAnim
|
||||
NautilusSaddleModel.createSaddleLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyPandaModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PandaModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
ParrotModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
ParrotModel.prepare port crates/horizon-client/src/mobs/body_anim.rs::parrot sitting, flying and party leg/body offsets
|
||||
ParrotModel.getPose inline crates/horizon-client/src/mobs/body_anim.rs::anim pose chosen where the parrot is animated: party, sitting, flying (not on ground), standing
|
||||
BabyPigModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
ColdPigModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PigModel.createBasePigModel skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyPolarBearModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PolarBearModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
AdultRabbitModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyRabbitModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabySheepModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SheepFurModel.createFurLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SheepFurModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::setup Anim::Sheep arm: head lowered while eating grass
|
||||
SheepModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SheepModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::setup Anim::Sheep arm: head lowered while eating grass
|
||||
SnifferModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SniffletModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabySquidModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SquidModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
SquidModel.setupAnim port crates/horizon-client/src/mobs/aquatic.rs::anim aquatic setup arm for this species (fin/tail swing by age)
|
||||
AdultTurtleModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyTurtleModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
TurtleModel.setupAnim port crates/horizon-client/src/mobs/body_anim.rs::turtle walk swing on land, paddling in water, egg belly
|
||||
AdultWolfModel.setSittingPose port crates/horizon-client/src/mobs/tame.rs::anim adult upper body raised when sitting
|
||||
AdultWolfModel.shakeOffWater port crates/horizon-client/src/mobs/tame.rs::anim shake roll of head, body and tail (body_roll)
|
||||
BabyWolfModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyWolfModel.shakeOffWater port crates/horizon-client/src/mobs/tame.rs::anim shake roll of head, body and tail (body_roll)
|
||||
BabyWolfModel.setSittingPose port crates/horizon-client/src/mobs/tame.rs::anim baby sitting pose: body xRot minus pi/2
|
||||
WolfModel.setSittingPose port crates/horizon-client/src/mobs/tame.rs::anim sitting pose, adult and baby
|
||||
EvokerFangsModel.setupAnim port crates/horizon-client/src/game/fangs.rs::Game::fangs_geometry jaws, base sink and pre-scale
|
||||
SpearAnimations.thirdPersonAttackHand missing player: a spear stab shows the whack swing on other players and mobs; the arm does not thrust (STAB arm pose absent, only WHACK in mobs/anim.rs)
|
||||
SpearAnimations.firstPersonAttack missing player: when you stab with a spear your own hand does not thrust forward; the default swing plays instead (first_person.rs has no STAB pose)
|
||||
SpearAnimations.UseParams.fromKineticWeapon port crates/horizon-client/src/spear.rs::UseParams::of the charge timeline and sway values
|
||||
SpinAttackEffectModel.createLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
EntityModelSet.bakeLayer skip:data baking a layer; Horizon loads each layer from entity-models.json via load_model
|
||||
LayerDefinitions.createRoots skip:data layer registry; Horizon names layers by string key (minecraft:x#main)
|
||||
ModelLayers.register skip:data layer id registry; Horizon uses string keys
|
||||
ModelLayers.registerArmorSet skip:data layer id registry; Horizon uses string keys
|
||||
ModelPart.storePose skip:other no callers in vanilla; a snapshot of the current pose that nothing reads
|
||||
ModelPart.loadPose port crates/horizon-client/src/mobs.rs::Part::parse reads the pose from the model data; the reset per frame is Poses::reset
|
||||
ModelPart.getChild port crates/horizon-client/src/block_entity_render.rs::ModelPart::child named child lookup (Option instead of a throw)
|
||||
ModelPart.compile port crates/horizon-client/src/mobs/render.rs::draw_normals emits each polygon with the posed transform; skipDraw gating
|
||||
ModelPart.offsetRotation port crates/horizon-client/src/mobs/keyframes.rs::Animation::apply Target::Rotation channel adds to xRot/yRot/zRot
|
||||
ModelPart.offsetScale port crates/horizon-client/src/mobs/keyframes.rs::Animation::apply Target::Scale channel adds to the scale
|
||||
ModelPart.getAllParts inline crates/horizon-client/src/mobs/anim.rs::Poses::reset the part list Model.resetPose walks; Poses::reset refills the whole name map instead
|
||||
ModelPart.createPartLookup inline crates/horizon-client/src/mobs/anim.rs::Poses::reset gap: minor: duplicate part names keep the last part here, the first in vanilla (the name map is built by the same walk)
|
||||
ModelPart.addAllChildren inline crates/horizon-client/src/mobs/anim.rs::Poses::reset gap: minor: duplicate part names keep the last part here, the first in vanilla (the name map is built by the same walk)
|
||||
ModelPart.Cube.<init> skip:data geometry baked into entity-models.json, which Horizon loads as a resource (cube faces are precomputed polygons)
|
||||
ModelPart.Cube.compile port crates/horizon-client/src/mobs/render.rs::draw_normals six faces emitted from the posed part (polygons in Horizon)
|
||||
ModelPart.Polygon.<init> skip:data geometry baked into entity-models.json, which Horizon loads as a resource (polygons are precomputed)
|
||||
ModelPart.Vertex.remap skip:data UV normalisation done when entity-models.json is generated
|
||||
PartPose.offsetAndRotation skip:data pose builder; baked poses come from entity-models.json
|
||||
PartPose.translated skip:data pose builder; baked poses come from entity-models.json
|
||||
PartPose.withScale skip:data pose builder; baked poses come from entity-models.json
|
||||
PartPose.scaled skip:data pose builder; baked poses come from entity-models.json
|
||||
CubeDefinition.bake skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CubeDeformation.extend skip:java builder value for cube inflation, folded into the baked geometry
|
||||
CubeListBuilder.addBox skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
LayerDefinition.bakeRoot skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
MeshTransformer.scaling skip:data baby scaling applied when entity-models.json is generated
|
||||
PartDefinition.addOrReplaceChild skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PartDefinition.clearRecursively skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PartDefinition.clearChild skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PartDefinition.retainPartsAndChildren skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PartDefinition.retainExactParts skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PartDefinition.bake skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
PartDefinition.transformed skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
UVPair.pack skip:java packs two texture coordinates for the builder; Horizon stores normalised UVs
|
||||
BlazeModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BreezeModel.createBaseMesh skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BreezeModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BreezeModel.createWindLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BreezeModel.createEyesLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CreakingModel.createMesh skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CreakingModel.createEyesLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CreeperModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
CreeperModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::setup Anim::Creeper arm: head and legs
|
||||
EnderDragonModel.<init> skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
EnderDragonModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
EnderDragonModel.poseLimbs inline crates/horizon-client/src/game/dragon.rs::Game::dragon_geometry leg and foot pitches inside the dragon pose
|
||||
EndermanModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
EndermiteModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
GhastModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
GuardianModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
GuardianModel.setupSpikes inline crates/horizon-client/src/mobs/guardian.rs::anim spike offsets and positions, inside the guardian setupAnim
|
||||
GuardianModel.getSpikeOffset inline crates/horizon-client/src/mobs/guardian.rs::anim spike offsets and positions, inside the guardian setupAnim
|
||||
GuardianModel.getSpikeY inline crates/horizon-client/src/mobs/guardian.rs::anim spike offsets and positions, inside the guardian setupAnim
|
||||
BabyHoglinModel.animateHeadbutt inline crates/horizon-client/src/mobs/piglin.rs::hoglin_anim baby head lift in the headbutt; adult head lerp is in the same fn
|
||||
BabyHoglinModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
HoglinModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
IllagerModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
AbstractPiglinModel.removeEars skip:data geometry baked into entity-models.json, which Horizon loads as a resource (ears are part of the baked piglin head)
|
||||
AbstractPiglinModel.addHead skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
AdultPiglinModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
BabyPiglinModel.createBodyLayer skip:data geometry baked into entity-models.json, which Horizon loads as a resource
|
||||
|
@@ -0,0 +1,149 @@
|
||||
PiglinModel.setupAttackAnimation port crates/horizon-client/src/mobs/anim.rs::humanoid melee swing branch via weapon_swing, which piglin_pose sets
|
||||
PiglinModel.holdWeaponHigh port crates/horizon-client/src/mobs/piglin.rs::piglin_pose holdWeaponHigh arm pose when the swing is at rest
|
||||
ZombifiedPiglinModel.setupAttackAnimation port crates/horizon-client/src/mobs/anim.rs::humanoid zombie arm raise via the zombie flag (Anim::ZombifiedPiglin)
|
||||
RavagerModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ShulkerModel.createShellMesh skip:data layer baked into entity-models.json, loaded by key
|
||||
ShulkerModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SilverfishModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
BoggedModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
BoggedModel.setupAnim missing player: a sheared bogged keeps its mushrooms on its head; Bogged shearing sets sheared but nothing hides the mushrooms part
|
||||
SkeletonModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SkeletonModel.createDefaultSkeletonMesh skip:data layer baked into entity-models.json, loaded by key
|
||||
SkeletonModel.createSingleModelDualBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SkeletonModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::setup skeleton melee pose in the Skeleton branch of setup
|
||||
SkeletonModel.translateToHand port crates/horizon-client/src/mobs/render.rs::hand_base held item hand offset for skeletons (plus or minus one pixel)
|
||||
MagmaCubeModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SlimeModel.createOuterBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SlimeModel.createInnerBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SmallSulfurCubeModel.createOuterBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SmallSulfurCubeModel.createInnerBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SulfurCubeModel.createOuterBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SulfurCubeModel.createInnerBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SpiderModel.createSpiderBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SpiderModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::setup Spider branch of setup: four leg pairs swing and step
|
||||
AdultStriderModel.customAnimations port crates/horizon-client/src/mobs/body_anim.rs::strider adult bristles on z, body and leg bob, shared with the baby
|
||||
BabyStriderModel.customAnimations port crates/horizon-client/src/mobs/body_anim.rs::strider baby bristles on x, body and leg bob, ridden flag not used
|
||||
VexModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
VexModel.setArmsCharging inline crates/horizon-client/src/mobs/vex.rs::anim charging arm pose inside the flag branch of vex anim
|
||||
WardenModel.createBioluminescentLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
WardenModel.createPulsatingSpotsLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
WardenModel.animateHeadLookTarget inline crates/horizon-client/src/mobs/warden.rs::anim head yaw and pitch set first in warden anim
|
||||
WardenModel.animateIdlePose inline crates/horizon-client/src/mobs/warden.rs::anim head and body wobble in warden anim
|
||||
WardenModel.animateWalk inline crates/horizon-client/src/mobs/warden.rs::anim walk swing, arm and body tilt in warden anim
|
||||
WardenModel.resetArmPoses inline crates/horizon-client/src/mobs/warden.rs::anim arm rest positions reset in warden anim
|
||||
WardenModel.animateTendrils inline crates/horizon-client/src/mobs/warden.rs::anim tendril sway from the tendril animation value
|
||||
WitchModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
WitherBossModel.setupHeadRotation inline crates/horizon-client/src/mobs/wither.rs::anim side head yaw minus body yaw in wither anim
|
||||
BabyZombieModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
BabyZombieVillagerModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
BabyZombieVillagerModel.createNoHatLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
DrownedModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
DrownedModel.setupAttackAnimation port crates/horizon-client/src/mobs/anim.rs::humanoid zombie arm raise via the zombie flag (Anim::Drowned)
|
||||
GiantZombieModel.setupAttackAnimation port crates/horizon-client/src/mobs/anim.rs::humanoid giant is Humanoid with zombie_arms, same zombie arm raise
|
||||
ZombieVillagerModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ZombieVillagerModel.createNoHatLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ZombieVillagerModel.createArmorLayerSet skip:data layer baked into entity-models.json, loaded by key
|
||||
ZombieVillagerModel.createBaseArmorMesh skip:data layer baked into entity-models.json, loaded by key
|
||||
ZombieVillagerModel.setupAttackAnimation port crates/horizon-client/src/mobs/anim.rs::humanoid zombie arm raise via the zombie flag (Anim::ZombieVillager)
|
||||
BabyVillagerModel.createBodyModel skip:data layer baked into entity-models.json, loaded by key
|
||||
VillagerModel.createBodyModel skip:data layer baked into entity-models.json, loaded by key
|
||||
ArmorStandArmorModel.createArmorLayerSet skip:data layer baked into entity-models.json, loaded by key
|
||||
ArmorStandArmorModel.createBaseMesh skip:data layer baked into entity-models.json, loaded by key
|
||||
ArmorStandModel.translateToHand port crates/horizon-client/src/game/armor_stands.rs::Game::armor_stand_items held items drawn from the posed arms even when ShowArms hides them
|
||||
BannerFlagModel.createFlagLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
BannerModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
BellModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
AbstractBoatModel.setupAnim port crates/horizon-client/src/game/boats.rs::Game::boat_geometry paddle pose from rowing time, in the boat draw
|
||||
BoatModel.createBoatModel skip:data layer baked into entity-models.json, loaded by key
|
||||
BoatModel.createChestBoatModel skip:data layer baked into entity-models.json, loaded by key
|
||||
BoatModel.createWaterPatch skip:data layer baked into entity-models.json, loaded by key
|
||||
RaftModel.createRaftModel skip:data bamboo raft is boat/bamboo#main in entity-models.json
|
||||
RaftModel.createChestRaftModel skip:data bamboo chest raft is chest_boat/bamboo#main in entity-models.json
|
||||
BookModel.State.forAnimation port crates/horizon-client/src/block_entity_anim.rs::EnchantingBook::render openness and page flips computed in EnchantingBook::render
|
||||
MinecartModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ChestModel.createSingleBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ChestModel.createDoubleBodyRightLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ChestModel.createDoubleBodyLeftLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
CushionModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ElytraModel.createLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ElytraModel.setupAnim port crates/horizon-client/src/game/perspective.rs::Game::player_elytra_geometry wing angles, crouch drop and mirrored right wing
|
||||
ShieldModel.createLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
LeashKnotModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ArrowModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
ArrowModel.setupAnim missing player: an arrow that lands in a block does not wobble for 7 ticks; arrows.rs sets shake but the arrow draw has no roll
|
||||
ShulkerBulletModel.createBodyLayer missing player: shulker bullets draw as a flat spark sprite, not the tumbling 3D orb; the baked shulker_bullet model is never loaded
|
||||
ShulkerBulletModel.setupAnim missing player: the bullet's spin and facing toward its flight are absent, since no model is drawn
|
||||
TridentModel.createLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
WindChargeModel.createBodyLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
WindChargeModel.setupAnim port crates/horizon-client/src/game/wind.rs::Game::wind_charge_geometry wind and wind_charge parts spin in opposite directions
|
||||
DragonHeadModel.createHeadLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
DragonHeadModel.setupAnim inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one jaw animation in the skull branch of render_one
|
||||
PiglinHeadModel.setupAnim inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one ear flap in the skull branch of render_one
|
||||
SkullModel.createHeadModel skip:data layer baked into entity-models.json, loaded by key
|
||||
SkullModel.createHumanoidHeadLayer skip:data layer baked into entity-models.json, loaded by key
|
||||
SkullModel.setupAnim inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one head yaw and pitch in the skull branch of render_one
|
||||
PlayerCapeModel.createCapeLayer missing player: capes never draw; skins.rs downloads the cape texture but nothing draws the cape layer
|
||||
PlayerCapeModel.setupAnim missing player: the cape does not lean or flap with movement, since no cape is drawn
|
||||
PlayerEarsModel.createEarsLayer missing minor: extra ears (showExtraEars accounts) are not drawn
|
||||
PlayerModel.createMesh skip:data layer baked into entity-models.json, loaded by key
|
||||
PlayerModel.createArmorMeshSet skip:data layer baked into entity-models.json, loaded by key
|
||||
PlayerModel.setupAnim port crates/horizon-client/src/mobs/anim.rs::setup gap: player: hat, jacket, sleeve and pant toggles (modelPart options) are not read, so a hidden layer still draws; humanoid pose is in the Humanoid branch
|
||||
PlayerModel.translateToHand port crates/horizon-client/src/mobs/render.rs::hand_base gap: minor: slim-arm 0.5 pixel hand offset not applied
|
||||
BlockModelLighter.prepareQuadAmbientOcclusion port crates/horizon-client/src/mesher/lighting.rs::ambient_occlusion per-vertex AO brightness and smooth light from the corner samples
|
||||
BlockModelLighter.prepareQuadFlat port crates/horizon-client/src/mesher/lighting.rs::flat light only; the directional colour is applied in Mesher::face
|
||||
BlockModelLighter.prepareQuadShape port crates/horizon-client/src/mesher/lighting.rs::shape face bounds, partial and cubic flags
|
||||
BlockModelLighter.getDirectionalBrightness port crates/horizon-client/src/mesher/lighting.rs::cardinal face shade; the shade direction override is read in Mesher::face
|
||||
BlockModelLighter.Cache.getLightCoords port crates/horizon-client/src/mesher/lighting.rs::coords packed light for a position
|
||||
BlockModelLighter.Cache.getShadeBrightness port crates/horizon-client/src/mesher.rs::MeshTables::new shade per block state (Info.shade), not cached per position
|
||||
BlockModelRenderState.clear skip:java reuse of a pooled render state object
|
||||
BlockModelRenderState.tintLayers port crates/horizon-client/src/game/minecarts.rs::Game::block_model_vertices gap: minor: the caller tints every face with one sprite tint, not per tint index
|
||||
BlockModelRenderState.setupModel port crates/horizon-client/src/game/minecarts.rs::Game::block_model_vertices model parts with the transform matrix
|
||||
BlockModelRenderState.submit port crates/horizon-client/src/game/minecarts.rs::Game::block_model_vertices faces written to the vertex list
|
||||
BlockModelRenderState.submitModel port crates/horizon-client/src/game/minecarts.rs::Game::block_model_vertices faces written to the vertex list
|
||||
BlockModelRenderState.scratchRandomSource port crates/horizon-client/src/game/minecarts.rs::Game::block_model_vertices seeded variant choice through collect_seeded
|
||||
BlockModelResolver.update port crates/horizon-client/src/game/minecarts.rs::Game::block_model_vertices resolves the seeded model for a block state; light is passed in by the caller
|
||||
BlockModelSet.createFallbackModel port crates/horizon-client/src/mesher.rs::MeshTables::new per-state tint sources (Info.tints) and the plain model
|
||||
BuiltInBlockModels.special port crates/horizon-client/src/block_entity_render.rs::classify special model name to Kind
|
||||
BuiltInBlockModels.createMobHead port crates/horizon-client/src/block_entity_render.rs::classify Skull kind for mob heads
|
||||
BuiltInBlockModels.createMobWallHead port crates/horizon-client/src/block_entity_render.rs::classify Skull kind for wall mob heads
|
||||
BuiltInBlockModels.createMobHeads port crates/horizon-client/src/block_entity_render.rs::classify Skull kind for the head set
|
||||
BuiltInBlockModels.createPlayerHead port crates/horizon-client/src/block_entity_render.rs::classify Skull kind for player heads
|
||||
BuiltInBlockModels.createPlayerWallHead port crates/horizon-client/src/block_entity_render.rs::classify Skull kind for wall player heads
|
||||
BuiltInBlockModels.createBanner port crates/horizon-client/src/block_entity_render.rs::classify Banner kind
|
||||
BuiltInBlockModels.createWallBanner port crates/horizon-client/src/block_entity_render.rs::classify Banner kind for wall banners
|
||||
BuiltInBlockModels.createDyedShulkerBox port crates/horizon-client/src/block_entity_render.rs::classify Shulker kind for dyed boxes
|
||||
BuiltInBlockModels.createChest port crates/horizon-client/src/block_entity_render.rs::classify Chest kind
|
||||
BuiltInBlockModels.createSingletonChest port crates/horizon-client/src/block_entity_render.rs::classify Chest kind, single chest
|
||||
BuiltInBlockModels.createXmasChest port crates/horizon-client/src/block_entity_render.rs::classify Chest kind with the Christmas texture
|
||||
BuiltInBlockModels.createCopperGolem port crates/horizon-client/src/block_entity_render.rs::classify CopperGolem kind
|
||||
BuiltInBlockModels.createFlowerBedModel missing minor: the 0.25 block shift for a flower bed shown by a copper golem is not applied
|
||||
BuiltInBlockModels.createEnchantingTable port crates/horizon-client/src/block_entity_render.rs::classify EnchantingTable kind
|
||||
BuiltInBlockModels.specialModelWithPropertyDispatch port crates/horizon-client/src/block_entity_render.rs::classify property dispatch by block state values
|
||||
BuiltInBlockModels.Builder.put skip:java builder map of special models
|
||||
FluidModel.Unbaked.bake port crates/horizon-client/src/mesher.rs::MeshTables::new gap: minor: water and lava layers hard-wired; translucency picked in fluid tesselate
|
||||
FluidModel.Unbaked.getAndValidateMaterial port crates/horizon-client/src/mesher.rs::MeshTables::new sprite lookup through layer(); no separate atlas check
|
||||
FluidRenderer.isFaceOccludedByState port crates/horizon-client/src/mesher/fluid.rs::occluded_by fluid face occlusion by the neighbour's face shape
|
||||
FluidRenderer.shouldRenderFace port crates/horizon-client/src/mesher/fluid.rs::tesselate render_up, render_down and side checks, neighbour-same-fluid and self occlusion
|
||||
FluidRenderer.addFace inline crates/horizon-client/src/mesher/fluid.rs::tesselate quad closure in tesselate
|
||||
FluidRenderer.calculateAverageHeight inline crates/horizon-client/src/mesher/fluid.rs::tesselate average closure in tesselate
|
||||
FluidRenderer.addWeightedHeight inline crates/horizon-client/src/mesher/fluid.rs::tesselate weighted sum inside the average closure
|
||||
FluidRenderer.vertex inline crates/horizon-client/src/mesher/fluid.rs::tesselate vertex built in the quad closure
|
||||
FluidStateModelSet.bake port crates/horizon-client/src/mesher.rs::MeshTables::new fluid layers and tints baked per fluid
|
||||
LoadedBlockModels.bake port crates/horizon-assets/src/bake.rs::bake_block_model bakes each block model; the loop over the set is the caller's
|
||||
ModelBlockRenderer.tesselateBlock port crates/horizon-client/src/mesher.rs::Mesher::mesh per block: fluids, models, smooth-light choice
|
||||
ModelBlockRenderer.configureTintCache port crates/horizon-client/src/mesher.rs::Tints::new per section tint tables
|
||||
ModelBlockRenderer.resetTintCache inline crates/horizon-client/src/mesher.rs::Tints::new tables are built fresh per section, no reset
|
||||
ModelBlockRenderer.tesselateAmbientOcclusion port crates/horizon-client/src/mesher.rs::Mesher::face AO branch of face
|
||||
ModelBlockRenderer.tesselateFlat port crates/horizon-client/src/mesher.rs::Mesher::face flat branch of face
|
||||
ModelBlockRenderer.shouldRenderFace port crates/horizon-world/src/block_render.rs::FaceVisibility::should_render_face per face visibility, called from Mesher::mesh
|
||||
ModelBlockRenderer.putQuadWithTint port crates/horizon-client/src/mesher.rs::Mesher::face tinted vertex write
|
||||
ModelBlockRenderer.getTintColor port crates/horizon-client/src/mesher.rs::Mesher::tint tint source index to colour
|
||||
ModelBlockRenderer.computeTintColor port crates/horizon-client/src/mesher.rs::Tints::get biome colour average over the blend radius
|
||||
MovingBlockRenderState.getBlockTint port crates/horizon-client/src/game/moving_pistons.rs::Game::moving_block_vertices gap: minor: tint is the particle colour at the source position, not the biome tint at the moved spot
|
||||
MovingBlockRenderState.getBlockState port crates/horizon-client/src/game/moving_pistons.rs::Game::moving_piston_blocks moved block and piston base
|
||||
SelectBlockModel.update missing minor: display-context switch (copper golem hand, flower bed) is not applied; block items use the normal transform
|
||||
SelectBlockModel.Unbaked.bake missing minor: same display-context switch, not baked
|
||||
SelectBlockModel.UnbakedSwitch.bake missing minor: same display-context switch, not baked
|
||||
BlockStateModelDispatcher.instantiate port crates/horizon-assets/src/blockstate/bind.rs::BlockStateDefinition::bind variant selection per block state
|
||||
BlockStateModelDispatcher.MultiPartDefinition.instantiate port crates/horizon-assets/src/blockstate/bind.rs::BlockStateDefinition::bind multipart selectors bound per state
|
||||
BlockStateModelDispatcher.SimpleModelSelectors.instantiate port crates/horizon-assets/src/blockstate/bind.rs::BlockStateDefinition::bind variant predicates bound per state
|
||||
|
@@ -0,0 +1,115 @@
|
||||
Variant.SimpleModelState.asModelState port crates/horizon-assets/src/bake/transform.rs::BlockModelTransform::new quarter turns from x, y, z plus the uvlock flag, prepared once per rotation
|
||||
Variant.SimpleModelState.withX skip:java copy-with setter of an immutable record; Variant::decode reads x, y, z directly
|
||||
Variant.SimpleModelState.withY skip:java copy-with setter of an immutable record; Variant::decode reads x, y, z directly
|
||||
Variant.SimpleModelState.withZ skip:java copy-with setter of an immutable record; Variant::decode reads x, y, z directly
|
||||
Variant.SimpleModelState.withUvLock skip:java copy-with setter of an immutable record; Variant::decode reads uvlock directly
|
||||
VariantMutator.then skip:java composes JSON field setters; Variant::decode reads all fields in one pass
|
||||
VariantSelector.predicate port crates/horizon-assets/src/blockstate/bind.rs::variant_predicate parses the property clauses; matching against states is in BlockStateDefinition::bind
|
||||
WeightedVariants.computeMaterialFlags skip:java OR of per-model render flags; Horizon keeps translucency per face (BakedFace in models/catalog.rs)
|
||||
WeightedVariants.Unbaked.bake inline crates/horizon-client/src/models/catalog.rs::StateModels::load each weighted variant baked once with its transform; the choice is kept in CompiledChoices
|
||||
WeightedVariants.Unbaked.resolveDependencies inline crates/horizon-client/src/models/catalog.rs::StateModels::load model names gathered from all definitions before the block library loads
|
||||
CombinedCondition.instantiate port crates/horizon-assets/src/blockstate/bind.rs::BoundCondition::bind AND and OR branches; the test itself is BoundCondition::matches
|
||||
KeyValueCondition.instantiate port crates/horizon-assets/src/blockstate/bind.rs::BoundCondition::bind property lookup per key and the properties branch
|
||||
KeyValueCondition.Term.parse port crates/horizon-assets/src/blockstate.rs::Condition::decode reads the leading "!" as negation
|
||||
KeyValueCondition.Terms.parse port crates/horizon-assets/src/blockstate.rs::Condition::decode splits on "|"; empty terms are rejected
|
||||
KeyValueCondition.Terms.instantiate port crates/horizon-assets/src/blockstate/bind.rs::BoundCondition::bind each term is checked against the states directly, not via allowed-value lists; same result
|
||||
KeyValueCondition.Terms.getValueOrThrow port crates/horizon-assets/src/blockstate/bind.rs::PropertyValues::parse an unknown value is an error in both
|
||||
MultiPartModel.collectParts port crates/horizon-assets/src/blockstate/choice.rs::CompiledChoices::for_each one nextLong seed for the root, reset before each selected part
|
||||
MultiPartModel.SharedBakedState.getFirstModel port crates/horizon-assets/src/blockstate/choice.rs::CompiledChoices::particle_variant first selector's variant, whether or not it applies
|
||||
MultiPartModel.SharedBakedState.computeMaterialFlags skip:java same OR of render flags as WeightedVariants; translucency is kept per face
|
||||
MultiPartModel.SharedBakedState.selectModels port crates/horizon-assets/src/blockstate/bind.rs::BlockStateDefinition::bind selected selector indices per state, computed once at load
|
||||
MultiPartModel.Unbaked.visualEqualityGroup skip:java key for sharing identical visual states; Horizon keys block states by id
|
||||
MultiPartModel.Unbaked.resolveDependencies inline crates/horizon-client/src/models/catalog.rs::StateModels::load model names gathered from every multipart selector
|
||||
MultiPartModel.Unbaked.bake inline crates/horizon-client/src/models/catalog.rs::StateModels::load shared bake per definition; per-state selection stored in states
|
||||
Selector.instantiate port crates/horizon-assets/src/blockstate/bind.rs::BlockStateDefinition::bind a selector without a condition applies to every state
|
||||
BlockStateModelWrapper.update port crates/horizon-client/src/game/minecarts.rs::Game::block_model_vertices gap: player: no tint layers, so carried or cart blocks with tint sources (grass, leaves) are drawn untinted
|
||||
BlockStateModelWrapper.updateTints missing player: carried and cart blocks with tint sources (grass, leaves, water) show untinted; Horizon's block_model_vertices has no tint step
|
||||
BlockStateModelWrapper.Unbaked.bake skip:java builds the wrapper object; Horizon passes the transform straight to block_model_vertices
|
||||
CompositeBlockModel.update missing player: only block display entities reach this and Horizon draws none, so a special block (chest and similar) shown that way never appears
|
||||
CompositeBlockModel.Unbaked.bake skip:java builds the composite object; no separate step in Horizon
|
||||
ConditionalBlockModel.update inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one Christmas chest texture chosen in the chest branch by extended_christmas()
|
||||
ConditionalBlockModel.Unbaked.bake skip:java builds the conditional object; the chest branch picks the texture when drawing
|
||||
SpecialBlockModelWrapper.Unbaked.bake skip:data special models come from exported model data in BlockEntityRenderer::load; no baking step
|
||||
AbstractEndPortalRenderer.submitSpecial port crates/horizon-client/src/block_entity_render.rs::portal_cube gap: minor: no outline pass (outlineColor) for the portal faces
|
||||
AbstractSignRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one front and back text drawn in the sign branch via sign_text_calls
|
||||
AbstractSignRenderer.isOutlineVisible port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: minor: only the 16-block distance is tested; spyglass scoping in first person does not turn the outline on
|
||||
AbstractSignRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: minor: the text filtering option is not read; filtered sign lines are not shown
|
||||
BannerRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one flutter phase from position, game time and partial tick; standing or wall placement
|
||||
BannerRenderer.bannerModel inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one wall or standing banner model chosen in the banner branch
|
||||
BannerRenderer.flagModel inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one wall or standing flag model chosen in the banner branch
|
||||
BannerRenderer.submitSpecial port crates/horizon-client/src/item_render/special.rs::submit banner as a special item model: base, flag and pattern layers
|
||||
BannerRenderer.submitBanner port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one base model, flag and pattern layers; the crumbling overlay is drawn by render_breaking
|
||||
BannerRenderer.submitPatternLayer inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one loop over up to 16 pattern layers in the banner branch
|
||||
BannerRenderer.modelTransformation inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one translate, turn by angle, scale in the banner branch
|
||||
BeaconRenderer.extractRenderState inline crates/horizon-client/src/game/beacon.rs::Game::beacon_geometry animation time and beam radius scale computed there
|
||||
BeaconRenderer.extract inline crates/horizon-client/src/game/beacon.rs::Game::beacon_geometry same time and scale rules, from distance and scoping
|
||||
BeaconRenderer.renderQuad port crates/horizon-client/src/block_entity_render.rs::beam solid beam and glow quads per section
|
||||
BeaconRenderer.addVertex port crates/horizon-client/src/block_entity_render.rs::beam vertex with colour and full light, emitted by beam's inner emit
|
||||
BellRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one bell ticks and shake direction read in the bell branch
|
||||
BellRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: player: no crack overlay while a bell is broken (render_breaking draws only banners and chests)
|
||||
BlockEntityRenderDispatcher.getRenderer port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::kind renderer chosen from the block state
|
||||
BlockEntityRenderDispatcher.tryExtractRenderState port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render gap: minor: distance cull only (256 for gateways); no frustum, type-validity or off-screen test here
|
||||
BlockEntityRenderDispatcher.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one draws each kind; no crash report wrapper
|
||||
BlockEntityRenderDispatcher.onResourceManagerReload missing minor: block entity models load once in BlockEntityRenderer::load; no reload path found
|
||||
BlockEntityRenderers.createEntityRenderers skip:data renderer registration table; Horizon's classify table replaces it
|
||||
BlockEntityWithBoundingBoxRenderer.extractRenderState missing player: game-master players (creative or op) see no structure box, invisible-block or structure-void markers
|
||||
BlockEntityWithBoundingBoxRenderer.extract missing player: game-master players (creative or op) see no structure box, invisible-block or structure-void markers
|
||||
BlockEntityWithBoundingBoxRenderer.submit missing player: game-master players (creative or op) see no structure box, invisible-block or structure-void markers
|
||||
BlockEntityWithBoundingBoxRenderer.renderInvisibleBlocks missing player: game-master players (creative or op) see no barrier, light or air block markers
|
||||
BlockEntityWithBoundingBoxRenderer.renderStructureVoids missing player: game-master players (creative or op) see no structure void markers
|
||||
BrightnessCombiner.acceptDouble inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one brighter of the two chest halves per channel, in the chest branch
|
||||
BrushableBlockRenderer.extractRenderState missing player: brushing a suspicious block shows no item on its face; the hit side and dust stage are not read
|
||||
BrushableBlockRenderer.submit missing player: the brushed item never slides out of the block while it is brushed
|
||||
BrushableBlockRenderer.translations missing player: the per-side slide offset for each dust stage is not computed
|
||||
CampfireRenderer.extractRenderState inline crates/horizon-client/src/game/campfire.rs::Game::campfire_geometry facing and per-slot item seed read there
|
||||
CampfireRenderer.submit port crates/horizon-client/src/game/campfire.rs::Game::campfire_geometry items on the four sides, drawn within 64 blocks
|
||||
ChestRenderer.createModelTransformation inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one chest turn about its centre in the chest branch
|
||||
ConduitRenderer.createEyeLayer skip:data model layer; Horizon loads the conduit parts from exported model data in BlockEntityRenderer::load
|
||||
ConduitRenderer.createWindLayer skip:data model layer; Horizon loads the conduit parts from exported model data in BlockEntityRenderer::load
|
||||
ConduitRenderer.createShellLayer skip:data model layer; Horizon loads the conduit parts from exported model data in BlockEntityRenderer::load
|
||||
ConduitRenderer.createCageLayer skip:data model layer; Horizon loads the conduit parts from exported model data in BlockEntityRenderer::load
|
||||
ConduitRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: player: no crack overlay on the conduit (render_breaking draws only banners and chests)
|
||||
CopperGolemStatueBlockRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one facing, pose and oxidation texture read in the golem branch
|
||||
CopperGolemStatueBlockRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: player: no crack overlay on the statue (render_breaking draws only banners and chests)
|
||||
CopperGolemStatueBlockRenderer.createModelTransformation inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one rotation from the opposite facing in the golem branch
|
||||
DecoratedPotRenderer.createBaseLayer skip:data pot base model; Horizon loads it from exported model data in BlockEntityRenderer::load
|
||||
DecoratedPotRenderer.createSidesLayer skip:data pot side models; Horizon loads them from exported model data in BlockEntityRenderer::load
|
||||
DecoratedPotRenderer.getSideSprite inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one sherd pattern texture per side from pot_patterns, blank side otherwise
|
||||
DecoratedPotRenderer.createModelTransformation inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one pot turn about its centre in the decorated pot branch
|
||||
DecoratedPotRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents decorated pot part extents for the item model bounds
|
||||
HangingSignRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: minor: the text filtering option is not read
|
||||
LecternRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one book drawn only when has_book is set, turned by facing
|
||||
LecternRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: player: no crack overlay on the lectern book (render_breaking draws only banners and chests)
|
||||
PistonHeadRenderer.submit port crates/horizon-client/src/game/moving_pistons.rs::Game::moving_piston_geometry head and base blocks drawn at their offsets
|
||||
PistonHeadRenderer.createMovingBlock port crates/horizon-client/src/game/moving_pistons.rs::Game::moving_block_vertices gap: minor: the tint is the particle sprite colour, not the block's tint sources
|
||||
ShelfRenderer.extractRenderState missing player: items placed on shelf blocks are not kept for drawing; only the comparator signal is handled (game/machines.rs::shelf_signal)
|
||||
ShelfRenderer.submit missing player: items on shelves are invisible
|
||||
ShelfRenderer.submitItem missing player: shelf item slots, offsets and scale are not drawn
|
||||
ShulkerBoxRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one facing, colour texture and lid progress read in the shulker branch
|
||||
ShulkerBoxRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: player: no crack overlay on shulker boxes (render_breaking draws only banners and chests)
|
||||
ShulkerBoxRenderer.createModelTransform inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one facing transform in the shulker branch
|
||||
ShulkerBoxRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents shulker lid pose extents for the item model bounds
|
||||
SkullBlockRenderer.createModel skip:data skull models; Horizon loads them from exported model data in BlockEntityRenderer::load
|
||||
SkullBlockRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one type, wall facing and turn read from the skull kind; player skin via scene.skull
|
||||
SkullBlockRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: player: no crack overlay on skulls and heads (render_breaking draws only banners and chests)
|
||||
SkullBlockRenderer.submitSkull port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: player: no crack overlay on skulls and heads (render_breaking draws only banners and chests)
|
||||
SkullBlockRenderer.resolveSkullRenderType inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one player head skin via scene.skull, otherwise the type's texture
|
||||
SkullBlockRenderer.createWallTransformation inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one wall skull offset and turn in the skull branch
|
||||
SkullBlockRenderer.createGroundTransformation inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one ground skull turn by segment in the skull branch
|
||||
SpawnerRenderer.extractRenderState port crates/horizon-client/src/mobs/spawner.rs::display_pose spin and scale of the display mob
|
||||
SpawnerRenderer.submit port crates/horizon-client/src/game/spawner.rs::Game::spawner_geometry display mob at the spawner's centre with spin, tilt and scale
|
||||
StandingSignRenderer.extractRenderState inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one gap: minor: the text filtering option is not read
|
||||
StandingSignRenderer.createTransformations inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one front and back text transforms per attachment
|
||||
TestInstanceRenderer.extractRenderState missing player: creative players placing a test instance block see no beacon beam, box or error markers
|
||||
TestInstanceRenderer.submit missing player: creative players placing a test instance block see no beacon beam or box
|
||||
TestInstanceRenderer.submitErrorMarker missing player: red error markers and their text are not drawn
|
||||
TestInstanceRenderer.shouldRenderOffScreen missing minor: culling policy of a renderer Horizon lacks
|
||||
TestInstanceRenderer.shouldRender missing minor: culling policy of a renderer Horizon lacks
|
||||
TheEndGatewayRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one beam and visible cube faces in the end gateway branch
|
||||
TheEndPortalRenderer.submit port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one portal slab in the end portal branch
|
||||
TrialSpawnerRenderer.extractRenderState port crates/horizon-client/src/mobs/spawner.rs::display_pose same spin and scale rule as spawners
|
||||
TrialSpawnerRenderer.submit port crates/horizon-client/src/game/spawner.rs::Game::spawner_geometry trial spawner display mob drawn in the same pass
|
||||
VaultRenderer.extractRenderState inline crates/horizon-client/src/game/vault.rs::Game::vault_geometry display item and spin read there
|
||||
VaultRenderer.submit port crates/horizon-client/src/game/vault.rs::Game::vault_geometry item cluster at the vault centre with spin
|
||||
BlockEntityRenderState.extractBase skip:java copies position, state, light and crack progress; Horizon passes these as arguments
|
||||
BlockEntityRenderState.fillCrashReportCategory skip:debug crash report detail
|
||||
|
Can't render this file because it contains an unexpected character in line 13 and column 112.
|
@@ -0,0 +1,150 @@
|
||||
CloudRenderer.getSizeForCloudDistance skip:java GPU ring-buffer capacity for the cloud face buffer; Horizon sizes its vertex buffer from the built mesh
|
||||
CloudRenderer.packCellData inline crates/horizon-client/src/clouds.rs::Mesh::prepare cell presence is a bool test on the texture grid; no packed long
|
||||
CloudRenderer.isNorthEmpty inline crates/horizon-client/src/clouds.rs::Mesh::prepare neighbour-empty flags passed to face_mask in N,E,S,W order
|
||||
CloudRenderer.isEastEmpty inline crates/horizon-client/src/clouds.rs::Mesh::prepare neighbour-empty flags passed to face_mask in N,E,S,W order
|
||||
CloudRenderer.isSouthEmpty inline crates/horizon-client/src/clouds.rs::Mesh::prepare neighbour-empty flags passed to face_mask in N,E,S,W order
|
||||
CloudRenderer.isWestEmpty inline crates/horizon-client/src/clouds.rs::Mesh::prepare neighbour-empty flags passed to face_mask in N,E,S,W order
|
||||
CloudRenderer.render port crates/horizon-client/src/gfx.rs::Renderer::draw_frame gap: minor: one cloud pipeline; fancy vs flat is chosen by the mesh fast flag, not by pipeline
|
||||
CloudRenderer.renderOit missing player: with Improved transparency on, clouds keep the classic blend; no OIT pass exists and the option is only saved
|
||||
CloudRenderer.buildMesh port crates/horizon-client/src/clouds.rs::Mesh::prepare cell ring walk via cells(radius), nearest first
|
||||
CloudRenderer.tryBuildCell inline crates/horizon-client/src/clouds.rs::Mesh::prepare skip empty cells, then build the cell's faces
|
||||
CloudRenderer.encodeFace inline crates/horizon-client/src/clouds.rs::Mesh::prepare 3-byte face records replaced by vertex quads
|
||||
CloudRenderer.buildExtrudedCell port crates/horizon-client/src/clouds.rs::face_mask top, bottom and side visibility; quads emitted in Mesh::prepare via faces()
|
||||
CubeMap.initializeVertices port crates/horizon-client/src/gfx/panorama.rs::Panorama::new 24-corner cube; Horizon draws 36 vertices from the shader in the pipeline built here
|
||||
DebugCrosshairRenderer.<init> skip:debug F3 3D axis gizmo at the view; Horizon has no debug crosshair
|
||||
DynamicGpuData.reset skip:other GPU per-frame ring reset; wgpu staging in Horizon's Uploads belt
|
||||
DynamicGpuData.close skip:other GPU buffer release; Rust drops the wgpu buffers
|
||||
DynamicGpuData.writeTransform skip:other per-draw uniform staging; Horizon writes its uniforms directly with queue writes
|
||||
DynamicGpuData.writeChunkSections port crates/horizon-client/src/gfx.rs::section_instance gap: player: section fade-in (vanilla default 0.75 s) is not sent; Horizon writes a fixed fourth value
|
||||
DynamicGpuData.writeChunkSectionsInstanced port crates/horizon-client/src/gfx.rs::section_instance gap: player: section fade-in (vanilla default 0.75 s) is not sent; same instance record as writeChunkSections
|
||||
DynamicGpuData.writeChunkSectionCommands port crates/horizon-client/src/gfx.rs::Renderer::draw_frame IndexedDraw records built and uploaded into the indirect buffer
|
||||
DynamicGpuData.ChunkSectionInfo.write port crates/horizon-client/src/gfx.rs::section_instance gap: player: packs origin only; the fade-in visibility float (default 0.75 s) is not in the record
|
||||
DynamicGpuData.IndexedDraw.write skip:other indirect draw args; Horizon keeps them as [u32;5] words uploaded in one copy
|
||||
DynamicGpuData.TerrainTransform.write skip:other terrain UBO layout; Horizon's terrain pass uses its own uniforms
|
||||
DynamicGpuData.Transform.write skip:other std140 layout of the transform UBO; wgpu bindings in Horizon
|
||||
DynamicGpuDataStorageMapped.endFrame skip:other GPU ring buffer frame bookkeeping
|
||||
DynamicGpuDataStorageMapped.resizeBuffers skip:other GPU buffer growth; Horizon grows its wgpu buffers when a draw needs more space
|
||||
DynamicGpuDataStorageMapped.writeData skip:other GPU staging ring for mapped buffers
|
||||
DynamicGpuDataStorageMapped.writeDataBatched skip:other GPU staging ring for mapped buffers
|
||||
DynamicGpuDataStorageMapped.writeDataBatchedMultiple skip:other GPU staging ring for mapped buffers
|
||||
DynamicGpuDataStorageMapped.close skip:other GPU buffer release
|
||||
DynamicGpuDataStorageNonMapped.endFrame skip:other GPU staging bookkeeping; Horizon uses queue writes for uploads
|
||||
DynamicGpuDataStorageNonMapped.writeData skip:other GPU staging for non-mapped buffers
|
||||
DynamicGpuDataStorageNonMapped.resizeBuffers skip:other GPU buffer growth
|
||||
DynamicGpuDataStorageNonMapped.writeDataBatched skip:other GPU staging for non-mapped buffers
|
||||
DynamicGpuDataStorageNonMapped.writeDataBatchedMultiple skip:other GPU staging for non-mapped buffers
|
||||
DynamicGpuDataStorageNonMapped.close skip:other GPU buffer release
|
||||
EndFlashState.calculateIntensity port crates/horizon-client/src/game/end.rs::EndFlash::tick intensity sine over offset..offset+duration, computed on each tick
|
||||
EndFlashState.flashStartedThisTick inline crates/horizon-client/src/game/end.rs::EndFlash::tick sound_in is armed on the same rising edge (intensity above 0, previous at or below 0)
|
||||
FaceInfo.Extent.select skip:data corner selection; Horizon's unit-cube corner table PORTAL_FACES in block_entity_render.rs has the same order
|
||||
FaceInfo.VertexInfo.select skip:data corner selection; Horizon's unit-cube corner table PORTAL_FACES in block_entity_render.rs has the same order
|
||||
FirstPersonHandsAndItemsRenderer.calculateMapTilt inline crates/horizon-client/src/game/maps.rs::Game::two_handed_map_geometry tilt computed inline with the calculateMapTilt comment
|
||||
FirstPersonHandsAndItemsRenderer.renderPlayerHand port crates/horizon-client/src/game.rs::Game::hand_geometry empty main hand's arm model with the player skin
|
||||
FirstPersonHandsAndItemsRenderer.renderMapHand missing player: holding a map in both hands, neither arm is drawn behind it (vanilla draws both arms)
|
||||
FirstPersonHandsAndItemsRenderer.renderOneHandedMap port crates/horizon-client/src/first_person.rs::one_handed_map_pose gap: player: the arm holding a map is not drawn; the map hand branch skips the arm
|
||||
FirstPersonHandsAndItemsRenderer.renderTwoHandedMap port crates/horizon-client/src/game/maps.rs::Game::two_handed_map_geometry gap: player: the arms that hold a two-handed map are not drawn
|
||||
FirstPersonHandsAndItemsRenderer.renderMap port crates/horizon-client/src/game/maps.rs::Game::held_map map background with its 7-pixel border, then the map contents
|
||||
FirstPersonHandsAndItemsRenderer.applyEatTransform port crates/horizon-client/src/first_person.rs::item_pose ItemPose::Eat: bob and jiggle while eating or drinking
|
||||
FirstPersonHandsAndItemsRenderer.applyBrushTransform missing player: a brush in use is held still; it does not sweep back and forth while brushing
|
||||
FirstPersonHandsAndItemsRenderer.applyItemArmAttackTransform port crates/horizon-client/src/first_person.rs::item_pose attack swing rotation in the Swing pose
|
||||
FirstPersonHandsAndItemsRenderer.applyItemArmTransform port crates/horizon-client/src/first_person.rs::item_pose base item-in-arm translation
|
||||
FirstPersonHandsAndItemsRenderer.submitHandsWithItems port crates/horizon-client/src/game.rs::Game::hand_geometry sway, both hands, empty-hand arm and item pose
|
||||
FirstPersonHandsAndItemsRenderer.swingArm port crates/horizon-client/src/first_person.rs::item_pose attack swing translation and arm rotation
|
||||
GameRenderer.<init> port crates/horizon-client/src/gfx.rs::Renderer::new lightmap, hand target, debug crosshair and screen effects are built here
|
||||
GameRenderer.close skip:other GPU resource teardown; wgpu drops the renderer's objects
|
||||
GameRenderer.checkEntityPostEffect missing player: spectating a creeper, spider or enderman does not put their overlay shader on the screen
|
||||
GameRenderer.processBlurEffect port crates/horizon-client/src/menu_blur.rs::MenuBlur::apply menu background blur pass
|
||||
GameRenderer.preloadUiShader skip:other GPU pipeline precompile at load; Horizon builds its pipelines in Renderer::new
|
||||
GameRenderer.update port crates/horizon-client/src/camera.rs::AvatarBob::update_bob gap: minor: the requested post-effect list (from /postEffect) is not built
|
||||
GameRenderer.extract skip:other render-state copy for the vanilla render thread; Horizon renders from game state
|
||||
GameRenderer.preparePostEffects missing minor: vanilla post chains from requested effects are not applied; shader packs use pack_post
|
||||
GameRenderer.applyPostEffects missing minor: vanilla post chains are not run; shader packs use pack_post
|
||||
GameRenderer.tryTakeScreenshotIfNeeded missing player: a new singleplayer world gets no icon.png, so the world list shows no preview picture
|
||||
GameRenderer.takeAutoScreenshot missing player: no icon.png is written from the first rendered frame; the world list keeps a blank picture
|
||||
GameRenderer.integrate3DHudDepth missing minor: only runs when a post effect is applied (consistentDepthRequired); Horizon applies none
|
||||
GameRenderer.extractWindow skip:other render-state copy of the window size; Horizon reads the window directly
|
||||
GameRenderer.extractOptions skip:other render-state copy of options; Horizon reads settings directly
|
||||
GameRenderer.extractCamera skip:other render-state copy of camera and fog; Horizon computes them in camera.rs and fog.rs
|
||||
GameRenderer.resetData inline crates/horizon-client/src/game.rs::Game::finish_close_world boss overlay reset on world close; camera and map-texture resets not verified here
|
||||
GameRenderer.projectPointToScreen skip:other no callers in vanilla 26.3
|
||||
GameRenderer.useImprovedTransparency missing player: the Improved transparency option is saved and listed but nothing it gates exists in the renderer
|
||||
GlobalSettingsUniform.update skip:other global uniform (window size, time, gamma, glint) written per pass; Horizon sets its own uniforms
|
||||
GpuWarnlistManager.getAllWarnings missing minor: no GPU driver warnlist; Horizon does not check the driver against known-bad lists
|
||||
GpuWarnlistManager.compilePatterns missing minor: no GPU driver warnlist patterns
|
||||
GpuWarnlistManager.parseJson missing minor: no GPU driver warnlist JSON
|
||||
GpuWarnlistManager.Preparations.matchAny missing minor: no GPU driver warnlist matching
|
||||
LevelEventHandler.playJukeboxSong port crates/horizon-client/src/game/jukebox.rs::Game::start_song song starts and the now-playing overlay is shown
|
||||
LevelEventHandler.stopJukeboxSong port crates/horizon-client/src/game/jukebox.rs::Game::stop_song song sound stops for that jukebox
|
||||
LevelRenderer.<init> port crates/horizon-client/src/gfx.rs::Renderer::new targets, pipelines and buffers built once
|
||||
LevelRenderer.submitFeatures port crates/horizon-client/src/gfx.rs::Renderer::draw_frame entities, block entities, crumbling, particles, outline and gizmos are submitted and drawn in the frame
|
||||
LevelRenderer.repositionCamera port crates/horizon-client/src/gfx/resident.rs::camera_column camera section column that the section grid is centred on; gap: minor: world border invalidation is not part of it
|
||||
LevelRenderer.addMainPass port crates/horizon-client/src/gfx.rs::Renderer::draw_frame gap: minor: the Improved transparency targets (depth bounds, transmittance, accumulate) are not created
|
||||
LevelRenderer.executeAlwaysOnTop port crates/horizon-client/src/game.rs::Game::render always-on-top debug lines and crosshair drawn over the world
|
||||
LevelRenderer.executeSolid port crates/horizon-client/src/gfx.rs::Renderer::draw_sections solid section draws in arena page order
|
||||
LevelRenderer.prepareTranslucents port crates/horizon-client/src/gfx/translucency.rs::Sorter::sort translucent quads sorted from the camera each frame
|
||||
LevelRenderer.executeOit missing player: with Improved transparency on, translucent blocks and water blend order-independently; Horizon has no OIT pass and the option does nothing
|
||||
LevelRenderer.executeDepthBoundsCull missing player: part of Improved transparency's pass; no depth-bounds cull exists in Horizon
|
||||
LevelRenderer.executeOitWaterMask missing player: part of Improved transparency; no water mask pass exists in Horizon
|
||||
LevelRenderer.extractSectionDrawGroups port crates/horizon-client/src/gfx.rs::Renderer::draw_frame section draws grouped per layer and arena page from the visible sections
|
||||
LevelRenderer.prepareChunkRenders port crates/horizon-client/src/gfx.rs::Renderer::draw_frame per-layer draw list built for the frame, reversed for translucent layers
|
||||
LevelRenderer.performTransientBlockRemovals missing minor: removes transient blocks when their section recompiles; Horizon has no transient blocks
|
||||
LevelRenderer.prepareChunkRendersIndirect port crates/horizon-client/src/gfx.rs::Renderer::draw_frame indirect draw arguments written and multi-draw issued
|
||||
LevelRenderer.compileSections port crates/horizon-client/src/streaming.rs::Streaming::update section meshing jobs queued for dirty sections nearest the camera
|
||||
LevelRenderer.submitEntities port crates/horizon-client/src/gfx.rs::Renderer::draw_frame entity models drawn with their batches
|
||||
LevelRenderer.submitBlockEntities port crates/horizon-client/src/gfx.rs::Renderer::block_entities block entity list submitted for drawing
|
||||
LevelRenderer.submitBlockDestroyAnimation port crates/horizon-client/src/gfx.rs::Renderer::draw_frame crumbling overlay drawn on the block being broken
|
||||
LevelRenderer.submitTransientBlocks missing player: a block the server sends as temporary (ClientboundAddTransientBlockPacket) does not appear; the packet is not handled
|
||||
LevelRenderer.submitHitOutline port crates/horizon-client/src/game.rs::Game::outline_boxes outline of the block under the crosshair
|
||||
LevelRenderer.close skip:other GPU resource teardown
|
||||
LevelRenderer.invalidateCompiledGeometry port crates/horizon-client/src/gfx.rs::Renderer::clear_sections all section meshes dropped and rebuilt when settings are applied
|
||||
LevelRenderer.scheduleTranslucentSectionResort port crates/horizon-client/src/gfx/translucency.rs::SortState::update resort scheduled when the camera point of view changes
|
||||
LevelRenderer.scheduleResort port crates/horizon-client/src/gfx/translucency.rs::SortState::update per-section resort gated by point-of-view change and translucent geometry
|
||||
LevelRenderer.resetLevelRenderData port crates/horizon-client/src/gfx.rs::Renderer::clear_sections section data released when a level is left
|
||||
LevelRenderer.hasRenderedAllSections missing minor: only the world icon screenshot asks this, and that screenshot is missing
|
||||
LevelRenderer.isSectionCompiledAndVisible port crates/horizon-client/src/gfx/resident.rs::Resident::contains gap: minor: no section fade-in, so the 0.3 visibility threshold is not checked
|
||||
LevelRenderer.finalizeGizmoCollection port crates/horizon-client/src/game/debug_keys.rs::Game::debug_gizmos debug gizmos collected for the frame
|
||||
LevelTargetBundle.replace skip:other render-target bundle for post chains; Horizon has no frame graph
|
||||
LevelTargetBundle.get skip:other render-target bundle for post chains; Horizon has no frame graph
|
||||
Lightmap.render port crates/horizon-client/src/gfx.rs::Renderer::update_lightmap lightmap pass from sky, block, darkness, gamma, night vision, flicker and boss darkening
|
||||
LightmapRenderStateExtractor.calculateDarknessScale port crates/horizon-client/src/game/sculk.rs::Game::darkness_lighting pulsing darkness scale from the darkness blend and the option
|
||||
LightmapRenderStateExtractor.extract port crates/horizon-client/src/game.rs::Game::render lightmap inputs gathered into the frame; the end flash is added to sky_light_factor in end.rs::end_flash_sky
|
||||
MapRenderer.extractRenderState port crates/horizon-client/src/game/maps.rs::Game::map_vertices map texture and decorations gathered for drawing
|
||||
MapRenderer.extractDecorationRenderState port crates/horizon-client/src/game/maps.rs::Game::map_vertices decoration sprite, position and rotation drawn per map
|
||||
MappableRingBuffer.currentBuffer skip:other GPU ring buffer bookkeeping
|
||||
MappableRingBuffer.rotate skip:other GPU ring buffer bookkeeping
|
||||
MappableRingBuffer.close skip:other GPU buffer release
|
||||
MultiblockChestResources.select inline crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_one single, left and right chest sprite chosen by ChestPart
|
||||
MultiblockChestResources.map skip:java record mapping of the three sprites
|
||||
Octree.isClose missing unsure: vanilla flags sections next to the camera so the occlusion walk keeps them; not traced in Horizon's occlusion path
|
||||
Octree.AxisSorting.getAxisSorting skip:java traversal-order helper; Resident::visible sorts visible sections by distance
|
||||
Octree.Branch.<init> skip:other octree node; Horizon keeps sections in a resident grid instead
|
||||
Octree.Branch.add skip:other octree insert; Horizon keeps sections in a resident grid instead
|
||||
Octree.Branch.getNodeIndex skip:other octree child index; Horizon keeps sections in a resident grid instead
|
||||
Octree.Branch.createChildBoundingBox skip:other octree child bounds; Horizon keeps sections in a resident grid instead
|
||||
Octree.Branch.visitNodes port crates/horizon-client/src/gfx/resident.rs::Resident::visible frustum and distance visit of sections, nearest first
|
||||
Octree.Branch.getAABB skip:java no callers in vanilla 26.3
|
||||
Octree.Leaf.visitNodes port crates/horizon-client/src/gfx/resident.rs::Resident::visible leaf sections visited in the same frustum and distance walk
|
||||
OrderedSubmitNodeCollector.submitModel skip:other submit queue of vanilla's render thread; Horizon draws each model in place
|
||||
OrderedSubmitNodeCollector.submitCrumblingOverlay port crates/horizon-client/src/gfx.rs::Renderer::draw_frame crumbling overlay drawn on the block being broken
|
||||
OrderedSubmitNodeCollector.submitModelPart skip:other submit queue of vanilla's render thread; Horizon draws each model part in place
|
||||
Panorama.extractRenderState port crates/horizon-client/src/gfx/panorama.rs::Rotation::update spin accumulated from the panorama speed option; overlay blit is drawn by the title screen
|
||||
PlayerSkinRenderCache.createLookup port crates/horizon-client/src/skins.rs::lookup skin texture chosen from the profile, falling back to the default skin
|
||||
PlayerSkinRenderCache.RenderInfo.renderType port crates/horizon-client/src/game/item_draw.rs::Host::player_skin skin texture path a head is drawn with; no separate render type in Horizon
|
||||
PlayerSkinRenderCache.RenderInfo.textureView skip:other GPU texture view cache; Horizon binds skin textures by atlas name
|
||||
PlayerSkinRenderCache.RenderInfo.glyphRenderTypes skip:other font render types for name tags; Horizon's text uses its own glyph pipeline
|
||||
PlayerSkinRenderCache.RenderInfo.equals skip:java value equality for a cache key
|
||||
PlayerSkinRenderCache.RenderInfo.hashCode skip:java hash for a cache key
|
||||
PostChain.load missing minor: no data-driven post chain loader; only the blur and entity outline chains exist, hard-coded
|
||||
PostChain.getReferencedExternalTargets skip:other config validation for data-driven post chains
|
||||
PostChain.createPass missing minor: no data-driven post pass creation; the outline and blur passes are fixed
|
||||
PostChain.addToFrame port crates/horizon-client/src/gfx/entity_outline.rs::EntityOutline::draw gap: minor: runs the entity outline chain only; other chains are not built
|
||||
PostChain.process port crates/horizon-client/src/menu_blur.rs::MenuBlur::apply gap: minor: runs the menu blur only; other chains are not run
|
||||
PostChain.getOrCreatePersistentTarget skip:other GPU persistent target cache
|
||||
PostChain.close skip:other GPU resource teardown
|
||||
PostChain.TargetBundle.getOrThrow skip:other frame-graph target lookup; Horizon has no frame graph
|
||||
PostChainConfig.Pass.referencedTargets skip:data config accessor for post chain JSON
|
||||
PostPass.<init> skip:other GPU pipeline creation for a post pass
|
||||
PostPass.addToFrame port crates/horizon-client/src/gfx/entity_outline.rs::EntityOutline::draw gap: minor: the pass runs inside the entity outline draw only
|
||||
PostPass.close skip:other GPU resource teardown
|
||||
PostPass.TargetInput.getHandle skip:other frame-graph input handle
|
||||
PostPass.TargetInput.texture skip:other frame-graph input texture view
|
||||
|
@@ -0,0 +1,150 @@
|
||||
Projection.setupPerspective inline crates/horizon-client/src/camera.rs::perspective gap: minor: the dirty-flag cache and the stored fov/near/far are not kept; the matrix is built from the arguments per call
|
||||
Projection.setupOrtho skip:ui GUI draws in pixels through Horizon's own HUD pipeline; no ortho projection state of its own
|
||||
Projection.getMatrixVersion skip:java matrix version counter for the dirty-check cache
|
||||
ProjectionMatrixBuffer.getBuffer skip:other GPU buffer handle getter; Horizon owns its uniform buffers in gfx.rs
|
||||
ProjectionMatrixBuffer.writeBuffer port crates/horizon-client/src/gfx/upload.rs::Uploads::buffer gap: minor: the caller decides which uniform receives the projection
|
||||
Rect2i.intersect skip:ui GUI clip rectangle math; Horizon clips each draw in hud.rs (clip_since), no rectangle type
|
||||
Rect2i.contains skip:ui GUI hit test on a rectangle; Horizon's widgets hit-test in their own UI code
|
||||
RenderPipelines.register skip:data pipeline registry; Horizon creates its pipelines in gfx.rs
|
||||
RunningTrimmedMean.registerValueAndGetMean skip:debug frame-time smoothing helper; no vanilla caller in this source tree
|
||||
ScreenEffectRenderer.submit port crates/horizon-client/src/screen_effects.rs::ScreenEffects::build gap: minor: the item activation is not built here (see renderItemActivationAnimation)
|
||||
ScreenEffectRenderer.renderItemActivationAnimation missing player: when a totem of undying saves the player, the totem does not pop up in front of the screen; Horizon only plays the totem particles and sound (game/totem.rs totem_event)
|
||||
ScreenEffectRenderer.submitWater inline crates/horizon-client/src/screen_effects.rs::ScreenEffects::build underwater overlay branch (misc/underwater)
|
||||
ScreenEffectRenderer.submitFire inline crates/horizon-client/src/screen_effects.rs::ScreenEffects::build first-person fire overlay branch (block/fire_1, two quads)
|
||||
ScreenEffectRenderer.buildFireQuad inline crates/horizon-client/src/screen_effects.rs::ScreenEffects::build the two fire quads' corners and offsets
|
||||
ScreenEffectRenderer.buildSpriteQuad inline crates/horizon-client/src/screen_effects.rs::ScreenEffects::build hand_quad closure: sprite rect and uv for overlay quads
|
||||
ScreenEffectRenderer.buildQuad inline crates/horizon-client/src/screen_effects.rs::ScreenEffects::build hand_quad closure: corners, uv and colour of one overlay quad
|
||||
SectionBufferBuilderPool.allocate skip:java heap-sized pool of section builders; Horizon's mesher uses its own worker threads
|
||||
SectionOcclusionGraph.waitAndReset port crates/horizon-client/src/gfx/occlusion.rs::Occlusion::clear gap: minor: clear discards a running search instead of waiting for it
|
||||
SectionOcclusionGraph.expectedChunks missing unsure: Horizon's occlusion graph keeps no list of sections waiting on chunk loads (streaming.rs has its own waiting set)
|
||||
SectionOcclusionGraph.invalidateIfNeeded port crates/horizon-client/src/gfx/occlusion.rs::Occlusion::update gap: minor: the search is keyed on camera section and radius only; fov and smart-cull changes do not restart it
|
||||
SectionOcclusionGraph.addSectionsInFrustum port crates/horizon-client/src/gfx/occlusion.rs::Occlusion::contains gap: minor: the frustum test is not here; the caller builds the visible list
|
||||
SectionOcclusionGraph.schedulePropagationFrom port crates/horizon-client/src/gfx/occlusion.rs::Occlusion::changed queues the changed section; propagation runs in propagate_changes
|
||||
SectionOcclusionGraph.scheduleFullUpdate port crates/horizon-client/src/gfx/occlusion.rs::Occlusion::start gap: minor: the full search goes to a worker and is collected later (collect), not to a background executor
|
||||
SectionOcclusionGraph.runPartialUpdate port crates/horizon-client/src/gfx/occlusion.rs::Occlusion::propagate_changes gap: minor: chunk-load waiting is not handled here (see expectedChunks)
|
||||
SectionOcclusionGraph.initializeQueueForFullUpdate port crates/horizon-client/src/gfx/occlusion.rs::Graph::seed_outside gap: minor: seeds the sections around a camera outside the world; the camera-inside seed is in Graph::search
|
||||
SectionOcclusionGraph.runUpdates port crates/horizon-client/src/gfx/occlusion.rs::Graph::propagate gap: minor: BFS over face directions; vanilla's distant-section ray check for smart cull is not checked here
|
||||
SectionOcclusionGraph.getRelativeFrom inline crates/horizon-client/src/gfx/occlusion.rs::Graph::propagate neighbour lookup inside the BFS
|
||||
SectionOcclusionGraph.updateEmptySections port crates/horizon-client/src/gfx/occlusion.rs::Occlusion::set gap: minor: empty sections are not kept in a separate set; their visibility arrives through set
|
||||
SectionOcclusionGraph.updateLoadedChunks missing unsure: no loaded-chunk set for the occlusion graph found in gfx/occlusion.rs
|
||||
SectionOcclusionGraph.Node.setDirections inline crates/horizon-client/src/gfx/occlusion.rs::Graph::propagate face direction bits kept per section in directions[]
|
||||
SectionOcclusionGraph.Node.hasDirection inline crates/horizon-client/src/gfx/occlusion.rs::Graph::propagate face direction bit test inside the BFS
|
||||
SectionOcclusionGraph.Node.addSourceDirection inline crates/horizon-client/src/gfx/occlusion.rs::Graph::propagate entered-face bits kept per section in entered[]
|
||||
SectionOcclusionGraph.Node.hasSourceDirection inline crates/horizon-client/src/gfx/occlusion.rs::Graph::propagate entered-face bit test inside the BFS
|
||||
SectionOcclusionGraph.Node.equals skip:java node equality for vanilla's hash sets; Horizon indexes sections by position
|
||||
SectionOcclusionGraph.SectionToNodeMap.get port crates/horizon-client/src/gfx/occlusion.rs::Graph::index gap: minor: a per-section array index instead of a map
|
||||
ShaderDefines.withOverrides skip:other merges GLSL #define sets; Horizon's WGSL uses override constants
|
||||
ShaderDefines.asSourceDirectives skip:other emits GLSL #define text; Horizon has no GLSL source
|
||||
ShaderDefines.isEmpty skip:other helper for the define set; see ShaderDefines
|
||||
ShaderDefines.Builder.define skip:other builder for the define set; see ShaderDefines
|
||||
ShaderManager.reload skip:other shader resource reload; Horizon builds its pipelines in gfx.rs
|
||||
ShaderManager.compilePipelines skip:other pipeline compile plumbing; Horizon compiles wgpu pipelines in gfx.rs
|
||||
ShaderManager.loadConfigs skip:other reads GLSL shader resources; Horizon's shader packs are read by horizon-shaders
|
||||
ShaderManager.loadShader skip:other reads one GLSL shader resource; see loadConfigs
|
||||
ShaderManager.loadInclude skip:other reads one GLSL include; WGSL has no include files
|
||||
ShaderManager.loadPostChain missing minor: JSON post chains (shaders/post) are not loaded; vanilla's spectator entity effects (creeper, spider, enderman) do not show in Horizon
|
||||
ShaderManager.listAllIncludes skip:other lists GLSL include files; WGSL has none
|
||||
ShaderManager.apply skip:other swaps in compiled pipelines; Horizon compiles at startup and on reload
|
||||
ShaderManager.tryTriggerRecovery skip:other error hook for broken post chains; Horizon has none
|
||||
ShaderManager.isPostEffectValid missing minor: checks spectator entity post effects, which Horizon does not have (see loadPostChain)
|
||||
ShaderManager.getPostChain missing minor: spectator entity post effects (creeper, spider, enderman) are not drawn; spectator mode only
|
||||
ShaderManager.PostChainCache.getOrLoadPostChain missing minor: cache for the spectator entity post effects Horizon lacks
|
||||
ShaderManager.PostChainCache.loadPostChain missing minor: loads the spectator entity post effects Horizon lacks
|
||||
ShaderManager.PostChainCache.close skip:other releases post chains; Horizon has none
|
||||
Sheets.chooseSprite port crates/horizon-client/src/block_entity_render.rs::classify gap: minor: the Christmas chest texture is picked outside this fn (block_entity_render.rs extended_christmas)
|
||||
SkyRenderer.<init> inline crates/horizon-client/src/gfx/pack_sky.rs::PackSky::new gap: minor: builds the disc, sunset fan, stars and void up front; sun and moon quads are built per frame in game.rs celestial_geometry
|
||||
SkyRenderer.extractRenderState port crates/horizon-client/src/environment.rs::Environment::sample gap: minor: the End flash state is read in game/end.rs (end_flash_sky)
|
||||
SkyRenderer.render port crates/horizon-client/src/gfx.rs::Renderer::draw_frame sky pass; the frame's sky and dark-disc flags come from Game::render
|
||||
SkyRenderer.renderSkyDisc port crates/horizon-client/src/gfx/pack_sky.rs::disc top sky disc fan, sky colour from PackSky::prepare
|
||||
SkyRenderer.renderDarkDisc inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame dark disc pipeline (fs_dark_disc) drawn when frame.dark_disc is set
|
||||
SkyRenderer.renderSun port crates/horizon-client/src/game.rs::Game::celestial_geometry sun quad 100 blocks out, half-size 30, faded by rain
|
||||
SkyRenderer.renderMoon port crates/horizon-client/src/game.rs::Game::celestial_geometry moon quad 100 blocks out, half-size 20, faded by rain
|
||||
SkyRenderer.applyCelestialBodyTransform inline crates/horizon-client/src/game.rs::Game::celestial_geometry the body frame: rotate Y -90, then X by the body's angle
|
||||
SkyRenderer.drawCelestialBody inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame draws the body quads with the celestial pipeline
|
||||
SkyRenderer.renderSunriseAndSunset port crates/horizon-client/src/gfx/pack_sky.rs::PackSky::prepare sunset fan turned to the sun's horizon and its alpha uploaded as sunrise
|
||||
SkyRenderer.renderEndSky port crates/horizon-client/src/gfx/end_sky.rs::EndSky::draw End sky cube
|
||||
SkyRenderer.buildSunriseFan port crates/horizon-client/src/gfx/pack_sky.rs::PackSky::new gap: minor: a unit 16-segment fan; the 120 and -40 block shape is not built here
|
||||
SkyRenderer.buildCelestialQuad port crates/horizon-client/src/game.rs::Game::celestial_geometry sprite quad for the sun and moon (body closure)
|
||||
SkyRenderer.buildMoonPhases port crates/horizon-client/src/game.rs::Game::celestial_geometry gap: minor: picks the phase from day time (day_time / 24000), not from the environment's moon phase value
|
||||
SkyRenderer.buildSkyDisc port crates/horizon-client/src/gfx/pack_sky.rs::disc 16-block disc fan (top and bottom)
|
||||
SkyRenderer.close skip:other releases sky buffers; Rust drops the wgpu buffers
|
||||
SpriteCoordinateExpander.addVertex skip:other no callers in this vanilla tree; UV wrapper for sprite quads
|
||||
SpriteCoordinateExpander.setColor skip:other no callers in this vanilla tree; see addVertex
|
||||
SpriteCoordinateExpander.setUv skip:other no callers in this vanilla tree; see addVertex
|
||||
SpriteMapper.apply skip:other atlas id plumbing; Horizon looks sprites up by name in its atlas
|
||||
StagedVertexBuffer.appendDraw skip:other staging draw object; Horizon's arena allocates vertex ranges directly
|
||||
StagedVertexBuffer.getVertexBuilder skip:other builder for the next mesh; Horizon's mesher writes straight into the section mesh
|
||||
StagedVertexBuffer.finishLastVertexBuilder skip:other closes the last mesh builder; see getVertexBuilder
|
||||
StagedVertexBuffer.upload port crates/horizon-client/src/gfx/arena.rs::Arena::alloc gap: minor: vertex ranges come from the arena; the copy is Uploads::buffer
|
||||
StagedVertexBuffer.uploadDrawsToBuffers inline crates/horizon-client/src/gfx/upload.rs::Uploads::buffer copies the staged vertex data into the buffers
|
||||
StagedVertexBuffer.decodeSortingPoints port crates/horizon-client/src/gfx/translucency.rs::quad_center gap: minor: the centre of one quad from two corners; reading the vertex buffer itself is not here
|
||||
StagedVertexBuffer.getExecuteInfo skip:other describes a draw for execution; Horizon issues draws in gfx.rs::Renderer::draw_sections
|
||||
StagedVertexBuffer.requestIndexCount port crates/horizon-client/src/gfx/arena.rs::Arena::indices gap: minor: the index buffer is sized when created, not requested per draw
|
||||
StagedVertexBuffer.endFrame port crates/horizon-client/src/gfx/arena.rs::Arena::trim gap: minor: releases unused pages; no fence-based recycling
|
||||
StagedVertexBuffer.close skip:other releases buffers; Rust drops them
|
||||
StagedVertexBuffer.Draw.append skip:other accumulates mesh counts for one draw; Horizon counts vertices in the arena
|
||||
StagedVertexBuffer.ExecuteInfo.indexBuffer skip:other picks the index buffer for a draw; Horizon keeps its own index buffers
|
||||
StagedVertexBuffer.GpuBufferPool.tryRecycleBuffers port crates/horizon-client/src/gfx/arena.rs::FreeList::give_all gap: minor: freed ranges return to the free list at once; no fence wait
|
||||
StagedVertexBuffer.GpuBufferPool.acquire port crates/horizon-client/src/gfx/arena.rs::Arena::alloc gap: minor: allocates a range in an existing page instead of a new buffer per size
|
||||
StagedVertexBuffer.GpuBufferPool.takeBestAvailable port crates/horizon-client/src/gfx/arena.rs::FreeList::take gap: minor: first fit, where vanilla takes the smallest buffer that fits
|
||||
StagedVertexBuffer.GpuBufferPool.endFrame skip:other fence bookkeeping for GPU reuse; Horizon's arena releases ranges directly
|
||||
StagedVertexBuffer.GpuBufferPool.close skip:other releases buffers; Rust drops them
|
||||
StagedVertexBuffer.GpuBufferPool.PendingRecycle.tryRecycle skip:other fence wait for GPU reuse; Horizon has no fence here
|
||||
SubmitNodeCollection.<init> skip:other builds the phase lists (improved transparency or not); Horizon has fixed passes in gfx.rs
|
||||
SubmitNodeCollection.submitShadow port crates/horizon-client/src/game.rs::Game::entity_geometry entity shadow quads (misc/shadow) when the entity_shadows option is on
|
||||
SubmitNodeCollection.nameTag port crates/horizon-client/src/game/names.rs::Game::name_tag_geometry name tags
|
||||
SubmitNodeCollection.submitNameTagPart port crates/horizon-client/src/game/names.rs::Game::name_tag_quads adds the text quads of one name tag part
|
||||
SubmitNodeCollection.canRenderAsSolid inline crates/horizon-client/src/game/names.rs::Game::name_tag_geometry the choice between the opaque and see-through pass
|
||||
SubmitNodeCollection.submitText port crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry world text (text displays)
|
||||
SubmitNodeCollection.submitTextBackground inline crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry background quad of a text display
|
||||
SubmitNodeCollection.submitTextPart inline crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry the see-through or opaque choice for a text part
|
||||
SubmitNodeCollection.submitFlame port crates/horizon-client/src/fire_render.rs::flames entity fire flames
|
||||
SubmitNodeCollection.submitLeash port crates/horizon-client/src/game/leads.rs::Game::leash_geometry lead rope from a leashed mob to its holder
|
||||
SubmitNodeCollection.submitModel port crates/horizon-client/src/game/creatures.rs::Game::mob_geometry mob models
|
||||
SubmitNodeCollection.submitCrumblingOverlay port crates/horizon-client/src/game.rs::Game::cracks block break cracks (destroy_stage sprites) over a block
|
||||
SubmitNodeCollection.submitMovingBlock port crates/horizon-client/src/game/moving_pistons.rs::Game::moving_piston_geometry moving piston blocks
|
||||
SubmitNodeCollection.submitBlockModel port crates/horizon-client/src/block_entity_render.rs::BlockEntityRenderer::render_block gap: minor: block models driven by block entities only
|
||||
SubmitNodeCollection.getOutlineRenderType inline crates/horizon-client/src/gfx.rs::Renderer::draw_outline one outline pass; the render type choice is folded into it
|
||||
SubmitNodeCollection.submitBreakingBlockModel port crates/horizon-client/src/game.rs::Game::cracks gap: minor: drawn as cracks; the block model itself is not redrawn
|
||||
SubmitNodeCollection.submitShapeOutline port crates/horizon-client/src/gfx.rs::Renderer::draw_outline block shape outline (selection box)
|
||||
SubmitNodeCollection.submitItem port crates/horizon-client/src/game/item_draw.rs::Game::dropped_item_geometry dropped item entities
|
||||
SubmitNodeCollection.submitCustomGeometry port crates/horizon-client/src/mobs/guardian.rs::beam_geometry gap: minor: the guardian beam only; screen overlay quads are built in ScreenEffects::build
|
||||
SubmitNodeCollection.submitGizmoPrimitives skip:debug debug gizmo overlay
|
||||
SubmitNodeStorage.setUseImprovedTransparency skip:other storage toggle for the transparency path; Horizon fixes its path in Renderer::new
|
||||
SubmitNodeStorage.order skip:other per-order submit collection; Horizon draws in fixed passes
|
||||
SubmitNodeStorage.submitNameTag skip:other submit wrapper; the drawing is in SubmitNodeCollection.nameTag
|
||||
SubmitNodeStorage.submitText skip:other submit wrapper; see SubmitNodeCollection.submitText
|
||||
SubmitNodeStorage.submitTextBackground skip:other submit wrapper; see SubmitNodeCollection.submitTextBackground
|
||||
SubmitNodeStorage.submitModel skip:other submit wrapper; see SubmitNodeCollection.submitModel
|
||||
SubmitNodeStorage.submitCrumblingOverlay skip:other submit wrapper; see SubmitNodeCollection.submitCrumblingOverlay
|
||||
SubmitNodeStorage.submitBlockModel skip:other submit wrapper; see SubmitNodeCollection.submitBlockModel
|
||||
SubmitNodeStorage.submitShapeOutline skip:other submit wrapper; see SubmitNodeCollection.submitShapeOutline
|
||||
SubmitNodeStorage.submitItem skip:other submit wrapper; see SubmitNodeCollection.submitItem
|
||||
SubmitNodeStorage.drainPhases inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame the pass order that draws each phase
|
||||
ViewArea.releaseAllBuffers port crates/horizon-client/src/gfx.rs::Renderer::clear_sections drops every section's buffers
|
||||
ViewArea.repositionCamera inline crates/horizon-client/src/gfx/occlusion.rs::Occlusion::update gap: minor: the occlusion graph restarts on a camera section change; sections are keyed by absolute position, nothing is re-centred
|
||||
WeatherEffectRenderer.renderWeather inline crates/horizon-client/src/gfx/weather.rs::Weather::draw draws the rain and snow column ranges
|
||||
WeatherEffectRenderer.uploadVertexBuffer port crates/horizon-client/src/gfx/weather.rs::Weather::prepare gap: minor: the buffer grows to the next power of two
|
||||
WeatherEffectRenderer.prepare port crates/horizon-client/src/weather.rs::column_quad gap: minor: the column list comes from rain_column and snow_column; this fn builds the quads
|
||||
WeatherEffectRenderer.render port crates/horizon-client/src/gfx/weather.rs::Weather::draw draws the rain and snow columns
|
||||
WeatherEffectRenderer.createSnowColumnInstance port crates/horizon-client/src/weather.rs::snow_column snow drift and brightened light
|
||||
WeatherEffectRenderer.prepareInstances port crates/horizon-client/src/weather.rs::column_quad gap: minor: one column per call; the loop over columns is in the caller
|
||||
WorldBorderRenderer.renderOit inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame border wall draw when frame.border is set
|
||||
WorldBorderRenderer.prepareRenderPass inline crates/horizon-client/src/border_render.rs::BorderRenderer::transforms the uniforms (colour, offset, texture scroll) for the wall
|
||||
WorldBorderRenderer.shouldRebuildWorldBorderBuffer port crates/horizon-client/src/border_render.rs::BorderRenderer::prepare rebuilds when the border moved or was invalidated
|
||||
FluidRenderer.getHeight inline crates/horizon-client/src/mesher/fluid.rs::tesselate corner heights from own_height and the neighbour average
|
||||
ChunkSectionLayer.byTransparency inline crates/horizon-client/src/mesher.rs::Mesher::face a face goes to the translucent list when it is translucent
|
||||
ChunkSectionsToRender.renderGroup port crates/horizon-client/src/gfx.rs::Renderer::draw_sections gap: minor: draws the given page runs; the terrain uniforms are bound by the caller
|
||||
ChunkSectionsToRender.renderOit port crates/horizon-client/src/gfx.rs::Renderer::draw_sections gap: minor: the OIT pass set-up is not in this fn
|
||||
ChunkSectionsToRender.renderLayers inline crates/horizon-client/src/gfx.rs::Renderer::draw_sections per-layer loop over the page runs
|
||||
ChunkSectionsToRender.DrawIndirect.render port crates/horizon-client/src/gfx.rs::Renderer::draw_sections multi-draw indirect branch
|
||||
ChunkSectionsToRender.DrawSeparate.render port crates/horizon-client/src/gfx.rs::Renderer::draw_sections per-draw branch without multi-draw
|
||||
RenderRegionCache.createRegion inline crates/horizon-client/src/mesher.rs::borrow gap: minor: borrows the 3x3 chunk columns around the section; nothing is copied
|
||||
RenderRegionCache.getSectionDataCopy skip:java per-thread copy cache; Horizon borrows the chunks
|
||||
RenderSectionRegion.getBlockState inline crates/horizon-client/src/mesher.rs::Mesher::mesh block reads of the mesh loop
|
||||
RenderSectionRegion.getFluidState port crates/horizon-client/src/mesher/fluid.rs::FlowView::fluid fluid read used by the fluid mesher
|
||||
RenderSectionRegion.getBlockEntity skip:other block entities are drawn from the world's list, not from the section region
|
||||
RenderSectionRegion.getSection skip:java section copy objects; Horizon borrows chunks
|
||||
RenderSectionRegion.index inline crates/horizon-client/src/mesher.rs::Mesher::mesh gap: minor: Horizon indexes 3x3 chunk columns, the section is picked by sy
|
||||
SectionCompiler.compile port crates/horizon-client/src/mesher.rs::Mesher::mesh gap: minor: block-entity tiles are not built here; they are drawn by block_entity_render
|
||||
SectionCompiler.getOrBeginLayer inline crates/horizon-client/src/mesher.rs::Mesher::mesh per-layer builders created on first use
|
||||
|
@@ -0,0 +1,104 @@
|
||||
SectionCopy.getBlockState inline crates/horizon-client/src/mesher.rs::Padded::new the copy is Padded's block array; no debug-world barrier or DebugLevelSource blocks
|
||||
SectionRenderDispatcher.<init> skip:other builds the GPU arena and staging for chunk upload; Horizon creates its arena and uploads in gfx.rs with the renderer
|
||||
SectionRenderDispatcher.runTask port crates/horizon-client/src/streaming.rs::Streaming::new the worker loop pops the nearest queued job and runs it
|
||||
SectionRenderDispatcher.getRenderSectionSlice port crates/horizon-client/src/gfx.rs::Renderer::draw_sections the per-layer vertex and index slices of a section are read when drawing
|
||||
SectionRenderDispatcher.uploadTerrainBuffersToGpu port crates/horizon-client/src/gfx/upload.rs::Uploads::finish closes the frame's staging belt after the terrain copies
|
||||
SectionRenderDispatcher.schedule port crates/horizon-client/src/streaming.rs::Streaming::submit the mesh job goes into the priority queue by distance
|
||||
SectionRenderDispatcher.dispose port crates/horizon-client/src/gfx.rs::Renderer::clear_sections frees every section's GPU buffers
|
||||
SectionRenderDispatcher.getStats skip:debug F3 text: compile queue size and free buffers
|
||||
SectionRenderDispatcher.RenderSection.getVisibility missing player: newly meshed terrain appears at full strength; vanilla fades each section in over the chunkSectionFadeInTime option, and block entities wait for 0.3
|
||||
SectionRenderDispatcher.RenderSection.setSectionNode port crates/horizon-client/src/gfx.rs::section_instance the section's render origin; its 16-block bounds are derived from the origin
|
||||
SectionRenderDispatcher.RenderSection.reset port crates/horizon-client/src/gfx.rs::Renderer::release_section drops the section's mesh and GPU slices
|
||||
SectionRenderDispatcher.RenderSection.resortTransparency port crates/horizon-client/src/gfx/translucency.rs::SortState::update translucent quads re-sorted for the camera; gap: minor: the new order goes to the next draw, not a newly uploaded index buffer
|
||||
SectionRenderDispatcher.RenderSection.transparencyResortingScheduled skip:other Horizon sorts during the frame, so there is no pending resort task to report
|
||||
SectionRenderDispatcher.RenderSection.cancelTasks inline crates/horizon-client/src/streaming.rs::Streaming::update a finished job whose seq no longer matches is dropped on arrival; queued jobs are not removed
|
||||
SectionRenderDispatcher.RenderSection.createCompileTask port crates/horizon-client/src/streaming.rs::Streaming::submit the mesh job is queued; the recompile flag is not kept
|
||||
SectionRenderDispatcher.RenderSection.compileSync port crates/horizon-client/src/mesher.rs::Mesher::mesh meshes on the calling thread with no queue
|
||||
SectionRenderDispatcher.RenderSection.setSectionMesh port crates/horizon-client/src/gfx.rs::Renderer::upload stores the new mesh for the section and hands back the old one
|
||||
SectionRenderDispatcher.RenderSection.releaseSectionMesh port crates/horizon-client/src/gfx.rs::Renderer::release_mesh frees the old mesh's GPU slices
|
||||
SectionRenderDispatcher.RenderSection.createVertexSorting port crates/horizon-client/src/gfx/translucency.rs::Sorter::sort sort by squared distance from the camera to each quad centre
|
||||
SectionRenderDispatcher.RenderSection.checkSectionMesh inline crates/horizon-client/src/gfx.rs::Renderer::upload uploads are synchronous, so there is no wait for every layer to land before publishing
|
||||
SectionRenderDispatcher.RenderSection.addSectionBuffersToUberBuffer port crates/horizon-client/src/gfx.rs::Renderer::upload_mesh copies a layer's vertex and index bytes into arena pages
|
||||
SectionRenderDispatcher.RenderSection.CompileTask.doTask port crates/horizon-client/src/mesher.rs::Mesher::mesh meshes the section; the empty result and upload are handled in streaming and Renderer::upload
|
||||
SectionRenderDispatcher.RenderSection.ResortTransparencyTask.doTask port crates/horizon-client/src/gfx/translucency.rs::SortState::update re-sorts translucent quads when the camera's point of view changes
|
||||
SectionTaskDynamicQueue.poll port crates/horizon-client/src/streaming.rs::Queued::cmp nearest job first; gap: minor: no recompile quota, new and remesh jobs share one priority
|
||||
SectionTaskDynamicQueue.clear skip:other Horizon has no queue clear; stale results are dropped by seq in Streaming::update
|
||||
TranslucencyPointOfView.set inline crates/horizon-client/src/gfx/translucency.rs::SortState::update the point of view: camera block minus section, clamped to -1..1 per axis
|
||||
TranslucencyPointOfView.isAxisAligned inline crates/horizon-client/src/gfx/translucency.rs::SortState::update the axis-aligned test: a zero component in the point of view
|
||||
TranslucencyPointOfView.equals inline crates/horizon-client/src/gfx/translucency.rs::SortState::update compares the last point of view with the new one
|
||||
TranslucencyPointOfView.hashCode skip:java hash for a map key
|
||||
VisGraph.setOpaque inline crates/horizon-client/src/mesher.rs::visibility opaque cells are marked in the seen map before the flood fill
|
||||
VisGraph.getIndex inline crates/horizon-client/src/mesher.rs::visibility cell index y<<8 | z<<4 | x in the seen map
|
||||
VisGraph.floodFill inline crates/horizon-client/src/mesher.rs::visibility flood fill from each open cell; gap: minor: no shortcut for sections with fewer than 256 opaque cells, which vanilla marks fully visible
|
||||
VisGraph.addEdges inline crates/horizon-client/src/mesher.rs::visibility the faces of the section a cell touches
|
||||
VisGraph.getNeighborIndexAtFace inline crates/horizon-client/src/mesher.rs::visibility the neighbour index inside the section, -1 at its border
|
||||
VisibilitySet.add inline crates/horizon-client/src/mesher.rs::visibility sets the bit for each pair of faces an open region touches (bit a*6+b)
|
||||
VisibilitySet.set inline crates/horizon-client/src/mesher.rs::visibility sets both bits of a face pair
|
||||
VisibilitySet.visibilityBetween port crates/horizon-client/src/gfx/occlusion.rs::Graph::propagate the faces a section connects are read from its visibility bits when the search moves on
|
||||
VisibilitySet.toString skip:debug debug text
|
||||
Frustum.set skip:java copies the frustum; Horizon passes the Frustum value
|
||||
Frustum.offset missing minor: particles are not culled against a frustum pulled back 3 blocks (ParticleEngine.extract); Horizon has no particle frustum test
|
||||
Frustum.offsetToFullyIncludeCameraCube port crates/horizon-client/src/gfx/occlusion.rs::Graph::search the occlusion search starts in the camera's own section, so its cube is always included; gap: minor: no frustum offset
|
||||
Frustum.calculateFrustum port crates/horizon-client/src/gfx.rs::frustum the six planes from projection times view
|
||||
Frustum.isVisible port crates/horizon-client/src/gfx.rs::Frustum::intersects box against the planes; gap: minor: infinite bounds are not special-cased
|
||||
Frustum.cubeInFrustum port crates/horizon-client/src/gfx.rs::Frustum::intersects box test on camera-relative bounds
|
||||
Frustum.pointInFrustum missing minor: only particle culling uses it (QuadParticleGroup), and Horizon has no particle frustum test
|
||||
Frustum.getFrustumPoints skip:debug the eight frustum corners, for debug drawing only
|
||||
Frustum.getNearPlaneBounds missing player: the block texture overlay drawn when your eye is inside a block (view-blocking block) is never shown; ScreenEffectRenderer's block_overlay is never set outside tests
|
||||
BeeDebugRenderer missing minor: F3 bee and hive debug view (hive blacklist, flowers, ghost hives); not drawn
|
||||
BrainDebugRenderer missing minor: F3 brain debug view (activities, memories, POIs); not drawn
|
||||
BreezeDebugRenderer missing minor: F3 breeze jump target view; breeze_jump_target is kept in monster_brain.rs but never drawn
|
||||
ChunkCullingDebugRenderer missing minor: F3 chunk culling frustum view; the occlusion graph has no draw
|
||||
ChunkDebugRenderer missing minor: F3 chunk info view fed by the integrated server; not drawn
|
||||
ChunkDebugRenderer.ChunkData missing minor: data for the F3 chunk info view; not built
|
||||
CollisionBoxRenderer missing minor: F3 block collision box view; not drawn
|
||||
DebugRenderer.refreshRendererList inline crates/horizon-client/src/game/debug_keys.rs::Game::debug_gizmos the enabled views; Horizon has only chunk borders (show_chunk_borders) and hitboxes (show_hitboxes), the rest are missing
|
||||
DebugRenderer.getTargetedEntity skip:debug entity under the crosshair for debug views only
|
||||
DebugRenderer.mixColor skip:debug colour helper for debug paths
|
||||
DebugRenderer.shiftHue skip:debug colour helper with no callers
|
||||
EntityBlockIntersectionDebugRenderer missing minor: F3 entity and block intersection view; not drawn
|
||||
EntityHitboxDebugRenderer.emitGizmos port crates/horizon-client/src/game/debug_keys.rs::Game::debug_gizmos the F3+B hitbox loop for mobs, items, paintings, frames, boats, carts, projectiles, the dragon and the player
|
||||
EntityHitboxDebugRenderer.getServerEntity skip:debug the integrated server's entity for a hitbox; Horizon draws its own client entities
|
||||
GameEventListenerRenderer missing minor: F3 game event listener view; not drawn
|
||||
GameTestBlockHighlightRenderer skip:debug game test block markers; Horizon does not run game tests
|
||||
GoalSelectorDebugRenderer missing minor: F3 mob goal view; not drawn
|
||||
HeightMapRenderer missing minor: F3 heightmap view; not drawn
|
||||
LightDebugRenderer missing minor: F3 light level view; not drawn
|
||||
LightSectionDebugRenderer missing minor: F3 light section view; not drawn
|
||||
LightSectionDebugRenderer.SectionData missing minor: data for the F3 light section view; not built
|
||||
NeighborsUpdateRenderer missing minor: F3 neighbour update view; not drawn
|
||||
NeighborsUpdateRenderer.LastUpdate missing minor: data for the F3 neighbour update view; not kept
|
||||
OctreeDebugRenderer missing minor: F3 chunk section octree view; not drawn
|
||||
PathfindingRenderer missing minor: F3 mob path view; not drawn
|
||||
PoiDebugRenderer missing minor: F3 point of interest view; not drawn
|
||||
RaidDebugRenderer missing minor: F3 raid centre view; not drawn
|
||||
RedstoneWireOrientationsRenderer missing minor: F3 redstone wire orientation view; not drawn
|
||||
SolidFaceRenderer missing minor: F3 solid face view; not drawn
|
||||
StructureRenderer missing minor: F3 structure bounding box view fed by debug subscriptions; Horizon sends none
|
||||
SupportBlockRenderer missing minor: F3 support block view; not drawn
|
||||
VillageSectionsDebugRenderer missing minor: F3 village section view; not drawn
|
||||
WaterDebugRenderer missing minor: F3 water level view; not drawn
|
||||
LevelExtractor.extract port crates/horizon-client/src/game.rs::Game::render the frame's extraction and draw; gap: minor: no separate render state, the frame is built and drawn in one fn
|
||||
LevelExtractor.drainTransientBlockQueue missing player: temporary blocks the server shows (ClientboundAddTransientBlockPacket) never appear; the packet has an id in horizon-protocol but no handler
|
||||
LevelExtractor.extractVisibleBlockEntities inline crates/horizon-client/src/game.rs::Game::render block entities of the visible sections; gap: minor: no 0.3 visibility gate, see RenderSection.getVisibility
|
||||
LevelExtractor.extractBlockDestroyAnimation port crates/horizon-client/src/game.rs::Game::destroy_block_progress keeps the crumbling progress per breaker for 400 ticks; gap: minor: no 32-block distance cut here
|
||||
LevelExtractor.extractGizmos port crates/horizon-client/src/game/debug_keys.rs::Game::debug_gizmos the frame's debug gizmos
|
||||
LevelExtractor.extractPlayerState inline crates/horizon-client/src/game.rs::Game::render player and hands read from the game state at draw time; gap: minor: the view-blocking block is missing, see Frustum.getNearPlaneBounds
|
||||
LevelExtractor.applyFrustum port crates/horizon-client/src/gfx/resident.rs::Resident::visible the frustum decides which sections are visible
|
||||
LevelExtractor.setLevel inline crates/horizon-client/src/game.rs::Game::all_sections_changed a new level rebuilds every loaded section (allChanged); the null-level branch is not separate
|
||||
LevelExtractor.blockChanged port crates/horizon-client/src/world.rs::World::set a block edit marks its 3x3x3 neighbourhood; gap: minor: the player-changed flag (update bit 8) is not kept
|
||||
LevelExtractor.setBlockDirty port crates/horizon-client/src/world.rs::World::set marks the 3x3x3 section neighbourhood of an edited block
|
||||
LevelExtractor.setBlocksDirty inline crates/horizon-client/src/world.rs::World::set each block of the range goes through the same 3x3x3 marking
|
||||
LevelExtractor.setSectionDirtyWithNeighbors port crates/horizon-client/src/streaming.rs::Streaming::light_updated the section and its neighbours remesh
|
||||
LevelExtractor.setSectionRangeDirty inline crates/horizon-client/src/streaming.rs::Streaming::light_updated section range marked in world.dirty_sections
|
||||
LevelExtractor.setSectionDirty port crates/horizon-client/src/world.rs::DirtySections::insert marks one section for remesh
|
||||
LevelExtractor.countRenderedSections skip:debug F3 count of sections with renderable layers; Horizon reports Renderer::section_count
|
||||
LevelExtractor.sectionStatistics skip:debug F3 text
|
||||
LevelExtractor.entityStatistics skip:debug F3 text
|
||||
BlockModelFeatureRenderer skip:other feature pass plumbing; Horizon draws block models in its own passes with no feature groups
|
||||
CustomFeatureRenderer.buildGroup skip:other feature pass plumbing; Horizon has no feature groups
|
||||
FeatureRenderDispatcher.<init> skip:other feature dispatcher set-up; Horizon has no feature dispatcher
|
||||
FeatureRenderDispatcher.prepareFrame skip:other feature dispatcher; the frame's draw order is fixed in Renderer::draw_frame
|
||||
FeatureRenderDispatcher.prepareFrameWithContext skip:other feature dispatcher; the frame's draw order is fixed in Renderer::draw_frame
|
||||
FeatureRenderDispatcher.renderAllFeatures port crates/horizon-client/src/gfx.rs::Renderer::draw_frame draws the frame's passes; gap: minor: the order is fixed, not taken from a feature list
|
||||
FeatureRenderDispatcher.PhaseSubmitGrouper skip:other groups feature submissions per phase for vanilla's dispatcher; Horizon submits in fixed passes
|
||||
|
@@ -0,0 +1,118 @@
|
||||
FeatureRenderDispatcher.PreparedFrame skip:other render-pass order and draw-group plumbing of vanilla's feature renderer; Horizon orders its own passes
|
||||
FeatureRenderDispatcher.PreparedGroup skip:other runs one feature group through its renderer; the per-feature draws are mapped by their own renderers
|
||||
FeatureRendererMap skip:java type-indexed lookup table of feature renderers
|
||||
FlameFeatureRenderer.buildGroup port crates/horizon-client/src/fire_render.rs::flames loop over burning entities
|
||||
FlameFeatureRenderer.prepare port crates/horizon-client/src/fire_render.rs::flames two alternating fire sprites stacked up the entity
|
||||
FlameFeatureRenderer.fireVertex inline crates/horizon-client/src/fire_render.rs::flames vertex push folded into flames
|
||||
GizmoFeatureRenderer.buildGroup port crates/horizon-client/src/gizmos.rs::camera_relative gap: minor: only lines are drawn; quads, triangle fans, points and texts are not
|
||||
GizmoFeatureRenderer.buildTexts missing minor: debug gizmo text labels are not drawn; Gizmos has no text kind
|
||||
GizmoFeatureRenderer.buildTriangleFans missing minor: debug triangle fans are not drawn; Gizmos has no fan kind
|
||||
GizmoFeatureRenderer.buildQuads missing minor: debug filled quads are not drawn; cuboid gizmos are edges only
|
||||
GizmoFeatureRenderer.buildPoints missing minor: debug points are not drawn; Gizmos has no point kind
|
||||
ItemFeatureRenderer.buildGroup port crates/horizon-client/src/item_render.rs::ItemRenderState::submit loop over item submits
|
||||
ItemFeatureRenderer.prepareSubmit port crates/horizon-client/src/item_render.rs::ItemRenderState::submit layer loop, quads or special model
|
||||
ItemFeatureRenderer.prepareOutlineSubmit port crates/horizon-client/src/game/glowing.rs::Game::mark_outline gap: minor: outline colour is only applied to dropped items (item_draw.rs dropped_item_geometry); held-item outlines not checked
|
||||
ItemFeatureRenderer.computeFoilDecalPose missing minor: unsure: the 0.5 GUI and 0.75 first-person foil decal scale is not found; glint scale is per context in item_render.rs Glint
|
||||
ItemFeatureRenderer.getLayerColorSafe port crates/horizon-client/src/item_render.rs::submit_quads tint index past the tints draws white, both overloads
|
||||
LeashFeatureRenderer.buildGroup port crates/horizon-client/src/game/leads.rs::Game::leash_geometry loop over leash submits
|
||||
LeashFeatureRenderer.prepare port crates/horizon-client/src/game/leads.rs::Game::leash_geometry gap: player: rope never sags when slack (vanilla droops the rope); no slack state in the leash render
|
||||
LeashFeatureRenderer.addVertexPair inline crates/horizon-client/src/game/leads.rs::Game::leash_geometry vertex pair with block and sky light lerp folded into leash_geometry
|
||||
ModelFeatureRenderer.buildGroup port crates/horizon-client/src/mobs.rs::render_model loop over model submits
|
||||
ModelFeatureRenderer.prepareModel port crates/horizon-client/src/mobs.rs::render_model gap: minor: setupAnim is done by the mob code, and the sheeted decal and uv wrap are not checked
|
||||
MovingBlockFeatureRenderer.buildGroup port crates/horizon-client/src/game/moving_pistons.rs::Game::moving_piston_geometry moving piston block and base geometry
|
||||
MovingBlockFeatureRenderer.putBakedQuad port crates/horizon-client/src/game/moving_pistons.rs::Game::moving_block_vertices quad placed at the moving offset
|
||||
QuadParticleFeatureRenderer skip:other GPU batching and draw plumbing of particle quads; Horizon's particle pass lives in particles.rs and gfx/pack_entities.rs
|
||||
RenderTypeFeatureRenderer skip:other GPU render-type batching; Horizon batches its own draws in gfx/entity_batch.rs
|
||||
RenderTypeFeatureRenderer.Group skip:other GPU render-type batching, as above
|
||||
ShadowFeatureRenderer.buildGroup port crates/horizon-client/src/shadows.rs::shadow loop over shadow submits
|
||||
ShadowFeatureRenderer.prepare port crates/horizon-client/src/shadows.rs::shadow shadow quads per piece, clamped by the block below
|
||||
ShadowFeatureRenderer.shadowVertex inline crates/horizon-client/src/shadows.rs::shadow vertex push folded into shadow
|
||||
ShapeOutlineFeatureRenderer.buildGroup port crates/horizon-client/src/gfx.rs::outline_vertices block selection outline edges as line vertices
|
||||
TextFeatureRenderer.buildGroup skip:other dispatch over text and background submits; each kind is covered below or by Horizon's text draw
|
||||
TextFeatureRenderer.renderText missing minor: unsure: no outlined-text path found (font.rs, hud.rs, names.rs); the outline colour of a text submit is not drawn
|
||||
TextFeatureRenderer.GlyphRenderer.acceptRenderable skip:other glyph sink for the text pass; Horizon's font pass draws the glyphs
|
||||
FeatureRenderPhase.Output.acceptFeatureGroup skip:other phase plumbing: hands sorted groups to the renderer pass
|
||||
SimpleFeatureRenderPhase skip:other submit, sort, shuffle (debug only) and clear of feature submits; Horizon sorts its own draws
|
||||
SimpleFeatureRenderPhase.FeatureSubmits skip:other batching bookkeeping of feature submits
|
||||
TranslucentFeatureRenderPhase.submit inline crates/horizon-client/src/gfx/translucency.rs::Sorter::sort collects submits; distances are taken in sort
|
||||
TranslucentFeatureRenderPhase.sortInto port crates/horizon-client/src/gfx/translucency.rs::Sorter::sort back-to-front by distance, equal distances keep submit order
|
||||
TranslucentFeatureRenderPhase.sortIndices port crates/horizon-client/src/gfx/translucency.rs::Sorter::sort far to near, stable on ties
|
||||
TranslucentSubmit.computeDistanceToCameraSq inline crates/horizon-client/src/gfx/translucency.rs::Sorter::sort distance from the quad centre to the camera, computed inside sort
|
||||
FogRenderer.getBuffer skip:other selects the fog uniform slice; Horizon hands its fog values to its own shader per frame
|
||||
FogRenderer.updateBuffer skip:other writes the fog uniform buffer; Horizon's frame_fog passes FogData to its own shader
|
||||
AtmosphericFogEnvironment.getBaseColor port crates/horizon-client/src/fog.rs::setup_fog gap: minor: sky fog end uses constant 512 instead of the SKY_FOG_END_DISTANCE attribute
|
||||
AtmosphericFogEnvironment.applyWeatherDarken inline crates/horizon-client/src/fog.rs::setup_fog rain and thunder darkening folded into the atmospheric colour
|
||||
BlindnessFogEnvironment.setupFog port crates/horizon-client/src/fog.rs::setup_fog blindness distance and sky/cloud ends
|
||||
BlindnessFogEnvironment.getModifiedDarkness inline crates/horizon-client/src/fog.rs::setup_fog blindness darkness folded into setup_fog
|
||||
LavaFogEnvironment.setupFog port crates/horizon-client/src/fog.rs::setup_fog gap: player: spectator (-8 start, half render distance) and fire resistance (0 to 5) are not applied in lava
|
||||
MobEffectFogEnvironment.isApplicable inline crates/horizon-client/src/game/render_tick.rs::Game::frame_fog effect gate is where frame_fog builds the blindness and darkness inputs
|
||||
PowderedSnowFogEnvironment.setupFog port crates/horizon-client/src/fog.rs::setup_fog gap: player: spectator case (-8 start, half render distance) is not applied
|
||||
WaterFogEnvironment.setupFog port crates/horizon-client/src/fog.rs::setup_fog gap: minor: water fog start is fixed at -8; vanilla reads the WATER_FOG_START_DISTANCE attribute
|
||||
DrawableGizmoPrimitives.addPoint missing minor: debug points are not drawn; Gizmos has no point kind
|
||||
DrawableGizmoPrimitives.addLine port crates/horizon-client/src/gizmos.rs::Gizmos::line
|
||||
DrawableGizmoPrimitives.addTriangleFan missing minor: debug triangle fans are not drawn
|
||||
DrawableGizmoPrimitives.addQuad missing minor: debug filled quads are not drawn
|
||||
DrawableGizmoPrimitives.addText missing minor: debug gizmo text labels are not drawn
|
||||
DrawableGizmoPrimitives.submit port crates/horizon-client/src/game.rs::Game::render gap: minor: lines of both lists go to camera_relative in Game::render; only lines are drawn
|
||||
BundleSelectedItemSpecialRenderer.update port crates/horizon-assets/src/item_model.rs::Resolve::node bundle selected item layers via the BundleSelectedItem arm
|
||||
CompositeModel.update port crates/horizon-assets/src/item_model.rs::Resolve::node composite arm: each child in order
|
||||
CompositeModel.Unbaked.resolveDependencies port crates/horizon-assets/src/item_model.rs::ItemModelNode::dependencies
|
||||
CompositeModel.Unbaked.bake inline crates/horizon-assets/src/item_model.rs::Resolve::node child transform composed in the composite arm
|
||||
ConditionalItemModel.update port crates/horizon-assets/src/item_model.rs::Resolve::node condition arm picks the branch
|
||||
ConditionalItemModel.Unbaked.bake inline crates/horizon-assets/src/item_model.rs::Resolve::node child transform composed in the condition arm
|
||||
ConditionalItemModel.Unbaked.adaptProperty skip:java per-level cache of a registry-remapped property; Horizon resolves properties from its own tables
|
||||
ConditionalItemModel.Unbaked.swapContext skip:data registry remap of a property for a new level; Horizon reads item definitions as data
|
||||
CuboidItemModelWrapper.update port crates/horizon-assets/src/item_model.rs::Resolve::node model layer: foil, tints, transform and quads
|
||||
CuboidItemModelWrapper.validateAtlasUsage skip:other load-time check that a model uses only the item and block atlases; throws on bad data, nothing at play time
|
||||
CuboidItemModelWrapper.hasSpecialAnimatedTexture inline crates/horizon-assets/src/item_model.rs::Resolve::node clock and compass tag give special foil, folded into the model arm
|
||||
ItemModelResolver.updateForLiving port crates/horizon-client/src/item_render.rs::ItemRenderer::resolve gap: minor: the seed is passed in by the caller; the entity id plus display ordinal seed is not checked here
|
||||
ItemModelResolver.updateForNonLiving port crates/horizon-client/src/item_render.rs::ItemRenderer::resolve gap: minor: the seed is passed in by the caller; the entity id seed is not checked here
|
||||
ItemStackRenderState.ensureCapacity skip:java layer array capacity; Horizon builds layer lists per frame
|
||||
ItemStackRenderState.newLayer skip:java layer array allocation
|
||||
ItemStackRenderState.clear skip:java resets the per-frame layer list
|
||||
ItemStackRenderState.visitExtents port crates/horizon-client/src/item_render.rs::ItemRenderState::bounding_box extents transformed per layer
|
||||
ItemStackRenderState.getModelBoundingBox port crates/horizon-client/src/item_render.rs::ItemRenderState::bounding_box bounding box from the layer extents
|
||||
ItemStackRenderState.LayerRenderState.clear skip:java resets one layer's fields
|
||||
ItemStackRenderState.LayerRenderState.tintLayers skip:java lazy list allocation for tint values
|
||||
ItemStackRenderState.LayerRenderState.submit port crates/horizon-client/src/item_render.rs::ItemRenderState::submit special renderer or quads per layer
|
||||
MissingItemModel.update port crates/horizon-assets/src/item_model.rs::Resolve::missing missing-model layer
|
||||
MissingItemModel.withTransform port crates/horizon-assets/src/item_model.rs::Resolve::missing missing-model layer under the given transform
|
||||
ModelRenderProperties.fromResolvedModel port crates/horizon-assets/src/item_bake.rs::bake_item_model particle sprite and GUI light taken at bake
|
||||
ModelRenderProperties.applyToLayer port crates/horizon-client/src/item_render.rs::ItemRenderer::resolve uses block light, particle and display transform on the layer
|
||||
RangeSelectItemModel.update port crates/horizon-assets/src/item_model.rs::Resolve::node range dispatch arm picks the entry
|
||||
RangeSelectItemModel.Unbaked.bake port crates/horizon-assets/src/item_model.rs::ItemModelNode::decode entries built at load time
|
||||
SelectItemModel.update port crates/horizon-assets/src/item_model.rs::Resolve::node select arm picks the case
|
||||
SelectItemModel.SwitchCase.codec port crates/horizon-assets/src/item_model.rs::SwitchCase::decode case decode from JSON
|
||||
SelectItemModel.Unbaked.bake port crates/horizon-assets/src/item_model.rs::ItemModelNode::decode cases built at load time
|
||||
SelectItemModel.Unbaked.resolveDependencies port crates/horizon-assets/src/item_model.rs::ItemModelNode::dependencies
|
||||
SelectItemModel.UnbakedSwitch.bake port crates/horizon-assets/src/item_model.rs::ItemModelNode::decode switch cases built at load time
|
||||
SelectItemModel.UnbakedSwitch.createModelGetter port crates/horizon-assets/src/item_model.rs::Resolve::node case lookup by value in the select arm
|
||||
SelectItemModel.UnbakedSwitch.resolveDependencies port crates/horizon-assets/src/item_model.rs::ItemModelNode::dependencies
|
||||
SpecialModelWrapper.update port crates/horizon-assets/src/item_model.rs::Resolve::node special arm: model argument from components
|
||||
SpecialModelWrapper.Unbaked.bake port crates/horizon-assets/src/item_model.rs::ItemModelNode::decode special node built at load time
|
||||
SpecialModelWrapper.Unbaked.getProperties port crates/horizon-assets/src/item_model.rs::ItemModels::properties hand animation, GUI oversize and swap scale
|
||||
properties/conditional/CustomModelDataProperty.get port crates/horizon-assets/src/item_model.rs::Resolve::condition conditional property: custom model data flag
|
||||
FishingRodCast.get port crates/horizon-assets/src/item_model.rs::Resolve::condition owner is casting this item
|
||||
HasComponent.get port crates/horizon-assets/src/item_model.rs::Resolve::condition component present, default ignored when asked
|
||||
IsCarried.get port crates/horizon-assets/src/item_model.rs::Resolve::condition local player carrying the stack on the cursor
|
||||
IsSelected.get port crates/horizon-assets/src/item_model.rs::Resolve::condition local player's selected slot
|
||||
IsUsingItem.get port crates/horizon-assets/src/item_model.rs::Resolve::condition owner using this item
|
||||
IsViewEntity.get port crates/horizon-assets/src/item_model.rs::Resolve::condition owner is the camera entity
|
||||
CompassAngleState.getRandomlySpinningRotation port crates/horizon-assets/src/item_model.rs::Resolve::compass no-target spin, with the no-target wobbler
|
||||
CompassAngleState.getRotationTowardsCompassTarget port crates/horizon-assets/src/item_model.rs::Resolve::compass target angle and local-player wobble
|
||||
CompassAngleState.isValidCompassTargetPos inline crates/horizon-assets/src/item_model.rs::Resolve::compass dimension and distance check folded into compass
|
||||
CompassAngleState.getAngleFromEntityToPos inline crates/horizon-assets/src/item_model.rs::Resolve::compass atan2 folded into compass
|
||||
Cooldown.get port crates/horizon-assets/src/item_model.rs::Resolve::numeric owner cooldown percent
|
||||
Count.get port crates/horizon-assets/src/item_model.rs::Resolve::numeric count, normalised or clamped
|
||||
CrossbowPull.get port crates/horizon-assets/src/item_model.rs::Resolve::numeric charge progress, zero while loaded
|
||||
properties/numeric/CustomModelDataProperty.get port crates/horizon-assets/src/item_model.rs::Resolve::numeric custom model data float
|
||||
Damage.get port crates/horizon-assets/src/item_model.rs::Resolve::numeric damage, normalised or clamped
|
||||
UseCycle.get port crates/horizon-assets/src/item_model.rs::Resolve::numeric remaining use ticks modulo the period
|
||||
UseDuration.get port crates/horizon-assets/src/item_model.rs::Resolve::numeric remaining or elapsed use ticks
|
||||
Charge.get port crates/horizon-assets/src/item_model.rs::Resolve::select_value none, arrow or rocket
|
||||
properties/select/ComponentContents.createType skip:data codec for a component-keyed select; Horizon decodes select cases in item_model.rs
|
||||
ContextEntityType.get port crates/horizon-assets/src/item_model.rs::Resolve::select_value owner entity type
|
||||
properties/select/CustomModelDataProperty.get port crates/horizon-assets/src/item_model.rs::Resolve::select_value custom model data string
|
||||
ItemBlockState.get port crates/horizon-assets/src/item_model.rs::Resolve::select_value block state property of the stack
|
||||
LocalTime.create port crates/horizon-client/src/game/item_draw.rs::local_time gap: minor: locale and time zone are ignored; only the pattern letters M d y H m s are formatted
|
||||
LocalTime.get port crates/horizon-client/src/game/item_draw.rs::local_time gap: minor: same as create; formatted on every call, no 1-second cache
|
||||
|
@@ -0,0 +1,145 @@
|
||||
SelectItemModelProperty.Type.create skip:java codec builder
|
||||
SelectItemModelProperty.Type.validateCases port crates/horizon-assets/src/item_model.rs::ItemModelNode::decode empty and duplicate case checks in the Select arm
|
||||
TrimMaterialProperty.get port crates/horizon-assets/src/item_model.rs::Resolve::select_value trim material id from the minecraft:trim component
|
||||
OitPipelineSet.getPipeline missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
OitPipelineSet.Builder.composeModifiers missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
OitPipelineSet.Builder.build missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
OitRenderPassProvider.createRenderPass missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
OitRenderPassProvider.createDepthBoundsPass missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
OitRenderPassProvider.createTransmittancePass missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
OitRenderPassProvider.createAccumulatePass missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
PreparedRenderType.drawFromBufferOit missing minor: opt-in Improved Transparency (off by default), no OIT pipelines or passes in Horizon
|
||||
PreparedRenderType.draw inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame gap: minor: the indexed draw runs in the gfx/ pass modules that draw_frame calls; RenderSetup scissor not seen
|
||||
RenderSetup.toString skip:debug
|
||||
RenderSetup.prepareTextures inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame overlay and lightmap samplers are bound per pass in gfx/
|
||||
RenderSetup.RenderSetupBuilder.withTexture skip:java builder
|
||||
RenderSetup.RenderSetupBuilder.setOutline skip:java builder setter; outline behaviour is in gfx/entity_outline.rs
|
||||
RenderSetup.RenderSetupBuilder.createRenderSetup skip:java builder
|
||||
RenderType.calculateHasBlending skip:other blend flag from the pipeline colour targets; Horizon picks blend per pipeline in gfx.rs
|
||||
RenderType.prepare inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame gap: minor: texture and overlay/lightmap binding folded into the frame passes
|
||||
RenderType.writeDynamicTransforms inline crates/horizon-client/src/gfx.rs::Renderer::draw_frame gap: minor: no per-render-type layering offset found (only perspective layering scale)
|
||||
RenderTypes.createMovingBlockSetup inline crates/horizon-client/src/game/moving_pistons.rs::Game::moving_piston_geometry block atlas and lightmap for moving blocks; gap: minor: crumbling and outline flags not checked here
|
||||
RenderTypes.breezeWind inline crates/horizon-client/src/mobs/render.rs::layers gap: player: the breeze wind layer does not scroll; the UV offset is not applied (render.rs comment)
|
||||
BannerSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit Banner arm: flag, base and up to 16 pattern layers
|
||||
BannerSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
BellSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit Bell arm
|
||||
BellSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents Bell arm
|
||||
BellSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
BookSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit Book arm with book_pose
|
||||
BookSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents Book arm with book_pose
|
||||
BookSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
ChestSpecialRenderer.createDefaultTextures inline crates/horizon-client/src/item_render/special.rs::submit default chest texture ids come from mapped("chest", ...) in the Chest arm
|
||||
ChestSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit Chest arm with chest_pose
|
||||
ChestSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents Chest arm with chest_pose
|
||||
ChestSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
ConduitSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit Conduit arm
|
||||
CopperGolemStatueSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit CopperGolemStatue arm
|
||||
CopperGolemStatueSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents CopperGolemStatue arm
|
||||
CopperGolemStatueSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts COPPER_GOLEM_LAYERS are baked once
|
||||
CopperGolemStatueSpecialRenderer.Unbaked.getModel port crates/horizon-client/src/item_render/special.rs::statue_layer pose to model layer
|
||||
DecoratedPotSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit DecoratedPot arm
|
||||
EndCubeSpecialRenderer.Unbaked.bake missing minor: no bundled item uses the end cube model (special.rs notes it), so no end portal or gateway effect in hand
|
||||
PlayerHeadSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit PlayerHead arm
|
||||
PlayerHeadSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents PlayerHead arm
|
||||
PlayerHeadSpecialRenderer.extractArgument port crates/horizon-client/src/skins.rs::head_skin profile to skin lookup
|
||||
PlayerHeadSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
ShieldSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents Shield arm
|
||||
ShieldSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
ShulkerBoxSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit ShulkerBox arm with shulker_pose
|
||||
ShulkerBoxSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
SkullSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit Head arm with skull_pose and skull_texture
|
||||
SkullSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents Head arm with skull_pose
|
||||
SkullSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
SpecialModelRenderers.bootstrap skip:data registers special model kinds; Horizon matches SpecialKind in item_model.rs
|
||||
TridentSpecialRenderer.submit port crates/horizon-client/src/item_render/special.rs::submit Trident arm; has_foil gives the standard foil
|
||||
TridentSpecialRenderer.getExtents port crates/horizon-client/src/item_render/special.rs::extents Trident arm
|
||||
TridentSpecialRenderer.Unbaked.bake inline crates/horizon-client/src/item_render/special.rs::load_parts models are baked once from entity-models.json
|
||||
BlitRenderState.buildVertices skip:ui GUI draw-queue geometry; Horizon draws its own HUD
|
||||
BlitRenderState.getBounds skip:ui GUI draw-queue geometry; Horizon draws its own HUD
|
||||
ColoredRectangleRenderState.buildVertices skip:ui GUI draw-queue geometry; Horizon draws its own HUD
|
||||
ColoredRectangleRenderState.getBounds skip:ui GUI draw-queue geometry; Horizon draws its own HUD
|
||||
GlyphRenderState.buildVertices skip:ui GUI draw-queue geometry; Horizon draws its own HUD
|
||||
GuiItemRenderState.calculateOversizedItemBounds skip:ui GUI draw-queue geometry; Horizon draws its own HUD
|
||||
GuiItemRenderState.calculateBounds skip:ui GUI draw-queue geometry; Horizon draws its own HUD
|
||||
GuiRenderState.nextStratum skip:ui GUI draw-queue ordering
|
||||
GuiRenderState.blurBeforeThisStratum port crates/horizon-client/src/game.rs::Game::hud_layers blur_at marks the vertices drawn before the blur (game.rs hud batch)
|
||||
GuiRenderState.up skip:ui GUI draw-queue ordering
|
||||
GuiRenderState.addItem skip:ui GUI draw-queue ordering
|
||||
GuiRenderState.addText skip:ui GUI draw-queue ordering
|
||||
GuiRenderState.addPicturesInPictureState skip:ui GUI draw-queue ordering
|
||||
GuiRenderState.addGuiElement skip:ui GUI draw-queue ordering
|
||||
GuiRenderState.addDebugRectangleIfEnabled skip:debug UI layering debug rectangles
|
||||
GuiRenderState.findAppropriateNode skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.navigateToAboveHighestElementWithIntersectingBounds skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.hasIntersection skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.forEachElement skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.forEachItem skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.forEachText skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.forEachPictureInPicture skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.sortElements skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.traverse skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.reset skip:ui GUI draw-queue ordering and traversal
|
||||
GuiRenderState.Node.addItem skip:ui GUI draw-queue node
|
||||
GuiRenderState.Node.addText skip:ui GUI draw-queue node
|
||||
GuiRenderState.Node.addPicturesInPictureState skip:ui GUI draw-queue node
|
||||
GuiRenderState.Node.addGuiElement skip:ui GUI draw-queue node
|
||||
GuiRenderState.Node.addGlyph skip:ui GUI draw-queue node
|
||||
GuiTextRenderState.ensurePrepared skip:ui text layout for the GUI draw queue
|
||||
TiledBlitRenderState.buildVertices skip:ui GUI tiled draw geometry
|
||||
TiledBlitRenderState.getBounds skip:ui GUI draw bounds
|
||||
PictureInPictureRenderState.getBounds skip:ui GUI draw bounds
|
||||
LevelRenderState.reset skip:java per-frame state clear
|
||||
ParticlesRenderState.submit inline crates/horizon-client/src/particles.rs::ParticleEngine::render submits particle groups; draws in render
|
||||
PlayerRenderState.reset skip:java per-frame state clear
|
||||
QuadParticleRenderState.add port crates/horizon-client/src/particles.rs::ParticleEngine::add quad particle queued per layer
|
||||
QuadParticleRenderState.buildLayer port crates/horizon-client/src/particles.rs::ParticleEngine::render per-layer quad build and draw
|
||||
QuadParticleRenderState.renderVertex inline crates/horizon-client/src/particles.rs::ParticleEngine::render vertex math inside the render rotated quad
|
||||
QuadParticleRenderState.Storage.add port crates/horizon-client/src/particles.rs::ParticleEngine::push store one quad particle
|
||||
QuadParticleRenderState.Storage.forEachParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::render iterates stored particles in render
|
||||
QuadParticleRenderState.Storage.grow skip:java array capacity growth
|
||||
WeatherRenderState.reset skip:java per-frame state clear
|
||||
AbstractTexture.releaseTextures skip:java GPU handle release; Rust drop
|
||||
AbstractTexture.getTexture skip:java accessor
|
||||
AbstractTexture.getTextureView skip:java accessor
|
||||
CubeMapTexture.loadContents port crates/horizon-client/src/gfx/panorama.rs::Faces::try_load six faces read, flipped and stacked
|
||||
CubeMapTexture.doLoad port crates/horizon-client/src/gfx/panorama.rs::Panorama::new cube texture creation and upload
|
||||
DynamicAtlasTree.insertInner skip:other dynamic atlas packing; Horizon uses texture-array layers, not a rectangle packer
|
||||
DynamicTexture.createTexture skip:other GPU texture creation for CPU pixels; Horizon has no DynamicTexture class
|
||||
DynamicTexture.upload port crates/horizon-client/src/gfx.rs::Renderer::update_lightmap gap: minor: only the lightmap upload goes through here
|
||||
DynamicTexture.dumpContents skip:debug dump debug action
|
||||
MipmappedTexture.setSampler port crates/horizon-client/src/screen_effects.rs::sampling gap: minor: only blur and clamp bits; filters fixed in gfx
|
||||
MipmappedTexture.doLoad port crates/horizon-client/src/mipmap.rs::generate mip chain generation
|
||||
MipmappedTexture.clampMipLevel port crates/horizon-client/src/sprites.rs::sprite_mipmap_limit mip level cap from texture size
|
||||
MissingTextureAtlasSprite.create port crates/horizon-client/src/sprites.rs::Sprites::insert generated magenta and black missing texture
|
||||
OverlayTexture.pack skip:other packs u and v into one int for vertex data; overlay.rs::living uses one code
|
||||
ReloadableTexture.apply inline crates/horizon-client/src/sprites.rs::Sprites::load gap: minor: sampler flags read from the texture section; upload happens later in gfx
|
||||
ReloadableTexture.doLoad inline crates/horizon-client/src/sprites.rs::Sprites::finish gap: minor: lays out layers; the GPU upload is in gfx
|
||||
SkinTextureDownloader.downloadAndRegisterSkin port crates/horizon-client/src/skins.rs::Downloader::state starts the skin download and decode
|
||||
SkinTextureDownloader.downloadSkin port crates/horizon-client/src/skins.rs::Downloader::state disk cache read or HTTP fetch with cache write, in the spawned thread
|
||||
SkinTextureDownloader.registerTextureInManager inline crates/horizon-client/src/skins.rs::Downloader::queue ready skin queued for the atlas upload
|
||||
SkinTextureDownloader.doNotchTransparencyHack inline crates/horizon-client/src/skins.rs::process_legacy_skin hat layer cleared when fully opaque
|
||||
SkinTextureDownloader.setNoAlpha inline crates/horizon-client/src/skins.rs::process_legacy_skin legacy skin regions made opaque
|
||||
SpriteContents.increaseMipLevel port crates/horizon-client/src/mipmap.rs::generate mip chain generation
|
||||
SpriteContents.createAnimatedTexture port crates/horizon-client/src/sprites.rs::Sprites::load animation frames from mcmeta
|
||||
SpriteContents.createAnimationState inline crates/horizon-client/src/sprites.rs::Sprites::finish animation frames laid out per layer
|
||||
SpriteContents.getAdditionalMetadata skip:java generic metadata lookup
|
||||
SpriteContents.close skip:java image release; Rust drop
|
||||
SpriteContents.toString skip:debug
|
||||
SpriteContents.isTransparent inline crates/horizon-client/src/sprites.rs::Sprites::region_opaque gap: minor: single-texel alpha query is not kept; region_opaque tests alpha 255 over a UV box
|
||||
SpriteContents.uploadFirstFrame inline crates/horizon-client/src/sprites.rs::Sprites::finish first frame copied into the layer pixels
|
||||
SpriteContents.AnimatedTexture.createAnimationState inline crates/horizon-client/src/sprites.rs::Sprites::finish animation frames laid out per layer
|
||||
SpriteContents.AnimationState.needsToDraw skip:java redraw skip optimisation
|
||||
SpriteContents.AnimationState.close skip:java frame texture release; Rust drop
|
||||
SpriteLoader.stitch port crates/horizon-client/src/sprites.rs::sprite_mipmap_limit gap: minor: atlas stitching replaced by one texture-array layer per sprite
|
||||
SpriteLoader.runSpriteSuppliers skip:java parallel sprite loading
|
||||
SpriteLoader.loadAndStitch inline crates/horizon-client/src/sprites.rs::Sprites::insert gap: minor: sprites are read on first use, not as one batch
|
||||
SpriteLoader.getStitchedSprites skip:other maps sprites to atlas rectangles; Horizon uses array layers
|
||||
Stitcher.registerSprite skip:other atlas rectangle packing; Horizon uses one texture-array layer per sprite
|
||||
Stitcher.stitch skip:other atlas rectangle packing; Horizon uses one texture-array layer per sprite
|
||||
Stitcher.gatherSprites skip:other atlas rectangle packing; Horizon uses one texture-array layer per sprite
|
||||
Stitcher.smallestFittingMinTexel skip:other atlas rectangle packing; Horizon uses one texture-array layer per sprite
|
||||
Stitcher.addToStorage skip:other atlas rectangle packing; Horizon uses one texture-array layer per sprite
|
||||
Stitcher.expand skip:other atlas rectangle packing; Horizon uses one texture-array layer per sprite
|
||||
Stitcher.Region.add skip:other atlas rectangle packing
|
||||
Stitcher.Region.walk skip:other atlas rectangle packing
|
||||
Stitcher.Region.toString skip:debug
|
||||
|
Can't render this file because it contains an unexpected character in line 31 and column 151.
|
@@ -0,0 +1,150 @@
|
||||
TextureAtlas.createTexture inline crates/horizon-client/src/sprites.rs::Sprites::finish gap: minor: no GPU texture objects or mip views; array size and mip count are set in finish
|
||||
TextureAtlas.upload inline crates/horizon-client/src/sprites.rs::Sprites::finish gap: minor: no GPU upload or animated UBOs; sprites are inserted before finish
|
||||
TextureAtlas.uploadInitialContents inline crates/horizon-client/src/sprites.rs::Sprites::finish static frames copied into the array pixels
|
||||
TextureAtlas.dumpContents skip:debug DEBUG_DUMP_TEXTURE_ATLAS PNG dump
|
||||
TextureAtlas.dumpSpriteNames skip:debug DEBUG_DUMP_TEXTURE_ATLAS name list
|
||||
TextureAtlas.cycleAnimationFrames port crates/horizon-client/src/gfx/animate.rs::SpriteAnimator::animate advances every animated layer to the frame for the tick
|
||||
TextureAtlas.uploadAnimationFrames port crates/horizon-client/src/gfx/animate.rs::mix_level per mip level frame mix (drawToAtlas)
|
||||
TextureAtlas.getSprite port crates/horizon-client/src/sprites.rs::Sprites::insert gap: minor: loads a texture on first lookup; vanilla returns the missing sprite for names not in the atlas
|
||||
TextureAtlas.clearTextureData skip:java frees sprite and UBO memory; Rust ownership
|
||||
TextureAtlas.releaseTextures skip:java frees GPU mip views; Rust ownership
|
||||
TextureAtlasSprite.getV inline crates/horizon-client/src/particles.rs::ParticleEngine::render gap: minor: only the particle quad V lerp is here; other getV callers keep their own lerp
|
||||
TextureAtlasSprite.toString skip:debug debug string
|
||||
TextureAtlasSprite.uploadSpriteUbo skip:other GPU uniform block for the atlas blit; Horizon samples its layer array and SpriteAnimator computes frames, so no UBO is needed
|
||||
TextureContents.load port crates/horizon-client/src/sprites.rs::Sprites::load reads the PNG and the .mcmeta animation section
|
||||
TextureManager.registerAndLoad port crates/horizon-client/src/sprites.rs::Sprites::insert loads the texture into a layer and registers it by name
|
||||
TextureManager.loadContentsSafe inline crates/horizon-client/src/sprites.rs::Sprites::insert missing texture fallback when a texture does not load
|
||||
TextureManager.register inline crates/horizon-client/src/sprites.rs::Sprites::insert adds the layer under its name
|
||||
TextureManager.safeClose skip:java closes a texture object; Rust ownership
|
||||
TextureManager.getTexture port crates/horizon-client/src/sprites.rs::Sprites::insert loads on first use, as SimpleTexture does
|
||||
TextureManager.tick port crates/horizon-client/src/gfx/animate.rs::SpriteAnimator::animate gap: minor: animated layers advance in the per frame animate pass; there is no tickable texture list
|
||||
TextureManager.release skip:java drops one texture object; Rust ownership
|
||||
TextureManager.close skip:java drops all texture objects; Rust ownership
|
||||
TextureManager.reload port crates/horizon-client/src/assets.rs::Assets::reload gap: minor: rebuilds every render asset synchronously; no pending futures
|
||||
TextureManager.dumpAllSheets skip:debug debug dump of every atlas
|
||||
TextureManager.scheduleLoad skip:other asynchronous texture preparation; Horizon loads each texture on the calling thread in Sprites::insert
|
||||
SpriteSource.Output.add port crates/horizon-client/src/atlas_sources.rs::list records a sprite id and its origin; a later source with the same id replaces it
|
||||
SpriteSourceList.load port crates/horizon-client/src/atlas_sources.rs::atlases gap: minor: reads one resource root's atlases/*.json, not every pack's stacked definitions
|
||||
DirectoryLister.run port crates/horizon-client/src/atlas_sources.rs::list Directory arm: textures under source/ get the prefix
|
||||
LazyLoadedImage.get skip:java shared image cache; generate reads the source texture each time it builds a sprite
|
||||
LazyLoadedImage.release skip:java releases the shared image cache
|
||||
PalettedPermutations.loadPaletteEntryFromImage inline crates/horizon-client/src/atlas_sources.rs::generate palette images are loaded inside the Paletted arm of generate
|
||||
PalettedPermutations.PalettedSpriteSupplier.get port crates/horizon-client/src/atlas_sources.rs::generate Paletted arm: base colours mapped through the palette pair (apply_palette)
|
||||
SingleFile.run port crates/horizon-client/src/atlas_sources.rs::list Single arm: the sprite named by the resource, or its sprite id
|
||||
Unstitcher.run port crates/horizon-client/src/atlas_sources.rs::list Unstitch arm: one sprite per region of the texture
|
||||
Unstitcher.RegionInstance.get port crates/horizon-client/src/atlas_sources.rs::generate Region arm: the region cut out of the texture
|
||||
AshParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Ash arm
|
||||
AttackSweepParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle SweepAttack uses the HugeExplosion behaviour: age, then sprite from age
|
||||
AttackSweepParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make SweepAttack arm: size from xAux
|
||||
BaseAshSmokeParticle.<init> port crates/horizon-client/src/particles.rs::ParticleEngine::make Smoke, Ash, WhiteAsh and DustPlume arms: motion, GrowIn size, lifetime
|
||||
BreakingItemParticle.CobwebProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make ItemCobweb arm; the layer comes from item_sprites (game/item_particles.rs)
|
||||
BreakingItemParticle.ItemParticleProvider.getSprite port crates/horizon-client/src/particles.rs::ParticleEngine::make Item arms pick a layer with the engine random; ItemCobweb, ItemSlime and ItemSnowball read item_sprites
|
||||
BreakingItemParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Item arm
|
||||
BreakingItemParticle.SlimeProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make ItemSlime arm
|
||||
BreakingItemParticle.SnowballProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make ItemSnowball arm
|
||||
BreakingItemParticle.SulfurCubeProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make SulfurCubeGoo arm: the first sprite of its set
|
||||
BubbleColumnUpParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle BubbleColumnUp arm: removed once it leaves water
|
||||
BubbleColumnUpParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make BubbleColumnUp arm
|
||||
BubbleParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Bubble arm: rises, drag 0.85, removed out of water
|
||||
BubbleParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Bubble arm
|
||||
BubblePopParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle BubblePop arm
|
||||
BubblePopParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make BubblePop arm
|
||||
CampfireSmokeParticle.CosyProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make CampfireCosySmoke arm, alpha 0.9
|
||||
CampfireSmokeParticle.SignalProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make CampfireSignalSmoke arm, alpha 0.95
|
||||
CritParticle.<init> port crates/horizon-client/src/particles.rs::ParticleEngine::make Crit arm; the constructor tick runs on the next engine tick (pre_tick)
|
||||
CritParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Crit arm: green and blue fade
|
||||
CritParticle.DamageIndicatorProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DamageIndicator arm; lifetime 20 from after_constructor_tick
|
||||
CritParticle.MagicProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make EnchantedHit arm; red and green scaled by after_constructor_tick
|
||||
CritParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Crit arm
|
||||
DragonBreathParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle DragonBreath arm: hit-ground flag and friction
|
||||
DragonBreathParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size GrowIn size curve
|
||||
DragonBreathParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DragonBreath arm; power through set_power
|
||||
DripParticle.getLightCoords port crates/horizon-client/src/particles.rs::Particle::light_coords Block15 for the glowing tears; World for the rest
|
||||
DripParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::Drip: pre move, gravity and move, post move, fluid check
|
||||
DripParticle.preMoveUpdate port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Drip: lifetime countdown and removal
|
||||
DripParticle.CoolingDripHangParticle.preMoveUpdate port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Drip CoolingHang stage: red, green and blue fade
|
||||
DripParticle.DripHangParticle.preMoveUpdate port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Drip Hang stage: spawns the falling drip when the countdown ends
|
||||
DripParticle.DripHangParticle.postMoveUpdate port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Drip Hang stage: velocity times 0.02
|
||||
DripParticle.DripstoneFallAndLandParticle.postMoveUpdate port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle FallAndLand stage with the dripstone land sound
|
||||
DripParticle.DripstoneLavaFallProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make FallingDripstoneLava arm
|
||||
DripParticle.DripstoneLavaHangProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DrippingDripstoneLava arm
|
||||
DripParticle.DripstoneWaterFallProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make FallingDripstoneWater arm
|
||||
DripParticle.DripstoneWaterHangProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DrippingDripstoneWater arm
|
||||
DripParticle.FallAndLandParticle.postMoveUpdate port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle FallAndLand stage: removed on the ground, spawns the land particle
|
||||
DripParticle.HoneyFallAndLandParticle.postMoveUpdate port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle FallAndLand for FallingHoney: beehive drip sound
|
||||
DripParticle.LavaFallProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make FallingLava arm
|
||||
DripParticle.LavaHangProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DrippingLava arm
|
||||
DripParticle.LavaLandProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make LandingLava arm
|
||||
DripParticle.ObsidianTearFallProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make FallingObsidianTear arm
|
||||
DripParticle.ObsidianTearHangProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DrippingObsidianTear arm
|
||||
DripParticle.ObsidianTearLandProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make LandingObsidianTear arm
|
||||
DripParticle.SporeBlossomFallProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make FallingSporeBlossom arm
|
||||
DripParticle.WaterFallProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make FallingWater arm
|
||||
DripParticle.WaterHangProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DrippingWater arm
|
||||
DustColorTransitionParticle.randomizeColor port crates/horizon-client/src/particles.rs::ParticleEngine::make DustColorTransition arm: the randomize closure for from and to colours
|
||||
DustColorTransitionParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DustColorTransition arm
|
||||
DustParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Dust arm
|
||||
DustParticleBase.randomizeColor port crates/horizon-client/src/particles.rs::ParticleEngine::make Dust and DustColorTransition arms: the randomize closure
|
||||
DustParticleBase.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size GrowIn size curve
|
||||
DustPlumeParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make DustPlume arm, base 1.0
|
||||
ElderGuardianParticleGroup.extractRenderState port crates/horizon-client/src/game/mob_blocks.rs::Game::elder_apparition_geometry gap: minor: one apparition timer that a new curse resets, so two curses show one ghost
|
||||
ElderGuardianParticleGroup.ElderGuardianParticleRenderState.fromParticle port crates/horizon-client/src/game/mob_blocks.rs::Game::elder_apparition_geometry fade, camera pose and offsets
|
||||
ElderGuardianParticleGroup.State.submit port crates/horizon-client/src/game/mob_blocks.rs::Game::elder_apparition_geometry draws the guardian model
|
||||
EmissiveRisingParticle.getLightCoords port crates/horizon-client/src/particles.rs::Particle::light_coords Block15 for sculk soul only (the SculkSoul arm)
|
||||
EmissiveRisingParticle.EmissiveProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make SculkSoul arm of the Soul arms
|
||||
EmissiveRisingParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Soul arm
|
||||
EndRodParticle.move port crates/horizon-client/src/particles.rs::Particle::move_by free_move: moves the box without collision
|
||||
EndRodParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make EndRod arm
|
||||
ExplodeParticle.<init> port crates/horizon-client/src/particles.rs::ParticleEngine::make Poof and Spit arms: puff motion, size and lifetime
|
||||
ExplodeParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Poof arm
|
||||
FallingDustParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size GrowIn size curve
|
||||
FallingDustParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle FallingDust arm: roll and gravity clamp
|
||||
FallingDustParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make gap: minor: the invisible-block skip and the tint lookup happen in animate_tick (Animate::Falling), not here
|
||||
FallingLeavesParticle.CherryProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make CherryLeaves arm
|
||||
FallingLeavesParticle.PaleOakProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make PaleOakLeaves arm
|
||||
FallingLeavesParticle.PoplarProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make RedPoplarLeaves, OrangePoplarLeaves and YellowPoplarLeaves arms
|
||||
FallingLeavesParticle.TintedLeavesProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make TintedLeaves arm with the option colour
|
||||
FallingParticle.<init> port crates/horizon-client/src/particles.rs::ParticleEngine::make Leaves arm: size, gravity, start velocity, flow and swirl
|
||||
FallingParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Leaves arm: wind, spin and removal on the ground
|
||||
FireflyParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Firefly arm: removed in a solid block, fade, random drift
|
||||
FireflyParticle.FireflyProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Firefly arm
|
||||
FireworkParticles.FlashProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Flash arm
|
||||
FireworkParticles.SparkProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Firework arm, alpha 0.99
|
||||
FireworkParticles.Starter.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_starters launch sound, a burst every 2 ticks, flash, twinkle sound at the end
|
||||
FireworkParticles.Starter.isFarAwayFromCamera inline crates/horizon-client/src/particles.rs::ParticleEngine::fireworks gap: minor: the distance is taken when the rocket is launched, not on each tick
|
||||
FireworkParticles.Starter.createParticleBall port crates/horizon-client/src/particles.rs::ParticleEngine::spark_ball
|
||||
FireworkParticles.Starter.createParticleShape port crates/horizon-client/src/particles.rs::ParticleEngine::spark_shape
|
||||
FireworkParticles.Starter.createParticleBurst inline crates/horizon-client/src/particles.rs::ParticleEngine::tick_starters Burst shape arm of tick_starters
|
||||
FlameParticle.move port crates/horizon-client/src/particles.rs::Particle::move_by free_move: moves the box without collision
|
||||
FlameParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size Flame size curve
|
||||
FlameParticle.getLightCoords port crates/horizon-client/src/particles.rs::Particle::light_coords AgeEmission light
|
||||
FlameParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Flame arm (also copper and soul fire flame)
|
||||
FlameParticle.SmallFlameProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make SmallFlame arm, scaled 0.5
|
||||
FlyStraightTowardsParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle FlyStraight arm: position and colour lerp
|
||||
FlyStraightTowardsParticle.OminousSpawnProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make OminousSpawning arm
|
||||
FlyTowardsPositionParticle.<init> port crates/horizon-client/src/particles.rs::ParticleEngine::make Enchant, Nautilus and VaultConnection arms
|
||||
FlyTowardsPositionParticle.move port crates/horizon-client/src/particles.rs::Particle::move_by free_move: moves the box without collision
|
||||
FlyTowardsPositionParticle.getLightCoords port crates/horizon-client/src/particles.rs::Particle::light_coords AgeEmission4 for enchant and nautilus; Block15 for vault connection
|
||||
FlyTowardsPositionParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle FlyTowards arm
|
||||
FlyTowardsPositionParticle.extract port crates/horizon-client/src/particles.rs::ParticleEngine::render alpha from the lifetime curve at draw time
|
||||
FlyTowardsPositionParticle.EnchantProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Enchant arm
|
||||
FlyTowardsPositionParticle.NautilusProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Nautilus arm
|
||||
FlyTowardsPositionParticle.VaultConnectionProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make VaultConnection arm: block light, lifetime alpha, scale 1.5
|
||||
GeyserBaseParticle.Provider.createParticle missing player: sulfur geysers do not erupt here: no water column, base puff or eruption sound (only the potent sulfur block state exists), and the geyser particle types are not in ParticleType
|
||||
GeyserEruptionParticle.tick missing player: the water column of a geyser eruption is not drawn; no geyser particle types exist here
|
||||
GeyserEruptionParticle.Provider.createParticle missing player: no geyser eruption particle is made
|
||||
GeyserPlumeParticle.<init> missing player: no water plume is made when a sulfur geyser erupts
|
||||
GeyserPlumeParticle.tick missing player: the plume does not rise, spray or fall back
|
||||
GeyserPlumeParticle.Provider.createParticle missing player: no water plume is made when a sulfur geyser erupts
|
||||
GlowParticle.getLightCoords port crates/horizon-client/src/particles.rs::Particle::light_coords AgeEmission light (glow, wax, electric spark)
|
||||
GlowParticle.ElectricSparkProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make ElectricSpark arm
|
||||
GlowParticle.GlowSquidProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Glow arm
|
||||
GlowParticle.WaxOffProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make WaxOff arm
|
||||
GlowParticle.WaxOnProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make WaxOn arm
|
||||
GustParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle HugeExplosion behaviour: age, then sprite from age
|
||||
GustParticle.SmallProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make SmallGust arm, scaled 0.15
|
||||
GustSeedParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle GustSeed arm: a gust every tick or two, then removal
|
||||
GustSeedParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make GustEmitterLarge and GustEmitterSmall arms: scale, lifetime, delay
|
||||
HeartParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size GrowIn size curve
|
||||
HeartParticle.AngryVillagerProvider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make AngryVillager arm, raised 0.5; the default colour is already white
|
||||
HeartParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make Heart arm
|
||||
|
@@ -0,0 +1,149 @@
|
||||
HugeExplosionParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::HugeExplosion: age, sprite from age, removed at lifetime
|
||||
HugeExplosionParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Explosion arm (SonicBoom shares it): quad size from xAux, full bright
|
||||
HugeExplosionSeedParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::ExplosionSeed: six EXPLOSION particles per tick, removed at lifetime
|
||||
ItemPickupParticle.tick port crates/horizon-client/src/game/pickups.rs::Game::tick_pickups life to LIFE_TIME (3) then removed; follows the collector
|
||||
ItemPickupParticle.saveOldPosition inline crates/horizon-client/src/game/pickups.rs::Game::tick_pickups target_old = target, done inside tick_pickups
|
||||
ItemPickupParticleGroup.extractRenderState port crates/horizon-client/src/game/pickups.rs::position gap: minor: returns the flight positions only; each kind is drawn by dropped_item_geometry (item), entity_geometry (orb) and mob_geometry (arrow)
|
||||
ItemPickupParticleGroup.State.submit port crates/horizon-client/src/game/item_draw.rs::Game::dropped_item_geometry gap: minor: draws the item kind only; orb and arrow pickups are drawn in entity_geometry and mob_geometry
|
||||
LargeSmokeParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Smoke arm, LargeSmoke branch (scale 2.5)
|
||||
LavaParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size Size::Lava: size * (1 - t^2)
|
||||
LavaParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::Lava: smoke puffs while the random draw beats age/lifetime
|
||||
LavaParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Lava arm: gravity 0.75, friction 0.999, lifetime 16 / (rand*0.8+0.2)
|
||||
NoteParticle.<init> inline crates/horizon-client/src/particles.rs::ParticleEngine::make Note arm: colour from the pitch, friction 0.66, lifetime 6, size x1.5
|
||||
NoteParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size Size::GrowIn over 32 ticks
|
||||
NoteParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Note arm
|
||||
NoxiousGasCloudParticle.tick missing player: potent sulfur in vanilla 26.3 gives off drifting noxious gas clouds; Horizon has no noxious_gas particle type and no PotentSulfurBlockEntity client code, so no cloud appears
|
||||
NoxiousGasCloudParticle.pickRandomParticleSpawnPoint missing player: potent sulfur in vanilla 26.3 gives off drifting noxious gas clouds; Horizon has no noxious_gas particle type and no PotentSulfurBlockEntity client code, so no cloud appears
|
||||
NoxiousGasCloudParticle.spawnNoxiousGasParticle missing player: potent sulfur in vanilla 26.3 gives off drifting noxious gas clouds; Horizon has no noxious_gas particle type and no PotentSulfurBlockEntity client code, so no cloud appears
|
||||
NoxiousGasParticle.tick missing player: potent sulfur in vanilla 26.3 gives off drifting noxious gas clouds; Horizon has no noxious_gas particle type and no PotentSulfurBlockEntity client code, so no cloud appears; the fade-out is missing with it
|
||||
NoxiousGasParticle.Provider.createParticle missing player: potent sulfur in vanilla 26.3 gives off drifting noxious gas clouds; Horizon has no noxious_gas particle type and no PotentSulfurBlockEntity client code, so no cloud appears
|
||||
Particle.<init> port crates/horizon-client/src/particles.rs::Particle::base_at 4-arg constructor (box and lifetime draw); the 7-arg one is Particle::base_moving
|
||||
Particle.toString skip:debug
|
||||
Particle.setLocationFromBoundingbox port crates/horizon-client/src/particles.rs::Particle::set_location_from_bb
|
||||
Particle.LifetimeAlpha.isOpaque inline crates/horizon-client-core/src/particle_type.rs::ParticleType::translucent_layer the layer is a fixed per-type table; VaultConnection is the non-opaque case
|
||||
ParticleDescription.fromJson port crates/horizon-client/src/particles.rs::ParticleEngine::load_sprites reads the textures list from particles/*.json
|
||||
ParticleEngine.makeParticle port crates/horizon-client/src/particles.rs::ParticleEngine::make gap: minor: VibrationSignal options return None here; ParticleEngine::vibration creates them
|
||||
ParticleEngine.createParticleGroup skip:other no render-type groups: ParticleEngine::render draws every particle in one pass, and the ITEM_PICKUP group is tick_pickups
|
||||
ParticleEngine.countParticles skip:debug
|
||||
ParticleEngine.hasSpaceInParticleLimit missing minor: no per-type particle cap; vanilla limits live SPORE_BLOSSOM air particles to 1000
|
||||
ParticleEngine.clearParticles port crates/horizon-client/src/particles.rs::ParticleEngine::clear clears emitters, live and pending particles; no limit counts to clear
|
||||
ParticleGroup.tickParticles port crates/horizon-client/src/particles.rs::ParticleEngine::tick ticks live particles and drops the removed ones
|
||||
ParticleGroup.tickParticle skip:debug crash-report wrapper around particle.tick
|
||||
ParticleResources.register skip:data provider table; Horizon matches particle types inside ParticleEngine::make
|
||||
ParticleResources.reload port crates/horizon-client/src/particles.rs::ParticleEngine::reload gap: minor: vanilla clears live particles on a resource reload; this keeps them
|
||||
ParticleResources.loadParticleDescription port crates/horizon-client/src/particles.rs::ParticleEngine::load_sprites
|
||||
ParticleResources.MutableSpriteSet.get skip:other index form of SpriteSet.get: no vanilla caller; Horizon picks a random set sprite (sprite_from_set)
|
||||
PlayerCloudParticle.<init> inline crates/horizon-client/src/particles.rs::ParticleEngine::make Cloud arm: friction 0.96, lifetime from the random draw x2.5, GrowIn
|
||||
PlayerCloudParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size Size::GrowIn
|
||||
PlayerCloudParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::Cloud: sinks to the local player's feet within 2 blocks
|
||||
PlayerCloudParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Cloud arm
|
||||
PlayerCloudParticle.SneezeProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Sneeze arm: tint 0.22/1.0/0.53, alpha 0.4
|
||||
PortalParticle.move port crates/horizon-client/src/particles.rs::Particle::move_by free_move path: moves the box without block collision
|
||||
PortalParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size Size::Portal
|
||||
PortalParticle.getLightCoords port crates/horizon-client/src/particles.rs::Particle::light_coords Light::AgeEmission4: block light plus age^4 emission
|
||||
PortalParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::Portal: eases from the start point along the velocity
|
||||
PortalParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Portal arm
|
||||
QuadParticleGroup.extractRenderState port crates/horizon-client/src/particles.rs::ParticleEngine::render gap: minor: no frustum point test; every live particle is drawn
|
||||
ReversePortalParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size Size::ReversePortal
|
||||
ReversePortalParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::ReversePortal
|
||||
ReversePortalParticle.ReversePortalProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make ReversePortal branch of the Portal arm
|
||||
RisingParticle.<init> inline crates/horizon-client/src/particles.rs::ParticleEngine::make rising arm (Soul, SculkSoul, flames): velocity scaled by 0.01, position jitter 0.05
|
||||
SculkChargeParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make SculkCharge arm: roll from the option, lifetime nextInt(12)+8
|
||||
SculkChargePopParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make SculkChargePop arm: lifetime nextInt(4)+6
|
||||
ShriekParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::Shriek: waits delay ticks, then base tick
|
||||
ShriekParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Shriek arm: size 0.85, lifetime 30, delay from the option
|
||||
SimpleAnimatedParticle.setFadeColor inline crates/horizon-client/src/particles.rs::ParticleEngine::make EndRod arm: fade colour 0xF2DEC9; applied by Behaviour::SimpleAnimated
|
||||
SimpleVerticalParticle.PauseMobGrowthProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make PauseMobGrowth arm
|
||||
SimpleVerticalParticle.ResetMobGrowthProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make ResetMobGrowth arm
|
||||
SingleQuadParticle.extract port crates/horizon-client/src/particles.rs::ParticleEngine::render roll lerp and camera-facing rotation per particle
|
||||
SingleQuadParticle.extractRotatedQuad port crates/horizon-client/src/particles.rs::ParticleEngine::render quad centre from the lerped position minus the camera
|
||||
SingleQuadParticle.toString skip:debug
|
||||
SingleQuadParticle.Layer.bySprite port crates/horizon-client/src/particles.rs::ParticleEngine::reload gap: minor: one translucent flag per sprite from the atlas; vanilla also splits block and item atlases (TRANSLUCENT_TERRAIN, TRANSLUCENT_ITEMS)
|
||||
SmokeParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Smoke arm, Smoke branch (scale 1.0)
|
||||
SnowflakeParticle.<init> inline crates/horizon-client/src/particles.rs::ParticleEngine::make Poof/Snowflake/Spit arm, Snowflake branch: gravity 0.225, friction 1.0
|
||||
SnowflakeParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::Snowflake: base tick, sprite from age, drag 0.95/0.9/0.95
|
||||
SnowflakeParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Snowflake branch: colour 0.923/0.964/0.999
|
||||
SonicBoomParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Explosion|SonicBoom arm, SonicBoom branch: lifetime 16, size 1.5
|
||||
SpellParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle gap: player: the spyglass check is missing: while scoping in first person, vanilla makes spell particles within 3 blocks of the eye fully transparent; Horizon only lerps alpha
|
||||
SpellParticle.isCloseToScopingPlayer missing player: spell particles near the eye stay visible while the player looks through a spyglass in first person; vanilla hides them
|
||||
SpellParticle.InstantProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Effect|InstantEffect arm: colour and power from the option
|
||||
SpellParticle.MobEffectProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make EntityEffect arm: colour and alpha from the option
|
||||
SpellParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make uncoloured spell arm (Infested, TrialOmen, RaidOmen)
|
||||
SpellParticle.WitchProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Witch arm: purple brightness from the engine random
|
||||
SpitParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Poof/Snowflake/Spit arm, Spit branch: gravity 0.5, Animated
|
||||
SplashParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Rain|Splash arm, Splash branch: gravity 0.04
|
||||
SquidInkParticle.GlowInkProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make GlowSquidInk arm: colour (0.2, 0.8, 0.6)
|
||||
SquidInkParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make SquidInk arm: black
|
||||
SulfurBubbleParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::SulfurBubble: still-water check, bounds, growth
|
||||
SulfurBubbleParticle.randomHorizontalWiggling inline crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle SulfurBubble arm, the wiggle closure applied to x and z
|
||||
SulfurBubbleParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make SulfurBubbles arm
|
||||
SuspendedParticle.<init> inline crates/horizon-client/src/particles.rs::ParticleEngine::make Underwater/CrimsonSpore/WarpedSpore/SporeBlossomAir arm: spawned 0.125 below the point
|
||||
SuspendedParticle.CrimsonSporeProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make CrimsonSpore arm: gaussian drift, colour 0.9/0.4/0.5
|
||||
SuspendedParticle.SporeBlossomAirProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make gap: minor: SporeBlossomAir arm; the SPORE_BLOSSOM particle limit (1000) is not applied
|
||||
SuspendedParticle.UnderwaterProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Underwater arm: colour 0.4/0.4/0.7
|
||||
SuspendedParticle.WarpedSporeProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make WarpedSpore arm: colour 0.1/0.1/0.3, size 0.001
|
||||
SuspendedTownParticle.move port crates/horizon-client/src/particles.rs::Particle::move_by free_move path: moves the box without block collision
|
||||
SuspendedTownParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::SuspendedTown: lifetime countdown, drift, 0.99 damping
|
||||
SuspendedTownParticle.ComposterFillProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Composter arm: white, lifetime 3 + nextInt(5)
|
||||
SuspendedTownParticle.DolphinSpeedProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Dolphin arm: blue, alpha from the engine random, half lifetime
|
||||
SuspendedTownParticle.EggCrackProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make EggCrack arm: white
|
||||
SuspendedTownParticle.HappyVillagerProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make HappyVillager arm: white
|
||||
SuspendedTownParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make plain arm (Mycelium): no colour change
|
||||
TerrainParticle.<init> port crates/horizon-client/src/particles.rs::Particle::terrain crumb from a quarter of the block sprite, tinted, half size, mirrored UV
|
||||
TerrainParticle.createTerrainParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make gap: minor: the air, moving-piston and noTerrainParticles checks are not in this arm; the callers' gating was not checked
|
||||
TerrainParticle.CrumblingProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make BlockCrumble arm: zero speed, lifetime nextInt(10)+1
|
||||
TerrainParticle.DustPillarProvider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make DustPillar arm: gaussian speed, lifetime nextInt(20)+20
|
||||
TotemParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make TotemOfUndying arm
|
||||
TrackingEmitter.tick port crates/horizon-client/src/particles.rs::ParticleEngine::emit 16 tries per tick; the countdown and removal are in ParticleEngine::tick
|
||||
TrailParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::Trail: eases towards the target over its lifetime
|
||||
TrailParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Trail arm: target, colour jitter, duration
|
||||
TrialSpawnerDetectionParticle.<init> inline crates/horizon-client/src/particles.rs::ParticleEngine::make TrialSpawnerDetection arm: gravity -0.1, Block15 light, GrowIn
|
||||
TrialSpawnerDetectionParticle.getQuadSize port crates/horizon-client/src/particles.rs::Particle::quad_size Size::GrowIn
|
||||
TrialSpawnerDetectionParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make TrialSpawnerDetection arm with scale 1.5
|
||||
VibrationSignalParticle.Provider.createParticle port crates/horizon-client/src/particles.rs::ParticleEngine::vibration flies to the listener in the arrival ticks
|
||||
WakeParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Fishing arm (WakeParticle)
|
||||
WaterCurrentDownParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::CurrentDown: steers by angle, ends off water or on ground
|
||||
WaterCurrentDownParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make CurrentDown arm
|
||||
WaterDropParticle.tick port crates/horizon-client/src/particles.rs::ParticleEngine::tick_particle Behaviour::WaterDrop: gravity, drag, ends on ground or in fluid
|
||||
WaterDropParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Rain arm
|
||||
WhiteAshParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make WhiteAsh branch of the Smoke arm; the provider's motion is drawn from the engine random
|
||||
WhiteSmokeParticle.Provider.createParticle inline crates/horizon-client/src/particles.rs::ParticleEngine::make Smoke arm, WhiteSmoke branch (scale 1.0)
|
||||
ClientPackSource.findExplodedAssetPacks skip:other IDE-only: looks for a resourcepacks folder next to the asset dir in development runs
|
||||
ClientPackSource.createVanillaPackSource skip:data pack source assembly; Horizon reads its assets from folders directly
|
||||
ClientPackSource.getPackTitle skip:data pack display names
|
||||
ClientPackSource.populatePackList skip:data pack discovery
|
||||
DefaultPlayerSkin.create port crates/horizon-client/src/tab_list.rs::default_skin gap: minor: returns the texture path (the model is in the path); no PlayerSkin record
|
||||
DryFoliageColorReloadListener.prepare port crates/horizon-client/src/biome.rs::colormap PNG decode of colormap/dry_foliage; the caller loads the three colormaps
|
||||
FoliageColorReloadListener.prepare port crates/horizon-client/src/biome.rs::colormap PNG decode of colormap/foliage
|
||||
GrassColorReloadListener.prepare port crates/horizon-client/src/biome.rs::colormap PNG decode of colormap/grass
|
||||
IndexedAssetSource.createIndexFs skip:data legacy objects/ asset index; Horizon reads assets/ folders directly
|
||||
LegacyStuffWrapper.getPixels port crates/horizon-client/src/hud.rs::decode gap: minor: PNG decode to bytes; vanilla returns ARGB ints
|
||||
MapTextureManager.resetData skip:other frees GPU map textures on close; Horizon keeps its map atlas slots in Game::maps, no gameplay effect
|
||||
MapTextureManager.getOrCreateMapInstance port crates/horizon-client/src/game/maps.rs::Game::map_texture gives the map its atlas slot, allocated on first use
|
||||
MapTextureManager.MapInstance.replaceMapData port crates/horizon-client/src/game/maps.rs::MapData::update_color gap: minor: vanilla also flags an upload when the saved-data object is swapped; Horizon flags per changed colour
|
||||
MapTextureManager.MapInstance.updateTextureIfNeeded port crates/horizon-client/src/game/maps.rs::Game::map_texture uploads the 128x128 colours when dirty
|
||||
SkinManager.get port crates/horizon-client/src/skins.rs::lookup gap: minor: the packed textures come from ResolvedProfile::textures; the debug default-skin override is not ported
|
||||
SkinManager.registerTextures port crates/horizon-client/src/skins.rs::lookup gap: minor: returns the skin location only; cape and elytra are downloaded here but not returned
|
||||
SkinManager.TextureCache.getOrLoad port crates/horizon-client/src/skins.rs::Downloader::state one download per URL, then its state
|
||||
SkinManager.TextureCache.getTextureLocation port crates/horizon-client/src/skins.rs::skin_location gap: minor: only the skins/ location; capes and elytra have no location fn
|
||||
SplashManager.getSplash port crates/horizon-client/src/title.rs::choose_splash gap: player: no '<NAME> IS YOU' splash; vanilla sometimes shows the logged-in player's name instead of a splash on the title screen
|
||||
WaypointStyle.validate port crates/horizon-client/src/locator_bar.rs::WaypointStyle::parse validation is folded into the parse
|
||||
WaypointStyleManager.apply port crates/horizon-client/src/locator_bar.rs::WaypointStyles::load gap: minor: loads the arrow and dot sprites from the assets folder into one map
|
||||
ClientLanguage.appendFrom port crates/horizon-client-core/src/lang.rs::Language::load layers the translation JSON from the sources
|
||||
LanguageManager.extractLanguages port crates/horizon-client-core/src/lang.rs::available lists the languages the packs declare
|
||||
LanguageManager.onResourceManagerReload port crates/horizon-client/src/game/options.rs::Game::load_language gap: minor: no error screen when the translations are empty or missing
|
||||
AnimationMetadataSection.calculateFrameSize port crates/horizon-assets/src/animation.rs::AnimationMetadata::frame_size
|
||||
GuiSpriteScaling.NineSlice.validate missing minor: Horizon accepts nine-slice metadata whose borders cover the whole sprite (parse_nine_slice has no check)
|
||||
GuiSpriteScaling.NineSlice.Border.unpackValue skip:java codec helper that collapses a uniform border to one number; Horizon stores four values
|
||||
BlockStateDefinitions.createItemFrameFakeState skip:data block state definition for the map property; Horizon chooses the frame model by flags
|
||||
BlockStateDefinitions.getItemFrameFakeState port crates/horizon-client/src/game/frames.rs::Game::frame_geometry gap: minor: picks the glow and map frame model by flags; no block state
|
||||
BlockStateDefinitions.definitionLocationToBlockStateMapper skip:data registry lookup of block state definitions
|
||||
BlockStateModelLoader.loadBlockStates skip:data blockstate JSON loading; Horizon's block models come from its data tables
|
||||
BlockStateModelLoader.loadBlockStateDefinitionStack skip:data blockstate JSON stacking
|
||||
ClientItemInfoLoader.scheduleLoad skip:data item model JSON loading
|
||||
EquipmentAssetManager.apply skip:data equipment asset table reload
|
||||
EquipmentClientInfo.Builder.addHumanoidLayers skip:java builder
|
||||
EquipmentClientInfo.Builder.addMainHumanoidLayer skip:java builder
|
||||
EquipmentClientInfo.Builder.addLayers skip:java builder
|
||||
EquipmentClientInfo.Builder.replaceTrimPalette skip:java builder
|
||||
EquipmentClientInfo.Builder.build skip:java builder
|
||||
|
@@ -0,0 +1,149 @@
|
||||
EquipmentClientInfo.Layer.leatherDyeable skip:data equipment asset factory; Horizon reads the equipment JSON in armor_stands.rs
|
||||
EquipmentClientInfo.Layer.onlyIfDyed skip:data equipment asset factory; Horizon reads the equipment JSON in armor_stands.rs
|
||||
EquipmentClientInfo.Layer.getTextureLocation port crates/horizon-client/src/game/armor_stands.rs::ArmorStandAssets::load builds entity/equipment/<kind>/<texture>; gap: minor: only humanoid, humanoid_leggings and wings are read here
|
||||
EquipmentClientInfo.TrimOverride.validate skip:java codec validator; TrimOverride::list keeps an override with neither texture nor palette (minor)
|
||||
EquipmentClientInfo.TrimPredicate.validate skip:java codec validator; TrimOverride::list keeps a predicate with neither material nor pattern (minor)
|
||||
EquipmentClientInfo.TrimPredicate.matches port crates/horizon-client/src/trims.rs::TrimOverride::matches material and pattern id comparison
|
||||
ModelBakery.bakeModels port crates/horizon-client/src/models/catalog.rs::StateModels::from_facts_with_models bakes block states; gap: minor: items and standalone models bake in separate fns (item_bake.rs::bake_item_model)
|
||||
ModelBakery.ModelBakerImpl.getModel port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve an unknown id falls back to the missing model
|
||||
ModelDiscovery.createAndQueueWrapper inline crates/horizon-client/src/model_library.rs::ParsedModels::block_models parent queue; no wrapper object is kept
|
||||
ModelDiscovery.addSpecialModel inline crates/horizon-assets/src/resolve.rs::ModelLibrary::with_shared_item_generator gap: minor: only builtin/generated is registered; a non-root special model is not rejected
|
||||
ModelDiscovery.resolve port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve resolved per model id, not as a batch map
|
||||
ModelDiscovery.discoverDependencies inline crates/horizon-client/src/model_library.rs::ParsedModels::block_models pushes each model's parent until the set is complete
|
||||
ModelDiscovery.propagateValidity port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve a chain that reaches a cycle is an error when resolved
|
||||
ModelDiscovery.ModelWrapper.updateSlot skip:java per-model result cache
|
||||
ModelDiscovery.ModelWrapper.getSimpleProperty skip:java per-model result cache
|
||||
ModelDiscovery.ModelWrapper.resolveParticleMaterial port crates/horizon-client/src/models/catalog.rs::StateModels::from_facts_with_models block particle sprite; the item side is item_bake.rs::bake_item_model
|
||||
ModelDiscovery.ModelWrapper.bakeDefaultState skip:java cache of the identity-rotation geometry
|
||||
ModelDiscovery.ModelWrapper.bakeTopGeometry port crates/horizon-assets/src/bake.rs::bake_block_model bakes with the blockstate rotation; per-state cache skipped
|
||||
ModelGroupCollector.build skip:java groups states for shared baked geometry; Horizon has no model-group ids
|
||||
ModelGroupCollector.GroupKey.create skip:java group key of build
|
||||
ModelGroupCollector.GroupKey.getColoringValues skip:java group key of build
|
||||
ModelManager.reload port crates/horizon-client/src/assets.rs::RenderAssets::load one synchronous load: models, block states, item infos, then bake and store
|
||||
ModelManager.loadBlockModels port crates/horizon-client/src/model_library.rs::ParsedModels::load every models/**.json by id, parsed in parallel
|
||||
ModelManager.discoverModelDependencies port crates/horizon-client/src/model_library.rs::ParsedModels::block_models referenced models and their parents
|
||||
ModelManager.loadModels port crates/horizon-client/src/models/catalog.rs::StateModels::from_facts_with_models bakes block states and their models
|
||||
ModelManager.createBlockStateToModelDispatch inline crates/horizon-client/src/models/catalog.rs::StateModels::from_facts_with_models missing model for a state without a baked model
|
||||
ModelManager.buildModelGroups skip:java wrapper of ModelGroupCollector.build; render sharing only
|
||||
ModelManager.apply inline crates/horizon-client/src/assets.rs::RenderAssets::load the baked result is stored in the returned struct
|
||||
ModelManager.requiresRender skip:java render-skip optimisation for equal model groups; no visible effect
|
||||
ResolvedModel.findTopTextureSlots port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve texture slots merged along the parent chain
|
||||
ResolvedModel.findTopAmbientOcclusion port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve ambient occlusion from the first model that sets it, default true
|
||||
ResolvedModel.findTopGuiLight port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve gui_light from the first model that sets it, default side
|
||||
ResolvedModel.findTopGeometry port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve first element list up the parent chain
|
||||
ResolvedModel.resolveParticleMaterial port crates/horizon-client/src/models/catalog.rs::StateModels::from_facts_with_models block particle slot; the item side is item_bake.rs::bake_item_model
|
||||
ResolvedModel.findTopTransform port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve display transform per context, inherited up the chain
|
||||
ResolvedModel.findTopTransforms port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve display transforms for every context
|
||||
SimpleModelWrapper.bake port crates/horizon-assets/src/bake.rs::bake_block_model gap: minor: no rejection of block models that use non-block sprites
|
||||
SimpleModelWrapper.findNonBlockSprites missing minor: vanilla replaces a block model whose quads use sprites outside the block atlas; Horizon keeps every sprite
|
||||
UnbakedModel.GuiLight.getByName port crates/horizon-assets/src/model.rs::CuboidModel::decode front and side only; other values are an error
|
||||
CuboidFace.Deserializer.deserialize port crates/horizon-assets/src/model.rs::Face::decode texture, cullface, tintindex and rotation
|
||||
CuboidFace.Deserializer.getUVs port crates/horizon-assets/src/model.rs::Face::decode uv as four numbers; absent uses default_uv in bake.rs
|
||||
CuboidFace.UVs.getVertexU inline crates/horizon-assets/src/bake.rs::bake_face the U corner is picked in bake_face
|
||||
CuboidFace.UVs.getVertexV inline crates/horizon-assets/src/bake.rs::bake_face the V corner is picked in bake_face
|
||||
CuboidModel.Deserializer.deserialize port crates/horizon-assets/src/model.rs::CuboidModel::decode whole model JSON
|
||||
CuboidModel.Deserializer.getTextureMap port crates/horizon-assets/src/model.rs::CuboidModel::decode each textures entry through texture()
|
||||
CuboidModel.Deserializer.getAmbientOcclusion port crates/horizon-assets/src/model.rs::CuboidModel::decode ambientocclusion flag
|
||||
CuboidModel.Deserializer.getElements port crates/horizon-assets/src/model.rs::CuboidModel::decode elements list with null entries
|
||||
CuboidModelElement.Deserializer.deserialize port crates/horizon-assets/src/model.rs::Element::decode whole element JSON
|
||||
CuboidModelElement.Deserializer.getShadeDirectionOverride port crates/horizon-assets/src/model.rs::Element::decode shade_direction_override
|
||||
CuboidModelElement.Deserializer.getRotation port crates/horizon-assets/src/model.rs::ElementRotation::decode rotation object
|
||||
CuboidModelElement.Deserializer.getAxis port crates/horizon-assets/src/model.rs::ElementRotation::decode axis x, y or z
|
||||
CuboidModelElement.Deserializer.getFaces port crates/horizon-assets/src/model.rs::Element::decode faces object
|
||||
CuboidModelElement.Deserializer.filterNullFromFaces inline crates/horizon-assets/src/model.rs::Element::decode null faces are kept as None through nullable()
|
||||
CuboidModelElement.Deserializer.getFacing port crates/horizon-assets/src/model.rs::Element::decode face names through Direction::by_name
|
||||
CuboidModelElement.Deserializer.getPosition port crates/horizon-assets/src/model.rs::Element::decode from and to, bounded to -16..32
|
||||
CuboidModelElement.Deserializer.getVector3f port crates/horizon-assets/src/json.rs::vector three-number array
|
||||
CuboidRotation.computeTransform port crates/horizon-assets/src/bake.rs::ElementMatrix::from_rotation rotation matrix, then rescale when set
|
||||
CuboidRotation.computeRescale inline crates/horizon-assets/src/bake.rs::ElementMatrix::from_rotation per-axis rescale inside from_rotation
|
||||
CuboidRotation.scaleFactorForAxis inline crates/horizon-assets/src/bake.rs::ElementMatrix::from_rotation per-axis factor inside from_rotation
|
||||
CuboidRotation.EulerXYZRotation.transformation port crates/horizon-assets/src/bake.rs::ElementMatrix::from_rotation Euler XYZ branch
|
||||
CuboidRotation.SingleAxisRotation.transformation port crates/horizon-assets/src/bake.rs::ElementMatrix::from_rotation single-axis branch
|
||||
FaceBakery.defaultFaceUV port crates/horizon-assets/src/bake.rs::default_uv default face UVs by direction
|
||||
FaceBakery.computeMaterialTransparency port crates/horizon-client/src/sprites.rs::Sprites::region_opaque gap: minor: only the opaque-region check; force_translucent is not applied here
|
||||
FaceBakery.bakeVertex inline crates/horizon-assets/src/bake.rs::bake_face vertex position and UV inside bake_face
|
||||
FaceBakery.rotateVertexBy inline crates/horizon-assets/src/bake.rs::bake_face element rotation about its origin
|
||||
FaceBakery.calculateFacing port crates/horizon-assets/src/bake.rs::facing quad normal, then closest direction
|
||||
FaceBakery.findClosestDirection port crates/horizon-assets/src/bake.rs::facing closest axis direction with a non-negative dot
|
||||
FaceBakery.recalculateWinding inline crates/horizon-assets/src/bake.rs::bake_face corner reorder for unrotated elements
|
||||
FaceBakery.findVertex inline crates/horizon-assets/src/bake.rs::bake_face search inside the winding reorder
|
||||
FaceBakery.swap inline crates/horizon-assets/src/bake.rs::bake_face swap inside the winding reorder
|
||||
ItemModelGenerator.bake port crates/horizon-assets/src/item_bake.rs::bake_item_model layer loop of generated item models
|
||||
ItemModelGenerator.bakeSideFaces port crates/horizon-assets/src/item_bake.rs::extrude_layer side faces of one layer
|
||||
ItemModelGenerator.getSideFaces inline crates/horizon-assets/src/item_bake.rs::extrude_layer edge collection inside extrude_layer
|
||||
ItemModelGenerator.checkTransition inline crates/horizon-assets/src/item_bake.rs::extrude_layer transparent neighbour check inside extrude_layer
|
||||
ItemModelGenerator.isTransparent port crates/horizon-assets/src/item_bake.rs::SpriteMask::transparent alpha mask lookup
|
||||
ItemModelGenerator.ItemLayerKey.compute skip:java layer bake cache key; Horizon bakes each item model once
|
||||
ItemTransform.Deserializer.deserialize port crates/horizon-assets/src/model.rs::ItemTransform::decode rotation, translation and scale
|
||||
ItemTransform.Deserializer.getVector3f port crates/horizon-assets/src/json.rs::vector three-number array
|
||||
ItemTransforms.Deserializer.deserialize port crates/horizon-assets/src/model.rs::ItemTransforms::decode display contexts
|
||||
ItemTransforms.Deserializer.getTransform port crates/horizon-assets/src/item_bake.rs::BakedItemModel::transform transform for one display context
|
||||
BakedQuad.position skip:java record accessor; ModelQuad.positions field
|
||||
BakedQuad.packedUV skip:java record accessor; ModelQuad.uv field
|
||||
BakedQuad.MaterialInfo.of port crates/horizon-client/src/item_render.rs::FileSprites::translucent gap: minor: picks solid or translucent only; no per-material render type or glint sheet
|
||||
BakedQuad.MaterialInfo.flags skip:java translucent and animated bit flags used to skip work; Horizon ticks animated textures by its setting
|
||||
ItemQuads.split port crates/horizon-client/src/item_render.rs::submit_quads quads with translucent sprites go to the translucent pass
|
||||
QuadCollection.computeMaterialFlags skip:java flag bits of the quad list; see BakedQuad.MaterialInfo.flags
|
||||
QuadCollection.getQuads port crates/horizon-client/src/mesher.rs::Mesher::mesh quads filtered by cull direction
|
||||
QuadCollection.materialFlags skip:java cached flag bits
|
||||
QuadCollection.Builder.addAll skip:java collection builder
|
||||
QuadCollection.Builder.createFromSublists skip:java sublist layout of a quad collection
|
||||
AtlasManager.getAtlasOrThrow skip:java atlas map lookup; Horizon keeps one sprite table
|
||||
AtlasManager.forEach skip:java map iteration
|
||||
AtlasManager.close skip:java GPU release; freed with its owner
|
||||
AtlasManager.get port crates/horizon-client/src/sprites.rs::Sprites::insert sprite layer added on first use; missing texture when it fails to load
|
||||
AtlasManager.prepareSharedState skip:java future-based stitch plumbing
|
||||
AtlasManager.reload skip:java async reload; sprites load synchronously in RenderAssets::load
|
||||
AtlasManager.updateSpriteMaps port crates/horizon-client/src/sprites.rs::Sprites::finish lays out every layer at one size; gap: minor: no duplicate-sprite warning
|
||||
AtlasManager.AtlasEntry.scheduleLoad port crates/horizon-client/src/sprites.rs::Sprites::insert gap: minor: sprites load on demand, not per atlas source
|
||||
AtlasManager.PendingStitch.joinAndUpload skip:java future join
|
||||
AtlasManager.PendingStitchResults.joinAndUpload skip:java future join
|
||||
MaterialBaker.get port crates/horizon-assets/src/item_bake.rs::bake_item_model sprite that is not known falls back to missingno
|
||||
MaterialBaker.bake skip:java Material.Baked wrapper
|
||||
MaterialBaker.bakeForAtlas skip:java Material.Baked wrapper for an atlas
|
||||
MaterialBaker.resolveSlot port crates/horizon-assets/src/resolve.rs::ResolvedCuboidModel::material named texture slot lookup
|
||||
MaterialBaker.logMissingTextures skip:debug log of missing texture slots only
|
||||
TextureSlots.getMaterial port crates/horizon-assets/src/resolve.rs::ResolvedCuboidModel::material named texture slot lookup
|
||||
TextureSlots.parseTextureMap port crates/horizon-assets/src/model.rs::CuboidModel::decode textures object
|
||||
TextureSlots.parseEntry port crates/horizon-assets/src/model.rs::texture # reference or sprite material
|
||||
TextureSlots.Data.Builder.addReference skip:java builder
|
||||
TextureSlots.Data.Builder.addTexture skip:java builder
|
||||
TextureSlots.Data.Builder.build skip:java builder
|
||||
TextureSlots.Resolver.resolve port crates/horizon-assets/src/resolve.rs::ModelLibrary::resolve alias chain resolution; the batch hint (horizon-protocol resolver.rs) is a DNS resolver and is not this
|
||||
resources/palette/Palette.listAndLoad port crates/horizon-client/src/trims.rs::TrimTexture::generate gap: minor: palettes load on demand, none listed up front
|
||||
resources/palette/Palette.tryLoad port crates/horizon-client/src/trims.rs::TrimTexture::generate gap: minor: a broken palette skips the recolour instead of an empty palette
|
||||
resources/palette/Palette.load port crates/horizon-client/src/trims.rs::TrimTexture::generate palette PNG read as ARGB
|
||||
PaletteMapping.apply port crates/horizon-assets/src/palette.rs::apply_palette colour swap; alpha scaled by the target's alpha
|
||||
PalettedTextureManager.loadBaseTexture port crates/horizon-client/src/trims.rs::TrimTexture::generate base texture and its base_palette from the mcmeta
|
||||
PalettedTextureManager.allocateSlot port crates/horizon-client/src/sprites.rs::Sprites::insert gap: minor: one array layer per texture, no dynamic atlas tree
|
||||
PalettedTextureManager.close skip:java GPU release
|
||||
PalettedTextureManager.reload port crates/horizon-client/src/game/armor_stands.rs::ArmorStandAssets::reload_trims trim data reloaded; models kept
|
||||
PalettedTextureManager.AtlasTexture.dumpContents skip:debug debug dump
|
||||
PalettedTextureManager.Slot.getU skip:java UV accessor of a dynamic atlas slot; Horizon uses sprite rects
|
||||
PalettedTextureManager.Slot.getV skip:java UV accessor of a dynamic atlas slot; Horizon uses sprite rects
|
||||
DownloadedPackSource.configureSource inline crates/horizon-client/src/game/server_packs.rs::Game::start_pack_reload pack list staged for the reload; empty when none
|
||||
DownloadedPackSource.onRecovery port crates/horizon-client/src/server_packs.rs::ServerPacks::reloaded reloads the packs that were active after a failure
|
||||
DownloadedPackSource.onRecoveryFailure port crates/horizon-client/src/server_packs.rs::ServerPacks::reloaded second failure leaves the server's packs inactive
|
||||
DownloadedPackSource.waitForPackFeedback skip:java future over the feedback callback; replies go through ServerPacks::take_replies
|
||||
ServerPackManager.markExistingPacksAsRemoved inline crates/horizon-client/src/server_packs.rs::ServerPacks::push packs with the same id are removed as ServerReplaced
|
||||
ServerPackManager.pushPack port crates/horizon-client/src/server_packs.rs::ServerPacks::push declined prompt answers DECLINED
|
||||
ServerPackManager.pushLocalPack missing player: a world's own resource pack (resources.zip in the save) is not loaded when the world opens
|
||||
ServerPackManager.pushNewPack inline crates/horizon-client/src/server_packs.rs::ServerPacks::push adds the pack and accepts it when allowed
|
||||
ServerPackManager.findPackInfo inline crates/horizon-client/src/server_packs.rs::ServerPacks::pop finds the live pack with the id
|
||||
ServerPackManager.popPack port crates/horizon-client/src/server_packs.rs::ServerPacks::pop marks the pack ServerRemoved
|
||||
ServerPackManager.allowServerPacks port crates/horizon-client/src/server_packs.rs::ServerPacks::allow prompt allowed; accepts the waiting packs
|
||||
ServerPackManager.rejectServerPacks port crates/horizon-client/src/server_packs.rs::ServerPacks::reject prompt declined; removes the unaccepted packs
|
||||
ServerPackManager.cleanupRemovedPacks inline crates/horizon-client/src/server_packs.rs::ServerPacks::tick forgets removed packs and reports why
|
||||
ServerPackManager.updateDownloads port crates/horizon-client/src/server_packs.rs::ServerPacks::tick gap: minor: returns the download requests; the download itself starts in game/server_packs.rs::Game::start_pack_downloads
|
||||
AbstractSoundInstance.getOrResolve port crates/horizon-client/src/sound_engine.rs::SoundEngine::resolve event lookup, then a random sound from it
|
||||
BeeSoundInstance.tick port crates/horizon-client/src/sound_engine.rs::SoundInstance::tick Ticking::Bee follows the bee; pitch and volume from speed
|
||||
DirectionalSoundInstance.setPosition port crates/horizon-client/src/game/end.rs::Game::tick_end gap: minor: the end flash plays without a position, so the 10-block offset toward the view is not kept
|
||||
ElytraOnPlayerSoundInstance.tick missing player: no elytra wind loop (entity.elytra.flying) while gliding; gliding is silent
|
||||
EntityBoundSoundInstance.tick missing minor: a sound tied to an entity does not follow it; it stays at its start point
|
||||
RidingEntitySoundInstance.tick missing player: no riding loop for a happy ghast or nautilus (HAPPY_GHAST_RIDING, NAUTILUS_RIDING)
|
||||
RidingMinecartSoundInstance.shoudlPlaySound port crates/horizon-client/src/sound_engine.rs::SoundInstance::tick RidingMinecart arm; the predicate is always true for OldMinecartBehavior, Horizon's only minecart
|
||||
SnifferSoundInstance.tick port crates/horizon-client/src/game/sniffers.rs::Game::tick_sniffer_effects gap: player: the digging sound plays once when digging starts; vanilla loops it while digging
|
||||
Sound.Type.getByName port crates/horizon-client/src/sound_events.rs::parse_sound type file or event; other values reject the sound
|
||||
SoundEventRegistrationSerializer.deserialize port crates/horizon-client/src/sound_events.rs::parse_file replace and subtitle per event
|
||||
SoundEventRegistrationSerializer.getSounds inline crates/horizon-client/src/sound_events.rs::parse_file sounds array inside parse_file
|
||||
SoundEventRegistrationSerializer.getType inline crates/horizon-client/src/sound_events.rs::parse_sound type field inside parse_sound
|
||||
|
@@ -0,0 +1,149 @@
|
||||
ActiveTextCollector.accept inline crates/horizon-client/src/screen_draw.rs::text default overload: left-aligned text at x,y with default parameters
|
||||
ActiveTextCollector.acceptScrolling missing minor: forwards to the scrolling helper, which Horizon lacks; long text is clipped
|
||||
ActiveTextCollector.acceptScrollingWithDefaultCenter port crates/horizon-client/src/ui.rs::centered_text gap: minor: centres the message; wider text is clipped instead of scrolled
|
||||
ActiveTextCollector.defaultScrollingHelper missing minor: wider text does not slide back and forth; ui.rs centered_text clips it
|
||||
ActiveTextCollector.findElementUnderCursor port crates/horizon-client/src/chat.rs::Chat::style_at gap: minor: hit test covers chat lines only; book links use game/books.rs book_link_at
|
||||
ActiveTextCollector.isPointInRectangle port crates/horizon-client/src/ui.rs::hovered half-open rectangle test with the same bounds
|
||||
ActiveTextCollector.ClickableStyleFinder.accept port crates/horizon-client/src/chat.rs::Chat::style_at gap: minor: only chat lines are searched for click and hover styles
|
||||
ActiveTextCollector.ClickableStyleFinder.acceptScrolling missing minor: no scrolling text (see defaultScrollingHelper)
|
||||
ActiveTextCollector.Parameters.withScale skip:java record copy-with helper; Horizon has no pose matrix per text
|
||||
ActiveTextCollector.Parameters.withOpacity skip:java record copy-with helper; opacity is the colour's alpha byte in Horizon
|
||||
ActiveTextCollector.Parameters.withScissor missing minor: a nested scissor is not intersected with the enclosing rectangle; Draw::Scissor replaces it
|
||||
ComponentPath.path skip:other focus path builder for nested containers; Horizon focus is a flat per-screen state
|
||||
ComponentPath.Path.applyFocus skip:other focus path propagation; Horizon focus is a flat per-screen state
|
||||
Font.bidirectionalShaping port crates/horizon-client/src/bidi.rs::visual_str Arabic shaping and bidi reorder
|
||||
Font.prepare8xTextOutline skip:other no vanilla 26.3 caller passes a non-zero outline colour; text displays, name tags and map labels pass 0 or a background
|
||||
Font.prepareBackground port crates/horizon-client/src/hud_overlays.rs::text_with_backdrop background box behind text; callers pass their own bounds
|
||||
Font.getGlyph port crates/horizon-client/src/font.rs::Font::glyph_styled obfuscated glyph is picked in HudBatch::text_styled via random_glyph
|
||||
Font.PreparedTextBuilder.markSize skip:other bounds bookkeeping of prepared text; Horizon has no prepared-text object and hit-tests by advance
|
||||
Font.PreparedTextBuilder.markBackground inline crates/horizon-client/src/hud_overlays.rs::text_with_backdrop gap: minor: the background box is 2 px around the text; vanilla grows it by 1 px around each glyph
|
||||
Font.PreparedTextBuilder.addGlyph inline crates/horizon-client/src/hud.rs::HudBatch::text_styled glyph quad pushed directly into the batch
|
||||
Font.PreparedTextBuilder.addEffect inline crates/horizon-client/src/hud.rs::HudBatch::text_styled underline and strikethrough rectangles drawn inline
|
||||
Font.PreparedTextBuilder.addEmptyGlyph skip:other hit areas for glyphs with no image; Chat::style_at hit-tests by advance width instead
|
||||
Font.PreparedTextBuilder.accept port crates/horizon-client/src/hud.rs::HudBatch::text_styled per-character draw with bold, italic, shadow, underline and strikethrough
|
||||
Font.PreparedTextBuilder.visit skip:other visitor over prepared glyphs for draw order and hit tests; Horizon draws straight into the batch
|
||||
Font.PreparedTextBuilder.getTextColor inline crates/horizon-client/src/hud.rs::HudBatch::text_styled style colour with the base colour's alpha
|
||||
Font.PreparedTextBuilder.getShadowColor inline crates/horizon-client/src/hud.rs::HudBatch::text_styled gap: minor: style shadow colour is ignored; shadow is always 0.25 of the text colour
|
||||
Font.PreparedTextBuilder.bounds skip:other bounds of prepared text for vanilla hit tests; Horizon hit-tests by advance
|
||||
Gui.update skip:other narrator-only update (handleDelayedNarration); Horizon has no narrator
|
||||
Gui.isPausing port crates/horizon-client/src/game.rs::Game::pauses_game gap: minor: checks the open screen only, not the overlay part
|
||||
Gui.addSocialInteractionsToast skip:service social interactions are not offered by Horizon
|
||||
Gui.handleKeybinds port crates/horizon-client/src/game.rs::Game::key_pressed gap: minor: the social interactions key has no port (see addSocialInteractionsToast)
|
||||
Gui.openChatScreen port crates/horizon-client/src/game/chat.rs::Game::open_chat
|
||||
Gui.openChatAndAddText port crates/horizon-client/src/game/chat.rs::Game::open_chat the text is passed as the initial input
|
||||
Gui.buildInitialScreens missing player: first launch skips vanilla's accessibility onboarding screen, and ban notices are not shown before the title screen
|
||||
Gui.addInitialScreens missing player: same as buildInitialScreens: no onboarding screen or ban notice is queued
|
||||
Gui.canInterruptScreen missing minor: unsure: no check that stops a server-opened screen from replacing an open one was found
|
||||
Gui.renderActiveTextDebug skip:debug debug overlay of text bounds
|
||||
GuiGraphicsExtractor.enableScissor port crates/horizon-client/src/screen_draw.rs::paint gap: minor: callers push a rectangle; there is no stack, so enclosing rectangles are not intersected
|
||||
GuiGraphicsExtractor.outline missing minor: unsure: no one-pixel outline draw was found in Horizon's UI
|
||||
GuiGraphicsExtractor.innerFill port crates/horizon-client/src/hud.rs::HudBatch::fill gap: minor: one colour only; a second gradient colour (color2) is not drawn
|
||||
GuiGraphicsExtractor.textWithWordWrap port crates/horizon-client/src/screen_draw.rs::Measure::split gap: minor: only the wrap; the caller draws each line at y+9
|
||||
GuiGraphicsExtractor.blitSprite port crates/horizon-client/src/hud.rs::HudBatch::sprite_scaled gap: minor: tile and nine-slice scaling is in ui.rs (tiled, draw_nine_slice)
|
||||
GuiGraphicsExtractor.blitNineSliceInnerSegment port crates/horizon-client/src/ui.rs::draw_nine_slice inner segments of a nine-slice sprite
|
||||
GuiGraphicsExtractor.blitTiledSprite port crates/horizon-client/src/ui.rs::tiled
|
||||
GuiGraphicsExtractor.innerBlit port crates/horizon-client/src/screen_draw.rs::blit texture rectangle by UV; the atlas lookup is in HudBatch::rect_uv
|
||||
GuiGraphicsExtractor.innerTiledBlit port crates/horizon-client/src/ui.rs::tile one tiled quad
|
||||
GuiGraphicsExtractor.item port crates/horizon-client/src/game.rs::Game::draw_item gap: minor: no seed or owner is passed to the item model
|
||||
GuiGraphicsExtractor.fakeItem inline crates/horizon-client/src/game.rs::Game::draw_item same as item with no owner
|
||||
GuiGraphicsExtractor.itemBar inline crates/horizon-client/src/hud_overlays.rs::item_decorations damage bar drawn in item_decorations
|
||||
GuiGraphicsExtractor.itemCount inline crates/horizon-client/src/hud_overlays.rs::item_decorations stack count drawn in item_decorations
|
||||
GuiGraphicsExtractor.map port crates/horizon-client/src/game/cartography.rs::Game::draw_cartography gap: player: the map image is drawn only in the cartography preview; map markers (decorations) are not drawn there
|
||||
GuiGraphicsExtractor.entity port crates/horizon-client/src/game/perspective.rs::Game::draw_player_preview gap: player: only the local player is previewed; the smithing armour-stand preview has no port
|
||||
GuiGraphicsExtractor.skin missing minor: no skin customisation preview was found; the inventory preview is draw_player_preview
|
||||
GuiGraphicsExtractor.book missing player: the enchanting table screen does not draw its open book; Horizon's book drawing is for written books only
|
||||
GuiGraphicsExtractor.profilerChart skip:debug F3 profiler pie chart; Horizon's debug_chart.rs covers its own charts
|
||||
GuiGraphicsExtractor.setTooltipForNextFrame inline crates/horizon-client/src/screen_draw.rs::tooltip the overloads route to the tooltip draw
|
||||
GuiGraphicsExtractor.setComponentTooltipForNextFrame port crates/horizon-client/src/screen_draw.rs::tooltip gap: minor: tooltip images (TooltipComponent) are not drawn
|
||||
GuiGraphicsExtractor.setTooltipForNextFrameInternal port crates/horizon-client/src/ui.rs::tooltip frame and background sprites beside the cursor
|
||||
GuiGraphicsExtractor.extractDeferredElements port crates/horizon-client/src/screen_draw.rs::paint gap: minor: deferred hover effects come from chat only (see componentHoverEffect)
|
||||
GuiGraphicsExtractor.componentHoverEffect port crates/horizon-client/src/game/chat.rs::Game::draw_chat_screen gap: player: hover tooltips exist only for text in chat; item and entity hover events show nothing
|
||||
GuiGraphicsExtractor.textRendererForWidget skip:ui builds a text collector for a widget; Horizon draws widget text directly
|
||||
GuiGraphicsExtractor.textRenderer skip:ui builds a text collector; Horizon draws text directly
|
||||
GuiGraphicsExtractor.createDefaultTextParameters skip:ui default pose, opacity and scissor for text; Horizon passes colour and rectangle directly
|
||||
GuiGraphicsExtractor.RenderingTextCollector.accept port crates/horizon-client/src/screen_draw.rs::text gap: minor: no hover or click registration here (see Chat::style_at)
|
||||
GuiGraphicsExtractor.RenderingTextCollector.acceptScrolling missing minor: no scrolling text (see defaultScrollingHelper)
|
||||
GuiGraphicsExtractor.ScissorStack.push inline crates/horizon-client/src/screen_draw.rs::paint gap: minor: the pushed rectangle replaces the current one; it is not intersected
|
||||
GuiGraphicsExtractor.ScissorStack.pop inline crates/horizon-client/src/screen_draw.rs::paint gap: minor: Draw::NoScissor clears the scissor instead of restoring the enclosing one
|
||||
GuiGraphicsExtractor.ScissorStack.containsPoint missing minor: hover ignores the scissor, so a widget clipped out of view can still highlight
|
||||
Hud.extractHotbarAndDecorations port crates/horizon-client/src/hud_layout.rs::hotbar items and decorations are drawn by Game::draw_item
|
||||
Hud.<init> skip:java constructor state setup
|
||||
Hud.extractSubtitleOverlay port crates/horizon-client/src/hud_overlays.rs::SubtitleOverlay::extract
|
||||
Hud.extractChat port crates/horizon-client/src/chat.rs::Chat::layout
|
||||
Hud.getMobEffectSprite port crates/horizon-client/src/game/potions.rs::Game::draw_effect_icons sprite lookup is inside the effect icon draw
|
||||
Hud.extractDemoOverlay skip:other Horizon has no demo mode, so there is no demo timer overlay
|
||||
Hud.getCameraPlayer missing minor: unsure: no camera-entity lookup found; the HUD always uses the local player
|
||||
Hud.getPlayerVehicleWithHealth port crates/horizon-client/src/hud_layout.rs::vehicle_health gap: minor: the vehicle is chosen by the caller
|
||||
Hud.extractArmor inline crates/horizon-client/src/hud_layout.rs::HealthHud::layout armour row inside the health layout
|
||||
Hud.extractHearts inline crates/horizon-client/src/hud_layout.rs::HealthHud::layout heart row inside the health layout
|
||||
Hud.extractHeart port crates/horizon-client/src/hud_layout.rs::heart heart sprite choice for one heart
|
||||
Hud.getAirBubbleYLine inline crates/horizon-client/src/hud_layout.rs::HealthHud::layout air bubble row position
|
||||
Hud.getCurrentAirSupplyBubble inline crates/horizon-client/src/hud_layout.rs::HealthHud::layout air bubble count
|
||||
Hud.extractFood inline crates/horizon-client/src/hud_layout.rs::HealthHud::layout food row inside the health layout
|
||||
Hud.extractTextureOverlay port crates/horizon-client/src/hud_overlays.rs::camera_overlays gap: player: the powder-snow freeze outline is not drawn; only the equippable camera overlay (pumpkin) is
|
||||
Hud.extractSlot port crates/horizon-client/src/game.rs::Game::draw_slot_item
|
||||
Hud.setNowPlaying port crates/horizon-client/src/hud_overlays.rs::Titles::set_overlay the animate flag gives the rainbow colour
|
||||
Hud.onDisconnected missing minor: unsure: no HUD reset on disconnect found; titles clear only on the ClearTitles packet
|
||||
Hud.willPrioritizeJumpInfo port crates/horizon-client/src/locator_bar.rs::ContextualBar::next the jumping input comes from Game::mount_jumping
|
||||
Hud.HeartType.getSprite port crates/horizon-client/src/hud_layout.rs::heart
|
||||
Hud.HeartType.forPlayer inline crates/horizon-client/src/hud_layout.rs::HealthHud::layout heart kind comes from the health inputs
|
||||
AbstractButton.extractDefaultSprite port crates/horizon-client/src/screen_draw.rs::button disabled, highlighted and normal sprites
|
||||
AbstractButton.keyPressed missing minor: Enter or Space does not press a focused button; Enter only confirms a title text edit
|
||||
AbstractContainerWidget.setFocused port crates/horizon-client/src/pack_screen.rs::PackScreen::set_focus gap: minor: screen-level focus only; no child-container focus
|
||||
AbstractContainerWidget.mouseClicked port crates/horizon-client/src/ui.rs::Scroll::press gap: minor: child click dispatch is per screen; only the scrollbar press is here
|
||||
AbstractScrollArea.isOverScrollbar inline crates/horizon-client/src/ui.rs::Scroll::press scrollbar column test folded into the press
|
||||
AbstractScrollArea.scrollBarY port crates/horizon-client/src/ui.rs::scrollbar_thumb thumb top
|
||||
AbstractScrollArea.extractScrollbar port crates/horizon-client/src/ui.rs::scrollbar gap: minor: no disabled-scroller sprite and no cursor request
|
||||
AbstractScrollArea.defaultSettings skip:java settings record builder; the sizes are constants in ui.rs
|
||||
AbstractSelectionList.swap port crates/horizon-client/src/multiplayer.rs::Screen::click gap: minor: mouse move up or down works; keyboard Shift+arrow reorder is not ported
|
||||
AbstractSelectionList.clearEntriesExcept skip:other only the stats screen calls it; Horizon's stats screen draws its rows directly
|
||||
AbstractSelectionList.replaceEntries port crates/horizon-client/src/pack_screen.rs::PackScreen::update_list
|
||||
AbstractSelectionList.getNextY port crates/horizon-client/src/pack_screen.rs::List::next_y
|
||||
AbstractSelectionList.addEntry port crates/horizon-client/src/pack_screen.rs::List::add
|
||||
AbstractSelectionList.addEntryToTop skip:service only the chat report selection screen calls it; Horizon has no chat reporting
|
||||
AbstractSelectionList.repositionEntries port crates/horizon-client/src/pack_screen.rs::List::reposition
|
||||
AbstractSelectionList.removeEntryFromTop skip:service only the chat report selection screen calls it; Horizon has no chat reporting
|
||||
AbstractSelectionList.updateSizeAndPosition port crates/horizon-client/src/pack_screen.rs::List::update_size
|
||||
AbstractSelectionList.extractListSeparators port crates/horizon-client/src/pack_screen.rs::PackScreen::draw_list header and footer separators, with the in-world variant
|
||||
AbstractSelectionList.extractListBackground port crates/horizon-client/src/pack_screen.rs::PackScreen::draw_list menu list background sprite
|
||||
AbstractSelectionList.enableScissor port crates/horizon-client/src/pack_screen.rs::PackScreen::draw_list scissor clamped to the screen
|
||||
AbstractSelectionList.scrollToEntry port crates/horizon-client/src/pack_screen.rs::List::scroll_to
|
||||
AbstractSelectionList.setFocused port crates/horizon-client/src/pack_screen.rs::PackScreen::set_focus gap: minor: focusing a row does not select it; vanilla selects the focused entry
|
||||
AbstractSelectionList.nextEntry missing minor: arrow keys do not move the selection between rows in the pack or server lists
|
||||
AbstractSelectionList.extractListItems port crates/horizon-client/src/pack_screen.rs::PackScreen::draw_list rows culled to the visible band
|
||||
AbstractSelectionList.extractItem port crates/horizon-client/src/pack_screen.rs::PackScreen::draw_list selection outline and row content
|
||||
AbstractSelectionList.extractSelection port crates/horizon-client/src/pack_screen.rs::PackScreen::draw_list two fills: outline colour and black inner
|
||||
AbstractSelectionList.getRowBottom skip:other only the LAN-found narration uses it; Horizon has no narrator
|
||||
AbstractSelectionList.narrationPriority skip:other screen-reader priority; Horizon has no narrator
|
||||
AbstractSelectionList.removeEntry skip:other rows are rebuilt from the model when they change (update_list, server list), so there is no single-row removal
|
||||
AbstractSelectionList.narrateListElementPosition skip:other narration only
|
||||
AbstractSelectionList.TrackedList.set skip:java delegate list wrapper
|
||||
AbstractSliderButton.getSprite inline crates/horizon-client/src/ui.rs::slider gap: minor: track highlight follows hover only; keyboard focus does not highlight
|
||||
AbstractSliderButton.getHandleSprite inline crates/horizon-client/src/ui.rs::slider gap: minor: handle highlight follows hover only
|
||||
AbstractSliderButton.updateWidgetNarration skip:other narration only
|
||||
AbstractSliderButton.extractWidgetRenderState port crates/horizon-client/src/ui.rs::slider gap: minor: the label is clipped rather than scrolled
|
||||
AbstractSliderButton.handleCursor port crates/horizon-client/src/widgets.rs::widget_cursor gap: minor: no resize cursor while dragging
|
||||
AbstractSliderButton.setFocused missing minor: keyboard focus does not enable value changes; there is no change-value state
|
||||
AbstractSliderButton.keyPressed missing minor: Left and Right do not move a focused slider; Enter does not toggle it
|
||||
AbstractSliderButton.setValue port crates/horizon-client/src/options_ui.rs::set_slider gap: minor: the 0..1 clamp is done by the caller (ui.rs slider_value)
|
||||
AbstractStringWidget.extractWidgetRenderState port crates/horizon-client/src/screen_draw.rs::string_widget gap: minor: hover tooltip and click cursor for styled text are not drawn
|
||||
AbstractStringWidget.onClick missing minor: clicking a styled label with a click event does nothing here; book links and chat links do work
|
||||
AbstractStringWidget.setMessage skip:ui width is measured at draw time
|
||||
AbstractStringWidget.handleStyleClick missing minor: same as onClick: no click handling for labels
|
||||
AbstractTextAreaWidget.mouseClicked port crates/horizon-client/src/game/books.rs::Game::book_page_click gap: minor: a scrollbar press inside the area is not checked
|
||||
AbstractTextAreaWidget.keyPressed port crates/horizon-client/src/game/books.rs::Game::book_page_key gap: minor: up and down scroll the area in vanilla; not checked here
|
||||
AbstractTextAreaWidget.extractWidgetRenderState port crates/horizon-client/src/game/books.rs::Game::draw_book gap: minor: scroll offset inside the page not verified
|
||||
AbstractTextAreaWidget.isMouseOver port crates/horizon-client/src/screen_draw.rs::inside gap: minor: the scrollbar width is not added to the hit area
|
||||
AbstractTextAreaWidget.extractBackground skip:ui frame drawn by the book screen; no behaviour
|
||||
AbstractTextAreaWidget.extractBorder skip:ui frame sprite; no behaviour
|
||||
AbstractTextAreaWidget.withinContentAreaTopBottom skip:ui visibility cull while drawing lines
|
||||
AbstractWidget.extractRenderState port crates/horizon-client/src/ui.rs::hovered gap: minor: the scissor test is not part of the hover check
|
||||
AbstractWidget.extractTooltipForNextRenderPass port crates/horizon-client/src/ui.rs::tooltip gap: minor: unsure: widget hover delay not checked
|
||||
AbstractWidget.extractScrollingStringOverContents port crates/horizon-client/src/ui.rs::centered_text gap: minor: text is clipped, not scrolled
|
||||
AbstractWidget.mouseClicked port crates/horizon-client/src/title.rs::Title::click gap: minor: click dispatch is per screen; the press sound is audio.rs Audio::play_button_click
|
||||
AbstractWidget.mouseReleased port crates/horizon-client/src/ui.rs::Scroll::release gap: minor: only the scroll release; widget onRelease is per screen
|
||||
AbstractWidget.mouseDragged port crates/horizon-client/src/ui.rs::Scroll::drag gap: minor: only scroll drag; widget onDrag is per screen
|
||||
AbstractWidget.nextFocusPath missing minor: unsure: no per-widget focus path; Horizon focus is per screen
|
||||
AbstractWidget.isMouseOver port crates/horizon-client/src/screen_draw.rs::inside gap: minor: isActive is checked by the caller
|
||||
AbstractWidget.narrationPriority skip:other narration only
|
||||
AbstractWidget.defaultButtonNarrationText skip:other narration only
|
||||
|
@@ -0,0 +1,144 @@
|
||||
BossHealthOverlay.extractBar port crates/horizon-client/src/hud_overlays.rs::boss_overlay background bar, then progress at the lerped width; the notch overlay only when not PROGRESS
|
||||
BossHealthOverlay.shouldDarkenScreen port crates/horizon-client/src/boss_overlay.rs::BossOverlay::should_darken any bar asks to darken
|
||||
Button.Builder.build skip:java builder: makes a Plain button and sets its tooltip
|
||||
ChatComponent.forEachLine port crates/horizon-client/src/chat.rs::Chat::layout visible lines bottom-up with the alpha filter, inlined in layout
|
||||
ChatComponent.addMessageToDisplayQueue port crates/horizon-client/src/chat.rs::Chat::add_lines wrap at width/scale, keep the scroll when chatting, trim to 100 lines
|
||||
ChatComponent.addMessageToQueue port crates/horizon-client/src/chat.rs::Chat::add_message newest first, trimmed to 100 messages
|
||||
ChatComponent.processMessageDeletionQueue missing player: a message the server deletes stays in chat; the delete-chat packet is only named in horizon-protocol/src/ids.rs and never decoded
|
||||
ChatComponent.deleteMessage missing player: a server message delete does nothing in Horizon; the removed line stays visible
|
||||
ChatComponent.deleteMessageOrDelay missing player: no 60-tick delayed removal and no deleted marker; see deleteMessage
|
||||
ChatComponent.refreshTrimmedMessages port crates/horizon-client/src/chat.rs::Chat::rewrap gap: minor: rewrap also resets the scroll to 0; vanilla keeps the position
|
||||
ChatComponent.scrollChat port crates/horizon-client/src/chat.rs::Chat::scroll_by clamp to the page and clear new-message marker at the bottom
|
||||
ChatComponent.getHeight port crates/horizon-client/src/chat.rs::ChatOptions::height_px focused or unfocused chat height in px
|
||||
ChatComponent.defaultUnfocusedPct inline crates/horizon-client/src/chat.rs::ChatOptions::default the default 70/160 is stored as a constant, not computed from the height formula
|
||||
ChatComponent.getLineHeight port crates/horizon-client/src/chat.rs::ChatOptions::line_height 9 * (line spacing + 1)
|
||||
ChatComponent.saveAsDraft missing player: Save Chat Drafts does nothing (options_ui.rs notes no drafts yet); text left in the box is not kept for the next open
|
||||
ChatComponent.createScreen port crates/horizon-client/src/game/chat.rs::Game::open_chat gap: player: no draft is restored; the chat opens with the initial text its caller passes
|
||||
ChatComponent.preserveCurrentChatScreen missing minor: unsure: Horizon keeps no chat screen across a dimension change; game/nether_portal.rs:577 only leaves Chat alone during a portal effect, the change path was not checked
|
||||
ChatComponent.storeState inline crates/horizon-client/src/game/remote.rs::Game::poll_remote no snapshot: the Reconfigured arm only resets boss bars and registries, so the chat survives a reconfigure without a copy
|
||||
ChatComponent.restoreState inline crates/horizon-client/src/game/remote.rs::Game::poll_remote no restore: the chat is never cleared on Reconfigured, so there is nothing to put back
|
||||
ChatComponent.ClickableTextOnlyGraphicsAccess.updatePose skip:ui pose bookkeeping of the text collector; chat draws with its own scale and translate
|
||||
ChatComponent.DrawingBackgroundGraphicsAccess.updatePose skip:ui pose bookkeeping of the text collector; chat draws with its own scale and translate
|
||||
ChatComponent.DrawingBackgroundGraphicsAccess.handleMessage port crates/horizon-client/src/chat.rs::Chat::layout line text drawn at its bottom with the text opacity
|
||||
ChatComponent.DrawingBackgroundGraphicsAccess.handleTag port crates/horizon-client/src/chat.rs::Chat::layout indicator bar filled from x -4 to -2 with the line alpha
|
||||
ChatComponent.DrawingFocusedGraphicsAccess.updateLocalMousePos inline crates/horizon-client/src/chat.rs::Chat::line_at the mouse mapped into line space inside line_at
|
||||
ChatComponent.DrawingFocusedGraphicsAccess.updatePose skip:ui pose bookkeeping; the mouse mapping is done in Chat::line_at
|
||||
ChatComponent.DrawingFocusedGraphicsAccess.handleMessage port crates/horizon-client/src/chat.rs::Chat::style_at gap: player: no pointing-hand cursor over clickable chat text; only widgets set the cursor (widgets.rs:28)
|
||||
ChatComponent.DrawingFocusedGraphicsAccess.isMouseOver inline crates/horizon-client/src/chat.rs::Chat::indicator_at the rectangle test of the indicator bar; tag icons are not drawn
|
||||
ChatComponent.DrawingFocusedGraphicsAccess.handleTagIcon missing minor: no tag icons; Horizon never tags a message as modified, so the Modified icon never shows
|
||||
ChatComponent.DrawingFocusedGraphicsAccess.showTooltip port crates/horizon-client/src/game/chat.rs::Game::draw_chat_screen gap: minor: every indicator shows the systemSinglePlayer text as its tooltip
|
||||
Checkbox.adjustWidth missing minor: the checkbox width is never capped or its label wrapped; dialog_screen.rs:137 sets the width to the full label
|
||||
Checkbox.overflowsRowLimit missing minor: no tooltip for a label that wraps past two rows; Horizon dialog labels never wrap
|
||||
Checkbox.onPress port crates/horizon-client/src/game/dialogs.rs::Game::dialog_click toggles the boolean input value (dialogs.rs:448)
|
||||
Checkbox.updateWidgetNarration skip:other narration text; Horizon has no narrator (the Narrator option is stored only)
|
||||
Checkbox.extractContents port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog box sprite for checked and focused states, then the label (Part::Check)
|
||||
Checkbox.Builder.selected skip:java builder setter
|
||||
Checkbox.Builder.build skip:java builder: makes the checkbox and its tooltip
|
||||
CommandSuggestions.mouseScrolled port crates/horizon-client/src/chat.rs::ChatScreen::scroll wheel over the suggestion list, clamped to the list
|
||||
CommandSuggestions.mouseClicked port crates/horizon-client/src/chat.rs::ChatScreen::click click on a suggestion row uses it, else the input box
|
||||
CommandSuggestions.getUsageNarration skip:other narration text; no narrator in Horizon
|
||||
CommandSuggestions.sortSuggestions port crates/horizon-client/src/chat.rs::ChatScreen::show_suggestions suggestions starting with the typed word first, including the minecraft: prefix
|
||||
CommandSuggestions.hasMessageArguments missing minor: a /say or /msg style command with a message argument counts as a command here; Horizon's parse keeps no argument kinds (see update_usage_info comment)
|
||||
CommandSuggestions.getExceptionMessage port crates/horizon-client/src/chat.rs::ChatScreen::update_usage_info parse errors shown with their context (e.with_context)
|
||||
CommandSuggestions.fillNodeUsage port crates/horizon-client/src/chat.rs::ChatScreen::update_usage_info smart usage lines, without the literal nodes
|
||||
CommandSuggestions.recomputeUsageBoxWidth port crates/horizon-client/src/chat.rs::ChatScreen::update_usage_info usage width is the widest line
|
||||
CommandSuggestions.formatChat port crates/horizon-client/src/chat.rs::ChatScreen::format argument colours over the input
|
||||
CommandSuggestions.calculateSuggestionSuffix port crates/horizon-client/src/chat.rs::ChatScreen::select the grey suffix for the highlighted suggestion (strip the typed prefix)
|
||||
CommandSuggestions.extractSuggestions port crates/horizon-client/src/chat.rs::ChatScreen::draw the suggestion list drawn when it is open
|
||||
CommandSuggestions.extractUsage port crates/horizon-client/src/chat.rs::ChatScreen::draw usage lines drawn upward from the bottom, as vanilla's bottom anchor
|
||||
CommandSuggestions.getNarrationMessage skip:other narration text; no narrator in Horizon
|
||||
CommandSuggestions.hasAllowedInput port crates/horizon-client/src/chat.rs::ChatAbilities::allows gap: minor: a /say style command is judged as a command, not a message (see hasMessageArguments)
|
||||
CommandSuggestions.SuggestionsList.extractRenderState port crates/horizon-client/src/chat.rs::ChatScreen::draw_list rows, scroll marks, highlight and tooltip; gap: minor: no pointing-hand cursor over the rows
|
||||
CommandSuggestions.SuggestionsList.mouseClicked port crates/horizon-client/src/chat.rs::ChatScreen::click row click selects and uses the suggestion
|
||||
CommandSuggestions.SuggestionsList.keyPressed port crates/horizon-client/src/chat.rs::ChatScreen::key up, down and tab cycle and use the suggestion
|
||||
CommandSuggestions.SuggestionsList.cycle port crates/horizon-client/src/chat.rs::ChatScreen::cycle moves the selection and the scroll offset
|
||||
CommandSuggestions.SuggestionsList.getNarrationMessage skip:other narration text; no narrator in Horizon
|
||||
ComponentRenderUtils.stripColor port crates/horizon-client/src/chat.rs::Chat::displayed with Chat Colors off the section codes are stripped before wrapping
|
||||
ContainerObjectSelectionList.nextFocusPath port crates/horizon-client-input/src/gamepad.rs::focus_step gap: minor: picks the nearest target by geometry, not row by row with a wrap to the next entry
|
||||
ContainerObjectSelectionList.setFocused missing minor: unsure: no list focus model beyond gamepad focus_step; losing focus does not clear a selection here
|
||||
ContainerObjectSelectionList.updateWidgetNarration skip:other narration text; no narrator in Horizon
|
||||
ContainerObjectSelectionList.Entry.setFocused missing minor: unsure: focus inside a row is not tracked; focus_step works on target rectangles
|
||||
ContainerObjectSelectionList.Entry.focusPathAtIndex missing minor: unsure: no per-row focus path; see focus_step
|
||||
ContainerObjectSelectionList.Entry.nextFocusPath port crates/horizon-client-input/src/gamepad.rs::focus_step gap: minor: moves by nearest target rectangle, not by child index within the row
|
||||
ContainerObjectSelectionList.Entry.updateNarration skip:other narration text; no narrator in Horizon
|
||||
CycleButton.extractContents port crates/horizon-client/src/options_ui.rs::OptionsUi::draw option button sprite and its label
|
||||
CycleButton.onPress port crates/horizon-client/src/options_ui.rs::Opt::cycle click cycles forward; the back flag comes from the caller
|
||||
CycleButton.getCycledValue skip:other only feeds the narration of the next value
|
||||
CycleButton.mouseScrolled missing player: the mouse wheel over an option button does not change its value; OptionsUi::scroll_at only scrolls the list
|
||||
CycleButton.updateValue inline crates/horizon-client/src/options_ui.rs::Opt::cycle labels are read live from Settings (Opt::label), so no cached message needs updating
|
||||
CycleButton.createLabelForValue port crates/horizon-client/src/options_ui.rs::Opt::label value label or full name, from the setting
|
||||
CycleButton.updateWidgetNarration skip:other narration text; no narrator in Horizon
|
||||
CycleButton.createDefaultNarrationMessage skip:other narration text; no narrator in Horizon
|
||||
CycleButton.builder skip:java builder
|
||||
CycleButton.booleanBuilder skip:java builder
|
||||
CycleButton.onOffBuilder skip:java builder
|
||||
CycleButton.Builder.withValues skip:java builder
|
||||
CycleButton.Builder.create skip:java builder: makes the cycle button and its initial value
|
||||
CycleButton.ValueListSupplier.create skip:java value list copy
|
||||
DebugScreenOverlay.<init> skip:java constructs the chart objects; Horizon's DebugCharts is plain state
|
||||
DebugScreenOverlay.formatChart port crates/horizon-client/src/game/debug_keys.rs::Game::debug_chart_lines the [key] name visible or hidden line
|
||||
DebugScreenOverlay.formatKeybind inline crates/horizon-client/src/game/debug_keys.rs::Game::debug_chart_lines the key closure inside debug_chart_lines
|
||||
DebugScreenOverlay.getServerLevel missing minor: F3 draws no chunk or level lines; draw_debug_overlay has no chunk data
|
||||
DebugScreenOverlay.getLevel missing minor: F3 draws no chunk or level lines; draw_debug_overlay has no chunk data
|
||||
DebugScreenOverlay.getServerChunk missing minor: F3 draws no server chunk line
|
||||
DebugScreenOverlay.getClientChunk missing minor: F3 draws no client chunk line
|
||||
DebugScreenOverlay.showDebugScreen port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay debug on and (HUD shown or a screen open)
|
||||
DebugScreenOverlay.showProfilerChart missing minor: no profiler chart; the profiling chart key is used up and draws nothing (debug_keys.rs:662)
|
||||
DebugScreenOverlay.showNetworkCharts port crates/horizon-client/src/debug_chart.rs::DebugCharts::draw network chart drawn when its flag is set
|
||||
DebugScreenOverlay.showFpsCharts port crates/horizon-client/src/debug_chart.rs::DebugCharts::draw fps chart drawn when its flag is set
|
||||
DebugScreenOverlay.showLightmapTexture port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay lightmap drawn when its flag is set (debug_keys.rs:473)
|
||||
DebugScreenOverlay.toggleNetworkCharts port crates/horizon-client/src/debug_chart.rs::DebugCharts::toggle_network toggles the network chart and clears the others
|
||||
DebugScreenOverlay.toggleFpsCharts port crates/horizon-client/src/debug_chart.rs::DebugCharts::toggle_fps toggles the fps chart and clears the others
|
||||
DebugScreenOverlay.toggleLightmapTexture port crates/horizon-client/src/debug_chart.rs::DebugCharts::toggle_lightmap toggles the lightmap and clears the others
|
||||
DebugScreenOverlay.toggleProfilerChart missing minor: no profiler chart (see showProfilerChart)
|
||||
DebugScreenOverlay.logRemoteSample missing minor: unsure: the debug_sample packet is only named in horizon-protocol/src/ids.rs, so a server's samples are not logged
|
||||
EditBox.createNarrationMessage skip:other narration text; no narrator in Horizon
|
||||
EditBox.getHighlighted port crates/horizon-client/src/ui.rs::EditBox::selected_text the text between cursor and highlight
|
||||
EditBox.moveCursorTo port crates/horizon-client/src/ui.rs::EditBox::set_cursor sets the cursor and keeps the highlight unless extending
|
||||
EditBox.setCursorPosition port crates/horizon-client/src/ui.rs::EditBox::set_cursor clamps and scrolls to the cursor
|
||||
EditBox.canConsumeInput missing minor: unsure: no editable flag on the box; whether a box takes typed input is the caller's focus routing
|
||||
EditBox.preeditUpdated missing minor: no IME composition; Horizon has no preedit input
|
||||
EditBox.selectWord port crates/horizon-client/src/ui.rs::EditBox::click a double click selects the word (the double flag)
|
||||
EditBox.applyFormat port crates/horizon-client/src/ui.rs::EditBox::draw the format text passed to draw
|
||||
EditBox.updateTextPosition port crates/horizon-client/src/ui.rs::EditBox::text_x text_x of the shown part; text_y is its sibling
|
||||
EditBox.setMaxLength port crates/horizon-client/src/ui.rs::Caret::sync gap: minor: sets the limit only; a longer value is not cut to it
|
||||
EditBox.setFocused port crates/horizon-client/src/ui.rs::Caret::draw focus restarts the blink clock here; gap: minor: no IME or narration side effects
|
||||
EditBox.setEditable missing minor: unsure: no read-only flag on the box in ui.rs; a box vanilla locks would accept typing
|
||||
EditBox.setHighlightPos port crates/horizon-client/src/ui.rs::EditBox::set_cursor sets the highlight and scrolls
|
||||
EditBox.setHint inline crates/horizon-client/src/title/create_world.rs::Title::create_field the hint is passed when the box is made and drawn while it is empty and unfocused
|
||||
FittingMultiLineTextWidget.setWidth skip:ui layout: wrap width
|
||||
FittingMultiLineTextWidget.minimizeHeight skip:ui layout: height to content
|
||||
FittingMultiLineTextWidget.extractContents port crates/horizon-client/src/game/dialogs.rs::Game::draw_dialog message lines drawn as text parts
|
||||
FocusableTextWidget.updateWidgetNarration skip:other narration text; no narrator in Horizon
|
||||
FocusableTextWidget.extractWidgetRenderState port crates/horizon-client/src/game/lan_screen.rs::Game::draw_restrictions gap: minor: text only; no focus outline or background fill
|
||||
FocusableTextWidget.updateWidth skip:ui layout: width from the message
|
||||
FocusableTextWidget.updateHeight skip:ui layout: height from the wrapped lines
|
||||
FocusableTextWidget.setMessage skip:ui layout: size follows the message
|
||||
FocusableTextWidget.keyPressed missing minor: unsure: keyboard does not activate a clickable style in a focused text line; no such focus in Horizon
|
||||
FocusableTextWidget.builder skip:java builder
|
||||
FriendsButton.refreshIncomingRequestCount skip:service Microsoft friend requests; Horizon's friends use its own invite codes (multiplayer.rs:90)
|
||||
FriendsButton.extractContents skip:service draws the request badge; Horizon has no incoming request count
|
||||
IMEPreeditOverlay.extractRenderState missing minor: no IME composition overlay; Horizon has no preedit input
|
||||
ImageButton.extractContents port crates/horizon-client/src/game/recipe_book.rs::Game::draw_book_panel tab buttons drawn with their sprite; the other vanilla ImageButton screens are not in Horizon
|
||||
ImageWidget.texture skip:java factory
|
||||
ImageWidget.Sprite.extractWidgetRenderState skip:other picture of a popup or social tab; Horizon's lock popup has no picture
|
||||
ImageWidget.Texture.extractWidgetRenderState skip:other picture of a popup or social tab; Horizon's lock popup has no picture
|
||||
ItemDisplayWidget.extractWidgetRenderState missing player: a dialog's item body is not drawn (dialog_screen.rs Body::Item gives no element)
|
||||
ItemDisplayWidget.updateWidgetNarration skip:other narration text; no narrator in Horizon
|
||||
LoadingDotsWidget.extractWidgetRenderState port crates/horizon-client/src/multiplayer.rs::Screen::draw the scanning label and the animated dots under it on the LAN row
|
||||
LockIconButton.createNarrationMessage skip:other narration text; no narrator in Horizon
|
||||
LockIconButton.extractContents port crates/horizon-client/src/game/lan_screen.rs::Game::draw_options_view lock or unlock sprite by state
|
||||
LogoRenderer.extractRenderState port crates/horizon-client/src/title.rs::Title::draw logo top 44 rows and edition banner; gap: minor: no easter-egg logo variant
|
||||
MultiLineEditBox.updateWidgetNarration skip:other narration text; no narrator in Horizon
|
||||
MultiLineEditBox.onClick port crates/horizon-client/src/screen_draw.rs::TextField::click click places the cursor; gap: minor: no double-click word select
|
||||
MultiLineEditBox.onDrag missing minor: unsure: TextField has no drag selection in screen_draw.rs
|
||||
MultiLineEditBox.charTyped port crates/horizon-client/src/screen_draw.rs::TextField::insert_text typed text replaces the selection or goes at the cursor
|
||||
MultiLineEditBox.preeditUpdated missing minor: no IME composition; Horizon has no preedit input
|
||||
MultiLineEditBox.extractContents port crates/horizon-client/src/screen_draw.rs::TextField::draw placeholder, lines, caret and selection highlight
|
||||
MultiLineEditBox.extractDecorations missing minor: no character count under a limited box; TextField has no limit
|
||||
MultiLineEditBox.scrollToCursor port crates/horizon-client/src/screen_draw.rs::TextField::scroll_to keeps the cursor line in view
|
||||
MultiLineEditBox.seekCursorScreen port crates/horizon-client/src/screen_draw.rs::TextField::click maps the pointer to a cursor position
|
||||
MultiLineEditBox.setFocused inline crates/horizon-client/src/screen_draw.rs::TextField::draw gap: minor: focus does not restart the caret blink here; the caller passes the blink clock
|
||||
MultiLineEditBox.Builder.build skip:java builder
|
||||
MultiLineTextWidget.getHeight skip:ui layout: wrapped line count times 9; Measure::split does the wrap when drawing
|
||||
MultiLineTextWidget.getFreshCacheKey skip:java cache key for the wrapped lines
|
||||
|
@@ -0,0 +1,144 @@
|
||||
MultilineTextField.setCharacterLimit port crates/horizon-client/src/game/books.rs::book_page_box gap: minor: only the book page sets a character limit (PAGE_CHARS); other MultiLineEditBox users are not ported
|
||||
MultilineTextField.setLineLimit inline crates/horizon-client/src/game/books.rs::Game::page_keep the 14-line limit (LINES) is checked in page_keep; there is no limit field
|
||||
MultilineTextField.setValue port crates/horizon-client/src/ui.rs::EditBox::set_value gap: minor: no line-limit check when the text is set (allowOverflowLineLimit path)
|
||||
MultilineTextField.insertText port crates/horizon-client/src/ui.rs::EditBox::insert_text the line limit is checked by Game::page_keep, not here
|
||||
MultilineTextField.deleteText port crates/horizon-client/src/ui.rs::EditBox::delete_chars
|
||||
MultilineTextField.getSelected port crates/horizon-client/src/ui.rs::EditBox::selected
|
||||
MultilineTextField.getLineAtCursor port crates/horizon-client/src/game/books.rs::Game::caret_on the visual row holding the caret, with its x
|
||||
MultilineTextField.getLineView port crates/horizon-client/src/game/books.rs::Game::page_rows visual rows as character ranges
|
||||
MultilineTextField.seekCursor port crates/horizon-client/src/ui.rs::EditBox::set_cursor
|
||||
MultilineTextField.seekCursorLine port crates/horizon-client/src/game/books.rs::Game::book_move_line gap: minor: column kept without vanilla's 2 px bias (LINE_SEEK_PIXEL_BIAS)
|
||||
MultilineTextField.seekCursorToPoint port crates/horizon-client/src/game/books.rs::Game::page_index_at
|
||||
MultilineTextField.selectWordAtCursor missing player: double-clicking a word on a book page does not select it; Game::book_page_click only sets the caret
|
||||
MultilineTextField.keyPressed port crates/horizon-client/src/game/books.rs::Game::book_input gap: player: Home and End go to the start and end of the whole page, not of the visual line (EditBox::key); Enter, arrows and Ctrl keys are handled
|
||||
MultilineTextField.getSelectedText port crates/horizon-client/src/ui.rs::EditBox::selected_text
|
||||
MultilineTextField.getCursorLineView inline crates/horizon-client/src/game/books.rs::Game::book_move_line gap: player: Home and End do not use the caret's line range (see keyPressed)
|
||||
MultilineTextField.getNextWord port crates/horizon-client/src/ui.rs::multiline_word_position start of the next word; Ctrl+Right and Ctrl+Delete reach it through EditBox::word_position
|
||||
MultilineTextField.getWordEndPosition missing minor: the word end only feeds selectWordAtCursor, which is missing for book pages
|
||||
MultilineTextField.onValueChange inline crates/horizon-client/src/game/books.rs::Game::page_keep the page text is stored there after the limit check; visual rows are computed on demand by page_rows
|
||||
MultilineTextField.reflowDisplayLines port crates/horizon-client/src/game/books.rs::Game::page_rows same wrap breaks as font.split
|
||||
MultilineTextField.truncateFullText port crates/horizon-client/src/ui.rs::EditBox::set_value truncates to max_length characters
|
||||
MultilineTextField.truncateInsertionText inline crates/horizon-client/src/ui.rs::EditBox::insert_text room left under max_length
|
||||
MultilineTextField.overflowsLineLimit port crates/horizon-client/src/game/books.rs::Game::page_keep counts page_rows, which adds the row after a trailing newline as vanilla does
|
||||
ObjectSelectionList.nextFocusPath missing minor: no arrow-key focus or selection in the title, server or pack lists
|
||||
ObjectSelectionList.updateWidgetNarration skip:other screen-reader narration; Horizon has no narration output
|
||||
OptionsList.addBig port crates/horizon-client/src/options_ui.rs::OptionsUi::layout Row::Big: 310 wide at width/2 - 155
|
||||
OptionsList.addHeader port crates/horizon-client/src/options_ui.rs::OptionsUi::layout gap: minor: the header is centred text, not a focusable widget
|
||||
OptionsList.findOption skip:ui widget lookup only; rows are rebuilt from Settings in OptionsUi::layout each frame
|
||||
OptionsList.applyUnsavedChanges inline crates/horizon-client/src/options_ui.rs::set_slider gap: minor: delayed sliders (render, simulation, biome blend distance, wheel sensitivity) apply on every step, not 600 ms after the last move or on close
|
||||
OptionsList.resetOption inline crates/horizon-client/src/options_ui.rs::OptionsUi::slider_shown gap: minor: only sliders show the stored value at once; other options redraw from Settings each frame
|
||||
OptionsList.Entry.big port crates/horizon-client/src/options_ui.rs::option_widget 310 wide; the row's place is OptionsUi::layout (Row::Big)
|
||||
OptionsList.Entry.small port crates/horizon-client/src/options_ui.rs::option_widget pair placement at width/2 - 155 and + 5 in OptionsUi::layout (Row::Pair)
|
||||
OptionsList.Entry.extractContent inline crates/horizon-client/src/options_ui.rs::OptionsUi::layout positions the row's widgets; OptionsUi::draw paints them
|
||||
OptionsList.Entry.findOption skip:ui widget lookup only; rows are rebuilt from Settings each frame
|
||||
OptionsList.HeaderEntry.extractContent inline crates/horizon-client/src/options_ui.rs::OptionsUi::layout header centred on the row (Row::Header)
|
||||
PlainTextButton.extractContents missing player: the title's bottom copyright text that opens Credits is not a button; Horizon draws "Not affiliated with Mojang or Microsoft" there instead
|
||||
PlayerFaceExtractor.extractHat port crates/horizon-client/src/tab_list.rs::face hat layer: UV 40, flipped for Dinnerbone and Grumm
|
||||
PlayerFaceWidget.extractWidgetRenderState skip:service head in the friends list (AbstractFriendsEntryContainerWidget)
|
||||
PlayerSkinWidget.extractWidgetRenderState skip:service skin preview on the chat report screen (SkinReportScreen)
|
||||
PlayerSkinWidget.onDrag skip:service drag-to-rotate of the chat report skin preview
|
||||
PlayerTabOverlay.extractTablistScore inline crates/horizon-client/src/tab_list.rs::TabList::layout the score column is drawn in layout; hearts go through TabList::hearts
|
||||
PopupScreen.init port crates/horizon-client/src/game/lan_screen.rs::Popup::new gap: minor: only the lock question (title, message, Yes and No); images and extra buttons are not ported
|
||||
PopupScreen.buildButtonRow inline crates/horizon-client/src/game/lan_screen.rs::Popup::new two buttons min((214 - 6) / 2, 150) wide, 6 apart
|
||||
PopupScreen.repositionElements inline crates/horizon-client/src/game/lan_screen.rs::Popup::new centres the popup on the screen
|
||||
PopupScreen.extractBackground port crates/horizon-client/src/game/lan_screen.rs::Game::draw_lock_question dimmed gradient, then the popup background sprite
|
||||
PopupScreen.getNarrationMessage skip:other screen-reader text; Horizon has no narration output
|
||||
PopupScreen.onClose port crates/horizon-client/src/game/lan_screen.rs::Game::world_options_escape Escape on the lock question returns to the options page
|
||||
PopupScreen.Builder.addButton skip:java builder setter; Horizon's lock popup has fixed Yes and No buttons
|
||||
PopupScreen.Builder.build skip:java builder; Horizon constructs the popup directly
|
||||
RealmsButton.extractContents skip:service Realms button
|
||||
ScrollableLayout.setMinWidth skip:ui sizing only; each screen sizes its own scroll area (dialog_screen.rs, server_links.rs, lan_screen.rs)
|
||||
ScrollableLayout.setMinHeight skip:ui sizing only; same screens
|
||||
ScrollableLayout.setMaxHeight skip:ui sizing only; same screens
|
||||
ScrollableLayout.arrangeElements skip:ui scrollbar reserve and layout live in each screen's own code (10 px each side in dialog and LAN screens)
|
||||
ScrollableLayout.Container.refreshChildren skip:ui children are laid out each frame
|
||||
ScrollableLayout.Container.extractWidgetRenderState skip:ui each screen draws its own clipped list (server links, dialog, LAN)
|
||||
ScrollableLayout.Container.getBorderForArrowNavigation missing minor: arrow-key focus moves across the list are not ported; Horizon lists have no keyboard focus
|
||||
ScrollableLayout.Container.setFocused missing minor: focusing a row does not scroll it into view; Horizon lists have no keyboard focus
|
||||
ScrollableLayout.Container.setX skip:ui positions set by each screen's layout
|
||||
ScrollableLayout.Container.setY skip:ui positions set by each screen's layout
|
||||
ScrollableLayout.Container.setScrollAmount inline crates/horizon-client/src/game/server_links.rs::Game::server_links_scroll gap: minor: clamps the server links list only; other scroll areas clamp in their own code
|
||||
SelectableEntry.mouseOverIcon port crates/horizon-client/src/pack_screen.rs::PackScreen::entry_click 32 px icon of a pack row; the world row's icon uses the same test in Title::click_action
|
||||
SelectableEntry.mouseOverLeftHalf port crates/horizon-client/src/pack_screen.rs::PackScreen::entry_click left 16 px of the pack icon (unselect)
|
||||
SelectableEntry.mouseOverRightHalf port crates/horizon-client/src/multiplayer.rs::over_right_half join half of a server row
|
||||
SelectableEntry.mouseOverTopRightQuarter port crates/horizon-client/src/pack_screen.rs::PackScreen::entry_click move-up arrow of a pack row
|
||||
SelectableEntry.mouseOverBottomRightQuarter port crates/horizon-client/src/pack_screen.rs::PackScreen::entry_click move-down arrow of a pack row
|
||||
SelectableEntry.mouseOverTopLeftQuarter port crates/horizon-client/src/multiplayer.rs::over_top_left move-up arrow of a server row
|
||||
SelectableEntry.mouseOverBottomLeftQuarter port crates/horizon-client/src/multiplayer.rs::over_bottom_left move-down arrow of a server row
|
||||
SplashRenderer.extractRenderState missing player: the random splash line on the title screen is not drawn; Title::draw has no splash
|
||||
SpriteIconButton.setLoading skip:service the loading state is used only by the friends buttons (AddFriendWidget, FriendEntry)
|
||||
SpriteIconButton.extractSprite port crates/horizon-client/src/title.rs::Title::draw draws the title's icon buttons (language, accessibility); the loading state is service-only
|
||||
SpriteIconButton.extractLoadingStateIfLoading skip:service loading spinner only for the friends buttons
|
||||
SpriteIconButton.Builder.sprite skip:java builder setter; Horizon draws its icon buttons with fixed sprites
|
||||
SpriteIconButton.Builder.build skip:java builder; no object is needed
|
||||
SpriteIconButton.CenteredIcon.extractContents skip:service FriendsButton (social)
|
||||
SpriteIconButton.TextAndIcon.extractContents skip:other no caller in 26.3
|
||||
StringWidget.setMaxWidth port crates/horizon-client/src/screen_draw.rs::string_widget clips at max_width (CLAMPED)
|
||||
StringWidget.getWidth port crates/horizon-client/src/screen_draw.rs::label_width the smaller of max width and text width
|
||||
StringWidget.visitLines port crates/horizon-client/src/screen_draw.rs::string_widget gap: minor: SCROLLING overflow (scrolling text) is not ported; CLAMPED draws "..."
|
||||
TabButton.updateWidgetNarration skip:other screen-reader text; Horizon has no narration output
|
||||
TextCursorUtils.extractInsertCursor port crates/horizon-client/src/ui.rs::EditBox::draw insert caret is a 1 px bar; blinks every 300 ms
|
||||
Tooltip.create skip:java factory; Horizon passes the lines to ui::tooltip
|
||||
Tooltip.toCharSequence port crates/horizon-client/src/screen_draw.rs::tooltip wraps at 170 px as splitTooltip does; no per-language cache
|
||||
WidgetSprites.get port crates/horizon-client/src/ui.rs::button disabled and hovered pick the sprite; gap: minor: keyboard focus does not pick the highlighted sprite
|
||||
WidgetTooltipHolder.refreshTooltipForNextRenderPass port crates/horizon-client/src/ui.rs::tooltip gap: minor: tooltips show only under the pointer, not for keyboard focus
|
||||
WidgetTooltipHolder.createTooltipPositioner missing minor: a keyboard-focused widget gets no tooltip placed below or above it
|
||||
DebugEntryBiome.display missing minor: F3 biome line not drawn
|
||||
DebugEntryBiome.printBiome missing minor: biome id text for the F3 biome line
|
||||
DebugEntryChunkGeneration.display missing minor: F3 chunk generation line (Blending: Old) not drawn
|
||||
DebugEntryChunkGeneration.update missing minor: F3 chunk generation sampling not ported
|
||||
DebugEntryChunkSourceStats.display missing minor: F3 chunk source stats line not drawn
|
||||
DebugEntryDayCount.display missing minor: F3 "Day #" line not drawn
|
||||
DebugEntryDetailedMemory.display skip:java JVM heap and non-heap readout (MemoryMXBean); Rust has no JVM heap
|
||||
DebugEntryDetailedMemory.printMemoryUsage skip:java JVM memory format for the heap readout
|
||||
DebugEntryFps.display port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay first line: fps, framerate cap (inf), present mode and refresh rate
|
||||
DebugEntryFps.presentModeName port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay present mode suffix (immediate, mailbox, fifo)
|
||||
DebugEntryGpuUtilization.display missing minor: F3 GPU utilisation percentage not drawn; Horizon shows the GPU name only
|
||||
DebugEntryHeightmap.display missing minor: F3 heightmap line not drawn
|
||||
DebugEntryLight.display missing minor: F3 client and server light line not drawn
|
||||
DebugEntryLocalDifficulty.display missing minor: F3 local difficulty line not drawn
|
||||
DebugEntryLookingAt.display missing minor: F3 targeted block line not drawn
|
||||
DebugEntryLookingAt.addTagEntries missing minor: block tag lines of the targeted block (F3) not drawn
|
||||
DebugEntryLookingAt.DebugEntryLookingAtState.extractInfo missing minor: targeted block state (F3) not drawn
|
||||
DebugEntryLookingAt.DebugEntryLookingAtState.addStateProperties missing minor: targeted block state properties (F3) not drawn
|
||||
DebugEntryLookingAt.DebugEntryLookingAtState.getPropertyValueString missing minor: property values of the targeted block state (F3) not drawn
|
||||
DebugEntryLookingAtEntity.display missing minor: F3 targeted entity line not drawn
|
||||
DebugEntryLookingAtEntityTags.display missing minor: entity tag lines of the targeted entity (F3) not drawn
|
||||
DebugEntryMemory.display skip:java JVM heap and allocation counters (Runtime, GC); Rust has none
|
||||
DebugEntryMemory.AllocationRateCalculator.bytesAllocatedPerSecond skip:java JVM allocation counter from GC data
|
||||
DebugEntryMemory.AllocationRateCalculator.gcCounts skip:java JVM garbage collector counts
|
||||
DebugEntryPlayerSpeed.display missing minor: F3 speed line (blocks per tick) not drawn
|
||||
DebugEntryPosition.display port crates/horizon-client/src/debug_overlay.rs::position XYZ, block, chunk and facing lines
|
||||
DebugEntryPostEffects.display missing minor: F3 post effect chain line not drawn
|
||||
DebugEntrySectionPosition.display port crates/horizon-client/src/debug_overlay.rs::position section-relative line
|
||||
DebugEntrySoundCache.display missing minor: F3 sound cache line not drawn
|
||||
DebugEntrySoundMood.display missing minor: F3 sound mood line not drawn
|
||||
DebugEntrySpawnCounts.display missing minor: F3 spawn counts line not drawn
|
||||
DebugEntrySystemSpecs.getCpuInfo port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay CPU name line
|
||||
DebugEntrySystemSpecs.display port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay gap: minor: no Java version line; CPU, display, window and GPU lines are drawn
|
||||
DebugEntrySystemSpecs.typeName port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay GPU type suffix (iGPU, dGPU, vGPU, software)
|
||||
DebugEntryTps.display port crates/horizon-client/src/game/debug_keys.rs::Game::draw_debug_overlay integrated or remote server line: tick ms against target, sprinting or frozen, tx and rx
|
||||
DebugScreenEntries.register skip:debug registry of F3 entries; Horizon's overlay has a fixed profile
|
||||
DebugScreenEntryList.load skip:debug reads the F3 profile file; F3 profile editing is developer tooling (Horizon's F3 hint says To edit but has no editor)
|
||||
DebugScreenEntryList.setStatus skip:debug F3 profile editor (developer tooling)
|
||||
DebugScreenEntryList.toggleStatus skip:debug F3 profile editor (developer tooling)
|
||||
DebugScreenEntryList.rebuildCurrentList skip:debug F3 profile editor (developer tooling)
|
||||
DebugScreenEntryList.save skip:debug F3 profile editor (developer tooling)
|
||||
AbstractDebugChart.extractSampleBars port crates/horizon-client/src/debug_chart.rs::Chart::bars one bar per sample
|
||||
AbstractDebugChart.extractMainSampleBar port crates/horizon-client/src/debug_chart.rs::Chart::bars the main value's bar (dimension 0)
|
||||
BandwidthDebugChart.extractLabeledLineAtValue port crates/horizon-client/src/debug_chart.rs::Chart::lines_and_labels
|
||||
BandwidthDebugChart.extractLineWithLabel port crates/horizon-client/src/debug_chart.rs::Chart::lines_and_labels
|
||||
FpsDebugChart.extractAdditionalLinesAndLabels port crates/horizon-client/src/debug_chart.rs::Chart::lines_and_labels
|
||||
FpsDebugChart.toDisplayString port crates/horizon-client/src/debug_chart.rs::Chart::display
|
||||
FpsDebugChart.getSampleColor port crates/horizon-client/src/debug_chart.rs::Chart::color
|
||||
PingDebugChart.extractAdditionalLinesAndLabels port crates/horizon-client/src/debug_chart.rs::Chart::lines_and_labels
|
||||
PingDebugChart.toDisplayString port crates/horizon-client/src/debug_chart.rs::Chart::display
|
||||
PingDebugChart.getSampleColor port crates/horizon-client/src/debug_chart.rs::Chart::color
|
||||
ProfilerPieChart.extractRenderState missing minor: F3+1 profiler pie chart is not drawn; the chart toggle always reads hidden
|
||||
ProfilerPieChart.splitNodeName missing minor: profiler node names for the pie chart not ported
|
||||
ProfilerPieChart.profilerPieChartKeyPress missing minor: profiler pie keys are not handled
|
||||
TpsDebugChart.extractAdditionalLinesAndLabels port crates/horizon-client/src/debug_chart.rs::Chart::lines_and_labels
|
||||
TpsDebugChart.getValueForAggregation port crates/horizon-client/src/debug_chart.rs::Chart::aggregated tick time without its idle part
|
||||
TpsDebugChart.toDisplayString port crates/horizon-client/src/debug_chart.rs::Chart::display
|
||||
TpsDebugChart.getSampleHeight port crates/horizon-client/src/debug_chart.rs::Chart::height
|
||||
TpsDebugChart.getSampleColor port crates/horizon-client/src/debug_chart.rs::Chart::color
|
||||
|
Can't render this file because it contains an unexpected character in line 35 and column 134.
|
@@ -0,0 +1,150 @@
|
||||
ContainerEventHandler.getChildAt port crates/horizon-client/src/pack_screen.rs::PackScreen::button_at gap: minor: says whether a button is under the pointer; list rows are hit-tested in PackScreen::click
|
||||
ContainerEventHandler.mouseReleased port crates/horizon-client/src/pack_screen.rs::PackScreen::release gap: minor: only clears list scrollbar holds; no focused child gets the release
|
||||
ContainerEventHandler.mouseDragged port crates/horizon-client/src/pack_screen.rs::PackScreen::drag drags a held list scrollbar
|
||||
ContainerEventHandler.mouseScrolled port crates/horizon-client/src/pack_screen.rs::PackScreen::scroll list under the pointer scrolls 18 px per notch
|
||||
ContainerEventHandler.keyPressed port crates/horizon-client/src/pack_screen.rs::PackScreen::shortcut gap: minor: only Ctrl+A/C/V/X here; Backspace is PackScreen::erase
|
||||
ContainerEventHandler.keyReleased skip:other no widget in the pack screen acts on key release
|
||||
ContainerEventHandler.charTyped port crates/horizon-client/src/pack_screen.rs::PackScreen::type_text typed text goes to the search box when it has focus
|
||||
ContainerEventHandler.preeditUpdated missing minor: no IME composition (preedit) anywhere in Horizon
|
||||
ContainerEventHandler.getBorderForArrowNavigation missing minor: arrow keys do not move focus; pack screen focus is set by clicks (PackScreen::set_focus)
|
||||
ContainerEventHandler.getCurrentFocusPath missing minor: no focus path; PackScreen::focus is read only inside the screen
|
||||
ContainerEventHandler.nextFocusPath missing minor: Tab and arrow keys do not move focus between search, lists and buttons
|
||||
ContainerEventHandler.handleTabNavigation missing minor: Tab does not move focus (same gap as nextFocusPath)
|
||||
ContainerEventHandler.handleArrowNavigation missing minor: arrow keys do not move focus (same gap)
|
||||
ContainerEventHandler.nextFocusPathVaguelyInDirection missing minor: no directional focus search (same gap)
|
||||
SpectatorGui.extractPage port crates/horizon-client/src/spectator_menu.rs::SpectatorGui::hotbar the nine-slot page with its frame and selection
|
||||
SpectatorGui.extractSlot inline crates/horizon-client/src/spectator_menu.rs::SpectatorGui::hotbar icon and key label drawn in the hotbar loop
|
||||
MenuTabBar.extractWidgetRenderState port crates/horizon-client/src/title/create_world.rs::Title::draw_create header separators and tab row drawn inside draw_create
|
||||
MenuTabBar.Builder.addTab skip:java builder
|
||||
MenuTabBar.Builder.addTabs skip:java builder
|
||||
MenuTabBar.Builder.build skip:java builder
|
||||
MenuTabBar.MenuTabButton.extractWidgetRenderState inline crates/horizon-client/src/title/create_world.rs::Title::draw_create tab loop: sprite by selected and hover state, underline, label
|
||||
MenuTabBar.MenuTabButton.renderMenuBackground inline crates/horizon-client/src/title/create_world.rs::Title::draw_create menu background inside the selected tab
|
||||
MenuTabBar.MenuTabButton.renderLabel inline crates/horizon-client/src/title/create_world.rs::Title::draw_create label centred, 3 px lower on unselected tabs
|
||||
MenuTabBar.MenuTabButton.renderFocusUnderline inline crates/horizon-client/src/title/create_world.rs::Title::draw_create 1 px underline under the selected tab label
|
||||
TabManager.setTabArea skip:ui tab area layout; create world computes the tab row on every draw (tabs())
|
||||
TabManager.setCurrentTab port crates/horizon-client/src/title.rs::Title::click a click on a tab sets options.tab
|
||||
TabNavigationBar.arrangeElements skip:ui layout of the tab row
|
||||
TabNavigationBar.isMouseOver port crates/horizon-client/src/title/create_world.rs::tab_at pointer over a tab
|
||||
TabNavigationBar.setFocused missing minor: the tab row cannot take keyboard focus
|
||||
TabNavigationBar.nextFocusPath missing minor: the Tab key never reaches the tab row
|
||||
TabNavigationBar.narrationPriority skip:other screen-reader narration; Horizon has no narrator
|
||||
TabNavigationBar.updateWidgetNarration skip:other screen-reader narration; Horizon has no narrator
|
||||
TabNavigationBar.narrateListElementPosition skip:other screen-reader narration; Horizon has no narrator
|
||||
TabNavigationBar.extractWidgetRenderState port crates/horizon-client/src/title/create_world.rs::Title::draw_create tab row drawn in draw_create
|
||||
TabNavigationBar.selectTab port crates/horizon-client/src/title.rs::Title::click gap: minor: only clicks pick a tab; no select by index (Ctrl+number, init)
|
||||
TabNavigationBar.setTabActiveState missing minor: tabs cannot be disabled; vanilla StatsScreen.java:91-93 disables two tabs, Horizon's stats tabs stay clickable
|
||||
TabNavigationBar.setTabTooltip missing minor: the tab row has no per-tab tooltip
|
||||
TabNavigationBar.keyPressed missing minor: Ctrl+1 to 9 and Ctrl+Tab do not switch create-world tabs
|
||||
TabNavigationBar.getNextTabIndex missing minor: index math for Ctrl+number and Ctrl+Tab, which Horizon lacks
|
||||
TabNavigationBar.currentTabIndex skip:other accessor; Horizon keeps the open tab in options.tab
|
||||
TabNavigationBar.currentTabButton skip:other accessor; Horizon draws the tabs from options.tab
|
||||
TabNavigationBar.Builder.addTab skip:java builder
|
||||
TabNavigationBar.Builder.build skip:java builder
|
||||
AdvancementToast.update port crates/horizon-client/src/game/advancements.rs::Toast::wants_show 5 s visible, scaled by the notification time option
|
||||
AdvancementToast.isChallengeAdvancement inline crates/horizon-client/src/game/advancements.rs::Game::draw_toasts challenge check for the sound when a toast enters a slot
|
||||
AdvancementToast.extractRenderState port crates/horizon-client/src/game/advancements.rs::Game::draw_toast gap: player: a long title is one line; vanilla wraps it and fades the frame label into it over 1.5 s
|
||||
FriendToast.update skip:service friend toasts: social, Horizon has no friends system
|
||||
FriendToast.extractRenderState skip:service friend toasts: social, Horizon has no friends system
|
||||
FriendToast.add skip:service friend toasts: social, Horizon has no friends system
|
||||
FriendToast.showFriendRequestSent skip:service friend toasts: social, Horizon has no friends system
|
||||
FriendToast.showFriendRequestReceived skip:service friend toasts: social, Horizon has no friends system
|
||||
FriendToast.showFriendRequestAccepted skip:service friend toasts: social, Horizon has no friends system
|
||||
FriendToast.showFriendAdded skip:service friend toasts: social, Horizon has no friends system
|
||||
NowPlayingToast.extractToast missing player: no Now Playing toast is drawn; with Music Toast on (default Never) the song name never shows
|
||||
NowPlayingToast.tickMusicNotes missing player: the music notes beside the Now Playing toast are never drawn
|
||||
NowPlayingToast.showToast missing player: nothing shows the toast when a song starts (same gap as extractToast)
|
||||
NowPlayingToast.update missing player: the toast is never shown, so it never times out (same gap)
|
||||
RecipeToast.update port crates/horizon-client/src/game/advancements.rs::Toast::wants_show recipe toast visibility; the cycling index is Toast::displayed_recipe
|
||||
RecipeToast.extractRenderState port crates/horizon-client/src/game/advancements.rs::Game::draw_toast recipe branch: station at 0.6 scale over the cycling result
|
||||
SystemToast.height missing minor: no multi-line height; a system toast always takes one 32 px slot
|
||||
SystemToast.extractRenderState port crates/horizon-client/src/toasts.rs::SystemToast::draw gap: minor: one line per title and message, no wrapping
|
||||
SystemToast.extractTextLines inline crates/horizon-client/src/toasts.rs::SystemToast::draw text lines drawn in draw
|
||||
SystemToast.recalculateWidth inline crates/horizon-client/src/toasts.rs::SystemToast::draw width from the widest line, at least 160, plus 30
|
||||
SystemToast.onFileDropFailure missing minor: Horizon takes no dropped files, so this toast never shows
|
||||
SystemToast.onChunkLoadFailure missing minor: no chunk load-failure toast; failures only log
|
||||
SystemToast.onChunkSaveFailure missing minor: failed chunk saves only log (save.rs warn); no toast
|
||||
ToastManager.findFreeSlotsIndex port crates/horizon-client/src/game/advancements.rs::Game::draw_toasts gap: minor: one 32 px slot per toast; no search for consecutive slots
|
||||
ToastManager.getToast inline crates/horizon-client/src/game/recipe_book.rs::Game::recipe_toast only the recipe toast lookup (find is_recipe); system toasts are kept by their owners
|
||||
ToastManager.showNowPlayingToast port crates/horizon-client/src/music.rs::MusicManager::show_now_playing_toast_if_needed gap: player: the request goes to toast_requests and nothing draws it
|
||||
ToastManager.initializeMusicToast missing player: with Music Toast set to Pause or Pause and Toast (default Never) the Now Playing toast is never created
|
||||
ToastManager.setMusicToastDisplayState missing player: the Music Toast setting does nothing in Horizon (same gap)
|
||||
ToastManager.ToastInstance.resetToast port crates/horizon-client/src/toasts.rs::SystemToast::reset gap: minor: text and display timer restart; the slide-in does not
|
||||
ToastManager.ToastInstance.calculateVisiblePortion port crates/horizon-client/src/toasts.rs::Slide::update 600 ms, squared ease in and out
|
||||
ToastManager.ToastInstance.extractRenderState port crates/horizon-client/src/game/advancements.rs::Game::draw_toast slide x and slot y; system toasts slide in SystemToast::draw
|
||||
TutorialToast.update missing player: new worlds show no movement or look tutorial toasts (vanilla tutorialStep defaults to movement)
|
||||
TutorialToast.extractRenderState missing player: same gap; the tutorial toast is never drawn
|
||||
AtlasGlyphProvider.Instance.renderSprite missing minor: sprite-font glyphs (atlas sprite objects in text) are not parsed
|
||||
CodepointMap.get skip:java codepoint lookup table; Horizon uses HashMap and BTreeSet
|
||||
CodepointMap.put skip:java codepoint lookup table; Horizon uses HashMap and BTreeSet
|
||||
CodepointMap.computeIfAbsent skip:java codepoint lookup table; Horizon uses HashMap and BTreeSet
|
||||
CodepointMap.remove skip:java codepoint lookup table; Horizon uses HashMap and BTreeSet
|
||||
CodepointMap.forEach skip:java codepoint lookup table; Horizon uses HashMap and BTreeSet
|
||||
CodepointMap.keySet skip:java codepoint lookup table; Horizon uses HashMap and BTreeSet
|
||||
FontManager.createFontSet port crates/horizon-client/src/font.rs::Font::load_set a font's providers into a set
|
||||
FontManager.reload port crates/horizon-client/src/hud.rs::HudAtlas::pack fonts are rebuilt with the atlas (Font::load at hud.rs:582); no async reload
|
||||
FontManager.safeLoad inline crates/horizon-client/src/font.rs::Font::load_set a TrueType provider that fails to load is dropped; a bitmap sheet that fails warns
|
||||
FontManager.resolveProviders port crates/horizon-client/src/font.rs::providers reference expansion in order, depth 8; no dependency sort
|
||||
FontManager.finalizeProviderLoading skip:java prewarm of glyph lookups; the fallback is the missing box that Font::resolve gives
|
||||
FontManager.getFontOptions port crates/horizon-client/src/game/options.rs::Game::apply_ui_settings force unicode and japanese flags read from settings
|
||||
FontManager.apply port crates/horizon-client/src/hud.rs::HudAtlas::pack new font sets replace the old ones with the atlas
|
||||
FontManager.updateOptions port crates/horizon-client/src/game/options.rs::Game::apply_ui_settings sets the Font uniform and japanese flags when they change (options.rs:299-301)
|
||||
FontManager.loadResourceStack inline crates/horizon-client/src/font.rs::providers gap: minor: one fonts.json per font id from the resource root, not a stack of packs
|
||||
FontManager.getSpriteFont missing minor: atlas sprite fonts (sprite objects in text) are not parsed; they draw the missing box
|
||||
FontManager.close skip:java Rust drop frees the atlas, font sets and providers
|
||||
FontManager.BuilderResult.resolve port crates/horizon-client/src/font.rs::providers reference builders expanded in place
|
||||
FontManager.BuilderResult.mergeFilters inline crates/horizon-client/src/font.rs::providers the reference's filter merged onto each expanded provider
|
||||
FontManager.CachedFontProvider.getGlyphSource port crates/horizon-client/src/font.rs::Font::glyph_in gap: minor: atlas sprite and player descriptions fall back to the missing glyph
|
||||
FontManager.CachedFontProvider.glyphs skip:java one-entry lookup cache
|
||||
FontManager.CachedFontProvider.effect port crates/horizon-client/src/font.rs::Font::white the white glyph under underline and strikethrough
|
||||
FontManager.UnresolvedBuilderBundle.add skip:java collects builders; providers() reads them directly
|
||||
FontManager.UnresolvedBuilderBundle.listBuilders skip:java collects builders
|
||||
FontManager.UnresolvedBuilderBundle.resolve port crates/horizon-client/src/font.rs::providers reference expansion for the bundle
|
||||
FontOption.Filter.apply port crates/horizon-client/src/font.rs::Filter::passes option match per provider
|
||||
FontOption.Filter.merge inline crates/horizon-client/src/font.rs::providers filter merge while expanding references
|
||||
FontSet.reload port crates/horizon-client/src/font.rs::Font::load_set providers into the font set
|
||||
FontSet.resetTextures port crates/horizon-client/src/font.rs::Font::reset_cache glyph cache and atlas cursor cleared
|
||||
FontSet.selectProviders port crates/horizon-client/src/font.rs::Font::glyphs_by_width gap: minor: width buckets hold only Space and atlas bitmap glyphs, so TrueType and unihex never appear as obfuscated characters
|
||||
FontSet.hasFishyAdvance missing minor: no check for advances under 0 or over 32
|
||||
FontSet.computeGlyphInfo port crates/horizon-client/src/font.rs::Font::resolve gap: minor: no skip of a glyph with a fishy advance in favour of a later provider
|
||||
FontSet.DelayedBake.get skip:java lazy bake into the atlas; Font::resolve bakes at once
|
||||
FontTexture.dumpContents skip:debug writes the atlas to a PNG for debugging
|
||||
GlyphRenderTypes.createForGrayscaleTexture skip:ui one textured quad path for all glyphs (hud.rs text_styled)
|
||||
GlyphRenderTypes.createForColorTexture skip:ui one textured quad path for all glyphs (hud.rs text_styled)
|
||||
GlyphRenderTypes.select port crates/horizon-client/src/game/names.rs::Game::name_tag_geometry gap: minor: normal and see-through only; polygon-offset text has no draw path
|
||||
GlyphStitcher.reset port crates/horizon-client/src/font.rs::Font::reset_cache atlas cursor rewound
|
||||
GlyphStitcher.stitch port crates/horizon-client/src/font.rs::Region::place rectangle placed in the atlas region
|
||||
PlainTextRenderable.render port crates/horizon-client/src/hud.rs::HudBatch::text_styled shadow pass first, then the front text
|
||||
PlayerGlyphProvider.Instance.renderSprite missing minor: player-head text objects are not parsed
|
||||
PlayerGlyphProvider.Instance.renderQuad missing minor: no player-head glyphs (same gap)
|
||||
TextFieldHelper.charTyped inline crates/horizon-client/src/game/sign_edit.rs::Game::sign_input typed-text branch; EditBox::insert_text filters the text
|
||||
TextFieldHelper.moveBy inline crates/horizon-client/src/ui.rs::EditBox::key arrow keys; Ctrl moves by word
|
||||
TextFieldHelper.moveByChars inline crates/horizon-client/src/ui.rs::EditBox::key arrow keys, Home and End
|
||||
TextFieldHelper.moveByWords inline crates/horizon-client/src/ui.rs::EditBox::key Ctrl+arrow word moves
|
||||
TextFieldHelper.removeFromCursor inline crates/horizon-client/src/ui.rs::EditBox::key Backspace and Delete
|
||||
TextFieldHelper.removeWordsFromCursor inline crates/horizon-client/src/ui.rs::EditBox::key Ctrl+Backspace and Ctrl+Delete
|
||||
TextFieldHelper.removeCharsFromCursor port crates/horizon-client/src/ui.rs::EditBox::delete_chars deletes the selection or n characters
|
||||
TextFieldHelper.cut port crates/horizon-client-input/src/clipboard.rs::apply Cut arm: copy the selection, then clear it
|
||||
TextFieldHelper.paste port crates/horizon-client-input/src/clipboard.rs::apply Paste arm: insert the clipboard text
|
||||
TextFieldHelper.getSelected port crates/horizon-client/src/ui.rs::EditBox::selected_text
|
||||
TextFieldHelper.deleteSelection inline crates/horizon-client/src/ui.rs::EditBox::delete_chars selection branch
|
||||
TextFieldHelper.setCursorToEnd port crates/horizon-client/src/ui.rs::EditBox::move_cursor_to_end
|
||||
TextFieldHelper.setCursorPos port crates/horizon-client/src/ui.rs::EditBox::set_cursor no vanilla caller (callers 0)
|
||||
TextFieldHelper.setSelectionRange skip:other no vanilla caller; Horizon sets cursor and highlight separately (EditBox::set_cursor)
|
||||
BakedSheetGlyph.left inline crates/horizon-client/src/hud.rs::HudBatch::text_styled glyph edge with bold thickness and italic shear
|
||||
BakedSheetGlyph.top inline crates/horizon-client/src/hud.rs::HudBatch::text_styled glyph edge with bold thickness and italic shear
|
||||
BakedSheetGlyph.right inline crates/horizon-client/src/hud.rs::HudBatch::text_styled glyph edge with bold thickness and italic shear
|
||||
BakedSheetGlyph.bottom inline crates/horizon-client/src/hud.rs::HudBatch::text_styled glyph edge with bold thickness and italic shear
|
||||
BakedSheetGlyph.renderChar inline crates/horizon-client/src/hud.rs::HudBatch::text_styled shadow pass, bold double draw, italic shear
|
||||
BakedSheetGlyph.render inline crates/horizon-client/src/hud.rs::HudBatch::text_styled glyph quad with shear and bold
|
||||
BakedSheetGlyph.renderEffect inline crates/horizon-client/src/hud.rs::HudBatch::text_styled underline and strikethrough rectangles
|
||||
BakedSheetGlyph.buildEffect inline crates/horizon-client/src/hud.rs::HudBatch::text_styled rectangle quad of an effect
|
||||
BakedSheetGlyph.createGlyph skip:java factory for a glyph instance
|
||||
BakedSheetGlyph.createEffect skip:java factory for an effect instance
|
||||
BakedSheetGlyph.EffectInstance.right inline crates/horizon-client/src/hud.rs::HudBatch::text_styled underline end: pen x plus advance
|
||||
BakedSheetGlyph.EffectInstance.bottom inline crates/horizon-client/src/hud.rs::HudBatch::text_styled underline row, 1 px at pen y plus 8
|
||||
BakedSheetGlyph.GlyphInstance.activeRight inline crates/horizon-client/src/hud.rs::HudBatch::text_styled advance including the bold offset
|
||||
SpecialGlyphs.generate port crates/horizon-client/src/font.rs::Font::white gap: minor: white texel only; the missing-box outline is drawn in HudBatch::text_styled, not generated
|
||||
BitmapProvider.Definition.validateDimensions missing minor: no check of the bitmap grid; a ragged grid loads
|
||||
BitmapProvider.Definition.validate missing minor: no check that ascent is at most height
|
||||
BitmapProvider.Definition.getActualGlyphWidth port crates/horizon-client/src/font.rs::used_width rightmost column with any visible pixel
|
||||
|
@@ -0,0 +1,109 @@
|
||||
BitmapProvider.ImageDataHolder.gpuData skip:other GPU staging buffer for a sheet; Horizon copies the sheet pixels into its atlas at load (font.rs load_bitmap)
|
||||
FreeTypeUtil skip:other FreeType library wrapper (getLibrary, error helpers, setVector, destroy); Horizon rasterizes TrueType with ab_glyph (font.rs load_true_type)
|
||||
UnihexProvider.unpackBitsToBytes port crates/horizon-client/src/font.rs::Font::rasterize_hex gap: minor: rows are written as RGBA into the atlas region, not an IntBuffer; same glyph columns
|
||||
UnihexProvider.decodeHex port crates/horizon-client/src/font.rs::parse_hex_digit gap: minor: a bad digit skips the whole glyph line (vanilla throws and fails the load)
|
||||
UnihexProvider.copyUntil inline crates/horizon-client/src/font.rs::parse_hex line splitting on newline and CR; the .hex text is parsed in one pass
|
||||
UnihexProvider.ByteContents.read inline crates/horizon-client/src/font.rs::parse_hex 8 px rows (32 hex digits) read by parse_hex
|
||||
UnihexProvider.Definition.loadData port crates/horizon-client/src/font.rs::load_hex reads every .hex entry of the zip and applies size_overrides
|
||||
UnihexProvider.Dimensions.pack skip:java packs left and right into one int as a map value; Horizon keeps two fields on HexGlyph
|
||||
UnihexProvider.IntContents.read24 port crates/horizon-client/src/font.rs::parse_hex 6-digit rows (24 bit) handled by parse_hex
|
||||
UnihexProvider.IntContents.read32 port crates/horizon-client/src/font.rs::parse_hex 8-digit rows (32 bit) handled by parse_hex
|
||||
UnihexProvider.LineData.mask inline crates/horizon-client/src/font.rs::parse_hex the OR of the rows, used for the glyph width (mask |= row)
|
||||
UnihexProvider.ShortContents.read port crates/horizon-client/src/font.rs::parse_hex 4-digit rows (16 bit) handled by parse_hex
|
||||
AbstractLayout.setX skip:ui moves a layout's children with it; Horizon computes positions each frame (dialog_screen.rs Layout::new)
|
||||
AbstractLayout.setY skip:ui moves a layout's children with it; Horizon computes positions each frame (dialog_screen.rs Layout::new)
|
||||
AbstractLayout.AbstractChildWrapper.getHeight skip:ui padded child height, layout bookkeeping only
|
||||
AbstractLayout.AbstractChildWrapper.getWidth skip:ui padded child width, layout bookkeeping only
|
||||
AbstractLayout.AbstractChildWrapper.setX inline crates/horizon-client/src/dialog_screen.rs::Layout::new gap: minor: only centred alignment (0.5) is modelled; xAlignment and per-child padding are not
|
||||
AbstractLayout.AbstractChildWrapper.setY inline crates/horizon-client/src/dialog_screen.rs::Layout::new gap: minor: only centred alignment (0.5) is modelled; yAlignment and per-child padding are not
|
||||
EqualSpacingLayout skip:ui equal-gap layout; its only user is WorldOptionsScreen, placing its buttons; layout only, no behaviour
|
||||
EqualSpacingLayout.Orientation skip:ui horizontal or vertical helpers of EqualSpacingLayout; layout only
|
||||
FrameLayout.arrangeElements inline crates/horizon-client/src/dialog_screen.rs::Layout::new gap: minor: frame centring is done for the header title and the footer buttons only; no general minimum size
|
||||
FrameLayout.addChild skip:ui adds a child to the frame's list; no behaviour of its own
|
||||
FrameLayout.visitChildren skip:ui visits children for layout; no behaviour of its own
|
||||
FrameLayout.centerInRectangle port crates/horizon-client/src/dialog_screen.rs::centre gap: minor: one axis at a time through centre; the 2D call is not a separate fn
|
||||
FrameLayout.alignInRectangle inline crates/horizon-client/src/dialog_screen.rs::Layout::new gap: minor: only the centre alignment (0.5); PauseScreen's 0.25 vertical alignment is not modelled
|
||||
GridLayout.arrangeElements port crates/horizon-client/src/dialog_screen.rs::columns gap: minor: only the dialog button grids (2 px apart, 22 px rows); general row and column spans and spacing are not modelled
|
||||
GridLayout.addChild skip:ui adds a cell to the grid's list; no behaviour of its own
|
||||
GridLayout.visitChildren skip:ui visits children for layout; no behaviour of its own
|
||||
GridLayout.RowHelper.addChild inline crates/horizon-client/src/dialog_screen.rs::columns gap: minor: rows fill left to right and a full row is cut from the list by columns(); a row that does not fit moves down, as RowHelper does
|
||||
HeaderAndFooterLayout.visitChildren skip:ui visits children for layout; no behaviour of its own
|
||||
HeaderAndFooterLayout.arrangeElements port crates/horizon-client/src/dialog_screen.rs::Layout::new header 33 high, body at header + 30 clamped above the footer, footer at the bottom; server_links.rs list_top and lan_screen.rs WorldOptions::top do the same for their screens
|
||||
HeaderAndFooterLayout.addToHeader skip:ui adds to the header frame; no behaviour of its own
|
||||
HeaderAndFooterLayout.addToFooter skip:ui adds to the footer frame; no behaviour of its own
|
||||
HeaderAndFooterLayout.addToContents skip:ui adds to the contents frame; no behaviour of its own
|
||||
Layout.arrangeElements skip:ui default recursive layout pass; Horizon places each screen's parts directly
|
||||
LayoutElement.getRectangle skip:ui builds a rectangle from position and size; Horizon uses [f32; 4] arrays
|
||||
LayoutSettings.LayoutSettingsImpl.padding skip:java builder method for padding values
|
||||
LinearLayout.addChild skip:ui queues a child into a GridLayout; positions come from the layout pass (dialog_screen.rs Layout::new body column)
|
||||
LinearLayout.Orientation.setSpacing skip:ui sets the grid spacing of a linear layout; layout only
|
||||
LinearLayout.Orientation.addChild skip:ui places a child in the grid row or column; layout only
|
||||
NarrationElementOutput skip:other screen-reader narration; Horizon has no narration output
|
||||
NarrationThunk skip:other screen-reader narration text; Horizon has no narration output
|
||||
ScreenNarrationCollector skip:other screen-reader narration collection; Horizon has no narration output
|
||||
ScreenNarrationCollector.NarrationEntry skip:other screen-reader narration entries; Horizon has no narration output
|
||||
ScreenNarrationCollector.Output skip:other screen-reader narration output; Horizon has no narration output
|
||||
ScreenAxis missing minor: keyboard focus moves along the axis (arrow keys, Tab) between widgets; Horizon's menus have no widget focus navigation, Tab only moves between title fields (title.rs tab)
|
||||
ScreenDirection missing minor: keyboard focus navigation by direction (arrow keys); Horizon's menus have no widget focus navigation
|
||||
ScreenPosition missing minor: grid position stepping for keyboard focus navigation; not in Horizon's menus
|
||||
ScreenRectangle.of skip:java builds a rectangle from an axis-ordered index; Horizon uses x and y directly
|
||||
ScreenRectangle.step missing minor: moves a rectangle one step for keyboard focus navigation; not in Horizon's menus
|
||||
ScreenRectangle.getLength skip:java width or height accessor
|
||||
ScreenRectangle.getBoundInDirection missing minor: edge coordinate for keyboard focus navigation; not in Horizon's menus
|
||||
ScreenRectangle.getBorder missing minor: border strip used by keyboard focus navigation to find the next widget; not in Horizon's menus
|
||||
ScreenRectangle.overlaps missing minor: overlap test used by keyboard focus navigation; not in Horizon's menus
|
||||
ScreenRectangle.overlapsInAxis missing minor: per-axis overlap used by keyboard focus navigation; not in Horizon's menus
|
||||
ScreenRectangle.getCenterInAxis missing minor: centre along one axis for keyboard focus navigation; not in Horizon's menus
|
||||
ScreenRectangle.intersection missing minor: a nested GUI clip is not intersected with the outer one; paint (screen_draw.rs) replaces the clip on each Scissor draw
|
||||
ScreenRectangle.intersects skip:other no caller in the 26.3 client GUI code; pure geometry predicate
|
||||
ScreenRectangle.encompasses skip:other used by GuiRenderState for element batching bounds; Horizon appends quads to the HUD batch without it
|
||||
ScreenRectangle.containsPoint port crates/horizon-client/src/screen_draw.rs::inside the same half-open point-in-rectangle test
|
||||
ScreenRectangle.transformAxisAligned skip:other bounds of a rectangle under a GUI pose, for the GUI scissor; Horizon clips the quads themselves (hud.rs HudBatch::clip_since)
|
||||
ScreenRectangle.transformMaxBounds skip:other bounds of a rotated rectangle under a GUI pose; Horizon clips the quads themselves (hud.rs HudBatch::clip_since)
|
||||
DynamicAtlasAllocator skip:other slot allocator for the GUI item atlas; Horizon has no item atlas and draws items into the HUD batch (item_render/gui.rs)
|
||||
GuiItemAtlas.computeTextureSizeFor skip:other atlas texture sizing; Horizon has no item atlas
|
||||
GuiItemAtlas.tryPrepareFor skip:other atlas space check; Horizon has no item atlas
|
||||
GuiItemAtlas.getOrUpdate inline crates/horizon-client/src/item_render/gui.rs::draw gap: minor: vanilla draws each item once into an atlas slot and blits it; Horizon re-submits the item and caches its vertices by position (gui_drawn, DrawnKey)
|
||||
GuiItemAtlas.drawToSlot port crates/horizon-client/src/item_render/gui.rs::draw_now the item is clipped to its 16x16 slot unless oversized
|
||||
GuiItemAtlas.close skip:other GPU texture release; Horizon has no item atlas
|
||||
GuiRenderer.render inline crates/horizon-client/src/screen_draw.rs::paint gap: minor: paint has no panorama, blur or GPU upload pass; the frame is one ordered list of draws
|
||||
GuiRenderer.clearUnusedOversizedItemRenderers skip:other GPU renderer cache cleanup; Horizon's gui_drawn cache is bounded (DRAWN_LIMIT)
|
||||
GuiRenderer.prepare inline crates/horizon-client/src/screen_draw.rs::paint gap: minor: the prepare step is folded into paint's single pass; no separate mesh build
|
||||
GuiRenderer.addElementsToMeshes skip:other vertex batching by pipeline and scissor; HudBatch appends quads in order
|
||||
GuiRenderer.executeDrawRange port crates/horizon-client/src/hud.rs::HudRenderer::draw_range draws a range of the batch with its blend, depth and scissor state
|
||||
GuiRenderer.addElementToMesh skip:other vertex batching by pipeline and scissor; HudBatch appends quads in order
|
||||
GuiRenderer.prepareText inline crates/horizon-client/src/screen_draw.rs::paint text is drawn at its own pose through Draw::Text (batch.text_styled)
|
||||
GuiRenderer.prepareItemElements port crates/horizon-client/src/item_render/gui.rs::draw gap: minor: oversized items are drawn unclipped into the HUD batch, not into a picture-in-picture texture
|
||||
GuiRenderer.preparePictureInPicture skip:other Horizon calls each picture drawer directly (game/perspective.rs draw_player_preview, item_render/gui.rs draw_banner_result); no pool dispatch
|
||||
GuiRenderer.preparePictureInPictureState skip:other picture-in-picture pool dispatch; Horizon calls each drawer directly
|
||||
GuiRenderer.submitBlitFromItemAtlas inline crates/horizon-client/src/item_render/gui.rs::draw the atlas slot blit is the item drawn at its GUI position
|
||||
GuiRenderer.prepareItemAtlas skip:other item atlas creation and resize; Horizon has no item atlas
|
||||
GuiRenderer.getGuiScaleInvalidatingItemAtlasIfChanged skip:other item atlas invalidation on GUI scale change; Horizon has no item atlas
|
||||
GuiRenderer.executeDraw port crates/horizon-client/src/hud.rs::HudRenderer::draw_range one pipeline, vertex buffer, scissor and index range draw
|
||||
GuiRenderer.scissorChanged skip:other batching compare of scissor rectangles
|
||||
GuiRenderer.enableScissor port crates/horizon-client/src/hud.rs::HudBatch::clip_since gap: minor: the rectangle arrives already intersected with the outer scissor (GuiGraphicsExtractor); a nested clip replaces the outer one in paint
|
||||
GuiRenderer.close skip:other GPU resource release
|
||||
TextureSetup.singleTextureWithLightmap skip:other GPU texture binding with the lightmap; Horizon's lighting is in the mesh
|
||||
TextureSetup.getSortKey skip:other draw sort key for batching; Horizon appends in order
|
||||
GuiBookModelRenderer.renderToTexture skip:other no GUI caller in the 26.3 sources (graphics.bookModel is never called)
|
||||
GuiEntityRenderer.renderToTexture port crates/horizon-client/src/game/perspective.rs::Game::draw_player_preview gap: player: the smithing-table armor stand preview (SmithingScreen) is not drawn; only the player model
|
||||
GuiProfilerChartRenderer.renderToTexture skip:debug the profiler pie chart (F3 profiler screen)
|
||||
GuiSkinRenderer.renderToTexture missing player: Options > Skin Customisation has no rotating player model; options_ui.rs lists that entry without a page
|
||||
OversizedItemRenderer.renderToTexture port crates/horizon-client/src/item_render/gui.rs::draw gap: minor: oversized items are drawn unclipped into the HUD batch, not via a picture-in-picture texture
|
||||
OversizedItemRenderer.textureIsReadyToBlit skip:other cache check for the picture-in-picture texture; Horizon redraws from the item model
|
||||
PictureInPictureRenderer.blitTexture skip:other picture-in-picture texture blit; Horizon draws each preview into the batch directly (draw_player_preview, draw_banner_result)
|
||||
PictureInPictureRenderer.prepareTexturesAndProjection skip:other GPU texture allocation for a picture-in-picture
|
||||
PictureInPictureRenderer.close skip:other GPU texture release
|
||||
AccessibilityOnboardingScreen.init missing player: first launch shows the accessibility onboarding (onboardAccessibility defaults to true in options_file.rs) with narrator, Sounds, Accessibility, Language and Continue; Horizon has no such screen (options_fixes.rs only turns it off for old files)
|
||||
AccessibilityOnboardingScreen.setInitialFocus missing minor: keyboard focus starts on the narrator button; part of the missing onboarding screen
|
||||
AccessibilityOnboardingScreen.closeAndSetScreen missing player: the Sounds, Accessibility and Language buttons on the onboarding screen; part of the missing screen
|
||||
AccessibilityOnboardingScreen.extractRenderState missing player: the onboarding screen fades in over 2 s, fades out on Continue, and draws the logo
|
||||
AccessibilityOnboardingScreen.handleInitialNarrationDelay skip:other screen-reader narration; Horizon has no narration output
|
||||
AlertScreen missing unsure: no alert screen (title, message, OK) found in Horizon; vanilla callers are world-open, recovery and pack errors (WorldOpenFlows.java, RecoverWorldDataScreen.java, PackSelectionScreen.java)
|
||||
BackupConfirmScreen missing unsure: no backup question before opening a world that needs one (WorldOpenFlows.java:375, EditWorldScreen.java:111); Horizon's backup is only Make Backup (title.rs)
|
||||
BanNoticeScreens missing unsure: no ban or suspension notice for a multiplayer ban, forced name change or banned skin; Horizon reads no BanDetails or profile action (Gui.java addInitialScreens)
|
||||
ChatScreen.removed missing player: unfinished chat text is kept when the chat is interrupted or with Save Chat Drafts on; Horizon's close_chat (game/chat.rs) drops it
|
||||
ChatScreen.shouldDiscardDraft missing player: decides whether closing chat keeps the typed text as a draft; Horizon has no draft state
|
||||
ChatScreen.insertText port crates/horizon-client/src/chat.rs::ChatScreen::type_text insert at the cursor; replace=true (setValue) is ChatScreen::suggest_command in Horizon
|
||||
ChatScreen.formatChat missing minor: a restored draft is drawn grey italic; Horizon has no draft state (see ChatScreen.removed)
|
||||
ChatScreen.updateNarrationState skip:other screen-reader narration; Horizon has no narration output
|
||||
|
@@ -0,0 +1,150 @@
|
||||
ConfirmLinkScreen.confirmMessage port crates/horizon-client/src/game/server_links.rs::confirm_link_layout gap: minor: no separate trusted text; the untrusted text is always used
|
||||
ConfirmLinkScreen.addAdditionalText port crates/horizon-client/src/game/server_links.rs::confirm_link_layout gap: minor: the red warning is always drawn, vanilla draws it only for untrusted links
|
||||
ConfirmLinkScreen.addButtons port crates/horizon-client/src/game/server_links.rs::Game::confirm_link_click Yes opens the browser, Copy Link copies, No goes back; 100 wide
|
||||
ConfirmLinkScreen.confirmLinkNow port crates/horizon-client/src/game/server_links.rs::Game::click_link opens the prompt when Prompt on Links is on; gap: minor: the trusted flag is not passed
|
||||
ConfirmLinkScreen.confirmLink inline crates/horizon-client/src/game/server_links.rs::Game::click_link the button's action, folded into click_link
|
||||
ConfirmScreen.getNarrationMessage skip:other screen-reader narration; Horizon has no narrator
|
||||
ConfirmScreen.addMessage port crates/horizon-client/src/confirm_screen.rs::Confirm::new message wrapped to width - 50, 15 rows at most, centred
|
||||
ConfirmScreen.addButtons port crates/horizon-client/src/confirm_screen.rs::Confirm::answer_at Yes and No buttons; the answer comes from the click position
|
||||
ConfirmScreen.tick inline crates/horizon-client/src/confirm_screen.rs::Confirm::draw_active the 20-tick delay is a 1000 ms timer kept by the caller; buttons are greyed while it runs
|
||||
ConnectScreen.connect port crates/horizon-client/src/net.rs::Session::connect background connect on its own thread (Session::start)
|
||||
ConnectScreen.tick port crates/horizon-client/src/game/remote.rs::Game::tick_remote ticks the pending session while it opens; game.rs tick sends remote sessions here
|
||||
ConnectScreen.init missing player: no Cancel button while connecting, only the status line; unsure whether Escape aborts the join
|
||||
ConnectScreen.extractRenderState port crates/horizon-client/src/game/remote.rs::Game::remote_overlay gap: minor: also draws the address line, vanilla draws only the status
|
||||
CreateBuffetWorldScreen.init missing minor: the buffet biome picker is not in Horizon's create-world flow
|
||||
CreateBuffetWorldScreen.repositionElements missing minor: layout of the buffet biome picker, which Horizon lacks
|
||||
CreateBuffetWorldScreen.updateButtonValidity missing minor: Done needs a biome in the buffet picker, which Horizon lacks
|
||||
CreateBuffetWorldScreen.BiomeList.filterEntries missing minor: biome search of the buffet picker, which Horizon lacks
|
||||
CreateBuffetWorldScreen.BiomeList.setSelected missing minor: biome selection of the buffet picker, which Horizon lacks
|
||||
CreateBuffetWorldScreen.BiomeList.Entry.extractContent missing minor: biome row of the buffet picker, which Horizon lacks
|
||||
CreateFlatWorldScreen.setConfig port crates/horizon-client/src/title/flat.rs::State::apply_share applies the preset or typed share text as the layers; gap: minor: the rows are not rebuilt separately
|
||||
CreateFlatWorldScreen.init port crates/horizon-client/src/title/flat.rs::buttons Remove Layer, Presets, Done and Cancel buttons
|
||||
CreateFlatWorldScreen.repositionElements skip:ui layout only; the list is laid out each frame in flat.rs::list_area
|
||||
CreateFlatWorldScreen.hasValidSelection inline crates/horizon-client/src/title/flat.rs::buttons Remove Layer is enabled only with a layer selected
|
||||
CreateFlatWorldScreen.DetailsList.populateList inline crates/horizon-client/src/title/flat.rs::draw_layers the layer rows are read from the settings each frame
|
||||
CreateFlatWorldScreen.DetailsList.resetRows inline crates/horizon-client/src/title/flat.rs::draw_layers nothing to rebuild; rows are drawn from the settings each frame
|
||||
CreateFlatWorldScreen.DetailsList.deleteLayer port crates/horizon-client/src/title/flat.rs::State::remove_selected removes the selected layer; gap: minor: the next selection after a delete is not checked
|
||||
CreateFlatWorldScreen.DetailsList.HeaderEntry.extractContent port crates/horizon-client/src/title/flat.rs::draw_layers Layer and Height column titles
|
||||
CreateFlatWorldScreen.DetailsList.HeaderEntry.getNarration skip:other narration text; Horizon has no narrator
|
||||
CreateFlatWorldScreen.DetailsList.LayerEntry.extractContent port crates/horizon-client/src/title/flat.rs::draw_layers slot, block name and the Top, Bottom or height label
|
||||
CreateFlatWorldScreen.DetailsList.LayerEntry.getDisplayItem port crates/horizon-client/src/title/flat.rs::layer_icon water and lava use the bucket sprites
|
||||
CreateFlatWorldScreen.DetailsList.LayerEntry.blitSlot port crates/horizon-client/src/title/flat.rs::slot slot frame and icon
|
||||
CreditsAndAttributionScreen.init port crates/horizon-client/src/options_ui.rs::OptionsUi::layout Credits page: Credits, Attribution and Licenses buttons; gap: unsure whether Attribution and Licenses open links here
|
||||
CreditsAndAttributionScreen.openCreditsScreen port crates/horizon-client/src/game/win.rs::Game::open_win_screen rolls the credits without the poem, then returns here
|
||||
DatapackLoadFailureScreen.init missing minor: Horizon loads no data packs, so there is no datapack failure screen
|
||||
DatapackLoadFailureScreen.extractRenderState missing minor: same as init, no datapack failure screen
|
||||
DeathScreen.exitToTitleScreen port crates/horizon-client/src/game/screens.rs::Game::death_confirm_answer Yes leaves the world; gap: minor: the leave and title hand-off is one close_world call
|
||||
DeathScreen.extractRenderState port crates/horizon-client/src/game/screens.rs::Game::draw_death_screen gap: minor: no draft-report badge on the title button (reporting service)
|
||||
DeathScreen.visitText port crates/horizon-client/src/game/screens.rs::Game::draw_death_screen title at double size, cause and score lines
|
||||
DeathScreen.mouseClicked port crates/horizon-client/src/game/screens.rs::Game::death_click buttons and the title confirm; gap: minor: a click on a link in the death text does nothing
|
||||
DeathScreen.tick inline crates/horizon-client/src/game/screens.rs::Game::draw_death_screen the 20-tick delay is checked as 1000 ms since death, on draw and on click
|
||||
DeathScreen.setButtonsActive inline crates/horizon-client/src/game/screens.rs::Game::draw_death_screen buttons are active once the 1000 ms delay has passed
|
||||
DirectJoinServerScreen.keyPressed port crates/horizon-client/src/game/startup_menu.rs::StartupMenu::title_key gap: player: Enter in the Direct Connection field does not join; title_key only confirms a rename
|
||||
DirectJoinServerScreen.init port crates/horizon-client/src/multiplayer.rs::Screen::buttons Direct Connection field with Join and Cancel (Screen::Direct arm)
|
||||
DirectJoinServerScreen.resize skip:ui layout only; Screen::Direct keeps the typed address
|
||||
DirectJoinServerScreen.onSelect port crates/horizon-client/src/multiplayer.rs::Screen::click Join returns the typed address as Outcome::Connect
|
||||
DirectJoinServerScreen.removed port crates/horizon-client/src/title.rs::Title::remember_direct_address saves the address to last_server; gap: minor: the options file write is not in this fn
|
||||
DirectJoinServerScreen.extractRenderState port crates/horizon-client/src/multiplayer.rs::Screen::draw title, label and address field (Screen::Direct arm)
|
||||
DisconnectedScreen.init port crates/horizon-client/src/multiplayer.rs::Screen::buttons reason text and the disconnected buttons; gap: minor: no Report to Server or open-report-folder button
|
||||
DisconnectedScreen.getNarrationMessage skip:other narration text; Horizon has no narrator
|
||||
ErrorScreen.init port crates/horizon-client/src/title.rs::Title::buttons Cancel button of the error mode (Mode::Error arm)
|
||||
ErrorScreen.extractRenderState port crates/horizon-client/src/title.rs::Title::draw the error title and message (Mode::Error arm)
|
||||
ErrorScreen.extractBackground port crates/horizon-client/src/title.rs::Title::draw gap: minor: the flat gradient is replaced by the title background
|
||||
FaviconTexture.forWorld port crates/horizon-client/src/title.rs::Title::icon the world row's icon texture
|
||||
FaviconTexture.forServer port crates/horizon-client/src/multiplayer.rs::ping_all server icon keyed by address, from the ping
|
||||
FaviconTexture.clear inline crates/horizon-client/src/multiplayer.rs::ping_all icon dropped when the ping has no favicon
|
||||
FileFixerAbortedScreen.getNarrationMessage skip:other narration text; Horizon has no narrator
|
||||
FileFixerAbortedScreen.init missing minor: no upgrade-aborted screen; Horizon has no world-fixer cancel flow
|
||||
FileFixerAbortedScreen.addButtons missing minor: Back and Report Bug buttons of the aborted-upgrade screen
|
||||
FileFixerAbortedScreen.keyPressed missing minor: Escape on the aborted-upgrade screen
|
||||
GenericMessageScreen.init port crates/horizon-client/src/level_loading.rs::draw_progress centred message line while a world opens; gap: minor: no progress bar, the text is the loader's stage line
|
||||
GenericMessageScreen.repositionElements skip:ui layout only
|
||||
GenericMessageScreen.extractBackground port crates/horizon-client/src/ui.rs::menu_background the menu background behind the message
|
||||
GenericWaitingScreen.createWaitingWithoutButton port crates/horizon-client/src/title.rs::Title::start_backup backup runs in the background; gap: minor: no waiting screen blocks input while it runs
|
||||
GenericWaitingScreen.createWaiting skip:service waiting screen while a report is sent (reporting)
|
||||
GenericWaitingScreen.createCompleted skip:service result screen after a report (reporting)
|
||||
GenericWaitingScreen.init skip:service layout of the report waiting screen (reporting)
|
||||
GenericWaitingScreen.tick skip:service the report button's delay (reporting)
|
||||
GenericWaitingScreen.extractRenderState missing minor: no waiting text while a backup runs; Horizon shows a toast (title.rs::Title::update_toast)
|
||||
GenericWaitingScreen.shouldCloseOnEsc skip:service Escape on the report waiting screen (reporting)
|
||||
GenericWaitingScreen.getNarrationMessage skip:other narration text; Horizon has no narrator
|
||||
InBedChatScreen.init port crates/horizon-client/src/game/chat.rs::Game::draw_chat_screen Leave Bed button over the chat; its click is in chat_click
|
||||
InBedChatScreen.onPlayerWokeUp port crates/horizon-client/src/game/chat.rs::Game::tick_in_bed_chat closes the chat, or turns it into the plain chat if text was typed; gap: minor: polled each tick, not on the wake event
|
||||
LevelLoadingScreen.updateNarratedWidget skip:other narration text; Horizon has no narrator
|
||||
LevelLoadingScreen.extractChunksForRendering port crates/horizon-client/src/level_loading.rs::draw chunk status colours; gap: minor: the debug red centre square is not drawn
|
||||
LevelLoadingScreen.getNetherPortalSprite port crates/horizon-client/src/hud_overlays.rs::portal_overlay draws the block/nether_portal sprite
|
||||
LoadingOverlay.extractRenderState port crates/horizon-client/src/game.rs::Game::render the reload screen's progress bar; gap: player: no Mojang logo and no fade in or out
|
||||
LoadingOverlay.tick port crates/horizon-client/src/game/server_packs.rs::Game::tick_server_packs finishes the reload; gap: minor: no fade-out before it finishes
|
||||
LoadingOverlay.isReadyToFadeOut missing minor: no one-second fade-in before the reload can finish
|
||||
LoadingOverlay.extractProgressBar port crates/horizon-client/src/level_loading.rs::draw_progress 200 by 2 bar; gap: minor: no fade alpha
|
||||
LoadingOverlay.LogoTexture.loadContents skip:other Horizon ships no Mojang logo (title_edition.rs)
|
||||
ManageServerScreen.init port crates/horizon-client/src/multiplayer.rs::Screen::buttons name and address fields, resource packs cycle, Done and Cancel (Screen::Edit arm)
|
||||
ManageServerScreen.resize skip:ui layout only; Screen::Edit keeps its fields
|
||||
ManageServerScreen.onAdd port crates/horizon-client/src/multiplayer.rs::Screen::click Done saves the name (default if empty) and the address
|
||||
ManageServerScreen.extractRenderState port crates/horizon-client/src/multiplayer.rs::Screen::draw labels and fields (Screen::Edit arm)
|
||||
MenuScreens.create port crates/horizon-client/src/game/remote.rs::Game::remote_open_screen server-opened menus; gap: minor: the screen is built from the packet title
|
||||
MenuScreens.register skip:data registry of menu types; Horizon reads them from tables
|
||||
MenuScreens.selfTest skip:debug startup check that every menu has a screen
|
||||
MenuScreens.ScreenConstructor.fromPacket port crates/horizon-client/src/game/remote.rs::Game::remote_open_screen builds the screen from the open-screen packet and sets the container menu
|
||||
NoticeWithLinkScreen.init missing minor: no symlink warning when a world or pack folder is a symlink
|
||||
NoticeWithLinkScreen.getNarrationMessage skip:other narration text; Horizon has no narrator
|
||||
OutOfMemoryScreen.init missing minor: unsure: no out-of-memory screen; Horizon does not handle allocation failures this way
|
||||
PauseScreen.added skip:service friend list listener on the pause screen (social)
|
||||
PauseScreen.init port crates/horizon-client/src/game/screens.rs::pause_buttons button layout; the title is drawn in draw_pause_menu
|
||||
PauseScreen.createPauseMenu port crates/horizon-client/src/game/screens.rs::pause_buttons gap: player: Report Bugs, Feedback and Player Reporting icons are inactive, and no Mods button
|
||||
PauseScreen.getCustomAdditions port crates/horizon-client/src/game/screens.rs::pause_buttons the server links row (links flag); gap: minor: only the server links dialog, the pause_screen_additions tag is not read
|
||||
PauseScreen.addCustomDialogButtons port crates/horizon-client/src/game/screens.rs::Game::pause_click Server Links button (id 11) opens the links screen
|
||||
PauseScreen.extractRenderState port crates/horizon-client/src/game/screens.rs::Game::draw_pause_menu gap: minor: no now-playing toast and no draft-report badge
|
||||
PauseScreen.rendersNowPlayingToast missing minor: unsure: no check of the music-toast option on the pause screen
|
||||
PauseScreen.openScreenButton inline crates/horizon-client/src/game/screens.rs::Game::pause_click the Advancements, Stats, Options and World Options actions
|
||||
PresetFlatWorldScreen.getLayerInfoFromString inline crates/horizon-client/src/title/flat.rs::FlatSettings::parse one layer of the share text, parsed in the same loop
|
||||
PresetFlatWorldScreen.getLayersInfoFromString port crates/horizon-client/src/title/flat.rs::FlatSettings::parse the share text's layers and biome; malformed text gives None
|
||||
PresetFlatWorldScreen.save port crates/horizon-client/src/title/flat.rs::FlatSettings::to_share the share text
|
||||
PresetFlatWorldScreen.init inline crates/horizon-client/src/title/flat.rs::buttons the share box and Select and Cancel buttons
|
||||
PresetFlatWorldScreen.resize skip:ui layout only; the screen keeps its state
|
||||
PresetFlatWorldScreen.extractRenderState port crates/horizon-client/src/title/flat.rs::draw_presets title, labels and share box
|
||||
PresetFlatWorldScreen.updateButtonValidity inline crates/horizon-client/src/title/flat.rs::buttons Select is enabled with a preset or a share text longer than 1
|
||||
PresetFlatWorldScreen.PresetsList.setSelected inline crates/horizon-client/src/title/flat.rs::State::select_preset selecting a preset fills the share text
|
||||
PresetFlatWorldScreen.PresetsList.keyPressed missing minor: unsure: no keyboard selection of a preset found in title/flat.rs
|
||||
PresetFlatWorldScreen.PresetsList.Entry.extractContent port crates/horizon-client/src/title/flat.rs::draw_presets preset icon and name
|
||||
PresetFlatWorldScreen.PresetsList.Entry.select port crates/horizon-client/src/title/flat.rs::State::select_preset fills the share text with the preset's layers
|
||||
PresetFlatWorldScreen.PresetsList.Entry.blitSlot port crates/horizon-client/src/title/flat.rs::slot slot frame and icon
|
||||
PrivacyConfirmLinkScreen.init skip:service privacy link confirm from the friends and online settings (social)
|
||||
PrivacyConfirmLinkScreen.addAdditionalText skip:service privacy link confirm from the friends and online settings (social)
|
||||
PrivacyConfirmLinkScreen.confirmLinkNow skip:service opens privacy links from the friends and online settings (social)
|
||||
ProgressScreen.extractRenderState port crates/horizon-client/src/game/saving.rs::Game::render_closing_save stage line and bar while the world saves; gap: minor: no header or percent text
|
||||
RecoverWorldDataScreen.<init> missing minor: no Recover World screen; save.rs only reads level.dat_old as a fallback
|
||||
RecoverWorldDataScreen.attemptRestore missing minor: no restore from level.dat_old in the menu
|
||||
RecoverWorldDataScreen.buildInfo missing minor: no issue summary for level.dat and level.dat_old
|
||||
RecoverWorldDataScreen.collectIssue missing minor: no issue check for level.dat and level.dat_old in the menu
|
||||
RecoverWorldDataScreen.repositionElements missing minor: layout of the Recover World screen, which Horizon lacks
|
||||
RecoverWorldDataScreen.getNarrationMessage skip:other narration text; Horizon has no narrator
|
||||
Screen.extractRenderStateWithTooltipAndSubtitles port crates/horizon-client/src/game.rs::Game::hud_layers draws the current screen's layer and tooltips; unsure about subtitles
|
||||
Screen.setInitialFocus skip:ui keyboard focus starts on the first widget; Horizon draws its own focus
|
||||
Screen.isInputCaptured port crates/horizon-client/src/title.rs::Title::has_caret_field gap: minor: only the title screen's text fields
|
||||
Screen.addWidget skip:ui widget list plumbing; Horizon draws each screen from its own state
|
||||
Screen.removeWidget skip:ui widget list plumbing; Horizon draws each screen from its own state
|
||||
Screen.getTooltipFromItem port crates/horizon-client/src/item_tooltip.rs::lines tooltip lines for an item
|
||||
Screen.defaultHandleGameClickEvent port crates/horizon-client/src/game/books.rs::Game::book_follow_link gap: minor: ShowDialog and custom click events are not handled here
|
||||
Screen.fadeWidgets missing minor: unsure: no fade of widgets found in title.rs
|
||||
Screen.extractPanorama port crates/horizon-client/src/gfx/panorama.rs::Panorama::draw the title panorama cube, drawn in the render pass
|
||||
Screen.extractMenuBackground port crates/horizon-client/src/ui.rs::menu_background the dirt background with blur
|
||||
Screen.extractMenuBackgroundTexture port crates/horizon-client/src/ui.rs::menu_background gap: minor: only the standard background texture
|
||||
Screen.isValidCharacterForName missing minor: only the structure block name field uses it, and Horizon has no structure block editor
|
||||
Screen.scheduleNarration skip:other narration timing; Horizon has no narrator
|
||||
Screen.shouldRunNarration skip:other narration gate; Horizon has no narrator
|
||||
Screen.handleDelayedNarration skip:other narration timing; Horizon has no narrator
|
||||
Screen.runNarration skip:other narration output; Horizon has no narrator
|
||||
Screen.updateNarratedWidget skip:other narration of widgets; Horizon has no narrator
|
||||
Screen.findNarratableWidget skip:other narration focus search; Horizon has no narrator
|
||||
Screen.updateNarratorStatus skip:other narrator option toggle only; Horizon has no narrator output
|
||||
TitleScreen.tick skip:service Realms notifications and the friend request count (social)
|
||||
TitleScreen.init port crates/horizon-client/src/title.rs::Title::buttons main menu buttons; the splash text is chosen at load (choose_splash)
|
||||
TitleScreen.getHorizontalPosition skip:ui layout of the icon row only
|
||||
TitleScreen.createNormalMenuOptions port crates/horizon-client/src/title.rs::Title::buttons gap: player: Minecraft Realms button is greyed out (service)
|
||||
TitleScreen.getMultiplayerDisabledReason missing minor: unsure: no ban check; Multiplayer is always enabled in title.rs
|
||||
TitleScreen.createDemoMenuOptions skip:other demo build only (isDemo); Horizon has no demo mode
|
||||
TitleScreen.checkDemoWorldPresence skip:other demo world only
|
||||
TitleScreen.extractRenderState port crates/horizon-client/src/title.rs::Title::draw version line and buttons
|
||||
TitleScreen.mouseClicked port crates/horizon-client/src/title.rs::Title::click gap: minor: no Realms notification popup to click
|
||||
TitleScreen.confirmDemo skip:other demo world reset only
|
||||
|
@@ -0,0 +1,149 @@
|
||||
WinScreen.wrapCreditsIO port crates/horizon-client/src/win_screen.rs::WinScreen::new reads the credits texts from the resource root; a failed read is logged and skipped
|
||||
WinScreen.extractRenderState port crates/horizon-client/src/win_screen.rs::WinScreen::draw logo, lines scrolled up, last line stops mid-screen; background and vignette are drawn here too
|
||||
WinScreen.extractVignette inline crates/horizon-client/src/win_screen.rs::WinScreen::draw credits_vignette sprite stretched over the screen
|
||||
WinScreen.extractMenuBackground port crates/horizon-client/src/win_screen.rs::WinScreen::menu_background menu background tiled and scrolled at half the text speed
|
||||
WorldOptionsScreen.init port crates/horizon-client/src/game/lan_screen.rs::Game::open_world_options reads difficulty, lock, LAN port and command/force settings when opened; layout is WorldOptions::buttons
|
||||
WorldOptionsScreen.createGameRulesButton inline crates/horizon-client/src/game/lan_screen.rs::Game::world_options_click GameRules arm opens the rules view; enabled state is in WorldOptions::active
|
||||
WorldOptionsScreen.createGameModeButton inline crates/horizon-client/src/game/lan_screen.rs::Game::world_options_click Default and Personal mode arms cycle the mode; enabled state is in WorldOptions::active
|
||||
WorldOptionsScreen.createAllowCommandsButton inline crates/horizon-client/src/game/lan_screen.rs::Game::world_options_click Cheats arm toggles commands; the hardcore lock is in WorldOptions::active
|
||||
WorldOptionsScreen.createRestrictionsButton inline crates/horizon-client/src/game/lan_screen.rs::Game::world_options_click Restrictions arm opens the restrictions view
|
||||
WorldOptionsScreen.multiplayerOptions inline crates/horizon-client/src/game/lan_screen.rs::Game::open_world_options LAN, port, guest command and force values are read at open; rows from WorldOptions::buttons; the LAN toggle is in world_options_click
|
||||
WorldOptionsScreen.updateGuestCommandAccessButton port crates/horizon-client/src/game/lan_screen.rs::WorldOptions::active command access is enabled only with LAN and commands; the shown value is derived in WorldOptions::label
|
||||
WorldOptionsScreen.updateForceGameModeButton port crates/horizon-client/src/game/lan_screen.rs::WorldOptions::active enabled only with LAN, no guest commands and not hardcore; gap: minor: vanilla forces the saved flag on when LAN is off or hardcore, Horizon keeps the stored flag and only shows it on
|
||||
WorldOptionsScreen.hasChanges port crates/horizon-client/src/game/lan_screen.rs::WorldOptions::changed Apply is enabled when a setting differs and the port is valid
|
||||
WorldOptionsScreen.applyChanges port crates/horizon-client/src/game/lan_screen.rs::Game::apply_world_options sends difficulty and lock changes, applies modes, commands, guest and force settings, then opens or closes LAN
|
||||
WorldOptionsScreen.repositionElements skip:ui layout only: scroll area and footer placement
|
||||
WorldOptionsScreen.extractMenuBackground port crates/horizon-client/src/game/lan_screen.rs::Game::draw_options_view in-world background and the list background under the content
|
||||
WorldOptionsScreen.extractRenderState port crates/horizon-client/src/game/lan_screen.rs::Game::draw_options_view header and footer separators and the widgets
|
||||
WorldOptionsScreen.onGamemasterPermissionChanged port crates/horizon-client/src/game/lan_screen.rs::Game::remote_world_options_permission losing permission on a server closes the screen; gap: minor: the default and personal modes are not reset as updatePermissionDependentButtons does
|
||||
WorldOptionsScreen.updatePermissionDependentButtons inline crates/horizon-client/src/game/lan_screen.rs::Game::world_options_click the Cheats arm resets default and personal mode to the saved default when commands turn off; gap: minor: the remote permission path does not do this
|
||||
WorldOptionsScreen.updatePersonalGameModeButton missing minor: a personal mode changed while the options are open is not shown; Horizon reads the modes once when the screen opens
|
||||
WorldOptionsScreen.onDefaultGameModeChanged missing minor: a default mode changed while the options are open is not shown; Horizon reads the modes once when the screen opens
|
||||
WorldOptionsScreen.hasSettingsChanges inline crates/horizon-client/src/game/lan_screen.rs::WorldOptions::changed compares every setting against the values read at open
|
||||
WorldOptionsScreen.lanPortChanged inline crates/horizon-client/src/game/lan_screen.rs::WorldOptions::snapshot the port is part of the snapshot only while LAN is on
|
||||
WorldOptionsScreen.changeMultiplayerScope inline crates/horizon-client/src/game/lan_screen.rs::Game::apply_world_options closes LAN and reopens it on the new port when the scope or port changed
|
||||
WorldOptionsScreen.sendPublishMessage inline crates/horizon-client/src/game/lan_screen.rs::Game::apply_world_options publish started, failed or stopped line in chat via system_message
|
||||
WorldOptionsScreen.updatePortControlsState inline crates/horizon-client/src/game/lan_screen.rs::Game::world_options_click Lan arm drops port focus; gap: minor: vanilla clears the port text when LAN is switched off and refills it from the saved port when on, Horizon keeps the typed text
|
||||
WorldOptionsScreen.tryParsePort port crates/horizon-client/src/game/lan_screen.rs::WorldOptions::parsed_port blank uses the suggested port; 1024 to 65535 accepted; gap: minor: no port-in-use check and no error message, only the red colour from draw_options_view
|
||||
WorldOptionsScreen.setPortError inline crates/horizon-client/src/game/lan_screen.rs::Game::draw_options_view port text turns red when invalid; gap: minor: no error tooltip
|
||||
WorldOptionsScreen.DifficultyButtons.create inline crates/horizon-client/src/game/lan_screen.rs::Game::open_world_options difficulty read at open; the cycle and lock arms are in world_options_click
|
||||
WorldOptionsScreen.DifficultyButtons.refresh port crates/horizon-client/src/game/lan_screen.rs::WorldOptions::server_difficulty a server's difficulty and lock update the screen; gap: minor: it also resets the baseline, so Apply no longer sees the change
|
||||
WorldOptionsScreen.DifficultyButtons.isDifficultyLocked inline crates/horizon-client/src/game/lan_screen.rs::Game::open_world_options locked when the level is locked or hardcore; the lock button's enabled state is in WorldOptions::active
|
||||
StatsScreen.onStatsUpdated inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats the lists are rebuilt from the stored values on every draw; the AwardStats arm in remote.rs only stores them
|
||||
StatsScreen.setTabActiveStateAndTooltip missing player: an empty Items or Mobs tab stays selectable with no 'No statistics found' tooltip
|
||||
StatsScreen.repositionElements skip:ui layout only: tab bar placement and header height
|
||||
StatsScreen.keyPressed missing minor: no keyboard tab switching on the statistics screen; Escape still closes it
|
||||
StatsScreen.extractRenderState inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats footer separator is drawn with the tab bar in draw_stats
|
||||
StatsScreen.extractMenuBackground inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats background drawn at the start of draw_stats
|
||||
StatsScreen.GeneralStatisticsList.Entry.getValueText port crates/horizon-client/src/game/stats_screen.rs::format value text by the stat's format (time, distance, tenths, plain)
|
||||
StatsScreen.GeneralStatisticsList.Entry.extractContent port crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats General rows: name left, value right
|
||||
StatsScreen.GeneralStatisticsList.Entry.getNarration skip:other narration text for screen readers; Horizon has no narrator output
|
||||
StatsScreen.ItemStatisticsList.<init> port crates/horizon-client/src/game/stats_screen.rs::Game::stat_items items with a non-zero count in any column, block items included
|
||||
StatsScreen.ItemStatisticsList.getColumn inline crates/horizon-client/src/game/stats_screen.rs::Game::stat_items the column index selects COLUMNS directly
|
||||
StatsScreen.ItemStatisticsList.getColumnIndex inline crates/horizon-client/src/game/stats_screen.rs::Game::stats_click the sort state keeps the column index, so no reverse lookup is needed
|
||||
StatsScreen.ItemStatisticsList.sortByColumn inline crates/horizon-client/src/game/stats_screen.rs::Game::stats_click header click cycles descending, ascending, then off
|
||||
StatsScreen.ItemStatisticsList.sortItems inline crates/horizon-client/src/game/stats_screen.rs::Game::stat_items sorts by the chosen column; gap: minor: equal counts keep insertion order instead of item id order
|
||||
StatsScreen.ItemStatisticsList.getItemRows skip:java copies the item rows out of the list widget
|
||||
StatsScreen.ItemStatisticsList.HeaderEntry.extractContent port crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats column header row with the sort arrow on the sorted column
|
||||
StatsScreen.ItemStatisticsList.HeaderEntry.StatSortButton.extractContents inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats slot background and column icon per header cell
|
||||
StatsScreen.ItemStatisticsList.ItemRow.extractContent port crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats item slot and the block and item stat cells per row
|
||||
StatsScreen.ItemStatisticsList.ItemRow.extractStat inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats cell value right-aligned in its column
|
||||
StatsScreen.ItemStatisticsList.ItemRow.ItemRowWidget.extractWidgetRenderState inline crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats slot background and item icon
|
||||
StatsScreen.ItemStatisticsList.ItemRow.ItemRowWidget.extractTooltip missing player: hovering an item in the Items tab shows no item tooltip
|
||||
StatsScreen.ItemStatisticsList.ItemRowComparator.compare inline crates/horizon-client/src/game/stats_screen.rs::Game::stat_items orders by the sorted column; gap: minor: non-block items count as 0 in block columns (vanilla -1), and ties are not broken by item id
|
||||
StatsScreen.MobsStatisticsList.MobRow.extractContent port crates/horizon-client/src/game/stats_screen.rs::Game::draw_stats mob name, kills and killed-by lines
|
||||
StatsScreen.MobsStatisticsList.MobRow.getNarration skip:other narration text for screen readers; Horizon has no narrator output
|
||||
StatsScreen.StatisticsTab.doLayout skip:ui layout only: list size and position
|
||||
AdvancementTab.copyPosition inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_cache a rebuilt tree keeps adv_ui.scroll; tab bounds are recomputed in adv_view
|
||||
AdvancementTab.extractTab port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements tab sprite per position (first, middle, last) and selected state
|
||||
AdvancementTab.extractIcon port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements tab icon at its side offset
|
||||
AdvancementTab.extractContents port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements background grid, connection lines and advancement widgets inside the 234 by 113 area
|
||||
AdvancementTab.extractTooltips port crates/horizon-client/src/game/advancements_screen.rs::Game::adv_draw_hover hovered advancement card; gap: minor: the fade fill is drawn in draw_advancements
|
||||
AdvancementTab.scroll port crates/horizon-client/src/game/advancements_screen.rs::Game::adv_scroll_by clamps the scroll to the tab bounds on each axis
|
||||
AdvancementTab.canScrollHorizontally inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_scroll_by scrolls only when the bounds are wider than 234
|
||||
AdvancementTab.canScrollVertically inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_scroll_by scrolls only when the bounds are taller than 113
|
||||
AdvancementTab.addAdvancement inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_view tasks of each tab are placed in the view's widget list
|
||||
AdvancementTab.addWidget inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_view tab bounds grown by each widget (28 by 27)
|
||||
AdvancementTabType.extractRenderState port crates/horizon-client/src/game/advancements_screen.rs::tab_sprite first, middle or last sprite, selected variant
|
||||
AdvancementTabType.extractIcon port crates/horizon-client/src/game/advancements_screen.rs::icon_offset icon offset per side
|
||||
AdvancementTabType.getX port crates/horizon-client/src/game/advancements_screen.rs::tab_pos x per side and index
|
||||
AdvancementTabType.getY port crates/horizon-client/src/game/advancements_screen.rs::tab_pos y per side and index
|
||||
AdvancementTabType.isMouseOver inline crates/horizon-client/src/game/advancements_screen.rs::Game::advancements_mouse tab hit test with strict edges on click
|
||||
AdvancementWidget.<init> port crates/horizon-client/src/game/advancements_screen.rs::Game::adv_widget_text title split at 163 px, description wrapped, widget width
|
||||
AdvancementWidget.createWidget inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_view only advancements with a display get a widget
|
||||
AdvancementWidget.getMaxProgressWidth inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_widget_text width of the progress text when there is more than one requirement
|
||||
AdvancementWidget.getMaxWidth inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_widget_text widest line of the wrapped description
|
||||
AdvancementWidget.findOptimalLines inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_widget_text offsets 0, 10, -10, 25, -25 and the 10 px tolerance
|
||||
AdvancementWidget.findFirstVisibleParent inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_view nearest displayed ancestor becomes the parent
|
||||
AdvancementWidget.extractConnectivity port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements connection lines, background pass then the line pass
|
||||
AdvancementWidget.extractRenderState port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements frame sprite (obtained or not) and the item icon
|
||||
AdvancementWidget.extractMultilineText inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_draw_hover description lines in the hover card
|
||||
AdvancementWidget.isMouseOver port crates/horizon-client/src/game/advancements_screen.rs::Game::adv_tick_hover 26 px box hit test; hidden advancements count only when done
|
||||
AdvancementWidget.attachToParent inline crates/horizon-client/src/game/advancements_screen.rs::Game::adv_view parent link set when the view is built
|
||||
AdvancementsScreen.init port crates/horizon-client/src/game/advancements_screen.rs::Game::open_advancements opens on the kept tab; gap: minor: no tab pages with < and > buttons, the view shows at most 26 tabs
|
||||
AdvancementsScreen.repositionElements skip:ui layout only: window position
|
||||
AdvancementsScreen.removed missing minor: the server is not sent the closed-screen packet when the advancements screen closes
|
||||
AdvancementsScreen.tick port crates/horizon-client/src/game/advancements_screen.rs::Game::adv_tick_hover hover tracking and card fade; gap: minor: runs from the frame, not the 20 Hz tick
|
||||
AdvancementsScreen.mouseClicked port crates/horizon-client/src/game/advancements_screen.rs::Game::advancements_mouse left click selects a tab, Done closes; gap: minor: tab pages are not filtered
|
||||
AdvancementsScreen.keyPressed port crates/horizon-client/src/game.rs::Game::key_pressed the advancements key (L) closes the screen
|
||||
AdvancementsScreen.extractRenderState port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements window, tabs and contents; gap: minor: no 'page / pages' text
|
||||
AdvancementsScreen.mouseDragged port crates/horizon-client/src/game/advancements_screen.rs::Game::advancements_drag first movement starts scrolling, later ones move the tree
|
||||
AdvancementsScreen.mouseScrolled port crates/horizon-client/src/game/advancements_screen.rs::Game::advancements_scroll wheel scrolls 16 px per step
|
||||
AdvancementsScreen.extractInside port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements 'no advancements' placeholder when there is no tab
|
||||
AdvancementsScreen.extractWindow port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements window background, tab bar and the selected tab title (window() gives the position)
|
||||
AdvancementsScreen.extractTooltips port crates/horizon-client/src/game/advancements_screen.rs::Game::draw_advancements tab title tooltips; the card tooltip comes from adv_draw_hover
|
||||
AdvancementsScreen.onAdvancementsUpdated port crates/horizon-client/src/game/advancements_screen.rs::Game::adv_cache a changed tree rebuilds the positions; tabs and progress are read in adv_view and at draw time
|
||||
AdvancementsScreen.getAdvancementWidget skip:java lookup of a widget by node; Horizon indexes positions by tree index
|
||||
DebugOptionsScreen.init missing minor: no F3+F6 debug entry editor; the F3 overlay footer still says 'To edit: press [F3+F6]' (debug_overlay.rs)
|
||||
DebugOptionsScreen.addProfileButton missing minor: no debug profile buttons (default and performance)
|
||||
DebugOptionsScreen.repositionElements missing minor: layout of the missing debug entry editor
|
||||
DebugOptionsScreen.CategoryEntry.extractContent missing minor: category headings of the missing debug entry editor
|
||||
DebugOptionsScreen.OptionEntry.<init> missing minor: per-entry always, overlay and never buttons of the missing editor
|
||||
DebugOptionsScreen.OptionEntry.narrateButton skip:other narration text for screen readers
|
||||
DebugOptionsScreen.OptionEntry.setValue missing minor: sets an entry's status in the missing editor
|
||||
DebugOptionsScreen.OptionEntry.extractContent missing minor: draws the entry row of the missing editor
|
||||
DebugOptionsScreen.OptionEntry.refreshEntry missing minor: refreshes the buttons of the missing editor
|
||||
DebugOptionsScreen.OptionList.updateSearch missing minor: search filter of the missing debug entry editor
|
||||
GameModeSwitcherScreen.getDefaultSelected port crates/horizon-client/src/game_mode_switcher.rs::GameModeSwitcher::new previous mode, else the opposite of the current one
|
||||
GameModeSwitcherScreen.init port crates/horizon-client/src/game/gamemode_switcher.rs::Game::open_gamemode_switcher opens with the selection state; slot positions are computed in draw
|
||||
GameModeSwitcherScreen.extractRenderState port crates/horizon-client/src/game/gamemode_switcher.rs::Game::draw_gamemode_switcher title, help line, slots, selection and hover
|
||||
GameModeSwitcherScreen.extractBackground port crates/horizon-client/src/game/gamemode_switcher.rs::Game::draw_gamemode_switcher background sprite centred above the slots
|
||||
GameModeSwitcherScreen.switchToHoveredGameMode port crates/horizon-client/src/game/gamemode_switcher.rs::Game::close_gamemode_switcher applies the selected mode on close when gamemaster and it differs
|
||||
GameModeSwitcherScreen.keyPressed port crates/horizon-client/src/game/debug_keys.rs::Game::debug_key the switch key cycles the selection
|
||||
GameModeSwitcherScreen.keyReleased port crates/horizon-client/src/game/debug_keys.rs::Game::debug_key releasing the debug modifier applies and closes
|
||||
GameModeSwitcherScreen.mouseReleased missing minor: a debug modifier bound to a mouse button does not close the switcher; debug keys are keyboard only
|
||||
GameModeSwitcherScreen.GameModeIcon.getNext port crates/horizon-client/src/game_mode_switcher.rs::GameModeSwitcher::cycle creative, survival, adventure, spectator, then creative
|
||||
GameModeSwitcherScreen.GameModeIcon.getFromGameType inline crates/horizon-client/src/game/gamemode_switcher.rs::Game::close_gamemode_switcher compares the chosen mode with the current one before sending
|
||||
GameModeSwitcherScreen.GameModeSlot.extractWidgetRenderState inline crates/horizon-client/src/game/gamemode_switcher.rs::Game::draw_gamemode_switcher slot, selection frame and icon per mode
|
||||
GameModeSwitcherScreen.GameModeSlot.extractSlot inline crates/horizon-client/src/game/gamemode_switcher.rs::Game::draw_gamemode_switcher slot sprite
|
||||
GameModeSwitcherScreen.GameModeSlot.extractSelection inline crates/horizon-client/src/game/gamemode_switcher.rs::Game::draw_gamemode_switcher selection sprite
|
||||
ButtonListDialogScreen.populateBodyElements port crates/horizon-client/src/dialog_screen.rs::columns action buttons packed into the dialog's columns
|
||||
ButtonListDialogScreen.updateHeaderAndFooter port crates/horizon-client/src/dialog_screen.rs::Layout::new exit button in the footer, else a 5 pixel footer
|
||||
DialogControlSet.addInput port crates/horizon-client/src/dialog_screen.rs::input gap: player: single-option and number-range inputs get no control, so their value cannot be changed
|
||||
DialogControlSet.createDialogButton port crates/horizon-client/src/dialog_screen.rs::Layout::new button width from the dialog; gap: minor: no button tooltips
|
||||
DialogControlSet.bindAction port crates/horizon-client/src/dialog.rs::Action::click reads the inputs' current values into the action when clicked
|
||||
DialogControlSet.createActionButton port crates/horizon-client/src/game/dialogs.rs::Game::dialog_click button press runs the action through run_dialog_action
|
||||
DialogListDialogScreen.createDialogClickAction missing player: a dialog list shows no entry buttons; only its exit button is drawn
|
||||
DialogScreen.repositionElements skip:ui layout only: body scroll height and warning clamp, both in Layout::new
|
||||
DialogScreen.createTitleWithWarningButton skip:ui layout only: title row, warning button 10 px right of the title in Layout::new
|
||||
DialogScreen.makeSureWarningButtonIsInBounds port crates/horizon-client/src/dialog_screen.rs::Layout::in_bounds moves the warning button on screen when it is off
|
||||
DialogScreen.createWarningButton port crates/horizon-client/src/game/dialogs.rs::Game::dialog_click warning rect opens the warning; gap: minor: no hover tooltip
|
||||
DialogScreen.handleDialogClickEvent port crates/horizon-client/src/game/dialogs.rs::Game::run_dialog_action gap: player: open-URL, suggest-command and change-page buttons only log and do nothing
|
||||
DialogScreens.createFromData port crates/horizon-client/src/game/dialogs.rs::Game::show_dialog picks the screen from the dialog's kind
|
||||
DialogScreens.bootstrap skip:data registers screen factories by codec
|
||||
ServerLinksDialogScreen.createListActions port crates/horizon-client/src/game/server_links.rs::Game::server_links the server's links
|
||||
ServerLinksDialogScreen.createDialogClickAction port crates/horizon-client/src/game/server_links.rs::Game::click_link opens the link (prompt or browser by setting)
|
||||
SimpleDialogScreen.updateHeaderAndFooter port crates/horizon-client/src/dialog_screen.rs::Layout::new main action buttons side by side in the footer, 8 px apart
|
||||
WaitingForResponseScreen.init port crates/horizon-client/src/dialog_screen.rs::waiting_button Back button starts hidden and inactive
|
||||
WaitingForResponseScreen.tick port crates/horizon-client/src/dialog_screen.rs::waiting_button Back shows after a second with a countdown label, works after five seconds
|
||||
DialogBodyHandlers.createBodyElement port crates/horizon-client/src/dialog_screen.rs::Layout::new gap: player: item bodies are dropped (Body::Item gives no element)
|
||||
DialogBodyHandlers.bootstrap skip:data registers body handlers
|
||||
DialogBodyHandlers.runActionOnParent missing player: clicking text in a dialog message or item description does nothing; dialog_click only tests fields, checkboxes and buttons
|
||||
DialogBodyHandlers.ItemHandler.createControls missing player: an item body (icon and description) is not drawn in a dialog
|
||||
DialogBodyHandlers.PlainMessageHandler.createControls port crates/horizon-client/src/dialog_screen.rs::message centred wrapped text; gap: player: text clicks do nothing
|
||||
InputControlHandlers.createHandler port crates/horizon-client/src/dialog_screen.rs::input dispatch by control type; unknown types are dropped
|
||||
InputControlHandlers.bootstrap skip:data registers input handlers
|
||||
InputControlHandlers.BooleanHandler.addControl port crates/horizon-client/src/dialog_screen.rs::input checkbox with its label; toggled in dialog_click
|
||||
InputControlHandlers.NumberRangeHandler.addControl missing player: a number-range input (slider) in a dialog has no control
|
||||
InputControlHandlers.SingleOptionHandler.addControl missing player: a single-option input in a dialog has no control
|
||||
InputControlHandlers.TextInputHandler.addControl port crates/horizon-client/src/dialog_screen.rs::input gap: player: multiline inputs are drawn as one 20 px line and the line limit is not used
|
||||
|
@@ -0,0 +1,79 @@
|
||||
AbstractFriendsEntryContainerWidget skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
AbstractFriendsTab skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
AddFriendWidget skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
FriendEntry skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
FriendsListConfirmScreen skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
FriendsOverlayScreen skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
FriendsOverlayTabButton skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
FriendsTab skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
IncomingEntry skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
OutgoingEntry skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
PendingTab skip:service Mojang friends service UI (friend list, requests, presence): service. Horizon's Friends button opens its own invite-code screen (game/screens.rs)
|
||||
EffectsInInventory.extractRenderState port crates/horizon-client/src/game/potions.rs::Game::draw_inventory_effects panel layout and visibility beside the survival and creative inventories; drawn by inventory_effects::paint
|
||||
EffectsInInventory.extractEffects port crates/horizon-client/src/inventory_effects.rs::paint one row per effect: icon, then text and background
|
||||
EffectsInInventory.extractBackground port crates/horizon-client/src/inventory_effects.rs::background nine-slice panel background, ambient variant included
|
||||
EffectsInInventory.extractText port crates/horizon-client/src/inventory_effects.rs::paint name and duration text, clipping with ..., hover tooltip for compact panels
|
||||
EffectsInInventory.getEffectName inline crates/horizon-client/src/inventory_effects.rs::panels name plus level suffix for amplifier 1-9, folded into panels
|
||||
EnchantmentNames.getRandomName inline crates/horizon-client/src/game/stations.rs::Game::draw_station galactic word names from the enchant seed (WORDS), drawn in the enchanting option slots
|
||||
EnchantmentScreen.init skip:ui creates the book model for drawing only; the book itself is not drawn (see extractBook)
|
||||
EnchantmentScreen.containerTick port crates/horizon-client/src/game/locator_bar.rs::Game::track_experience_display gap: player: keeps the experience bar up while the table is open; the book tick (tickBook) is not run
|
||||
EnchantmentScreen.extractBook missing player: the enchanting table has no open 3D book; only the flat table is drawn, so the book never opens when an item is placed
|
||||
EnchantmentScreen.tickBook missing player: the book's open and page-flip animation (driven by the offers) is not run; the table stays flat
|
||||
GrindstoneScreen.extractBackground inline crates/horizon-client/src/game/stations.rs::Game::draw_station grindstone texture and the error sprite when an input is set and there is no result
|
||||
HangingSignEditScreen.extractSignBackground port crates/horizon-client/src/game/sign_edit.rs::Game::draw_sign_editor hanging sign board at 4.5x scale
|
||||
HopperScreen.extractBackground port crates/horizon-client/src/game/machines.rs::Game::draw_machine_screen hopper background for block and minecart hoppers
|
||||
HorseInventoryScreen.shouldRenderSaddleSlot port crates/horizon-client/src/game/mount_menu.rs::shows_saddle saddle slot shown for every mount except llamas
|
||||
HorseInventoryScreen.shouldRenderArmorSlot port crates/horizon-client/src/game/mount_menu.rs::shows_body armour slot for horse armour wearers and llamas
|
||||
InventoryScreen.containerTick missing minor: a survival inventory that stays open when the game mode becomes creative is not switched to the creative screen
|
||||
InventoryScreen.init inline crates/horizon-client/src/game.rs::Game::key_pressed gap: minor: the creative screen is chosen when E opens the inventory; no switch while a survival screen is already open
|
||||
InventoryScreen.getRecipeBookButtonPosition port crates/horizon-client/src/game/recipe_book.rs::Game::book_button_pos book button at (leftPos+104, height/2-22), same as the crafting placement
|
||||
InventoryScreen.extractLabels inline crates/horizon-client/src/game.rs::Game::draw_inventory Crafting title at x 97 in the survival inventory
|
||||
InventoryScreen.extractRenderState inline crates/horizon-client/src/game.rs::Game::draw_inventory effect panels (draw_inventory_effects), slots and widgets
|
||||
InventoryScreen.extractBackground inline crates/horizon-client/src/game.rs::Game::draw_inventory background texture and the player preview (draw_inventory_player)
|
||||
InventoryScreen.extractEntityInInventoryFollowsMouse port crates/horizon-client/src/game/perspective.rs::Game::draw_player_preview gap: minor: player only; mounts use mount_menu.rs::draw_mob_preview. Head and body turn toward the cursor as vanilla
|
||||
InventoryScreen.mouseReleased inline crates/horizon-client/src/game.rs::Game::inventory_mouse_release release goes through the slot path; a recipe-book press is handled first and has no separate release flag
|
||||
ItemCombinerScreen.extractBackground inline crates/horizon-client/src/game/stations.rs::Game::draw_station anvil and smithing backgrounds, with the error sprite
|
||||
JigsawBlockEditScreen missing player: creative operators cannot open a jigsaw block's editor; no jigsaw UI exists in Horizon
|
||||
LecternScreen.createMenuControls inline crates/horizon-client/src/game/books.rs::Game::draw_book gap: player: Take Book and Done are drawn on every lectern; vanilla shows Take Book only with build permission (mayBuild)
|
||||
LoomScreen.init skip:ui bakes the banner flag model for the preview; the loom is drawn by screen_layout::loom
|
||||
LoomScreen.isScrollBarActive port crates/horizon-client/src/game/loom.rs::LoomState::offscreen_rows gap: minor: more than 16 patterns (four rows of four); the displayPatterns check is at the call sites
|
||||
LoomScreen.extractBannerOnButton port crates/horizon-client/src/game/loom.rs::Game::paint_screen grey square and pattern sprite on each pattern button (Fill and Atlas draws from screen_layout::loom)
|
||||
LoomScreen.hasClickedOutside port crates/horizon-client/src/game.rs::Game::clicked_outside outside test against the container rectangle, plus the recipe book area
|
||||
MerchantScreen.postButtonClick port crates/horizon-client/src/game/trading.rs::Game::try_move_items selection hint, move the offer's items, and the SelectTrade packet on a server
|
||||
MerchantScreen.init skip:ui trade buttons are laid out in draw_merchant and hit-tested in merchant_click
|
||||
MerchantScreen.extractLabels inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant title with the trader level, Trades and Inventory labels
|
||||
MerchantScreen.extractBackground inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant villager background and the out-of-stock sprite
|
||||
MerchantScreen.extractProgressBar inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant experience bar, with the pending trade's XP
|
||||
MerchantScreen.extractScroller inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant gap: minor: no pointing or resize cursor over the scroller
|
||||
MerchantScreen.extractContents inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant the seven offer rows from the scroll offset
|
||||
MerchantScreen.extractButtonArrows inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant trade arrow, and the out-of-stock arrow
|
||||
MerchantScreen.extractAndDecorateCostA inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant discount: base count struck through, new count drawn (merchant.rs cost_a)
|
||||
MerchantScreen.mouseScrolled port crates/horizon-client/src/game/trading.rs::Game::merchant_scroll gap: minor: one offer per wheel step; vanilla uses the float scroll amount
|
||||
MerchantScreen.mouseDragged missing player: dragging the trade list scroller does nothing; only the mouse wheel scrolls the offers
|
||||
MerchantScreen.mouseClicked port crates/horizon-client/src/game/trading.rs::Game::merchant_click gap: player: clicking the scroller does not start a drag (see mouseDragged); the offer buttons work
|
||||
MerchantScreen.TradeOfferButton.extractToolTip inline crates/horizon-client/src/game/trading.rs::Game::draw_merchant item tooltip for cost A, cost B or the result under the hovered offer
|
||||
MinecartCommandBlockEditScreen.populateAndSendPacket missing player: a command block minecart never opens its command editor (minecarts.rs CartKind::CommandBlock is never usable), so its command cannot be set
|
||||
PageButton.extractContents inline crates/horizon-client/src/game/books.rs::Game::draw_book page arrows with their hover sprites (page_buttons)
|
||||
ShulkerBoxScreen.extractBackground port crates/horizon-client/src/game/storage.rs::Game::draw_chest_screen shulker box background texture, drawn with the other container screens
|
||||
SignEditScreen.extractSignBackground port crates/horizon-client/src/game/sign_edit.rs::Game::draw_sign_editor sign board at 3.9x scale, wall signs at 12 rows
|
||||
SmithingScreen.containerTick missing player: the empty template slot shows one fixed netherite icon; the cycling template icons and the base and addition slot icons are not drawn
|
||||
SmithingScreen.getTemplateItem missing minor: helper for the slot icons only; Horizon has no template lookup for icons
|
||||
SmithingScreen.extractRenderState inline crates/horizon-client/src/game/stations.rs::Game::draw_station gap: player: onboarding tooltips for empty slots are missing (see extractOnboardingTooltips)
|
||||
SmithingScreen.extractBackground inline crates/horizon-client/src/game/stations.rs::Game::draw_station gap: player: the armour stand preview beside the slots is not drawn
|
||||
SmithingScreen.updateArmorStandPreview missing player: no armour stand preview of the item being upgraded is built, so nothing is drawn beside the slots
|
||||
SmithingScreen.extractErrorIcon inline crates/horizon-client/src/game/stations.rs::Game::draw_station error sprite at (65, 46) when all inputs are set and there is no result
|
||||
SmithingScreen.extractOnboardingTooltips inline crates/horizon-client/src/game/stations.rs::Game::draw_station gap: player: only the upgrade error tooltip exists; the missing-template and slot description tooltips are not drawn
|
||||
StonecutterScreen.extractBackground inline crates/horizon-client/src/game/stations.rs::Game::draw_station background, scroller and the recipe grid
|
||||
StonecutterScreen.extractTooltip inline crates/horizon-client/src/game/stations.rs::Game::draw_station tooltip of the hovered recipe result
|
||||
StonecutterScreen.extractButtons inline crates/horizon-client/src/game/stations.rs::Game::draw_station recipe cell sprites: selected and highlighted
|
||||
StonecutterScreen.extractRecipes inline crates/horizon-client/src/game/stations.rs::Game::draw_station recipe result icons in the grid
|
||||
StonecutterScreen.mouseDragged missing player: the recipe list scroller cannot be dragged; only the mouse wheel scrolls it
|
||||
StonecutterScreen.mouseScrolled port crates/horizon-client/src/game/stations.rs::Game::station_scroll one row of recipes per wheel step, only with more than 12 recipes
|
||||
StonecutterScreen.isScrollBarActive inline crates/horizon-client/src/game/stations.rs::Game::station_scroll more than 12 visible recipes
|
||||
StonecutterScreen.getOffscreenRows inline crates/horizon-client/src/game/stations.rs::Game::station_scroll rows beyond the 3 visible rows, ceil(recipes/4) - 3
|
||||
StructureBlockEditScreen missing player: creative operators cannot open a structure block's editor; no structure block UI exists in Horizon
|
||||
TestBlockEditScreen missing player: creative operators cannot open a test block's editor; gametest setup has no UI in Horizon
|
||||
TestInstanceBlockEditScreen missing player: creative operators cannot open a test instance block's editor; gametest setup has no UI in Horizon
|
||||
BelowOrAboveWidgetTooltipPositioner.positionTooltip missing minor: unsure: widget-anchored tooltip placement (below the widget, flipped above when it does not fit); Horizon places tooltips at the cursor (ui::tooltip)
|
||||
ClientActivePlayersTooltip.getWidth missing player: hovering a server's player count in the server list shows no online player names; the ping sample is not read (multiplayer.rs)
|
||||
ClientActivePlayersTooltip.extractImage missing player: no online player heads and names are drawn for a server; the ping sample is not read (multiplayer.rs)
|
||||
|
@@ -0,0 +1,139 @@
|
||||
ClientBundleTooltip.extractEmptyBundleTooltip port crates/horizon-client/src/game/stations.rs::Game::draw_bundle_tooltip empty branch: description, bar and label drawn from the layout
|
||||
ClientBundleTooltip.extractBundleWithItemsTooltip port crates/horizon-items/src/bundle.rs::tooltip_layout gap: player: the selected item's name box above the grid is not drawn (extractSelectedItemTooltip); grid and bar placement are here
|
||||
ClientBundleTooltip.getShownItems port crates/horizon-items/src/bundle.rs::Contents::shown shown count (getNumberOfItemsToShow) and the visible items
|
||||
ClientBundleTooltip.shouldRenderSurplusText inline crates/horizon-items/src/bundle.rs::tooltip_layout overflow cell is the first cell of the first row when items are hidden
|
||||
ClientBundleTooltip.getAmountOfHiddenItems port crates/horizon-items/src/bundle.rs::Contents::shown hidden count is the second return value
|
||||
ClientBundleTooltip.extractSlot port crates/horizon-client/src/game/stations.rs::Game::draw_bundle_tooltip slot background or highlight sprite, item, and front highlight
|
||||
ClientBundleTooltip.extractCount port crates/horizon-client/src/game/stations.rs::Game::draw_bundle_tooltip the +N label in the overflow cell
|
||||
ClientBundleTooltip.extractSelectedItemTooltip missing player: when a bundle item is selected with the scroll wheel, vanilla shows that item's name in a box above the bundle; Horizon draws only the slot highlight
|
||||
ClientBundleTooltip.extractProgressbar port crates/horizon-client/src/game/stations.rs::Game::draw_bundle_tooltip fill, border and label sprites at the layout's bar position
|
||||
ClientBundleTooltip.getEmptyBundleDescriptionTextHeight inline crates/horizon-items/src/bundle.rs::tooltip_layout gap: minor: fixed at two lines (18 px) instead of measuring the wrapped text
|
||||
ClientBundleTooltip.getProgressBarFillText port crates/horizon-items/src/bundle.rs::tooltip_layout empty and full labels (the label field), drawn by draw_bundle_tooltip
|
||||
ClientTooltipComponent.create inline crates/horizon-client/src/game/stations.rs::Game::draw_stack_tooltip gap: minor: only bundles and plain text lines get a component here; no ActivePlayersTooltip
|
||||
DefaultTooltipPositioner.positionTooltip port crates/horizon-client/src/ui.rs::tooltip gap: minor: also clamps y to at least 4, which vanilla does not do; the text height is Horizon's own estimate
|
||||
MenuTooltipPositioner.positionTooltip missing minor: widget tooltips (WidgetTooltipHolder) sit beside their widget in vanilla; Horizon's ui::tooltip always places tooltips at the cursor
|
||||
MenuTooltipPositioner.getOffset missing minor: the widget-relative offset of the same missing positioner
|
||||
TooltipRenderUtil.extractTooltipBackground port crates/horizon-client/src/ui.rs::tooltip background and frame sprites (tooltip/background, tooltip/frame)
|
||||
TooltipRenderUtil.getBackgroundSprite inline crates/horizon-client/src/ui.rs::tooltip gap: minor: only the default style; no tooltip_style component
|
||||
TooltipRenderUtil.getFrameSprite inline crates/horizon-client/src/ui.rs::tooltip gap: minor: only the default style; no tooltip_style component
|
||||
CodeOfConductScreen missing player: a server with code of conduct enabled is accepted at once (net.rs CodeOfConduct reply), so the player never sees the text or the Acknowledge and Disconnect choice
|
||||
JoinMultiplayerScreen.init port crates/horizon-client/src/multiplayer.rs::Screen::buttons footer buttons and their enabling; server load and LAN scan start are in Screen::list
|
||||
JoinMultiplayerScreen.repositionElements skip:ui layout only: the list area is computed from the window size each frame (list_area)
|
||||
JoinMultiplayerScreen.tick inline crates/horizon-client/src/multiplayer.rs::Screen::draw LAN games are read each frame (lan.games()); server pings run on their own threads
|
||||
JoinMultiplayerScreen.removed port crates/horizon-client/src/lan/discovery.rs::ScanInner::drop dropping the list screen drops its scanner, and the drop stops the LAN scan
|
||||
JoinMultiplayerScreen.deleteCallback port crates/horizon-client/src/multiplayer.rs::Screen::click delete answer (ids 58, 59) removes the server, clears the selection and saves
|
||||
JoinMultiplayerScreen.editServerCallback port crates/horizon-client/src/multiplayer.rs::Screen::click edit save (id 50); the list reloads and re-pings after it
|
||||
JoinMultiplayerScreen.addServerCallback port crates/horizon-client/src/multiplayer.rs::Screen::click gap: minor: no hidden-server unhide (ServerList.unhide); add save (id 50, no index)
|
||||
JoinMultiplayerScreen.directJoinCallback port crates/horizon-client/src/multiplayer.rs::Screen::click gap: minor: a new address is not saved to the list first, as vanilla does; direct join (id 52) connects
|
||||
JoinMultiplayerScreen.keyPressed missing minor: no keyboard path on the server list: F5 does not refresh; title.rs shows no key handling for it beyond Escape and text
|
||||
JoinMultiplayerScreen.join port crates/horizon-client/src/multiplayer.rs::Screen::click returns Outcome::Connect for the selected server, LAN game or friend invite
|
||||
JoinMultiplayerScreen.onSelectedChange port crates/horizon-client/src/multiplayer.rs::Screen::buttons Join enabled with a selection; Edit and Delete only for a saved server
|
||||
RestrictionsScreen.createPermissionStatus port crates/horizon-client/src/game/lan_screen.rs::Restrictions::new allowed or denied line per permission, green or red
|
||||
RestrictionsScreen.repositionElements skip:ui layout only: Restrictions::new sizes the scroll area from the window
|
||||
SafetyScreen.addFooterButtons missing player: opening Multiplayer skips vanilla's safety warning (Proceed or Back, don't show again); skipMultiplayerWarning is stored in options_file.rs but no screen reads it
|
||||
ServerReconfigScreen missing player: during a server reconfiguration vanilla shows a waiting screen with a Disconnect button; no such screen found; net.rs only forwards Event::Reconfigured
|
||||
ServerSelectionList.refreshEntries port crates/horizon-client/src/multiplayer.rs::rows saved servers, LAN header and LAN games as one row list; selection is kept by index
|
||||
ServerSelectionList.updateOnlineServers inline crates/horizon-client/src/multiplayer.rs::rows no separate list to refresh; rows are rebuilt from the saved servers
|
||||
ServerSelectionList.updateNetworkServers inline crates/horizon-client/src/multiplayer.rs::rows gap: minor: no narrator announcement when a LAN game is found
|
||||
ServerSelectionList.LANHeader.extractContent port crates/horizon-client/src/multiplayer.rs::Screen::draw scanning label and loading dots drawn in the list
|
||||
ServerSelectionList.NetworkServerEntry.extractContent port crates/horizon-client/src/multiplayer.rs::Screen::draw gap: minor: the address is always shown, Hide Server Address (hideServerAddress) is not read; LAN World title, MOTD and address
|
||||
ServerSelectionList.NetworkServerEntry.keyPressed missing minor: no keyboard join on the server list (Enter)
|
||||
ServerSelectionList.NetworkServerEntry.join port crates/horizon-client/src/multiplayer.rs::Screen::click LAN game joined by a click on its row (Row::Lan) or a second click on the selected row
|
||||
ServerSelectionList.NetworkServerEntry.matches skip:java selection is kept by index, so no entry identity match is needed
|
||||
ServerSelectionList.OnlineServerEntry.extractContent port crates/horizon-client/src/multiplayer.rs::Screen::draw gap: player: no incompatible-version state (protocol mismatch) and no player-name tooltip; every failed ping reads Cannot connect; name, MOTD, ping bars, player count, hover join and move sprites
|
||||
ServerSelectionList.OnlineServerEntry.refreshStatus port crates/horizon-client/src/multiplayer.rs::ping_tooltip gap: player: no player-name tooltip on the player count (playerList); ping tooltip: ms, no connection or pinging; the bar choice is in Screen::draw
|
||||
ServerSelectionList.OnlineServerEntry.extractIcon port crates/horizon-client/src/multiplayer.rs::draw_server_icon server icon at 32x32
|
||||
ServerSelectionList.OnlineServerEntry.keyPressed missing minor: no keyboard path: Enter does not join and Shift+Up/Down does not move a server
|
||||
ServerSelectionList.OnlineServerEntry.swap port crates/horizon-client/src/multiplayer.rs::Screen::click icon arrow click swaps the server up or down and saves
|
||||
ServerSelectionList.OnlineServerEntry.getNarration missing minor: no narrator in Horizon, so no screen-reader text for entries
|
||||
ServerSelectionList.OnlineServerEntry.matches skip:java selection is kept by index, so no entry identity match is needed
|
||||
WarningScreen missing player: the warning page vanilla builds for multiplayer (base of SafetyScreen) does not exist in Horizon
|
||||
AccessibilityOptionsScreen.options port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows ACCESSIBILITY_OPTIONS list, same options in the same order
|
||||
AccessibilityOptionsScreen.init missing minor: High Contrast is not greyed out without the high_contrast pack, and Rotate with Minecarts is not greyed out without the minecart feature
|
||||
AccessibilityOptionsScreen.addOptions port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows Narrator row with the Controls button, then the rest of the rows
|
||||
AccessibilityOptionsScreen.addFooter missing minor: the Accessibility Help link button is absent from the footer
|
||||
AccessibilityOptionsScreen.isMinecartOptionEnabled missing minor: no minecart feature-flag check; part of the greying-out in init
|
||||
ChatOptionsScreen.options port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows gap: minor: Chat Delay and Narrator are on the Accessibility page instead; Chat page rows
|
||||
FontOptionsScreen.options port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows Force Unicode Font and Japanese glyph variants
|
||||
InWorldGameRulesScreen.initContent port crates/horizon-client/src/game/lan_screen.rs::Game::world_options_click GameRules button: a remote world sends REQUEST_GAMERULE_VALUES (action 2); a local world builds RulesScreen from its rules
|
||||
InWorldGameRulesScreen.onDone port crates/horizon-client/src/game/lan_screen.rs::Game::close_game_rules Done sends only the changed rules, and only with permission 2 on a remote world
|
||||
InWorldGameRulesScreen.collectChangedGameRule port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::changes rules whose value differs from the initial one
|
||||
InWorldGameRulesScreen.hasGameRuleChanged inline crates/horizon-client/src/game_rules_screen.rs::RulesScreen::changes comparison against the initial value
|
||||
InWorldGameRulesScreen.onGameRuleValuesUpdated port crates/horizon-client/src/game/lan_screen.rs::Game::remote_world_options_rules server values for the rules view (GameRuleValues)
|
||||
InWorldGameRulesScreen.initializeGameRuleValue inline crates/horizon-client/src/game/lan_screen.rs::Game::remote_world_options_rules each server value parsed into the rules
|
||||
InWorldGameRulesScreen.onGamemasterPermissionChanged port crates/horizon-client/src/game/lan_screen.rs::Game::remote_world_options_permission gap: minor: closes the rules only for a remote world; vanilla closes on any lost permission
|
||||
LanguageSelectScreen.addTitle inline crates/horizon-client/src/options_ui.rs::OptionsUi::layout language search box at the top of the Language page
|
||||
LanguageSelectScreen.setInitialFocus skip:ui focus only: typed text goes to the language search whatever has focus (type_text)
|
||||
LanguageSelectScreen.addContents port crates/horizon-client/src/options_ui.rs::OptionsUi::layout language rows of the Language page
|
||||
LanguageSelectScreen.addFooter port crates/horizon-client/src/options_ui.rs::OptionsUi::layout gap: minor: unsure whether the translation warning line is drawn; Font... and Done buttons
|
||||
LanguageSelectScreen.repositionElements skip:ui layout only: rows are laid out from the window size each frame
|
||||
LanguageSelectScreen.onDone port crates/horizon-client/src/options_ui.rs::OptionsUi::back Done applies the chosen language (language_choice)
|
||||
LanguageSelectScreen.LanguageSelectionList.filterEntries port crates/horizon-client/src/options_ui.rs::OptionsUi::layout filter by the search text against name and region (Page::Language)
|
||||
LanguageSelectScreen.LanguageSelectionList.Entry.extractContent port crates/horizon-client/src/options_ui.rs::OptionsUi::draw the language row's label, centred
|
||||
LanguageSelectScreen.LanguageSelectionList.Entry.keyPressed missing minor: unsure: no Enter-to-select on language rows found in OptionsUi::key
|
||||
LanguageSelectScreen.LanguageSelectionList.Entry.mouseClicked port crates/horizon-client/src/options_ui.rs::OptionsUi::click gap: minor: a second click on the chosen language finishes the page, which stands in for double-click; click selects
|
||||
MouseSettingsScreen.options port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows MOUSE_OPTIONS in vanilla order
|
||||
OnlineOptionsScreen missing player: Options > Online is greyed out in Horizon, so friends list, friend requests, in-game friend notifications, server listing and Realms notifications cannot be set
|
||||
OptionsScreen.init port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows gap: player: the Online button is greyed out and Skin Customisation opens no page; main page rows
|
||||
OptionsScreen.createOnlineButton missing player: the Online button is greyed out, so Options > Online cannot be opened
|
||||
OptionsScreen.openScreenButton port crates/horizon-client/src/options_ui.rs::OptionsUi::click sub-page buttons push their page (Act::Push)
|
||||
OptionsSubScreen.init port crates/horizon-client/src/options_ui.rs::OptionsUi::push opening a page resets its scroll, search and page state
|
||||
OptionsSubScreen.addContents port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows the page's rows
|
||||
OptionsSubScreen.addFooter inline crates/horizon-client/src/options_ui.rs::OptionsUi::layout Done button at the bottom of each page
|
||||
OptionsSubScreen.repositionElements skip:ui layout only: rows are laid out from the window size each frame
|
||||
OptionsSubScreen.onClose port crates/horizon-client/src/options_ui.rs::OptionsUi::back Done and Escape leave the page and apply its results
|
||||
SkinCustomizationScreen.addOptions missing player: Skin Customisation opens no page in Horizon: no cape, jacket, sleeve, pants or main hand options
|
||||
SoundOptionsScreen.addOptions port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows gap: minor: no sound device, directional audio or music toast rows; master and per-source volumes, subtitles, music frequency
|
||||
SoundOptionsScreen.getAllSoundOptionsExceptMaster port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows per-source volume rows (Volume(1..))
|
||||
UnsupportedGraphicsWarningScreen missing minor: no GPU warn list in Horizon, so the unsupported-graphics warning never appears when Improved Transparency is turned on
|
||||
VideoSettingsScreen.qualityOptions port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows gap: player: no Texture Filtering or Max Anisotropy rows; Video page quality rows
|
||||
VideoSettingsScreen.displayOptions port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows gap: player: no Exclusive Fullscreen or Preferred Graphics Backend rows; framerate, vsync, inactivity FPS, GUI scale, fullscreen, gamma
|
||||
VideoSettingsScreen.preferenceOptions port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows autosave indicator, vignette, attack indicator, chunk fade-in
|
||||
VideoSettingsScreen.addOptions port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows gap: player: no exclusive fullscreen row (see displayOptions); Video page sections with Horizon's Graphics buttons first
|
||||
VideoSettingsScreen.addTitle missing minor: no restart-required line; the option that needs a restart in vanilla (preferred backend) is absent
|
||||
VideoSettingsScreen.tick missing minor: no anisotropy greying and no restart-required line (see addTitle)
|
||||
VideoSettingsScreen.removed port crates/horizon-client/src/game/options.rs::Game::apply_ui_settings gap: minor: applied on every apply, not only when the value changed; no anisotropy or filtering to check; mipmap levels applied to the renderer
|
||||
VideoSettingsScreen.mouseClicked missing minor: no unsupported-graphics warning when Improved Transparency is turned on
|
||||
VideoSettingsScreen.mouseScrolled missing player: Ctrl with the mouse wheel does not change the GUI scale on the Video page; the wheel only scrolls (scroll_at has no Ctrl check)
|
||||
VideoSettingsScreen.updateFullscreenButton skip:ui rows are rebuilt from Settings on each layout, so there is no fullscreen widget to set
|
||||
VideoSettingsScreen.repositionElements missing minor: no exclusive fullscreen mode list to rebuild when the window moves to another monitor
|
||||
VideoSettingsScreen.updateTransparencyButton skip:ui rows are rebuilt from Settings on each layout, so the transparency row reads its value each frame
|
||||
ControlsScreen.options port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows gap: player: no Toggle Attack, Toggle Use, Sprint Window, Quit Shortcuts, Ctrl-click or Operator Items rows (the settings exist in options_file.rs); toggle crouch, sprint and auto jump rows
|
||||
ControlsScreen.addOptions port crates/horizon-client/src/options_ui.rs::OptionsUi::list_rows Mouse Settings and Key Binds buttons, then the toggles; Horizon adds Controller Settings
|
||||
KeyBindsList.CategoryEntry.extractContent port crates/horizon-client/src/options_ui.rs::OptionsUi::draw category header text
|
||||
KeyBindsList.KeyEntry.<init> port crates/horizon-client/src/options_ui.rs::OptionsUi::layout change and reset buttons per key row
|
||||
KeyBindsList.KeyEntry.extractContent port crates/horizon-client/src/options_ui.rs::OptionsUi::draw row name and conflict highlight
|
||||
KeyBindsList.KeyEntry.refreshEntry port crates/horizon-client/src/options_ui.rs::OptionsUi::layout conflicts from keys.conflicts; reset enabled when the key is not default
|
||||
KeyBindsList.KeyEntry.updateChangeButtonMessage port crates/horizon-client/src/options_ui.rs::OptionsUi::layout key label, with the > < marker while waiting for a key (selected_key)
|
||||
KeyBindsScreen.addContents port crates/horizon-client/src/options_ui.rs::OptionsUi::layout the key bind rows
|
||||
KeyBindsScreen.addFooter port crates/horizon-client/src/options_ui.rs::OptionsUi::layout Reset All and Done buttons
|
||||
KeyBindsScreen.repositionElements skip:ui layout only
|
||||
KeyBindsScreen.mouseClicked port crates/horizon-client/src/options_ui.rs::OptionsUi::bind_mouse a mouse button is bound to the key being changed
|
||||
KeyBindsScreen.extractRenderState port crates/horizon-client/src/options_ui.rs::OptionsUi::layout gap: minor: Reset All drawn in layout; its enabled-when-changed check was not confirmed
|
||||
PackSelectionModel.getUnselected port crates/horizon-client/src/packs.rs::SelectionModel::list unselected list (list(false)), returned as a slice rather than a stream
|
||||
PackSelectionModel.getSelected port crates/horizon-client/src/packs.rs::SelectionModel::list selected list (list(true)), returned as a slice rather than a stream
|
||||
PackSelectionModel.updateRepoSelectedList port crates/horizon-client/src/packs.rs::SelectionModel::commit selection written bottom first, as options.txt stores it
|
||||
PackSelectionModel.findNewPacks port crates/horizon-client/src/game/packs.rs::Game::refresh_pack_lists gap: minor: rescans when the options open, not while the screen is open (no folder watch)
|
||||
PackSelectionModel.EntryBase.updateHighContrastOptionInstance missing minor: selecting the high_contrast pack does not switch the High Contrast option on, as vanilla does
|
||||
PackSelectionModel.EntryBase.move port crates/horizon-client/src/packs.rs::SelectionModel::move_by move up or down within the list when the neighbour is not fixed
|
||||
PackSelectionScreen.closeWatcher missing minor: no folder watcher to close (see PackSelectionScreen.Watcher)
|
||||
PackSelectionScreen.setInitialFocus port crates/horizon-client/src/pack_screen.rs::PackScreen::set_focus search box focused on open
|
||||
PackSelectionScreen.updateFilteredEntries port crates/horizon-client/src/pack_screen.rs::PackScreen::filter filters both lists by the search text
|
||||
PackSelectionScreen.repositionElements port crates/horizon-client/src/pack_screen.rs::PackScreen::reposition search box and both list boxes
|
||||
PackSelectionScreen.tick missing minor: no folder poll; packs added while the screen is open appear only when the options reopen (refresh_pack_lists)
|
||||
PackSelectionScreen.reload port crates/horizon-client/src/pack_screen.rs::PackScreen::populate gap: minor: rebuilds both lists; no rescan here (see findNewPacks)
|
||||
PackSelectionScreen.copyPacks missing minor: no pack copy into the packs folder; dropped packs are not copied
|
||||
PackSelectionScreen.onFilesDrop missing minor: dropping pack files onto the screen does nothing; Horizon has no file-drop handling
|
||||
PackSelectionScreen.getPackIcon port crates/horizon-client/src/pack_screen.rs::load_icon icons decoded once into PackInfo.icon, then bound as textures (icon_texture)
|
||||
PackSelectionScreen.Watcher missing minor: no WatchService on the packs folder (create, watchDir, pollForChanges)
|
||||
TransferableSelectionList.keyPressed missing minor: no keyboard entry navigation: keys reach only the search box (type_text, shortcut, erase), not a selected pack
|
||||
TransferableSelectionList.HeaderEntry.extractContent port crates/horizon-client/src/pack_screen.rs::PackScreen::draw_list header row (Available or Selected) drawn in the list
|
||||
TransferableSelectionList.PackEntry.getNarration missing minor: no narrator in Horizon
|
||||
TransferableSelectionList.PackEntry.keyPressed missing minor: no keyboard select or move for a pack (Enter, Shift+Up/Down); nothing calls activate or move_by from keys
|
||||
TransferableSelectionList.PackEntry.showHoverOverlay port crates/horizon-client/src/pack_screen.rs::PackScreen::overlay overlay shown unless the pack is both fixed and required
|
||||
TransferableSelectionList.PackEntry.keyboardSelection missing minor: no keyboard selection (see PackEntry.keyPressed)
|
||||
TransferableSelectionList.PackEntry.handlePackSelection port crates/horizon-client/src/pack_screen.rs::PackScreen::entry_click gap: minor: keyboard path missing (keyboardSelection); icon click selects; an incompatible pack opens the confirmation (open_confirm) first
|
||||
TransferableSelectionList.PackEntry.shouldTakeFocusAfterInteraction skip:ui focus after a click matters only for keyboard entry navigation, which Horizon does not have
|
||||
CraftingRecipeBookComponent.isCraftingSlot missing minor: unsure: no crafting-slot check found in the recipe book code
|
||||
CraftingRecipeBookComponent.fillGhostRecipe port crates/horizon-client/src/recipe_book.rs::Book::ghost crafting branch: shaped recipes placed by place_cells, shapeless in order; result set first
|
||||
FurnaceRecipeBookComponent.fillGhostRecipe port crates/horizon-client/src/recipe_book.rs::Book::ghost furnace branch: ingredient, and the fuel only when the fuel slot is empty (fuel_empty)
|
||||
|
@@ -0,0 +1,65 @@
|
||||
GhostSlots.extractTooltip missing player: hovering a ghost ingredient or result in the crafting grid or furnace shows no item tooltip; the ghost draw has no tooltip call and draw_slot_tooltip reads only real slots
|
||||
GhostSlots.GhostSlot.getItem port crates/horizon-client/src/recipe_book_screen.rs::ghost the stack cycles with index % items; empty ghost slots are dropped in Book::ghost
|
||||
OverlayRecipeComponent.mouseClicked port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click left click places the overlay's recipe; right click and outside clicks close the overlay
|
||||
OverlayRecipeComponent.OverlayCraftingRecipeButton.calculateIngredientsPositions port crates/horizon-client/src/recipe_book_screen.rs::overlay_cells shaped recipes use the 3x3 grid cells, shapeless ones i % 3 and i / 3; empty ingredients are dropped
|
||||
OverlayRecipeComponent.OverlayCraftingRecipeButton.getSprite port crates/horizon-client/src/recipe_book_screen.rs::overlay crafting_overlay sprite by craftable and hover
|
||||
OverlayRecipeComponent.OverlayRecipeButton.createGridPos port crates/horizon-client/src/recipe_book_screen.rs::overlay cell at 3 + 7x, 3 + 7y inside the 24 px button
|
||||
OverlayRecipeComponent.OverlayRecipeButton.extractWidgetRenderState port crates/horizon-client/src/recipe_book_screen.rs::overlay cells drawn as items at 0.375 scale, each cycling its stacks by index
|
||||
OverlayRecipeComponent.OverlaySmeltingRecipeButton.getSprite port crates/horizon-client/src/recipe_book_screen.rs::overlay furnace_overlay sprites by craftable and hover
|
||||
RecipeBookComponent.init inline crates/horizon-client/src/game/recipe_book.rs::Game::ensure_book the book and search box are built on first use; the open flag is Game::book_open and the views come from refresh_book_view
|
||||
RecipeBookComponent.initVisuals inline crates/horizon-client/src/game/recipe_book.rs::Game::refresh_book_view tabs, buttons and page are rebuilt when inventory, grid, filter, tab, search text or known recipes change; the search box is drawn by screen::draw
|
||||
RecipeBookComponent.setVisible port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click the book button flips the open flag and sends the settings; closing clears the overlay; gap: minor: a server settings packet sets the flag without clearing the overlay or page
|
||||
RecipeBookComponent.slotClicked port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click a click on a grid, result or furnace slot clears the ghost recipe and the last placed recipe (is_book_slot)
|
||||
RecipeBookComponent.selectMatchingRecipes inline crates/horizon-client/src/game/recipe_book.rs::Game::build_view a recipe is selected when it fits the crafting grid; craftable comes from Book::can_craft against book_available
|
||||
RecipeBookComponent.updateCollections port crates/horizon-client/src/game/recipe_book.rs::Game::build_view collections filtered by the search (Book::collection_matches) and by the craftable filter; callers reset the page on tab and filter changes
|
||||
RecipeBookComponent.updateTabs inline crates/horizon-client/src/game/recipe_book.rs::Game::build_view tab visibility; positions are in Game::tab_pos and the squeeze in Game::start_new_recipe_animations
|
||||
RecipeBookComponent.tick port crates/horizon-client/src/game/recipe_book.rs::Game::draw_recipe_book advances the swap time and the squeezes; the inventory-changed refresh is the hash in refresh_book_view
|
||||
RecipeBookComponent.extractTooltip port crates/horizon-client/src/game/recipe_book.rs::Game::draw_book_panel gap: player: no tooltip for ghost slots (GhostSlots.extractTooltip); the page's recipe tooltip is the ItemTooltip call
|
||||
RecipeBookComponent.mouseClicked port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click gap: player: in the narrow layout vanilla closes the book after placing a recipe (isOffsetNextToMainGUI is false); Horizon keeps it open
|
||||
RecipeBookComponent.mouseDragged missing player: dragging across the recipe search box does not select text; EditBox::drag_to is used only by the title screen
|
||||
RecipeBookComponent.onTabButtonPress port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click a tab click selects the tab and resets the page to 0
|
||||
RecipeBookComponent.replaceSelected inline crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click sets recipe_ui.tab, so one tab is selected at a time
|
||||
RecipeBookComponent.toggleFiltering port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click the craftable filter button flips the filter, sends the settings and resets the page
|
||||
RecipeBookComponent.keyPressed port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_key search box keys and KeyT focus (Game::recipe_focus_search); gap: player: Enter and Space do not place the last clicked recipe (lastRecipe); gap: player: Escape does not close only the book in the narrow layout
|
||||
RecipeBookComponent.charTyped port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_key typed text enters the search box from the key event; gap: minor: no separate char event, so no IME text
|
||||
RecipeBookComponent.preeditUpdated missing minor: no IME composition in the recipe search box
|
||||
RecipeBookComponent.capturesInput port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_search_focused true while the search box has focus
|
||||
RecipeBookComponent.checkSearchStringUpdate inline crates/horizon-client/src/game/recipe_book.rs::Game::refresh_book_view the search text is part of the view key, so a change rebuilds the buttons
|
||||
RecipeBookComponent.pirateSpeechForThePeople missing minor: typing excitedze in the recipe search switches the game to pirate English (en_pt); Horizon has no language switch from the book
|
||||
RecipeBookComponent.recipesUpdated inline crates/horizon-client/src/game/recipe_book.rs::Game::refresh_book_view new or removed known recipes change client_version, which rebuilds the tabs and buttons
|
||||
RecipeBookComponent.updateNarration skip:other screen-reader narration; Horizon has no narration output
|
||||
RecipeBookPage.init inline crates/horizon-client/src/game/recipe_book.rs::Game::button_pos button places (5 per row, 25 px apart) are computed here; arrow places are fixed in recipe_book_click and screen::draw
|
||||
RecipeBookPage.updateCollections inline crates/horizon-client/src/game/recipe_book.rs::Game::refresh_book_view page count is div_ceil(20) of the buttons; the page is reset to 0 when it is past the end
|
||||
RecipeBookPage.updateButtonsForPage port crates/horizon-client/src/game/recipe_book.rs::Game::draw_book_panel the page's buttons are skip(page * 20).take(20)
|
||||
RecipeBookPage.updateArrowButtons port crates/horizon-client/src/recipe_book_screen.rs::draw arrows show when there is more than one page and the page is not the first or the last
|
||||
RecipeBookPage.mouseClicked port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click page arrows; right click opens the overlay when the button has more than one recipe; left click places
|
||||
RecipeBookTabButton.extractContents port crates/horizon-client/src/recipe_book_screen.rs::draw tab sprite, the 2 px shift when selected, and the squeeze pose
|
||||
RecipeBookTabButton.extractIcon port crates/horizon-client/src/recipe_book_screen.rs::draw one or two fake item icons at offsets 9, or 3 and 14, shifted 2 px when selected
|
||||
RecipeBookTabButton.updateVisibility port crates/horizon-client/src/game/recipe_book.rs::Game::build_view a tab is shown when a collection of its category has a selected recipe
|
||||
RecipeButton.extractWidgetRenderState port crates/horizon-client/src/recipe_book_screen.rs::draw sprite by craftable and by several recipes, squeeze pose, same-result item under the fake item
|
||||
RecipeButton.getCurrentRecipe port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click the entry at swap_index % entries
|
||||
RecipeButton.getTooltipText port crates/horizon-client/src/game/recipe_book.rs::Game::paint_book ItemTooltip: the stack's tooltip, then Right Click for More when there are several recipes
|
||||
RecipeButton.updateWidgetNarration skip:other screen-reader narration; Horizon has no narration output
|
||||
RecipeButton.isValidClickButton port crates/horizon-client/src/game/recipe_book.rs::Game::recipe_book_click left and right clicks only; a middle click does nothing here
|
||||
RecipeButton.ResolvedEntry.selectItem port crates/horizon-client/src/recipe_book_screen.rs::display_stack the stack at offset % count; display_stack first picks the recipe from index % count
|
||||
RecipeCollection.selectRecipes inline crates/horizon-client/src/game/recipe_book.rs::Game::build_view selected when the recipe fits the crafting grid; craftable from Book::can_craft against the stock
|
||||
RecipeCollection.getSelectedRecipes inline crates/horizon-client/src/game/recipe_book.rs::Game::build_view entries kept per view: selected ones, and only craftable ones when filtering
|
||||
AbstractReportScreen skip:service chat and skin abuse reporting screens; Horizon has no reporting
|
||||
AbstractReportScreen.DiscardReportWarningScreen skip:service abuse report discard warning; Horizon has no reporting
|
||||
ChatReportScreen skip:service chat abuse reporting screen; Horizon has no reporting
|
||||
ChatSelectionLogFiller skip:service chat log filler for the report selection; Horizon has no reporting
|
||||
ChatSelectionScreen skip:service chat message selection for a report; Horizon has no reporting
|
||||
ChatSelectionScreen.ChatSelectionList skip:service chat message list of the report screen; Horizon has no reporting
|
||||
ChatSelectionScreen.ChatSelectionList.DividerEntry skip:service divider row of the report chat list; Horizon has no reporting
|
||||
ChatSelectionScreen.ChatSelectionList.MessageEntry skip:service message row of the report chat list; Horizon has no reporting
|
||||
ChatSelectionScreen.ChatSelectionList.MessageHeadingEntry skip:service heading row of the report chat list; Horizon has no reporting
|
||||
NameReportScreen skip:service player name abuse report screen; Horizon has no reporting
|
||||
ReportPlayerScreen skip:service player abuse report screen; Horizon has no reporting
|
||||
ReportReasonSelectionScreen skip:service abuse report reason screen; Horizon has no reporting
|
||||
ReportReasonSelectionScreen.ReasonSelectionList skip:service reason list of the report screen; Horizon has no reporting
|
||||
ReportReasonSelectionScreen.ReasonSelectionList.Entry skip:service reason row of the report screen; Horizon has no reporting
|
||||
SkinReportScreen skip:service skin abuse report screen; Horizon has no reporting
|
||||
PlayerEntry skip:service social list row with report, hide and status; Horizon has no social list
|
||||
PlayerSocialManager skip:service Mojang social manager: block, friends and message hiding; Horizon has none of it
|
||||
PresenceHandler skip:service online presence sharing with the service; Horizon has none
|
||||
RemoteFriendListUpdateHandler skip:service friend list polling and toasts from the service; Horizon has no friend list (its relay is separate)
|
||||
|
@@ -0,0 +1,150 @@
|
||||
SocialInteractionsPlayerList.enableScissor skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.updatePlayerList skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.addOnlinePlayers skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.addSeenPlayers skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.makePlayerEntry skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.updatePlayersFromChatLog skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.collectProfilesFromChatLog skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.sortPlayerEntries skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.updateFiltersAndScroll skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.updateFilteredPlayers skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.addPlayer skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.removePlayer skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsPlayerList.refreshHasDraftReport skip:service social list (hidden and blocked players); Horizon has no Social Interactions screen
|
||||
SocialInteractionsScreen.getNarrationMessage skip:ui narration text only
|
||||
SocialInteractionsScreen.init skip:service social screen: tabs, search box, server label; no Horizon counterpart
|
||||
SocialInteractionsScreen.repositionElements skip:ui layout only
|
||||
SocialInteractionsScreen.showPage skip:service social: All, Hidden and Blocked tabs
|
||||
SocialInteractionsScreen.extractBackground skip:service social screen background
|
||||
SocialInteractionsScreen.extractRenderState skip:service social screen drawing
|
||||
SocialInteractionsScreen.keyPressed skip:service social keybind closes the screen
|
||||
SocialInteractionsScreen.checkSearchStringUpdate skip:service social search filter
|
||||
SocialInteractionsScreen.updateServerLabel skip:service social server label
|
||||
TelemetryEventWidget.buildContent skip:service telemetry event list (opt-in data); Horizon's telemetry.rs is perf and crash reporting
|
||||
TelemetryEventWidget.setScrollAmount skip:service telemetry event list (opt-in data); Horizon's telemetry.rs is perf and crash reporting
|
||||
TelemetryEventWidget.extractContents skip:service telemetry event list (opt-in data); Horizon's telemetry.rs is perf and crash reporting
|
||||
TelemetryEventWidget.addEventType skip:service telemetry event list (opt-in data); Horizon's telemetry.rs is perf and crash reporting
|
||||
TelemetryEventWidget.addEventTypeProperties skip:service telemetry event list (opt-in data); Horizon's telemetry.rs is perf and crash reporting
|
||||
TelemetryEventWidget.ContentBuilder.addLine skip:service telemetry event list builder
|
||||
TelemetryEventWidget.ContentBuilder.addHeader skip:service telemetry event list builder
|
||||
TelemetryEventWidget.ContentBuilder.build skip:service telemetry event list builder
|
||||
TelemetryInfoScreen.getNarrationMessage skip:ui narration text only
|
||||
TelemetryInfoScreen.init skip:service telemetry info screen: privacy, feedback, opt-in, view data
|
||||
TelemetryInfoScreen.repositionElements skip:ui layout only
|
||||
AbstractGameRulesScreen.createAndConfigureSearchBox port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::build search box made with the screen; the search text filters through rows()
|
||||
AbstractGameRulesScreen.init port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::build title, search box and rule list; Done and Cancel are handled by RulesScreen::click
|
||||
AbstractGameRulesScreen.repositionElements skip:ui layout only
|
||||
AbstractGameRulesScreen.filterGameRules port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::rows gap: minor: the scroll reset to the top is in RulesScreen::edited, not here
|
||||
AbstractGameRulesScreen.BooleanRuleEntry.extractContent port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::draw draws the on/off button of a boolean rule
|
||||
AbstractGameRulesScreen.CategoryRuleEntry.extractContent port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::draw draws the category header row
|
||||
AbstractGameRulesScreen.GameRuleEntry.extractLabel port crates/horizon-client/src/game_rules_screen.rs::lines wraps the rule label to 170 px (one or two lines); drawn by RulesScreen::draw
|
||||
AbstractGameRulesScreen.IntegerRuleEntry.extractContent port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::draw draws the 44 px number box; invalid text turns red in RulesScreen::edited
|
||||
AbstractGameRulesScreen.RuleList.matchesFilter port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::rows matches id, name, category and description, as rows() does
|
||||
AbstractGameRulesScreen.RuleList.extractWidgetRenderState port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::draw hovered rule's tooltip: id, description, default
|
||||
ConfirmExperimentalFeaturesScreen.getNarrationMessage skip:ui narration text only
|
||||
ConfirmExperimentalFeaturesScreen.init missing minor: confirmation for experimental packs; Horizon has no experimental packs, so it never opens
|
||||
ConfirmExperimentalFeaturesScreen.repositionElements skip:ui layout only
|
||||
ConfirmExperimentalFeaturesScreen.DetailsScreen.init missing minor: details of the experimental packs; no such screen in Horizon
|
||||
ConfirmExperimentalFeaturesScreen.DetailsScreen.repositionElements skip:ui layout only
|
||||
ConfirmExperimentalFeaturesScreen.DetailsScreen.PackListEntry.extractContent missing minor: draws an experimental pack id and its message; no such list in Horizon
|
||||
ConfirmExperimentalFeaturesScreen.DetailsScreen.PackListEntry.getNarration skip:ui narration text only
|
||||
CreateWorldScreen.openFresh port crates/horizon-client/src/title.rs::Title::new_world gap: minor: no resource load for datapack registries before the screen
|
||||
CreateWorldScreen.testWorld skip:debug TW button, shown only when running in the IDE
|
||||
CreateWorldScreen.openCreateWorldScreen skip:data loads datapack registries and world presets before the screen; Horizon reads data from tables
|
||||
CreateWorldScreen.createFromExisting port crates/horizon-client/src/title/create_world.rs::WorldOptions::of_world gap: minor: no datapacks copied; name, seed and mode come from title.rs click_action arm 15
|
||||
CreateWorldScreen.init port crates/horizon-client/src/title/create_world.rs::buttons tab bar and footer buttons; tabs are drawn by draw_create
|
||||
CreateWorldScreen.repositionElements skip:ui layout only
|
||||
CreateWorldScreen.onCreate port crates/horizon-client/src/title.rs::Title::create_action gap: minor: no experimental or deprecated-data warning before creating
|
||||
CreateWorldScreen.createWorldAndCleanup inline crates/horizon-client/src/game/startup_menu.rs::StartupMenu::queue_entry gap: minor: temp datapack folder cleanup not modelled (no datapack copy)
|
||||
CreateWorldScreen.createNewWorld port crates/horizon-client/src/game.rs::Game::open_world gap: minor: the folder is made in WorldRequest::prepare and no datapacks are copied in
|
||||
CreateWorldScreen.createLevelSettings port crates/horizon-client/src/game/world_loading.rs::WorldRequest::prepare name, mode, difficulty, hardcore and commands written with the new level; gap: minor: debug world (spectator, peaceful) not modelled
|
||||
CreateWorldScreen.keyPressed missing player: Enter does not create the world; startup_menu title_key only confirms a focused rename box, so Enter on Create New World does nothing
|
||||
CreateWorldScreen.extractRenderState port crates/horizon-client/src/title/create_world.rs::Title::draw_create draws the footer separator
|
||||
CreateWorldScreen.extractMenuBackground port crates/horizon-client/src/title/create_world.rs::Title::draw_create draws the tab header strip and menu background
|
||||
CreateWorldScreen.getOrCreateTempDataPackDir missing minor: temp folder for datapacks chosen at creation; Horizon has no create-time datapack picker
|
||||
CreateWorldScreen.openExperimentsScreen missing minor: Experiments screen, only in non-stable builds; Horizon's button is disabled and has no screen
|
||||
CreateWorldScreen.openDataPackSelectionScreen missing player: the Data Packs button is disabled on the More tab, so the datapack picker never opens
|
||||
CreateWorldScreen.tryApplyNewDataPacks missing player: part of the greyed-out Data Packs picker; picked packs never reach the new world
|
||||
CreateWorldScreen.applyNewPackConfig missing player: part of the greyed-out Data Packs picker; validates and applies the picked packs
|
||||
CreateWorldScreen.createDefaultLoadConfig skip:data builds the datapack load config; Horizon loads no datapack set at creation
|
||||
CreateWorldScreen.removeTempDataPackDir missing minor: cleanup of the temp datapack folder; no such folder in Horizon
|
||||
CreateWorldScreen.copyBetweenDirs missing minor: copies datapack files into the temp folder; not in Horizon
|
||||
CreateWorldScreen.createNewWorldDirectory port crates/horizon-client/src/game/world_loading.rs::WorldRequest::prepare makes the world folder and writes level.dat; gap: minor: datapack files not copied in
|
||||
CreateWorldScreen.createTempDataPackDirFromExistingWorld missing minor: Re-Create copies the old world's datapacks to a temp folder; Horizon's Re-Create does not
|
||||
CreateWorldScreen.getDataPackSelectionSettings missing minor: temp datapack repository for the picker; no picker in Horizon
|
||||
CreateWorldScreen.GameTab.<init> port crates/horizon-client/src/title/create_world.rs::buttons Game tab: name box, game mode, difficulty, allow cheats; gap: minor: vanilla's Experiments button sits on this tab in non-stable builds
|
||||
CreateWorldScreen.MoreTab.openGameRulesScreen port crates/horizon-client/src/title.rs::Title::click_action Game Rules button (arm 29) over a copy of the rules, via RulesScreen::for_creation
|
||||
CreateWorldScreen.WorldTab.<init> port crates/horizon-client/src/title/create_world.rs::buttons World tab: world type, customize, seed box (field 1), structures and bonus chest; gap: player: only Default and Superflat are offered, vanilla also offers Amplified and other presets
|
||||
CreateWorldScreen.WorldTab.openPresetEditor port crates/horizon-client/src/title.rs::Title::click_action Customize button (arm 26) opens the Superflat editor (Mode::CreateFlat)
|
||||
EditWorldScreen.create port crates/horizon-client/src/title.rs::Title::click_action Edit button (arm 13) builds the Edit mode from the list entry; gap: minor: no fixAndGetSummary (file fixing) on open
|
||||
EditWorldScreen.<init> port crates/horizon-client/src/title.rs::Title::buttons Edit buttons: reset icon, open folder, backup, backups folder, Optimize, Save, Cancel; gap: player: Optimize World is drawn inactive and does nothing
|
||||
EditWorldScreen.keyPressed port crates/horizon-client/src/game/startup_menu.rs::StartupMenu::title_key Enter confirms a focused name box through confirm_edit; Escape goes back through Title::escape
|
||||
EditWorldScreen.onRename port crates/horizon-client/src/title/world_management.rs::rename saves the trimmed name to level.dat; Save (arm 35) and Enter reach it, then return to the list
|
||||
EditWorldScreen.makeBackupAndShowToast port crates/horizon-client/src/title.rs::Title::start_backup gap: minor: the success or failure toast and the return to the list are in Title::poll_backup
|
||||
EditWorldScreen.extractRenderState port crates/horizon-client/src/title.rs::Title::draw draws the centred Edit World title
|
||||
ExperimentsScreen.init missing minor: Experiments screen, only in non-stable builds; Horizon has none
|
||||
ExperimentsScreen.getHumanReadableTitle missing minor: translated title of an experiment pack; Horizon has no experiments
|
||||
ExperimentsScreen.repositionElements skip:ui layout only
|
||||
ExperimentsScreen.getNarrationMessage skip:ui narration text only
|
||||
ExperimentsScreen.onDone missing minor: applies the chosen experiments to the pack repository; none in Horizon
|
||||
FileFixerProgressScreen.init missing player: Cancel while a world's files are fixed; Horizon fixes them with no progress screen
|
||||
FileFixerProgressScreen.extractRenderState missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
FileFixerProgressScreen.extractProgress missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
FileFixerProgressScreen.extractProgressBar missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
FileFixerProgressScreen.extractTypeText missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
FileFixerProgressScreen.extractTypeProgress missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
FileFixerProgressScreen.extractFileStats missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
FileFixerProgressScreen.extractScanning missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
FileFixerProgressScreen.extractFileFixerCount missing player: part of the file-fix progress screen, which Horizon never shows
|
||||
OptimizeWorldScreen.create missing player: opens from Optimize World, which Horizon draws inactive on purpose; no optimizer exists
|
||||
OptimizeWorldScreen.init missing player: Cancel of the optimize run; no optimize run exists
|
||||
OptimizeWorldScreen.extractRenderState missing player: optimize progress (converted, skipped, per-dimension bars); not shown
|
||||
SelectWorldScreen.init port crates/horizon-client/src/title.rs::Title::buttons Play, Create, Edit, Delete, Re-Create and Back; the list comes from list_worlds in return_to_list
|
||||
SelectWorldScreen.createFooterButtons port crates/horizon-client/src/title.rs::Title::buttons footer buttons for the selected world: Play, Create, Edit, Delete, Re-Create, Back
|
||||
SelectWorldScreen.createDebugWorldRecreateButton skip:debug DEBUG recreate button, only with SharedConstants.DEBUG_WORLD_RECREATE
|
||||
SelectWorldScreen.repositionElements skip:ui layout only
|
||||
SelectWorldScreen.updateButtonStatus port crates/horizon-client/src/title.rs::Title::buttons gap: minor: buttons enable from the selection only; canEdit, canRecreate, canDelete and the primary action are not modelled
|
||||
SwitchGrid.Builder.addSwitch skip:java builder for the switch rows
|
||||
SwitchGrid.Builder.build skip:java layout builder for the switch rows; Horizon draws them in create_world buttons
|
||||
SwitchGrid.LabeledSwitch.refreshState port crates/horizon-client/src/title/create_world.rs::buttons switch value and enabled flag are read from WorldOptions every frame
|
||||
SwitchGrid.SwitchBuilder.build port crates/horizon-client/src/title/create_world.rs::buttons structures (27) and bonus chest (28) switches with their enable rules; structures info is in create_tooltip
|
||||
WorldCreationContext.withSettings skip:java immutable copy-with helper; Horizon's WorldOptions is a plain struct changed in place
|
||||
WorldCreationContext.withOptions skip:java immutable copy-with helper; Horizon's WorldOptions is changed in place
|
||||
WorldCreationContext.withDimensions skip:java immutable copy-with helper; Horizon has no dimension settings to copy
|
||||
WorldCreationContext.validate skip:data validates datapack dimension generators; Horizon has no datapack dimensions
|
||||
WorldCreationGameRulesScreen.initContent port crates/horizon-client/src/game_rules_screen.rs::RulesScreen::for_creation creation rule list
|
||||
WorldCreationUiState.<init> port crates/horizon-client/src/title.rs::Title::new_world gap: minor: builds the defaults only; Re-Create and preset starts are in click_action and WorldOptions::of_world
|
||||
WorldCreationUiState.onChanged skip:ui listener refresh; Horizon's buttons read WorldOptions every frame, bonus chest via WorldOptions::bonus_chest
|
||||
WorldCreationUiState.setName port crates/horizon-client/src/title.rs::Title::edit_field name text kept in Mode::Create.name; gap: minor: target folder is not recomputed per keystroke (create_tooltip and create_action compute it)
|
||||
WorldCreationUiState.findResultFolder port crates/horizon-client/src/title.rs::Title::target_folder gap: minor: a blank name gives folder World, vanilla gives New World
|
||||
WorldCreationUiState.isAllowCommands port crates/horizon-client/src/title/create_world.rs::WorldOptions::commands never in Hardcore, else on for Creative until toggled
|
||||
WorldCreationUiState.setSeed port crates/horizon-client/src/title.rs::parse_seed gap: minor: seed text is stored in Mode::Create.seed and parsed in create_action
|
||||
WorldCreationUiState.isBonusChest port crates/horizon-client/src/title/create_world.rs::WorldOptions::bonus_chest never in Hardcore
|
||||
WorldCreationUiState.tryUpdateDataConfiguration skip:data datapack and feature-flag config; Horizon has neither at creation
|
||||
WorldCreationUiState.setWorldType port crates/horizon-client/src/title/create_world.rs::WorldOptions::press Superflat toggle (id 25); gap: player: only Default and Superflat exist, vanilla's other presets such as Amplified are missing
|
||||
WorldCreationUiState.getPresetEditor port crates/horizon-client/src/title/create_world.rs::buttons customize button enabled only for Superflat; the editor opens in title.rs click_action arm 26
|
||||
WorldCreationUiState.updatePresetLists skip:data preset lists from the registry; Horizon has two built-in types
|
||||
WorldCreationUiState.findPreset skip:data registry lookup
|
||||
WorldCreationUiState.getNonEmptyList skip:data registry tag lookup
|
||||
WorldCreationUiState.WorldTypeEntry.describePreset port crates/horizon-client/src/title/create_world.rs::buttons world type label: Default or Superflat
|
||||
WorldCreationUiState.WorldTypeEntry.isAmplified missing player: there is no Amplified world type in Horizon, so its help tooltip never shows
|
||||
WorldOpenFlows.createFreshLevel port crates/horizon-client/src/game/world_loading.rs::WorldRequest::prepare writes a fresh level.dat; gap: minor: vanilla uses it for the debug recreate and the demo world; no datapack dimensions
|
||||
WorldOpenFlows.createWorldAccess port crates/horizon-client/src/save.rs::SessionLock::acquire takes the world's session lock as the access; gap: minor: no symlink warning
|
||||
WorldOpenFlows.createLevelFromExistingSettings port crates/horizon-client/src/game.rs::Game::open_world starts the world with the given settings; gap: minor: no datapack repository is built
|
||||
WorldOpenFlows.loadWorldStem port crates/horizon-client/src/game/world_loading.rs::WorldRequest::prepare reads level data and generator settings; gap: minor: no datapack load or safe-mode retry
|
||||
WorldOpenFlows.recreateWorldData port crates/horizon-client/src/title/create_world.rs::WorldOptions::of_world reads the old world's settings for Re-Create; title.rs click_action arm 15 fills name, seed and mode
|
||||
WorldOpenFlows.loadWorldDataBlocking port crates/horizon-client/src/game/world_loading.rs::WorldLoader::finish waits for the load worker and returns its result
|
||||
WorldOpenFlows.askForBackup missing player: backup question before opening an old customized or experimental world; Horizon never asks
|
||||
WorldOpenFlows.confirmWorldCreation skip:data lifecycle warning for experimental or deprecated data; Horizon has no such data
|
||||
WorldOpenFlows.openWorld port crates/horizon-client/src/game/startup_menu.rs::StartupMenu::queue_entry Play (title.rs arm 10) queues the existing world for loading
|
||||
WorldOpenFlows.openWorldLoadLevelData port crates/horizon-client/src/game/world_loading.rs::WorldRequest::prepare gap: player: a level.dat that will not read (Level::read gives None) opens with a random seed and the folder name, not the Recover World Data screen
|
||||
WorldOpenFlows.openWorldCheckVersionCompatibility missing player: no incompatible-version alert and no backup question; Horizon upgrades older worlds and opens newer ones without a check
|
||||
WorldOpenFlows.createBackupAndOpenWorld missing player: no backup step before opening an old world; the backup button exists only in Edit World
|
||||
WorldOpenFlows.upgradeAndOpenWorld port crates/horizon-client/src/save.rs::upgrade_older_world runs the file fixes and upgrades on open; gap: player: no file-fix progress screen and no upgrade done, join now confirm
|
||||
WorldOpenFlows.tryFileFixAndReportErrors port crates/horizon-world/src/datafix/files.rs::fix_world_files runs the file fixer; gap: player: cancel, symlink and failed-cleanup alerts are not shown
|
||||
WorldOpenFlows.openWorldLoadLevelStem port crates/horizon-client/src/game/world_loading.rs::WorldRequest::prepare loads the level stem and generator; gap: minor: no safe-mode retry
|
||||
WorldOpenFlows.openWorldCheckWorldStemCompatibility missing player: old-customized and experimental warning before the load; Horizon has none
|
||||
WorldOpenFlows.openWorldLoadBundledResourcePack missing player: the world's own resources.zip is not applied on open; only an old-world file fix moves it into resourcepacks (datafix fix 4772)
|
||||
WorldOpenFlows.openWorldCheckDiskSpace missing player: no low-disk-space warning before loading a world
|
||||
WorldOpenFlows.loadBundledResourcePack missing player: pushes the world's resources.zip as a local pack; Horizon has no such path
|
||||
WorldOpenFlows.promptBundledPackLoadFailure missing minor: prompt when the world's own pack fails to load; no such pack in Horizon
|
||||
|
@@ -0,0 +1,32 @@
|
||||
WorldSelectionList.pollLevelsIgnoreErrors inline crates/horizon-client/src/title.rs::list_worlds the list is read at once, so there is no pending state; a world whose level.dat fails to read is skipped; the upload filter is Realms only, not ported
|
||||
WorldSelectionList.extractWidgetRenderState inline crates/horizon-client/src/title.rs::Title::draw the list comes from recent_worlds, re-read at most every 2 seconds, not on every frame
|
||||
WorldSelectionList.handleNewLevels inline crates/horizon-client/src/title.rs::Title::enter_singleplayer no worlds opens the new-world screen; otherwise the list is Mode::Select; the Realms upload empty entry is skipped
|
||||
WorldSelectionList.updateFilter inline crates/horizon-client/src/title.rs::Title::visible_worlds the search text is applied at each draw; there is no refill step
|
||||
WorldSelectionList.loadLevels inline crates/horizon-client/src/title.rs::list_worlds gap: minor: an unreadable saves folder shows no worlds instead of the Unable to load error screen
|
||||
WorldSelectionList.fillLevels inline crates/horizon-client/src/title.rs::Title::search_changed gap: minor: any search edit clears the selection; vanilla keeps it while its world still matches the filter
|
||||
WorldSelectionList.filterAccepts port crates/horizon-client/src/title.rs::Title::matches_search
|
||||
WorldSelectionList.handleLevelLoadFailure inline crates/horizon-client/src/title.rs::Title::failed gap: minor: list_worlds never fails, so the Unable to load screen never shows
|
||||
WorldSelectionList.setSelected inline crates/horizon-client/src/title.rs::Title::click_action selection is set on the row click path and cleared by search edits
|
||||
WorldSelectionList.getSelectedOpt inline crates/horizon-client/src/title.rs::Title::click_action the selected world is looked up by index in the Select arms
|
||||
WorldSelectionList.updateWidgetNarration skip:ui narration only; Horizon has no narrator output
|
||||
WorldSelectionList.Builder.build skip:java builder for the list constructor
|
||||
WorldSelectionList.LoadingHeader.extractContent skip:other saves are read at once, so the loading header is never shown
|
||||
WorldSelectionList.NoWorldsEntry.extractContent skip:service empty entry of the Realms world upload list only
|
||||
WorldSelectionList.WorldListEntry.<init> port crates/horizon-client/src/title.rs::Title::draw gap: minor: no hover tooltip on overflowing name, folder or info text; the name, folder and date, and mode and version lines are drawn
|
||||
WorldSelectionList.WorldListEntry.validateIconFile port crates/horizon-client/src/title.rs::Title::icon gap: minor: no symlink check; an icon that is not a decodable 64x64 image shows the unknown-server icon
|
||||
WorldSelectionList.WorldListEntry.getNarration skip:ui narration text only; Horizon has no narrator output
|
||||
WorldSelectionList.WorldListEntry.keyPressed missing player: Enter or Space on a selected world does nothing (title Enter only confirms a rename), so keyboard players cannot join from the list
|
||||
WorldSelectionList.WorldListEntry.canInteract missing player: vanilla greys out locked and incompatible worlds and will not open them; Horizon's list_worlds has no lock or compatibility check, so Play opens every listed world
|
||||
WorldSelectionList.WorldListEntry.joinWorld port crates/horizon-client/src/title.rs::Title::click_action gap: minor: no warning for a symlinked world before it opens
|
||||
WorldSelectionList.WorldListEntry.deleteWorld port crates/horizon-client/src/title.rs::Title::click_action gap: minor: no progress screen while the world is deleted
|
||||
WorldSelectionList.WorldListEntry.doDeleteWorld port crates/horizon-client/src/title.rs::Title::confirm_delete gap: minor: a failed delete shows the error screen, not the world delete failure toast
|
||||
WorldSelectionList.WorldListEntry.editWorld port crates/horizon-client/src/title.rs::Title::click_action gap: minor: no data-read screen and no access-failure toast
|
||||
WorldSelectionList.WorldListEntry.recreateWorld port crates/horizon-client/src/title.rs::Title::click_action gap: player: Re-Create takes the name, seed, mode and options into Create; no old-customized-world confirm, no datapack copy, and an unreadable world does nothing instead of showing an alert
|
||||
WorldSelectionList.WorldListEntry.loadIcon port crates/horizon-client/src/title.rs::Title::icon icon.png is decoded at draw time and cached by modification time; gap: minor: no symlink check
|
||||
PlayerMenuItem.extractIcon port crates/horizon-client/src/spectator_menu.rs::icon Item::Player arm: face at 2,2 size 12; vanilla ignores brightness, but only enabled players are listed, so no difference
|
||||
SpectatorMenu.getItems inline crates/horizon-client/src/spectator_menu.rs::SpectatorGui::hotbar the nine-slot loop; each slot is read through SpectatorMenu::item
|
||||
SpectatorPage.getItem inline crates/horizon-client/src/spectator_menu.rs::SpectatorMenu::item the page bounds check and the empty-slot fallback are folded into item
|
||||
TeleportToPlayerMenuCategory.extractIcon port crates/horizon-client/src/spectator_menu.rs::icon Item::TeleportToPlayer arm: teleport_to_player sprite at 16x16 with brightness and alpha tint
|
||||
TeleportToTeamMenuCategory.extractIcon port crates/horizon-client/src/spectator_menu.rs::icon Item::TeleportToTeam arm: teleport_to_team sprite at 16x16 with brightness and alpha tint
|
||||
TeleportToTeamMenuCategory.TeamSelectionItem.create port crates/horizon-client/src/game/spectator.rs::Game::new_spectator_menu team members come from the tab list, non-spectators only; no members means no entry; the icon is a random member's skin
|
||||
TeleportToTeamMenuCategory.TeamSelectionItem.extractIcon port crates/horizon-client/src/spectator_menu.rs::icon Item::Team arm: team colour fill at 1,1 to 15,15 scaled by brightness, then the face
|
||||
|
@@ -0,0 +1,11 @@
|
||||
LocationPredicate.matches port crates/horizon-client/src/advancements.rs::location position, biome, structure, dimension and block checks for advancement criteria
|
||||
MultiLineEditBox.setValue missing minor: unsure: book pages keep their own text in books.rs; no multi-line box setter found
|
||||
TransferableSelectionList.PackEntry.mouseClicked inline crates/horizon-client/src/pack_screen.rs::PackScreen::click entry select, move arrows and double-click transfer
|
||||
CompoundTag.getIntArray skip:java typed NBT accessor; Rust matches Tag::IntArray where it reads one
|
||||
Component.toFlatList skip:java Horizon Text already keeps flat styled spans
|
||||
Style.withColor port crates/horizon-client-core/src/text.rs::Text::with_color colour on the text span
|
||||
MinecraftServer.halt port crates/horizon-client/src/game/integrated.rs::Integrated::halt stop the integrated server and wait for it
|
||||
DedicatedPlayerList.loadOps inline crates/horizon-server-files/src/user_lists.rs::UserList::load ops.json through the shared user-list loader
|
||||
ServerStatsCounter.toJson inline crates/horizon-client/src/game/stats.rs::Stats::write stats JSON built while saving
|
||||
LevelChunk.getFluidState port crates/horizon-world/src/level/mod.rs::Behaviours::fluid fluid state of a block state
|
||||
Fox.getBreedOffspring inline crates/horizon-client/src/game/creatures.rs::Game::breed the Fox arm: either parent's variant on a coin flip
|
||||
|
@@ -0,0 +1,144 @@
|
||||
BlockDestructionProgress.equals skip:java identity by breaker id; Horizon keys cracks by breaker id in a map
|
||||
BlockDestructionProgress.compareTo inline crates/horizon-client/src/game.rs::Game::cracks the furthest progress on a block wins (max per position)
|
||||
ChunkGenerationTask.create inline crates/horizon-client/src/streaming.rs::Streaming::schedule_generation a Job::Generate per column; neighbours are held as protos, not a claimed holder cache
|
||||
ChunkGenerationTask.runUntilWait inline crates/horizon-client/src/streaming.rs::Streaming::update stages advance as worker results come back, not by waiting on futures
|
||||
ChunkGenerationTask.scheduleNextLayer inline crates/horizon-client/src/streaming.rs::Streaming::update next stage is generate, then decorate, then finish
|
||||
ChunkGenerationTask.releaseClaim skip:other generation claims keep a chunk from unloading while a task reads it; Horizon checks protos out (None) to the job instead
|
||||
ChunkGenerationTask.canLoadWithoutGeneration inline crates/horizon-client/src/streaming.rs::ChunkGenerator::load the worker tries a saved final chunk first, else makes (or restores) a proto
|
||||
ChunkGenerationTask.getCenter skip:java accessor
|
||||
ChunkGenerationTask.scheduleLayer inline crates/horizon-client/src/streaming.rs::Streaming::update one stage over the 3x3 neighbourhoods
|
||||
ChunkGenerationTask.getRadiusForLayer inline crates/horizon-client/src/streaming.rs::Ranges::margins pyramid radius is two fixed margins (generate 3, decorate 2)
|
||||
ChunkGenerationTask.scheduleChunkInLayer inline crates/horizon-client/src/streaming.rs::Streaming::update decorate and finish jobs are queued per column when the 3x3 is ready
|
||||
ChunkGenerationTask.waitForScheduledLayer skip:java future bookkeeping
|
||||
ChunkHolder.addSendDependency skip:java future combinator; chunks are only sent once lit (Hub::next_batch)
|
||||
ChunkHolder.addSaveDependency skip:java future combinator; saving snapshots resident chunks directly
|
||||
ChunkHolder.blockChanged port crates/horizon-client/src/world.rs::World::set pushes the position to block_log; block entity only changes go through Game::mark_block_entity_updated
|
||||
ChunkHolder.sectionLightChanged port crates/horizon-client/src/streaming.rs::Streaming::mark_light_changes light_log bit per section; the unsaved mark is world.modified in the Lit result
|
||||
ChunkHolder.hasChangesToBroadcast inline crates/horizon-client/src/lan/hub.rs::Hub::broadcast_block_changes both broadcast fns return early when their log is empty
|
||||
ChunkHolder.broadcastBlockEntity port crates/horizon-client/src/lan/hub.rs::Hub::broadcast_block_changes BlockEntityData for changed positions with data the client shows
|
||||
ChunkHolder.scheduleFullChunkPromotion inline crates/horizon-client/src/game.rs::Game::start_ticking_chunks ticking promotion unpacks saved ticks; ticket levels are read directly
|
||||
ChunkHolder.demoteFullChunk skip:other only tells the status listener (loading map), which Horizon reads from Streaming::latest_status
|
||||
ChunkHolder.updateFutures inline crates/horizon-client/src/game.rs::Game::start_ticking_chunks promotion to ticking on level change; demotion needs no work as Levels is read each tick
|
||||
ChunkLevel.getStatusAroundFullChunk inline crates/horizon-client/src/streaming.rs::Ranges::margins fixed margins around the view instead of a status per distance
|
||||
ChunkLevel.byStatus skip:other per status ticket levels; Horizon streams by distance (Ranges), not by level
|
||||
ChunkLevel.fullStatus port crates/horizon-client/src/ticket_levels.rs::Levels::loaded_ticking 31 entity ticking, 32 block ticking, 33 full as predicates on Levels
|
||||
ChunkLoadCounter.track inline crates/horizon-client/src/game.rs::Game::level_load_progress gap: minor: counts only the player's 7x7 chunks, not the initial forced or ticketed chunks
|
||||
ChunkLoadCounter.pendingChunks inline crates/horizon-client/src/game.rs::Game::level_load_progress counts lit chunks in the 7x7 around the player
|
||||
ChunkMap.<init> inline crates/horizon-client/src/streaming.rs::Streaming::new worker pool and generator; light engine and POI storage are set up elsewhere
|
||||
ChunkMap.isChunkTracked inline crates/horizon-client/src/lan/hub.rs::Hub::broadcast_block_changes sent_chunks.contains: in the view and already sent
|
||||
ChunkMap.getChunkQueueLevel inline crates/horizon-client/src/streaming.rs::Ranges::priority job priority is a distance from the centre, not a ticket level
|
||||
ChunkMap.getChunkDebugData skip:debug chunk debug renderer text
|
||||
ChunkMap.getChunkRangeFuture inline crates/horizon-client/src/streaming.rs::Streaming::update neighbourhood waits: 3x3 protos to decorate, 3x3 decorated to finish, 3x3 lit to mesh
|
||||
ChunkMap.debugFuturesAndCreateReportedException skip:debug crash report detail
|
||||
ChunkMap.prepareEntityTickingChunk inline crates/horizon-client/src/game/creatures.rs::Game::entity_ticking_area entity ticking comes from the ticket levels alone
|
||||
ChunkMap.updateChunkScheduling inline crates/horizon-client/src/streaming.rs::Streaming::update columns past every kept range are unloaded in the update scan
|
||||
ChunkMap.onLevelChange port crates/horizon-client/src/streaming.rs::Streaming::requeue queued jobs are ranked again when the centre moves
|
||||
ChunkMap.close port crates/horizon-client/src/streaming.rs::Streaming::drop waits for saves in flight
|
||||
ChunkMap.saveAllChunks port crates/horizon-client/src/game.rs::Game::save_level modified chunks only; wait picks the flushing form
|
||||
ChunkMap.hasWork port crates/horizon-client/src/streaming.rs::Streaming::busy
|
||||
ChunkMap.processUnloads inline crates/horizon-client/src/game.rs::Game::update_world unloaded columns: modified ones saved, entities and block entities dropped
|
||||
ChunkMap.saveChunksEagerly inline crates/horizon-client/src/streaming.rs::Streaming::receive_generated gap: minor: fresh chunks are marked modified and written at the next autosave or unload, not within a few ticks
|
||||
ChunkMap.scheduleUnload inline crates/horizon-client/src/game.rs::Game::update_world save if modified, unload entities and block entities
|
||||
ChunkMap.promoteChunkMap skip:java copy of the holder map for the main thread; Horizon has one chunk map
|
||||
ChunkMap.scheduleChunkLoad port crates/horizon-client/src/streaming.rs::ChunkGenerator::load the Generate job loads a saved final chunk, else a proto is made
|
||||
ChunkMap.handleChunkLoadFailure inline crates/horizon-client/src/save.rs::SaveDir::load gap: minor: an unreadable record gives None and the column is generated again with no failure report
|
||||
ChunkMap.createEmptyChunk inline crates/horizon-client/src/streaming.rs::Streaming::schedule_generation no saved data: the Generate job makes a fresh proto
|
||||
ChunkMap.markPosition skip:java chunk type cache for isExistingChunkFull
|
||||
ChunkMap.applyStep inline crates/horizon-client/src/streaming.rs::Streaming::new the worker loop runs the Generate, Decorate and Finish jobs
|
||||
ChunkMap.scheduleGenerationTask port crates/horizon-client/src/streaming.rs::Streaming::schedule_generation
|
||||
ChunkMap.runGenerationTask port crates/horizon-client/src/streaming.rs::Streaming::submit queues the job by distance
|
||||
ChunkMap.onChunkReadyToSend inline crates/horizon-client/src/lan/hub.rs::Hub::next_batch queued columns are sent once lit
|
||||
ChunkMap.prepareAccessibleChunk inline crates/horizon-client/src/streaming.rs::Streaming::update a column finishes once its 3x3 is decorated
|
||||
ChunkMap.allChunksWithAtLeastStatus inline crates/horizon-client/src/game.rs::Game::level_load_progress only the loading screen asks: lit chunks around the player
|
||||
ChunkMap.saveChunkIfNeeded inline crates/horizon-client/src/game.rs::Game::save_level the modified set stands for the unsaved flag; autosave every 6000 ticks
|
||||
ChunkMap.isExistingChunkFull inline crates/horizon-client/src/streaming.rs::Streaming::save_checked_out protos exist only for columns not final, so one cannot overwrite a final chunk
|
||||
ChunkMap.markChunkPendingToSend port crates/horizon-client/src/lan/hub.rs::requeue chunks entering the view join the guest's queue, closest first
|
||||
ChunkMap.getChunkToSend inline crates/horizon-client/src/lan/hub.rs::Hub::next_batch only lit columns are taken
|
||||
ChunkMap.dumpChunks skip:debug CSV chunk dump
|
||||
ChunkMap.printFuture skip:debug
|
||||
ChunkMap.readChunk port crates/horizon-client/src/save.rs::SaveDir::read_record reads the raw record (pending writes first); the upgrade is done when the world opens
|
||||
ChunkMap.upgradeChunkTag inline crates/horizon-world/src/datafix/files.rs::upgrade_world_data chunks are upgraded all at once when an older world opens, not as each is read
|
||||
ChunkMap.getChunkDataFixContextTag inline crates/horizon-world/src/datafix/files.rs::upgrade_world_data dimension id and generator type passed to update_chunk per dimension folder
|
||||
ChunkMap.forEachBlockTickingChunk port crates/horizon-client/src/ticket_levels.rs::Levels::random_ticking simulation entity ticking and a ticking chunk
|
||||
ChunkMap.anyPlayerCloseEnoughForSpawningInternal inline crates/horizon-client/src/game/natural_spawning.rs::Game::spawning_chunks any non-spectator within 128 blocks of the chunk centre
|
||||
ChunkMap.playerIsCloseEnoughForSpawning port crates/horizon-client/src/game/natural_spawning.rs::close_enough_for_spawning
|
||||
ChunkMap.playerIsCloseEnoughTo inline crates/horizon-client/src/game.rs::GameLevel::can_spread_fire_around the only caller (fire spread radius), spectators left out
|
||||
ChunkMap.skipPlayer missing minor: spectators always hold chunk tickets; the spectators_generate_chunks rule is stored but never read, so with it off a spectator still loads and generates chunks
|
||||
ChunkMap.updatePlayerStatus inline crates/horizon-client/src/game.rs::Game::update_chunk_tickets tickets follow every player in the level each tick; a leaving guest's view is dropped by the hub
|
||||
ChunkMap.updateChunkTracking port crates/horizon-client/src/lan/hub.rs::Hub::update_view a new centre or view distance (center reset) re-applies the view
|
||||
ChunkMap.applyChunkTrackingView inline crates/horizon-client/src/lan/hub.rs::Hub::update_view SetChunkCacheCenter, then forget and queue the difference
|
||||
ChunkMap.getPlayers inline crates/horizon-client/src/lan/hub.rs::Hub::broadcast_block_changes guests whose sent_chunks hold the column; the border form is in broadcast_light_changes
|
||||
ChunkMap.removeEntity inline crates/horizon-client/src/lan/entity.rs::Entities::tick entities gone from the level leave each client in one RemoveEntities at the next tick
|
||||
ChunkMap.sendToTrackingPlayers port crates/horizon-client/src/lan/containers.rs::Hub::broadcast_near gap: minor: goes to guests within a fixed distance, not to the clients that track the entity
|
||||
ChunkMap.sendToTrackingPlayersFiltered port crates/horizon-client/src/lan/containers.rs::Hub::broadcast_near gap: minor: only an except-one-guest filter, same distance rule
|
||||
ChunkMap.sendToTrackingPlayersAndSelf port crates/horizon-client/src/lan/containers.rs::Hub::critical_hit the one caller, the crit animation, goes to the attacker and the clients tracking them
|
||||
ChunkMap.isTrackedByAnyPlayer skip:debug only the debug synchronizers ask
|
||||
ChunkMap.forEachEntityTrackedBy skip:debug only the debug synchronizers ask
|
||||
ChunkMap.resendBiomesForChunks missing minor: /fillbiome changes the host's biomes but sends guests no ChunksBiomes packet, so LAN guests keep the old biome tints until their chunks are sent again
|
||||
ChunkMap.waitForLightBeforeSending inline crates/horizon-client/src/lan/hub.rs::Hub::next_batch columns are sent only once lit
|
||||
ChunkMap.forEachReadyToSendChunk skip:debug only the debug synchronizers ask
|
||||
ChunkMap.TrackedEntity.equals skip:java identity by entity id; Horizon keys tracked entities by id
|
||||
ChunkMap.TrackedEntity.sendToTrackingPlayers port crates/horizon-client/src/lan/containers.rs::Hub::broadcast_near gap: minor: distance based, see ChunkMap.sendToTrackingPlayers
|
||||
ChunkMap.TrackedEntity.sendToTrackingPlayersAndSelf port crates/horizon-client/src/lan/containers.rs::Hub::critical_hit the attacker plus clients tracking them
|
||||
ChunkMap.TrackedEntity.sendToTrackingPlayersFiltered port crates/horizon-client/src/lan/containers.rs::Hub::broadcast_near gap: minor: only an except-one-guest filter
|
||||
ChunkMap.TrackedEntity.broadcastRemoved inline crates/horizon-client/src/lan/entity.rs::Entities::tick removed entities leave each client in one RemoveEntities
|
||||
ChunkMap.TrackedEntity.removePlayer inline crates/horizon-client/src/lan/entity.rs::Entities::tick the client's tracker loses entities out of range or level
|
||||
ChunkMap.TrackedEntity.updatePlayers port crates/horizon-client/src/lan/entity.rs::Entities::tick gap: player: broadcastToPlayer is not checked, so a spectating player is tracked and shown to non-spectators as a normal player model
|
||||
ChunkResult.error skip:java result type
|
||||
ChunkTaskDispatcher.hasWork port crates/horizon-client/src/streaming.rs::Streaming::busy
|
||||
ChunkTaskDispatcher.onLevelChange port crates/horizon-client/src/streaming.rs::Streaming::requeue
|
||||
ChunkTaskDispatcher.release missing minor: queued jobs of a column that lost its ticket are not cancelled; their results are dropped on arrival (Done::Proto range check)
|
||||
ChunkTaskDispatcher.submit port crates/horizon-client/src/streaming.rs::Streaming::submit
|
||||
ChunkTaskDispatcher.pollTask inline crates/horizon-client/src/streaming.rs::Streaming::new each worker pops the most urgent job
|
||||
ChunkTaskDispatcher.scheduleForExecution inline crates/horizon-client/src/streaming.rs::Streaming::new the worker runs the job it popped
|
||||
ChunkTaskPriorityQueue.resortChunkTasks port crates/horizon-client/src/streaming.rs::rank_again
|
||||
ChunkTaskPriorityQueue.release missing minor: no per column release; queued jobs stay queued until run
|
||||
ChunkTaskPriorityQueue.pop inline crates/horizon-client/src/streaming.rs::Streaming::new BinaryHeap pop in the worker loop
|
||||
ChunkTracker.checkNeighborsAfterUpdate inline crates/horizon-client/src/ticket_levels.rs::compute closed form: ticket level plus Chebyshev distance, rebuilt when sources change
|
||||
ChunkTracker.getComputedLevel inline crates/horizon-client/src/ticket_levels.rs::compute lowest ticket level plus distance, per cell
|
||||
ChunkTracker.computeLevelFromNeighbor inline crates/horizon-client/src/ticket_levels.rs::compute one level per chunk of distance
|
||||
ChunkTrackingView.difference inline crates/horizon-client/src/lan/hub.rs::Hub::update_view forget what left (scan of sent chunks), queue what entered (requeue)
|
||||
ChunkTrackingView.isWithinDistance port crates/horizon-client/src/lan/hub.rs::tracked buffer 2 form; the buffer 1 form is streaming.rs in_view_distance
|
||||
ChunkTrackingView.Positioned.squareIntersects skip:java optimisation that picks a box scan over a full enumeration
|
||||
ChunkTrackingView.Positioned.contains port crates/horizon-client/src/lan/hub.rs::tracked
|
||||
ChunkTrackingView.Positioned.forEach inline crates/horizon-client/src/lan/hub.rs::requeue loops the view's square around the centre
|
||||
ColumnPos.asLong skip:java key packing
|
||||
DemoMode missing minor: no demo mode: no demo timer, intro hints or five day limit (the dedicated server's --demo argument is accepted and ignored)
|
||||
DistanceManager.runAllUpdates port crates/horizon-client/src/ticket_levels.rs::ChunkTickets::update levels rebuilt when sources change
|
||||
DistanceManager.addPlayer inline crates/horizon-client/src/game.rs::Game::update_chunk_tickets players are tickets sources each tick
|
||||
DistanceManager.removePlayer inline crates/horizon-client/src/game.rs::Game::update_chunk_tickets a player gone from the level drops out of the sources
|
||||
DistanceManager.getChunkLevel port crates/horizon-client/src/ticket_levels.rs::Levels::get loading and simulation level as a pair
|
||||
DistanceManager.updateSimulationDistance inline crates/horizon-client/src/game.rs::Game::update_chunk_tickets simulation_distance read from settings into Sources
|
||||
DistanceManager.hasPlayersNearby inline crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::players_near the 8 chunk gate; the 5 chunk shortcut is skipped
|
||||
DistanceManager.forEachEntityTickingChunk inline crates/horizon-client/src/ticket_levels.rs::Levels::random_ticking the simulation half of the random tick test
|
||||
DistanceManager.FixedPlayerDistanceChunkTracker.setLevel inline crates/horizon-client/src/ticket_levels.rs::compute cells are filled by compute
|
||||
DistanceManager.FixedPlayerDistanceChunkTracker.havePlayer inline crates/horizon-client/src/game.rs::Game::update_chunk_tickets players' chunks are the sources
|
||||
DistanceManager.PlayerTicketTracker.onLevelChange inline crates/horizon-client/src/ticket_levels.rs::compute loading level 31 plus distance beyond the view; no throttle of 4 loads at a time
|
||||
DistanceManager.PlayerTicketTracker.updateViewDistance inline crates/horizon-client/src/ticket_levels.rs::reach view distance sets how far the loading levels reach
|
||||
DistanceManager.PlayerTicketTracker.runAllUpdates inline crates/horizon-client/src/ticket_levels.rs::ChunkTickets::update
|
||||
GenerationChunkHolder.scheduleChunkGenerationTask inline crates/horizon-client/src/streaming.rs::Streaming::schedule_generation the scan picks the columns that need a job
|
||||
GenerationChunkHolder.applyStep inline crates/horizon-client/src/streaming.rs::Streaming::update queues the Decorate and Finish jobs
|
||||
GenerationChunkHolder.updateHighestAllowedStatus inline crates/horizon-client/src/streaming.rs::Ranges::requested how far a column may be generated follows the ranges
|
||||
GenerationChunkHolder.replaceProtoChunk inline crates/horizon-client/src/streaming.rs::Streaming::receive_generated the proto becomes the final column
|
||||
GenerationChunkHolder.rescheduleChunkTask inline crates/horizon-client/src/streaming.rs::GenerationScan::candidates wanted columns are scanned again when ranges change
|
||||
GenerationChunkHolder.getOrCreateFuture skip:java per status future
|
||||
GenerationChunkHolder.failAndClearPendingFuturesBetween skip:java future bookkeeping
|
||||
GenerationChunkHolder.failAndClearPendingFuture skip:java future bookkeeping
|
||||
GenerationChunkHolder.completeFuture skip:java future bookkeeping
|
||||
GenerationChunkHolder.findHighestStatusWithPendingFuture skip:java future bookkeeping
|
||||
GenerationChunkHolder.acquireStatusBump skip:java future bookkeeping
|
||||
GenerationChunkHolder.isStatusDisallowed inline crates/horizon-client/src/streaming.rs::Ranges::requested
|
||||
GenerationChunkHolder.increaseGenerationRefCount skip:other keeps a chunk from saving or unloading under a task; Horizon checks protos out to the job instead
|
||||
GenerationChunkHolder.decreaseGenerationRefCount skip:other see increaseGenerationRefCount
|
||||
GenerationChunkHolder.getChunkIfPresentUnchecked skip:java future lookup; Horizon reads protos and world.chunks
|
||||
GenerationChunkHolder.getLatestChunk skip:java future lookup; Horizon reads protos and world.chunks
|
||||
GenerationChunkHolder.getPersistedStatus skip:other Horizon tells proto and final apart by type (SavedProto or Chunk)
|
||||
GenerationChunkHolder.getAllFutures skip:debug
|
||||
GenerationChunkHolder.getLatestStatus port crates/horizon-client/src/streaming.rs::Streaming::latest_status furthest step reached, for the loading map
|
||||
LoadingChunkTracker.getLevel port crates/horizon-client/src/ticket_levels.rs::Levels::get the loading half of the pair
|
||||
LoadingChunkTracker.setLevel inline crates/horizon-client/src/ticket_levels.rs::ChunkTickets::update levels are rebuilt when sources change
|
||||
PlayerSpawnFinder.scheduleNext port crates/horizon-client/src/world_spawn.rs::PlayerSpawnFinder::next_candidate coprime stride order, then the suggestion
|
||||
PlayerSpawnFinder.scheduleCandidate port crates/horizon-client/src/game/initial_spawn.rs::Game::search_spawn gap: minor: the in-frame path waits for the candidate's chunk, but a server tick (LAN, dedicated) passes over candidates in unloaded chunks, so a new guest can stand on another spot of the radius
|
||||
SectionTracker.checkNeighborsAfterUpdate inline crates/horizon-client/src/game/raids.rs::sections_to_village its only subclass is the POI village distance: Chebyshev distance in sections, 7 when farther than 6
|
||||
SectionTracker.getComputedLevel inline crates/horizon-client/src/game/raids.rs::sections_to_village
|
||||
SectionTracker.computeLevelFromNeighbor inline crates/horizon-client/src/game/raids.rs::sections_to_village
|
||||
|
@@ -0,0 +1,146 @@
|
||||
ServerBossEvent.setProgress inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events UpdateProgress goes out when a viewer's last-sent progress differs
|
||||
ServerBossEvent.setColor inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events UpdateStyle when colour or overlay differ from what the viewer was sent
|
||||
ServerBossEvent.setOverlay inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events same UpdateStyle packet as the colour
|
||||
ServerBossEvent.setDarkenScreen inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events UpdateProperties when darken, music or fog differ
|
||||
ServerBossEvent.setPlayBossMusic inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events same UpdateProperties packet
|
||||
ServerBossEvent.setCreateWorldFog inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events same UpdateProperties packet
|
||||
ServerBossEvent.setName inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events UpdateName when the name differs
|
||||
ServerBossEvent.broadcast inline crates/horizon-client/src/game/bossbars.rs::Game::publish_boss_bars bars are re-evaluated each tick per viewer and the diff is sent to that viewer only
|
||||
ServerBossEvent.addPlayer inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events a viewer in the bar's player list gets an Add the first time it is wanted
|
||||
ServerBossEvent.removePlayer inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events a Remove goes out once the viewer no longer wants the bar
|
||||
ServerBossEvent.removeAllPlayers inline crates/horizon-client/src/game/bossbars.rs::Game::diff_boss_events every viewer gets its Remove from the same diff
|
||||
ServerBossEvent.setVisible inline crates/horizon-client/src/game/bossbars.rs::Game::boss_events_for a hidden bar is left out of the wanted list, so the diff sends Remove or Add
|
||||
ServerChunkCache.<init> inline crates/horizon-client/src/streaming.rs::Streaming::new builds the chunk map and workers per level; forced chunks are loaded in world_loading, no ticket storage object
|
||||
ServerChunkCache.storeInCache skip:java 4-entry last-chunk lookup cache
|
||||
ServerChunkCache.getChunk inline crates/horizon-client/src/streaming.rs::Streaming::update chunks load and generate asynchronously around tickets; callers read World::chunks and skip an absent column, nothing waits for a target status
|
||||
ServerChunkCache.getChunkNow port crates/horizon-client/src/world.rs::World::loaded World::chunks.get is the lookup itself
|
||||
ServerChunkCache.clearCache skip:java clears the 4-entry lookup cache
|
||||
ServerChunkCache.getChunkFuture inline crates/horizon-client/src/streaming.rs::Streaming::update no futures; the worker pool delivers columns to the game thread
|
||||
ServerChunkCache.getChunkFutureMainThread inline crates/horizon-client/src/streaming.rs::Streaming::update no futures or per-request tickets; streaming loads by distance
|
||||
ServerChunkCache.hasChunk port crates/horizon-client/src/world.rs::World::loaded
|
||||
ServerChunkCache.getChunkForLighting inline crates/horizon-client/src/streaming.rs::Streaming::light_region the 3x3 region handed to the light workers
|
||||
ServerChunkCache.runDistanceManagerUpdates inline crates/horizon-client/src/game.rs::Game::update_chunk_tickets ticket levels are recomputed once a tick from players and forced chunks
|
||||
ServerChunkCache.isPositionTicking port crates/horizon-client/src/game.rs::GameLevel::is_ticking_chunk block-ticking ticket level and a lit chunk with its neighbours loaded
|
||||
ServerChunkCache.close inline crates/horizon-client/src/game.rs::Game::save_game save with wait; nothing else to close
|
||||
ServerChunkCache.broadcastChangedChunks port crates/horizon-client/src/lan/hub.rs::Hub::broadcast_block_changes block changes grouped by section as BlockUpdate or SectionBlocksUpdate, plus block entity data; light is in broadcast_light_changes
|
||||
ServerChunkCache.getFullChunk inline crates/horizon-client/src/game/natural_spawning.rs::Game::spawn_natural the spawn pass reads World::chunks directly
|
||||
ServerChunkCache.blockChanged inline crates/horizon-client/src/world.rs::World::set World::set pushes the position onto block_log, which the hub drains
|
||||
ServerChunkCache.onLightUpdate port crates/horizon-client/src/lan/hub.rs::Hub::broadcast_light_changes light_log read once a tick; sent to players for whom the column is on the tracked border
|
||||
ServerChunkCache.addTicketAndLoadWithRadius inline crates/horizon-client/src/streaming.rs::Streaming::update spawn search and guest placement wait for streaming to produce the columns; no ticket-with-radius future
|
||||
ServerChunkCache.MainThreadExecutor.pollTask inline crates/horizon-client/src/streaming.rs::Streaming::update chunk-system updates run once per tick (streaming and ticket levels); there is no task queue to poll
|
||||
ServerEntity.isFullPrecisionEncodingRequired missing minor: item entities against a wall are sent as quantised deltas, so a LAN guest can see them off by a hair; TNT and happy ghast use the precise flag instead
|
||||
ServerEntity.handleMinecartPosRot skip:other only for the experimental minecart_improvements movement; Horizon has the old minecart movement only
|
||||
ServerEntity.addPairing inline crates/horizon-client/src/lan/entity.rs::Entities::tick a viewer that starts tracking an entity gets ServerEntity::pairing bundled, and the entity is remembered per viewer
|
||||
ServerEntityGetter.getNearestPlayer inline crates/horizon-client/src/game/lan_mobs.rs::player_for each mob is given one player (the host or a guest) per tick, then Mob::can_target_player and friends apply the TargetingConditions
|
||||
ServerEntityGetter.getNearestEntity inline crates/horizon-client/src/mobs/world.rs::MobWorld::nearby nearest-first scan used by NearestTarget; the goal applies its own conditions
|
||||
ServerEntityGetter.getNearbyPlayers inline crates/horizon-client/src/mobs/goals.rs::Mob::can_target_player gap: minor: tests only the one player a mob sees, so a phantom or iron golem with several players around considers one of them
|
||||
ServerEntityGetter.getNearbyEntities inline crates/horizon-client/src/mobs/world.rs::MobWorld::nearby each caller (breed partner, raider shout, fox, evoker) scans this and filters itself
|
||||
ServerLevel.<init> inline crates/horizon-client/src/game/world_loading.rs::WorldRequest::prepare
|
||||
ServerLevel.getNextEntityId inline crates/horizon-client/src/game/lan_entities.rs::Game::lan_assign_ids one counter, Game::next_entity, bumped wherever an entity is created; ids for guests' tracking are given here
|
||||
ServerLevel.tickCustomSpawners inline crates/horizon-client/src/game/creatures.rs::Game::tick_creatures wandering trader, patrol, cat and siege spawners; the phantom spawner runs from stats.rs
|
||||
ServerLevel.tickThunder port crates/horizon-client/src/game/lightning.rs::Game::tick_thunder
|
||||
ServerLevel.findLightningTargetAround port crates/horizon-client/src/game/lightning.rs::Game::lightning_target
|
||||
ServerLevel.announceSleepStatus port crates/horizon-client/src/game/lan_actions.rs::Game::announce_sleep_status
|
||||
ServerLevel.getMoonBrightness inline crates/horizon-client/src/game/creatures.rs::Game::local_difficulty MOON_BRIGHTNESS table indexed by day / 24000 mod 8
|
||||
ServerLevel.prepareWeather port crates/horizon-client/src/save.rs::Level::read rain and thunder levels start at 1 when the saved flags are on
|
||||
ServerLevel.advanceWeatherCycle port crates/horizon-client/src/world.rs::Weather::tick_timers level fade in tick_levels, game events broadcast in Hub::sync_world
|
||||
ServerLevel.resetWeatherCycle inline crates/horizon-client/src/game.rs::Game::tick_sleep the sleep-through-night reset; /weather sets the timers itself
|
||||
ServerLevel.tickFluid port crates/horizon-world/src/level/tick.rs::Behaviours::scheduled_step
|
||||
ServerLevel.tickBlock port crates/horizon-world/src/level/tick.rs::Behaviours::scheduled_step
|
||||
ServerLevel.tickPassenger inline crates/horizon-client/src/game/passengers.rs::Game::sync_riders a rider whose vehicle is gone or dead lets go; others are re-seated each tick
|
||||
ServerLevel.updateNeighboursOnBlockSet inline crates/horizon-world/src/level/update.rs::Sim::set_block_limit neighbour and comparator updates inside setBlock
|
||||
ServerLevel.mayInteract inline crates/horizon-client/src/game/lan_actions.rs::Game::under_spawn_protection gap: minor: spawn protection only for guests on a dedicated server; the world border check is a stub that always allows (hand.rs within_border), so blocks can be built and broken outside the border
|
||||
ServerLevel.save port crates/horizon-client/src/game.rs::Game::save_level
|
||||
ServerLevel.saveLevelData port crates/horizon-client/src/game.rs::Game::save_game_metadata
|
||||
ServerLevel.getEntities inline crates/horizon-client/src/game/commands.rs::Game::select_in_level entity selectors filter the per-kind entity lists
|
||||
ServerLevel.addDuringTeleport inline crates/horizon-client/src/game/nether_portal.rs::Game::resolve_arrivals mobs, items, boats and carts waiting for a portal exit join the level with the chunk entities; players go through Hub::respawn
|
||||
ServerLevel.addPlayer inline crates/horizon-client/src/lan/hub.rs::Hub::place_new_player
|
||||
ServerLevel.addEntity inline crates/horizon-client/src/game/creatures.rs::Game::spawn_mob mobs go in Game::mobs; other kinds have their own lists
|
||||
ServerLevel.tryAddFreshEntityWithPassengers inline crates/horizon-client/src/game/persist.rs::Game::load_mob gap: minor: loads a mob with its Passengers but never refuses a UUID that is already loaded, so /summon with a fixed UUID twice makes two
|
||||
ServerLevel.unload inline crates/horizon-client/src/game.rs::Game::update_world unloaded columns drop their block entities and names, and their entities are saved out
|
||||
ServerLevel.playSeededSound port crates/horizon-client/src/lan/containers.rs::Hub::sound
|
||||
ServerLevel.sendBlockUpdated inline crates/horizon-client/src/world.rs::World::set gap: minor: mobs never re-plan a path when a block on it changes (Mob::recompute_path is never triggered by a block update), so they walk a stale path until a goal re-paths
|
||||
ServerLevel.neighborChanged port crates/horizon-world/src/level/hooks.rs::Sim::neighbor_changed
|
||||
ServerLevel.getDestroyType port crates/horizon-client/src/game.rs::Game::explode mob explosions pick Keep, Destroy or DestroyWithDecay from mob_griefing and mob_explosion_drop_decay
|
||||
ServerLevel.doBlockEvent inline crates/horizon-world/src/level/pistons.rs::Behaviours::run_block_events
|
||||
ServerLevel.getEntityInAnyDimension missing minor: owner and target references resolve in the level in place only; parked levels are not searched
|
||||
ServerLevel.getEntityOrPart inline crates/horizon-client/src/game/lan_actions.rs::Game::look_at_entity an entity id from a guest finds a mob, an object or a tracked dragon part or end crystal
|
||||
ServerLevel.findClosestBiome3d port crates/horizon-client/src/vanillagen.rs::VanillaTerrain::find_closest_biome
|
||||
ServerLevel.getWorldBorder inline crates/horizon-client/src/game/scoreboard.rs::Game::load_scoreboard the border is unpacked from saved data next to the scoreboard
|
||||
ServerLevel.setChunkForced port crates/horizon-client/src/game/commands/terrain_cmds.rs::Game::cmd_forceload
|
||||
ServerLevel.updatePOIOnBlockStateChange inline crates/horizon-client/src/poi_sections.rs::PoiSections::get no incremental records: a section's POI list is rebuilt from its blocks after any edit
|
||||
ServerLevel.saveDebugReport skip:debug
|
||||
ServerLevel.dumpEntities skip:debug
|
||||
ServerLevel.dumpBlockEntityTickers skip:debug
|
||||
ServerLevel.clearBlockEvents skip:debug test hook for game tests
|
||||
ServerLevel.getWatchdogStats skip:server server watchdog crash text
|
||||
ServerLevel.getTypeCount skip:debug
|
||||
ServerLevel.onStructureStartsAvailable skip:other Horizon computes structure starts from the seed (VanillaTerrain) instead of caching them in a StructureCheck
|
||||
ServerLevel.waitForEntities skip:other entities load together with their chunk, so a spawning player has nothing to wait for
|
||||
ServerLevel.areEntitiesActuallyLoadedAndTicking skip:debug only game tests call it
|
||||
ServerLevel.anyPlayerCloseEnoughForSpawning port crates/horizon-client/src/game/natural_spawning.rs::close_enough_for_spawning
|
||||
ServerLevel.fillReportDetails skip:debug crash report detail
|
||||
ServerLevel.EntityCallbacks.onCreated inline crates/horizon-client/src/lan/waypoints.rs::Waypoints::track players are the only waypoint transmitters Horizon has
|
||||
ServerLevel.EntityCallbacks.onDestroyed inline crates/horizon-client/src/lan/waypoints.rs::Waypoints::untrack gap: minor: dead non-player entities keep their scores and team membership (vanilla Scoreboard.entityRemoved clears them), so a sidebar can keep listing a dead mob
|
||||
ServerLevel.EntityCallbacks.onTrackingStart inline crates/horizon-client/src/lan/entity.rs::Entities::tick an entity is tracked the first tick the level lists it; guests, waypoints and the sleep list are polled each tick, and there are no separate dragon part entities
|
||||
ServerLevel.EntityCallbacks.onTrackingEnd inline crates/horizon-client/src/lan/entity.rs::Entities::tick an entity the level stops listing is removed from every viewer (RemoveEntities)
|
||||
ServerPlayer.<init> port crates/horizon-client/src/lan/guest.rs::Guest::new
|
||||
ServerPlayer.readAdditionalSaveData port crates/horizon-client/src/save.rs::Level::read_player gap: minor: entered_nether_pos, last_explosion_impact_pos, spawn_extra_particles_on_fall, post_effects and previousPlayerGameType are not read back (kept verbatim in player_extra); recipe book, respawn, shoulders, warden tracker and raid omen are read
|
||||
ServerPlayer.addAdditionalSaveData port crates/horizon-client/src/save.rs::Level::player_tag gap: minor: writes only what it reads; the keys above come from the loaded file unchanged
|
||||
ServerPlayer.saveParentVehicle missing player: quitting while riding a horse, boat or minecart and reloading leaves the player standing next to the mount instead of still riding it
|
||||
ServerPlayer.loadAndSpawnParentVehicle missing player: the player is never put back on its mount when the world loads
|
||||
ServerPlayer.saveEnderPearls missing minor: a thrown ender pearl is not saved at all, so one in flight or hanging in a stasis chamber is gone after a reload
|
||||
ServerPlayer.loadAndSpawnEnderPearl missing minor: ender pearls are not loaded back (spawn_loaded_entities has no pearl)
|
||||
ServerPlayer.setExperiencePoints port crates/horizon-client/src/game/commands.rs::Game::change_experience /xp set points
|
||||
ServerPlayer.setExperienceLevels port crates/horizon-client/src/game/commands.rs::Game::change_experience /xp set levels
|
||||
ServerPlayer.onLeaveCombat skip:other the client ignores ClientboundPlayerCombatEnd
|
||||
ServerPlayer.playShoulderEntityAmbientSound missing player: a parrot on the player's shoulder never chirps or imitates nearby mobs (1 in 200 ticks in vanilla)
|
||||
ServerPlayer.respawnEntityOnShoulder port crates/horizon-client/src/game/shoulders.rs::Game::remove_entities_on_shoulder
|
||||
ServerPlayer.trackStartFallingPosition missing player: the Caves & Cliffs (fall_from_height) and Who Needs Rockets? (fall_after_explosion) advancements can never be earned; neither trigger exists
|
||||
ServerPlayer.trackEnteredOrExitedLavaOnVehicle missing player: the This Boat Has Legs advancement (ride_entity_in_lava) can never be earned; the trigger does not exist
|
||||
ServerPlayer.updateScoreForCriteria port crates/horizon-client/src/game/scoreboard.rs::Game::tick_scoreboard health, food, air, armor, xp and level objectives
|
||||
ServerPlayer.tellNeutralMobsThatIDied missing player: wolves, bees, piglins and other mobs that were angry at the player stay angry after the player dies and respawns (vanilla forgives them with forgive_dead_players)
|
||||
ServerPlayer.handleTeamKill inline crates/horizon-client/src/game/scoreboard.rs::Game::score_player_killed teamkill and killedByTeam objectives
|
||||
ServerPlayer.hurtServer port crates/horizon-client/src/game/lan_pvp.rs::Game::pvp_land pvp rule and team friendly fire gate the damage
|
||||
ServerPlayer.addPostEffect port crates/horizon-client/src/game/commands/extra.rs::Game::cmd_posteffect gap: minor: one list shared by every target, nothing is sent to guests (an empty list at join) and no post shader is drawn
|
||||
ServerPlayer.clearPostEffects port crates/horizon-client/src/game/commands/extra.rs::Game::cmd_posteffect gap: minor: same as addPostEffect
|
||||
ServerPlayer.removePostEffect port crates/horizon-client/src/game/commands/extra.rs::Game::cmd_posteffect gap: minor: same as addPostEffect
|
||||
ServerPlayer.forceSetRotation inline crates/horizon-client/src/game/commands/world_cmds.rs::Game::cmd_rotate /rotate turns a guest through a teleport packet with the new rotation
|
||||
ServerPlayer.triggerDimensionChangeTriggers port crates/horizon-client/src/game/advancements.rs::Game::trigger_dimension gap: player: nether_travel is never triggered (entered_nether_pos is not kept), so the Subspace Bubble advancement can never be earned
|
||||
ServerPlayer.broadcastToPlayer missing player: a spectator (the host or a LAN guest) is shown to the other players as an ordinary visible player; vanilla hides spectators from everyone who is not a spectator
|
||||
ServerPlayer.startSleeping port crates/horizon-client/src/game.rs::Game::try_sleep
|
||||
ServerPlayer.isReachableBedBlock inline crates/horizon-client/src/game.rs::Game::try_sleep the reachable closure: 3 blocks sideways, 2 vertically
|
||||
ServerPlayer.isInvulnerableTo inline crates/horizon-client/src/game/lan_mobs.rs::Game::lan_guest_views gap: minor: only the not-loaded part (a guest that has not sent PlayerLoaded is ignored by mobs); no invulnerability while a dimension change is pending
|
||||
ServerPlayer.openNautilusInventory missing player: sneak-using a tamed nautilus does nothing, so its saddle and armour screen never opens (items can only be put on by right-clicking with them)
|
||||
ServerPlayer.doCloseContainer inline crates/horizon-client/src/lan/containers.rs::Hub::container_closed the carried stack and a crafting grid go back through Game::guest_carried_back and lan_crafting_closed
|
||||
ServerPlayer.rideTick inline crates/horizon-client/src/game/stats.rs::Game::movement_stats only the riding statistics part; the ride itself is per vehicle
|
||||
ServerPlayer.didNotMove inline crates/horizon-client/src/game/stats.rs::Game::movement_stats a move of 0 cm counts nothing
|
||||
ServerPlayer.awardStat port crates/horizon-client/src/game/stats.rs::Stats::add scoreboard objectives follow in stat_criteria_changed
|
||||
ServerPlayer.resetStat port crates/horizon-client/src/game/stats.rs::Stats::reset
|
||||
ServerPlayer.disconnect inline crates/horizon-client/src/game/lan.rs::Game::tick_lan HostEvent::Left: the guest is saved and removed; its mount just loses its rider (no eject or forced wake)
|
||||
ServerPlayer.transferInventoryXpAndScore inline crates/horizon-client/src/game/screens.rs::Game::respawn_player keep_inventory keeps the inventory and Experience::respawn keeps xp
|
||||
ServerPlayer.onEffectUpdated port crates/horizon-client/src/lan/hub.rs::Hub::sync_effects gap: player: the effects_changed trigger does not exist, so How Did We Get Here? and A Furious Cocktail can never be earned
|
||||
ServerPlayer.onEffectsRemoved port crates/horizon-client/src/lan/hub.rs::Hub::sync_effects gap: player: same missing effects_changed trigger
|
||||
ServerPlayer.magicCrit port crates/horizon-client/src/lan/containers.rs::Hub::critical_hit
|
||||
ServerPlayer.onUpdateAbilities inline crates/horizon-client/src/lan/hub.rs::Hub::set_game_mode abilities go out with a game mode change; there is no other way abilities change
|
||||
ServerPlayer.createCommandSourceStack inline crates/horizon-client/src/game/lan_actions.rs::Game::run_guest_command the guest is swapped in as the acting player and its permission level applied
|
||||
ServerPlayer.sendSystemMessage port crates/horizon-client/src/lan/hub.rs::Hub::system_message
|
||||
ServerPlayer.sendBuildLimitMessage missing player: placing a block at the build limit fails silently; the red build.tooHigh / build.tooLow overlay never shows
|
||||
ServerPlayer.getIpAddress skip:server for ban-ip and the dedicated server log
|
||||
ServerPlayer.updateOptions port crates/horizon-client/src/lan/hub.rs::Hub::process_inbox the ClientInformation arm: view distance, main hand, model parts and chat visibility are kept
|
||||
ServerPlayer.clientInformation skip:java getter
|
||||
ServerPlayer.sendServerStatus port crates/horizon-client/src/lan/hub.rs::Hub::place_new_player ServerData with the motd and icon at join
|
||||
ServerPlayer.updateInvisibilityStatus missing player: a spectator is not made invisible, so others see a full player model flying around
|
||||
ServerPlayer.drop port crates/horizon-client/src/game.rs::Game::player_drop item_dropped and drop statistics, thrower set
|
||||
ServerPlayer.calculateGameModeForNewPlayer port crates/horizon-client/src/game/lan.rs::Game::lan_guest_joined default or forced game mode for a new or force-gamemode guest
|
||||
ServerPlayer.storeGameTypes port crates/horizon-client/src/save.rs::Level::player_tag gap: minor: playerGameType only; previousPlayerGameType is not saved, so the game mode switcher forgets the previous mode after a reload
|
||||
ServerPlayer.shouldFilterMessageTo skip:service text filtering
|
||||
ServerPlayer.mayInteract inline crates/horizon-client/src/game/lan_actions.rs::Game::under_spawn_protection gap: minor: same as ServerLevel.mayInteract, no world border check
|
||||
ServerPlayer.onItemPickup missing player: the You've Got a Friend in Me advancement (thrown_item_picked_up_by_player) can never be earned
|
||||
ServerPlayer.getChatSession skip:java getter with an expiry check
|
||||
ServerPlayer.startRiding inline crates/horizon-client/src/game/lan_entities.rs::Game::lan_riding gap: minor: SetPassengers goes out, but the mount's active effects (a horse's speed) are not sent to the rider
|
||||
ServerPlayer.removeVehicle inline crates/horizon-client/src/game/lan_entities.rs::Game::lan_riding gap: minor: SetPassengers updates, vehicle effects are not removed from the rider
|
||||
ServerPlayer.getKnownSpeed port crates/horizon-client/src/game/spear.rs::Game::known_player_movement gap: minor: ignores the vehicle's speed for a rider who is not steering
|
||||
ServerPlayer.onEquippedItemBroken port crates/horizon-client/src/game.rs::Game::damage_held gap: minor: only the held item counts toward the broken statistic; breaking armour is not counted
|
||||
ServerPlayer.registerAndUpdateEnderPearlTicket missing minor: a thrown ender pearl does not keep its chunk loaded; none are saved either
|
||||
ServerPlayer.debugSubscriptions skip:debug debug subscriptions for the debug screen
|
||||
|
@@ -0,0 +1,146 @@
|
||||
ServerPlayerGameMode.changeGameModeForPlayer port crates/horizon-client/src/game/commands.rs::Game::set_game_mode same-mode check, mode switch, abilities; a LAN guest goes through Hub::set_game_mode which also broadcasts PlayerInfo UPDATE_GAME_MODE
|
||||
ServerPlayerGameMode.setGameModeForPlayer port crates/horizon-client/src/game/game_mode.rs::Game::set_mode previous mode kept, GameType.updatePlayerAbilities applied
|
||||
ServerPlayerGameMode.isInRangeOfGround missing minor: spectator to creative near the ground keeps flying (set_mode always sets flying); vanilla stops flying within 1 block of the ground
|
||||
ServerPlayerGameMode.incrementDestroyProgress inline crates/horizon-client/src/game/lan_actions.rs::Game::guest_dig_feedback gap: minor: crack stage is the client formula (progress*10 - 1), so other players' cracks on a guest's block run one stage behind the server value
|
||||
ServerPlayerGameMode.debugLogging skip:debug DEBUG_BLOCK_BREAK logging
|
||||
ServerPlayerGameMode.abortDestroyBlock inline crates/horizon-client/src/game/lan_actions.rs::Game::lan_guest_packet the abort action clears the guest's crack for everyone; no separate check of a mismatched destroy position
|
||||
ServerPlayerGameMode.destroyAndAck missing minor: guest_destroy ignores whether the break succeeded, so a refused break never sends the block back to the guest
|
||||
SimulationChunkTracker.getLevel port crates/horizon-client/src/ticket_levels.rs::Map::get simulation level per chunk, 33 where no ticket reaches
|
||||
SimulationChunkTracker.setLevel inline crates/horizon-client/src/ticket_levels.rs::compute the whole level map is rebuilt from player and forced tickets instead of updated per node
|
||||
ThreadedLevelLightEngine.checkBlock inline crates/horizon-client/src/light.rs::relight a block change relights resident chunks directly, no queued PRE_UPDATE task
|
||||
ThreadedLevelLightEngine.updateChunkStatus skip:other Horizon lights a chunk in one flood fill and keeps no per-section light state to reset
|
||||
ThreadedLevelLightEngine.updateSectionStatus skip:other no per-section empty flags: light_chunk reads the sections directly
|
||||
ThreadedLevelLightEngine.propagateLightSources inline crates/horizon-client/src/light.rs::light_chunk light_chunk seeds sky and block sources and propagates in one pass
|
||||
ThreadedLevelLightEngine.setLightEnabled skip:other no light-enabled flag per chunk; relight only touches resident, lit chunks
|
||||
ThreadedLevelLightEngine.queueSectionData inline crates/horizon-client/src/light.rs::update_light_layers light layers from a chunk packet are applied at once, not queued
|
||||
ThreadedLevelLightEngine.addTask skip:java light thread task queue
|
||||
ThreadedLevelLightEngine.retainData skip:other no retained light data between chunk statuses
|
||||
ThreadedLevelLightEngine.initializeLight skip:other INITIALIZE_LIGHT step marks sections and enables light; Horizon has no such step before light_chunk
|
||||
ThreadedLevelLightEngine.lightChunk port crates/horizon-client/src/light.rs::light_chunk the chunk's light is computed from its 3x3 neighbourhood
|
||||
ThreadedLevelLightEngine.tryScheduleUpdate skip:java schedules the light thread
|
||||
ThreadedLevelLightEngine.runUpdate inline crates/horizon-client/src/light.rs::relight runLightUpdates: decrease then increase passes, run directly on the changed positions
|
||||
ThreadedLevelLightEngine.waitForPendingTasks skip:java future that completes when the light queue drains
|
||||
ThrottlingChunkTaskDispatcher.popTasks skip:other caps chunk tasks in flight; Horizon schedules chunk work on its own worker pool
|
||||
ThrottlingChunkTaskDispatcher.getDebugStatus skip:debug
|
||||
Ticket.toString skip:debug
|
||||
Ticket.decreaseTicksLeft missing minor: only player and forced tickets exist; timed tickets (ender pearl 40, portal 300, post teleport 5 ticks) are not modelled
|
||||
Ticket.isTimedOut missing minor: no timed tickets, so nothing expires
|
||||
WorldGenRegion.<init> port crates/horizon-world/src/worldgen/feature_region.rs::TerrainRegion::new the region is a set of chunks around the centre
|
||||
WorldGenRegion.hasChunk port crates/horizon-world/src/worldgen/feature_region.rs::TerrainRegion::chunk a chunk is there when it is in the region's index, not by the step's dependency distance
|
||||
WorldGenRegion.warnIfReadOutsideWriteZone skip:debug logs an unsafe terrain read
|
||||
WorldGenRegion.findBlocksIn skip:debug only adds the read-zone warnings to the default scan
|
||||
WorldGenRegion.isWithinWriteZone port crates/horizon-world/src/worldgen/write_zone.rs::GenerationWriteZone::contains_block Chebyshev distance to the centre chunk within the write radius
|
||||
LevelLoadProgressTracker.start inline crates/horizon-client/src/level_loading.rs::progress weights 10 + player chunks; no persistent (forced) chunk stage
|
||||
LevelLoadProgressTracker.update inline crates/horizon-client/src/level_loading.rs::progress player chunks ready out of 49
|
||||
LevelLoadProgressTracker.finishSegment inline crates/horizon-client/src/level_loading.rs::progress the 10 weight prepare segment counts as finished
|
||||
LevelLoadProgressTracker.tracksStage inline crates/horizon-client/src/level_loading.rs::progress both stages tracked, player chunks included
|
||||
LevelLoadProgressTracker.updateProgress port crates/horizon-client/src/level_loading.rs::progress
|
||||
LoggingLevelLoadListener skip:server console progress log of a dedicated server or integrated server start
|
||||
CompoundContainer.isEmpty port crates/horizon-client/src/game/machines.rs::Containers::is_empty a View of both halves is empty when every slot is
|
||||
CompoundContainer.contains inline crates/horizon-client/src/game/block_entity_anims.rs::Game::container_openers_changed an opener of a chest counts on both halves (chest_other_half)
|
||||
CompoundContainer.getItem port crates/horizon-client/src/game/machines.rs::Containers::get View::locate picks the half; lan/menu.rs Slots::get does the same for a guest's menu
|
||||
CompoundContainer.removeItem inline crates/horizon-client/src/game/machines.rs::Game::slot_mut_at View::locate picks the half, the caller splits the stack
|
||||
CompoundContainer.removeItemNoUpdate inline crates/horizon-client/src/game/machines.rs::Game::slot_mut_at View::locate picks the half, the caller takes the slot
|
||||
CompoundContainer.setItem inline crates/horizon-client/src/game/machines.rs::Game::slot_mut_at View::locate picks the half
|
||||
CompoundContainer.stillValid port crates/horizon-client/src/lan/menu.rs::Slots::still_valid both halves must still be there and in reach
|
||||
CompoundContainer.canPlaceItem port crates/horizon-client/src/game/machines.rs::Containers::can_place
|
||||
Container.countItem port crates/horizon-client/src/mobs/villager.rs::Ext::count_item villager inventory only, the one caller that needs it
|
||||
Container.hasAnyOf inline crates/horizon-client/src/mobs/villager.rs::Ext::take_half_stack TradeWithVillager's hasAnyOf gate: no wanted item in the inventory, nothing is thrown
|
||||
Container.hasAnyMatching inline crates/horizon-client/src/mobs/villager_brain.rs::harvest_tick Villager.hasFarmSeeds gate: a farmer sows only when a plantable seed is in the inventory; the hopper checks of chiseled bookshelf and jukebox canTakeItem are not ported as such
|
||||
Container.getSlot port crates/horizon-client/src/game/commands/items.rs::Game::slot_get /item and execute if items read a container slot by number
|
||||
Container.ContainerIterator.next skip:java iterator over slots
|
||||
ContainerHelper.removeItem skip:java NonNullList helper: split a stack in a slot Vec; block entities take from their own slot vector
|
||||
ContainerHelper.takeItem skip:java NonNullList helper: Option::take on the slot
|
||||
ContainerHelper.clearOrCountMatchingItems port crates/horizon-client/src/game/commands.rs::Game::clear_matching /clear over main, armor, offhand, crafting grid and carried stack, count only when max is 0
|
||||
DifficultyInstance.isHard skip:other no vanilla caller (isHarderThan is what Illusioner uses)
|
||||
DifficultyInstance.getSpecialMultiplier port crates/horizon-client/src/mobs/spawning.rs::LocalDifficulty::special
|
||||
DifficultyInstance.calculateDifficulty port crates/horizon-client/src/mobs/spawning.rs::LocalDifficulty::new
|
||||
InteractionHand.asArm inline crates/horizon-client/src/mobs/ai.rs::Mob::swing_hand off_hand != main arm left; the player's first person hand does the same in game.rs hand_geometry
|
||||
InteractionResult.Success.heldItemTransformedTo skip:java result builder; Horizon replaces the held item in place where the item is used
|
||||
ItemStackWithSlot.isValidInContainer port crates/horizon-client-core/src/block_entity_nbt.rs::items slots outside 0..size are dropped when items load
|
||||
LockCode.canUnlock missing minor: a lock on a container is kept in the NBT but never checked, so any player opens a command-locked chest
|
||||
RandomSequences.createSequence port crates/horizon-items/src/random_sequences.rs::create
|
||||
RandomSequences.DirtyMarkingRandomSource.nextInt skip:java marks the saved data dirty on each draw; Horizon saves every sequence
|
||||
RandomSequences.DirtyMarkingRandomSource.equals skip:java wrapper equality
|
||||
RandomizableContainer.trySaveLootTable port crates/horizon-client-core/src/block_entity_nbt.rs::Fields::loot_table saves LootTable and a non-zero seed, no items
|
||||
SimpleContainer.getItem port crates/horizon-world/src/simple_container.rs::SimpleContainer::get library port; villager and piglin inventories are plain vectors
|
||||
SimpleContainer.removeAllItems port crates/horizon-world/src/simple_container.rs::SimpleContainer::remove_all
|
||||
SimpleContainer.removeItemNoUpdate port crates/horizon-world/src/simple_container.rs::SimpleContainer::remove_no_update
|
||||
SimpleContainer.setItem port crates/horizon-world/src/simple_container.rs::SimpleContainer::set
|
||||
SimpleContainer.isEmpty port crates/horizon-world/src/simple_container.rs::SimpleContainer::is_empty
|
||||
SimpleContainer.fillStackedContents skip:other no vanilla caller: SimpleContainer is never a recipe input
|
||||
SimpleContainer.toString skip:debug
|
||||
SimpleContainer.moveItemToEmptySlots inline crates/horizon-world/src/simple_container.rs::SimpleContainer::add second pass of addItem; the villager's Ext::add_item does the same
|
||||
SimpleContainer.moveItemToOccupiedSlotsWithSameType inline crates/horizon-world/src/simple_container.rs::SimpleContainer::add first pass of addItem
|
||||
SimpleContainer.moveItemsBetweenStacks inline crates/horizon-world/src/simple_container.rs::SimpleContainer::add the grow and shrink with the per-stack limit
|
||||
SimpleContainer.fromItemList inline crates/horizon-client/src/entity_nbt.rs::mob_from_nbt villager and piglin Inventory read; the piglin list is cut to 8 instead of re-added
|
||||
SimpleContainer.storeAsItemList inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt villager and piglin Inventory written
|
||||
Stopwatches.unpack port crates/horizon-client/src/stopwatches.rs::Stopwatches::load
|
||||
Stopwatches.pack port crates/horizon-client/src/stopwatches.rs::Stopwatches::save
|
||||
Stopwatches.add port crates/horizon-client/src/stopwatches.rs::Stopwatches::create
|
||||
Stopwatches.update port crates/horizon-client/src/stopwatches.rs::Stopwatches::restart only the restart update that /stopwatch uses
|
||||
Stopwatches.remove port crates/horizon-client/src/stopwatches.rs::Stopwatches::remove
|
||||
Stopwatches.isDirty inline crates/horizon-client/src/stopwatches.rs::Stopwatches::save save skips the write when not dirty and empty
|
||||
AttributeType.ofInterpolated skip:data attribute type definitions and codecs
|
||||
AttributeType.ofNotInterpolated skip:data attribute type definitions and codecs
|
||||
AttributeType.createModifierCodec skip:data attribute type definitions and codecs
|
||||
AttributeType.checkAllowedModifier skip:data attribute type definitions and codecs
|
||||
BedRule.Rule.test inline crates/horizon-client/src/game.rs::Game::try_sleep WHEN_DARK is the hard-coded night or thunder check; ALWAYS and NEVER are in bed_sets_spawn and the dimension checks
|
||||
EnvironmentAttribute.valueCodec skip:data codec
|
||||
EnvironmentAttribute.Builder.build skip:data attribute definition builder
|
||||
EnvironmentAttributeMap.applyModifier inline crates/horizon-client/src/environment.rs::Environment::value gap: minor: only multiply and override are applied for visual tracks; and, or and maximum tracks are read by their own users
|
||||
EnvironmentAttributeMap.equals skip:java
|
||||
EnvironmentAttributeMap.Builder.modify skip:java builder
|
||||
EnvironmentAttributeMap.Builder.build skip:java builder
|
||||
EnvironmentAttributeMap.Entry.createCodec skip:data codec
|
||||
EnvironmentAttributeMap.Entry.createFullCodec skip:data codec
|
||||
EnvironmentAttributeProbe.reset skip:other Horizon keeps no probe state: render recomputes the biome weights each frame
|
||||
EnvironmentAttributeProbe.getValue inline crates/horizon-client/src/game.rs::Game::render sky, fog and water fog are blended from Gaussian biome weights at the camera each frame, no last and new tick lerp
|
||||
EnvironmentAttributeProbe.ValueProbe.getValueFromLevel inline crates/horizon-client/src/environment.rs::Environment::sample dimension and timeline value; biome blend is applied by the caller
|
||||
EnvironmentAttributeProbe.ValueProbe.tick port crates/horizon-client/src/biome.rs::gaussian_weights the per-tick Gaussian sampling of noise biomes around the camera
|
||||
EnvironmentAttributeProbe.ValueProbe.get inline crates/horizon-client/src/game.rs::Game::render per frame values from the camera position instead of lerping last and new tick values
|
||||
EnvironmentAttributeReader.getValue skip:java overload that centres a BlockPos and passes no interpolator
|
||||
EnvironmentAttributeSystem.bakeLayerSampler skip:java folds leading constant layers into the base value; load_dimension builds its base values the same way
|
||||
EnvironmentAttributeSystem.addStaticLayers inline crates/horizon-client/src/environment.rs::Environment::load_dimension dimension attributes become base values; biome attributes are read in Biomes::load
|
||||
EnvironmentAttributeSystem.addDynamicLayers inline crates/horizon-client/src/environment.rs::Environment::sample gap: minor: only day.json drives the visual attributes here; moon, early game and villager timelines are read by moon, patrol and villager code; weather is apply_weather
|
||||
EnvironmentAttributeSystem.addBiomeLayer inline crates/horizon-client/src/biome.rs::Biomes::load biome attributes (sky, fog, water fog, spawns, fire burnout) are read into BiomeInfo
|
||||
EnvironmentAttributeSystem.addBiomeLayerForAttribute inline crates/horizon-client/src/biome.rs::blend_rgb gap: minor: only sky, fog and water fog colours are blended by Gaussian weights; other biome attributes use the biome at the position
|
||||
EnvironmentAttributeSystem.getDimensionValue inline crates/horizon-client/src/environment.rs::Environment::sample
|
||||
EnvironmentAttributeSystem.getValue inline crates/horizon-client/src/environment.rs::Environment::sample the sky state at a time of day; other attributes are read straight from dimension and biome data by their users
|
||||
EnvironmentAttributeSystem.getConstantBaseValue skip:debug VisibleForTesting
|
||||
EnvironmentAttributeSystem.isAffectedByPosition skip:debug VisibleForTesting
|
||||
EnvironmentAttributeSystem.Builder.addConstantLayer inline crates/horizon-client/src/environment.rs::Environment::load_dimension dimension attributes inserted as base values
|
||||
EnvironmentAttributeSystem.Builder.addConstantEntry inline crates/horizon-client/src/environment.rs::Environment::load_dimension
|
||||
EnvironmentAttributeSystem.Builder.addLayer skip:java builder
|
||||
EnvironmentAttributeSystem.Builder.addTimelineLayer inline crates/horizon-client/src/environment.rs::Environment::load_dimension day timeline tracks loaded (overworld only)
|
||||
EnvironmentAttributeSystem.Builder.addTimelineLayerForAttribute inline crates/horizon-client/src/environment.rs::Environment::load_dimension one Track per attribute with its easing
|
||||
EnvironmentAttributeSystem.ValueSampler.getDimensionValue inline crates/horizon-client/src/environment.rs::Environment::sample no per-tick cache: recomputed per frame
|
||||
EnvironmentAttributeSystem.ValueSampler.getValue inline crates/horizon-client/src/environment.rs::Environment::sample
|
||||
EnvironmentAttributeSystem.ValueSampler.computeValuePositional inline crates/horizon-client/src/game.rs::Game::render base, timeline track, then biome blend, then weather, in that order
|
||||
EnvironmentAttributeSystem.ValueSampler.computeValueNotPositional inline crates/horizon-client/src/environment.rs::Environment::sample base then timeline track
|
||||
EnvironmentAttributes.register skip:data attribute registry
|
||||
WeatherAttributes.addBuiltinLayers port crates/horizon-client/src/environment.rs::apply_weather rain and thunder layers over sky, fog, cloud, sky light, stars and sunrise; bees staying in the hive is bees_stay_in_hive in bee.rs
|
||||
WeatherAttributes.addLayer port crates/horizon-client/src/environment.rs::apply_weather rain level minus thunder level, then thunder level, each lerped over the value
|
||||
BooleanModifier.apply port crates/horizon-client/src/patrol.rs::BoolTrack::apply and, or, xor, nand, nor, xnor over the timeline track value
|
||||
ColorModifier.BlendToGray.lerp skip:other only lerps blend_to_gray arguments between keyframes; no timeline uses that modifier
|
||||
ListModifier.Append.apply inline crates/horizon-client/src/animate_tick.rs::AnimateTables::load a biome's ambient_particles list is its argument over an empty dimension list
|
||||
MobSpawnSettingsModifier.Overlay.apply inline crates/horizon-client/src/biome.rs::Biomes::load no dimension sets natural_mob_spawns, so the overlay over the empty default is the biome's own spawns
|
||||
ClockTimeMarker.getRepetitionCount skip:other no vanilla caller
|
||||
ClockTimeMarker.resolveTimeToMoveTo port crates/horizon-client/src/game/chat.rs::TimeMarker::resolve
|
||||
ClockTimeMarker.occursAt port crates/horizon-client/src/game/chat.rs::TimeMarker::occurs_at
|
||||
ClockTimeMarker.durationToNext inline crates/horizon-client/src/game/chat.rs::TimeMarker::resolve the d > 0 else period + d step
|
||||
ServerClockManager.init inline crates/horizon-client/src/game/chat.rs::Game::build_registries overworld timelines and their time markers are loaded; the End clock runs with game time
|
||||
ServerClockManager.getInstance skip:java clock lookup; Horizon keeps one overworld clock in ui.clock
|
||||
ServerClockManager.setTotalTicks inline crates/horizon-client/src/game/commands.rs::Game::cmd_time /time set <ticks>
|
||||
ServerClockManager.moveToTimeMarker inline crates/horizon-client/src/game/commands.rs::Game::cmd_time /time set <marker>: not found, already there, or moved
|
||||
ServerClockManager.addTicks inline crates/horizon-client/src/game/commands.rs::Game::cmd_time /time add, floored at 0
|
||||
ServerClockManager.isAtTimeMarker inline crates/horizon-client/src/game/raids.rs::Game::tick_village_siege ROLL_VILLAGE_SIEGE marker as tick 18000 of the day
|
||||
ServerClockManager.commandTimeMarkersForClock inline crates/horizon-client/src/game/chat.rs::Game::build_registries markers with show_in_commands go to the command suggestions
|
||||
ServerClockManager.ServerClockInstance.loadFrom port crates/horizon-client/src/game/chat.rs::Game::load_world_state total ticks come from level data; rate, partial tick and paused are read from world_clocks.dat
|
||||
ServerClockManager.ServerClockInstance.packState port crates/horizon-client/src/game/chat.rs::Game::save_world_state
|
||||
WorldClocks.bootstrap skip:data clock registration
|
||||
CombatTracker.getMessageForAssistedFall port crates/horizon-client/src/game/combat.rs::Game::combat_death_message_for gap: minor: the .item variants of the fell assist and finish messages are never used, a named weapon is not shown
|
||||
CombatTracker.getCombatDuration skip:other only feeds ClientboundPlayerCombatEndPacket, which the client ignores
|
||||
DamageSource.getLocalizedDeathMessage port crates/horizon-client/src/game/combat.rs::Game::combat_death_message_for gap: minor: no .item variant when the killer holds a custom-named item
|
||||
DamageSource.isCreativePlayer port crates/horizon-world/src/damage_source.rs::DamageSource::creative_player
|
||||
DamageSource.is port crates/horizon-world/src/damage_source.rs::DamageSource::in_tag tag form; the key form is is_type
|
||||
|
@@ -0,0 +1,105 @@
|
||||
DamageSources.source port crates/horizon-client/src/mobs.rs::Damage::of a damage source is a DamageKind plus attacker and origin; type ids are resolved in creatures.rs::damage_type
|
||||
DamageSources.fireball inline crates/horizon-client/src/game/creatures.rs::damage_type gap: minor: always minecraft:fireball; an owner-less fireball is not the unattributed_fireball type (death message and loot condition only)
|
||||
DamageSources.explosion inline crates/horizon-client/src/game/creatures.rs::damage_type gap: minor: player_explosion only when the attacker is the player; vanilla uses it whenever a causing entity exists (a creeper too), so that death message differs
|
||||
FallLocation.blockToFallLocation port crates/horizon-client/src/game/combat.rs::Game::fall_location gap: minor: trapdoors are not mapped to the ladder location, they count as other_climbable
|
||||
AbsorptionMobEffect.onEffectStarted port crates/horizon-client/src/game/potions.rs::Game::add_player_effect gap: minor: sets absorption to max(current, 4 * (level + 1)) for the player only; a mob given absorption gets none
|
||||
BadOmenMobEffect.applyEffectTick port crates/horizon-client/src/game/raids.rs::Game::omen_tick bad omen in a village (not peaceful, not spectator, raid below max omen level) becomes Raid Omen 600 ticks and records the position
|
||||
HealOrHarmMobEffect.applyEffectTick port crates/horizon-client/src/effects.rs::periodic instant_health heals 4 << level, instant_damage hurts 6 << level (magic); mobs get the instant effects from splash and cloud code in potions.rs
|
||||
HungerMobEffect.applyEffectTick port crates/horizon-client/src/effects.rs::periodic exhaustion 0.005 * (level + 1) every tick, applied by Game::apply_effect_action; player only like vanilla
|
||||
InfestedMobEffect.spawnSilverfish inline crates/horizon-client/src/game/potions.rs::Game::infested_hurt the 10 percent roll and the one or two silverfish thrown along the look direction, with the hurt sound; player and mobs
|
||||
MobEffect.getOrCreateDescriptionId skip:java lazy translation key cache
|
||||
MobEffect.setBlendDuration inline crates/horizon-client/src/screen_effects.rs::ScreenEffects::tick_spinning nausea fades in over 150 and out over 20 ticks, darkness over 22 (sculk.rs::Game::tick_darkness_blend); no other effect blends
|
||||
MobEffect.removeAttributeModifiers inline crates/horizon-client/src/game/potions.rs::Game::apply_effect_status modifiers that left the effect list are removed in the diff loop; horizon-world has an unused kernel (effect_attribute_modifiers.rs::remove_modifiers)
|
||||
MobEffectInstance.<init> port crates/horizon-client/src/effects.rs::EffectInstance::new gap: minor: no showIcon flag, so an effect given without particles still shows its icon; amplifier clamps to 0..255
|
||||
MobEffectInstance.asDetails inline crates/horizon-client/src/effects.rs::PlayerEffects::saved gap: minor: only id, duration, amplifier, ambient and particles are saved; hidden_effect is lost on save and show_icon is written as the particles flag
|
||||
MobEffectInstance.setDetailsFrom inline crates/horizon-client/src/effects.rs::EffectInstance::downgrade copies the hidden effect's details when the active one runs out; the copy constructor is Clone
|
||||
MobEffectInstance.isShorterDurationThan port crates/horizon-client/src/effects.rs::EffectInstance::shorter_than
|
||||
MobEffectInstance.withScaledDuration inline crates/horizon-client/src/game/potions.rs::Game::cloud_affect the scaled closure: floor(duration * 0.25) at least 1 for lingering clouds; fixed 0.25, the stack's potion_duration_scale is not read
|
||||
MobEffectInstance.mapDuration inline crates/horizon-client/src/game/potions.rs::Game::splash the (int)(scale * duration + 0.5) of a splash potion on mobs (splash_on_player for the player); potions are never infinite
|
||||
MobEffectInstance.tickDownDuration port crates/horizon-client/src/effects.rs::EffectInstance::tick_down hidden effect ticks down too; infinite stays
|
||||
MobEffectInstance.downgradeToHiddenEffect port crates/horizon-client/src/effects.rs::EffectInstance::downgrade gap: minor: mobs keep no hidden effects (Mob::add_effect drops a weaker one)
|
||||
MobEffectInstance.onMobRemoved inline crates/horizon-client/src/game/potions.rs::Game::effects_on_death oozing, weaving and wind charged run when their bearer dies (player or mob)
|
||||
MobEffectInstance.onMobHurt inline crates/horizon-client/src/game/potions.rs::Game::infested_hurt only infested reacts to being hurt; called for the player from combat.rs and for mobs from creatures.rs
|
||||
MobEffectInstance.toString skip:debug debug string
|
||||
MobEffectInstance.equals skip:java value equality
|
||||
MobEffectInstance.hashCode skip:java value hash
|
||||
MobEffectInstance.BlendState.setImmediate missing minor: skipBlending is never used, so nausea and darkness restored on login or a dimension change fade in from 0 instead of starting full
|
||||
MobEffectInstance.BlendState.getFactor port crates/horizon-client/src/game/fov.rs::Game::nausea_blend lerp of the previous and current factor; darkness has its own in sculk.rs::Game::darkness_blend
|
||||
MobEffectInstance.Details.create skip:java record constructor for the codec
|
||||
MobEffectUtil.hasDigSpeed inline crates/horizon-client/src/effects.rs::PlayerEffects::mining_speed_factor haste or conduit power, also read for the arm swing duration in first_person.rs
|
||||
MobEffectUtil.hasWaterBreathing inline crates/horizon-client/src/effects.rs::PlayerEffects::status water_breathing flag is water breathing or conduit power; breath of the nautilus is its own flag read with it
|
||||
MobEffectUtil.shouldEffectsRefillAirsupply inline crates/horizon-client/src/motion/environment.rs::MotionWorld::tick_environment_damage air refills unless only breath of the nautilus is active
|
||||
OozingMobEffect.onMobRemoved inline crates/horizon-client/src/game/potions.rs::Game::effects_on_death oozing branch: two slimes, fewer when slimes within 2 blocks fill max_entity_cramming
|
||||
OozingMobEffect.spawnSlimeOffspring inline crates/horizon-client/src/game/potions.rs::Game::effects_on_death size 2 slime half a block up
|
||||
PoisonMobEffect.applyEffectTick port crates/horizon-client/src/effects.rs::periodic one magic damage while above 1 health; mobs in mobs/ai.rs::tick_effects
|
||||
PoisonMobEffect.shouldApplyEffectTickThisTick port crates/horizon-client/src/effects.rs::periodic 25 >> level interval
|
||||
RegenerationMobEffect.applyEffectTick port crates/horizon-client/src/effects.rs::periodic heal 1; mobs in mobs/ai.rs::tick_effects
|
||||
RegenerationMobEffect.shouldApplyEffectTickThisTick port crates/horizon-client/src/effects.rs::periodic 50 >> level interval
|
||||
SaturationMobEffect.applyEffectTick port crates/horizon-client/src/effects.rs::periodic Eat(level + 1, 1.0) applied to the food data; player only
|
||||
WeavingMobEffect.onMobRemoved inline crates/horizon-client/src/game/potions.rs::Game::effects_on_death weaving branch (killed, player or mob_griefing) calls spawn_cobwebs_around: 2 or 3 cobwebs among 15 random blocks
|
||||
WitherMobEffect.shouldApplyEffectTickThisTick port crates/horizon-client/src/effects.rs::periodic 40 >> level interval; mobs in mobs/ai.rs::tick_effects take magic damage, not wither damage
|
||||
AbstractInterpolationHandler.adjustInterpolationPosition skip:other Horizon moves a remote entity only through SteppedInterpolation, so there is no client-side move to add to the target
|
||||
AbstractInterpolationHandler.adjustInterpolationTargetFromDeltas skip:other same: the entity never drifts from where the interpolation put it (see SteppedInterpolation::interpolate)
|
||||
AbstractInterpolationHandler.setLastPositionAndRotation skip:other only feeds the delta adjustments above; Horizon's own last is the start of the step
|
||||
AgeableMob.mobInteract missing player: using a golden dandelion on a baby animal does nothing; vanilla uses one up, locks its growth and plays a sound (no golden_dandelion handling exists)
|
||||
AgeableMob.canUseGoldenDandelion missing player: part of the golden dandelion age lock, which is not implemented
|
||||
AgeableMob.setAgeLockedData missing player: nothing toggles AgeLocked in play (only NBT, buckets and spawn data set it); golden dandelion age lock is missing
|
||||
AgeableMob.setAgeLocked missing player: golden dandelion consumption, persistence and the use or unuse sound are missing
|
||||
AgeableMob.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: the baby flag is sent (baby_index); the age-locked entry is not
|
||||
AgeableMob.getAge inline crates/horizon-client/src/game/remote_mob_data.rs::apply m.extra.age on the host; a remote client only learns baby or not (-1 or 0)
|
||||
AgeableMob.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt Age, ForcedAge and AgeLocked for creatures
|
||||
AgeableMob.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt Age, ForcedAge and AgeLocked
|
||||
AgeableMob.makeAgeLockedParticle missing player: no age lock particle timer, so no pause or reset growth particles; the particle types exist
|
||||
AnimationState.getTimeInMillis port crates/horizon-client/src/mobs/keyframes.rs::AnimationState::millis
|
||||
AreaEffectCloud.defineSynchedData port crates/horizon-client/src/game/lan_entities.rs::Game::lan_projectile_states radius, waiting and particle for dragon breath and lingering clouds; read back in remote_projectiles.rs::remote_projectile_data
|
||||
AreaEffectCloud.setRadius inline crates/horizon-client/src/game/potions.rs::Game::tick_potion_cloud radius shrinks per tick and per victim; the 0..32 clamp is not needed
|
||||
AreaEffectCloud.refreshDimensions inline crates/horizon-client/src/game/potions.rs::Game::tick_potion_cloud the affected box is rebuilt from the radius every check
|
||||
AreaEffectCloud.readAdditionalSaveData missing minor: clouds are not loaded from a world; a saved lingering or breath cloud, or one made by /summon, does not appear
|
||||
AreaEffectCloud.addAdditionalSaveData missing minor: a lingering potion or dragon breath cloud is gone after the world is saved and reopened
|
||||
AreaEffectCloud.get skip:other entity data component accessor for predicates and /data; Horizon keeps the cloud's potion in PotionCloud
|
||||
AreaEffectCloud.applyImplicitComponents inline crates/horizon-client/src/game/potions.rs::Game::splash the lingering branch takes the thrown stack's potion effects and colour; potion_duration_scale is fixed at 0.25
|
||||
AreaEffectCloud.applyImplicitComponent inline crates/horizon-client/src/game/potions.rs::Game::splash same: potion contents only
|
||||
Avatar.defineSynchedData port crates/horizon-client/src/lan/hub.rs::Hub::player_state gap: minor: skin parts (entry 16) are sent, the main hand entry is not
|
||||
Avatar.isModelPartShown missing player: Options > Skin Customization is an inactive button and the client always sends all parts shown, so hat, jacket, sleeve and pants layers and the cape cannot be switched off
|
||||
Bucketable.loadDefaultDataFromBucketTag port crates/horizon-client/src/entity_nbt.rs::load_bucket_data NoAI, Silent, NoGravity, Glowing, Invulnerable, PersistenceRequired and Health
|
||||
ContainerUser.getLivingEntity skip:java interface cast; every container user here is the player
|
||||
ConversionTracker.addAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt gap: minor: DrownedConversionTime and InWaterTime are kept from the loaded NBT or written as -1; live progress is not saved, and skeletons write no FreezingTime or StrayConversionTime
|
||||
ConversionTracker.readAdditionalSaveData missing minor: saved conversion and affliction times are not read, a half converted zombie or skeleton starts over
|
||||
ConversionTracker.doConversion inline crates/horizon-client/src/mobs/undead.rs::custom_server_ai_step gap: player: zombie to drowned, husk to zombie and skeleton to stray (and piglin to zombified piglin, hoglin to zoglin) spawn a fresh mob through SpawnKind, so the old one's armor, held items, name tag and effects are lost
|
||||
ConversionType.convertCommon port crates/horizon-client/src/game/zombie_villagers.rs::carry_over gap: player: only villager and zombie villager conversions use it (dispenser.rs::Game::convert_mob copies the flags for shearing); drowned, stray, zombified piglin, zoglin, frog and witch conversions go through SpawnKind and carry only baby, yaw and persistence, so name tag, armor, held items and effects are lost; absorption and tags are never copied
|
||||
ConversionType.copyComponent inline crates/horizon-client/src/game/zombie_villagers.rs::carry_over gap: minor: the custom name is kept by carry_over and convert_mob, custom data is not
|
||||
Crackiness.byFraction port crates/horizon-client/src/mobs/golem.rs::crackiness iron golem thresholds 0.75, 0.5, 0.25; wolf armor 0.95, 0.69, 0.32 are in mobs/render.rs::layers and mobs.rs::Mob::hurt_wolf_armor
|
||||
Crackiness.byDamage inline crates/horizon-client/src/mobs/render.rs::layers wolf armor: durability left over max picks the crack texture; a golem uses its health instead
|
||||
Display.onSyncedDataUpdated port crates/horizon-client/src/game/text_displays.rs::RemoteTextDisplay::metadata gap: minor: text displays a remote server sends only; start delay, duration and render state flags are tracked, width and height do not update a culling box
|
||||
Display.createTransformation port crates/horizon-client/src/text_display.rs::TextDisplayData::matrix translation, left rotation, scale, right rotation plus the billboard turn
|
||||
Display.tick port crates/horizon-client/src/game/text_displays.rs::RemoteTextDisplay::tick start tick, interpolation duration and render state refresh; text displays only
|
||||
Display.defineSynchedData port crates/horizon-client/src/text_display.rs::TextDisplayData::default the defaults of entries 8 to 22
|
||||
Display.readAdditionalSaveData missing player: display entities saved in a world (made by commands, datapacks or maps) are not loaded; the local game has no display entity, only a remote server's text displays are drawn
|
||||
Display.setTransformation missing minor: server side setter; there is no local display entity
|
||||
Display.addAdditionalSaveData missing minor: no local display entity to save
|
||||
Display.getInterpolatedBoundingBox missing minor: no culling box, a text display is drawn whenever it is within its view range, even off screen
|
||||
Display.setBrightnessOverride missing minor: server side setter; there is no local display entity
|
||||
Display.getBrightnessOverride inline crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry the packed sky and block light of the brightness entry (-1 uses the world light)
|
||||
Display.calculateInterpolationProgress port crates/horizon-client/src/game/text_displays.rs::RemoteTextDisplay::progress
|
||||
Display.updateCulling missing minor: width and height are stored but no culling box is built
|
||||
Display.shouldRenderAtSqrDistance inline crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry view_range * 64 * view scale squared
|
||||
Display.getTeamColor missing minor: glow_color_override is read but a glowing display gets no coloured outline
|
||||
Display.createFreshRenderState inline crates/horizon-client/src/game/text_displays.rs::RemoteTextDisplay::tick the copy of the synced data when no interpolation runs
|
||||
Display.createInterpolatedRenderState inline crates/horizon-client/src/game/text_displays.rs::RemoteTextDisplay::tick the new start state is the old one blended to the last drawn progress (TextDisplayData::blend)
|
||||
Display.BlockDisplay missing player: block displays a server or map places are not drawn at all (only text displays are); command and datapack made decorations are invisible
|
||||
Display.ItemDisplay missing player: item displays (floating items, custom models on servers) are not drawn at all; only text displays are
|
||||
Display.TextDisplay.defineSynchedData port crates/horizon-client/src/text_display.rs::TextDisplayData::default text, line width 200, background 0x40000000, opacity -1, flags 0
|
||||
Display.TextDisplay.onSyncedDataUpdated port crates/horizon-client/src/game/text_displays.rs::RemoteTextDisplay::metadata the text render state ids mark the render state dirty
|
||||
Display.TextDisplay.loadFlag missing minor: reads the NBT booleans into the style flags; no local display entity
|
||||
Display.TextDisplay.readAdditionalSaveData missing player: text displays saved in a world are not loaded (see Display.readAdditionalSaveData)
|
||||
Display.TextDisplay.storeFlag missing minor: writes the style flags to NBT; no local display entity
|
||||
Display.TextDisplay.addAdditionalSaveData missing minor: no local display entity to save
|
||||
Display.TextDisplay.updateRenderSubState port crates/horizon-client/src/text_display.rs::TextDisplayData::blend text, line width, opacity and background blend over the interpolation
|
||||
Display.TextDisplay.createFreshTextRenderState inline crates/horizon-client/src/game/text_displays.rs::RemoteTextDisplay::tick the plain copy of the synced text data
|
||||
Display.TextDisplay.createInterpolatedTextRenderState port crates/horizon-client/src/text_display.rs::TextDisplayData::blend opacity and the four background channels interpolate linearly
|
||||
Display.TextDisplay.cacheDisplay inline crates/horizon-client/src/game/text_displays.rs::Game::text_display_geometry the split lines and widths are cached in RemoteTextDisplay::lines until the render state changes
|
||||
Display.TransformationInterpolator.get port crates/horizon-client/src/text_display.rs::TextDisplayData::blend translation and scale lerp, both rotations slerp
|
||||
DropChances.filterDefaultValues missing minor: drop_chances is neither read from nor written to a mob's NBT, so custom drop chances (guaranteed drops) are lost on save and reload
|
||||
DropChances.toEnumMap missing minor: the saved drop_chances map is not read back, a loaded mob uses the default 0.085 or species rule
|
||||
DropChances.withEquipmentChance port crates/horizon-client/src/mobs/finalize.rs::set_drop_chance stored per slot in extra.drop_chances
|
||||
ElytraAnimationState.tick port crates/horizon-client/src/mobs.rs::ElytraAnimation::tick
|
||||
|
@@ -0,0 +1,143 @@
|
||||
Entity.<init> port crates/horizon-client/src/mobs.rs::Mob::new mobs only; players and projectiles are built by their own structs and the synched defaults (flags, air, name, pose) are plain fields
|
||||
Entity.isColliding missing minor: a block change that a server refuses and that comes back inside the player does not snap the player to the position of the prediction (end_predictions only restores the block)
|
||||
Entity.canInteractWithLevel inline crates/horizon-client/src/mobs/leash.rs::tick gap: minor: only the leashed mob's life is tested (a dead one drops its lead); a dead or spectating holder is not tested
|
||||
Entity.unRide inline crates/horizon-client/src/game/consume.rs::Game::stop_riding gap: minor: the player's half (boat, minecart or mob mount); riders of a vehicle are let go by sync_riders and eject_boat_mobs
|
||||
Entity.addTag port crates/horizon-client/src/game/commands/data.rs::Game::cmd_tag the tag.add branch, with the 1024 tag limit
|
||||
Entity.equals skip:java entities are compared by id
|
||||
Entity.setRot skip:other plain setter; yaw and pitch are struct fields and the callers clamp pitch
|
||||
Entity.reapplyPosition skip:other bounding boxes are built from the position on demand (Mob::bounds_at), so there is no cached box to refresh
|
||||
Entity.commonTick inline crates/horizon-client/src/mobs/ai.rs::tick previous position and rotations saved and age counted; invulnerable time counts down in base_tick; remote mobs do the same in tick_remote_entities
|
||||
Entity.computeSpeed missing minor: lastKnownSpeed is not tracked; only FollowPlayerRiddenEntityGoal reads it and Horizon has no such goal
|
||||
Entity.setSharedFlagOnFire inline crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: flag 0x01 is fire_ticks > 0, packed only when a mob goes to LAN guests; HasVisualFire is not read
|
||||
Entity.isSupportedBy inline crates/horizon-client/src/game/piston_push.rs::Game::push_body supporting block equal to the piston's block decides whether the body rides it
|
||||
Entity.getBlockBounciness port crates/horizon-world/src/movement_restitution.rs::restitute_movement gap: player: only the player uses block restitution; mobs ignore it (Mob::do_move says so), so a mob falling on a slime block or bed does not bounce
|
||||
Entity.addMovementThisTick port crates/horizon-world/src/entity_move.rs::MovementHistory::add the 100 record cap merges the first two (MovementHistory); only the player keeps a history, mobs and arrows sweep from the start to the end of their move
|
||||
Entity.hasMovedHorizontallyRecently missing player: dolphins never swim after and escort a boat or nautilus a player is steering (no FollowPlayerRiddenEntityGoal); nothing tracks horizontal speed
|
||||
Entity.isStateClimbable port crates/horizon-world/src/movement_emission.rs::climbable climbable tag or powder snow
|
||||
Entity.applyPistonMovementRestriction port crates/horizon-world/src/piston_movement.rs::PistonMovement::limit the 0.51 per axis budget for each game tick
|
||||
Entity.getAvailableSpaceBelow missing player: /gamemode creative from spectator while standing on the ground leaves the player flying (vanilla drops flight when the ground is under 1 block away and nothing blocks the box)
|
||||
Entity.collectAllColliders inline crates/horizon-world/src/world_movement.rs::resolve_world_movement entity, border and block shapes are gathered inside resolve_world_movement; no standalone list exists, and the creative flight drop on a mode switch has no use of it
|
||||
Entity.collideWithShapes port crates/horizon-core/src/geometry/movement.rs::resolve_shape_movement axis step order from the movement size
|
||||
Entity.debugBlockIntersection skip:debug debug subscription for the entity block intersection overlay
|
||||
Entity.gameEvent port crates/horizon-client/src/game/sculk.rs::Game::post_entity_event gap: minor: only players and mobs (Who) can be the source
|
||||
Entity.playMuffledStepSound port crates/horizon-client/src/motion.rs::MotionWorld::walking_step_sound gap: minor: players only; mobs play the floor block's own step and never the muffled floor sound under snow, carpet or other combination blocks
|
||||
Entity.shouldPlayAmethystStepSound port crates/horizon-client/src/motion.rs::MotionWorld::walking_step_sound gap: minor: only the player chimes on crystal blocks; mobs walking on amethyst stay silent
|
||||
Entity.isInClouds missing minor: a happy ghast above the cloud layer should heal a point a second like in rain; only rain and snow count
|
||||
Entity.updateSwimming port crates/horizon-world/src/swimming.rs::update the player goes through update_player; mobs never swim in the player sense
|
||||
Entity.doWaterSplashEffect port crates/horizon-world/src/water_splash.rs::water_splash sound, bubbles, splashes and the splash event; arrows, mobs and the player each supply a world
|
||||
Entity.spawnSprintParticle port crates/horizon-client/src/game/client_ambient.rs::Game::sprint_dust gap: minor: players only; sprinting cats and ocelots raise no block dust
|
||||
Entity.absSnapTo skip:other plain position setter; Horizon writes position and previous position fields directly
|
||||
Entity.absSnapRotationTo skip:other plain rotation setter with the pitch clamp; teleports clamp pitch where they set it
|
||||
Entity.snapTo skip:other plain position and rotation setter; spawns and teleports write the fields (Mob::new, teleport_to_in_level)
|
||||
Entity.setOldPos skip:other previous position is a field set where a move starts
|
||||
Entity.setOldRot skip:other previous rotations are fields set where a tick starts
|
||||
Entity.distanceToSqr port crates/horizon-client/src/mobs.rs::Mob::distance_sqr plain arithmetic; other entities use Vec3::distance_squared
|
||||
Entity.hurtOrSimulate skip:other dispatches to the server or client hurt; the owning side applies damage directly
|
||||
Entity.calculateViewQuaternion inline crates/horizon-client/src/game/enchant_effects.rs::Game::apply_piercing_effect its only use is the lunge enchantment's apply_impulse, which rotates the direction by pitch then yaw by hand
|
||||
Entity.getPosition port crates/horizon-core/src/geometry/mod.rs::Vec3::lerp previous to current position at the frame fraction
|
||||
Entity.awardKillScore inline crates/horizon-client/src/game.rs::Game::tick the player's death branch fires entity_killed_player with the killer's type
|
||||
Entity.shouldRender port crates/horizon-client/src/game/entity_culling.rs::Game::entity_in_view range from default_range (64 times the mean box edge times the view scale), then the frustum
|
||||
Entity.saveAsPassenger port crates/horizon-client/src/game/persist.rs::Game::mob_tree_nbt a mob with its riders nested under Passengers; players and unsaved types are skipped
|
||||
Entity.getEncodeId inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt the id written is the mob type's id
|
||||
Entity.dropAllLeashConnections port crates/horizon-client/src/game/dispenser.rs::Game::shear_off_leashes gap: minor: only shears (dispenser) reach it; a firework used while gliding does not drop the player's leads
|
||||
Entity.canCollideWith inline crates/horizon-client/src/game/ghasts.rs::Game::player_entity_collisions gap: player: the entities a player cannot walk through are boats and happy ghasts only; a live shulker (canBeCollidedWith) is not solid, so the player walks through it
|
||||
Entity.getDefaultPassengerAttachmentPoint inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment one point per vehicle, so the passenger index is always 0; default is the top of the box
|
||||
Entity.ejectPassengers port crates/horizon-client/src/game/boat_passengers.rs::Game::eject_boat_mobs gap: minor: boats place riders at the dismount spot; when a mob vehicle dies sync_riders only lets go and the rider stays where it was seated
|
||||
Entity.removeVehicle inline crates/horizon-client/src/game/commands/world_cmds.rs::Game::dismount_mob gap: minor: no entity_dismount game event, so sculk sensors and wardens never hear a dismount
|
||||
Entity.moveOrInterpolateTo port crates/horizon-world/src/stepped_interpolation.rs::SteppedInterpolation::interpolate_to living entities from a server; boats and other objects use a three tick Lerp
|
||||
Entity.getHandHoldingItemAngle missing player: the rocket of a gliding player starts at the player's position, not 0.5 block out toward the hand holding it, so its trail sparks and burst start slightly off
|
||||
Entity.teleportToPortalDestination inline crates/horizon-client/src/game/nether_portal.rs::Game::send_through_portal may_enter checks isAllowedToEnterPortal; the entity is saved and waits for its dimension
|
||||
Entity.getDimensionChangingDelay inline crates/horizon-client/src/game/nether_portal.rs::Game::set_portal_cooldown 300 ticks for entities (ENTITY_DELAY) and 10 for the player (PLAYER_DELAY); a vehicle with the player on it never goes through a portal
|
||||
Entity.getSharedFlag inline crates/horizon-client/src/game/lan.rs::mob_meta flags are separate fields (fire_ticks, invisible, glowing, sprinting) packed into the shared flags byte only for LAN guests
|
||||
Entity.setSharedFlag inline crates/horizon-client/src/game/lan.rs::mob_meta flags are separate fields (fire_ticks, invisible, glowing, sprinting) packed into the shared flags byte only for LAN guests
|
||||
Entity.handleOnInsideBubbleColumn port crates/horizon-client/src/motion/fluids.rs::bubble_column_push mobs, items and pearls; arrows have Ticker::bubble_column and the player motion/environment.rs
|
||||
Entity.removeAction skip:other a mob's custom name is kept as plain text, so it carries no click event; other entities show the stored CustomName as it is
|
||||
Entity.getName inline crates/horizon-client/src/game/commands.rs::Game::target_name custom name, else the entity type's translated name
|
||||
Entity.toString skip:debug debug text
|
||||
Entity.isInvulnerableToBase port crates/horizon-world/src/damage_immunity.rs::base_immunity removed, invulnerable without bypass, fire immune and fall immune
|
||||
Entity.copyPosition inline crates/horizon-client/src/game/dispenser.rs::Game::convert_mob a converted mob takes the old one's position, previous position and yaws; zombie villager cures copy them in zombie_villagers.rs
|
||||
Entity.restoreFrom inline crates/horizon-client/src/game/nether_portal.rs::Game::resolve_arrivals the saved tag is loaded again as the new entity; PortalCooldown is written into the tag
|
||||
Entity.teleport inline crates/horizon-client/src/game/commands.rs::Game::teleport_to_in_level gap: minor: same level /tp only; a riding mob is not dismounted first, so it is pulled back onto its vehicle next tick (the player does stop riding); portals use send_through_portal
|
||||
Entity.teleportSameDimension inline crates/horizon-client/src/game/commands.rs::Game::teleport_to_in_level position, rotation and old rotation set; riders are re-seated each tick by position_riders
|
||||
Entity.teleportSpectators inline crates/horizon-client/src/game/commands/extra.rs::Game::tick_camera a spectator's camera follows its target every tick, so no teleport is needed; it drops when the target is gone
|
||||
Entity.calculatePassengerTransition inline crates/horizon-client/src/game/passengers.rs::Game::position_riders riders are seated on the vehicle each tick instead of getting an offset transition
|
||||
Entity.sendTeleportTransitionToPlayers inline crates/horizon-client/src/lan/entity.rs::ServerEntity::send_changes a LAN guest sees a teleport as an EntityPositionSync when the jump is too big for a relative move; no ClientboundTeleportEntity is sent
|
||||
Entity.forceSetRotation inline crates/horizon-client/src/game/commands/world_cmds.rs::Game::cmd_rotate /rotate goes through teleport_to_in_level with the new rotation; the pitch of non-players is not clamped separately
|
||||
Entity.placePortalTicket skip:other only one dimension is loaded at a time; arriving entities wait in portals.arrivals until resolve_arrivals can place them
|
||||
Entity.canTeleport inline crates/horizon-client/src/game/end.rs::Game::tick_end leaving the End before the credits have been seen shows the credits instead of teleporting the player
|
||||
Entity.fillCrashReportCategory skip:debug crash report detail
|
||||
Entity.teleportPassengers inline crates/horizon-client/src/game/passengers.rs::Game::position_riders riders and riders of riders are seated again each tick
|
||||
Entity.teleportRelative port crates/horizon-client/src/landing.rs::MotionWorld::teleport_relative gap: minor: only the player is lifted out of a block that turns solid; mobs are lifted by trample_farmland, dropped items and boats are not
|
||||
Entity.fixupDimensions inline crates/horizon-client/src/mobs/living.rs::Mob::dims dimensions are worked out on each call from size, age and pose, so there is nothing to refresh after a slime resize
|
||||
Entity.createHoverEvent inline crates/horizon-client/src/game/lan_trading.rs::Game::merchant_display_name gap: minor: only players and merchants get the show_entity hover in chat; other mobs' names have none
|
||||
Entity.getInterpolatedBoundingBox port crates/horizon-client/src/game/entity_culling.rs::Game::standing_entity_in_view the box is moved to the interpolated position for culling
|
||||
Entity.getFirstPassenger inline crates/horizon-client/src/game/passengers.rs::Game::sync_riders gap: minor: one rider id per mob vehicle (extra.rider), not a list
|
||||
Entity.hasPassenger inline crates/horizon-client/src/game/passengers.rs::Game::sync_riders gap: minor: one rider id per mob vehicle (extra.rider); the player's vehicle is Game.riding
|
||||
Entity.hasIndirectPassenger skip:other vehicle chains are seated by position_riders in three passes; no separate lookup is kept
|
||||
Entity.isLocalInstanceAuthoritative port crates/horizon-client/src/motion.rs::MotionWorld::locally_authoritative the player's server copy is not authoritative; mobs are always local
|
||||
Entity.isLocalClientAuthoritative inline crates/horizon-client/src/motion.rs::MotionWorld::locally_authoritative a ridden vehicle's passenger check is not modelled; the player's own copy decides
|
||||
Entity.isClientAuthoritative skip:other the host trusts its own player and LAN guests send their moves; there is no per-vehicle authority switch
|
||||
Entity.canSimulateMovement port crates/horizon-client/src/motion.rs::MotionWorld::can_simulate gap: minor: always true; the move simulation type of vehicles and remote entities is not consulted
|
||||
Entity.getCollisionHorizontalEscapeVector inline crates/horizon-client/src/game/boats.rs::Game::boat_dismount_target gap: minor: only boats use the formula; horses and striders use a plain side offset in dismount_mount
|
||||
Entity.getControlledVehicle skip:other the player's vehicle is Game.riding and a mob's is extra.mount; the controlling passenger is the first rider
|
||||
Entity.createCommandSourceStackForNameResolution inline crates/horizon-client/src/game/scoreboard.rs::Game::resolve_component gap: minor: selector and score parts resolve from the player's view, not from the entity's own position and no-permission source
|
||||
Entity.touchingUnloadedChunk missing minor: fall damage checks and spectator ticks are not skipped at the edge of the loaded area (a LAN guest there)
|
||||
Entity.getX skip:other plain position field read
|
||||
Entity.getRandomY skip:other a random point in the box; each effect draws its own offsets inline
|
||||
Entity.getZ skip:other plain position field read
|
||||
Entity.getRandomZ skip:other a random point in the box; each effect draws its own offsets inline
|
||||
Entity.getRopeHoldPosition inline crates/horizon-client/src/game/leads.rs::Game::leash_geometry a mob holder's end is its interpolated position plus 0.7 of its eye height; a player's comes from player_rope_hold
|
||||
Entity.setYRot skip:other plain setter; yaw is a struct field
|
||||
Entity.getClientPosition port crates/horizon-world/src/stepped_interpolation.rs::SteppedInterpolation::heading the interpolation target while it runs, else the entity's position
|
||||
Entity.shouldBeSaved inline crates/horizon-client/src/game/persist.rs::Game::put_mob_passengers riders are saved inside their vehicle's tag, not on their own
|
||||
Entity.lerpPositionAndRotationStep inline crates/horizon-client/src/game/remote.rs::Game::tick_remote_entities boats, minecarts, projectiles and orbs of a server step toward the packet's target by 1/steps each tick
|
||||
Entity.applyImplicitComponents missing player: a spawn egg (or armor stand, boat or minecart item) renamed in an anvil spawns an unnamed entity; the item's custom_name and custom_data are not applied
|
||||
Entity.applyImplicitComponent missing player: custom_name and custom_data of a placed item are not applied to the new entity; only name tags (name_mob) and buckets copy data
|
||||
Entity.applyImplicitComponentIfPresent missing player: same gap, no item component reaches a freshly spawned entity
|
||||
EntityAttachments.scale missing minor: attachment points are not scaled with the mob, so riders on a resized or baby vehicle sit at the unscaled height
|
||||
EntityAttachments.getNullable inline crates/horizon-client/src/game/names.rs::Game::name_tags gap: minor: only the NAME_TAG default (0.5 above the height) is used, so a sniffer's tag (offset 2.05) sits 0.2 too high
|
||||
EntityAttachments.get inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment the point is always found: the species table or the top of the box
|
||||
EntityAttachments.getAverage inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment gap: minor: one point; a sheared harness or sulfur cube item spawns at the mob's centre or box top rather than at the average passenger point
|
||||
EntityAttachments.getClamped inline crates/horizon-client/src/mobs/riders.rs::seat the point turned by the vehicle's yaw and added to its position
|
||||
EntityAttachments.Builder.attach inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment attachment points are a match per species; only PASSENGER (and VEHICLE in vehicle_attachment) exist
|
||||
EntityAttachments.Builder.build inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment the fallback when a species has no point is the top of its box
|
||||
EntityDimensions.scale port crates/horizon-client/src/mobs/living.rs::Mob::dims baby and size scaling multiply width, height and eye height; gap: minor: attachments are not scaled
|
||||
EntityDimensions.withEyeHeight skip:data eye heights come from entity-types.json (MobType.eye_height)
|
||||
EntityDimensions.withAttachments inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment attachments are a per species table, not part of a dimensions value
|
||||
EntityEquipment.isEmpty port crates/horizon-world/src/player_inventory.rs::PlayerInventory::is_empty
|
||||
EntityEquipment.tick port crates/horizon-world/src/inventory_tick.rs::tick_equipment gap: minor: the player's worn items only; items on mobs never tick
|
||||
EntityEquipment.dropAll port crates/horizon-client/src/game.rs::Game::drop_inventory the main inventory, armour and off hand are thrown in random directions on death (Inventory.dropAll)
|
||||
EntityFluidInteraction.getOrCreateTrackerFor inline crates/horizon-world/src/entity_fluid.rs::EntityFluidInteraction::update a tracker is found or pushed while scanning the box
|
||||
EntityFluidInteraction.getCurrentAccumulatorFor inline crates/horizon-world/src/entity_fluid.rs::EntityFluidInteraction::new one accumulator is made per fluid tag up front
|
||||
EntityFluidInteraction.CurrentAccumulator.accumulate port crates/horizon-world/src/entity_fluid.rs::CurrentAccumulator::accumulate
|
||||
EntityFluidInteraction.Tracker.reset inline crates/horizon-world/src/entity_fluid.rs::EntityFluidInteraction::update the retain_mut at the start: idle trackers are dropped, the others get height 0 and eyes outside
|
||||
EntityReference.of skip:java references are plain UUID arrays (extra.owner), looked up when used
|
||||
EntityReference.getEntity port crates/horizon-client/src/game/persist.rs::Game::mob_by_uuid gap: minor: mobs only; the player is matched by its own UUID where it is needed
|
||||
EntityReference.resolve skip:java class cast check
|
||||
EntityReference.store inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt Owner is written as an int array UUID
|
||||
EntityReference.readWithOldOwnerConversion inline crates/horizon-client/src/entity_nbt.rs::mob_from_nbt gap: minor: Owner is read as an int array UUID; an owner saved as a player name (worlds from before 1.7.6) is not converted
|
||||
EntityReference.equals skip:java UUIDs are compared directly
|
||||
world/entity/EntitySelector.withinDistance port crates/horizon-client/src/game/dragon.rs::Game::fight_has_players the 192 block range around (0, 128, 0) for the dragon fight's valid players
|
||||
EntityType.appendCustomEntityStackConfig missing player: a spawn egg or entity item with an entity_data component spawns a plain entity (use_spawn_egg ignores the stack's data)
|
||||
EntityType.updateCustomEntityTag missing player: entity_data of a spawn egg (from /give or a data pack) is never loaded into the spawned entity
|
||||
EntityType.getDescription inline crates/horizon-client/src/game/commands.rs::Game::target_name entity.<namespace>.<name> translated
|
||||
EntityType.toShortString skip:debug only a game test message uses it
|
||||
EntityType.loadPassengersRecursive port crates/horizon-client/src/game/persist.rs::Game::load_mob riders under Passengers are loaded after the vehicle; gap: minor: only mobs Horizon simulates, the rest stay in the tag
|
||||
EntityType.loadEntitiesRecursive inline crates/horizon-client/src/game/persist.rs::Game::load_mob chunk entity lists, spawner and structure entities load each tag through load_mob
|
||||
EntityType.loadStaticEntity port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt a bad tag gives None instead of an exception
|
||||
EntityType.Builder.passengerAttachments inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment per species heights for the vehicles that carry riders; others use the box top
|
||||
EntityType.Builder.attach inline crates/horizon-client/src/mobs/riders.rs::passenger_attachment only the PASSENGER point is a table; NAME_TAG and the rest use their defaults
|
||||
EntityType.Builder.build skip:data entity types are read from entity-types.json (MobType) instead of being built in code
|
||||
EquipmentSlot.isArmor skip:other slots are plain head, chest, legs and feet constants; armour logic names them (Ctx::armor)
|
||||
EquipmentSlot.byName skip:data slot names are read as strings from data and NBT
|
||||
EquipmentSlotGroup.bySlot inline crates/horizon-client/src/game/lan_attributes.rs::slot_in_group a slot is its own group, so the test is group == slot
|
||||
EquipmentTable.createForAllSlots skip:data drop chances come from the loot and entity data
|
||||
ExperienceOrb.<init> port crates/horizon-client/src/game.rs::Game::add_orb random yaw and motion from the orb's own random; gap: minor: no rough direction offset and no unstuck when the orb spawns inside a block
|
||||
ExperienceOrb.unstuckIfPossible missing minor: an orb that spawns inside blocks (a kill in a 1x1 hole) is not nudged to the nearest free spot; Mob has free_position, orbs do not use it
|
||||
ExperienceOrb.awardWithDirection port crates/horizon-client/src/game.rs::Game::spawn_orbs gap: minor: the rough direction is never given, so xp bottle orbs do not fly away from the surface they hit
|
||||
ExperienceOrb.setUnderwaterMovement port crates/horizon-client/src/entities.rs::ExperienceOrb::tick gap: minor: tests the block at the orb's feet, not its eyes
|
||||
ExperienceOrb.hurtServer missing player: xp orbs have no health, so explosions, fire and lava never destroy them (vanilla orbs have 5)
|
||||
ExperienceOrb.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::orb_to_nbt gap: minor: Health is always written as 5
|
||||
ExperienceOrb.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::orbs_from_nbt gap: minor: Health is ignored
|
||||
HumanoidArm.getOpposite inline crates/horizon-client/src/game.rs::Game::hand_geometry the main hand's side is main_hand_left; the off hand is the other side
|
||||
InsideBlockEffectApplier.StepBasedCollector.flushStep port crates/horizon-client/src/arrows.rs::Collector::flush gap: minor: the arrow collector has four effects (clear freeze, fire, lava, extinguish); the player's collector sits in motion.rs check_inside_blocks
|
||||
|
@@ -0,0 +1,150 @@
|
||||
Interaction.defineSynchedData missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Interaction.readAdditionalSaveData missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Interaction.addAdditionalSaveData missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Interaction.onSyncedDataUpdated missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Interaction.skipAttackInteraction missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Interaction.interact missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Interaction.getLastAttacker missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Interaction.getTarget missing minor: no interaction entity; /summon interaction (the invisible click hitbox map makers use) creates nothing
|
||||
Leashable.isLeashed inline crates/horizon-client/src/mobs/leash.rs::tick the mob's extra.leash being set
|
||||
Leashable.setDelayedLeashHolderId inline crates/horizon-client/src/game/remote.rs::Game::handle_packet SetEntityLink arm: a holder id not known yet waits as Holder::Mob until the knot arrives (remote_objects.rs)
|
||||
Leashable.readLeashData port crates/horizon-client/src/mobs/leash.rs::pending_from_nbt holder UUID or fence knot block; kept pending until the holder exists
|
||||
Leashable.restoreLeashFromSave port crates/horizon-client/src/game/leads.rs::Game::tick_leads holder found by UUID or knot block; a lead whose holder never shows up drops as an item after 100 ticks
|
||||
Leashable.angularFriction inline crates/horizon-client/src/mobs/leash.rs::tick gap: minor: ground friction is a fixed 0.6 times 0.91, not the friction of the block under the mob (ice, slime)
|
||||
Leashable.checkElasticInteractions port crates/horizon-client/src/mobs/leash.rs::tick gap: minor: one attachment pair only; no quad leash for a horse, llama or sniffer led by a happy ghast
|
||||
Leashable.getHolderMovement port crates/horizon-client/src/mobs/leash.rs::holder_state gap: minor: the holder's velocity is always used; a NoAI mob holder should count as standing still
|
||||
Leashable.computeElasticInteraction port crates/horizon-client/src/mobs/leash.rs::spring gap: minor: single attachment pair (0, 0.5, 0.5 of the mob and 0, 0.5, 0 of the holder); the four-point version is missing
|
||||
Leashable.createQuadLeashOffsets missing player: a horse, llama or sniffer led by a happy ghast is drawn with one rope to its middle and pulled by one spring instead of four ropes to its corners
|
||||
Leashable.leashableLeashedTo port crates/horizon-client/src/game/leads.rs::Game::player_leashed only the player as holder (box of 32); mob and knot holders are filtered inline in interact_leash and interact_knot
|
||||
Leashable.leashableInArea port crates/horizon-client/src/game/leads.rs::Game::player_leashed the 32 block box around a point, for the player's lead only
|
||||
Leashable.Wrench.torqueFromForce inline crates/horizon-client/src/mobs/leash.rs::spring lever.z * force.x - lever.x * force.z
|
||||
Leashable.Wrench.accumulate inline crates/horizon-client/src/mobs/leash.rs::tick gap: minor: one wrench only, nothing to sum (quad leash would need it)
|
||||
Leashable.Wrench.scale inline crates/horizon-client/src/mobs/leash.rs::tick gap: minor: the 0.25 scale of a quad connection is not applied
|
||||
LightningBolt.powerLightningRod port crates/horizon-client/src/game/lightning.rs::Game::strike_rod powered for 8 ticks with level event 3002 along the rod
|
||||
LightningBolt.getStrikePosition inline crates/horizon-client/src/game/lightning.rs::Game::strike_rod the block 1e-6 below the bolt, also used by bolt_clear_copper
|
||||
LightningBolt.spawnFire port crates/horizon-client/src/game/lightning.rs::Game::bolt_fire gap: minor: no fire_spread_radius_around_player check (canSpreadFireAround)
|
||||
LightningBolt.randomWalkCleaningCopper inline crates/horizon-world/src/level/tick.rs::Sim::lightning_clear_copper 3 to 5 walks of up to 8 steps
|
||||
LightningBolt.randomStepCleaningCopper inline crates/horizon-world/src/level/tick.rs::Sim::lightning_clear_copper up to 10 random blocks in the 3x3x3 cube, first weathering copper steps back
|
||||
LightningBolt.shouldRenderAtSqrDistance missing player: a bolt more than 64 blocks away (scaled by Entity Distance) is still drawn; vanilla shows only the sky flash and thunder there
|
||||
LinearInterpolationHandler.create inline crates/horizon-client/src/game/remote.rs::Game::move_entity 3 steps (lerps.insert); only on a server's client, a local game moves boats, carts and bobbers directly
|
||||
LinearInterpolationHandler.startInterpolating inline crates/horizon-client/src/game/remote.rs::Game::move_entity target kept as Lerp with steps 3
|
||||
LinearInterpolationHandler.doInterpolate inline crates/horizon-client/src/game/remote.rs::Game::tick_remote_entities gap: minor: position eased by 1/steps; a boat's or minecart's yaw is set at once, not eased
|
||||
LivingEntity.<init> port crates/horizon-client/src/mobs.rs::Mob::new box, health, random yaw
|
||||
LivingEntity.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: player: arrow count (12) and stinger count (13) are never kept or sent, so arrows and bee stingers do not stay stuck in a body
|
||||
LivingEntity.hasLandedInLiquid missing minor: the fall impulse context (mace, wind charge) is not cleared when a server player lands in a liquid
|
||||
LivingEntity.getScale missing minor: no scale attribute, so /attribute scale and datapack scaling do nothing; baby and slime sizes come from tables in Mob::dims
|
||||
LivingEntity.shouldDropLoot inline crates/horizon-client/src/mobs/drops.rs::die mob_drops rule and not a baby (monsters excepted)
|
||||
LivingEntity.decreaseAirSupply port crates/horizon-client/src/motion/environment.rs::MotionWorld::tick_environment_damage gap: minor: only the player reads oxygen_bonus (Respiration); a mob loses one air per tick in ai.rs::base_tick
|
||||
LivingEntity.setLastHurtByPlayer inline crates/horizon-client/src/mobs.rs::Mob::damage_with ai.last_hurt_by_player = 100 on a player's hit; Game::last_hurt_by_player records which guest
|
||||
LivingEntity.onRemoval skip:other waypoint tracking is per player (game/lan_waypoints.rs); no mob has a transmit range
|
||||
LivingEntity.updateDirtyEffects skip:java dirty flag; Horizon reads invisibility and swirls from the effect list when needed
|
||||
LivingEntity.updateInvisibilityStatus inline crates/horizon-client/src/mobs/trader.rs::is_invisible the Invisibility effect hides the model (render_with) and sets flag 0x20 in lan.rs::mob_meta
|
||||
LivingEntity.areAllEffectsAmbient inline crates/horizon-client/src/game/client_ambient.rs::Game::effect_swirls a server's flag is kept in Extra::effect_ambient; a mob's own effects are never ambient
|
||||
LivingEntity.removeAllEffects port crates/horizon-client/src/effects.rs::PlayerEffects::clear player; a mob's list is cleared in commands/effects.rs::cmd_effect_clear
|
||||
LivingEntity.removeEffect inline crates/horizon-client/src/game/commands/effects.rs::Game::cmd_effect_clear retain by effect id for the player and for mobs
|
||||
LivingEntity.onEffectUpdated port crates/horizon-client/src/game/potions.rs::Game::apply_effect_status gap: minor: player only; a mob's attributes follow just speed and slowness, strength, weakness, resistance and absorption do nothing on mobs
|
||||
LivingEntity.onEffectsRemoved port crates/horizon-client/src/game/potions.rs::Game::apply_effect_status gap: minor: same as onEffectUpdated, mobs only react to speed and slowness
|
||||
LivingEntity.refreshDirtyAttributes port crates/horizon-client/src/game/potions.rs::Game::apply_effect_status modifiers diffed against the applied list each tick (player)
|
||||
LivingEntity.dealDefaultKnockback inline crates/horizon-client/src/mobs.rs::Mob::damage_with gap: minor: pushed away from the source position; an arrow uses its previous position, vanilla uses its flight direction
|
||||
LivingEntity.applyItemBlocking port crates/horizon-client/src/health.rs::Environment::apply_blocking gap: minor: the player's shield only; a mob holding a shield never blocks
|
||||
LivingEntity.playSecondaryHurtSound port crates/horizon-client/src/game/enchant_effects.rs::Game::thorns enchant.thorns.hit at the attacker
|
||||
LivingEntity.resolveMobResponsibleForDamage inline crates/horizon-client/src/mobs.rs::Mob::damage_with gap: minor: last_hurt_by comes from any attacker; no #no_anger damage types or wind charge exemption
|
||||
LivingEntity.resolvePlayerResponsibleForDamage inline crates/horizon-client/src/mobs.rs::Mob::damage_with gap: player: damage by a player's tamed wolf or cat sets no last-hurt-by-player, so the kill drops no experience and no player-only loot
|
||||
LivingEntity.breakItem port crates/horizon-client/src/game.rs::Game::damage_held gap: player: a tool or armor breaking shows no crumb particles and always plays entity.item.break, not the item's own break sound
|
||||
LivingEntity.dropExperience inline crates/horizon-client/src/mobs/drops.rs::die orbs only when a player killed it and mob_drops is on
|
||||
LivingEntity.getKnockback port crates/horizon-client/src/game/enchant_effects.rs::Game::extra_knockback gap: minor: the Knockback enchant halved (player and gear::knockback for mobs); the attack_knockback attribute counts only for the hoglin shove
|
||||
LivingEntity.dropFromLootTable port crates/horizon-client/src/mobs/drops.rs::roll the entity table from its random sequence
|
||||
LivingEntity.dropFromEntityInteractLootTable port crates/horizon-client/src/game/creatures.rs::Game::interact_armadillo brush/armadillo is the only table that uses it
|
||||
LivingEntity.dropFromShearingLootTable port crates/horizon-client/src/game/creatures.rs::Game::interact_mob sheep by colour; snow golem and bogged in interact_shear_mob; gap: minor: a mooshroom's five mushrooms are hardcoded, not read from the table
|
||||
LivingEntity.getFallDamageSound inline crates/horizon-client/src/mobs/living.rs::Mob::cause_fall_damage gap: minor: monsters use the generic small and big fall sounds, not entity.hostile.small_fall and big_fall
|
||||
LivingEntity.getHitbox missing minor: a rider's hitbox is not cut at its seat height; spear and melee tests use the full box
|
||||
LivingEntity.postPiercingAttack port crates/horizon-client/src/game/enchant_effects.rs::Game::post_piercing_attack Lunge's dash after a jab
|
||||
LivingEntity.trapdoorUsableAsLadder port crates/horizon-world/src/climbing.rs::on_climbable gap: minor: the player only; a mob's ai.rs::on_climbable checks the climbable tag at its feet, no open trapdoor over a ladder
|
||||
LivingEntity.isAlive port crates/horizon-client/src/mobs.rs::Mob::alive not removed and health above zero
|
||||
LivingEntity.setIgnoreFallDamageFromCurrentImpulse port crates/horizon-world/src/living_fall.rs::ImpulseContext::set_ignore_fall_damage 40 ticks of grace
|
||||
LivingEntity.getDamageAfterArmorAbsorb inline crates/horizon-client/src/mobs.rs::Mob::damage_with the player's armor wear is health.rs hurt_armor; the mob path also scales armor effectiveness (breach)
|
||||
LivingEntity.getKillCredit port crates/horizon-client/src/game/creatures.rs::Game::mob_died the last player to hit it, else the last mob
|
||||
LivingEntity.getTicksSinceLastKineticHitFeedback port crates/horizon-client/src/game/spear.rs::Game::kinetic_hit_ticks
|
||||
LivingEntity.swapHandItems missing player: on a server another player's hand swap (entity event 55) is not handled, so their held items do not swap on screen
|
||||
LivingEntity.getAttackRangeWith inline crates/horizon-client/src/game.rs::Game::reach gap: minor: only the spear's range is item specific (spear.rs REACH); other items use the default reach
|
||||
LivingEntity.getActiveItem inline crates/horizon-client/src/game.rs::Game::held the selected slot; the item in use is the `using` slot
|
||||
LivingEntity.getItemInHand inline crates/horizon-client/src/game.rs::Game::held main hand; the off hand is the `offhand` field
|
||||
LivingEntity.setItemInHand inline crates/horizon-client/src/game.rs::Game::held_mut main hand cell
|
||||
LivingEntity.getArmorCoverPercentage port crates/horizon-client/src/game/creatures.rs::Game::player_view armor_cover is worn pieces over 4; a LAN guest's is 0
|
||||
LivingEntity.shouldTravelInFluid inline crates/horizon-client/src/mobs/living.rs::Mob::travel in liquid, affected by fluids and not standing on a fluid it walks on (lava walkers)
|
||||
LivingEntity.isInShallowFluid inline crates/horizon-client/src/mobs/living.rs::Mob::travel_in_fluid lava depth against fluid_jump_threshold
|
||||
LivingEntity.updateFallFlyingMovement port crates/horizon-client/src/motion.rs::MotionWorld::travel_fall_flying gap: minor: the player only; a mob with a glider never fall-flies
|
||||
LivingEntity.travelRidden inline crates/horizon-client/src/mobs/living.rs::Mob::travel the rider's input is applied in equine.rs ridden_step, nautilus.rs ridden and happy_ghast.rs ridden
|
||||
LivingEntity.calculateEntityAnimation port crates/horizon-client/src/mobs/living.rs::Mob::update_walk_animation a passenger's legs are held still at draw time (anim.rs)
|
||||
LivingEntity.causeExtraKnockback port crates/horizon-client/src/game/enchant_effects.rs::Game::extra_knockback_direction target pushed along the attacker's yaw; the attacker stops sprinting
|
||||
LivingEntity.wasRecentlyStabbed inline crates/horizon-client/src/game/spear.rs::Game::spear_tick Game::stabbed with contact_cooldown_ticks
|
||||
LivingEntity.rememberStabbedEntity inline crates/horizon-client/src/game/spear.rs::Game::spear_tick stabbed.insert(key, now)
|
||||
LivingEntity.stabbedEntities missing player: the count of mobs stabbed in one use is never read, so the Spear Many Mobs advancement (spear_mobs trigger) never unlocks
|
||||
LivingEntity.stabAttack port crates/horizon-client/src/game/spear.rs::Game::stab_mob gap: minor: the player's spear only; mobs never stab
|
||||
LivingEntity.handleHandSwap skip:other the LAN server sends both changed slots in one SetEquipment instead of entity event 55; clients end in the same state
|
||||
LivingEntity.handleEquipmentChanges port crates/horizon-client/src/lan/entity.rs::ServerEntity::send_equipment changed slots as one SetEquipment
|
||||
LivingEntity.updatePlayersWithNewEquipment inline crates/horizon-client/src/lan/entity.rs::ServerEntity::send_equipment the packet is built there
|
||||
LivingEntity.tickHeadTurn port crates/horizon-client/src/game/remote.rs::remote_player_head_turn another player's body turn; mobs use Mob::body_rotation_tick in control.rs
|
||||
LivingEntity.canGlide inline crates/horizon-client/src/motion.rs::MotionWorld::player_movement_tick_with_fluids gap: minor: the player only (airborne, not flying, a worn glider, no Levitation); mobs never glide
|
||||
LivingEntity.onItemPickup port crates/horizon-client/src/game/sulfur_cubes.rs::Game::sulfur_cube_pickups gap: player: only a sulfur cube's pickup fires thrown_item_picked_up_by_entity; a piglin picking up gold you threw does not, so Oh Shiny never unlocks
|
||||
LivingEntity.isUsingItem inline crates/horizon-client/src/game/remote.rs::RemoteInputWorld::using_item Game::using is Some; a mob's is extra.using_item above 0
|
||||
LivingEntity.setLivingEntityFlag skip:java bit accessor; the flags are built when synced in game/lan.rs::mob_meta
|
||||
LivingEntity.getTicksUsingItem inline crates/horizon-client/src/game.rs::Game::tick_used_item the tick count kept in Game::using
|
||||
LivingEntity.stopUsingItem inline crates/horizon-client/src/game.rs::Game::tick_used_item using is set to None when the use ends or the stack is gone
|
||||
LivingEntity.getLocalBoundsForPose missing minor: no pose boxes; a dismounting rider uses mounts.rs::dismount_mount's own side checks
|
||||
LivingEntity.wouldNotSuffocateAtTargetPose port crates/horizon-client/src/pose.rs::MotionWorld::can_fit_pose gap: minor: the player's poses only; a camel changing pose is not checked
|
||||
LivingEntity.canUsePortal port crates/horizon-client/src/game/nether_portal.rs::Game::mob_can_use_portal gap: minor: a sleeping mob is not excluded
|
||||
LivingEntity.setPosToBed port crates/horizon-client/src/mobs/villager.rs::start_sleeping x and z at the bed's centre, y 0.6875 above its base (sleep height plus 0.125)
|
||||
LivingEntity.entityEventForEquipmentBreak missing player: on a server another player's or mob's tool or armor breaking (entity events 47 to 52, 65 and 68) makes no break sound or crumbs
|
||||
LivingEntity.onEquippedItemBroken inline crates/horizon-client/src/game.rs::Game::damage_held gap: minor: the stack is cleared and modifiers rebuilt, but no break event is broadcast
|
||||
LivingEntity.stopLocationBasedEffects inline crates/horizon-client/src/game.rs::Game::apply_equipment all applied modifiers are dropped and re-added from what is worn
|
||||
LivingEntity.getEquipmentSlotForItem inline crates/horizon-client/src/game/mob_gear.rs::Game::equip_from_table resolveSlot: the item's equip_slot, else the main hand
|
||||
LivingEntity.createEquipmentSlotAccess inline crates/horizon-client/src/game/commands/items.rs::Game::slots_named /item slot names such as armor.head and weapon.mainhand
|
||||
LivingEntity.getEquipmentSlot inline crates/horizon-client/src/game/commands/items.rs::Game::slots_named slot names instead of the numeric ids 98, 99 and 100 and up
|
||||
LivingEntity.getSlot port crates/horizon-client/src/game/commands/items.rs::Game::slots_named for the player and mobs through /item
|
||||
LivingEntity.recreateFromPacket port crates/horizon-client/src/game/remote.rs::Game::spawn_entity position, head yaw and movement of a server's mob
|
||||
LivingEntity.getPassengerRidingPosition port crates/horizon-client/src/mobs/riders.rs::seat gap: minor: attachments are a table by species, not scaled by getScale and the age scale
|
||||
LivingEntity.lerpHeadRotationStep inline crates/horizon-client/src/game/remote.rs::Game::tick_remote_entities head_lerps: 1/steps of the way to the target yaw
|
||||
LivingEntity.isInvulnerableTo inline crates/horizon-client/src/mobs.rs::Mob::damage_with gap: minor: the invulnerable flag only; no enchantment damage immunity
|
||||
Mob.getMoveControl port crates/horizon-client/src/mobs/control.rs::Mob::move_control_tick a mount is steered through riders.rs::drive
|
||||
Mob.getNavigation inline crates/horizon-client/src/mobs/riders.rs::drive a rider's vehicle carries it along; each mob keeps its own ai.nav
|
||||
Mob.getControllingPassenger inline crates/horizon-client/src/mobs/riders.rs::drive extra.rider steers the vehicle with its goals
|
||||
Mob.asValidTarget port crates/horizon-client/src/mobs/monster_brain.rs::can_attack creative and spectator players are never valid; goal mobs use goals.rs Mob::can_target_player
|
||||
Mob.spawnAnim port crates/horizon-client/src/game/spawner.rs::Game::poof_particles the poof of a mob a spawner made (event 20 on a server's client)
|
||||
Mob.updateControlFlags inline crates/horizon-client/src/mobs/riders.rs::drive gap: minor: a mob in a boat keeps its JUMP goals
|
||||
Mob.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt gap: minor: drop_chances and DeathLootTable survive only from the loaded raw tag
|
||||
Mob.burnUndead inline crates/horizon-client/src/mobs/ai.rs::ai_step gap: player: a helmeted undead never loses helmet durability in sunlight (vanilla 0 to 1 per burn tick), so the helmet never wears out or breaks
|
||||
Mob.pickUpItem missing player: mobs do not pick up dropped gear: zombies, skeletons, husks, drowned (tridents), vindicators, pillagers and wither skeletons that can pick up loot ignore items on the ground; only piglins, villagers, pandas, allays and sulfur cubes pick things up
|
||||
Mob.attemptToShearEquipment inline crates/horizon-client/src/game/ghasts.rs::Game::interact_happy_ghast gap: minor: the happy ghast harness and the llama carpet (llamas.rs interact_llama) only
|
||||
Mob.shearItem inline crates/horizon-client/src/game/ghasts.rs::Game::interact_happy_ghast the item is dropped and the shears lose 1 durability
|
||||
Mob.canReplaceCurrentItem missing minor: only used by loot pickup (Mob.pickUpItem, missing)
|
||||
Mob.compareArmor missing minor: only used by loot pickup (Mob.pickUpItem, missing); spawn gear is picked in finalize.rs Ctx::armor
|
||||
Mob.compareWeapons missing minor: only used by loot pickup (Mob.pickUpItem, missing)
|
||||
Mob.getApproximateAttributeWith missing minor: only used by loot pickup (Mob.pickUpItem, missing)
|
||||
Mob.canReplaceEqualItem missing minor: only used by loot pickup (Mob.pickUpItem, missing)
|
||||
Mob.checkSpawnObstruction port crates/horizon-client/src/mobs/spawn_selection.rs::spawn_obstruction no liquid in the box and no blocking entity
|
||||
Mob.hasValidEquippableItemForSlot skip:other Horizon stores only items that fit a slot, so there is nothing to validate
|
||||
Mob.createEquipmentParams inline crates/horizon-client/src/game/mob_gear.rs::Game::equip_from_table EntityLootParams with the mob as `this`
|
||||
Mob.getEquipmentForSlot inline crates/horizon-client/src/mobs/finalize.rs::Ctx::armor the material table leather, copper, golden, chainmail, iron, diamond by piece
|
||||
Mob.enchantSpawnedEquipment port crates/horizon-client/src/game/mob_gear.rs::Game::enchant_slot chance times the local difficulty's special multiplier
|
||||
Mob.usePlayerItem port crates/horizon-client/src/game.rs::Game::consume_held gap: minor: no use_remainder (a bottle or bowl a food item leaves behind)
|
||||
Mob.setNoAi skip:java plain field Mob::no_ai, synced as a flag in game/lan.rs::mob_meta
|
||||
Mob.setLeftHanded skip:java plain field Extra::left_handed, synced in game/lan.rs::mob_meta
|
||||
Mob.setAggressive skip:java plain field Ai::aggressive, synced in game/lan.rs::mob_meta
|
||||
Mob.isNoAi skip:java plain field Mob::no_ai
|
||||
Mob.isLeftHanded skip:java plain field Extra::left_handed
|
||||
Mob.getAttackBoundingBox inline crates/horizon-client/src/mobs/goals.rs::Mob::within_melee_range gap: minor: a mounted mob's box is not merged with its mount's
|
||||
Mob.removeAfterChangingDimensions inline crates/horizon-client/src/game/nether_portal.rs::Game::send_through_portal the mob moves through as NBT with its leash dropped, so nothing is left to clear
|
||||
Mob.onAttributeUpdated missing minor: follow_range set at runtime does not resize the pathfinder's visited-node cap (set once in Mob::new)
|
||||
Mob.registerDebugValues skip:debug debug overlay values
|
||||
Mob.swingForAttack port crates/horizon-client/src/mobs/ai.rs::Mob::swing_hand_modified swing duration with haste, conduit power and mining fatigue
|
||||
NeutralMob.addPersistentAngerSaveData port crates/horizon-client/src/mobs/bee.rs::to_nbt gap: minor: anger_end_time only; angry_at (the target's UUID) is not saved, and wolves and polar bears keep a tick counter instead
|
||||
NeutralMob.readPersistentAngerSaveData port crates/horizon-client/src/mobs/bee.rs::from_nbt gap: minor: anger_end_time only; angry_at is not read, so a reloaded angry bee picks its target again
|
||||
NeutralMob.isAngryAtAllPlayers missing minor: the universal_anger game rule has no effect (default off)
|
||||
NeutralMob.playerDied missing player: the forgive_dead_players rule (on by default) is not implemented, so bees, wolves and polar bears stay angry at a player who died and respawned
|
||||
OminousItemSpawner.tick port crates/horizon-client/src/game/ominous_item_spawner.rs::Game::tick_ominous_item_spawners count, then server and client parts
|
||||
OminousItemSpawner.tickServer inline crates/horizon-client/src/game/ominous_item_spawner.rs::Game::tick_ominous_item_spawners the about-to-spawn sound 36 ticks ahead, then the item
|
||||
OminousItemSpawner.tickClient inline crates/horizon-client/src/game/ominous_item_spawner.rs::Game::tick_ominous_item_spawners particles every 5 game ticks
|
||||
OminousItemSpawner.spawnItem port crates/horizon-client/src/game/ominous_item_spawner.rs::Game::spawn_ominous_item item entity or projectile, level event 3021 and entity_place game event
|
||||
OminousItemSpawner.spawnProjectile inline crates/horizon-client/src/game/ominous_item_spawner.rs::Game::spawn_ominous_item gap: minor: power and uncertainty come from projectile(); the spawner is not set as the projectile's owner
|
||||
PathfinderMob.checkSpawnRules port crates/horizon-client/src/mobs/ai.rs::walk_target_value natural spawning needs a walk target value of 0 or more
|
||||
|
@@ -0,0 +1,149 @@
|
||||
PortalProcessor.processPortalTeleportation port crates/horizon-client/src/nether_portal.rs::process decayTick when not inside, else counts up to the transition time; the time comes from the players_nether_portal_* rules for the player
|
||||
PositionMoveRotation.of skip:java record factory for teleport packets; Horizon builds the packet fields directly (lan/hub.rs teleport_relative)
|
||||
PostSpawnProcessor.andThen skip:java closure chaining
|
||||
Relative.rotation skip:java EnumSet builder; Horizon uses the bit constants in horizon-protocol packets/play.rs relative
|
||||
Relative.position skip:java EnumSet builder; bit constants
|
||||
Relative.direction skip:java EnumSet builder; bit constants
|
||||
Relative.isSet skip:java bit test; callers test the flag bits with &
|
||||
Relative.unpack skip:java the packet keeps the packed int and tests bits directly
|
||||
Relative.pack skip:java the packet keeps the packed int
|
||||
SlotAccess.forEquipmentSlot inline crates/horizon-client/src/game/commands/items.rs::slot_set gap: minor: no validator, so /item replace puts any item in a chest, legs or feet slot; vanilla refuses an item that does not belong there
|
||||
SlotProvider.getSlotsFromRange inline crates/horizon-client/src/game/commands/items.rs::slots_named slot names and ranges resolve to slots there; missing slots are skipped
|
||||
SpawnPlacements.register skip:data placements and heightmaps are read from tables (MobData)
|
||||
SpawnPlacements.getPlacementType port crates/horizon-client/src/mobs/data.rs::placement on ground when unregistered
|
||||
SteppedInterpolationHandler.create port crates/horizon-world/src/stepped_interpolation.rs::new client branch only: remote.rs builds one per living entity with its type's update interval; the server tracker is not created (see SteppedInterpolationTracker)
|
||||
SteppedInterpolationHandler.InterpolationData.advance port crates/horizon-world/src/stepped_interpolation.rs::advance
|
||||
SteppedInterpolationHandler.InterpolationData.addDelta skip:other remote mobs are only moved by interpolation here, so there is no predicted movement to fold in (see SteppedInterpolation::interpolate)
|
||||
SteppedInterpolationHandler.InterpolationData.addRotation skip:other same: no client-side movement of remote mobs to adjust the target for
|
||||
SteppedInterpolationHandler.InterpolationData.addStep port crates/horizon-world/src/stepped_interpolation.rs::add_step
|
||||
SteppedInterpolationHandler.InterpolationData.addSteps port crates/horizon-world/src/stepped_interpolation.rs::add_steps
|
||||
SteppedInterpolationHandler.InterpolationData.getInterpolationTicks inline crates/horizon-world/src/stepped_interpolation.rs::add_steps the sum of the steps' ticks
|
||||
SteppedInterpolationHandler.InterpolationData.getNewPositionAndRotation port crates/horizon-world/src/stepped_interpolation.rs::new_position
|
||||
SteppedInterpolationTracker.addStep missing minor: a LAN host never builds stepped paths; lan/entity.rs always sends a linear position, so guests interpolate each move over the update interval instead of replaying the host's step timing
|
||||
SteppedInterpolationTracker.updateTracking missing minor: same, the host keeps no tracked steps
|
||||
SteppedInterpolationTracker.getPositionPath missing minor: same, only PositionPath::Linear is sent
|
||||
SulfurCubeArchetype.AttributeEntry.add skip:data archetype attribute modifiers are constants in mobs/sulfur_cube.rs ARCHETYPES
|
||||
SulfurCubeArchetype.AttributeEntry.multiply skip:data same table
|
||||
SulfurCubeArchetypes.bootstrap skip:data the 12 archetypes are the ARCHETYPES table in mobs/sulfur_cube.rs
|
||||
SulfurCubeArchetypes.archetype skip:data builds the speed, bounce, friction and drag modifiers; values are in the table
|
||||
SulfurCubeArchetypes.contactDamage skip:data hot archetype's contact damage is a field of the table
|
||||
SulfurCubeArchetypes.register skip:data registry registration
|
||||
TamableAnimal.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: the flags byte (sitting 1, tame 4) is sent to LAN guests; the owner UUID data is never sent
|
||||
TamableAnimal.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt Owner and Sitting for wolf, cat and parrot
|
||||
TamableAnimal.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt an owner makes the mob tame (wolf health 40), Sitting restored; old owner-name conversion is not done
|
||||
TamableAnimal.handleEntityEvent port crates/horizon-client/src/particles.rs::entity_event_burst event 7 hearts, event 6 smoke, seven particles
|
||||
TamableAnimal.isTame skip:other a field: Mob.extra.tame
|
||||
TamableAnimal.setInSittingPose skip:other a field: Mob.extra.sitting, set by the sit goals and interactions
|
||||
TamableAnimal.tame inline crates/horizon-client/src/game/creatures.rs::interact_mob wolf (bone, 1 in 3), cat and parrot set tame, owner and sitting in their interaction arms, then the tame_animal trigger; mobs/tame.rs::set_tame gives the wolf 40 health
|
||||
TamableAnimal.getTeam missing minor: a tame pet does not take its owner's scoreboard team (mob_team looks up only the pet's own UUID), so team glow colour, collision rules and friendly fire ignore the owner's team
|
||||
TamableAnimal.die missing player: when a tamed wolf, cat or parrot dies its owner gets no chat death message; death_message only covers the player's own death
|
||||
TamableAnimal.shouldTryTeleportToOwner port crates/horizon-client/src/mobs/tame.rs::owner_distance_sqr the >= 144 comparison is made in TamePanic::tick and the follow-owner goal
|
||||
TamableAnimal.teleportToAroundBlockPos port crates/horizon-client/src/mobs/tame.rs::teleport_to_owner ten tries within 3 blocks; the walkable test is approximated (solid block below, not leaves, no fluid, no collision)
|
||||
WalkAnimationState.speed port crates/horizon-client/src/mobs/anim.rs::state speed(partial) lerps previous and current limb speed, capped at 1; the plain speed() is the limb_speed field
|
||||
ActivityData.createPriorityPairs inline crates/horizon-client/src/mobs/villager_brain.rs::packages each behaviour's priority is written out where it is added
|
||||
Brain.provider skip:data builder of the sensor list and activity supplier; each species builds its brain in init or make_brain
|
||||
Brain.<init> port crates/horizon-client/src/mobs/villager_brain.rs::make_brain sensors' first scans delayed by draws from the mob's random, packed memories restored, schedule applied; the warden's is Brain::new plus delay_sensors
|
||||
Brain.getMemorySlot skip:java memories are typed Slot fields of Memories, no map lookup
|
||||
Brain.setMemoryInternal port crates/horizon-client/src/mobs/villager_brain.rs::set_ttl Slot::set_ttl stores a value with its time to live; set_list erases an empty list
|
||||
Brain.getMemoryInternal skip:java typed fields, an unregistered memory cannot be asked for
|
||||
Brain.forEach inline crates/horizon-client/src/mobs/villager_brain.rs::pack the visitor over the memories is Memories::pack and the debug describe
|
||||
Brain.isMemoryValue skip:java compare Slot::get() with the value
|
||||
Brain.checkMemory port crates/horizon-client/src/mobs/villager_brain.rs::present VALUE_PRESENT is Slot::present, VALUE_ABSENT is its negation, REGISTERED is always true for a field
|
||||
Brain.getRunningBehaviors inline crates/horizon-client/src/mobs/villager_brain.rs::tick behaviours are kept in start order and tick loops over those whose B::running is true
|
||||
Brain.getActiveNonCoreActivity skip:other Brain.activity is the one non-core activity
|
||||
Brain.eraseMemoriesForOtherActivitesThan port crates/horizon-client/src/mobs/warden_brain.rs::set_active leaving an activity erases the memory it needed (warden); villager activities erase none in vanilla
|
||||
Brain.setActiveActivityToFirstValid port crates/horizon-client/src/mobs/warden_brain.rs::update_activity the same loop is in animal_brain.rs and monster_brain.rs update_activity
|
||||
Brain.addActivity inline crates/horizon-client/src/mobs/villager_brain.rs::packages behaviours are listed per brain in vanilla's start order (priority, hash slot, insertion) instead of a priority map
|
||||
Brain.tickEachRunningBehavior inline crates/horizon-client/src/mobs/villager_brain.rs::tick the second loop of tick
|
||||
Brain.activityRequirementsAreMet port crates/horizon-client/src/mobs/villager_brain.rs::requirements_met hard-coded memory conditions per activity
|
||||
Brain.isEmptyCollection port crates/horizon-client/src/mobs/villager_brain.rs::set_list only list memories can be empty
|
||||
Brain.isBrainDead skip:other mobs without a brain are told apart by species (monster_brain::has_brain) or an empty brain Option
|
||||
Attribute.Sentiment.getStyle port crates/horizon-client/src/item_tooltip.rs::attribute_color burning time and fall damage are negative, gravity, scale and waypoint ranges neutral, the rest positive
|
||||
AttributeInstance.getModifiers port crates/horizon-world/src/attributes/mod.rs::modifiers player and LAN attribute maps; a mob's own attributes (mobs/finalize.rs) keep a plain list
|
||||
AttributeInstance.addOrUpdateTransientModifier port crates/horizon-world/src/attributes/mod.rs::add_or_update_transient
|
||||
AttributeInstance.addOrReplacePermanentModifier port crates/horizon-world/src/attributes/mod.rs::add_or_replace_permanent mobs: mobs/finalize.rs add_modifier
|
||||
AttributeInstance.addPermanentModifier port crates/horizon-world/src/attributes/mod.rs::add_permanent
|
||||
AttributeInstance.addPermanentModifiers port crates/horizon-world/src/attributes/mod.rs::add_permanent_many
|
||||
AttributeInstance.removeModifier port crates/horizon-world/src/attributes/mod.rs::remove a mob's own attributes (mobs/finalize.rs) have no remove
|
||||
AttributeInstance.removeModifiers port crates/horizon-world/src/attributes/mod.rs::remove_all
|
||||
AttributeInstance.replaceFrom port crates/horizon-world/src/attributes/mod.rs::replace_from
|
||||
AttributeInstance.pack port crates/horizon-world/src/attributes/mod.rs::pack
|
||||
AttributeInstance.apply port crates/horizon-world/src/attributes/mod.rs::apply
|
||||
AttributeMap.onAttributeModified port crates/horizon-world/src/attribute_map.rs::modified Dirty::dirty in attributes/live.rs calls it
|
||||
AttributeMap.getBaseValue port crates/horizon-world/src/attribute_map.rs::value ValueKind::Base
|
||||
AttributeMap.addTransientAttributeModifiers port crates/horizon-world/src/attributes/live.rs::add_effect_modifiers effect modifiers: remove the old one by id, then add transient
|
||||
AttributeMap.removeAttributeModifiers port crates/horizon-world/src/attributes/live.rs::remove_effect_modifiers
|
||||
AttributeMap.assignAllValues missing minor: the player is rebuilt from default attributes when respawning out of the End (PlayerMotion::new), so values and modifiers carried by keepAll are lost
|
||||
AttributeMap.assignBaseValues missing minor: base values changed by /attribute (max_health, speed) reset on respawn because the player's attributes are rebuilt
|
||||
AttributeMap.assignPermanentModifiers missing minor: permanent modifiers added by /attribute are lost on respawn out of the End
|
||||
AttributeMap.resetBaseValue port crates/horizon-world/src/attribute_map.rs::reset_base live.rs reset_base for the player
|
||||
AttributeMap.apply inline crates/horizon-client/src/entity_nbt.rs::mob_from_nbt gap: minor: of a mob's saved attributes only max_health, movement_speed, attack_damage, jump_strength bases and the follow range bonus are read; other bases and permanent modifiers are dropped, and a player's saved attributes are kept raw in player_extra but not applied on load
|
||||
AttributeSupplier.getAttributeInstance port crates/horizon-world/src/attributes/entity.rs::instance EntityAttributes::instance
|
||||
AttributeSupplier.createInstance port crates/horizon-world/src/attributes/entity.rs::create Catalog::create builds the entity's attributes from the type's default bases
|
||||
AttributeSupplier.Builder.create skip:data defaults come from the attribute catalog export (Catalog::from_json)
|
||||
AttributeSupplier.Builder.add skip:data same catalog export
|
||||
DefaultAttributes.validate skip:debug logs entity types without attributes in an IDE
|
||||
RangedAttribute.sanitizeValue port crates/horizon-world/src/attributes/mod.rs::sanitize Definition::sanitize clamps and gives the minimum for NaN
|
||||
AcquirePoi.create port crates/horizon-client/src/mobs/villager_brain.rs::acquire the behaviour runs in B::try_start; POI tickets are counted from other villagers' memories
|
||||
AcquirePoi.findPathToPois inline crates/horizon-client/src/mobs/villager_brain.rs::try_start create_path_to_any over the found POIs with the largest valid range
|
||||
AcquirePoi.JitteredLinearRetry.markAttempt port crates/horizon-client/src/mobs/villager_brain.rs::mark
|
||||
AcquirePoi.JitteredLinearRetry.isStillValid inline crates/horizon-client/src/mobs/villager_brain.rs::try_start retries.retain(now - previous < 400)
|
||||
AnimalMakeLove.checkExtraStartConditions inline crates/horizon-client/src/mobs/animal_brain.rs::try_start in love and a partner from breed_partner
|
||||
AnimalMakeLove.canStillUse inline crates/horizon-client/src/mobs/animal_brain.rs::tick_or_stop gap: minor: partner_panicking is stubbed to false, so a partner that starts panicking does not end the pairing
|
||||
AnimalMakeLove.stop port crates/horizon-client/src/mobs/animal_brain.rs::do_stop
|
||||
AnimalMakeLove.hasBreedTargetOfRightType inline crates/horizon-client/src/mobs/animal_brain.rs::can_mate_with same-species test on the remembered partner
|
||||
AnimalPanic.checkExtraStartConditions inline crates/horizon-client/src/mobs/animal_brain.rs::try_start hurt by a panic cause, or already panicking
|
||||
AnimalPanic.start port crates/horizon-client/src/mobs/animal_brain.rs::try_start panic memory set, walk target cleared, navigation stopped
|
||||
AnimalPanic.lookForWater missing minor: a burning brain animal (sniffer, ghastling) does not run for nearby water; goal-driven animals do (goals.rs Panic)
|
||||
BabyFollowAdult.create port crates/horizon-client/src/mobs/animal_brain.rs::trigger B::FollowAdult for the ghastling; goat, camel, armadillo, axolotl and hoglin babies use the FollowParent goal
|
||||
BackUpIfTooClose.create missing player: a crossbow piglin stays put when you come within 5 blocks; vanilla backs away strafing while it keeps aiming
|
||||
BecomePassiveIfMemoryPresent.create port crates/horizon-client/src/mobs/piglin.rs::hoglin_repellent a hoglin near a repellent is pacified for 200 ticks and drops its target
|
||||
Behavior.hasRequiredMemories inline crates/horizon-client/src/mobs/villager_brain.rs::try_start each behaviour tests its memories at the top of its try_start arm
|
||||
BehaviorUtils.entityIsVisible port crates/horizon-client/src/mobs/villager_brain.rs::visible_contains also copied in the animal, warden and monster brains
|
||||
BehaviorUtils.setWalkAndLookTargetMemoriesToEachOther port crates/horizon-client/src/mobs/animal_brain.rs::lock_gaze_and_walk this mob's half; the partner's half comes with the breed-target event
|
||||
BehaviorUtils.isOtherTargetMuchFurtherAwayThanCurrentAttackTarget missing minor: piglins, hoglins and zoglins switch to any attacker, even one more than 4 blocks further than their current target
|
||||
BehaviorUtils.getNearestTarget skip:other picks among attack, avoid and nearest targets for PiglinAi and HoglinAi; those mobs choose with goals (NearestTarget, HurtByTarget)
|
||||
BehaviorUtils.getTargetNearestMe skip:other same helper
|
||||
BehaviorUtils.getLivingEntityFromUUIDMemory skip:other the ANGRY_AT memory is the mob's anger and target fields
|
||||
BehaviorUtils.getRandomSwimmablePos inline crates/horizon-client/src/mobs/goals.rs::can_use Stroll with swim: default_random_pos retried up to 10 times until the spot is water
|
||||
CelebrateVillagersSurvivedRaid.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::try_start raid victory and no blocks above
|
||||
CelebrateVillagersSurvivedRaid.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::tick_or_stop 600 ticks while a raid is nearby
|
||||
CelebrateVillagersSurvivedRaid.stop inline crates/horizon-client/src/mobs/villager_brain.rs::do_stop back to the scheduled activity
|
||||
CelebrateVillagersSurvivedRaid.tick inline crates/horizon-client/src/mobs/villager_brain.rs::tick_or_stop celebrate sound 1 in 100, a firework 1 in 200 with open sky
|
||||
CelebrateVillagersSurvivedRaid.getFirework port crates/horizon-client/src/game/raids.rs::villager_firework burst rocket in a random dye colour, flight 0 to 2
|
||||
ChargeAttack.canStillUse port crates/horizon-client/src/mobs/nautilus.rs::still_ok tame, distance limits 12 and 11, line of sight and the cooldown
|
||||
ChargeAttack.dealDamageToTarget inline crates/horizon-client/src/mobs/nautilus.rs::tick attack damage sent as an AttackPlayer or AttackMob event on contact
|
||||
ChargeAttack.dealKnockBack inline crates/horizon-client/src/mobs/nautilus.rs::tick push along the nautilus's facing scaled by speed with speed and slowness effects
|
||||
CopyMemoryWithExpiry.create inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: zombified avoidance is the AvoidEntity goal; baby piglins do not run from wither skeletons or the wither and never ride baby hoglins
|
||||
CountDownCooldownTicks.canStillUse inline crates/horizon-client/src/mobs/animal_brain.rs::tick_or_stop the CountDown arms run while the cooldown is above 0; the goat's ram cooldown is ram_cooldown in goat.rs
|
||||
CrossbowAttack.checkExtraStartConditions port crates/horizon-client/src/mobs/illager.rs::can_use gap: minor: the piglin uses RangedCrossbowAttackGoal's check (holding a crossbow, live target), with no line of sight or attack range test
|
||||
CrossbowAttack.canStillUse port crates/horizon-client/src/mobs/illager.rs::can_continue
|
||||
CrossbowAttack.crossbowAttack port crates/horizon-client/src/mobs/illager.rs::tick gap: minor: the goal's state machine; piglins also walk to within 8 blocks and move at half speed while charged, the brain behaviour stands and shoots
|
||||
DismountOrSkipMounting.create missing minor: piglins never ride; baby piglins do not climb on baby hoglins
|
||||
DismountOrSkipMounting.isVehicleValid missing minor: same, no piglin riding
|
||||
DoNothing.tryStart port crates/horizon-client/src/mobs/warden_brain.rs::try_start B::DoNothing starts a random timer
|
||||
DoNothing.tickOrStop port crates/horizon-client/src/mobs/warden_brain.rs::tick_or_stop stops when the timer ends
|
||||
EntityTracker.currentPosition port crates/horizon-client/src/mobs/villager_brain.rs::position Tracker::position, eyes or feet
|
||||
EntityTracker.currentBlockPosition port crates/horizon-client/src/mobs/villager_brain.rs::block Tracker::block
|
||||
EntityTracker.isVisibleBy port crates/horizon-client/src/mobs/villager_brain.rs::tracker_visible
|
||||
EraseMemoryIf.create skip:other generic builder; its uses (breeding hoglins and axolotls drop their target, piglins near zombified drop theirs) are only approximated by goal priorities
|
||||
FollowTemptation.canStillUse inline crates/horizon-client/src/mobs/animal_brain.rs::tick_or_stop tempting player present, no breed target, not panicking
|
||||
FollowTemptation.stop port crates/horizon-client/src/mobs/animal_brain.rs::do_stop cooldown 100, walk and look targets cleared
|
||||
GateBehavior.getRequiredMemories skip:java memory registration, memories are fields
|
||||
GateBehavior.hasRequiredMemories inline crates/horizon-client/src/mobs/villager_brain.rs::try_start Gate::try_start checks its absent memory and each child's
|
||||
GateBehavior.debugString skip:debug
|
||||
GiveGiftToHero.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::try_start hero visible, countdown to the next gift
|
||||
GiveGiftToHero.start inline crates/horizon-client/src/mobs/villager_brain.rs::try_start interaction target set, look at the hero
|
||||
GiveGiftToHero.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::tick_or_stop hero visible and no gift given yet
|
||||
GiveGiftToHero.stop inline crates/horizon-client/src/mobs/villager_brain.rs::do_stop next gift in 600 to 6600 ticks, memories cleared
|
||||
GiveGiftToHero.throwGift port crates/horizon-client/src/game/raids.rs::throw_gift loot table by profession (villager::gift_table), tossed toward the player
|
||||
GiveGiftToHero.isWithinThrowingDistance inline crates/horizon-client/src/mobs/villager_brain.rs::tick_or_stop block distance under 5
|
||||
GoAndGiveItemsToTarget.start inline crates/horizon-client/src/mobs/allay.rs::tick the Deliver goal flies to the deposit
|
||||
GoAndGiveItemsToTarget.tick port crates/horizon-client/src/game/allays.rs::allay_deliver within 3 blocks of the deposit it throws one item a tick
|
||||
GoAndGiveItemsToTarget.canThrowItemToTarget inline crates/horizon-client/src/mobs/allay.rs::can_use holding something and a deposit (note block or tame owner) exists
|
||||
GoToClosestVillage.create port crates/horizon-client/src/mobs/villager_brain.rs::try_start B::GoToClosestVillage arm: five tries at a land position closer to a village
|
||||
GoToPotentialJobSite.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::try_start idle, work or play activity
|
||||
GoToPotentialJobSite.tick inline crates/horizon-client/src/mobs/villager_brain.rs::tick_or_stop walk to the potential job site
|
||||
GoToPotentialJobSite.stop inline crates/horizon-client/src/mobs/villager_brain.rs::do_stop potential job site forgotten
|
||||
GoToTargetLocation.create port crates/horizon-client/src/mobs/warden_brain.rs::try_start B::GoToDisturbance with getNearbyPos; the piglin's celebrate (mobs/piglin.rs Celebrate::walk) walks straight to the spot without the random offset
|
||||
GoToWantedItem.create port crates/horizon-client/src/mobs/piglin.rs::can_use the game picks the gold (game/piglins.rs) and the goal walks to it at speed 1.0
|
||||
|
@@ -0,0 +1,147 @@
|
||||
HarvestFarmland.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start HarvestFarmland arm: mob_griefing, farmer, then the 3x3x3 scan for ripe crops and bare farmland (farmland_around) and one pick by the level random (pick_farmland)
|
||||
HarvestFarmland.start inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start sets look and walk target (speed 0.5, close 1) once now is past next_ok
|
||||
HarvestFarmland.stop inline crates/horizon-client/src/mobs/villager_brain.rs::B::do_stop clears look and walk target, worked = 0, next_ok = now + 40
|
||||
InsideBrownianWalk.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start InsideBrownianWalk arm: shuffled 3x3x3 cells, first one without sky view that is solid; a solid-block test stands in for loadedAndEntityCanStandOn
|
||||
InteractWith.of inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start InteractWith arm for villager, breeding villager and cat targets (range 8, speed 0.5, stop distance 2); piglins and piglin brutes use goals instead
|
||||
InteractWithDoor.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start gap: player: only the villager brain opens doors on its path (interact_with_doors); copper golems and piglins never do, so a golem's route through a wooden door ends against the closed door and a piglin cannot path through one
|
||||
InteractWithDoor.areOtherMobsComingThroughDoor inline crates/horizon-client/src/mobs/villager_brain.rs::close_doors villagers within 2 blocks of the door whose path has the door as previous or next node
|
||||
InteractWithDoor.isMobComingThroughDoor inline crates/horizon-client/src/mobs/villager_brain.rs::close_doors read from the other villager's Seen.path_nodes
|
||||
InteractWithDoor.isDoorTooFarAway inline crates/horizon-client/src/mobs/villager_brain.rs::close_doors 3 block test; no dimension compare needed
|
||||
InteractWithDoor.rememberDoorToClose port crates/horizon-client/src/mobs/villager_brain.rs::remember_door
|
||||
JumpOnBed.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start baby with a nearest bed remembered
|
||||
JumpOnBed.start inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start target bed, 100 ticks to reach it, 3 to 6 jumps from the level random
|
||||
JumpOnBed.stop inline crates/horizon-client/src/mobs/villager_brain.rs::B::do_stop resets bed, time left, jumps and cooldown
|
||||
JumpOnBed.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop baby, bed still a bed, not tired of walking or jumping
|
||||
JumpOnBed.tick inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop counts time to reach the bed, then jumps every 5 ticks while on the bed
|
||||
JumpOnBed.startWalkingTowardsBed inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start walk target on the bed, speed 0.5, close 0
|
||||
JumpOnBed.nearBed inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start the nearest-bed memory must be present
|
||||
JumpOnBed.onOrOverBed inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop the on_or_over test on the block and the one below
|
||||
JumpOnBed.tiredOfWalking inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop folded into the still-using test
|
||||
JumpOnBed.tiredOfJumping inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop folded into the still-using test
|
||||
LocateHidingPlace.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start LocateHidingPlace arm: a home POI within close+1 and near, else a shuffled one within the radius, else the home memory; sets the hiding place and walks there when far
|
||||
LongJumpMidJump.stop missing player: frogs and goats never long jump (no long-jump activity; only the frog's jump animation exists), so there is no leap, landing thud or jump cooldown
|
||||
LongJumpToPreferredBlock.start missing player: frogs never aim their jumps at lily pads or big dripleaf, since they never long jump
|
||||
LongJumpToPreferredBlock.getJumpCandidate missing minor: the lily pad and big dripleaf preference of the frog's missing long jump
|
||||
LongJumpToRandomPos.defaultAcceptableLandingSpot missing minor: landing test of the missing long jump (the breeze has its own jump in monster_brain.rs)
|
||||
LongJumpToRandomPos.checkExtraStartConditions missing player: frogs and goats never start a long jump (goats leaping between ledges, frogs hopping across water and lily pads)
|
||||
LongJumpToRandomPos.canStillUse missing minor: part of the missing frog and goat long jump
|
||||
LongJumpToRandomPos.start missing player: no long jump for frogs and goats, so no 40 tick crouch and leap
|
||||
LongJumpToRandomPos.tick missing player: no leap velocity or jump sound for frogs and goats
|
||||
LongJumpToRandomPos.pickCandidate missing minor: landing spot search of the missing long jump
|
||||
LongJumpToRandomPos.getJumpCandidate missing minor: weighted pick of the missing long jump
|
||||
LongJumpToRandomPos.isAcceptableLandingPosition missing minor: landing test of the missing long jump
|
||||
LongJumpToRandomPos.calculateOptimalJumpVector missing minor: jump angle search of the missing frog and goat long jump (the breeze has its own in breeze.rs)
|
||||
LookAndFollowTradingPlayerSink.followPlayer port crates/horizon-client/src/mobs/villager_brain.rs::follow_trading_player
|
||||
LookAtTargetSink.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop the look target must still be visible; the sniffer, warden and breeze brains have the same arm
|
||||
LookAtTargetSink.tick inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop look_at the target position
|
||||
MeleeAttack.create inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start creaking arm (target in reach and visible, attack cooldown); the warden and axolotl brains have their own; gap: minor: piglins, piglin brutes, hoglins and zoglins attack through the MeleeAttack goal in goals.rs, whose chase and cooldown rhythm differ from the brain behaviour
|
||||
Mount.create missing player: a baby piglin never walks to and climbs onto a baby hoglin (PiglinAi's ride target); no brain or goal sends a mob to mount another, jockeys only come from spawning
|
||||
MoveToSkySeeingSpot.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start MoveToSkySeeingSpot arm: only when the villager cannot see the sky and has no walk target
|
||||
MoveToSkySeeingSpot.getOutdoorPosition inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start ten random spots within 10, 3 and 10 blocks, the first with no blocks above (no_blocks_above)
|
||||
MoveToTargetSink.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start MoveToTargetSink arm: retry cooldown, reached, compute_path; the sniffer, ghastling, golem, breeze, creaking and warden brains carry the same arm
|
||||
MoveToTargetSink.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop gap: minor: no spectator check (see isWalkTargetSpectator)
|
||||
MoveToTargetSink.start inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start the arm sets the PATH memory and starts the navigation as it starts
|
||||
MoveToTargetSink.isWalkTargetSpectator missing minor: a walk target on a player in spectator mode is not dropped
|
||||
PlayTagWithOtherKids.chaseKid inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start PlayTag arm sets interaction, look and walk target (speed 0.6, close 1)
|
||||
PlayTagWithOtherKids.findSomeoneBeingChased missing minor: a kid always chases the first friend it sees instead of joining a chase of a kid that has 1 to 5 chasers (Seen.interaction_target is recorded but unused)
|
||||
PlayTagWithOtherKids.checkHowManyChasersEachFriendHas missing minor: no chaser counts; see findSomeoneBeingChased
|
||||
PlayTagWithOtherKids.isFriendChasingMe missing player: a kid that is being chased never runs off to a spot in the village, so the tag game is only chasing
|
||||
PoiCompetitorScan.selectWinner inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start PoiCompetitorScan arm: higher xp keeps the site, a tie goes to the later villager; gap: minor: only this villager's own site is erased, a losing neighbour loses its site in its own scan
|
||||
PoiCompetitorScan.competesForSameJobsite inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start same job site and profession; the profession is compared with this villager's, not with the site's POI type
|
||||
PrepareRamNearestTarget.start port crates/horizon-client/src/mobs/goat.rs::Ram::start picks the nearest allowed target and chooses a ramming spot
|
||||
PrepareRamNearestTarget.canStillUse port crates/horizon-client/src/mobs/goat.rs::Ram::can_continue prepare phase: a candidate whose target lives, within the 160 tick time out
|
||||
PrepareRamNearestTarget.getEdgeOfBlock inline crates/horizon-client/src/mobs/goat.rs::prepare_tick half block offset by the sign toward the target
|
||||
RandomStroll.fly inline crates/horizon-client/src/mobs/animal_brain.rs::B::trigger Stroll arm with fly set (ghastling); only without a walk target
|
||||
RandomStroll.strollFlyOrSwim inline crates/horizon-client/src/mobs/animal_brain.rs::B::trigger Stroll arm: only without a walk target, walk target set or erased; the monster and warden brains have their own stroll arms
|
||||
RandomStroll.getTargetSwimPos inline crates/horizon-client/src/mobs/animal_brain.rs::axolotl_action SwimStroll arm: the (1,1) to (10,7) tiers with the fallback
|
||||
RandomStroll.getTargetFlyPos inline crates/horizon-client/src/mobs/animal_brain.rs::B::trigger air_and_water_random_pos along the view vector, -2 vertical offset
|
||||
SetClosestHomeAsWalkTarget.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start ClosestHomeAsWalkTarget arm: nearest home within 48, five per batch, 40 tick cache
|
||||
SetEntityLookTarget.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start LookAtEntity arm (species, player or mob category within 8); the sniffer and warden brains have their own; piglins use the LookAtPlayer goal
|
||||
SetEntityLookTargetSometimes.create inline crates/horizon-client/src/mobs/animal_brain.rs::B::trigger LookAtPlayerSometimes arm (copper golem, axolotl); the creaking has its own in monster_brain.rs; goal mobs use LookAtPlayer goals
|
||||
SetEntityLookTargetSometimes.Ticker.tickDownAndCheck inline crates/horizon-client/src/mobs/animal_brain.rs::B::trigger the tick counter inside the arm
|
||||
SetLookAndInteract.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start SetLookAndInteract arm: nearest visible player within 4 blocks becomes interaction and look target
|
||||
SetWalkTargetAwayFrom.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start WalkAwayFrom arm (nearest hostile and last attacker within 6 blocks, away 16 and 7, ten tries); piglins and hoglins use AvoidEntity and repellent goals
|
||||
SetWalkTargetFromAttackTargetIfTargetOutOfReach.create inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start SetWalkTargetFromAttackTarget arm (the warden and axolotl brains have the same); piglins and hoglins chase with the MeleeAttack goal
|
||||
SetWalkTargetFromBlockMemory.create port crates/horizon-client/src/mobs/villager_brain.rs::walk_to_block_memory
|
||||
SetWalkTargetFromLookTarget.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start WalkToLookTarget arm; the sniffer, ghastling and breeze brains have the same
|
||||
ShowTradesToPlayer.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop ShowTrades arm: still near the player, look time left and an interaction target
|
||||
ShowTradesToPlayer.start inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start looks at the player, look time 40
|
||||
ShowTradesToPlayer.stop inline crates/horizon-client/src/mobs/villager_brain.rs::B::do_stop clears the interaction target; the held item is never touched because no offer is ever shown
|
||||
ShowTradesToPlayer.findItemsToDisplay missing player: a villager facing a player who holds an item matching one of its trade costs never holds up the matching offer, and the look time never extends to 900 ticks
|
||||
ShowTradesToPlayer.updateDisplayItems missing minor: the offer list matched against the player's item, part of findItemsToDisplay
|
||||
ShowTradesToPlayer.playerItemStackMatchesCostOfOffer missing minor: cost match of findItemsToDisplay
|
||||
ShowTradesToPlayer.lookAtTarget inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop the arm sets the look target to the player on start and each tick
|
||||
ShowTradesToPlayer.displayCyclingItems missing player: with several matching offers the villager would swap the item in its hand every 40 ticks; it never holds anything
|
||||
ShufflingList.add inline crates/horizon-client/src/mobs/warden_brain.rs::activities the idle RunOne list is built with its weights (stroll 2, do nothing 1); the other brains list weights where their packages are built
|
||||
ShufflingList.WeightedEntry.setRandom inline crates/horizon-client/src/mobs/warden_brain.rs::B::try_start the RunOne arm draws -pow(random, 1/weight) per entry and sorts; the villager, animal and monster brains do the same in their gates
|
||||
SleepInBed.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start SleepInBed arm: not riding, 100 ticks since waking, bed within 2 blocks and free
|
||||
SleepInBed.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop rest activity, above the bed by 0.4 and within 1.14 of it
|
||||
SleepInBed.stop inline crates/horizon-client/src/mobs/villager_brain.rs::B::do_stop wakes the villager and sets next_ok = now + 40
|
||||
SpearApproach.ableToAttack missing minor: part of the missing spear approach of PiglinAi
|
||||
SpearApproach.checkExtraStartConditions missing player: a piglin holding a golden spear (about 1 in 20 adult piglins) just walks up and melees; vanilla first closes in on the target to 10 blocks while holding the spear
|
||||
SpearApproach.start missing minor: sets the approach status of the missing spear routine
|
||||
SpearApproach.canStillUse missing minor: part of the missing spear approach
|
||||
SpearApproach.farEnough missing minor: part of the missing spear approach
|
||||
SpearApproach.tick missing minor: part of the missing spear approach
|
||||
SpearAttack.ableToAttack missing minor: part of the missing spear charge of PiglinAi
|
||||
SpearAttack.getKineticWeaponUseDuration missing minor: part of the missing spear charge
|
||||
SpearAttack.checkExtraStartConditions missing minor: part of the missing spear charge
|
||||
SpearAttack.start missing player: a piglin holding a golden spear (about 1 in 20 adult piglins) just walks up and melees; vanilla raises the spear (startUsingItem) and charges at the target
|
||||
SpearAttack.canStillUse missing minor: part of the missing spear charge
|
||||
SpearAttack.tick missing player: a piglin holding a golden spear (about 1 in 20 adult piglins) just walks up and melees; vanilla charges along a line, then repositions 6 to 7 blocks away and charges again; no mob uses a spear's kinetic attack here
|
||||
SpearAttack.stop missing minor: part of the missing spear charge
|
||||
SpearRetreat.ableToAttack missing minor: part of the missing spear retreat
|
||||
SpearRetreat.checkExtraStartConditions missing player: a piglin holding a golden spear (about 1 in 20 adult piglins) just walks up and melees; vanilla backs off 9 to 11 blocks after a charge
|
||||
SpearRetreat.start missing minor: part of the missing spear retreat
|
||||
SpearRetreat.canStillUse missing minor: part of the missing spear retreat
|
||||
SpearRetreat.tick missing minor: part of the missing spear retreat
|
||||
SpearRetreat.stop missing minor: part of the missing spear retreat
|
||||
StartAttacking.create inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start StartAttacking arm (nearest attackable, last attacker, active creaking's player); piglins and hoglins choose targets with NearestTarget goals
|
||||
StartCelebratingIfTargetDead.create port crates/horizon-client/src/mobs/piglin.rs::celebrate gap: minor: the forgive_dead_players game rule is not read (a dead player target is always dropped, which is the default)
|
||||
StayCloseToTarget.create port crates/horizon-client/src/mobs/allay.rs::StayClose::can_use gap: minor: starts when the deposit is more than 4 blocks away instead of 16, so an allay hovers closer to its player than vanilla
|
||||
StopAttackingIfTargetInvalid.create inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start StopAttacking arm (creaking, breeze); the warden has its own arm without the tired check; piglins and hoglins drop targets in their target goals
|
||||
StopAttackingIfTargetInvalid.isTiredOfTryingToReachTarget inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start cant_reach_walk_target_since older than 200 ticks
|
||||
StrollAroundPoi.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start StrollAroundPoi arm: stays within max_dist of the POI, strolls (8, 6) every 180 ticks
|
||||
StrollToPoi.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start StrollToPoi arm: job site within 10 blocks, every 80 ticks
|
||||
StrollToPoiList.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start StrollToPoiList arm: random secondary job site every 100 ticks while near the job site
|
||||
Swim.checkExtraStartConditions port crates/horizon-client/src/mobs/villager_brain.rs::swim_condition water deeper than the jump threshold, or lava; the sniffer, warden, breeze and creaking brains have copies
|
||||
Swim.tick inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop jumps with chance 0.8 each tick
|
||||
TradeWithVillager.start inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start lock_gaze: look at and walk to the other villager
|
||||
TradeWithVillager.figureOutWhatIAmWillingToTrade inline crates/horizon-client/src/mobs/villager.rs::meet wares the neighbour's profession requests and mine does not; worked out on every meeting tick, not once at start
|
||||
TransportItemsBetweenContainers.start inline crates/horizon-client/src/mobs/transport_items.rs::Transport::try_start sets below_surface (setCanPathToTargetsBelowSurface); the not-leashed start test is in the same fn
|
||||
TransportItemsBetweenContainers.canStillUse inline crates/horizon-client/src/mobs/transport_items.rs::Transport::tick_or_stop no cooldown, not panicking, not leashed
|
||||
TransportItemsBetweenContainers.onTravelToTarget inline crates/horizon-client/src/mobs/transport_items.rs::Transport::tick the Travelling branch: queue within 3 blocks when another golem has the chest, interact within range, else walk
|
||||
TransportItemsBetweenContainers.walkTowardsTarget port crates/horizon-client/src/mobs/transport_items.rs::Transport::walk_towards
|
||||
TransportItemsBetweenContainers.startOnReachedTargetInteraction inline crates/horizon-client/src/mobs/transport_items.rs::Transport::tick reached_interaction picks the interaction state, then the state becomes Interacting
|
||||
TransportItemsBetweenContainers.onTargetInteraction inline crates/horizon-client/src/mobs/transport_items.rs::Transport::on_reached look at the chest, stop in place, open the chest on tick 1, sound on tick 9, close on tick 60
|
||||
TransportItemsBetweenContainers.doReachedTargetInteraction port crates/horizon-client/src/mobs/transport_items.rs::reached_interaction the dispatch on empty hand and chest contents; the 60 tick call is in on_reached
|
||||
TransportItemsBetweenContainers.getTransportTarget port crates/horizon-client/src/mobs/transport_items.rs::Transport::find_target
|
||||
TransportItemsBetweenContainers.isTargetValidToPick inline crates/horizon-client/src/mobs/transport_items.rs::Transport::find_target search box, container, wanted block and not visited
|
||||
TransportItemsBetweenContainers.isContainerLocked missing minor: a chest's lock is not stored or checked (only set by commands)
|
||||
TransportItemsBetweenContainers.getPositionToReachTargetFrom inline crates/horizon-client/src/mobs/transport_items.rs::Transport::valid_travelling_path path end or the golem's own position, raised by half its height
|
||||
TransportItemsBetweenContainers.getConnectedTargets port crates/horizon-client/src/mobs/transport_items.rs::connected the other half of a double chest
|
||||
TransportItemsBetweenContainers.getTargetSearchArea inline crates/horizon-client/src/mobs/transport_items.rs::Transport::find_target box of 32 across and 8 up and down (1 and 1 on a mount)
|
||||
TransportItemsBetweenContainers.isPositionAlreadyVisited inline crates/horizon-client/src/mobs/transport_items.rs::Transport::find_target either half in the visited or unreachable memory
|
||||
TransportItemsBetweenContainers.setVisitedBlockPos port crates/horizon-client/src/mobs/transport_items.rs::Transport::set_visited
|
||||
TransportItemsBetweenContainers.markVisitedBlockPosAsUnreachable port crates/horizon-client/src/mobs/transport_items.rs::Transport::mark_unreachable
|
||||
TransportItemsBetweenContainers.isWantedBlock port crates/horizon-client/src/mobs/transport_items.rs::wanted copper chests with an empty hand, chests and trapped chests when carrying
|
||||
TransportItemsBetweenContainers.isWithinTargetDistance port crates/horizon-client/src/mobs/transport_items.rs::within
|
||||
TransportItemsBetweenContainers.targetIsReachableFromPosition inline crates/horizon-client/src/mobs/transport_items.rs::Transport::valid_travelling_path reach and a clear line to a side of the chest
|
||||
TransportItemsBetweenContainers.canSeeAnyTargetSide port crates/horizon-client/src/mobs/transport_items.rs::sees_a_side
|
||||
TransportItemsBetweenContainers.matchesLeavingItemsRequirement port crates/horizon-client/src/mobs/transport_items.rs::leaving_ok
|
||||
TransportItemsBetweenContainers.hasItemMatchingHandItem inline crates/horizon-client/src/mobs/transport_items.rs::leaving_ok same item id in any slot
|
||||
TransportItemsBetweenContainers.pickUpItems port crates/horizon-client/src/mobs/transport_items.rs::Transport::pick_up
|
||||
TransportItemsBetweenContainers.putDownItem port crates/horizon-client/src/mobs/transport_items.rs::Transport::put_down
|
||||
TransportItemsBetweenContainers.pickupItemFromContainer inline crates/horizon-client/src/mobs/transport_items.rs::Transport::pick_up up to 16 of the first non-empty slot
|
||||
TransportItemsBetweenContainers.addItemsToContainer inline crates/horizon-client/src/mobs/transport_items.rs::Transport::put_down fills an empty slot or tops up a matching stack, slot by slot
|
||||
TransportItemsBetweenContainers.stopTargetingCurrentTarget port crates/horizon-client/src/mobs/transport_items.rs::Transport::stop_targeting
|
||||
TransportItemsBetweenContainers.clearMemoriesAfterMatchingTargetFound port crates/horizon-client/src/mobs/transport_items.rs::Transport::clear_memories
|
||||
TransportItemsBetweenContainers.enterCooldownAfterNoMatchingTargetFound port crates/horizon-client/src/mobs/transport_items.rs::Transport::enter_cooldown
|
||||
TransportItemsBetweenContainers.TransportItemTarget.tryCreatePossibleTarget inline crates/horizon-client/src/mobs/transport_items.rs::Transport::find_target the target is built from container() when a chest has one
|
||||
TransportItemsBetweenContainers.TransportItemTarget.getBlockEntityContainer port crates/horizon-client/src/mobs/transport_items.rs::container gap: minor: a cat sitting on the chest does not block it, only a redstone conductor above does
|
||||
TriggerGate.triggerGate inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start TriggerGate arm: shuffle by weight, then each trigger until one fires; the piglin's idle gate is part of its goals
|
||||
TryFindLand.create inline crates/horizon-client/src/mobs/goals.rs::Stroll::can_use gap: minor: a frog in water strolls to a random land spot within 15 blocks (water-avoiding stroll, every tick) instead of the nearest standable block within 6 to 8 with a 60 tick cooldown, at speed 1.0 not 1.5
|
||||
TryFindLand.canStandOn missing minor: no scan for the nearest solid land next to water; see TryFindLand.create
|
||||
TryFindLandNearLiquid.create missing minor: only runs in the frog's lay-spawn activity, which needs a pregnant frog (see TryLaySpawnOnFluidNearLand)
|
||||
TryFindLiquid.create port crates/horizon-client/src/mobs/animal_brain.rs::axolotl_action FindLiquid arm: nearest water within 6, speed 0.15, re-run every 40 ticks
|
||||
TryLaySpawnOnFluidNearLand.create missing player: frogs cannot be bred (no slimeball feeding, no pregnancy), so no frogspawn is ever laid by a frog and no tadpoles follow
|
||||
|
@@ -0,0 +1,125 @@
|
||||
UseBonemeal.checkExtraStartConditions missing minor: the B::UseBonemeal arm only checks for bone meal in the inventory and then always returns false, so a farmer carrying bone meal never grows a crop with it
|
||||
UseBonemeal.canStillUse missing minor: no bone meal session is ever started
|
||||
UseBonemeal.pickNextTarget missing minor: no random pick of a growing crop in the 3x3x3 around the villager
|
||||
UseBonemeal.validPos missing minor: no crop-not-fully-grown test
|
||||
UseBonemeal.start missing minor: villager never holds bone meal or walks to a crop
|
||||
UseBonemeal.setCurrentCropAsTarget missing minor: no look and walk target on a crop
|
||||
UseBonemeal.tick missing minor: never uses a bone meal item on a crop (no growCrop, no bonemeal effect)
|
||||
ValidateNearbyPoi.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start ValidatePoi arm: within 16 blocks the memory is erased when the POI is gone or the bed is occupied by someone else
|
||||
ValidateNearbyPoi.bedIsOccupiedByVillager inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start no ticket to release: POI tickets are counted from the villagers' memories (tickets), so erasing the memory frees the bed
|
||||
VillageBoundRandomStroll.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start VillageBoundStroll arm: land pos inside a village, else a pos towards the section closest to a village
|
||||
VillagerGoalPackages.getCorePackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages gap: minor: GoToWantedItem (priority 5) never starts (arm returns false), so villagers do not walk to dropped items within 4 blocks; they only pick up what lands at their feet
|
||||
VillagerGoalPackages.validateBedPoi inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start AcquirePoi home arm keeps only beds that are not occupied, after the 5-candidate cap like vanilla
|
||||
VillagerGoalPackages.getWorkPackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages gap: minor: the UseBonemeal entry never starts (see UseBonemeal)
|
||||
VillagerGoalPackages.getPlayPackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages baby villagers: look, tag, run-one of interact, stroll, jump on bed, do nothing
|
||||
VillagerGoalPackages.getRestPackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages walk home, validate home, sleep, homeless run-one, minimal look
|
||||
VillagerGoalPackages.getMeetPackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages bell gate, trades, gift, validate meeting point, trade gate, full look
|
||||
VillagerGoalPackages.getIdlePackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages run-one of interactions and strolls, gift, trades, trade gate, make love gate, full look
|
||||
VillagerGoalPackages.getPanicPackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages calm down, walk away from hostile and from the attacker at 0.75, stroll 2x2
|
||||
VillagerGoalPackages.getPreRaidPackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages ring bell, meeting point or stroll at 0.75, reset raid status
|
||||
VillagerGoalPackages.getRaidPackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages sky spot or stroll once the raid is won, celebrate, hide while the raid is active
|
||||
VillagerGoalPackages.getHidePackage inline crates/horizon-client/src/mobs/villager_brain.rs::packages set hidden state, locate hiding place at 0.625, minimal look
|
||||
VillagerGoalPackages.getFullLookBehavior port crates/horizon-client/src/mobs/villager_brain.rs::look_full
|
||||
VillagerGoalPackages.getMinimalLookBehavior port crates/horizon-client/src/mobs/villager_brain.rs::look_minimal
|
||||
VillagerGoalPackages.raidExistsAndActive inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start RaidSequence arm (victory false): the villager's raid status is RAID or PRE_RAID instead of looking up the raid at its position
|
||||
VillagerGoalPackages.raidExistsAndNotVictory inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start RaidSequence arm (victory true): the villager's raid status is victory (the vanilla name is misleading, it tests isVictory)
|
||||
VillagerMakeLove.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop MakeLove arm stops once now passes the birth time or breeding is no longer possible
|
||||
VillagerMakeLove.start inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start MakeLove arm: lock gaze, birth time 275 + random 50 ticks; entity event 18 has no villager effect
|
||||
VillagerMakeLove.canReach inline crates/horizon-client/src/mobs/villager_brain.rs::take_bed_for_child bed counts only if create_path_to gets there
|
||||
VillagerMakeLove.breed port crates/horizon-client/src/game/villagers.rs::Game::villager_birth baby villager at the parent, ages 6000 and -24000, hearts for the child
|
||||
VillagerMakeLove.giveBedToChild inline crates/horizon-client/src/game/villagers.rs::Game::villager_birth child.extra.bed is the taken bed
|
||||
WorkAtPoi.checkExtraStartConditions inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start WorkAtPoi arm: 300 tick gap, 1 in 2 roll, within 1.73 of the job site
|
||||
WorkAtPoi.canStillUse inline crates/horizon-client/src/mobs/villager_brain.rs::B::tick_or_stop WorkAtPoi arm: job site still within 1.73
|
||||
YieldJobSite.create inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start gap: minor: the villager gives up its potential site but the nearby villager is not handed the walk and look target or the potential site; it finds the site through its own job search
|
||||
YieldJobSite.nearbyWantsJobsite inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start tests the nearby villager's profession against the site type and its job site memory
|
||||
YieldJobSite.canReachPos inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start gap: minor: no path test to the site for the nearby villager
|
||||
BehaviorBuilder.create skip:java declarative behaviour builder; Horizon codes each behaviour as an arm of B
|
||||
BehaviorBuilder.sequence inline crates/horizon-client/src/mobs/villager_brain.rs::B::try_start RaidSequence arm is the only sequence the villager packages use
|
||||
BehaviorBuilder.triggerIf skip:java condition combinator; each use is ported in place (raid conditions in RaidSequence)
|
||||
BehaviorBuilder.Instance.point skip:java applicative plumbing of the behaviour DSL
|
||||
BehaviorBuilder.Instance.lift1 skip:java applicative plumbing of the behaviour DSL
|
||||
BehaviorBuilder.Instance.map skip:java applicative plumbing of the behaviour DSL
|
||||
BehaviorBuilder.Instance.ap2 skip:java applicative plumbing of the behaviour DSL
|
||||
BehaviorBuilder.Instance.ap3 skip:java applicative plumbing of the behaviour DSL
|
||||
BehaviorBuilder.Instance.ap4 skip:java applicative plumbing of the behaviour DSL
|
||||
MemoryCondition.Absent.createAccessor skip:java memory accessor of the behaviour DSL; memories are Slot fields
|
||||
MemoryCondition.Present.createAccessor skip:java memory accessor of the behaviour DSL; memories are Slot fields
|
||||
Digging.start inline crates/horizon-client/src/mobs/warden_brain.rs::B::try_start Digging arm: dig pose and sound on ground, else agitated sound and the warden is removed
|
||||
Roar.start inline crates/horizon-client/src/mobs/warden_brain.rs::B::try_start Roar arm: sound delay 25, walk target cleared, look at target, roaring pose, anger +20
|
||||
Roar.stop inline crates/horizon-client/src/mobs/warden_brain.rs::B::do_stop Roar arm: standing pose, roar target becomes the attack target
|
||||
SetRoarTarget.create inline crates/horizon-client/src/mobs/warden_brain.rs::B::try_start SetRoarTarget arm: entity_angry_at and can_target, clears cant-reach memory
|
||||
Sniffing.stop inline crates/horizon-client/src/mobs/warden_brain.rs::B::do_stop Sniffing arm: standing pose, anger +35 for a target within 6x20, disturbance location
|
||||
SonicBoom.checkExtraStartConditions inline crates/horizon-client/src/mobs/warden_brain.rs::B::try_start SonicBoom arm: target within 15 horizontally and 20 vertically
|
||||
BodyRotationControl.rotateBodyIfNecessary inline crates/horizon-client/src/mobs/control.rs::Mob::body_rotation_tick rotate_if_necessary on body_yaw in the standing-still branches
|
||||
BodyRotationControl.rotateHeadIfNecessary inline crates/horizon-client/src/mobs/control.rs::Mob::body_rotation_tick rotate_if_necessary on head_yaw in the moving branch
|
||||
BodyRotationControl.isMoving inline crates/horizon-client/src/mobs/control.rs::Mob::body_rotation_tick moved distance squared against ARRIVED
|
||||
LookControl.clampHeadRotationToBody inline crates/horizon-client/src/mobs/control.rs::Mob::look_control_tick head yaw clamped to the body while the navigation is not done
|
||||
LookControl.getXRotD port crates/horizon-client/src/mobs/control.rs::Mob::look_angles
|
||||
LookControl.getYRotD port crates/horizon-client/src/mobs/control.rs::Mob::look_angles
|
||||
MoveControl.isWalkable port crates/horizon-client/src/mobs/control.rs::Mob::walkable gap: minor: tests the static path type of the cell, not the mob's own node evaluator
|
||||
SmoothSwimmingLookControl.tick port crates/horizon-client/src/mobs/control.rs::Mob::look_control_tick SmoothSwimming arm of the look kinds
|
||||
SmoothSwimmingMoveControl.getTurningSpeedFactor inline crates/horizon-client/src/mobs/control.rs::Mob::move_control_tick SmoothSwimming arm: 1 - clamp((left - 10) / 50)
|
||||
BegGoal.canContinueToUse port crates/horizon-client/src/mobs/tame.rs::Beg::can_continue
|
||||
BegGoal.playerHoldingInteresting port crates/horizon-client/src/mobs/tame.rs::Beg::interesting gap: minor: untamed wolves beg only for bones and tamed wolves only for food; in 26.3 a bone or food interests any wolf
|
||||
BreathAirGoal.givesAir inline crates/horizon-client/src/mobs/goals.rs::BreathAir::find_air no fluid or a bubble column, and land-pathfindable
|
||||
BreedGoal.getFreePartner inline crates/horizon-client/src/mobs/goals.rs::Breed::can_use gap: minor: the partner's isPanicking is not tested (Seen has no panic flag)
|
||||
CatLieOnBlockGoal.isValidTarget port crates/horizon-client/src/mobs/tame.rs::can_lie_on
|
||||
CatSitOnBlockGoal.isValidTarget port crates/horizon-client/src/mobs/tame.rs::can_sit_on
|
||||
ClimbOnTopOfPowderSnowGoal.canUse missing player: rabbits, foxes, silverfish and endermites that end up in powder snow never jump to climb out (goal missing from their registration)
|
||||
DolphinJumpGoal.waterIsClear inline crates/horizon-client/src/mobs/dolphin.rs::Jump::can_use water at each step and not a blocks_dolphin_jump block
|
||||
DolphinJumpGoal.surfaceIsClear inline crates/horizon-client/src/mobs/dolphin.rs::Jump::can_use two air blocks above each step
|
||||
DolphinJumpGoal.canContinueToUse port crates/horizon-client/src/mobs/dolphin.rs::Jump::can_continue
|
||||
DoorInteractGoal.start inline crates/horizon-client/src/mobs/doors.rs::RaiderOpenDoor::start passed and the door direction only feed canContinueToUse, which both subclasses override, so they are not kept
|
||||
DoorInteractGoal.tick inline crates/horizon-client/src/mobs/doors.rs::BreakDoor::tick the passed-the-door dot test is not kept: BreakDoor and RaiderOpenDoor both override can_continue
|
||||
FollowFlockLeaderGoal missing player: cod, salmon and tropical fish spawn in groups but do not follow a leader, so schools do not swim together (leader id is stored, no goal uses it)
|
||||
FollowMobGoal missing player: parrots do not fly after and hover near other mobs (priority 3 goal missing from register_parrot)
|
||||
FollowPlayerRiddenEntityGoal missing player: dolphins do not swim after a boat or nautilus a player is riding
|
||||
GoalSelector.removeAllGoals port crates/horizon-client/src/mobs/goals.rs::GoalSelector::clear gap: minor: clear() takes no predicate and does not stop running goals
|
||||
GoalSelector.removeGoal missing minor: no per-goal removal; callers (cat and ocelot trust, zombie break door, skeleton weapon swap, skeleton horse trap) fold the condition into can_use
|
||||
GoalSelector.goalContainsAnyFlags inline crates/horizon-client/src/mobs/goals.rs::GoalSelector::tick flags & disabled
|
||||
GoalSelector.goalCanBeReplacedForAllFlags inline crates/horizon-client/src/mobs/goals.rs::GoalSelector::tick the replaceable check over the locked slots
|
||||
GoalSelector.tickRunningGoals port crates/horizon-client/src/mobs/goals.rs::GoalSelector::tick_running
|
||||
GolemRandomStrollInVillageGoal missing player: iron golems stroll with a plain water-avoiding stroll, so they do not stay in the village or go towards villagers who want a golem
|
||||
MeleeAttackGoal.checkAndPerformAttack inline crates/horizon-client/src/mobs/goals.rs::MeleeAttack::tick reset cooldown, swing, do_hurt_target
|
||||
MeleeAttackGoal.canPerformAttack inline crates/horizon-client/src/mobs/goals.rs::MeleeAttack::tick cooldown over, within melee range, line of sight
|
||||
MoveBackToVillageGoal missing player: iron golems outside a village never walk back towards it (goal missing from register_iron)
|
||||
MoveThroughVillageGoal missing player: zombies never walk purposefully through a village towards its POIs and doors at night; they only wander (priority 6 goal missing; the raider variant is separate)
|
||||
MoveToBlockGoal.moveMobToBlock inline crates/horizon-client/src/mobs/goals.rs::MoveToBlock::start nav_move_to the block centre one up
|
||||
MoveTowardsTargetGoal.start inline crates/horizon-client/src/mobs/golem.rs::MoveTowardsTarget::can_use gap: minor: paths straight to the target entity in can_use, not to a random position towards it chosen in canUse
|
||||
OpenDoorGoal.canContinueToUse port crates/horizon-client/src/mobs/doors.rs::RaiderOpenDoor::can_continue the raider goal does not close the door after, so it never continues
|
||||
PanicGoal.findRandomPosition inline crates/horizon-client/src/mobs/goals.rs::Panic::can_use default_random_pos(5, 4)
|
||||
PanicGoal.lookForWater inline crates/horizon-client/src/mobs/goals.rs::Panic::can_use burning (or turtle) mob not inside a solid cell looks for water by Manhattan distance
|
||||
PathfindToRaidGoal.canContinueToUse port crates/horizon-client/src/mobs/raider.rs::PathfindToRaid::can_continue
|
||||
RandomStandGoal.playStandSound port crates/horizon-client/src/mobs/equine.rs::RandomStand::start gap: player: plays the angry neigh and only for horses; vanilla plays the ambient sound (baby variants too), so skeleton and zombie horses rear silently, and donkeys and mules never get the goal (can_rear) although only llamas are barred from rearing
|
||||
RangedCrossbowAttackGoal.canContinueToUse port crates/horizon-client/src/mobs/illager.rs::CrossbowAttack::can_continue gap: minor: holding test looks at the main hand only
|
||||
RangedCrossbowAttackGoal.isValidTarget inline crates/horizon-client/src/mobs/illager.rs::CrossbowAttack::can_use alive target; also rejects creative players
|
||||
RemoveBlockGoal.getPosWithBlock inline crates/horizon-client/src/mobs/undead.rs::AttackTurtleEgg::tick own cell, below, west, east, north, south, two below
|
||||
RunAroundLikeCrazyGoal.start inline crates/horizon-client/src/mobs/equine.rs::RunAroundLikeCrazy::can_use navigation to the random spot starts in can_use
|
||||
SpearUseGoal missing player: zombies and zombified piglins holding a spear do not run the charge, jab and retreat routine; they only melee
|
||||
SpearUseGoal.SpearUseState missing player: see SpearUseGoal
|
||||
StrollThroughVillageGoal.tick missing minor: foxes do not wander through villages at night (goal missing; no village-bound step)
|
||||
StrollThroughVillageGoal.moveRandomly missing minor: foxes do not wander through villages at night
|
||||
TemptGoal.shouldFollow inline crates/horizon-client/src/mobs/goals.rs::Tempt::can_use main hand or off hand holds a tempt item
|
||||
TemptGoal.ForNonPathfinders.navigateTowards port crates/horizon-client/src/mobs/happy_ghast.rs::GhastTempt::tick random fraction of the way to the player's eye as the wanted position; the sulfur cube has its own SulfurTempt
|
||||
WaterAvoidingRandomFlyingGoal.getPosition inline crates/horizon-client/src/mobs/goals.rs::Stroll::can_use gap: minor: a flying stroll (the wither) draws a plain default_random_pos(10, 7), not HoverRandomPos along its view direction and AirAndWaterRandomPos
|
||||
WaterAvoidingRandomStrollGoal.getPosition inline crates/horizon-client/src/mobs/goals.rs::Stroll::can_use water_avoiding arm: land pos, or default pos with the probability
|
||||
WrappedGoal.canBeReplacedBy inline crates/horizon-client/src/mobs/goals.rs::GoalSelector::tick interruptable and lower priority number
|
||||
WrappedGoal.start inline crates/horizon-client/src/mobs/goals.rs::GoalSelector::tick running flag then goal.start
|
||||
WrappedGoal.equals skip:java identity of wrapped goals in a set
|
||||
HurtByTargetGoal.alertOthers inline crates/horizon-client/src/mobs/goals.rs::HurtByTarget::start gap: player: the owner and team checks are missing, so when a wolf is hurt every wolf nearby is called, including other owners' and the player's own tamed wolves
|
||||
NonTameRandomTargetGoal.canUse inline crates/horizon-client/src/mobs/tame.rs::register wolf and cat target goals use NearestTarget with when(!tame)
|
||||
NonTameRandomTargetGoal.canContinueToUse inline crates/horizon-client/src/mobs/goals.rs::NearestTarget::can_continue gap: minor: the prey filter is not re-tested while hunting, only the base TargetGoal rules
|
||||
ResetUniversalAngerTargetGoal.wasHurtByPlayer missing minor: the universal_anger rule is never read by mobs (default off)
|
||||
ResetUniversalAngerTargetGoal.getNearbyMobsOfSameType missing minor: the universal_anger rule is never read by mobs (default off)
|
||||
TargetGoal.canAttack inline crates/horizon-client/src/mobs/goals.rs::NearestTarget::can_use gap: minor: no isWithinHome test and no must-reach path test
|
||||
TargetGoal.canReach missing minor: must_reach is stored by reach() but never read, so polar bears, llamas and endermen pick targets they cannot path to
|
||||
GossipContainer.getGossipEntries port crates/horizon-client/src/gossip.rs::Gossips::entries
|
||||
GossipContainer.add port crates/horizon-client/src/gossip.rs::Gossips::add
|
||||
GossipContainer.remove port crates/horizon-client/src/gossip.rs::Gossips::remove gap: minor: only the per-target, per-type removal; the by-amount and all-targets overloads have no caller
|
||||
GossipContainer.putAll skip:java map copy; Gossips is Clone
|
||||
GossipContainer.mergeValuesForAddition inline crates/horizon-client/src/gossip.rs::Gossips::add sum above the max keeps the larger of max and old
|
||||
GossipContainer.EntityGossips.weightedValue port crates/horizon-client/src/gossip.rs::Gossips::reputation all types summed; no type filter, as every caller passes all types
|
||||
GossipContainer.EntityGossips.makeSureValueIsntTooLowOrTooHigh inline crates/horizon-client/src/gossip.rs::Gossips::add clamps to the max and forgets values below 2
|
||||
ExpirableValue.of inline crates/horizon-client/src/mobs/villager_brain.rs::Slot::set_ttl Slot holds the value and its time to live (set or set_ttl)
|
||||
ExpirableValue.toString skip:debug
|
||||
ExpirableValue.codec skip:java memory serialisation; Horizon packs memories in its own save format
|
||||
|
@@ -0,0 +1,131 @@
|
||||
MemoryMap.equals skip:java map equality of a built memory set
|
||||
MemoryMap.iterator skip:java iteration over a built memory set, used for the brain's debug and save output
|
||||
MemoryModuleType.register skip:data registry of memory types; Horizon declares each memory as a field of the brain's Memories struct
|
||||
MemorySlot.set port crates/horizon-client/src/mobs/villager_brain.rs::Slot::set Slot::set and set_ttl store the value with the time to live (NEVER when none)
|
||||
MemorySlot.toString skip:debug text for the brain debug dump
|
||||
MemorySlot.visit skip:debug Brain.Visitor feeds the debug screen only
|
||||
NearestVisibleLivingEntities.findAll inline crates/horizon-client/src/mobs/villager_brain.rs::sense_babies walks the visible list with the cached line-of-sight test; only the villager babies sensor needs the whole list here
|
||||
NearestVisibleLivingEntities.find skip:java Stream view of findAll, no caller in the game code
|
||||
AmphibiousPathNavigation.createPathFinder inline crates/horizon-client/src/mobs/nav.rs::Navigation::evaluator NavKind::Amphibious picks Evaluator::Amphibious (prefers_shallow false)
|
||||
AmphibiousPathNavigation.getTempMobPos port crates/horizon-client/src/mobs/nav.rs::Mob::temp_mob_pos x, half the height up, z
|
||||
AmphibiousPathNavigation.canMoveDirectly port crates/horizon-client/src/mobs/nav.rs::Mob::can_move_directly only while in liquid, clear to the target without fluid blocking
|
||||
AmphibiousPathNavigation.isStableDestination inline crates/horizon-client/src/mobs/nav.rs::Mob::stable_destination Amphibious arm: the block below is not air
|
||||
FlyingPathNavigation.createPathFinder inline crates/horizon-client/src/mobs/nav.rs::Navigation::evaluator NavKind::Flying picks Evaluator::Fly
|
||||
FlyingPathNavigation.canUpdatePath port crates/horizon-client/src/mobs/nav.rs::Mob::can_update_path gap: minor: always true, vanilla is false for a flier that rides something
|
||||
GroundPathNavigation.createPathFinder inline crates/horizon-client/src/mobs/nav.rs::Navigation::evaluator NavKind::Ground picks Evaluator::Walk
|
||||
GroundPathNavigation.canUpdatePath port crates/horizon-client/src/mobs/nav.rs::Mob::can_update_path gap: minor: on ground or in liquid, the isPassenger case is missing
|
||||
GroundPathNavigation.getTempMobPos port crates/horizon-client/src/mobs/nav.rs::Mob::temp_mob_pos x, surface_y, z
|
||||
GroundPathNavigation.createPath port crates/horizon-client/src/mobs/nav.rs::Mob::create_path_to unloaded chunk gives no path, then the surface search (surface_position) unless below_surface
|
||||
GroundPathNavigation.getSurfaceY port crates/horizon-client/src/mobs/nav.rs::Mob::surface_y floats up through water up to 16 blocks when the mob can float, else floor(y + 0.5)
|
||||
GroundPathNavigation.trimPath missing player: avoid_sun is set by the skeleton's RestrictSun goal but nothing truncates the path at the first sunlit node, so skeletons chasing you by day walk out into the sun instead of stopping in the shade
|
||||
PathNavigation.getGroundY inline crates/horizon-client/src/mobs/nav.rs::Mob::nav_tick target y is the floor level under the node unless the block below is air
|
||||
PathNavigation.shouldTargetNextNodeInDirection port crates/horizon-client/src/mobs/nav.rs::Mob::should_target_next_node
|
||||
PathNavigation.trimPath missing minor: path nodes on a cauldron are not raised one block, so a route ending on a cauldron (leatherworker job site) aims into the block
|
||||
PathNavigation.isClearForMovementBetween port crates/horizon-client/src/mobs/world.rs::MobWorld::clear_between collider clip from start to the target raised by half the height, optionally stopped by fluids
|
||||
PathNavigation.shouldRecomputePath missing player: nothing asks a mob to re-path when a block changes near its route (recompute_path is only reached after its own delay flag), so a mob keeps walking an old path into a wall you just placed or past one you removed
|
||||
WallClimberNavigation.createPath port crates/horizon-client/src/mobs/nav.rs::Mob::create_path_to WallClimber kind remembers climb_to before the ground path
|
||||
WallClimberNavigation.tick inline crates/horizon-client/src/mobs/nav.rs::Mob::nav_tick WallClimber branch: with no path it keeps steering at climb_to until within the body width
|
||||
WaterBoundPathNavigation.createPathFinder inline crates/horizon-client/src/mobs/nav.rs::Navigation::evaluator Evaluator::Swim with breach for the dolphin; can_pass_doors stays true (minor)
|
||||
WaterBoundPathNavigation.canUpdatePath port crates/horizon-client/src/mobs/nav.rs::Mob::can_update_path breach (dolphin) or in liquid
|
||||
WaterBoundPathNavigation.getTempMobPos port crates/horizon-client/src/mobs/nav.rs::Mob::temp_mob_pos x, half the height up, z
|
||||
AdultSensor.doTick inline crates/horizon-client/src/mobs/animal_brain.rs::tick_sensors gap: player: Sensor::AdultSameType arm (axolotl only); goats, camels, hoglins and farm animals follow parents through FollowParent goals, but baby armadillos have no follow-the-adult behaviour
|
||||
AdultSensor.setNearestVisibleAdult inline crates/horizon-client/src/mobs/animal_brain.rs::tick_sensors closest visible adult of the same species into nearest_visible_adult
|
||||
AdultSensorAnyType.setNearestVisibleAdult port crates/horizon-client/src/mobs/animal_brain.rs::sense_adult closest visible adult of a #followable_friendly_mobs species (happy ghast)
|
||||
AxolotlAttackablesSensor.isMatchingEntity port crates/horizon-client/src/mobs/animal_brain.rs::sense_axolotl_attackables within 8 blocks, in water, always-hostile or hunt target tag, alive and not playing dead
|
||||
AxolotlAttackablesSensor.isHuntTarget inline crates/horizon-client/src/mobs/animal_brain.rs::sense_axolotl_attackables hunt target tag only while there is no hunting cooldown
|
||||
BreezeAttackEntitySensor.doTick port crates/horizon-client/src/mobs/monster_brain.rs::sense_breeze_attack nearest living entity that is not a creative or spectator player and is attackable
|
||||
FrogAttackablesSensor.isMatchingEntity port crates/horizon-client/src/mobs/frog.rs::server_ai_step every 20 ticks: nearest size-1 slime or magma cube within 10 blocks in line of sight
|
||||
FrogAttackablesSensor.isUnreachableAttackTarget inline crates/horizon-client/src/mobs/frog.rs::server_ai_step skips ids in the unreachable list (up to five, 100 ticks each)
|
||||
GolemSensor.checkForNearbyGolem port crates/horizon-client/src/mobs/villager_brain.rs::sense_golem an iron golem in the nearby list sets golem_detected_recently for 599 ticks
|
||||
HoglinSpecificSensor.doTick inline crates/horizon-client/src/mobs/piglin.rs::hoglin_repellent gap: player: only the repellent scan is kept; adult piglin and adult hoglin counts are not sensed, so adult hoglins do not keep 8 blocks from adult piglins and do not flee them when outnumbered
|
||||
HurtBySensor.doTick port crates/horizon-client/src/mobs/villager_brain.rs::sense_hurt last damage source forgotten after 40 ticks, attacker kept while alive
|
||||
IsInWaterSensor.doTick inline crates/horizon-client/src/mobs/frog.rs::Croak::can_use no IS_IN_WATER memory; frog goals read fluids.in_water directly
|
||||
MobSensor.doTick inline crates/horizon-client/src/mobs/armadillo.rs::server_ai_step armadillo scare sensor every fifth tick: cannot stay rolled up clears the danger, else scan
|
||||
MobSensor.checkForMobsNearby port crates/horizon-client/src/mobs/armadillo.rs::scared_by_someone undead, last attacker or a sprinting or riding player within 7 by 2 blocks
|
||||
MobSensor.mobDetected inline crates/horizon-client/src/mobs/armadillo.rs::server_ai_step danger = 80 ticks
|
||||
NearestBedSensor.doTick port crates/horizon-client/src/mobs/villager_brain.rs::sense_bed babies only, at most four new beds per scan, 40 tick cache, path must reach the bed
|
||||
NearestItemSensor.doTick port crates/horizon-client/src/game/piglins.rs::Game::piglin_pickups gap: player: villagers never walk to dropped food or seeds (only what lands within a block is picked up) and piglins and allays scan their own items without the line-of-sight test
|
||||
NearestLivingEntitySensor.doTick port crates/horizon-client/src/mobs/brain.rs::living_near alive entities within the follow range box, nearest first, stored with a fresh visible list
|
||||
NearestVisibleLivingEntitySensor.getNearestEntity inline crates/horizon-client/src/mobs/animal_brain.rs::sense_axolotl_attackables find_closest over the visible list with the sensor's own test
|
||||
PiglinBruteSpecificSensor.doTick inline crates/horizon-client/src/mobs/piglin.rs::register_brute gap: minor: nemesis is a NearestTarget on wither skeletons only, the wither boss is not one; alerting nearby adult piglins is HurtByTarget alert
|
||||
PiglinSpecificSensor.requires skip:java declares which memories the sensor fills
|
||||
PiglinSpecificSensor.doTick inline crates/horizon-client/src/mobs/piglin.rs::ai_step gap: minor: only the repellent scan (every 20 ticks) is a sensor; nemesis, baby hoglin or piglin, player holding gold and adult counts are not remembered, so piglins do not attack wither skeletons or look at a player holding gold from 14 blocks
|
||||
PiglinSpecificSensor.isValidRepellent port crates/horizon-client/src/mobs/piglin.rs::find_piglin_repellent #piglin_repellents, a soul campfire only while lit
|
||||
PlayerSensor.doTick port crates/horizon-client/src/mobs/villager_brain.rs::sense_players gap: minor: one player only, no other players of a shared level
|
||||
SecondaryPoiSensor.doTick port crates/horizon-client/src/mobs/villager_brain.rs::sense_secondary farmer: farmland within 4 by 2 blocks; no other profession has secondary blocks
|
||||
Sensor.updateTargetingConditionRanges inline crates/horizon-client/src/mobs/monster_brain.rs::targetable each test reads the mob's follow range at call time, so no shared range needs updating
|
||||
Sensor.isEntityAttackableIgnoringLineOfSight inline crates/horizon-client/src/mobs/goals.rs::Mob::can_target_player check_sight false for the player; mob targets are tested per goal
|
||||
Sensor.rememberPositives inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start positives_left counter of the breeze's StopAttackingIfTargetInvalid (100 ticks after the last attackable moment)
|
||||
TemptingSensor.doTick port crates/horizon-client/src/mobs/animal_brain.rs::sense_tempting gap: minor: range test ignores the visibility scaling (sneaking), a rider of any kind blocks the tempt
|
||||
TemptingSensor.playerHoldingTemptation inline crates/horizon-client/src/mobs/animal_brain.rs::sense_tempting main or off hand holds food of the animal
|
||||
VillagerBabiesSensor.isVillagerBaby inline crates/horizon-client/src/mobs/villager_brain.rs::sense_babies visible baby villagers
|
||||
VillagerHostilesSensor.isMatchingEntity port crates/horizon-client/src/mobs/villager_brain.rs::sense_hostiles closest visible hostile within its own acceptable distance
|
||||
VillagerHostilesSensor.isClose port crates/horizon-client/src/mobs/villager_brain.rs::hostile_distance the acceptable distance table (8, 10, 12, 15 blocks)
|
||||
WardenEntitySensor.doTick port crates/horizon-client/src/mobs/warden_brain.rs::sense_entities living list then nearest attackable: a player first, else another entity
|
||||
WardenEntitySensor.getClosest inline crates/horizon-client/src/mobs/warden_brain.rs::sense_entities two passes over the sorted list with warden::can_target
|
||||
TargetingConditions.copy skip:java clone of a builder object
|
||||
TargetingConditions.test port crates/horizon-client/src/mobs/goals.rs::Mob::player_in_range gap: minor: the player case (range scaled by visibility, line of sight, ally and creative checks); mob targets are tested in NearestTarget and each brain's targetable and attackable
|
||||
DefaultRandomPos.generateRandomPosTowardDirection port crates/horizon-client/src/mobs/goals.rs::Mob::default_check Mob::toward builds the position, default_check does limits, home, stable and malus
|
||||
GoalUtils.mobRestricted port crates/horizon-client/src/mobs/goals.rs::Mob::restricted home within radius + distance + 1, then isRestricted
|
||||
GoalUtils.hasMalus inline crates/horizon-client/src/mobs/goals.rs::Mob::default_check path type malus must be 0, also in land_up_out_of_solid
|
||||
LandRandomPos.getPosTowards missing player: iron golems wander anywhere; GolemRandomStrollInVillageGoal and MoveBackToVillageGoal are not registered, so a golem does not drift toward villagers who want it or back to the village
|
||||
LandRandomPos.getPosInDirection inline crates/horizon-client/src/mobs/goals.rs::Mob::land_random_pos_away only the away direction is wired; the toward call has no user
|
||||
LandRandomPos.movePosUpOutOfSolid port crates/horizon-client/src/mobs/goals.rs::Mob::land_up_out_of_solid up out of solid, then no water and no malus
|
||||
RandomPos.generateRandomDirection port crates/horizon-client/src/mobs/goals.rs::Mob::random_direction
|
||||
RandomPos.generateRandomDirectionWithinRadians port crates/horizon-client/src/mobs/goals.rs::Mob::random_direction_within
|
||||
RandomPos.generateRandomPos port crates/horizon-client/src/mobs/goals.rs::Mob::pick_best best of ten by walk target value
|
||||
PoiManager.remove inline crates/horizon-client/src/poi_sections.rs::PoiSections::get no stored records: a section's POI list is rebuilt from its blocks after an edit
|
||||
PoiManager.findAll port crates/horizon-client/src/mobs/villager_brain.rs::pois_in_range square then sphere filter over the sections' POI blocks, nearest first, with a caller filter
|
||||
PoiManager.findAllWithType port crates/horizon-client/src/mobs/villager_brain.rs::pois_in_range returns (type, pos) pairs; only HAS_SPACE occupancy (any-occupancy searches use homes_in_range)
|
||||
PoiManager.findAllClosestFirstWithType port crates/horizon-client/src/mobs/villager_brain.rs::pois_in_range sorted by squared distance
|
||||
PoiManager.getRandom inline crates/horizon-client/src/mobs/raider.rs::MoveThroughVillage::can_use random home within 48 blocks not visited lately (the raider's village walk); the villager's hiding place picks its own home
|
||||
PoiManager.release inline crates/horizon-client/src/mobs/villager_brain.rs::PoiMem::clear tickets are derived from the villagers' job, potential job, home and meeting memories, so clearing the memory frees the ticket
|
||||
PoiManager.getType port crates/horizon-client/src/mobs/villager_brain.rs::poi_at POI kind of the block at a position, from the per-state table
|
||||
PoiManager.getDebugPoiInfo skip:debug debug screen data
|
||||
PoiManager.setDirty inline crates/horizon-client/src/mobs/villager_brain.rs::village_sections village distances are recomputed per query from the taken village POIs, no dirty tracking
|
||||
PoiManager.checkConsistencyWithBlocks inline crates/horizon-client/src/poi_sections.rs::PoiSections::get the list is always built from the blocks, so it cannot drift
|
||||
PoiManager.updateFromSection inline crates/horizon-client/src/poi_sections.rs::PoiSections::get scans the section's blocks for POI states
|
||||
PoiManager.ensureLoadedAndValid skip:other no separate POI storage: POIs come from the loaded chunks' blocks
|
||||
PoiManager.DistanceTracker.setLevel inline crates/horizon-client/src/mobs/villager_brain.rs::sections_to_village Chebyshev distance in sections to a village section (max 7), computed when asked
|
||||
PoiRecord.acquireTicket inline crates/horizon-client/src/mobs/villager_brain.rs::tickets a taken ticket is a villager memory pointing at the POI, counted per search
|
||||
PoiRecord.releaseTicket inline crates/horizon-client/src/mobs/villager_brain.rs::tickets see PoiManager.release
|
||||
PoiRecord.isOccupied inline crates/horizon-client/src/mobs/villager_brain.rs::village_sections a POI counts as occupied (village centre) when a villager memory holds it
|
||||
PoiRecord.equals skip:java position equality
|
||||
PoiRecord.Packed.unpack skip:other POI files are not loaded into records; keep_claims reads free_tickets only to carry claims across a save
|
||||
PoiSection.pack port crates/horizon-client/src/save.rs::encode_poi Valid and Records with free_tickets at the max (claims kept by keep_claims)
|
||||
PoiSection.getRecords inline crates/horizon-client/src/poi_sections.rs::PoiSections::get per-section POI list, type filter done by poi_matches
|
||||
PoiSection.add inline crates/horizon-client/src/poi_sections.rs::PoiSections::get list rebuilt from the blocks
|
||||
PoiSection.remove inline crates/horizon-client/src/poi_sections.rs::PoiSections::get list rebuilt from the blocks
|
||||
PoiSection.getFreeTickets skip:debug deprecated, debug only
|
||||
PoiSection.release inline crates/horizon-client/src/mobs/villager_brain.rs::tickets see PoiManager.release
|
||||
PoiSection.refresh inline crates/horizon-client/src/poi_sections.rs::PoiSections::get invalid sections need no refresh, the list is rebuilt from blocks
|
||||
PoiSection.Packed.unpack skip:other POI files are not loaded into sections
|
||||
PoiTypes.registerBlockStates inline crates/horizon-client/src/save.rs::poi_type state to POI type and max tickets in one match
|
||||
PoiTypes.bootstrap port crates/horizon-client/src/save.rs::poi_type every POI type with its tickets (bed heads of the sixteen colours only, cauldrons, bell 32); villagers use villager_brain::state_poi for jobs, beds and bell
|
||||
Bat.isFlapping missing minor: a flying bat's wing beat (every 10 ticks) sends no FLAP vibration, so sculk sensors do not hear it
|
||||
Bat.getAmbientSound inline crates/horizon-client/src/mobs/ai.rs::play_ambient Species::Bat arm: a resting bat is silent three times in four
|
||||
Bat.isResting port crates/horizon-client/src/mobs/bat.rs::resting
|
||||
Bat.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt BatFlags byte, bit 0 resting
|
||||
Bat.checkBatSpawnRules inline crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::Bat arm: below the surface, coin flip, light against nextInt(4), bats_spawnable_on, mob rules
|
||||
Dolphin.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize S::Dolphin arm: full air, pitch 0, baby chance 0.1
|
||||
Dolphin.defineSynchedData skip:java synched fields: got_fish is extra.flag and moistness extra.counter
|
||||
Dolphin.addAdditionalSaveData missing minor: GotFish and Moistness are not written, a saved dolphin forgets the fish it was fed
|
||||
Dolphin.readAdditionalSaveData missing minor: GotFish and Moistness are not read, a loaded dolphin starts with no fish and full moistness
|
||||
Dolphin.registerGoals port crates/horizon-client/src/mobs/aquatic.rs::register gap: player: no MoveToItemGoal and PlayWithItemsGoal (dolphins ignore items thrown in the water), no FollowPlayerRiddenEntityGoal for boats or nautiluses, no AvoidEntity of guardians, and HurtByTarget does not skip guardians
|
||||
Dolphin.createAttributes skip:data attributes come from the entity tables
|
||||
Dolphin.canAttack missing minor: a baby dolphin that is hurt can still pick the attacker as target
|
||||
Dolphin.pickUpItem missing player: a dolphin never picks up an item dropped in the water (pick_up_loot is set but nothing takes the item)
|
||||
Dolphin.handleEntityEvent port crates/horizon-client/src/particles.rs::entity_event_burst event 38: seven happy villager particles about the dolphin
|
||||
Dolphin.closeToNextPos inline crates/horizon-client/src/mobs/dolphin.rs::SwimToTreasure::tick nav target within 12 blocks (144 squared) of the dolphin
|
||||
Dolphin.DolphinSwimWithPlayerGoal.canContinueToUse port crates/horizon-client/src/mobs/dolphin.rs::SwimWithPlayer::can_continue player still swimming and within 16 blocks
|
||||
Dolphin.ItemGoal.drop missing player: a dolphin holding an item (from a dispenser) never throws it back with the 40 tick pickup delay
|
||||
Dolphin.ItemGoal.dropItem missing player: the held item is never dropped by the dolphin
|
||||
Dolphin.MoveToItemGoal.canUse missing player: dolphins do not notice items floating within 8 blocks
|
||||
Dolphin.MoveToItemGoal.stop missing player: no item to drop after playing, no cooldown
|
||||
Dolphin.MoveToItemGoal.start missing player: dolphins do not swim to floating items or play the play sound
|
||||
AbstractChestedHorse.dropEquipment port crates/horizon-client/src/mobs/drops.rs::die the stored items and then a chest drop, chested cleared
|
||||
AbstractChestedHorse.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt ChestedHorse and Items for llamas, donkeys and mules
|
||||
AbstractChestedHorse.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt ChestedHorse and Items, 15 slots
|
||||
AbstractChestedHorse.getSlot missing minor: slot 499 (horse.chest) is not mapped for mobs, so /item replace entity ... horse.chest does nothing
|
||||
AbstractChestedHorse.equipChest port crates/horizon-client/src/game/mounts.rs::Game::interact_mount tamed donkey or mule takes a held chest with the sound; llamas do it in game/llamas.rs interact_llama
|
||||
AbstractChestedHorse.playChestEquipsSound inline crates/horizon-client/src/game/mounts.rs::Game::interact_mount entity.donkey.chest with the random pitch; llamas play entity.llama.chest in llama_sound
|
||||
|
@@ -0,0 +1,148 @@
|
||||
AbstractHorse.registerGoals port crates/horizon-client/src/mobs/equine.rs::register same goals and priorities; llamas and camels have their own register
|
||||
AbstractHorse.addBehaviourGoals inline crates/horizon-client/src/mobs/equine.rs::register float, mount panic and tempt come after the rest; none for a skeleton horse, no panic for a zombie horse
|
||||
AbstractHorse.getFlag skip:other bit accessor of the synched flags; Horizon keeps tame, eating (flag) and standing (counter) as separate fields
|
||||
AbstractHorse.setFlag skip:other bit accessor of the synched flags; the bits are packed for sync in lan.rs::mob_meta and read back in equine::set_flags
|
||||
AbstractHorse.canUseSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_use_slot saddle needs an alive tamed adult; horses, zombie horses, skeleton horses and llamas allow every slot
|
||||
AbstractHorse.equipBodyArmor inline crates/horizon-client/src/game/mounts.rs::Game::interact_mount gap: minor: right click armours only a tamed Horse, a tamed zombie horse needs the inventory screen
|
||||
AbstractHorse.canDispenserEquipIntoSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_dispenser_equip body and saddle of a tamed mount
|
||||
AbstractHorse.modifyTemper inline crates/horizon-client/src/game/mounts.rs::Game::feed_mount temper raised by the food, clamped to the maximum; a buck adds 5 in equine.rs RunAroundLikeCrazy::tick
|
||||
AbstractHorse.eating inline crates/horizon-client/src/game/mounts.rs::Game::feed_mount gap: minor: the mouth stays open 3 ticks instead of 30; a foal uses the adult eat sound
|
||||
AbstractHorse.causeFallDamage inline crates/horizon-client/src/mobs/living.rs::Mob::cause_fall_damage gap: player: a landing horse makes no thud (entity.horse.land) and its rider takes no fall damage (position_rider zeroes the rider's fall distance); the mount's own damage uses its safe distance of 6
|
||||
AbstractHorse.createInventory skip:java resizes a SimpleContainer; Horizon sizes the chest items when the menu opens
|
||||
AbstractHorse.getEquipSound port crates/horizon-client/src/game/dispenser.rs::equip_sound saddle slot plays entity.horse.saddle
|
||||
AbstractHorse.hurtServer missing player: a hurt horse never rears up (vanilla: one hit in three makes it stand for a second)
|
||||
AbstractHorse.playStepSound inline crates/horizon-client/src/mobs/ai.rs::step_sound gap: player: horses play the block's own step sound at 15%, never entity.horse.step, step_wood, step_baby or the gallop of a ridden horse; snow above the block is not used either
|
||||
AbstractHorse.isWoodSoundType missing minor: part of playStepSound, horses on wood use the block's wood step instead of horse.step_wood
|
||||
AbstractHorse.fedFood port crates/horizon-client/src/game/mounts.rs::Game::feed_mount handleEating and consuming one item; llamas use llamas.rs feed_llama
|
||||
AbstractHorse.doPlayerRide inline crates/horizon-client/src/game/mounts.rs::Game::interact_mount clears eating and standing, turns the player to the mount and mounts; the block at the end of interact_mount
|
||||
AbstractHorse.isImmobile missing player: a grazing or rearing horse is not held still, goals and strolling keep running while its head is down or it is up on its hind legs
|
||||
AbstractHorse.dropEquipment inline crates/horizon-client/src/mobs/drops.rs::die the equine branch drops the inventory items and a donkey's or mule's chest
|
||||
AbstractHorse.followMommy missing minor: no Bred flag, so a bred foal is not pulled to its mother from 16 blocks; the FollowParent goal covers 8
|
||||
AbstractHorse.openMouth inline crates/horizon-client/src/game/mounts.rs::Game::feed_mount gap: minor: sets the mouth animation to 1 once, it closes after 3 ticks; the mouth flag is not synced to a remote client
|
||||
AbstractHorse.setStanding inline crates/horizon-client/src/mobs/equine.rs::make_mad the 20 tick rear; RandomStand::start and the jump in tick_mount_riding set the same counter
|
||||
AbstractHorse.standIfPossible inline crates/horizon-client/src/mobs/equine.rs::make_mad rears only species that can; the hurt caller is missing (see hurtServer)
|
||||
AbstractHorse.tickRidden port crates/horizon-client/src/mobs/equine.rs::ridden_step yaw and half the pitch follow the rider; no gallop counter (see playStepSound)
|
||||
AbstractHorse.addPassenger inline crates/horizon-client/src/game/mounts.rs::Game::interact_mount gap: minor: the rider's yaw is snapped to the mount's on mounting, the pitch is not
|
||||
AbstractHorse.getRiddenInput port crates/horizon-client/src/mobs/equine.rs::ridden_step gap: player: no allowStandSliding, so a horse that lands from a small hop while still rearing ignores the keys until the rear ends
|
||||
AbstractHorse.executeRidersJump port crates/horizon-client/src/mobs/equine.rs::ridden_step gap: minor: the impulse is jump strength times the bar only, no honey block factor and no Jump Boost
|
||||
AbstractHorse.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt gap: minor: Tame, Temper and Owner are read; EatingHaystack and Bred are not
|
||||
AbstractHorse.setOffspringAttribute port crates/horizon-client/src/mobs/equine.rs::inherit max health, jump strength and speed from both parents
|
||||
AbstractHorse.onPlayerJump inline crates/horizon-client/src/game/mounts.rs::Game::tick_mount_riding gap: minor: the rear and the jump sound; donkeys and mules play the horse jump sound
|
||||
AbstractHorse.handleEntityEvent port crates/horizon-client/src/particles.rs::entity_event_burst events 7 and 6: hearts and smoke around the mount
|
||||
AbstractHorse.positionRider port crates/horizon-client/src/game/mounts.rs::Game::position_rider gap: minor: the rider's body yaw is not copied from the mount
|
||||
AbstractHorse.generateMaxHealth port crates/horizon-client/src/mobs/finalize.rs::Ctx::horse_health
|
||||
AbstractHorse.generateJumpStrength port crates/horizon-client/src/mobs/finalize.rs::Ctx::horse_jump
|
||||
AbstractHorse.generateSpeed port crates/horizon-client/src/mobs/finalize.rs::Ctx::horse_speed
|
||||
AbstractHorse.getSlot missing minor: /item cannot reach the mount slots horse.0 to horse.14
|
||||
AbstractHorse.getControllingPassenger port crates/horizon-client/src/mobs/equine.rs::controlled gap: player: a tamed skeleton horse obeys its rider without a saddle
|
||||
AbstractHorse.getDismountLocationInDirection inline crates/horizon-client/src/game/mounts.rs::Game::dismount_mount gap: minor: no climb up to 0.75 above the mount and no pose boxes, only block checks beside the mount
|
||||
AbstractHorse.getDismountLocationForPassenger port crates/horizon-client/src/game/mounts.rs::Game::dismount_mount gap: minor: tries both sides by the mount's yaw then on top, not by the rider's main arm
|
||||
AbstractHorse.getPassengerAttachmentPoint inline crates/horizon-client/src/game/mounts.rs::Game::position_rider gap: player: the rider does not slide back and up when the horse rears; the seat is a fixed point per species
|
||||
Donkey.canMate inline crates/horizon-client/src/mobs/goals.rs::Breed::can_use gap: player: only Horse, Donkey and llamas get the tame, full health, not ridden rules, so two tame mules in love also breed (a mule never mates in vanilla)
|
||||
Donkey.getBreedOffspring inline crates/horizon-client/src/game/creatures.rs::Game::breed donkey with horse gives a mule, donkey with donkey a donkey; attributes from both parents
|
||||
Horse.randomizeAttributes port crates/horizon-client/src/mobs/finalize.rs::Ctx::horse health, speed and jump strength
|
||||
Horse.setVariantAndMarkings inline crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize coat and markings drawn at spawn; breeding mixes them in creatures.rs Game::breed
|
||||
Horse.setVariant missing minor: only reached by the horse/variant item component, which Horizon does not read
|
||||
Horse.get missing minor: the horse/variant component is never reported
|
||||
Horse.applyImplicitComponent missing minor: a horse/variant component on a spawn egg or item is ignored
|
||||
Horse.playGallopSound missing player: a ridden horse never plays the gallop and the now and then breathing sound
|
||||
Horse.mobInteract inline crates/horizon-client/src/game/mounts.rs::Game::interact_mount gap: player: an untamed horse with a non-food item in hand is mounted instead of rearing angrily, a full health tame horse with food in hand is mounted instead of ignoring the click, and a golden dandelion on a foal does nothing
|
||||
Horse.canMate inline crates/horizon-client/src/mobs/goals.rs::Breed::can_use horse or donkey partner, both tame, adult, not ridden and at full health
|
||||
Horse.hurtArmor missing player: horse armour never loses durability when the horse is hurt (the body item is only an id)
|
||||
Horse.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize random coat and markings, the herd shares the coat
|
||||
Llama.setStrength inline crates/horizon-client/src/mobs/llama.rs::from_nbt strength kept in variant2 and clamped to 1 to 5 where it is set (from_nbt, offspring, apply_offspring)
|
||||
Llama.setRandomStrength inline crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize one in 25 llamas rolls up to 5, else up to 3
|
||||
Llama.addAdditionalSaveData port crates/horizon-client/src/mobs/llama.rs::to_nbt Variant and Strength
|
||||
Llama.readAdditionalSaveData port crates/horizon-client/src/mobs/llama.rs::from_nbt
|
||||
Llama.registerGoals port crates/horizon-client/src/mobs/llama.rs::register goals and targets as vanilla, path length 40
|
||||
Llama.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta strength and variant entries
|
||||
Llama.get missing minor: the llama/variant component is never reported
|
||||
Llama.applyImplicitComponent missing minor: a llama/variant component on an item is ignored
|
||||
Llama.playChestEquipsSound inline crates/horizon-client/src/game/llamas.rs::Game::interact_llama entity.llama.chest when a chest is added
|
||||
Llama.canMate inline crates/horizon-client/src/mobs/goals.rs::Breed::can_use any llama or trader llama, both tame, adult, not ridden and at full health
|
||||
Llama.causeFallDamage inline crates/horizon-client/src/mobs/living.rs::Mob::cause_fall_damage gap: player: the rider of a llama takes no fall damage; the llama's own damage uses its safe distance of 6
|
||||
Llama.leaveCaravan inline crates/horizon-client/src/mobs/caravan.rs::FollowCaravan::stop clears the caravan head
|
||||
Llama.LlamaHurtByTargetGoal.canContinueToUse port crates/horizon-client/src/mobs/llama.rs::LlamaHurtBy::can_continue stops after a spit
|
||||
Mule.playChestEquipsSound inline crates/horizon-client/src/game/mounts.rs::Game::interact_mount gap: minor: a mule uses the donkey's chest sound (entity.donkey.chest) instead of entity.mule.chest
|
||||
SkeletonHorse.checkSkeletonHorseSpawnRules inline crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules spawner reasons need light or a light ignoring reason, otherwise the animal rules
|
||||
SkeletonHorse.randomizeAttributes port crates/horizon-client/src/mobs/finalize.rs::Ctx::horse jump strength only
|
||||
SkeletonHorse.getSwimSound missing minor: a skeleton horse in water uses the generic swim sound, no skeleton_horse.swim, step_water or gallop_water
|
||||
SkeletonHorse.playSwimSound missing minor: the swim volume rules for a skeleton horse are not applied
|
||||
SkeletonHorse.playJumpSound missing minor: no skeleton_horse.jump_water in water; the horse jump sound plays on land
|
||||
SkeletonHorse.aiStep inline crates/horizon-client/src/game/passengers.rs::Game::tick_skeleton_traps a trap horse that is not persistent is removed after 18000 ticks
|
||||
SkeletonHorse.addAdditionalSaveData port crates/horizon-client/src/mobs/riders.rs::write_nbt SkeletonTrap and SkeletonTrapTime
|
||||
SkeletonHorse.readAdditionalSaveData port crates/horizon-client/src/mobs/riders.rs::read_nbt
|
||||
SkeletonHorse.setTrap inline crates/horizon-client/src/game/passengers.rs::Game::spring_skeleton_trap the trap flag is a plain bool polled every tick instead of adding and removing a goal; lightning.rs sets it
|
||||
SkeletonTrapGoal.canUse inline crates/horizon-client/src/game/passengers.rs::Game::tick_skeleton_traps a living player within 10 blocks
|
||||
SkeletonTrapGoal.tick port crates/horizon-client/src/game/passengers.rs::Game::spring_skeleton_trap lightning, a skeleton on the horse and three more horse and skeleton pairs
|
||||
SkeletonTrapGoal.createHorse inline crates/horizon-client/src/game/passengers.rs::Game::spring_skeleton_trap tame, adult, invulnerable for 60 ticks, persistent
|
||||
TraderLlama.makeNewLlama inline crates/horizon-client/src/mobs/llama.rs::apply_offspring the baby trader llama is persistent
|
||||
TraderLlama.registerGoals port crates/horizon-client/src/mobs/llama.rs::register adds panic 2.0, the defend trader target and the zombie and illager targets
|
||||
TraderLlama.canDespawn port crates/horizon-client/src/mobs/caravan.rs::trader_llama_tick despawn delay counts down unless tamed, led by something else, ridden, age locked or persistent
|
||||
TraderLlama.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize an event spawn is an adult; a lone one gets no baby chance
|
||||
ZombieHorse.randomizeAttributes port crates/horizon-client/src/mobs/finalize.rs::Ctx::horse jump strength and speed
|
||||
ZombieHorse.generateZombieHorseJumpStrength inline crates/horizon-client/src/mobs/finalize.rs::Ctx::horse 0.5 plus three draws of 0.0667
|
||||
ZombieHorse.generateZombieHorseSpeed inline crates/horizon-client/src/mobs/finalize.rs::Ctx::horse (9 plus three draws) over 42.16
|
||||
ZombieHorse.addBehaviourGoals inline crates/horizon-client/src/mobs/equine.rs::register float and tempt with the zombie horse food, no mount panic
|
||||
ZombieHorse.mobInteract inline crates/horizon-client/src/game/mounts.rs::Game::interact_mount gap: player: an untamed zombie horse with a non-food item in hand is mounted instead of rearing angrily, and food that is not eaten still mounts it
|
||||
Cat.getSoundSet missing player: cats always use the classic adult sounds, so royal cats and kittens never get their own voices
|
||||
Cat.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: variant, lying, relax and collar are sent, the sound variant entry is not
|
||||
Cat.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt variant, sound_variant and CollarColor
|
||||
Cat.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt
|
||||
Cat.getAmbientSound inline crates/horizon-client/src/mobs/ai.rs::play_ambient gap: minor: purr when in love and the stray sound are used; a tame cat never plays the purreow variant
|
||||
Cat.createAttributes skip:data attributes come from entity-types.json
|
||||
Cat.handleLieDown inline crates/horizon-client/src/mobs/tame.rs::cat_ai_step gap: minor: purring and the amounts are ported; lying on top of a sleeping player (a 0.15 shift of the pose) is not tracked
|
||||
Cat.updateLieDownAmount port crates/horizon-client/src/mobs/tame.rs::cat_amounts
|
||||
Cat.updateRelaxStateOneAmount port crates/horizon-client/src/mobs/tame.rs::cat_amounts
|
||||
Cat.canMate inline crates/horizon-client/src/mobs/goals.rs::Breed::can_use gap: minor: a sitting cat is refused as a mate, vanilla only needs both tame and in love
|
||||
Cat.removeWhenFarAway missing minor: wild cats never despawn for distance (vanilla: untamed and older than 2400 ticks)
|
||||
Cat.reassessTameGoals inline crates/horizon-client/src/mobs/tame.rs::register_cat the player avoidance goal is conditioned on being untamed instead of added and removed
|
||||
Cat.tryToTame inline crates/horizon-client/src/game/creatures.rs::Game::interact_mob one chance in three, then tame, sitting, event 7 or 6 and the advancement trigger
|
||||
Cat.CatAvoidEntityGoal.canContinueToUse inline crates/horizon-client/src/mobs/goals.rs::AvoidEntity::can_continue gap: minor: a cat tamed mid flight finishes its escape path, the untamed check is only in can_use
|
||||
Cat.CatRelaxOnOwnerGoal.spaceIsOccupied port crates/horizon-client/src/mobs/tame.rs::CatRelaxOnOwner::occupied another lying or relaxing cat within 2 blocks of the spot
|
||||
Cat.CatRelaxOnOwnerGoal.canContinueToUse port crates/horizon-client/src/mobs/tame.rs::CatRelaxOnOwner::can_continue tame, not sitting, owner still asleep and the spot free
|
||||
Cat.CatTemptGoal.canScare missing player: a cat lured with fish is scared by every move or look of the player; vanilla lets a randomly picked player (re-rolled every 500 to 600 ticks) approach without scaring it
|
||||
CatVariants.bootstrap skip:data variant registry bootstrap; Horizon reads cat variants from data
|
||||
Ocelot.registerGoals missing player: an ocelot only panics, wanders and looks at players (the generic animal goals): it is not lured by fish, does not run from players, never stalks chickens or baby turtles and has no breed goal
|
||||
Ocelot.customServerAiStep port crates/horizon-client/src/mobs/tame.rs::cat_anim crouch and sprint pose from the move speed, shared with cats; nothing sets those speeds for an ocelot yet
|
||||
Ocelot.removeWhenFarAway missing minor: ocelots never despawn for distance (vanilla: not trusting and older than 2400 ticks)
|
||||
Ocelot.createAttributes skip:data attributes come from entity-types.json
|
||||
Ocelot.mobInteract missing player: raw fish never makes a wild ocelot trust the player (no one in three roll, no hearts or smoke); it only puts the ocelot in love mode
|
||||
Ocelot.handleEntityEvent port crates/horizon-client/src/particles.rs::entity_event_burst events 41 and 40: hearts and smoke; nothing sends them without the trust roll
|
||||
Ocelot.reassessTrustingGoals missing player: no player avoidance goal, so wild ocelots never run from the player
|
||||
Ocelot.checkSpawnObstruction port crates/horizon-client/src/mobs/spawn_selection.rs::spawn_obstruction unobstructed, no liquid, at or above sea level on grass or leaves
|
||||
Ocelot.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize baby chance 1.0 for a group
|
||||
Ocelot.getLeashOffset missing minor: the lead ties at full eye height instead of half of it (leash::leash_offset only special-cases llamas)
|
||||
Ocelot.OcelotAvoidEntityGoal.canUse missing player: see reassessTrustingGoals, no avoidance goal exists
|
||||
Ocelot.OcelotAvoidEntityGoal.canContinueToUse missing minor: see reassessTrustingGoals, no avoidance goal exists
|
||||
Ocelot.OcelotTemptGoal.canScare missing minor: see registerGoals, an ocelot has no tempt goal
|
||||
AbstractFish.registerGoals port crates/horizon-client/src/mobs/aquatic.rs::register panic, player avoidance and random swimming; gap: player: creative players do not scare fish (the avoid goal skips them, vanilla only skips spectators)
|
||||
AbstractFish.mobInteract port crates/horizon-client/src/game/creatures.rs::Game::interact_mob a water bucket scoops the fish with its bucket data
|
||||
AbstractFish.FishSwimGoal.canUse inline crates/horizon-client/src/mobs/aquatic.rs::register Stroll::swimming(1.0, 40) is the random swim goal; fish never follow a leader so it always applies
|
||||
AbstractSchoolingFish.registerGoals missing player: no follow the flock leader goal, so cod, salmon and tropical fish spawn in groups but swim about alone instead of schooling
|
||||
AbstractSchoolingFish.isFollower missing minor: part of the missing schooling; the leader id is kept at spawn but never read
|
||||
AbstractSchoolingFish.canBeFollowed missing minor: part of the missing schooling
|
||||
AbstractSchoolingFish.tick missing minor: part of the missing schooling (school size reset when alone)
|
||||
AbstractSchoolingFish.inRangeOfLeader missing minor: part of the missing schooling
|
||||
AbstractSchoolingFish.pathToLeader missing minor: part of the missing schooling
|
||||
AbstractSchoolingFish.addFollowers missing minor: part of the missing schooling
|
||||
AbstractSchoolingFish.finalizeSpawn inline crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize gap: player: the group shares a leader id and variant, but followers never use it to follow the leader
|
||||
Pufferfish.readAdditionalSaveData missing minor: PuffState is not read or written, a reloaded pufferfish starts deflated
|
||||
Pufferfish.registerGoals port crates/horizon-client/src/mobs/aquatic.rs::register the puff goal at priority 1
|
||||
Pufferfish.touch missing minor: only the player is stung (inside ai_step); other mobs touching a puffed fish are not hurt or poisoned
|
||||
Salmon.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta size entry, small 0 to large 2
|
||||
Salmon.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::read_variant the type tag, medium by default
|
||||
Salmon.get inline crates/horizon-client/src/entity_nbt.rs::bucket_components the size component goes onto the bucket
|
||||
Salmon.applyImplicitComponent port crates/horizon-client/src/entity_nbt.rs::load_bucket_data size from the bucket
|
||||
Salmon.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize weighted size: small 30, medium 50, large 15
|
||||
TropicalFish.packVariant inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt packed pattern, base colour and pattern colour; lan.rs::mob_meta packs it for sync
|
||||
TropicalFish.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta packed variant entry
|
||||
TropicalFish.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::read_variant an unknown pattern is a kob
|
||||
TropicalFish.setPattern inline crates/horizon-client/src/entity_nbt.rs::load_bucket_data only reached from the bucket's pattern component
|
||||
TropicalFish.setBaseColor inline crates/horizon-client/src/entity_nbt.rs::load_bucket_data only reached from the bucket's base colour component
|
||||
TropicalFish.setPatternColor inline crates/horizon-client/src/entity_nbt.rs::load_bucket_data only reached from the bucket's pattern colour component
|
||||
TropicalFish.get inline crates/horizon-client/src/entity_nbt.rs::bucket_components pattern and both colours go onto the bucket
|
||||
TropicalFish.applyImplicitComponents port crates/horizon-client/src/entity_nbt.rs::load_bucket_data pattern and colours from the bucket
|
||||
TropicalFish.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize one in ten is a lone random fish, else a shared common variant
|
||||
TropicalFish.checkTropicalFishSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules water below and above, and any height biomes or the surface rule
|
||||
TropicalFish.Pattern.addToTooltip missing player: a tropical fish bucket shows no pattern and colour lines in its tooltip
|
||||
|
@@ -0,0 +1,132 @@
|
||||
Fox.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: the type and the flags byte are synced; the two trusted-entity slots are not
|
||||
Fox.canEat inline crates/horizon-client/src/mobs/fox.rs::ai_step held food (eats), no target, on the ground and awake, tested in the eating block of ai_step
|
||||
Fox.populateDefaultEquipmentSlots port crates/horizon-client/src/mobs/finalize.rs::Ctx::populate gap: player: only Ctx::finalize (structure mobs, probe) calls it; natural spawns and eggs use spawning.rs::finalize, so a fresh fox never holds an emerald, egg, rabbit foot or the like in its mouth
|
||||
Fox.handleEntityEvent missing player: no item crumbs at the mouth of a fox that is eating (event 45 is never broadcast or handled; only the sound plays)
|
||||
Fox.createAttributes skip:data attributes come from entity-types.json
|
||||
Fox.checkFoxSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules foxes_spawnable_on below and bright enough
|
||||
Fox.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize gap: player: live spawns (natural, spawner, summon) run spawning.rs::finalize, which has no fox arm beyond pick-up-loot: every spawned fox is red (no snow foxes in snowy biomes), no baby packs, no item in the mouth; Ctx::finalize is only reached by structure mobs and the probe
|
||||
Fox.setTargetGoals port crates/horizon-client/src/mobs/fox.rs::register red and snow target orders as goals gated on the variant read when the goal runs
|
||||
Fox.get missing minor: the fox/variant component is not reported (species_variant_component has no fox)
|
||||
Fox.applyImplicitComponent missing minor: a fox/variant component on a spawn egg or item is ignored
|
||||
Fox.getTrustedEntities missing player: foxes trust nobody, so a fox you bred still runs from you (the avoid-player goal has no trust test) and never defends you
|
||||
Fox.addTrustedEntity missing player: foxes bred or hatched by a player never trust them (breeding does not pass the breeder on)
|
||||
Fox.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt gap: player: only Type is read; Trusted, Sleeping, Sitting and Crouching are dropped, so a reload wakes a sleeping fox and forgets trust
|
||||
Fox.clearTrusted missing minor: trust is not modelled, so there is nothing to clear
|
||||
Fox.getFlag port crates/horizon-client/src/mobs/fox.rs::flag flags byte in extra.ints[0]
|
||||
Fox.canHoldItem missing player: part of the missing item pickup (a fox never reaches the point of choosing what to hold)
|
||||
Fox.spitOutItem missing minor: the old item is never spat out with entity.fox.spit because pickup is missing
|
||||
Fox.dropItemStack missing minor: the rest of a stack is never dropped by a fox because pickup is missing
|
||||
Fox.pickUpItem missing player: foxes never pick up dropped items (food, emeralds, anything): the loot pickup of Mob.aiStep exists only for pandas (game/pandas.rs) and the fox search-for-items goal is absent
|
||||
Fox.getHeadRollAngle port crates/horizon-client/src/mobs/fox.rs::pose head_roll_angle from the interested angle at the partial tick
|
||||
Fox.setTarget missing minor: only clears the defending flag, which is never set
|
||||
Fox.playAmbientSound missing player: no night screech at double volume (entity.fox.screech) when no player is near
|
||||
Fox.getAmbientSound missing player: a sleeping fox makes no sleep sound and foxes never screech at night; the ambient is always entity.fox.ambient
|
||||
Fox.getLeashOffset missing minor: a lead hangs at the default offset (eye height), not at 0.55 of it
|
||||
Fox.FoxAlertableEntitiesSelector.test inline crates/horizon-client/src/mobs/fox.rs::alertable gap: minor: any other mob counts even when asleep or sneaking, and a trusted mob is not skipped (no trust)
|
||||
Fox.FoxEatBerriesGoal.onReachedTarget inline crates/horizon-client/src/mobs/fox.rs::EatBerries::tick after 40 ticks at the bush, picks when mob griefing is on
|
||||
Fox.FoxEatBerriesGoal.pickGlowBerry port crates/horizon-client/src/mobs/fox.rs::EatBerries::pick CaveVines.use: one glow berry, berries off, pick sound with 0.8 to 1.2 pitch
|
||||
Fox.FoxEatBerriesGoal.pickSweetBerries port crates/horizon-client/src/mobs/fox.rs::EatBerries::pick 1 or 2 berries (+1 when fully grown), the first into the mouth when empty, age back to 1
|
||||
Fox.FoxFollowParentGoal.canContinueToUse inline crates/horizon-client/src/mobs/fox.rs::Wrap::can_continue defending is never set, so only the follow-parent test remains
|
||||
Fox.FoxLookAtPlayerGoal.canContinueToUse inline crates/horizon-client/src/mobs/fox.rs::Wrap::can_continue Wrap with the faceplanted or interested test on both can_use and can_continue
|
||||
Fox.FoxMeleeAttackGoal.checkAndPerformAttack inline crates/horizon-client/src/mobs/goals.rs::MeleeAttack::tick gap: player: the generic melee strike runs; a fox bite plays no entity.fox.bite sound
|
||||
Fox.FoxPanicGoal.shouldPanic inline crates/horizon-client/src/mobs/fox.rs::register Panic(2.2); the not-defending test is moot because defending is never set
|
||||
Fox.FoxPounceGoal.canContinueToUse inline crates/horizon-client/src/mobs/fox.rs::Pounce::can_continue target alive, still in the air or tilted 15 degrees, not faceplanted
|
||||
Fox.FoxStrollThroughVillageGoal.canFoxMove missing minor: the stroll-through-village goal is not ported (foxes never follow village streets); fox.rs::can_move is Fox.canMove, a different test
|
||||
Frog.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta variant holder and tongue target id
|
||||
Frog.getTongueTarget inline crates/horizon-client/src/mobs/frog.rs::ShootTongue::tick gap: minor: the target lives in Frog.State; FrogLookControl.resetXRotOnTick has no frog case, so the head pitch is zeroed while the tongue is out
|
||||
Frog.get port crates/horizon-client/src/mobs/finalize.rs::species_variant_component frog/variant component
|
||||
Frog.applyImplicitComponent missing minor: a frog/variant component on a spawn egg or item is ignored
|
||||
Frog.customServerAiStep port crates/horizon-client/src/mobs/frog.rs::server_ai_step the attackables sensor and memory timers; the activities run as goals
|
||||
Frog.getBreedOffspring missing player: frogs never breed: they take slimeballs and show hearts, but no breed goal exists, so no frogspawn is ever laid by frogs
|
||||
Frog.spawnChildFromBreeding missing player: frogs never become pregnant (IS_PREGNANT) and so never lay frogspawn; no breed goal means this is never reached, and the generic baby spawn would be wrong for frogs anyway
|
||||
Frog.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize variant by biome (live spawns set it in spawning.rs::finalize from biome.frog); the long jump cooldown it sets has no user
|
||||
Frog.createAttributes skip:data attributes come from entity-types.json
|
||||
Frog.checkFrogSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules frogs_spawnable_on below and bright enough
|
||||
Frog.FrogNodeEvaluator.getStart missing minor: frogs use the plain ground navigation, so a frog in water does not start its path at the box corner
|
||||
Frog.FrogNodeEvaluator.getPathType missing minor: blocks above #frog_prefer_jump_to (lily pad, dripleaf) are not treated as open path nodes
|
||||
Frog.FrogPathNavigation.canCutCorner missing minor: no frog navigation, so water-border nodes allow cutting corners
|
||||
Frog.FrogPathNavigation.createPathFinder missing player: frogs path as plain walkers (NavKind::Ground, no water malus 4 or trapdoor block); vanilla frogs use amphibious pathing with a shallow-water preference
|
||||
FrogAi.initCoreActivity inline crates/horizon-client/src/mobs/frog.rs::register gap: minor: Panic runs at 1.25 where AnimalPanic uses 2.0; look and move sinks are the controls
|
||||
FrogAi.initIdleActivity inline crates/horizon-client/src/mobs/frog.rs::register gap: player: Croak, stroll and look at player (6 blocks) are there; no slimeball tempt, no mate search and no TryFindLand
|
||||
FrogAi.initSwimActivity inline crates/horizon-client/src/mobs/frog.rs::register gap: minor: no separate swim activity: Float and the land stroll stand in, no random swim at 0.75 or find-land
|
||||
FrogAi.initLaySpawnActivity missing player: pregnant frogs never walk to water and lay frogspawn (no pregnancy, no TryLaySpawnOnFluidNearLand)
|
||||
FrogAi.initJumpActivity missing player: frogs never long jump (no leap onto lily pads or big dripleaf)
|
||||
FrogAi.initTongueActivity inline crates/horizon-client/src/mobs/frog.rs::register ShootTongue goal at priority 2 with the attack-target checks inside it
|
||||
FrogAi.isAcceptableLandingSpot missing minor: landing test of the missing frog long jump
|
||||
FrogVariants.bootstrap skip:data variant registry; the biome to variant choice is BiomeFacts.frog
|
||||
FrogVariants.register skip:data registry registration
|
||||
ShootTongue.checkExtraStartConditions inline crates/horizon-client/src/mobs/frog.rs::ShootTongue::can_use path check with the unreachable memory, not croaking; the sensor only offers edible targets
|
||||
ShootTongue.canStillUse inline crates/horizon-client/src/mobs/frog.rs::ShootTongue::can_continue phase not done, no panic, target alive, 100 tick timeout
|
||||
ShootTongue.eatEntity inline crates/horizon-client/src/mobs/frog.rs::ShootTongue::tick CatchAnimation arm: frog eat sound at 2.0, then the frog's attack on the target
|
||||
ShootTongue.canPathfindToTarget inline crates/horizon-client/src/mobs/frog.rs::ShootTongue::can_use a path to the target that ends within 1.75 blocks
|
||||
ShootTongue.addUnreachableTargetToMemory inline crates/horizon-client/src/mobs/frog.rs::ShootTongue::can_use up to 5 ids kept 100 ticks in Frog.State.unreachable
|
||||
Tadpole.customServerAiStep inline crates/horizon-client/src/mobs/aquatic.rs::register gap: player: panic and swim-around goals stand in for the brain; tadpoles do not follow a player holding a slimeball and do not look at players
|
||||
Tadpole.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt Age and AgeLocked
|
||||
Tadpole.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt Age and AgeLocked
|
||||
Tadpole.setAgeLockedData missing player: a golden dandelion on a tadpole does nothing (no age lock use anywhere in the game)
|
||||
Tadpole.saveToBucketTag port crates/horizon-client/src/entity_nbt.rs::bucket_data Age and AgeLocked for axolotls and tadpoles
|
||||
Tadpole.loadFromBucketTag port crates/horizon-client/src/entity_nbt.rs::load_bucket_data Age and AgeLocked
|
||||
Tadpole.ageUp inline crates/horizon-client/src/mobs/aquatic.rs::ai_step gap: player: at 24000 the frog is spawned fresh with yaw and persistence only (SpawnSetup), so a named, silenced or glowing tadpole turns into a plain frog; the grow-up sound is 1.0 loud, not 0.15
|
||||
TadpoleAi.initCoreActivity inline crates/horizon-client/src/mobs/aquatic.rs::register panic at 2.0 as a goal
|
||||
TadpoleAi.initIdleActivity inline crates/horizon-client/src/mobs/aquatic.rs::register gap: player: swims around with speed 1.0 every 40 ticks (vanilla 0.5); no look at player, no slimeball tempt
|
||||
Goat.createHorn missing player: a horn dropped by a ramming goat is always the default ponder horn (no random instrument from the goat's uuid, regular or screaming set) and drops with a flat upward push
|
||||
Goat.createAttributes skip:data attributes come from entity-types.json
|
||||
Goat.ageBoundaryReached port crates/horizon-client/src/mobs/finalize.rs::age_boundary_reached attack damage 1 for a baby, 2 for an adult
|
||||
Goat.getBreedOffspring missing player: a baby goat is never screaming (not inherited from a parent, no 2 percent roll on the breeding path) and starts with no ram or long jump cooldown
|
||||
Goat.customServerAiStep inline crates/horizon-client/src/mobs/ai.rs::generic goals stand in for the brain: Float, Panic 2.0, Breed, Tempt, FollowParent, stroll and look (ai.rs generic) and the ram goal (goat.rs); the ram cooldown counts down in goat.rs::tick
|
||||
Goat.setYHeadRot missing minor: the head is not clamped to 15 degrees of the body on every set; only walking and body turning limit it (control.rs)
|
||||
Goat.playEatingSound port crates/horizon-client/src/mobs/ai.rs::eating_sound screaming or normal eat sound at 0.8 to 1.2 pitch
|
||||
Goat.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize gap: player: live spawns use spawning.rs::finalize, which has no goat arm: no screaming goats (2 percent), no one-horned goats (10 percent), and no starting ram cooldown, so a fresh goat can ram at once; Ctx::finalize only runs for structure mobs and the probe
|
||||
Goat.getDefaultDimensions port crates/horizon-client/src/mobs/living.rs::Mob::dims baby box (0.45 x 0.65, eye 0.59375) from the species table; no long jump pose scale since there is no long jump
|
||||
Goat.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt IsScreamingGoat, HasLeftHorn, HasRightHorn
|
||||
Goat.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt IsScreamingGoat and both horn flags (default true)
|
||||
Goat.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: the two horn flags are synced; the screaming flag is not
|
||||
Goat.checkGoatSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules goats_spawnable_on below and bright enough
|
||||
GoatAi.initMemories port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize gap: player: the long jump (600 to 1200) and ram (600 to 6000) cooldowns are only set by Ctx::finalize (structure mobs, probe); live spawns and babies start at zero, so goats ram right after spawning
|
||||
GoatAi.initCoreActivity inline crates/horizon-client/src/mobs/ai.rs::generic Float (swim), Panic 2.0 and the cooldown count in goat.rs::tick
|
||||
GoatAi.initIdleActivity inline crates/horizon-client/src/mobs/ai.rs::generic Breed, Tempt 1.25 with goat_food, FollowParent 1.25, stroll, look at player 6; no walk-to-look-target or do-nothing options
|
||||
GoatAi.initLongJumpActivity missing player: goats never long jump between ledges (no crouch and leap)
|
||||
GoatAi.initRamActivity port crates/horizon-client/src/mobs/goat.rs::register the Ram goal: prepare four to seven blocks away, wait 20 ticks head down, charge, knock back or break a horn
|
||||
CopperGolem.createAttributes skip:data attributes come from entity-types.json
|
||||
CopperGolem.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta weather state and golem state
|
||||
CopperGolem.canTurnToStatue inline crates/horizon-client/src/mobs/copper_golem.rs::update_weathering oxidized, standing in air, 0.0058 chance per tick on the level random
|
||||
CopperGolem.playHeadSpinSound port crates/horizon-client/src/mobs/copper_golem.rs::ai_step gap: minor: local spin sound by oxidation level, but a silent golem still plays it
|
||||
CopperGolem.getLeashOffset missing minor: a lead hangs at the default offset, not 0.75 of the eye height with no forward shift
|
||||
CopperGolemAi.initCoreActivity port crates/horizon-client/src/mobs/animal_brain.rs::copper_golem_package gap: player: panic 1.5, look sink, move sink and the two countdowns are there; InteractWithDoor is not, so a golem's path through a closed wooden door ends at the door
|
||||
CopperGolemAi.initIdleActivity port crates/horizon-client/src/mobs/animal_brain.rs::copper_golem_package transport between chests, look at player, then stroll (2 blocks) or do nothing while the transport cooldown runs
|
||||
CopperGolemAi.getTargetReachedInteractions inline crates/horizon-client/src/mobs/transport_items.rs::reached_interaction pickup, pickup nothing, place, place nothing from what the chest holds and what the golem carries
|
||||
CopperGolemAi.onReachedTargetInteraction inline crates/horizon-client/src/mobs/transport_items.rs::Transport::on_reached tick 1 opens the chest and sets the state, tick 9 plays the sound, tick 60 closes it
|
||||
IronGolem.registerGoals port crates/horizon-client/src/mobs/golem.rs::register_iron gap: player: no MoveBackToVillageGoal and no village-bound stroll (plain stroll 0.6), so golems wander off from their village; no ResetUniversalAngerTargetGoal
|
||||
IronGolem.createAttributes skip:data attributes come from entity-types.json
|
||||
IronGolem.doPush missing minor: a hostile mob that bumps the golem is not picked as its target one time in 20 (the golem still finds enemies by its nearest-target goal)
|
||||
IronGolem.canSpawnSprintParticle missing player: a walking iron golem kicks up no dust of the block under its feet (sprint dust is drawn for players only, client_ambient.rs)
|
||||
IronGolem.canAttack missing player: a golem the player built can still attack the player after being hit (player-created is not tracked)
|
||||
IronGolem.addAdditionalSaveData missing minor: PlayerCreated and the persistent anger are not written from the live mob
|
||||
IronGolem.readAdditionalSaveData missing minor: PlayerCreated and the persistent anger are not read
|
||||
IronGolem.hurtServer missing player: no entity.iron_golem.damage crack sound when damage moves the golem to a new crackiness level (the crack texture does change, mobs/golem.rs::crackiness)
|
||||
IronGolem.isPlayerCreated missing player: the player-created flag does not exist, so every golem acts like a village golem toward the player
|
||||
IronGolem.setPlayerCreated missing player: building a golem from iron blocks does not mark it player-created (game/golems.rs create_triggered)
|
||||
IronGolem.getLeashOffset missing minor: a lead hangs at the default offset, not 0.875 of the eye height
|
||||
SnowGolem.registerGoals port crates/horizon-client/src/mobs/golem.rs::register_snow gap: minor: stroll uses the 0.001 water-avoiding probability, vanilla 1.0000001E-5
|
||||
SnowGolem.shear port crates/horizon-client/src/game/creatures.rs::Game::interact_shear_mob shear sound, pumpkin off, shearing loot table at eye height
|
||||
SnowGolem.hasPumpkin inline crates/horizon-client/src/game/creatures.rs::Game::interact_shear_mob extra.sheared is the inverse; synced as DATA_PUMPKIN_ID in lan.rs and remote_mob_data.rs
|
||||
SnowGolem.setPumpkin inline crates/horizon-client/src/game/creatures.rs::Game::interact_shear_mob sets extra.sheared (shears, dispenser); nothing puts a pumpkin back, as in vanilla
|
||||
SnowGolem.getLeashOffset missing minor: a lead hangs at the default offset, not 0.75 of the eye height
|
||||
HappyGhast.setServerStillTimeout inline crates/horizon-client/src/mobs/happy_ghast.rs::still_tick gap: minor: the timeout is extra.counter (10 when a player stands on top, 10 on dismount, 0 on boarding); the one-off position sync to tracking players is not sent, lan.rs only marks the entity precise
|
||||
HappyGhast.registerGoals port crates/horizon-client/src/mobs/happy_ghast.rs::setup adult goals: float, tempt (harness and food for a bare adult, food otherwise), float around within 16
|
||||
HappyGhast.adultGhastSetup port crates/horizon-client/src/mobs/happy_ghast.rs::setup adult half: ghast move control, happy ghast look control, goals, brain stopped
|
||||
HappyGhast.babyGhastSetup port crates/horizon-client/src/mobs/happy_ghast.rs::setup baby half: flying move control, baby flying navigation, no goals, timeout cleared
|
||||
HappyGhast.ageBoundaryReached port crates/horizon-client/src/mobs/happy_ghast.rs::ensure_setup reruns setup when the age sign changes
|
||||
HappyGhast.createAttributes skip:data attributes come from entity-types.json
|
||||
HappyGhast.getAmbientSoundInterval port crates/horizon-client/src/mobs.rs::Mob::ambient_interval six times as long while it carries a rider
|
||||
HappyGhast.canUseSlot inline crates/horizon-client/src/game/ghasts.rs::Game::interact_happy_ghast a harness goes only on a living adult without one; shears take it off
|
||||
HappyGhast.addPassenger inline crates/horizon-client/src/game/ghasts.rs::Game::interact_happy_ghast gap: minor: goggles-down sound for the first rider and the still timeout reset; only one rider fits (vanilla four) and the timeout is always 0
|
||||
HappyGhast.getControllingPassenger port crates/horizon-client/src/mobs/happy_ghast.rs::controlled gap: minor: harnessed adult with a rider; the not-on-still-timeout test is missing
|
||||
HappyGhast.tickRidden port crates/horizon-client/src/mobs/happy_ghast.rs::ridden turns 8 percent toward the rider's yaw, pitch half of theirs, head and body follow
|
||||
HappyGhast.getHappyGhastRestrictionRadius port crates/horizon-client/src/mobs/happy_ghast.rs::restriction_radius 64 for a bare adult, 32 otherwise
|
||||
HappyGhast.checkRestriction inline crates/horizon-client/src/mobs/happy_ghast.rs::ai_step home set to the block when unleashed and unridden and stale or the radius changed
|
||||
HappyGhast.continuousHeal inline crates/horizon-client/src/mobs/happy_ghast.rs::ai_step gap: minor: one point every 600 ticks, every 20 in precipitation; the in-clouds fast heal is missing
|
||||
HappyGhast.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: STAYS_STILL is synced; IS_LEASH_HOLDER is not tracked (no leashHolderTime), so the harness rope layer is never drawn
|
||||
HappyGhast.syncStayStillFlag port crates/horizon-client/src/game/lan.rs::mob_meta STAYS_STILL shown while the timeout is above zero (on_still_timeout)
|
||||
HappyGhastAi.initCoreActivity port crates/horizon-client/src/mobs/animal_brain.rs::ghastling_package swim, flying panic 2.0, look sink, move sink and the tempt cooldown countdown
|
||||
HappyGhastAi.initIdleActivity port crates/horizon-client/src/mobs/animal_brain.rs::ghastling_package tempt with look in the eyes, follow a player, follow an adult, then fly stroll or walk to the look target
|
||||
|
@@ -0,0 +1,147 @@
|
||||
AbstractNautilus.createAttributes skip:data attributes come from the entity type table (MobType in mobs.rs)
|
||||
AbstractNautilus.checkNautilusSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::Nautilus arm: sea level minus 25 to minus 5, water below and above; only the nautilus has a placement (the zombie nautilus has none of its own)
|
||||
AbstractNautilus.canUseSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_use_slot saddle and body slots need an alive, grown, tame nautilus
|
||||
AbstractNautilus.canDispenserEquipIntoSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_dispenser_equip body and saddle always, other slots only with pick_up_loot
|
||||
AbstractNautilus.getControllingPassenger port crates/horizon-client/src/mobs/nautilus.rs::controlled a rider on a saddled nautilus
|
||||
AbstractNautilus.getRiddenSpeed inline crates/horizon-client/src/mobs/nautilus.rs::ridden 0.0325 in water, 0.02 on land, times the movement speed
|
||||
AbstractNautilus.doPlayerRide inline crates/horizon-client/src/game/nautili.rs::Game::interact_nautilus the player mounts it and a lead breaks; there is no home to clear
|
||||
AbstractNautilus.getNautilusRestrictionRadius missing player: a tame nautilus is never kept near its home, so it wanders off instead of staying within 32 blocks (16 for a baby or a saddled one)
|
||||
AbstractNautilus.checkRestriction missing player: no home is set for a tame nautilus (ai.home is only set by leads and happy ghasts), see getNautilusRestrictionRadius
|
||||
AbstractNautilus.applyEffects inline crates/horizon-client/src/mobs/nautilus.rs::ai_step the rider gets breath of the nautilus for 60 ticks, refreshed every 40 ticks
|
||||
AbstractNautilus.onPlayerJump inline crates/horizon-client/src/game/mounts.rs::Game::charge_mount_jump the charged jump scale (0.4 to 1.0) goes to the rider input; the dash itself waits for its cooldown in nautilus::ridden
|
||||
AbstractNautilus.executeRidersJump port crates/horizon-client/src/mobs/nautilus.rs::dash gap: minor: the push leaves out getBlockSpeedFactor (soul sand, honey); 1.2 in water, 0.5 on land, 40 tick cooldown, dashing flag
|
||||
AbstractNautilus.handleStartJump inline crates/horizon-client/src/mobs/nautilus.rs::ai_step the dash sound plays on the tick after the dash (scratch[1]); no game event
|
||||
AbstractNautilus.onSyncedDataUpdated skip:other client mirror of the dash flag; the nautilus keeps its own dash clock (anim_ticks) and the jump bar uses mount.jump_ticks
|
||||
AbstractNautilus.tryToTame inline crates/horizon-client/src/game/nautili.rs::Game::interact_nautilus one chance in three, taming particles (event 7 or 6), eating sound, tame_animal trigger
|
||||
AbstractNautilus.hurtServer port crates/horizon-client/src/mobs/nautilus.rs::after_hurt angry at the attacker for 400 ticks
|
||||
AbstractNautilus.finalizeSpawn port crates/horizon-client/src/mobs/nautilus.rs::finalize attack target cooldown of 2400 to 3600 ticks
|
||||
AbstractNautilus.getEquipSound port crates/horizon-client/src/mobs/nautilus.rs::saddle_sound underwater saddle sound while the eyes are in water
|
||||
AbstractNautilus.createInventory skip:other getInventoryColumns is 0, so the container has no slots; saddle and armour are equipment slots
|
||||
AbstractNautilus.openCustomInventoryScreen missing player: shift-use on a tame nautilus or the inventory key while riding opens no screen (has_mount_menu is horses and llamas only), so a saddle or armour put on cannot be taken off again
|
||||
AbstractNautilus.getSlot skip:other slots 500 and up address the container, which has no slots; every other slot is an equipment slot
|
||||
AbstractNautilus.isAggravated missing minor: only feeds canBeLeashed; a charging or angry nautilus can still be leashed (leash.rs::can_be_leashed has no nautilus arm)
|
||||
Nautilus.customServerAiStep inline crates/horizon-client/src/mobs/nautilus.rs::register the goal list replaces the brain and its fight or idle switch; the cooldowns tick in ai_step
|
||||
Nautilus.getAmbientSound port crates/horizon-client/src/mobs/nautilus.rs::sounds by age and by under water or on land
|
||||
Nautilus.getHurtSound port crates/horizon-client/src/mobs/nautilus.rs::sounds by age and by under water or on land
|
||||
Nautilus.getDeathSound port crates/horizon-client/src/mobs/nautilus.rs::sounds by age and by under water or on land
|
||||
Nautilus.playEatingSound port crates/horizon-client/src/mobs/nautilus.rs::eat_sound baby and adult eat sounds
|
||||
Nautilus.baseTick inline crates/horizon-client/src/mobs/ai.rs::base_tick gap: minor: dries out on land through the generic needs_water air supply, so the damage is the drown kind instead of dry_out and a no-AI nautilus dries out too
|
||||
NautilusAi.initCoreActivity inline crates/horizon-client/src/mobs/nautilus.rs::register panic 1.6 is a goal; the look and move sinks are the generic controls and the cooldown counters tick in ai_step
|
||||
NautilusAi.initIdleActivity inline crates/horizon-client/src/mobs/nautilus.rs::register gap: minor: breed 0.4, tempt 1.3, swim stroll 1.0 and the target pick (find_target), but SetWalkTargetFromLookTarget is not ported so it does not swim toward what it looks at
|
||||
NautilusAi.initFightActivity inline crates/horizon-client/src/mobs/nautilus.rs::register the Charge goal: speed 0.6, 12 block range, 80 tick cooldown, only without love or temptation
|
||||
NautilusAi.isHostileTarget inline crates/horizon-client/src/mobs/nautilus.rs::find_target a pufferfish in water (the nautilus_hostiles tag holds only the pufferfish)
|
||||
ZombieNautilus.defineSynchedData skip:other synched variant id; Horizon keeps the variant in extra.variant and reads it from the server's data in remote_mob_data.rs
|
||||
ZombieNautilus.get skip:other reads the variant as a data component for predicates; Horizon has no entity component view
|
||||
ZombieNautilus.applyImplicitComponent missing minor: a spawn egg's zombie_nautilus_variant component is not applied (only bucketed mobs read item components)
|
||||
ZombieNautilus.finalizeSpawn port crates/horizon-client/src/mobs/nautilus.rs::finalize warm variant in warm oceans (coral), temperate elsewhere
|
||||
ZombieNautilusAi.initCoreActivity inline crates/horizon-client/src/mobs/nautilus.rs::register zombie arm: no panic; the cooldown counters tick in ai_step
|
||||
ZombieNautilusAi.initIdleActivity inline crates/horizon-client/src/mobs/nautilus.rs::register zombie arm: tempt 0.9, swim stroll 1.0, target pick in find_target; no breeding
|
||||
ZombieNautilusAi.initFightActivity inline crates/horizon-client/src/mobs/nautilus.rs::register zombie arm: Charge goal at speed 0.5
|
||||
ZombieNautilusVariants.bootstrap skip:data variant registry; Horizon has VARIANTS in nautilus.rs and the biome tag in spawning.rs
|
||||
Panda.setMainGene skip:other stores the gene id in extra.variant; the random re-roll for an id above 6 never happens
|
||||
Panda.setHiddenGene skip:other stores the gene id in extra.variant2; the random re-roll for an id above 6 never happens
|
||||
Panda.defineSynchedData skip:other synched flags, counters and genes; Horizon keeps them in the panda State and extra.variant, extra.variant2
|
||||
Panda.getFlag port crates/horizon-client/src/mobs/panda.rs::flag reads the DATA_ID_FLAGS bit (set_flag writes it)
|
||||
Panda.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt MainGene and HiddenGene by name
|
||||
Panda.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt MainGene and HiddenGene by name, normal when absent
|
||||
Panda.addEatingParticles inline crates/horizon-client/src/mobs/panda.rs::handle_eating eat sound every 5 ticks and the six crumbs (crumbs)
|
||||
Panda.updateSitAmount inline crates/horizon-client/src/mobs/panda.rs::update_amounts sit amount rises 0.15 and falls 0.19 a tick
|
||||
Panda.updateOnBackAnimation inline crates/horizon-client/src/mobs/panda.rs::update_amounts on-back amount, same steps
|
||||
Panda.updateRollAmount inline crates/horizon-client/src/mobs/panda.rs::update_amounts roll amount, same steps
|
||||
Panda.pickUpItem inline crates/horizon-client/src/game/pandas.rs::Game::tick_pandas takes a panda_eats_from_ground item at its feet with an empty mouth (mob_griefing), guaranteed drop
|
||||
Panda.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize random main and hidden genes, set_attributes, ageable group with 0.2 chance
|
||||
Panda.setGeneFromParents port crates/horizon-client/src/mobs/panda.rs::inherit genes from both parents with a 1 in 32 re-roll each; the one-parent branch is never reached
|
||||
Panda.PandaAttackGoal.canUse port crates/horizon-client/src/mobs/panda.rs::When::can_use melee attack only while can_perform_action
|
||||
Panda.PandaAvoidGoal.canUse port crates/horizon-client/src/mobs/panda.rs::When::can_use avoid goals only for a worried panda that can perform an action
|
||||
Parrot.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize random one of five variants, ageable group without babies
|
||||
Parrot.createAttributes skip:data attributes (health 6, flying speed 0.4) come from the entity type table
|
||||
Parrot.createNavigation missing player: parrots have no flying navigation or flying move control, so they walk and hop on the ground and never fly to where a path through the air would lead
|
||||
Parrot.calculateFlapping missing player: flap and flap_speed are only updated for chickens, so a parrot's wings never flap and a falling one does not glide (no 0.6 fall damping)
|
||||
Parrot.checkParrotSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::Parrot arm: parrots_spawnable_on below and bright enough
|
||||
Parrot.onFlap missing player: no parrot wing sound while flying (entity.parrot.fly at 0.15), no next_flap tracking
|
||||
Parrot.hurtServer missing player: a hit does not stand a sitting tame parrot up (only wolves reset sitting in tame::after_hurt)
|
||||
Parrot.get skip:other reads the variant as a data component for predicates; Horizon has no entity component view
|
||||
Parrot.applyImplicitComponent missing minor: a spawn egg's parrot_variant component is not applied (only bucketed mobs read item components)
|
||||
Parrot.defineSynchedData skip:other synched variant id; Horizon keeps it in extra.variant (remote_mob_data.rs reads index 20)
|
||||
Parrot.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::read_variant Variant clamped to 0 to 4, red and blue when absent
|
||||
Parrot.getLeashOffset port crates/horizon-client/src/mobs/leash.rs::leash_offset gap: minor: no parrot arm, the lead attaches at the full eye height instead of 0.5 times it
|
||||
Parrot.ParrotWanderGoal.getPosition missing player: parrots wander with a ground stroll (Stroll::avoiding_water in tame.rs::register_parrot), so they never pick a flying position or one of the tree perches
|
||||
Parrot.ParrotWanderGoal.getTreePos missing player: parrots never fly to settle on leaves or logs nearby
|
||||
ShoulderRidingEntity.setEntityOnShoulder port crates/horizon-client/src/game/shoulders.rs::Game::parrot_to_shoulder saved into the first free ShoulderEntityLeft or ShoulderEntityRight slot, the parrot removed from the world
|
||||
Pig.registerGoals port crates/horizon-client/src/mobs/farm.rs::register Species::Pig arm: float, panic 1.25, breed, two temptations (stick and food), follow parent, stroll, look
|
||||
Pig.getControllingPassenger port crates/horizon-client/src/mobs/equine.rs::controlled saddled and the rider holds the carrot on a stick (r.steer)
|
||||
Pig.onSyncedDataUpdated missing minor: a server's pig does not start its client boost timer from the synched boost time (remote.rs reads only the strider's flag there)
|
||||
Pig.defineSynchedData skip:other synched boost time, variant and sound variant; Horizon keeps them in extra.counter, extra.counter2, extra.variant and extra.sound_variant
|
||||
Pig.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt variant, sound_variant and the saddle in equipment
|
||||
Pig.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt variant, sound_variant and the saddle
|
||||
Pig.mobInteract port crates/horizon-client/src/game/mounts.rs::Game::interact_steerable gap: player: a saddled pig is mounted even when the click holds its food, so it cannot be fed or bred while saddled (vanilla feeds first)
|
||||
Pig.canUseSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_use_slot the saddle needs an alive, grown pig
|
||||
Pig.canDispenserEquipIntoSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_dispenser_equip the saddle always
|
||||
Pig.getEquipSound port crates/horizon-client/src/game/dispenser.rs::equip_sound entity.pig.saddle
|
||||
Pig.thunderHit port crates/horizon-client/src/game/lightning.rs::Game::thunder_hit a pig outside peaceful becomes a zombified piglin
|
||||
Pig.tickRidden inline crates/horizon-client/src/mobs/equine.rs::ridden_step turns to the rider's yaw, pitch halved, and ticks the boost
|
||||
Pig.getRiddenSpeed inline crates/horizon-client/src/mobs/equine.rs::ridden_step movement speed times 0.225 times the boost factor
|
||||
Pig.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed gap: minor: the baby always takes the first parent's variant, not either parent's by a coin
|
||||
Pig.getLeashOffset port crates/horizon-client/src/mobs/leash.rs::leash_offset gap: minor: no pig arm, the lead attaches at the full eye height instead of 0.6 times it
|
||||
Pig.getSoundSet inline crates/horizon-client/src/mobs/ai.rs::voice_sounds gap: player: only the baby or adult classic sounds are used, so mini and big sound variants (chosen and saved) never sound different
|
||||
Pig.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize variant by biome tag and a random sound variant
|
||||
PigSoundVariants.bootstrap skip:data sound variant registry; names come from finalize::sound_variants
|
||||
PigVariants.bootstrap skip:data variant registry; the variants and their biome tags are read from data
|
||||
PigVariants.register skip:data registry helper
|
||||
PolarBear.createAttributes skip:data attributes come from the entity type table
|
||||
PolarBear.checkPolarBearSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::PolarBear arm: ice-block rule in the alternate biomes, animal rule elsewhere
|
||||
PolarBear.getDefaultDimensions missing minor: the box of a rearing bear stays its normal height (vanilla grows it up to twice with the stand animation); Mob::dims has no polar bear arm
|
||||
PolarBear.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize ageable group with chance 1.0 (the PolarBear and Ocelot arm)
|
||||
Rabbit.getJumpPower port crates/horizon-client/src/mobs/rabbit.rs::jump_scale 0.5 toward higher ground or a wall, 0.2 when slow, else 0.3, divided by 0.42 (jump_power adds the block factor and boost)
|
||||
Rabbit.getJumpCompletion skip:other only copied into the render state; the rabbit model plays the hop and idle keyframe animations instead
|
||||
Rabbit.setSpeedModifier inline crates/horizon-client/src/mobs/rabbit.rs::prepare_move speed modifier is zeroed on the ground and restored in flight; 1.5 in water
|
||||
Rabbit.setJumping inline crates/horizon-client/src/mobs/rabbit.rs::start_jumping the jump sound with pitch times 0.8 plays when the hop starts
|
||||
Rabbit.defineSynchedData skip:other synched variant id; Horizon keeps it in extra.variant (remote_mob_data.rs reads index 18)
|
||||
Rabbit.facePoint inline crates/horizon-client/src/mobs/rabbit.rs::server_ai_step yaw set toward the wanted or next path point before each hop
|
||||
Rabbit.setLandingDelay inline crates/horizon-client/src/mobs/rabbit.rs::server_ai_step 10 ticks, 3 when the speed modifier is 2.2 or more
|
||||
Rabbit.createAttributes skip:data attributes come from the entity type table
|
||||
Rabbit.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt RabbitType; MoreCarrotTicks is kept at 0
|
||||
Rabbit.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt gap: minor: RabbitType (0 to 5 and 99) is read but MoreCarrotTicks is ignored
|
||||
Rabbit.playAttackSound missing minor: only the killer bunny plays it and Horizon has no killer bunny behaviour
|
||||
Rabbit.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed gap: minor: the baby always takes the first parent's coat; vanilla takes either parent's and one time in 20 rolls a biome coat
|
||||
Rabbit.setVariant inline crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize gap: player: variant 99 (killer bunny, from /summon or a save) only changes the texture: no armour 8, no plus 5 attack, no melee or target goals, no Killer Bunny name
|
||||
Rabbit.get skip:other reads the variant as a data component for predicates; Horizon has no entity component view
|
||||
Rabbit.applyImplicitComponent missing minor: a spawn egg's rabbit variant component is not applied (only bucketed mobs read item components)
|
||||
Rabbit.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize variant by biome, shared across a group
|
||||
Rabbit.getRandomRabbitVariant inline crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize white and white splotched in snowy biomes, gold in deserts, else brown, salt or black
|
||||
Rabbit.checkRabbitSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::Rabbit arm: rabbits_spawnable_on below and bright enough
|
||||
Rabbit.getLeashOffset port crates/horizon-client/src/mobs/leash.rs::leash_offset gap: minor: no rabbit arm, the lead attaches at the full eye height instead of 0.6 times it
|
||||
Rabbit.shouldPlayIdleAnimation inline crates/horizon-client/src/mobs/rabbit.rs::base_tick idle timeout over, not leashed, not no-AI
|
||||
Rabbit.RabbitAvoidEntityGoal.canUse missing player: rabbits never run from players (8 blocks), wolves (10) or monsters (4); no avoid goal is registered for them
|
||||
Rabbit.RaidGardenGoal.canUse missing player: rabbits never walk to ripe carrot crops to eat them; no MoreCarrotTicks clock
|
||||
Rabbit.RaidGardenGoal.tick missing player: a rabbit never eats carrots, so ripe carrots are never knocked back or destroyed by rabbits
|
||||
Rabbit.RaidGardenGoal.isValidTarget missing player: part of the missing carrot raid (a ripe carrot on a crop-supporting block)
|
||||
Sheep.registerGoals port crates/horizon-client/src/mobs/farm.rs::register Species::Sheep arm: float, panic, breed, tempt, follow parent, eat block, stroll, look
|
||||
Sheep.aiStep inline crates/horizon-client/src/mobs/ai.rs::species_ai_step the eat animation counter (anim_ticks) counts down each tick
|
||||
Sheep.handleEntityEvent missing player: on a server a sheep never lowers its head to eat grass, because entity event 10 is not handled in remote.rs (the integrated server sets anim_ticks itself)
|
||||
Sheep.getHeadEatPositionScale inline crates/horizon-client/src/mobs/anim.rs::setup Anim::Sheep arm: head drops by 9 times the scale (halved for a lamb)
|
||||
Sheep.getHeadEatAngleScale inline crates/horizon-client/src/mobs/anim.rs::setup Anim::Sheep arm: head tilt of pi/5 with the nibbling wobble
|
||||
Sheep.mobInteract port crates/horizon-client/src/game/creatures.rs::Game::interact_mob shears drop the shearing loot and set sheared; a dye recolours an unsheared sheep
|
||||
Sheep.setColor skip:other stores the 4-bit wool colour in extra.color
|
||||
Sheep.get skip:other reads the colour as a data component for predicates; Horizon has no entity component view
|
||||
Sheep.applyImplicitComponent missing minor: a spawn egg's sheep colour component is not applied (only bucketed mobs read item components)
|
||||
Sheep.isSheared skip:other reads extra.sheared
|
||||
Sheep.setSheared skip:other writes extra.sheared (shear, regrow and nbt set it directly)
|
||||
Sheep.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed gap: player: a lamb always takes the first parent's wool colour; vanilla mixes the two (red and blue give purple)
|
||||
Sheep.ate port crates/horizon-client/src/mobs/ai.rs::ate wool grows back and a lamb ages up by 60 seconds
|
||||
Sheep.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize wool colour from the biome's climate (farm::sheep_color)
|
||||
SheepColorSpawnRules.commonColors inline crates/horizon-client/src/mobs/farm.rs::sheep_color the 82 weight tail: the common colour, pink one time in 500
|
||||
SheepColorSpawnRules.getSheepColorConfiguration port crates/horizon-client/src/mobs/farm.rs::sheep_color the three climate tables; the climate itself is picked in Ctx::finalize from the warm and cold farm animal tags
|
||||
SheepColorSpawnRules.weighted inline crates/horizon-client/src/mobs/farm.rs::sheep_color the weighted pick is the running subtraction over the list
|
||||
Sniffer.defineSynchedData skip:other synched state and seed drop tick; Horizon keeps them in extra.variant and extra.ints[3]
|
||||
Sniffer.onPathfindingStart inline crates/horizon-client/src/mobs/sniffer.rs::ai_step water is passable only while it is on fire or in water; reset each tick (the onPathfindingDone part)
|
||||
Sniffer.canPlayDiggingSound inline crates/horizon-client/src/game/sniffers.rs::Game::tick_sniffer_effects gap: minor: the digging sound is a one-shot at the start of the dig (SnifferSoundInstance is not kept), so it is not cut off when the sniffer stops or gets a target
|
||||
Sniffer.resetAnimations inline crates/horizon-client/src/mobs/sniffer.rs::animate all five animation states stop when the state changes
|
||||
Sniffer.onScentingStart inline crates/horizon-client/src/mobs/animal_brain.rs::transition scenting sound, pitch 1.3 for a baby
|
||||
Sniffer.onDiggingStart inline crates/horizon-client/src/mobs/animal_brain.rs::transition the seed drop is set 120 ticks ahead (ints[3]); the client sound starts from the animation in tick_sniffer_effects
|
||||
Sniffer.dropSeed inline crates/horizon-client/src/mobs/sniffer.rs::ai_step gift loot sniffer_digging at the head block and the drop seed sound when the tick comes
|
||||
Sniffer.storeExploredPosition inline crates/horizon-client/src/mobs/animal_brain.rs::B::do_stop the on-pos is put in front of the explored list, kept to 20
|
||||
Sniffer.jumpFromGround missing minor: no sniffer arm in Mob::jump_from_ground, so its hop gets no extra forward nudge (moveRelative 0.1 forward) when it moves slowly
|
||||
Sniffer.mobInteract inline crates/horizon-client/src/mobs/ai.rs::eating_sound the eating sound plays when the food was taken (feed_animal)
|
||||
Sniffer.playEatingSound port crates/horizon-client/src/mobs/ai.rs::eating_sound Species::Sniffer arm: entity.sniffer.eat with pitch 0.8 to 1.2
|
||||
Sniffer.playSearchingSound port crates/horizon-client/src/game/sniffers.rs::Game::tick_sniffer_effects searching sound every 20 ticks while searching, near any player
|
||||
|
@@ -0,0 +1,140 @@
|
||||
WorldGenRegion.getChunk port crates/horizon-world/src/worldgen/feature_region.rs::TerrainRegion::chunk gap: minor: returns the resident chunk without the generating-step status check
|
||||
GossipContainer.getReputation port crates/horizon-client/src/gossip.rs::Gossips::reputation Villager calls it with all types only; the type predicate is fixed to all
|
||||
Frog.travelInWater missing minor: frog water travel (getSpeed() move, 0.9 drag on all axes) absent; generic fluid travel used instead
|
||||
HappyGhast.HappyGhastBodyRotationControl.clientTick port crates/horizon-client/src/mobs/happy_ghast.rs::ridden gap: minor: vehicle yaw sync only; the super.clientTick step is Mob::body_rotation_tick in control.rs
|
||||
SnifferAi.initCoreActivity inline crates/horizon-client/src/mobs/animal_brain.rs::sniffer_package core behaviour list (Swim, panic, sink, cooldown) built here
|
||||
SnifferAi.initSniffingActivity inline crates/horizon-client/src/mobs/animal_brain.rs::sniffer_package Searching entry here; memory gates in update_activity
|
||||
SnifferAi.initDigActivity inline crates/horizon-client/src/mobs/animal_brain.rs::sniffer_package Digging and FinishedDigging entries here; memory gates in update_activity
|
||||
SnifferAi.initIdleActivity inline crates/horizon-client/src/mobs/animal_brain.rs::sniffer_package idle entries (make love with reset, temptation, look sink, RunOne) here
|
||||
SnifferAi.Digging.canStillUse port crates/horizon-client/src/mobs/animal_brain.rs::B::tick_or_stop
|
||||
SnifferAi.Digging.stop port crates/horizon-client/src/mobs/animal_brain.rs::B::do_stop
|
||||
SnifferAi.FinishedDigging.stop port crates/horizon-client/src/mobs/animal_brain.rs::B::do_stop
|
||||
SnifferAi.Searching.canStillUse port crates/horizon-client/src/mobs/animal_brain.rs::B::tick_or_stop
|
||||
SnifferAi.Searching.stop port crates/horizon-client/src/mobs/animal_brain.rs::B::do_stop
|
||||
SnifferAi.Sniffing.stop port crates/horizon-client/src/mobs/animal_brain.rs::B::do_stop
|
||||
Squid.registerGoals port crates/horizon-client/src/mobs/aquatic.rs::register
|
||||
Squid.rotateVector inline crates/horizon-client/src/mobs/aquatic.rs::spawn_ink xRot then yRot of the body angles, inside spawn_ink
|
||||
Squid.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize S::Squid arm: ageable group with 0.05 baby chance
|
||||
Turtle.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta HAS_EGG and LAYING_EGG as entity metadata 18 and 19
|
||||
Turtle.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt home_pos and has_egg written here
|
||||
Turtle.checkTurtleSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::Turtle arm: below sea+4, sand, bright
|
||||
Turtle.createAttributes skip:data attribute values come from data tables (attr lookups in mobs.rs)
|
||||
Turtle.getAmbientSound port crates/horizon-client/src/mobs/ai.rs::ambient_sound gap: player: turtles in water or babies also play the land ambient (no Turtle arm; vanilla is silent there)
|
||||
Turtle.playStepSound port crates/horizon-client/src/mobs/ai.rs::step_sound shamble and shamble_baby at 0.15 volume
|
||||
Turtle.travelInWater missing player: turtles swim with generic fluid travel (0.02 base speed, 0.8 vertical drag), not 0.1 move speed, 0.9 drag and the slow sink
|
||||
Turtle.TurtleLayEggGoal.isValidTarget port crates/horizon-client/src/mobs/turtle.rs::LayEgg::valid air above and sand below
|
||||
Wolf.registerGoals port crates/horizon-client/src/mobs/tame.rs::register
|
||||
Wolf.getSoundSet missing player: wolves always use the classic voice; the sound variant (big, puglin, sad, angry...) never changes what plays
|
||||
Wolf.createAttributes skip:data attribute values come from data tables
|
||||
Wolf.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta flags, variant and anger metadata sent to clients
|
||||
Wolf.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt CollarColor written
|
||||
Wolf.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt CollarColor, sound_variant and anger read
|
||||
Wolf.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize gap: minor: sound variant is stored but no sound uses it (see getSoundSet)
|
||||
Wolf.getAmbientSound port crates/horizon-client/src/mobs/ai.rs::ambient_sound gap: minor: angry is taken as having a target, not the anger timer
|
||||
Wolf.die missing minor: a wolf that dies mid-shake keeps its shake state; Horizon never resets the wet and shake fields on death
|
||||
Wolf.getHeadRollAngle port crates/horizon-client/src/mobs/tame.rs::anim
|
||||
Wolf.applyTamingSideEffects port crates/horizon-client/src/mobs/tame.rs::set_tame
|
||||
Wolf.hurtArmor port crates/horizon-client/src/mobs.rs::Mob::hurt_wolf_armor
|
||||
Wolf.tryToTame port crates/horizon-client/src/game/creatures.rs::Game::interact_mob one in three tames; particles 7 or 6, sit, stop nav, clear target
|
||||
Wolf.handleEntityEvent inline crates/horizon-client/src/mobs/tame.rs::ai_step entity events 8 and 56 folded into the shake state in ai_step
|
||||
Wolf.getLeashOffset port crates/horizon-client/src/mobs/leash.rs::leash_offset gap: player: wolf rope point uses full eye height, not 0.6 times it
|
||||
Wolf.checkWolfSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules S::Wolf arm: wolves_spawnable_on and bright
|
||||
Wolf.WolfAvoidEntityGoal.avoidLlama port crates/horizon-client/src/mobs/tame.rs::AvoidLlamas::can_use strength check inside can_use
|
||||
WolfVariants.bootstrap skip:data registry bootstrap; variants are the WOLF_VARIANTS table in tame.rs
|
||||
DragonFlightHistory.copyFrom skip:java ring-buffer copy; Horizon keeps the flight history as fields of Dragon
|
||||
EndCrystal.defineSynchedData missing player: multiplayer guests never get a crystal's beam target, and the base is always shown (remote spawn ignores show_bottom)
|
||||
EndCrystal.addAdditionalSaveData port crates/horizon-client/src/game/dragon.rs::Crystal::to_nbt
|
||||
EndCrystal.readAdditionalSaveData port crates/horizon-client/src/game/dragon.rs::Crystal::from_nbt
|
||||
EndCrystal.hurtClient missing unsure: client hit check that refuses dragon-sourced hits; not found in destroy_crystal
|
||||
EndCrystal.shouldRenderAtSqrDistance skip:ui render culling so beams draw from farther away; drawing only
|
||||
EnderDragon.<init> port crates/horizon-client/src/game/dragon.rs::Dragon::new gap: minor: parts are placed later by Game::place_dragon_parts
|
||||
EnderDragon.isFlapping port crates/horizon-client/src/game/dragon.rs::Game::tick_dragon
|
||||
EnderDragon.onFlap port crates/horizon-client/src/game/dragon.rs::Game::tick_dragon flap sound at volume 5 and pitch 0.8 plus random 0.3
|
||||
EnderDragon.defineSynchedData port crates/horizon-client/src/game/dragon.rs::Game::lan_dragon_state DATA_PHASE defined as hovering on the wire
|
||||
EnderDragon.tickPart port crates/horizon-client/src/game/dragon.rs::Game::place_dragon_parts
|
||||
EnderDragon.getHeadYOffset inline crates/horizon-client/src/game/dragon.rs::Game::place_dragon_parts sitting gives -1, else flight sample 5 minus sample 0
|
||||
EnderDragon.knockBack port crates/horizon-client/src/game/dragon.rs::Game::dragon_contacts wing zones push players
|
||||
EnderDragon.handleKillingBlow inline crates/horizon-client/src/game/dragon.rs::Dragon::hurt health set to 1 and dying phase unless sitting
|
||||
EnderDragon.knockback missing minor: a hit does not push the dragon back outside the sitting phase
|
||||
EnderDragon.findClosestNode port crates/horizon-client/src/game/dragon.rs::Game::closest_node
|
||||
EnderDragon.findPath port crates/horizon-client/src/game/dragon.rs::Game::dragon_path
|
||||
EnderDragon.reconstructPath inline crates/horizon-client/src/game/dragon.rs::Game::dragon_path path list built inside the A* search
|
||||
EnderDragon.addAdditionalSaveData port crates/horizon-client/src/game/dragon.rs::Dragon::to_nbt
|
||||
EnderDragon.readAdditionalSaveData port crates/horizon-client/src/game/dragon.rs::Dragon::from_nbt gap: minor: sitting_damage_received is not read back
|
||||
EnderDragon.getHeadLookVector port crates/horizon-client/src/game/dragon.rs::Game::dragon_look
|
||||
EnderDragon.onSyncedDataUpdated port crates/horizon-client/src/game/dragon.rs::Game::remote_dragon_data phase set on guests from synced data
|
||||
EnderDragon.recreateFromPacket port crates/horizon-client/src/game/dragon.rs::Game::spawn_remote_dragon gap: minor: part entity ids are not assigned; parts are indexes
|
||||
EnderDragonPart.hurtServer port crates/horizon-client/src/game/dragon.rs::Dragon::hurt hits route to the dragon with the part index
|
||||
EnderDragonPart.is skip:other identity check; parts are SPECIAL+index ids in special_targets
|
||||
DragonStrafePlayerPhase.doServerTick inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase Strafe arm: charge, sight, fireball, then holding pattern
|
||||
DragonStrafePlayerPhase.findNewTarget port crates/horizon-client/src/game/dragon.rs::Game::ring_path
|
||||
DragonStrafePlayerPhase.navigateToNextPathNode port crates/horizon-client/src/game/dragon.rs::Game::next_target
|
||||
DragonStrafePlayerPhase.begin inline crates/horizon-client/src/game/dragon.rs::Game::tick_phase fresh strafe state (charge 0, no path or target) when entered
|
||||
EnderDragonPhaseManager.getPhase skip:java lazy cache of phase instances; Horizon phases are enum values
|
||||
WitherBoss.createNavigation port crates/horizon-client/src/mobs/wither.rs::register gap: minor: door and float flags are not set here
|
||||
WitherBoss.registerGoals port crates/horizon-client/src/mobs/wither.rs::register
|
||||
WitherBoss.defineSynchedData port crates/horizon-client/src/game/lan.rs::mob_meta gap: minor: only heads A and B are synced; the invulnerable counter is sent at index 19, the slot of target C
|
||||
WitherBoss.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt Invul read; boss bar name not checked here
|
||||
WitherBoss.canDestroy inline crates/horizon-client/src/mobs/wither.rs::custom_server_ai_step air and wither-immune checks in the block loop
|
||||
WitherBoss.getHeadX port crates/horizon-client/src/mobs/wither.rs::head_pos
|
||||
WitherBoss.getHeadY port crates/horizon-client/src/mobs/wither.rs::head_pos
|
||||
WitherBoss.getHeadZ port crates/horizon-client/src/mobs/wither.rs::head_pos
|
||||
WitherBoss.rotlerp port crates/horizon-client/src/mobs/control.rs::rotlerp result wrapped into 0 to 360, equal modulo 360
|
||||
WitherBoss.performRangedAttack port crates/horizon-client/src/mobs/wither.rs::shoot
|
||||
WitherBoss.createAttributes skip:data attribute values come from data tables
|
||||
WitherBoss.isPowered port crates/horizon-client/src/mobs/wither.rs::powered
|
||||
ArmorStand.refreshDimensions skip:other no cached dimensions: bounds are computed from position, small and marker
|
||||
ArmorStand.defineSynchedData port crates/horizon-client/src/game/lan_entities.rs::Game::lan_object_states flag and pose values sent to clients; defaults are the DEFAULT_POSE table
|
||||
ArmorStand.canUseSlot inline crates/horizon-client/src/game/armor_stands.rs::Game::interact_armor_stand hand slots gated by show_arms; gap: minor: body and saddle are never offered and disabled bits are not read
|
||||
ArmorStand.pushEntities missing minor: armour stands do not push nearby minecarts
|
||||
ArmorStand.interact port crates/horizon-client/src/game/armor_stands.rs::Game::interact_armor_stand
|
||||
ArmorStand.getClickedSlot inline crates/horizon-client/src/game/armor_stands.rs::Game::interact_armor_stand click height picks feet, chest, legs, head or offhand
|
||||
ArmorStand.isDisabled inline crates/horizon-client/src/game/armor_stands.rs::Game::interact_armor_stand gap: minor: disabled-slot bits are not read; hands gated by show_arms only
|
||||
ArmorStand.handleEntityEvent inline crates/horizon-client/src/game/armor_stands.rs::Game::attack_armor_stand event 32 becomes the wobble timer and the hit sound
|
||||
ArmorStand.showBreakingParticles missing player: no plank particles when a stand breaks, by a creative hand or the second hit
|
||||
ArmorStand.causeDamage port crates/horizon-client/src/entities.rs::ArmorStand::environment_tick gap: minor: fire damage only (4 per second burning, 0.15 per contact); hit and explosion paths are elsewhere
|
||||
ArmorStand.brokenByPlayer inline crates/horizon-client/src/game/armor_stands.rs::Game::attack_armor_stand stand item dropped, then the equipment
|
||||
ArmorStand.brokenByAnything inline crates/horizon-client/src/game/armor_stands.rs::Game::attack_armor_stand gap: minor: vanishing-curse items are not filtered on the hand-break path, only on the burn path
|
||||
ArmorStand.playBrokenSound inline crates/horizon-client/src/game/armor_stands.rs::Game::attack_armor_stand break sound on both break paths
|
||||
ArmorStand.setYBodyRot skip:other client rotation setter from packets; a stand turns only with its yaw field
|
||||
ArmorStand.setYHeadRot skip:other client rotation setter from packets; a stand turns only with its yaw field
|
||||
ArmorStand.kill inline crates/horizon-client/src/game/armor_stands.rs::Game::attack_armor_stand removes the stand; no game event
|
||||
ArmorStand.setSmall port crates/horizon-client/src/entity_nbt.rs::armor_stand_from_nbt Small tag
|
||||
ArmorStand.isSmall skip:other accessor; reads the small field
|
||||
ArmorStand.setShowArms port crates/horizon-client/src/entity_nbt.rs::armor_stand_from_nbt ShowArms tag
|
||||
ArmorStand.showArms skip:other accessor; reads the show_arms field
|
||||
ArmorStand.setNoBasePlate port crates/horizon-client/src/entity_nbt.rs::armor_stand_from_nbt NoBasePlate tag
|
||||
ArmorStand.showBasePlate skip:other accessor; reads the no_base_plate field
|
||||
ArmorStand.setMarker port crates/horizon-client/src/entity_nbt.rs::armor_stand_from_nbt Marker tag
|
||||
ArmorStand.isMarker skip:other accessor; reads the marker field
|
||||
ArmorStand.setBit skip:other packed-flag helper; Horizon keeps separate bools and packs them when sent
|
||||
ArmorStand.skipAttackInteraction missing minor: adventure-mode protection on stand hits is not checked
|
||||
ArmorStand.onSyncedDataUpdated skip:other client refresh when flags sync; bounds are computed on demand
|
||||
ArmorStand.getDimensionsMarker inline crates/horizon-client/src/game/armor_stands.rs::Game::armor_stand_hit marker stands are skipped, so they have no box
|
||||
ArmorStand.getLightProbePosition skip:ui render light probe for markers; drawing only
|
||||
ArmorStand.setArmorStandPose port crates/horizon-client/src/entity_nbt.rs::armor_stand_from_nbt Pose tag read into the six pose parts
|
||||
ArmorStand.getArmorStandPose port crates/horizon-client/src/entity_nbt.rs::armor_stand_to_nbt Pose tag written from the six pose parts
|
||||
BlockAttachedEntity.skipAttackInteraction inline crates/horizon-client/src/game/cushions.rs::Game::attack_cushion the mayInteract gate and the break; frames and paintings keep their own copies
|
||||
BlockAttachedEntity.kill inline crates/horizon-client/src/game/cushions.rs::Game::break_cushion removal and the break; no game event
|
||||
BlockAttachedEntity.ignoreExplosion missing player: explosions do not break paintings, item frames, cushions or armour stands; only players, mobs, items, TNT and minecarts are hurt
|
||||
BlockAttachedEntity.move missing minor: a piston push does not break a cushion, painting or frame here
|
||||
BlockAttachedEntity.push missing minor: a push from a blast or piston does not break a cushion, painting or frame
|
||||
BlockAttachedEntity.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::cushion_from_nbt gap: minor: no 16-block check on block_pos; the stored block is used as is
|
||||
Cushion.isBreakingDeniedFor inline crates/horizon-client/src/game/cushions.rs::Game::attack_cushion the may_build gate
|
||||
Cushion.isBreakingDeniedAtPosFor inline crates/horizon-client/src/game/cushions.rs::Game::attack_cushion the mayInteract gate, folded into the one may_build check
|
||||
Cushion.tickAtCheckInterval inline crates/horizon-client/src/game/cushions.rs::Game::tick_cushions gap: minor: fluid effects not applied; fire and survival checked every 100 ticks
|
||||
Cushion.thunderHit missing player: a lightning strike does not break a cushion
|
||||
Cushion.setPos skip:other position field write; the block position is kept apart in cushion.pos
|
||||
Cushion.canBePlacedAt port crates/horizon-client/src/cushion.rs::can_place
|
||||
Cushion.wouldSurviveAt port crates/horizon-client/src/cushion.rs::survives
|
||||
Cushion.hasAnchorBelow inline crates/horizon-client/src/cushion.rs::survives anchor scan under the box
|
||||
Cushion.isCoveredBySuffocatingBlocks inline crates/horizon-client/src/cushion.rs::survives per-block suffocating test through PlacementWorld::suffocating
|
||||
Cushion.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::cushion_from_nbt color tag read
|
||||
Cushion.get port crates/horizon-client/src/game/pick_entity.rs::Game::entity_pick_result the pick gives the cushion item in its colour
|
||||
Cushion.applyImplicitComponent port crates/horizon-client/src/game/cushions.rs::Game::place_cushion colour from the stack's cushion colour data
|
||||
HangingEntity.onSyncedDataUpdated skip:other client resync of the facing; Horizon keeps the facing as a field
|
||||
HangingEntity.setDirection skip:other facing field write; bounds are derived on demand from the facing
|
||||
HangingEntity.recalculateBoundingBox skip:other bounds are derived on demand from the facing
|
||||
HangingEntity.calculateSupportBox inline crates/horizon-client/src/game/paintings.rs::Game::painting_survives support box moved half a block into the wall
|
||||
HangingEntity.canCoexist port crates/horizon-client/src/game/paintings.rs::Game::painting_survives gap: minor: only other paintings are checked for overlap; item frames and the same-facing rule are not
|
||||
HangingEntity.hasLevelCollision port crates/horizon-client/src/game/paintings.rs::Game::painting_survives block collision of the box
|
||||
|
@@ -0,0 +1,139 @@
|
||||
ItemFrame.defineSynchedData skip:other entity data defaults; ItemFrame starts with item None and rotation 0 in place_item_frame
|
||||
ItemFrame.setDirection inline crates/horizon-client/src/game/frames.rs::Game::frame_geometry facing sets the pose in frame_geometry; the box comes from ItemFrame::bounds
|
||||
ItemFrame.recalculateBoundingBox inline crates/horizon-client/src/entities.rs::ItemFrame::bounds boxes are computed on demand; the position sync codec is network-only
|
||||
ItemFrame.shouldDamageDropItem missing player: explosions never reach item frames here, so a blast does not break a frame and drop its item as in vanilla
|
||||
ItemFrame.canHurtWhenFixed missing minor: creative players cannot break a fixed frame (vanilla lets them); attack_frame returns early for fixed frames
|
||||
ItemFrame.hurtClient inline crates/horizon-client/src/game/frames.rs::Game::attack_frame gap: minor: no separate client-side fixed-frame gate; the creative exception is missing
|
||||
ItemFrame.removeFramedMap inline crates/horizon-client/src/game/maps.rs::Game::lan_map_updates frame map markers come from item_frames each tick, so a removed frame needs no step
|
||||
ItemFrame.getSlot missing minor: no slot 0 access for item frames in the item command path
|
||||
ItemFrame.onSyncedDataUpdated skip:other network data-sync hook; the item is read from the frame field on demand
|
||||
ItemFrame.setRotation inline crates/horizon-client/src/game/frames.rs::Game::interact_frame the rotate-by-one step; the neighbour update is in frame_output_changed
|
||||
ItemFrame.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::item_frame_from_nbt gap: minor: Facing defaults to 2 where vanilla defaults to DOWN
|
||||
ItemFrame.getFrameItemStackWithData missing minor: a broken frame never carries its custom name; drop_frame_items builds a plain item_frame stack
|
||||
ItemFrame.getVisualRotationYInDegrees inline crates/horizon-client/src/game/frames.rs::Game::frame_geometry the 45 degree step per rotation step is drawn in frame_geometry
|
||||
LeashFenceKnotEntity.recalculateBoundingBox port crates/horizon-client/src/mobs/leash.rs::knot_state position and box from the block position
|
||||
LeashFenceKnotEntity.getOrCreateKnot inline crates/horizon-client/src/game/leads.rs::Game::interact_knot knots are not entities in game; the knot is used when a lead is tied
|
||||
LeashFenceKnotEntity.getKnot inline crates/horizon-client/src/game/leads.rs::Game::interact_knot the existing knot is the leashed-holder check at the fence position
|
||||
LeashFenceKnotEntity.createKnot inline crates/horizon-client/src/game/leads.rs::Game::interact_knot no in-game knot entity is created; LAN knot ids are assigned in lan_assign_ids
|
||||
Painting.defineSynchedData skip:other entity data default variant; Horizon picks the variant in place_painting
|
||||
Painting.get port crates/horizon-client/src/game/paintings.rs::PaintingVariants::get lookup of the variant by id; there is no component getter
|
||||
Painting.applyImplicitComponent missing minor: a painting variant component on the item is ignored; placement always picks a random fitting variant
|
||||
Painting.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::painting_from_nbt
|
||||
Painting.dropItem port crates/horizon-client/src/game/paintings.rs::Game::break_painting gap: minor: the dropped painting item keeps no custom name
|
||||
PaintingVariants.register skip:data registry bootstrap; variants load from the data files in PaintingVariants::load
|
||||
FallingBlockEntity.callOnBrokenAfterFall inline crates/horizon-client/src/game/falling_damage.rs::Game::finish_falling_block anvil 1029 and brushable 2001 events are here; gap: minor: no dripstone landing sound on a broken landing
|
||||
FallingBlockEntity.causeFallDamage port crates/horizon-client/src/game/falling_damage.rs::Game::finish_falling_block gap: minor: pointed dripstone uses the generic falling_block damage kind
|
||||
FallingBlockEntity.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::falling_block_to_nbt gap: minor: TileEntityData of the carried block is not written
|
||||
FallingBlockEntity.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::falling_block_from_nbt gap: minor: TileEntityData is not read; damage settings come from falling_block::Damage::from_nbt
|
||||
FallingBlockEntity.fillCrashReportCategory skip:debug crash report detail
|
||||
FallingBlockEntity.getTypeName missing player: death texts for falling blocks cannot name the block (Falling Anvil) because the hit has no source entity
|
||||
FallingBlockEntity.teleport missing unsure: no portal travel for falling blocks found in nether_portal.rs and no end-arrival tick
|
||||
ItemEntity.restoreFrom skip:other the ItemEntity value moves between levels with thrower kept; nothing to copy
|
||||
ItemEntity.setFluidMovement inline crates/horizon-client/src/entities.rs::ItemEntity::tick water and lava drag and buoyancy are applied in tick
|
||||
ItemEntity.fireImmune inline crates/horizon-client/src/entities.rs::ItemEntity::environment_tick fire immunity via resists_fire in environment_tick
|
||||
ItemEntity.hurtClient skip:other client-side hurt prediction; items are not attackable, so there is no client-side hurt path
|
||||
ItemEntity.hurtServer inline crates/horizon-client/src/game/explosion.rs::Game::explosion_hurt_entities gap: minor: explosions destroy items at damage 5 without subtracting health; fire and lava hurt are in environment_tick
|
||||
ItemEntity.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::item_entity_to_nbt
|
||||
ItemEntity.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::item_entity_from_nbt a missing Item returns None, which matches the discard
|
||||
ItemEntity.getName missing minor: a dropped item's name (custom or item name) is not used anywhere in Horizon
|
||||
ItemEntity.teleport inline crates/horizon-client/src/entities.rs::merge_with_neighbours the arrival merge is the normal per-tick merge, not a teleport step
|
||||
ItemEntity.getVisualRotationYInDegrees inline crates/horizon-client/src/game/item_draw.rs::Game::dropped_item_geometry spin is applied in radians there; no degree conversion
|
||||
ItemEntity.getSlot missing unsure: no slot 0 access for dropped items found in commands.rs
|
||||
PrimedTnt.defineSynchedData skip:other fuse and block state are struct fields; spawn sets fuse 80; the block is always TNT
|
||||
PrimedTnt.explode inline crates/horizon-client/src/game/tnt.rs::Game::tick_tnt gap: minor: power fixed at 4; no explosion_power and no used-portal damage calculator
|
||||
PrimedTnt.addAdditionalSaveData missing minor: primed TNT is not written to saves, so a lit TNT is lost on save and reload
|
||||
PrimedTnt.restoreFrom missing minor: PrimedTnt has no owner field, so the igniter is not kept through portal moves
|
||||
PrimedTnt.teleport missing unsure: no used-portal flag on PrimedTnt; the portal damage calculator is not applied
|
||||
Blaze.registerGoals port crates/horizon-client/src/mobs/nether.rs::register_blaze gap: minor: MoveTowardsRestriction goal (priority 5) is not registered
|
||||
Blaze.createAttributes skip:data attribute defaults come from data tables
|
||||
Blaze.isCharged inline crates/horizon-client/src/mobs/nether.rs::BlazeAttack::tick the charged state is m.extra.flag, set in the attack goal tick
|
||||
Blaze.setCharged inline crates/horizon-client/src/mobs/nether.rs::BlazeAttack::tick same flag, set when a charge starts and ends
|
||||
Creeper.registerGoals port crates/horizon-client/src/mobs/hostile.rs::register
|
||||
Creeper.getMaxFallDistance missing minor: the creeper's own comfortable fall distance is not used; nav uses the generic mob value
|
||||
Creeper.defineSynchedData skip:other swell, powered and ignited are Mob fields
|
||||
Creeper.addAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt gap: minor: Fuse and ExplosionRadius are written as constants 30 and 3, not the creeper's values
|
||||
Creeper.thunderHit port crates/horizon-client/src/game/lightning.rs::Game::thunder_hit
|
||||
Creeper.spawnLingeringCloud missing player: a creeper that explodes with potion effects leaves no lingering area cloud
|
||||
ElderGuardian.createAttributes skip:data attribute defaults come from data tables
|
||||
Enderman.registerGoals port crates/horizon-client/src/mobs/enderman.rs::register gap: minor: no anger-reset target goal (priority 4)
|
||||
Enderman.createAttributes skip:data attribute defaults come from data tables
|
||||
Enderman.setTarget inline crates/horizon-client/src/mobs/enderman.rs::custom_server_ai_step the creepy flag is set per tick there; the attack speed boost is attacking_speed
|
||||
Enderman.defineSynchedData skip:other carried block, creepy and stared-at state are Mob extra fields
|
||||
Enderman.playStareSound inline crates/horizon-client/src/mobs/enderman.rs::LookForPlayer::tick gap: minor: the 400-tick throttle of the stare sound is not seen
|
||||
Enderman.onSyncedDataUpdated skip:other client sync hook; the stare sound is played server-side from LookForPlayer
|
||||
Enderman.addAdditionalSaveData missing minor: the carried block is not written to saves
|
||||
Enderman.readAdditionalSaveData missing minor: the carried block is not read from saves
|
||||
Enderman.canRandomlyTeleportTo port crates/horizon-client/src/mobs/enderman.rs::teleport_to the water check on the ground block
|
||||
Enderman.repeatedlyTryToTeleport port crates/horizon-client/src/mobs/enderman.rs::ai_step pending teleports retry up to 64 times
|
||||
Enderman.dropCustomDeathLoot missing player: an Enderman killed while holding a block drops no block
|
||||
Enderman.hurtWithCleanWater missing player: a thrown splash water potion does nothing to an Enderman; vanilla hurts it
|
||||
Enderman.EndermanLeaveBlockGoal.canPlaceBlock inline crates/horizon-client/src/mobs/enderman.rs::LeaveBlock::tick gap: minor: the place-on blacklist tag and the carried block canSurvive check are not in the tick
|
||||
Endermite.registerGoals port crates/horizon-client/src/mobs/ai.rs::register Hostile family defaults; gap: unsure: the ClimbOnTopOfPowderSnow goal is not checked
|
||||
Endermite.createAttributes skip:data attribute defaults come from data tables
|
||||
Endermite.checkEndermiteSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules the Endermite and Silverfish arm
|
||||
Ghast.registerGoals port crates/horizon-client/src/mobs/nether.rs::register_ghast
|
||||
Ghast.isInvulnerableTo inline crates/horizon-client/src/mobs.rs::Mob::damage_with reflected fireball and fire immunity checks are in damage_with
|
||||
Ghast.createAttributes skip:data attribute defaults come from data tables
|
||||
Ghast.checkGhastSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules
|
||||
Ghast.RandomFloatAroundGoal.getSuitableFlyToPosition port crates/horizon-client/src/mobs/happy_ghast.rs::FloatAround::start gap: minor: plain Ghast uses one random point in RandomFloatAround::start; the 64-try search runs for happy ghasts here
|
||||
Ghast.RandomFloatAroundGoal.isGoodTarget port crates/horizon-client/src/mobs/happy_ghast.rs::FloatAround::good
|
||||
Ghast.RandomFloatAroundGoal.chooseRandomPosition inline crates/horizon-client/src/mobs/happy_ghast.rs::FloatAround::start the random point pick is in start
|
||||
Ghast.RandomFloatAroundGoal.chooseRandomPositionWithRestriction inline crates/horizon-client/src/mobs/happy_ghast.rs::FloatAround::start the home check is in start; plain ghasts have no home
|
||||
Guardian.registerGoals port crates/horizon-client/src/mobs/guardian.rs::register gap: minor: no MoveTowardsRestriction goal (5) and no look-at-guardian goal (8)
|
||||
Guardian.createAttributes skip:data attribute defaults come from data tables
|
||||
Guardian.defineSynchedData skip:other moving flag and attack target are Mob extra state read by beam
|
||||
Guardian.hasActiveAttackTarget inline crates/horizon-client/src/mobs/guardian.rs::beam the beam is shown while the flag and target are set
|
||||
Guardian.getActiveAttackTarget inline crates/horizon-client/src/mobs/guardian.rs::beam the target is m.ai.target
|
||||
Guardian.checkGuardianSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules the Guardian and ElderGuardian arm
|
||||
Guardian.GuardianAttackGoal.canContinueToUse port crates/horizon-client/src/mobs/guardian.rs::GuardianAttack::can_continue
|
||||
Guardian.GuardianAttackSelector.test inline crates/horizon-client/src/mobs/guardian.rs::register the selector is the player, squid and axolotl beyond 9 filters in register
|
||||
Monster.updateNoActionTime missing minor: noActionTime is not kept, so the light-driven idle timer that feeds despawn is absent
|
||||
Monster.getProjectile missing unsure: no held-ammo choice for mobs found in mobs/*.rs
|
||||
PatrollingMonster.addAdditionalSaveData port crates/horizon-client/src/mobs/raider.rs::write_nbt
|
||||
PatrollingMonster.readAdditionalSaveData port crates/horizon-client/src/mobs/raider.rs::read_nbt
|
||||
PatrollingMonster.checkPatrollingMonsterSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules the Pillager arm: block light 8 or less, then mob rules
|
||||
PatrollingMonster.LongDistancePatrolGoal.findPatrolCompanions port crates/horizon-client/src/mobs/raider.rs::companions
|
||||
Phantom.registerGoals port crates/horizon-client/src/mobs/phantom.rs::register
|
||||
Phantom.updatePhantomSizeInfo missing minor: vanilla sets size only from NBT, and Horizon has no size, so no scale or attack bonus
|
||||
Phantom.finalizeSpawn inline crates/horizon-client/src/mobs/phantom.rs::register the anchor 5 blocks above is set at creation; size 0
|
||||
Phantom.readAdditionalSaveData missing unsure: anchor_pos and size are not read for phantoms
|
||||
Phantom.addAdditionalSaveData missing unsure: anchor_pos and size are not written for phantoms
|
||||
Phantom.getDefaultDimensions missing minor: no size scale on the phantom box; size is 0 unless NBT sets it
|
||||
Phantom.PhantomBodyRotationControl.clientTick inline crates/horizon-client/src/mobs/phantom.rs::move_control the head yaw follows the body yaw there
|
||||
Phantom.PhantomMoveTargetGoal.touchingTarget inline crates/horizon-client/src/mobs/phantom.rs::CircleAroundAnchor::tick the squared distance under 4 check near the move target
|
||||
Phantom.PhantomSweepAttackGoal.canContinueToUse port crates/horizon-client/src/mobs/phantom.rs::SweepAttack::can_continue the cat hiss and scare check
|
||||
Ravager.registerGoals port crates/horizon-client/src/mobs/ravager.rs::register
|
||||
Ravager.updateControlFlags missing unsure: no rider control-flag switch for ravagers in ravager.rs
|
||||
Ravager.createAttributes skip:data attribute defaults come from data tables
|
||||
Ravager.addAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt AttackTick, StunTick and RoarTick are written there
|
||||
Ravager.readAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_from_nbt the same three tick values are read there
|
||||
Ravager.stunEffect port crates/horizon-client/src/mobs/ravager.rs::ai_step the stun particle is emitted from ai_step
|
||||
Ravager.hasLineOfSight missing unsure: no stunned or roaring line-of-sight cut-off in ravager.rs
|
||||
Ravager.applyRoarKnockbackClient inline crates/horizon-client/src/mobs/ravager.rs::roar the roar push is applied in roar
|
||||
Ravager.strongKnockback inline crates/horizon-client/src/mobs/ravager.rs::roar the push of 4 along the direction is in roar
|
||||
Ravager.addRoarParticleEffects inline crates/horizon-client/src/mobs/ravager.rs::roar the poof particles are emitted in roar
|
||||
Shulker.registerGoals port crates/horizon-client/src/mobs/shulker.rs::register gap: minor: no defense target goal (priority 3)
|
||||
Shulker.defineSynchedData skip:other attach face, peek and colour are Mob extra fields
|
||||
Shulker.readAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_from_nbt AttachFace, Peek and Color are read there
|
||||
Shulker.addAdditionalSaveData inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt AttachFace, Peek and Color are written there
|
||||
Shulker.findNewAttachment inline crates/horizon-client/src/mobs/shulker.rs::tick keeps its face or teleports in tick, through attachable and teleport
|
||||
Shulker.makeBoundingBox port crates/horizon-client/src/mobs/shulker.rs::progress_aabb
|
||||
Shulker.getDefaultDimensions inline crates/horizon-client/src/mobs/shulker.rs::progress_aabb gap: minor: the down-face height scale is not seen here
|
||||
Shulker.startRiding missing unsure: no attach-face reset to DOWN when a shulker mounts a vehicle in shulker.rs
|
||||
Shulker.stopRiding missing unsure: no body yaw reset after a shulker dismounts in shulker.rs
|
||||
Shulker.move missing unsure: no shulker-box move type (teleport) found in the piston code
|
||||
Shulker.findAttachableSurface port crates/horizon-client/src/mobs/shulker.rs::attachable
|
||||
Shulker.isPositionBlocked inline crates/horizon-client/src/mobs/shulker.rs::can_stay_at the blocked-position check is part of can_stay_at
|
||||
Shulker.onSyncedDataUpdated skip:other network sync hook; the box is computed from the face on demand
|
||||
Shulker.getRenderPosition missing unsure: no render slide after a shulker teleport in shulker.rs
|
||||
Shulker.setVariant inline crates/horizon-client/src/mobs/shulker.rs::register colour comes from spawn data; NO_COLOR when unset
|
||||
Shulker.getColor inline crates/horizon-client/src/mobs/shulker.rs::texture colour is read from extra.color for the texture
|
||||
Shulker.get skip:other component getter; Horizon reads extra.color directly
|
||||
Shulker.applyImplicitComponent missing minor: a shulker spawned with a SHULKER_COLOR component ignores it
|
||||
Shulker.ShulkerDefenseAttackGoal.getTargetSearchArea missing minor: shulkers do not defend nearby shulkers; there is no defense target goal
|
||||
Shulker.ShulkerNearestAttackGoal.getTargetSearchArea inline crates/horizon-client/src/mobs/shulker.rs::register the 4-deep search box is the when filter in register
|
||||
Shulker.ShulkerPeekGoal.canContinueToUse port crates/horizon-client/src/mobs/shulker.rs::Peek::can_continue
|
||||
Silverfish.registerGoals port crates/horizon-client/src/mobs/hostile.rs::register
|
||||
Silverfish.createAttributes skip:data attribute defaults come from data tables
|
||||
Silverfish.getWalkTargetValue missing minor: no infested-host path value (10) for silverfish in ai.rs walk_target_value
|
||||
Silverfish.checkSilverfishSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules the Endermite and Silverfish arm
|
||||
|
@@ -0,0 +1,149 @@
|
||||
Strider.checkStriderSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules strider arm: climbs lava upward, then needs air above
|
||||
Strider.onSyncedDataUpdated skip:other client copy of the boost sync; Horizon keeps one boost state on the server side (equine.rs boost)
|
||||
Strider.defineSynchedData skip:java SynchedEntityData builder; the synced values are Mob fields (extra.flag, extra.counter2)
|
||||
Strider.canUseSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_use_slot saddle needs alive and adult
|
||||
Strider.canDispenserEquipIntoSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_dispenser_equip saddle or pick-up loot
|
||||
Strider.getEquipSound port crates/horizon-client/src/game/dispenser.rs::equip_sound strider saddle sound
|
||||
Strider.registerGoals port crates/horizon-client/src/mobs/strider.rs::register same goal priorities and speeds
|
||||
Strider.setSuffocating inline crates/horizon-client/src/mobs/strider.rs::pre_tick stores the flag; the slowdown is applied on read (strider::movement_speed)
|
||||
Strider.getPassengerAttachmentPoint port crates/horizon-client/src/mobs/riders.rs::passenger_attachment gap: minor: client-only walk bob of the rider is not applied (up to 0.06 block)
|
||||
Strider.getDismountLocationForPassenger inline crates/horizon-client/src/game/mounts.rs::Game::dismount_mount gap: player: no lava check and no dismount floor or pose test; a rider can land in lava or in a blocked spot
|
||||
Strider.tickRidden port crates/horizon-client/src/mobs/equine.rs::ridden_step strider branch: rider yaw, half pitch, boost factor, cold slowdown
|
||||
Strider.playStepSound port crates/horizon-client/src/mobs/ai.rs::step_sound lava or normal step sound
|
||||
Strider.isBeingTempted inline crates/horizon-client/src/mobs/ai.rs::play_ambient the Tempt goal running check is folded into the ambient sound guard
|
||||
Strider.canAddPassenger missing minor: a player can still board a saddled strider whose head is in lava; vanilla refuses (isEyeInFluid LAVA)
|
||||
Strider.getLeashOffset port crates/horizon-client/src/mobs/leash.rs::leash_offset gap: minor: the strider 0.6 x eye height override is not applied; the default eye-height offset is used
|
||||
Strider.StriderPathNavigation.createPathFinder port crates/horizon-client/src/mobs/nav.rs::Navigation::evaluator ground nav kind gets the walk evaluator, as WalkNodeEvaluator
|
||||
Strider.StriderPathNavigation.isStableDestination port crates/horizon-client/src/mobs/nav.rs::Mob::stable_destination lava counts as stable for lava walkers
|
||||
Vex.registerGoals port crates/horizon-client/src/mobs/vex.rs::register float, charge, random move, look goals, owner and player targets
|
||||
Vex.restoreFrom missing minor: a vex restored after a dimension trip keeps no owner link; Horizon has no mob restoreFrom
|
||||
Vex.getVexFlag inline crates/horizon-client/src/mobs/vex.rs::Charge::can_continue the charging bit is the plain extra.flag; there is no flags byte
|
||||
Vex.setVexFlag inline crates/horizon-client/src/mobs/vex.rs::Charge::start start sets extra.flag; stop and tick clear it
|
||||
Vex.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize Vex arm: populate (sword) then enchant
|
||||
Vex.populateDefaultEquipmentSlots port crates/horizon-client/src/mobs/finalize.rs::Ctx::populate iron sword in hand with drop chance 0
|
||||
Witch.registerGoals port crates/horizon-client/src/mobs/witch.rs::register gap: minor: raiders that hurt a witch are still targeted back (vanilla ignores them)
|
||||
Witch.handleEntityEvent missing player: a witch shows purple magic puffs about once a minute while idle; not drawn here (the RNG draw is kept in ai_step)
|
||||
Witch.getDamageAfterMagicAbsorb missing player: witches take full magic, indirect magic, sonic boom and thorns damage; vanilla cuts it to 15% and ignores its own hits
|
||||
Zoglin.initCoreActivity inline crates/horizon-client/src/mobs/piglin.rs::register_zoglin gap: minor: look-at-target and move-to-target sinks are not separate; the goal set stands in for them
|
||||
Zoglin.initIdleActivity inline crates/horizon-client/src/mobs/piglin.rs::register_zoglin gap: minor: idle is a stroll only; no look-target sometimes and no do-nothing pauses
|
||||
Zoglin.initFightActivity inline crates/horizon-client/src/mobs/piglin.rs::register_zoglin gap: player: melee cooldown is 20 ticks; vanilla is 40 for adults and 15 for babies, so zoglins hit faster
|
||||
Zoglin.findNearestValidAttackTarget inline crates/horizon-client/src/mobs/piglin.rs::register_zoglin target filter: not a creeper or a zoglin
|
||||
Zoglin.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize Zoglin arm: 20 percent start as babies
|
||||
Zoglin.createAttributes skip:data attribute defaults come from the data tables (mobs.rs attr lookup)
|
||||
Zoglin.doHurtTarget port crates/horizon-client/src/mobs/piglin.rs::hoglin_hurt_target headbutt event, zoglin attack sound, hurt and throw
|
||||
Zoglin.hurtServer inline crates/horizon-client/src/mobs/piglin.rs::register_zoglin gap: minor: HurtByTarget sets the attacker as target with no 4-block check against a much nearer current target
|
||||
Zoglin.setAttackTarget inline crates/horizon-client/src/mobs/piglin.rs::register_zoglin gap: minor: target has no 200-tick expiry; Horizon sets the target directly
|
||||
Zoglin.updateActivity missing player: a zoglin that starts a fight does not play its angry grunt (zoglin.angry)
|
||||
Zoglin.customServerAiStep inline crates/horizon-client/src/mobs/piglin.rs::ai_step gap: minor: the brain tick is not run; the zoglin goal set runs in the general AI loop
|
||||
Zoglin.setBaby port crates/horizon-client/src/mobs/finalize.rs::set_baby Zoglin arm: non-ageable baby age and 0.5 attack damage
|
||||
Zoglin.handleEntityEvent port crates/horizon-client/src/mobs/piglin.rs::client_event event 4 starts the headbutt; the attack sound comes from hoglin_hurt_target
|
||||
Zoglin.getAmbientSound missing player: a zoglin with a target grunts its ambient sound, not the angry one (zoglin.angry)
|
||||
Breeze.createAttributes skip:data attribute defaults come from the data tables (mobs.rs attr lookup)
|
||||
Breeze.makeBrain port crates/horizon-client/src/mobs/monster_brain.rs::init breezes get the fight default activity
|
||||
Breeze.onSyncedDataUpdated port crates/horizon-client/src/mobs/breeze.rs::ai_step client pose change restarts the matching animation
|
||||
Breeze.resetAnimations inline crates/horizon-client/src/mobs/breeze.rs::ai_step the stop calls of the pose-change branch
|
||||
Breeze.emitJumpTrailParticles missing player: no block-dust trail behind a long jump (about 5 ticks of particles)
|
||||
Breeze.emitGroundParticles missing player: no block-dust puffs at its feet while it stands, shoots, inhales or lands; Horizon only draws the random number
|
||||
Breeze.playWhirlSound port crates/horizon-client/src/mobs/breeze.rs::tick whirl sound on a random clock, as a local sound
|
||||
Breeze.deflection port crates/horizon-client/src/game/creatures.rs::Game::tick_projectiles breeze turns projectiles back, except wind charges
|
||||
Breeze.getHurtBy port crates/horizon-client/src/mobs/monster_brain.rs::hurt_by_entity the living source of the last hurt
|
||||
Breeze.registerDebugValues skip:debug debug subscription values
|
||||
BreezeAi.initCoreActivity port crates/horizon-client/src/mobs/monster_brain.rs::breeze_packages core swim and look-at-target sink
|
||||
BreezeAi.initIdleActivity port crates/horizon-client/src/mobs/monster_brain.rs::breeze_packages idle: attack nearest, attack hurt-by, slide to target, do nothing or stroll
|
||||
BreezeAi.initFightActivity port crates/horizon-client/src/mobs/monster_brain.rs::breeze_packages fight: stop, shoot, long jump, shoot when stuck, slide; the entry gate is fight_requirements
|
||||
LongJump.canStillUse inline crates/horizon-client/src/mobs/monster_brain.rs::B::tick_or_stop keep-running check: not standing and no jump cooldown
|
||||
LongJump.start inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start inhaling memory and pose, charge sound, look at the jump target
|
||||
LongJump.isFinishedInhaling inline crates/horizon-client/src/mobs/monster_brain.rs::long_jump_tick inhaling memory gone and pose INHALING
|
||||
LongJump.isFinishedJumping inline crates/horizon-client/src/mobs/monster_brain.rs::long_jump_tick landed on the ground or in water
|
||||
LongJump.outOfAggroRange inline crates/horizon-client/src/mobs/monster_brain.rs::long_jump_can_run follow-range check drops the target
|
||||
LongJump.tooCloseForJump inline crates/horizon-client/src/mobs/monster_brain.rs::long_jump_can_run distance minus 4 at most zero
|
||||
Shoot.checkExtraStartConditions inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start standing pose and target within range
|
||||
Shoot.canStillUse inline crates/horizon-client/src/mobs/monster_brain.rs::B::tick_or_stop target and shoot memory still present
|
||||
Shoot.start inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start shooting pose, 15 tick charge, inhale sound
|
||||
Shoot.stop inline crates/horizon-client/src/mobs/monster_brain.rs::B::do_stop back to standing and 10 tick cooldown
|
||||
Shoot.isTargetWithinRange inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start squared distance under 256
|
||||
Slide.checkExtraStartConditions inline crates/horizon-client/src/mobs/monster_brain.rs::B::try_start on ground, not in water, standing
|
||||
Slide.randomPointInMiddleCircle port crates/horizon-client/src/mobs/monster_brain.rs::slide_start the middle-circle branch of the slide target
|
||||
Creaking.defineSynchedData skip:java SynchedEntityData builder; the synced values are Mob fields (extra.ints, flags)
|
||||
Creaking.createAttributes skip:data attribute defaults come from the data tables (mobs.rs attr lookup)
|
||||
Creaking.setupAnimationStates port crates/horizon-client/src/mobs/creaking.rs::animate attack, invulnerability and tear-down animations
|
||||
Creaking.creakingDeathEffects port crates/horizon-client/src/mobs/creaking_heart.rs::remove_protector gap: minor: no blameSourceForDamage or die(); health is set to 0 and the twitch sound plays
|
||||
Creaking.canUsePortal missing minor: a heart-bound creaking can still go through a portal; game/nether_portal.rs mob_can_use_portal has no heart check
|
||||
Creaking.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt home_pos is read back as the transient home
|
||||
Creaking.checkEyeBlink inline crates/horizon-client/src/mobs/creaking.rs::animate eye flicker timing on the dying creaking
|
||||
Creaking.knockback missing player: a creaking that a player looks at still gets shoved by hits; vanilla ignores knockback while it cannot move (Mob::knockback has no check)
|
||||
Creaking.CreakingPathNavigation.createPathFinder missing minor: no home-distance node evaluator; paths do not block nodes more than 32 blocks from the heart
|
||||
Creaking.HomeNodeEvaluator.getPathType missing minor: nodes more than 32 blocks from home are not marked blocked
|
||||
CreakingAi.initCoreActivity port crates/horizon-client/src/mobs/monster_brain.rs::creaking_packages core swim, look-at-target and move sink
|
||||
CreakingAi.initIdleActivity port crates/horizon-client/src/mobs/monster_brain.rs::creaking_packages idle: attack active creakings, look sometimes, stroll, look-walk or do nothing
|
||||
CreakingAi.initFightActivity port crates/horizon-client/src/mobs/monster_brain.rs::creaking_packages fight: walk to target, melee on a 40 tick cooldown, stop when unreachable
|
||||
AbstractCubeMob.registerGoals port crates/horizon-client/src/mobs/cube.rs::register float, random direction, keep jumping, attack goal and player and golem targets
|
||||
AbstractCubeMob.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt Size stored minus one, and wasOnGround
|
||||
AbstractCubeMob.refreshDimensions skip:other bounds are read from the size on each use, so there is no separate refresh; the position is never reset
|
||||
AbstractCubeMob.onSyncedDataUpdated missing unsure: remote.rs applies no size sync to cubes; local play sets the size directly
|
||||
AbstractCubeMob.setUpSplitCube port crates/horizon-client/src/game/creatures.rs::Game::mob_died gap: minor: children get half size and the same fixed offsets, but no random yaw
|
||||
AbstractCubeMob.push missing player: a slime or magma cube that bumps into an iron golem does not hurt it
|
||||
AbstractCubeMob.dealDamage inline crates/horizon-client/src/mobs/cube.rs::ai_step gap: player: only the player touch hits; a mob target such as an iron golem takes no damage
|
||||
AbstractCubeMob.getPassengerAttachmentPoint port crates/horizon-client/src/mobs/riders.rs::passenger_attachment gap: minor: the rider sits at full height; vanilla lowers it by size/64 per block
|
||||
AbstractCubeMob.finalizeSpawn port crates/horizon-client/src/mobs/cube.rs::finalize spawn size 1, 2 or 4, rolled by the slime and magma cube arm of spawning.rs
|
||||
AbstractCubeMob.CubeMobAttackGoal.canContinueToUse port crates/horizon-client/src/mobs/cube.rs::CubeAttack::can_continue tired timer runs down while the target can still be attacked
|
||||
MagmaCube.addTargetingGoals port crates/horizon-client/src/mobs/cube.rs::register player within 4 blocks in height, and iron golems
|
||||
MagmaCube.finalizeSpawn port crates/horizon-client/src/mobs/cube.rs::finalize same spawn size roll as the other cubes
|
||||
Slime.addTargetingGoals port crates/horizon-client/src/mobs/cube.rs::register same targets as magma cubes
|
||||
Slime.finalizeSpawn port crates/horizon-client/src/mobs/cube.rs::finalize same spawn size roll as the other cubes
|
||||
SulfurCube.defineSynchedData skip:java SynchedEntityData builder; the synced values are Mob fields (extra.counter2, flags)
|
||||
SulfurCube.addBehaviourGoals port crates/horizon-client/src/mobs/sulfur_cube.rs::register temptation goal at 2 and search-for-items at 3
|
||||
SulfurCube.onSyncedDataUpdated skip:other client copy of the fuse sync; the fuse is mob state (sulfur_cube::fuse)
|
||||
SulfurCube.saveToBucketTag inline crates/horizon-client/src/mobs/sulfur_cube.rs::to_nbt the bucket keeps the mob NBT, including Age and AgeLocked
|
||||
SulfurCube.travelInFluid inline crates/horizon-client/src/mobs/sulfur_cube.rs::ai_step buoyancy bob runs in the tick, not in the fluid travel
|
||||
SulfurCube.loadFromBucketTag inline crates/horizon-client/src/mobs/sulfur_cube.rs::from_nbt reads Age and AgeLocked back
|
||||
SulfurCube.requiresCustomPersistence port crates/horizon-client/src/mobs/ai.rs::requires_custom_persistence holding a block or let out of a bucket
|
||||
SulfurCube.hurtServer port crates/horizon-client/src/mobs/sulfur_cube.rs::accepts_damage fire or explosion primes; a held block shrugs off blows and only knocks back
|
||||
SulfurCube.matchingArchetypes port crates/horizon-client/src/mobs/sulfur_cube.rs::archetype_of one archetype per item, not a list
|
||||
SulfurCube.tickFuse inline crates/horizon-client/src/mobs/sulfur_cube.rs::ai_step gap: minor: fuse countdown and blast, but no leash drop or on-death effects at the blast
|
||||
SulfurCube.primeWhenOnPoweredPosition missing player: an explosive cube sitting on a powered block does not prime itself; no signal check here
|
||||
SulfurCube.customServerAiStep port crates/horizon-client/src/mobs/sulfur_cube.rs::ai_step timers, buoyancy, facing, growing up and player push
|
||||
SulfurCube.collectEquipmentChanges inline crates/horizon-client/src/mobs/sulfur_cube.rs::ai_step goals are disabled while a block is held; archetype effects are read on demand, not applied as modifiers
|
||||
SulfurCube.equipItem port crates/horizon-client/src/game/sulfur_cubes.rs::Game::interact_sulfur_cube swallows the item; the old block is ejected
|
||||
SulfurCube.applyContactDamage inline crates/horizon-client/src/mobs/sulfur_cube.rs::player_push gap: minor: contact damage reaches only the player, not other entities
|
||||
SulfurCube.isEquippableInSlot port crates/horizon-client/src/mobs/sulfur_cube.rs::swallowable swallowable items only
|
||||
SulfurCube.canUseSlot port crates/horizon-client/src/game/dispenser.rs::mob_can_use_slot body slot needs alive and adult
|
||||
SulfurCube.canHoldItem port crates/horizon-client/src/game/sulfur_cubes.rs::Game::sulfur_cube_pickups empty body, adult and not on a pickup timer
|
||||
SulfurCube.pickUpItem port crates/horizon-client/src/game/sulfur_cubes.rs::Game::sulfur_cube_pickups takes one item from the ground into the body
|
||||
SulfurCube.getBaseExperienceReward port crates/horizon-client/src/mobs/drops.rs::base_experience none for babies, 1 or 2 for adults
|
||||
SulfurCube.setSpawnSize port crates/horizon-client/src/mobs/sulfur_cube.rs::finalize babies size 1, adults size 2
|
||||
SulfurCube.getBreedOffspring inline crates/horizon-client/src/mobs/sulfur_cube.rs::ai_step gap: minor: a child is shrunk to size 1 on its next tick, not at birth
|
||||
SulfurCube.applyHorizontalHitAngleScale missing player: a hit with a block does not turn the launch by the attacker's aim; knockback takes no aim
|
||||
SulfurCube.applyVerticalHitAnglePowerTransfer missing player: the vertical share of a hit is not moved by the attacker's aim, so launches from above or below differ
|
||||
SulfurCube.applyVerticalPositionAnglePowerRotation port crates/horizon-client/src/mobs/sulfur_cube.rs::knockback feet-to-feet rotation at 0.8 with the power ratio clamp
|
||||
SulfurCube.get skip:other data component view of the body item; Horizon reads the body item directly (sulfur_cube::body)
|
||||
SulfurCube.applyImplicitComponent skip:other component copy when a cube is built from an item; Horizon sets the body directly
|
||||
SulfurCube.getLeashOffset port crates/horizon-client/src/mobs/leash.rs::leash_offset gap: minor: cube rope point is half the box height; the eye-height default is used
|
||||
SulfurCube.SulfurCubeTemptGoal.stopNavigation port crates/horizon-client/src/mobs/sulfur_cube.rs::SulfurTempt::stop stops the cube's wanted movement
|
||||
SulfurCube.SulfurCubeTemptGoal.navigateTowards port crates/horizon-client/src/mobs/sulfur_cube.rs::SulfurTempt::tick looks at the player and sets the cube's direction
|
||||
Hoglin.createAttributes skip:data attribute defaults come from the data tables (mobs.rs attr lookup)
|
||||
Hoglin.hurtServer inline crates/horizon-client/src/mobs/piglin.rs::hoglin_repellent gap: player: a hit ends the pacified state and the attacker is targeted, but a hit hoglin never retreats from piglins (no AVOID activity)
|
||||
Hoglin.ageBoundaryReached port crates/horizon-client/src/mobs/finalize.rs::age_boundary_reached baby or adult attack damage; the xp of 3 or 5 is in drops.rs::xp_reward
|
||||
Hoglin.checkHoglinSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules not spawned on a nether wart block
|
||||
Hoglin.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize 20 percent start as babies
|
||||
Hoglin.mobInteract port crates/horizon-client/src/game/creatures.rs::Game::interact_mob gap: minor: a fed hoglin does not become persistent
|
||||
Hoglin.finishConversion port crates/horizon-client/src/mobs/piglin.rs::ai_step zombification turns it into a zoglin with nausea
|
||||
Hoglin.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt gap: minor: CannotBeHunted is not written
|
||||
Hoglin.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt gap: minor: CannotBeHunted is not read
|
||||
Hoglin.getBreedOffspring port crates/horizon-client/src/game/creatures.rs::Game::breed gap: minor: the hoglin child is not made persistent
|
||||
HoglinAi.initCoreActivity inline crates/horizon-client/src/mobs/piglin.rs::register_hoglin gap: minor: look-at-target and move-to-target sinks are not separate; the goal set stands in for them
|
||||
HoglinAi.initIdleActivity inline crates/horizon-client/src/mobs/piglin.rs::register_hoglin gap: player: hoglins do not walk away from adult piglins within 8 blocks; the rest of the idle is there
|
||||
HoglinAi.initFightActivity inline crates/horizon-client/src/mobs/piglin.rs::register_hoglin gap: player: melee cooldown is 20 ticks; vanilla is 40 for adults and 15 for babies
|
||||
HoglinAi.initRetreatActivity missing player: hoglins never run from piglins; the retreat activity (avoid target, 1.3 speed) does not exist here
|
||||
HoglinAi.createIdleMovementBehaviors inline crates/horizon-client/src/mobs/piglin.rs::register_hoglin gap: minor: no look-target walk or do-nothing pauses; a plain stroll only
|
||||
HoglinAi.updateActivity missing player: no grunt when a hoglin switches activity (angry or retreat); only the ambient roll plays
|
||||
HoglinAi.onHitTarget inline crates/horizon-client/src/mobs/piglin.rs::hoglin_hurt_target gap: player: no retreat when piglins outnumber hoglins; the hit only attacks
|
||||
HoglinAi.retreatFromNearestTarget missing player: no retreat from the nearest piglin or hoglin target (part of the missing retreat activity)
|
||||
HoglinAi.setAvoidTarget missing player: no avoid target is set, so a hoglin never backs off after a piglin hit (retreat activity missing)
|
||||
HoglinAi.isPosNearNearestRepellent inline crates/horizon-client/src/mobs/piglin.rs::HoglinAvoidRepellent::can_use the 8-block repellent distance check
|
||||
HoglinAi.piglinsOutnumberHoglins missing player: the count of piglins against hoglins that starts a retreat is not kept
|
||||
HoglinAi.maybeRetaliate port crates/horizon-client/src/mobs/piglin.rs::register_hoglin gap: minor: no check for hoglin attackers or the 4-block nearer-target rule; HurtByTarget alerts others
|
||||
HoglinAi.setAttackTarget inline crates/horizon-client/src/mobs/piglin.rs::register_hoglin gap: minor: target has no 200-tick expiry and the breed target is not cleared
|
||||
HoglinAi.setAttackTargetIfCloserThanCurrent inline crates/horizon-client/src/mobs/piglin.rs::register_hoglin NearestTarget keeps the closest target and skips pacified hoglins
|
||||
HoglinAi.getSoundForActivity inline crates/horizon-client/src/mobs/ai.rs::play_ambient gap: player: the retreat grunt near repellents or while retreating is missing; the angry grunt while a target is set is ported
|
||||
Evoker.EvokerAttackSpellGoal.createSpellEntity port crates/horizon-client/src/mobs/illager.rs::fang_floor gap: minor: the sturdy-face test is a full-collision test on the block below; the fang event comes from cast_fangs
|
||||
|
@@ -0,0 +1,150 @@
|
||||
Evoker.EvokerWololoSpellGoal.canContinueToUse port crates/horizon-client/src/mobs/illager.rs::UseSpell::can_continue wololo branch: sheep target still set and warm-up left
|
||||
Evoker.EvokerWololoSpellGoal.performSpellCasting port crates/horizon-client/src/game/creatures.rs::Game::handle_mob_events MobEvent::Wololo dyes the sheep red (color 14); the event is pushed from UseSpell::tick
|
||||
Illusioner.registerGoals port crates/horizon-client/src/mobs/illusioner.rs::register same goal list and priorities
|
||||
Illusioner.createAttributes skip:data attribute defaults (speed 0.5, follow 18, health 32) live in data tables
|
||||
Illusioner.performRangedAttack port crates/horizon-client/src/mobs/undead.rs::perform_ranged_attack bow shot at speed 1.6 with the aim and uncertainty the skeleton uses
|
||||
Illusioner.getArmPose port crates/horizon-client/src/mobs/illager.rs::arm_pose spellcasting, bow when aggressive, else crossed
|
||||
Illusioner.IllusionerBlindnessSpellGoal.canUse port crates/horizon-client/src/mobs/illusioner.rs::Spell::can_use target id differs from last target, difficulty above normal
|
||||
Illusioner.IllusionerBlindnessSpellGoal.start port crates/horizon-client/src/mobs/illusioner.rs::Spell::start remembers the target id for the next can_use
|
||||
Illusioner.IllusionerBlindnessSpellGoal.performSpellCasting port crates/horizon-client/src/mobs/illusioner.rs::Spell::tick gap: minor: blindness reaches only a player target; vanilla also blinds villagers and iron golems
|
||||
Illusioner.IllusionerMirrorSpellGoal.canUse port crates/horizon-client/src/mobs/illusioner.rs::Spell::can_use not already invisible
|
||||
SpellcasterIllager.getArmPose port crates/horizon-client/src/mobs/illager.rs::arm_pose spellcasting pose while a spell is cast, else celebrating or crossed
|
||||
SpellcasterIllager.isCastingSpell skip:other getter; Horizon reads extra.counter > 0 inline
|
||||
SpellcasterIllager.setIsCastingSpell inline crates/horizon-client/src/mobs/illager.rs::UseSpell::start the spell id the client draws (extra.variant2) is set when the cast starts
|
||||
SpellcasterIllager.getCurrentSpell skip:other getter; Horizon reads extra.variant2 inline in arm_pose and shows_item
|
||||
SpellcasterIllager.SpellcasterUseSpellGoal.canContinueToUse port crates/horizon-client/src/mobs/illager.rs::UseSpell::can_continue target alive and warm-up left
|
||||
Vindicator.registerGoals port crates/horizon-client/src/mobs/illager.rs::register_vindicator break door, open door, hold ground, melee, Johnny goal
|
||||
Vindicator.createAttributes skip:data attribute defaults (speed 0.35, follow 12, health 24, attack 5) live in data tables
|
||||
Vindicator.addAdditionalSaveData missing minor: the Johnny flag is not saved; Horizon's Johnny goal tests the custom name, so only a vindicator renamed after being named Johnny differs
|
||||
Vindicator.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize raider spawn, then equipment and enchantments; the door flag it sets each tick comes from vindicator_server_ai_step
|
||||
Vindicator.populateDefaultEquipmentSlots port crates/horizon-client/src/mobs/finalize.rs::Ctx::populate iron axe unless the mob is in a raid
|
||||
Vindicator.setCustomName inline crates/horizon-client/src/mobs/illager.rs::register_vindicator gap: minor: the Johnny goal reads the current custom name each tick; vanilla latches the flag once a name is Johnny
|
||||
Vindicator.VindicatorBreakDoorGoal.canContinueToUse port crates/horizon-client/src/mobs/doors.rs::BreakDoor::can_continue still in a raid, plus the base break checks
|
||||
AbstractPiglin.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt writes IsImmuneToZombification and TimeInOverworld
|
||||
AbstractPiglin.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt reads immunity, time in overworld and the pick-up flag
|
||||
AbstractPiglin.customServerAiStep port crates/horizon-client/src/mobs/piglin.rs::ai_step gap: minor: zombification runs outside the Nether by the nether flag, not the PIGLINS_ZOMBIFY attribute
|
||||
AbstractPiglin.finishConversion port crates/horizon-client/src/mobs/piglin.rs::ai_step spawns the zombified piglin with nausea and removes the old one
|
||||
Piglin.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt gap: minor: CannotHunt is not read, so hunting ignores it; baby and inventory are read
|
||||
Piglin.getSlot missing minor: item commands cannot reach a piglin's inventory slots (300 and up); 300 and up only address the open container
|
||||
Piglin.defineSynchedData skip:java synched-data registration; Horizon keeps baby, crossbow and dancing state in Mob fields
|
||||
Piglin.createAttributes skip:data attribute defaults (health 16, speed 0.35, attack 5) live in data tables
|
||||
Piglin.checkPiglinSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules not spawning on a nether wart block
|
||||
Piglin.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::piglin baby chance or spawn weapon, hunt wait, then equipment and enchantments
|
||||
Piglin.populateDefaultEquipmentSlots port crates/horizon-client/src/mobs/finalize.rs::Ctx::populate golden armour at 10 percent per adult slot
|
||||
Piglin.mobInteract port crates/horizon-client/src/game/piglins.rs::Game::give_piglin a gold ingot handed over starts admiring
|
||||
Piglin.setBaby port crates/horizon-client/src/mobs/finalize.rs::set_baby gap: minor: sets the baby age only; the speed modifier is not set in this fn
|
||||
Piglin.customServerAiStep port crates/horizon-client/src/mobs/piglin.rs::ai_step gap: minor: the brain tick is the registered goal set (register_piglin), not this fn
|
||||
Piglin.finishConversion missing minor: a piglin turning into a zombified piglin in the Overworld drops nothing; vanilla drops its inventory and any gold it admires
|
||||
Piglin.hurtServer inline crates/horizon-client/src/mobs/piglin.rs::celebrate gap: player: a hit by a player does not stop an admiring piglin or start its admiring-disabled wait; babies do not flee the attacker
|
||||
Piglin.canUseNonMeleeWeapon port crates/horizon-client/src/game/piglins.rs::Game::piglin_wanted gap: minor: checks the preferred-weapons tag only, not the usable-crossbow tag or the kinetic weapon component
|
||||
Piglin.holdInOffHand port crates/horizon-client/src/game/piglins.rs::Game::start_admiring gap: minor: does not drop an item already in the off hand and does not set persistence
|
||||
Piglin.wantsToPickUp port crates/horizon-client/src/game/piglins.rs::Game::piglin_wants gap: minor: does not check the admiring-disabled wait after a hit by a player
|
||||
Piglin.startRiding missing minor: baby piglins never mount a baby hoglin (see PiglinAi.babySometimesRideBabyHoglin)
|
||||
Piglin.getTopPassenger missing minor: helper of baby piglin riding, which Horizon lacks
|
||||
Piglin.getAmbientSound missing player: piglins always play their plain ambient grunt; the jealous, retreat, celebrate and admiring sounds of their activity never play
|
||||
PiglinAi.initCoreActivity inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: no babyAvoidNemesis (babies do not flee a nemesis); avoidZombified and admiring stop are covered by goals
|
||||
PiglinAi.initIdleActivity inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: no ride for baby piglins and no look at or interact with other piglins; hunting and repellent avoidance are present
|
||||
PiglinAi.initFightActivity inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: no spear approach or attack, no back-off for crossbow piglins, no erase of the attack target near zombified piglins
|
||||
PiglinAi.initCelebrateActivity inline crates/horizon-client/src/mobs/piglin.rs::Celebrate::walk gap: minor: walks to the spot only; no look at gold-holding players and no random strolls
|
||||
PiglinAi.initAdmireItemActivity inline crates/horizon-client/src/mobs/piglin.rs::GoToWantedItem::can_use gap: minor: no give-up after 9 blocks or 200 ticks of trying to reach the item
|
||||
PiglinAi.initRetreatActivity missing player: piglins never retreat from hoglins or other avoid targets; they keep fighting or idling instead
|
||||
PiglinAi.initRideHoglinActivity missing player: baby piglins never ride baby hoglins
|
||||
PiglinAi.createLookBehaviors inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: looks at players only; piglins and random look targets are not there
|
||||
PiglinAi.createIdleLookBehaviors inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: looks at players only, no idle look at piglins or random points
|
||||
PiglinAi.createIdleMovementBehaviors inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: strolls only; no walking up to other piglins or to a look target
|
||||
PiglinAi.updateActivity inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: the activity choice is the goal priority order; the aggressive and dancing flags are set elsewhere
|
||||
PiglinAi.isBabyRidingBaby missing player: baby piglins never ride baby hoglins, so no piglin dismounts for that reason
|
||||
PiglinAi.pickUpItem port crates/horizon-client/src/game/piglins.rs::Game::piglin_pickups loved item admired, food eaten, else worn or stored
|
||||
PiglinAi.holdInOffhand port crates/horizon-client/src/game/piglins.rs::Game::start_admiring gap: minor: does not drop an item already in the off hand and does not set persistence
|
||||
PiglinAi.removeOneItemFromItemEntity port crates/horizon-client/src/game/piglins.rs::Game::piglin_pickups takes one item from the stack (nuggets whole)
|
||||
PiglinAi.cancelAdmiring missing minor: a piglin that converts while admiring does not drop the gold ingot it holds
|
||||
PiglinAi.throwItems port crates/horizon-client/src/game/piglins.rs::Game::finish_admiring gap: minor: only the barter path throws; the target choice is nearest player within 16, else a spot nearby
|
||||
PiglinAi.throwItemsTowardPos port crates/horizon-client/src/game/piglins.rs::Game::piglin_throw gap: minor: no off-hand swing animation
|
||||
PiglinAi.getBarterResponseItems port crates/horizon-client/src/game/piglins.rs::Game::finish_admiring rolls minecraft:gameplay/piglin_bartering for an adult; a baby gets the ingot back
|
||||
PiglinAi.wantsToStopRiding missing player: baby piglins never ride baby hoglins, so no dismount rule runs
|
||||
PiglinAi.isNearestValidAttackTarget inline crates/horizon-client/src/mobs/piglin.rs::ai_step gap: minor: only drops a mob target that is dead or unseen; vanilla also re-picks the nearest valid target
|
||||
PiglinAi.isNearZombified inline crates/horizon-client/src/mobs/piglin.rs::register_piglin gap: minor: the 6-block avoid is an AvoidEntity goal; the attack target is not erased near a zombified piglin
|
||||
PiglinAi.findNearestValidAttackTarget port crates/horizon-client/src/mobs/piglin.rs::hostile_to_player gap: minor: decides player targets only; angry-at, nemesis and universal anger are not chosen here
|
||||
PiglinAi.canAdmire port crates/horizon-client/src/game/piglins.rs::Game::give_piglin adult piglin takes a gold ingot from the hand
|
||||
PiglinAi.maybeRetaliate inline crates/horizon-client/src/mobs/goals.rs::HurtByTarget::start gap: minor: the hurt mob becomes the target; the 600-tick anger timer and the too-far check are not kept
|
||||
PiglinAi.getSoundForActivity missing player: piglins never play their jealous, retreat, celebrate or admiring-item ambient sounds
|
||||
PiglinAi.isNearAvoidTarget missing minor: only used by the retreat sound, which Horizon lacks
|
||||
PiglinAi.babySometimesRideBabyHoglin missing player: baby piglins never ride baby hoglins
|
||||
PiglinAi.broadcastAngerTarget inline crates/horizon-client/src/mobs/goals.rs::HurtByTarget::start gap: minor: alerts same-kind mobs nearby; no closer-target check and no hoglin rule
|
||||
PiglinAi.broadcastUniversalAnger missing minor: the universal_anger game rule is stored but piglins ignore it
|
||||
PiglinAi.setAngerTarget port crates/horizon-client/src/game/piglins.rs::Game::anger_piglins gap: minor: only the player path (600-tick anger); a hoglin target does not set the hunt wait
|
||||
PiglinAi.setAngerTargetToNearestTargetablePlayerIfFound missing minor: only for universal anger, which Horizon does not apply
|
||||
PiglinAi.setAngerTargetIfCloserThanCurrent inline crates/horizon-client/src/mobs/goals.rs::HurtByTarget::start gap: minor: alerts nearby piglins but never keeps a closer target
|
||||
PiglinAi.getAvoidTarget missing player: no avoid target exists, so piglins do not back away from hoglins they are outnumbered by
|
||||
PiglinAi.getNearestVisibleTargetablePlayer missing minor: only used by universal anger, which Horizon does not apply
|
||||
PiglinAi.broadcastRetreat missing player: piglins do not warn others to retreat from a hoglin group
|
||||
PiglinAi.retreatFromNearestTarget missing player: piglins do not retreat from a hoglin group
|
||||
PiglinAi.wantsToStopFleeing missing player: no retreat state, so nothing ends one
|
||||
PiglinAi.hoglinsOutnumberPiglins missing player: no retreat decision, so hoglins outnumbering piglins changes nothing
|
||||
PiglinAi.setAvoidTargetAndDontHuntForAWhile missing player: piglins hit by a hoglin group do not stop attacking and back off
|
||||
PiglinAi.dontKillAnyMoreHoglinsForAWhile port crates/horizon-client/src/mobs/piglin.rs::HuntHoglin::start gap: minor: sets only the hunting piglin's own wait; the wait from a hit on a hoglin is not set
|
||||
PiglinAi.getRandomNearbyPos inline crates/horizon-client/src/game/piglins.rs::Game::finish_admiring gap: minor: a random spot within 4 blocks, not a land position
|
||||
PiglinAi.isPlayerHoldingLovedItem missing player: piglins do not turn to look at a player holding gold, so that look never happens
|
||||
PiglinAi.isNotHoldingLovedItemInOffHand inline crates/horizon-client/src/game/piglins.rs::Game::piglin_wants the off hand holds no loved item test
|
||||
PiglinAi.isZombified inline crates/horizon-client/src/mobs/piglin.rs::register_piglin the zombified piglin and zoglin species list of the avoid goal
|
||||
PiglinAi.findNearbyAdultPiglins inline crates/horizon-client/src/mobs/piglin.rs::HuntHoglin::start gap: minor: uses the follow range, not the sensor's nearest living entities list
|
||||
AbstractSkeleton.registerGoals port crates/horizon-client/src/mobs/undead.rs::register restrict sun, flee sun, wolf avoid, stroll, look, targets
|
||||
AbstractSkeleton.rideTick missing minor: a skeleton riding a spider does not turn its body with the mount
|
||||
AbstractSkeleton.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::skeleton equipment, enchantments, pick-up chance, halloween pumpkin; the weapon goal is re-picked on the next tick
|
||||
AbstractSkeleton.reassessWeaponGoal port crates/horizon-client/src/mobs/undead.rs::SkeletonWeapon::can_use bow goal with the hard or normal interval, else melee
|
||||
AbstractSkeleton.onEquipItem inline crates/horizon-client/src/mobs/undead.rs::SkeletonWeapon::can_use gap: minor: the weapon is re-picked on the next goal check, not at the moment of equipping
|
||||
AbstractSkeleton.wantsToPickUp missing minor: skeletons never pick up dropped items in Horizon (no generic mob pickup); vanilla refuses spears
|
||||
Bogged.getArrow port crates/horizon-client/src/mobs/undead.rs::perform_ranged_attack Bogged arrows carry poison for 100 ticks
|
||||
Bogged.shear port crates/horizon-client/src/game/creatures.rs::Game::interact_shear_mob shear sound, sheared flag, shearing loot, game event
|
||||
Bogged.spawnShearedMushrooms port crates/horizon-client/src/game/creatures.rs::Game::interact_shear_mob drops the shearing/bogged loot table at the mob's height
|
||||
WitherSkeleton.registerGoals port crates/horizon-client/src/mobs/undead.rs::register piglin and piglin brute target at priority 3, then the skeleton goals
|
||||
WitherSkeleton.canHoldItem missing minor: no mob item pickup in Horizon, so the disliked-weapons tag never applies
|
||||
WitherSkeleton.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::skeleton attack damage 4 for wither skeletons
|
||||
WitherSkeleton.getArrow missing minor: arrows from a wither skeleton are not set on fire for 100 seconds
|
||||
Spider.registerGoals port crates/horizon-client/src/mobs/hostile.rs::register spider goals: leap at target and the spider melee that gives up in bright light
|
||||
Spider.isClimbing skip:other getter; Horizon reads the mob's climbing field
|
||||
Spider.setClimbing inline crates/horizon-client/src/mobs/ai.rs::ai_step climbing set from the horizontal collision each tick
|
||||
Spider.getVehicleAttachmentPoint port crates/horizon-client/src/mobs/riders.rs::passenger_attachment gap: minor: always the spider's fixed seat; vanilla uses a lower seat for riders narrower than the spider
|
||||
Spider.SpiderEffectsGroupData.setRandomEffect port crates/horizon-client/src/mobs/finalize.rs::Ctx::spider hard-difficulty effect: speed, strength, regeneration or invisibility
|
||||
AngerManagement.codec missing minor: warden anger is not saved; the anger tag is written empty, so a reloaded warden forgets its suspects
|
||||
AngerManagement.createUuidAngerPairs missing minor: part of the anger save, which Horizon does not write
|
||||
AngerManagement.convertFromUuids missing minor: part of the anger load, which Horizon does not read
|
||||
AngerManagement.getTopSuspect port crates/horizon-client/src/mobs/warden.rs::AngerManagement::active_entity first suspect the filter accepts
|
||||
AngerManagement.Sorter.compare port crates/horizon-client/src/mobs/warden.rs::AngerManagement::sort_and_update_highest angry first, then players, then the angriest
|
||||
Warden.<init> port crates/horizon-client/src/mobs/warden.rs::register pathfinding maluses and can-float; the anger and vibration state start empty
|
||||
Warden.getAddEntityPacket missing unsure: the spawn packet's emerging flag (data 1) has no Horizon counterpart that I found
|
||||
Warden.recreateFromPacket missing unsure: no client-side emerging pose from a spawn packet that I found
|
||||
Warden.createAttributes skip:data attribute defaults (health 500, speed 0.3, damage 30) live in data tables
|
||||
Warden.handleEntityEvent inline crates/horizon-client/src/mobs/warden.rs::animate gap: minor: could not confirm the attack animation (event 4) is started here; tendril and sonic boom are
|
||||
Warden.onSyncedDataUpdated inline crates/horizon-client/src/mobs/warden.rs::set_pose starts the emerge, dig, roar or sniff animation on pose change
|
||||
Warden.updateDynamicGameEventListener port crates/horizon-client/src/mobs/warden.rs::listen vibrations reach the warden through listen; there is no registration step
|
||||
Warden.addAdditionalSaveData missing minor: warden anger is not saved (the anger tag is written empty)
|
||||
Warden.readAdditionalSaveData missing minor: warden anger is not read back, so a reloaded warden is calm
|
||||
Warden.playListeningSound inline crates/horizon-client/src/mobs/warden.rs::increase_anger plays the listening sound for the anger level, unless roaring
|
||||
WardenAi.initCoreActivity inline crates/horizon-client/src/mobs/warden_brain.rs::activities swim, look at target, look sink, move sink
|
||||
WardenAi.initDiggingActivity inline crates/horizon-client/src/mobs/warden_brain.rs::activities force unmount and digging
|
||||
WardenAi.initIdleActivity inline crates/horizon-client/src/mobs/warden_brain.rs::activities roar target, sniff, stroll or idle
|
||||
WardenAi.initInvestigateActivity inline crates/horizon-client/src/mobs/warden_brain.rs::activities roar target and walk to the disturbance
|
||||
WardenAi.initSniffingActivity inline crates/horizon-client/src/mobs/warden_brain.rs::activities roar target and sniffing
|
||||
WardenAi.isTarget port crates/horizon-client/src/mobs/warden.rs::brain_target gap: minor: returns the attack target; the look-at filter is the caller's check
|
||||
WardenSpawnTracker.hasNearbyWarden inline crates/horizon-client/src/game/sculk.rs::Game::try_to_warn a warden within 24 blocks on each axis stops the warning
|
||||
WardenSpawnTracker.getNearbyPlayers inline crates/horizon-client/src/game/sculk.rs::Game::try_to_warn gap: minor: only the player who set off the shrieker is counted, not other players within 16 blocks
|
||||
WardenSpawnTracker.copyData inline crates/horizon-client/src/sculk.rs::WardenSpawnTracker::try_warn every tracker takes the highest one's level, cooldown and tick count
|
||||
Drowned.checkDrownedSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules water below, spawner or deep enough, dark enough, frequency roll
|
||||
Drowned.isDeepEnoughToSpawn inline crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules below sea level minus 5
|
||||
Drowned.populateDefaultEquipmentSlots port crates/horizon-client/src/mobs/finalize.rs::Ctx::populate 10 percent chance of a trident (10 in 16) or fishing rod
|
||||
Drowned.canReplaceCurrentItem missing minor: no mob item pickup in Horizon, so the nautilus shell guard never applies
|
||||
Drowned.rangedAttackUncertainty port crates/horizon-client/src/mobs/undead.rs::drowned_throw gap: minor: fixed uncertainty 6 (normal difficulty), not 14 minus 4 times the difficulty
|
||||
Drowned.rideTick missing minor: a drowned riding a mount does not turn its body with the mount
|
||||
Drowned.wantsToPickUp missing minor: no mob item pickup in Horizon, so the spear refusal never applies
|
||||
Drowned.DrownedGoToBeachGoal.isValidTarget port crates/horizon-client/src/mobs/undead.rs::beach_target two empty blocks above and a standable block below
|
||||
Drowned.DrownedGoToWaterGoal.getWaterPos port crates/horizon-client/src/mobs/undead.rs::DrownedGoToWater::can_use ten random spots 10 blocks around and up to 2 above, water only
|
||||
Zombie.addBehaviourGoals port crates/horizon-client/src/mobs/undead.rs::register break door, turtle egg, melee, village, stroll, targets
|
||||
Zombie.createAttributes skip:data attribute defaults (follow 35, speed 0.23, damage 3, armour 2) live in data tables
|
||||
Zombie.defineSynchedData skip:java synched-data registration; Horizon keeps baby, special type and drowned state in Mob fields
|
||||
Zombie.populateDefaultEquipmentSlots port crates/horizon-client/src/mobs/finalize.rs::Ctx::populate armour, then 1 percent (5 on hard) of an iron sword, spear or shovel
|
||||
Zombie.canHoldItem missing minor: no mob item pickup in Horizon, so the baby-egg rule never applies
|
||||
Zombie.wantsToPickUp missing minor: no mob item pickup in Horizon, so the glow ink sac refusal never applies
|
||||
Zombie.onOffspringSpawnedFromEgg missing unsure: no egg-offspring pickup roll found for zombies in Horizon
|
||||
Zombie.ZombieAttackTurtleEggGoal.playDestroyProgressSound inline crates/horizon-client/src/mobs/undead.rs::AttackTurtleEgg::tick zombie.destroy_egg sound while the egg is trampled
|
||||
Zombie.ZombieAttackTurtleEggGoal.playBreakSound inline crates/horizon-client/src/mobs/undead.rs::AttackTurtleEgg::tick turtle egg break sound when the egg breaks
|
||||
|
@@ -0,0 +1,142 @@
|
||||
ZombieVillager.defineSynchedData skip:java SynchedEntityData definitions; Horizon keeps the fields on Mob and sets them at spawn
|
||||
ZombieVillager.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt zombie villager save arm; cure and gossip go through zombie_villager::write_nbt
|
||||
ZombieVillager.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_from_nbt load arm; cure and gossip go through zombie_villager::read_nbt
|
||||
ZombieVillager.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize ZombieVillager arm: villager type, then profession, then zombie spawn
|
||||
ZombieVillager.initializeZombieVillagerData port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize profession drawn in the same arm, from a seeded fresh RNG rather than the mob random
|
||||
ZombieVillager.handleEntityEvent port crates/horizon-client/src/mobs/zombie_villager.rs::start_converting cure sound (event 16) is queued when the cure starts
|
||||
ZombieVillager.setVillagerData inline crates/horizon-client/src/game/zombie_villagers.rs::carry_over gap: minor: the cure path copies type and profession there; no setter for the implicit component path
|
||||
ZombieVillager.get skip:other DataComponents getter for the villager variant; Horizon has no entity component map
|
||||
ZombieVillager.applyImplicitComponent missing minor: a zombie villager spawned from an item carrying a villager variant component keeps a random type; Horizon applies implicit components only to buckets (load_bucket_data)
|
||||
ZombifiedPiglin.createAttributes skip:data attribute defaults are entity-type data read in Mob::new (mobs.rs)
|
||||
ZombifiedPiglin.maybePlayFirstAngerSound port crates/horizon-client/src/mobs/undead.rs::zombified_piglin_step first-anger counter and sound run in the step
|
||||
ZombifiedPiglin.maybeAlertOthers port crates/horizon-client/src/mobs/undead.rs::zombified_piglin_step alert timer and line-of-sight check run in the step
|
||||
ZombifiedPiglin.alertOthers port crates/horizon-client/src/mobs/undead.rs::zombified_piglin_step gap: minor: no isAlliedTo check; vertical reach approximated
|
||||
ZombifiedPiglin.playAngerSound port crates/horizon-client/src/mobs/undead.rs::zombified_piglin_step angry sound queued in the step with volume 2.0
|
||||
ZombifiedPiglin.setTarget port crates/horizon-client/src/mobs/undead.rs::zombified_piglin_step anger and timers start on the first tick with a target, not inside setTarget
|
||||
ZombifiedPiglin.checkZombifiedPiglinSpawnRules port crates/horizon-client/src/mobs/spawn_rules.rs::check_spawn_rules ZombifiedPiglin arm: not peaceful and not on a nether wart block
|
||||
ZombifiedPiglin.checkSpawnObstruction port crates/horizon-client/src/mobs/spawn_selection.rs::spawn_obstruction the Mob default two tests: no liquid, unobstructed
|
||||
CatSpawner.spawnInVillage port crates/horizon-client/src/game/cat_spawner.rs::Game::spawn_cat_in_village village cats: more than four claimed beds within 48 blocks and fewer than five cats
|
||||
CatSpawner.spawnCat port crates/horizon-client/src/game/cat_spawner.rs::Game::spawn_cat black variant inside cats_spawn_as_black structures; persistence flag from the caller
|
||||
InventoryCarrier.pickUpItem port crates/horizon-client/src/game/villagers.rs::Game::villager_pickups gap: minor: villager arm only; piglins, sulfur cubes, pandas and others have their own pickup fns
|
||||
AbstractVillager.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize villager arm: type, then the baby group
|
||||
AbstractVillager.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt Offers in the villager arm; inventory via villager::write_nbt
|
||||
AbstractVillager.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::read_villager Offers read here; inventory via villager::read_nbt
|
||||
AbstractVillager.getSlot missing minor: commands cannot address a villager inventory slot (container.N); mob slot names cover weapon, armour and saddle only
|
||||
AbstractVillager.addOffersFromItemListings port crates/horizon-client/src/merchant.rs::Trades::offers_from_set the allow_duplicates path: a picked trade stays in the pool
|
||||
AbstractVillager.addOffersFromItemListingsWithoutDuplicates port crates/horizon-client/src/merchant.rs::Trades::offers_from_set the no-duplicates path: a picked trade leaves the pool
|
||||
AbstractVillager.getRopeHoldPosition skip:ui lead rope drawing point only; the lead is drawn by leash_geometry in game.rs
|
||||
AbstractVillager.stillValid missing player: the trade screen stays open after you walk away from the villager; vanilla closes it beyond 4 blocks, and no reach check exists for merchant screens
|
||||
Villager.ageBoundaryReached missing player: a villager that grows up keeps the baby brain (the brain is built once with its baby flag), so it never goes to work
|
||||
Villager.startTrading port crates/horizon-client/src/game/trading.rs::Game::interact_trader opens the trade screen for the player
|
||||
Villager.resetSpecialPrices port crates/horizon-client/src/merchant.rs::update_special_prices recomputes special prices from scratch, which drops the old diff
|
||||
Villager.needsToRestock inline crates/horizon-client/src/merchant.rs::Trader::should_restock any offer with uses left
|
||||
Villager.allowedToRestock inline crates/horizon-client/src/merchant.rs::Trader::should_restock two restocks a day at most, 2400 ticks apart
|
||||
Villager.catchUpDemand inline crates/horizon-client/src/merchant.rs::Trader::should_restock missed demand updates on a new day
|
||||
Villager.defineSynchedData skip:java synched data definitions; Horizon keeps the fields on Mob
|
||||
Villager.createDefaultVillagerData skip:data default type, profession and level; the spawn defaults of the Horizon mob fields
|
||||
Villager.addAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::mob_to_nbt villager arm: data, xp, restocks, offers; food, gossip and decay via villager::write_nbt
|
||||
Villager.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::read_villager data and offers here; food, gossip, decay and inventory via villager::read_nbt
|
||||
Villager.getAmbientSound port crates/horizon-client/src/mobs/ai.rs::play_ambient gap: minor: the trade ambient sound is not played while trading
|
||||
Villager.rewardTradeXp port crates/horizon-client/src/merchant.rs::Session::notify_trade gap: minor: no 10 second Regeneration on the villager at level-up
|
||||
Villager.die port crates/horizon-client/src/game/villagers.rs::Game::villager_murdered gap: minor: releaseAllPois is not done on death
|
||||
Villager.releaseAllPois missing unsure: releasePoi frees the bed, job site, potential job site and meeting point claims; Horizon has no claim store, only the block occupied property, so the effect is unclear
|
||||
Villager.releasePoi missing unsure: same as releaseAllPois; the claim store is not clear in Horizon
|
||||
Villager.eatUntilFull port crates/horizon-client/src/mobs/villager.rs::Ext::eat_and_digest
|
||||
Villager.shouldIncreaseLevel inline crates/horizon-client/src/merchant.rs::Session::notify_trade level-up check: can level up and xp at the maximum
|
||||
Villager.increaseMerchantCareer inline crates/horizon-client/src/merchant.rs::Session::notify_trade level plus the new level trade set
|
||||
Villager.handleEntityEvent port crates/horizon-client/src/game/villagers.rs::Game::entity_event_particles villager event particles from the entity event table
|
||||
Villager.finalizeSpawn port crates/horizon-client/src/mobs/finalize.rs::Ctx::finalize villager arm: breeding resets the profession, then type and the baby group
|
||||
Villager.thunderHit port crates/horizon-client/src/game/lightning.rs::Game::thunder_hit villager struck by lightning becomes a witch; gap: minor: releaseAllPois is not done on conversion
|
||||
Villager.wantsToPickUp port crates/horizon-client/src/game/villagers.rs::Game::villager_pickups the want test (food, pick-up tag, requested items) inside the pickup loop
|
||||
Villager.countFoodPointsInInventory port crates/horizon-client/src/mobs/villager.rs::Ext::food_in_inventory
|
||||
Villager.updateTrades port crates/horizon-client/src/game/trading.rs::Game::ensure_offers generates the trade set for profession and level; the level-up reroll is in merchant.rs notify_trade
|
||||
Villager.maybeDecayGossip port crates/horizon-client/src/mobs/villager.rs::Ext::maybe_decay
|
||||
Villager.golemSpawnConditionsMet port crates/horizon-client/src/mobs/villager.rs::Ext::wants_golem sleep memory check; the golem cooldown is an extra check here
|
||||
Villager.get skip:other DataComponents getter for the villager variant; Horizon has no entity component map
|
||||
Villager.applyImplicitComponent missing minor: a villager spawned from an item carrying a villager variant component keeps its biome type; Horizon applies implicit components only to buckets
|
||||
VillagerData.withType skip:java immutable record copy; Horizon keeps type and profession as Mob fields
|
||||
VillagerData.withProfession skip:java immutable record copy; the profession change is villager::set_profession
|
||||
VillagerProfession.bootstrap skip:data registry bootstrap of professions; Horizon reads them from data tables
|
||||
VillagerType.bootstrap skip:data registry bootstrap of villager types; Horizon reads them from data tables
|
||||
WanderingTrader.registerGoals port crates/horizon-client/src/mobs/trader.rs::register the trader goal set; the shared register in mobs/ai.rs is not repeated here
|
||||
WanderingTrader.updateTrades port crates/horizon-client/src/game/trading.rs::Game::ensure_offers the buying, uncommon and common sets of the wandering branch
|
||||
WanderingTrader.addAdditionalSaveData missing minor: DespawnDelay and wander_target are not written; the trader save writes only its offers
|
||||
WanderingTrader.readAdditionalSaveData missing minor: DespawnDelay and wander_target are not read back
|
||||
WanderingTrader.rewardTradeXp port crates/horizon-client/src/merchant.rs::Session::notify_trade the orb for offers that reward experience; the trader gets no villager XP
|
||||
WanderingTrader.WanderToPositionGoal.isTooFarAway port crates/horizon-client/src/mobs/trader.rs::too_far
|
||||
WanderingTraderSpawner.getTraderData port crates/horizon-client/src/game/wandering_trader.rs::Game::load_trader_data
|
||||
WanderingTraderSpawner.tryToSpawnLlamaFor port crates/horizon-client/src/game/wandering_trader.rs::Game::spawn_trader_llama
|
||||
WanderingTraderSpawner.findSpawnPositionNear port crates/horizon-client/src/game/wandering_trader.rs::Game::find_trader_spawn_near
|
||||
WanderingTraderSpawner.hasEnoughSpace port crates/horizon-client/src/game/wandering_trader.rs::Game::trader_has_space
|
||||
Inventory.setSelectedSlot port crates/horizon-world/src/player_inventory.rs::PlayerInventory::set_selected invalid slot is an error here, not a thrown exception
|
||||
Inventory.hasRemainingSpaceForItem port crates/horizon-world/src/inventory_pickup.rs::remaining
|
||||
Inventory.getFreeSlot port crates/horizon-world/src/player_inventory.rs::PlayerInventory::free_slot
|
||||
Inventory.addAndPickItem port crates/horizon-world/src/player_inventory.rs::PlayerInventory::add_and_pick
|
||||
Inventory.pickSlot port crates/horizon-world/src/player_inventory.rs::PlayerInventory::pick_slot
|
||||
Inventory.findSlotMatchingItem port crates/horizon-world/src/player_inventory.rs::PlayerInventory::find_matching
|
||||
Inventory.findSlotMatchingCraftingIngredient port crates/horizon-world/src/player_inventory.rs::PlayerInventory::find_crafting
|
||||
Inventory.getSuitableHotbarSlot port crates/horizon-world/src/player_inventory.rs::PlayerInventory::suitable_hotbar
|
||||
Inventory.removeItem port crates/horizon-world/src/player_inventory.rs::PlayerInventory::remove slots past the main inventory address equipment
|
||||
Inventory.removeItemNoUpdate port crates/horizon-world/src/player_inventory.rs::PlayerInventory::remove_no_update
|
||||
Inventory.setItem port crates/horizon-world/src/player_inventory.rs::PlayerInventory::set slots past the main inventory address equipment
|
||||
Inventory.save port crates/horizon-client/src/save.rs::Level::player_tag writes the non-empty slots of the Inventory list
|
||||
Inventory.isEmpty port crates/horizon-world/src/player_inventory.rs::PlayerInventory::is_empty
|
||||
Inventory.getItem port crates/horizon-world/src/player_inventory.rs::PlayerInventory::get slots past the main inventory address equipment
|
||||
Inventory.replaceWith port crates/horizon-world/src/player_inventory.rs::PlayerInventory::replace_with
|
||||
Inventory.removeFromSelected port crates/horizon-world/src/player_inventory.rs::PlayerInventory::remove_selected
|
||||
Player.defineSynchedData skip:java synched data definitions; Horizon keeps the fields in game and player state
|
||||
Player.turtleHelmetTick port crates/horizon-client/src/game/potions.rs::Game::turtle_helmet_tick
|
||||
Player.isEquipped inline crates/horizon-client/src/game/potions.rs::Game::turtle_helmet_tick the head-slot check for the turtle helmet
|
||||
Player.canPlayerFitWithinBlocksAndEntitiesWhen missing unsure: the pose fit check (no collision in the new pose box) was not found in Horizon
|
||||
Player.increaseScore skip:other the score is experience.total in Horizon (death screen); there is no separate score counter
|
||||
Player.getWeaponItem missing unsure: the riptide spin-attack item (autoSpinAttackItemStack) was not found; Horizon keeps spin_attack parts only
|
||||
Player.destroyVanishingCursedItems port crates/horizon-client/src/game.rs::Game::drop_inventory vanishing-curse stacks are removed from the death drops
|
||||
Player.hasCorrectToolForDrops port crates/horizon-client/src/game.rs::Game::tick_mining the correct-tool test for harvest drops
|
||||
Player.readAdditionalSaveData port crates/horizon-client/src/save.rs::Level::read_player
|
||||
Player.addAdditionalSaveData port crates/horizon-client/src/save.rs::Level::player_tag
|
||||
Player.hurtHelmet inline crates/horizon-client/src/game.rs::Game::hurt_armor gap: minor: hurt_armor hits all four armour slots; the head-only hit from LivingEntity.hurt is not separated
|
||||
Player.isAboveGround inline crates/horizon-world/src/edge_backoff.rs::back_off_from_edge the on-the-edge test before backing off
|
||||
Player.canFallAtLeast inline crates/horizon-world/src/edge_backoff.rs::back_off_from_edge the no-collision drop test at the edge
|
||||
Player.deflectProjectile port crates/horizon-client/src/game/deflect.rs::Game::attack_redirectable
|
||||
Player.baseDamageScaleFactor port crates/horizon-client/src/game.rs::Game::sweep_base_damage
|
||||
Player.isEffectiveAi skip:other client-side AI gate; Horizon has no effective-AI check in its loop
|
||||
Player.hasContainerOpen missing unsure: the test for an open container menu (not the inventory menu) was not located
|
||||
Player.startSleepInBed port crates/horizon-client/src/game.rs::Game::try_sleep
|
||||
Player.isSleepingLongEnough missing unsure: the 100-tick sleep counter gate for the night skip was not found; the sleep timer only drives the fade
|
||||
Player.updateSwimming port crates/horizon-client/src/motion.rs::MotionWorld::swimming
|
||||
Player.getXpNeededForNextLevel port crates/horizon-client/src/entities.rs::Experience::needed
|
||||
Player.hasEnoughFoodToDoExhaustiveManoeuvres missing unsure: the food-or-flying test for exhaustive moves was not found in motion.rs
|
||||
Player.mayUseItemAt port crates/horizon-client/src/game.rs::Game::use_hand the may-build test before use-on in adventure mode
|
||||
Player.isSwimming port crates/horizon-client/src/motion.rs::MotionWorld::swimming
|
||||
Player.decorateDisplayNameComponent missing unsure: click and hover behaviour on player names in chat was not found
|
||||
Player.getSlot port crates/horizon-client/src/game/commands/items.rs::Game::slots_named gap: minor: numeric slots 499 (carried item) and 500-503 (crafting grid) are not addressed
|
||||
Player.extractParrotVariant missing unsure: the parrot variant read from a shoulder parrot NBT was not found in shoulders.rs
|
||||
Player.convertParrotVariant skip:java Optional and OptionalInt conversion of the synched parrot variant; Horizon stores the id directly
|
||||
Player.getItemSwapScale port crates/horizon-client/src/attack_strength.rs::AttackStrength::swap_scale
|
||||
Player.debugInfo skip:debug
|
||||
Player.printPlayerPermissions skip:debug
|
||||
PlayerEquipment.set port crates/horizon-world/src/player_equipment.rs::set main hand goes to the selected slot
|
||||
PlayerEquipment.get port crates/horizon-world/src/player_equipment.rs::get main hand reads the selected slot
|
||||
ProfilePublicKey.Data.hasExpired port crates/horizon-protocol/src/secure_chat.rs::ProfileKey::has_expired gap: minor: the grace-period overload is not separate
|
||||
ProfilePublicKey.Data.equals skip:java value equality of the key record
|
||||
StackedContents.take inline crates/horizon-client/src/menu/place.rs::Picker::try_pick the count subtraction when a pick succeeds
|
||||
StackedContents.getUniqueAvailableIngredientItems inline crates/horizon-client/src/menu/place.rs::Picker::new the stocked items that some ingredient accepts
|
||||
StackedContents.anyIngredientMatches inline crates/horizon-client/src/menu/place.rs::Picker::new the accepts test used to filter items
|
||||
StackedContents.RecipePicker.setInitialConnections port crates/horizon-client/src/menu/place.rs::Picker::new the connection matrix is built in the constructor
|
||||
StackedContents.RecipePicker.findNewItemAssignmentPath port crates/horizon-client/src/menu/place.rs::Picker::find_path
|
||||
StackedContents.RecipePicker.getSatisfiedIndex skip:java bitset index arithmetic; Horizon keeps satisfied as a plain bool vector
|
||||
StackedContents.RecipePicker.getConnectionIndex port crates/horizon-client/src/menu/place.rs::Picker::at flat index of an item-ingredient pair
|
||||
StackedContents.RecipePicker.assign inline crates/horizon-client/src/menu/place.rs::Picker::try_pick the assigned flag set along a successful path
|
||||
StackedContents.RecipePicker.unassign inline crates/horizon-client/src/menu/place.rs::Picker::try_pick the assigned flag cleared when a path is undone
|
||||
StackedContents.RecipePicker.getResidualIndex port crates/horizon-client/src/menu/place.rs::Picker::at flat index of the assignment, same layout as connections
|
||||
StackedContents.RecipePicker.getVisitedIngredientIndex skip:java bitset index arithmetic; plain bool vectors in Horizon
|
||||
StackedContents.RecipePicker.getVisitiedItemIndex skip:java bitset index arithmetic; plain bool vectors in Horizon
|
||||
StackedContents.RecipePicker.clearAllVisited port crates/horizon-client/src/menu/place.rs::Picker::clear_visited
|
||||
StackedItemContents.getBiggestCraftableStack port crates/horizon-client/src/menu/place.rs::Stacked::try_pick_all the largest craftable count, found by a bounded search
|
||||
EvokerFangs.readAdditionalSaveData missing minor: fangs are not saved; a save in mid-bite drops them
|
||||
EvokerFangs.addAdditionalSaveData missing minor: fangs are not saved; the warmup and owner are not written
|
||||
EvokerFangs.getAnimationProgress port crates/horizon-client/src/game/fangs.rs::Game::fangs_geometry the bite progress that positions the fang model
|
||||
EyeOfEnder.setItem skip:ui the item sprite a flying eye shows; Horizon draws the eye itself
|
||||
EyeOfEnder.shouldRenderAtSqrDistance skip:ui render distance culling only
|
||||
EyeOfEnder.spawnParticles port crates/horizon-client/src/game/end.rs::Game::eye_break_particles the portal crumbs drawn in toward the eye
|
||||
EyeOfEnder.readAdditionalSaveData missing minor: flying eyes are not saved; a save mid-flight loses them
|
||||
|
@@ -0,0 +1,140 @@
|
||||
FireworkRocketEntity.<init> port crates/horizon-client/src/game/fireworks.rs::Game::new_rocket launch velocity triangle and lifetime 10*(1+flight)+randoms; the owner and attached target are set by the callers
|
||||
FireworkRocketEntity.defineSynchedData skip:java SynchedEntityData definitions; Horizon keeps the rocket fields on the Rocket struct
|
||||
FireworkRocketEntity.shouldRender port crates/horizon-client/src/game/fireworks.rs::Game::rocket_geometry attached rockets are not drawn; camera range is the caller's check
|
||||
FireworkRocketEntity.onHitEntity missing player: a firework shot from a crossbow or dispenser flies through mobs and bursts only on a block or at its timer end; Horizon has no entity hit test for rockets
|
||||
FireworkRocketEntity.onHitBlock inline crates/horizon-client/src/game/fireworks.rs::Game::tick_rockets a block hit ends the angled rocket early and explodes it; vanilla explodes only when it has explosions and skips the block entityInside effect
|
||||
FireworkRocketEntity.dealExplosionDamage port crates/horizon-client/src/game/fireworks.rs::Game::explode_rocket damage 5+2 per explosion; attached target takes the full blast, others within 5 blocks with line of sight
|
||||
FireworkRocketEntity.addAdditionalSaveData missing minor: rocket life, lifetime and item are not written to a save; Horizon does not save flying rockets
|
||||
FireworkRocketEntity.readAdditionalSaveData missing minor: rocket life, lifetime and item are not read back; Horizon does not save flying rockets
|
||||
FireworkRocketEntity.getExplosions port crates/horizon-client/src/game/fireworks.rs::fireworks_of explosion list from the item's fireworks component, empty without one
|
||||
FireworkRocketEntity.calculateHorizontalHurtKnockbackDirection inline crates/horizon-client/src/game/fireworks.rs::Game::explode_rocket knockback direction is the blast point to the target, which the mob damage gets as its from point
|
||||
FishingHook.<init> port crates/horizon-client/src/game/fishing.rs::Game::use_fishing_rod the player cast: start point, velocity with the 0.0103365 triangle, luck and lure from the rod
|
||||
FishingHook.defineSynchedData skip:java synced hooked id and biting flag; Horizon keeps them on the Hook struct and sends them in Hook::track
|
||||
FishingHook.canHitEntity port crates/horizon-client/src/game/fishing.rs::Game::tick_fishing hook catches living mobs, other players (not the owner) and dropped items it touches
|
||||
FishingHook.onHitEntity port crates/horizon-client/src/game/fishing.rs::Game::tick_fishing sets the Hooked state on the first target the bobber touches
|
||||
FishingHook.onHitBlock port crates/horizon-client/src/game/fishing.rs::Game::tick_fishing the bobber stops where its movement hits a block (scene resolve)
|
||||
FishingHook.setHookedEntity port crates/horizon-client/src/game/fishing.rs::Game::tick_fishing Hooked(id) state; the id goes out as meta 8 in Hook::track
|
||||
FishingHook.getOpenWaterTypeForArea inline crates/horizon-client/src/game/fishing.rs::Game::calculate_open_water the area is walked layer by layer and folded into the layer check
|
||||
FishingHook.getOpenWaterTypeForBlock port crates/horizon-client/src/game/fishing.rs::Game::open_water_type air or lily pad above water, still water source inside, anything else invalid
|
||||
FishingHook.handleEntityEvent inline crates/horizon-client/src/game/fishing.rs::Game::retrieve_hook event 31 pull: retrieve_hook pulls the hooked mob, item or player when the rod is reeled in
|
||||
FishingHook.getPlayerOwner skip:other owner is implicit: the host's hook is self.hook and a guest's is in that guest's play state
|
||||
FishingHook.getAddEntityPacket port crates/horizon-client/src/game/fishing.rs::Hook::track add-entity payload: the owner entity id is the bobber's data field
|
||||
LlamaSpit.onHitEntity port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit spit hit: 1.0 damage with the spit source to a player (mob_hits_player) or a mob
|
||||
Projectile.applyImplicitComponent missing minor: a projectile given a can_break component by its item keeps no break predicate; Horizon applies implicit components only to buckets
|
||||
Projectile.addAdditionalSaveData missing minor: owner, LeftOwner and HasBeenShot are not written; Horizon does not save flying projectiles
|
||||
Projectile.ownedBy inline crates/horizon-client/src/projectiles.rs::Projectile::tick the owner is skipped in the target loop until the projectile has left it
|
||||
Projectile.readAdditionalSaveData missing minor: owner, LeftOwner, HasBeenShot and can_break are not read back; Horizon does not save flying projectiles
|
||||
Projectile.restoreFrom missing minor: the owner is not carried over a dimension change; Horizon has no projectile dimension change
|
||||
Projectile.isOutsideOwnerCollisionRange inline crates/horizon-client/src/projectiles.rs::Projectile::tick gap: minor: left_owner tests the owner's box inflated 1.0 at the position only; vanilla sweeps along the motion and checks the owner's passengers too
|
||||
Projectile.getMovementToShoot port crates/horizon-client/src/projectiles.rs::Projectile::shoot direction plus triangle spread 0.0172275 times uncertainty, scaled by power
|
||||
Projectile.onAboveBubbleColumn port crates/horizon-client/src/arrows.rs::Ticker::bubble_column gap: minor: arrows only; thrown ender pearls get their push in creatures.rs tick_projectiles and other projectiles get none
|
||||
Projectile.onInsideBubbleColumn port crates/horizon-client/src/arrows.rs::Ticker::bubble_column gap: minor: arrows only; thrown ender pearls get their push in creatures.rs tick_projectiles and other projectiles get none
|
||||
Projectile.canBreakBlockInAdventureMode missing minor: the can_break predicate and adventure-mode rules for projectile block breaking are not modelled
|
||||
Projectile.spawnProjectileFromRotation port crates/horizon-client/src/projectiles.rs::Projectile::shoot_from_rotation gap: minor: the aim and inherited velocity only; the add-to-world step is the caller's
|
||||
Projectile.spawnProjectile inline crates/horizon-client/src/game/creatures.rs::Game::throw_item each shooter adds its own projectile (throw_item, shoot_crossbow, shoot_projectile_item, the bow in game.rs); throw_item is the player throw path
|
||||
Projectile.applyOnProjectileSpawned port crates/horizon-client/src/game/enchant_effects.rs::Game::bow_projectile_ignite gap: minor: Flame ignite only; Piercing and Punch go through Projectile::set_bonus
|
||||
Projectile.hitTargetOrDeflectSelf port crates/horizon-client/src/game/creatures.rs::Game::tick_projectiles gap: minor: deflection is checked for breezes only; the onHit dispatch is creatures.rs projectile_hit
|
||||
Projectile.onRedirectProjectile port crates/horizon-client/src/game/deflect.rs::Game::deflect gap: minor: the player's attack turns the projectile; a projectile hitting another redirectable one is not modelled
|
||||
Projectile.recreateFromPacket port crates/horizon-client/src/game/remote_projectiles.rs::Game::spawn_remote_projectile the owner id from the add-entity data is set on the remote projectile
|
||||
Projectile.mayBreak missing player: a projectile hitting a decorated pot, chorus flower or pointed dripstone does not break it; no projectile break path found
|
||||
Projectile.calculateHorizontalHurtKnockbackDirection inline crates/horizon-client/src/game/creatures.rs::Game::projectile_hit gap: minor: knockback goes from the shot's previous point, while vanilla uses the projectile's horizontal motion
|
||||
ProjectileUtil.getHitResultOnMoveVector port crates/horizon-client/src/projectiles.rs::Projectile::tick sweep along the movement: block clip, then entity boxes; gap: minor: entity margin is a fixed 0.3, vanilla ramps it up over the first ticks
|
||||
ProjectileUtil.getHitResultOnViewVector port crates/horizon-client/src/game/pick_entity.rs::pick_entity_hit gap: minor: the brush reach is the caller's; there is no separate view-vector trace
|
||||
ProjectileUtil.getHitResult port crates/horizon-client/src/projectiles.rs::Projectile::tick block clip first, then the nearest entity box on the segment; same core as the move-vector sweep
|
||||
ProjectileUtil.rotateTowardsMovement port crates/horizon-client/src/projectiles.rs::Projectile::update_rotation gap: minor: rotation is set at once, vanilla lerps it by rotationSpeed
|
||||
ProjectileUtil.getMobArrow port crates/horizon-client/src/mobs/undead.rs::perform_ranged_attack gap: minor: builds the skeleton-family arrow with base damage from power; illager crossbow arrows are built in mobs/illager.rs::shoot_crossbow
|
||||
ShulkerBullet.addAdditionalSaveData missing minor: the final target and move direction are not saved; Horizon does not save flying projectiles
|
||||
ShulkerBullet.readAdditionalSaveData missing minor: the final target and move direction are not read back; Horizon does not save flying projectiles
|
||||
ShulkerBullet.canHitEntity missing minor: no-physics entities are not skipped by the bullet's target search; Projectile::tick checks owner and boxes only
|
||||
ShulkerBullet.onHitBlock port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit shulker bullet block hit: hit sound and two explosion particles at the bullet
|
||||
ShulkerBullet.destroy inline crates/horizon-client/src/game/creatures.rs::Game::tick_projectiles the bullet is dropped from the flight list on any hit; the game event is not sent
|
||||
ShulkerBullet.hurtServer missing player: a hit on a shulker bullet does not pop it (no hurt path for projectiles), so it keeps flying until it hits something else
|
||||
ThrowableProjectile.applyInertia port crates/horizon-client/src/projectiles.rs::Projectile::tick default arm: gravity, then drag 0.8 in water and 0.99 in air; gap: minor: no bubble particles in water
|
||||
ThrowableProjectile.handleFirstTickBubbleColumn missing minor: a thrown item that spawns inside a bubble column is not pushed on its first tick
|
||||
AbstractArrow.<init> port crates/horizon-client/src/arrows.rs::ArrowState::new arrow defaults: pickup, pickup item, shake, pierce; the owner and drawn ammo come from set_owner and set_item
|
||||
AbstractArrow.defineSynchedData skip:java flags, pierce level and in-ground sync fields; Horizon keeps them on ArrowState and Projectile
|
||||
AbstractArrow.lerpMotion skip:other client interpolation of a server motion packet; Horizon's remote arrows take the server position each update
|
||||
AbstractArrow.onSyncedDataUpdated inline crates/horizon-client/src/arrows.rs::Ticker::on_hit_block the 7-tick shake starts when the arrow lands here; vanilla starts it when the client sees it stuck
|
||||
AbstractArrow.hitTargetsOrDeflectSelf port crates/horizon-client/src/arrows.rs::Ticker::step_move_and_hit gap: minor: the nearest entity on the way is taken per tick; vanilla goes on through the rest within the same tick
|
||||
AbstractArrow.addBubbleParticles port crates/horizon-client/src/projectiles.rs::Projectile::arrow_trail four bubble particles along a submerged arrow
|
||||
AbstractArrow.move inline crates/horizon-client/src/arrows.rs::Ticker::tick should_fall then start_falling run from the tick for an arrow in the ground
|
||||
AbstractArrow.resetPiercedEntities inline crates/horizon-client/src/arrows.rs::Ticker::on_hit_block the pierced list is cleared when the arrow lands
|
||||
AbstractArrow.doKnockback port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit punch pushes along the flight, scaled by 0.6 and by knockback resistance
|
||||
AbstractArrow.findHitEntity port crates/horizon-client/src/arrows.rs::Ticker::entity_hit box clip, then the margin test against the segment
|
||||
AbstractArrow.findHitEntities port crates/horizon-client/src/arrows.rs::Ticker::step_move_and_hit gap: minor: only the nearest hit per tick is returned; a piercing arrow takes the rest on later ticks
|
||||
AbstractArrow.canHitEntity port crates/horizon-client/src/arrows.rs::Ticker::step_move_and_hit gap: minor: skips pierced entities here; the player canHarmPlayer rule is in creatures.rs tick_projectiles
|
||||
AbstractArrow.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::arrow_from_nbt shake, in ground, in block state, pickup and the arrow fields
|
||||
AbstractArrow.tryPickup port crates/horizon-client/src/arrows.rs::ArrowState::player_touch disallowed, allowed (gives the pickup item) and creative only
|
||||
AbstractArrow.setFlag port crates/horizon-client/src/projectiles.rs::Projectile::set_critical gap: minor: only the critical flag; the no-physics flag is a plain field
|
||||
AbstractArrow.setPickupItemStack port crates/horizon-client/src/arrows.rs::ArrowState::set_item an empty stack falls back to the default pickup item
|
||||
AbstractArrow.isNoPhysics inline crates/horizon-client/src/arrows.rs::Ticker::tick no_physics is a field read by the tick
|
||||
AbstractArrow.getSlot missing minor: the arrow's pickup stack is not reachable as an entity slot, so item commands on it do nothing
|
||||
AbstractArrow.Pickup.byOrdinal port crates/horizon-client/src/arrows.rs::Pickup::from_byte out of range is DISALLOWED
|
||||
Arrow.updateColor missing player: a tipped arrow keeps no potion colour, so its flight and hit particles are not tinted
|
||||
Arrow.makeParticle missing player: a tipped arrow in flight leaves no coloured entity-effect trail
|
||||
Arrow.handleEntityEvent missing player: a tipped arrow that hits does not burst into its potion colour (event 0 has no port)
|
||||
ThrownTrident.defineSynchedData skip:java loyalty and foil synced fields; Horizon keeps loyalty on the trident struct
|
||||
ThrownTrident.isAcceptibleReturnOwner port crates/horizon-client/src/game/trident.rs::Game::tick_tridents the loyalty return needs the owner's eye position; gap: minor: no separate alive or spectator check
|
||||
ThrownTrident.findHitEntities port crates/horizon-client/src/arrows.rs::Ticker::step_move_and_hit one entity hit per trident, none once it has dealt damage
|
||||
ThrownTrident.hitBlockEnchantmentEffects port crates/horizon-client/src/game/trident.rs::Game::channel_rod_hit gap: minor: only Channeling's hit_block effect (lightning on a rod in a storm) is modelled
|
||||
ThrownTrident.tryPickup port crates/horizon-client/src/arrows.rs::ArrowState::player_touch gap: minor: no owner check on a returned trident; any player in reach takes it when it is no-physics
|
||||
ThrownTrident.readAdditionalSaveData port crates/horizon-client/src/entity_nbt.rs::arrow_from_nbt gap: minor: DealtDamage is not read back; the loyalty level comes from the release
|
||||
ThrownTrident.getLoyaltyFromItem port crates/horizon-client/src/game/trident.rs::Game::release_trident loyalty level read from the thrown stack when the trident is released
|
||||
ThrownTrident.tickDespawn inline crates/horizon-client/src/arrows.rs::Ticker::tick gap: minor: the 1200-tick life limit applies to every trident; the loyalty exemption is not checked
|
||||
AbstractHurtingProjectile.shouldRenderAtSqrDistance skip:ui distance culling for the fireball model; Horizon culls with its own range check
|
||||
AbstractHurtingProjectile.canHitEntity missing minor: no-physics entities are not skipped by the fireball's target search
|
||||
WitherSkull.getBlockExplosionResistance missing minor: a dangerous skull's blast does not cap block resistance at 0.8; the blast call takes no dangerous flag
|
||||
WitherSkull.onHit port crates/horizon-client/src/game/wither.rs::Game::wither_skull_hit skull hit damage, wither effect, then the blast at the impact point
|
||||
AbstractWindCharge.makeBoundingBox port crates/horizon-client/src/projectiles.rs::ProjectileKind::size gap: minor: gives the width only; the box sits 0.15 below the position in vanilla
|
||||
AbstractWindCharge.canHitEntity missing minor: no filter for end crystals or other wind charges found in the target list; unsure whether the caller excludes them
|
||||
AbstractWindCharge.onHitBlock port crates/horizon-client/src/game/wind.rs::Game::wind_charge_hit a burst a quarter block out along the hit face
|
||||
WindCharge.deflect port crates/horizon-client/src/game/wind.rs::reverse gap: minor: turns the charge at half speed; the noDeflectTicks delay is not modelled
|
||||
WindCharge.shouldRenderAtSqrDistance skip:ui distance culling for the wind charge model; Horizon culls with its own range check
|
||||
ThrownEgg.onHitEntity port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit egg hit on a mob: zero damage, then the egg break and chick roll run on any landing
|
||||
ThrownEnderpearl.deregisterFromCurrentOwner skip:other chunk-ticket bookkeeping for a player's pearls; Horizon has no chunk tickets for flying pearls
|
||||
ThrownEnderpearl.registerToCurrentOwner skip:other chunk-ticket bookkeeping for a player's pearls; Horizon has no chunk tickets for flying pearls
|
||||
ThrownEnderpearl.getOwner skip:other owner is kept as a Who value and resolved by the caller
|
||||
ThrownEnderpearl.findOwnerIncludingDeadPlayer skip:other owner lookup by UUID across dead players; Horizon keeps the owner id directly
|
||||
ThrownEnderpearl.onHitEntity port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit a mob hit takes zero damage; the pearl still lands
|
||||
ThrownEnderpearl.onHit port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit gap: minor: no 32 portal particles and no dimension change; the owner is teleported to where the pearl was, with 5 damage and a 5 percent endermite
|
||||
ThrownEnderpearl.isAllowedToTeleportOwner missing minor: a pearl whose owner is dead or asleep when it lands still teleports the owner
|
||||
ThrownEnderpearl.playSound port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit teleport sound at the landing point
|
||||
ThrownEnderpearl.teleport port crates/horizon-client/src/game/creatures.rs::Game::projectile_hit moves the player to the pearl's previous position and clears velocity and fall distance
|
||||
ThrownEnderpearl.canTeleport missing minor: a pearl from the End to the Overworld needs the owner's seen-credits flag before it may teleport
|
||||
ThrownEnderpearl.onInsideBlock missing player: a pearl that flies into an end gateway does not send its owner through it
|
||||
Raid.<init> port crates/horizon-client/src/raid.rs::Raid::new centre, difficulty-based group count, cooldown and active flag
|
||||
Raid.getAllRaiders port crates/horizon-client/src/game/raids.rs::Game::raid_members the raiders of this raid, from the mobs carrying its id
|
||||
Raid.getValidSpawnPos port crates/horizon-client/src/raid.rs::Raid::find_spawn_pos eight tries around the centre, as findRandomSpawnPos(level, 8)
|
||||
Raid.getHealthOfLivingRaiders port crates/horizon-client/src/raid.rs::living_health sum of the living raiders' health
|
||||
Raid.getBannerComponentPatch port crates/horizon-client/src/mobs/raider.rs::ominous_banner the ominous banner stack: its patterns, hidden tooltip, name and rarity
|
||||
Raid.getDefaultNumSpawns port crates/horizon-client/src/raid.rs::Raid::wave_count gap: minor: the base count is in the same fn as the bonus and extra rolls
|
||||
Raid.getPotentialBonusSpawns port crates/horizon-client/src/raid.rs::Raid::wave_count extra roll per type and difficulty: vindicators and pillagers, witches after wave 2, ravagers on the bonus wave
|
||||
Raider.hasRaid port crates/horizon-client/src/mobs/raider.rs::in_raid gap: minor: checks only the raid id the raider holds; vanilla also looks for a raid at its position
|
||||
Raider.readAdditionalSaveData missing minor: Wave, CanJoinRaid and RaidId are not read back from a save, so a loaded raider loses its wave and raid link
|
||||
Raider.pickUpItem inline crates/horizon-client/src/game/raids.rs::Game::sync_raiders the banner pickup branch makes the raider the wave leader; gap: minor: the item already worn in the head slot is not dropped first
|
||||
Raider.ObtainRaidLeaderBannerGoal.cannotPickUpBanner port crates/horizon-client/src/mobs/raider.rs::ObtainBanner::can_use gap: minor: checks only a known, reachable banner; the raid-over, can-be-leader and head-slot rules are not repeated here
|
||||
Raider.RaiderMoveThroughVillageGoal.isValidRaid inline crates/horizon-client/src/mobs/raider.rs::MoveThroughVillage::can_use active raid and not over, checked first
|
||||
Raider.RaiderMoveThroughVillageGoal.hasSuitablePoi inline crates/horizon-client/src/mobs/raider.rs::MoveThroughVillage::can_use gap: minor: picks from the known homes within 48 blocks; no POI search or occupancy check
|
||||
Raider.RaiderMoveThroughVillageGoal.hasNotVisited inline crates/horizon-client/src/mobs/raider.rs::MoveThroughVillage::can_use homes already visited are filtered out of the candidates
|
||||
Raider.RaiderMoveThroughVillageGoal.updateVisited inline crates/horizon-client/src/mobs/raider.rs::MoveThroughVillage::can_use the visited list is trimmed first in can_use, as vanilla canUse does
|
||||
Raids.getId skip:other raids are looked up by their id, so no reverse lookup from a raid to its id is needed
|
||||
Raids.canJoinRaid inline crates/horizon-client/src/game/raids.rs::Game::sync_raiders alive, the join flag and no action for 2400 ticks are checked in the raider sync
|
||||
Raids.getOrCreateRaid port crates/horizon-client/src/raid.rs::Raids::create_or_extend the raid at the position is reused, otherwise a new one is made
|
||||
Raids.getRaidCentersInChunk skip:debug the raid centres per chunk feed the debug raid markers only
|
||||
PriorityProvider.Selector.codec skip:java record codec for a variant selector's condition and priority
|
||||
VariantUtils.getDefaultOrAny port crates/horizon-client/src/mobs/finalize.rs::variant_index gap: minor: name to index with unknown names falling back to index 0; no registry holder lookup
|
||||
VariantUtils.writeVariant inline crates/horizon-client/src/entity_nbt.rs::mob_to_nbt the variant key is written with the rest of the mob's save data
|
||||
VariantUtils.readVariant port crates/horizon-client/src/entity_nbt.rs::read_variant reads the variant key from the save
|
||||
ContainerEntity.addChestVehicleSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::to_nbt writes the cart's items and any loot table
|
||||
ContainerEntity.readChestVehicleSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::from_nbt reads the cart's items from the save
|
||||
ContainerEntity.chestVehicleDestroyed port crates/horizon-client/src/game/minecarts.rs::Game::hurt_cart a destroyed cart drops its items when entity drops are on
|
||||
ContainerEntity.unpackChestVehicleLootTable missing unsure: Minecart.loot is only read and written with the save and is never set here, so a chest minecart's loot table may never roll into its slots
|
||||
ContainerEntity.isChestVehicleEmpty inline crates/horizon-client/src/game/minecarts.rs::Minecart::container_signal the comparator signal reads the slots' emptiness; gap: minor: no separate empty test
|
||||
ContainerEntity.removeChestVehicleItemNoUpdate skip:other slot edits happen on the chest block entity under the cart's key; store_cart_items and close_cart_container copy them back
|
||||
ContainerEntity.setChestVehicleItem skip:other slot edits happen on the chest block entity under the cart's key; store_cart_items and close_cart_container copy them back
|
||||
ContainerEntity.getChestVehicleSlot skip:other slot access happens on the chest block entity under the cart's key; store_cart_items and close_cart_container copy them back
|
||||
DismountHelper.canDismountTo port crates/horizon-client/src/game/respawn_anchor.rs::Game::safe_dismount_location gap: minor: tests the floor and a 1.8 block box for the player, not the passenger's pose box
|
||||
DismountHelper.findCeilingFrom inline crates/horizon-client/src/game/respawn_anchor.rs::Game::safe_dismount_location gap: minor: head room comes from the 1.8 box collision, not a ceiling scan
|
||||
VehicleEntity.ignoreExplosion missing minor: with mobGriefing off a mob's blast still damages carts and boats; the explosion code has no mob-source rule for them
|
||||
VehicleEntity.destroy port crates/horizon-client/src/game/boats.rs::Game::hurt_boat boats drop their item when entity drops are on; a minecart breaks through hurt_cart
|
||||
VehicleEntity.defineSynchedData skip:java hurt time, hurt direction and damage fields; Horizon keeps them on the cart and boat structs
|
||||
|
@@ -0,0 +1,147 @@
|
||||
AbstractBoat.setInitialPos port crates/horizon-client/src/game/boats.rs::Boat::new spawn sets the position and its previous copy; velocity and yaw start at zero
|
||||
AbstractBoat.defineSynchedData skip:java SynchedEntityData definitions; Horizon keeps paddle, hurt and input state on the Boat struct
|
||||
AbstractBoat.getPassengerAttachmentPoint port crates/horizon-client/src/game/boats.rs::Boat::seat seat height and the two-seat offsets, +0.2 for an animal; chest boat's 0.15 is included
|
||||
AbstractBoat.onAboveBubbleColumn missing player: a boat over a bubble column is not lifted or pushed down and no splash plays on it; Horizon has no bubble column for boats
|
||||
AbstractBoat.animateHurt port crates/horizon-client/src/game/boats.rs::Game::hurt_boat sets the hurt wobble and time; gap: minor: uses the server damage x10, no separate client x11 wobble value
|
||||
AbstractBoat.tickBubbleColumn missing player: a boat in a bubble column does not rise or sink and ejects no passengers from a down column; Horizon has no bubble time on boats
|
||||
AbstractBoat.handleEntityEvent missing player: the bubble column effect event (71 or 72) never reaches a boat, same gap as the bubble column lift
|
||||
AbstractBoat.handleBubbleColumnEffect missing player: a boat in an up or down bubble column keeps its speed; Horizon never changes its vertical velocity from a column
|
||||
AbstractBoat.setPaddleState inline crates/horizon-client/src/game/boats.rs::Game::tick_boat paddle flags are set from the rider's input inside the controlled branch
|
||||
AbstractBoat.getLeashOffset missing player: a lead can be tied to a boat in vanilla (AbstractBoat is Leashable); Horizon leads only mobs
|
||||
AbstractBoat.getStatus port crates/horizon-client/src/game/boats.rs::Game::boat_status in air, in water, under water or on land
|
||||
AbstractBoat.getWaterLevelAbove port crates/horizon-client/src/game/boats.rs::Game::water_level_above
|
||||
AbstractBoat.getGroundFriction inline crates/horizon-client/src/game/boats.rs::Game::boat_status land friction is the average of the full blocks under the hull
|
||||
AbstractBoat.checkInWater inline crates/horizon-client/src/game/boats.rs::Game::boat_status sets the water level and reports the in-water status
|
||||
AbstractBoat.isUnderwater inline crates/horizon-client/src/game/boats.rs::Game::boat_status the under-water and flowing-water check runs first in boat_status
|
||||
AbstractBoat.floatBoat inline crates/horizon-client/src/game/boats.rs::Game::tick_boat buoyancy, friction and the first-water-touch snap are in tick_boat
|
||||
AbstractBoat.controlBoat inline crates/horizon-client/src/game/boats.rs::Game::tick_boat steering, acceleration and paddle flags in the controlled branch of tick_boat
|
||||
AbstractBoat.getDismountLocationForPassenger port crates/horizon-client/src/game/boats.rs::Game::boat_dismount_target gap: minor: no dismount pose check; the floor and water tests are there
|
||||
AbstractBoat.clampRotation inline crates/horizon-client/src/game/boats.rs::Game::tick_riding the rider's yaw is clamped to 105 degrees off the boat; mobs get the head clamp in boat_passengers.rs seat_boat_mobs
|
||||
AbstractBoat.calculatePassengerBodyYRot inline crates/horizon-client/src/game/boat_passengers.rs::Game::seat_boat_mobs animal turned 90 or 270 degrees when the boat is full
|
||||
AbstractBoat.onPassengerTurned inline crates/horizon-client/src/game/boats.rs::Game::tick_riding the rider's turn is clamped each tick
|
||||
AbstractBoat.remove inline crates/horizon-client/src/game/boats.rs::Game::hurt_boat destroyed boats eject mobs and drop the boat; gap: minor: no leash drop, since boats cannot be leashed here
|
||||
AbstractBoat.checkFallDamage missing minor: boats keep no fall distance; boats take no fall damage either way
|
||||
AbstractBoat.getPaddleState port crates/horizon-client/src/game/boats.rs::Boat::rowing_time paddle flag, set only while a rider drives
|
||||
AbstractBoat.getControllingPassenger inline crates/horizon-client/src/game/boats.rs::Game::tick_riding the riding player is the controller; mobs never steer
|
||||
AbstractBoat.setInput inline crates/horizon-client/src/game/boats.rs::Game::tick_riding input flags are copied from the keys each tick
|
||||
AbstractBoat.isUnderWater port crates/horizon-client/src/game/boats.rs::Boat::under_water
|
||||
AbstractBoat.modifyPassengerFluidInteractionBox missing minor: a rider's water check still uses the whole body; horizon-world boat_passenger_box exists but no game code calls it
|
||||
AbstractChestBoat.remove inline crates/horizon-client/src/game/boats.rs::Game::hurt_boat a destroyed chest boat spills its 27 slots
|
||||
AbstractChestBoat.openCustomInventoryScreen inline crates/horizon-client/src/game/boats.rs::Game::interact_boat sneaking opens the chest; gap: minor: no piglin anger
|
||||
AbstractChestBoat.createMenu inline crates/horizon-client/src/game/boats.rs::Game::interact_boat the chest container is set up there; gap: minor: no spectator or loot table check
|
||||
AbstractMinecart.setInitialPos port crates/horizon-client/src/game/minecarts.rs::Minecart::new spawn sets the position and its previous copy
|
||||
AbstractMinecart.createMinecart port crates/horizon-client/src/game/minecarts.rs::Game::place_minecart placing on a rail: the rail offset for slopes and the item's kind; gap: minor: no rail snap, which only the experimental behaviour does
|
||||
AbstractMinecart.defineSynchedData skip:java synched display block and offset; Horizon keeps the kind and its display offset on the Minecart struct
|
||||
AbstractMinecart.getPassengerAttachmentPoint missing minor: a villager or wandering trader in a cart sits at a lowered seat in vanilla; Horizon seats only the player in a cart
|
||||
AbstractMinecart.getDismountLocationForPassenger port crates/horizon-client/src/game/minecarts.rs::Game::dismount_cart beside the cart, else on top; gap: minor: the side comes from the yaw, and there is no pose or ceiling check
|
||||
AbstractMinecart.getBlockSpeedFactor missing minor: a cart that has left the rails takes no block speed factor (soul sand, honey); on rails the factor is 1.0 in vanilla and Horizon has no such slowdown
|
||||
AbstractMinecart.animateHurt port crates/horizon-client/src/game/minecarts.rs::Game::hurt_cart sets the hurt wobble and time; gap: minor: the damage is the server x10, with no separate client wobble value
|
||||
AbstractMinecart.getCurrentBlockPosOrRailBelow port crates/horizon-client/src/game/minecarts.rs::Game::rail_block the rail one block below counts; the experimental y offset is not used
|
||||
AbstractMinecart.comeOffTrack port crates/horizon-client/src/game/minecarts.rs::Game::come_off_track clamps speed, halves it on the ground, moves and drags in the air
|
||||
AbstractMinecart.move port crates/horizon-client/src/game/minecarts.rs::Game::move_cart collision movement only; gap: minor: no push or pickup during the move, which push_carts and the cart tick do instead
|
||||
AbstractMinecart.applyEffectsFromBlocks inline crates/horizon-client/src/game/minecarts.rs::Game::cart_lava_tick lava is applied there; gap: minor: other block effects on a cart (cobweb, berry bush, bubble column) are not applied
|
||||
AbstractMinecart.getRedstoneDirection skip:other used only by the experimental NewMinecartBehavior; Horizon runs the old track behaviour
|
||||
AbstractMinecart.applyNaturalSlowdown port crates/horizon-client/src/game/minecarts.rs::Game::natural_slowdown slowdown per ride state, the furnace push and water
|
||||
AbstractMinecart.readAdditionalSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::from_nbt flipped and HasTicked read back; gap: minor: a custom display block and offset are not kept
|
||||
AbstractMinecart.addAdditionalSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::to_nbt flipped and HasTicked written; gap: minor: a custom display block and offset are not saved
|
||||
AbstractMinecart.pushOtherMinecart port crates/horizon-client/src/game/minecarts.rs::Game::push_from_cart cart against cart push with the furnace case; the old-movement facing check is used
|
||||
Minecart.interact port crates/horizon-client/src/game/minecarts.rs::Game::interact_cart a plain rideable cart is boarded unless sneaking or already ridden
|
||||
Minecart.activateMinecart port crates/horizon-client/src/game/minecarts.rs::Game::activate_cart a powered activator rail ejects the rider and hurts a rideable cart
|
||||
Minecart.tick port crates/horizon-client/src/game/minecarts.rs::Game::tick_cart the per-tick cart update; gap: minor: client rotation smoothing for experimental movement is not modelled
|
||||
Minecart.positionRider port crates/horizon-client/src/game/minecarts.rs::Game::tick_cart_riding the rider sits at the cart seat; the rider's turn with the cart is experimental-only
|
||||
MinecartBehavior.setDeltaMovement skip:other behaviour forwarder; Horizon's Minecart struct holds the velocity directly
|
||||
MinecartBehavior.setPos skip:other behaviour forwarder; Horizon's Minecart struct holds the position directly
|
||||
MinecartHopper.activateMinecart port crates/horizon-client/src/game/minecarts.rs::Game::activate_cart an unpowered activator rail enables the hopper cart
|
||||
MinecartHopper.tryConsumeItems inline crates/horizon-client/src/game/minecarts.rs::Game::tick_carts an enabled hopper cart sucks in once a tick
|
||||
MinecartHopper.suckInItems port crates/horizon-client/src/game/machines.rs::Game::hopper_cart_suck container above first, then item entities at the hopper and the cart's box
|
||||
MinecartTNT.explode port crates/horizon-client/src/game/minecarts.rs::Game::explode_cart power 4 plus speed, with the cart gone before the blast; gap: minor: the saved explosion power and speed factor are not applied
|
||||
MinecartTNT.handleEntityEvent port crates/horizon-client/src/game/minecarts.rs::Game::prime_cart event 70 primes the fuse; Horizon primes locally with the same sound
|
||||
MinecartTNT.primeFuse port crates/horizon-client/src/game/minecarts.rs::Game::prime_cart fuse 80 and the primed sound; gap: minor: no ignition source is recorded for who caused the blast
|
||||
MinecartTNT.getBlockExplosionResistance missing minor: a primed TNT cart on rails gives rails zero blast resistance in vanilla; Horizon's blast uses the rail's normal resistance
|
||||
MinecartTNT.shouldBlockExplode missing minor: a primed TNT cart on rails does not block the blast in vanilla; Horizon's blast ray is not changed by a cart on rails
|
||||
MinecartTNT.readAdditionalSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::from_nbt fuse read back; gap: minor: explosion_power and explosion_speed_factor are not read
|
||||
MinecartTNT.addAdditionalSaveData port crates/horizon-client/src/game/minecarts.rs::Minecart::to_nbt fuse written; gap: minor: explosion_power and explosion_speed_factor are not written
|
||||
MinecartTNT.damageSourceIgnitesTnt port crates/horizon-client/src/game/minecarts.rs::Game::hurt_cart the fire flag from the caller primes the cart instead of breaking it
|
||||
OldMinecartBehavior.tick port crates/horizon-client/src/game/minecarts.rs::Game::tick_cart gravity, track or off-track move, activator rail, yaw from motion and the flip
|
||||
OldMinecartBehavior.getMotionDirection inline crates/horizon-client/src/game/minecarts.rs::Game::dismount_cart the dismount side is the cart's facing, taken from its yaw
|
||||
OldMinecartBehavior.getKnownMovement skip:other client-side clamp of the known movement for networking; Horizon simulates carts itself
|
||||
FoodData.add port crates/horizon-world/src/food.rs::FoodData::eat_properties food points and saturation are added and clamped to 0..20 and to the food level
|
||||
FoodData.readAdditionalSaveData port crates/horizon-world/src/food_storage.rs::FoodData::read_nbt food level, tick timer, saturation and exhaustion read back
|
||||
FoodData.addAdditionalSaveData port crates/horizon-world/src/food_storage.rs::FoodData::write_nbt food level, tick timer, saturation and exhaustion written
|
||||
FoodProperties.Builder.build skip:java builder for the food component; the saturation rule (nutrition times modifier times 2) is in food.rs FoodData::eat
|
||||
AbstractContainerMenu.addInventoryHotbarSlots skip:ui slot layout and positions only; Horizon indexes the player's slots in Menu::new and draws them in draw_inventory_slots
|
||||
AbstractContainerMenu.addInventoryExtendedSlots skip:ui slot layout and positions only; Horizon indexes the player's slots in Menu::new and draws them in draw_inventory_slots
|
||||
AbstractContainerMenu.addStandardInventorySlots skip:ui slot layout and positions only; Horizon indexes the player's slots in Menu::new and draws them in draw_inventory_slots
|
||||
AbstractContainerMenu.stillValid port crates/horizon-client/src/lan/menu.rs::Slots::still_valid the container's block is still there and within 4 blocks of the player
|
||||
AbstractContainerMenu.getType port crates/horizon-client/src/menu.rs::Menu::kind the menu's kind as its type
|
||||
AbstractContainerMenu.checkContainerSize skip:other construction sanity check; Horizon's container sizes come from fixed tables
|
||||
AbstractContainerMenu.checkContainerDataCount skip:other construction sanity check; Horizon's data counts come from fixed tables
|
||||
AbstractContainerMenu.isValidSlotIndex inline crates/horizon-client/src/menu.rs::Menu::click an index inside the menu or -999 for a click outside the window
|
||||
AbstractContainerMenu.addSlot inline crates/horizon-client/src/menu.rs::Menu::new slots are built per kind when the menu is made
|
||||
AbstractContainerMenu.addDataSlot skip:java registers a DataSlot object; progress values are set directly by Menu::set_data
|
||||
AbstractContainerMenu.addDataSlots skip:java registers DataSlot objects for a ContainerData; progress values are set directly by Menu::set_data
|
||||
AbstractContainerMenu.addSlotListener skip:java listener list for local screens; a viewer reads the menu state directly
|
||||
AbstractContainerMenu.setSynchronizer inline crates/horizon-client/src/lan/containers.rs::Hub::open_container the synchroniser is the guest's connection; opening sends the full content at once
|
||||
AbstractContainerMenu.sendAllDataToRemote port crates/horizon-client/src/lan/containers.rs::Hub::send_menu_content all slots, the carried stack and the menu state in one packet
|
||||
AbstractContainerMenu.getItems inline crates/horizon-client/src/lan/containers.rs::Hub::send_menu_content the item list for the content packet is built there
|
||||
AbstractContainerMenu.broadcastFullState port crates/horizon-client/src/lan/containers.rs::Hub::send_menu_content a full resend of the contents; gap: minor: no separate local listener pass
|
||||
AbstractContainerMenu.updateDataSlotListeners skip:java local listener dispatch for data changes; the wire side is ContainerSetData in sync_container_data
|
||||
AbstractContainerMenu.triggerSlotListeners skip:java local listener dispatch for slot changes; the wire side is the slot diff in sync_containers
|
||||
AbstractContainerMenu.synchronizeSlotToRemote port crates/horizon-client/src/lan/containers.rs::Hub::sync_containers sends each changed slot with a new state id
|
||||
AbstractContainerMenu.synchronizeDataSlotToRemote port crates/horizon-client/src/lan/containers.rs::Hub::sync_container_data sends each changed furnace, brewing or crafter value
|
||||
AbstractContainerMenu.synchronizeCarriedToRemote inline crates/horizon-client/src/lan/containers.rs::Hub::answer_click the cursor item is sent after a click when it differs; gap: minor: no sync on other carried changes
|
||||
AbstractContainerMenu.setRemoteSlotUnsafe port crates/horizon-client/src/game/remote.rs::Game::set_menu_slot the server's slot update is applied; gap: minor: no hashed copy of the remote slot is kept
|
||||
AbstractContainerMenu.getClickAction inline crates/horizon-client/src/menu.rs::Menu::click button 0 is the primary action, 1 the secondary
|
||||
AbstractContainerMenu.tryItemClickBehaviourOverride port crates/horizon-client/src/menu/bundle.rs::Menu::bundle_click a bundle takes or puts items on a click on another stack; the NeoForge event is not modelled
|
||||
AbstractContainerMenu.initializeContents port crates/horizon-client/src/game/remote.rs::Game::set_menu_slot the server's full content is applied to the open menu
|
||||
AbstractContainerMenu.isValidQuickcraftType inline crates/horizon-client/src/menu.rs::Menu::click drag types 0 and 1 always, type 2 only in creative
|
||||
AbstractContainerMenu.canItemQuickReplace port crates/horizon-client/src/menu.rs::Menu::quick_replace a slot takes the stack when empty or the same item with room
|
||||
AbstractContainerMenu.transferState skip:other copies the remote-slot cache back to the player's inventory on close; Horizon's guest inventory is the one copy
|
||||
AbstractContainerMenu.findSlot skip:other looks up a menu index for the held slot; Horizon's menus use fixed player slot indexes
|
||||
AbstractContainerMenu.incrementStateId inline crates/horizon-client/src/lan/containers.rs::Hub::send_menu_content the state id goes up with each content packet; sync_containers does the same per slot change
|
||||
AbstractFurnaceMenu.fillCraftSlotsStackedContents port crates/horizon-client/src/menu/place.rs::Menu::stacked_contents the recipe book's stacked contents are counted from the menu; gap: minor: the furnace's own slots are not counted
|
||||
AbstractFurnaceMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for furnace slots, with the smeltable, fuel and inventory rules
|
||||
AbstractFurnaceMenu.getBurnProgress skip:ui flame fraction for the screen; game.rs draw_inventory draws it from the furnace timers
|
||||
AbstractFurnaceMenu.getLitProgress skip:ui arrow fraction for the screen; game.rs draw_inventory draws it from the furnace timers
|
||||
AbstractFurnaceMenu.handlePlacement port crates/horizon-client/src/menu/place.rs::Menu::place_recipe recipe book placement into the furnace input and fuel
|
||||
AnvilMenu.createInputSlotDefinitions skip:ui slot positions and the accept-all rule; positions come from station_slot_position and the accept rules from slot_rules
|
||||
AnvilMenu.validateName port crates/horizon-client/src/menu.rs::Menu::rename name filtered of formatting codes and capped at 50 UTF-16 units
|
||||
ArmorSlot.setByPlayer port crates/horizon-client/src/menu.rs::Menu::set_by_player_from an equipment change runs onEquipItem only when the item changes
|
||||
ArmorSlot.mayPickup port crates/horizon-client/src/menu.rs::Menu::may_pickup a cursed armour piece cannot be taken out in survival; creative can
|
||||
BeaconMenu.decodeEffect port crates/horizon-client/src/game/lan_stations.rs::Game::lan_station_beacon effect id from the registry, 0 for none; an unknown id fails the packet
|
||||
BrewingStandMenu.<init> inline crates/horizon-client/src/menu.rs::Menu::new the brewing stand's slots and data are built per kind when the menu is made
|
||||
BrewingStandMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the brewing stand's potion, ingredient and fuel slots
|
||||
CartographyTableMenu.setupResultSlot port crates/horizon-client/src/menu.rs::Menu::carto_changed the map copy, scale or lock result from a paper, glass pane or map
|
||||
CartographyTableMenu.canTakeItemForPickAll port crates/horizon-client/src/menu.rs::Menu::can_take_for_pick_all the result slot is never picked up in bulk
|
||||
CartographyTableMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the cartography slots
|
||||
CartographyTableMenu.removed inline crates/horizon-client/src/game/stations.rs::Game::close_station the inputs go back when the table closes
|
||||
CrafterMenu.addSlots inline crates/horizon-client/src/menu.rs::Menu::new the 3x3 grid, the result and the data are set up when the crafter menu is made
|
||||
CrafterMenu.isSlotDisabled inline crates/horizon-client/src/game/machines/crafter.rs::Game::crafter_slot_clicked a disabled slot refuses a click; the disabled flags are read there
|
||||
CrafterMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the crafter's grid slots
|
||||
CraftingMenu.slotsChanged port crates/horizon-client/src/menu.rs::Menu::inventory_slots_changed the crafting result is recomputed when the grid changes
|
||||
CraftingMenu.finishPlacingRecipe inline crates/horizon-client/src/menu/place.rs::Menu::place_recipe the result is recomputed once the placed recipe is in the grid
|
||||
CraftingMenu.removed port crates/horizon-client/src/game/lan_crafting.rs::Game::lan_crafting_closed the grid goes back when the table closes; the host side of a guest's table
|
||||
CraftingMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the crafting grid and result
|
||||
CraftingMenu.canTakeItemForPickAll port crates/horizon-client/src/menu.rs::Menu::can_take_for_pick_all the result slot is never picked up in bulk
|
||||
DispenserMenu.add3x3GridSlots inline crates/horizon-client/src/menu.rs::Menu::new the 3x3 dispenser grid is set up when the menu is made
|
||||
DispenserMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the dispenser grid
|
||||
EnchantmentMenu.<init> inline crates/horizon-client/src/game/stations.rs::Game::open_station slots and the offers are set up when the table opens
|
||||
EnchantmentMenu.getGoldCount inline crates/horizon-client/src/menu.rs::Menu::enchant_click the lapis count is checked against the enchant cost there
|
||||
EnchantmentMenu.removed inline crates/horizon-client/src/game/stations.rs::Game::close_station the inputs go back when the table closes
|
||||
EnchantmentMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the enchanting slots, with lapis and the item slot
|
||||
FurnaceResultSlot.remove port crates/horizon-client/src/game.rs::Game::award_furnace_recipes the furnace output's experience is awarded from the recorded recipe uses; gap: minor: no per-slot taken count
|
||||
GrindstoneMenu.mergeItems port crates/horizon-client/src/stations.rs::grindstone_result two repairable items merge into one with the summed durability
|
||||
GrindstoneMenu.mergeEnchantsFrom inline crates/horizon-client/src/stations.rs::grindstone_result the second item's enchantments merge in, curses only when the target lacks them
|
||||
GrindstoneMenu.removed inline crates/horizon-client/src/game/stations.rs::Game::close_station the repair inputs go back when the grindstone closes
|
||||
GrindstoneMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the grindstone inputs and result
|
||||
HopperMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the hopper's five slots
|
||||
HorseInventoryMenu.<init> port crates/horizon-client/src/game/lan_mount_menu.rs::Game::mount_engine_menu saddle, armour and the chest columns are set for the mount
|
||||
InventoryMenu.isHotbarSlot inline crates/horizon-client/src/menu.rs::Menu::quick_move the hotbar range check is inline in the shift-click arm
|
||||
InventoryMenu.slotsChanged port crates/horizon-client/src/menu.rs::Menu::inventory_slots_changed the crafting result is recomputed when the grid changes
|
||||
InventoryMenu.removed port crates/horizon-client/src/game/lan_crafting.rs::Game::lan_crafting_closed the window-0 craft grid goes back when the inventory closes; the host side of a guest's inventory
|
||||
InventoryMenu.quickMoveStack port crates/horizon-client/src/menu.rs::Menu::quick_move shift-click for the inventory, armour, grid and offhand
|
||||
InventoryMenu.canTakeItemForPickAll port crates/horizon-client/src/menu.rs::Menu::can_take_for_pick_all the result slot is never picked up in bulk
|
||||
ItemCombinerMenu.createInputSlots inline crates/horizon-client/src/menu.rs::Menu::new the anvil's input slots are set up when the menu is made; mayPlace is Menu::may_place
|
||||
ItemCombinerMenu.createResultSlot inline crates/horizon-client/src/menu.rs::Menu::new the result slot is set up when the menu is made and takes no placed items
|
||||
ItemCombinerMenu.removed inline crates/horizon-client/src/game/stations.rs::Game::close_station the input items go back when the station closes
|
||||
ItemCombinerMenu.stillValid port crates/horizon-client/src/lan/menu.rs::Slots::still_valid the station's block is still there and within 4 blocks of the player
|
||||
|
@@ -0,0 +1,149 @@
|
||||
LoomMenu.<init> port crates/horizon-client/src/menu.rs::Menu::new the loom's banner, dye, pattern and result slots are laid out for Kind::Loom in the constructor
|
||||
LoomMenu.clickMenuButton port crates/horizon-client/src/menu.rs::Menu::button pattern index check and selection; the select sound is played by game/loom.rs::Game::loom_button
|
||||
LoomMenu.isValidPatternIndex inline crates/horizon-client/src/menu.rs::Menu::button the range check is inline in button
|
||||
LoomMenu.quickMoveStack inline crates/horizon-client/src/menu.rs::Menu::quick_move the Kind::Loom arm
|
||||
LoomMenu.removed port crates/horizon-client/src/game/stations.rs::Game::close_station input stacks are given back or dropped when the station closes
|
||||
MenuType.register skip:data menu type registry bootstrap
|
||||
MerchantContainer.isEmpty skip:java container emptiness helper; Horizon checks the stacks it needs directly
|
||||
MerchantContainer.setItem inline crates/horizon-client/src/menu.rs::Menu::slot_changed the store is the generic put; the payment update is merchant_update, run from slot_changed for every merchant slot
|
||||
MerchantMenu.quickMoveStack inline crates/horizon-client/src/menu.rs::Menu::quick_move the Kind::Merchant arm; a result shift-click also queues the trade sound event
|
||||
MerchantMenu.playTradeSound missing player: a shift-click trade should play the villager yes sound; the menu queues Event::TradeSound and game/trading.rs drops it with an empty arm
|
||||
MerchantResultSlot.remove port crates/horizon-client/src/menu.rs::Menu::remove gap: minor: the removeCount tally that feeds the crafted statistic is not kept
|
||||
MerchantResultSlot.mayPickup port crates/horizon-client/src/menu.rs::Menu::may_pickup the Role::MerchantResult arm
|
||||
ResultSlot.remove port crates/horizon-client/src/menu.rs::Menu::remove gap: minor: the removeCount tally for the crafted statistic is not kept
|
||||
ResultSlot.safeClone skip:other onCraftedBy only matters for MAP_POST_PROCESSING, which only cartography results carry; map_crafted covers that take
|
||||
ResultSlot.checkTakeAchievements port crates/horizon-client/src/game.rs::Game::award_crafted gap: minor: the recipe is awarded; the crafted statistic count from onCraftedBy is not added on this take
|
||||
ResultSlot.copyAllInputItems inline crates/horizon-client/src/crafting.rs::Recipes::remainders gap: minor: vanilla copies every input when no recipe matches on the server; remainders returns none for an unmatched recipe
|
||||
ResultSlot.getRemainingItems port crates/horizon-client/src/crafting.rs::Recipes::remainders container remainders and the special banner and book copies
|
||||
Slot.safeTake port crates/horizon-client/src/menu.rs::Menu::safe_take
|
||||
SlotRanges.create inline crates/horizon-command/src/args.rs::slot_ranges a range is a name and size pair built in slot_ranges
|
||||
SlotRanges.addSlotRange inline crates/horizon-command/src/args.rs::slot_ranges the range closure adds the numbered names and the wildcard
|
||||
SlotRanges.tryRead inline crates/horizon-command/src/args.rs::ArgType::parse the Slots and Slot arms read a name and check the range exists
|
||||
SmithingMenu.createInputSlotDefinitions port crates/horizon-client/src/menu.rs::Menu::new the three input slots and the result slot; the input tests run in may_place (Role::SmithInput)
|
||||
SmithingMenu.getRelevantItems inline crates/horizon-client/src/menu.rs::Menu::smith_result the three input stacks are read directly
|
||||
SmithingMenu.createRecipeInput inline crates/horizon-client/src/menu.rs::Menu::smith_result the recipe input is passed to smithing_result
|
||||
SmithingMenu.shrinkStackInSlot inline crates/horizon-client/src/menu.rs::Menu::on_take the SmithingMenu take arm removes one of each input
|
||||
SmithingMenu.canTakeItemForPickAll port crates/horizon-client/src/menu.rs::Menu::can_take_for_pick_all the result slot is excluded
|
||||
SmithingMenu.canMoveIntoInputSlots inline crates/horizon-client/src/menu.rs::Menu::quick_move the Anvil or Smithing arm checks for an empty input the stack fits
|
||||
StonecutterMenu.hasInputItem inline crates/horizon-client/src/game/stations.rs::Station::stonecutter_changed the draw flag; the list scroll resets on the same input and recipe check
|
||||
StonecutterMenu.isValidRecipeIndex inline crates/horizon-client/src/menu.rs::Menu::button the stonecutter arm checks the recipe index
|
||||
StonecutterMenu.setupRecipeList port crates/horizon-client/src/menu.rs::Menu::stone_changed recipes for the input are selected and the selection and result reset
|
||||
StonecutterMenu.canTakeItemForPickAll port crates/horizon-client/src/menu.rs::Menu::can_take_for_pick_all the result slot is excluded
|
||||
StonecutterMenu.quickMoveStack inline crates/horizon-client/src/menu.rs::Menu::quick_move the Kind::Stonecutter arm
|
||||
StonecutterMenu.removed port crates/horizon-client/src/game/stations.rs::Game::close_station input stacks are given back when the station closes; the result is derived and not kept
|
||||
ArrowItem.asProjectile port crates/horizon-client/src/game/dispenser.rs::Game::shoot_projectile_item dispensed arrows are built in the arrow arm of the item shot
|
||||
BlockItem.updateBlockEntityComponents port crates/horizon-client/src/block_entity_item.rs::place the placed block entity takes the item's components
|
||||
BlockItem.canPlace port crates/horizon-world/src/level/place.rs::Sim::place the placement checks, including the survive check, run in Sim::place
|
||||
BlockItem.onDestroyed missing unsure: a container item whose item entity is destroyed should spill its contents; no Horizon code does this
|
||||
BoatItem.getBoat port crates/horizon-client/src/game/boats.rs::Game::place_boat boat placed at the hit point with the item's stack config
|
||||
BucketItem.playEmptySound port crates/horizon-world/src/level/buckets.rs::Sim::empty_sound
|
||||
BundleItem.getWeightSafe port crates/horizon-items/src/bundle.rs::Contents::weight_fraction float fraction; vanilla compares an exact Fraction
|
||||
BundleItem.getBarWidth port crates/horizon-items/src/bundle.rs::Contents::bar
|
||||
BundleItem.getBarColor port crates/horizon-items/src/bundle.rs::Contents::bar
|
||||
BundleItem.removeOneItemFromBundle port crates/horizon-items/src/bundle.rs::Contents::remove_one
|
||||
BundleItem.getTooltipImage port crates/horizon-items/src/bundle.rs::tooltip_layout gap: minor: the tooltip_display rule that hides the bundle contents is not checked here
|
||||
BundleItem.onDestroyed missing unsure: a bundle whose item entity is destroyed should spill its contents; no Horizon code does this
|
||||
BundleItem.playRemoveOneSound port crates/horizon-client/src/game.rs::Game::drop_bundle_content the menu queues the same sound in menu/bundle.rs
|
||||
BundleItem.playInsertSound port crates/horizon-client/src/menu/bundle.rs::Menu::carried_bundle_click queues the insert or insert-fail sound
|
||||
BundleItem.playDropContentsSound port crates/horizon-client/src/game.rs::Game::drop_bundle_content
|
||||
CompassItem.isFoil port crates/horizon-assets/src/item_model.rs::Resolve::has_foil a compass with a lodestone_tracker component glints
|
||||
CrossbowItem.tryLoadProjectiles port crates/horizon-client/src/game/crossbow.rs::Game::tick_crossbow the drawn ammo is stored on the crossbow once charged
|
||||
CrossbowItem.shootProjectile port crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow
|
||||
CrossbowItem.getProjectileShotVector inline crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow the multishot spread is rotated inline from the view and up vectors
|
||||
CrossbowItem.createProjectile inline crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow gap: player: crossbow arrows keep the normal arrow hit sound; the crossbow hit sound (item.crossbow.hit) is never set
|
||||
CrossbowItem.getShotPitch inline crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow the shot pitch per index is inline
|
||||
CrossbowItem.getRandomShotPitch inline crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow the random pitch formula is inline
|
||||
CrossbowItem.getPowerForTime inline crates/horizon-client/src/game/crossbow.rs::Game::tick_crossbow the charge fraction capped at one is the tick check against the charge time
|
||||
DyeColor.getMixedColor missing player: a baby sheep, wolf or cat from parents of two dye colours gets a mixed colour; Horizon has no breeding dye mix (only sheep_color for spawns)
|
||||
DyeColor.findColorMixInRecipes missing player: part of the same breeding dye mix; the crafting recipe lookup for two dyes is not done for offspring
|
||||
FireworkRocketItem.createDispenseConfig port crates/horizon-client/src/game/dispenser.rs::Game::dispense_projectile rocket config: offset 0.5000099, uncertainty 1, power 0.5, event 1004
|
||||
FireworkRocketItem.getEntityJustOutsideOfBlockPos port crates/horizon-client/src/game/dispenser.rs::Game::dispense_position the position just outside the dispenser on the facing side
|
||||
HangingEntityItem.mayPlace port crates/horizon-client/src/game/paintings.rs::Game::place_painting gap: player: the horizontal-face rule is checked for paintings only; place_item_frame has no vertical-face test
|
||||
HangingEntityItem.appendHoverText missing player: hovering a painting item shows no title, author or size line in its tooltip
|
||||
Item.getDestroySpeed port crates/horizon-items/src/items.rs::Items::mining_speed
|
||||
Item.finishUsingItem port crates/horizon-client/src/game.rs::Game::consume_held the consumable effects are applied by apply_consume_effect
|
||||
Item.getBarColor port crates/horizon-client/src/hud_overlays.rs::damage_bar width and hue from the damage fraction
|
||||
Item.mineBlock port crates/horizon-client/src/game.rs::Game::mine_block_with_held
|
||||
Item.isCorrectToolForDrops port crates/horizon-items/src/items.rs::Items::correct_for_drops
|
||||
Item.getUseAnimation port crates/horizon-items/src/use_animation.rs::consumable_animation consumable animation; the block and spear poses are handled by the item pose code
|
||||
Item.getPlayerPOVHitResult port crates/horizon-client/src/game.rs::Game::pick the view ray from the eyes; the fluid variant is Game::pick_fluid
|
||||
Item.Properties.food skip:data registration builder; Horizon reads item data from tables
|
||||
Item.Properties.usingConvertsTo skip:data registration builder
|
||||
Item.Properties.durability skip:data registration builder
|
||||
Item.Properties.craftRemainder skip:data registration builder
|
||||
Item.Properties.fireResistant skip:data registration builder; resists_fire reads the data
|
||||
Item.Properties.jukeboxPlayable skip:data registration builder
|
||||
Item.Properties.repairable skip:data registration builder
|
||||
Item.Properties.axe skip:data registration builder
|
||||
Item.Properties.hoe skip:data registration builder
|
||||
Item.Properties.shovel skip:data registration builder
|
||||
Item.Properties.spawnEgg skip:data registration builder
|
||||
Item.Properties.humanoidArmor skip:data registration builder
|
||||
Item.Properties.wolfArmor skip:data registration builder
|
||||
Item.Properties.horseArmor skip:data registration builder
|
||||
Item.Properties.nautilusArmor skip:data registration builder
|
||||
Item.Properties.requiredFeatures skip:data registration builder
|
||||
Item.Properties.delayedHolderComponent skip:data registration builder
|
||||
Item.Properties.loweredMobVisibility missing unsure: the mob_visibility component is not read by Horizon's mob targeting
|
||||
Item.Properties.finalizeInitializer skip:data registration builder
|
||||
Item.TooltipContext.of skip:java tooltip context factory; Horizon passes the level and player to the tooltip functions
|
||||
ItemStack.validateStrict skip:java codec-side validation of components and stack size
|
||||
ItemStack.hasNonDefault skip:other component presence query; Horizon reads stack fields directly
|
||||
ItemStack.validateComponents skip:java codec-side validation
|
||||
ItemStack.validateContainedItemSizes skip:java codec-side validation
|
||||
ItemStack.getDamageValue skip:other field accessor; Horizon keeps damage on the stack
|
||||
ItemStack.setDamageValue skip:other field write
|
||||
ItemStack.isBroken inline crates/horizon-client/src/game.rs::Game::damage_held the break test (damage at or over max) is in damage_held
|
||||
ItemStack.nextDamageWillBreak inline crates/horizon-client/src/game/trident.rs::Game::use_trident gap: minor: only the trident's check is ported here
|
||||
ItemStack.processDurabilityChange port crates/horizon-client/src/game/enchant_effects.rs::Game::durability_loss the Unbreaking-adjusted loss
|
||||
ItemStack.applyDamage port crates/horizon-client/src/game.rs::Game::damage_held gap: minor: no item durability advancement trigger fires
|
||||
ItemStack.hurtAndConvertOnBreak missing unsure: a carrot or fungus on a stick that breaks should become a fishing rod; no conversion was found
|
||||
ItemStack.hurtEnemy port crates/horizon-client/src/game/mace.rs::Game::weapon_wear the per-hit durability loss of a weapon
|
||||
ItemStack.interactLivingEntity port crates/horizon-client/src/game.rs::Game::interact_entity equip-on-interact is in the mob paths (nautili.rs, ghasts.rs)
|
||||
ItemStack.copy skip:java value copy
|
||||
ItemStack.copyWithCount skip:java value copy with a count
|
||||
ItemStack.transmuteCopyIgnoreEmpty port crates/horizon-items/src/item_data.rs::ItemStack::transmute keeps the components, changes the item
|
||||
ItemStack.listMatches skip:java element-wise list equality for CraftingInput; Horizon compares recipe inputs directly
|
||||
ItemStack.matchesIgnoringComponents port crates/horizon-items/src/item_data.rs::ItemStack::same_item_same_components gap: minor: no predicate for ignored component types
|
||||
ItemStack.lenientOptionalFieldOf skip:java codec helper
|
||||
ItemStack.hashItemAndComponents skip:java hash for collections
|
||||
ItemStack.hashStackList skip:java hash for collections
|
||||
ItemStack.onCraftedBy inline crates/horizon-client/src/game.rs::Game::click_inventory gap: minor: the crafted statistic is added only on the inventory grid craft path here
|
||||
ItemStack.set skip:other component write; Horizon stores component data in typed fields
|
||||
ItemStack.update skip:java functional update helper
|
||||
ItemStack.applyComponentsAndValidate missing unsure: a validated component patch has no single Horizon counterpart; /item modify is a separate path
|
||||
ItemStack.getStyledHoverName port crates/horizon-client/src/game/stations.rs::Game::stack_hover_name gap: minor: plain text; the rarity colour and italic style are not applied here
|
||||
ItemStack.addToTooltip port crates/horizon-client/src/item_tooltip.rs::lines
|
||||
ItemStack.addUnitComponentToTooltip inline crates/horizon-client/src/game/stations.rs::Game::stack_tooltip_lines unit lines such as unbreakable, gated by the tooltip display
|
||||
ItemStack.canPlaceOnBlockInAdventureMode missing player: in adventure mode a block can be placed only when the held item's can_place_on list allows it; Horizon does not read that component
|
||||
ItemStack.canBreakBlockInAdventureMode missing player: in adventure mode a block can be broken only when the held item's can_break list allows it; Horizon does not read that component
|
||||
ItemStack.getDamageSource missing unsure: a stack's damage_type component is not read when a weapon hits; no Horizon reader found
|
||||
ItemStackTemplate.fromNonEmptyStack port crates/horizon-items/src/item_data.rs::template_tag stack to template tag
|
||||
ItemStackTemplate.withCount skip:java record copy with a new count
|
||||
ItemStackTemplate.apply port crates/horizon-assets/src/item_model.rs::stack_from_template
|
||||
ItemUtils.onContainerDestroyed missing unsure: destroyed container items do not spill their contents; see BlockItem.onDestroyed
|
||||
Items.registerBlock skip:data item registry bootstrap
|
||||
Items.registerItem skip:data item registry bootstrap
|
||||
JukeboxSong.hasFinished port crates/horizon-items/src/items.rs::Song::finished
|
||||
JukeboxSongPlayer.setSongWithoutPlaying missing unsure: no load path restores a jukebox's song start tick
|
||||
JukeboxSongPlayer.play port crates/horizon-client/src/game/jukebox.rs::Game::start_song the song starts at the jukebox with its sound
|
||||
JukeboxSongPlayer.shouldEmitJukeboxPlayingEvent inline crates/horizon-client/src/game/jukebox.rs::Game::tick_jukebox
|
||||
JukeboxSongPlayer.spawnMusicParticles inline crates/horizon-client/src/game/jukebox.rs::Game::tick_jukebox the note particle is emitted in tick_jukebox
|
||||
LeadItem.bindPlayerMobs port crates/horizon-client/src/game/leads.rs::Game::interact_knot
|
||||
MaceItem.createAttributes skip:data attribute modifiers come from the item data
|
||||
MaceItem.calculateImpactPosition inline crates/horizon-client/src/game/mace.rs::Game::mace_hurt_enemy the earlier impact below the player is kept
|
||||
MaceItem.knockbackPredicate port crates/horizon-client/src/game/mace.rs::Game::smash_knockback the nearby entity filter for the smash
|
||||
MapItem.create port crates/horizon-client/src/game/maps.rs::Game::register_exploration_maps
|
||||
MapItem.createNewSavedData port crates/horizon-client/src/game/maps.rs::MapData::fresh
|
||||
MapItem.getCorrectStateForFluidBlock inline crates/horizon-client/src/game/maps.rs::Game::update_map the map colour pass
|
||||
MapItem.inventoryTick port crates/horizon-client/src/game/maps.rs::Game::tick_maps
|
||||
MapItem.lockMap port crates/horizon-client/src/menu.rs::Menu::map_crafted the lock branch of the post processing
|
||||
MapItem.useOn missing player: using a map on a banner block should toggle that banner's marker on the map; Horizon has no banner toggle
|
||||
MobBucketItem.emptyContents port crates/horizon-world/src/level/buckets.rs::Sim::bucket_empty the MobWater and Nothing contents
|
||||
PotionItem.getDefaultInstance skip:data default stack data
|
||||
PotionItem.useOn missing player: a water bottle used on a block that turns to mud should make mud; no such conversion was found in potions.rs
|
||||
PotionItem.getName port crates/horizon-client/src/game/stations.rs::Game::stack_hover_name potion name from the contents
|
||||
ProjectileItem.DispenseConfig.Builder.build inline crates/horizon-client/src/game/dispenser.rs::Game::dispense_projectile per-item dispense config
|
||||
ProjectileWeaponItem.getHeldProjectile port crates/horizon-client/src/game/crossbow.rs::Game::projectile_slot offhand first, then the held slot
|
||||
ProjectileWeaponItem.createProjectile inline crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow the arrow from the ammo, with the weapon's piercing
|
||||
ShieldItem.getName missing player: a shield with a banner base colour is named after that colour; Horizon names every shield the same
|
||||
|
@@ -0,0 +1,139 @@
|
||||
SmithingTemplateItem.createArmorTrimTemplate inline crates/horizon-client/src/game/stations.rs::Game::draw_station gap: player: the empty template slot cycles the armour icons in vanilla (SmithingScreen); Horizon draws one fixed netherite icon, and the additions slot gets no icon
|
||||
SmithingTemplateItem.createNetheriteUpgradeTemplate inline crates/horizon-client/src/game/stations.rs::Game::draw_station gap: player: no cycling tool and armour icons and no ingot icon for the additions slot; Horizon draws one fixed netherite icon in the template slot
|
||||
SmithingTemplateItem.createNetheriteUpgradeIconList missing player: an empty template slot in the smithing table does not cycle through the 11 tool and armour icons (SmithingScreen ticks baseIcon); Horizon shows one fixed netherite icon
|
||||
SpawnEggItem.spawnMob port crates/horizon-client/src/game/creatures.rs::Game::use_spawn_egg gap: minor: no ENTITY_PLACE game event (sculk sensors do not hear the egg); consumes the egg and spawns the mob on the clicked face
|
||||
SpawnEggItem.getType port crates/horizon-client/src/game/creatures.rs::Game::use_spawn_egg kind taken from the item id suffix (*_spawn_egg), not an ENTITY_DATA component
|
||||
TridentItem.createAttributes skip:data attack damage 8 and attack speed -2.9 are item table data (horizon-items attack_speed modifier)
|
||||
TridentItem.asProjectile skip:other ProjectileItem override that no code calls: no dispenser behaviour is registered for the trident in vanilla
|
||||
WindChargeItem.asProjectile port crates/horizon-client/src/game/dispenser.rs::Game::shoot_projectile_item gap: minor: aims with the level random as vanilla does, then shoots with the dispenser uncertainty (6.67); vanilla's shoot is a no-op for wind charges, so the spread is wider in Horizon
|
||||
WindChargeItem.createDispenseConfig port crates/horizon-client/src/game/dispenser.rs::Game::dispense_projectile position function, uncertainty 6.6666665, power 1.0 and event 1051 match
|
||||
alchemy/Potion.hasInstantEffects inline crates/horizon-client/src/game/potions.rs::Game::splash the instant check is written inline for the splash level event and sound (2007/1054 vs 2002/1053)
|
||||
PotionContents.createItemStack port crates/horizon-items/src/item_data.rs::ItemStack::with_potion item stack plus the potion in its data
|
||||
PotionContents.is inline crates/horizon-client/src/cauldron.rs::interact gap: minor: only the water check is here; other callers compare the potion id themselves (dispenser.rs, Enderman)
|
||||
PotionContents.isPotionWithoutCustomEffects inline crates/horizon-client/src/effects.rs::PlayerEffects::potion_effects Horizon has no custom effects on a potion stack, so this is always the potion alone
|
||||
PotionContents.getAllEffects port crates/horizon-client/src/effects.rs::PlayerEffects::potion_effects gap: minor: the potion's own effect list only; no custom effects
|
||||
PotionContents.withPotion port crates/horizon-items/src/item_data.rs::ItemStack::with_potion sets the potion and keeps the other data
|
||||
PotionContents.withEffectAdded inline crates/horizon-client/src/game/dragon.rs::Game::tick_breath gap: minor: the dragon fireball cloud's instant damage (12) is hard-coded in the tick, not an added effect; the breath cloud's 6 is the same path
|
||||
PotionContents.getColorOptional port crates/horizon-client-core/src/potions.rs::potion_color amplifier-weighted mix; base colour when there are no effects
|
||||
PotionContents.hasEffects inline crates/horizon-client/src/game/potions.rs::Game::splash a lingering cloud is made only when the potion has effects
|
||||
PotionContents.getPotionDescription port crates/horizon-client/src/brewing.rs::tooltip effect name with potency; joined with a space, not the potion.withAmplifier translation
|
||||
PotionContents.onConsume port crates/horizon-client/src/game/potions.rs::Game::tick_drinking gap: minor: duration scale is always 1.0; POTION_DURATION_SCALE is not read
|
||||
AttackRange.defaultFor inline crates/horizon-client/src/game/hand.rs::attack_range_contains gap: minor: fixed reach 0 to 3 with a 0.3 margin; no entity interaction range attribute
|
||||
AttackRange.getClosesetHit port crates/horizon-client/src/game/hand.rs::GameHands::hit gap: minor: uses the crosshair's entity or block, not the closest hit along the attack range
|
||||
AttackRange.effectiveMaxRange inline crates/horizon-client/src/game/hand.rs::attack_range_contains creative or survival reach; the mob factor is not used
|
||||
BlockItemStateProperties.with port crates/horizon-client/src/game/block_items.rs::Game::picked_stack gap: minor: writes only honey_level for beehives and bee nests (BeehiveBlock.getCloneItemStack)
|
||||
BlockItemStateProperties.get port crates/horizon-client/src/item_tooltip.rs::honey_line reads honey_level only
|
||||
BlockItemStateProperties.apply port crates/horizon-client/src/game/block_items.rs::Game::apply_item_block_state sets the item's block state properties on the placed block
|
||||
BlockItemStateProperties.updateState inline crates/horizon-client/src/game/block_items.rs::Game::apply_item_block_state the per-property set, only for properties the block has
|
||||
BlocksAttacks.onBlocked port crates/horizon-client/src/game/shield.rs::Game::after_block gap: minor: block sound plays on this client only
|
||||
BlocksAttacks.hurtBlockingItem port crates/horizon-client/src/game/shield.rs::Game::after_block item damage by the damage function, shield breaks at max damage; gap: minor: no ITEM_USED stat
|
||||
BlocksAttacks.disableBlockingForTicks port crates/horizon-client/src/game/shield.rs::Game::blocked_by_attacker disable seconds times disable scale, rounded to ticks, sets the item cooldown
|
||||
BlocksAttacks.resolveBlockedDamage port crates/horizon-world/src/blocking_rules.rs::BlockingRules::resolve damage reductions by angle and damage type
|
||||
BundleContents.computeContentWeight port crates/horizon-items/src/bundle.rs::contents_weight sum of item weights times counts; nested bundles add 1/16
|
||||
BundleContents.getNumberOfItemsToShow port crates/horizon-items/src/bundle.rs::Contents::shown_count grid rule with 11 or 12 cells and the last-row gap
|
||||
BundleContents.getSelectedItem port crates/horizon-items/src/bundle.rs::Contents::selected returns the selected index; the stack is items() at that index
|
||||
BundleContents.copyWithContents skip:other no callers in the vanilla source
|
||||
BundleContents.asMutable port crates/horizon-items/src/bundle.rs::Contents::of contents, weight and selection copied into the working state
|
||||
BundleContents.equals skip:java value equality; Horizon compares the item data directly
|
||||
BundleContents.Mutable.clearItems skip:other no callers in the vanilla source
|
||||
BundleContents.Mutable.findStackIndexWithinRange inline crates/horizon-items/src/bundle.rs::Contents::try_insert the merge search over all stacks, only for stackable undamaged items
|
||||
BundleContents.Mutable.getMaxAmountToAdd port crates/horizon-items/src/bundle.rs::Contents::room_for remaining weight over the item's weight, rounded down, at least 0
|
||||
BundleContents.Mutable.tryInsert port crates/horizon-items/src/bundle.rs::Contents::try_insert inserts what fits to the front, merged with its kind
|
||||
BundleContents.Mutable.tryTransfer port crates/horizon-client/src/menu/bundle.rs::Menu::carried_bundle_click the slot's stack moves in as far as it fits; the slot's own take rules apply
|
||||
BundleContents.Mutable.toggleSelectedItem port crates/horizon-items/src/bundle.rs::toggle_selected selects the index, or clears the selection when it is selected already or out of range
|
||||
BundleContents.Mutable.indexIsOutsideAllowedBounds inline crates/horizon-items/src/bundle.rs::toggle_selected the bounds test is the inside check
|
||||
BundleContents.Mutable.getStackedWeight port crates/horizon-items/src/bundle.rs::Weight::times weight times a count
|
||||
BundleContents.Mutable.setItem missing minor: a slot write into a bundle (container setItem, reached by /item replace) skips the weight limit and merge; Horizon's /item command has no bundle handling
|
||||
BundleContents.Mutable.addSlotWithItem missing minor: adding a new bundle slot (container path, /item) skips the weight check; Horizon's /item command has no bundle handling
|
||||
BundleContents.Mutable.getWeightWithAddedItems inline crates/horizon-items/src/bundle.rs::Contents::try_insert the weight after adding must stay at or below one, computed from room_for
|
||||
BundleContents.Mutable.mergeIdenticalStacks inline crates/horizon-items/src/bundle.rs::Contents::try_insert gap: minor: merges on insert only; no flatten pass for container writes
|
||||
BundleContents.Mutable.toImmutable port crates/horizon-items/src/bundle.rs::Contents::store writes the contents and selection back into the component
|
||||
ChargedProjectiles.ofNonEmpty port crates/horizon-client/src/game/crossbow.rs::Game::tick_crossbow loads the drawn ammo into the crossbow (Multishot draws three); empty stacks are not filtered here
|
||||
ChargedProjectiles.contains port crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow the firework rocket check that sets the shot power
|
||||
ChargedProjectiles.copyWithContents skip:other no callers in the vanilla source
|
||||
ChargedProjectiles.asMutable skip:other no callers in the vanilla source
|
||||
ChargedProjectiles.Mutable.addSlotWithItem skip:other no callers in the vanilla source
|
||||
ChargedProjectiles.Mutable.toImmutable skip:other no callers in the vanilla source
|
||||
Consumable.Builder.build port crates/horizon-items/src/items.rs::Items::load_with reads consume_seconds (1.6 default), the animation, sound and particles from the item JSON; effects are added separately
|
||||
DyedItemColor.getOrDefault port crates/horizon-assets/src/item_model.rs::Resolve::tint the dyed_color component with the default tint (leather) when unset
|
||||
FireworkExplosion.getColorName port crates/horizon-client/src/item_tooltip.rs::firework_lines dye name from the firework colour; unknown colours read as custom colour
|
||||
FireworkExplosion.withFadeColors port crates/horizon-client/src/crafting.rs::Special::assemble sets the fade colours of the star-fade recipe result
|
||||
ItemContainerContents.fromSlots port crates/horizon-items/src/item_data.rs::decode_components reads the container slot list from its NBT; only non-empty slots are kept as pairs
|
||||
ItemContainerContents.fromItems port crates/horizon-client/src/block_entity_item.rs::collect writes the non-empty slots of the container into the item's components
|
||||
ItemContainerContents.findLastNonEmptySlot skip:java trims trailing empty slots; Horizon keeps only the non-empty slot pairs
|
||||
ItemContainerContents.asSlots port crates/horizon-items/src/item_data.rs::components_tag writes the non-empty slots as minecraft:container entries
|
||||
ItemContainerContents.createStackFromSlot port crates/horizon-client/src/block_entity_item.rs::place reads a slot's stack into the placed container
|
||||
ItemContainerContents.copyInto port crates/horizon-client/src/block_entity_item.rs::place copies the container items into the placed block entity
|
||||
ItemContainerContents.itemCopies skip:other no callers in the vanilla source
|
||||
ItemContainerContents.asMutable skip:other no callers in the vanilla source
|
||||
ItemContainerContents.equals skip:java value equality; Horizon compares the item data directly
|
||||
KineticWeapon.makeLocalHitSound port crates/horizon-client/src/game/spear.rs::Game::kinetic_hit_feedback the local hit sound, at most once per ten ticks per entity
|
||||
KineticWeapon.computeDamageUseDuration missing unsure: the use duration (delay plus the damage window) is not computed in Horizon's use_spear or spear_tick; the windows are checked one by one
|
||||
KineticWeapon.Condition.test port crates/horizon-client/src/spear.rs::Condition::test tick, attacker speed and relative speed against the scaled minimums
|
||||
PiercingWeapon.makeHitSound port crates/horizon-client/src/game/spear.rs::Game::jab gap: minor: the hit sound plays at this player's feet only; vanilla plays it for everyone nearby
|
||||
ResolvableProfile.createUnresolved port crates/horizon-client/src/skins.rs::parse_profile keeps a name or id as the unresolved key, resolved later
|
||||
ResolvableProfile.createPartialProfile port crates/horizon-client/src/skins.rs::parse_profile id, else the name's offline UUID, else nil
|
||||
ResolvableProfile.Dynamic.hashCode skip:java hash of the key and skin patch; Horizon compares them directly
|
||||
ResolvableProfile.Static.name skip:other no callers in the vanilla source
|
||||
ResolvableProfile.Static.equals skip:java value equality
|
||||
ResolvableProfile.Static.hashCode skip:java hash for collections
|
||||
Tool.Rule.minesAndDrops port crates/horizon-items/src/items.rs::Items::load_with rule read from the item JSON: speed and correct_for_drops set to true
|
||||
TooltipDisplay.withHidden port crates/horizon-client/src/game/commands/items.rs::Game::apply_item_modifier gap: minor: only the /item modify toggle_tooltips path; the loot-table toggle function is not ported, and the raid banner's hidden pattern is read in item_tooltip shows()
|
||||
WrittenBookContent.craftCopy port crates/horizon-client/src/crafting.rs::Special::assemble book copy: generation plus one, pages kept
|
||||
WrittenBookContent.resolveForItem missing minor: selectors in a written book's text (@p and so on) are not resolved when the book reaches a player; the raw text shows
|
||||
WrittenBookContent.resolve missing minor: no selector resolution for written book pages; the raw text shows
|
||||
WrittenBookContent.markResolved missing minor: resolved flag is not kept, so a book is never marked as resolved
|
||||
WrittenBookContent.resolvePage missing minor: no per-page selector resolution, and no drop of pages over 32767 characters
|
||||
WrittenBookContent.isPageTooLarge missing minor: no check that a resolved page stays under the 32767 character limit
|
||||
WrittenBookContent.getPages port crates/horizon-client/src/game/books.rs::view_pages gap: minor: returns the stored pages; the filtered-text choice (filterEnabled) is not modelled
|
||||
WrittenBookContent.withReplacedPages missing minor: loot function set_written_book_pages is not in the loot modifiers, so a loot book gets no pages
|
||||
BookCloningRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches BookCloning arm: one written book within the allowed generations, plus material
|
||||
BookCloningRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble copies the book with generation plus one; material count sets the copies
|
||||
BookCloningRecipe.getRemainingItems port crates/horizon-client/src/crafting.rs::Recipes::remainders the first written book is kept as one copy (BookCloning arm); the crafting remainder item is kept too
|
||||
CraftingInput.getItem port crates/horizon-client/src/crafting.rs::Input::get reads the grid cell by x and y instead of a slot index
|
||||
CraftingInput.equals skip:java value equality
|
||||
CraftingInput.hashCode skip:java hash for collections
|
||||
Ingredient.testOptionalIngredient port crates/horizon-client/src/crafting.rs::Ingredient::test the caller treats a missing ingredient as an empty slot
|
||||
Ingredient.equals skip:java value equality
|
||||
Ingredient.of port crates/horizon-client/src/crafting.rs::Ingredient::of ingredient from item ids
|
||||
Ingredient.displayForSingleItem skip:other no callers in the vanilla source
|
||||
Ingredient.getSingleItem missing unsure: returns the one item of a single-item ingredient; no Horizon function found in this pass
|
||||
PlacementInfo.create port crates/horizon-client/src/crafting.rs::Placement::of placement for one ingredient, none when it is empty
|
||||
PotionIngredient.test port crates/horizon-client/src/brewing.rs::PotionIngredient::test item id and the potion filter
|
||||
PotionIngredient.of port crates/horizon-client/src/brewing.rs::PotionIngredient::parse built from the recipe JSON, with the potion filter
|
||||
PotionIngredient.isPotionInput port crates/horizon-client/src/brewing.rs::Brewing::load bottle input set (Brewing.inputs) built at load
|
||||
Recipe.BookInfo.mapCodec skip:java codec
|
||||
RecipeManager.finalizeRecipeLoading port crates/horizon-client/src/crafting.rs::Recipes::load loads the recipes and their placements at load
|
||||
RecipeManager.filterDisabled missing minor: recipes whose ingredients sit behind a disabled feature flag are not hidden; Horizon's recipe loading has no feature flag check
|
||||
RecipeManager.isIngredientEnabled missing minor: no feature flag check for ingredients in recipe loading
|
||||
RecipeManager.byKeyTyped port crates/horizon-client/src/crafting.rs::Recipes::recipe_matches gap: minor: lookup by id; no recipe type check
|
||||
RecipeManager.listDisplaysForRecipe port crates/horizon-client/src/recipe_book.rs::Book::entry the entry holds the recipe's displays
|
||||
RecipeManager.IngredientCollector.accept skip:other collects ingredients for the synced property sets; Horizon's client reads its own recipe and brewing tables
|
||||
RepairItemRecipe.canCombine port crates/horizon-client/src/crafting.rs::Special::repair_pair two items of the same kind that can combine
|
||||
RepairItemRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble repair arm: combined durability and the bonus
|
||||
ShapedRecipePattern.of port crates/horizon-client/src/crafting.rs::Recipes::load pattern read from the recipe JSON at load
|
||||
ShapedRecipePattern.unpack port crates/horizon-client/src/crafting.rs::Recipes::load pattern cells read at load, empty where the key is blank
|
||||
ShapedRecipePattern.firstNonEmpty port crates/horizon-client/src/crafting.rs::shrink trims empty rows and columns at both ends
|
||||
ShapedRecipePattern.lastNonEmpty port crates/horizon-client/src/crafting.rs::shrink trims empty rows and columns at both ends
|
||||
ShapedRecipePattern.matches port crates/horizon-client/src/crafting.rs::Recipes::assemble_if_matches shaped arm: exact size, cell tests, mirrored match
|
||||
SmithingTransformRecipe.display missing unsure: the recipe book slot displays for a smithing transform are not built in Horizon's recipe book; the smithing table uses StationRecipes::smithing_result
|
||||
SmithingTrimRecipe.display missing unsure: the recipe book slot displays for a smithing trim are not built in Horizon's recipe book; the smithing table uses StationRecipes::smithing_result
|
||||
TransmuteRecipe.computeResultSize port crates/horizon-client/src/crafting.rs::Special::assemble result count plus the material count when it is added
|
||||
TransmuteRecipe.matches port crates/horizon-client/src/crafting.rs::Special::matches Transmute arm: one input and the material list
|
||||
TransmuteRecipe.assemble port crates/horizon-client/src/crafting.rs::Special::assemble Transmute arm: result with the input's components
|
||||
TransmuteRecipe.resultDisplay port crates/horizon-client/src/recipe_book.rs::RecipeIndex::result the recipe's result id
|
||||
TransmuteRecipe.createPlacementInfo port crates/horizon-client/src/crafting.rs::Recipes::placement the placement of the input and the materials
|
||||
RecipeDisplay.isEnabled missing minor: no feature flag check, so a display for a disabled feature still shows
|
||||
SlotDisplay.applyDemoTransformation port crates/horizon-client/src/stations.rs::StationRecipes::trim_demo gap: minor: only the trim demo draws (up to 256 tries); the dyed demo is not modelled
|
||||
SlotDisplay.AnyFuel.resolve missing unsure: no any-fuel display list found in Horizon's recipe book
|
||||
SlotDisplay.Composite.resolve missing unsure: no composite display list found in Horizon's recipe book
|
||||
SlotDisplay.DyedSlotDemo.resolve missing unsure: no dyed demo display found in Horizon's recipe book
|
||||
SlotDisplay.ItemSlotDisplay.resolve port crates/horizon-client/src/recipe_book.rs::Book::items_of the item of a single-item slot
|
||||
SlotDisplay.ItemStackSlotDisplay.resolve port crates/horizon-client/src/recipe_book.rs::Book::items_of gap: minor: keeps item ids only; the stack's components are not carried into the display
|
||||
SlotDisplay.OnlyWithComponent.resolve missing unsure: no display that filters by an item component found in Horizon's recipe book
|
||||
SlotDisplay.SmithingTrimDemoSlotDisplay.resolve port crates/horizon-client/src/stations.rs::StationRecipes::trim_demo a random base trimmed by a random material
|
||||
SlotDisplay.WithAnyPotion.resolve missing unsure: no any-potion display list found in Horizon's recipe book
|
||||
SlotDisplay.WithRemainder.resolve missing unsure: no remainder display found in Horizon's recipe book; remainders exist in Recipes::remainders for play
|
||||
SlotDisplay.WithRemainder.isEnabled missing minor: no feature flag check for the remainder display
|
||||
BlockPlaceContext.at port crates/horizon-world/src/level/place.rs::Sim::placement_at the placement position and face from the clicked block
|
||||
UseOnContext.isSecondaryUseActive port crates/horizon-client/src/game.rs::Game::use_hand the shift key sets the context's sneaking flag
|
||||
|
@@ -0,0 +1,140 @@
|
||||
Enchantment.getSlotItems inline crates/horizon-world/src/loot.rs::LootData::enchantment_level slot filter and item lookup folded into the best-level loop
|
||||
Enchantment.matchingSlot inline crates/horizon-world/src/loot.rs::LootData::enchantment_level slot_in_group test; location and attribute code test slots inline
|
||||
Enchantment.isImmuneToDamage port crates/horizon-client/src/game/enchant_effects.rs::Game::wears_burn_from_stepping_immunity gap: minor: ignores the effect's requirements and damage source; frost_walker is the only damage_immunity enchantment
|
||||
Enchantment.modifyDamageProtection port crates/horizon-items/src/enchant.rs::Enchantments::modify_value_with armor protection is summed per damage type in apply_effect_status (potions.rs)
|
||||
Enchantment.doPostPiercingAttack port crates/horizon-client/src/game/enchant_effects.rs::Game::post_piercing_attack gap: minor: the effect's own requirements are not read; Lunge's checks are hard-coded
|
||||
Enchantment.tick port crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed gap: minor: only Soul Speed's tick effects; it is the only tick effect in the data
|
||||
Enchantment.onProjectileSpawned port crates/horizon-client/src/game/enchant_effects.rs::Game::bow_projectile_ignite Flame's ignite; the only projectile_spawned effect in the data
|
||||
Enchantment.onHitBlock port crates/horizon-client/src/game/trident.rs::Game::channel_rod_hit Channeling's lightning rod hit; the only hit_block effect in the data
|
||||
Enchantment.modifyItemFilteredCount port crates/horizon-items/src/enchant.rs::Enchantments::modify_value_with one enchantment's effects for one component, item context
|
||||
Enchantment.modifyEntityFilteredValue port crates/horizon-items/src/enchant.rs::Enchantments::modify_value_with one enchantment's effects for one component, entity context
|
||||
Enchantment.modifyDamageFilteredValue port crates/horizon-items/src/enchant.rs::Enchantments::modify_value_with one enchantment's effects for one component, damage context
|
||||
Enchantment.locationContext skip:java LootParams builder; Horizon passes plain values to location_requirements
|
||||
Enchantment.entityContext skip:java LootParams builder; Horizon passes an EffectContext struct
|
||||
Enchantment.blockHitContext skip:java LootParams builder; Horizon passes an EffectContext struct
|
||||
Enchantment.applyEffects inline crates/horizon-items/src/enchant.rs::Enchantments::modify_value_with condition check and apply loop folded into modify_value_with
|
||||
Enchantment.stopLocationBasedEffects inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed gap: minor: only Soul Speed; the boots-changed branch removes its modifiers
|
||||
Enchantment.FloatAction.asGeneric skip:java lambda adapter for float effects
|
||||
Enchantment.Builder skip:data datagen builder; Horizon reads enchantment JSON
|
||||
LevelBasedValue.Exponent.calculate port crates/horizon-items/src/enchant.rs::level_value minecraft:exponent: base to the power
|
||||
LevelBasedValue.Fraction.calculate port crates/horizon-items/src/enchant.rs::level_value minecraft:fraction; zero denominator gives 0
|
||||
LevelBasedValue.Linear.calculate port crates/horizon-items/src/enchant.rs::level_value minecraft:linear
|
||||
LevelBasedValue.Lookup.calculate port crates/horizon-items/src/enchant.rs::level_value minecraft:lookup with fallback
|
||||
ChangeItemDamage.apply port crates/horizon-client/src/game.rs::Game::damage_held gap: minor: the held item only; Soul Speed's boots use wear_boots and Thorns its own path
|
||||
EnchantmentAttributeEffect.getModifier port crates/horizon-items/src/enchant.rs::Enchantments::attributes slot suffix on the id is added in apply_enchantment_attributes
|
||||
EnchantmentAttributeEffect.onChangedBlock inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed modifiers switch on there (Soul Speed only)
|
||||
EnchantmentAttributeEffect.onDeactivated inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed modifiers switch off there (Soul Speed only)
|
||||
EnchantmentAttributeEffect.makeAttributeMap skip:java multimap builder for one modifier
|
||||
EnchantmentHelper.updateEnchantments port crates/horizon-items/src/item_data.rs::ItemStack::enchant gap: minor: sets one enchantment; no bulk consumer form
|
||||
EnchantmentHelper.processAmmoUse port crates/horizon-client/src/game/enchant_effects.rs::Game::bow_enchantments Infinity as a flag; the ammo count change is decided by the caller
|
||||
EnchantmentHelper.processBlockExperience inline crates/horizon-client/src/game.rs::Game::break_block_as_player Silk Touch zeroes the XP at the call site; spawners keep it
|
||||
EnchantmentHelper.processMobExperience skip:other no enchantment in the data uses mob_experience, so the amount never changes
|
||||
EnchantmentHelper.createBook missing player: the creative menu has no enchanted book for each enchantment (CreativeModeTabs); creative.rs lists none
|
||||
EnchantmentHelper.runIterationOnItem port crates/horizon-items/src/item_data.rs::ItemStack::enchantments the (enchantment, level) iteration; callers loop over it
|
||||
EnchantmentHelper.runIterationOnEquipment inline crates/horizon-client/src/game/enchant_effects.rs::Game::apply_enchantment_attributes gap: minor: worn armor only; hand slots are not read
|
||||
EnchantmentHelper.isImmuneToDamage port crates/horizon-client/src/game/enchant_effects.rs::Game::wears_burn_from_stepping_immunity gap: minor: worn armor only; no requirements or damage source check
|
||||
EnchantmentHelper.modifyKnockback port crates/horizon-client/src/game/enchant_effects.rs::Game::extra_knockback gap: minor: the player's held weapon; mob weapons are read in mobs/gear.rs
|
||||
EnchantmentHelper.doPostAttackEffects port crates/horizon-client/src/game/enchant_effects.rs::Game::post_attack gap: minor: wind burst, thorns and Channeling's victim effect are separate fns
|
||||
EnchantmentHelper.doPostAttackEffectsWithItemSourceOnBreak port crates/horizon-client/src/game/enchant_effects.rs::Game::post_attack gap: minor: melee hits with the held item only; projectile and attacker-less hits are not here
|
||||
EnchantmentHelper.stopLocationBasedEffects inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed gap: minor: only Soul Speed; the boots-changed branch stops it
|
||||
EnchantmentHelper.tickEffects inline crates/horizon-client/src/game/enchant_effects.rs::Game::tick_soul_speed gap: minor: only Soul Speed's tick effect; it is the only one in the data
|
||||
EnchantmentHelper.processProjectileCount port crates/horizon-client/src/game/crossbow.rs::Game::tick_crossbow gap: minor: Multishot's three shots are hard-coded, not read from projectile_count
|
||||
EnchantmentHelper.processProjectileSpread port crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow gap: minor: 10 degrees hard-coded, not read from projectile_spread (same value)
|
||||
EnchantmentHelper.getPiercingCount inline crates/horizon-client/src/game/crossbow.rs::Game::shoot_crossbow projectile_piercing read for the arrow's pierce level there
|
||||
EnchantmentHelper.onHitBlock port crates/horizon-client/src/game/trident.rs::Game::channel_rod_hit Channeling's lightning rod hit; the only hit_block effect in the data
|
||||
EnchantmentHelper.modifyDurabilityToRepairFromXp port crates/horizon-client/src/game/enchant_effects.rs::Game::mending Mending's repair with XP
|
||||
EnchantmentHelper.getFishingLuckBonus port crates/horizon-client/src/game/fishing.rs::Game::use_fishing_rod Luck of the Sea read when the rod is cast
|
||||
EnchantmentHelper.getFishingTimeReduction port crates/horizon-client/src/game/fishing.rs::Game::use_fishing_rod Lure ticks read at cast; used by catching_fish
|
||||
EnchantmentHelper.getTridentReturnToOwnerAcceleration port crates/horizon-client/src/game/trident.rs::ThrownTrident::loyalty_pull Loyalty level pull and acceleration
|
||||
EnchantmentHelper.modifyCrossbowChargingTime port crates/horizon-client/src/game/crossbow.rs::Game::charge_ticks Quick Charge: 1.25 s minus 0.25 s per level
|
||||
EnchantmentHelper.getTridentSpinAttackStrength inline crates/horizon-client/src/game/trident.rs::Game::release_trident Riptide's strength 1.5 + 0.75 per level above the first, folded into the release
|
||||
EnchantmentHelper.hasTag port crates/horizon-items/src/enchant.rs::Enchantments::in_tag per enchantment id; callers loop over the stack
|
||||
EnchantmentHelper.has port crates/horizon-items/src/enchant.rs::Enchantments::has_component any enchantment on the stack with the component
|
||||
EnchantmentHelper.pickHighestLevel port crates/horizon-client/src/game/crossbow.rs::Game::charging_sounds gap: minor: Quick Charge sounds only; the trident sound is hard-coded in release_trident (riptide_N)
|
||||
EnchantmentHelper.getHighestLevel inline crates/horizon-client/src/game/crossbow.rs::Game::charging_sounds reads the quick_charge level directly
|
||||
EnchantmentHelper.filterCompatibleEnchantments inline crates/horizon-items/src/enchant.rs::Enchantments::select exclusivity filter folded into the selection loop
|
||||
EnchantmentHelper.isEnchantmentCompatible port crates/horizon-items/src/enchant.rs::Enchantments::compatible pair check; the /enchant command loops over the existing ones
|
||||
EnchantmentHelper.enchantItemFromProvider port crates/horizon-client/src/game/mob_gear.rs::Game::enchant_spawn_equipment gap: minor: mob spawn gear only; pillager, vindicator, skeleton trap and enderman providers are not read here
|
||||
Equippable.llamaSwag skip:data datagen factory for the carpet equippable data
|
||||
Equippable.saddle skip:data datagen factory for the saddle equippable data
|
||||
Equippable.harness skip:data datagen factory for the harness equippable data
|
||||
Equippable.equipOnTarget port crates/horizon-client/src/game/ghasts.rs::Game::interact_happy_ghast gap: minor: the harness on a happy ghast only; saddles are put on in mounts.rs and nautili.rs
|
||||
Equippable.canBeEquippedBy port crates/horizon-client/src/game/mount_menu.rs::shows_saddle gap: minor: the saddle slot's entity check only; the armour swap has no entity test
|
||||
Equippable.Builder skip:data datagen builder for equippable data
|
||||
ItemCost.withComponents skip:data datagen helper; no runtime caller in 26.3
|
||||
ItemCost.test port crates/horizon-client/src/merchant.rs::ItemCost::test item match, then the stack data when the cost has data
|
||||
MerchantOffer.<init> skip:java constructor; Horizon builds the offer in merchant.rs
|
||||
MerchantOffer.writeToStream skip:java wire encoding (stream codec)
|
||||
MerchantOffer.createFromStream skip:java wire decoding (stream codec)
|
||||
MerchantOffers.copy skip:java list copy
|
||||
VillagerTrade.builder skip:data datagen factory for trade data
|
||||
VillagerTrade.Builder skip:data datagen builder for trade data
|
||||
BaseCommandBlock.createSource inline crates/horizon-client/src/game/command_blocks.rs::Game::command_block_success the track_output gate that decides whether the source exists
|
||||
BaseCommandBlock.CloseableCommandBlockSource.acceptsSuccess port crates/horizon-client/src/game/command_blocks.rs::Game::command_block_success track_output and send_command_feedback; a removed block gets no output
|
||||
BaseCommandBlock.CloseableCommandBlockSource.shouldInformAdmins port crates/horizon-client/src/game/command_blocks.rs::Game::command_block_success command_block_output rule, with feedback on
|
||||
BaseSpawner.setEntityData port crates/horizon-client/src/mobs/spawner.rs::Spawner::set_entity_id
|
||||
BaseSpawner.getOrCreateDisplayEntity port crates/horizon-client/src/game/spawner.rs::Game::update_spawner_display display mob made per spawner from its next spawn data
|
||||
BaseSpawner.onEventTriggered port crates/horizon-client/src/mobs/spawner.rs::Spawner::client_event block event 1 resets the client's delay
|
||||
BaseSpawner.getOrCreateNextSpawnData port crates/horizon-client/src/mobs/spawner.rs::Spawner::next_or_create next spawn data picked once and kept
|
||||
Level.isInWorldBounds port crates/horizon-world/src/level/update.rs::Sim::is_in_valid_bounds height and horizontal range
|
||||
Level.isInValidBounds port crates/horizon-world/src/level/update.rs::Sim::is_in_valid_bounds chunk-level bounds folded into the same range
|
||||
Level.isInWorldBoundsHorizontal inline crates/horizon-world/src/level/update.rs::Sim::is_in_valid_bounds the -30000000..30000000 test
|
||||
Level.isInValidBoundsHorizontal inline crates/horizon-world/src/level/update.rs::Sim::is_in_valid_bounds chunk validity folded into the block range
|
||||
Level.getChunk missing unsure: no getter for a full chunk object found; block reads go through World::block
|
||||
Level.getFluidState port crates/horizon-client/src/game.rs::Column::state gap: minor: the isInValidBounds check is not repeated here
|
||||
Level.isDarkOutside port crates/horizon-client/src/game.rs::GameLevel::sky_darken gap: minor: the sky darkness value; the fixed-time dimension check is not here
|
||||
Level.playSound port crates/horizon-world/src/level/update.rs::Sim::sound
|
||||
Level.playSeededSound missing unsure: no seeded sound path found; Sim::sound takes no seed
|
||||
Level.addBlockEntityTicker port crates/horizon-client/src/game.rs::GameLevel::load_block_entity the ticker comes with the block entity load
|
||||
Level.guardEntityTick skip:debug crash-report wrapper around an entity tick
|
||||
Level.getBlockEntity skip:other bare block_entities map lookup at each caller; no port of its own
|
||||
Level.setBlockEntity port crates/horizon-client/src/game.rs::GameLevel::load_block_entity
|
||||
Level.loadedAndEntityCanStandOnFace missing unsure: no face-sturdy test for placed hanging entities found
|
||||
Level.getWorldBorderAdjustedRespawnData missing unsure: respawn clamp to the world border not found
|
||||
Level.hasEntities missing unsure: no entity-in-box test found for this use
|
||||
Level.getClockTimeTicks port crates/horizon-client/src/game.rs::GameLevel::day_time day time; no separate clock time
|
||||
Level.getThunderLevel port crates/horizon-client/src/world.rs::World::levels thunder scaled by rain
|
||||
Level.setThunderLevel port crates/horizon-client/src/game/remote.rs::Game::handle_packet weather game event sets the thunder level
|
||||
Level.setRainLevel port crates/horizon-client/src/game/remote.rs::Game::handle_packet weather game event sets the rain level
|
||||
Level.fillReportDetails skip:debug crash-report details
|
||||
BlockGetter.getBlockEntity skip:other bare block_entities map lookup at each caller
|
||||
BlockGetter.isBlockInLine skip:other no caller in 26.3 code
|
||||
BlockGetter.clipWithInteractionOverride missing unsure: no interaction-shape override found for the pick ray; clip_ray not checked in depth
|
||||
BlockGetter.traverseBlocks port crates/horizon-core/src/geometry/traversal.rs::traverse_blocks
|
||||
BlockGetter.forEachBlockIntersectedBetween port crates/horizon-core/src/geometry/sweep.rs::sweep_intersected_blocks
|
||||
BlockGetter.addCollisionsAlongTravel inline crates/horizon-client/src/collisions.rs::SceneCollisions::resolve_with_context gap: minor: the shape list along the path is built inside the resolver
|
||||
BlockGetter.getFurthestCorner port crates/horizon-core/src/geometry/sweep.rs::furthest_corner
|
||||
ChunkPos.maxFromRegion missing unsure: region scan bound in IOWorker; not checked against save.rs
|
||||
ChunkPos.isValid inline crates/horizon-world/src/level/update.rs::Sim::is_in_valid_bounds horizontal chunk range folded into the block range
|
||||
ChunkPos.hash skip:java hash code for ColumnPos keys
|
||||
ChunkPos.getRegionX port crates/horizon-core/src/position.rs::ChunkPos::region
|
||||
ChunkPos.getRegionZ port crates/horizon-core/src/position.rs::ChunkPos::region
|
||||
ChunkPos.getBlockAt skip:other no caller in 26.3 code
|
||||
ChunkPos.contains port crates/horizon-core/src/position.rs::BlockPos::chunk a block is in a chunk when its chunk() is that chunk
|
||||
ChunkPos.getChessboardDistance inline crates/horizon-client/src/ticket_levels.rs::compute Chebyshev distance folded into the ticket level loop
|
||||
ChunkPos.distanceSquared missing unsure: caller not identified in 26.3 sources; no port located
|
||||
CollisionGetter.isUnobstructed port crates/horizon-client/src/game.rs::GameLevel::is_unobstructed the state-based overload
|
||||
CollisionGetter.noBorderCollision port crates/horizon-client/src/collisions.rs::EntityCollisions::movement_border border shape when inside close to the border
|
||||
CollisionGetter.getPreMoveCollisions inline crates/horizon-client/src/collisions.rs::SceneCollisions::resolve_with_context gap: minor: entity and block shapes are not returned as a list; the resolver takes them together
|
||||
CollisionGetter.getBlockAndLiquidCollisions port crates/horizon-client/src/collisions.rs::no_collision_or_liquid gap: minor: a yes or no test, not the shape list
|
||||
CollisionGetter.getBlockCollisionsFromContext port crates/horizon-client/src/collisions.rs::SceneCollisions::collision_block gap: minor: per-block shape; the box walk is not here
|
||||
CollisionGetter.clipIncludingBorder missing unsure: no world-border clamp of a ray found in clip_ray
|
||||
CollisionGetter.collidesWithSuffocatingBlock port crates/horizon-client/src/collisions.rs::SceneCollisions::is_suffocating
|
||||
EntityGetter.getEntitiesOfClass skip:other class filter repeated at each caller over the entity lists; no shared lookup
|
||||
EntityGetter.getPlayerByUUID skip:other uuid find repeated at each caller (e.g. allays.rs)
|
||||
Explosion.getIndirectSourceEntity inline crates/horizon-client/src/game/explosion.rs::Game::explosion_hurt_entities the projectile owner rule is folded into the hurt loop
|
||||
GameType.byName port crates/horizon-command/src/args.rs::GameMode::from_name name lookup; the default is the caller's
|
||||
GameType.isValidId missing minor: no id check; set_mode_id falls back to survival for unknown ids
|
||||
LevelAccessor.createTick port crates/horizon-world/src/level/update.rs::Sim::schedule_tick the scheduled tick; no tick object is returned
|
||||
LevelHeightAccessor.isOutsideBuildHeight port crates/horizon-world/src/level/query.rs::Sim::is_inside_build_height negated
|
||||
LevelReader.getHeight port crates/horizon-client/src/world.rs::World::world_surface gap: minor: WORLD_SURFACE only; other heightmap types not read here
|
||||
LevelReader.getBlockStatesIfLoaded port crates/horizon-client/src/world.rs::World::loaded gap: minor: the loaded check only; the states are read with World::block
|
||||
LevelReader.getNoiseBiome skip:other no caller in 26.3 code
|
||||
LevelReader.getHeightmapPos port crates/horizon-client/src/world.rs::World::world_surface gap: minor: the height only; the BlockPos is built by the caller
|
||||
LevelReader.getChunk missing unsure: same as Level.getChunk
|
||||
LevelReader.findBlocksInBoxByManhattanDistance missing unsure: no block search by Manhattan distance found in Horizon
|
||||
LevelWriter.destroyBlock port crates/horizon-world/src/level/update.rs::Sim::destroy_block
|
||||
LocalMobCapCalculator.getPlayersNear port crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::players_near
|
||||
LocalMobCapCalculator.addMob port crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::add_local
|
||||
LocalMobCapCalculator.MobCounts.add port crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::add_local per-player count
|
||||
LocalMobCapCalculator.MobCounts.canSpawn port crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::can_spawn_local
|
||||
|
@@ -0,0 +1,142 @@
|
||||
NaturalSpawner.getFilteredSpawningCategories port crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::filtered_categories categories in spawn order, filtered by enemies, persistent and the global cap
|
||||
NaturalSpawner.isRightDistanceToPlayerAndSpawnPoint port crates/horizon-client/src/mobs/spawn_selection.rs::right_distance 24 block player distance, respawn point distance and chunk checks
|
||||
NaturalSpawner.getMobForSpawn inline crates/horizon-client/src/mobs/spawn_selection.rs::spawn_category_for_position gap: minor: no warning log when a type cannot be created; the type is skipped there
|
||||
NaturalSpawner.isValidPositionForMob inline crates/horizon-client/src/mobs/spawn_selection.rs::spawn_category_for_position the far-away removal check; gap: minor: NeoForge spawn position event hook is not modelled
|
||||
NaturalSpawner.getRandomSpawnMobAt inline crates/horizon-client/src/mobs/spawn_selection.rs::spawn_category_for_position the water ambient reduce roll, then the weighted pick from mobs_at
|
||||
NaturalSpawner.isInNetherFortressBounds inline crates/horizon-client/src/mobs/spawn_selection.rs::mobs_at the monster fortress check on nether bricks comes first in mobs_at
|
||||
NaturalSpawner.getRandomPosWithin port crates/horizon-client/src/mobs/spawn_selection.rs::spawn_category_for_chunk random column in the chunk, height up to one above the world surface
|
||||
NaturalSpawner.SpawnState.canSpawnForCategoryGlobal port crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::can_spawn_global per chunk cap from the spawnable chunk count
|
||||
NaturalSpawner.SpawnState.canSpawnForCategoryLocal port crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::can_spawn_local local cap per player near the chunk; the debug flag is not kept
|
||||
NoiseColumn.getBlock port crates/horizon-world/src/worldgen/structure/start.rs::NoiseColumn::get air outside the column height
|
||||
NoiseColumn.setBlock skip:other no callers in vanilla; Horizon builds the column once and never writes it
|
||||
PotentialCalculator.PointCharge.getPotentialChange inline crates/horizon-client/src/mobs/spawn_selection.rs::SpawnState::energy_change one charge's term charge over distance, infinity at zero distance, summed in energy_change
|
||||
ServerExplosion.interactWithBlocks inline crates/horizon-client/src/game/explosion.rs::Game::server_explode_as shuffles the targets, runs each block's explosion hit, then pops the merged drops
|
||||
ServerExplosion.createFire inline crates/horizon-client/src/game/explosion.rs::Game::server_explode_as one in three chance on air above a solid block, with the block's fire state
|
||||
ServerExplosion.canTriggerBlocks inline crates/horizon-client/src/game/wind.rs::Game::wind_burst breeze charges need mob griefing before the trigger pass; the trigger-only check is implicit because only wind bursts reach it
|
||||
ServerExplosion.StackCollector.tryMerge port crates/horizon-client/src/game/explosion.rs::add_or_append_stack merges up to 16 of the same item and damage
|
||||
SignalGetter.getBestOwnOrNeighbourSignal missing player: an explosive sulfur cube on or next to redstone power does not light its fuse every tick; Horizon's sulfur cube only primes on fire or explosion damage and best_neighbor_signal has no own-signal part
|
||||
SpawnData.CustomSpawnRules.checkLightBoundaries skip:java codec validation of the light limit range; Horizon decodes the limits in spawner.rs
|
||||
StructureManager.forWorldGenRegion skip:other wraps the level as a worldgen region view; Horizon passes the level into worldgen fns, no manager object
|
||||
StructureManager.startsForStructure inline crates/horizon-client/src/game/structures.rs::Game::structures_reaching_where gap: minor: returns starts whose box holds the position, not every start the section references
|
||||
StructureManager.fillStartsForStructure inline crates/horizon-client/src/game/structures.rs::Game::structures_reaching_where the reference loop and the valid start check
|
||||
StructureManager.getStructureAt port crates/horizon-client/src/game/structures.rs::Game::structures_reaching returns every start whose box holds the position; the caller takes the one it needs
|
||||
StructureManager.getStructureWithPieceAt port crates/horizon-client/src/game/structures.rs::Game::structures_at gap: minor: returns names of structures with a piece at the position; no predicate filter here
|
||||
StructureManager.matching inline crates/horizon-client/src/game/structures.rs::Game::structures_reaching_where the predicate becomes the wanted closure
|
||||
StructureManager.structureHasPieceAt inline crates/horizon-client/src/game/structures.rs::Game::structures_reaching_where the piece box test behind the piece flag
|
||||
StructureManager.getAllStructuresAt inline crates/horizon-client/src/game/structures.rs::Game::structures_reaching_where gap: minor: the chunk's full reference map is not returned; only starts whose box holds the position
|
||||
Biome.getTemperature port crates/horizon-world/src/worldgen/biome_temperature.rs::BiomeTemperature::temperature height adjusted temperature with the 1024 entry cache
|
||||
Biome.warmEnoughToRain port crates/horizon-world/src/worldgen/biome_temperature.rs::BiomeTemperature::warm_enough_to_rain temperature at least 0.15
|
||||
Biome.shouldMeltFrozenOceanIcebergSlightly port crates/horizon-world/src/worldgen/biome_temperature.rs::BiomeTemperature::should_melt_frozen_ocean_iceberg_slightly temperature above 0.1
|
||||
Biome.getGrassColor port crates/horizon-client/src/biome.rs::Biomes::grass the grass modifier on the base colour
|
||||
Biome.getBaseGrassColor inline crates/horizon-client/src/biome.rs::Biomes::load the grass_color override, else the colormap sample, resolved at load
|
||||
Biome.getGrassColorFromTexture port crates/horizon-client/src/biome.rs::sample grass colormap by clamped temperature and downfall
|
||||
Biome.getFoliageColorFromTexture port crates/horizon-client/src/biome.rs::sample foliage colormap by clamped temperature and downfall
|
||||
Biome.getDryFoliageColorFromTexture port crates/horizon-client/src/biome.rs::sample dry foliage colormap by clamped temperature and downfall
|
||||
Biome.BiomeBuilder.putAttributes skip:java builder for the biome bootstrap; Horizon reads biome data
|
||||
Biome.BiomeBuilder.build skip:java builder for the biome bootstrap; Horizon reads biome data
|
||||
Biome.BiomeBuilder.toString skip:debug debug text only
|
||||
BiomeGenerationSettings.Builder.addFeature skip:java builder for the biome bootstrap; feature lists come from data
|
||||
BiomeGenerationSettings.PlainBuilder.addFeature skip:java builder for the biome bootstrap
|
||||
BiomeGenerationSettings.PlainBuilder.addFeatureStepsUpTo skip:java builder for the biome bootstrap
|
||||
BiomeGenerationSettings.PlainBuilder.build skip:java builder for the biome bootstrap
|
||||
BiomeManager.getFiddledDistance inline crates/horizon-core/src/biome.rs::BiomeZoom::quart_at_block the eight corner distances with fiddled offsets; the nearest one is picked there
|
||||
BiomeManager.getFiddle port crates/horizon-core/src/biome.rs::fiddle uniform offset of plus or minus 0.45
|
||||
BiomeResolver.getBiomesWithin inline crates/horizon-world/src/worldgen/structure/start.rs::try_generate the monument's surrounding check walks the same quart box of radius 29 around the sea level
|
||||
Climate.parameters skip:data builds parameter points from float literals in the biome bootstrap; Horizon reads quantized points from data
|
||||
Climate.Parameter.span port crates/horizon-world/src/worldgen/climate/index.rs::Parameter::span union of two parameter ranges
|
||||
Climate.Parameter.toString skip:debug debug text only
|
||||
Climate.Parameter.distance port crates/horizon-world/src/worldgen/climate/index.rs::Parameter::distance distance from a value to the range
|
||||
Climate.ParameterList.codec skip:java codec
|
||||
Climate.ParameterList.findValueBruteForce port crates/horizon-world/src/worldgen/climate/index.rs::ClimateIndex::brute_force lowest fitness, ties keep the first entry
|
||||
Climate.ParameterList.findValueIndex port crates/horizon-world/src/worldgen/climate/index.rs::ClimateSearch::find tree search with the previous leaf as the candidate
|
||||
Climate.ParameterPoint.fitness port crates/horizon-world/src/worldgen/climate/index.rs::ParameterPoint::fitness sum of squared distances over the seven axes
|
||||
Climate.RTree.create port crates/horizon-world/src/worldgen/climate/index.rs::ClimateIndex::with_branching builds the tree with the branching factor
|
||||
Climate.RTree.build port crates/horizon-world/src/worldgen/climate/index.rs::build recursive split into buckets by the cheapest axis
|
||||
Climate.RTree.sort inline crates/horizon-world/src/worldgen/climate/index.rs::build the axis order sort runs inside build
|
||||
Climate.RTree.comparator port crates/horizon-world/src/worldgen/climate/index.rs::compare_space compares centres on one axis, optionally by absolute value
|
||||
Climate.RTree.bucketize inline crates/horizon-world/src/worldgen/climate/index.rs::build buckets sliced to the bucket size inside build
|
||||
Climate.RTree.cost inline crates/horizon-world/src/worldgen/climate/index.rs::build the summed span of each axis picks the best split inside build
|
||||
Climate.RTree.buildParameterSpace port crates/horizon-world/src/worldgen/climate/index.rs::space union of the children's ranges per axis
|
||||
Climate.RTree.search port crates/horizon-world/src/worldgen/climate/index.rs::ClimateSearch::find search from the root with the previous result kept
|
||||
Climate.RTree.Node.distance port crates/horizon-world/src/worldgen/climate/index.rs::distance squared distance from the target to the node's box
|
||||
Climate.RTree.SubTree.search port crates/horizon-world/src/worldgen/climate/index.rs::ClimateIndex::search recursive search over the children
|
||||
Climate.Sampler.sample port crates/horizon-world/src/worldgen/climate.rs::ClimateSampler::sample samples the six climate fields at a quart
|
||||
FixedBiomeSource.findBiomeHorizontal missing unsure: flat worlds use one fixed biome, and this override picks a random point in the box; Horizon's ring search is the generic one and draws random values in a different order
|
||||
FixedBiomeSource.findClosestBiome3d port crates/horizon-world/src/worldgen/generator.rs::Pipeline::find_closest_biome generic 3D search; for one biome its first sample is the origin
|
||||
MobSpawnSettings.SpawnerData.toString skip:debug debug text only
|
||||
MultiNoiseBiomeSource.stable skip:other preset check used only by world creation dimension validation
|
||||
MultiNoiseBiomeSource.createResolver port crates/horizon-world/src/worldgen/biome.rs::MultiNoiseBiomeSource::resolver resolver over the sampler
|
||||
MultiNoiseBiomeSource.createResolverForChunk port crates/horizon-world/src/worldgen/biome.rs::BiomeResolver::prepare_volume samples the climate volume for the chunk; sample_prepared then resolves each quart
|
||||
MultiNoiseBiomeSource.addDebugInfo skip:debug debug screen line with the climate values
|
||||
AbstractBedBlock.getSleepHeight inline crates/horizon-client/src/game.rs::Game::tick_sleep the sleep height is the fixed bed top 0.5625 above the head cell; the shape is not read
|
||||
AbstractBedBlock.onStopSleeping missing player: waking up on a straw bed in the Overworld should break it (straw_bed_rule destroy_on_leave); Horizon's wake_up never breaks the bed
|
||||
AbstractBedBlock.kickVillagerOutOfBed missing player: right-clicking a bed a villager sleeps in neither wakes the villager nor shows the occupied message; Horizon's bed use never reads the occupied state
|
||||
AbstractBedBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class the other half removed takes this half with it, and occupied comes from the other half
|
||||
AbstractBedBlock.playerWillDestroy port crates/horizon-world/src/level/hooks.rs::Sim::player_destroy creative breaking of the foot removes the head
|
||||
AbstractBedBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class the cell in front must be replaceable; gap: minor: no world border check on that cell
|
||||
AbstractBedBlock.getConnectedDirection port crates/horizon-world/src/level/shapes.rs::Sim::bed_neighbour_direction the way to the other half: facing from the foot, opposite from the head
|
||||
AbstractBedBlock.getBlockType skip:other chooses the block entity half for the combiner; Horizon keeps one bed block state with no combined block entity
|
||||
AbstractBedBlock.findBunkBedStandUpPosition inline crates/horizon-client/src/game/respawn_anchor.rs::Game::bed_stand_up bunk bed branch: around the bed, a block lower, above, then the unsafe fallbacks
|
||||
AbstractBedBlock.findStandUpPositionAtOffset inline crates/horizon-client/src/game/respawn_anchor.rs::Game::bed_stand_up the offset loop; each cell goes through safe_dismount_location
|
||||
AbstractBedBlock.createBlockStateDefinition skip:data state definition comes from the block data tables
|
||||
AbstractBedBlock.setPlacedBy port crates/horizon-world/src/level/place.rs::Sim::set_placed_by places the head in the cell the bed faces
|
||||
AbstractBedBlock.getSeed skip:other model seed of a random block variant; beds have one model, nothing reads it
|
||||
AbstractBedBlock.bedSurroundStandUpOffsets inline crates/horizon-client/src/game/respawn_anchor.rs::Game::bed_stand_up the ten cells around the bed, built inside bed_stand_up
|
||||
AbstractBedBlock.bedAboveStandUpOffsets inline crates/horizon-client/src/game/respawn_anchor.rs::Game::bed_stand_up the two cells on the bed, built inside bed_stand_up
|
||||
AbstractCandleBlock.onProjectileHit port crates/horizon-client/src/arrows.rs::Ticker::block_reaction a fire arrow lights an unlit, dry candle or candle cake
|
||||
AbstractCandleBlock.extinguish inline crates/horizon-world/src/level/fluids.rs::Sim::place_liquid gap: minor: water flow turns a lit candle off with its sound; the smoke particles and game event are not here (the candle cake click is CandleCakeBlock's)
|
||||
AbstractCandleBlock.setLit inline crates/horizon-client/src/arrows.rs::Ticker::block_reaction the lit=true write for a fire arrow; the lit=false write is in place_liquid
|
||||
AbstractCandleBlock.onExplosionHit port crates/horizon-client/src/game/wind.rs::Game::wind_trigger_block a wind burst puts out a lit candle; only trigger blasts do this, as in vanilla
|
||||
AbstractCauldronBlock.useItemOn port crates/horizon-client/src/game.rs::Game::use_on_cauldron held item interaction with a cauldron
|
||||
AbstractSkullBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class powered from the neighbour signal at placement
|
||||
AbstractSkullBlock.neighborChanged port crates/horizon-world/src/level/redstone.rs::Sim::skull_neighbor_changed powered state follows the neighbour signal
|
||||
AnvilBlock.useWithoutItem inline crates/horizon-world/src/level/interact.rs::Sim::use_without_item anvil screen opened from the use result, in the station list
|
||||
AnvilBlock.getMenuProvider inline crates/horizon-world/src/level/interact.rs::Sim::use_without_item the menu itself is built by the client station code; gap: minor: only the open is here
|
||||
AnvilBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate facing rotated through the state transform table
|
||||
BambooStalkBlock.createBlockStateDefinition skip:data state definition comes from the block data tables
|
||||
BambooStalkBlock.getShape skip:data the stalk box comes from the block data tables by leaves size
|
||||
BambooStalkBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class no placement in fluid, age and stage from the bamboo below
|
||||
BambooStalkBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block breaks the stalk when it cannot survive on the scheduled tick
|
||||
BambooStalkBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class schedules the survive check and cycles age when the bamboo above grows
|
||||
BambooStalkBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid height and stage limits for growth
|
||||
BambooStalkBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal grows the stalk up to the limit
|
||||
BambooStalkBlock.getHeightAboveUpToMax port crates/horizon-world/src/level/tick.rs::Sim::bamboo_height_above counts bamboo above up to the max
|
||||
BambooStalkBlock.getHeightBelowUpToMax port crates/horizon-world/src/level/tick.rs::Sim::bamboo_height_below counts bamboo below up to the max
|
||||
BannerBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class standing banner placement
|
||||
BannerBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class a standing banner breaks when its support goes
|
||||
BannerBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate rotation through the state transform table
|
||||
BannerBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror mirror through the state transform table
|
||||
BaseCoralPlantTypeBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class waterlogged when the clicked cell is full water
|
||||
BaseCoralPlantTypeBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class goes to air when it cannot survive below
|
||||
BaseCoralPlantTypeBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class needs a sturdy top face below
|
||||
BaseCoralPlantTypeBlock.getFluidState skip:other waterlogged water comes from the block state in the generic fluid code
|
||||
BaseFireBlock.inPortalDimension inline crates/horizon-world/src/level/portal.rs::Sim::fire_can_be_placed_at the Overworld or Nether check is inside fire_can_be_placed_at
|
||||
BaseFireBlock.playerWillDestroy port crates/horizon-world/src/level/hooks.rs::Sim::player_destroy fire broken by a player emits level event 1009
|
||||
BaseFireBlock.isPortal inline crates/horizon-world/src/level/portal.rs::Sim::fire_can_be_placed_at the portal frame check and axis pick are inside fire_can_be_placed_at
|
||||
BasePressurePlateBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class goes to air when it cannot survive below
|
||||
BasePressurePlateBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class rigid block or centre support below
|
||||
BasePressurePlateBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block re-checks the pressed signal on the scheduled tick
|
||||
BasePressurePlateBlock.entityInside port crates/horizon-world/src/level/hooks.rs::Sim::entity_inside an entity pressing an unpowered plate runs the pressed check
|
||||
BasePressurePlateBlock.affectNeighborsAfterRemoval port crates/horizon-world/src/level/hooks.rs::Sim::affect_neighbors_after_removal a powered plate removed updates its neighbours
|
||||
BasePressurePlateBlock.getEntityCount inline crates/horizon-world/src/level/redstone.rs::Sim::plate_signal_strength counts entities in the detection area
|
||||
BaseRailBlock.isRail port crates/horizon-world/src/level/rails.rs::Sim::is_rail rail test on a block state
|
||||
BaseRailBlock.getShape skip:data the rail box comes from the block data tables; rail_shape only reads the shape property
|
||||
BaseRailBlock.onPlace port crates/horizon-world/src/level/rails.rs::Sim::rail_place the placed rail takes its shape and connections
|
||||
BaseRailBlock.neighborChanged port crates/horizon-world/src/level/rails.rs::Sim::rail_neighbor_changed neighbour update of a rail
|
||||
BaseRailBlock.shouldBeRemoved inline crates/horizon-world/src/level/rails.rs::Sim::rail_neighbor_changed the rigid support check below and beside ascending rails is in the neighbour update
|
||||
BaseRailBlock.updateDir port crates/horizon-world/src/level/rails.rs::Sim::rail_update_dir shape update for the rail's direction
|
||||
BaseRailBlock.affectNeighborsAfterRemoval port crates/horizon-world/src/level/hooks.rs::Sim::affect_neighbors_after_removal rail arm updates neighbours after removal
|
||||
BaseRailBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class BaseRail arm of placement
|
||||
BaseRailBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate rotation through the state transform table
|
||||
BaseRailBlock.mirror port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::mirror mirror through the state transform table
|
||||
BaseRailBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class BaseRail arm of the shape update
|
||||
BaseRailBlock.getFluidState skip:other waterlogged water comes from the block state in the generic fluid code
|
||||
BeaconBlock.useWithoutItem inline crates/horizon-world/src/level/interact.rs::Sim::use_without_item beacon screen opened from the use result, in the station list
|
||||
BeehiveBlock.hiveContainsBees inline crates/horizon-client/src/game/beehives.rs::Game::use_beehive the bees-in-hive check before angering bees in the honey harvest path
|
||||
BeehiveBlock.releaseBeesAndResetHoneyLevel port crates/horizon-client/src/game/beehives.rs::Game::empty_hive gap: minor: the honey reset is not in empty_hive; set_honey_level does it
|
||||
BeehiveBlock.resetHoneyLevel port crates/horizon-client/src/game/beehives.rs::GameHive::set_honey_level honey level written back to the hive
|
||||
BeehiveBlock.spawnParticle inline crates/horizon-client/src/animate_tick.rs::beehive_drip the drip point from the hive shape; the honey drip particle is added there
|
||||
BeehiveBlock.spawnFluidParticle inline crates/horizon-client/src/animate_tick.rs::beehive_drip the dripping honey particle position
|
||||
BeehiveBlock.createBlockStateDefinition skip:data state definition comes from the block data tables
|
||||
BeehiveBlock.playerWillDestroy missing player: in survival, breaking a hive with bees or honey should give the hive item back with its bees and honey level; Horizon's break path only angers the bees
|
||||
BeehiveBlock.rotate port crates/horizon-world/src/worldgen/structure.rs::StateTransforms::rotate rotation through the state transform table
|
||||
|
@@ -0,0 +1,148 @@
|
||||
BellBlock.neighborChanged port crates/horizon-world/src/level/redstone.rs::Sim::bell_neighbor_changed Rings on a new signal and stores POWERED.
|
||||
BellBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item Class::Bell arm calls bell_hit.
|
||||
BellBlock.isProperHit inline crates/horizon-world/src/level/redstone.rs::Sim::bell_hit Proper-hit test is folded into bell_hit.
|
||||
BellBlock.getVoxelShape skip:data Shape precomputed from the extracted block shapes (level/data.rs).
|
||||
BellBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Class::Bell arm picks attachment and facing.
|
||||
BellBlock.onExplosionHit port crates/horizon-client/src/game/wind.rs::Game::wind_trigger_block gap: player: a wind charge burst that hits a bell should ring it; Horizon sends an Up-face use that bell_hit rejects, so it stays silent. TNT does not reach this (canTriggerBlocks is false).
|
||||
BellBlock.getConnectedDirection port crates/horizon-world/src/level/survive.rs::Sim::bell_connected_direction Same floor/ceiling/wall mapping.
|
||||
BellBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
BellBlock.rotate skip:data Rotation is a precomputed table from extracted data (worldgen/structure.rs rotate).
|
||||
BigDripleafBlock.makeShapes skip:data Shape precomputed from the extracted block shapes (level/data.rs).
|
||||
BigDripleafBlock.canReplace inline crates/horizon-world/src/level/bonemeal.rs::Sim::dripleaf_can_grow_into Only used by canGrowInto; folded into dripleaf_can_grow_into.
|
||||
BigDripleafBlock.place port crates/horizon-world/src/level/bonemeal.rs::Sim::dripleaf_place Sets big dripleaf with waterlogged and facing.
|
||||
BigDripleafBlock.getFluidState port crates/horizon-world/src/level/mod.rs::Behaviours::fluid Waterlogged fluid is read from per-state facts.
|
||||
BigDripleafBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal Kind::BigDripleaf arm places the stem and the leaf above.
|
||||
BigDripleafBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::big_dripleaf_tick Signal resets tilt; UNSTABLE to PARTIAL (10 ticks) to FULL (100 ticks) with sound.
|
||||
BigDripleafBlock.playTiltSound inline crates/horizon-world/src/level/tick.rs::Sim::big_dripleaf_tick Random pitch sound is inside the tick.
|
||||
BigDripleafBlock.setTiltAndScheduleTick inline crates/horizon-world/src/level/tick.rs::Sim::big_dripleaf_tick Tick path schedules the next tilt; the UNSTABLE entity path is big_dripleaf_entity_inside in hooks.rs.
|
||||
BigDripleafBlock.setTilt inline crates/horizon-world/src/level/tick.rs::Sim::big_dripleaf_tick Tilt write plus block_change game event folded into the tick.
|
||||
BigDripleafBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Class::BigDripleaf arm takes facing from the part below.
|
||||
BigDripleafBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
Block.getId skip:data Block state ids are the extracted registry indices.
|
||||
Block.stateById skip:data State lookup by id over the registry built from extracted data.
|
||||
Block.byItem skip:data Item to block link comes from the item table (info.block in horizon-items/src/items.rs).
|
||||
Block.box skip:data Shape builder; Horizon reads precomputed shapes from extracted data.
|
||||
Block.boxes skip:data Shape array builder; shapes come from extracted data.
|
||||
Block.cube skip:data Shape builder; shapes come from extracted data.
|
||||
Block.boxZ skip:data Shape builder; shapes come from extracted data.
|
||||
Block.dropFromLootTable inline crates/horizon-client/src/game/spill.rs::GameLevel::drop_interact_loot gap: minor: returns nothing, where vanilla returns whether anything dropped; folded into the interact-loot drop.
|
||||
Block.popExperience port crates/horizon-client/src/game.rs::Game::spawn_orbs gap: minor: popExperience checks the block_drops rule, and the ore XP in break_block_as_player does not.
|
||||
Block.fallOn port crates/horizon-world/src/block_landing.rs::BlockLandingRegistry::fall_on Default and hay rules apply fall damage with the block's reduction.
|
||||
Block.getShapeForEachState skip:java Shape lookup cache over the state table; Horizon precomputes shapes per state.
|
||||
Block.tryDropExperience inline crates/horizon-client/src/game.rs::Game::break_block_as_player Sampled block XP and pop folded into the break path; silk touch zeroes it as in vanilla (hard-coded check).
|
||||
Block.ShapePairKey.equals skip:java Hash key for the shape cache.
|
||||
Blocks.ocelotOrParrot port crates/horizon-client/src/mobs/spawn_rules.rs::is_valid_spawn Leaves spawn rule for ocelots and parrots (VALID_SPAWN_LEAVES).
|
||||
Blocks.logProperties skip:data Block.Properties builder; the values come from extracted block data.
|
||||
Blocks.netherStemProperties skip:data Block.Properties builder; the values come from extracted block data.
|
||||
Blocks.leavesProperties skip:data Block.Properties builder; the values come from extracted block data.
|
||||
Blocks.shulkerBoxProperties skip:data Block.Properties builder; the values come from extracted block data.
|
||||
Blocks.pistonProperties skip:data Block.Properties builder; the values come from extracted block data.
|
||||
Blocks.candleProperties skip:data Block.Properties builder; the values come from extracted block data.
|
||||
Blocks.registerLegacyStair skip:data Registry bootstrap; Horizon reads block definitions from extracted data.
|
||||
Blocks.registerStair skip:data Registry bootstrap; Horizon reads block definitions from extracted data.
|
||||
Blocks.registerSlab skip:data Registry bootstrap; Horizon reads block definitions from extracted data.
|
||||
Blocks.register skip:data Registry bootstrap; Horizon reads block definitions from extracted data.
|
||||
BrushableBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Class::Brushable arm schedules the 2-tick update.
|
||||
BubbleColumnBlock.animateTick port crates/horizon-client/src/animate_tick.rs::block_animate_tick Bubble and current particles plus whirlpool and upwards ambient sounds.
|
||||
BubbleColumnBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Class::BubbleColumn arm schedules the water tick and the 5-tick recheck.
|
||||
BubbleColumnBlock.pickupBlock missing player: an empty bucket on a bubble column should scoop a water bucket and remove the column; Horizon's bucket_pickup takes only liquids and waterlogged blocks, so nothing happens.
|
||||
ButtonBlock.makeShapes skip:data Shape precomputed from the extracted block shapes (level/data.rs).
|
||||
ButtonBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item Class::Button arm presses it, or consumes when already pressed.
|
||||
ButtonBlock.onExplosionHit port crates/horizon-client/src/game/wind.rs::Game::wind_trigger_block Wind charge bursts use the button like a player use; TNT does not reach it.
|
||||
ButtonBlock.playSound port crates/horizon-world/src/level/redstone.rs::Sim::button_press Press sound; the release sound is in button_check_pressed.
|
||||
ButtonBlock.affectNeighborsAfterRemoval port crates/horizon-world/src/level/hooks.rs::Sim::affect_neighbors_after_removal Button and lever arm updates neighbours when powered and not moved.
|
||||
ButtonBlock.getDirectSignal port crates/horizon-world/src/level/redstone.rs::Sim::state_direct_signal Strong power read from the per-state facts.
|
||||
ButtonBlock.updateNeighbours port crates/horizon-world/src/level/redstone.rs::Sim::attached_update_neighbours Updates the button and the block it is attached to.
|
||||
ButtonBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
CactusBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::cactus_random_tick Growth, cactus flower chance and reset at age 15.
|
||||
CactusBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Class::Cactus arm schedules a 1-tick survival check.
|
||||
CactusBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Solid or lava side neighbours block it; needs cactus or support tag below and no liquid above.
|
||||
CampfireBlock.entityInside port crates/horizon-client/src/motion.rs::MotionWorld::check_inside_blocks Lit campfire hurts living entities through environment_hurt.
|
||||
CampfireBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Waterlogged, lit, signal fire from hay below, facing from the player.
|
||||
CampfireBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Waterlogged tick and signal fire from the block below.
|
||||
CampfireBlock.placeLiquid port crates/horizon-world/src/level/fluids.rs::Sim::place_liquid Water puts it out with the extinguish sound and sets waterlogged.
|
||||
CampfireBlock.onProjectileHit missing player: a burning arrow (Flame bow) that hits an unlit campfire should light it; Horizon's projectile_hit only dispatches bells and targets.
|
||||
CampfireBlock.getFluidState port crates/horizon-world/src/level/mod.rs::Behaviours::fluid Waterlogged fluid is read from per-state facts.
|
||||
CampfireBlock.rotate skip:data Rotation is a precomputed table from extracted data.
|
||||
CampfireBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
CampfireBlock.getTicker port crates/horizon-client/src/game/campfire.rs::Game::tick_campfire Cooking tick when lit, cooldown tick when unlit.
|
||||
CandleBlock.useItemOn missing player: an empty hand on a lit candle should snuff it out with the extinguish sound; Horizon has no snuff path (candles only light from arrows).
|
||||
CandleBlock.canBeReplaced port crates/horizon-world/src/level/place.rs::Sim::can_be_replaced Adding a candle to a candle with fewer than four is allowed.
|
||||
CandleBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Class::Candle arm cycles the candle count when placed on a candle.
|
||||
CandleBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Waterlogged water tick.
|
||||
CandleBlock.getFluidState port crates/horizon-world/src/level/mod.rs::Behaviours::fluid Waterlogged fluid is read from per-state facts.
|
||||
CandleBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
CandleBlock.placeLiquid port crates/horizon-world/src/level/fluids.rs::Sim::place_liquid Water waterlogs the candle and puts out a lit one.
|
||||
CandleCakeBlock.useItemOn missing player: an empty hand on a lit candle cake should snuff the candle; Horizon has no snuff path.
|
||||
CandleCakeBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item CandleCake arm eats the cake and drops the candle.
|
||||
CandleCakeBlock.candleHit missing player: the hit-on-candle check for the missing candle-cake snuff.
|
||||
CandleCakeBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Candle cake drops to air when unsupported below.
|
||||
CarvedPumpkinBlock.getWeatherStateFromPattern inline crates/horizon-client/src/game/golems.rs::Game::try_spawn_copper_golem Weathering comes from the copper block below; waxed blocks count as unwaxed.
|
||||
CarvedPumpkinBlock.getOrCreateSnowGolemBase inline crates/horizon-client/src/game/golems.rs::Game::find_golem Snow column under the head; the lazy pattern cache is not needed.
|
||||
CarvedPumpkinBlock.getOrCreateSnowGolemFull inline crates/horizon-client/src/game/golems.rs::Game::find_golem Snow golem with a pumpkin head on the snow column.
|
||||
CarvedPumpkinBlock.getOrCreateIronGolemBase inline crates/horizon-client/src/game/golems.rs::Game::find_golem Iron arms and body under the head.
|
||||
CarvedPumpkinBlock.getOrCreateIronGolemFull inline crates/horizon-client/src/game/golems.rs::Game::find_golem Iron golem pattern with air cells.
|
||||
CarvedPumpkinBlock.getOrCreateCopperGolemBase port crates/horizon-client/src/game/golems.rs::Game::copper_golem_base Copper block under the head.
|
||||
CarvedPumpkinBlock.getOrCreateCopperGolemFull inline crates/horizon-client/src/game/golems.rs::Game::try_spawn_copper_golem Copper golem spawn with the pumpkin head; the head check is in is_golem_head.
|
||||
CarvedPumpkinBlock.replaceCopperBlockWithChest inline crates/horizon-client/src/game/golems.rs::Game::try_spawn_copper_golem Copper block becomes its chest with flag 2 through copper_chest_from_block.
|
||||
CauldronBlock.shouldHandlePrecipitation inline crates/horizon-world/src/level/tick.rs::Sim::precipitation_tick The 5 percent rain and 10 percent snow chances are inside the precipitation tick.
|
||||
CauldronBlock.handlePrecipitation port crates/horizon-world/src/level/tick.rs::Sim::precipitation_tick Rain fills to water cauldron, snow to powder snow cauldron.
|
||||
CauldronBlock.receiveStalactiteDrip port crates/horizon-world/src/level/speleothem.rs::Sim::cauldron_tick Water and lava drips fill the cauldron with level events 1047 and 1046.
|
||||
ChainBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Chain takes the default placement, waterlogged from the fluid.
|
||||
ChainBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Waterlogged water tick, then the default update.
|
||||
ChainBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
ChainBlock.getFluidState port crates/horizon-world/src/level/mod.rs::Behaviours::fluid Waterlogged fluid is read from per-state facts.
|
||||
ChangeOverTimeBlock.getNextState port crates/horizon-world/src/level/tick.rs::Sim::copper_change_over_time Counts weathering neighbours within 4 and rolls the chance, 0.75 for unaffected.
|
||||
ChangeOverTimeBlock.isSameAgeingType inline crates/horizon-world/src/level/tick.rs::Sim::copper_change_over_time Same weathering family is the WeatheringCopper check in the neighbour loop.
|
||||
ChiseledBookShelfBlock.useItemOn port crates/horizon-client/src/game/chiseled_bookshelf.rs::Game::use_chiseled_bookshelf Holding a book inserts it into the hit slot.
|
||||
ChiseledBookShelfBlock.useWithoutItem port crates/horizon-client/src/game/chiseled_bookshelf.rs::Game::use_chiseled_bookshelf Empty hand takes the book out of the hit slot.
|
||||
ChiseledBookShelfBlock.addBook inline crates/horizon-client/src/game/chiseled_bookshelf.rs::Game::use_chiseled_bookshelf Used stat, insert sound (enchanted variant), slot update folded in.
|
||||
ChiseledBookShelfBlock.removeBook inline crates/horizon-client/src/game/chiseled_bookshelf.rs::Game::use_chiseled_bookshelf Pickup sound, book given or dropped, block_change event folded in.
|
||||
ChiseledBookShelfBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
ChiseledBookShelfBlock.rotate skip:data Rotation is a precomputed table from extracted data.
|
||||
ChorusFlowerBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block Destroys the flower when it cannot survive.
|
||||
ChorusFlowerBlock.isRandomlyTicking skip:data Random tick flag per state comes from extracted data.
|
||||
ChorusFlowerBlock.placeGrownFlower inline crates/horizon-world/src/level/tick.rs::Sim::chorus_flower_random_tick Sets the age and level event 1033 inside the random tick.
|
||||
ChorusFlowerBlock.placeDeadFlower inline crates/horizon-world/src/level/tick.rs::Sim::chorus_flower_random_tick Sets age 5 and level event 1034 inside the random tick.
|
||||
ChorusFlowerBlock.allNeighborsEmpty inline crates/horizon-world/src/level/tick.rs::Sim::chorus_flower_random_tick The all_empty check of the random tick; the worldgen copy is ChorusPlantFeature::neighbors_empty.
|
||||
ChorusFlowerBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Class::ChorusFlower arm schedules a survival check when the side or below changes.
|
||||
ChorusFlowerBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Needs a chorus plant or support tag below, or a single plant neighbour in the air.
|
||||
ChorusFlowerBlock.generatePlant port crates/horizon-world/src/worldgen/chorus_plant.rs::ChorusPlantFeature::place Connects the base plant and grows the tree.
|
||||
ChorusFlowerBlock.growTreeRecursive port crates/horizon-world/src/worldgen/chorus_plant.rs::ChorusPlantFeature::grow Random height, stems and flowers at the tips.
|
||||
ChorusFlowerBlock.onProjectileHit missing player: an arrow or other breakable projectile hitting a chorus flower should break it and drop it; Horizon's projectile_hit only dispatches bells and targets.
|
||||
ChorusPlantBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Class::ChorusPlant arm updates the side connection and schedules the survival check.
|
||||
ChorusPlantBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block Destroys the plant when it cannot survive.
|
||||
ChorusPlantBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Plant or support tag below, or a plant neighbour with support under it.
|
||||
ChorusPlantBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
CommandBlock.neighborChanged port crates/horizon-client/src/game/command_blocks.rs::set_powered Stores the redstone power and marks the condition when it turns on.
|
||||
CommandBlock.getAnalogOutputSignal port crates/horizon-client/src/game/command_blocks.rs::analog_signal Success count of the command block.
|
||||
CommandBlock.rotate skip:data Rotation is a precomputed table from extracted data.
|
||||
CommandBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
ComparatorBlock.getOutputSignal port crates/horizon-world/src/level/redstone.rs::Sim::comparator_output Stored output signal of the comparator.
|
||||
ComparatorBlock.calculateOutputSignal port crates/horizon-world/src/level/redstone.rs::Sim::comparator_calculate_output Compare and subtract modes against the side input.
|
||||
ComparatorBlock.shouldTurnOn port crates/horizon-world/src/level/redstone.rs::Sim::diode_should_turn_on Input against side input in compare or subtract mode.
|
||||
ComparatorBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item Class::Comparator arm cycles the mode with the click sound and refreshes output.
|
||||
ComparatorBlock.checkTickOnNeighbor port crates/horizon-world/src/level/redstone.rs::Sim::diode_check_tick_on_neighbor Schedules the 2-tick refresh when output or power would change.
|
||||
ComparatorBlock.refreshOutputState port crates/horizon-world/src/level/redstone.rs::Sim::comparator_refresh Updates the output, powered state and neighbours in front.
|
||||
ComparatorBlock.triggerEvent skip:other No effect: vanilla BlockEntity.triggerEvent returns false and the comparator entity does not override it.
|
||||
ComparatorBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
ComposterBlock.onPlace port crates/horizon-world/src/level/hooks.rs::Sim::on_place A full composter schedules its ready tick in 20 ticks.
|
||||
ComposterBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block Full composter becomes ready (level 8) with the ready sound.
|
||||
ComposterBlock.getContainer port crates/horizon-client/src/game/machines.rs::Containers::view Composter level picks the input, output or empty view.
|
||||
ComposterBlock.InputContainer.getSlotsForFace port crates/horizon-client/src/game/machines.rs::View::slots_for_face Up face, slot 0 while the level is under 7.
|
||||
ComposterBlock.InputContainer.canPlaceItemThroughFace port crates/horizon-client/src/game/composter.rs::Game::composter_container_insert Only from above, below level 7, and compostable.
|
||||
ComposterBlock.InputContainer.setChanged port crates/horizon-client/src/game/composter.rs::Game::composter_container_insert Composts the item at once through addLayer.
|
||||
ComposterBlock.OutputContainer.getSlotsForFace port crates/horizon-client/src/game/machines.rs::View::slots_for_face Down face, slot 0 at level 8.
|
||||
ComposterBlock.OutputContainer.setChanged port crates/horizon-world/src/level/interact.rs::Behaviours::composter_empty Empties the composter to level 0.
|
||||
ChestBlock.getBlockType port crates/horizon-client/src/game/storage.rs::Game::chest_partner Partner half and right-half flag give the single, first or second combine type.
|
||||
ChestBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Class::Chest arm joins or splits a double chest with the neighbour.
|
||||
ChestBlock.getShape skip:data Outline shape per state comes from extracted block shapes.
|
||||
ChestBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Class::Chest arm sets facing, double type and waterlogged.
|
||||
ChestBlock.getChestType inline crates/horizon-world/src/level/place.rs::Sim::placement_class Left or right partner check folded into the Chest placement arm.
|
||||
ChestBlock.getFluidState port crates/horizon-world/src/level/mod.rs::Behaviours::fluid Waterlogged fluid is read from per-state facts.
|
||||
ChestBlock.candidatePartnerFacing port crates/horizon-world/src/level/place.rs::Sim::chest_candidate_partner_facing Facing of a single chest on the side, when it can connect.
|
||||
ChestBlock.useWithoutItem port crates/horizon-client/src/game.rs::Game::open_menu Opens the chest menu, with the open stat and piglin anger.
|
||||
ChestBlock.getTicker port crates/horizon-client/src/block_entity_anim.rs::ticker Client-side lid animation ticker.
|
||||
ChestBlock.isCatSittingOnChest port crates/horizon-client/src/game/storage.rs::Game::chest_blocked_at A sitting cat above blocks the chest.
|
||||
ChestBlock.rotate skip:data Rotation is a precomputed table from extracted data.
|
||||
ChestBlock.createBlockStateDefinition skip:data Block state properties come from extracted data.
|
||||
|
@@ -0,0 +1,148 @@
|
||||
ConcretePowderBlock.onLand port crates/horizon-world/src/level/falling.rs::Behaviours::falling_block_landed landing branch turns the powder to concrete when the spot is water or touches liquid
|
||||
ConcretePowderBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class ConcretePowder arm: concrete when the clicked spot is water or touches liquid
|
||||
ConcretePowderBlock.shouldSolidify inline crates/horizon-world/src/level/falling.rs::Behaviours::falling_block_landed gap: minor: both overloads folded into the landing branch; only the water fluid test, canBeHydrated is not read
|
||||
ConcretePowderBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class concrete arm: turns to concrete when touching liquid, else default shape
|
||||
CopperBulbBlock.onPlace inline crates/horizon-world/src/level/hooks.rs::Sim::on_place copper_bulb_check runs on placement when the old block differs
|
||||
CopperBulbBlock.neighborChanged inline crates/horizon-world/src/level/hooks.rs::Sim::neighbor_changed arm calls copper_bulb_check (checkAndFlip) on neighbour change
|
||||
CopperBulbBlock.createBlockStateDefinition skip:data lit and powered properties come from the block state tables
|
||||
CopperBulbBlock.getAnalogOutputSignal port crates/horizon-world/src/level/redstone.rs::Sim::analog_output CopperBulb arm: 15 when lit, else 0
|
||||
CopperChestBlock.getHingeSound inline crates/horizon-client/src/mobs/transport_items.rs::open_or_close weathered, oxidized and plain open and close sound ids are chosen inside open_or_close
|
||||
CopperGolemStatueBlock.createBlockStateDefinition skip:data facing, pose and waterlogged properties come from the block state tables
|
||||
CopperGolemStatueBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class facing opposite the player and waterlogged when the spot is water
|
||||
CopperGolemStatueBlock.rotate skip:data rotation results come from the exported BlockState rotate table (worldgen/structure.rs)
|
||||
CopperGolemStatueBlock.updatePose inline crates/horizon-world/src/level/interact.rs::Behaviours::turn_statue become-statue sound, pose cycle and block_change game event are folded into turn_statue
|
||||
CopperGolemStatueBlock.isPathfindable skip:data path types come from the per-state path data (mobs/path.rs)
|
||||
CopperGolemStatueBlock.getCloneItemStack port crates/horizon-client/src/game/block_items.rs::Game::picked_stack gap: player: the picked statue does not get its pose in block_state, so a middle-click pick gives it standing
|
||||
CopperGolemStatueBlock.getFluidState skip:data waterlogged water source comes from the per-state fluid facts table (Level::fluid)
|
||||
CopperGolemStatueBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class statue arm runs waterlogged_tick then the default shape update
|
||||
CrafterBlock.getAnalogOutputSignal port crates/horizon-client/src/game/machines.rs::Containers::signal crafter signal is the filled or disabled slot count from the block entity
|
||||
CrafterBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Crafter arm sets orientation from look direction and triggered from neighbour signal
|
||||
CrafterBlock.setPlacedBy port crates/horizon-world/src/level/place.rs::Sim::set_placed_by schedules the 4-tick crafter tick when triggered
|
||||
CrafterBlock.rotate skip:data rotation results come from the exported BlockState rotate table (worldgen/structure.rs)
|
||||
CrafterBlock.mirror skip:data mirror results come from the exported BlockState mirror table (worldgen/structure.rs)
|
||||
CrafterBlock.createBlockStateDefinition skip:data orientation, triggered and crafting properties come from the block state tables
|
||||
CraftingTableBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item CraftingTable arm opens the menu; the interact_with_crafting_table stat is awarded in Game::open_station
|
||||
CreakingHeartBlock.getTicker port crates/horizon-world/src/level/creaking.rs::Sim::heart_tick scheduled heart tick; the uprooted check is done inside heart_update_state
|
||||
CreakingHeartBlock.animateTick missing player: the creak idle sound near a heart with its logs at night is never played (no creaking_heart.idle sound in Horizon)
|
||||
CreakingHeartBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class CreakingHeart arm schedules the 1-tick heart update then the default shape
|
||||
CreakingHeartBlock.isSurroundedByLogs missing player: the six-side pale oak log check only gates the idle creak sound in animateTick
|
||||
CreakingHeartBlock.createBlockStateDefinition skip:data axis, creaking_heart_state and natural properties come from the block state tables
|
||||
CreakingHeartBlock.tryAwardExperience inline crates/horizon-client/src/game/creaking.rs::Game::creaking_heart_broken natural heart drops 20-24 xp orbs when broken by a player outside creative and spectator
|
||||
CreakingHeartBlock.getAnalogOutputSignal port crates/horizon-client/src/mobs/creaking_heart.rs::output_signal gap: minor: distance-based signal, no explicit uprooted check; a heart with no creaking or protector gives 0
|
||||
CropBlock.growCrops inline crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal crop arm adds the bonemeal age increase capped at max age and sets the state
|
||||
CropBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Crop arm: raw light of at least 8 and the supports_crops ground check
|
||||
CropBlock.entityInside missing player: ravagers no longer trample crops they walk into; Horizon only breaks leaves for ravagers
|
||||
DaylightDetectorBlock.useWithoutItem port crates/horizon-world/src/level/interact.rs::Sim::use_without_item DaylightDetector arm checks mayBuild, cycles inverted, sends block change and updates the signal
|
||||
DaylightDetectorBlock.getTicker port crates/horizon-world/src/level/mod.rs::Behaviours::tick_daylight_detector gap: minor: every 20 game ticks; only the Nether is skipped here, the End has no sky light but is not excluded
|
||||
DaylightDetectorBlock.createBlockStateDefinition skip:data power and inverted properties come from the block state tables
|
||||
DecoratedPotBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class DecoratedPot arm: waterlogged tick then the default shape update
|
||||
DecoratedPotBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class DecoratedPot arm: facing from the player, waterlogged from the spot, cracked false
|
||||
DecoratedPotBlock.useWithoutItem port crates/horizon-client/src/game/decorated_pot.rs::Game::use_decorated_pot empty-hand path plays insert_fail, negative wobble and block change
|
||||
DecoratedPotBlock.createBlockStateDefinition skip:data facing, waterlogged and cracked properties come from the block state tables
|
||||
DecoratedPotBlock.getFluidState skip:data waterlogged water source comes from the per-state fluid facts table (Level::fluid)
|
||||
DecoratedPotBlock.onProjectileHit missing player: a projectile hitting a pot does not crack it, and the pot is not broken by the hit
|
||||
DecoratedPotBlock.getCloneItemStack missing player: middle-click pick of a pot gives an empty pot, not one with its sherd decorations
|
||||
DecoratedPotBlock.rotate skip:data rotation results come from the exported BlockState rotate table (worldgen/structure.rs)
|
||||
DetectorRailBlock.entityInside port crates/horizon-world/src/level/hooks.rs::Sim::entity_inside when not powered, checks for minecarts inside the search box
|
||||
DetectorRailBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block when powered, rechecks the minecart presence
|
||||
DetectorRailBlock.getDirectSignal skip:data the power to the block above comes from the per-state strong signal facts (direct_signal default arm)
|
||||
DetectorRailBlock.updatePowerToConnected inline crates/horizon-world/src/level/rails.rs::Sim::detector_rail_check_pressed neighbour notify on the connected rails is folded into check_pressed
|
||||
DetectorRailBlock.onPlace inline crates/horizon-world/src/level/hooks.rs::Sim::on_place rail state update and check_pressed on a new placement
|
||||
DetectorRailBlock.getSearchBB inline crates/horizon-world/src/level/rails.rs::Sim::detector_rail_check_pressed the 0.2-inset search box is built inline
|
||||
DetectorRailBlock.rotate skip:data rail shape rotation comes from the exported BlockState rotate table (worldgen/structure.rs)
|
||||
DetectorRailBlock.mirror skip:data rail shape mirror comes from the exported BlockState mirror table (worldgen/structure.rs)
|
||||
DetectorRailBlock.createBlockStateDefinition skip:data shape, powered and waterlogged properties come from the block state tables
|
||||
DiodeBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Diode arm: the block below must be a rigid sturdy face
|
||||
DiodeBlock.getInputSignal port crates/horizon-world/src/level/redstone.rs::Sim::diode_input_signal input from the facing target, wire power, comparator analog and conductor cases
|
||||
DiodeBlock.getAlternateSignal port crates/horizon-world/src/level/redstone.rs::Sim::diode_alternate_signal maximum of the two side control inputs
|
||||
DiodeBlock.ownSignal skip:data the output while powered comes from the per-state weak signal facts (state_signal default arm)
|
||||
DiodeBlock.getSignal skip:data the facing check and output per side come from the per-state weak signal facts (state_signal default arm)
|
||||
DiodeBlock.setPlacedBy port crates/horizon-world/src/level/place.rs::Sim::set_placed_by schedules the 1-tick update when the diode should turn on
|
||||
DiodeBlock.updateNeighborsInFront port crates/horizon-world/src/level/redstone.rs::Sim::diode_update_neighbors_in_front neighbour notify on the block behind the output
|
||||
DiodeBlock.shouldPrioritize port crates/horizon-world/src/level/redstone.rs::Sim::diode_should_prioritize checks for a diode facing back at it
|
||||
DispenserBlock.registerProjectileBehavior inline crates/horizon-client/src/game/dispenser.rs::Game::dispense_item egg, snowball and wind charge dispense as projectiles in dispense_item
|
||||
DispenserBlock.neighborChanged port crates/horizon-world/src/level/redstone.rs::Sim::dispenser_neighbor_changed a signal at the block or above starts a 4-tick dispense and sets triggered
|
||||
DispenserBlock.rotate skip:data rotation results come from the exported BlockState rotate table (worldgen/structure.rs)
|
||||
DispenserBlock.createBlockStateDefinition skip:data facing and triggered properties come from the block state tables
|
||||
DoorBlock.getShape skip:data outline shapes come from the per-state shape table (facts shape index)
|
||||
DoorBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Door arm: the other half follows, and the lower half breaks when unsupported
|
||||
DoorBlock.onExplosionHit missing player: a wind charge blast does not swing a door open; canOpenByWindCharge is read from data but no code uses it
|
||||
DoorBlock.playerWillDestroy port crates/horizon-world/src/level/hooks.rs::Sim::player_destroy creative break of the upper half removes the lower half without drops
|
||||
DoorBlock.isPathfindable skip:data path types come from the per-state path data (mobs/path.rs)
|
||||
DoorBlock.setPlacedBy port crates/horizon-world/src/level/place.rs::Sim::set_placed_by Door branch places the upper half
|
||||
DoorBlock.neighborChanged port crates/horizon-world/src/level/redstone.rs::Sim::door_neighbor_changed redstone power toggles the door open and plays the sound
|
||||
DoorBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Door arm: lower half needs a sturdy face below, upper half needs the same door below
|
||||
DoorBlock.playSound port crates/horizon-world/src/level/redstone.rs::Sim::door_sound open or close sound from the block set type with a random pitch
|
||||
DoorBlock.rotate skip:data rotation results come from the exported BlockState rotate table (worldgen/structure.rs)
|
||||
DoorBlock.mirror skip:data mirror results come from the exported BlockState mirror table (worldgen/structure.rs)
|
||||
DoorBlock.getSeed skip:other other: only seeds a random model offset, and doors have no offset type
|
||||
DoorBlock.createBlockStateDefinition skip:data half, facing, open, hinge and powered properties come from the block state tables
|
||||
DoublePlantBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class DoublePlant arm: the partner half follows, and the lower half breaks when unsupported
|
||||
DoublePlantBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class DoublePlant arm: needs room below the build limit and a replaceable block above
|
||||
DoublePlantBlock.setPlacedBy port crates/horizon-world/src/level/place.rs::Sim::set_placed_by DoublePlant branch places the upper half, waterlogged from its own spot
|
||||
DoublePlantBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class DoublePlant arm: upper half needs the lower half of the same block below
|
||||
DoublePlantBlock.copyWaterloggedFrom inline crates/horizon-world/src/level/place.rs::Sim::set_placed_by upper half waterlogged from the water at its spot, inline in set_placed_by
|
||||
DoublePlantBlock.playerWillDestroy port crates/horizon-world/src/level/hooks.rs::Sim::player_destroy gap: minor: only the creative bottom-half removal is read here, the drop branch is not
|
||||
DoublePlantBlock.preventDropFromBottomPart inline crates/horizon-world/src/level/hooks.rs::Sim::player_destroy bottom half removed without drops on a creative break of the upper half
|
||||
DoublePlantBlock.getSeed port crates/horizon-client/src/mesher.rs::offset gap: minor: the jitter seed uses y 0 for every block, vanilla uses the lower half's y, so tall grass and flower offsets differ
|
||||
DriedGhastBlock.createBlockStateDefinition skip:data facing, hydration_level and waterlogged properties come from the block state tables
|
||||
DriedGhastBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class DriedGhast arm: waterlogged tick, then the default shape update
|
||||
DriedGhastBlock.tickWaterlogged inline crates/horizon-world/src/level/timeline.rs::Sim::dried_ghast_tick waterlogged branch: transition sound and hydration plus one, or the ghastling spawn event at full hydration
|
||||
DriedGhastBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class DriedGhast arm: waterlogged from the spot and facing opposite the player
|
||||
DriedGhastBlock.getFluidState skip:data waterlogged water source comes from the per-state fluid facts table (Level::fluid)
|
||||
DriedGhastBlock.placeLiquid port crates/horizon-world/src/level/fluids.rs::Sim::place_liquid gap: player: waterlogs the block like the generic path, but plays no dried ghast place-in-water sound
|
||||
DriedGhastBlock.setPlacedBy missing player: no dried ghast placement sound is played on placing it (no dried_ghast place or place-in-water sound id is referenced)
|
||||
EndGatewayBlock.getPortalDestination port crates/horizon-client/src/game/end.rs::Game::gateway_job gap: minor: the thrown ender pearl branch (no relative flags) is not read, only the player travels through gateways here
|
||||
EndPortalFrameBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class EndPortalFrame arm: facing opposite the player and eye set to false
|
||||
EndPortalFrameBlock.rotate skip:data rotation results come from the exported BlockState rotate table (worldgen/structure.rs)
|
||||
EndPortalFrameBlock.createBlockStateDefinition skip:data facing and eye properties come from the block state tables
|
||||
EntityBlock.getListener inline crates/horizon-client/src/game/sculk.rs::Game::post_game_event gap: minor: listeners within reach are found in post_game_event, which reads only the sculk listener tables
|
||||
EyeblossomBlock.randomTick port crates/horizon-world/src/level/timeline.rs::Sim::eyeblossom_tick random tick runs tryChangingState and picks the long switch sound
|
||||
FaceAttachedHorizontalDirectionalBlock.canAttach inline crates/horizon-world/src/level/survive.rs::Sim::can_survive_class the sturdy-face test on the attached side is inline in the FaceAttached arm
|
||||
FaceAttachedHorizontalDirectionalBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class FaceAttached arm: tries the nearest looking directions and keeps the first that survives
|
||||
FaceAttachedHorizontalDirectionalBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class FaceAttached arm: breaks when the attached side is no longer sturdy
|
||||
FallingBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class FallingBlock arm schedules the falling tick (2, or 5 for dragon egg) then the default shape
|
||||
FarmlandBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Farmland arm schedules a 1-tick check when the block above changes and farmland cannot survive
|
||||
FarmlandBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Farmland arm: survives when the block above is not solid or maintains farmland
|
||||
FarmlandBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Farmland arm: the base block when farmland cannot survive at the spot
|
||||
FarmlandBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block Farmland arm turns the block to its base when it cannot survive
|
||||
FarmlandBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::farmland_random_tick moisture falls or rises with water in reach and rain above, else turns to base
|
||||
FarmlandBlock.turnToBaseBlock port crates/horizon-world/src/level/tick.rs::Sim::turn_to_base_block gap: player: entities standing on it are not pushed up when it turns to dirt (pushEntitiesUp is not read)
|
||||
FarmlandBlock.isNearWater inline crates/horizon-world/src/level/tick.rs::Sim::farmland_random_tick gap: minor: the 9x2x9 water search is inline and tests the water fluid only, not canBeHydrated
|
||||
FenceBlock.isSameFence inline crates/horizon-world/src/level/shapes.rs::Sim::fence_connects_to the same-fence test (fence tag and wooden match) is inline in fence_connects_to
|
||||
FenceBlock.getStateForPlacement port crates/horizon-world/src/level/place.rs::Sim::placement_class Fence arm: each horizontal side connects per neighbour and waterlogged from the spot
|
||||
FenceBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Fence arm: waterlogged tick and the horizontal side connection update
|
||||
FenceBlock.createBlockStateDefinition skip:data north, east, south, west and waterlogged properties come from the block state tables
|
||||
FireBlock.makeShapes skip:data the per-age and per-side outline shapes come from the per-state shape table
|
||||
FireBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class Fire arm: keeps the fire with its age when it can survive, else air
|
||||
FireBlock.getStateForPlacement port crates/horizon-world/src/level/shapes.rs::Sim::fire_state_for fire state from the sides that can catch fire, or the plain fire when the spot below is sturdy
|
||||
FireBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class Fire arm: a sturdy block below or a valid fire location
|
||||
FireBlock.isNearRain port crates/horizon-world/src/level/tick.rs::Sim::fire_near_rain rain at the spot or on one of its four sides
|
||||
FireBlock.getBurnOdds port crates/horizon-world/src/level/survive.rs::Sim::burn_odds waterlogged blocks never burn, else the burn odds table
|
||||
FireBlock.checkBurnOut port crates/horizon-world/src/level/tick.rs::Sim::fire_check_burn_out burn-out roll that either ages the fire or removes the block
|
||||
FireBlock.onPlace port crates/horizon-world/src/level/hooks.rs::Sim::on_place Fire arm: base fire placement, then the fire tick scheduled at 30 plus a random 0 to 9
|
||||
FireBlock.createBlockStateDefinition skip:data age and the per-side properties come from the block state tables
|
||||
FireBlock.setFlammable skip:data flammability odds are data (burn odds table read by survive.rs), set by the registry bootstrap
|
||||
FireBlock.bootStrap skip:data registry bootstrap of the flammable blocks; Horizon reads the odds from data tables
|
||||
FlowerPotBlock.useItemOn missing player: right-clicking an empty flower pot with a flower or sapling does nothing, so no potted plant can be made
|
||||
FlowerPotBlock.useWithoutItem missing player: right-clicking a potted plant with an empty hand does not take the plant out
|
||||
FlowerPotBlock.getCloneItemStack missing player: middle-click pick of a potted plant gives an empty flower pot, not the plant
|
||||
FlowerPotBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class FlowerPot arm: breaks when the block under it stops supporting it
|
||||
GrassBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid grass arm: air above and inside build height
|
||||
GrassBlock.stopBonemealSpread inline crates/horizon-world/src/level/bonemeal.rs::Sim::grass_bonemeal the per-step stop test (grass below, full collision at the spot) is inline in the attempt loop
|
||||
GrowingPlantBlock.canSurvive port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class GrowingPlant arm: attached to a supporting face, a body or a head on the growth side
|
||||
GrowingPlantBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block GrowingPlant is in the tick list that breaks the plant when it cannot survive
|
||||
GrowingPlantBodyBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class GrowingPlantBody arm: 1-tick survival check, and a random-age head replaces the body when the growth side opens
|
||||
GrowingPlantBodyBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid PlantBody arm: finds the head and checks its growth spot
|
||||
GrowingPlantBodyBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal PlantBody arm forwards to the head's bonemeal growth
|
||||
GrowingPlantBodyBlock.canBeReplaced port crates/horizon-world/src/level/place.rs::Sim::can_be_replaced GrowingPlantBody arm: not replaceable by a held head item
|
||||
GrowingPlantHeadBlock.isRandomlyTicking skip:data the random-ticking flag per state comes from the exported facts (Level::is_randomly_ticking)
|
||||
GrowingPlantHeadBlock.randomTick port crates/horizon-world/src/level/tick.rs::Sim::random_tick_block GrowingPlantHead arm: below age 25 and the growth roll grows it into the next spot
|
||||
GrowingPlantHeadBlock.isMaxAge skip:other other: an AGE == 25 predicate that no pinned game code calls for plant heads (only crop, loot and villager code use isMaxAge)
|
||||
GrowingPlantHeadBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class GrowingPlantHead arm: 1-tick survival check, and turns to body when the head or body sits on the growth side
|
||||
GrowingPlantHeadBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid PlantHead arm: the growth spot is free and inside build height
|
||||
HangingMossBlock.canStayAtPosition port crates/horizon-world/src/level/survive.rs::Sim::can_survive_class HangingMoss arm: attaches above to a multiface or to another moss
|
||||
HangingMossBlock.updateShape port crates/horizon-world/src/level/shapes.rs::Sim::update_shape_class HangingMoss arm: 1-tick check when unattached, and the tip follows the block below
|
||||
HangingMossBlock.tick port crates/horizon-world/src/level/tick.rs::Sim::tick_block HangingMoss arm breaks the moss when it cannot stay
|
||||
HangingMossBlock.isValidBonemealTarget port crates/horizon-world/src/level/bonemeal.rs::Sim::bonemeal_valid HangingMoss arm: air below the tip inside build height
|
||||
HangingMossBlock.performBonemeal port crates/horizon-world/src/level/bonemeal.rs::Sim::perform_bonemeal HangingMoss arm sets the tip on the air below the tip
|
||||
|
Loaded 100 of 138 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user