From 906abc62c8c95ae91f8d1054eb3cb4b2140671f6 Mon Sep 17 00:00:00 2001 From: JoshieGemFinder <79513611+JoshieGemFinder@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:53:53 +1000 Subject: [PATCH 1/2] Add REACH_DISTANCE support to extended reach items Adds `PlayerEntity.REACH_DISTANCE` support to greataxes and greatswords Instead of statically setting the reach, it determines it based off of the player's current reach distance and an new reach modifier on top of that. --- .../api/item/IExtendedReach.java | 22 ++++++++++++++++++- .../common/handler/ExtendedReachHandler.java | 2 +- .../item/tools/ItemAncientBattleAxe.java | 12 +++++++--- .../common/item/tools/ItemGreataxe.java | 10 +++++++-- .../common/item/tools/ItemGreatsword.java | 9 ++++++-- .../serverbound/MessageExtendedReach.java | 4 ++-- 6 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/main/java/thebetweenlands/api/item/IExtendedReach.java b/src/main/java/thebetweenlands/api/item/IExtendedReach.java index f9e0744326..f5977bc03a 100644 --- a/src/main/java/thebetweenlands/api/item/IExtendedReach.java +++ b/src/main/java/thebetweenlands/api/item/IExtendedReach.java @@ -1,15 +1,35 @@ package thebetweenlands.api.item; +import javax.annotation.Nullable; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; public interface IExtendedReach { + /** + * Returns the reach modifier in blocks + * @return + */ + double getReachModifier(@Nullable EntityPlayer player, ItemStack stack); + /** * Returns the reach in blocks that the item will be able to hit * @return */ - double getReach(); + default double getReach(@Nullable EntityPlayer player, ItemStack stack) { + if(player != null) { + //PlayerController#attackEntity() is called from Minecraft#clickMouse() + //Minecraft#clickMouse() uses Minecraft.objectMouseOver to determine if you're looking at an entity + //EntityRenderer#getMouseOver() is the only place Minecraft.objectMouseOver is assigned + //The raycast distance for Minecraft.objectMouseOver uses PlayerController#getBlockReachDistance() + final double reach = player.getEntityAttribute(EntityPlayer.REACH_DISTANCE).getAttributeValue(); + return (player.isCreative() ? reach : reach - 0.5) + this.getReachModifier(player, stack); + } else { + //Assume survival mode (4.5 was assumed before this was introduced) + return 4.5 + this.getReachModifier(player, stack); + } + } default void onLeftClick(EntityPlayer player, ItemStack stack) { diff --git a/src/main/java/thebetweenlands/common/handler/ExtendedReachHandler.java b/src/main/java/thebetweenlands/common/handler/ExtendedReachHandler.java index 5cde7f2b62..f76de16395 100644 --- a/src/main/java/thebetweenlands/common/handler/ExtendedReachHandler.java +++ b/src/main/java/thebetweenlands/common/handler/ExtendedReachHandler.java @@ -130,7 +130,7 @@ private static boolean extendedRayTrace(Consumer consumer) { ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND); if (!stack.isEmpty()) { if (stack.getItem() instanceof IExtendedReach) { - double reach = ((IExtendedReach) stack.getItem()).getReach(); + double reach = ((IExtendedReach) stack.getItem()).getReach(player, stack); RayTraceResult trace = getExtendedRayTrace(reach); if (trace != null && trace.entityHit != null && trace.entityHit.hurtResistantTime == 0 && trace.entityHit != player) { consumer.accept(trace); diff --git a/src/main/java/thebetweenlands/common/item/tools/ItemAncientBattleAxe.java b/src/main/java/thebetweenlands/common/item/tools/ItemAncientBattleAxe.java index cb5c290f20..9b9c50d8ea 100644 --- a/src/main/java/thebetweenlands/common/item/tools/ItemAncientBattleAxe.java +++ b/src/main/java/thebetweenlands/common/item/tools/ItemAncientBattleAxe.java @@ -12,6 +12,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemStack; @@ -51,11 +52,16 @@ protected double getAoEReach(EntityLivingBase entityLiving, ItemStack stack) { return 2.2D; } +// @Override +// public double getReach() { +// return 3.5D; +// } + @Override - public double getReach() { - return 3.5D; + public double getReachModifier(EntityPlayer player, ItemStack stack) { + return -1.0F; } - + @Override public Multimap getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { if(equipmentSlot == EntityEquipmentSlot.MAINHAND && stack.getItemDamage() == stack.getMaxDamage()) { diff --git a/src/main/java/thebetweenlands/common/item/tools/ItemGreataxe.java b/src/main/java/thebetweenlands/common/item/tools/ItemGreataxe.java index 4e18b6d165..6d7c8da930 100644 --- a/src/main/java/thebetweenlands/common/item/tools/ItemGreataxe.java +++ b/src/main/java/thebetweenlands/common/item/tools/ItemGreataxe.java @@ -13,6 +13,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.EnumRarity; @@ -146,9 +147,14 @@ protected double getAoEReach(EntityLivingBase entityLiving, ItemStack stack) { return 0; } +// @Override +// public double getReach() { +// return 2.5D; +// } + @Override - public double getReach() { - return 2.5D; + public double getReachModifier(EntityPlayer player, ItemStack stack) { + return -2.0F; } @Override diff --git a/src/main/java/thebetweenlands/common/item/tools/ItemGreatsword.java b/src/main/java/thebetweenlands/common/item/tools/ItemGreatsword.java index 2b5eae515f..f537b7a064 100644 --- a/src/main/java/thebetweenlands/common/item/tools/ItemGreatsword.java +++ b/src/main/java/thebetweenlands/common/item/tools/ItemGreatsword.java @@ -250,9 +250,14 @@ public int getFullRepairLifeCost(ItemStack stack) { return BLMaterialRegistry.getFullRepairLifeCost(BLMaterialRegistry.TOOL_LEGEND); } +// @Override +// public double getReach() { +// return 5.5; +// } + @Override - public double getReach() { - return 5.5; + public double getReachModifier(EntityPlayer player, ItemStack stack) { + return 1.0F; } @Override diff --git a/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java b/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java index 541f15fb4f..8c764bab65 100644 --- a/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java +++ b/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java @@ -33,8 +33,8 @@ public IMessage process(MessageContext ctx) { List entities = this.getEntities(); for(Entity entity : entities) { if (entity != null && entity.isEntityAlive()) { - double reach = ((IExtendedReach) heldItem.getItem()).getReach(); - if (reach * reach >= player.getDistanceSq(entity)) { + double reach = ((IExtendedReach) heldItem.getItem()).getReach(player, heldItem); + if (player.isCreative() || reach * reach >= player.getPositionEyes(1.0F).squareDistanceTo(entity.getPositionVector())) { player.attackTargetEntityWithCurrentItem(entity); } } From f0690bd981383f0126eeb0782160043dbe8cd907 Mon Sep 17 00:00:00 2001 From: JoshieGemFinder <79513611+JoshieGemFinder@users.noreply.github.com> Date: Mon, 2 Sep 2024 21:18:04 +1000 Subject: [PATCH 2/2] Fix extended reach size --- .../common/network/serverbound/MessageExtendedReach.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java b/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java index 8c764bab65..15026290ee 100644 --- a/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java +++ b/src/main/java/thebetweenlands/common/network/serverbound/MessageExtendedReach.java @@ -34,7 +34,7 @@ public IMessage process(MessageContext ctx) { for(Entity entity : entities) { if (entity != null && entity.isEntityAlive()) { double reach = ((IExtendedReach) heldItem.getItem()).getReach(player, heldItem); - if (player.isCreative() || reach * reach >= player.getPositionEyes(1.0F).squareDistanceTo(entity.getPositionVector())) { + if (player.isCreative() || entity.getEntityBoundingBox().grow(entity.getCollisionBorderSize() + reach).contains(player.getPositionEyes(1.0F))) { player.attackTargetEntityWithCurrentItem(entity); } }