所以我试图在Bukkit中发出一个命令,传送给一个新玩家(一个没玩过三十多分钟的玩家),这样他们就可以欢迎他们了。一切都很好,但我意识到玩家可以发送垃圾邮件并连续传送到同一个玩家,以利用你获得的欢迎玩家的经验奖励。
我尝试通过使用List创建HashMap来修复此问题,但它似乎无法解决问题。这是我的代码
//Map that is having the issues.
Map<String, List<String>> welcome = new HashMap<String, List<String>>();
//This is set to true if a player is matched
boolean found = false;
//This is just initialized before the loop.
Player targetPlayer = player;
//I'm checking if the HashMap contains the player that executed this command
if(!welcome.containsKey(player.getName()))
{
welcome.put(player.getName(), new ArrayList<String>());
}
//The "welcome" is an ArrayList that contains players that have not been
//online for more than thirty minutes.
for(String offlinePlayer : TheAura.welcome)
{
//This is to check if player is online.
Player onlinePlayer = Bukkit.getPlayer(offlinePlayer);
//Ditto from above.
if(onlinePlayer != null)
{
//This is where the issue lies I believe. It's checking if the
//HashMap contains the target player.
if(!welcome.get(player.getName()).contains(onlinePlayer.getName()))
{
//Checks the player's mode, ignore
String mode1 = TheAura.settings.getData().getString(onlinePlayer.getUniqueId() + ".mode");
//Ditto from above.
if(mode1.equalsIgnoreCase("easy"))
{
//If passed all of this, found is true.
found = true;
//Variable from earlier
targetPlayer = onlinePlayer;
//Since it found a match, add the target player to the Map's
//List.
welcome.get(player.getName()).add(onlinePlayer.getName());
}
}
}
}
我确信我错过了一个小小的东西,这只是一个愚蠢的错误,但我真的无法弄清楚出了什么问题:/任何帮助都非常感激。
编辑:好的,非常抱歉你们有些人不理解。我添加了评论。我也调试了一下,Map输出“{Shortninja66 = [Shortninja66]}”,这让我感到困惑。地图中有相同的内容,但它在if语句中没有看到它?想象一下,Map的工作原理如下: Shortninja66(欢迎一些玩家的玩家):player1,player2。 Player1(另一位受欢迎的球员):Shortninja66。 希望这只是有点意义。我希望每个球员都有他们自己欢迎的球员名单。
答案 0 :(得分:0)
好的,让我们来看看代码:
1-创建一个新的hashMap
Map<String, List<String>> welcome = new HashMap<String, List<String>>();
&lt; - 每次运行此代码创建新的HashMap?
2-为玩家创建新列表
if(!welcome.containsKey(player.getName()))
{
welcome.put(player.getName(), new ArrayList<String>());
}
&lt; - 现在此时欢迎地图肯定是空的,因此玩家所链接的数组也是如此。
3-将玩家添加到玩家列表中
if(mode1.equalsIgnoreCase("easy"))
{
//If passed all of this, found is true.
found = true;
//Variable from earlier
targetPlayer = onlinePlayer;
//Since it found a match, add the target player to the Map's
//List.
welcome.get(player.getName()).add(onlinePlayer.getName());
}
&lt; - 它只会在mode1 is "easy"
时添加播放器。这里有可能的损失
从这段代码中我至少看到了可能发生错误的3点。因此,代码很乱,需要根据需求进行修改。
由于我不了解完整的要求,此时我唯一可以提供的帮助是encapsulate
将您的代码转换为更小的方法。
答案 1 :(得分:0)
最后,我回答了我的问题。
我修改了我的代码并封装了一些代码,将它分成更小的方法,如@nafas建议的。但是,我的问题不是代码本身,而是我想的代码方法。 Bukkit API通常使用一种通常类似于&#34; public boolean onCommand的方法(...&#34;但我使用了一个接口,所以我可以将每个命令分成它们自己的类,使它变得漂亮和整洁。当我切换时我的代码转到布尔方法,它起作用了。唯一的区别是我回来了#34; true&#34;当找到一个玩家时。
我发现这有点奇怪,但我想这是有道理的。感谢所有帮助我的人!