HellsBells #275
@ -23,6 +23,7 @@ import de.steamwar.core.CommandRemover;
|
|||||||
import de.steamwar.core.Core;
|
import de.steamwar.core.Core;
|
||||||
import de.steamwar.fightsystem.commands.*;
|
import de.steamwar.fightsystem.commands.*;
|
||||||
import de.steamwar.fightsystem.countdown.*;
|
import de.steamwar.fightsystem.countdown.*;
|
||||||
|
import de.steamwar.fightsystem.event.HellsBells;
|
||||||
import de.steamwar.fightsystem.fight.Fight;
|
import de.steamwar.fightsystem.fight.Fight;
|
||||||
import de.steamwar.fightsystem.fight.FightTeam;
|
import de.steamwar.fightsystem.fight.FightTeam;
|
||||||
import de.steamwar.fightsystem.fight.FightWorld;
|
import de.steamwar.fightsystem.fight.FightWorld;
|
||||||
@ -106,6 +107,9 @@ public class FightSystem extends JavaPlugin {
|
|||||||
new RankedPlayerLeftWincondition();
|
new RankedPlayerLeftWincondition();
|
||||||
new WinconditionPercentTimeout();
|
new WinconditionPercentTimeout();
|
||||||
|
|
||||||
|
//noinspection InstantiationOfUtilityClass
|
||||||
Zeanon markierte diese Unterhaltung als gelöst
|
|||||||
|
new HellsBells();
|
||||||
|
|
||||||
new NoPlayersOnlineCountdown();
|
new NoPlayersOnlineCountdown();
|
||||||
new PreSchemCountdown();
|
new PreSchemCountdown();
|
||||||
new PostSchemCountdown();
|
new PostSchemCountdown();
|
||||||
|
288
FightSystem_Main/src/de/steamwar/fightsystem/event/HellsBells.java
Normale Datei
@ -0,0 +1,288 @@
|
|||||||
|
package de.steamwar.fightsystem.event;
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
License fehlt. License fehlt.
|
|||||||
|
|
||||||
|
import de.steamwar.fightsystem.Config;
|
||||||
|
import de.steamwar.fightsystem.FightSystem;
|
||||||
|
import de.steamwar.fightsystem.countdown.Countdown;
|
||||||
|
import de.steamwar.fightsystem.countdown.SWSound;
|
||||||
|
import de.steamwar.fightsystem.states.FightState;
|
||||||
|
import de.steamwar.fightsystem.states.StateDependent;
|
||||||
|
import de.steamwar.fightsystem.winconditions.Winconditions;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
|
||||||
|
public class HellsBells {
|
||||||
|
|
||||||
|
public static final Random random = new Random();
|
||||||
|
|
||||||
|
public HellsBells() {
|
||||||
|
new StateDependent(Winconditions.HELLS_BELLS, FightState.Running) {
|
||||||
|
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Du kannst dafür nicht BlockFace verwenden? Du kannst dafür nicht BlockFace verwenden?
YoyoNow
hat
In der 1.8 gibt es BlockFace mit dem toVector intern noch nicht. In der 1.8 gibt es BlockFace mit dem toVector intern noch nicht.
|
|||||||
|
private HellsBellsEvent event = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enable() {
|
||||||
|
if (event != null) {
|
||||||
|
event.terminate();
|
||||||
|
}
|
||||||
|
event = new HellsBellsEvent();
|
||||||
|
event.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disable() {
|
||||||
|
if (event != null) {
|
||||||
|
event.terminate();
|
||||||
|
}
|
||||||
|
event = null;
|
||||||
|
}
|
||||||
|
}.register();
|
||||||
Lixfel
hat
Subklassen bitte nach dem Inhalt der Hauptklasse. Subklassen bitte nach dem Inhalt der Hauptklasse.
|
|||||||
|
}
|
||||||
|
|
||||||
|
private static class HellsBellsEvent {
|
||||||
|
|
||||||
|
private final World world = Bukkit.getWorlds().get(0);
|
||||||
|
private final int xLength = Config.RedPasteRegion.getMaxX() - Config.RedPasteRegion.getMinX();
|
||||||
Lixfel
hat
Warum das nochmal extra vorhalten? In getRandom kann ja auch values() aufgerufen werden... Warum das nochmal extra vorhalten? In getRandom kann ja auch values() aufgerufen werden...
YoyoNow
hat
values() auf einem Enum erzeugt immer eine kopie der Enum Elemente intern, daher recht inefficient. values() auf einem Enum erzeugt immer eine kopie der Enum Elemente intern, daher recht inefficient.
Lixfel
hat
Ich finde, es ist ineffizienter, eine Kopie ständig im RAM zu halten, als alle x Minuten mal eine neue Kopie des 4! Elemente großen Array anzulegen. Ist zudem kürzer und einfacher, einfach neu zu kopieren. Ich finde, es ist ineffizienter, eine Kopie ständig im RAM zu halten, als alle x Minuten mal eine neue Kopie des 4! Elemente großen Array anzulegen. Ist zudem kürzer und einfacher, einfach neu zu kopieren.
|
|||||||
|
private final int zLength = Config.RedPasteRegion.getMaxZ() - Config.RedPasteRegion.getMinZ();
|
||||||
|
private State current = State.PRE;
|
||||||
|
private long stateStart = 0;
|
||||||
|
private HellsBellsCountdown currentCountdown;
|
||||||
|
private static final List<String> startMessages = Arrays.asList("§c!!Achtung!! Bomber im Anflug, noch ca. eine Minute bis zur Ankunft.",
|
||||||
|
"§cBomber im Anflug, ca. eine Minute bis zur Ankunft.",
|
||||||
|
"§cBomber auf dem Radar gesichtet, geschätzte Ankunftszeit: eine Minute.",
|
||||||
|
"§cUnbekanntes Flugobjekt gesichtet, trifft in ca. einer Minute ein.",
|
||||||
|
"§cFlugobjekt gesichtet. Ankunft in ca. einer Minute.",
|
||||||
|
"§cBomber erschienen, Ankunft ca. eine Minute.");
|
||||||
|
|
||||||
|
|
||||||
|
public void init() {
|
||||||
|
stateStart = System.currentTimeMillis();
|
||||||
|
startCountdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terminate() {
|
||||||
|
current = State.NONE;
|
||||||
|
currentCountdown.disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startCountdown() {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
In der enable() ist sichergestellt, dass es noch nie ausgeführt wurde oder vorher die disable() ausgeführt wurde, die Überprüfung sollte demnach unnötig sein. In der enable() ist sichergestellt, dass es noch nie ausgeführt wurde oder vorher die disable() ausgeführt wurde, die Überprüfung sollte demnach unnötig sein.
|
|||||||
|
if (current != State.NONE) {
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
if (current != State.LAST && currentTime >= stateStart + (current.switchAfter * 1000L)) {
|
||||||
|
if (current != State.PRE) {
|
||||||
|
Bukkit.broadcastMessage(FightSystem.PREFIX + "§aDie Bomben fallen nun schneller.");
|
||||||
|
}
|
||||||
|
|
||||||
|
current = current.getNext();
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Es ist garantiert, dass vor der disable() die enable() ausgeführt wurde. Es ist garantiert, dass vor der disable() die enable() ausgeführt wurde.
|
|||||||
|
stateStart = currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
int timer = current.minTime + random.nextInt(current.maxTime - current.minTime);
|
||||||
|
if (current == State.PRE) {
|
||||||
|
Bukkit.broadcastMessage(FightSystem.PREFIX + (startMessages.get(random.nextInt(startMessages.size()))));
|
||||||
|
}
|
||||||
|
currentCountdown = new HellsBellsCountdown(timer, SWSound.BLOCK_NOTE_BASS, true);
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Diese Unterklasse scheint mir ziemlich unnötig, die Inhalte dieser Klasse sollten in die übergeordnete Klasse eingebaut werden können. Diese Unterklasse scheint mir ziemlich unnötig, die Inhalte dieser Klasse sollten in die übergeordnete Klasse eingebaut werden können.
|
|||||||
|
currentCountdown.enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drop() {
|
||||||
|
if (random.nextBoolean()) {
|
||||||
Zeanon markierte diese Unterhaltung als gelöst
Lixfel
hat
Das StateDependent sollte nur die Sachen (de-)aktivieren, nicht das ganze Behaviour innehaben. Um die Nestung zu verringern: Nimm den ganzen Code bis auf die Enable und Disable und bewege den in die HellsBells-Klasse. (Also die übergeordnete) Das StateDependent sollte nur die Sachen (de-)aktivieren, nicht das ganze Behaviour innehaben. Um die Nestung zu verringern: Nimm den ganzen Code bis auf die Enable und Disable und bewege den in die HellsBells-Klasse. (Also die übergeordnete)
|
|||||||
|
sideRun(random.nextBoolean());
|
||||||
|
} else {
|
||||||
|
frontRun(random.nextBoolean());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void sideRun(boolean invert) {
|
||||||
|
int length = 10 + random.nextInt(zLength - 10);
|
||||||
|
int xOffset = getWidthStart(xLength);
|
||||||
|
int zOffset = getLengthStart(zLength, length);
|
||||||
|
int yOffset = 25 + getHeightStart();
|
||||||
|
|
||||||
|
|
||||||
|
Point redStart;
|
||||||
|
Point blueStart;
|
||||||
|
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
init() und terminate() lesen sich mir wie eine enable() und disable() eines StateDependent... init() und terminate() lesen sich mir wie eine enable() und disable() eines StateDependent...
|
|||||||
|
if (invert) {
|
||||||
Zeanon markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Wird der State NONE wirklich benötigt? Wird der State NONE wirklich benötigt?
|
|||||||
|
redStart = new Point(Config.RedPasteRegion.getMaxX() - xOffset, Config.RedPasteRegion.getMaxY() + yOffset, Config.RedPasteRegion.getMaxZ() - zOffset);
|
||||||
|
blueStart = new Point(Config.BluePasteRegion.getMinX() + xOffset, Config.BluePasteRegion.getMaxY() + yOffset, Config.BluePasteRegion.getMinZ() + zOffset);
|
||||||
|
} else {
|
||||||
|
redStart = new Point(Config.RedPasteRegion.getMinX() + xOffset, Config.RedPasteRegion.getMaxY() + yOffset, Config.RedPasteRegion.getMinZ() + zOffset);
|
||||||
|
blueStart = new Point(Config.BluePasteRegion.getMaxX() - xOffset, Config.BluePasteRegion.getMaxY() + yOffset, Config.BluePasteRegion.getMaxZ() - zOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
dropSideBombPart(redStart, blueStart, new int[]{length}, invert);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dropSideBombPart(Point redStart, Point blueStart, int[] x, boolean invert) {
|
||||||
|
Bukkit.getScheduler().scheduleSyncRepeatingTask(FightSystem.getPlugin(), () -> new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
for (int z = 0; z < 4; z++) {
|
||||||
|
if (invert) {
|
||||||
|
world.spawnEntity(redStart.subtractAndToLocation(world, x[0], 0, z), EntityType.PRIMED_TNT);
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Gibt es nicht random.nextInt(MIN, MAX)? (kA) Gibt es nicht random.nextInt(MIN, MAX)? (kA)
YoyoNow
hat
Nein leider bietet die normale Random implementation dies nicht an. Nein leider bietet die normale Random implementation dies nicht an.
|
|||||||
|
|
||||||
|
world.spawnEntity(blueStart.addAndToLocation(world, x[0], 0, z), EntityType.PRIMED_TNT);
|
||||||
|
} else {
|
||||||
|
world.spawnEntity(redStart.addAndToLocation(world, x[0], 0, z), EntityType.PRIMED_TNT);
|
||||||
|
|
||||||
|
world.spawnEntity(blueStart.subtractAndToLocation(world, x[0], 0, z), EntityType.PRIMED_TNT);
|
||||||
|
}
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Diesen if-Block kann man denke ich vereinfachen, wenn man stattdessen in den Assignments mit dem conditional-Operator arbeitet ?:. Diesen if-Block kann man denke ich vereinfachen, wenn man stattdessen in den Assignments mit dem conditional-Operator arbeitet ?:.
|
|||||||
|
}
|
||||||
|
|
||||||
|
if (x[0] < 2) {
|
||||||
Lixfel
hat
Kann glaube noch private static sein. Kann glaube noch private static sein.
|
|||||||
|
this.cancel();
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Könnte man statt diesen Ifs nicht einfach eine Methode in der Direction machen, die dann den passenden Wert zurückgibt? Könnte man statt diesen Ifs nicht einfach eine Methode in der Direction machen, die dann den passenden Wert zurückgibt?
|
|||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
x[0] -= 2;
|
||||||
|
}
|
||||||
|
}, 0, 4L);
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Auch hier müsste das zu einer Methode in Direction umwandelbar sein. Auch hier müsste das zu einer Methode in Direction umwandelbar sein.
Lixfel
hat
Stat dem If-Block mit Subtract and add: Alle Werte mit Stat dem If-Block mit Subtract and add: Alle Werte mit `int factor = direction.isNorthOrWest() ? 1 : -1;` multiplizieren.
|
|||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void frontRun(boolean invert) {
|
||||||
|
int length = 10 + random.nextInt(xLength - 10);
|
||||||
|
int xOffset = getWidthStart(zLength);
|
||||||
|
int zOffset = getLengthStart(xLength, length);
|
||||||
|
int yOffset = 25 + getHeightStart();
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Üblicherweise verwenden wir eher Bukkit...getScheduler().runTaskTimer(Plugin, lambda-Methode, Zeit(en)) Üblicherweise verwenden wir eher Bukkit...getScheduler().runTaskTimer(Plugin, lambda-Methode, Zeit(en))
|
|||||||
|
|
||||||
|
Point redStart;
|
||||||
|
Point blueStart;
|
||||||
|
|
||||||
|
if (invert) {
|
||||||
|
redStart = new Point(Config.RedPasteRegion.getMaxX() - xOffset, Config.RedPasteRegion.getMaxY() + yOffset, Config.RedPasteRegion.getMaxZ() - zOffset);
|
||||||
|
blueStart = new Point(Config.BluePasteRegion.getMinX() + xOffset, Config.BluePasteRegion.getMaxY() + yOffset, Config.BluePasteRegion.getMinZ() + zOffset);
|
||||||
|
} else {
|
||||||
|
redStart = new Point(Config.RedPasteRegion.getMinX() + xOffset, Config.RedPasteRegion.getMaxY() + yOffset, Config.RedPasteRegion.getMinZ() + zOffset);
|
||||||
|
blueStart = new Point(Config.BluePasteRegion.getMaxX() - xOffset, Config.BluePasteRegion.getMaxY() + yOffset, Config.BluePasteRegion.getMaxZ() - zOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
dropFrontBombPart(redStart, blueStart, new int[]{length}, invert);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dropFrontBombPart(Point redStart, Point blueStart, int[] z, boolean invert) {
|
||||||
|
Bukkit.getScheduler().scheduleSyncRepeatingTask(FightSystem.getPlugin(), () -> new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
for (int x = 0; x < 4; x++) {
|
||||||
|
if (invert) {
|
||||||
|
world.spawnEntity(redStart.subtractAndToLocation(world, x, 0, z[0]), EntityType.PRIMED_TNT);
|
||||||
|
|
||||||
|
world.spawnEntity(blueStart.addAndToLocation(world, x, 0, z[0]), EntityType.PRIMED_TNT);
|
||||||
|
} else {
|
||||||
|
world.spawnEntity(redStart.addAndToLocation(world, x, 0, z[0]), EntityType.PRIMED_TNT);
|
||||||
|
|
||||||
|
world.spawnEntity(blueStart.subtractAndToLocation(world, x, 0, z[0]), EntityType.PRIMED_TNT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (z[0] < 2) {
|
||||||
|
this.cancel();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Ich glaube, du verwendest immer dieselben Parameter (bis auf die variable Zeit), daher kannst du den Sound und Level direkt im Konstruktor setzen und musst das nicht übergeben... Ich glaube, du verwendest immer dieselben Parameter (bis auf die variable Zeit), daher kannst du den Sound und Level direkt im Konstruktor setzen und musst das nicht übergeben...
|
|||||||
|
z[0] -= 2;
|
||||||
|
}
|
||||||
|
}, 0, 4L);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getLengthStart(int regionSize, int length) {
|
||||||
|
return random.nextInt(regionSize - length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getWidthStart(int regionSize) {
|
||||||
|
return random.nextInt(regionSize - 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getHeightStart() {
|
||||||
|
return random.nextInt(15);
|
||||||
Zeanon markierte diese Unterhaltung als gelöst
Lixfel
hat
Ich weiß nicht, aber ich glaube, dafür, dass an einer Stelle mal ein subtract und ein add ausgeführt wird (generalisierbar mit * +-1) ist es etwas overkill, eine eigene Klasse dafür vorzuhalten, selbst wenn Location in der 1.8 (glaube war der Grund) eine .add o.ä. Methode bereitstellt, ist etwas overkill. Dann hat man halt beim Aufruf etwas (mehr) Arithmetik. Ich weiß nicht, aber ich glaube, dafür, dass an einer Stelle mal ein subtract und ein add ausgeführt wird (generalisierbar mit * +-1) ist es etwas overkill, eine eigene Klasse dafür vorzuhalten, selbst wenn Location in der 1.8 (glaube war der Grund) eine .add o.ä. Methode bereitstellt, ist etwas overkill. Dann hat man halt beim Aufruf etwas (mehr) Arithmetik.
|
|||||||
|
}
|
||||||
|
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Warum geht es nicht, Location oder Vector zu verwenden? Warum geht es nicht, Location oder Vector zu verwenden?
Zeanon
hat
Weil Location und Vektor zu mehr undurchsichtigem code führt Weil Location und Vektor zu mehr undurchsichtigem code führt
|
|||||||
|
private class HellsBellsCountdown extends Countdown {
|
||||||
|
|
||||||
|
public HellsBellsCountdown(int time, SWSound sound, boolean level) {
|
||||||
|
super(time, sound, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String countdownCounting() {
|
||||||
|
return "bis die Bomben fallen";
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 addAndToLocation(World world, int x, int y, int z) {
|
||||||
|
return new Location(world, this.x + x, this.y + y, this.z + z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location subtractAndToLocation(World world, int x, int y, int z) {
|
||||||
|
return new Location(world, this.x - x, this.y - y, this.z - z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum State {
|
||||||
|
|
||||||
|
NONE(0, 0, -1),
|
||||||
|
PRE(60, 80, 50),
|
||||||
|
FIRST(40, 60, 5 * 60),
|
||||||
|
SECOND(30, 40, 4 * 60),
|
||||||
|
THIRD(20, 30, 3 * 60),
|
||||||
|
LAST(10, 20, -1);
|
||||||
|
|
||||||
|
|
||||||
|
State(int minTime, int maxTime, int switchAfter) {
|
||||||
|
this.minTime = minTime;
|
||||||
|
this.maxTime = maxTime;
|
||||||
|
this.switchAfter = switchAfter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final int minTime;
|
||||||
|
private final int maxTime;
|
||||||
|
private final int switchAfter;
|
||||||
|
|
||||||
|
|
||||||
|
public State getNext() {
|
||||||
|
switch (this) {
|
||||||
|
case PRE:
|
||||||
|
return FIRST;
|
||||||
|
case FIRST:
|
||||||
|
return SECOND;
|
||||||
|
case SECOND:
|
||||||
|
return THIRD;
|
||||||
|
case THIRD:
|
||||||
|
case LAST:
|
||||||
|
return LAST;
|
||||||
|
default:
|
||||||
|
return NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,46 +0,0 @@
|
|||||||
package de.steamwar.fightsystem.event;
|
|
||||||
|
|
||||||
import de.steamwar.fightsystem.countdown.Countdown;
|
|
||||||
import de.steamwar.fightsystem.countdown.SWSound;
|
|
||||||
import de.steamwar.fightsystem.states.FightState;
|
|
||||||
import de.steamwar.fightsystem.states.StateDependent;
|
|
||||||
import de.steamwar.fightsystem.winconditions.Winconditions;
|
|
||||||
|
|
||||||
|
|
||||||
public class Hells_Bells {
|
|
||||||
|
|
||||||
public Hells_Bells() {
|
|
||||||
(new StateDependent(Winconditions.HELLS_BELLS, FightState.Running) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void enable() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disable() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}).register();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class Hells_Bells_Event {
|
|
||||||
|
|
||||||
private static class Hells_Bells_Countdown extends Countdown {
|
|
||||||
|
|
||||||
public Hells_Bells_Countdown(int time, SWSound sound, boolean level) {
|
|
||||||
super(time, sound, level);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String countdownCounting() {
|
|
||||||
return "bis die Bomben fallen";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void countdownFinished() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,135 +0,0 @@
|
|||||||
package de.steamwar.fightsystem.winconditions;
|
|
||||||
|
|
||||||
import de.steamwar.fightsystem.FightSystem;
|
|
||||||
import de.steamwar.fightsystem.states.StateDependentCountdown;
|
|
||||||
import java.util.Random;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.EntityType;
|
|
||||||
|
|
||||||
|
|
||||||
public class Hells_Bells extends WinconditionAllDead {
|
|
||||||
|
|
||||||
private static int overlap = 5;
|
|
||||||
private static int distance = 3;
|
|
||||||
private static int width = 65;
|
|
||||||
private static int length = 40;
|
|
||||||
private static int height = 70;
|
|
||||||
|
|
||||||
private static int startTime = 40;
|
|
||||||
private static int endTime = 20;
|
|
||||||
private static int warningTime = 10;
|
|
||||||
private static int steps = 20;
|
|
||||||
private static int currentStep = 0;
|
|
||||||
private static int nextTime = startTime;
|
|
||||||
|
|
||||||
public static Random randomGenerator = new Random();
|
|
||||||
public static boolean debug = false;
|
|
||||||
private static int scheduler1 = 0;
|
|
||||||
private static int scheduler2 = 0;
|
|
||||||
private static World world = null; //TODO Woher bekomm ich die?
|
|
||||||
|
|
||||||
private static int getNextTime(int step) {
|
|
||||||
if (step == 0) {
|
|
||||||
return startTime;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
float temp = (startTime - (((startTime - endTime)/steps) * step));
|
|
||||||
if ((temp <= startTime) && (temp >= endTime)) {
|
|
||||||
return ((int) temp + getNextTime(step - 1));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return endTime + getNextTime(step - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void hellsBells(int time) {
|
|
||||||
if (time == nextTime) {
|
|
||||||
if (randomGenerator.nextInt(2) == 1) {
|
|
||||||
Double temp = randomGenerator.nextDouble();
|
|
||||||
if (debug) {
|
|
||||||
Bukkit.broadcastMessage("SideBombRun ; Route = " + temp.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
sideBombRun(temp);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Double temp = randomGenerator.nextDouble();
|
|
||||||
if (debug) {
|
|
||||||
Bukkit.broadcastMessage("FrontBombRun ; Route = " + temp.toString());
|
|
||||||
}
|
|
||||||
frontBombRun(temp);
|
|
||||||
}
|
|
||||||
currentStep++;
|
|
||||||
nextTime = getNextTime(currentStep);
|
|
||||||
if (debug) {
|
|
||||||
Bukkit.broadcastMessage("currentStep = " + currentStep + " ; nextTime = " + nextTime);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (time == nextTime - warningTime) {
|
|
||||||
Bukkit.broadcastMessage("Achtung! In " + warningTime + " Sekunden fallen Bomben!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void sideBombRun(Double route) {
|
|
||||||
Location temp1 = new Location(world, Main.ArenaMidX + overlap + (int)(width/2), Main.ArenaMidY + height, Main.ArenaMidZ + 25 + distance + (int)(route * (length - (2 * distance))));
|
|
||||||
Location temp2 = new Location(world, Main.ArenaMidX - overlap - (int)(width/2), Main.ArenaMidY + height, Main.ArenaMidZ - 25 - distance - (int)(route * (length - (2 * distance))));
|
|
||||||
sideBomb(temp1, temp2, (int)((width + 2 * overlap)/2));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void sideBomb(Location loc1, Location loc2, int count){
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX(), loc1.getY(), loc1.getZ() - 2), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX(), loc1.getY(), loc1.getZ() - 1), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX(), loc1.getY(), loc1.getZ() + 1), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX(), loc1.getY(), loc1.getZ() + 2), EntityType.PRIMED_TNT);
|
|
||||||
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX(), loc2.getY(), loc2.getZ() - 2), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX(), loc2.getY(), loc2.getZ() - 1), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX(), loc2.getY(), loc2.getZ() + 1), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX(), loc2.getY(), loc2.getZ() + 2), EntityType.PRIMED_TNT);
|
|
||||||
|
|
||||||
if (count >= 1) {
|
|
||||||
final Location temp1 = new Location(loc1.getWorld(), loc1.getX() - 2, loc1.getY(), loc1.getZ());
|
|
||||||
final Location temp2 = new Location(loc2.getWorld(), loc2.getX() + 2, loc2.getY(), loc2.getZ());
|
|
||||||
final int temp3 = count - 1;
|
|
||||||
scheduler1 = Bukkit.getScheduler().scheduleSyncDelayedTask(FightSystem.getPlugin(), () -> sideBomb(temp1, temp2, temp3), 4L);
|
|
||||||
// Bukkit.getScheduler().cancelTask(scheduler1);
|
|
||||||
// scheduler1 = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void frontBombRun(Double route) {
|
|
||||||
Location temp1 = new Location(world, Main.ArenaMidX + distance + (int)(route * (width - (2 * distance))) - (int) (width / 2), Main.ArenaMidY + height, Main.ArenaMidZ + 25 - overlap);
|
|
||||||
Location temp2 = new Location(world, Main.ArenaMidX - distance - (int)(route * (width - (2 * distance))) + (int) (width / 2), Main.ArenaMidY + height, Main.ArenaMidZ - 25 + overlap);
|
|
||||||
frontBomb(temp1, temp2, (int)((length + 2 * overlap) / 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void frontBomb(Location loc1, Location loc2, int count){
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX() - 2, loc1.getY(), loc1.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX() - 1, loc1.getY(), loc1.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX() + 1, loc1.getY(), loc1.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc1.getWorld(), loc1.getX() + 2, loc1.getY(), loc1.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX() - 2, loc2.getY(), loc2.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX() - 1, loc2.getY(), loc2.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX() + 1, loc2.getY(), loc2.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
world.spawnEntity(new Location(loc2.getWorld(), loc2.getX() + 2, loc2.getY(), loc2.getZ()), EntityType.PRIMED_TNT);
|
|
||||||
|
|
||||||
if (count >= 1) {
|
|
||||||
final Location temp1 = new Location(loc1.getWorld(), loc1.getX(), loc1.getY(), loc1.getZ() + 2);
|
|
||||||
final Location temp2 = new Location(loc2.getWorld(), loc2.getX(), loc2.getY(), loc2.getZ() - 2);
|
|
||||||
final int temp3 = count - 1;
|
|
||||||
scheduler2 = Bukkit.getScheduler().scheduleSyncDelayedTask(FightSystem.getPlugin(), () -> frontBomb(temp1, temp2, temp3), 4L);
|
|
||||||
// Bukkit.getScheduler().cancelTask(scheduler2);
|
|
||||||
// scheduler2 = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EndHellsBells() {
|
|
||||||
nextTime = startTime;
|
|
||||||
currentStep = 0;
|
|
||||||
}
|
|
||||||
}
|
|
Bitte rausnehmen (sollte auch nicht nötig sein?!?)