kostenloser Webspace werbefrei: lima-city


ein kleines bisschen bukkit ;)

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    m****r

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. 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. :wink:
  5. midwar schrieb:
    for (int i = 0;i < list.length;i++) {
    	if(Runners.length * 2 == Pursuers.length) {
    		Runners[i] = list[i];			
    	} else {
    		Pursuers[i] = list[i];
    	}
    }
    Es bleibt noch die Frage was dieser Code machen soll...
    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
    null
    gefüllt wird, entstehen würde.
  6. Autor dieses Themas

    m****r

    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);
  7. 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
  8. mpro schrieb:
    Jetzt in diesem falle, kann ich dir nicht sagen was falsch ist an deinem Code.
    Dann kannst du Java wohl nicht gut genug... ;-)
    midwar schrieb:
    Es geht dabei um diesen Code: World world = getServer().getWorlds().get(0);
    Dieser Code wird irgendwo innerhalb einer
    static
    -Funktion aufgerufen. Die Funktion
    getServer()
    ist aber nicht als static deklariert (was so auch vermutlich stimmt), und deshalb bekommst du die Fehelrmeldung.
    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
    obj.getServer()
    anwenden kannst.
  9. Autor dieses Themas

    m****r

    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?
  10. 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
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!