diff --git a/api/buildcraft/api/robots/EntityRobotBase.java b/api/buildcraft/api/robots/EntityRobotBase.java index 75f61d9b..0db1c32c 100755 --- a/api/buildcraft/api/robots/EntityRobotBase.java +++ b/api/buildcraft/api/robots/EntityRobotBase.java @@ -68,4 +68,6 @@ public abstract class EntityRobotBase extends EntityLiving implements IInventory public abstract IRobotRegistry getRegistry(); public abstract void releaseResources(); + + public abstract void onChunkUnload(); } diff --git a/api/buildcraft/api/robots/IRobotRegistry.java b/api/buildcraft/api/robots/IRobotRegistry.java index 334f5b63..553e638d 100755 --- a/api/buildcraft/api/robots/IRobotRegistry.java +++ b/api/buildcraft/api/robots/IRobotRegistry.java @@ -22,6 +22,8 @@ public interface IRobotRegistry { void killRobot(EntityRobotBase robot); + void unloadRobot(EntityRobotBase robot); + EntityRobotBase getLoadedRobot(long id); boolean isTaken(ResourceId resourceId); diff --git a/common/buildcraft/core/robots/DockingStation.java b/common/buildcraft/core/robots/DockingStation.java index 46168416..47b1ed30 100755 --- a/common/buildcraft/core/robots/DockingStation.java +++ b/common/buildcraft/core/robots/DockingStation.java @@ -94,6 +94,10 @@ public class DockingStation implements IDockingStation { return robotTaking; } + public void invalidateRobotTakingEntity() { + robotTaking = null; + } + @Override public long linkedId() { return robotTakingId; diff --git a/common/buildcraft/core/robots/EntityRobot.java b/common/buildcraft/core/robots/EntityRobot.java index afb792c0..0d2dcff8 100644 --- a/common/buildcraft/core/robots/EntityRobot.java +++ b/common/buildcraft/core/robots/EntityRobot.java @@ -945,6 +945,11 @@ public class EntityRobot extends EntityRobotBase implements super.setDead(); } + @Override + public void onChunkUnload() { + getRegistry().unloadRobot(this); + } + @Override public boolean canBePushed() { return false; @@ -1079,4 +1084,5 @@ public class EntityRobot extends EntityRobotBase implements public FluidTankInfo[] getTankInfo(ForgeDirection from) { return new FluidTankInfo[] {new FluidTankInfo(tank, maxFluid)}; } + } diff --git a/common/buildcraft/core/robots/RobotRegistry.java b/common/buildcraft/core/robots/RobotRegistry.java index cf6ac302..8dc86f6e 100755 --- a/common/buildcraft/core/robots/RobotRegistry.java +++ b/common/buildcraft/core/robots/RobotRegistry.java @@ -9,6 +9,7 @@ package buildcraft.core.robots; import java.security.InvalidParameterException; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -19,8 +20,11 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.world.ChunkEvent; import buildcraft.api.robots.EntityRobotBase; import buildcraft.api.robots.IDockingStation; @@ -74,6 +78,14 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry { robotsLoaded.remove(robot.getRobotId()); } + @Override + public void unloadRobot(EntityRobotBase robot) { + markDirty(); + + releaseResources(robot, false, true); + robotsLoaded.remove(robot.getRobotId()); + } + @Override public EntityRobot getLoadedRobot(long id) { if (robotsLoaded.containsKey(id)) { @@ -172,6 +184,10 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry { } private synchronized void releaseResources(EntityRobotBase robot, boolean forceAll) { + releaseResources(robot, forceAll, false); + } + + private synchronized void releaseResources(EntityRobotBase robot, boolean forceAll, boolean resetMainLink) { markDirty(); if (resourcesTakenByRobot.containsKey(robot.getRobotId())) { @@ -196,6 +212,9 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry { if (forceAll) { d.unsafeRelease(robot); } + else if (resetMainLink && d.isMainStation() && d.robotIdTaking() == robot.getRobotId()) { + d.invalidateRobotTakingEntity(); + } } else { d.unsafeRelease(robot); } @@ -284,6 +303,8 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry { ((DockingStation) d).world = world; } + MinecraftForge.EVENT_BUS.register(newRegistry); + registries.put(world.provider.dimensionId, newRegistry); return newRegistry; @@ -349,4 +370,16 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry { } } } + + @SubscribeEvent + public void onChunkUnload(ChunkEvent.Unload e) + { + if(e.world == this.world) + { + for (EntityRobot robot : new ArrayList(robotsLoaded.values())) { + if(!e.world.loadedEntityList.contains(robot)) + robot.onChunkUnload(); + } + } + } }