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 250c429a51 werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -56,12 +56,10 @@ public class ArrowStopper extends BasicListener {
Entity entity = e.getKey(); Entity entity = e.getKey();
if(checkBlocks(entity.getLocation().getBlock(), e.getValue().getBlock())){ if(checkBlocks(entity.getLocation().getBlock(), e.getValue().getBlock())){
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.
entity.remove(); entity.remove();
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
LAST_LOCATION.remove(entity); iterator.remove();
Veraltet
Review

Da musst du iterator.remove() verwenden.

Da musst du iterator.remove() verwenden.
} } else {
else { if(isValidEntity(entity, e)) {
if(entity.getTicksLived() > Config.ArrowTechhiderCollision || 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.
((AbstractArrow) entity).isInBlock() || entity.getLocation().equals(e.getValue())) {
LAST_LOCATION.remove(entity);
}else { }else {
Veraltet
Review

Ebenfalls. Nutze einen Iterator.

Ebenfalls. Nutze einen Iterator.
LAST_LOCATION.replace(e.getKey(), e.getKey().getLocation()); LAST_LOCATION.replace(e.getKey(), e.getKey().getLocation());
Veraltet
Review

Auch hier wieder: Iterator benutzen.

Auch hier wieder: Iterator benutzen.
} }
@ -77,7 +75,7 @@ public class ArrowStopper extends BasicListener {
@Override @Override
public void enable() { public void enable() {
super.enable(); super.enable();
task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::run, 1, 1); task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::run, 1, 1);
} }
Veraltet
Review

Das kannst du nicht Asynchron machen (es dauert 50ms+, bis du einen Chunk für Blockabfragen bekommst), das produziert hier nur Threads.

Das kannst du nicht Asynchron machen (es dauert 50ms+, bis du einen Chunk für Blockabfragen bekommst), das produziert hier nur Threads.
@Override @Override
@ -120,4 +118,10 @@ public class ArrowStopper extends BasicListener {
private boolean checkBlock(Block block) { private boolean checkBlock(Block block) {
return Config.HiddenBlockTags.contains(block.getType().name()); return Config.HiddenBlockTags.contains(block.getType().name());
} }
private boolean isValidEntity(Entity entity, Map.Entry<Entity, Location> entry) {
return entity.getTicksLived() > Config.ArrowTechhiderCollision ||
((AbstractArrow) entity).isInBlock() ||
entity.getLocation().equals(entry.getValue());
}
} }