Arrows Stopping in Techhider Blocks #208
@ -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() {
|
||||
|
||||
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;
|
||||
Lixfel
hat
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;
|
||||
Lixfel
hat
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.
|
||||
}
|
||||
Lixfel
hat
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())) {
|
||||
Lixfel
hat
Da musst du iterator.remove() verwenden. Da musst du iterator.remove() verwenden.
|
||||
arrow.remove();
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
Lixfel
hat
Die Verschachtelung kann man evtl. durch eine else if-Konstruktion ersetzen. Die Verschachtelung kann man evtl. durch eine else if-Konstruktion ersetzen.
|
||||
}
|
||||
Lixfel
hat
Ebenfalls. Nutze einen Iterator. Ebenfalls. Nutze einen Iterator.
|
||||
@ -97,7 +100,7 @@ public class ArrowStopper extends BasicListener {
|
||||
return Config.HiddenBlockTags.contains(block.getType().name());
|
||||
Lixfel
hat
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;
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
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());