Jump to content

JakeNelson1999

Members
  • Posts

    26
  • Joined

  • Last visited

Everything posted by JakeNelson1999

  1. I'm trying to create a Minecraft Bot that can place blocks in the order set by the user. I'm having trouble moving items from the inventory to the hotbar, just wondering if there's any simple solution out there. Thanks, Jake.
  2. I'm looking for a way to move an item from the players inventory to the hotbar.
  3. @diesieben07 Hey there thanks for the suggestion, sorry I didnt see this earlier.
  4. So I'm currently using WorldDownloader's reflection utils which work wonders: package com.jakenelson1999.cactusbot.utils; import java.lang.reflect.Field; /** * Reflection utilities. */ public class ChunkUtils { /** * Uses Java's reflection API to get access to an unaccessible field * * @param typeOfClass * Class that the field should be read from * @param typeOfField * The type of the field * @return An Object of type Field */ public static Field stealField(Class<?> typeOfClass, Class<?> typeOfField) { Field[] fields = typeOfClass.getDeclaredFields(); for (Field f : fields) { if (f.getType().equals(typeOfField)) { try { f.setAccessible(true); return f; } catch (Exception e) { throw new RuntimeException( "WorldDownloader: Couldn't steal Field of type \"" + typeOfField + "\" from class \"" + typeOfClass + "\" !", e); } } } throw new RuntimeException( "WorldDownloader: Couldn't steal Field of type \"" + typeOfField + "\" from class \"" + typeOfClass + "\" !"); } /** * Uses Java's reflection API to get access to an unaccessible field * * @param object * Object that the field should be read from or the type of the * object if the field is static * @param typeOfField * The type of the field * @return The value of the field */ public static <T> T stealAndGetField(Object object, Class<T> typeOfField) { Class<?> typeOfObject; if (object instanceof Class<?>) { // User asked for static field: typeOfObject = (Class<?>) object; object = null; } else { typeOfObject = object.getClass(); } try { Field f = stealField(typeOfObject, typeOfField); return typeOfField.cast(f.get(object)); } catch (Exception e) { throw new RuntimeException( "WorldDownloader: Couldn't get Field of type \"" + typeOfField + "\" from object \"" + object + "\" !", e); } } /** * Uses Java's reflection API to set the value of an unaccessible field * * @param object * Object that the field should be read from or the type of the * object if the field is static * @param typeOfField * The type of the field * @param value * The value to set the field to. */ public static void stealAndSetField(Object object, Class<?> typeOfField, Object value) { Class<?> typeOfObject; if (object instanceof Class) { // User asked for static field: typeOfObject = (Class<?>) object; object = null; } else { typeOfObject = object.getClass(); } try { Field f = stealField(typeOfObject, typeOfField); f.set(object, value); } catch (Exception e) { throw new RuntimeException( "WorldDownloader: Couldn't set Field of type \"" + typeOfField + "\" from object \"" + object + "\" to " + value + "!", e); } } /** * Uses Java's reflection API to get access to an unaccessible field * * @param object * Object that the field should be read from or the type of the * object if the field is static * @param typeOfField * The type of the field * @return The value of the field */ public static <T> T stealAndGetField(Object object, Class<?> typeOfObject, Class<T> typeOfField) { try { Field f = stealField(typeOfObject, typeOfField); return typeOfField.cast(f.get(object)); } catch (Exception e) { throw new RuntimeException( "WorldDownloader: Couldn't get Field of type \"" + typeOfField + "\" from object \"" + object + "\" !", e); } } /** * Uses Java's reflection API to set the value of an unaccessible field * * @param object * Object that the field should be read from or the type of the * object if the field is static * @param typeOfObject * The type that the given field is located in. * @param typeOfField * The type of the field * @param value * The value to set the field to. */ public static void stealAndSetField(Object object, Class<?> typeOfObject, Class<?> typeOfField, Object value) { try { Field f = stealField(typeOfObject, typeOfField); f.set(object, value); } catch (Exception e) { throw new RuntimeException( "WorldDownloader: Couldn't set Field of type \"" + typeOfField + "\" from object \"" + object + "\" to " + value + "!", e); } } } To go through all loaded chunks you may simply do: public boolean isSpawnerNearby() { CactusBot.printToChat("Task tick!"); // Get the ChunkProviderClient from WorldClient ChunkProviderClient chunkProvider = (ChunkProviderClient) Minecraft.getMinecraft().theWorld.getChunkProvider(); // Get the list of all loaded chunks. List<?> chunks = ChunkUtils.stealAndGetField(chunkProvider, List.class); for (int currentChunk = 0; currentChunk < chunks.size(); currentChunk++) { Chunk c = (Chunk) chunks.get(currentChunk); for (int xx = 0; xx < 16; xx++) { for (int zz = 0; zz < 16; zz++) { for (int yy = 0; yy < 256; yy++) { Block block = c.getBlock(xx, yy, zz); if (block instanceof BlockMobSpawner) { CactusBot.printToChat("Found mob spawner " + xx + ", " + yy + ", " + zz); CactusBot.printToChat("chunk x start " + c.getChunkCoordIntPair().getXStart()); CactusBot.printToChat("chunk y start " + c.getChunkCoordIntPair().getZStart()); return true; } } } } } return false; }
  5. It's not a hack. It's a tool. I'll post the updated code into here for anyone else who wants to have a look!
  6. Thanks, that helps although the only issue is that it won't get loaded chunks, it'll be hard coded if I use that code. Is there not a way to access currently loaded chunks?
  7. Thanks haha I have no idea. I'm finding it hard to find information on this kind of stuff. Do you know whether there is an iterative get that I can do for loaded chunks though? Help would be greatly appreciated.
  8. The main class I'm using for the searching nearby chunks client side: package com.jakenelson1999.cactusbot.tasks; import com.jakenelson1999.cactusbot.CactusBot; import com.jakenelson1999.cactusbot.CactusController; import com.jakenelson1999.cactusbot.CactusTask; import net.minecraft.client.Minecraft; import net.minecraft.init.Blocks; import net.minecraftforge.common.util.BlockSnapshot; public class SearchForSpawner implements CactusTask { public boolean taskComplete = false; public SearchForSpawner(double destx, double desty, double destz, boolean walktoloc) { CactusController.setDelay(5000); } @Override public String getTaskName() { return "Spawner Find"; } @Override public String getTaskDescription() { return "Finds a spawner by walking across the top of the nether."; } @Override public boolean isTaskComplete() { return taskComplete; } @Override public void taskTick() { testDetect(); } @Override public void endTask() { } public boolean testDetect(){ /* This part here is not functioning! :( */ CactusBot.printToChat("Task tick!"); for(BlockSnapshot b : Minecraft.getMinecraft().theWorld.capturedBlockSnapshots){ if(b.getCurrentBlock().getBlock().getMaterial().equals(Blocks.mob_spawner.getMaterial())){ CactusBot.printToChat("Mob Spawner detected!!"); } CactusBot.printToChat(b.getCurrentBlock().getBlock()+""); } return true; } } Note: I've setup an interface for bot tasks, although it's a WIP.
  9. Hey there I'm working on a client side bot mod that I want to be able to search loaded nearby chunks for a particular block type, although currntly I'm unable to find a way to loop through loaded chunks / blocks. Help would be greatly appreciated. I've decided to upload the class files instead of pasting them as there are quite a few. src.zip
  10. I've found the player.inventory.setInventorySlotContents(player.inventory.currentItem, new function although it looks like many of these inventory functions just change the client and gets unchanged when the server updates the client. Help would be greatly appreciated.
  11. Hi there, I'm looking for a client side solution to moving items from the inventory to hotbar, this is for a Minecraft Mining bot that I'm working on. package com.jakenelson1999.cactusbot; import java.util.List; import com.jakenelson1999.cactusbot.threads.GoToLocThread; import com.jakenelson1999.cactusbot.threads.StackUpThread; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.command.CommandException; import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; public class CactusCMD implements ICommand { @Override public int compareTo(Object o) { // TODO Auto-generated method stub return 0; } @Override public String getName() { // TODO Auto-generated method stub return "cactus"; } @Override public String getCommandUsage(ICommandSender sender) { // TODO Auto-generated method stub return "/cactus"; } @Override public List getAliases() { // TODO Auto-generated method stub return null; } @Override public void execute(ICommandSender sender, String[] args) throws CommandException { EntityPlayerMP player = (EntityPlayerMP)sender; if (args[0].toLowerCase().contains("goto")){ cactusbot.printToChat("Going to "+args[1]+", "+args[2]+", "+args[3]); GoToLocThread.setLocX(Double.valueOf(args[1])); GoToLocThread.setLocY(Double.valueOf(args[2])); GoToLocThread.setLocZ(Double.valueOf(args[3])); GoToLocThread.setDestFound(false); } if(args[0].toLowerCase().contains("stack")){ cactusbot.printToChat("Stacking."); StackUpThread.height = Integer.valueOf(args[1])*2; } if(args[0].toLowerCase().contains("request")){ // Move item from inventory to hotbar requested by item id. } } @Override public boolean canCommandSenderUse(ICommandSender sender) { // TODO Auto-generated method stub return true; } @Override public List addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { // TODO Auto-generated method stub return null; } @Override public boolean isUsernameIndex(String[] args, int index) { // TODO Auto-generated method stub return false; } }
  12. I've been looking at this for the past 10 hours. I'm still stuck looking for solutions. I think the packet idea is how I would go through with it. The problem is I haven't got the ability to code in raw packets. Help would be greatly appreciated Jake.
  13. "Item right click" Sorry bro i don't think you understand what im trying to do I just want a mod that will put all the items in a chest into the players inventory. It should be very simple to do but now I've got a headache and have drank 10 cups of coffee so far. If anyone else has a simple solution please feel free to post it before i die inside. Thanks, Jake!
  14. Hey sorry for bugging you guys but i feel completely out of my depth. So I get the basic idea of packets - Packets are used by server and client to send information - Theres a different id and piece of data recieved by the server for each action in minecraft. - Theres a particular id for transfering items from the chest to player's inventory My questions are: - Is there a list of packet ids I could use? - Is there a non-packet way to do this, packets seem very scary.
  15. That sounds like an incredibly daunting task This is my first mod, So any further help would be appreciated haha. Thanks, Jake.
  16. It'll probably be easier if you have the full code. package com.jakenelson1999.mods.cmds; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Timer; import java.util.TimerTask; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.client.settings.KeyBinding; import net.minecraft.command.CommandException; import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.settings.KeyBindingMap; import net.minecraftforge.fml.client.FMLClientHandler; public class TestPluginCommand implements ICommand { @Override public int compareTo(ICommand o) { return 0; } @Override public String getCommandName() { return "jakeplugin"; } @Override public String getCommandUsage(ICommandSender sender) { return "/jakeplugin help"; } @Override public List<String> getCommandAliases() { return null; } @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { if(args[0].equalsIgnoreCase("debug")){ // The following code scans in a 10 block range around the player for a chest. int range = 10; double playerx = MathHelper.floor_double(Minecraft.getMinecraft().thePlayer.posX); double playery = MathHelper.floor_double(Minecraft.getMinecraft().thePlayer.posY); double playerz = MathHelper.floor_double(Minecraft.getMinecraft().thePlayer.posZ); double chestx = 0; double chesty = 0; double chestz = 0; for (double x = playerx - range; x < playerx+range; x++){ for (double y = playery - range; y < playery+range; y++){ for (double z = playerz - range; z < playerz+range; z++){ if(Minecraft.getMinecraft().thePlayer.getEntityWorld().getBlockState(new BlockPos(x, y, z)).toString().toLowerCase().contains("chest")){ System.out.println(x+" "+y+" "+z); chestx = x; chesty = y; chestz = z; } } } } // The pitch and yaw values are calculated using mathsey stuff. double xDiff = chestx - playerx; double yDiff = chesty - 1 - playery; double zDiff = chestz - playerz; double DistanceXZ = Math.sqrt(xDiff * xDiff + zDiff * zDiff); double DistanceY = Math.sqrt(DistanceXZ * DistanceXZ + yDiff * yDiff); double newYaw = Math.acos(xDiff / DistanceXZ) * 180 / Math.PI; double newPitch = Math.acos(yDiff / DistanceY) * 180 / Math.PI - 90; if (zDiff < 0.0) newYaw = newYaw + Math.abs(180 - newYaw) * 2; newYaw = (newYaw - 90); float yaw = (float) newYaw; float pitch = (float) newPitch; float headyaw = (float) newYaw; // The player looks perfectly at the chest. So this works! Minecraft.getMinecraft().thePlayer.setAngles(yaw, pitch); Minecraft.getMinecraft().thePlayer.setLocationAndAngles(Minecraft.getMinecraft().thePlayer.posX, Minecraft.getMinecraft().thePlayer.posY, Minecraft.getMinecraft().thePlayer.posZ, yaw, pitch); // A New thread is started // (I don't want to sleep the main thread or the game would pause) final Thread thread = new Thread(){ public void run(){ try {this.sleep(500);} catch (InterruptedException e) {} // Make the player right click and open the chest // This works perfectly fine KeyBinding.onTick(Minecraft.getMinecraft().gameSettings.keyBindUseItem.getKeyCode()); try {this.sleep(500);} catch (InterruptedException e) {} //This is where the problem lies. When taking items out the chest, they are only moved // temporarily. Thanks to whoever is reading this for taking the time to help me! // Save the player as 'player' EntityPlayer player = FMLClientHandler.instance().getClient().thePlayer; //Transfer the item in slot 1 to the player? player.openContainer.transferStackInSlot(player, 1); // Give the action time to settle try {this.sleep(100);} catch (InterruptedException e) {} // Update the changes player.openContainer.detectAndSendChanges(); try {this.sleep(100);} catch (InterruptedException e) {} player.inventoryContainer.detectAndSendChanges(); } }; // Start the thread. thread.start(); } } } } @Override public boolean checkPermission(MinecraftServer server, ICommandSender sender) { return true; } @Override public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) { return null; } @Override public boolean isUsernameIndex(String[] args, int index) { return false; } }
  17. Thanks a lot Choonster! This is the code I wrote from Choonster's answer if anyone needs it Collection<NetworkPlayerInfo> InfoMap = Minecraft.getMinecraft().getConnection().getPlayerInfoMap(); for (final NetworkPlayerInfo networkplayerinfo : InfoMap) { System.out.println(networkplayerinfo.getGameProfile().getName()) } It logs all currently online players usernames.
  18. Hi There, I'm Jake. At the moment I'm trying to work on a mod which lets you transfer all items from the currently open chest to inventory. After looking on the forums for a few hours I found the function transferstackinslot The current code looks like this: player.openConainer.transferStackInSlot(player, 1); player.openContainer.detectAndSendChanges(); player.inventoryContainer.detectAndSendChanges(); The only issue is the items aren't actually moved, it's only client sided, so once it's updated the items disappear. Help would be greatly appreciated!! Jake.
  19. Open the GuiPlayerTabOverlay class and navigate to the renderPlayerlist method. The first two lines retrieve the List<NetworkPlayerInfo> used to render the overlay. Thanks a lot , I think i can work with that. The only problem I have now is how do I make the mod client side? (Allowing it to access Bukkit/Spigot/vanilla servers while running the mod).
  20. Sorry im a bit of a noob how would that work
  21. Yep that's correct! I couldn't really find a solution on the forums ;(
  22. Hi there, I'm Jake . I'm pretty new to Forge Modding, although I've been coding in bukkit for several years. Anyway attempting a project I've run into a few issues. Heres my code: TabList.java [embed=425,349]package com.jakenelson19.tablist; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.Mod.Instance; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @Mod(modid=Reference.MOD_ID, name=Reference.MOD_NAME, version=Reference.VERSION) public class TabList { @Instance(Reference.MOD_ID) public static TabList instance; @EventHandler public void preInit(FMLPreInitializationEvent event) { FMLCommonHandler.instance().bus().register(new DeathHandler()); System.out.println("Event Handler Initialized"); } @EventHandler public void load(FMLInitializationEvent event) {} @EventHandler public void postInit(FMLPostInitializationEvent event) {} } [/embed] DeathHandler.java [embed=425,349]package com.jakenelson19.tablist; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent; public class DeathHandler { @SubscribeEvent public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { //event.player.addChatMessage(new TextComponentString(event.player.getDisplayName() + " is testing chat messages")); event.player.addChatMessage(new TextComponentString("testing chat messages")); ResourceLocation text = Minecraft.getMinecraft().ingameGUI.getTabList().ICONS; event.player.addChatMessage(new TextComponentString(""+text)); } @SubscribeEvent public void onPlayerLogin(PlayerEvent.PlayerRespawnEvent event) { //event.player.addChatMessage(new TextComponentString(event.player.getDisplayName() + " is testing chat messages")); event.player.addChatMessage(new TextComponentString("testing chat messages")); ResourceLocation text = Minecraft.getMinecraft().ingameGUI.getTabList().ICONS; event.player.addChatMessage(new TextComponentString(""+text)); } }[/embed] Issues: 1) I want the mod to run client side only, so that i can connect to normal servers and have it running. Currently the mods don't work on normal servers 2) The main thing i'm trying to achieve is to take all the users in the tablist, and put them into a java hashmap / array I'd greatly appreciate this help as I've been stuck here for ages. Thanks!
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.