Skip to main content

steel_registry/
vanilla_ticket_types.rs

1//! Ticket types hardcoded by vanilla 26.2 in `TicketType.java`.
2
3use steel_utils::Identifier;
4
5use crate::ticket_type::{TicketType, TicketTypeFlags, TicketTypeRegistry};
6
7const LOADS: TicketTypeFlags = TicketTypeFlags::LOADING;
8const LOADS_AND_SIMULATES: TicketTypeFlags = LOADS.union(TicketTypeFlags::SIMULATION);
9const SIMULATES_AND_KEEPS_ACTIVE: TicketTypeFlags =
10    TicketTypeFlags::SIMULATION.union(TicketTypeFlags::KEEP_DIMENSION_ACTIVE);
11const PERSISTENT_LOADING_SIMULATION: TicketTypeFlags = TicketTypeFlags::PERSIST
12    .union(TicketTypeFlags::LOADING)
13    .union(TicketTypeFlags::SIMULATION)
14    .union(TicketTypeFlags::KEEP_DIMENSION_ACTIVE);
15const LOADING_SIMULATION: TicketTypeFlags = TicketTypeFlags::LOADING
16    .union(TicketTypeFlags::SIMULATION)
17    .union(TicketTypeFlags::KEEP_DIMENSION_ACTIVE);
18const LOADING_THAT_EXPIRES_IF_UNLOADED: TicketTypeFlags =
19    TicketTypeFlags::LOADING.union(TicketTypeFlags::CAN_EXPIRE_IF_UNLOADED);
20
21pub static PLAYER_SPAWN: TicketType =
22    TicketType::new(Identifier::vanilla_static("player_spawn"), 20, LOADS);
23pub static SPAWN_SEARCH: TicketType =
24    TicketType::new(Identifier::vanilla_static("spawn_search"), 1, LOADS);
25pub static DRAGON: TicketType = TicketType::new(
26    Identifier::vanilla_static("dragon"),
27    TicketType::NO_TIMEOUT,
28    LOADS_AND_SIMULATES,
29);
30pub static PLAYER_LOADING: TicketType = TicketType::new(
31    Identifier::vanilla_static("player_loading"),
32    TicketType::NO_TIMEOUT,
33    LOADS,
34);
35pub static PLAYER_SIMULATION: TicketType = TicketType::new(
36    Identifier::vanilla_static("player_simulation"),
37    TicketType::NO_TIMEOUT,
38    SIMULATES_AND_KEEPS_ACTIVE,
39);
40pub static FORCED: TicketType = TicketType::new(
41    Identifier::vanilla_static("forced"),
42    TicketType::NO_TIMEOUT,
43    PERSISTENT_LOADING_SIMULATION,
44);
45pub static PORTAL: TicketType = TicketType::new(
46    Identifier::vanilla_static("portal"),
47    300,
48    PERSISTENT_LOADING_SIMULATION,
49);
50pub static ENDER_PEARL: TicketType = TicketType::new(
51    Identifier::vanilla_static("ender_pearl"),
52    40,
53    LOADING_SIMULATION,
54);
55pub static UNKNOWN: TicketType = TicketType::new(
56    Identifier::vanilla_static("unknown"),
57    1,
58    LOADING_THAT_EXPIRES_IF_UNLOADED,
59);
60
61/// Registers the entries in vanilla's declaration order, which defines their IDs.
62pub fn register_vanilla_ticket_types(registry: &mut TicketTypeRegistry) {
63    registry.register(&PLAYER_SPAWN);
64    registry.register(&SPAWN_SEARCH);
65    registry.register(&DRAGON);
66    registry.register(&PLAYER_LOADING);
67    registry.register(&PLAYER_SIMULATION);
68    registry.register(&FORCED);
69    registry.register(&PORTAL);
70    registry.register(&ENDER_PEARL);
71    registry.register(&UNKNOWN);
72}
73
74#[cfg(test)]
75mod tests {
76    use super::register_vanilla_ticket_types;
77    use crate::RegistryExt;
78    use crate::ticket_type::TicketTypeRegistry;
79
80    #[test]
81    fn registry_matches_vanilla_order_timeouts_and_behavior() {
82        let mut registry = TicketTypeRegistry::new();
83        register_vanilla_ticket_types(&mut registry);
84
85        let expected = [
86            ("minecraft:player_spawn", 20, 2),
87            ("minecraft:spawn_search", 1, 2),
88            ("minecraft:dragon", 0, 6),
89            ("minecraft:player_loading", 0, 2),
90            ("minecraft:player_simulation", 0, 12),
91            ("minecraft:forced", 0, 15),
92            ("minecraft:portal", 300, 15),
93            ("minecraft:ender_pearl", 40, 14),
94            ("minecraft:unknown", 1, 18),
95        ];
96
97        assert_eq!(registry.len(), expected.len());
98
99        for (id, (key, timeout, flags)) in expected.into_iter().enumerate() {
100            let ticket_type = registry
101                .by_id(id)
102                .unwrap_or_else(|| panic!("missing vanilla ticket type at ID {id}"));
103
104            assert_eq!(ticket_type.key.to_string(), key);
105            assert_eq!(ticket_type.timeout(), timeout);
106            assert_eq!(ticket_type.flags().bits(), flags);
107        }
108    }
109}