我目前正在使用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。
答案 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
。