• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Hilfe bei Countdown! :/

NinjaGamers

Minecrafter
Registriert
13 November 2012
Beiträge
18
Diamanten
0
Minecraft
Fisell
Hallo leute,

ich versuche schon seit mehreren Tagen einen funktionierenden Countdown zu machen für ein kleines Server Spiel. Das Problem ist das der Countdown nur für einen Spieler funktioniert und nicht für alle die ins Spiel rein gegangen sind. Hier mein Code:
HTML:
	public static int Countdown;
	static int count = Integer.parseInt(b.getConfig().getString("Config.Countdown"));
	public static boolean countdownRunning = false;

	public static void startCountdown(final Bounce b, final Player p) {
		countdownRunning = false;
		Countdown = b.getServer().getScheduler().scheduleSyncRepeatingTask(b, new Runnable() {
			
			public void run() {
				
				countdownRunning = true;
				
				if(count != -1) {
					if(count != 0){
						for(int i = 0; i < b.playersInGame.size(); i++) {
							p.sendMessage(b.prefix_p + ChatColor.GREEN + "Spiel startet in " + ChatColor.GOLD + count + ChatColor.GREEN +  " Sekunden!");
						    count--;
						}
					
				} else {
					for(int i = 0; i < b.playersInGame.size(); i++) {
					    
					    startGame(b, p);
						Bukkit.getScheduler().cancelTask(Countdown);
					    countdownRunning = false;
						setCount();
					}
					}
				}
				
			}
			
			public void setCount(){
					 count = 30;
			}
			
		},0L, 20L);	
	}

Das ist der Countdown zum Spiel starten und meine startGame() Methode ist hier:
HTML:
        public static boolean gameRunning  = false;
	public static int Game;
	public static int gameTime = Integer.parseInt(b.getConfig().getString("Config.GameTime"));
	public static void startGame(final Bounce b, final Player p) {
		gameRunning = false;
		
		World gameWorld = b.getServer().getWorld(b.getConfig().getString("Config.Game.Arena1.world"));
		Location game = new Location(gameWorld, b.getConfig().getDouble("Config.Game.Arena1.x"), b.getConfig().getDouble("Config.Game.Arena1.y"), b.getConfig().getDouble("Config.Game.Arena1.z"));
		p.teleport(game);
		
		p.sendMessage(b.prefix_p + ChatColor.DARK_PURPLE + "The game has started! Good luck! :)");
		
		Game = b.getServer().getScheduler().scheduleSyncRepeatingTask(b, new Runnable() {
			
			public void run() {
				
				gameRunning = true;
				
				if(gameTime != -1) {
					if(gameTime == 10){
						
						for(int i = 0; i < b.playersInGame.size(); i++) {
							p.sendMessage(b.prefix_p + ChatColor.GREEN + "The game ends in 10 seconds!");
						}
						
				if(gameTime != 0) {
						gameTime--;
						if(gameTime == 10){
							
							for(int i = 0; i < b.playersInGame.size(); i++) {
								p.sendMessage(b.prefix_p + ChatColor.GREEN + "The game ends in 10 seconds!");
							}
					}
				} else {
					for(int i = 0; i < b.playersInGame.size(); i++) {
					stopGame(b, p);
					Bukkit.getScheduler().cancelTask(Game);
					gameRunning = false;
					}
				}
					}
				}
			}
		}, 0L, 20L);
		
	}

Bitte helft mir und sagt mir was ich falsch gemacht habe :(

MfG Fisell
 

NinjaGamers

Minecrafter
Registriert
13 November 2012
Beiträge
18
Diamanten
0
Minecraft
Fisell
ich hab einfach einen neuen timer in der methode startCountdown() gemacht also einfach:

Code:
public int countdown = 30;
	public void startCountdown(final PLUGINNAME a, final int arena){
		final Timer t = new Timer();
		sendGameMessage("§bEs sind genügend Spieler online! §dDas Spiel startet in 30 Sekunden!", b, arena);
        final TimerTask Countdown = new TimerTask() {
            public void run() {
	               if(countdown == 0){
						startGame(a, arena);
						t.cancel();
	               }
	               else{
		               countdown--;
		               for(Player p : a.arenaleute.get(arena)){
		            	   p.setLevel(countdown);
		               }
		               if(countdown == 20){
		            	   sendGameMessage(a.prefix_p + "§2Das Spiel startet in " + countdown + " Sekunden", a, arena);
		               }
		               if(countdown <= 10){
		            	   sendGameMessage(b.prefix_p + "§2Das Spiel startet in " + countdown + " Sekunden!", a, arena);
		               }
	               }
	               if(countdown <= 5){
	            	     playSoundCountdown(a, arena);
	               }
            }
        };
        t.scheduleAtFixedRate(Countdown, 1000, 1000);
	}
 
C

Chrisliebaer

Guest
Hast du den Code denn schon getestet? Du rufst da Player.setLevel() innerhalb des Timer Threads auf. Wenn du Pech hast, kann das bis zu einem Servercrash führen. Dazu kommen dann noch eine ganze Reihe weitere Aufrufe außerhalb des Main-Threads. Vor allem startGame() sieht sehr nach einem potentiellen Crash aus.

Je nach dem, wie a die Spieler ermittelt kannst du auch hier in Threadingprobleme kommen. Es ist zwar aufgrund der kurzen Ausführungszeit des Timers extrem unwahrscheinlich, aber sicher ist es nicht.
 
Zuletzt bearbeitet von einem Moderator:

Jorre222

Minecrafter
Registriert
11 Juli 2013
Beiträge
22
Diamanten
0
Minecraft
Gambero77
Beispielcode

Code:
Integer i = 30;
Integer i2 = 0;

i2 = Bukkit.getScheduler.scheduleSyncDelayedTask(this, new Runnable() {
    if(i == 0) {
        i = 30;
        Bukkit.getScheduler.cancelTask(i2);
    }    
    i = i - 1;
    player.sendMessage("Noch '" + i + "' Sekunden!");
}, 0L, 20L);

ArrayList<String> gameplayers = new ArrayList<String>();

public void SpielJoin() {
if(gameplayers.contains(player.getName())) {
player.sendMessage("Du bist schon im Spiel");
} else {
gameplayers.add(p.getName());
}
}

public void SpielQuit() {
if(gameplayers.contains(player.getName())) {
gameplayers.remove(player.getName());
} else {
player.sendMessage("Du bist in keinem Spiel!");
}
}

for (Player rs : Bukkit.getOnlinePlayers()) {
if(gameplayers.contains(player.getName) {
rs.sendMessage("Noch ....");
}
}

Aus dem Kopf geschrieben! Daher könnte es 1 / 2 Fehler geben!
 
Zuletzt bearbeitet:
Oben