diff --git a/src/main/java/org/hydev/hyritone/SeedServerCache.java b/src/main/java/org/hydev/hyritone/SeedServerCache.java new file mode 100644 index 00000000..4070805d --- /dev/null +++ b/src/main/java/org/hydev/hyritone/SeedServerCache.java @@ -0,0 +1,191 @@ +/* + * This file is part of Baritone. + * + * Baritone is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Baritone is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Baritone. If not, see . + */ + +package org.hydev.hyritone; + +import baritone.Baritone; +import baritone.api.event.events.RenderEvent; +import baritone.api.event.events.TickEvent; +import baritone.api.utils.BetterBlockPos; +import baritone.api.utils.Helper; +import baritone.behavior.Behavior; +import baritone.utils.PathRenderer; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import net.minecraft.util.math.BlockPos; +import org.apache.commons.io.IOUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +import java.awt.*; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import static baritone.api.utils.Helper.mc; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.hydev.hyritone.MiscUtils.debug; + +/** + * TODO: Write a description for this class! + *

+ * Class created by the HyDEV Team on 2020-02-19! + * + * @author HyDEV Team (https://github.com/HyDevelop) + * @author Hykilpikonna (https://github.com/hykilpikonna) + * @author Vanilla (https://github.com/VergeDX) + * @since 2020-02-19 12:35 + */ +public class SeedServerCache extends Behavior +{ + public static CloseableHttpClient http = HttpClients.createDefault(); + + public BetterBlockPos cacheLocation; + public List cacheBlocks = new ArrayList<>(); + private static final Type blocksType = new TypeToken>(){}.getType(); + + public boolean enabled = false; + public String blockToFind = "diamond_ores"; + public boolean updating = false; + + public int ticks = 0; + + protected SeedServerCache(Baritone baritone) + { + super(baritone); + } + + /** + * Check for updates every tick + * + * @param event Tick event + */ + @Override + public void onTick(TickEvent event) + { + if (!enabled || updating) return; + + BetterBlockPos feet = new BetterBlockPos(mc.player.getPositionVec().x, mc.player.getPositionVec().y + 0.1251, mc.player.getPositionVec().z); + + if (cacheLocation == null) + { + new Thread(this::updateCache).start(); + } + + // Tell the server to load chunks every 20 seconds (20 * 20 = 400 ticks) + ticks ++; + + if (ticks > 400) + { + ticks = 0; + new Thread(this::loadChunks).start(); + } + } + + /** + * Tell the server to pre-load the chunks + */ + public void loadChunks() + { + BetterBlockPos feet = new BetterBlockPos(mc.player.getPositionVec().x, mc.player.getPositionVec().y + 0.1251, mc.player.getPositionVec().z); + + // Get request + HttpGet get = new HttpGet("http://localhost:12255/api/load-chunks"); + get.setHeader("world", "world"); + get.setHeader("center-x", "" + feet.getX()); + get.setHeader("center-z", "" + feet.getZ()); + get.setHeader("max-search-rad", "64"); + + try (CloseableHttpResponse response = http.execute(get)) + { + debug("Telling seed exploit server to load chunk..."); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + /** + * Update cached blocks + */ + public void updateCache() + { + // Prevent duplicate calls to update + updating = true; + + BetterBlockPos feet = new BetterBlockPos(mc.player.getPositionVec().x, mc.player.getPositionVec().y + 0.1251, mc.player.getPositionVec().z); + + // Get request + HttpGet get = new HttpGet("http://localhost:12255/api/get-locations-of"); + get.setHeader("world", "world"); + get.setHeader("block", "diamond_ore"); + get.setHeader("maximum", "64"); + get.setHeader("center-x", "" + feet.getX()); + get.setHeader("center-y", "" + feet.getY()); + get.setHeader("center-z", "" + feet.getZ()); + get.setHeader("max-search-rad", "64"); + get.setHeader("y-min", "3"); + get.setHeader("y-max", "16"); + + debug("=============================================="); + debug("Getting block data from seed exploit server..."); + + try (CloseableHttpResponse response = http.execute(get)) + { + ArrayList blocks = new Gson().fromJson(IOUtils.toString(response.getEntity().getContent(), UTF_8), blocksType); + + // Clear unwanted blocks + blocks.forEach(block -> + { + // Exited + if (mc.world == null) return; + + debug("Removing air..."); + + // Only add it if it is not air in the client world + if (!mc.world.getBlockState(block).isAir()) cacheBlocks.add(block); + }); + } + catch (IOException e) + { + e.printStackTrace(); + } + + debug("Block data obtained."); + + updating = false; + } + + @Override + public void onRenderPass(RenderEvent event) + { + if (!enabled) return; + + // Render xray + PathRenderer.drawManySelectionBoxes(event.getModelViewStack(), Helper.mc.getRenderViewEntity(), cacheBlocks, Color.cyan); + } + + @Override + public void onBlockBreak(BlockPos pos) + { + cacheBlocks.removeIf(b -> b.equals(pos)); + } +}