HellsBells #275
@ -30,13 +30,12 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
|
||||||
|
|
||||||
|
|
||||||
public class HellsBells {
|
public class HellsBells {
|
||||||
@ -44,23 +43,21 @@ public class HellsBells {
|
|||||||
public static final Random random = new Random();
|
public static final Random random = new Random();
|
||||||
|
|
||||||
private enum Direction {
|
private enum Direction {
|
||||||
|
|||||||
NORTH(0, 0, 1, true),
|
NORTH(0, 0, 1),
|
||||||
SOUTH(0, 0, -1, true),
|
SOUTH(0, 0, -1),
|
||||||
EAST(1, 0, 0, false),
|
EAST(1, 0, 0),
|
||||||
WEST(-1, 0, 0, false);
|
WEST(-1, 0, 0);
|
||||||
|
|
||||||
static final Direction[] DIRECTIONS = values();
|
static final Direction[] DIRECTIONS = values();
|
||||||
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.
|
|||||||
|
|
||||||
int dx;
|
int dx;
|
||||||
int dy;
|
int dy;
|
||||||
int dz;
|
int dz;
|
||||||
boolean zLength;
|
|
||||||
|
|
||||||
Direction(int dx, int dy, int dz, boolean zLength) {
|
Direction(int dx, int dy, int dz) {
|
||||||
this.dx = dx;
|
this.dx = dx;
|
||||||
this.dy = dy;
|
this.dy = dy;
|
||||||
this.dz = dz;
|
this.dz = dz;
|
||||||
this.zLength = zLength;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Direction getRandom() {
|
public static Direction getRandom() {
|
||||||
@ -81,6 +78,18 @@ public class HellsBells {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getLength(int length1, int length2) {
|
||||||
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.
|
|||||||
|
return isNorthOrSouth() ? length1 : length2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNorthOrSouth() {
|
||||||
|
return this == NORTH || this == SOUTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNorthOrWest() {
|
||||||
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.
|
|||||||
|
return this == NORTH || this == WEST;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public HellsBells() {
|
public HellsBells() {
|
||||||
@ -117,16 +126,16 @@ public class HellsBells {
|
|||||||
public void drop() {
|
public void drop() {
|
||||||
Direction direction = Direction.getRandom();
|
Direction direction = Direction.getRandom();
|
||||||
|
|
||||||
AtomicInteger length = new AtomicInteger(10 + random.nextInt((direction.zLength ? zLength : xLength) - 10));
|
AtomicInteger length = new AtomicInteger(10 + random.nextInt(direction.getLength(zLength, xLength) - 10));
|
||||||
int width = 5 + random.nextInt(5);
|
int width = 5 + random.nextInt(5);
|
||||||
int xOffset = getWidthStart(direction.zLength ? xLength : zLength, direction.zLength ? length.get() : width);
|
int xOffset = getWidthStart(direction.getLength(xLength, zLength), direction.getLength(length.get(), width));
|
||||||
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.
|
|||||||
int zOffset = getLengthStart(direction.zLength ? zLength : xLength, direction.zLength ? width : length.get());
|
int zOffset = getLengthStart(direction.getLength(zLength, xLength), direction.getLength(width, length.get()));
|
||||||
int yOffset = getHeightStart();
|
int yOffset = getHeightStart();
|
||||||
|
|
||||||
Point redStart;
|
Point redStart;
|
||||||
Point blueStart;
|
Point blueStart;
|
||||||
|
|
||||||
if (direction == Direction.NORTH || direction == Direction.WEST) {
|
if (direction.isNorthOrWest()) {
|
||||||
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 ?:.
|
|||||||
redStart = new Point(Config.RedPasteRegion.getMaxX() - xOffset, Config.RedExtendRegion.getMaxY() + yOffset, Config.RedPasteRegion.getMaxZ() - zOffset);
|
redStart = new Point(Config.RedPasteRegion.getMaxX() - xOffset, Config.RedExtendRegion.getMaxY() + yOffset, Config.RedPasteRegion.getMaxZ() - zOffset);
|
||||||
blueStart = new Point(Config.BluePasteRegion.getMinX() + xOffset, Config.BlueExtendRegion.getMaxY() + yOffset, Config.BluePasteRegion.getMinZ() + zOffset);
|
blueStart = new Point(Config.BluePasteRegion.getMinX() + xOffset, Config.BlueExtendRegion.getMaxY() + yOffset, Config.BluePasteRegion.getMinZ() + zOffset);
|
||||||
} else {
|
} else {
|
||||||
Lixfel
hat
Kann glaube noch private static sein. Kann glaube noch private static sein.
|
|||||||
@ -136,7 +145,7 @@ public class HellsBells {
|
|||||||
|
|
||||||
currentDropping = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), () -> {
|
currentDropping = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), () -> {
|
||||||
for (int w = 0; w < width; w++) {
|
for (int w = 0; w < width; w++) {
|
||||||
if (direction == Direction.NORTH || direction == Direction.WEST) {
|
if (direction.isNorthOrWest()) {
|
||||||
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.
|
|||||||
world.spawnEntity(redStart.subtractAndToLocation(world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), EntityType.PRIMED_TNT);
|
world.spawnEntity(redStart.subtractAndToLocation(world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), EntityType.PRIMED_TNT);
|
||||||
|
|
||||||
world.spawnEntity(blueStart.addAndToLocation(world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), EntityType.PRIMED_TNT);
|
world.spawnEntity(blueStart.addAndToLocation(world, direction.dx * length.get() + w * direction.other().dx, 0, direction.dz * length.get() + w * direction.other().dz), EntityType.PRIMED_TNT);
|
||||||
|
Subklassen bitte nach dem Inhalt der Hauptklasse.