我怎样才能对玩家产生力场效应?
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
希望对您有所帮助!
我想让玩家在一段时间内不受伤害和所有击退(坠落伤害除外)。我的问题是 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
希望对您有所帮助!