de.jonas.Game.java Source code

Java tutorial

Introduction

Here is the source code for de.jonas.Game.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package de.jonas;

import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import de.jonas.GamePlayer.GamePlayerTeam;
import static de.jonas.Rush.game;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

/**
 *
 * @author Jonas
 */
public class Game {
    public enum GameState {
        LOBBY, COUNTDOWN, RUNNING, END, RESTART, BLOCKED
    }; //The State of the Game

    public boolean full; //Shows if Game is full
    public Integer maxplayers; //Maximum Players to join
    public Integer minplayers; //Minimum Players to play
    public HashMap<String, Player> players; //Player List
    public HashMap<Player, GamePlayer> gameplayers; //Game Player List
    public GameState state; //->GameState
    public String motd; //Motd for Signs
    public Integer playeralive;
    public Plugin pl;
    public static Rush p;

    //Init Game
    public Game(GameState state, Integer maxplayers, Integer minplayers, Plugin pl) {
        this.full = false;
        this.maxplayers = maxplayers;
        this.minplayers = minplayers;
        this.players = new HashMap<>();
        this.gameplayers = new HashMap<>();
        this.state = state;
        this.motd = pl.getConfig().getString("motd.lobby");
        this.playeralive = 0;
        this.pl = pl;
    }

    //Called if Rush switches to Lobby
    public void GameLobby() {
        for (ItemSpawner is : Rush.spawner) {
            is.unregister();
        }
        ByteArrayDataOutput out = ByteStreams.newDataOutput(); //BungeeCoord Connection
        out.writeUTF("Connect");
        out.writeUTF(pl.getConfig().getString("main.lobbyservername"));
        Bukkit.getServer().getLogger().log(Level.INFO, "Sending all Players to ''{0}''",
                pl.getConfig().getString("main.lobbyservername"));
        for (Player p : Bukkit.getOnlinePlayers()) { //Send all Players to Lobby Server
            p.sendPluginMessage(pl, "BungeeCord", out.toByteArray());
            this.players.remove(p.getName()); //Remove Players from the List
        }
        pl.getServer().getLogger().log(Level.INFO, "Done sending Players.");
        //this.reset(); Map Reset
        this.state = GameState.LOBBY; //Set State
        this.motd = pl.getConfig().getString("motd.lobby"); //Set Motd
        //Bukkit.getServer().getPluginManager().disablePlugin(pl);
        //Bukkit.getServer().getPluginManager().enablePlugin(pl);
        pl.getServer().getScheduler().scheduleSyncDelayedTask(pl, new Runnable() {
            @Override
            public void run() {
                Bukkit.shutdown();
            }
        }, Rush.SecondsToTicks(3));
    }

    public void ThreadCountdown(final Plugin pl, final Integer seconds) {
        pl.getServer().getScheduler().scheduleSyncDelayedTask(pl, new Runnable() {
            @Override
            public void run() {
                pl.getServer().broadcastMessage(ChatColor.AQUA + "[" + Rush.name + "] " + ChatColor.AQUA + "Noch "
                        + (60 - seconds) + " Sekunden");
                for (Player p : Bukkit.getOnlinePlayers()) {
                    p.setLevel(60 - seconds);
                }
            }
        }, Rush.SecondsToTicks(seconds));
    }

    //Called if Countdown begins
    public void GameCountdown() {
        pl.getServer().getLogger().log(Level.INFO, "Game counting down");
        this.state = GameState.COUNTDOWN; //Set State
        this.motd = pl.getConfig().getString("motd.lobby"); //Set Motd
        this.playeralive = pl.getServer().getOnlinePlayers().length;
        ThreadCountdown(pl, 10);
        ThreadCountdown(pl, 20);
        ThreadCountdown(pl, 30);
        ThreadCountdown(pl, 40);
        ThreadCountdown(pl, 50);
        int i = 1;
        while (i < 10) {
            final int i2 = i;
            pl.getServer().getScheduler().scheduleSyncDelayedTask(pl, new Runnable() {
                @Override
                public void run() {
                    pl.getServer().broadcastMessage(ChatColor.AQUA + "[" + Rush.name + "] " + ChatColor.AQUA
                            + "Noch " + (10 - i2) + " Sekunden");
                    for (Player p : Bukkit.getOnlinePlayers()) {
                        p.setLevel(10 - i2);
                        p.playSound(p.getLocation(), Sound.ORB_PICKUP, 1, 1);
                    }
                }
            }, Rush.SecondsToTicks(50 + i));
            i++;
        }
        pl.getServer().getScheduler().scheduleSyncDelayedTask(pl, new Runnable() {
            @Override
            public void run() {
                for (Player p1 : Bukkit.getOnlinePlayers()) {
                    for (Player p : game.players.values()) {
                        GamePlayer gp = game.gameplayers.get(p);
                        if (gp.team.equals(GamePlayerTeam.AUTO)) {
                            if (Rush.red.players.size() > Rush.blue.players.size()) { //If Red Team > Blue Team then Player->Blue Team
                                pl.getServer().getLogger().info("DEBUG: Player added to Team Blue");
                                Rush.blue.add(p);
                                gp.team = GamePlayer.GamePlayerTeam.BLUE;
                                game.gameplayers.put(p, gp);
                                p.sendMessage(ChatColor.AQUA + "Du wurdest Automatisch dem Team Blau zugewiesen.");
                                Rush.TagAPI.refreshPlayer(p);
                            } else {
                                if (Rush.red.players.size() < Rush.blue.players.size()) { //If Red Team < Blue Team then Player->Red Team
                                    pl.getServer().getLogger().info("DEBUG: Player added to Team Red");
                                    Rush.red.add(p);
                                    gp.team = GamePlayer.GamePlayerTeam.RED;
                                    game.gameplayers.put(p, gp);
                                    p.sendMessage(
                                            ChatColor.AQUA + "Du wurdest Automatisch dem Team Rot zugewiesen.");
                                    Rush.TagAPI.refreshPlayer(p);
                                } else {
                                    if (Rush.red.players.size() == Rush.blue.players.size()) { //If Red Team = Blue Team then Player->Red Team
                                        pl.getServer().getLogger().info("DEBUG: Player added to Team Red");
                                        Rush.red.add(p);
                                        gp.team = GamePlayer.GamePlayerTeam.RED;
                                        game.gameplayers.put(p, gp);
                                        p.sendMessage(
                                                ChatColor.AQUA + "Du wurdest Automatisch dem Team Rot zugewiesen.");
                                        Rush.TagAPI.refreshPlayer(p);
                                    }
                                }
                            }
                        }
                    }
                    p1.setLevel(0);
                    p1.playSound(p1.getLocation(), Sound.NOTE_SNARE_DRUM, 1, 1);
                }
                GameRunning();
            }
        }, Rush.SecondsToTicks(60));
        pl.getServer()
                .broadcastMessage(ChatColor.AQUA + "[" + Rush.name + "] " + ChatColor.AQUA + "Noch 60 Sekunden");
    }

