SteamWar/FightSystem
Archiviert
13
1

RedstoneWincondition #274

Geschlossen
YoyoNow möchte 18 Commits von RedstoneWincondition nach master mergen
4 geänderte Dateien mit 74 neuen und 60 gelöschten Zeilen
Nur Änderungen aus Commit cd3ec80f43 werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -19,7 +19,14 @@
package de.steamwar.fightsystem.winconditions;
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 java.util.EnumSet;
public abstract class PercentWincondition extends Wincondition implements PrintableWincondition {
@ -32,4 +39,37 @@ public abstract class PercentWincondition extends Wincondition implements Printa
}
abstract double getPercent(FightTeam team);
public class TeamPercent {
public final FightTeam team;
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Jeder Prozentmodus braucht irgendwo beide Teams, die Map FightTeam -> TeamPercent müsste daher hierher abstrahierbar sein.

Aka: Die Teammap schon hier in PercentWincondition zur Verfügung stellen und füllen (parameter im Konstruktor übergeben lassen), getPercent gleich hier implementieren.

In der PointWincondition hast du dann einfach noch eine zweite Map

Jeder Prozentmodus braucht irgendwo beide Teams, die Map FightTeam -> TeamPercent müsste daher hierher abstrahierbar sein. Aka: Die Teammap schon hier in PercentWincondition zur Verfügung stellen und füllen (parameter im Konstruktor übergeben lassen), getPercent gleich hier implementieren. In der PointWincondition hast du dann einfach noch eine zweite Map
public int totalBlocks;
public int currentBlocks;
protected TeamPercent(FightTeam team) {
this.team = team;
}
public void lose() {
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!");
win(Fight.getOpposite(team));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Ich glaube, hier können ein paar Fields final gesetzt werden.

Ich glaube, hier können ein paar Fields final gesetzt werden.
}
}
public abstract class StateDependentTeamPercent extends StateDependent {
public final FightTeam team;
public int totalBlocks;
public int currentBlocks;
protected StateDependentTeamPercent(FightTeam team, Winconditions winconditions) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

OneShotStateDependents werden schon im Konstruktor registered, bitte nicht dopplet registern.

OneShotStateDependents werden schon im Konstruktor registered, bitte nicht dopplet registern.
super(winconditions, FightState.Running);
this.team = team;
}
public void lose() {
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!");
win(Fight.getOpposite(team));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Hier am Ende des Konstruktors würde ich gleich dieses TeamPercent in die teamMap einfügen, dann musst du das nicht an den ganzen anderen Stellen machen (und kannst es nicht vergessen)

Hier am Ende des Konstruktors würde ich gleich dieses TeamPercent in die teamMap einfügen, dann musst du das nicht an den ganzen anderen Stellen machen (und kannst es nicht vergessen)
}
}
}

Datei anzeigen

@ -20,12 +20,10 @@
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.StateDependentListener;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent;
@ -47,7 +45,7 @@ public class WinconditionPercentSystem extends PercentWincondition implements Li
public void enable() {
super.enable();
teamMap.forEach((team, percent) -> {
percent.destroyedBlocks = 0;
percent.currentBlocks = 0;
percent.percent = 0;
});
}
@ -63,26 +61,18 @@ public class WinconditionPercentSystem extends PercentWincondition implements Li
teamMap.values().forEach(teamPercent -> teamPercent.check(event));
}
@Override
public String getDisplay(FightTeam team) {
return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
}
@Override
public double getPercent(FightTeam team) {
return teamMap.get(team).percent;
}
private class TeamPercent {
private class TeamPercent extends PercentWincondition.TeamPercent {
private final FightTeam team;
private final int volume;
private double percent;
private int destroyedBlocks;
private TeamPercent(FightTeam team) {
this.team = team;
this.volume = team.getSchemRegion().volume();
super(team);
totalBlocks = team.getSchemRegion().volume();
}
private void check(EntityExplodeEvent event) {
@ -90,11 +80,10 @@ public class WinconditionPercentSystem extends PercentWincondition implements Li
return;
}
destroyedBlocks += event.blockList().size();
percent = (double)destroyedBlocks * 100 / volume;
currentBlocks += event.blockList().size();
percent = (double) currentBlocks * 100 / totalBlocks;
if (percent >= Config.PercentWin) {
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!");
win(Fight.getOpposite(team));
lose();
}
}
}

Datei anzeigen

@ -23,8 +23,6 @@ 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.World;
import org.bukkit.scheduler.BukkitTask;
@ -54,28 +52,19 @@ public class WinconditionRelativePercent extends PercentWincondition {
return teamMap.get(team).getPercent();
}
@Override
public String getDisplay(FightTeam team) {
return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
}
public class TeamPercent extends StateDependentTeamPercent {
public static class TeamPercent extends StateDependent {
private final FightTeam team;
private int blockCount;
private BukkitTask task;
private int currentBlocks;
public TeamPercent(FightTeam team) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Muss kein AtomicInteger sein, wenn es sich um eine Objektvariable handelt

Muss kein AtomicInteger sein, wenn es sich um eine Objektvariable handelt
super(Winconditions.RELATIVE_PERCENT, FightState.Running);
this.team = team;
this.currentBlocks = 1;
super(team, Winconditions.RELATIVE_PERCENT);
currentBlocks = 1;
register();
}
@Override
public void enable() {
blockCount = currentBlocks();
totalBlocks = currentBlocks();
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::check, 400, 400);
}
@ -91,19 +80,19 @@ public class WinconditionRelativePercent extends PercentWincondition {
return;
if (getPercent() >= Config.PercentWin) {
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!");
FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent");
lose();
}
}
public double getPercent() {
if(currentBlocks > blockCount)
if (currentBlocks > totalBlocks) {
return 0;
return (blockCount - currentBlocks) * 100 / (double) blockCount;
}
return (totalBlocks - currentBlocks) * 100 / (double) totalBlocks;
}
public int getBlockCount() {
return blockCount;
return totalBlocks;
}
private int currentBlocks() {
@ -113,8 +102,9 @@ public class WinconditionRelativePercent extends PercentWincondition {
currentBlocks = 0;
team.getSchemRegion().forEach((x, y, z) -> {
if(!Config.Blocks.contains(world.getBlockAt(x,y,z).getType()))
if (!Config.Blocks.contains(world.getBlockAt(x, y, z).getType())) {
currentBlocks++;
}
});
return currentBlocks;
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Hier wird ein wichtiges Feature für die RelativePercentWincondition und die PointsWincondition enfernt: Wenn die Enterphase begonnen hat, dürfen bei diesen beiden Winconditions keine Prozente mehr gezählt werden.

Hier wird ein wichtiges Feature für die RelativePercentWincondition und die PointsWincondition enfernt: Wenn die Enterphase begonnen hat, dürfen bei diesen beiden Winconditions keine Prozente mehr gezählt werden.

Datei anzeigen

@ -57,11 +57,6 @@ public class WinconditionRelativeRedstonePercent extends PercentWincondition imp
return teamMap.get(team).getPercent();
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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)
@Override
public String getDisplay(FightTeam team) {
return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
FightPlayer fightPlayer = Fight.getFightPlayer(event.getPlayer());