Создание мода на выбрасывание предмета в руке.
  • KPUTHEW
    KPUTHEW
    18 июля 2025 - 15:10
    Вы не авторизованы, войдите на сайт.
  • просмотра 24 | ответов 7
Думаю как можно создать мод на выбрасывание предмета в руке раз в 3.1 минуту. При этом что бы он активировался при нажатии кнопки V , работал при свернутом Minecraft (т.е Зависил от тиков) и работал на сервере. Все мои попытки сделать мод на forge 1.19.2 либо очень плохие либо не работают.
  • Алексей
    Алексей
    18 июля 2025 - 15:13
Любой предмет или нужен конкретный? Обязательно ли должен быть мод, если это для сервера?
  • KPUTHEW
    KPUTHEW
    18 июля 2025 - 15:36
Да он на сервере должен работать, А так вообще любой предмет который игрок держит в руке...
  • Filty
    Filty
    18 июля 2025 - 15:47
ПРИМЕР
@Mod("itemthrowermod")
public class ItemThrowerMod {
public static final String MOD_ID = "itemthrowermod";

public ItemThrowerMod() {
MinecraftForge.EVENT_BUS.register(this);
}
}


public class EventHandler {
private static boolean isActive = false;
private static int timer = 0;
private static final int INTERVAL = 3600; // 3 минуты (20 тиков/сек * 60 сек * 3)

@SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.END) {
// Проверяем нажатие клавиши V
if (KeyBindings.throwKey.isPressed()) {
isActive = !isActive;
if (isActive) {
timer = 0; // Сброс таймера при активации
}
}

// Если функция активна, увеличиваем таймер
if (isActive) {
timer++;

// Проверяем, прошло ли 3 минуты
if (timer >= INTERVAL) {
throwItem();
timer = 0; // Сбрасываем таймер
}
}
}
}

private void throwItem() {
Minecraft mc = Minecraft.getInstance();
if (mc.player != null) {
// Получаем предмет в руке
ItemStack heldItem = mc.player.getHeldItemMainhand();

if (!heldItem.isEmpty()) {
// Выбрасываем предмет
mc.player.dropItem(heldItem, false, true);

// Уменьшаем количество предметов в руке
heldItem.shrink(1);
}
}
}
}


public class KeyBindings {
public static final KeyMapping throwKey;

static {
throwKey = new KeyMapping(
"key.itemthrowermod.throw",
GLFW.GLFW_KEY_V,
"key.categories.itemthrowermod"
);
}

public static void register() {
ClientRegistry.registerKeyBinding(throwKey);
}
}


public ItemThrowerMod() {
MinecraftForge.EVENT_BUS.register(new EventHandler());
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::clientSetup);
}

private void clientSetup(final FMLClientSetupEvent event) {
KeyBindings.register();
}


modLoader="javafml"
loaderVersion="[36,)"
license="All rights reserved"
[[mods]]
modId="itemthrowermod"
version="${file.jarVersion}"
displayName="Item Thrower Mod"
authors="YourName"
description='''
Мод, который выбрасывает предмет из руки игрока каждые 3 минуты после нажатия V.
'''
  • Алексей
    Алексей
    18 июля 2025 - 15:54
Да он на сервере должен работать, А так вообще любой предмет который игрок держит в руке...

У всех игроков на сервере или только у игрока, который сам нажмет у себя на клавиатуре клавишу V?
  • Luxury
    Luxury Minecraft
    18 июля 2025 - 18:41
Моды ни разу не пробовал делать, а если плагин, то вот, пожалуйста.
shift+ПКМ

Main.class
package me.ItemThrower;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

public class Main extends JavaPlugin implements Listener {

private final Map<UUID, BukkitTask> activeTasks = new HashMap<>();
private final Set<UUID> droppedItems = new HashSet<>();
private FileConfiguration config;
private File configFile;

@Override
public void onEnable() {
// Создание папки плагина
if (!getDataFolder().exists()) {
getDataFolder().mkdirs();
}

// Инициализация конфига
configFile = new File(getDataFolder(), "config.yml");
if (!configFile.exists()) {
try {
configFile.createNewFile();
config = YamlConfiguration.loadConfiguration(configFile);
config.set("throw-interval", 3);
config.set("activation-key", "SHIFT_RIGHT_CLICK"); // или "SHIFT_LEFT_CLICK"
config.save(configFile);
} catch (IOException e) {
getLogger().severe("Ошибка создания config.yml!");
}
} else {
config = YamlConfiguration.loadConfiguration(configFile);
}

// Регистрация событий
Bukkit.getPluginManager().registerEvents(this, this);
getLogger().info("Плагин включен. Активация: " + config.getString("activation-key"));
}

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
String activation = config.getString("activation-key", "SHIFT_RIGHT_CLICK");
event.getPlayer().sendMessage("§aИспользуйте §e" + activation.replace("_", " ") + "§a для выброса предметов");
}

