Jump to content

Recommended Posts

Posted

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

Posted

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.

Posted

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.

Posted

BlockPos.getAllInBox(from, to)

  • Like 1

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
20 hours ago, JakeNelson1999 said:

Hey there I'm working on a client side bot mod...

You can't do server things from the client.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

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;

	}

 

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

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