Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 19 Фев 2026
- Сообщения
- 11
- Реакции
- 0
- Выберите загрузчик игры
- Fabric
Сегодня утром на фантайме вышел первоапрельский ивент, который так же как и другие ивенты появляется случайно. В видео-анонсе ивента было сказано, что этот ивент не на 1 день, а пока все игроки не соберут 15 миллионов файлов пепешнейна. За пол дня игроки собрали только 250 тысяч, это примерно ~1.8% от всей суммы, так что я думаю ивент продлится ещё долго.
Сами файлы эпштейна делятся на 3 части: дешман (т3, фальшивка), дешман (т2, зацепка), топчик (т1, TOP SECRET)
Я по быстренькому за пол часа накодил некий функционал, на моё удивление разрабы решили не скрывать от клиента NBT теги файлов, что сделало разработку очень простой и в целом возможной
Код Fabric 1.21.4 :
Использование верхнего метода: (для простоты, каждый тик вызывать эти методы)
Сами файлы эпштейна делятся на 3 части: дешман (т3, фальшивка), дешман (т2, зацепка), топчик (т1, TOP SECRET)
Я по быстренькому за пол часа накодил некий функционал, на моё удивление разрабы решили не скрывать от клиента NBT теги файлов, что сделало разработку очень простой и в целом возможной
Код Fabric 1.21.4 :
Главное, что вам нужно:
public boolean isTopSecret(ItemStack stack) {
return stack.getName().getString().contains("TOP");
}
Использование верхнего метода: (для простоты, каждый тик вызывать эти методы)
Выделение лежащих на полу TOP SECRET файлов:
private void processWorld() {
var player = mc.player;
if(player != null) {
var world = player.getEntityWorld();
if(world != null) {
var playerPos = player.getPos();
// Создаём баундинг бокс в радиусе 100 блоков от позиции игрока
var radius = 100.0;
var box = new Box(
playerPos.x - radius,
playerPos.y - radius,
playerPos.z - radius,
playerPos.x + radius,
playerPos.y + radius,
playerPos.z + radius
);
// Получаем все ItemEntity внутри баундинг бокса, то есть в раудисе 100 блоков от игрока
var items = world.getEntitiesByType(
TypeFilter.instanceOf(ItemEntity.class),
box,
itemEntity -> true
);
// Проходимся по очереди по всем найденным предметам
for(var entity : items) {
var stack = entity.getStack();
// Если ItemEntity не пустой и хранит в себе TOP SECRET файл, то ставим ему название
// Кому не лень можете ещё красный гловинг приделать и скинуть в комменты
if(stack != null && isTopSecret(entity.getStack())) {
entity.setCustomName(Text.of("§c§lTOP SECRET"));
entity.setCustomNameVisible(true);
}
}
}
}
}
Чест стиллер, собирающий только TOP SECRET файлы и после закрывающий сундук:
private void processChest() {
// тут может присутствовать гавнокод, я не очень хорошо понимаю как можно максимально правильно по другому реализовать систему "ожидания" n милисекунд
new Thread(() -> {
// Проверка открыт ли контейнер с предметами
if (mc.currentScreen != null && mc.interactionManager != null) {
if (mc.currentScreen instanceof GenericContainerScreen) {
var screen = (GenericContainerScreen) mc.currentScreen;
var handler = screen.getScreenHandler();
// Проходимся по всем предметам контейнера (сундука или бочки допустим)
for (var slot : handler.slots) {
var stack = slot.getStack();
var item = stack.getItem().toString();
if (slot.id >= 27) continue;
if (item.equalsIgnoreCase("minecraft:air")) continue;
var isTopSecret = isTopSecret(stack);
// Пропускаем не TOP SECRET файлы
if (!isTopSecret) continue;
mc.executeTask(() -> {
// Забираем файл
mc.interactionManager.clickSlot(handler.syncId, slot.id, 0, SlotActionType.QUICK_MOVE, mc.player);
});
error(" ");
error("Залутан TOP SECRET");
error(" ");
try {
Thread.sleep(51);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
try {
Thread.sleep(51);
mc.executeTask(() -> {
mc.currentScreen.close();
// У меня почему-то после закрытия сундука не локается курсор, не стал разбираться почему
mc.mouse.lockCursor();
});
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
}
Последнее редактирование: