Posted April 22, 201411 yr Gettin' a little tired of putting nether portals all over the place in the game when trying to /home. Since forgeessentials hasn't been worked on for a while I'm trying to code my own. What is the best way to move an entity from one world to an another without creating those obsidian gateways?
April 22, 201411 yr entity.travelToDimension(dimensionID); (-1 for nether) although this spawn a portal in the nether. My mod for futher awesomeness: http://www.minecraftforum.net/topic/1714396-the-decopack-collection-v010-wip-made-a-signature-new-snapshot-1-screenshots-are-up-small-snapshot-1-is-out-for-147/#entry21250399
April 22, 201411 yr Author Unfortuntely I'm trying to avoid those portal all together. The code I'm doing this for is so the player can /home, do what he needs to, then /back to where he went. In most cases, he certainly didn't have a nether portal near him when he left that dimension so... yea.
April 22, 201411 yr Problem, sry don't know how to fix, maybe check i WorldProvider for something useful. My mod for futher awesomeness: http://www.minecraftforum.net/topic/1714396-the-decopack-collection-v010-wip-made-a-signature-new-snapshot-1-screenshots-are-up-small-snapshot-1-is-out-for-147/#entry21250399
April 22, 201411 yr You could do what Godis_apan said and add code to delete the portal as soon as it spawns, not an elegant solution but it might work Creator of Metroid Cubed! Power Suits, Beams, Hypermode and more! http://i.imgur.com/ghgWmA3.jpg[/img]
April 22, 201411 yr That's smart, when the teleport happens just make a three for loops increasing the x, y, z like this. for (int i = player.posX - 5; i < player.posX + 5; i++) { for (int j = player.posY - 5; j < player.posX + 5; j++) { for (int k = player.posZ - 5; k < player.posX + 5; k++) { if (world.getBlock(i, j k) == Blocks.obsidian || world.getBlock(i, j k) == Blocks.portal) { world.setBlockToAir(i, j, k); } } } } Something like that. My mod for futher awesomeness: http://www.minecraftforum.net/topic/1714396-the-decopack-collection-v010-wip-made-a-signature-new-snapshot-1-screenshots-are-up-small-snapshot-1-is-out-for-147/#entry21250399
April 22, 201411 yr Author I understand that method would work, though I'm not a real big fan of it because it feels more like a hack than a solution. For example, if they happen to be standing on obsidian, like a lava lake turned obsidian from a firestone, then this'll end up deleting obsidian blocks that didn't come from a portal. I'm looking at possibly grabbing the worldserver for their source and destination worlds and telling them to remove and add the player respectively, then update their position. I don't think this'll work but it's worth a shot. //WorldServer start = DimensionManager.getWorld(plyr.dimension); //start.getPlayerManager().removePlayer(plyr); WorldServer overworld = DimensionManager.getWorld(0); overworld.getPlayerManager().addPlayer(plyr); ChunkCoordinates c = overworld.getSpawnPoint(); plyr.setPositionAndUpdate(c.posX, c.posY, c.posZ); Edit: This was a fail.
April 23, 201411 yr Create your own teleported class and a command to call it. You will need to specify where to go in the destination dimension somehow. Long time Bukkit & Forge Programmer Happy to try and help
April 23, 201411 yr Author Create your own teleported class and a command to call it. You will need to specify where to go in the destination dimension somehow. Do you have some example code to show this? I've yet to see a way to get around making a portal in game without effectively recreating the CommandServerTP class.
April 23, 201411 yr I can share one tonight. The basics are you need your own command. Assuming you know how to do that. From it you call your teleported code. The trick is to override the methods in such a way it only does what you want. Long time Bukkit & Forge Programmer Happy to try and help
April 23, 201411 yr Author That would be extremely helpful Delpi, thank you. I have the commands ready to go aside from that one piece.
April 23, 201411 yr without effectively recreating the CommandServerTP class. What's wrong with that? That is probably the way you would want to do it, and I think delpi is proposing to give you such an example. Logically it sounds like what you want -- a custom command that teleports. Check out my tutorials here: http://jabelarminecraft.blogspot.com/
April 24, 201411 yr Here is something that works for me. I've done it different ways, but you should be able to modify this to suit your purposes. package clandoolittle.dimension_multiplyer.Common.Worlds.Teleporters; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.logging.Level; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModContainer; import clandoolittle.dimension_multiplyer.Dimension_Multiplyer; import clandoolittle.dimension_multiplyer.Common.Worlds.World.World_Properties; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.server.MinecraftServer; import net.minecraft.util.Direction; import net.minecraft.util.LongHashMap; import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.Teleporter; import net.minecraft.world.World; import net.minecraft.world.WorldServer; public class MyTeleporter extends Teleporter { // Setup Variables public Dimension_Multiplyer instance = Dimension_Multiplyer.instance; // Setup Specific Variables private WorldServer worldserver; public MyTeleporter(WorldServer worldserver) { super(worldserver); // Setup Variables this.worldserver = worldserver; } // Move the Entity to the portal public void teleport(Entity entity, World world) { // Setup Variables EntityPlayerMP playerMP = (EntityPlayerMP) entity; // Get name of world String world_name = instance.world_manager().name(world.provider.dimensionId); // Set default location double dx = 0; double dy = 0; double dz = 0; // Check world_properties for spawn World_Properties world_property = instance.world_manager().world_properties().get(world.provider.dimensionId); if (world_property != null) { dx = world_property.spawn_x(); dy = world_property.spawn_y(); dz = world_property.spawn_z(); } // check for zeros if (dx == 0 && dy == 0 && dz == 0) { // Set height to something big dy = 250; // Drop down until find solid while (world.getBlock((int) dx, (int) dy - 1, (int) dz).equals(Blocks.air) && dy > 0) { dy--; } // Last check if dy == 0 if (dy == 0) { dy = 128; } } // Offset locations for accuracy dx = dx + 0.5d; dy = dy + 1.0d; dz = dz + 0.5d; entity.setPosition(dx, dy, dz); // Freeze motion entity.motionX = entity.motionY = entity.motionZ = 0.0D; entity.setPosition(dx, dy, dz); // silly to do this multiple time,s but it kept offseting entity until this was done // Set Dimension if (entity.worldObj.provider.dimensionId != world.provider.dimensionId) { playerMP.mcServer.getConfigurationManager().transferPlayerToDimension(playerMP, world.provider.dimensionId, this); } entity.setPosition(dx, dy, dz); // silly to do this multiple time,s but it kept offseting entity until this was done // instance.logger.log(Level.INFO, "Teleported to " + world_name + ":" + dx + "/" + dy + "/" + dz); } // Override Default BS @Override public boolean placeInExistingPortal(Entity par1Entity, double par2, double par4, double par6, float par8) { return false; } @Override public void removeStalePortalLocations(long par1) { } @Override public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8) { } } Then setup a custom command to call it with something similar to this. new MyTeleporter(minecraftserver.worldServerForDimension(world.provider.dimensionId)).teleport(target, world); Let me know how it goes. Long time Bukkit & Forge Programmer Happy to try and help
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.