Jump to content

Difference between EntityJoinWorldEvent and LivingSpawnEvent?


salmjak

Recommended Posts

I have a hard time grasping the difference between these two events (except that EntityJoinWorld probably is called for any entity).

Would Event.Result.DENY in LivingSpawnEvent have the same result as setCancelled(true) in EntityJoinWorldEvent? Is one called after the other? What effect does denying/cancelling have, is one temporary and the other permanent (i.e. is the entity removed and cleared from memory (eventually) in both or only one of them)?

 

EDIT: From what I can gather LivingSpawnEvent is called before EntityJoinWorldEvent, it might even be called before some of the constructors (since some variables were not available in the class I was using in LivingSpawnEvent but were available in EntityJoinWorldEvent, but that's entirely dependent on how the entity-class is built).

Edited by salmjak
Link to comment
Share on other sites

LivingSpawnEvent is the parent of several events, don't subscribe to it directly unless you want to receive every child and you don't care which one is which (which usually isn't the case).

 

LivingSpawnEvent.CheckSpawn is only fired for living entities that spawn passively (in WorldEntitySpawner) and for entities that spawn from mob spawners (in MobSpawnerBaseLogic). Setting the result to DENY will prevent the entity from spawning.

 

LivingSpawnEvent.SpecialSpawn is fired just after LivingSpawnEvent.CheckSpawn in the same places. Cancelling it will prevent the entity from spawning.

 

LivingSpawnEvent.AllowDespawn is fired when a living entity is about to despawn, setting the result to DENY will prevent the entity from despawning.

 

EntityJoinWorldEvent is fired when any entity is about to be spawned (regardless of what kind of entity or where it's being spawned from). Cancelling it will prevent the entity from spawning.

 

LivingSpawnEvent.CheckSpawnLivingSpawnEvent.SpecialSpawn and EntityJoinWorldEvent can all be used to prevent entities from spawning, the difference is which entities the events are fired for and which additional effects will be prevented when you cancel/deny the event. If the entity is covered by the LivingSpawnEvent children, you should prevent the spawn as early as possible (i.e. with LivingSpawnEvent.CheckSpawn) to stop any additional effects related to the spawning from happening.

  • Like 2

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Ok, thanks for clarifying! So essentially CheckSpawn is called earlier while entityJoinWorld is called later. Seem like checkspawn was too early in my case (using an API for another mod so don't really have any control over how the entities are constructed/variables instatiated).

Edited by salmjak
Link to comment
Share on other sites

33 minutes ago, salmjak said:

Ok, thanks for clarifying! So essentially CheckSpawn is called earlier while entityJoinWorld is called later.

 

Yes, the order is CheckSpawn, SpecialSpawn and then EntityJoinWorldEvent.

 

If an entity with a mount or passengers is spawned, CheckSpawn/SpecialSpawn will only be fired for the main entity; but EntityJoinWorldEvent will be fired for every entity.

 

SpecialSpawn is only fired by mob spawners when only the ID of the entity has been specified in the WeightedSpawnerEntity NBT. If the NBT tag has anything except the ID in it, SpecialSpawn won't be fired.

Edited by Choonster
  • Like 1

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

 

9 hours ago, Choonster said:

LivingSpawnEvent.CheckSpawn is only fired for living entities that spawn passively (in WorldEntitySpawner) and for entities that spawn from mob spawners (in MobSpawnerBaseLogic).

 

What do you mean by "entities that spawn passively"? When I tried using LivingSpawnEvent I found it couldn't detect any mob spawning that I was interested in (passive mobs that spawn when chunks load, hostile mobs that spawn at night).

Link to comment
Share on other sites

Just now, Daeruin said:

What do you mean by "entities that spawn passively"? When I tried using LivingSpawnEvent I found it couldn't detect any mob spawning that I was interested in (passive mobs that spawn when chunks load, hostile mobs that spawn at night).

 

Anything spawned by WorldEntitySpawner#findChunksForSpawning.

 

This includes any passive or hostile entities spawned in the chunks surrounding players, but not entities spawned in a newly-generated chunk.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

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.