diff --git a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml index f098b85c..ff9c551e 100644 --- a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml +++ b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml @@ -8013,6 +8013,10 @@ Would you like to install the mash-up pack or texture pack now? Aqua Affinity + + + Depth Strider + Efficiency diff --git a/Minecraft.Server.FourKit/Enchantments/DepthStriderEnchantment.cs b/Minecraft.Server.FourKit/Enchantments/DepthStriderEnchantment.cs new file mode 100644 index 00000000..5262fe34 --- /dev/null +++ b/Minecraft.Server.FourKit/Enchantments/DepthStriderEnchantment.cs @@ -0,0 +1,26 @@ +using Minecraft.Server.FourKit.Inventory; + +namespace Minecraft.Server.FourKit.Enchantments; + +public class DepthStriderEnchantment : Enchantment +{ + static readonly Material[] supportedItems = { + Material.LEATHER_BOOTS, Material.CHAINMAIL_BOOTS, Material.GOLD_BOOTS, Material.IRON_BOOTS, Material.DIAMOND_BOOTS, + }; + + static readonly EnchantmentType[] conflictedEnchants = { }; + + public override bool canEnchantItem(ItemStack item) => supportedItems.Contains(item.getType()); + + public override bool conflictsWith(Enchantment other) => conflictedEnchants.Contains(other.getEnchantType()); + + public override EnchantmentTarget getItemTarget() => EnchantmentTarget.ARMOR_FEET; + + public override EnchantmentType getEnchantType() => EnchantmentType.WATER_WALKER; + + public override int getMaxLevel() => 1; + + public override string getName() => "depthstrider"; + + public override int getStartLevel() => 1; +} \ No newline at end of file diff --git a/Minecraft.Server.FourKit/Enchantments/Enchantment.cs b/Minecraft.Server.FourKit/Enchantments/Enchantment.cs index b6cd9136..d481d7d4 100644 --- a/Minecraft.Server.FourKit/Enchantments/Enchantment.cs +++ b/Minecraft.Server.FourKit/Enchantments/Enchantment.cs @@ -140,6 +140,10 @@ public enum EnchantmentType /// Increases the speed at which a player may mine underwater /// WATER_WORKER = 6, + /// + /// Increases the speed at which a player may walk/swim underwater + /// + WATER_WALKER = 8, /// /// Increases the rate at which fish bite the hook while fishing /// @@ -176,7 +180,7 @@ public abstract class Enchantment public static Enchantment AquaAffinityEnchantment => _registry[EnchantmentType.WATER_WORKER]; public static Enchantment LureEnchantment => _registry[EnchantmentType.LURE]; public static Enchantment LuckOfTheSeaEnchantment => _registry[EnchantmentType.LUCK_OF_THE_SEA]; - + public static Enchantment DepthStriderEnchantment => _registry[EnchantmentType.WATER_WALKER]; private static Dictionary _registry = new Dictionary() { @@ -204,6 +208,7 @@ public abstract class Enchantment { EnchantmentType.WATER_WORKER, new AquaAffinityEnchantment() }, { EnchantmentType.LURE, new LureEnchantment() }, { EnchantmentType.LUCK_OF_THE_SEA, new LuckOfTheSeaEnchantment() }, + { EnchantmentType.WATER_WALKER, new DepthStriderEnchantment() }, }; /// diff --git a/Minecraft.World/Enchantment.cpp b/Minecraft.World/Enchantment.cpp index 5d0743cc..dd0885bf 100644 --- a/Minecraft.World/Enchantment.cpp +++ b/Minecraft.World/Enchantment.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.item.h" #include "Enchantment.h" +#include "WaterWalkerEnchantment.h" #include "LuckOfTheSeaEnchantment.h" #include "LureEnchantment.h" @@ -17,6 +18,7 @@ Enchantment *Enchantment::explosionProtection = nullptr; Enchantment *Enchantment::projectileProtection = nullptr; Enchantment *Enchantment::drownProtection = nullptr; Enchantment *Enchantment::waterWorker = nullptr; +Enchantment *Enchantment::waterWalker = nullptr; Enchantment *Enchantment::thorns = nullptr; // weapon @@ -52,6 +54,7 @@ void Enchantment::staticCtor() projectileProtection = new ProtectionEnchantment(4, FREQ_UNCOMMON, ProtectionEnchantment::PROJECTILE); drownProtection = new OxygenEnchantment(5, FREQ_RARE); waterWorker = new WaterWorkerEnchantment(6, FREQ_RARE); + waterWalker = new WaterWalkerEnchantment(8, FREQ_RARE); thorns = new ThornsEnchantment(7, FREQ_VERY_RARE); // weapon diff --git a/Minecraft.World/Enchantment.h b/Minecraft.World/Enchantment.h index e4fd4ad2..b302a2c6 100644 --- a/Minecraft.World/Enchantment.h +++ b/Minecraft.World/Enchantment.h @@ -25,6 +25,7 @@ public : static Enchantment *projectileProtection; static Enchantment *drownProtection; static Enchantment *waterWorker; + static Enchantment *waterWalker; static Enchantment *thorns; // weapon diff --git a/Minecraft.World/EnchantmentHelper.cpp b/Minecraft.World/EnchantmentHelper.cpp index 995670c8..bdb4aa76 100644 --- a/Minecraft.World/EnchantmentHelper.cpp +++ b/Minecraft.World/EnchantmentHelper.cpp @@ -234,6 +234,11 @@ bool EnchantmentHelper::hasWaterWorkerBonus(shared_ptr source) return getEnchantmentLevel(Enchantment::waterWorker->id, source->getEquipmentSlots() ) > 0; } +int EnchantmentHelper::getWaterWalker(shared_ptr source) +{ + return getEnchantmentLevel(Enchantment::waterWalker->id, source->getEquipmentSlots() ); +} + int EnchantmentHelper::getArmorThorns(shared_ptr source) { return getEnchantmentLevel(Enchantment::thorns->id, source->getEquipmentSlots()); diff --git a/Minecraft.World/EnchantmentHelper.h b/Minecraft.World/EnchantmentHelper.h index 6ed2e398..46a0e719 100644 --- a/Minecraft.World/EnchantmentHelper.h +++ b/Minecraft.World/EnchantmentHelper.h @@ -80,6 +80,7 @@ public: static int getDiggingLootBonus(shared_ptr source); static int getKillingLootBonus(shared_ptr source); static bool hasWaterWorkerBonus(shared_ptr source); + static int getWaterWalker(shared_ptr source); static int getArmorThorns(shared_ptr source); static shared_ptr getRandomItemWith(Enchantment *enchantment, shared_ptr source); diff --git a/Minecraft.World/LivingEntity.cpp b/Minecraft.World/LivingEntity.cpp index 952f0252..642ec3b1 100644 --- a/Minecraft.World/LivingEntity.cpp +++ b/Minecraft.World/LivingEntity.cpp @@ -1504,13 +1504,34 @@ void LivingEntity::travel(float xa, float ya) if (isInWater() && !(thisPlayer && thisPlayer->abilities.flying) ) { double yo = y; - moveRelative(xa, ya, useNewAi() ? 0.04f : 0.02f); - move(xd, yd, zd); + + int waterWalkerLever = EnchantmentHelper::getWaterWalker(dynamic_pointer_cast(shared_from_this())); + if (waterWalkerLever > 3) + { + waterWalkerLever = 3; + } + + float waterFriction = 0.8f; + float waterSpeed = useNewAi() ? 0.04f : 0.02f; + + if (!onGround) + { + waterWalkerLever *= 0.5f; + } + + if (waterWalkerLever > 0) + { + waterFriction += (0.5f - waterFriction) * waterWalkerLever / 3.0f; + waterSpeed += (getSpeed() * 1.0f - waterSpeed) * waterWalkerLever / 3.0f; + } + + moveRelative(xa, ya, waterSpeed); + move(xd, yd, zd); - xd *= 0.80f; - yd *= 0.80f; - zd *= 0.80f; - yd -= 0.02; + xd *= waterFriction; + yd *= 0.8; + zd *= waterFriction; + yd -= 0.02; if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) { diff --git a/Minecraft.World/WaterWalkerEnchantment.cpp b/Minecraft.World/WaterWalkerEnchantment.cpp new file mode 100644 index 00000000..cee3f54a --- /dev/null +++ b/Minecraft.World/WaterWalkerEnchantment.cpp @@ -0,0 +1,21 @@ +#include "WaterWalkerEnchantment.h" + +WaterWalkerEnchantment::WaterWalkerEnchantment(int id, int frequency) : Enchantment(id, frequency, EnchantmentCategory::armor_feet) +{ + setDescriptionId(IDS_ENCHANTMENT_WATER_WALKER); +} + +int WaterWalkerEnchantment::getMinCost(int level) +{ + return 1 + (level - 1) * 10; +} + +int WaterWalkerEnchantment::getMaxCost(int level) +{ + return getMinCost(level) + 15; +} + +int WaterWalkerEnchantment::getMaxLevel() +{ + return 3; +} \ No newline at end of file diff --git a/Minecraft.World/WaterWalkerEnchantment.h b/Minecraft.World/WaterWalkerEnchantment.h new file mode 100644 index 00000000..fbd59a2f --- /dev/null +++ b/Minecraft.World/WaterWalkerEnchantment.h @@ -0,0 +1,13 @@ +#pragma once + +#include "Enchantment.h" + +class WaterWalkerEnchantment : public Enchantment +{ +public: + WaterWalkerEnchantment(int id, int freq); + + virtual int getMinCost(int level); + virtual int getMaxCost(int level); + virtual int getMaxLevel(); +}; \ No newline at end of file diff --git a/Minecraft.World/cmake/sources/Common.cmake b/Minecraft.World/cmake/sources/Common.cmake index 60573cbb..127045b8 100644 --- a/Minecraft.World/cmake/sources/Common.cmake +++ b/Minecraft.World/cmake/sources/Common.cmake @@ -1267,6 +1267,8 @@ set(_MINECRAFT_WORLD_COMMON_NET_MINECRAFT_WORLD_ITEM_ENCHANTMENT "${CMAKE_CURRENT_SOURCE_DIR}/UntouchingEnchantment.h" "${CMAKE_CURRENT_SOURCE_DIR}/WaterWorkerEnchantment.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/WaterWorkerEnchantment.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WaterWalkerEnchantment.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WaterWalkerEnchantment.h" "${CMAKE_CURRENT_SOURCE_DIR}/net.minecraft.world.item.enchantment.h" ) source_group("net/minecraft/world/item/enchantment" FILES ${_MINECRAFT_WORLD_COMMON_NET_MINECRAFT_WORLD_ITEM_ENCHANTMENT})