From 02ac3cd665faec7e142c9e5064c782156a7b793c Mon Sep 17 00:00:00 2001 From: Zeanon Date: Thu, 13 Jan 2022 16:12:50 +0100 Subject: [PATCH] First draft --- FightSystem_Core/src/config.yml | 1 + .../de/steamwar/fightsystem/FightSystem.java | 2 + .../fightsystem/FightSystem.properties | 265 +++++++++--------- .../de/steamwar/fightsystem/event/Meteor.java | 160 +++++++++++ .../winconditions/Winconditions.java | 3 +- 5 files changed, 298 insertions(+), 133 deletions(-) create mode 100644 FightSystem_Core/src/de/steamwar/fightsystem/event/Meteor.java diff --git a/FightSystem_Core/src/config.yml b/FightSystem_Core/src/config.yml index 65406e2..0df080e 100644 --- a/FightSystem_Core/src/config.yml +++ b/FightSystem_Core/src/config.yml @@ -108,6 +108,7 @@ WinConditions: # defaults to none if missing # - PUMPKIN_TECH_KO # - HELLS_BELLS + # - METEOR WinConditionParams: # The time of any of the timeout win conditions in seconds diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index e3fd6d9..4d5e3ea 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -22,6 +22,7 @@ package de.steamwar.fightsystem; import de.steamwar.fightsystem.commands.*; import de.steamwar.fightsystem.countdown.*; import de.steamwar.fightsystem.event.HellsBells; +import de.steamwar.fightsystem.event.Meteor; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.fight.FightWorld; @@ -109,6 +110,7 @@ public class FightSystem extends JavaPlugin { new WinconditionPercentTimeout(); new HellsBells(); + new Meteor(); new NoPlayersOnlineCountdown(); new PreSchemCountdown(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties index 1bc5a62..99b789c 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties @@ -17,204 +17,205 @@ # along with this program. If not, see . # -PREFIX=§eArena§8» +PREFIX=�eArena�8� # Commands -NO_TEAM=§cDu bist in keinem Team -FIGHT_ALREADY_STARTED=§cDer Kampf hat bereits begonnen -NOT_LEADER=§cDu bist kein Leader -PLAYER_UNAVAILABLE=§cDer Spieler ist nicht in der Arena +NO_TEAM=�cDu bist in keinem Team +FIGHT_ALREADY_STARTED=�cDer Kampf hat bereits begonnen +NOT_LEADER=�cDu bist kein Leader +PLAYER_UNAVAILABLE=�cDer Spieler ist nicht in der Arena -NO_INVITATION=§cDu wurdest von keinem Team eingeladen -INVITATION_DECLINED=§cEinladung abgelehnt -INVITATION_DECLINED_TEAM=§e{0} §chat die Einladung abgelehnt -PLAYER_IN_TEAM=§e{0} §cist bereits in einem Team -ALREADY_INVITED=§e{0} §cwurde bereits eingeladen -INVITATION_SENT=§e{0} §7eingeladen +NO_INVITATION=�cDu wurdest von keinem Team eingeladen +INVITATION_DECLINED=�cEinladung abgelehnt +INVITATION_DECLINED_TEAM=�e{0} �chat die Einladung abgelehnt +PLAYER_IN_TEAM=�e{0} �cist bereits in einem Team +ALREADY_INVITED=�e{0} �cwurde bereits eingeladen +INVITATION_SENT=�e{0} �7eingeladen -NOT_IN_TEAM=§e{0} §cist nicht in deinem Team +NOT_IN_TEAM=�e{0} �cist nicht in deinem Team -KIT_UNAVAILABLE=§cDieses Kit gibt es nicht -KIT_CHOSEN=§7Kit §e{0} §7gewählt +KIT_UNAVAILABLE=�cDieses Kit gibt es nicht +KIT_CHOSEN=�7Kit �e{0} �7gew�hlt -GAMEMODE_NOT_ALLOWED=§cSpielmodusänderung verboten -GAMEMODE_UNKNOWN=§cUnbekannter Spielmodus {0} -GAMEMODE_HELP=§8/§7gm §8[§eSpielmodus§8] +GAMEMODE_NOT_ALLOWED=�cSpielmodus�nderung verboten +GAMEMODE_UNKNOWN=�cUnbekannter Spielmodus {0} +GAMEMODE_HELP=�8/�7gm �8[�eSpielmodus�8] -INVITE_HELP=§8/§einvite §8[§eSpieler§8] +INVITE_HELP=�8/�einvite �8[�eSpieler�8] -LEADER_FULL=§cAlle Teams haben bereits einen Leader -ALREADY_IN_TEAM=§cDu bist bereits in einem Team +LEADER_FULL=�cAlle Teams haben bereits einen Leader +ALREADY_IN_TEAM=�cDu bist bereits in einem Team -LOCKSCHEM_HELP=§8/§7lockschem §8[§eTeam§8] -UNKNOWN_TEAM=§cDieses Team existiert nicht -LOCKSCHEM_LOCKED=§7Schematic gesperrt -LOCKSCHEM_LOCKED_BY=§cDie Schematic wurde von §e{0} §cgesperrt +LOCKSCHEM_HELP=�8/�7lockschem �8[�eTeam�8] +UNKNOWN_TEAM=�cDieses Team existiert nicht +LOCKSCHEM_LOCKED=�7Schematic gesperrt +LOCKSCHEM_LOCKED_BY=�cDie Schematic wurde von �e{0} �cgesperrt -REMOVE_HELP=§8/§eremove §8[§eSpieler§8] +REMOVE_HELP=�8/�eremove �8[�eSpieler�8] -REPLAY_LOCKED=§7Replaywiedergabe für 1 Monat gesperrt +REPLAY_LOCKED=�7Replaywiedergabe f�r 1 Monat gesperrt -NOT_FIGHTLEADER=§cDu bist nicht Kampfleiter -WIN_HELP=§8/§7win §8[§eTeam §8or §etie§8] +NOT_FIGHTLEADER=�cDu bist nicht Kampfleiter +WIN_HELP=�8/�7win �8[�eTeam �8or �etie�8] # GUI INVITATION_TITLE=Einladung von {0} -INVITATION_ACCEPT=§aAnnehmen -INVITATION_DECLINE=§cAblehnen -INVITATION_CHAT_ACCEPT=§8/§aaccept§8, §7um die Einladung §aanzunehmen -INVITATION_CHAT_DECLINE=§8/§cdecline§8, §7um die Einladung §cabzulehnen +INVITATION_ACCEPT=�aAnnehmen +INVITATION_DECLINE=�cAblehnen +INVITATION_CHAT_ACCEPT=�8/�aaccept�8, �7um die Einladung �aanzunehmen +INVITATION_CHAT_DECLINE=�8/�cdecline�8, �7um die Einladung �cabzulehnen STATE_TITLE=Kampfstatus -STATE_PRE_LEADER_SETUP=§7Teamleaderwartephase -STATE_PRE_SCHEM_SETUP=§7Schemauswahlphase -STATE_POST_SCHEM_SETUP=§7Vorbereitungsphase -STATE_PRE_RUNNING=§eKitausgabe -STATE_RUNNING=§eKampfphase -STATE_SPECTATE_WIN=§7Sieg {0} -STATE_SPECTATE_TIE=§7Unentschieden +STATE_PRE_LEADER_SETUP=�7Teamleaderwartephase +STATE_PRE_SCHEM_SETUP=�7Schemauswahlphase +STATE_POST_SCHEM_SETUP=�7Vorbereitungsphase +STATE_PRE_RUNNING=�eKitausgabe +STATE_RUNNING=�eKampfphase +STATE_SPECTATE_WIN=�7Sieg {0} +STATE_SPECTATE_TIE=�7Unentschieden INVITE_TITLE=Spieler einladen REMOVE_TITLE=Spieler rauswerfen KIT_SELECTION_TITLE=Kitauswahl -KIT_NO_KITS=§cKeine Kits gefunden -KIT_CREATE=§eNeues Kit +KIT_NO_KITS=�cKeine Kits gefunden +KIT_CREATE=�eNeues Kit KITNAME_TITLE=Kitname eingeben -KITNAME_IN_USE=§cDieser Kitname wird bereits genutzt -KIT_SEARCH=§eSuchen +KITNAME_IN_USE=�cDieser Kitname wird bereits genutzt +KIT_SEARCH=�eSuchen KITSEARCH_TITLE=Nach Kit suchen -SCHEM_NO_ENEMY=§cKeine Schematicwahl ohne Gegner +SCHEM_NO_ENEMY=�cKeine Schematicwahl ohne Gegner SCHEM_TITLE={0}-Auswahl -SCHEM_PUBLIC=§eÖffentliches {0} -SCHEM_PRIVATE=§ePrivates {0} -SCHEM_NO_PRIVATE=§7Kein privates {0} vorhanden -SCHEM_PRIVATE_FORBIDDEN=§7Kein privates {0} erlaubt +SCHEM_PUBLIC=�e�ffentliches {0} +SCHEM_PRIVATE=�ePrivates {0} +SCHEM_NO_PRIVATE=�7Kein privates {0} vorhanden +SCHEM_PRIVATE_FORBIDDEN=�7Kein privates {0} erlaubt # Countdowns -COUNTDOWN_MINUTES=§e{0} §7Minuten {1} -COUNTDOWN_SECONDS=§e{0} §7Sekunden {1} -COUNTDOWN_SECOND=§eEine §7Sekunde {1} +COUNTDOWN_MINUTES=�e{0} �7Minuten {1} +COUNTDOWN_SECONDS=�e{0} �7Sekunden {1} +COUNTDOWN_SECOND=�eEine �7Sekunde {1} ENTERN_COUNTDOWN=bis Entern erlaubt ist -ENTERN_ALLOWED=§eEntern §7ist nun erlaubt +ENTERN_ALLOWED=�eEntern �7ist nun erlaubt SHUTDOWN_COUNTDOWN=bis der Server gestoppt wird -PRE_SCHEM_COUNTDOWN=bis eine Public-Schematic gewählt wird +PRE_SCHEM_COUNTDOWN=bis eine Public-Schematic gew�hlt wird POST_SCHEM_COUNTDOWN=bis die Kits verteilt werden PRE_RUNNING_COUNTDOWN=bis die Arena freigegeben ist RUNNING_COUNTDOWN=bis der Kampf vorbei ist -SPECTATE_COUNTDOWN=bis die Arena zurückgesetzt wird +SPECTATE_COUNTDOWN=bis die Arena zur�ckgesetzt wird # Fight -SCHEMATIC_UNLOADABLE=§cSchematic konnte nicht geladen werden -SCHEMATIC_CHOSEN=§7{0} §e{1} §7gewählt -TEAM_READY=§aTeam bereit -TEAM_NOT_READY=§c§mTeam bereit -SKIP_READY=§aBeschleunigung zum nächsten Event -SKIP_NOT_READY=§c§mBeschleunigung zum nächsten Event -TEAM_CHAT={0}{1}§8» {0}{2} -CHOOSE_KIT=§eKit wählen -RESPAWN=§eRespawn -INVITE_PLAYERS=§eSpieler einladen -REMOVE_PLAYERS=§cSpieler rauswerfen -CHOOSE_SCHEMATIC=§e{0} wählen -SCHEMATIC_REQUIRED=§cZuerst muss eine Schematic gewählt sein +SCHEMATIC_UNLOADABLE=�cSchematic konnte nicht geladen werden +SCHEMATIC_CHOSEN=�7{0} �e{1} �7gew�hlt +TEAM_READY=�aTeam bereit +TEAM_NOT_READY=�c�mTeam bereit +SKIP_READY=�aBeschleunigung zum n�chsten Event +SKIP_NOT_READY=�c�mBeschleunigung zum n�chsten Event +TEAM_CHAT={0}{1}�8� {0}{2} +CHOOSE_KIT=�eKit w�hlen +RESPAWN=�eRespawn +INVITE_PLAYERS=�eSpieler einladen +REMOVE_PLAYERS=�cSpieler rauswerfen +CHOOSE_SCHEMATIC=�e{0} w�hlen +SCHEMATIC_REQUIRED=�cZuerst muss eine Schematic gew�hlt sein -KIT_PREVIEW_EDIT=§7Kit bearbeiten -KIT_PREVIEW_CHOOSE=§aKit wählen -KIT_PREVIEW_BACK=§cZurück -KIT_PREVIEW_DELETE=§cKit löschen -KIT_DELETION_CONFIRMATION=Kit wirklich löschen? -KIT_DELETION_ABORT=§cAbbrechen -KIT_DELETION_DELETE=§aLöschen +KIT_PREVIEW_EDIT=�7Kit bearbeiten +KIT_PREVIEW_CHOOSE=�aKit w�hlen +KIT_PREVIEW_BACK=�cZur�ck +KIT_PREVIEW_DELETE=�cKit l�schen +KIT_DELETION_CONFIRMATION=Kit wirklich l�schen? +KIT_DELETION_ABORT=�cAbbrechen +KIT_DELETION_DELETE=�aL�schen # Listener -NO_ARENA_LEAVING=§cDu darfst die Arena nicht verlassen -CHECK_JOIN_DENIED=§cAuf diesem Server wird momentan eine Schematic geprüft! -CHECK_COMMAND_LOCKED=§cDieser Befehl ist beim Prüfen gesperrt! Admin wird benachrichtigt. -NO_BLOCK_BREAK=§cDu darfst hier derzeit keine Blöcke abbauen -NO_BLOCK_PLACE=§cDu darfst hier derzeit keine Blöcke setzen -NO_BOW_USAGE=§cDu darfst den Bogen erst nach Kampfbeginn nutzen -NO_PARTICIPANT=§cDu bist kein Kampfteilnehmer -NO_FRIENDLY_FIRE=§cDu darfst deinen Teamkollegen keinen Schaden zufügen -NO_TNT_PLACE=§cDu darfst kein TNT setzen -NO_TELEPORT=§cDu darfst diese Teleportfunktion nicht benutzen -OPEN_INVENTORY_TO_CUSTOMIZE=§eInventar zum Anpassen des Kits öffnen -RESOURCEPACK_REQUIRED=§cAuf Eventserver kann nur mit dem SteamWar-Resourcepack beigetreten werden\n§cDa du abgelehnt hast, musst du nun in der Serverliste erst einmal wieder Ressourcenpakete von SteamWar aktivieren -NO_ENTERN=§cDu darfst nicht entern -NO_TEAMAREA=§cDu darfst nicht zu den Teams -TEST_BECOME_LEADER=§7Werde zum Teamleader mit §8/§eleader -PREPARE_SCHEM_DELETED=§cAnscheinend wurde die auszufahrende Schematic gelöscht, Einsenden wird abgebrochen. -PREPARE_ACTIVE_PISTON=§cIm Teambereich wurden sich noch bewegende Pistons gefunden, Einsenden wird abgebrochen. -PREPARE_FAILED_SAVING=§cDie Schematic konnte nicht gespeichert werden, Einsenden wird abgebrochen. -PREPARE_SENT_IN=§aDie Schematic wird nun zeitnah von einem Teammitglied überprüft -PARTICIPANT_CHAT={0} {1}§8» §7{2} -FIGHTLEADER_CHAT=§e{0}§8» §e{1} -SPECTATOR_CHAT=§7{0}§8» §7{1} +NO_ARENA_LEAVING=�cDu darfst die Arena nicht verlassen +CHECK_JOIN_DENIED=�cAuf diesem Server wird momentan eine Schematic gepr�ft! +CHECK_COMMAND_LOCKED=�cDieser Befehl ist beim Pr�fen gesperrt! Admin wird benachrichtigt. +NO_BLOCK_BREAK=�cDu darfst hier derzeit keine Bl�cke abbauen +NO_BLOCK_PLACE=�cDu darfst hier derzeit keine Bl�cke setzen +NO_BOW_USAGE=�cDu darfst den Bogen erst nach Kampfbeginn nutzen +NO_PARTICIPANT=�cDu bist kein Kampfteilnehmer +NO_FRIENDLY_FIRE=�cDu darfst deinen Teamkollegen keinen Schaden zuf�gen +NO_TNT_PLACE=�cDu darfst kein TNT setzen +NO_TELEPORT=�cDu darfst diese Teleportfunktion nicht benutzen +OPEN_INVENTORY_TO_CUSTOMIZE=�eInventar zum Anpassen des Kits �ffnen +RESOURCEPACK_REQUIRED=�cAuf Eventserver kann nur mit dem SteamWar-Resourcepack beigetreten werden\n�cDa du abgelehnt hast, musst du nun in der Serverliste erst einmal wieder Ressourcenpakete von SteamWar aktivieren +NO_ENTERN=�cDu darfst nicht entern +NO_TEAMAREA=�cDu darfst nicht zu den Teams +TEST_BECOME_LEADER=�7Werde zum Teamleader mit �8/�eleader +PREPARE_SCHEM_DELETED=�cAnscheinend wurde die auszufahrende Schematic gel�scht, Einsenden wird abgebrochen. +PREPARE_ACTIVE_PISTON=�cIm Teambereich wurden sich noch bewegende Pistons gefunden, Einsenden wird abgebrochen. +PREPARE_FAILED_SAVING=�cDie Schematic konnte nicht gespeichert werden, Einsenden wird abgebrochen. +PREPARE_SENT_IN=�aDie Schematic wird nun zeitnah von einem Teammitglied �berpr�ft +PARTICIPANT_CHAT={0} {1}�8� �7{2} +FIGHTLEADER_CHAT=�e{0}�8� �e{1} +SPECTATOR_CHAT=�7{0}�8� �7{1} # Replay -REPLAY_ENDS=§cReplay beendet +REPLAY_ENDS=�cReplay beendet OLD_STRING={0} # States -COMMAND_CURRENTLY_UNAVAILABLE=§cDieser Befehl ist zu diesem Kampfzeitpunkt nicht verfügbar +COMMAND_CURRENTLY_UNAVAILABLE=�cDieser Befehl ist zu diesem Kampfzeitpunkt nicht verf�gbar # Utils -TPS_WARNING=§c{0} §7TPS +TPS_WARNING=�c{0} �7TPS -UI_PRE_RUNNING=§7Kits verteilt -UI_RUNNING=§aArena freigegeben -UI_SKIP=§7Sprung zum nächsten Ereignis -UI_PLAYER_JOINS=§a§l» {0}{1} -UI_PLAYER_LEAVES=§c§l« {0}{1} -UI_LEADER_JOINS=§a§l» {0}Leader {1} -UI_PLAYER_DEATH={0}{1} §7ist gestorben -UI_PLAYER_LEAVE={0}{1} §7hat den Kampf verlassen -UI_ELO=§7ELO von {0}{1}§8: §7{2}§8»§e{3} +UI_PRE_RUNNING=�7Kits verteilt +UI_RUNNING=�aArena freigegeben +UI_SKIP=�7Sprung zum n�chsten Ereignis +UI_PLAYER_JOINS=�a�l� {0}{1} +UI_PLAYER_LEAVES=�c�l� {0}{1} +UI_LEADER_JOINS=�a�l� {0}Leader {1} +UI_PLAYER_DEATH={0}{1} �7ist gestorben +UI_PLAYER_LEAVE={0}{1} �7hat den Kampf verlassen +UI_ELO=�7ELO von {0}{1}�8: �7{2}�8��e{3} UI_WIN={0}Sieg {1} -UI_DRAW=§7Unentschieden +UI_DRAW=�7Unentschieden -BAR_PRE_LEADER=§7Warten auf Teamleader -BAR_PRE_SCHEM={1} §7Schemauswahl {0} {2} -BAR_PREPARE={1} {3} §7Vorbereitung {0} {4} {2} -BAR_PRE_RUNNING={1} {3} §7Kampfbeginn in {0} {4} {2} +BAR_PRE_LEADER=�7Warten auf Teamleader +BAR_PRE_SCHEM={1} �7Schemauswahl {0} {2} +BAR_PREPARE={1} {3} �7Vorbereitung {0} {4} {2} +BAR_PRE_RUNNING={1} {3} �7Kampfbeginn in {0} {4} {2} BAR_RUNNING0={1} {3} {0} {4} {2} BAR_RUNNING1={1} {3} {5} {0} {6} {4} {2} BAR_RUNNING2={1} {3} {5} {7} {0} {6} {8} {4} {2} BAR_RUNNING3={1} {3} {5} {7} {9} {0} {6} {8} {10} {4} {2} -BAR_SPECTATE={1} §7Kampf vorbei {0} {2} -BAR_TIE={1} §7Unentschieden {0} {2} -BAR_WIN={1} §7Sieg {3} {0} {2} -BAR_POINTS={0} §8Punkte -BAR_PERCENT={0}§8% -BAR_CANNONS={0} §8Kanonen -BAR_WATER={0} §8Wasser +BAR_SPECTATE={1} �7Kampf vorbei {0} {2} +BAR_TIE={1} �7Unentschieden {0} {2} +BAR_WIN={1} �7Sieg {3} {0} {2} +BAR_POINTS={0} �8Punkte +BAR_PERCENT={0}�8% +BAR_CANNONS={0} �8Kanonen +BAR_WATER={0} �8Wasser # Winconditions HELLS_BELLS_COUNTDOWN=bis die Bomben fallen -TECHKO_COUNTDOWN=bis {0} §7einen Schuss abgegeben haben muss +METEOR_COUNTDOWN=bis es Meteore regnet +TECHKO_COUNTDOWN=bis {0} �7einen Schuss abgegeben haben muss -WIN_FIGHTLEADER=§7Kampfleiterentscheidung -WIN_PERCENT={0} §7zu beschädigt -WIN_OFFLINE_BOTH=§7Beide Teams offline -WIN_OFFLINE={0} §7offline -WIN_RANKED_LEFT={0} §7hat den Kampf verlassen -WIN_ALL_DEAD={0}Alle Spieler kampfunfähig -WIN_LEADER_DEAD={0} kampfunfähig -WIN_TIME_OVER=§7Zeit abgelaufen +WIN_FIGHTLEADER=�7Kampfleiterentscheidung +WIN_PERCENT={0} �7zu besch�digt +WIN_OFFLINE_BOTH=�7Beide Teams offline +WIN_OFFLINE={0} �7offline +WIN_RANKED_LEFT={0} �7hat den Kampf verlassen +WIN_ALL_DEAD={0}Alle Spieler kampfunf�hig +WIN_LEADER_DEAD={0} kampfunf�hig +WIN_TIME_OVER=�7Zeit abgelaufen WIN_MORE_HEALTH={0}Mehr verbleibende Leben -WIN_LESS_DAMAGE={0} §7weniger beschädigt +WIN_LESS_DAMAGE={0} �7weniger besch�digt WIN_POINTS={0} hat mehr Punkte -WIN_POINTS_EQUAL=§7Gleicher Punktestand -WIN_TECHKO={0} §7ist Tech K.O. +WIN_POINTS_EQUAL=�7Gleicher Punktestand +WIN_TECHKO={0} �7ist Tech K.O. diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/event/Meteor.java b/FightSystem_Core/src/de/steamwar/fightsystem/event/Meteor.java new file mode 100644 index 0000000..10e6881 --- /dev/null +++ b/FightSystem_Core/src/de/steamwar/fightsystem/event/Meteor.java @@ -0,0 +1,160 @@ +package de.steamwar.fightsystem.event; + +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.countdown.Countdown; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependent; +import de.steamwar.fightsystem.utils.Message; +import de.steamwar.fightsystem.utils.SWSound; +import de.steamwar.fightsystem.winconditions.Winconditions; +import java.util.Random; +import java.util.logging.Level; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Fireball; +import org.bukkit.util.Vector; + + +public class Meteor { + + public static final Random random = new Random(); + + private final World world = Bukkit.getWorlds().get(0); + private final int xLength = Config.RedExtendRegion.getMaxX() - Config.RedExtendRegion.getMinX(); + private final int zLength = Config.RedExtendRegion.getMaxZ() - Config.RedExtendRegion.getMinZ(); + private Meteor.State current = Meteor.State.PRE; + private int currentDrops = 0; + private Meteor.MeteorCountdown currentCountdown; + + public void startCountdown() { + if (current == Meteor.State.PRE) { + current = current.getNext(); + } else if (current != Meteor.State.LAST && currentDrops >= current.SWITCH_AFTER) { + currentDrops = 0; + } + + currentDrops++; + currentCountdown = new Meteor.MeteorCountdown(current.MIN_TIME + random.nextInt(current.MAX_TIME - current.MIN_TIME)); + currentCountdown.enable(); + } + + public void drop() { + int xOffset = getStart(xLength); + int zOffset = getStart(zLength); + int yOffset = getHeightStart(); + + Meteor.Point redStart = new Meteor.Point(Config.RedExtendRegion.getMinX() + xOffset, Config.RedExtendRegion.getMaxY() + yOffset, Config.RedExtendRegion.getMaxZ() - zOffset); + Meteor.Point blueStart = new Meteor.Point(Config.BlueExtendRegion.getMinX() + xOffset, Config.BlueExtendRegion.getMaxY() + yOffset, Config.BlueExtendRegion.getMinZ() + zOffset); + + Fireball fireballRed = world.spawn(redStart.toLocation(world), Fireball.class); + fireballRed.setDirection(new Vector(0, -1, 0)); + fireballRed.setBounce(false); + fireballRed.setIsIncendiary(false); + fireballRed.setYield(current.minExplosion + random.nextInt(current.maxExplosion - current.minExplosion)); + + Fireball fireballBlue = world.spawn(blueStart.toLocation(world), Fireball.class); + fireballBlue.setDirection(new Vector(0, -1, 0)); + fireballBlue.setBounce(false); + fireballBlue.setIsIncendiary(false); + fireballBlue.setYield(current.minExplosion + random.nextInt(current.maxExplosion - current.minExplosion)); + } + + private int getStart(int regionSize) { + double randomNumber = (random.nextDouble() - random.nextDouble()) / 2 + 0.5; + Bukkit.getLogger().log(Level.INFO, "Calculated Start: " + (int) (randomNumber * (regionSize - 1))); + return Math.max(Math.min((int) (randomNumber * (regionSize - 1)), regionSize - 1), 0); + } + + private int getHeightStart() { + return 5 + random.nextInt(15); + } + + public Meteor() { + new StateDependent(Winconditions.METEOR, FightState.Running) { + @Override + public void enable() { + startCountdown(); + } + + @Override + public void disable() { + currentCountdown.disable(); + } + }.register(); + } + + private class MeteorCountdown extends Countdown { + + public MeteorCountdown(int time) { + super(time, new Message("METEOR_COUNTDOWN"), SWSound.BLOCK_NOTE_BASS, true); + } + + @Override + public void countdownFinished() { + drop(); + startCountdown(); + } + } + + private static class Point { + + private final int x; + private final int y; + private final int z; + + public Point(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Location toLocation(World world) { + return new Location(world, this.x, this.y, this.z); //NOSONAR + } + } + + private enum State { + + PRE(60, 80, 1, 0, 0), + FIRST(40, 60, 3, 1, 3), + SECOND(30, 40, 4, 2, 4), + THIRD(20, 30, 4, 3, 6), + FOURTH(10, 20, 5, 4, 7), + LAST(5, 10, 0, 5, 10); + + + State(int minTime, int maxTime, int switchAfter, int minExplosion, int maxExplosion) { + this.MIN_TIME = minTime; + this.MAX_TIME = maxTime; + this.SWITCH_AFTER = switchAfter; + this.minExplosion = minExplosion; + this.maxExplosion = maxExplosion; + } + + private final int MIN_TIME; //NOSONAR + private final int MAX_TIME; //NOSONAR + private final int SWITCH_AFTER; //NOSONAR + private final int minExplosion; //NOSONAR + private final int maxExplosion; //NOSONAR + + + public Meteor.State getNext() { + switch (this) { + case PRE: + return FIRST; + case FIRST: + return SECOND; + case SECOND: + return THIRD; + case THIRD: + return FOURTH; + case FOURTH: + case LAST: + return LAST; + default: + return PRE; + } + } + } +} \ No newline at end of file diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java index 2d9c5f6..6c228ce 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java @@ -36,5 +36,6 @@ public enum Winconditions { WATER_TECH_KO, PUMPKIN_TECH_KO, - HELLS_BELLS + HELLS_BELLS, + METEOR }