RedstoneWincondition #274
@ -26,6 +26,7 @@ public enum Winconditions {
|
|||||||
ALL_DEAD,
|
ALL_DEAD,
|
||||||
CAPTAIN_DEAD,
|
CAPTAIN_DEAD,
|
||||||
PERCENT_SYSTEM,
|
PERCENT_SYSTEM,
|
||||||
|
RELATIVE_REDSTONE_PERCENT,
|
||||||
RELATIVE_PERCENT,
|
RELATIVE_PERCENT,
|
||||||
POINTS,
|
POINTS,
|
||||||
TIME_TECH_KO,
|
TIME_TECH_KO,
|
||||||
|
@ -98,6 +98,9 @@ public class FightSystem extends JavaPlugin {
|
|||||||
new WinconditionWaterTechKO();
|
new WinconditionWaterTechKO();
|
||||||
new WinconditionPercentSystem();
|
new WinconditionPercentSystem();
|
||||||
new WinconditionRelativePercent();
|
new WinconditionRelativePercent();
|
||||||
|
if (Core.getVersion() >= 15) {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
|
|||||||
|
new WinconditionRelativeRedstonePercent();
|
||||||
|
}
|
||||||
new WinconditionPoints();
|
new WinconditionPoints();
|
||||||
new WinconditionTimeout();
|
new WinconditionTimeout();
|
||||||
new WinconditionHeartRatioTimeout();
|
new WinconditionHeartRatioTimeout();
|
||||||
|
@ -0,0 +1,145 @@
|
|||||||
|
package de.steamwar.fightsystem.winconditions;
|
||||||
|
|
||||||
|
import de.steamwar.fightsystem.Config;
|
||||||
|
import de.steamwar.fightsystem.FightSystem;
|
||||||
|
import de.steamwar.fightsystem.fight.Fight;
|
||||||
|
import de.steamwar.fightsystem.fight.FightTeam;
|
||||||
|
import de.steamwar.fightsystem.states.FightState;
|
||||||
|
import de.steamwar.fightsystem.states.StateDependent;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.AnaloguePowerable;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.Powerable;
|
||||||
|
import org.bukkit.block.data.Rail;
|
||||||
|
import org.bukkit.block.data.type.TechnicalPiston;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class WinconditionRelativeRedstonePercent extends Wincondition implements PrintableWincondition, PercentWincondition {
|
||||||
|
|
||||||
|
private static final World world = Bukkit.getWorlds().get(0);
|
||||||
|
private static final Set<Material> ignoredBlocks;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Set<Material> ignored = new HashSet<>();
|
||||||
|
for (String s : Config.IgnoredBlocks)
|
||||||
|
ignored.add(Material.valueOf(s));
|
||||||
|
ignoredBlocks = Collections.unmodifiableSet(ignored);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Map<FightTeam, TeamPercent> teamMap = new HashMap<>();
|
||||||
|
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Richt mir ein bisschen nach Code-Duplication, bitte auslagern, dass der Code nur einmal da ist. Richt mir ein bisschen nach Code-Duplication, bitte auslagern, dass der Code nur einmal da ist.
|
|||||||
|
public WinconditionRelativeRedstonePercent() {
|
||||||
|
super("RelativeRedstonePercent");
|
||||||
|
teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam()));
|
||||||
|
teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam()));
|
||||||
|
|
||||||
|
if (Config.ActiveWinconditions.contains(Winconditions.RELATIVE_REDSTONE_PERCENT)) {
|
||||||
|
printableWinconditions.add(this);
|
||||||
|
percentWincondition = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getPercent(FightTeam team) {
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Bitte einen StateDependentListener verwenden. Bitte einen StateDependentListener verwenden.
YoyoNow
hat
Kann ich aber nicht hier in der Klasse machen, weil 2 mal Extend wird wohl nichts! Kann ich aber nicht hier in der Klasse machen, weil 2 mal Extend wird wohl nichts!
|
|||||||
|
return teamMap.get(team).getPercent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDisplay(FightTeam team) {
|
||||||
|
return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TeamPercent extends StateDependent {
|
||||||
|
private final FightTeam team;
|
||||||
|
|
||||||
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)
|
|||||||
|
private int blockCount;
|
||||||
|
private BukkitTask task;
|
||||||
|
private int currentBlocks;
|
||||||
|
|
||||||
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.
|
|||||||
|
public TeamPercent(FightTeam team) {
|
||||||
|
super(Winconditions.RELATIVE_PERCENT, FightState.Running);
|
||||||
|
this.team = team;
|
||||||
|
this.currentBlocks = 1;
|
||||||
|
register();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enable() {
|
||||||
|
blockCount = currentBlocks();
|
||||||
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)
|
|||||||
|
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::check, 400, 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disable() {
|
||||||
|
task.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void check() {
|
||||||
|
currentBlocks();
|
||||||
|
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Fände es nicer, wenn hier ein StateDependentTask und ein OneShotStateDependent statt des extends StateDependent verwendet wird. Fände es nicer, wenn hier ein StateDependentTask und ein OneShotStateDependent statt des extends StateDependent verwendet wird.
|
|||||||
|
if (!Config.ActiveWinconditions.contains(Winconditions.RELATIVE_REDSTONE_PERCENT))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (getPercent() >= Config.PercentWin) {
|
||||||
|
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Redstone verloren!");
|
||||||
|
FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getPercent() {
|
||||||
|
if (currentBlocks > blockCount)
|
||||||
|
return 0;
|
||||||
|
return (blockCount - currentBlocks) * 100 / (double) blockCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBlockCount() {
|
||||||
|
return blockCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int currentBlocks() {
|
||||||
|
// Entern active
|
||||||
|
if (!Config.EnterStages.isEmpty() && Config.EnterStages.get(0) >= Wincondition.getTimeOverCountdown().getTimeLeft())
|
||||||
|
return currentBlocks;
|
||||||
|
|
||||||
|
currentBlocks = 0;
|
||||||
|
team.getSchemRegion().forEach((x, y, z) -> {
|
||||||
|
Block block = world.getBlockAt(x, y, z);
|
||||||
|
Material material = block.getType();
|
||||||
|
if (ignoredBlocks.contains(material)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BlockData blockData = block.getBlockData();
|
||||||
|
if (blockData instanceof Powerable
|
||||||
|
|| blockData instanceof TechnicalPiston
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Ich glaube, eine Deaktivierung mit Beginn der Enterphase ist derzeit nicht vorgesehen? Ich glaube, eine Deaktivierung mit Beginn der Enterphase ist derzeit nicht vorgesehen?
YoyoNow
hat
Ist aber so auch im RelativePercent Ist aber so auch im RelativePercent
Lixfel
hat
Weil der RelativePercent von WS kommt..... Weil der RelativePercent von WS kommt.....
|
|||||||
|
|| blockData instanceof AnaloguePowerable
|
||||||
|
|| blockData instanceof Rail) {
|
||||||
|
currentBlocks++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (material) {
|
||||||
|
case NOTE_BLOCK:
|
||||||
|
case REDSTONE_BLOCK:
|
||||||
|
case REDSTONE:
|
||||||
|
case REPEATER:
|
||||||
|
case COMPARATOR:
|
||||||
|
case OBSERVER:
|
||||||
|
case HOPPER:
|
||||||
|
case REDSTONE_LAMP:
|
||||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Methode bitte vor die Subklasse verschieben Methode bitte vor die Subklasse verschieben
|
|||||||
|
case REDSTONE_TORCH:
|
||||||
|
case REDSTONE_WALL_TORCH:
|
||||||
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.
|
|||||||
|
case REDSTONE_WIRE:
|
||||||
|
currentBlocks++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return currentBlocks;
|
||||||
|
}
|
||||||
|
}
|
||||||
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.
|
|||||||
|
}
|
Der Aufwand, das ganze 1.12-Kompatibel zu machen, ist nicht so groß, bitte machen (da eigentlich alles im Fightsystem für alle Versionen ausgelegt ist). Und nicht den 1.14-Support vergessen.