mirror of
https://github.com/italicsjenga/valence.git
synced 2024-12-23 14:31:30 +11:00
Update to Minecraft 1.20.1 (#358)
## Description Updates valence to Minecraft 1.20.1, which is protocol compatible with 1.20. closes #357 --------- Co-authored-by: Ryan Johnson <ryanj00a@gmail.com> Co-authored-by: AviiNL <me@avii.nl>
This commit is contained in:
parent
c4741b68b8
commit
09fbd9b7e7
|
@ -4,7 +4,7 @@ exclude = ["rust-mc-bot", "tools/stresser", "tools/packet_inspector"]
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.2.0-dev+mc.1.19.4"
|
version = "0.2.0-dev+mc.1.20.1"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
repository = "https://github.com/valence-rs/valence"
|
repository = "https://github.com/valence-rs/valence"
|
||||||
documentation = "https://docs.rs/valence/"
|
documentation = "https://docs.rs/valence/"
|
||||||
|
|
|
@ -28,7 +28,6 @@ pub fn packet(c: &mut Criterion) {
|
||||||
}),
|
}),
|
||||||
blocks_and_biomes: BLOCKS_AND_BIOMES.as_slice(),
|
blocks_and_biomes: BLOCKS_AND_BIOMES.as_slice(),
|
||||||
block_entities: Cow::Borrowed(&[]),
|
block_entities: Cow::Borrowed(&[]),
|
||||||
trust_edges: false,
|
|
||||||
sky_light_mask: Cow::Borrowed(&[]),
|
sky_light_mask: Cow::Borrowed(&[]),
|
||||||
block_light_mask: Cow::Borrowed(&[]),
|
block_light_mask: Cow::Borrowed(&[]),
|
||||||
empty_sky_light_mask: Cow::Borrowed(&[]),
|
empty_sky_light_mask: Cow::Borrowed(&[]),
|
||||||
|
|
|
@ -68,7 +68,7 @@ fn squat_and_die(mut clients: Query<&mut Client>, mut events: EventReader<Sneaki
|
||||||
for event in events.iter() {
|
for event in events.iter() {
|
||||||
if event.state == SneakState::Start {
|
if event.state == SneakState::Start {
|
||||||
if let Ok(mut client) = clients.get_mut(event.client) {
|
if let Ok(mut client) = clients.get_mut(event.client) {
|
||||||
client.kill(None, "Squatted too hard.");
|
client.kill("Squatted too hard.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,7 @@ impl<'w, 's> UpdateAdvancementCachedBytesQuery<'w, 's> {
|
||||||
display_data: None,
|
display_data: None,
|
||||||
criteria: vec![],
|
criteria: vec![],
|
||||||
requirements: vec![],
|
requirements: vec![],
|
||||||
|
sends_telemetry_data: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(a_parent) = a_parent {
|
if let Some(a_parent) = a_parent {
|
||||||
|
|
|
@ -25,6 +25,7 @@ pub struct Advancement<'a, I> {
|
||||||
pub display_data: Option<AdvancementDisplay<'a, I>>,
|
pub display_data: Option<AdvancementDisplay<'a, I>>,
|
||||||
pub criteria: Vec<(Ident<Cow<'a, str>>, ())>,
|
pub criteria: Vec<(Ident<Cow<'a, str>>, ())>,
|
||||||
pub requirements: Vec<AdvancementRequirements<'a>>,
|
pub requirements: Vec<AdvancementRequirements<'a>>,
|
||||||
|
pub sends_telemetry_data: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Encode, Decode)]
|
#[derive(Clone, PartialEq, Eq, Debug, Encode, Decode)]
|
||||||
|
|
|
@ -330,10 +330,9 @@ impl Client {
|
||||||
|
|
||||||
/// Kills the client and shows `message` on the death screen. If an entity
|
/// Kills the client and shows `message` on the death screen. If an entity
|
||||||
/// killed the player, you should supply it as `killer`.
|
/// killed the player, you should supply it as `killer`.
|
||||||
pub fn kill(&mut self, killer: Option<EntityId>, message: impl Into<Text>) {
|
pub fn kill(&mut self, message: impl Into<Text>) {
|
||||||
self.write_packet(&DeathMessageS2c {
|
self.write_packet(&DeathMessageS2c {
|
||||||
player_id: VarInt(0),
|
player_id: VarInt(0),
|
||||||
entity_id: killer.map(|id| id.get()).unwrap_or(-1),
|
|
||||||
message: message.into().into(),
|
message: message.into().into(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -725,6 +724,7 @@ fn initial_join(
|
||||||
is_debug: q.is_debug.0,
|
is_debug: q.is_debug.0,
|
||||||
is_flat: q.is_flat.0,
|
is_flat: q.is_flat.0,
|
||||||
last_death_location,
|
last_death_location,
|
||||||
|
portal_cooldown: VarInt(0), // TODO.
|
||||||
});
|
});
|
||||||
|
|
||||||
q.client.enc.append_bytes(tags.sync_tags_packet());
|
q.client.enc.append_bytes(tags.sync_tags_packet());
|
||||||
|
@ -785,6 +785,7 @@ fn respawn(
|
||||||
is_flat: is_flat.0,
|
is_flat: is_flat.0,
|
||||||
copy_metadata: true,
|
copy_metadata: true,
|
||||||
last_death_location,
|
last_death_location,
|
||||||
|
portal_cooldown: VarInt(0), // TODO
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,6 +179,7 @@ pub enum UpdatePlayerAbilitiesC2s {
|
||||||
#[packet(id = packet_id::UPDATE_SIGN_C2S)]
|
#[packet(id = packet_id::UPDATE_SIGN_C2S)]
|
||||||
pub struct UpdateSignC2s<'a> {
|
pub struct UpdateSignC2s<'a> {
|
||||||
pub position: BlockPos,
|
pub position: BlockPos,
|
||||||
|
pub is_front_text: bool,
|
||||||
pub lines: [&'a str; 4],
|
pub lines: [&'a str; 4],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,8 +250,6 @@ pub mod structure_block {
|
||||||
#[packet(id = packet_id::DEATH_MESSAGE_S2C)]
|
#[packet(id = packet_id::DEATH_MESSAGE_S2C)]
|
||||||
pub struct DeathMessageS2c<'a> {
|
pub struct DeathMessageS2c<'a> {
|
||||||
pub player_id: VarInt,
|
pub player_id: VarInt,
|
||||||
/// Killer's entity ID, -1 if no killer
|
|
||||||
pub entity_id: i32,
|
|
||||||
pub message: Cow<'a, Text>,
|
pub message: Cow<'a, Text>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,7 +285,6 @@ pub struct EnterCombatS2c;
|
||||||
#[packet(id = packet_id::END_COMBAT_S2C)]
|
#[packet(id = packet_id::END_COMBAT_S2C)]
|
||||||
pub struct EndCombatS2c {
|
pub struct EndCombatS2c {
|
||||||
pub duration: VarInt,
|
pub duration: VarInt,
|
||||||
pub entity_id: i32,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Encode, Decode, Packet)]
|
#[derive(Copy, Clone, Debug, Encode, Decode, Packet)]
|
||||||
|
@ -324,6 +322,7 @@ pub struct GameJoinS2c<'a> {
|
||||||
pub is_debug: bool,
|
pub is_debug: bool,
|
||||||
pub is_flat: bool,
|
pub is_flat: bool,
|
||||||
pub last_death_location: Option<GlobalPos<'a>>,
|
pub last_death_location: Option<GlobalPos<'a>>,
|
||||||
|
pub portal_cooldown: VarInt,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Encode, Decode, Packet)]
|
#[derive(Copy, Clone, Debug, Encode, Decode, Packet)]
|
||||||
|
@ -388,6 +387,7 @@ pub struct PlayerRespawnS2c<'a> {
|
||||||
pub is_flat: bool,
|
pub is_flat: bool,
|
||||||
pub copy_metadata: bool,
|
pub copy_metadata: bool,
|
||||||
pub last_death_location: Option<GlobalPos<'a>>,
|
pub last_death_location: Option<GlobalPos<'a>>,
|
||||||
|
pub portal_cooldown: VarInt,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Encode, Decode, Packet)]
|
#[derive(Copy, Clone, Debug, Encode, Decode, Packet)]
|
||||||
|
|
|
@ -59,11 +59,11 @@ pub mod __private {
|
||||||
extern crate self as valence_core;
|
extern crate self as valence_core;
|
||||||
|
|
||||||
/// The Minecraft protocol version this library currently targets.
|
/// The Minecraft protocol version this library currently targets.
|
||||||
pub const PROTOCOL_VERSION: i32 = 762;
|
pub const PROTOCOL_VERSION: i32 = 763;
|
||||||
|
|
||||||
/// The stringified name of the Minecraft version this library currently
|
/// The stringified name of the Minecraft version this library currently
|
||||||
/// targets.
|
/// targets.
|
||||||
pub const MINECRAFT_VERSION: &str = "1.19.4";
|
pub const MINECRAFT_VERSION: &str = "1.20.1";
|
||||||
|
|
||||||
/// Minecraft's standard ticks per second (TPS).
|
/// Minecraft's standard ticks per second (TPS).
|
||||||
pub const DEFAULT_TPS: NonZeroU32 = match NonZeroU32::new(20) {
|
pub const DEFAULT_TPS: NonZeroU32 = match NonZeroU32::new(20) {
|
||||||
|
|
|
@ -170,7 +170,7 @@ impl Value {
|
||||||
quote!(None)
|
quote!(None)
|
||||||
}
|
}
|
||||||
Value::ItemStack(stack) => {
|
Value::ItemStack(stack) => {
|
||||||
assert_eq!(stack, "1 air");
|
assert_eq!(stack, "0 air");
|
||||||
quote!(valence_core::item::ItemStack::default())
|
quote!(valence_core::item::ItemStack::default())
|
||||||
}
|
}
|
||||||
Value::Boolean(b) => quote!(#b),
|
Value::Boolean(b) => quote!(#b),
|
||||||
|
|
|
@ -357,7 +357,6 @@ impl Chunk<true> {
|
||||||
|
|
||||||
writer.write_packet(&ChunkDeltaUpdateS2c {
|
writer.write_packet(&ChunkDeltaUpdateS2c {
|
||||||
chunk_section_position,
|
chunk_section_position,
|
||||||
invert_trust_edges: false,
|
|
||||||
blocks: Cow::Borrowed(§.section_updates),
|
blocks: Cow::Borrowed(§.section_updates),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -457,7 +456,6 @@ impl Chunk<true> {
|
||||||
heightmaps: Cow::Owned(heightmaps),
|
heightmaps: Cow::Owned(heightmaps),
|
||||||
blocks_and_biomes: scratch,
|
blocks_and_biomes: scratch,
|
||||||
block_entities: Cow::Borrowed(&block_entities),
|
block_entities: Cow::Borrowed(&block_entities),
|
||||||
trust_edges: true,
|
|
||||||
sky_light_mask: Cow::Borrowed(&info.filler_sky_light_mask),
|
sky_light_mask: Cow::Borrowed(&info.filler_sky_light_mask),
|
||||||
block_light_mask: Cow::Borrowed(&[]),
|
block_light_mask: Cow::Borrowed(&[]),
|
||||||
empty_sky_light_mask: Cow::Borrowed(&[]),
|
empty_sky_light_mask: Cow::Borrowed(&[]),
|
||||||
|
|
|
@ -95,7 +95,6 @@ pub struct ChunkDataS2c<'a> {
|
||||||
pub heightmaps: Cow<'a, Compound>,
|
pub heightmaps: Cow<'a, Compound>,
|
||||||
pub blocks_and_biomes: &'a [u8],
|
pub blocks_and_biomes: &'a [u8],
|
||||||
pub block_entities: Cow<'a, [ChunkDataBlockEntity<'a>]>,
|
pub block_entities: Cow<'a, [ChunkDataBlockEntity<'a>]>,
|
||||||
pub trust_edges: bool,
|
|
||||||
pub sky_light_mask: Cow<'a, [u64]>,
|
pub sky_light_mask: Cow<'a, [u64]>,
|
||||||
pub block_light_mask: Cow<'a, [u64]>,
|
pub block_light_mask: Cow<'a, [u64]>,
|
||||||
pub empty_sky_light_mask: Cow<'a, [u64]>,
|
pub empty_sky_light_mask: Cow<'a, [u64]>,
|
||||||
|
@ -116,7 +115,6 @@ pub struct ChunkDataBlockEntity<'a> {
|
||||||
#[packet(id = packet_id::CHUNK_DELTA_UPDATE_S2C)]
|
#[packet(id = packet_id::CHUNK_DELTA_UPDATE_S2C)]
|
||||||
pub struct ChunkDeltaUpdateS2c<'a> {
|
pub struct ChunkDeltaUpdateS2c<'a> {
|
||||||
pub chunk_section_position: i64,
|
pub chunk_section_position: i64,
|
||||||
pub invert_trust_edges: bool,
|
|
||||||
pub blocks: Cow<'a, [VarLong]>,
|
pub blocks: Cow<'a, [VarLong]>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +142,6 @@ pub struct ChunkRenderDistanceCenterS2c {
|
||||||
pub struct LightUpdateS2c {
|
pub struct LightUpdateS2c {
|
||||||
pub chunk_x: VarInt,
|
pub chunk_x: VarInt,
|
||||||
pub chunk_z: VarInt,
|
pub chunk_z: VarInt,
|
||||||
pub trust_edges: bool,
|
|
||||||
pub sky_light_mask: Vec<u64>,
|
pub sky_light_mask: Vec<u64>,
|
||||||
pub block_light_mask: Vec<u64>,
|
pub block_light_mask: Vec<u64>,
|
||||||
pub empty_sky_light_mask: Vec<u64>,
|
pub empty_sky_light_mask: Vec<u64>,
|
||||||
|
|
|
@ -395,12 +395,19 @@ pub mod synchronize_recipes {
|
||||||
ingredient: Ingredient,
|
ingredient: Ingredient,
|
||||||
result: Option<ItemStack>,
|
result: Option<ItemStack>,
|
||||||
},
|
},
|
||||||
Smithing {
|
SmithingTransform {
|
||||||
recipe_id: Ident<Cow<'a, str>>,
|
recipe_id: Ident<Cow<'a, str>>,
|
||||||
|
template: Ingredient,
|
||||||
base: Ingredient,
|
base: Ingredient,
|
||||||
addition: Ingredient,
|
addition: Ingredient,
|
||||||
result: Option<ItemStack>,
|
result: Option<ItemStack>,
|
||||||
},
|
},
|
||||||
|
SmithingTrim {
|
||||||
|
recipe_id: Ident<Cow<'a, str>>,
|
||||||
|
template: Ingredient,
|
||||||
|
base: Ingredient,
|
||||||
|
addition: Ingredient,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
|
@ -600,17 +607,31 @@ pub mod synchronize_recipes {
|
||||||
ingredient.encode(&mut w)?;
|
ingredient.encode(&mut w)?;
|
||||||
result.encode(w)
|
result.encode(w)
|
||||||
}
|
}
|
||||||
Recipe::Smithing {
|
Recipe::SmithingTransform {
|
||||||
recipe_id,
|
recipe_id,
|
||||||
|
template,
|
||||||
base,
|
base,
|
||||||
addition,
|
addition,
|
||||||
result,
|
result,
|
||||||
} => {
|
} => {
|
||||||
"smithing".encode(&mut w)?;
|
"smithing_transform".encode(&mut w)?;
|
||||||
recipe_id.encode(&mut w)?;
|
recipe_id.encode(&mut w)?;
|
||||||
|
template.encode(&mut w)?;
|
||||||
base.encode(&mut w)?;
|
base.encode(&mut w)?;
|
||||||
addition.encode(&mut w)?;
|
addition.encode(&mut w)?;
|
||||||
result.encode(w)
|
result.encode(&mut w)
|
||||||
|
}
|
||||||
|
Recipe::SmithingTrim {
|
||||||
|
recipe_id,
|
||||||
|
template,
|
||||||
|
base,
|
||||||
|
addition,
|
||||||
|
} => {
|
||||||
|
"smithing_trim".encode(&mut w)?;
|
||||||
|
recipe_id.encode(&mut w)?;
|
||||||
|
template.encode(&mut w)?;
|
||||||
|
base.encode(&mut w)?;
|
||||||
|
addition.encode(&mut w)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -690,12 +711,19 @@ pub mod synchronize_recipes {
|
||||||
ingredient: Decode::decode(r)?,
|
ingredient: Decode::decode(r)?,
|
||||||
result: Decode::decode(r)?,
|
result: Decode::decode(r)?,
|
||||||
},
|
},
|
||||||
"minecraft:smithing" => Self::Smithing {
|
"minecraft:smithing_transform" => Self::SmithingTransform {
|
||||||
recipe_id: Decode::decode(r)?,
|
recipe_id: Decode::decode(r)?,
|
||||||
|
template: Decode::decode(r)?,
|
||||||
base: Decode::decode(r)?,
|
base: Decode::decode(r)?,
|
||||||
addition: Decode::decode(r)?,
|
addition: Decode::decode(r)?,
|
||||||
result: Decode::decode(r)?,
|
result: Decode::decode(r)?,
|
||||||
},
|
},
|
||||||
|
"minecraft:smithing_trim" => Self::SmithingTrim {
|
||||||
|
recipe_id: Decode::decode(r)?,
|
||||||
|
template: Decode::decode(r)?,
|
||||||
|
base: Decode::decode(r)?,
|
||||||
|
addition: Decode::decode(r)?,
|
||||||
|
},
|
||||||
other => Self::CraftingSpecial {
|
other => Self::CraftingSpecial {
|
||||||
kind: match other {
|
kind: match other {
|
||||||
"minecraft:crafting_special_armordye" => SpecialCraftingKind::ArmorDye,
|
"minecraft:crafting_special_armordye" => SpecialCraftingKind::ArmorDye,
|
||||||
|
|
|
@ -51,7 +51,7 @@ impl RegistryCodec {
|
||||||
|
|
||||||
impl Default for RegistryCodec {
|
impl Default for RegistryCodec {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let codec = include_bytes!("../../../extracted/registry_codec_1.19.4.dat");
|
let codec = include_bytes!("../../../extracted/registry_codec_1.20.dat");
|
||||||
let compound = Compound::from_binary(&mut codec.as_slice())
|
let compound = Compound::from_binary(&mut codec.as_slice())
|
||||||
.expect("failed to decode vanilla registry codec")
|
.expect("failed to decode vanilla registry codec")
|
||||||
.0;
|
.0;
|
||||||
|
|
162332
extracted/blocks.json
162332
extracted/blocks.json
File diff suppressed because it is too large
Load diff
|
@ -21,7 +21,7 @@
|
||||||
"name": "item",
|
"name": "item",
|
||||||
"index": 8,
|
"index": 8,
|
||||||
"type": "item_stack",
|
"type": "item_stack",
|
||||||
"default_value": "1 air"
|
"default_value": "0 air"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -997,7 +997,7 @@
|
||||||
"name": "item",
|
"name": "item",
|
||||||
"index": 8,
|
"index": 8,
|
||||||
"type": "item_stack",
|
"type": "item_stack",
|
||||||
"default_value": "1 air"
|
"default_value": "0 air"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_bounding_box": {
|
"default_bounding_box": {
|
||||||
|
@ -1048,7 +1048,7 @@
|
||||||
"name": "item",
|
"name": "item",
|
||||||
"index": 8,
|
"index": 8,
|
||||||
"type": "item_stack",
|
"type": "item_stack",
|
||||||
"default_value": "1 air"
|
"default_value": "0 air"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "shooter_entity_id",
|
"name": "shooter_entity_id",
|
||||||
|
@ -1436,7 +1436,7 @@
|
||||||
"name": "item",
|
"name": "item",
|
||||||
"index": 22,
|
"index": 22,
|
||||||
"type": "item_stack",
|
"type": "item_stack",
|
||||||
"default_value": "1 air"
|
"default_value": "0 air"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "item_display",
|
"name": "item_display",
|
||||||
|
@ -1460,7 +1460,7 @@
|
||||||
"name": "stack",
|
"name": "stack",
|
||||||
"index": 8,
|
"index": 8,
|
||||||
"type": "item_stack",
|
"type": "item_stack",
|
||||||
"default_value": "1 air"
|
"default_value": "0 air"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_bounding_box": {
|
"default_bounding_box": {
|
||||||
|
@ -1478,7 +1478,7 @@
|
||||||
"name": "item_stack",
|
"name": "item_stack",
|
||||||
"index": 8,
|
"index": 8,
|
||||||
"type": "item_stack",
|
"type": "item_stack",
|
||||||
"default_value": "1 air"
|
"default_value": "0 air"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "rotation",
|
"name": "rotation",
|
||||||
|
@ -1528,7 +1528,7 @@
|
||||||
"name": "health",
|
"name": "health",
|
||||||
"index": 9,
|
"index": 9,
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 20.0
|
"default_value": 200.0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "potion_swirls_color",
|
"name": "potion_swirls_color",
|
||||||
|
@ -2302,9 +2302,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_bounding_box": {
|
"default_bounding_box": {
|
||||||
"size_x": 0.699999988079071,
|
"size_x": 1.399999976158142,
|
||||||
"size_y": 0.5,
|
"size_y": 0.8999999761581421,
|
||||||
"size_z": 0.699999988079071
|
"size_z": 1.399999976158142
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SquidEntity": {
|
"SquidEntity": {
|
||||||
|
@ -2448,7 +2448,7 @@
|
||||||
"name": "item",
|
"name": "item",
|
||||||
"index": 8,
|
"index": 8,
|
||||||
"type": "item_stack",
|
"type": "item_stack",
|
||||||
"default_value": "1 air"
|
"default_value": "0 air"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -2863,7 +2863,7 @@
|
||||||
"type": "villager_data",
|
"type": "villager_data",
|
||||||
"default_value": {
|
"default_value": {
|
||||||
"type": "plains",
|
"type": "plains",
|
||||||
"profession": "none",
|
"profession": "toolsmith",
|
||||||
"level": 1
|
"level": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2621
extracted/items.json
2621
extracted/items.json
File diff suppressed because it is too large
Load diff
|
@ -182,7 +182,7 @@
|
||||||
"add_death_particles": 60,
|
"add_death_particles": 60,
|
||||||
"ears_twitch": 61,
|
"ears_twitch": 61,
|
||||||
"sonic_boom": 62,
|
"sonic_boom": 62,
|
||||||
"field_42621": 63
|
"start_digging": 63
|
||||||
},
|
},
|
||||||
"entity_animation": {
|
"entity_animation": {
|
||||||
"swing_main_hand": 0,
|
"swing_main_hand": 0,
|
||||||
|
@ -442,73 +442,72 @@
|
||||||
"firework": 26,
|
"firework": 26,
|
||||||
"fishing": 27,
|
"fishing": 27,
|
||||||
"flame": 28,
|
"flame": 28,
|
||||||
"dripping_cherry_leaves": 29,
|
"cherry_leaves": 29,
|
||||||
"falling_cherry_leaves": 30,
|
"sculk_soul": 30,
|
||||||
"landing_cherry_leaves": 31,
|
"sculk_charge": 31,
|
||||||
"sculk_soul": 32,
|
"sculk_charge_pop": 32,
|
||||||
"sculk_charge": 33,
|
"soul_fire_flame": 33,
|
||||||
"sculk_charge_pop": 34,
|
"soul": 34,
|
||||||
"soul_fire_flame": 35,
|
"flash": 35,
|
||||||
"soul": 36,
|
"happy_villager": 36,
|
||||||
"flash": 37,
|
"composter": 37,
|
||||||
"happy_villager": 38,
|
"heart": 38,
|
||||||
"composter": 39,
|
"instant_effect": 39,
|
||||||
"heart": 40,
|
"item": 40,
|
||||||
"instant_effect": 41,
|
"vibration": 41,
|
||||||
"item": 42,
|
"item_slime": 42,
|
||||||
"vibration": 43,
|
"item_snowball": 43,
|
||||||
"item_slime": 44,
|
"large_smoke": 44,
|
||||||
"item_snowball": 45,
|
"lava": 45,
|
||||||
"large_smoke": 46,
|
"mycelium": 46,
|
||||||
"lava": 47,
|
"note": 47,
|
||||||
"mycelium": 48,
|
"poof": 48,
|
||||||
"note": 49,
|
"portal": 49,
|
||||||
"poof": 50,
|
"rain": 50,
|
||||||
"portal": 51,
|
"smoke": 51,
|
||||||
"rain": 52,
|
"sneeze": 52,
|
||||||
"smoke": 53,
|
"spit": 53,
|
||||||
"sneeze": 54,
|
"squid_ink": 54,
|
||||||
"spit": 55,
|
"sweep_attack": 55,
|
||||||
"squid_ink": 56,
|
"totem_of_undying": 56,
|
||||||
"sweep_attack": 57,
|
"underwater": 57,
|
||||||
"totem_of_undying": 58,
|
"splash": 58,
|
||||||
"underwater": 59,
|
"witch": 59,
|
||||||
"splash": 60,
|
"bubble_pop": 60,
|
||||||
"witch": 61,
|
"current_down": 61,
|
||||||
"bubble_pop": 62,
|
"bubble_column_up": 62,
|
||||||
"current_down": 63,
|
"nautilus": 63,
|
||||||
"bubble_column_up": 64,
|
"dolphin": 64,
|
||||||
"nautilus": 65,
|
"campfire_cosy_smoke": 65,
|
||||||
"dolphin": 66,
|
"campfire_signal_smoke": 66,
|
||||||
"campfire_cosy_smoke": 67,
|
"dripping_honey": 67,
|
||||||
"campfire_signal_smoke": 68,
|
"falling_honey": 68,
|
||||||
"dripping_honey": 69,
|
"landing_honey": 69,
|
||||||
"falling_honey": 70,
|
"falling_nectar": 70,
|
||||||
"landing_honey": 71,
|
"falling_spore_blossom": 71,
|
||||||
"falling_nectar": 72,
|
"ash": 72,
|
||||||
"falling_spore_blossom": 73,
|
"crimson_spore": 73,
|
||||||
"ash": 74,
|
"warped_spore": 74,
|
||||||
"crimson_spore": 75,
|
"spore_blossom_air": 75,
|
||||||
"warped_spore": 76,
|
"dripping_obsidian_tear": 76,
|
||||||
"spore_blossom_air": 77,
|
"falling_obsidian_tear": 77,
|
||||||
"dripping_obsidian_tear": 78,
|
"landing_obsidian_tear": 78,
|
||||||
"falling_obsidian_tear": 79,
|
"reverse_portal": 79,
|
||||||
"landing_obsidian_tear": 80,
|
"white_ash": 80,
|
||||||
"reverse_portal": 81,
|
"small_flame": 81,
|
||||||
"white_ash": 82,
|
"snowflake": 82,
|
||||||
"small_flame": 83,
|
"dripping_dripstone_lava": 83,
|
||||||
"snowflake": 84,
|
"falling_dripstone_lava": 84,
|
||||||
"dripping_dripstone_lava": 85,
|
"dripping_dripstone_water": 85,
|
||||||
"falling_dripstone_lava": 86,
|
"falling_dripstone_water": 86,
|
||||||
"dripping_dripstone_water": 87,
|
"glow_squid_ink": 87,
|
||||||
"falling_dripstone_water": 88,
|
"glow": 88,
|
||||||
"glow_squid_ink": 89,
|
"wax_on": 89,
|
||||||
"glow": 90,
|
"wax_off": 90,
|
||||||
"wax_on": 91,
|
"electric_spark": 91,
|
||||||
"wax_off": 92,
|
"scrape": 92,
|
||||||
"electric_spark": 93,
|
"shriek": 93,
|
||||||
"scrape": 94,
|
"egg_crack": 94
|
||||||
"shriek": 95
|
|
||||||
},
|
},
|
||||||
"sniffer_state": {
|
"sniffer_state": {
|
||||||
"idling": 0,
|
"idling": 0,
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
12112
extracted/tags.json
12112
extracted/tags.json
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -20,6 +20,28 @@ Next, run `copy_extractor_output.sh`. This copies the files to `extracted` so th
|
||||||
./copy_extractor_output.sh
|
./copy_extractor_output.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## How to update valence to a new version of Minecraft
|
||||||
|
|
||||||
|
The general process should go something like this:
|
||||||
|
1. Update `gradle.properties` to the new version of Minecraft using https://fabricmc.net/develop
|
||||||
|
2. Update `src/main/resources/fabric.mod.json` to reference new version of Minecraft
|
||||||
|
3. Update `PROTOCOL_VERSION` and `MINECRAFT_VERSION` constants in `valence_core/src/lib.rs`
|
||||||
|
4. Attempt to run `./gradlew runServer` and fix any errors that come up
|
||||||
|
5. Run `./copy_extractor_output.sh`
|
||||||
|
6. In `*.toml`s, replace all strings of the old mc version with the new mc version
|
||||||
|
7. Try all the examples. If they work, you're probably done.
|
||||||
|
|
||||||
|
|
||||||
|
If you need to update gradle, running this will automatically update the wrapper to the specified version, and update `gradle/gradle-wrapper.properties`.
|
||||||
|
```sh
|
||||||
|
./gradlew wrapper --gradle-version VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
You may also need to update the fabric mappings in the mod.
|
||||||
|
```sh
|
||||||
|
./gradlew migrateMappings --mappings "VERSION"
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Run `./gradlew genSources` to generate Minecraft Java source files for your IDE.
|
Run `./gradlew genSources` to generate Minecraft Java source files for your IDE.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.0-SNAPSHOT'
|
id 'fabric-loom' version '1.2-SNAPSHOT'
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_17
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
org.gradle.jvmargs=-Xmx1G
|
org.gradle.jvmargs=-Xmx1G
|
||||||
# Fabric Properties
|
# Fabric Properties
|
||||||
# check these on https://fabricmc.net/develop
|
# check these on https://fabricmc.net/develop
|
||||||
minecraft_version=1.19.4
|
minecraft_version=1.20.1
|
||||||
yarn_mappings=1.19.4+build.1
|
yarn_mappings=1.20.1+build.1
|
||||||
loader_version=0.14.18
|
loader_version=0.14.21
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version=1.0.0
|
mod_version=1.0.0
|
||||||
maven_group=dev.00a
|
maven_group=dev.00a
|
||||||
archives_base_name=valence-extractor
|
archives_base_name=valence-extractor
|
||||||
# Dependencies
|
# Dependencies
|
||||||
fabric_version=0.76.0+1.19.4
|
fabric_version=0.83.0+1.20.1
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package rs.valence.extractor;
|
package rs.valence.extractor;
|
||||||
|
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.data.DataTracker;
|
import net.minecraft.entity.data.DataTracker;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
|
|
@ -31,7 +31,7 @@ import net.minecraft.world.entity.EntityLookup;
|
||||||
import net.minecraft.world.event.GameEvent;
|
import net.minecraft.world.event.GameEvent;
|
||||||
import net.minecraft.world.tick.QueryableTickScheduler;
|
import net.minecraft.world.tick.QueryableTickScheduler;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ public class DummyWorld extends World {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FeatureSet getEnabledFeatures() {
|
public FeatureSet getEnabledFeatures() {
|
||||||
return FeatureSet.of(FeatureFlags.VANILLA, FeatureFlags.BUNDLE, FeatureFlags.UPDATE_1_20);
|
return FeatureSet.of(FeatureFlags.VANILLA, FeatureFlags.BUNDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
package rs.valence.extractor;
|
package rs.valence.extractor;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import io.netty.handler.codec.EncoderException;
|
import io.netty.handler.codec.EncoderException;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||||
|
import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.nbt.NbtIo;
|
import net.minecraft.nbt.NbtIo;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -13,6 +15,7 @@ import sun.reflect.ReflectionFactory;
|
||||||
|
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
|
@ -4,8 +4,13 @@ import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
|
import net.minecraft.state.property.Property;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.entity.BlockEntityType;
|
||||||
import net.minecraft.item.VerticallyAttachableBlockItem;
|
import net.minecraft.item.VerticallyAttachableBlockItem;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Box;
|
||||||
import net.minecraft.world.EmptyBlockView;
|
import net.minecraft.world.EmptyBlockView;
|
||||||
import rs.valence.extractor.Main;
|
import rs.valence.extractor.Main;
|
||||||
import rs.valence.extractor.mixin.ExposeWallBlock;
|
import rs.valence.extractor.mixin.ExposeWallBlock;
|
||||||
|
@ -69,7 +74,7 @@ public class Blocks implements Main.Extractor {
|
||||||
stateJson.addProperty("id", id);
|
stateJson.addProperty("id", id);
|
||||||
stateJson.addProperty("luminance", state.getLuminance());
|
stateJson.addProperty("luminance", state.getLuminance());
|
||||||
stateJson.addProperty("opaque", state.isOpaque());
|
stateJson.addProperty("opaque", state.isOpaque());
|
||||||
stateJson.addProperty("replaceable", state.getMaterial().isReplaceable());
|
stateJson.addProperty("replaceable", state.isReplaceable());
|
||||||
|
|
||||||
if (block.getDefaultState().equals(state)) {
|
if (block.getDefaultState().equals(state)) {
|
||||||
blockJson.addProperty("default_state_id", id);
|
blockJson.addProperty("default_state_id", id);
|
||||||
|
|
|
@ -3,6 +3,7 @@ package rs.valence.extractor.extractors;
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import net.minecraft.enchantment.Enchantment;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
import rs.valence.extractor.Main;
|
import rs.valence.extractor.Main;
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import net.minecraft.entity.EntityPose;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.data.DataTracker;
|
import net.minecraft.entity.data.DataTracker;
|
||||||
import net.minecraft.entity.data.TrackedData;
|
import net.minecraft.entity.data.TrackedData;
|
||||||
|
import net.minecraft.entity.data.TrackedDataHandler;
|
||||||
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
||||||
import net.minecraft.entity.passive.CatVariant;
|
import net.minecraft.entity.passive.CatVariant;
|
||||||
import net.minecraft.entity.passive.FrogVariant;
|
import net.minecraft.entity.passive.FrogVariant;
|
||||||
|
@ -17,7 +18,9 @@ import net.minecraft.particle.ParticleEffect;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
import net.minecraft.registry.entry.RegistryEntry;
|
import net.minecraft.registry.entry.RegistryEntry;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Box;
|
||||||
import net.minecraft.util.math.EulerAngle;
|
import net.minecraft.util.math.EulerAngle;
|
||||||
import net.minecraft.util.math.GlobalPos;
|
import net.minecraft.util.math.GlobalPos;
|
||||||
import net.minecraft.village.VillagerData;
|
import net.minecraft.village.VillagerData;
|
||||||
|
@ -30,9 +33,10 @@ import rs.valence.extractor.DummyPlayerEntity;
|
||||||
import rs.valence.extractor.DummyWorld;
|
import rs.valence.extractor.DummyWorld;
|
||||||
import rs.valence.extractor.Main;
|
import rs.valence.extractor.Main;
|
||||||
import rs.valence.extractor.Main.Pair;
|
import rs.valence.extractor.Main.Pair;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
public class Entities implements Main.Extractor {
|
public class Entities implements Main.Extractor {
|
||||||
public Entities() {
|
public Entities() {
|
||||||
|
|
|
@ -3,6 +3,10 @@ package rs.valence.extractor.extractors;
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import com.mojang.datafixers.util.Pair;
|
||||||
|
import net.minecraft.entity.effect.StatusEffectInstance;
|
||||||
|
import net.minecraft.item.FoodComponent;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
import rs.valence.extractor.Main;
|
import rs.valence.extractor.Main;
|
||||||
|
|
||||||
|
|
|
@ -4,14 +4,22 @@ import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import net.minecraft.entity.EntityPose;
|
import net.minecraft.entity.EntityPose;
|
||||||
import net.minecraft.entity.EntityStatuses;
|
import net.minecraft.entity.EntityStatuses;
|
||||||
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.data.TrackedDataHandler;
|
import net.minecraft.entity.data.TrackedDataHandler;
|
||||||
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
||||||
|
import net.minecraft.entity.decoration.painting.PaintingVariant;
|
||||||
|
import net.minecraft.entity.passive.CatVariant;
|
||||||
|
import net.minecraft.entity.passive.FrogVariant;
|
||||||
import net.minecraft.entity.passive.SnifferEntity;
|
import net.minecraft.entity.passive.SnifferEntity;
|
||||||
|
import net.minecraft.entity.passive.SnifferEntity.State;
|
||||||
import net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket;
|
import net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket;
|
||||||
|
import net.minecraft.particle.ParticleType;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.village.VillagerProfession;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
import rs.valence.extractor.Main;
|
import rs.valence.extractor.Main;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package rs.valence.extractor.extractors;
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
import net.minecraft.network.NetworkSide;
|
import net.minecraft.network.NetworkSide;
|
||||||
import net.minecraft.network.NetworkState;
|
import net.minecraft.network.NetworkState;
|
||||||
import rs.valence.extractor.Main;
|
import rs.valence.extractor.Main;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
|
import net.minecraft.sound.SoundEvent;
|
||||||
import rs.valence.extractor.Main;
|
import rs.valence.extractor.Main;
|
||||||
|
|
||||||
public class Sounds implements Main.Extractor {
|
public class Sounds implements Main.Extractor {
|
||||||
|
|
|
@ -24,6 +24,7 @@ import net.minecraft.registry.entry.RegistryEntryList;
|
||||||
import net.minecraft.registry.SerializableRegistries;
|
import net.minecraft.registry.SerializableRegistries;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import rs.valence.extractor.Main;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
public class TranslationKeys implements Main.Extractor {
|
public class TranslationKeys implements Main.Extractor {
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
],
|
],
|
||||||
"depends": {
|
"depends": {
|
||||||
"fabricloader": ">=0.14.6",
|
"fabricloader": ">=0.14.6",
|
||||||
"minecraft": "~1.19",
|
"minecraft": "~1.20.1",
|
||||||
"java": ">=17"
|
"java": ">=17"
|
||||||
},
|
},
|
||||||
"suggests": {
|
"suggests": {
|
||||||
|
|
Loading…
Reference in a new issue