ServerPlugin Hilfe bei Countdown! :/

Dieses Thema im Forum "Programmierung" wurde erstellt von NinjaGamers, 10. August 2013.

  1. NinjaGamers
    Offline

    NinjaGamers

    Registriert seit:
    13. November 2012
    Beiträge:
    18
    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:
    1.  
    2.     public static int Countdown;
    3.     static int count = Integer.parseInt(b.getConfig().getString("Config.Countdown"));
    4.     public static boolean countdownRunning = false;
    5.  
    6.     public static void startCountdown(final Bounce b, final Player p) {
    7.         countdownRunning = false;
    8.         Countdown = b.getServer().getScheduler().scheduleSyncRepeatingTask(b, new Runnable() {
    9.            
    10.             public void run() {
    11.                
    12.                 countdownRunning = true;
    13.                
    14.                 if(count != -1) {
    15.                     if(count != 0){
    16.                         for(int i = 0; i < b.playersInGame.size(); i++) {
    17.                             p.sendMessage(b.prefix_p + ChatColor.GREEN + "Spiel startet in " + ChatColor.GOLD + count + ChatColor.GREEN +  " Sekunden!");
    18.                             count--;
    19.                         }
    20.                    
    21.                 } else {
    22.                     for(int i = 0; i < b.playersInGame.size(); i++) {
    23.                        
    24.                         startGame(b, p);
    25.                         Bukkit.getScheduler().cancelTask(Countdown);
    26.                         countdownRunning = false;
    27.                         setCount();
    28.                     }
    29.                     }
    30.                 }
    31.                
    32.             }
    33.            
    34.             public void setCount(){
    35.                      count = 30;
    36.             }
    37.            
    38.         },0L, 20L);
    39.     }
    Das ist der Countdown zum Spiel starten und meine startGame() Methode ist hier:
    HTML:
    1.  
    2.         public static boolean gameRunning  = false;
    3.     public static int Game;
    4.     public static int gameTime = Integer.parseInt(b.getConfig().getString("Config.GameTime"));
    5.     public static void startGame(final Bounce b, final Player p) {
    6.         gameRunning = false;
    7.        
    8.         World gameWorld = b.getServer().getWorld(b.getConfig().getString("Config.Game.Arena1.world"));
    9.         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"));
    10.         p.teleport(game);
    11.        
    12.         p.sendMessage(b.prefix_p + ChatColor.DARK_PURPLE + "The game has started! Good luck! :)");
    13.        
    14.         Game = b.getServer().getScheduler().scheduleSyncRepeatingTask(b, new Runnable() {
    15.            
    16.             public void run() {
    17.                
    18.                 gameRunning = true;
    19.                
    20.                 if(gameTime != -1) {
    21.                     if(gameTime == 10){
    22.                        
    23.                         for(int i = 0; i < b.playersInGame.size(); i++) {
    24.                             p.sendMessage(b.prefix_p + ChatColor.GREEN + "The game ends in 10 seconds!");
    25.                         }
    26.                        
    27.                 if(gameTime != 0) {
    28.                         gameTime--;
    29.                         if(gameTime == 10){
    30.                            
    31.                             for(int i = 0; i < b.playersInGame.size(); i++) {
    32.                                 p.sendMessage(b.prefix_p + ChatColor.GREEN + "The game ends in 10 seconds!");
    33.                             }
    34.                     }
    35.                 } else {
    36.                     for(int i = 0; i < b.playersInGame.size(); i++) {
    37.                     stopGame(b, p);
    38.                     Bukkit.getScheduler().cancelTask(Game);
    39.                     gameRunning = false;
    40.                     }
    41.                 }
    42.                     }
    43.                 }
    44.             }
    45.         }, 0L, 20L);
    46.        
    47.     }
    Bitte helft mir und sagt mir was ich falsch gemacht habe :(

    MfG Fisell
     
    #1
  2. NinjaGamers
    Offline

    NinjaGamers

    Registriert seit:
    13. November 2012
    Beiträge:
    18
    Minecraft:
    Fisell
    Habs mit nem Timer gemacht #Closed !
     
    #2
  3. abbix
    Offline

    abbix Gesperrt

    Registriert seit:
    23. August 2013
    Beiträge:
    19
    Vielleicht haben noch andere Leute das selbe Problem - Würdest du denen zeigen, wie du es hinbekommen hast?
     
    #3
  4. Chrisliebaer
    Online

    Chrisliebaer

    #4
  5. NinjaGamers
    Offline

    NinjaGamers

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

    Code (Text):
    1.  
    2. public int countdown = 30;
    3.     public void startCountdown(final PLUGINNAME a, final int arena){
    4.         final Timer t = new Timer();
    5.         sendGameMessage("§bEs sind genügend Spieler online! §dDas Spiel startet in 30 Sekunden!", b, arena);
    6.         final TimerTask Countdown = new TimerTask() {
    7.             public void run() {
    8.                    if(countdown == 0){
    9.                         startGame(a, arena);
    10.                         t.cancel();
    11.                    }
    12.                    else{
    13.                        countdown--;
    14.                        for(Player p : a.arenaleute.get(arena)){
    15.                            p.setLevel(countdown);
    16.                        }
    17.                        if(countdown == 20){
    18.                            sendGameMessage(a.prefix_p + "§2Das Spiel startet in " + countdown + " Sekunden", a, arena);
    19.                        }
    20.                        if(countdown <= 10){
    21.                            sendGameMessage(b.prefix_p + "§2Das Spiel startet in " + countdown + " Sekunden!", a, arena);
    22.                        }
    23.                    }
    24.                    if(countdown <= 5){
    25.                          playSoundCountdown(a, arena);
    26.                    }
    27.             }
    28.         };
    29.         t.scheduleAtFixedRate(Countdown, 1000, 1000);
    30.     }
    31.  
     
    #5
  6. Chrisliebaer
    Online

    Chrisliebaer

    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.
     
    #6
  7. NinjaGamers
    Offline

    NinjaGamers

    Registriert seit:
    13. November 2012
    Beiträge:
    18
    Minecraft:
    Fisell
    hab alles schon getestet und es funktioniert einwandfrei aber danke für die information ^^
     
    #7
  8. delta242
    Offline

    delta242

    Registriert seit:
    28. Mai 2012
    Beiträge:
    90
    #8
  9. Jorre222
    Offline

    Jorre222

    Registriert seit:
    11. Juli 2013
    Beiträge:
    22
    Minecraft:
    Gambero77
    Beispielcode

    Code (Text):
    1.  
    2. Integer i = 30;
    3. Integer i2 = 0;
    4.  
    5. i2 = Bukkit.getScheduler.scheduleSyncDelayedTask(this, new Runnable() {
    6.     if(i == 0) {
    7.         i = 30;
    8.         Bukkit.getScheduler.cancelTask(i2);
    9.     }    
    10.     i = i - 1;
    11.     player.sendMessage("Noch '" + i + "' Sekunden!");
    12. }, 0L, 20L);
    13.  
    14.  

    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!
     
    #9