Arrows Stopping in Techhider Blocks #208
@ -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())){
|
||||||
|
|||||||
entity.remove();
|
entity.remove();
|
||||||
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
|
|||||||
LAST_LOCATION.remove(entity);
|
iterator.remove();
|
||||||
Lixfel
hat
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();
|
||||||
Lixfel
hat
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 {
|
||||||
Lixfel
hat
Ebenfalls. Nutze einen Iterator. Ebenfalls. Nutze einen Iterator.
|
|||||||
LAST_LOCATION.replace(e.getKey(), e.getKey().getLocation());
|
LAST_LOCATION.replace(e.getKey(), e.getKey().getLocation());
|
||||||
Lixfel
hat
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
Lixfel
hat
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
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.