ein kleines bisschen bukkit ;)
lima-city → Forum → Programmiersprachen → Java
anwenden
array
block
code
falle
funktion
import
list
mode
null
objekt
output
sagen
schleife
sender
server
string
system
ticks
url
-
Hi,
ich kenne mich nur gut mit PHP und Python aus, habe aber gerade Lust ein kleines eigenes Plugin für Bukkit (minecraft) zu basteln. Da ich wie gesagt von Java nicht wirklich Ahnung habe stehe ich auch schon direkt vor meinem ersten Problem, das ich gerade nicht gelöst bekomme.
// Dividing Players into Groups Player[] Runners = null; Player[] Pursuers = null; Player[] list = Bukkit.getOnlinePlayers(); for (int i = 0;i < list.length;i++) { if(Runners.length * 2 == Pursuers.length) { Runners[i] = list[i]; } else { Pursuers[i] = list[i]; } }
Null pointer access: The variable Runners can only be null at this location
Ja, mir ist schon klar was die Fehlermeldung bedeutet, nämlich dass die Arrays Runners und Pursuers in der for Schleife beide null sind und er deswegen von "null" nicht einfach die Länge nehmen kann. Das Problem ist aber, wenn ich das = null; weglasse und einfach nur Player[] Runners; initialisiere, dann meckert er in der forschleife, dass beide nicht initialisiert sind. Was soll ich jetzt bitte tun? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Genau das was dir der Compiler rät. -> initialisiere die Felder und alles ist gut.
Auch wenn die Syntax recht ähnlich zu PHP oder Python ist, komplett ohne Java-Kentnisse wirst du nicht wirklich weit kommen beim Programmieren.
mfg -
Das was du da initialisiert hast ist ein Array. Array haben eine feste Grösse in Java. Die Grösse wird nicht wie in PHP erweitert. Da du die Grösse kennst kannst du es folgendermaßen lösen:
Player[] list = Bukkit.getOnlinePlayers(); Player[] Runners = new Player[list.length]; Player[] Pursuers = new Player[list.length];
Array ist Ein Objekt und mit new wird es Instantiiert. In Java wird diese Objekt separat verarbeitet da man nicht die Generics und den Konstruktor verwendet. Dieser Code entspricht:
Array<Player> list = Bukkit.getOnlinePlayers(); Array<Player> Runners = new Array<Player>(list.length); Array<Player> Pursuers = new Array<Player>(list.length);
Wenn es das Objekt Array gäbe. -
midwar schrieb:
Es bleibt noch die Frage was dieser Code machen soll...
for (int i = 0;i < list.length;i++) { if(Runners.length * 2 == Pursuers.length) { Runners[i] = list[i]; } else { Pursuers[i] = list[i]; } }
Hoffentlich ist dir klar, dass sich die Länge von Runners sowie Pursuers nie während der for-Schleife ändert.
Dir ist hoffentlich auch klar, dass wenn hier bei dem if aus irgend einem Grund während der Schleife einmal der eine Teil und dann irgendwann mal der andere Teil ausgeführt werden würde, in deinem Array ein Loch, welches mit
gefüllt wird, entstehen würde.null
-
Ok, danke hab ich kapiert und angepasst.
Was bedeutet eigentlich bei Java genau static? Ich bekomme bei einer stinknormalen Funktion, die ich 60 Codezeilen vorher bereits ohne Fehlermeldung anwende immer diese Meldung:
Cannot make a static reference to the non-static method getServer() from the type JavaPlugin
Es geht dabei um diesen Code: World world = getServer().getWorlds().get(0); -
Static ist das Codewort für Klassenvariabeln und Klassenmethoden. Jetzt in diesem falle, kann ich dir nicht sagen was falsch ist an deinem Code. Wichtig ist, dass statische Methoden immer auf die Klasse und nicht auf ein Objekt ausführbar sind.
z.B.;
private ArrayList al=new ArrayList(); al.dasIstEineNormaleMethode(); ArrayList.dasIstEineStatischMethode
Lg -
mpro schrieb:
Dann kannst du Java wohl nicht gut genug...
Jetzt in diesem falle, kann ich dir nicht sagen was falsch ist an deinem Code.
midwar schrieb:
Dieser Code wird irgendwo innerhalb einer
Es geht dabei um diesen Code: World world = getServer().getWorlds().get(0);
-Funktion aufgerufen. Die Funktionstatic
ist aber nicht als static deklariert (was so auch vermutlich stimmt), und deshalb bekommst du die Fehelrmeldung.getServer()
Du versuchst auf eine Klassenfunktion zuzugreifen, obwohl es bei static keine Instanz der Klasse gibt... du darfst also die eine Funktion in der du deine Zeile stehen nicht static haben, oder du hast in dieser static-Funktion ein Objekt auf das du dann
anwenden kannst.obj.getServer()
-
Ok, hab ich verstanden nur kann ich keinen der Vorschläge hierauf anwenden:
import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.World; //import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import java.util.Timer; import java.util.TimerTask; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.plugin.java.JavaPlugin; public class HideAndSeek extends JavaPlugin { @Override public void onDisable() { // When the plugin is disabled System.out.println("HideAndSeek disabled!"); } @Override public void onEnable() { // When the plugin is enabled System.out.println("HideAndSeek enabled!"); World world = getServer().getWorlds().get(0); world.setAutoSave(false); world.save(); getServer().getPluginManager().registerEvents(new LoginListener(), this); getServer().getPluginManager().registerEvents(new BlockListener(), this); getServer().getPluginManager().registerEvents(new SneakListener(), this); getServer().getPluginManager().registerEvents(new DeathListener(), this); } public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){ // Command to start a new round if(cmd.getName().equalsIgnoreCase("newround")){ new Round(); World world = getServer().getWorlds().get(0); Round.main(sender,world); } return false; } public class LoginListener implements Listener { // Sets every logged_in player to sneak-mode @EventHandler public void normalLogin(PlayerJoinEvent event) { Player p = event.getPlayer(); p.setSneaking(true); } } public class BlockListener implements Listener { // Stops every player from breaking blocks @EventHandler public void BlockBreak(BlockBreakEvent event) { Player p = event.getPlayer(); p.sendMessage("You are not allowed to break Blocks on this map!"); event.setCancelled(true); } } public class SneakListener implements Listener { // If someone wants to stop his sneak mode, the event get cancelled @EventHandler public void SneakChange(PlayerToggleSneakEvent event) { event.setCancelled(true); } } public class DeathListener implements Listener { // If someone dies teleports them into save room and delete them from current Groups // what if a round hasnt startet? @EventHandler public void DeathTeleport(PlayerDeathEvent event) { Player p = event.getEntity(); p.sendMessage("You have died. Wait until the round has ended!"); //p.teleport(TARGET); /*for(int i = 0; i < Round.Runners.length;i++) { if(Round.Runners[i] == p) { Round.Runners[i] = null; } else { Round.Pursuers[i] = null; } } System.out.println(Round.Runners); System.out.println(Round.Pursuers);*/ } } void reload() { Server server = getServer(); server.reload(); } public static class Round { static Timer timer; static boolean running = false; static Player[] Runners = {}; static Player[] Pursuers = {}; static World current; public static void main(CommandSender sender,World world) { // Starts a new round if(running == false) { current = world; running = true; // Dividing Players into Groups /*Player[] list = Bukkit.getOnlinePlayers(); for (int i = 0;i < list.length;i++) { if(Runners.length * 2 == Pursuers.length) { Runners[i] = list[i]; } else { Pursuers[i] = list[i]; } } System.out.println(Runners); System.out.println(Pursuers);*/ timer = new Timer(); timer.schedule(new timerTask(),0,1000); } else { sender.sendMessage("The current Round is still running!"); } } public static void showTimer(int time) { // Output to every Player about the time this round still got Player[] list = Bukkit.getOnlinePlayers(); for(Player p : list){ p.sendMessage("Time in this Round left: " + time + " Seconds"); } } static class timerTask extends TimerTask { int ticks = 0; int timeleft = 0; int[] data = {200,100,60,30,10,9,8,7,6,5,4,3,2,1,0}; public void run() { if(ticks < 100) { // Every tick of a running round timeleft = 99-ticks; ticks++; for(int i = 0;i < data.length;i++) { if(data[i] == timeleft) { // Shows only specific outputs Round.showTimer(timeleft); } } } else { // If a round has ended timer.cancel(); System.out.println("[HideAndSeek]: Round finished!"); HideAndSeek.reload(); /*Location runners; Location pursuers; for(Player p : Runners) { p.teleport(runners); } for(Player p : Pursuers) { p.teleport(pursuers); } */ running = false; } } } } }
(das ist der gesamte Code von mir bisher).
Es geht um das HideAndSeek.reload(); ganz unten. Ich möchte einfach nur, dass wenn eine Spielrunde zu ende ist der Server ganz stumpf restartet und die Map neu lädt (eigentlich möchte ich nur, dass die Map neu lädt). Das heißt der reload() Befehl muss genau dort unten ausgeführt werden will. Allerdings kann ich das static von TimerClass bzw. Round dadrüber nicht wegnehmen, weil dann der andere Kram nicht mehr funktioniert - will heißen diese Möglichkeit fällt schon mal raus. Und in der reload() Funktion ein Objekt von org.bukkit.Server zu erzeugen geht auch nicht. Dementsprechend kann ich dadurch nicht obj.reload() anwenden. Also was macht man bitte in so einem Fall? -
Moin,
warum bitte nutzt Du auch statische Elemente?
Die sind doch hier überhaupt nicht notwendig und demnach fehl am Platz. Bitte ändere diese Statik zu einem richtigen Objekt, dann kannst Du ordentlich mit den Funktionen von Bukkit arbeiten.
Gruß,
Pawnee -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage