Jump to content

[1.15.2] How to properly damage entity every second


lisilew

Recommended Posts

I have an enchantment that deals certain damage to an entity every second over certain amount of time.

I attach a capability that contains current state (active or not), player id, duration and damage to the entity.

Then, I use LivingUpdateEvent to decrease duration every tick and damage the entity every 20 ticks passed.

I have two questions related to this implementation.

  1. What happens when no one is tracking the entity? Will the entity still get damaged?
  2. Is this considered a bad practice in terms of performance? If so, what method would you recommend?
Link to comment
Share on other sites

27 minutes ago, lisilew said:

What happens when no one is tracking the entity? Will the entity still get damaged?

Yes.

28 minutes ago, lisilew said:

Is this considered a bad practice in terms of performance? If so, what method would you recommend?

It's fine, but stuff like potion effects might be better.

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Link to comment
Share on other sites

13 hours ago, poopoodice said:

Potion effect might be a easier way to do this

 

13 hours ago, DavidM said:

potion effects might be better.

Potion effect sounds good as it has a method that gets called every tick but I want to damage the entity using DamageSource.cuasePlayerDamage, thus, I save player id in the capability.

As far as I know, Effect is constructed only once so how can I store extra data?

2 hours ago, diesieben07 said:

You could also use World#getGameTime, which is incremented every tick

Do you mean I put start time in the capability and check every tick if difference between current game time and start time is multiple of 20 instead of decrementing duration? Or is there a different way to use it?

Link to comment
Share on other sites

1 hour ago, diesieben07 said:

attach a capability to players and in that capability store the entity that is being damaged.

Actually, I attach the capability to the entity that is being damaged so only one player can affect the entity at the same time but one player can affect many entities at the same time.

Player's unique id is stored in the capability and when LivingUpdateEvent is fired, I get Player object from World#getPlayerByUuid.

How would this approach work when the entity is not tracked by any players and despawns?

Is this approach wrong and should I flip it like you said and attach the capability to players?

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.