我怎样才能对玩家产生力场效应?

How could I make a force field effect on a player?

我想让玩家在一段时间内不受伤害和所有击退(坠落伤害除外)。我的问题是 bukkit runable 没有按预期运行:

  public class WeaponEvents implements Listener {
private Elemental_weapons plugin;
ArrayList<UUID> forceFieldArray = new ArrayList<UUID>();

@EventHandler
public void onplayercrouchevent(PlayerToggleSneakEvent event) {
    boolean issneaking = event.isSneaking();
    Player player = event.getPlayer();
    if (issneaking==true) {

        if (player.getInventory().getChestplate().equals(Weapons.chestplate)) {

            forceFieldArray.add(player.getUniqueId());
            Bukkit.broadcastMessage(String.valueOf(forceFieldArray));
            new BukkitRunnable() {
                @Override
                public void run() {
                    Bukkit.broadcastMessage("no more");
                    forceFieldArray.remove(player.getUniqueId());
                }
            }.runTaskLater( plugin, 200L);
            while (forceFieldArray.contains(player.getUniqueId())) {

            }
        }
    }
}

我会通过数组来做到这一点,比如说

ArrayList<UUID> forceFieldArray = new ArrayList<UUID>();

然后,每当您想激活玩家的力场时,使用 BukkitRunnable 设置延迟任务。

forceFieldArray.add(player.getUniqueId());
new BukkitRunnable() {
    @Override
    public void run() {
        forceFieldArray.remove(player.getUniqueId());
    }
}.runTaskLater(plugin, 200L);

请记住,其中的“200L”是滴答声,20 滴答声等于一秒,所以 200L 是 10 秒。这会将玩家添加到数组中,然后在十秒内移除玩家。使用这个,您现在可以使用该数组来检查玩家是否激活了力场。

public void onPlayerDamage(EntityDamageEvent e) {
    //Check if entity is player
    //Create player variable
    if(e.getCause() == DamageCause./*[Damage type you want to cancel]*/) {
        if(forceFieldArray.contains(player.getUniqueId())) {
            e.setCancelled(true);
        }
    }
}

通过这种方式,您甚至可以在其中进行配置,其中包含您希望力场阻止的所有类型的损坏,然后在 ifs 上方将该数据放入数组并说 if(configArray.contains(e.getCause()) { //Do stuff

希望对您有所帮助!