Jump to content
  • Home
  • Files
  • Docs
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • Catching all cases where a LivingEntity is removed from server
The update for 1.13 is being worked on - please be patient. (Updated 02/19/19)
1.13 Update Notes for Mod Creators
Sign in to follow this  
Followers 1
Laike_Endaril

Catching all cases where a LivingEntity is removed from server

Started by Laike_Endaril, December 24, 2018

3 posts in this topic

Laike_Endaril    7

Laike_Endaril

Laike_Endaril    7

  • Creeper Killer
  • Laike_Endaril
  • Members
  • 7
  • 117 posts
  • 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

diesieben07

diesieben07    6112

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6112
  • 40239 posts
  • 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

Laike_Endaril

Laike_Endaril    7

  • Creeper Killer
  • Laike_Endaril
  • Members
  • 7
  • 117 posts
  • 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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
Followers 1
Go To Topic Listing Modder Support

  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • diesieben07
      [1.13.2] Getting Instance of LootTableManager

      By diesieben07 · Posted 3 minutes ago

      Probably due to the rewrite to use data packs.
    • DavidM
      [1.13.2] Getting Instance of LootTableManager

      By DavidM · Posted 8 minutes ago

      Just out of curiosity, why is LootTableManager MinecraftServer specific instead of World specific in 1.13.2?
    • diesieben07
      [1.13.2] Getting Instance of LootTableManager

      By diesieben07 · Posted 17 minutes ago

      ServerLifecycleHooks.getCurrentServer().getLootTableManager
    • DavidM
      Why does FORGE Forum not provide Chinese?

      By DavidM · Posted 17 minutes ago

      1. Minecraft is not originated in China, thus the majority of the gaming community speaks English. 2. Adding support for another language takes a long time. 3. There really is no need to. There is already a Chinese forum called Mcbbs. 4. Learn English. It is easier to adapt to the world than to make the world adapt to you. 
    • DavidM
      [1.13.2] Getting Instance of LootTableManager

      By DavidM · Posted 37 minutes ago

      I am trying to create a LootTable from a ResourceLocation. I am doing so with LootTableManager#getLootTableFromLocation.   How would I get an instance of LootTableManager in 1.13.2? Back in 1.12.2, I used World#getLootTableManager.
  • Topics

    • DavidM
      3
      [1.13.2] Getting Instance of LootTableManager

      By DavidM
      Started 37 minutes ago

    • QWQ
      2
      Why does FORGE Forum not provide Chinese?

      By QWQ
      Started January 4

    • MrMarnic
      3
      No Values in ForgeRegistries.ENTITIES 1.13.2

      By MrMarnic
      Started 13 hours ago

    • HeberonYT
      3
      Version Manifest - Forge

      By HeberonYT
      Started Yesterday at 02:02 AM

    • DavidM
      1
      [1.13.2] Config Files

      By DavidM
      Started 22 hours ago

  • Who's Online (See full list)

    • KonanTheRabbit
    • DavidM
    • DutchM
    • Melonslise
    • LTNightshade
    • portablejim
    • diesieben07
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • Catching all cases where a LivingEntity is removed from server
  • Theme
  • Contact Us

Copyright © 2017 ForgeDevelopment LLC Powered by Invision Community