salmjak Posted August 8, 2017 Posted August 8, 2017 (edited) 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 August 8, 2017 by salmjak Quote
Choonster Posted August 8, 2017 Posted August 8, 2017 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.CheckSpawn, LivingSpawnEvent.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. 2 Quote 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.
salmjak Posted August 8, 2017 Author Posted August 8, 2017 (edited) 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 August 8, 2017 by salmjak Quote
Choonster Posted August 8, 2017 Posted August 8, 2017 (edited) 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 August 8, 2017 by Choonster 1 Quote 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.
Daeruin Posted August 8, 2017 Posted August 8, 2017 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). Quote
Choonster Posted August 8, 2017 Posted August 8, 2017 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. Quote 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.
Daeruin Posted August 8, 2017 Posted August 8, 2017 Hmm. I may have to play around with it more. Thanks for the reply. Quote
Recommended Posts
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.