RedstoneWincondition #274
@ -3,6 +3,7 @@ package de.steamwar.fightsystem.winconditions;
|
|||||||
import de.steamwar.fightsystem.Config;
|
import de.steamwar.fightsystem.Config;
|
||||||
import de.steamwar.fightsystem.FightSystem;
|
import de.steamwar.fightsystem.FightSystem;
|
||||||
import de.steamwar.fightsystem.fight.Fight;
|
import de.steamwar.fightsystem.fight.Fight;
|
||||||
|
import de.steamwar.fightsystem.fight.FightPlayer;
|
||||||
import de.steamwar.fightsystem.fight.FightTeam;
|
import de.steamwar.fightsystem.fight.FightTeam;
|
||||||
import de.steamwar.fightsystem.states.FightState;
|
import de.steamwar.fightsystem.states.FightState;
|
||||||
import de.steamwar.fightsystem.states.StateDependent;
|
import de.steamwar.fightsystem.states.StateDependent;
|
||||||
@ -15,11 +16,14 @@ import org.bukkit.block.data.BlockData;
|
|||||||
import org.bukkit.block.data.Powerable;
|
import org.bukkit.block.data.Powerable;
|
||||||
import org.bukkit.block.data.Rail;
|
import org.bukkit.block.data.Rail;
|
||||||
import org.bukkit.block.data.type.TechnicalPiston;
|
import org.bukkit.block.data.type.TechnicalPiston;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class WinconditionRelativeRedstonePercent extends Wincondition implements PrintableWincondition, PercentWincondition {
|
public class WinconditionRelativeRedstonePercent extends Wincondition implements PrintableWincondition, PercentWincondition, Listener {
|
||||||
|
|
||||||
private static final World world = Bukkit.getWorlds().get(0);
|
private static final World world = Bukkit.getWorlds().get(0);
|
||||||
private static final Set<Material> ignoredBlocks;
|
private static final Set<Material> ignoredBlocks;
|
||||||
@ -41,6 +45,7 @@ public class WinconditionRelativeRedstonePercent extends Wincondition implements
|
|||||||
if (Config.ActiveWinconditions.contains(Winconditions.RELATIVE_REDSTONE_PERCENT)) {
|
if (Config.ActiveWinconditions.contains(Winconditions.RELATIVE_REDSTONE_PERCENT)) {
|
||||||
printableWinconditions.add(this);
|
printableWinconditions.add(this);
|
||||||
percentWincondition = this;
|
percentWincondition = this;
|
||||||
|
Bukkit.getPluginManager().registerEvents(this, FightSystem.getPlugin());
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,6 +59,17 @@ public class WinconditionRelativeRedstonePercent extends Wincondition implements
|
|||||||
return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
|
return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Liest sich wie Code-Duplication, evtl PercentWincondition PrintableWincondition extenden lassen und dann eine default-Implementierung im Interface (Formatierung dürfte für alle 3 Prozentsysteme gleich sein) Liest sich wie Code-Duplication, evtl PercentWincondition PrintableWincondition extenden lassen und dann eine default-Implementierung im Interface (Formatierung dürfte für alle 3 Prozentsysteme gleich sein)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Den Listener kannst du weglassen, was möchtest du damit überhaupt? Es sind eh nur die zyklischen Prüfungen relevant. Den Listener kannst du weglassen, was möchtest du damit überhaupt? Es sind eh nur die zyklischen Prüfungen relevant.
YoyoNow
hat
Nein, wenn ein Block plaziert wurde, darf man keine Prozente zurückbekommen. Nein, wenn ein Block plaziert wurde, darf man keine Prozente zurückbekommen.
Lixfel
hat
Dann wäre allerdings der explosionsbasierte Messansatz besser als der zeitbasiert prüfende. Dann wäre allerdings der explosionsbasierte Messansatz besser als der zeitbasiert prüfende.
|
|||||||
|
FightPlayer fightPlayer = Fight.getFightPlayer(event.getPlayer());
|
||||||
|
if (fightPlayer == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (validBlock(event.getBlockPlaced())) {
|
||||||
|
teamMap.get(fightPlayer.getTeam()).blockCount--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class TeamPercent extends StateDependent {
|
public static class TeamPercent extends StateDependent {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Der Code hier liest sich wie Copy+Paste aus der RelativeWincondition. Codeduplication bitte entfernen (aka generalisieren) Der Code hier liest sich wie Copy+Paste aus der RelativeWincondition. Codeduplication bitte entfernen (aka generalisieren)
|
|||||||
private final FightTeam team;
|
private final FightTeam team;
|
||||||
|
|
||||||
@ -105,33 +121,39 @@ public class WinconditionRelativeRedstonePercent extends Wincondition implements
|
|||||||
currentBlocks = 0;
|
currentBlocks = 0;
|
||||||
team.getSchemRegion().forEach((x, y, z) -> {
|
team.getSchemRegion().forEach((x, y, z) -> {
|
||||||
Block block = world.getBlockAt(x, y, z);
|
Block block = world.getBlockAt(x, y, z);
|
||||||
|
if (validBlock(block)) {
|
||||||
|
currentBlocks++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return currentBlocks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean validBlock(Block block) {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Methode bitte vor die Subklasse verschieben Methode bitte vor die Subklasse verschieben
|
|||||||
Material material = block.getType();
|
Material material = block.getType();
|
||||||
if (ignoredBlocks.contains(material)) {
|
if (ignoredBlocks.contains(material)) {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Es wird nur eine Auswahl an Blöcken erfasst, aber dann gibt es nochmal extra ignorierte Blöcke?!? Bitte was? Es wäre evtl. am besten (und konfiurabelsten) die ignoredBlocks-Liste als die Liste der Blöcke, die gewertet wird, zu verwenden. Es wird nur eine Auswahl an Blöcken erfasst, aber dann gibt es nochmal extra ignorierte Blöcke?!? Bitte was?
Es wäre evtl. am besten (und konfiurabelsten) die ignoredBlocks-Liste als die Liste der Blöcke, die gewertet wird, zu verwenden.
|
|||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
BlockData blockData = block.getBlockData();
|
BlockData blockData = block.getBlockData();
|
||||||
if (blockData instanceof Powerable
|
if (blockData instanceof Powerable
|
||||||
|| blockData instanceof TechnicalPiston
|
|| blockData instanceof TechnicalPiston
|
||||||
|| blockData instanceof AnaloguePowerable
|
|| blockData instanceof AnaloguePowerable
|
||||||
|| blockData instanceof Rail) {
|
|| blockData instanceof Rail) {
|
||||||
currentBlocks++;
|
return true;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
switch (material) {
|
switch (material) {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Ich glaube, hier ist die Prüfung auf die BlockData und das Material redundant, für eine der beiden Varianten entscheiden. Ich glaube, hier ist die Prüfung auf die BlockData und das Material redundant, für eine der beiden Varianten entscheiden.
YoyoNow
hat
Geht nicht ganz. Geht nicht ganz.
Lixfel
hat
Doch. Doch.
|
|||||||
case NOTE_BLOCK:
|
case NOTE_BLOCK:
|
||||||
case REDSTONE_BLOCK:
|
case REDSTONE_BLOCK:
|
||||||
case REDSTONE:
|
case REDSTONE:
|
||||||
|
case OBSERVER:
|
||||||
case HOPPER:
|
case HOPPER:
|
||||||
case REDSTONE_LAMP:
|
case REDSTONE_LAMP:
|
||||||
case REDSTONE_TORCH:
|
case REDSTONE_TORCH:
|
||||||
case REDSTONE_WALL_TORCH:
|
case REDSTONE_WALL_TORCH:
|
||||||
currentBlocks++;
|
return true;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
return false;
|
||||||
}
|
|
||||||
});
|
|
||||||
return currentBlocks;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Bitte einen StateDependentListener verwenden.
Kann ich aber nicht hier in der Klasse machen, weil 2 mal Extend wird wohl nichts!