SteamWar/FightSystem
Archiviert
13
1

Arrows Stopping in Techhider Blocks #208

Manuell gemergt
Lixfel hat 17 Commits von arrow-in-techhider nach master 2021-01-02 09:20:42 +01:00 zusammengeführt
Nur Änderungen aus Commit 47e256d31c werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -28,10 +28,11 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
import java.util.*;
import java.util.EnumSet;
public class ArrowStopper extends BasicListener {
@ -43,18 +44,20 @@ public class ArrowStopper extends BasicListener {
}
private void run() {
Veraltet
Review

Die Init-Methode kann gestrichen werden und alles in den Konstruktor (der dann Public wird) übernommen werden. Konstruktor wäre dann super(Config.ArrowTechhiderCollision != 0 ? EnumSet.of(RUNNING), EnumSet.empty());

Die Init-Methode kann gestrichen werden und alles in den Konstruktor (der dann Public wird) übernommen werden. Konstruktor wäre dann super(Config.ArrowTechhiderCollision != 0 ? EnumSet.of(RUNNING), EnumSet.empty());
Iterator<Arrow> iterator = Bukkit.getWorlds().get(0).getEntitiesByClass(Arrow.class).iterator();
while (iterator.hasNext()) {
Arrow arrow = iterator.next();
if(isValidEntity(arrow))
for (Arrow arrow : Bukkit.getWorlds().get(0).getEntitiesByClass(Arrow.class)) {
if (invalidEntity(arrow))
continue;
Veraltet
Review

BasicListener übernimmt im Konstruktor schon das Registrieren als StateDependent

BasicListener übernimmt im Konstruktor schon das Registrieren als StateDependent
Location prevLocation = arrow.getLocation().toVector().subtract(arrow.getVelocity()).toLocation(arrow.getWorld());
if(arrow.getTicksLived() == 0)
prevLocation = ((Player) arrow.getShooter()).getEyeLocation();
if(checkBlocks(arrow.getLocation().getBlock(), prevLocation.getBlock())) {
if (arrow.getTicksLived() == 0){
ProjectileSource projSource = arrow.getShooter();
if(projSource instanceof Player)
prevLocation = ((Player) arrow.getShooter()).getEyeLocation();
else
continue;
Veraltet
Review

Das dürfte nichts bringen, da der Iterator eigens auf einem für diese Aufgabe erstellter ArrayList läuft. Die Zeile drüber reicht schon vollkommen aus, um den Pfeil zu entfernen.

Das dürfte nichts bringen, da der Iterator eigens auf einem für diese Aufgabe erstellter ArrayList läuft. Die Zeile drüber reicht schon vollkommen aus, um den Pfeil zu entfernen.
}
Veraltet
Review

Das müsste aus meiner Java-Erfahrung heraus auf jeden fall eine ConcurrentModificationException werfen

Das müsste aus meiner Java-Erfahrung heraus auf jeden fall eine ConcurrentModificationException werfen
if (checkBlocks(arrow.getLocation().getBlock(), prevLocation.getBlock())) {
Veraltet
Review

Da musst du iterator.remove() verwenden.

Da musst du iterator.remove() verwenden.
arrow.remove();
iterator.remove();
}
}
Veraltet
Review

Die Verschachtelung kann man evtl. durch eine else if-Konstruktion ersetzen.

Die Verschachtelung kann man evtl. durch eine else if-Konstruktion ersetzen.
}
Veraltet
Review

Ebenfalls. Nutze einen Iterator.

Ebenfalls. Nutze einen Iterator.
@ -97,7 +100,7 @@ public class ArrowStopper extends BasicListener {
return Config.HiddenBlockTags.contains(block.getType().name());
Veraltet
Review

Der Name der Funktion verwirrt etwas, da die Funktion ja einen Invalid boolean zurückgibt. evtl. isInvalid?

Der Name der Funktion verwirrt etwas, da die Funktion ja einen Invalid boolean zurückgibt. evtl. isInvalid?
}
private boolean isValidEntity(Arrow entity) {
private boolean invalidEntity(Arrow entity) {
boolean teamFrom = entity.getVelocity().getZ() > 0;
boolean overMid = entity.getLocation().getZ() > Config.SpecSpawn.getZ();
boolean otherSide = teamFrom == overMid;