RedstoneWincondition #274
@ -1,26 +1,16 @@
|
||||
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.FightPlayer;
|
||||
import de.steamwar.fightsystem.fight.FightTeam;
|
||||
import de.steamwar.fightsystem.states.FightState;
|
||||
import de.steamwar.fightsystem.states.StateDependent;
|
||||
import de.steamwar.fightsystem.states.StateDependentListener;
|
||||
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.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -36,7 +26,7 @@ public class WinconditionRelativeRedstonePercent extends PercentWincondition imp
|
||||
teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam()));
|
||||
teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam()));
|
||||
|
||||
new StateDependentListener(Winconditions.RELATIVE_REDSTONE_PERCENT, FightState.Running, this){
|
||||
new StateDependentListener(Winconditions.RELATIVE_REDSTONE_PERCENT, FightState.Running, this) {
|
||||
@Override
|
||||
public void enable() {
|
||||
super.enable();
|
||||
@ -58,99 +48,53 @@ public class WinconditionRelativeRedstonePercent extends PercentWincondition imp
|
||||
}
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
|
||||
|
||||
@EventHandler
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
FightPlayer fightPlayer = Fight.getFightPlayer(event.getPlayer());
|
||||
if (fightPlayer == null) {
|
||||
return;
|
||||
}
|
||||
if (validBlock(event.getBlockPlaced())) {
|
||||
teamMap.get(fightPlayer.getTeam()).blockCount--;
|
||||
}
|
||||
public void onEntityExplode(EntityExplodeEvent event) {
|
||||
teamMap.values().forEach(teamPercent -> teamPercent.check(event));
|
||||
}
|
||||
|
||||
public static class TeamPercent extends StateDependent {
|
||||
private final FightTeam team;
|
||||
private static boolean validBlock(Block block) {
|
||||
return Config.Blocks.contains(block.getType());
|
||||
}
|
||||
|
||||
private int blockCount;
|
||||
private BukkitTask task;
|
||||
private int currentBlocks;
|
||||
public class TeamPercent extends PercentWincondition.TeamPercent {
|
||||
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)
|
||||
|
||||
public TeamPercent(FightTeam team) {
|
||||
super(Winconditions.RELATIVE_REDSTONE_PERCENT, FightState.Running);
|
||||
this.team = team;
|
||||
this.currentBlocks = 1;
|
||||
register();
|
||||
super(team);
|
||||
totalBlocks = 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.
|
||||
currentBlocks = totalBlocks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enable() {
|
||||
blockCount = currentBlocks();
|
||||
task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::check, 100, 100);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
task.cancel();
|
||||
}
|
||||
|
||||
private void check() {
|
||||
currentBlocks();
|
||||
|
||||
if (!Config.ActiveWinconditions.contains(Winconditions.RELATIVE_REDSTONE_PERCENT))
|
||||
private void check(EntityExplodeEvent event) {
|
||||
if (!team.getExtendRegion().inRegion(event.getEntity().getLocation())) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.blockList().forEach(block -> {
|
||||
if (validBlock(block)) {
|
||||
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)
|
||||
currentBlocks--;
|
||||
}
|
||||
});
|
||||
|
||||
if (getPercent() >= Config.PercentWin) {
|
||||
Bukkit.broadcastMessage(FightSystem.PREFIX + "§cTeam " + team.getColoredName() + " §chat zu viel Redstone verloren!");
|
||||
FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent");
|
||||
lose();
|
||||
}
|
||||
}
|
||||
|
||||
public double getPercent() {
|
||||
if (currentBlocks > blockCount)
|
||||
if (currentBlocks > totalBlocks)
|
||||
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.
|
||||
return 0;
|
||||
return (blockCount - currentBlocks) * 100 / (double) blockCount;
|
||||
return (totalBlocks - currentBlocks) * 100 / (double) totalBlocks;
|
||||
}
|
||||
|
||||
private int currentBlocks() {
|
||||
// Entern active
|
||||
if (!Config.EnterStages.isEmpty() && Config.EnterStages.get(0) >= Wincondition.getTimeOverCountdown().getTimeLeft())
|
||||
return currentBlocks;
|
||||
|
||||
currentBlocks = 0;
|
||||
totalBlocks = 0;
|
||||
team.getSchemRegion().forEach((x, y, z) -> {
|
||||
Block block = world.getBlockAt(x, y, z);
|
||||
if (validBlock(block)) {
|
||||
currentBlocks++;
|
||||
totalBlocks++;
|
||||
}
|
||||
});
|
||||
return currentBlocks;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean validBlock(Block block) {
|
||||
Material material = block.getType();
|
||||
if (Config.Blocks.contains(material)) {
|
||||
return false;
|
||||
}
|
||||
BlockData blockData = block.getBlockData();
|
||||
if (blockData instanceof Powerable
|
||||
|| blockData instanceof TechnicalPiston
|
||||
|| blockData instanceof AnaloguePowerable
|
||||
|| blockData instanceof Rail) {
|
||||
return true;
|
||||
}
|
||||
switch (material) {
|
||||
case NOTE_BLOCK:
|
||||
case REDSTONE_BLOCK:
|
||||
case REDSTONE:
|
||||
case OBSERVER:
|
||||
case HOPPER:
|
||||
case REDSTONE_LAMP:
|
||||
case REDSTONE_TORCH:
|
||||
case REDSTONE_WALL_TORCH:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
return totalBlocks;
|
||||
}
|
||||
}
|
||||
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Bitte einen StateDependentListener verwenden.
Kann ich aber nicht hier in der Klasse machen, weil 2 mal Extend wird wohl nichts!