diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_01.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_01.xml
new file mode 100644
index 00000000..6bf67a85
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_01.xml
@@ -0,0 +1,104 @@
+
+
+
+
+
+ y
+
+
+ x
+
+
+ z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_01_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_01_coal.xml
new file mode 100644
index 00000000..6de3f4ec
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_01_coal.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_02.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_02.xml
new file mode 100644
index 00000000..f886b894
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_02.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+ y
+
+
+ x
+
+
+ z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_02_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_02_coal.xml
new file mode 100644
index 00000000..4a7391ed
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_02_coal.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_03.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_03.xml
new file mode 100644
index 00000000..b0c4614a
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_03.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+ y
+
+
+ x
+
+
+ z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_03_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_03_coal.xml
new file mode 100644
index 00000000..dbf0c3ac
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_03_coal.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_04.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_04.xml
new file mode 100644
index 00000000..226f0a6e
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_04.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+ y
+
+
+ x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_04_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_04_coal.xml
new file mode 100644
index 00000000..3c3cc5c4
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_skull_04_coal.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_01.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_01.xml
new file mode 100644
index 00000000..199042a9
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_01.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+ z
+
+
+ y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_01_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_01_coal.xml
new file mode 100644
index 00000000..2ca00fe3
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_01_coal.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_02.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_02.xml
new file mode 100644
index 00000000..970f8664
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_02.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+ z
+
+
+ x
+
+
+ y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_02_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_02_coal.xml
new file mode 100644
index 00000000..193670b4
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_02_coal.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_03.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_03.xml
new file mode 100644
index 00000000..10fc3990
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_03.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+ z
+
+
+ y
+
+
+ x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_03_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_03_coal.xml
new file mode 100644
index 00000000..acaeb59f
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_03_coal.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_04.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_04.xml
new file mode 100644
index 00000000..0d2b54ba
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_04.xml
@@ -0,0 +1,139 @@
+
+
+
+
+
+ z
+
+
+ x
+
+
+ y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_04_coal.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_04_coal.xml
new file mode 100644
index 00000000..6b51471f
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/fossils/fossil_spine_04_coal.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_bottom.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_bottom.xml
new file mode 100644
index 00000000..6511c394
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_bottom.xml
@@ -0,0 +1,346 @@
+
+
+
+
+
+ stone
+
+
+ stonebrick
+
+
+ cracked_stonebrick
+
+
+
+ mossy_stonebrick
+
+
+ smooth_andesite
+
+
+ chiseled_stonebrick
+
+
+ chiseled_brick
+
+
+ stone_brick
+
+
+ mossy_brick
+
+
+ south
+
+
+ east
+
+
+ data
+
+
+ false
+ true
+ false
+
+
+ 0
+ empty
+
+
+ false
+ false
+ false
+ false
+
+
+ red
+
+
+
+ south
+
+
+ 2
+
+
+ top
+ north
+ straight
+
+
+ top
+ spruce
+
+
+ top
+ south
+ straight
+
+
+ north
+
+
+ north
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [2, 1, 1]
+ {'Attributes': [{'Name': 'generic.maxHealth', 'Base': 20.0}, {'Name': 'generic.knockbackResistance', 'Base': 0.0}, {'Name': 'generic.movementSpeed', 'Base': 0.5}, {'Name': 'generic.armor', 'Base': 0.0}, {'Name': 'generic.followRange', 'Base': 16.0, 'Modifiers': [{'Name': 'Random spawn bonus', 'Operation': 1, 'Amount': -0.07807250298271795, 'UUIDLeast': -9042289162618353532, 'UUIDMost': -8050404301371587461}]}], 'Age': 0, 'UUIDLeast': -8404016208519177543, 'Motion': [0.0, -0.0784000015258789, 0.0], 'Health': 20.0, 'Inventory': [], 'HandItems': [{}, {}], 'Offers': {'Recipes': [{'maxUses': 7, 'sell': {'id': 'minecraft:emerald', 'Damage': 0, 'Count': 1}, 'buy': {'id': 'minecraft:rotten_flesh', 'Damage': 0, 'Count': 36}, 'rewardExp': 1, 'uses': 0}, {'maxUses': 7, 'sell': {'id': 'minecraft:emerald', 'Damage': 0, 'Count': 1}, 'buy': {'id': 'minecraft:gold_ingot', 'Damage': 0, 'Count': 9}, 'rewardExp': 1, 'uses': 0}]}, 'Riches': 15, 'id': 'Villager', 'CareerLevel': 1, 'Career': 1, 'ArmorItems': [{}, {}, {}, {}], 'Fire': -1, 'Invulnerable': 0, 'DeathTime': 0, 'ForcedAge': 0, 'AbsorptionAmount': 0.0, 'HurtTime': 0, 'OnGround': 1, 'UUIDMost': 1009044389481761978, 'Profession': 2, 'ArmorDropChances': [0.08500000089406967, 0.08500000089406967, 0.08500000089406967, 0.08500000089406967], 'HurtByTimestamp': 0, 'Dimension': 0, 'Air': 300, 'Willing': 0, 'CanPickUpLoot': 1, 'Pos': [-72.5, 62.0, -120.5], 'PortalCooldown': 0, 'PersistenceRequired': 1, 'HandDropChances': [0.08500000089406967, 0.08500000089406967], 'Leashed': 0, 'LeftHanded': 0, 'FallDistance': 0.0, 'Rotation': [-4.32769775390625, -3.4165501594543457]}
+ [2.5, 1.0, 1.5]
+
+
+ [4, 1, 1]
+ {'ConversionTime': -1, 'Attributes': [{'Name': 'generic.maxHealth', 'Base': 20.0}, {'Name': 'generic.knockbackResistance', 'Base': 0.0, 'Modifiers': [{'Name': 'Random spawn bonus', 'Operation': 0, 'Amount': 0.033586338385064834, 'UUIDLeast': -9185924421726330189, 'UUIDMost': -1136549371827500916}]}, {'Name': 'generic.movementSpeed', 'Base': 0.23000000417232513}, {'Name': 'generic.armor', 'Base': 2.0}, {'Name': 'generic.followRange', 'Base': 35.0, 'Modifiers': [{'Name': 'Random spawn bonus', 'Operation': 1, 'Amount': -0.013882809459502736, 'UUIDLeast': -4972655095452447334, 'UUIDMost': -7187282525081156696}]}, {'Name': 'generic.attackDamage', 'Base': 3.0}, {'Name': 'zombie.spawnReinforcements', 'Base': 0.08507647017248195}], 'UUIDLeast': -6631449421406796428, 'Motion': [0.0, -0.0784000015258789, 0.0], 'IsVillager': 1, 'Health': 19.049999237060547, 'HandItems': [{}, {}], 'VillagerProfession': 2, 'id': 'Zombie', 'ArmorItems': [{}, {}, {}, {}], 'Fire': -1, 'Invulnerable': 0, 'DeathTime': 0, 'CanBreakDoors': 0, 'AbsorptionAmount': 0.0, 'HurtTime': 0, 'OnGround': 1, 'UUIDMost': 9169347718178752431, 'ArmorDropChances': [0.08500000089406967, 0.08500000089406967, 0.08500000089406967, 0.08500000089406967], 'HurtByTimestamp': 125, 'Dimension': 0, 'Air': 300, 'CanPickUpLoot': 0, 'Pos': [-70.5, 62.0, -120.69999998807907], 'PortalCooldown': 0, 'PersistenceRequired': 1, 'HandDropChances': [0.08500000089406967, 0.08500000089406967], 'Leashed': 0, 'LeftHanded': 0, 'FallDistance': 0.0, 'Rotation': [-95.78887939453125, 0.0]}
+ [4.5, 1.0, 1.300000011920929]
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_middle.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_middle.xml
new file mode 100644
index 00000000..efd4fa0d
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_middle.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+ stonebrick
+
+
+ north
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_top.xml b/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_top.xml
new file mode 100644
index 00000000..2140591b
--- /dev/null
+++ b/Minecraft.Client/Common/Media/MediaWindows64/Structures/igloo/igloo_top.xml
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
+ east
+
+
+ white
+
+
+ up
+
+
+ false
+ south
+ foot
+
+
+ false
+ top
+ north
+
+
+ false
+ south
+ head
+
+
+ silver
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt1.ogg
index 645bf199..a45f97a9 100644
Binary files a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt1.ogg and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt2.ogg
index 3fa9d201..77dcd4a5 100644
Binary files a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt2.ogg and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt3.ogg
index 89273d7a..465b6ae8 100644
Binary files a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt3.ogg and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/hurt3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk1.ogg
new file mode 100644
index 00000000..c24d7bfe
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk2.ogg
new file mode 100644
index 00000000..9cd31963
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk3.ogg
new file mode 100644
index 00000000..92d902fd
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/milk3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say1.ogg
index 278ff272..4fdc93f8 100644
Binary files a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say1.ogg and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say2.ogg
index 86c76f8f..bc6d9d27 100644
Binary files a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say2.ogg and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say3.ogg
index 9feb0483..692b579c 100644
Binary files a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say3.ogg and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say4.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say4.ogg
index dee0784a..e7c90786 100644
Binary files a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say4.ogg and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/cow/say4.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/babyidle3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/babyidle3.ogg
new file mode 100644
index 00000000..9b0d35a9
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/babyidle3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death1.ogg
new file mode 100644
index 00000000..f4d53636
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death2.ogg
new file mode 100644
index 00000000..2a613e6a
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death3.ogg
new file mode 100644
index 00000000..a95321a7
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/death3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt1.ogg
new file mode 100644
index 00000000..1cfc69d2
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt2.ogg
new file mode 100644
index 00000000..f8064f96
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt3.ogg
new file mode 100644
index 00000000..9505b50c
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt4.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt4.ogg
new file mode 100644
index 00000000..1409d8e3
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/hurt4.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idl3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idl3.ogg
new file mode 100644
index 00000000..3f539a1f
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idl3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle1.ogg
new file mode 100644
index 00000000..ed4783b6
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle2.ogg
new file mode 100644
index 00000000..73b33906
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle4.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle4.ogg
new file mode 100644
index 00000000..4ed9a4a3
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/idle4.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar1.ogg
new file mode 100644
index 00000000..ad652aaf
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar2.ogg
new file mode 100644
index 00000000..c4be0c78
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar3.ogg
new file mode 100644
index 00000000..8fb6fe48
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/roar3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step1.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step1.ogg
new file mode 100644
index 00000000..6b8aae33
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step1.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step2.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step2.ogg
new file mode 100644
index 00000000..93f07268
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step2.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step3.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step3.ogg
new file mode 100644
index 00000000..664a8ffa
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step3.ogg differ
diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step4.ogg b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step4.ogg
new file mode 100644
index 00000000..70cee7de
Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft/mob/polarbear/step4.ogg differ
diff --git a/Minecraft.Server/cmake/sources/Common.cmake b/Minecraft.Server/cmake/sources/Common.cmake
index 1dd26941..b6497ca4 100644
--- a/Minecraft.Server/cmake/sources/Common.cmake
+++ b/Minecraft.Server/cmake/sources/Common.cmake
@@ -413,6 +413,8 @@ set(_MINECRAFT_SERVER_COMMON_ROOT
"${_MS_SRC}/../Minecraft.Client/QuadrupedModel.cpp"
"${_MS_SRC}/../Minecraft.Client/RabbitModel.cpp"
"${_MS_SRC}/../Minecraft.Client/RabbitRenderer.cpp"
+ "${_MS_SRC}/../Minecraft.Client/PolarBearModel.cpp"
+ "${_MS_SRC}/../Minecraft.Client/PolarBearRenderer.cpp"
"${_MS_SRC}/../Minecraft.Client/Rect2i.cpp"
"${_MS_SRC}/../Minecraft.Client/RedDustParticle.cpp"
"${_MS_SRC}/../Minecraft.Client/RemotePlayer.cpp"
diff --git a/Minecraft.World/VillagePieces.cpp b/Minecraft.World/VillagePieces.cpp
index 9067506c..23713c98 100644
--- a/Minecraft.World/VillagePieces.cpp
+++ b/Minecraft.World/VillagePieces.cpp
@@ -555,7 +555,7 @@ bool VillagePieces::Well::postProcess(Level *level, Random *random, BoundingBox
{
continue;
}
- placeBlock(level, Tile::gravel_Id, 0, x, height - 4, z, chunkBB);
+ placeBlock(level, Tile::cobblestone_Id, 0, x, height - 4, z, chunkBB);
generateAirColumnUp(level, x, height - 3, z, chunkBB);
}
}
@@ -709,8 +709,8 @@ BoundingBox *VillagePieces::StraightRoad::findPieceBox(StartPiece *startPiece, l
bool VillagePieces::StraightRoad::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
{
- int roadTile = biomeBlock(Tile::gravel_Id, 0);
- int baseTile = biomeBlock(Tile::cobblestone_Id, 0);
+ int roadTile = biomeBlock(Tile::grass_path_Id, 0);
+ // int baseTile = biomeBlock(Tile::cobblestone_Id, 0);
for (int x = boundingBox->x0; x <= boundingBox->x1; x++)
{
for (int z = boundingBox->z0; z <= boundingBox->z1; z++)
@@ -719,7 +719,7 @@ bool VillagePieces::StraightRoad::postProcess(Level *level, Random *random, Boun
{
int y = level->getTopSolidBlock(x, z) - 1;
level->setTileAndData(x, y, z, roadTile, 0, Tile::UPDATE_CLIENTS);
- level->setTileAndData(x, y - 1, z, baseTile, 0, Tile::UPDATE_CLIENTS);
+ // level->setTileAndData(x, y - 1, z, baseTile, 0, Tile::UPDATE_CLIENTS);
}
}
}
@@ -1771,6 +1771,8 @@ int VillagePieces::Farmland::selectCrops(Random *random)
return Tile::carrots_Id;
case 1:
return Tile::potatoes_Id;
+ case 2:
+ return Tile::beetroots_Id;
}
}
diff --git a/tools/struct_parse.py b/tools/struct_parse.py
new file mode 100644
index 00000000..349097d7
--- /dev/null
+++ b/tools/struct_parse.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+import struct, sys, argparse
+import xml.etree.ElementTree as ET
+
+TAG_END = 0
+TAG_BYTE = 1
+TAG_SHORT = 2
+TAG_INT = 3
+TAG_LONG = 4
+TAG_FLOAT = 5
+TAG_DOUBLE = 6
+TAG_BYTE_ARRAY = 7
+TAG_STRING = 8
+TAG_LIST = 9
+TAG_COMPOUND = 10
+TAG_INT_ARRAY = 11
+
+class NBTParser:
+ def __init__(self, filename, endian='>'):
+ self.stream = open(filename, 'rb')
+ self.endian = endian
+
+ def read(self, fmt):
+ size = struct.calcsize(fmt)
+ data = self.stream.read(size)
+ if len(data) != size:
+ raise EOFError("Unexpected end of file")
+ return struct.unpack(fmt, data)[0]
+
+ def read_byte(self):
+ return self.read(self.endian + 'b')
+ def read_unsigned_byte(self):
+ return self.read(self.endian + 'B')
+ def read_short(self):
+ return self.read(self.endian + 'h')
+ def read_int(self):
+ return self.read(self.endian + 'i')
+ def read_long(self):
+ return self.read(self.endian + 'q')
+ def read_float(self):
+ return self.read(self.endian + 'f')
+ def read_double(self):
+ return self.read(self.endian + 'd')
+
+ def read_string(self):
+ length = self.read(self.endian + 'h') # unsigned short
+ data = self.stream.read(length)
+ return data.decode('utf-8')
+
+ def read_byte_array(self):
+ length = self.read(self.endian + 'i')
+ return self.stream.read(length)
+
+ def read_int_array(self):
+ length = self.read(self.endian + 'i')
+ return [self.read_int() for _ in range(length)]
+
+ def read_list(self):
+ elem_type = self.read_unsigned_byte()
+ count = self.read(self.endian + 'i')
+ return [self.read_tag_payload(elem_type) for _ in range(count)]
+
+ def read_compound(self):
+ compound = {}
+ while True:
+ tag_type = self.read_unsigned_byte()
+ if tag_type == TAG_END:
+ break
+ name = self.read_string()
+ compound[name] = self.read_tag_payload(tag_type)
+ return compound
+
+ def read_tag_payload(self, tag_type):
+ if tag_type == TAG_BYTE:
+ return self.read_byte()
+ elif tag_type == TAG_SHORT:
+ return self.read_short()
+ elif tag_type == TAG_INT:
+ return self.read_int()
+ elif tag_type == TAG_LONG:
+ return self.read_long()
+ elif tag_type == TAG_FLOAT:
+ return self.read_float()
+ elif tag_type == TAG_DOUBLE:
+ return self.read_double()
+ elif tag_type == TAG_BYTE_ARRAY:
+ return self.read_byte_array()
+ elif tag_type == TAG_STRING:
+ return self.read_string()
+ elif tag_type == TAG_LIST:
+ return self.read_list()
+ elif tag_type == TAG_COMPOUND:
+ return self.read_compound()
+ elif tag_type == TAG_INT_ARRAY:
+ return self.read_int_array()
+ else:
+ raise ValueError(f"Unknown tag type: {tag_type}")
+
+ def parse(self):
+ root_tag = self.read_unsigned_byte()
+ if root_tag != TAG_COMPOUND:
+ raise ValueError("Expected root TAG_Compound (0x0A)")
+ _ = self.read_string() # root name
+ data = self.read_compound()
+ self.stream.close()
+ return data
+
+def structure_to_xml(data, xml_root_name="Structure"):
+ """convert nbt data into xml"""
+ root = ET.Element(xml_root_name)
+ root.set("author", str(data.get("author", "Unknown")))
+ root.set("version", str(data.get("version", "")))
+ # Size
+ size = data.get("size", [0,0,0])
+ ET.SubElement(root, "Size", {
+ "width": str(size[0]), "height": str(size[1]), "length": str(size[2])
+ })
+
+ # Palette
+ pal_elem = ET.SubElement(root, "Palette")
+ palette = data.get("palette", [])
+ for i, entry in enumerate(palette):
+ attrs = {"index": str(i)}
+ if "Name" in entry:
+ attrs["name"] = entry["Name"]
+ block_elem = ET.SubElement(pal_elem, "Block", attrs)
+ # add properties as subelements
+ props = entry.get("Properties", {})
+ for prop_name, prop_value in props.items():
+ prop_elem = ET.SubElement(block_elem, "Property")
+ prop_elem.set("name", prop_name)
+ prop_elem.text = str(prop_value)
+
+ # Blocks
+ blocks_elem = ET.SubElement(root, "Blocks")
+ for blk in data.get("blocks", []):
+ pos = blk.get("pos", [])
+ state = blk.get("state", 0)
+ if pos and len(pos) == 3:
+ attrs = {"x": str(pos[0]), "y": str(pos[1]), "z": str(pos[2]),
+ "index": str(state)}
+ ET.SubElement(blocks_elem, "Block", attrs)
+
+ # Entities
+ ents = data.get("entities", [])
+ ents_elem = ET.SubElement(root, "Entities")
+ for ent in ents:
+ ent_elem = ET.SubElement(ents_elem, "Entity")
+ for key, val in ent.items():
+ sub = ET.SubElement(ent_elem, key)
+ sub.text = str(val)
+ return root
+
+def main():
+ parser = argparse.ArgumentParser(description="Convert NBT structure files to XML")
+ parser.add_argument("inputs", nargs="+", help="Input NBT file(s)")
+ parser.add_argument("-l", "--little", action="store_true",
+ help="Assume little-endian NBT format")
+ parser.add_argument("-o", "--output", help="Output XML file (or directory)")
+ args = parser.parse_args()
+
+ endian = '<' if args.little else '>'
+ for infile in args.inputs:
+ try:
+ parser_nbt = NBTParser(infile, endian=endian)
+ data = parser_nbt.parse()
+ except Exception as e:
+ print(f"Error parsing {infile}: {e}", file=sys.stderr)
+ continue
+
+ xml_root = structure_to_xml(data)
+ tree = ET.ElementTree(xml_root)
+ outpath = args.output or infile + ".xml"
+ if args.output and len(args.inputs) > 1:
+ import os
+ os.makedirs(args.output, exist_ok=True)
+ base = os.path.basename(infile)
+ outpath = os.path.join(args.output, base + ".xml")
+ ET.indent(tree, space=" ", level=0)
+ tree.write(outpath, encoding="utf-8", xml_declaration=True)
+ print(f"Wrote XML to {outpath}")
+
+if __name__ == "__main__":
+ main()