    //Called if Game is running
    public void GameRunning() {
        for (Player gpp : pl.getServer().getOnlinePlayers()) {
            GamePlayer gp = this.gameplayers.get(gpp);
            if (gp.team.equals(GamePlayerTeam.BLUE)) {
                gpp.teleport(Rush.bluespawn);
            }
            if (gp.team.equals(GamePlayerTeam.RED)) {
                gpp.teleport(Rush.redspawn);
            }
        }
        for (Player p : pl.getServer().getOnlinePlayers()) {
            p.getInventory().clear();
        }
        pl.getServer().getLogger().log(Level.INFO, "Game is running");
        this.state = GameState.RUNNING; //Set State
        this.motd = pl.getConfig().getString("motd.running"); //Set Motd
        for (ItemSpawner is : Rush.spawner) {
            is.register();
        }
        if (Rush.red.players.isEmpty()) {
            Rush.red.alive = false;
        }
        if (Rush.blue.players.isEmpty()) {
            Rush.blue.alive = false;
        }
        pl.getServer().getScheduler().scheduleSyncRepeatingTask(pl, new Runnable() {
            @Override
            public void run() {
                if (Rush.red.players.isEmpty()) {
                    Rush.red.alive = false;
                }
                if (Rush.blue.players.isEmpty()) {
                    Rush.blue.alive = false;
                }
                if (!Rush.red.alive) {
                    for (Player p : Rush.blue.players.values()) {
                        try {
                            Rush.game.gameplayers.get(p).Win();
                        } catch (SQLException ex) {
                            Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    GameEnd();
                    return;
                }
                if (!Rush.blue.alive) {
                    for (Player p : Rush.red.players.values()) {
                        try {
                            Rush.game.gameplayers.get(p).Win();
                        } catch (SQLException ex) {
                            Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    GameEnd();
                    return;
                }
            }
        }, Rush.SecondsToTicks(1), Rush.SecondsToTicks(3));
    }

    //Called if Game ends
    public void GameEnd() {
        pl.getServer().getLogger().log(Level.INFO, "Game end");
        this.state = GameState.END; //Set State
        this.motd = pl.getConfig().getString("motd.running"); //Set Motd
        pl.getServer().getLogger().info("DEBUG: Team Players Red: ");
        for (Player p : Rush.red.players.values()) {
            pl.getServer().getLogger().info("DEBUG: " + p.getName());
        }
        pl.getServer().getLogger().info("DEBUG: Team Alive Red: " + Rush.red.alive);
        pl.getServer().getLogger().info("DEBUG: Team Players Blue: ");
        for (Player p : Rush.blue.players.values()) {
            pl.getServer().getLogger().info("DEBUG: " + p.getName());
        }
        pl.getServer().getLogger().info("DEBUG: Team Alive Blue: " + Rush.blue.alive);
        if (!Rush.blue.alive) {
            pl.getServer().broadcastMessage(
                    ChatColor.AQUA + "[" + Rush.name + "] " + ChatColor.GOLD + "Team Rot hat Rush gewonnen!");
        }
        if (!Rush.red.alive) {
            pl.getServer().broadcastMessage(
                    ChatColor.AQUA + "[" + Rush.name + "] " + ChatColor.GOLD + "Team Blau hat Rush gewonnen!");
        }
        pl.getServer().getScheduler().cancelAllTasks();
        pl.getServer().getScheduler().scheduleSyncDelayedTask(pl, new Runnable() {
            @Override
            public void run() {
                GameRestart();
                GameLobby();
            }
        }, Rush.SecondsToTicks(5));
    }

    //Called if Game restarts
    public void GameRestart() {
        pl.getServer().getLogger().log(Level.INFO, "Game restart");
        this.state = GameState.RESTART; //Set State
        this.motd = pl.getConfig().getString("motd.restart"); //Set Motd
    }

    //Called if Game is blocked
    public void GameBlocked() {
        pl.getServer().getLogger().log(Level.INFO, "Game blocked");
        this.state = GameState.BLOCKED; //Set State
        this.motd = pl.getConfig().getString("motd.blocked"); //Set Motd
    }
    //    public void reset() {
    //    for(BlockState state : Rush.states) {
    //       state.update(true);
    //    }
    //    Rush.states.clear();
    //    }
}