Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 29 Сен 2024
- Сообщения
- 34
- Реакции
- 0
да я аутист и я ето знаю вот код пишу на базе минседа 1.21.4 (NOAD) и кароче как в нем поправить итемСкролер
вот сам код итем скролера
сорян за мой русский
вот сам код итем скролера
код итемскролера:
package daun.client.client.feature.module.impl.miscellaneous;
import net.minecraft.client.util.InputUtil;
import org.lwjgl.glfw.GLFW;
import daun.client.client.core.event.EventHandler;
import daun.client.client.core.event.impl.container.EventClickSlot;
import daun.client.client.feature.module.Category;
import daun.client.client.feature.module.Function;
import daun.client.client.feature.module.setting.impl.SliderSetting;
import daun.client.client.util.IMinecraft;
import net.minecraft.screen.slot.SlotActionType;
public class ItemScrollerFunction extends Function implements IMinecraft {
public ItemScrollerFunction() {
super("Item Scroller", "Quickly moves the selected item via Shift+LMB", Category.Miscellaneous);
SliderSetting delay = new SliderSetting("Delay (ticks)", 1.0f, 0.0f, 20.0f, 1.0f);
addSettings(delay);
}
private boolean pause = false;
@EventHandler
public void onClickSlot(EventClickSlot event) {
if (pause) return; // предотвращаем рекурсию
boolean shift = isKeyPressed(GLFW.GLFW_KEY_LEFT_SHIFT) || isKeyPressed(GLFW.GLFW_KEY_RIGHT_SHIFT);
if (!shift || mc.player == null || mc.interactionManager == null || mc.player.currentScreenHandler == null)
return;
int slotId = event.getSlot();
if (slotId < 0 || slotId >= mc.player.currentScreenHandler.slots.size()) return;
if (mc.player.currentScreenHandler.slots.get(slotId).getStack().isEmpty()) return;
pause = true; // ставим паузу
mc.interactionManager.clickSlot(
mc.player.currentScreenHandler.syncId,
slotId,
0,
SlotActionType.QUICK_MOVE,
mc.player
);
pause = false; // снимаем паузу
}
public static boolean isKeyPressed(int key) {
if (key < 0) return false;
return InputUtil.isKeyPressed(mc.getWindow().getHandle(), key);
}
}
Миксин:
package daun.client.injection;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.block.ShulkerBoxBlock;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider;
import net.minecraft.client.render.DiffuseLighting;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.util.InputUtil;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.ContainerComponent;
import net.minecraft.component.type.MapIdComponent;
import net.minecraft.inventory.SimpleInventory;
import net.minecraft.item.*;
import net.minecraft.item.map.MapState;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.ShulkerBoxScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import daun.client.core.Core;
import daun.client.core.manager.client.ModuleManager;
import daun.client.gui.misc.PeekScreen;
import daun.client.features.modules.Module;
import daun.client.features.modules.render.Tooltips;
import daun.client.utility.Timer;
import daun.client.utility.render.Render2DEngine;
import daun.client.utility.render.TextureStorage;
import java.awt.*;
import java.util.*;
import java.util.List;
import static daun.client.features.modules.Module.mc;
import static daun.client.features.modules.render.Tooltips.hasItems;
@Mixin(value = {HandledScreen.class})
public abstract class MixinHandledScreen<T extends ScreenHandler> extends Screen implements ScreenHandlerProvider<T> {
@Unique
private final Timer delayTimer = new Timer();
@Unique
private Runnable postRender;
protected MixinHandledScreen(Text title) {
super(title);
}
@Shadow
protected abstract boolean isPointOverSlot(Slot slotIn, double mouseX, double mouseY);
@Shadow
protected abstract void onMouseClick(Slot slotIn, int slotId, int mouseButton, SlotActionType type);
@Inject(method = "render", at = @At("HEAD"))
private void drawScreenHook(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (Module.fullNullCheck()) return;
for (int i1 = 0; i1 < mc.player.currentScreenHandler.slots.size(); ++i1) {
Slot slot = mc.player.currentScreenHandler.slots.get(i1);
if (isPointOverSlot(slot, mouseX, mouseY) && slot.isEnabled()) {
if (ModuleManager.itemScroller.isEnabled() && shit() && attack() && delayTimer.passedMs(ModuleManager.itemScroller.delay.getValue())) {
this.onMouseClick(slot, slot.id, 0, SlotActionType.QUICK_MOVE);
delayTimer.reset();
}
}
}
}
private boolean shit() {
return InputUtil.isKeyPressed(MinecraftClient.getInstance().getWindow().getHandle(), 340) || InputUtil.isKeyPressed(MinecraftClient.getInstance().getWindow().getHandle(), 344);
}
private boolean attack() {
return Core.hold_mouse0;
}
@Shadow
@Nullable
protected Slot focusedSlot;
@Shadow
protected int x;
@Shadow
protected int y;
private static final ItemStack[] ITEMS = new ItemStack[27];
private Map<Render2DEngine.Rectangle, Integer> clickableRects = new HashMap<>();
@Inject(method = "render", at = @At("TAIL"))
private void onRender(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (Module.fullNullCheck()) return;
if (focusedSlot != null && !focusedSlot.getStack().isEmpty() && client.player.playerScreenHandler.getCursorStack().isEmpty()) {
if (hasItems(focusedSlot.getStack()) && Tooltips.storage.getValue()) {
renderShulkerToolTip(context, mouseX, mouseY, 0, 0, focusedSlot.getStack());
} else if (focusedSlot.getStack().getItem() == Items.FILLED_MAP && Tooltips.maps.getValue()) {
drawMapPreview(context, focusedSlot.getStack(), mouseX, mouseY);
}
}
int xOffset = 0;
int yOffset = 20;
int stage = 0;
if (ModuleManager.tooltips.isEnabled() && ModuleManager.tooltips.shulkerRegear.getValue()) {
clickableRects.clear();
for (int i1 = 0; i1 < mc.player.currentScreenHandler.slots.size(); ++i1) {
Slot slot = mc.player.currentScreenHandler.slots.get(i1);
if (slot.getStack().isEmpty()) continue;
if (slot.getStack().getItem() instanceof BlockItem bi && bi.getBlock() instanceof ShulkerBoxBlock) {
if (!renderShulkerToolTip(context, xOffset, yOffset + 67, mouseX, mouseY, slot.getStack()))
continue;
clickableRects.put(new Render2DEngine.Rectangle(xOffset, yOffset, xOffset + 176, yOffset + 67), slot.id);
yOffset += 67;
if (stage == 0) {
if (yOffset + 67 >= mc.getWindow().getScaledHeight()) {
yOffset = 20;
xOffset = mc.getWindow().getScaledWidth() - 176;
stage = 1;
}
} else if (stage == 1) {
if (yOffset + 67 >= mc.getWindow().getScaledHeight()) {
yOffset = 20;
xOffset = 170;
stage = 2;
}
} else {
if (yOffset + 67 >= mc.getWindow().getScaledHeight()) {
yOffset = 20;
xOffset = mc.getWindow().getScaledWidth() - 352;
stage = 0;
}
}
}
}
if (postRender != null) {
postRender.run();
postRender = null;
}
}
}
@Inject(method = "drawSlot(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/screen/slot/Slot;)V", at = @At("TAIL"))
protected void drawSlotHook(DrawContext context, Slot slot, CallbackInfo ci) {
if (ModuleManager.serverHelper.isEnabled() && ModuleManager.serverHelper.aucHelper.getValue())
ModuleManager.serverHelper.onRenderChest(context, slot);
}
public boolean renderShulkerToolTip(DrawContext context, int offsetX, int offsetY, int mouseX, int mouseY, ItemStack stack) {
try {
ContainerComponent compoundTag = stack.get(DataComponentTypes.CONTAINER);
if (compoundTag == null)
return false;
float[] colors = new float[]{1F, 1F, 1F};
Item focusedItem = stack.getItem();
if (focusedItem instanceof BlockItem bi && bi.getBlock() instanceof ShulkerBoxBlock) {
try {
Color c = new Color(Objects.requireNonNull(ShulkerBoxBlock.getColor(stack.getItem())).getEntityColor());
colors = new float[]{c.getRed() / 255f, c.getGreen() / 255f, c.getRed() / 255f, c.getAlpha() / 255f};
} catch (NullPointerException npe) {
colors = new float[]{1F, 1F, 1F};
}
}
draw(context, compoundTag.stream().toList(), offsetX, offsetY, mouseX, mouseY, colors);
} catch (Exception ignore) {
return false;
}
return true;
}
@Inject(method = "drawMouseoverTooltip", at = @At("HEAD"), cancellable = true)
private void onDrawMouseoverTooltip(DrawContext context, int x, int y, CallbackInfo ci) {
if (Module.fullNullCheck()) return;
if (focusedSlot != null && !focusedSlot.getStack().isEmpty() && client.player.playerScreenHandler.getCursorStack().isEmpty()) {
if (focusedSlot.getStack().getItem() == Items.FILLED_MAP && Tooltips.maps.getValue()) ci.cancel();
}
}
@Unique
private void draw(DrawContext context, List<ItemStack> itemStacks, int offsetX, int offsetY, int mouseX, int mouseY, float[] colors) {
RenderSystem.disableDepthTest();
GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
offsetX += 8;
offsetY -= 82;
drawBackground(context, offsetX, offsetY, colors);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
DiffuseLighting.enableGuiDepthLighting();
int row = 0;
int i = 0;
for (ItemStack itemStack : itemStacks) {
context.drawItem(itemStack, offsetX + 8 + i * 18, offsetY + 7 + row * 18);
context.drawItemInSlot(mc.textRenderer, itemStack, offsetX + 8 + i * 18, offsetY + 7 + row * 18);
if (mouseX > offsetX + 8 + i * 18 && mouseX < offsetX + 28 + i * 18 && mouseY > offsetY + 7 + row * 18 && mouseY < offsetY + 27 + row * 18)
postRender = () -> context.drawTooltip(textRenderer, getTooltipFromItem(mc, itemStack), itemStack.getTooltipData(), mouseX, mouseY);
i++;
if (i >= 9) {
i = 0;
row++;
}
}
DiffuseLighting.disableGuiDepthLighting();
RenderSystem.enableDepthTest();
}
private void drawBackground(DrawContext context, int x, int y, float[] colors) {
RenderSystem.disableBlend();
RenderSystem.setShaderColor(colors[0], colors[1], colors[2], 1F);
RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
context.drawTexture(TextureStorage.container, x, y, 0, 0, 176, 67, 176, 67);
RenderSystem.enableBlend();
}
private void drawMapPreview(DrawContext context, ItemStack stack, int x, int y) {
RenderSystem.enableBlend();
context.getMatrices().push();
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
int y1 = y - 12;
int x1 = x + 8;
int z = 300;
MapState mapState = FilledMapItem.getMapState(stack, client.world);
if (mapState != null) {
mapState.getPlayerSyncData(client.player);
x1 += 8;
y1 += 8;
z = 310;
double scale = (double) (100 - 16) / 128.0D;
context.getMatrices().translate(x1, y1, z);
context.getMatrices().scale((float) scale, (float) scale, 0);
VertexConsumerProvider.Immediate consumer = client.getBufferBuilders().getEntityVertexConsumers();
client.gameRenderer.getMapRenderer().draw(context.getMatrices(), consumer, (MapIdComponent) stack.get(DataComponentTypes.MAP_ID), mapState, false, 0xF000F0);
}
context.getMatrices().pop();
}
@Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
private void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
if (Module.fullNullCheck()) return;
if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE && focusedSlot != null && !focusedSlot.getStack().isEmpty() && client.player.playerScreenHandler.getCursorStack().isEmpty()) {
ItemStack itemStack = focusedSlot.getStack();
if (hasItems(itemStack) && Tooltips.middleClickOpen.getValue()) {
Arrays.fill(ITEMS, ItemStack.EMPTY);
ContainerComponent nbt = itemStack.get(DataComponentTypes.CONTAINER);
if (nbt != null) {
List<ItemStack> list = nbt.stream().toList();
for (int i = 0; i < list.size(); i++)
ITEMS[i] = list.get(i);
}
client.setScreen(new PeekScreen(new ShulkerBoxScreenHandler(0, client.player.getInventory(), new SimpleInventory(ITEMS)), client.player.getInventory(), focusedSlot.getStack().getName(), ((BlockItem) focusedSlot.getStack().getItem()).getBlock()));
cir.setReturnValue(true);
}
}
for (Render2DEngine.Rectangle rect : clickableRects.keySet()) {
if (rect.contains(mouseX, mouseY)) {
if (ModuleManager.tooltips.shulkerRegearShiftMode.getValue()) {
mc.interactionManager.clickSlot(mc.player.currentScreenHandler.syncId, clickableRects.get(rect), 0, SlotActionType.QUICK_MOVE, mc.player);
} else {
mc.interactionManager.clickSlot(mc.player.currentScreenHandler.syncId, clickableRects.get(rect), 0, SlotActionType.PICKUP, mc.player);
}
}
}
}
}
Последнее редактирование: