/* This file is a part of the SteamWar software. Copyright (C) 2020 SteamWar.de-Serverteam This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.steamwar.fightsystem.fight; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.PlayerInfoData; import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedGameProfile; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.record.RecordSystem; import de.steamwar.fightsystem.FightSystem; import de.steamwar.sql.Schematic; import org.bukkit.*; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; public class Fight { private Fight(){} public static final FightTeam redTeam = new FightTeam(Config.TeamRedName, Config.TeamRedPrefix, Config.TeamRedSpawn, Config.TeamRedCornerX, Config.TeamRedCornerY, Config.TeamRedCornerZ, Config.TeamRedRotate, false, Config.RedLeader); public static final FightTeam blueTeam = new FightTeam(Config.TeamBlueName, Config.TeamBluePrefix, Config.TeamBlueSpawn, Config.TeamBlueCornerX, Config.TeamBlueCornerY, Config.TeamBlueCornerZ, Config.TeamBlueRotate, true, Config.BlueLeader); private static int schemRank; public static void init(){ IFight.init(redTeam, blueTeam); } public static FightTeam getPlayerTeam(Player player) { if(redTeam.isPlayerInTeam(player)) return redTeam; if(blueTeam.isPlayerInTeam(player)) return blueTeam; return null; } public static FightTeam getOpposite(FightTeam fightTeam) { if(fightTeam == null){ throw new IllegalArgumentException(); } if(fightTeam == redTeam) return blueTeam; else return redTeam; } public static FightTeam getInvitedTeam(Player player){ if(redTeam.getInvited().contains(player)) return redTeam; else if(blueTeam.getInvited().contains(player)) return blueTeam; return null; } public static FightPlayer getFightPlayer(Player player) { if(redTeam.isPlayerInTeam(player)) return redTeam.getFightPlayer(player); if(blueTeam.isPlayerInTeam(player)) return blueTeam.getFightPlayer(player); return null; } public static FightTeam getRedTeam() { return redTeam; } public static FightTeam getBlueTeam() { return blueTeam; } public static void playSound(Sound sound, float volume, float pitch) { if(Config.recording()) RecordSystem.soundAtPlayer(sound.name(), volume, pitch); //volume: max. 100, pitch: max. 2 Bukkit.getServer().getOnlinePlayers().forEach(player -> player.playSound(player.getLocation(), sound, volume, pitch)); } public static void setLevel(int level) { Bukkit.getServer().getOnlinePlayers().forEach(player -> player.setLevel(level)); } public static FightTeam getTeamByName(String name) { if(redTeam.getName().equalsIgnoreCase(name)) return redTeam; if(blueTeam.getName().equalsIgnoreCase(name)) return blueTeam; return null; } public static void replaceSync() { Fight.getRedTeam().replaceSync(Config.ReplaceObsidian, Material.OBSIDIAN, Material.TNT); Fight.getBlueTeam().replaceSync(Config.ReplaceObsidian, Material.OBSIDIAN, Material.TNT); Fight.getRedTeam().replaceSync(Config.ReplaceBedrock, Material.BEDROCK, Material.SLIME_BLOCK); Fight.getBlueTeam().replaceSync(Config.ReplaceBedrock, Material.BEDROCK, Material.SLIME_BLOCK); } public static void setPlayerGamemode(Player player, GameMode gameMode) { player.setGameMode(gameMode); if(gameMode == GameMode.SPECTATOR) { for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { if(currentPlayer.getUniqueId() != player.getUniqueId() && currentPlayer.getGameMode() == GameMode.SPECTATOR) { currentPlayer.hidePlayer(FightSystem.getPlugin(), player); player.hidePlayer(FightSystem.getPlugin(), currentPlayer); } } if(FightSystem.getEventLeiter() == player || Config.test()) return; Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> { if(!player.isOnline()) return; PacketContainer gm1packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.PLAYER_INFO); gm1packet.getPlayerInfoAction().write(0, EnumWrappers.PlayerInfoAction.UPDATE_GAME_MODE); List playerInfoActions = new ArrayList<>(); playerInfoActions.add(new PlayerInfoData(WrappedGameProfile.fromPlayer(player), 1, EnumWrappers.NativeGameMode.CREATIVE, WrappedChatComponent.fromText(player.getDisplayName()))); gm1packet.getPlayerInfoDataLists().write(0, playerInfoActions); try { ProtocolLibrary.getProtocolManager().sendServerPacket(player, gm1packet); } catch (InvocationTargetException e) { Bukkit.getLogger().log(Level.SEVERE, "Invocation target exception", e); } }, 2); }else if(gameMode == GameMode.SURVIVAL) { for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { if(currentPlayer.getUniqueId() != player.getUniqueId() && currentPlayer.getGameMode() == GameMode.SPECTATOR) { currentPlayer.showPlayer(FightSystem.getPlugin(), player); player.showPlayer(FightSystem.getPlugin(), currentPlayer); } } } } public static int getMaxRank(){ /* MaxRank of 0 is Pubonly*/ return schemRank; } public static void calcAvailibleSchemTypes() { if(Config.OnlyPublicSchematics){ schemRank = 0; return; } if(Config.IgnorePublicOnly || Config.event() || Config.Ranked){ schemRank = 1000; return; } if(redTeam.getLeader() == null || redTeam.getLeader().getPlayer() == null || blueTeam.getLeader() == null || blueTeam.getLeader().getPlayer() == null){ schemRank = 1000; return; } if(Config.RanksEnabled) schemRank = Math.min(schemRank(redTeam.getLeader()), schemRank(blueTeam.getLeader())); else if(Schematic.getSchemsOfType(redTeam.getLeader().getPlayer().getUniqueId(), Config.SchematicType).isEmpty() || Schematic.getSchemsOfType(blueTeam.getLeader().getPlayer().getUniqueId(), Config.SchematicType).isEmpty()) schemRank = 0; else schemRank = 1; } private static int schemRank(FightPlayer fightPlayer){ int rank = 1; List schematics = Schematic.getSchemsOfType(fightPlayer.getPlayer().getUniqueId(), Config.SchematicType); for(Schematic schem : schematics){ if(schem.getRank() > rank) rank = schem.getRank(); } return rank; } }