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
2 geänderte Dateien mit 32 neuen und 2 gelöschten Zeilen
Nur Änderungen aus Commit 81ac127bbf werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -26,6 +26,6 @@ public class ArrowStopper_12 {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
static int blockToId(Block block){ static int blockToId(Block block){
return block.getTypeId() << 4 + block.getData(); return block.getTypeId();
Veraltet
Review

In der 1.12 ist in Config.HiddenBlocks nur block.getTypeId() ohne << 4 + getData()

In der 1.12 ist in Config.HiddenBlocks nur block.getTypeId() ohne << 4 + getData()
} }
} }

Datei anzeigen

@ -25,18 +25,24 @@ import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.FightState;
import de.steamwar.fightsystem.states.StateDependent; import de.steamwar.fightsystem.states.StateDependent;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.AbstractArrow; import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import java.util.Collection; import java.util.Collection;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap;
import java.util.Set; import java.util.Set;
public class ArrowStopper implements StateDependent { public class ArrowStopper implements StateDependent {
Veraltet
Review

Wenn das ganze StateDependent und Listener ist, wäre es evtl. eleganter, das ganze als listener zu haben, und für den Task dann einfach die enable und disable-Methode überschreiben und die super()-Methode mit aufzurufen.

Wenn das ganze StateDependent und Listener ist, wäre es evtl. eleganter, das ganze als listener zu haben, und für den Task dann einfach die enable und disable-Methode überschreiben und die super()-Methode mit aufzurufen.
private BukkitTask task; private BukkitTask task;
private static final HashMap<Entity, Location> LAST_LOCATION = new HashMap<>();
public static void init() { public static void init() {
if(Config.ArrowTechhiderCollision == -1) if(Config.ArrowTechhiderCollision == -1)
@ -51,9 +57,17 @@ public class ArrowStopper implements StateDependent {
for (Entity entity : arrows) { for (Entity entity : arrows) {
if(entity.getTicksLived() > Config.ArrowTechhiderCollision) if(entity.getTicksLived() > Config.ArrowTechhiderCollision)
Veraltet
Review

Hätte es gerne, dass du zur kognitiven Komplexitätsreduktion einfach am Ende prüfst (beim derzeitigen else), wie lange die Entity schon gelebt hat, und sie dann ggf. einfach nicht mehr einfügst.

Hätte es gerne, dass du zur kognitiven Komplexitätsreduktion einfach am Ende prüfst (beim derzeitigen else), wie lange die Entity schon gelebt hat, und sie dann ggf. einfach nicht mehr einfügst.
Veraltet
Review

Bitte auch noch "tote" Arrows/ stillstehende Arrows rauswerfen.

Bitte auch noch "tote" Arrows/ stillstehende Arrows rauswerfen.
continue; continue;
Veraltet
Review

Wenn man so häufig e.getKey() verwendet (weiter unten ja auch noch), ist es einfach wesentlich besser lesbar, wenn man das dann einfach mal als temporäre extravariable deklariert.

Wenn man so häufig e.getKey() verwendet (weiter unten ja auch noch), ist es einfach wesentlich besser lesbar, wenn man das dann einfach mal als temporäre extravariable deklariert.
if(Config.HiddenBlocks.contains(blockToId(entity.getLocation().getBlock()))) if(!LAST_LOCATION.containsKey(entity))
Veraltet
Review

Das dürfte glaube ich nicht den Wert aus dem Set entfernen, sondern nur die Entity aus der Welt. LAST_LOCATION wird damit immer weiter zugemüllt.

Das dürfte glaube ich nicht den Wert aus dem Set entfernen, sondern nur die Entity aus der Welt. LAST_LOCATION wird damit immer weiter zugemüllt.
LAST_LOCATION.put(entity, ((Player) ((AbstractArrow) entity).getShooter()).getEyeLocation());
Veraltet
Review

Bitte reduziere mal deine Map-Operationen. Optimierungsidee: Du machst LAST_LOCATION.remove(), und wenn du null bekommst, nimmst du deine EyeLocation, 1,5 Mapoperationen weniger.

Bitte reduziere mal deine Map-Operationen. Optimierungsidee: Du machst LAST_LOCATION.remove(), und wenn du null bekommst, nimmst du deine EyeLocation, 1,5 Mapoperationen weniger.
int distance = (int) Math.ceil(entity.getLocation().toVector().distance(LAST_LOCATION.get(entity).toVector()));
try {
checkBlock(entity.getFacing().getOppositeFace(), entity.getLocation().getBlock(), distance, entity.getLocation().getBlockY() - LAST_LOCATION.get(entity).getBlockY());
Veraltet
Review

Ich glaube, replace() wäre hier die angebrachtere Operation

Ich glaube, replace() wäre hier die angebrachtere Operation
} catch (TechHiddenBlock techHiddenBlock) {
entity.remove(); entity.remove();
} }
LAST_LOCATION.remove(entity);
LAST_LOCATION.put(entity, entity.getLocation());
}
Veraltet
Review

Wozu die Klammern?

Wozu die Klammern?
} }
Veraltet
Review

Da eh kaum etwas anderes als Spieler den Pfeil schießen werden, ist die Filterung hier eigentlich unnötig

Da eh kaum etwas anderes als Spieler den Pfeil schießen werden, ist die Filterung hier eigentlich unnötig
@Override @Override
@ -69,6 +83,7 @@ public class ArrowStopper implements StateDependent {
@Override @Override
public void disable() { public void disable() {
task.cancel(); task.cancel();
LAST_LOCATION.clear();
} }
private static int blockToId(Block block){ private static int blockToId(Block block){
@ -83,4 +98,19 @@ public class ArrowStopper implements StateDependent {
return ArrowStopper_15.blockToId(block); return ArrowStopper_15.blockToId(block);
} }
} }
private void checkBlock(BlockFace face, Block block, int i, int lastdown) throws TechHiddenBlock {
Bukkit.getOnlinePlayers().forEach(player -> player.sendBlockChange(block.getLocation(), Material.RED_STAINED_GLASS.createBlockData()));
if(Config.HiddenBlocks.contains(blockToId(block)))
throw new TechHiddenBlock();
if(lastdown != 0) {
boolean negativ = lastdown < 0;
BlockFace toFace = negativ?BlockFace.UP:BlockFace.DOWN;
checkBlock(face, block.getRelative(toFace), i, lastdown + (negativ?1:-1));
}
if(i != 0 && Math.abs(lastdown) < i)
checkBlock(face, block.getRelative(face), i - 1, lastdown);
}
private class TechHiddenBlock extends Throwable {}
} }