Jump to content

[1.20.1] Need help with modifying native bow and arrow enchantment effects in Minecraft


final.ckpt

Recommended Posts

Hello,


I'm trying to modify the effects of native enchantments for bows and arrows in Minecraft. After using a decompilation tool, I found that the specific implementations of native bow and arrow enchantments (including `ArrowDamageEnchantment`, `ArrowKnockbackEnchantment`, `ArrowFireEnchantment`, `ArrowInfiniteEnchantment`, `ArrowPiercingEnchantment`) do not contain any information about the enchantment effects (such as the `getDamageProtection` function for `ProtectionEnchantment`, `getDamageBonus` function for `DamageEnchantment`, etc.).


Upon searching for the base class of arrows, `AbstractArrow`, I found a function named setEnchantmentEffectsFromEntity`, which seems to be used to retrieve the enchantment levels of the tool held by a `LivingEntity` and calculate the specific values of the enchantment effects. However, after testing with the following code, I found that this function is not being called:
 

@Mixin(AbstractArrow.class)
public class ModifyArrowEnchantmentEffects {
    private static final Logger LOGGER = LogUtils.getLogger();

    @Inject(
        method = "setEnchantmentEffectsFromEntity",
        at = @At("HEAD")
    )
    private void logArrowEnchantmentEffectsFromEntity(CallbackInfo ci) {
        LOGGER.info("Arrow enchantment effects from entity");
    }
}

 

Upon further investigation, I found that within the onHitEntity method, there are several lines of code:

 

            if (!this.level().isClientSide && entity1 instanceof LivingEntity) {
               EnchantmentHelper.doPostHurtEffects(livingentity, entity1);
               EnchantmentHelper.doPostDamageEffects((LivingEntity)entity1, livingentity);
            }

 

These lines of code actually call the doPostHurt and doPostAttack methods of each enchantment in the enchantment list. However, this leads back to the issue because native bow and arrow enchantments do not implement these functions. Although their base class defines the functions, they are empty.


At this point, I'm completely stumped and seeking assistance.


Thank you.

Link to comment
Share on other sites

sound like thing for arrow loose event 

 

	    @SubscribeEvent
    public static void ArrowLoose(ArrowLooseEvent event) {
        System.out.println("\n\n\n### ArrowLoose ");
        Player shooter = event.getEntity();
        String sshooter = (shooter != null)? shooter.getDisplayName().getString() : "null";
	
        ItemStack bow = event.getBow();
	        if( bow != null ){
            bow.enchant( Enchantments.FLAMING_ARROWS, 3 );
            System.out.println("### by " + sshooter  );
            System.out.println("### whit " + bow.getDisplayName().getString() );
        }
    }
	

this ones fires up before the arrow is released and for some reason dont works whit mi custom bows

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.