diff --git a/electrical/src/main/java/resonantinduction/quantum/gate/PartQuantumGlyph.java b/electrical/src/main/java/resonantinduction/quantum/gate/PartQuantumGlyph.java index 967405239..a47aa766a 100644 --- a/electrical/src/main/java/resonantinduction/quantum/gate/PartQuantumGlyph.java +++ b/electrical/src/main/java/resonantinduction/quantum/gate/PartQuantumGlyph.java @@ -14,7 +14,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; -import resonantinduction.core.ResonantInduction; import resonantinduction.electrical.Electrical; import universalelectricity.api.vector.VectorWorld; import codechicken.lib.data.MCDataInput; @@ -33,19 +32,21 @@ public class PartQuantumGlyph extends JCuboidPart implements JNormalOcclusion, I static { - bounds[0] = new Cuboid6(0, 0, 0, 0.5, 0.5, 0.5); - bounds[1] = new Cuboid6(0, 0, 0.5, 0.5, 0.5, 1); - bounds[2] = new Cuboid6(0.5, 0, 0, 1, 0.5, 0.5); - bounds[3] = new Cuboid6(0.5, 0, 0.5, 1, 0.5, 1); + float expansion = -0.02f; + bounds[0] = new Cuboid6(0, 0, 0, 0.5, 0.5, 0.5).expand(expansion); + bounds[1] = new Cuboid6(0, 0, 0.5, 0.5, 0.5, 1).expand(expansion); + bounds[2] = new Cuboid6(0.5, 0, 0, 1, 0.5, 0.5).expand(expansion); + bounds[3] = new Cuboid6(0.5, 0, 0.5, 1, 0.5, 1).expand(expansion); - bounds[4] = new Cuboid6(0, 0.5, 0, 0.5, 1, 0.5); - bounds[5] = new Cuboid6(0, 0.5, 0.5, 0.5, 1, 1); - bounds[6] = new Cuboid6(0.5, 0.5, 0, 1, 1, 0.5); - bounds[7] = new Cuboid6(0.5, 0.5, 0.5, 1, 1, 1); + bounds[4] = new Cuboid6(0, 0.5, 0, 0.5, 1, 0.5).expand(expansion); + bounds[5] = new Cuboid6(0, 0.5, 0.5, 0.5, 1, 1).expand(expansion); + bounds[6] = new Cuboid6(0.5, 0.5, 0, 1, 1, 0.5).expand(expansion); + bounds[7] = new Cuboid6(0.5, 0.5, 0.5, 1, 1, 1).expand(expansion); } private byte side; byte number; + int ticks; public void preparePlacement(int side, int itemDamage) { @@ -69,7 +70,14 @@ public class PartQuantumGlyph extends JCuboidPart implements JNormalOcclusion, I @Override public void onEntityCollision(Entity entity) { - transport(entity); + if (!world().isRemote) + { + if (entity instanceof EntityPlayer) + if (!((EntityPlayer) entity).isSneaking()) + return; + + transport(entity); + } } @Override @@ -94,7 +102,8 @@ public class PartQuantumGlyph extends JCuboidPart implements JNormalOcclusion, I { IQuantumGate gate = gates.get(gates.size() > 1 ? entity.worldObj.rand.nextInt(gates.size() - 1) : 0); VectorWorld position = new VectorWorld((TileEntity) gate).translate(0.5, 2, 0.5); - QuantumGateManager.moveEntity(entity, position); + if (QuantumGateManager.moveEntity(entity, position)) + world().playSoundAtEntity(entity, "mob.endermen.portal", 1.0F, 1.0F); } } } @@ -102,6 +111,10 @@ public class PartQuantumGlyph extends JCuboidPart implements JNormalOcclusion, I @Override public void update() { + if (ticks == 0) + FrequencyGrid.instance().register((IQuantumGate) tile()); + ticks++; + if (world().isRemote) { int frequency = ((IBlockFrequency) tile()).getFrequency(); diff --git a/electrical/src/main/java/resonantinduction/quantum/gate/QuantumGateManager.java b/electrical/src/main/java/resonantinduction/quantum/gate/QuantumGateManager.java index a4d697a81..de9d3462a 100644 --- a/electrical/src/main/java/resonantinduction/quantum/gate/QuantumGateManager.java +++ b/electrical/src/main/java/resonantinduction/quantum/gate/QuantumGateManager.java @@ -8,102 +8,109 @@ import java.util.Iterator; import java.util.List; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.Teleporter; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorWorld; public class QuantumGateManager { - private static HashMap managerList = new HashMap(); - private HashSet teleporters = new HashSet(); - private static HashMap coolDown = new HashMap(); + private static HashMap playerCooldown = new HashMap(); - public static QuantumGateManager getManagerForDim(int dim) + protected static boolean moveEntity(Entity currentEntity, final VectorWorld location) { - if (managerList.get(dim) == null) + if (currentEntity != null && location != null && location.world instanceof WorldServer) { - managerList.put(dim, new QuantumGateManager()); - } - - return managerList.get(dim); - } + location.world.markBlockForUpdate(location.intX(), location.intY(), location.intZ()); - /** Adds a teleport anchor to this list or anchors */ - public static void addAnchor(TileQuantumGate anch) - { - if (anch != null) - { - QuantumGateManager manager = getManagerForDim(anch.worldObj.provider.dimensionId); - - if (!manager.teleporters.contains(anch)) + int dimID = location.world.provider.dimensionId; + + if (currentEntity instanceof EntityPlayerMP) { - manager.teleporters.add(anch); - } - } - } - - /** Removes a teleport anchor to this list or anchors */ - public static void remAnchor(TileQuantumGate anch) - { - if (anch != null) - { - QuantumGateManager manager = getManagerForDim(anch.worldObj.provider.dimensionId); - manager.teleporters.remove(anch); - } - } - - public static HashSet getConnectedAnchors(World world) - { - return getManagerForDim(world.provider.dimensionId).teleporters; - } - - public boolean contains(TileQuantumGate anch) - { - return teleporters.contains(anch); - } - - public static TileQuantumGate getClosestWithFrequency(VectorWorld vec, int frequency, TileQuantumGate... anchors) - { - TileQuantumGate tele = null; - List ignore = new ArrayList(); - if (anchors != null) - { - ignore.addAll(Arrays.asList(anchors)); - } - Iterator it = new ArrayList(QuantumGateManager.getConnectedAnchors(vec.world)).iterator(); - while (it.hasNext()) - { - TileQuantumGate teleporter = it.next(); - if (!ignore.contains(teleporter) && teleporter.getFrequency() == frequency) - { - if (tele == null || new Vector3(tele).distance(vec) > new Vector3(teleporter).distance(vec)) + if (playerCooldown.get(((EntityPlayerMP) currentEntity).username) == null || (System.currentTimeMillis() - playerCooldown.get(((EntityPlayerMP) currentEntity).username) > 2000)) { - tele = teleporter; - } - } - } - return tele; - } + EntityPlayerMP player = (EntityPlayerMP) currentEntity; - protected static void moveEntity(Entity entity, VectorWorld location) - { - if (entity != null && location != null) - { - location.world.markBlockForUpdate((int) location.x, (int) location.y, (int) location.z); - - if (entity instanceof EntityPlayerMP) - { - if (coolDown.get(((EntityPlayerMP) entity).username) == null || (System.currentTimeMillis() - coolDown.get(((EntityPlayerMP) entity).username) > 30)) - { - ((EntityPlayerMP) entity).playerNetServerHandler.setPlayerLocation(location.x, location.y, location.z, 0, 0); - coolDown.put(((EntityPlayerMP) entity).username, System.currentTimeMillis()); + if (location.world != currentEntity.worldObj) + { + Teleporter dummyTeleporter = new Teleporter((WorldServer) location.world) + { + @Override + public void placeInPortal(Entity teleportEntity, double x, double y, double z, float par8) + { + teleportEntity.setLocationAndAngles(location.x, location.y, location.z, teleportEntity.rotationYaw, 0.0F); + teleportEntity.motionX = teleportEntity.motionY = teleportEntity.motionZ = 0.0D; + } + }; + + player.mcServer.getConfigurationManager().transferPlayerToDimension(player, dimID, dummyTeleporter); + } + else + { + player.playerNetServerHandler.setPlayerLocation(location.x, location.y, location.z, 0, 0); + } + + playerCooldown.put(((EntityPlayerMP) currentEntity).username, System.currentTimeMillis()); + return true; } } else { - entity.setPosition(location.x, location.y, location.z); + if (location.world != currentEntity.worldObj) + { + + currentEntity.worldObj.theProfiler.startSection("changeDimension"); + MinecraftServer minecraftserver = MinecraftServer.getServer(); + int j = currentEntity.dimension; + WorldServer worldserver = minecraftserver.worldServerForDimension(j); + WorldServer worldserver1 = minecraftserver.worldServerForDimension(dimID); + currentEntity.dimension = dimID; + + if (j == 1 && dimID == 1) + { + worldserver1 = minecraftserver.worldServerForDimension(0); + currentEntity.dimension = 0; + } + + currentEntity.worldObj.removeEntity(currentEntity); + currentEntity.isDead = false; + currentEntity.worldObj.theProfiler.startSection("reposition"); + minecraftserver.getConfigurationManager().transferEntityToWorld(currentEntity, j, worldserver, worldserver1); + currentEntity.worldObj.theProfiler.endStartSection("reloading"); + Entity entity = EntityList.createEntityByName(EntityList.getEntityString(currentEntity), worldserver1); + + if (entity != null) + { + entity.copyDataFrom(currentEntity, true); + + if (j == 1 && dimID == 1) + { + ChunkCoordinates chunkcoordinates = worldserver1.getSpawnPoint(); + chunkcoordinates.posY = currentEntity.worldObj.getTopSolidOrLiquidBlock(chunkcoordinates.posX, chunkcoordinates.posZ); + entity.setLocationAndAngles((double) chunkcoordinates.posX, (double) chunkcoordinates.posY, (double) chunkcoordinates.posZ, entity.rotationYaw, entity.rotationPitch); + } + + worldserver1.spawnEntityInWorld(entity); + } + + currentEntity.isDead = true; + currentEntity.worldObj.theProfiler.endSection(); + worldserver.resetUpdateEntityTick(); + worldserver1.resetUpdateEntityTick(); + currentEntity.worldObj.theProfiler.endSection(); + return true; + } + + currentEntity.setPosition(location.x, location.y, location.z); + return true; } + } + return false; } } diff --git a/electrical/src/main/java/resonantinduction/quantum/gate/RenderQuantumGlyph.java b/electrical/src/main/java/resonantinduction/quantum/gate/RenderQuantumGlyph.java index 5231c430f..61f75e1c5 100644 --- a/electrical/src/main/java/resonantinduction/quantum/gate/RenderQuantumGlyph.java +++ b/electrical/src/main/java/resonantinduction/quantum/gate/RenderQuantumGlyph.java @@ -25,8 +25,7 @@ public class RenderQuantumGlyph implements ISimpleItemRenderer { GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - Cuboid6 bound = part.getBounds().copy(); - bound.expand(-0.02); + Cuboid6 bound = part.getBounds(); RenderUtility.bind(TextureMap.locationBlocksTexture); RenderUtility.renderCube(bound.min.x, bound.min.y, bound.min.z, bound.max.x, bound.max.y, bound.max.z, Block.stone, RenderUtility.getIcon(Reference.PREFIX + "glyph_" + part.number)); GL11.glPopMatrix(); diff --git a/src/main/resources/assets/resonantinduction/textures/items/insulation.png b/src/main/resources/assets/resonantinduction/textures/items/insulation.png new file mode 100644 index 000000000..b279b1b74 Binary files /dev/null and b/src/main/resources/assets/resonantinduction/textures/items/insulation.png differ