Some refactoring
Signed-off-by: Lixfel <agga-games@gmx.de>
Dieser Commit ist enthalten in:
Ursprung
c27f8bbd82
Commit
aed86fc97b
@ -24,9 +24,10 @@ public class Config {
|
||||
public static final int PreSchemPasteDuration;
|
||||
public static final int SetupDuration;
|
||||
public static final int PreFightDuration;
|
||||
public static final int EnterPhaseBegin;
|
||||
public static final int SpectatorDuration;
|
||||
public static final boolean Entern;
|
||||
|
||||
// entern parameter
|
||||
public static final List<Integer> EnterStages;
|
||||
|
||||
//arena parameter
|
||||
public static final int SchemsizeX;
|
||||
@ -183,16 +184,16 @@ public class Config {
|
||||
PercentSystem = config.getBoolean("WinConditions.PercentSystem");
|
||||
RelativePercent = config.getBoolean("WinConditions.RelativePercent");
|
||||
Points = config.getBoolean("WinConditions.Points");
|
||||
Entern = config.getBoolean("WinConditions.Entern");
|
||||
TechKO = config.getBoolean("WinConditions.TechKO");
|
||||
WaterTechKO = config.getBoolean("WinConditions.WaterTechKO");
|
||||
PumpkinTechKO = config.getBoolean("WinConditions.PumpkinTechKO");
|
||||
|
||||
TimeoutTime = config.getInt("WinConditionParams.TimeoutTime");
|
||||
EnterPhaseBegin = config.getInt("WinConditionParams.EnterPhaseBegin");
|
||||
PercentWin = config.getDouble("WinConditionParams.PercentWin");
|
||||
IgnoredBlocks = Collections.unmodifiableList(config.getStringList("WinConditionParams.IgnoredBlocks"));
|
||||
|
||||
EnterStages = Collections.unmodifiableList(config.getIntegerList("EnterStages"));
|
||||
|
||||
MemberDefault = config.getString("Kits.MemberDefault");
|
||||
LeaderDefault = config.getString("Kits.LeaderDefault");
|
||||
PersonalKits = config.getBoolean("Kits.PersonalKits");
|
||||
|
@ -11,7 +11,6 @@ public class IFightSystem {
|
||||
private static Plugin plugin;
|
||||
private static String prefix;
|
||||
private static EventFight eventFight;
|
||||
private static boolean entern = false;
|
||||
private static Player eventLeiter;
|
||||
|
||||
public static void init(Plugin plugin, String prefix){
|
||||
@ -21,9 +20,6 @@ public class IFightSystem {
|
||||
static void setEventFight(EventFight ef){
|
||||
eventFight = ef;
|
||||
}
|
||||
static void setEntern(boolean entern){
|
||||
IFightSystem.entern = entern;
|
||||
}
|
||||
static void setEventLeiter(Player el){
|
||||
eventLeiter = el;
|
||||
}
|
||||
@ -37,9 +33,6 @@ public class IFightSystem {
|
||||
public static EventFight getEventFight(){
|
||||
return eventFight;
|
||||
}
|
||||
public static boolean isEntern(){
|
||||
return entern;
|
||||
}
|
||||
public static Player getEventLeiter(){
|
||||
return eventLeiter;
|
||||
}
|
||||
|
@ -6,4 +6,5 @@ public interface IFightTeam {
|
||||
|
||||
boolean isBlue();
|
||||
boolean isPlayerInTeam(Player player);
|
||||
boolean canPlayerEntern(Player player);
|
||||
}
|
||||
|
@ -70,13 +70,13 @@ public class ITechHider {
|
||||
arenaMinZ > chunkZ ||
|
||||
chunkZ > arenaMaxZ;
|
||||
}else if(ft.isBlue()){
|
||||
return IFightSystem.isEntern() ||
|
||||
return ft.canPlayerEntern(p) ||
|
||||
redMinX > chunkX ||
|
||||
chunkX > redMaxX ||
|
||||
redMinZ > chunkZ ||
|
||||
chunkZ > redMaxZ;
|
||||
}else{
|
||||
return IFightSystem.isEntern() ||
|
||||
return ft.canPlayerEntern(p) ||
|
||||
blueMinX > chunkX ||
|
||||
chunkX > blueMaxX ||
|
||||
blueMinZ > chunkZ ||
|
||||
|
@ -161,8 +161,7 @@ public class FightSystem extends JavaPlugin {
|
||||
setFightState(FightState.RUNNING);
|
||||
setAllPlayersGM(GameMode.SURVIVAL);
|
||||
|
||||
if(Config.Entern)
|
||||
mainCountdown = new EnternCountdown();
|
||||
//TODO: Entern Countdowns and Entern chunk reload
|
||||
|
||||
FightStatistics.start();
|
||||
WaterRemover.init();
|
||||
@ -170,13 +169,10 @@ public class FightSystem extends JavaPlugin {
|
||||
}
|
||||
|
||||
public static void setEntern() {
|
||||
if(fightState != FightState.RUNNING)
|
||||
throw new SecurityException(fightState.name());
|
||||
setFightState(FightState.ENTERN);
|
||||
//TODO: Remove this function
|
||||
|
||||
final List<ITechHider.ChunkPos> chunksBlue = TechHider.prepareChunkReload(Fight.getBlueTeam().getPlayers().iterator().next().getPlayer());
|
||||
final List<ITechHider.ChunkPos> chunksRed = TechHider.prepareChunkReload(Fight.getRedTeam().getPlayers().iterator().next().getPlayer());
|
||||
IFightSystem.setEntern(true);
|
||||
for(FightPlayer player : Fight.getBlueTeam().getPlayers()){
|
||||
TechHider.reloadChunks(player.getPlayer(), chunksBlue);
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ public abstract class Countdown {
|
||||
BasicListener.toActionbar(p, msg);
|
||||
}
|
||||
|
||||
private void count(){
|
||||
void count(){
|
||||
switch (time) {
|
||||
case 900: case 600: case 300: case 180: case 120:
|
||||
broadcast("§rNoch §a" + time / 60 + " §rMinuten " + countdownCounting());
|
||||
|
@ -1,13 +1,19 @@
|
||||
package de.steamwar.fightsystem.countdown;
|
||||
|
||||
import de.steamwar.fightsystem.FightSystem;
|
||||
import de.steamwar.fightsystem.Config;
|
||||
import org.bukkit.Bukkit;
|
||||
import de.steamwar.fightsystem.FightSystem;
|
||||
import de.steamwar.fightsystem.fight.FightPlayer;
|
||||
import de.steamwar.fightsystem.listener.BasicListener;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class EnternCountdown extends Countdown {
|
||||
|
||||
public EnternCountdown() {
|
||||
super(Config.EnterPhaseBegin, SWSound.BLOCK_NOTE_PLING, false);
|
||||
private final FightPlayer fightPlayer;
|
||||
|
||||
public EnternCountdown(FightPlayer fp) {
|
||||
super(fp.getKit().getEnterStage(), SWSound.BLOCK_NOTE_PLING, false);
|
||||
fightPlayer = fp;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -17,7 +23,41 @@ public class EnternCountdown extends Countdown {
|
||||
|
||||
@Override
|
||||
public void countdownFinished() {
|
||||
FightSystem.setEntern();
|
||||
Bukkit.broadcastMessage(FightSystem.PREFIX + "§aEntern ist nun erlaubt!");
|
||||
fightPlayer.getPlayer().sendMessage(FightSystem.PREFIX + "§aEntern ist nun erlaubt!");
|
||||
//TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
void count(){
|
||||
Player player = fightPlayer.getPlayer();
|
||||
if(!fightPlayer.isLiving()){
|
||||
disable();
|
||||
return;
|
||||
}
|
||||
|
||||
int time = Config.EnterStages.get(fightPlayer.getKit().getEnterStage()) - FightSystem.getFightTime();
|
||||
switch (time) {
|
||||
case 900: case 600: case 300: case 180: case 120:
|
||||
BasicListener.toActionbar(player, TextComponent.fromLegacyText("§rNoch §a" + time / 60 + " §rMinuten " + countdownCounting()));
|
||||
break;
|
||||
case 60: case 30: case 20: case 15: case 10: case 5: case 4: case 3: case 2:
|
||||
player.playSound(player.getLocation(), Countdown.getSound(SWSound.BLOCK_NOTE_PLING), 100.0F, 1.0F);
|
||||
|
||||
BasicListener.toActionbar(player, TextComponent.fromLegacyText("§rNoch §a" + time + " §rSekunden " + countdownCounting()));
|
||||
break;
|
||||
case 1:
|
||||
player.playSound(player.getLocation(), Countdown.getSound(SWSound.BLOCK_NOTE_PLING), 100.0F, 1.0F);
|
||||
|
||||
BasicListener.toActionbar(player, TextComponent.fromLegacyText("§rNoch §a1 §rSekunde " + countdownCounting()));
|
||||
//TODO
|
||||
break;
|
||||
case 0:
|
||||
player.playSound(player.getLocation(), Countdown.getSound(SWSound.BLOCK_NOTE_PLING), 100.0F, 2.0F);
|
||||
|
||||
disable();
|
||||
countdownFinished();
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package de.steamwar.fightsystem.fight;
|
||||
|
||||
import de.steamwar.fightsystem.FightSystem;
|
||||
import de.steamwar.fightsystem.kit.KitManager;
|
||||
import de.steamwar.fightsystem.Config;
|
||||
import de.steamwar.fightsystem.kit.Kit;
|
||||
@ -62,4 +63,10 @@ public class FightPlayer {
|
||||
public void addKill(){
|
||||
kills++;
|
||||
}
|
||||
|
||||
public boolean canEntern(){
|
||||
if(Config.EnterStages.size() <= kit.getEnterStage() || kit.getEnterStage() < 0)
|
||||
return false;
|
||||
return Config.EnterStages.get(kit.getEnterStage()) >= FightSystem.getFightTime();
|
||||
}
|
||||
}
|
||||
|
@ -127,6 +127,11 @@ public class FightTeam implements IFightTeam{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlayerEntern(Player player) {
|
||||
return getFightPlayer(player).canEntern();
|
||||
}
|
||||
|
||||
public boolean isPlayerLeader(Player player) {
|
||||
if(leader != null)
|
||||
return leader.getPlayer().equals(player);
|
||||
|
@ -21,6 +21,8 @@ public class Kit {
|
||||
private final ItemStack[] inventory;
|
||||
private final ItemStack[] armor;
|
||||
private final Collection<PotionEffect> effects;
|
||||
private final int enterStage;
|
||||
private final boolean tnt;
|
||||
|
||||
Kit(String name, Player player) {
|
||||
this.name = name;
|
||||
@ -29,13 +31,15 @@ public class Kit {
|
||||
this.inventory = player.getInventory().getContents();
|
||||
this.armor = player.getInventory().getArmorContents();
|
||||
this.effects = player.getActivePotionEffects();
|
||||
this.enterStage = 0;
|
||||
this.tnt = true;
|
||||
}
|
||||
|
||||
Kit(ConfigurationSection kit){
|
||||
name = kit.getName();
|
||||
inventory = Objects.requireNonNull(kit.getList("Items")).toArray(new ItemStack[1]);
|
||||
inventory = Objects.requireNonNull(kit.getList("Items")).toArray(new ItemStack[0]);
|
||||
if(kit.isList("Armor"))
|
||||
armor = Objects.requireNonNull(kit.getList("Armor")).toArray(new ItemStack[1]);
|
||||
armor = Objects.requireNonNull(kit.getList("Armor")).toArray(new ItemStack[0]);
|
||||
else
|
||||
armor = null;
|
||||
leaderAllowed = kit.getBoolean("LeaderAllowed");
|
||||
@ -44,6 +48,8 @@ public class Kit {
|
||||
effects = (Collection<PotionEffect>) kit.getList("Effects");
|
||||
else
|
||||
effects = null;
|
||||
enterStage = kit.getInt("EnterStage", 0);
|
||||
tnt = kit.getBoolean("TNT", true);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
@ -58,6 +64,16 @@ public class Kit {
|
||||
return memberAllowed;
|
||||
}
|
||||
|
||||
/* Is this kit allowed to set/handle tnt? */
|
||||
public boolean isTnt(){
|
||||
return tnt;
|
||||
}
|
||||
|
||||
/* In which stage is entern allowed? */
|
||||
public int getEnterStage() {
|
||||
return enterStage;
|
||||
}
|
||||
|
||||
public boolean isStackInKit(ItemStack stack){
|
||||
for(ItemStack is : inventory){
|
||||
if(stack.equals(is))
|
||||
@ -88,6 +104,8 @@ public class Kit {
|
||||
section.set("LeaderAllowed", leaderAllowed);
|
||||
section.set("MemberAllowed", memberAllowed);
|
||||
section.set("Effects", effects);
|
||||
section.set("EnterStage", enterStage);
|
||||
section.set("TNT", tnt);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -15,8 +15,7 @@ import java.util.logging.Level;
|
||||
public class KitManager {
|
||||
private KitManager(){}
|
||||
|
||||
private static final String KITS_PATH = "plugins/" + FightSystem.getPlugin().getName() + "/kits.data";
|
||||
private static final File kits = new File(KITS_PATH);
|
||||
private static final File kits = new File(FightSystem.getPlugin().getDataFolder(), "kits.data");
|
||||
private static final FileConfiguration kitData = YamlConfiguration.loadConfiguration(kits);
|
||||
|
||||
private static final ArrayList<Kit> loadedKits = new ArrayList<>();
|
||||
@ -49,7 +48,7 @@ public class KitManager {
|
||||
}
|
||||
|
||||
public static void loadAllKits() {
|
||||
if(!new File(KITS_PATH).exists()) {
|
||||
if(!kits.exists()) {
|
||||
saveAllKits();
|
||||
Bukkit.getLogger().log(Level.INFO, "kits.data erstellt!");
|
||||
FightSystem.shutdown(null);
|
||||
|
@ -10,7 +10,7 @@ import java.util.EnumSet;
|
||||
public class EntityExplodeListener extends BasicListener {
|
||||
|
||||
public EntityExplodeListener() {
|
||||
super(EnumSet.of(FightState.RUNNING, FightState.ENTERN));
|
||||
super(EnumSet.of(FightState.RUNNING));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
@ -15,7 +15,7 @@ import java.util.Objects;
|
||||
public class InFightDamageListener extends BasicListener {
|
||||
|
||||
public InFightDamageListener() {
|
||||
super(EnumSet.of(FightState.RUNNING, FightState.ENTERN));
|
||||
super(EnumSet.of(FightState.RUNNING));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
@ -1,9 +1,13 @@
|
||||
package de.steamwar.fightsystem.listener;
|
||||
|
||||
import de.steamwar.fightsystem.fight.Fight;
|
||||
import de.steamwar.fightsystem.fight.FightPlayer;
|
||||
import de.steamwar.fightsystem.states.FightState;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||
import org.bukkit.event.inventory.InventoryPickupItemEvent;
|
||||
@ -17,7 +21,7 @@ import java.util.EnumSet;
|
||||
public class InFightInventoryListener extends BasicListener {
|
||||
|
||||
public InFightInventoryListener() {
|
||||
super(EnumSet.of(FightState.RUNNING, FightState.ENTERN));
|
||||
super(EnumSet.of(FightState.RUNNING));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -93,4 +97,12 @@ public class InFightInventoryListener extends BasicListener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockPlace(BlockPlaceEvent e) {
|
||||
FightPlayer fp = Fight.getFightPlayer(e.getPlayer());
|
||||
if(fp != null && !fp.getKit().isTnt()){
|
||||
BasicListener.toActionbar(e.getPlayer(), TextComponent.fromLegacyText("§cDu darfst keine Blöcke setzen!"));
|
||||
e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ public class PistonListener extends BasicListener {
|
||||
|
||||
public PistonListener() {
|
||||
//Wenn Entern aktiv ist, sollen Raketen etc. entern können
|
||||
super(Config.Entern
|
||||
super(Config.EnterStages.isEmpty()
|
||||
? EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP)
|
||||
: EnumSet.allOf(FightState.class));
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ public class PlayerMoveListener extends BasicListener {
|
||||
reset(event, DENY_TEAM);
|
||||
else if(fightTeam == Fight.getBlueTeam() && player.getGameMode() == GameMode.SPECTATOR)
|
||||
reset(event, DENY_ENTERN);
|
||||
}else if(fightTeam != null && FightSystem.getFightState() != FightState.ENTERN && player.getGameMode() != GameMode.SPECTATOR)
|
||||
}else if(fightTeam != null && player.getGameMode() != GameMode.SPECTATOR && !fightTeam.canPlayerEntern(player))
|
||||
reset(event, DENY_ENTERN);
|
||||
}
|
||||
|
||||
|
@ -6,13 +6,12 @@ public enum FightState {
|
||||
POST_SCHEM_SETUP(true, true, false, false),
|
||||
PRE_RUNNING(false, false, true, false),
|
||||
RUNNING(false, false, true, true),
|
||||
ENTERN(false, false, true, true), //Can be skipped
|
||||
SPECTATE(false, true, false, false);
|
||||
|
||||
private final boolean setup; //PRE_LEADER_SETUP, PRE_SCHEM_SETUP, POST_SCHEM_SETUP
|
||||
private final boolean outgame; //PRE_LEADER_SETUP, PRE_SCHEM_SETUP, POST_SCHEM_SETUP, SPECTATE
|
||||
private final boolean ingame; //PRE_RUNNING, RUNNING, ENTERN
|
||||
private final boolean infight; //RUNNING, ENTERN
|
||||
private final boolean ingame; //PRE_RUNNING, RUNNING
|
||||
private final boolean infight; //RUNNING
|
||||
|
||||
FightState(boolean setup, boolean outgame, boolean ingame, boolean infight){
|
||||
this.setup = setup;
|
||||
|
26
FightSystem_Main/src/de/steamwar/fightsystem/utils/EnterHandler.java
Normale Datei
26
FightSystem_Main/src/de/steamwar/fightsystem/utils/EnterHandler.java
Normale Datei
@ -0,0 +1,26 @@
|
||||
package de.steamwar.fightsystem.utils;
|
||||
|
||||
import de.steamwar.fightsystem.states.FightState;
|
||||
import de.steamwar.fightsystem.states.StateDependent;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class EnterHandler implements StateDependent {
|
||||
private static final Set<FightState> enabled = EnumSet.of(FightState.RUNNING);
|
||||
|
||||
@Override
|
||||
public Set<FightState> enabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enable() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
|
||||
}
|
||||
}
|
@ -19,7 +19,7 @@ public class FightScoreboard {
|
||||
|
||||
private FightScoreboard(){}
|
||||
|
||||
private static final Set<FightState> fullScoreboard = EnumSet.of(FightState.RUNNING, FightState.ENTERN, FightState.SPECTATE);
|
||||
private static final Set<FightState> fullScoreboard = EnumSet.of(FightState.RUNNING, FightState.SPECTATE);
|
||||
private static final Scoreboard scoreboard = Objects.requireNonNull(Bukkit.getScoreboardManager()).getMainScoreboard();
|
||||
private static final Objective objective;
|
||||
private static int index = 0;
|
||||
@ -70,8 +70,6 @@ public class FightScoreboard {
|
||||
else
|
||||
objective.getScore("§7Zeit: §a" + fightTime + "s").setScore(3);
|
||||
}
|
||||
if (Config.Entern)
|
||||
objective.getScore("§7Entern: " + (FightSystem.getFightState() == FightState.ENTERN ? "§aja" : "§cnein")).setScore(2);
|
||||
|
||||
if(fullScoreboard.contains(FightSystem.getFightState())){
|
||||
if (Config.PercentSystem){
|
||||
|
@ -10,7 +10,7 @@ import java.util.EnumSet;
|
||||
abstract class PlayerWincondition extends ListenerWincondition {
|
||||
|
||||
PlayerWincondition(boolean condition) {
|
||||
super(condition, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING, FightState.ENTERN));
|
||||
super(condition, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING));
|
||||
}
|
||||
|
||||
boolean isTarget(Player player){
|
||||
|
@ -13,7 +13,7 @@ public class WinconditionHeartRatioTimeout extends Wincondition {
|
||||
private TimeOverCountdown countdown;
|
||||
|
||||
public WinconditionHeartRatioTimeout() {
|
||||
super(Config.HeartRatioTimeout, EnumSet.of(FightState.RUNNING, FightState.ENTERN));
|
||||
super(Config.HeartRatioTimeout, EnumSet.of(FightState.RUNNING));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -22,7 +22,7 @@ public class WinconditionPercentSystem extends ListenerWincondition {
|
||||
private static final int schematicSize = Math.abs(Config.SchemsizeX * Config.SchemsizeY * Config.SchemsizeZ);
|
||||
|
||||
public WinconditionPercentSystem() {
|
||||
super(Config.PercentSystem, EnumSet.of(FightState.RUNNING, FightState.ENTERN));
|
||||
super(Config.PercentSystem, EnumSet.of(FightState.RUNNING));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
@ -22,7 +22,7 @@ public class WinconditionPumpkinTechKO extends Wincondition {
|
||||
private BukkitTask task;
|
||||
|
||||
public WinconditionPumpkinTechKO(){
|
||||
super(Config.PumpkinTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING, FightState.ENTERN));
|
||||
super(Config.PumpkinTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING));
|
||||
}
|
||||
|
||||
public static int getTeamBluePumpkins() {
|
||||
|
@ -89,7 +89,8 @@ public class WinconditionRelativePercent extends Wincondition{
|
||||
}
|
||||
|
||||
private int currentBlocks(){
|
||||
if(FightSystem.getFightState() == FightState.ENTERN || FightSystem.getFightState() == FightState.SPECTATE)
|
||||
// Entern active
|
||||
if(!Config.EnterStages.isEmpty() && Config.EnterStages.get(0) <= FightSystem.getFightTime())
|
||||
return currentBlocks;
|
||||
|
||||
int blocks = 0;
|
||||
|
@ -12,7 +12,7 @@ public class WinconditionTimeout extends Wincondition {
|
||||
private TimeOverCountdown countdown;
|
||||
|
||||
public WinconditionTimeout() {
|
||||
super(Config.Timeout, EnumSet.of(FightState.RUNNING, FightState.ENTERN));
|
||||
super(Config.Timeout, EnumSet.of(FightState.RUNNING));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren