声明为false

时间:2015-05-06 04:17:51

标签: java boolean bukkit

我目前正在使用1.8 Bukkit API制作一个插件。然而,这个问题与布尔人有关。从我的类文件的开头,我有一个布尔值

的声明
public static boolean lockchat = false;

然后我在类文件中有另一个用于Bukkit命令的布尔值:

public boolean onCommand(CommandSender s, Command cmd, String label, String[] args)

这个布尔值在结尾处返回true,我认为这也使lockchat布尔值返回true。如果我返回false,我很确定命令代码不会返回给用户。

我的问题是在我的代码的这一部分:

if(lockchat == true)
{
    s.sendMessage("unlocked.")
    lockchat = false;
}
else
{
    s.sendMessage("locked.");
    lockchat = true;
}

开头的声明在这里似乎并不重要,因为这总是向我发送解锁的信息。

我已经尝试将声明放在第二个布尔值中,但它会引发错误和警告。

由于第二个布尔值返回true,我认为lockchat布尔值也会返回。如果我将其更改为返回false,lockchat也可能返回false,从而导致另一个问题。

我想找到一种方法让布尔声明保持为false,同时将其更改为第二个布尔值内的true / false,如图所示。我该怎么做?

注意:我的代码中的其他地方都没有使用此变量。

编辑:我不认为这会有所作为,但我正在测试标签字符串为"lockchat",与布尔名称相同。这可能不会改变任何东西,只是提供更多信息。

完整的课程代码:

package dev.td6.duocraft.commands;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;

import dev.td6.duocraft.main.Duocraft;

public class DCCommandLockChat implements CommandExecutor, Listener
{

    Duocraft plugin;

    public DCCommandLockChat(Duocraft instance)
    {
        plugin = instance;
    }

    public String colorize(String msg)
    {
        String coloredMsg = "";
        for(int i = 0; i < msg.length(); i++)
        {
            if(msg.charAt(i) == '&')
                coloredMsg += '§';
            else
                coloredMsg += msg.charAt(i);
        }
        return coloredMsg;
    }

    public static boolean lockchat = false;

    @SuppressWarnings("deprecation")
    public boolean onCommand(CommandSender s, Command cmd, String label, String[] args)
    {

        if(s instanceof Player)
        {
            Player p = (Player) s;

            if(label.equalsIgnoreCase("lockchat"))
            {
                if(p.hasPermission("duocraft.lockchat"))
                {
                    if(args.length >= 1)
                    {
                        if(args.length >= 2)
                        {
                            s.sendMessage("Too many arguments. </lockchat [time]>");
                        }
                        else
                        {
                            if(lockchat == true)
                            {
                                int time = Integer.valueOf(args[0]);
                                s.sendMessage("locked");
                                lockchat = true;
                                plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable()
                                {
                                    @Override
                                    public void run()
                                    {
                                        Bukkit.broadcastMessage("unlocked.");
                                        lockchat = false;
                                        plugin.getServer().getScheduler().cancelTasks(plugin);
                                    }
                                }
                                    , time*20, time*20);
                            }
                            else
                            {
                                int time = Integer.valueOf(args[0]);
                                s.sendMessage("locked.");
                                lockchat = true;
                                plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable()
                                {
                                    @Override
                                    public void run()
                                    {
                                        Bukkit.broadcastMessage("unlocked.");
                                        lockchat = false;
                                        plugin.getServer().getScheduler().cancelTasks(plugin);
                                    }
                                }
                                    , time*20, time*20);
                            }
                        }
                    }
                    else
                    {
                        if(lockchat == true)
                        {
                            s.sendMessage("unlocked");
                            lockchat = false;
                        }
                        else
                        {
                            s.sendMessage("unlocked");
                            lockchat = true;
                        }
                    }
                }
                else
                {
                    p.sendMessage("no access");
                }
            }

        }
        else
        {
            if(label.equalsIgnoreCase("lockchat"))
            {
                if(args.length >= 1)
                {
                    if(args.length >= 2)
                    {
                        s.sendMessage("Too many args. </lockchat [time]>");
                    }
                    else
                    {
                        if(lockchat == true)
                        {
                            int time = Integer.valueOf(args[0]);
                            s.sendMessage("locked.");
                            lockchat = true;
                            plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    Bukkit.broadcastMessage("unlocked.");
                                    lockchat = false;
                                    plugin.getServer().getScheduler().cancelTasks(plugin);
                                }
                            }
                                , time*20, time*20);
                        }
                        else
                        {
                            int time = Integer.valueOf(args[0]);
                            s.sendMessage("locked");
                            lockchat = true;
                            plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    Bukkit.broadcastMessage("unlocked");
                                    lockchat = false;
                                    plugin.getServer().getScheduler().cancelTasks(plugin);
                                }
                            }
                                , time*20, time*20);
                        }
                    }
                }
                else
                {
                    if(lockchat == true)
                    {
                        s.sendMessage("unlocked");
                        lockchat = false;
                    }
                    else
                    {
                        s.sendMessage("unlocked");
                        lockchat = true;
                    }
                }
            }
        }

        return true;
    }

    @EventHandler
    public void chatLocked(AsyncPlayerChatEvent e)
    {
        if(lockchat==false)return;
        Player p = e.getPlayer();
        if(p.hasPermission("duocraft.lockchat.bypass"))return;

        p.sendMessage("chat is locked.");
        e.setCancelled(true);

    }

}

编辑:此外public static boolean lockchat = false;未被任何其他类文件以任何方式修改。

编辑:我正在使用Java 7。

4 个答案:

答案 0 :(得分:2)

您知道,在完整的源代码中,您使用以下代码:

if(lockchat == true)
{
    s.sendMessage("unlocked");
    lockchat = false;
}
else
{
    s.sendMessage("unlocked");
    lockchat = true;
}

更具体地说,您正在发送&#34;解锁&#34;无论代码遵循哪条路径。

编辑:我重新格式化了您的代码以减少一些重复。如果CommandSender是未经许可的玩家或者标签不是&#34; lockchat&#34;,则此版本会快速失败。我推断,目的是执行&#34; / lockchat&#34;没有参数应该立即切换锁定,而使用参数执行它应该使它切换指定的秒数,然后切换回来。下面的代码应该这样做(至少在确保lockchat始终具有预期值的情况下,但我还没有对其进行测试。

另外,我不知道是否会在不同的线程上调用Runnable,但如果是,则应该同步对共享lockchat变量的所有访问。至少,使volatile(如下所述)可以防止线程之间的实际价值混淆。

public static volatile boolean  lockchat    = false;

public boolean onCommand(CommandSender s, Command cmd, String label, String[] args) {
    // If this is not the 'lockchat' command, then fail fast
    if (!label.equalsIgnoreCase("lockchat")) return true;

    // If s is a Player then check the player has permission and fail fast
    // if not.
    if (s instanceof Player) {
        Player p = (Player) s;
        if (!p.hasPermission("duocraft.lockchat")) {
            p.sendMessage("no access");
            return true;
        }
    }

    switch (args.length) {
    case 0:
        lockchat = !lockchat;
        s.sendMessage(lockchatStatus());
        break;
    case 1:
        int ticks = Integer.valueOf(args[0]) * 20;
        final boolean originalLockChat = lockchat;
        lockchat = !originalLockChat;
        s.sendMessage(lockchatStatus());
        plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
            @Override
            public void run() {
                lockchat = originalLockChat;
                Bukkit.broadcastMessage(lockchatStatus() + ".");
                plugin.getServer().getScheduler().cancelTasks(plugin);
            }
        }, ticks, ticks);
        break;
    default:
        s.sendMessage("Too many arguments. </lockchat [time]>");
        break;
    }
    return true;
}

private String lockchatStatus() {
    return lockchat ? "locked" : "unlocked";
}

答案 1 :(得分:1)

正如朱利安的回答所述,无论价值如何,你的代码都会被解锁:

 if(lockchat == true)
                    {
                        s.sendMessage("unlocked");
                        lockchat = false;
                    }
                    else
                    {
                        s.sendMessage("unlocked");
                        lockchat = true;
                    }

根据你关于为什么它没有阻止聊天的评论,你确定你注册了你的听众吗?要注册您的监听器,请将此行放在Main类的onEnable()方法中:

getServer().getPluginManager().registerEvents(new DCCommandLockChat(), this);

其中DCCommandLockChat()是您的Listener类,'this'是扩展JavaPlugin的类。

这基本上是为你的插件注册你的监听器,否则,服务器不会将任何事件传递给你的监听器,因此你的监听器不会知道服务器上会发生什么。

此外,对于返回true或false的方法本身,两个值仍将运行该命令。据我所知,onCommand方法的返回值唯一重要的是你在plugin.yml中使用别名。如果该方法返回false,则服务器将向播放器发送包含别名的消息。除此之外,它并不重要。

答案 2 :(得分:0)

你应该在你的类的构造函数中给布尔(lockchat)你想要的值。

答案 3 :(得分:0)

回答你的问题:

  

我想找到一种方法让布尔声明保持为false,同时将其更改为第二个布尔值内的true / false,如图所示。我该怎么做?

在您想要的任何一个陈述的正文的开头,创建一个临时变量来存储lockChat的值。

boolean lockChatTemp = lockChat;

然后,在函数中使用和修改该值。这样,lockChat将始终保持其价值。

此外,

if (lockChat == true)

可以替换为

if (lockChat)因为括号内的语句评估为boolean,而lockChat已经是boolean