From dcd379f44c16160b581c3d8c42ad515630f1b3f9 Mon Sep 17 00:00:00 2001 From: Howard Stark Date: Mon, 20 Aug 2018 17:25:01 -0700 Subject: [PATCH] Basic single-chunk map generation --- src/main/java/baritone/bot/Baritone.java | 15 ++++ .../bot/utils/ExampleBaritoneControl.java | 5 ++ src/main/java/baritone/map/Map.java | 5 ++ src/main/java/baritone/map/MapChunk.java | 72 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 src/main/java/baritone/map/Map.java create mode 100644 src/main/java/baritone/map/MapChunk.java diff --git a/src/main/java/baritone/bot/Baritone.java b/src/main/java/baritone/bot/Baritone.java index e13cbade..d776edb8 100755 --- a/src/main/java/baritone/bot/Baritone.java +++ b/src/main/java/baritone/bot/Baritone.java @@ -23,7 +23,12 @@ import baritone.bot.behavior.impl.MemoryBehavior; import baritone.bot.behavior.impl.PathingBehavior; import baritone.bot.event.GameEventHandler; import baritone.bot.utils.InputOverrideHandler; +import net.minecraft.client.Minecraft; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -47,6 +52,7 @@ public enum Baritone { private InputOverrideHandler inputOverrideHandler; private Settings settings; private List behaviors; + private File dir; /** * Whether or not Baritone is active @@ -65,6 +71,13 @@ public enum Baritone { behaviors.add(LookBehavior.INSTANCE); behaviors.add(MemoryBehavior.INSTANCE); + this.dir = new File(Minecraft.getMinecraft().gameDir, "baritone"); + if (!Files.exists(dir.toPath())) { + try { + Files.createDirectories(dir.toPath()); + } catch (IOException ignored) {} + } + this.active = true; this.initialized = true; } @@ -100,4 +113,6 @@ public enum Baritone { public static Settings settings() { return Baritone.INSTANCE.settings; // yolo } + + public final File getDir() { return this.dir; } } diff --git a/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java b/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java index 60693dc6..68fb0b53 100644 --- a/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java +++ b/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java @@ -31,6 +31,7 @@ import baritone.bot.pathing.movement.ActionCosts; import baritone.bot.pathing.movement.CalculationContext; import baritone.bot.pathing.movement.Movement; import baritone.bot.utils.pathing.BetterBlockPos; +import baritone.map.MapChunk; import net.minecraft.util.math.BlockPos; import java.util.ArrayList; @@ -171,6 +172,10 @@ public class ExampleBaritoneControl extends Behavior { } } } + if(msg.toLowerCase().equals("map")) { + MapChunk chunk = new MapChunk(world().getChunk(player().getPosition())); + chunk.writeImage(); + } if (Baritone.settings().byLowerName.containsKey(msg.toLowerCase())) { Settings.Setting setting = Baritone.settings().byLowerName.get(msg.toLowerCase()); displayChatMessageRaw(setting.toString()); diff --git a/src/main/java/baritone/map/Map.java b/src/main/java/baritone/map/Map.java new file mode 100644 index 00000000..6df611c0 --- /dev/null +++ b/src/main/java/baritone/map/Map.java @@ -0,0 +1,5 @@ +package baritone.map; + +public class Map { + +} diff --git a/src/main/java/baritone/map/MapChunk.java b/src/main/java/baritone/map/MapChunk.java new file mode 100644 index 00000000..54287525 --- /dev/null +++ b/src/main/java/baritone/map/MapChunk.java @@ -0,0 +1,72 @@ +package baritone.map; + +import baritone.bot.Baritone; +import baritone.bot.utils.BlockStateInterface; +import baritone.bot.utils.pathing.BetterBlockPos; +import net.minecraft.block.material.MapColor; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos.MutableBlockPos; +import net.minecraft.world.chunk.Chunk; +import org.lwjgl.util.Color; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class MapChunk { + + private Chunk chunk; + + public MapChunk(Chunk chunk) { + this.chunk = chunk; + } + + public void writeImage() { + Path image = getImagePath(); + if(!Files.exists(image.getParent())) { + try { + Files.createDirectory(image.getParent()); + } catch (IOException e) { + e.printStackTrace(); + } + } + BufferedImage bufferedImage = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB); + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + bufferedImage.setRGB(x, z, getColor(x, z)); + } + } + try { + ImageIO.write(bufferedImage, "PNG", image.toFile()); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + public Path getImagePath() { + return new File(new File(Baritone.INSTANCE.getDir(), "map"), "chunk" + chunk.x + "-" + chunk.z + ".png").toPath(); + } + + public int getColor(int x, int z) { + int chunkX = chunk.getPos().getXStart() + x; + int chunkZ = chunk.getPos().getZStart() + z; + MutableBlockPos blockPos = new MutableBlockPos(chunkX, chunk.getHeight(new BetterBlockPos(chunkX, 0, chunkZ)), chunkZ); + MapColor color = BlockStateInterface.get(blockPos).getMapColor(chunk.getWorld(), blockPos); + int colorValue = color != MapColor.AIR ? color.colorValue : BlockStateInterface.get(blockPos.move(EnumFacing.DOWN)).getMapColor(chunk.getWorld(), blockPos).colorValue; + int red = (colorValue >> 16) & 0xFF; + int green = (colorValue >> 8) & 0xFF; + int blue = colorValue & 0xFF; + + float heightCoef = (((float) blockPos.getY()) / 255) + 0.5f; + colorValue = (int) (red * heightCoef); + colorValue = (colorValue << 8) + (int) (green * heightCoef); + colorValue = (colorValue << 8) + (int) (blue * heightCoef); + return colorValue; + } + +}