-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Кароче такая проблема бывает что рендерит ещё и фейковые там 1-2 шт, я фиг знает как пофиксить помогите буду благодарен.
AnchientXray:
package nig.neverclose.functions.impl.player;
import com.google.common.eventbus.Subscribe;
import net.minecraft.util.math.RayTraceContext;
import nig.neverclose.events.WorldEvent;
import nig.neverclose.functions.api.Category;
import nig.neverclose.functions.api.Function;
import nig.neverclose.functions.api.FunctionRegister;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.BlockPos;
import net.optifine.render.RenderUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
@FunctionRegister(name = "AnchientXray", type = Category.Player)
public class AnchientXray extends Function {
private final Map<TileEntityType<?>, Integer> tiles = new HashMap<>();
private final Map<BlockState, Integer> blocks = new HashMap<>();
private int lastAncientDebrisCount = 0;
private boolean isInArea = false;
private final Minecraft mc = Minecraft.getInstance();
public AnchientXray() {
addBlock(Blocks.ANCIENT_DEBRIS.getDefaultState(), new Color(199, 137, 3).getRGB());
}
private void addBlock(BlockState blockState, int color) {
blocks.put(blockState, color);
}
[USER=1474073]@Subscribe[/USER]
private void onRender(WorldEvent e) {
int ancientDebrisCount = 0;
boolean wasInArea = isInArea;
isInArea = isPlayerInSearchArea();
if (!wasInArea && isInArea) {
lastAncientDebrisCount = 0;
}
for (TileEntity tile : mc.world.loadedTileEntityList) {
TileEntityType<?> type = tile.getType();
if (tiles.containsKey(type)) {
BlockPos pos = tile.getPos();
if (isBlockVisible(pos) && isBlockInRange(pos)) {
RenderUtils.drawBlockBox(pos, tiles.get(type));
}
}
}
boolean foundAncientDebris = false;
for (BlockPos pos : BlockPos.getAllInBoxMutable(mc.player.getPosition().add(-16, -16, -16),
mc.player.getPosition().add(16, 16, 16))) {
BlockState state = mc.world.getBlockState(pos);
if (blocks.containsKey(state)) {
if (isNearbyNetherOre(pos)) {
continue;
}
if (isBlockBehindAncientDebris(pos)) {
continue;
}
if (isBlockNearBedrock(pos)) {
continue;
}
if (isTooManyAncientDebrisAtPos(pos)) {
continue;
}
if (isBlockVisible(pos) && isBlockInRange(pos)) {
RenderUtils.drawBlockBox(pos, blocks.get(state));
ancientDebrisCount++;
foundAncientDebris = true;
}
}
}
if (!foundAncientDebris) {
lastAncientDebrisCount = 0;
}
if (ancientDebrisCount > lastAncientDebrisCount) {
this.print("Найдено обломков: " + ancientDebrisCount);
lastAncientDebrisCount = ancientDebrisCount;
}
}
private boolean isPlayerInSearchArea() {
return BlockPos.getAllInBoxMutable(mc.player.getPosition().add(-16, -16, -16),
mc.player.getPosition().add(16, 16, 16)).iterator().hasNext();
}
private boolean isBlockVisible(BlockPos pos) {
Vector3d playerPosition = mc.player.getEyePosition(1.0F);
return isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(1, 0, 0)) || // Right
isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(-1, 0, 0)) || // Left
isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, 1, 0)) || // Up
isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, -1, 0)) || // Down
isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, 0, 1)) || // Front
isBlockVisibleFromDirection(playerPosition, pos, new Vector3d(0, 0, -1)); // Back
}
private boolean isBlockVisibleFromDirection(Vector3d playerPosition, BlockPos pos, Vector3d direction) {
Vector3d blockPosition = new Vector3d(pos.getX(), pos.getY(), pos.getZ()).add(direction);
RayTraceResult rayTraceResult = mc.world.rayTraceBlocks(new RayTraceContext(playerPosition, blockPosition,
RayTraceContext.BlockMode.OUTLINE, RayTraceContext.FluidMode.NONE, mc.player));
return rayTraceResult.getType() == RayTraceResult.Type.MISS;
}
private boolean isBlockInRange(BlockPos pos) {
double distance = mc.player.getDistanceSq(pos.getX(), pos.getY(), pos.getZ());
return distance <= 256;
}
private boolean isNearbyNetherOre(BlockPos pos) {
for (BlockPos neighborPos : BlockPos.getAllInBoxMutable(pos.add(-1, -1, -1), pos.add(1, 1, 1))) {
BlockState neighborState = mc.world.getBlockState(neighborPos);
if (isNetherOreBlock(neighborState)) {
return true;
}
}
return false;
}
private boolean isNetherOreBlock(BlockState state) {
return state.getBlock() == Blocks.NETHER_QUARTZ_ORE || state.getBlock() == Blocks.NETHER_GOLD_ORE ||
state.getBlock() == Blocks.LODESTONE || state.getBlock() == Blocks.BLACKSTONE;
}
private boolean isBlockBehindAncientDebris(BlockPos pos) {
BlockState state = mc.world.getBlockState(pos);
return state.getBlock() == Blocks.STONE || state.getBlock() == Blocks.DIRT;
}
private boolean isBlockNearBedrock(BlockPos pos) {
return pos.getY() <= 5;
}
private boolean isTooManyAncientDebrisAtPos(BlockPos pos) {
int debrisCount = 0;
for (int y = pos.getY(); y <= pos.getY() + 2; y++) {
BlockPos newPos = new BlockPos(pos.getX(), y, pos.getZ());
BlockState state = mc.world.getBlockState(newPos);
if (state.getBlock() == Blocks.ANCIENT_DEBRIS) {
debrisCount++;
}
}
return debrisCount > 3;
}
}