Jump to content

1.7.10 Confusion with DamageSource and LivingAttackEvent


UberAffe

Recommended Posts

What I am trying to do:

Add an effect that gets stored in nbttagcompound to any item that extends ItemSword.

This effect adds additional damage based on the tier of effect when that sword is used to attack.

 

How I am trying to do this:

I am trying to hook into the LivingAttackEvent

Read the event.source.getSourceOfDamage().

if it is a player/using an extended class of sword/sword has the effect

then cancel this event and create a new event with additional damage.

 

there is an nbt flag that gets updated to stop this from looping.

 

I can add the effect to any sword, checking output has shown that this part works properly.

 

But I crash when calling event.source.getSourceOfDamage()

So I looked into the method and found that it simply returns null.

 

Is there another event that I can hook into that would let me do a similar thing, or is there a different way I should go about getting the (player/damageSource entity) while still using LivingAttackEvent?

 

If you want the logs I can post them, but it seems irrelevant to do so, since I know the source of the problem.

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

I guess I was just up too late working on this.

I made a stupid mistake and forgot to switch something.

 

For Anyone that looks at this thread, using event.source.getSourceOfDamage(), does work!

 

So new addition for this post:

Is this the correct way to "restart" an event?

 

DamageSource newSource = new EntityDamageSource(event.source.damageType, attackSource);

LivingAttackEvent remade = new LivingAttackEvent(event.entityLiving, newSource, event.ammount + (float)damage);

event.setCanceled(true);

MinecraftForge.EVENT_BUS.post(remade);

 

When I put a breakpoint in my code it does make it back with the altered values but it doesn't apply damage to the event.entity.

Is there another event I need to post first?

 

 

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

You should now about damage sources that:

1) There are passive sources, such as fire, and event my contain those. In this case, getSourceOfDamage returns null.

2) There are indirect entity sources, such as arrow, and event my contain those. In this case, getSourceOfDamage returns entity that damaged directly and getEntity entity that indirectly damaged entity.

3) There are direct entity sources, such as hitting with sword, and event may contain those. In this case, getSourceOfDamage and getEntity return entity that damaged entity.

Link to comment
Share on other sites

You should now about damage sources that:

1) There are passive sources, such as fire, and event my contain those. In this case, getSourceOfDamage returns null.

2) There are indirect entity sources, such as arrow, and event my contain those. In this case, getSourceOfDamage returns entity that damaged directly and getEntity entity that indirectly damaged entity.

3) There are direct entity sources, such as hitting with sword, and event may contain those. In this case, getSourceOfDamage and getEntity return entity that damaged entity.

 

I hadn't meant to post that yet, it was edited while you posted this, and I did find those implementations, but thanks for the quick response!

And looking at the edited response I have an additional question.

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

The event itself does not damage entity. But it allows you to change damage value or cancel it. This is how events work. They are hooked by forge in to methods, where they are called in begining/end of method, which allows cancellation, changing parameters or doing anything else. So if you want to hurt entity, call attckEntityFrom... And don't forget that new event with your damage source will be posted on top of first one...

Link to comment
Share on other sites

Just found this post http://www.minecraftforge.net/forum/index.php?topic=10794.0

 

Which if the LivingHurtEvent still works the same way, I can avoid having to cancel and send new information.

I'll have to test when I get home but I should just be able to alter the damage amount parameter and let everything continue.

 

 

BTW, this is what I had been doing:

read event information,

create altered parameters,

cancel the event,

post new event with altered parameters.

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • im stuck in a problem whit BlockEntities i cannot solve so im trying to work around it but in the less complex way possible  i think is posible to store data to the minecraft world  in older versions people talk about  WordDataSave i dont find anything about it for 1.20.4  i find a tutorial for player capability in 1.19    here is an event      //########## ########## ########## ##########     @SubscribeEvent     public static void onAttachCapabilitiesPlayer(AttachCapabilitiesEvent<Entity> event) {         if(event.getObject() instanceof Player) {             if(!event.getObject().getCapability(PlayerThirstProvider.PLAYER_THIRST).isPresent()) {                 event.addCapability(new ResourceLocation(mercmod.MOD_ID, "properties"), new PlayerThirstProvider());             }         }     }  soo i made this      //########## ########## ########## ##########     @SubscribeEvent     public static void onAttachCapabilitiesLevel(AttachCapabilitiesEvent<Level> event) {     } i think i can do some witchcraft  here  but is many things don't understand  to start whit i dont get yet how to recall the saved data from a BlockEntity  the handler still in progress the plan is to make a Map to store nbt data using the block coordinates as index later store that map as a big nbt      ########## any way the question is if theres alredy a tutorial for 1.20.4 for this ?? or some alredy working code from someone else doing something similar ?           
    • I tried this, and found out that Oculus is the mod that is crashing the game. I have removed it, and it now works fine! Thanks!
    • Hi @DanielderErbauer, I arrived here as I have the "as it does not exist in Block{minecraft:air}" error in a modpack I am trying to start. It's a long-shot, I know, but as the post that led this to being solved is missing, can I ask if you may recall what it said? Thanks in advance
    • Hm yeah sorry, not seeing anything else that's sticking out, I'd need to debug myself probably. Do you have a github or bitbucket repo? I could poke around when I have time to see what the problem might be.
    • looking around for the capabilities thing i found a piece of code and find this piece of code  //########## ########## ########## ########## @SubscribeEvent public static void addCustomTrades(VillagerTradesEvent event) { if(event.getType() == VillagerProfession.FLETCHER) { System.out.println("\n\n### VillagerProfession.FLETCHER \n\n");//<----------- Int2ObjectMap<List<VillagerTrades.ItemListing>> trades = event.getTrades(); ItemStack stack = new ItemStack(ItemInit.ARROW_STEEL.get(), 16); int villagerLevel = 1; trades.get(villagerLevel).add((trader, rand) -> new MerchantOffer( new ItemStack(Items.EMERALD, 2), stack,1,3,0.02F)); } if(event.getType() == VillagerProfession.TOOLSMITH) { System.out.println("\n\n### VillagerProfession.TOOLSMITH \n\n");//<----------- Int2ObjectMap<List<VillagerTrades.ItemListing>> trades = event.getTrades(); ItemStack stack = new ItemStack(ItemInit.INGOT_STEEL.get(), 1); int villagerLevel = 1; trades.get(villagerLevel).add((trader, rand) -> new MerchantOffer( new ItemStack(Items.EMERALD, 2), stack,10,8,0.02F)); } } //########## ########## ########## ########## the event is aknoledge and execute when the maps load  ### VillagerProfession.FLETCHER  ### VillagerProfession.TOOLSMITH  //########## But is not working      is a random piece of code is not working  could it be than this code is old 1.18 and no valid anymore for 1.20.4 or the thing are this numbers  stack,10,8,0.02F));  i dont know what this numbers means    ########## the question is ¿how to add things to the villager traders    thanks for your attention               
  • Topics

×
×
  • Create New...

Important Information

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