@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
String requiredAction = config.getString("activation-key", "SHIFT_RIGHT_CLICK");

// Проверяем нужное сочетание клавиш
boolean isRightClick = event.getAction().name().contains("RIGHT_CLICK");
boolean isLeftClick = event.getAction().name().contains("LEFT_CLICK");
boolean isShift = event.getPlayer().isSneaking();

if ((requiredAction.equals("SHIFT_RIGHT_CLICK") && isRightClick && isShift) ||
(requiredAction.equals("SHIFT_LEFT_CLICK") && isLeftClick && isShift)) {

toggleAutoThrow(event.getPlayer());
}
}

private void toggleAutoThrow(Player player) {
UUID playerId = player.getUniqueId();
int intervalTicks = config.getInt("throw-interval", 3) * 20;

if (activeTasks.containsKey(playerId)) {
// Остановка
activeTasks.get(playerId).cancel();
activeTasks.remove(playerId);
player.sendMessage("§cАвтовыброс остановлен");
return;
}

// Запуск
BukkitTask task = Bukkit.getScheduler().runTaskTimer(this, () -> {
ItemStack handItem = player.getInventory().getItemInMainHand();

if (handItem == null || handItem.getType().isAir()) {
player.sendMessage("§cВ руке нет предмета!");
stopAutoThrow(playerId);
return;
}

// Создаем копию (1 предмет)
ItemStack toDrop = new ItemStack(handItem.getType(), 1);
toDrop.setItemMeta(handItem.getItemMeta());

// Уменьшаем количество в руке
if (handItem.getAmount() > 1) {
handItem.setAmount(handItem.getAmount() - 1);
} else {
player.getInventory().setItemInMainHand(null);
}

// Выбрасываем с небольшим импульсом
Item dropped = player.getWorld().dropItemNaturally(
player.getLocation().add(0, 1.5, 0),
toDrop
);
dropped.setVelocity(new Vector(
(Math.random() - 0.5) * 0.2,
0.3,
(Math.random() - 0.5) * 0.2
));

// Помечаем предмет, чтобы предотвратить мгновенный подбор
droppedItems.add(dropped.getUniqueId());
Bukkit.getScheduler().runTaskLater(this, () -> {
droppedItems.remove(dropped.getUniqueId());
}, 20); // Защита на 1 секунду

}, 0L, intervalTicks);

activeTasks.put(playerId, task);
player.sendMessage("§aАвтовыброс активирован! §7(Интервал: " +
config.getInt("throw-interval") + " сек)");
}

@EventHandler
public void onItemPickup(org.bukkit.event.player.PlayerPickupItemEvent event) {
if (droppedItems.contains(event.getItem().getUniqueId())) {
event.setCancelled(true); // Блокируем подбор в течение 1 секунды
}
}

private void stopAutoThrow(UUID playerId) {
BukkitTask task = activeTasks.remove(playerId);
if (task != null) {
task.cancel();
}
}

@Override
public void onDisable() {
activeTasks.values().forEach(BukkitTask::cancel);
activeTasks.clear();
}
}


plugin.yml
name: AutoItemThrower
version: 1.0
main: me.ItemThrower.Main
api-version: "1.20"
  • KPUTHEW
    KPUTHEW
    18 июля 2025 - 20:43
Да он на сервере должен работать, А так вообще любой предмет который игрок держит в руке... У всех игроков на сервере или только у игрока, который сам нажмет у себя на клавиатуре клавишу V?

спасибо огромное!
  • KPUTHEW
    KPUTHEW
    18 июля 2025 - 20:43
Да он на сервере должен работать, А так вообще любой предмет который игрок держит в руке... У всех игроков на сервере или только у игрока, который сам нажмет у себя на клавиатуре клавишу V?

спасибо огромное!
Моды ни разу не пробовал делать, а если плагин, то вот, пожалуйста.shift+ПКМ

Тоже спасибо! Надеюсь пригодиться.