SteamWar/FightSystem
Archiviert
13
1
Update PercentWincondition
Dieser Commit ist enthalten in:
yoyosource 2021-05-13 13:14:42 +02:00
Ursprung c37abd7d54
Commit cd3ec80f43
4 geänderte Dateien mit 74 neuen und 60 gelöschten Zeilen

Datei anzeigen

@ -19,7 +19,14 @@
package de.steamwar.fightsystem.winconditions; 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.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 { 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); abstract double getPercent(FightTeam team);
public class TeamPercent {
public final FightTeam team;
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));
}
}
public abstract class StateDependentTeamPercent extends StateDependent {
public final FightTeam team;
public int totalBlocks;
public int currentBlocks;
protected StateDependentTeamPercent(FightTeam team, Winconditions winconditions) {
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));
}
}
} }

Datei anzeigen

@ -20,12 +20,10 @@
package de.steamwar.fightsystem.winconditions; package de.steamwar.fightsystem.winconditions;
import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.Fight;
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.StateDependentListener; import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent;
@ -42,17 +40,17 @@ public class WinconditionPercentSystem extends PercentWincondition implements Li
teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam())); teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam()));
teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam())); teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam()));
new StateDependentListener(Winconditions.PERCENT_SYSTEM, FightState.Running, this){ new StateDependentListener(Winconditions.PERCENT_SYSTEM, FightState.Running, this) {
@Override @Override
public void enable() { public void enable() {
super.enable(); super.enable();
teamMap.forEach((team, percent) -> { teamMap.forEach((team, percent) -> {
percent.destroyedBlocks = 0; percent.currentBlocks = 0;
percent.percent = 0; percent.percent = 0;
}); });
} }
}; };
if(Config.ActiveWinconditions.contains(Winconditions.PERCENT_SYSTEM)){ if (Config.ActiveWinconditions.contains(Winconditions.PERCENT_SYSTEM)) {
printableWinconditions.add(this); printableWinconditions.add(this);
percentWincondition = this; percentWincondition = this;
} }
@ -63,38 +61,29 @@ public class WinconditionPercentSystem extends PercentWincondition implements Li
teamMap.values().forEach(teamPercent -> teamPercent.check(event)); 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 @Override
public double getPercent(FightTeam team) { public double getPercent(FightTeam team) {
return teamMap.get(team).percent; 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 double percent;
private int destroyedBlocks;
private TeamPercent(FightTeam team) { private TeamPercent(FightTeam team) {
this.team = team; super(team);
this.volume = team.getSchemRegion().volume(); totalBlocks = team.getSchemRegion().volume();
} }
private void check(EntityExplodeEvent event) { private void check(EntityExplodeEvent event) {
if(!team.getExtendRegion().inRegion(event.getEntity().getLocation())){ if (!team.getExtendRegion().inRegion(event.getEntity().getLocation())) {
return; return;
} }
destroyedBlocks += event.blockList().size(); currentBlocks += event.blockList().size();
percent = (double)destroyedBlocks * 100 / volume; percent = (double) currentBlocks * 100 / totalBlocks;
if(percent >= Config.PercentWin) { if (percent >= Config.PercentWin) {
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!"); lose();
win(Fight.getOpposite(team));
} }
} }
} }

Datei anzeigen

@ -23,8 +23,6 @@ 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.FightTeam; 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.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
@ -38,12 +36,12 @@ public class WinconditionRelativePercent extends PercentWincondition {
private final Map<FightTeam, TeamPercent> teamMap = new HashMap<>(); private final Map<FightTeam, TeamPercent> teamMap = new HashMap<>();
public WinconditionRelativePercent(){ public WinconditionRelativePercent() {
super("RelativePercent"); super("RelativePercent");
teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam())); teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam()));
teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam())); teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam()));
if(Config.ActiveWinconditions.contains(Winconditions.RELATIVE_PERCENT)){ if (Config.ActiveWinconditions.contains(Winconditions.RELATIVE_PERCENT)) {
printableWinconditions.add(this); printableWinconditions.add(this);
percentWincondition = this; percentWincondition = this;
} }
@ -54,67 +52,59 @@ public class WinconditionRelativePercent extends PercentWincondition {
return teamMap.get(team).getPercent(); return teamMap.get(team).getPercent();
} }
@Override public class TeamPercent extends StateDependentTeamPercent {
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;
private int blockCount;
private BukkitTask task; private BukkitTask task;
private int currentBlocks;
public TeamPercent(FightTeam team){ public TeamPercent(FightTeam team) {
super(Winconditions.RELATIVE_PERCENT, FightState.Running); super(team, Winconditions.RELATIVE_PERCENT);
this.team = team; currentBlocks = 1;
this.currentBlocks = 1;
register(); register();
} }
@Override @Override
public void enable(){ public void enable() {
blockCount = currentBlocks(); totalBlocks = currentBlocks();
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::check, 400, 400); task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::check, 400, 400);
} }
@Override @Override
public void disable(){ public void disable() {
task.cancel(); task.cancel();
} }
private void check(){ private void check() {
currentBlocks(); currentBlocks();
if(!Config.ActiveWinconditions.contains(Winconditions.RELATIVE_PERCENT)) if (!Config.ActiveWinconditions.contains(Winconditions.RELATIVE_PERCENT))
return; return;
if(getPercent() >= Config.PercentWin){ if (getPercent() >= Config.PercentWin) {
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!"); lose();
FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent");
} }
} }
public double getPercent(){ public double getPercent() {
if(currentBlocks > blockCount) if (currentBlocks > totalBlocks) {
return 0; return 0;
return (blockCount - currentBlocks) * 100 / (double) blockCount; }
return (totalBlocks - currentBlocks) * 100 / (double) totalBlocks;
} }
public int getBlockCount(){ public int getBlockCount() {
return blockCount; return totalBlocks;
} }
private int currentBlocks(){ private int currentBlocks() {
// Entern active // Entern active
if(!Config.EnterStages.isEmpty() && Config.EnterStages.get(0) >= Wincondition.getTimeOverCountdown().getTimeLeft()) if (!Config.EnterStages.isEmpty() && Config.EnterStages.get(0) >= Wincondition.getTimeOverCountdown().getTimeLeft())
return currentBlocks; return currentBlocks;
currentBlocks = 0; currentBlocks = 0;
team.getSchemRegion().forEach((x, y, z) -> { 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++; currentBlocks++;
}
}); });
return currentBlocks; return currentBlocks;
} }

Datei anzeigen

@ -57,11 +57,6 @@ public class WinconditionRelativeRedstonePercent extends PercentWincondition imp
return teamMap.get(team).getPercent(); return teamMap.get(team).getPercent();
} }
@Override
public String getDisplay(FightTeam team) {
return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
}
@EventHandler @EventHandler
public void onBlockPlace(BlockPlaceEvent event) { public void onBlockPlace(BlockPlaceEvent event) {
FightPlayer fightPlayer = Fight.getFightPlayer(event.getPlayer()); FightPlayer fightPlayer = Fight.getFightPlayer(event.getPlayer());