From a438374176c86ea603e837e889b418d7e9b5bc46 Mon Sep 17 00:00:00 2001 From: Correl Roush Date: Tue, 29 Oct 2013 18:26:11 -0400 Subject: [PATCH] initial commit --- .../surfaceworld/BlockSurfaceWorldBlock.java | 15 + .../surfaceworld/BlockSurfaceWorldPortal.java | 173 ++++++ .../ChunkProviderSurfaceWorld.java | 13 + .../minecraft/surfaceworld/CommonProxy.java | 9 + .../surfaceworld/ItemSurfaceWorld.java | 12 + .../surfaceworld/ItemSurfaceWorldBlock.java | 12 + .../minecraft/surfaceworld/SurfaceWorld.java | 64 +++ .../surfaceworld/TeleporterSurfaceWorld.java | 516 ++++++++++++++++++ .../WorldProviderSurfaceWorld.java | 23 + .../surfaceworld/client/ClientProxy.java | 12 + 10 files changed, 849 insertions(+) create mode 100644 net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldBlock.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldPortal.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/ChunkProviderSurfaceWorld.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/CommonProxy.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorld.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorldBlock.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/SurfaceWorld.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/TeleporterSurfaceWorld.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/WorldProviderSurfaceWorld.java create mode 100644 net/phoenixinquis/minecraft/surfaceworld/client/ClientProxy.java diff --git a/net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldBlock.java b/net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldBlock.java new file mode 100644 index 0000000..e196ef9 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldBlock.java @@ -0,0 +1,15 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.world.World; + +public class BlockSurfaceWorldBlock extends Block { + + public BlockSurfaceWorldBlock(int par1, Material par2Material) { + super(par1, par2Material); + this.setCreativeTab(CreativeTabs.tabBlock); + } + +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldPortal.java b/net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldPortal.java new file mode 100644 index 0000000..6b42f07 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/BlockSurfaceWorldPortal.java @@ -0,0 +1,173 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockPortal; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.src.ModLoader; +import net.minecraft.world.World; + +public class BlockSurfaceWorldPortal extends BlockPortal { + + public BlockSurfaceWorldPortal(int par1) { + super(par1); + this.setCreativeTab(CreativeTabs.tabBlock); + } + + public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) + { + if ((par5Entity.ridingEntity == null) && (par5Entity.riddenByEntity == null) && ((par5Entity instanceof EntityPlayerMP))) + { + EntityPlayerMP player = (EntityPlayerMP) par5Entity; + ModLoader.getMinecraftServerInstance(); + MinecraftServer mServer = MinecraftServer.getServer(); + if (player.timeUntilPortal > 0) + { + player.timeUntilPortal = 10; + } + else if (player.dimension != SurfaceWorld.dimensionId) + { + player.timeUntilPortal = 10; + player.mcServer.getConfigurationManager().transferPlayerToDimension(player, SurfaceWorld.dimensionId, new TeleporterSurfaceWorld(mServer.worldServerForDimension(SurfaceWorld.dimensionId))); + } + else + { + player.timeUntilPortal = 10; + player.mcServer.getConfigurationManager().transferPlayerToDimension(player, 0, new TeleporterSurfaceWorld(mServer.worldServerForDimension(1))); + } + } + } + + /** + * Checks to see if this location is valid to create a portal and will return True if it does. Args: world, x, y, z + */ + public boolean tryToCreatePortal(World par1World, int par2, int par3, int par4) + { + byte b0 = 0; + byte b1 = 0; + + if (par1World.getBlockId(par2 - 1, par3, par4) == SurfaceWorld.surfaceWorldBlock.blockID || par1World.getBlockId(par2 + 1, par3, par4) == SurfaceWorld.surfaceWorldBlock.blockID) + { + b0 = 1; + } + + if (par1World.getBlockId(par2, par3, par4 - 1) == SurfaceWorld.surfaceWorldBlock.blockID || par1World.getBlockId(par2, par3, par4 + 1) == SurfaceWorld.surfaceWorldBlock.blockID) + { + b1 = 1; + } + + if (b0 == b1) + { + return false; + } + else + { + if (par1World.isAirBlock(par2 - b0, par3, par4 - b1)) + { + par2 -= b0; + par4 -= b1; + } + + int l; + int i1; + + for (l = -1; l <= 2; ++l) + { + for (i1 = -1; i1 <= 3; ++i1) + { + boolean flag = l == -1 || l == 2 || i1 == -1 || i1 == 3; + + if (l != -1 && l != 2 || i1 != -1 && i1 != 3) + { + int j1 = par1World.getBlockId(par2 + b0 * l, par3 + i1, par4 + b1 * l); + boolean isAirBlock = par1World.isAirBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l); + + if (flag) + { + if (j1 != SurfaceWorld.surfaceWorldBlock.blockID) + { + return false; + } + } + else if (!isAirBlock && j1 != Block.fire.blockID) + { + return false; + } + } + } + } + + for (l = 0; l < 2; ++l) + { + for (i1 = 0; i1 < 3; ++i1) + { + par1World.setBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l, SurfaceWorld.surfaceWorldPortal.blockID, 0, 2); + } + } + + return true; + } + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are + * their own) Args: x, y, z, neighbor blockID + */ + public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) + { + byte b0 = 0; + byte b1 = 1; + + if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID) + { + b0 = 1; + b1 = 0; + } + + int i1; + + for (i1 = par3; par1World.getBlockId(par2, i1 - 1, par4) == this.blockID; --i1) + { + ; + } + + if (par1World.getBlockId(par2, i1 - 1, par4) != SurfaceWorld.surfaceWorldBlock.blockID) + { + par1World.setBlockToAir(par2, par3, par4); + } + else + { + int j1; + + for (j1 = 1; j1 < 4 && par1World.getBlockId(par2, i1 + j1, par4) == this.blockID; ++j1) + { + ; + } + + if (j1 == 3 && par1World.getBlockId(par2, i1 + j1, par4) == SurfaceWorld.surfaceWorldBlock.blockID) + { + boolean flag = par1World.getBlockId(par2 - 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID; + boolean flag1 = par1World.getBlockId(par2, par3, par4 - 1) == this.blockID || par1World.getBlockId(par2, par3, par4 + 1) == this.blockID; + + if (flag && flag1) + { + par1World.setBlockToAir(par2, par3, par4); + } + else + { + if ((par1World.getBlockId(par2 + b0, par3, par4 + b1) != SurfaceWorld.surfaceWorldBlock.blockID || par1World.getBlockId(par2 - b0, par3, par4 - b1) != this.blockID) && (par1World.getBlockId(par2 - b0, par3, par4 - b1) != SurfaceWorld.surfaceWorldBlock.blockID || par1World.getBlockId(par2 + b0, par3, par4 + b1) != this.blockID)) + { + par1World.setBlockToAir(par2, par3, par4); + } + } + } + else + { + par1World.setBlockToAir(par2, par3, par4); + } + } + } + +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/ChunkProviderSurfaceWorld.java b/net/phoenixinquis/minecraft/surfaceworld/ChunkProviderSurfaceWorld.java new file mode 100644 index 0000000..6fb0a08 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/ChunkProviderSurfaceWorld.java @@ -0,0 +1,13 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import net.minecraft.world.World; +import net.minecraft.world.gen.ChunkProviderGenerate; + +public class ChunkProviderSurfaceWorld extends ChunkProviderGenerate { + + public ChunkProviderSurfaceWorld(World par1World, long par2, boolean par4) { + super(par1World, par2, par4); + // TODO Auto-generated constructor stub + } + +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/CommonProxy.java b/net/phoenixinquis/minecraft/surfaceworld/CommonProxy.java new file mode 100644 index 0000000..98adc34 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/CommonProxy.java @@ -0,0 +1,9 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +public class CommonProxy { + + // Client stuff + public void registerRenderers() { + // Nothing here as the server doesn't render graphics or entities! + } +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorld.java b/net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorld.java new file mode 100644 index 0000000..5eea183 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorld.java @@ -0,0 +1,12 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import net.minecraft.item.Item; + +public class ItemSurfaceWorld extends Item { + + public ItemSurfaceWorld(int par1) { + super(par1); + // TODO Auto-generated constructor stub + } + +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorldBlock.java b/net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorldBlock.java new file mode 100644 index 0000000..2b8e5b3 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/ItemSurfaceWorldBlock.java @@ -0,0 +1,12 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import net.minecraft.item.ItemBlock; + +public class ItemSurfaceWorldBlock extends ItemBlock { + + public ItemSurfaceWorldBlock(int par1) { + super(par1); + // TODO Auto-generated constructor stub + } + +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/SurfaceWorld.java b/net/phoenixinquis/minecraft/surfaceworld/SurfaceWorld.java new file mode 100644 index 0000000..37e8be2 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/SurfaceWorld.java @@ -0,0 +1,64 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.DimensionManager; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.network.NetworkMod; +import cpw.mods.fml.common.registry.GameRegistry; + +@Mod(modid = "Phoenix_SurfaceWorld", name = "Surface World", version = "0.0.0") +@NetworkMod(clientSideRequired = true) +public class SurfaceWorld { + + public static final String modid = "Phoenix_SurfaceWorld"; + + // The instance of your mod that Forge uses. + @Instance(value = SurfaceWorld.modid) + public static SurfaceWorld instance; + +// // Says where the client and server 'proxy' code is loaded. +// @SidedProxy(clientSide = "net.phoenixinquis.minecraft.surfaceworld.client.ClientProxy", serverSide = "net.phoenixinquis.minecraft.surfaceworld.CommonProxy") +// public static CommonProxy proxy; + + public static int dimensionId = 8; + public static Block surfaceWorldBlock; + public static Block surfaceWorldPortal; + public static Item surfaceWorldItem; + + @EventHandler + // used in 1.6.2 + // @PreInit // used in 1.5.2 + public void preInit(FMLPreInitializationEvent event) { + // Stub Method + } + + @EventHandler + // used in 1.6.2 + // @Init // used in 1.5.2 + public void load(FMLInitializationEvent event) { + DimensionManager.registerProviderType(SurfaceWorld.dimensionId, WorldProviderSurfaceWorld.class, false); + DimensionManager.registerDimension(SurfaceWorld.dimensionId, SurfaceWorld.dimensionId); + surfaceWorldItem = new ItemSurfaceWorld(5000).setUnlocalizedName("surfaceWorldItem"); + surfaceWorldBlock = new BlockSurfaceWorldBlock(500, Material.rock).setUnlocalizedName("surfaceWorldBlock"); + surfaceWorldPortal = new BlockSurfaceWorldPortal(501).setUnlocalizedName("surfaceWorldPortalBlock"); + GameRegistry.registerBlock(surfaceWorldBlock, ItemSurfaceWorldBlock.class, modid + (surfaceWorldBlock.getUnlocalizedName().substring(5))); + GameRegistry.registerBlock(surfaceWorldPortal, modid + (surfaceWorldPortal.getUnlocalizedName().substring(5))); +// proxy.registerRenderers(); + } + + @EventHandler + // used in 1.6.2 + // @PostInit // used in 1.5.2 + public void postInit(FMLPostInitializationEvent event) { + // Stub Method + } +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/TeleporterSurfaceWorld.java b/net/phoenixinquis/minecraft/surfaceworld/TeleporterSurfaceWorld.java new file mode 100644 index 0000000..56a5e1e --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/TeleporterSurfaceWorld.java @@ -0,0 +1,516 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.util.Direction; +import net.minecraft.util.LongHashMap; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.PortalPosition; +import net.minecraft.world.Teleporter; +import net.minecraft.world.WorldServer; + +public class TeleporterSurfaceWorld extends Teleporter +{ + private final WorldServer worldServerInstance; + + /** A private Random() function in Teleporter */ + private final Random random; + + /** Stores successful portal placement locations for rapid lookup. */ + private final LongHashMap destinationCoordinateCache = new LongHashMap(); + + /** + * A list of valid keys for the destinationCoordainteCache. These are based on the X & Z of the players initial + * location. + */ + private final List destinationCoordinateKeys = new ArrayList(); + + public TeleporterSurfaceWorld(WorldServer par1WorldServer) + { + super(par1WorldServer); + this.worldServerInstance = par1WorldServer; + this.random = new Random(par1WorldServer.getSeed()); + } + + /** + * Place an entity in a nearby portal, creating one if necessary. + */ + public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8) + { + if (this.worldServerInstance.provider.dimensionId != 1) + { + if (!this.placeInExistingPortal(par1Entity, par2, par4, par6, par8)) + { + this.makePortal(par1Entity); + this.placeInExistingPortal(par1Entity, par2, par4, par6, par8); + } + } + else + { + int i = MathHelper.floor_double(par1Entity.posX); + int j = MathHelper.floor_double(par1Entity.posY) - 1; + int k = MathHelper.floor_double(par1Entity.posZ); + byte b0 = 1; + byte b1 = 0; + + for (int l = -2; l <= 2; ++l) + { + for (int i1 = -2; i1 <= 2; ++i1) + { + for (int j1 = -1; j1 < 3; ++j1) + { + int k1 = i + i1 * b0 + l * b1; + int l1 = j + j1; + int i2 = k + i1 * b1 - l * b0; + boolean flag = j1 < 0; + this.worldServerInstance.setBlock(k1, l1, i2, flag ? SurfaceWorld.surfaceWorldBlock.blockID : 0); + } + } + } + + par1Entity.setLocationAndAngles((double)i, (double)j, (double)k, par1Entity.rotationYaw, 0.0F); + par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D; + } + } + + /** + * Place an entity in a nearby portal which already exists. + */ + public boolean placeInExistingPortal(Entity par1Entity, double par2, double par4, double par6, float par8) + { + short short1 = 128; + double d3 = -1.0D; + int i = 0; + int j = 0; + int k = 0; + int l = MathHelper.floor_double(par1Entity.posX); + int i1 = MathHelper.floor_double(par1Entity.posZ); + long j1 = ChunkCoordIntPair.chunkXZ2Int(l, i1); + boolean flag = true; + double d4; + int k1; + + if (this.destinationCoordinateCache.containsItem(j1)) + { + PortalPosition portalposition = (PortalPosition)this.destinationCoordinateCache.getValueByKey(j1); + d3 = 0.0D; + i = portalposition.posX; + j = portalposition.posY; + k = portalposition.posZ; + portalposition.lastUpdateTime = this.worldServerInstance.getTotalWorldTime(); + flag = false; + } + else + { + for (k1 = l - short1; k1 <= l + short1; ++k1) + { + double d5 = (double)k1 + 0.5D - par1Entity.posX; + + for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) + { + double d6 = (double)l1 + 0.5D - par1Entity.posZ; + + for (int i2 = this.worldServerInstance.getActualHeight() - 1; i2 >= 0; --i2) + { + if (this.worldServerInstance.getBlockId(k1, i2, l1) == SurfaceWorld.surfaceWorldPortal.blockID) + { + while (this.worldServerInstance.getBlockId(k1, i2 - 1, l1) == SurfaceWorld.surfaceWorldPortal.blockID) + { + --i2; + } + + d4 = (double)i2 + 0.5D - par1Entity.posY; + double d7 = d5 * d5 + d4 * d4 + d6 * d6; + + if (d3 < 0.0D || d7 < d3) + { + d3 = d7; + i = k1; + j = i2; + k = l1; + } + } + } + } + } + } + + if (d3 >= 0.0D) + { + if (flag) + { + this.destinationCoordinateCache.add(j1, new PortalPosition(this, i, j, k, this.worldServerInstance.getTotalWorldTime())); + this.destinationCoordinateKeys.add(Long.valueOf(j1)); + } + + double d8 = (double)i + 0.5D; + double d9 = (double)j + 0.5D; + d4 = (double)k + 0.5D; + int j2 = -1; + + if (this.worldServerInstance.getBlockId(i - 1, j, k) == SurfaceWorld.surfaceWorldPortal.blockID) + { + j2 = 2; + } + + if (this.worldServerInstance.getBlockId(i + 1, j, k) == SurfaceWorld.surfaceWorldPortal.blockID) + { + j2 = 0; + } + + if (this.worldServerInstance.getBlockId(i, j, k - 1) == SurfaceWorld.surfaceWorldPortal.blockID) + { + j2 = 3; + } + + if (this.worldServerInstance.getBlockId(i, j, k + 1) == SurfaceWorld.surfaceWorldPortal.blockID) + { + j2 = 1; + } + + int k2 = par1Entity.getTeleportDirection(); + + if (j2 > -1) + { + int l2 = Direction.rotateLeft[j2]; + int i3 = Direction.offsetX[j2]; + int j3 = Direction.offsetZ[j2]; + int k3 = Direction.offsetX[l2]; + int l3 = Direction.offsetZ[l2]; + boolean flag1 = !this.worldServerInstance.isAirBlock(i + i3 + k3, j, k + j3 + l3) || !this.worldServerInstance.isAirBlock(i + i3 + k3, j + 1, k + j3 + l3); + boolean flag2 = !this.worldServerInstance.isAirBlock(i + i3, j, k + j3) || !this.worldServerInstance.isAirBlock(i + i3, j + 1, k + j3); + + if (flag1 && flag2) + { + j2 = Direction.rotateOpposite[j2]; + l2 = Direction.rotateOpposite[l2]; + i3 = Direction.offsetX[j2]; + j3 = Direction.offsetZ[j2]; + k3 = Direction.offsetX[l2]; + l3 = Direction.offsetZ[l2]; + k1 = i - k3; + d8 -= (double)k3; + int i4 = k - l3; + d4 -= (double)l3; + flag1 = !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j, i4 + j3 + l3) || !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j + 1, i4 + j3 + l3); + flag2 = !this.worldServerInstance.isAirBlock(k1 + i3, j, i4 + j3) || !this.worldServerInstance.isAirBlock(k1 + i3, j + 1, i4 + j3); + } + + float f1 = 0.5F; + float f2 = 0.5F; + + if (!flag1 && flag2) + { + f1 = 1.0F; + } + else if (flag1 && !flag2) + { + f1 = 0.0F; + } + else if (flag1 && flag2) + { + f2 = 0.0F; + } + + d8 += (double)((float)k3 * f1 + f2 * (float)i3); + d4 += (double)((float)l3 * f1 + f2 * (float)j3); + float f3 = 0.0F; + float f4 = 0.0F; + float f5 = 0.0F; + float f6 = 0.0F; + + if (j2 == k2) + { + f3 = 1.0F; + f4 = 1.0F; + } + else if (j2 == Direction.rotateOpposite[k2]) + { + f3 = -1.0F; + f4 = -1.0F; + } + else if (j2 == Direction.rotateRight[k2]) + { + f5 = 1.0F; + f6 = -1.0F; + } + else + { + f5 = -1.0F; + f6 = 1.0F; + } + + double d10 = par1Entity.motionX; + double d11 = par1Entity.motionZ; + par1Entity.motionX = d10 * (double)f3 + d11 * (double)f6; + par1Entity.motionZ = d10 * (double)f5 + d11 * (double)f4; + par1Entity.rotationYaw = par8 - (float)(k2 * 90) + (float)(j2 * 90); + } + else + { + par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D; + } + + par1Entity.setLocationAndAngles(d8, d9, d4, par1Entity.rotationYaw, par1Entity.rotationPitch); + return true; + } + else + { + return false; + } + } + + public boolean makePortal(Entity par1Entity) + { + byte b0 = 16; + double d0 = -1.0D; + int i = MathHelper.floor_double(par1Entity.posX); + int j = MathHelper.floor_double(par1Entity.posY); + int k = MathHelper.floor_double(par1Entity.posZ); + int l = i; + int i1 = j; + int j1 = k; + int k1 = 0; + int l1 = this.random.nextInt(4); + int i2; + double d1; + double d2; + int j2; + int k2; + int l2; + int i3; + int j3; + int k3; + int l3; + int i4; + int j4; + int k4; + double d3; + double d4; + + for (i2 = i - b0; i2 <= i + b0; ++i2) + { + d1 = (double)i2 + 0.5D - par1Entity.posX; + + for (j2 = k - b0; j2 <= k + b0; ++j2) + { + d2 = (double)j2 + 0.5D - par1Entity.posZ; + label274: + + for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) + { + if (this.worldServerInstance.isAirBlock(i2, k2, j2)) + { + while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) + { + --k2; + } + + for (i3 = l1; i3 < l1 + 4; ++i3) + { + l2 = i3 % 2; + k3 = 1 - l2; + + if (i3 % 4 >= 2) + { + l2 = -l2; + k3 = -k3; + } + + for (j3 = 0; j3 < 3; ++j3) + { + for (i4 = 0; i4 < 4; ++i4) + { + for (l3 = -1; l3 < 4; ++l3) + { + k4 = i2 + (i4 - 1) * l2 + j3 * k3; + j4 = k2 + l3; + int l4 = j2 + (i4 - 1) * k3 - j3 * l2; + + if (l3 < 0 && !this.worldServerInstance.getBlockMaterial(k4, j4, l4).isSolid() || l3 >= 0 && !this.worldServerInstance.isAirBlock(k4, j4, l4)) + { + continue label274; + } + } + } + } + + d4 = (double)k2 + 0.5D - par1Entity.posY; + d3 = d1 * d1 + d4 * d4 + d2 * d2; + + if (d0 < 0.0D || d3 < d0) + { + d0 = d3; + l = i2; + i1 = k2; + j1 = j2; + k1 = i3 % 4; + } + } + } + } + } + } + + if (d0 < 0.0D) + { + for (i2 = i - b0; i2 <= i + b0; ++i2) + { + d1 = (double)i2 + 0.5D - par1Entity.posX; + + for (j2 = k - b0; j2 <= k + b0; ++j2) + { + d2 = (double)j2 + 0.5D - par1Entity.posZ; + label222: + + for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) + { + if (this.worldServerInstance.isAirBlock(i2, k2, j2)) + { + while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) + { + --k2; + } + + for (i3 = l1; i3 < l1 + 2; ++i3) + { + l2 = i3 % 2; + k3 = 1 - l2; + + for (j3 = 0; j3 < 4; ++j3) + { + for (i4 = -1; i4 < 4; ++i4) + { + l3 = i2 + (j3 - 1) * l2; + k4 = k2 + i4; + j4 = j2 + (j3 - 1) * k3; + + if (i4 < 0 && !this.worldServerInstance.getBlockMaterial(l3, k4, j4).isSolid() || i4 >= 0 && !this.worldServerInstance.isAirBlock(l3, k4, j4)) + { + continue label222; + } + } + } + + d4 = (double)k2 + 0.5D - par1Entity.posY; + d3 = d1 * d1 + d4 * d4 + d2 * d2; + + if (d0 < 0.0D || d3 < d0) + { + d0 = d3; + l = i2; + i1 = k2; + j1 = j2; + k1 = i3 % 2; + } + } + } + } + } + } + } + + int i5 = l; + int j5 = i1; + j2 = j1; + int k5 = k1 % 2; + int l5 = 1 - k5; + + if (k1 % 4 >= 2) + { + k5 = -k5; + l5 = -l5; + } + + boolean flag; + + if (d0 < 0.0D) + { + if (i1 < 70) + { + i1 = 70; + } + + if (i1 > this.worldServerInstance.getActualHeight() - 10) + { + i1 = this.worldServerInstance.getActualHeight() - 10; + } + + j5 = i1; + + for (k2 = -1; k2 <= 1; ++k2) + { + for (i3 = 1; i3 < 3; ++i3) + { + for (l2 = -1; l2 < 3; ++l2) + { + k3 = i5 + (i3 - 1) * k5 + k2 * l5; + j3 = j5 + l2; + i4 = j2 + (i3 - 1) * l5 - k2 * k5; + flag = l2 < 0; + this.worldServerInstance.setBlock(k3, j3, i4, flag ? SurfaceWorld.surfaceWorldBlock.blockID : 0); + } + } + } + } + + for (k2 = 0; k2 < 4; ++k2) + { + for (i3 = 0; i3 < 4; ++i3) + { + for (l2 = -1; l2 < 4; ++l2) + { + k3 = i5 + (i3 - 1) * k5; + j3 = j5 + l2; + i4 = j2 + (i3 - 1) * l5; + flag = i3 == 0 || i3 == 3 || l2 == -1 || l2 == 3; + this.worldServerInstance.setBlock(k3, j3, i4, flag ? SurfaceWorld.surfaceWorldBlock.blockID : SurfaceWorld.surfaceWorldPortal.blockID, 0, 2); + } + } + + for (i3 = 0; i3 < 4; ++i3) + { + for (l2 = -1; l2 < 4; ++l2) + { + k3 = i5 + (i3 - 1) * k5; + j3 = j5 + l2; + i4 = j2 + (i3 - 1) * l5; + this.worldServerInstance.notifyBlocksOfNeighborChange(k3, j3, i4, this.worldServerInstance.getBlockId(k3, j3, i4)); + } + } + } + + return true; + } + + /** + * called periodically to remove out-of-date portal locations from the cache list. Argument par1 is a + * WorldServer.getTotalWorldTime() value. + */ + public void removeStalePortalLocations(long par1) + { + if (par1 % 100L == 0L) + { + Iterator iterator = this.destinationCoordinateKeys.iterator(); + long j = par1 - 600L; + + while (iterator.hasNext()) + { + Long olong = (Long)iterator.next(); + PortalPosition portalposition = (PortalPosition)this.destinationCoordinateCache.getValueByKey(olong.longValue()); + + if (portalposition == null || portalposition.lastUpdateTime < j) + { + iterator.remove(); + this.destinationCoordinateCache.remove(olong.longValue()); + } + } + } + } +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/WorldProviderSurfaceWorld.java b/net/phoenixinquis/minecraft/surfaceworld/WorldProviderSurfaceWorld.java new file mode 100644 index 0000000..a6af5e0 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/WorldProviderSurfaceWorld.java @@ -0,0 +1,23 @@ +package net.phoenixinquis.minecraft.surfaceworld; + +import net.minecraft.world.WorldProvider; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.WorldChunkManagerHell; +import net.minecraft.world.chunk.IChunkProvider; + +public class WorldProviderSurfaceWorld extends WorldProvider { + + @Override + public String getDimensionName() { + return "SurfaceWorld"; + } + + public void registerWorldChunkManager() { + this.worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.taigaHills, 0.2F, 0.1F); + this.dimensionId = SurfaceWorld.dimensionId; + } + + public IChunkProvider createChunkGenerator() { + return new ChunkProviderSurfaceWorld(worldObj, worldObj.getSeed(), true); + } +} diff --git a/net/phoenixinquis/minecraft/surfaceworld/client/ClientProxy.java b/net/phoenixinquis/minecraft/surfaceworld/client/ClientProxy.java new file mode 100644 index 0000000..9e67955 --- /dev/null +++ b/net/phoenixinquis/minecraft/surfaceworld/client/ClientProxy.java @@ -0,0 +1,12 @@ +package net.phoenixinquis.minecraft.surfaceworld.client; + +import net.phoenixinquis.minecraft.surfaceworld.CommonProxy; + +public class ClientProxy extends CommonProxy { + + @Override + public void registerRenderers() { + // This is for rendering entities and so forth later on + } + +} \ No newline at end of file