valence/build/entity.rs

1625 lines
39 KiB
Rust
Raw Normal View History

2022-04-27 12:48:35 +10:00
//! See: <https://wiki.vg/Entity_metadata>
#![allow(unused)]
struct Class {
name: &'static str,
inherit: Option<&'static Class>,
fields: &'static [Field],
}
struct Field {
name: &'static str,
typ: Type,
}
/// Each variant contains the default value for the field.
enum Type {
BitFields(&'static [BitField]),
Byte(u8),
VarInt(i32),
Float(f32),
String(&'static str),
Text,
OptText(Option<&'static str>),
Slot,
Bool(bool),
Rotations(f32, f32, f32),
BlockPos(i32, i32, i32),
OptPosition(Option<(i32, i32, i32)>),
Direction(Direction),
OptUuid,
OptBlockId,
Nbt,
Particle,
VillagerData,
OptVarInt,
Pose,
OptBlockPos, // TODO: What is this type?
// ==== Specialized ==== //
OptEntityId,
BoatType,
MainHand,
}
enum Direction {
Down,
Up,
North,
South,
West,
East,
}
struct BitField {
name: &'static str,
offset: u8,
}
const BASE_ENTITY: Class = Class {
name: "entity_base",
inherit: None,
fields: &[
Field {
name: "entity_base_bits",
typ: Type::BitFields(&[
BitField {
name: "on_fire",
offset: 0,
},
BitField {
name: "crouching",
offset: 1,
},
BitField {
name: "sprinting",
offset: 3, // Skipping unused field
},
BitField {
name: "swimming",
offset: 4,
},
BitField {
name: "invisible",
offset: 5,
},
BitField {
name: "glowing",
offset: 6,
},
BitField {
name: "elytra_flying",
offset: 7,
},
]),
},
Field {
name: "air_ticks",
typ: Type::VarInt(300),
},
Field {
name: "custom_name",
typ: Type::OptText(None),
},
Field {
name: "custom_name_visible",
typ: Type::Bool(false),
},
Field {
name: "silent",
typ: Type::Bool(false),
},
Field {
name: "no_gravity",
typ: Type::Bool(false),
},
Field {
name: "pose",
typ: Type::Pose,
},
Field {
name: "frozen_ticks",
typ: Type::VarInt(0),
},
],
};
const ABSTRACT_ARROW: Class = Class {
name: "abstract_arrow",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "abstract_arrow_bits",
typ: Type::BitFields(&[
BitField {
name: "critical",
offset: 0,
},
BitField {
name: "noclip",
offset: 1,
},
]),
},
Field {
name: "piercing_level",
typ: Type::Byte(0),
},
],
};
const LIVING_ENTITY: Class = Class {
name: "living_entity",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "living_entity_bits",
typ: Type::BitFields(&[
BitField {
name: "hand_active",
offset: 0,
},
BitField {
name: "active_hand",
offset: 1,
},
BitField {
name: "riptide_spin_attack",
offset: 2,
},
]),
},
Field {
name: "health",
typ: Type::Float(1.0),
},
Field {
name: "potion_effect_color",
typ: Type::VarInt(0), // TODO: potion effect color type
},
Field {
name: "potion_effect_ambient",
typ: Type::Bool(false),
},
Field {
name: "arrow_count",
typ: Type::VarInt(0),
},
Field {
name: "bee_stinger_count",
typ: Type::VarInt(0),
},
Field {
name: "bed_sleeping_position",
typ: Type::OptBlockPos,
},
],
};
const MOB: Class = Class {
name: "mob",
inherit: Some(&LIVING_ENTITY),
fields: &[Field {
name: "mob_bits",
typ: Type::BitFields(&[
BitField {
name: "ai_disabled",
offset: 0,
},
BitField {
name: "left_handed",
offset: 1,
},
BitField {
name: "aggressive",
offset: 2,
},
]),
}],
};
const AMBIENT_CREATURE: Class = Class {
name: "ambient_creature",
inherit: Some(&MOB),
fields: &[],
};
const PATHFINDER_MOB: Class = Class {
name: "pathfinder_mob",
inherit: Some(&MOB),
fields: &[],
};
const WATER_ANIMAL: Class = Class {
name: "water_animal",
inherit: Some(&PATHFINDER_MOB),
fields: &[],
};
const ABSTRACT_FISH: Class = Class {
name: "abstract_fish",
inherit: Some(&WATER_ANIMAL),
fields: &[Field {
name: "from_bucket",
typ: Type::Bool(false),
}],
};
const AGEABLE_MOB: Class = Class {
name: "ageable_mob",
inherit: Some(&PATHFINDER_MOB),
fields: &[Field {
name: "is_baby",
typ: Type::Bool(false),
}],
};
const ANIMAL: Class = Class {
name: "animal",
inherit: Some(&PATHFINDER_MOB),
fields: &[],
};
const ABSTRACT_HORSE: Class = Class {
name: "abstract_horse",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "horse_bits",
typ: Type::BitFields(&[
BitField {
name: "tame",
offset: 1, // Skip unused
},
BitField {
name: "saddled",
offset: 2,
},
BitField {
name: "bred",
offset: 3,
},
BitField {
name: "eating",
offset: 4,
},
BitField {
name: "rearing",
offset: 5,
},
BitField {
name: "mouth_open",
offset: 6,
},
]),
},
Field {
name: "owner",
typ: Type::OptUuid,
},
],
};
const CHESTED_HORSE: Class = Class {
name: "chested_horse",
inherit: Some(&ABSTRACT_HORSE),
fields: &[Field {
name: "has_chest",
typ: Type::Bool(false),
}],
};
const COW: Class = Class {
name: "cow",
inherit: Some(&ANIMAL),
fields: &[],
};
const TAMEABLE_ANIMAL: Class = Class {
name: "tameable_animal",
inherit: Some(&ANIMAL),
fields: &[Field {
name: "tameable_animal_bits",
typ: Type::BitFields(&[
BitField {
name: "sitting",
offset: 0,
},
BitField {
name: "tamed",
offset: 2, // Skip unused.
},
]),
}],
};
const ABSTRACT_VILLAGER: Class = Class {
name: "abstract_villager",
inherit: Some(&AGEABLE_MOB),
fields: &[Field {
name: "head_shake_timer",
typ: Type::VarInt(0),
}],
};
const ABSTRACT_GOLEM: Class = Class {
name: "abstract_golem",
inherit: Some(&PATHFINDER_MOB),
fields: &[],
};
const MONSTER: Class = Class {
name: "monster",
inherit: Some(&PATHFINDER_MOB),
fields: &[],
};
const BASE_PIGLIN: Class = Class {
name: "base_piglin",
inherit: Some(&MONSTER),
fields: &[Field {
name: "zombification_immune",
typ: Type::Bool(false),
}],
};
const GUARDIAN: Class = Class {
name: "guardian",
inherit: Some(&MONSTER),
fields: &[
Field {
name: "retracting_spikes",
typ: Type::Bool(false),
},
Field {
name: "target",
typ: Type::OptEntityId,
},
],
};
const RAIDER: Class = Class {
name: "raider",
inherit: Some(&MONSTER),
fields: &[Field {
name: "celebrating",
typ: Type::Bool(false),
}],
};
const ABSTRACT_ILLAGER: Class = Class {
name: "abstract_illager",
inherit: Some(&RAIDER),
fields: &[],
};
const SPELLCASTER_ILLAGER: Class = Class {
name: "spellcaster_illager",
inherit: Some(&ABSTRACT_ILLAGER),
fields: &[Field {
name: "spellcaster_state",
typ: Type::Byte(0), /* TODO: Spell (0: none, 1: summon vex, 2: attack, 3: wololo, 4:
* disappear, 5: blindness) */
}],
};
const ABSTRACT_SKELETON: Class = Class {
name: "abstract_skeleton",
inherit: Some(&MONSTER),
fields: &[],
};
const SPIDER: Class = Class {
name: "spider",
inherit: Some(&MONSTER),
fields: &[Field {
name: "spider_bits",
typ: Type::BitFields(&[BitField {
name: "climbing",
offset: 0,
}]),
}],
};
const ZOMBIE: Class = Class {
name: "zombie",
inherit: Some(&MONSTER),
fields: &[Field {
name: "baby",
typ: Type::Bool(false),
}],
};
const FLYING: Class = Class {
name: "flying",
inherit: Some(&MOB),
fields: &[],
};
const ABSTRACT_MINECART: Class = Class {
name: "abstract minecart",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "shaking_power",
typ: Type::VarInt(0),
},
Field {
name: "shaking_direction",
typ: Type::VarInt(1), // TODO: Refined type?
},
Field {
name: "shaking_multiplier",
typ: Type::Float(0.0),
},
Field {
name: "custom_block_id",
typ: Type::VarInt(0), // TODO: is this a BlockState?
},
Field {
name: "custom_block_y_pos",
typ: Type::VarInt(6), // TODO: measured in 16ths of a block. Refined type?
},
Field {
name: "show_custom_block",
typ: Type::Bool(false),
},
],
};
const ABSTRACT_MINECART_CONTAINER: Class = Class {
name: "abstract_minecart_container",
inherit: Some(&ABSTRACT_MINECART),
fields: &[],
};
const ENTITIES: &[Class] = &[
Class {
name: "experience_orb",
inherit: None,
fields: &[],
},
Class {
name: "painting",
inherit: None,
fields: &[],
},
Class {
name: "thrown_egg",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "item",
typ: Type::Slot,
}],
},
Class {
name: "thrown_ender_pearl",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "item",
typ: Type::Slot,
}],
},
Class {
name: "thrown_experience_bottle",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "item",
typ: Type::Slot,
}],
},
Class {
name: "thrown_potion",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "potion",
typ: Type::Slot,
}],
},
Class {
name: "snowball",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "item",
typ: Type::Slot,
}],
},
Class {
name: "eye_of_ender",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "item",
typ: Type::Slot,
}],
},
Class {
name: "falling_block",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "spawn_position",
typ: Type::BlockPos(0, 0, 0),
}],
},
Class {
name: "area_effect_cloud",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "radius",
typ: Type::Float(0.5),
},
Field {
name: "color",
typ: Type::VarInt(0),
},
Field {
name: "ignore_radius",
typ: Type::Bool(false),
},
Field {
name: "particle",
typ: Type::Particle,
},
],
},
Class {
name: "fishing_hook",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "hooked_entity",
typ: Type::OptEntityId,
},
Field {
name: "catchable",
typ: Type::Bool(false),
},
],
},
Class {
name: "arrow",
inherit: Some(&ABSTRACT_ARROW),
fields: &[Field {
name: "color",
typ: Type::VarInt(-1), // TODO: custom type
}],
},
Class {
name: "spectral_arrow",
inherit: Some(&ABSTRACT_ARROW),
fields: &[],
},
Class {
name: "thrown_trident",
inherit: Some(&ABSTRACT_ARROW),
fields: &[
Field {
name: "loyalty_level",
typ: Type::VarInt(0),
},
Field {
name: "enchantment_glint",
typ: Type::Bool(false),
},
],
},
Class {
name: "boat",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "last_hit_ticks",
typ: Type::VarInt(0),
},
Field {
name: "forward_direction",
typ: Type::VarInt(1), // TODO: direction enum?
},
Field {
name: "damage_taken",
typ: Type::Float(0.0),
},
Field {
name: "typ",
typ: Type::BoatType,
},
Field {
name: "left_paddle_turning",
typ: Type::Bool(false),
},
Field {
name: "right_paddle_turning",
typ: Type::Bool(false),
},
Field {
name: "splash_timer",
typ: Type::VarInt(0),
},
],
},
Class {
name: "end_crystal",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "beam_target",
typ: Type::OptBlockPos,
},
Field {
name: "show_bottom",
typ: Type::Bool(true),
},
],
},
Class {
name: "dragon_fireball",
inherit: Some(&BASE_ENTITY),
fields: &[],
},
Class {
name: "small_fireball",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "item",
typ: Type::Slot,
}],
},
Class {
name: "fireball",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "item",
typ: Type::Slot,
}],
},
Class {
name: "wither_skull",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "invulnerable",
typ: Type::Bool(false),
}],
},
Class {
name: "firework_rocket",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "info",
typ: Type::Slot,
},
Field {
name: "used_by",
typ: Type::OptEntityId,
},
Field {
name: "shot_at_angle",
typ: Type::Bool(false),
},
],
},
Class {
name: "item_frame",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "item",
typ: Type::Slot,
},
Field {
name: "rotation",
typ: Type::VarInt(0), // TODO: Direction enum?
},
],
},
Class {
// TODO: How is glow item frame defined? This is a guess.
name: "glow_item_frame",
inherit: Some(&BASE_ENTITY),
fields: &[
Field {
name: "item",
typ: Type::Slot,
},
Field {
name: "rotation",
typ: Type::VarInt(0), // TODO: Direction enum?
},
],
},
Class {
name: "player",
inherit: Some(&LIVING_ENTITY),
fields: &[
Field {
name: "additional_hearts",
typ: Type::Float(0.0),
},
Field {
name: "score",
typ: Type::VarInt(0),
},
Field {
name: "displayed_skin_parts",
typ: Type::BitFields(&[
BitField {
name: "cape_enabled",
offset: 0,
},
BitField {
name: "jacket_enabled",
offset: 1,
},
BitField {
name: "left_sleeve_enabled",
offset: 2,
},
BitField {
name: "right_sleeve_enabled",
offset: 3,
},
BitField {
name: "left_pants_leg_enabled",
offset: 4,
},
BitField {
name: "right_pants_leg_enabled",
offset: 5,
},
BitField {
name: "hat_enabled",
offset: 6,
},
]),
},
Field {
name: "main_hand",
typ: Type::MainHand,
},
Field {
name: "left_shoulder_entity_data",
typ: Type::Nbt,
},
Field {
name: "right_shoulder_entity_data",
typ: Type::Nbt,
},
],
},
Class {
name: "armor_stand",
inherit: Some(&LIVING_ENTITY),
fields: &[
Field {
name: "armor_stand_bits",
typ: Type::BitFields(&[
BitField {
name: "small",
offset: 0,
},
BitField {
name: "has_arms",
offset: 1,
},
BitField {
name: "no_baseplate",
offset: 2,
},
BitField {
name: "is_marker",
offset: 3,
},
]),
},
Field {
name: "head_rotation",
typ: Type::Rotations(0.0, 0.0, 0.0),
},
Field {
name: "body_rotation",
typ: Type::Rotations(0.0, 0.0, 0.0),
},
Field {
name: "left_arm_rotation",
typ: Type::Rotations(-10.0, 0.0, -10.0),
},
Field {
name: "right_arm_rotation",
typ: Type::Rotations(-15.0, 0.0, -10.0),
},
Field {
name: "left_leg_rotation",
typ: Type::Rotations(-1.0, 0.0, -1.0),
},
Field {
name: "right_leg_rotation",
typ: Type::Rotations(1.0, 0.0, 1.0),
},
],
},
Class {
name: "bat",
inherit: Some(&AMBIENT_CREATURE),
fields: &[Field {
name: "bat_bits",
typ: Type::BitFields(&[BitField {
name: "hanging",
offset: 0,
}]),
}],
},
Class {
name: "squid",
inherit: Some(&WATER_ANIMAL),
fields: &[],
},
Class {
// TODO: How is glow squid defined? This is a guess.
name: "glow_squid",
inherit: Some(&WATER_ANIMAL),
fields: &[],
},
Class {
name: "dolphin",
inherit: Some(&WATER_ANIMAL),
fields: &[
Field {
name: "treasure_position",
typ: Type::BlockPos(0, 0, 0),
},
Field {
name: "has_fish",
typ: Type::Bool(false),
},
Field {
name: "moisture_level",
typ: Type::VarInt(2400),
},
],
},
Class {
name: "cod",
inherit: Some(&ABSTRACT_FISH),
fields: &[],
},
Class {
name: "puffer_fish",
inherit: Some(&ABSTRACT_FISH),
fields: &[Field {
name: "puff_state",
typ: Type::VarInt(0), // TODO: PuffState in the range [0, 2]. (Bounded int?)
}],
},
Class {
name: "salmon",
inherit: Some(&ABSTRACT_FISH),
fields: &[],
},
Class {
name: "tropical_fish",
inherit: Some(&ABSTRACT_FISH),
fields: &[Field {
name: "variant",
typ: Type::VarInt(0), // TODO: TropicalFishVariant enum
}],
},
Class {
name: "horse",
inherit: Some(&ABSTRACT_HORSE),
fields: &[Field {
name: "variant",
typ: Type::VarInt(0), // TODO: HorseVariant enum
}],
},
Class {
name: "zombie_horse",
inherit: Some(&ABSTRACT_HORSE),
fields: &[],
},
Class {
name: "skeleton_horse",
inherit: Some(&ABSTRACT_HORSE),
fields: &[],
},
Class {
name: "donkey",
inherit: Some(&CHESTED_HORSE),
fields: &[],
},
Class {
name: "llama",
inherit: Some(&CHESTED_HORSE),
fields: &[
Field {
name: "strength",
typ: Type::VarInt(0), // TODO: upper bound?
},
Field {
name: "carpet_color",
typ: Type::VarInt(-1), // TODO: Carpet color enum.
},
Field {
name: "variant",
typ: Type::VarInt(0), // TODO: Llama variant enum.
},
],
},
Class {
name: "trader_llama",
inherit: None, // TODO: really?
fields: &[],
},
Class {
name: "mule",
inherit: Some(&CHESTED_HORSE),
fields: &[],
},
Class {
name: "axolotl",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "variant",
typ: Type::VarInt(0), // TODO: AxolotlVariant enum.
},
Field {
name: "playing_dead",
typ: Type::Bool(false),
},
Field {
name: "from_bucket",
typ: Type::Bool(false),
},
],
},
Class {
name: "bee",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "bee_bits",
typ: Type::BitFields(&[
BitField {
name: "angry",
offset: 1, // Skip unused.
},
BitField {
name: "stung",
offset: 2,
},
BitField {
name: "nectar",
offset: 3,
},
]),
},
Field {
name: "anger_ticks",
typ: Type::VarInt(0),
},
],
},
Class {
name: "fox",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "variant",
typ: Type::VarInt(0), // TODO: 0 for red, 1 for snow
},
Field {
name: "fox_bits",
typ: Type::BitFields(&[
BitField {
name: "sitting",
offset: 0,
},
BitField {
name: "",
offset: 2, // Skip unused
},
]),
},
// TODO: what are these UUIDs?
Field {
name: "first_uuid",
typ: Type::OptUuid,
},
Field {
name: "second_uuid",
typ: Type::OptUuid,
},
],
},
Class {
name: "ocelot",
inherit: Some(&ANIMAL),
fields: &[Field {
name: "trusting",
typ: Type::Bool(false),
}],
},
Class {
name: "panda",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "breed_timer",
typ: Type::VarInt(0),
},
Field {
name: "sneeze_timer",
typ: Type::VarInt(0),
},
Field {
name: "eat_timer",
typ: Type::VarInt(0),
},
Field {
name: "main_gene",
typ: Type::Byte(0),
},
Field {
name: "hidden_gene",
typ: Type::Byte(0),
},
Field {
name: "panda_bits",
typ: Type::BitFields(&[
BitField {
name: "sneezing",
offset: 1, // Skip unused.
},
BitField {
name: "rolling",
offset: 2,
},
BitField {
name: "sitting",
offset: 3,
},
BitField {
name: "on_back",
offset: 4,
},
]),
},
],
},
Class {
name: "pig",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "has_saddle",
typ: Type::Bool(false),
},
Field {
name: "boost_timer",
typ: Type::VarInt(0),
},
],
},
Class {
name: "rabbit",
inherit: Some(&ANIMAL),
fields: &[Field {
name: "variant",
typ: Type::VarInt(0), // TODO: rabbit variant enum.
}],
},
Class {
name: "turtle",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "home_position",
typ: Type::BlockPos(0, 0, 0),
},
Field {
name: "has_egg",
typ: Type::Bool(false),
},
Field {
name: "laying_egg",
typ: Type::Bool(false),
},
Field {
name: "travel_pos",
typ: Type::BlockPos(0, 0, 0),
},
Field {
name: "going_home",
typ: Type::Bool(false),
},
Field {
name: "travelling",
typ: Type::Bool(false),
},
],
},
Class {
name: "polar_bear",
inherit: Some(&ANIMAL),
fields: &[Field {
name: "standing_up",
typ: Type::Bool(true),
}],
},
Class {
name: "chicken",
inherit: Some(&ANIMAL),
fields: &[],
},
COW,
Class {
name: "hoglin",
inherit: Some(&ANIMAL),
fields: &[Field {
name: "zombification_immune",
typ: Type::Bool(false),
}],
},
Class {
name: "mooshroom",
inherit: Some(&COW),
fields: &[Field {
name: "variant",
typ: Type::String("red"), // TODO: "red" or "brown" enum.
}],
},
Class {
name: "sheep",
inherit: Some(&ANIMAL),
fields: &[Field {
name: "sheep_state",
typ: Type::Byte(0), // TODO: sheep state type.
}],
},
Class {
name: "strider",
inherit: Some(&ANIMAL),
fields: &[
Field {
name: "boost_timer",
typ: Type::VarInt(0),
},
Field {
name: "shaking",
typ: Type::Bool(false),
},
Field {
name: "saddle",
typ: Type::Bool(false),
},
],
},
Class {
name: "cat",
inherit: Some(&TAMEABLE_ANIMAL),
fields: &[
Field {
name: "variant",
typ: Type::VarInt(1), // TODO: cat variant enum.
},
Field {
name: "lying",
typ: Type::Bool(false),
},
Field {
name: "relaxed",
typ: Type::Bool(false),
},
Field {
name: "collar_color",
typ: Type::VarInt(14), // TODO: dye color enum.
},
],
},
Class {
name: "wolf",
inherit: Some(&TAMEABLE_ANIMAL),
fields: &[
Field {
name: "begging",
typ: Type::Bool(false),
},
Field {
name: "collar_color", // TODO: dye color enum
typ: Type::VarInt(14),
},
Field {
name: "anger_timer",
typ: Type::VarInt(0),
},
],
},
Class {
name: "parrot",
inherit: Some(&TAMEABLE_ANIMAL),
fields: &[Field {
name: "variant",
typ: Type::VarInt(0), // TODO: parrot variant enum.
}],
},
Class {
name: "villager",
inherit: Some(&ABSTRACT_VILLAGER),
fields: &[Field {
name: "villager_data",
typ: Type::VillagerData,
}],
},
Class {
name: "wandering_trader",
inherit: Some(&ABSTRACT_VILLAGER),
fields: &[],
},
Class {
name: "iron_golem",
inherit: Some(&ABSTRACT_GOLEM),
fields: &[Field {
name: "iron_golem_bits",
typ: Type::BitFields(&[BitField {
name: "player_created",
offset: 0,
}]),
}],
},
Class {
name: "snow_golem",
inherit: Some(&ABSTRACT_GOLEM),
fields: &[Field {
name: "snow_golem_bits",
typ: Type::BitFields(&[BitField {
name: "pumpkin_hat",
offset: 4,
// TODO: should default to true.
}]),
}],
},
Class {
name: "shulker",
inherit: Some(&ABSTRACT_GOLEM),
fields: &[
Field {
name: "attach_face",
typ: Type::Direction(Direction::Down),
},
Field {
name: "attachment_position",
typ: Type::OptPosition(None),
},
Field {
name: "shield_height",
typ: Type::Byte(0),
},
Field {
name: "color",
typ: Type::Byte(10), // TODO: dye color enum
},
],
},
Class {
name: "piglin",
inherit: Some(&BASE_PIGLIN),
fields: &[
Field {
name: "baby",
typ: Type::Bool(false),
},
Field {
name: "charging_crossbow",
typ: Type::Bool(false),
},
Field {
name: "dancing",
typ: Type::Bool(false),
},
],
},
Class {
name: "piglin_brute",
inherit: Some(&BASE_PIGLIN),
fields: &[],
},
Class {
name: "blaze",
inherit: Some(&MONSTER),
fields: &[Field {
name: "blaze_bits",
typ: Type::BitFields(&[BitField {
name: "blaze_on_fire", // TODO: better name for this?
offset: 0,
}]),
}],
},
Class {
name: "creeper",
inherit: Some(&MONSTER),
fields: &[
Field {
name: "creeper_state",
typ: Type::VarInt(-1), // TODO -1 for idle, +1 for fuse.
},
Field {
name: "charged",
typ: Type::Bool(false),
},
Field {
name: "ignited",
typ: Type::Bool(false),
},
],
},
Class {
name: "endermite",
inherit: Some(&MONSTER),
fields: &[],
},
Class {
name: "giant",
inherit: Some(&MONSTER),
fields: &[],
},
GUARDIAN,
Class {
name: "elder_guardian",
inherit: Some(&GUARDIAN),
fields: &[],
},
Class {
name: "silverfish",
inherit: Some(&MONSTER),
fields: &[],
},
Class {
name: "vindicator",
inherit: Some(&ABSTRACT_ILLAGER),
fields: &[],
},
Class {
name: "pillager",
inherit: Some(&ABSTRACT_ILLAGER),
fields: &[Field {
name: "charging",
typ: Type::Bool(false),
}],
},
Class {
name: "evoker",
inherit: Some(&SPELLCASTER_ILLAGER),
fields: &[],
},
Class {
name: "illusioner",
inherit: Some(&SPELLCASTER_ILLAGER),
fields: &[],
},
Class {
name: "ravager",
inherit: Some(&RAIDER),
fields: &[],
},
Class {
name: "evoker_fanges",
inherit: Some(&BASE_ENTITY),
fields: &[],
},
Class {
name: "witch",
inherit: Some(&RAIDER),
fields: &[Field {
name: "drinking_potion",
typ: Type::Bool(false),
}],
},
Class {
name: "vex",
inherit: Some(&MONSTER),
fields: &[Field {
name: "vex_bits",
typ: Type::BitFields(&[BitField {
name: "attacking",
offset: 0,
}]),
}],
},
Class {
name: "skeleton",
inherit: Some(&ABSTRACT_SKELETON),
fields: &[],
},
Class {
name: "wither_skeleton",
inherit: Some(&ABSTRACT_SKELETON),
fields: &[],
},
Class {
name: "stray",
inherit: Some(&ABSTRACT_SKELETON),
fields: &[],
},
SPIDER,
Class {
name: "cave_spider",
inherit: Some(&SPIDER), // TODO: does cave_spider inherit from spider?
fields: &[],
},
Class {
name: "wither",
inherit: Some(&MONSTER),
fields: &[
// TODO: are these actually OptEntityId, or something else?
Field {
name: "center_head_target",
typ: Type::OptEntityId,
},
Field {
name: "left_head_target",
typ: Type::OptEntityId,
},
Field {
name: "right_head_target",
typ: Type::OptEntityId,
},
Field {
name: "invulnerable_time",
typ: Type::VarInt(0),
},
],
},
Class {
name: "zoglin",
inherit: Some(&MONSTER),
fields: &[Field {
name: "baby",
typ: Type::Bool(false),
}],
},
ZOMBIE,
Class {
name: "zombie_villager",
inherit: Some(&ZOMBIE),
fields: &[
Field {
name: "converting",
typ: Type::Bool(false),
},
Field {
name: "villager_data",
typ: Type::VillagerData,
},
],
},
Class {
name: "husk",
inherit: Some(&ZOMBIE),
fields: &[],
},
Class {
name: "drowned",
inherit: Some(&ZOMBIE),
fields: &[],
},
Class {
name: "zombified_piglin",
inherit: Some(&ZOMBIE),
fields: &[],
},
Class {
name: "enderman",
inherit: Some(&MONSTER),
fields: &[
Field {
name: "carried_block",
typ: Type::OptBlockId,
},
Field {
name: "screaming",
typ: Type::Bool(false),
},
Field {
name: "staring",
typ: Type::Bool(false),
},
],
},
Class {
name: "ender_dragon",
inherit: Some(&MOB),
fields: &[Field {
name: "phase",
typ: Type::VarInt(10), // TODO: dragon phase enum
}],
},
Class {
name: "ghast",
inherit: Some(&FLYING),
fields: &[Field {
name: "attacking",
typ: Type::Bool(false),
}],
},
Class {
name: "phantom",
inherit: Some(&FLYING),
fields: &[Field {
name: "size",
typ: Type::VarInt(0),
}],
},
Class {
name: "slime",
inherit: Some(&MOB),
fields: &[Field {
name: "size",
typ: Type::VarInt(1), // TODO: bounds?
}],
},
Class {
name: "llama_spit",
inherit: Some(&BASE_ENTITY),
fields: &[],
},
Class {
name: "minecart",
inherit: Some(&ABSTRACT_MINECART),
fields: &[],
},
Class {
name: "minecart_hopper",
inherit: Some(&ABSTRACT_MINECART_CONTAINER),
fields: &[],
},
Class {
name: "minecart_chest",
inherit: Some(&ABSTRACT_MINECART_CONTAINER),
fields: &[],
},
Class {
name: "minecart_furnace",
inherit: Some(&ABSTRACT_MINECART),
fields: &[Field {
name: "has_fuel",
typ: Type::Bool(false),
}],
},
Class {
name: "minecart_tnt",
inherit: Some(&ABSTRACT_MINECART),
fields: &[],
},
Class {
name: "minecart_spawner",
inherit: Some(&ABSTRACT_MINECART),
fields: &[],
},
Class {
name: "minecart_command_block",
inherit: Some(&ABSTRACT_MINECART),
fields: &[
Field {
name: "command",
typ: Type::String(""),
},
Field {
name: "last_output",
typ: Type::Text,
},
],
},
Class {
name: "primed_tnt",
inherit: Some(&BASE_ENTITY),
fields: &[Field {
name: "fuse_timer",
typ: Type::VarInt(80),
}],
},
];
pub fn build() -> anyhow::Result<()> {
Ok(())
}