From bb8602c47258b7532d6bacf52db0373de2f9377d Mon Sep 17 00:00:00 2001 From: Disasm Date: Sat, 13 Jul 2013 12:24:22 +0400 Subject: [PATCH] Force chunks during jump --- src/cr0s/WarpDrive/EntityJump.java | 77 ++++++++++++++++++++++++++++-- src/cr0s/WarpDrive/WarpDrive.java | 16 ++++++- 2 files changed, 87 insertions(+), 6 deletions(-) diff --git a/src/cr0s/WarpDrive/EntityJump.java b/src/cr0s/WarpDrive/EntityJump.java index ed0c4deb..9b25056c 100644 --- a/src/cr0s/WarpDrive/EntityJump.java +++ b/src/cr0s/WarpDrive/EntityJump.java @@ -16,11 +16,15 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager.Type; public class EntityJump extends Entity { // Jump vector @@ -49,6 +53,9 @@ public class EntityJump extends Entity { public int dx; public int dz; public World targetWorld; + private Ticket sourceWorldTicket; + private Ticket targetWorldTicket; + // Collision point coordinates public int blowX, blowY, blowZ; boolean needToExplode = false; @@ -113,14 +120,15 @@ public class EntityJump extends Entity { if (!on) { return; } on = false; - System.out.println("[K] Killing jump entity..."); + System.out.println("[JE] Killing jump entity..."); if (!reason.isEmpty()) { System.out.println("[JUMP] Killed: " + reason); } unlockWorlds(); - + unforceChunks(); + try { if (!this.fromSpace && !this.toSpace) { worldObj.removeEntity(this); } } catch (Exception e) { @@ -175,9 +183,67 @@ public class EntityJump extends Entity { } } } - + + private void forceChunks() { + System.out.println("[JE] Forcing chunks"); + sourceWorldTicket = ForgeChunkManager.requestTicket(WarpDrive.instance, worldObj, Type.ENTITY); + targetWorldTicket = ForgeChunkManager.requestTicket(WarpDrive.instance, targetWorld, Type.NORMAL); + sourceWorldTicket.bindEntity(this); + + int x1 = minX >> 4; + int x2 = maxX >> 4; + int z1 = minZ >> 4; + int z2 = maxZ >> 4; + for(int x = x1; x <= x2; x++) { + for(int z = z1; z <= z2; z++) { + ForgeChunkManager.forceChunk(sourceWorldTicket, new ChunkCoordIntPair(x, z)); + } + } + + x1 = (minX + moveX) >> 4; + x2 = (maxX + moveX) >> 4; + z1 = (minZ + moveZ) >> 4; + z2 = (maxZ + moveZ) >> 4; + for(int x = x1; x <= x2; x++) { + for(int z = z1; z <= z2; z++) { + ForgeChunkManager.forceChunk(targetWorldTicket, new ChunkCoordIntPair(x, z)); + } + } + } + + private void unforceChunks() { + System.out.println("[JE] Unforcing chunks"); + if(sourceWorldTicket == null || targetWorldTicket == null) return; + + int x1 = minX >> 4; + int x2 = maxX >> 4; + int z1 = minZ >> 4; + int z2 = maxZ >> 4; + for(int x = x1; x <= x2; x++) { + for(int z = z1; z <= z2; z++) { + ForgeChunkManager.unforceChunk(sourceWorldTicket, new ChunkCoordIntPair(x, z)); + } + } + + x1 = (minX + moveX) >> 4; + x2 = (maxX + moveX) >> 4; + z1 = (minZ + moveZ) >> 4; + z2 = (maxZ + moveZ) >> 4; + for(int x = x1; x <= x2; x++) { + for(int z = z1; z <= z2; z++) { + ForgeChunkManager.unforceChunk(targetWorldTicket, new ChunkCoordIntPair(x, z)); + } + } + + ForgeChunkManager.releaseTicket(sourceWorldTicket); + ForgeChunkManager.releaseTicket(targetWorldTicket); + + sourceWorldTicket = null; + targetWorldTicket = null; + } + public void lockWorlds() { - System.out.println("Locking worlds..."); + System.out.println("[JE] Locking worlds..."); targetWorld.isRemote = true; // When warping between dimensions is need to lock both worlds @@ -187,7 +253,7 @@ public class EntityJump extends Entity { } public void unlockWorlds() { - System.out.println("Unlocking worlds.."); + System.out.println("[JE] Unlocking worlds.."); targetWorld.isRemote = false; if (targetWorld.provider.dimensionId != worldObj.provider.dimensionId) { @@ -295,6 +361,7 @@ public class EntityJump extends Entity { } } + forceChunks(); lockWorlds(); saveEntities(axisalignedbb); diff --git a/src/cr0s/WarpDrive/WarpDrive.java b/src/cr0s/WarpDrive/WarpDrive.java index ce72666d..ae2cc3ff 100644 --- a/src/cr0s/WarpDrive/WarpDrive.java +++ b/src/cr0s/WarpDrive/WarpDrive.java @@ -1,5 +1,7 @@ package cr0s.WarpDrive; +import java.util.List; + import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.Init; import cpw.mods.fml.common.Mod.Instance; @@ -21,6 +23,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.LoadingCallback; +import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.MinecraftForge; @Mod(modid = "WarpDrive", name = "WarpDrive", version = "1.0.0") @@ -28,7 +33,7 @@ import net.minecraftforge.common.MinecraftForge; /** * @author Cr0s */ -public class WarpDrive { +public class WarpDrive implements LoadingCallback { public final static int WARP_CORE_BLOCKID = 500; public final static int PROTOCOL_BLOCK_BLOCKID = 501; @@ -91,6 +96,8 @@ public class WarpDrive { EntityRegistry.registerModEntity(EntitySphereGen.class, "EntitySphereGenerator", 1, WarpDrive.instance, 100, 1, false); proxy.registerJumpEntity(); + ForgeChunkManager.setForcedChunkLoadingCallback(instance, instance); + spaceWorldGenerator = new SpaceWorldGenerator(); GameRegistry.registerWorldGenerator(spaceWorldGenerator); @@ -125,4 +132,11 @@ public class WarpDrive { this.spaceDimID = DimensionManager.getNextFreeDimId(); DimensionManager.registerDimension(this.spaceDimID, this.spaceProviderID); } + + @Override + public void ticketsLoaded(List tickets, World world) { + for(Ticket ticket : tickets) { + ForgeChunkManager.releaseTicket(ticket); + } + } } \ No newline at end of file