如何在 Minecraft Bukkit 中添加用于交互的冷却时间?

问题描述 投票:0回答:1

我正在为《反恐精英》服务器制作一个插件,以便与朋友一起玩。如何增加武器冷却时间?如果我用 AWP 射击,那就太快了。我对此没有任何想法。

我有一个 java 枚举类 - Gun.java 和 Event 类文件 - PlayerInteractEvent

我正在尝试使用调度程序来启动计时器,但它不起作用。

// Gun.java

package me.imhartash.imhartashguns.Handler;

import me.imhartash.imhartashguns.ImHartashGuns;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.RayTraceResult;

public enum Gun {
    AKM("AKM", 30, Material.GOLD_INGOT, 10, 20),
    GLOCK18("Glock-18", 18, Material.IRON_INGOT, 2, 200);

    // 1 - Name, 2 - Bullets, 3 - Material, 4 - Damage
    private String name;
    private int bulletsNum;
    private Material gunMaterial;
    private int damage;
    private int CD; // Ticks

    Gun(String name, int bulletsNum, Material gunMaterial, int damage, int CD) {
        this.name = name;
        this.bulletsNum = bulletsNum;
        this.gunMaterial = gunMaterial;
        this.damage = damage;
        this.CD = CD;
    }

    public void shot(ItemStack itemStack, Player player) {
        ItemMeta itemMeta = (ItemMeta) itemStack.getItemMeta();

        int bullets = itemMeta.getPersistentDataContainer().get(NamespacedKey.fromString("bullets_num"), PersistentDataType.INTEGER);

        player.sendMessage(bullets + "");

        if (bullets <= 0) {
            return;
        }

        itemMeta.getPersistentDataContainer().set(NamespacedKey.fromString("bullets_num"),
                PersistentDataType.INTEGER, bullets - 1);

        itemStack.setItemMeta(itemMeta);
        // Ray Trace
        RayTraceResult rayTrace = player.getLocation().getWorld().rayTraceEntities(
                player.getEyeLocation(),
                player.getLocation().getDirection(),
                100,
                e -> e != player && e instanceof LivingEntity
        );

        if (rayTrace == null) {
            return;
        }

        LivingEntity target = (LivingEntity) rayTrace.getHitEntity();
        target.damage(damage);
    }

    public void reload(ItemStack itemStack) {
        ItemMeta itemMeta = (ItemMeta) itemStack.getItemMeta();

        itemMeta.getPersistentDataContainer().set(NamespacedKey.fromString("bullets_num"), PersistentDataType.INTEGER, bulletsNum);

        itemStack.setItemMeta(itemMeta);
    }

    public static Gun GetGunByItem(ItemStack itemStack) {
        ItemMeta itemMeta;

        try {
            itemMeta = (ItemMeta) itemStack.getItemMeta();
        } catch (NullPointerException exception) {
            return null;
        }

        String name = itemMeta.getPersistentDataContainer().get(NamespacedKey.fromString("name"), PersistentDataType.STRING);

        if (name == null) {
            return null;
        }

        Gun gun = valueOf(name);
        return gun;
    }

    public String getName() {
        return name;
    }

    public int getBulletsNum() {
        return bulletsNum;
    }

    public Material getGunMaterial() {
        return gunMaterial;
    }

    public int getDamage() {
        return damage;
    }

    public int getCD() {
        return CD;
    }

    private JavaPlugin plugin;

    public void setPlugin(JavaPlugin plugin) {
        this.plugin = plugin;
    }
}
// OnPlayerInteract.java
package me.imhartash.imhartashguns.Events;

import me.imhartash.imhartashguns.Handler.Gun;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;

public class OnPlayerInteract implements Listener {

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
            Gun gun = Gun.GetGunByItem(event.getItem());

            if (gun != null) {
                gun.shot(event.getItem(), event.getPlayer());
            }
        }
    }

}

java minecraft
1个回答
0
投票

我想你可以创建

Map
,当玩家与某些项目交互时,你将在其中存储刻度(或时间戳),并在下一个交互事件中检查/更新它:

  • 如果自上次成功交互以来没有足够的刻度/时间 - 只需取消事件并且不执行任何交互逻辑
  • 如果通过 - 执行逻辑并更新
    Map
© www.soinside.com 2019 - 2024. All rights reserved.