Начинающий
- Статус
- Оффлайн
- Регистрация
- 10 Янв 2025
- Сообщения
- 42
- Реакции
- 0
- Выберите загрузчик игры
- Forge
- OptiFine
- ForgeOptiFine
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Более лучшая версия чем у нюкера ссылка на его пост <тык>(в плане визуализации)
ss
код:
ss
Пожалуйста, авторизуйтесь для просмотра ссылки.
код:
Код:
@FunctionRegister(name = "HitCircle", type = Category.Render)
public class HitCircle extends Function {
private final Minecraft mc = Minecraft.getInstance();
private final SliderSetting circleRadius = new SliderSetting("Радиус круга", 0.3f, 0.1f, 1.0f, 0.01f);
private final SliderSetting lineThickness = new SliderSetting("Толщина линии", 2.0f, 0.5f, 5.0f, 0.1f);
private final SliderSetting crossSize = new SliderSetting("Размер перекрестия", 0.5f, 0.1f, 1.0f, 0.05f);
private final SliderSetting spreadAngle = new SliderSetting("Угол разлета", 9.5f, 8.5f, 10f, 0.1f);
public HitCircle() {
this.addSettings(circleRadius, lineThickness, crossSize, spreadAngle);
}
@Subscribe
public void onRenderWorld(WorldEvent event) {
if (mc.player == null || mc.world == null) return;
PlayerEntity player = mc.player;
ItemStack held = player.getHeldItemMainhand();
Item item = held.getItem();
if (!(item instanceof BowItem || item instanceof CrossbowItem || item instanceof TridentItem)) return;
float power = calculatePower(item, player);
boolean isCrossbow = item instanceof CrossbowItem;
if (isCrossbow && CrossbowItem.isCharged(held)) {
for (int i = -1; i <= 1; i++) {
Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
Vector3d lookVec = getSpreadLookVec(player, i * spreadAngle.get());
Vector3d motion = lookVec.scale(power);
Vector3d pos = eyePos;
for (int j = 0; j < 300; j++) {
Vector3d next = pos.add(motion);
RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
RayTraceContext.FluidMode.NONE, player);
RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);
if (entityResult != null) {
drawCircle(entityResult.getHitVec(), Direction.UP, i, true);
break;
} else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
drawCircle(hit.getHitVec(), hit.getFace(), i, false);
break;
}
pos = next;
motion = motion.scale(0.99).subtract(0, 0.05, 0);
}
}
} else {
Vector3d eyePos = player.getEyePosition(event.getPartialTicks());
Vector3d lookVec = player.getLookVec();
Vector3d motion = lookVec.scale(power);
Vector3d pos = eyePos;
for (int i = 0; i < 300; i++) {
Vector3d next = pos.add(motion);
RayTraceContext ctx = new RayTraceContext(pos, next, RayTraceContext.BlockMode.COLLIDER,
RayTraceContext.FluidMode.NONE, player);
RayTraceResult blockResult = mc.world.rayTraceBlocks(ctx);
EntityRayTraceResult entityResult = rayTraceEntities(pos, next, player);
if (entityResult != null) {
drawCircle(entityResult.getHitVec(), Direction.UP, 0, true);
break;
} else if (blockResult.getType() == RayTraceResult.Type.BLOCK) {
BlockRayTraceResult hit = (BlockRayTraceResult) blockResult;
drawCircle(hit.getHitVec(), hit.getFace(), 0, false);
break;
}
pos = next;
motion = motion.scale(0.99).subtract(0, 0.05, 0);
}
}
}
private Vector3d getSpreadLookVec(PlayerEntity player, float angleDegrees) {
float angle = (float)Math.toRadians(angleDegrees);
Vector3d look = player.getLookVec();
double x = look.x * Math.cos(angle) - look.z * Math.sin(angle);
double z = look.x * Math.sin(angle) + look.z * Math.cos(angle);
return new Vector3d(x, look.y, z);
}
private float calculatePower(Item item, PlayerEntity player) {
if (item instanceof BowItem) {
int useTicks = player.getItemInUseCount();
float draw = Math.min((useTicks / 20f * (useTicks / 20f + useTicks * 2f)) / 3f, 1f);
return draw * 3f;
} else if (item instanceof CrossbowItem) {
return 3.15f;
} else if (item instanceof TridentItem) {
return 2.5f;
}
return 0f;
}
private EntityRayTraceResult rayTraceEntities(Vector3d start, Vector3d end, PlayerEntity player) {
return ProjectileHelper.rayTraceEntities(
mc.world,
player,
start,
end,
new AxisAlignedBB(start, end),
e -> !e.isSpectator() && e.canBeCollidedWith()
);
}
private void drawCircle(Vector3d hitVec, Direction face, int lineIndex, boolean isEntity) {
Vector3d cam = mc.getRenderManager().info.getProjectedView();
double x = hitVec.x - cam.x;
double y = hitVec.y - cam.y + 0.01;
double z = hitVec.z - cam.z;
int segments = 40;
double radius = this.circleRadius.get();
float thickness = this.lineThickness.get();
float crossLength = (float) (radius * crossSize.get());
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
alignToFace(face);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glLineWidth(thickness);
if (isEntity) {
GL11.glColor4f(1f, 0.2f, 0.2f, 0.8f);
} else {
GL11.glColor4f(0.2f, 1f, 0.2f, 0.8f);
}
GL11.glBegin(GL11.GL_LINE_LOOP);
for (int i = 0; i < segments; i++) {
double angle = 2 * Math.PI * i / segments;
GL11.glVertex3d(Math.cos(angle) * radius, 0, Math.sin(angle) * radius);
}
GL11.glEnd();
GL11.glBegin(GL11.GL_LINES);
GL11.glVertex3d(-crossLength, 0, 0);
GL11.glVertex3d(crossLength, 0, 0);
GL11.glVertex3d(0, 0, -crossLength);
GL11.glVertex3d(0, 0, crossLength);
GL11.glEnd();
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();
}
private void alignToFace(Direction face) {
switch (face) {
case UP:
break;
case DOWN:
GL11.glRotated(180, 1, 0, 0);
break;
case EAST:
GL11.glRotated(90, 0, 0, 1);
break;
case WEST:
GL11.glRotated(-90, 0, 0, 1);
break;
case SOUTH:
GL11.glRotated(-90, 1, 0, 0);
break;
case NORTH:
GL11.glRotated(90, 1, 0, 0);
break;
}
}
}
Последнее редактирование: