Начинающий
- Статус
- Оффлайн
- Регистрация
- 17 Мар 2025
- Сообщения
- 8
- Реакции
- 0
- Выберите загрузчик игры
- Vanilla
- Прочие моды
Funtime Helper под Expensive 3.1
ss снизу ↓
ss снизу ↓
код ↓
Java:
package im.expensive.functions.impl.misc;
import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.command.friends.FriendStorage;
import im.expensive.events.WorldEvent;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.functions.settings.impl.BindSetting;
import im.expensive.functions.settings.impl.TitleSetting;
import im.expensive.functions.settings.impl.ModeListSetting;
import im.expensive.utils.client.IMinecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.util.math.MathHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand;
import net.minecraft.network.play.client.CHeldItemChangePacket;
import net.minecraft.network.play.client.CPlayerTryUseItemPacket;
@FunctionRegister(name = "Funtime Helper", type = Category.Misc)
public class FuntimeHelper extends Function implements IMinecraft {
private final ModeListSetting useWith = new ModeListSetting("Использовать с",
new BooleanSetting("Явной пылью", true),
new BooleanSetting("Дезориентацией", true),
new BooleanSetting("Трапкой", true)
);
private final ModeListSetting targets = new ModeListSetting("Цели",
new BooleanSetting("Мобы", true),
new BooleanSetting("Животные", true),
new BooleanSetting("Игроки", true),
new BooleanSetting("Друзья", false)
);
// Бинды
private final TitleSetting bindsTitle = new TitleSetting("Бинды");
private final BindSetting trapkaBind = new BindSetting("Трапка", -1);
private final BindSetting yavnayaPylBind = new BindSetting("Явная пыль", -1);
private final BindSetting dezorientBind = new BindSetting("Дезоринтация", -1);
private final BindSetting snezokBind = new BindSetting("Снежок заморозка",-1);
public FuntimeHelper() {
addSettings(useWith, targets,
bindsTitle,
trapkaBind,
yavnayaPylBind,
dezorientBind,
snezokBind);
}
@Subscribe
private void onKey(im.expensive.events.EventKey e) {
if (mc.player == null || mc.world == null) return;
int key = e.getKey();
Item targetItem = null;
if (key == trapkaBind.get()) targetItem = Items.NETHERITE_SCRAP;
if (key == yavnayaPylBind.get()) targetItem = Items.SUGAR;
if (key == dezorientBind.get()) targetItem = Items.ENDER_EYE;
if (key == snezokBind.get()) targetItem = Items.SNOWBALL;
if (targetItem == null) return;
// Try fast select in hotbar first
int hotbarSlot = -1;
for (int i = 0; i < 9; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (!stack.isEmpty() && stack.getItem() == targetItem) {
hotbarSlot = i;
break;
}
}
if (hotbarSlot != -1) {
int prev = mc.player.inventory.currentItem;
// switch to slot (client + server), then use
mc.player.inventory.currentItem = hotbarSlot;
mc.player.connection.sendPacket(new CHeldItemChangePacket(hotbarSlot));
mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(Hand.MAIN_HAND));
mc.player.swingArm(Hand.MAIN_HAND);
// switch back
mc.player.inventory.currentItem = prev;
mc.player.connection.sendPacket(new CHeldItemChangePacket(prev));
return;
}
// Not in hotbar: pick from inventory (9..35) into hand and use
for (int i = 9; i < 36; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (!stack.isEmpty() && stack.getItem() == targetItem) {
// Pick item from inventory into current hotbar slot, then use
mc.playerController.pickItem(i);
mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(Hand.MAIN_HAND));
mc.player.swingArm(Hand.MAIN_HAND);
break;
}
}
}
@Subscribe
private void onRenderWorld(WorldEvent e) {
if (mc.player == null || mc.world == null) return;
Item held = mc.player.getHeldItemMainhand().getItem();
if (!isEnabledForHeldItem(held)) return;
if (held == Items.NETHERITE_SCRAP) {
// Trapka: render a volumetric 4x4 hollow prism (bottom, top, and 4 walls)
double px = MathHelper.lerp(e.getPartialTicks(), mc.player.prevPosX, mc.player.getPosX());
double py = MathHelper.lerp(e.getPartialTicks(), mc.player.prevPosY, mc.player.getPosY());
double pz = MathHelper.lerp(e.getPartialTicks(), mc.player.prevPosZ, mc.player.getPosZ());
double half = 2.0; // 4x4 outer
double minX = px - half;
double maxX = px + half;
double minZ = pz - half;
double maxZ = pz + half;
double baseY = py + 0.02;
double topY = py + 4.0; // height of prism
boolean hasTargets = isAnyTargetInAABB(minX, maxX, minZ, maxZ);
int color = hasTargets ? im.expensive.utils.render.ColorUtils.rgb(144, 238, 144) : 0xFFFFFFFF;
int r = (color >> 16) & 0xFF, g = (color >> 8) & 0xFF, b = color & 0xFF;
GlStateManager.pushMatrix();
GlStateManager.shadeModel(7425);
GlStateManager.disableTexture();
GlStateManager.enableBlend();
GlStateManager.blendFunc(770, 771);
GlStateManager.disableAlphaTest();
GlStateManager.disableCull();
GlStateManager.lineWidth(2.0F);
GlStateManager.translated(-mc.getRenderManager().info.getProjectedView().x,
-mc.getRenderManager().info.getProjectedView().y,
-mc.getRenderManager().info.getProjectedView().z);
// bottom square
buffer.begin(3, net.minecraft.client.renderer.vertex.DefaultVertexFormats.POSITION_COLOR);
buffer.pos(minX, baseY, minZ).color(r, g, b, 200).endVertex();
buffer.pos(maxX, baseY, minZ).color(r, g, b, 200).endVertex();
buffer.pos(maxX, baseY, maxZ).color(r, g, b, 200).endVertex();
buffer.pos(minX, baseY, maxZ).color(r, g, b, 200).endVertex();
buffer.pos(minX, baseY, minZ).color(r, g, b, 200).endVertex();
tessellator.draw();
// top square
buffer.begin(3, net.minecraft.client.renderer.vertex.DefaultVertexFormats.POSITION_COLOR);
buffer.pos(minX, topY, minZ).color(r, g, b, 160).endVertex();
buffer.pos(maxX, topY, minZ).color(r, g, b, 160).endVertex();
buffer.pos(maxX, topY, maxZ).color(r, g, b, 160).endVertex();
buffer.pos(minX, topY, maxZ).color(r, g, b, 160).endVertex();
buffer.pos(minX, topY, minZ).color(r, g, b, 160).endVertex();
tessellator.draw();
// vertical edges (walls outline)
buffer.begin(1, net.minecraft.client.renderer.vertex.DefaultVertexFormats.POSITION_COLOR);
buffer.pos(minX, baseY, minZ).color(r, g, b, 180).endVertex();
buffer.pos(minX, topY, minZ).color(r, g, b, 180).endVertex();
buffer.pos(maxX, baseY, minZ).color(r, g, b, 180).endVertex();
buffer.pos(maxX, topY, minZ).color(r, g, b, 180).endVertex();
buffer.pos(maxX, baseY, maxZ).color(r, g, b, 180).endVertex();
buffer.pos(maxX, topY, maxZ).color(r, g, b, 180).endVertex();
buffer.pos(minX, baseY, maxZ).color(r, g, b, 180).endVertex();
buffer.pos(minX, topY, maxZ).color(r, g, b, 180).endVertex();
tessellator.draw();
GlStateManager.enableTexture();
GlStateManager.disableBlend();
GlStateManager.shadeModel(7424);
GlStateManager.popMatrix();
return;
}
// Default: ring for sugar/eye
boolean hasTargets = isAnyTargetInRadius(10.0);
int color = hasTargets ? im.expensive.utils.render.ColorUtils.rgb(144, 238, 144) : 0xFFFFFFFF; // light green or white
double px = MathHelper.lerp(e.getPartialTicks(), mc.player.prevPosX, mc.player.getPosX());
double py = MathHelper.lerp(e.getPartialTicks(), mc.player.prevPosY, mc.player.getPosY());
double pz = MathHelper.lerp(e.getPartialTicks(), mc.player.prevPosZ, mc.player.getPosZ());
float radius = 10.0f;
GlStateManager.pushMatrix();
GlStateManager.shadeModel(7425);
GlStateManager.disableTexture();
GlStateManager.enableBlend();
GlStateManager.blendFunc(770, 771);
GlStateManager.disableAlphaTest();
GlStateManager.disableCull();
GlStateManager.lineWidth(2.0F);
GlStateManager.translated(-mc.getRenderManager().info.getProjectedView().x,
-mc.getRenderManager().info.getProjectedView().y,
-mc.getRenderManager().info.getProjectedView().z);
buffer.begin(3, net.minecraft.client.renderer.vertex.DefaultVertexFormats.POSITION_COLOR);
for (int i = 0; i <= 360; i += 2) {
double rad = Math.toRadians(i);
double cx = px + Math.cos(rad) * radius;
double cz = pz + Math.sin(rad) * radius;
buffer.pos(cx, py + 0.05, cz).color((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, 200).endVertex();
}
tessellator.draw();
GlStateManager.enableTexture();
GlStateManager.disableBlend();
GlStateManager.shadeModel(7424);
GlStateManager.popMatrix();
}
private boolean isEnabledForHeldItem(Item held) {
// Явная пыль -> SUGAR
if (useWith.getValueByName("Явной пылью").get() && held == Items.SUGAR) return true;
// Дезориентация -> ENDER_EYE
if (useWith.getValueByName("Дезориентацией").get() && held == Items.ENDER_EYE) return true;
// Трапка -> NETHERITE_SCRAP
return useWith.getValueByName("Трапкой").get() && held == Items.NETHERITE_SCRAP;
}
private boolean isAnyTargetInRadius(double radius) {
for (Entity entity : mc.world.getAllEntities()) {
if (!(entity instanceof LivingEntity)) continue;
if (entity == mc.player) continue;
if (!isTargetAllowed(entity)) continue;
if (entity.getDistance(mc.player) <= radius) return true;
}
return false;
}
private boolean isAnyTargetInAABB(double minX, double maxX, double minZ, double maxZ) {
for (Entity entity : mc.world.getAllEntities()) {
if (!(entity instanceof LivingEntity)) continue;
if (entity == mc.player) continue;
if (!isTargetAllowed(entity)) continue;
double ex = entity.getPosX();
double ez = entity.getPosZ();
if (ex >= minX && ex <= maxX && ez >= minZ && ez <= maxZ) return true;
}
return false;
}
private boolean isTargetAllowed(Entity entity) {
if (entity instanceof PlayerEntity) {
PlayerEntity player = (PlayerEntity) entity;
boolean isFriend = FriendStorage.isFriend(player.getName().getString());
if (isFriend) {
return targets.getValueByName("Друзья").get();
}
return targets.getValueByName("Игроки").get();
}
if (entity instanceof AnimalEntity) {
return targets.getValueByName("Животные").get();
}
if (entity instanceof MobEntity) {
return targets.getValueByName("Мобы").get();
}
return false;
}
}