Laike_Endaril 7 Report post Posted December 24, 2018 (edited) I'm currently dealing with a system that stores LivingEntity instances and some related data in a map, based on certain conditions. In order to prevent memory leakage, I need to remove entries from said map as appropriate. This *could* be accomplished by iterating through every map entry * every entity in every world and seeing if any world contains it, on a timer, but that's a bit inefficient compared to an event-based system. As far as events go, I have not been able to find an event specifically for "any time an entity is unloaded" (latest stable forge release; 2768), but if one exists, please tell me! For now, I tried the next best thing, and used a combination of other events. This is working for *some* cases but not all. For example, if I spawn a zombie in an enclosed structure (not in a permanently loaded chunk / "spawn chunk") and move very far away, I receive no messages involving said zombie. If I place a llama outside the structure, I *do* receive a message for that in the chunk unload. Also, even if the zombie has a name via nametag, I still receive no message. Current code: Spoiler @SubscribeEvent public static void despawn(LivingSpawnEvent.AllowDespawn event) { EntityLivingBase livingBase = event.getEntityLiving(); Event.Result result = event.getResult(); if (livingBase instanceof EntityLiving && result != Event.Result.DENY && result != Event.Result.DEFAULT) { System.out.println("Despawn " + event.getEntity().getName()); } } @SubscribeEvent public static void entityDead(LivingDeathEvent event) { System.out.println("Dead " + event.getEntity().getName()); } @SubscribeEvent public static void chunkUnload(ChunkEvent.Unload event) { Chunk chunk = event.getChunk(); Set<Entity>[] sets = chunk.getEntityLists(); for (Set<Entity> set : sets) { for (Entity entity : set) { if (entity instanceof EntityLiving) System.out.println("Chunk Unload (saved) " + entity.getName()); } } } @SubscribeEvent public static void worldUnload(WorldEvent.Unload event) { for (Entity entity : event.getWorld().loadedEntityList) { if (entity instanceof EntityLiving) { System.out.println("World Unload " + entity.getName()); } } } Edit: For now, I've supplemented this with the periodic double-iteration I was trying to avoid. I'm still using the above methods to keep the map size to a minimum and reduce processing due to the periodic iterations. Edited December 24, 2018 by Laike_Endaril Update Share this post Link to post Share on other sites
diesieben07 6112 Report post Posted December 24, 2018 Use capabilities to attach additional data to an entities. They will be unloaded with the entity automatically. Share this post Link to post Share on other sites
Laike_Endaril 7 Report post Posted December 27, 2018 Thanks for the reply, and sorry for my late response! I will look into capabilities. Share this post Link to post Share on other sites