Posted December 24, 20186 yr 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, 20186 yr by Laike_Endaril Update
December 27, 20186 yr Author Thanks for the reply, and sorry for my late response! I will look into capabilities.
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.