当前位置: 首页 > 知识库问答 >
问题:

Bukkit我的部分代码只适用于第一人称

明宜年
2023-03-14

我对代码有问题,因为它不能正常工作。这部分代码在第一个播放器上运行时有效

@EventHandler
public void onMove(PlayerMoveEvent event) {
    Player player = event.getPlayer();
    if (plugin.getPlayerEvent(player).equals("spleef")) {
        if (plugin.getInfo().eventstarted) {
            Material b = player.getLocation().getBlock().getType();
            if (b.equals(Material.STATIONARY_WATER) || b.equals(Material.WATER) || event.getPlayer().getLocation().getY() <= 0) {
                if (!lul.contains(player.getName()) && !ended) {
                    ended = true;
                    lul.add(player.getName());
                    plugin.getMethods().basicLose(player);
                }
            }
        }
    }
}

当第二个玩家接触水时,什么也没有发生。没有错误。下面是完整的代码:

package Handlers.EventHandlers.SimpleEvents;

import Mains.MiniEvents;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.player.PlayerMoveEvent;

import java.util.ArrayList;
import java.util.HashSet;

public class Spleef implements Listener {
    public final ArrayList<Location> block = new ArrayList<>();
    public final ArrayList<Location> block2 = new ArrayList<>();
    public static final HashSet<String> lul = new HashSet<>();
    public MiniEvents plugin;

    public Spleef(MiniEvents plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void onBreak(final BlockBreakEvent event) {
        final Player player = event.getPlayer();
        if (plugin.getPlayerEvent(player).equals("spleef")) {
            if (plugin.getInfo().sbefore.contains(event.getPlayer().getName())) {
                event.setCancelled(true);
            } else {
                final Block b = event.getBlock();
                if (player.getItemInHand() != null && !player.getItemInHand().getType().equals(Material.AIR)) {
                    if (b.getType().equals(Material.SNOW_BLOCK)) {
                        event.setCancelled(true);
                        player.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, 80);
                        b.setType(Material.AIR);
                        block.add(b.getLocation());
                        block2.add(b.getLocation());
                    } else {
                        event.setCancelled(true);
                    }
                } else {
                    event.setCancelled(true);
                }
            }
        }
    }

    public static boolean ended = false;

    @EventHandler
    public void onMove(PlayerMoveEvent event) {
        Player player = event.getPlayer();
        if (plugin.getPlayerEvent(player).equals("spleef")) {
            if (plugin.getInfo().eventstarted) {
                Material b = player.getLocation().getBlock().getType();
                if (b.equals(Material.STATIONARY_WATER) || b.equals(Material.WATER) || event.getPlayer().getLocation().getY() <= 0) {
                    if (!lul.contains(player.getName()) && !ended) {
                        ended = true;
                        lul.add(player.getName());
                        plugin.getMethods().basicLose(player);
                    }
                }
            }
        }
    }
}

我很确定第二个玩家的“结束”是真的,所以它不会这样做。

共有1个答案

符国安
2023-03-14

这是因为布尔值结束,您将其设置为 true,但永远无法重置为 false。因此,代码的执行在这里停止:

if (!lul.contains(player.getName()) && !ended) {

因为结束了现在是真的。

要解决这个问题,您可以使用一个< code>HashMap,一个< code>HashMap存储键的值。不过,你必须确保永远不要在HashMaps中存储玩家对象,因为当玩家离开时,这会导致内存泄漏,所以,你应该使用玩家的UUID(你也可以使用他们的名字,但如果玩家的用户名在1.8中改变,可能会导致错误):

Map<UUID, Boolean> ended = new HashMap<UUID, Boolean>();

要获取值,您可以这样做:

ended.get(player.getUniqueId();

不过,确保在获取HashMap之前检查它是否包含密钥,否则可能会得到NullPointerException:

if(ended.containsKey(player.getUniqueId())

要将值放入地图,您可以使用:

ended.put(player.getUniqueId(), boolean);

所以,你的活动应该是这样的:

public static Map<UUID, Boolean> ended = new HashMap<UUID, Boolean>();

@EventHandler
public void onMove(PlayerMoveEvent event) {
    Player player = event.getPlayer();
    if (plugin.getPlayerEvent(player).equals("spleef")) {
        if (plugin.getInfo().eventstarted) {
            Material b = player.getLocation().getBlock().getType();
            if (b.equals(Material.STATIONARY_WATER) || b.equals(Material.WATER) || event.getPlayer().getLocation().getY() <= 0) {
                boolean end = false;
                if(ended.containsKey(player.getUniqueId()){
                    end = ended.get(player.getUniqueId();
                }
                //else{} we don't want to do anything if ended does not contain the player's UUID!
                if (!lul.contains(player.getName()) && !end){
                    ended.put(player.getUniqueId(), true);
                    lul.add(player.getName());
                    plugin.getMethods().basicLose(player);
                }
            }
        }
    }
}
 类似资料:
  • 问题内容: 说我的源在我的src /树中(可能在我的测试/树中)。说我只想编译那棵树的 一部分 。我可能要这样做的原因多种多样。仅作为示例,我可能想要创建最小的jar(不包括某些类),或者我想要最快的编译时间来进行编译。我绝对想编译所有依赖项! 可以使用以下命令从命令行轻松实现: 现在,如何使用蚂蚁来做到这一点?javac ant 任务将编译所有内容: 将对源目录和目标目录进行递归扫描,以编译Ja

  • 所以我正在为我的服务器制作一个 kick/ban 命令,格式是 /kick 名称原因。我让它一切工作,但只能是1个单词和任何排除它的东西,例如会说BattleDash被踢了。 这是我的代码: (此外,如果您不包括一个原因,它会在聊天中出现内部错误,并在控制台中发生异常)

  • 请不要使用“if”语句,除非你在解释为什么没有“if”语句是不可能的。

  • 我正在使用linux的Windows子系统,到目前为止,最好的文本编辑器体验是VS Code-内部人员和他们的WSL远程插件。然而,尽管反复努力,我只在复制功能方面取得了部分成功,在我的WSL(zsh)终端中,我可以键入或来打开代码中的目录。我确实有一个功能可以使用,在代码内部人员中打开WSL目录,但它不通过WSL接口,所以我使用的是powershell/windows环境,我想要所有的linux

  • 我想在屏幕的白色部分使用我的主页,正如我在图片中所指示的。 但是,如您所见,标题已经显示在屏幕的左上角。 我该怎么处理? 我只想把屏幕的一半作为一个内容。标题图片和navbar应该保持固定 null null 我如何设置主要部分?

  • 我的python 2.7脚本在我的Ubuntu系统上工作,如果我称之为使用 或从bash脚本使用 但是如果我从Py魅力调用它,我会得到oauth错误,并且从命令提示符 在导入熊猫行抛出一个错误: 我试过了 如Python Pandas中所述,卸载pip,然后为熊猫、Numpy和smpy安装pip-缺少必需的依赖项['Numpy'] 1 上面使用了标志-升级和-用户来尝试让包应用到我的用户帐户而不是