package com.sijobe.spc.command; import com.sijobe.spc.validation.Parameter; import com.sijobe.spc.validation.ParameterString; import com.sijobe.spc.validation.Parameters; import com.sijobe.spc.wrapper.CommandException; import com.sijobe.spc.wrapper.CommandSender; import com.sijobe.spc.wrapper.Coordinate; import com.sijobe.spc.wrapper.Player; import java.lang.reflect.Method; import net.minecraft.src.EntityDragon; import net.minecraft.src.EntityPlayerMP; import net.minecraft.src.MathHelper; import net.minecraft.src.Teleporter; import java.util.List; /** * Command spawns the specified type of portal * * @author q3hardcore * @version 1.0 */ @Command ( name = "spawnportal", description = "Spawns a portal at the players location", example = "nether", version = "1.0" ) public class SpawnPortal extends StandardCommand { /** * Specifies the parameters of the command */ private static final Parameters PARAMETERS = new Parameters ( new Parameter[] { new ParameterString("<end|nether>",false), } ); /** * @see com.sijobe.spc.wrapper.CommandBase#execute(net.minecraft.src.ICommandSender, java.util.List) */ @Override public void execute(CommandSender sender, List<?> params) throws CommandException { Player player = super.getSenderAsPlayer(sender); String portalType = (String)params.get(0); if (portalType.equalsIgnoreCase("end")) { Coordinate coord = player.getPosition(); int x = MathHelper.floor_double(coord.getX()); int z = MathHelper.floor_double(coord.getZ()); EntityDragon entityDragon = new EntityDragon(player.getWorld().getMinecraftWorld()); // EntityDragon try { Class<?>[] args = new Class<?>[]{Integer.TYPE, Integer.TYPE}; Method method; try { method = entityDragon.getClass().getDeclaredMethod("c", args); } catch (NoSuchMethodException nsme) { method = entityDragon.getClass().getDeclaredMethod("createEnderPortal", args); } method.setAccessible(true); method.invoke(entityDragon, new Object[]{x, z}); } catch (Throwable t) { t.printStackTrace(); throw new CommandException("End portal generation is currently unsupported."); } } else if (portalType.equalsIgnoreCase("nether")) { EntityPlayerMP playerEntity; if(player.getMinecraftPlayer() instanceof EntityPlayerMP) { playerEntity = (EntityPlayerMP)player.getMinecraftPlayer(); } else { throw new CommandException("SPC should *NOT* be processing commands client-side!"); } (new Teleporter(playerEntity.getServerForPlayer())).makePortal(playerEntity); } else { throw new CommandException("Invalid portal type specified."); } } /** * @see com.sijobe.spc.wrapper.CommandBase#getParameters() */ @Override public Parameters getParameters() { return PARAMETERS; } }