LoupGarou/src/main/java/fr/leomelki/loupgarou/MainLg.java
2020-09-07 23:40:57 +02:00

411 lines
23 KiB
Java

package fr.leomelki.loupgarou;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.EnumWrappers.ItemSlot;
import com.comphenix.protocol.wrappers.PlayerInfoData;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import fr.leomelki.com.comphenix.packetwrapper.*;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import fr.leomelki.loupgarou.classes.LGWinType;
import fr.leomelki.loupgarou.events.LGSkinLoadEvent;
import fr.leomelki.loupgarou.events.LGUpdatePrefixEvent;
import fr.leomelki.loupgarou.listeners.*;
import fr.leomelki.loupgarou.roles.*;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.File;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class MainLg extends JavaPlugin {
@Getter
private static final String prefix = ""/*"§7[§9Loup-Garou§7] "*/;
private static MainLg instance;
@Getter
private final HashMap<String, Constructor<? extends Role>> roles = new HashMap<>();
@Getter
@Setter
private LGGame currentGame;//Because for now, only one game will be playable on one server (flemme)
public static MainLg getInstance() {
return instance;
}
@Override
public void onEnable() {
instance = this;
loadRoles();
if (!new File(getDataFolder(), "config.yml").exists()) {//Créer la config
FileConfiguration config = getConfig();
config.set("spawns", new ArrayList<List<Double>>());
for (String role : roles.keySet())//Nombre de participant pour chaque rôle
config.set("role." + role, 1);
saveConfig();
}
loadConfig();
Bukkit.getPluginManager().registerEvents(new JoinListener(this), this);
Bukkit.getPluginManager().registerEvents(new CancelListener(this), this);
Bukkit.getPluginManager().registerEvents(new VoteListener(this), this);
Bukkit.getPluginManager().registerEvents(new ChatListener(this), this);
Bukkit.getPluginManager().registerEvents(new LoupGarouListener(), this);
for (Player player : Bukkit.getOnlinePlayers())
Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(player, "is connected"));
ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.UPDATE_TIME) {
@Override
public void onPacketSending(PacketEvent event) {
WrapperPlayServerUpdateTime time = new WrapperPlayServerUpdateTime(event.getPacket());
LGPlayer lgp = LGPlayer.thePlayer(instance, event.getPlayer());
if (lgp.getGame() != null && lgp.getGame().getTime() != time.getTimeOfDay())
event.setCancelled(true);
}
}
);
//Éviter que les gens s'entendent quand ils se sélectionnent et qu'ils sont trop proche
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.NAMED_SOUND_EFFECT) {
@Override
public void onPacketSending(PacketEvent event) {
WrapperPlayServerNamedSoundEffect sound = new WrapperPlayServerNamedSoundEffect(event.getPacket());
if (sound.getSoundEffect() == Sound.ENTITY_PLAYER_ATTACK_NODAMAGE)
event.setCancelled(true);
}
}
);
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.PLAYER_INFO) {
@Override
public void onPacketSending(PacketEvent event) {
LGPlayer player = LGPlayer.thePlayer(instance, event.getPlayer());
WrapperPlayServerPlayerInfo info = new WrapperPlayServerPlayerInfo(event.getPacket());
ArrayList<PlayerInfoData> datas = new ArrayList<>();
for (PlayerInfoData data : info.getData()) {
LGPlayer lgp = LGPlayer.thePlayer(instance, Bukkit.getPlayer(data.getProfile().getUUID()));
if (player.getGame() != null && player.getGame() == lgp.getGame()) {
LGUpdatePrefixEvent evt2 = new LGUpdatePrefixEvent(player.getGame(), lgp, player, "");
WrappedChatComponent displayName = data.getDisplayName();
Bukkit.getPluginManager().callEvent(evt2);
if (evt2.getPrefix().length() > 0) {
try {
if (displayName != null) {
JSONObject obj = (JSONObject) new JSONParser().parse(displayName.getJson());
displayName = WrappedChatComponent.fromText(evt2.getPrefix() + obj.get("text"));
} else
displayName = WrappedChatComponent.fromText(evt2.getPrefix() + data.getProfile().getName());
} catch (ParseException e) {
e.printStackTrace();
}
}
LGSkinLoadEvent evt = new LGSkinLoadEvent(lgp.getGame(), lgp, player, data.getProfile());
Bukkit.getPluginManager().callEvent(evt);
datas.add(new PlayerInfoData(evt.getProfile(), data.getLatency(), data.getGameMode(), displayName));
} else
datas.add(data);
}
info.setData(datas);
}
});
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.UPDATE_HEALTH) {
@Override
public void onPacketSending(PacketEvent event) {
LGPlayer player = LGPlayer.thePlayer(instance, event.getPlayer());
if (player.getGame() != null && player.getGame().isStarted()) {
WrapperPlayServerUpdateHealth health = new WrapperPlayServerUpdateHealth(event.getPacket());
health.setFood(6);
}
}
});
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.SCOREBOARD_TEAM) {
@Override
public void onPacketSending(PacketEvent event) {
LGPlayer player = LGPlayer.thePlayer(instance, event.getPlayer());
WrapperPlayServerScoreboardTeam team = new WrapperPlayServerScoreboardTeam(event.getPacket());
team.setColor(ChatColor.WHITE);
Player other = Bukkit.getPlayer(team.getName());
if (other == null) return;
LGPlayer lgp = LGPlayer.thePlayer(instance, other);
if (player.getGame() != null && player.getGame() == lgp.getGame()) {
LGUpdatePrefixEvent evt2 = new LGUpdatePrefixEvent(player.getGame(), lgp, player, "");
Bukkit.getPluginManager().callEvent(evt2);
if (evt2.getPrefix().length() > 0)
team.setPrefix(WrappedChatComponent.fromText(evt2.getPrefix()));
else
team.setPrefix(WrappedChatComponent.fromText("§f"));
}
}
});
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.ENTITY_EQUIPMENT) {
@Override
public void onPacketSending(PacketEvent event) {
LGPlayer player = LGPlayer.thePlayer(instance, event.getPlayer());
if (player.getGame() != null) {
WrapperPlayServerEntityEquipment equip = new WrapperPlayServerEntityEquipment(event.getPacket());
if (equip.getSlot() == ItemSlot.OFFHAND && equip.getEntityID() != player.getPlayer().getEntityId())
equip.setItem(new ItemStack(Material.AIR));
}
}
});
}
@SuppressWarnings("unchecked")
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (label.equalsIgnoreCase("ww")) {
if (!sender.hasPermission("loupgarou.admin")) {
sender.sendMessage(prefix + "§4Erreur: Vous n'avez pas la permission...");
return true;
}
if (args.length >= 1) {
if (args[0].equalsIgnoreCase("addspawn")) {
Player player = (Player) sender;
Location loc = player.getLocation();
List<Object> list = (List<Object>) getConfig().getList("spawns");
list.add(Arrays.asList((double) loc.getBlockX(), loc.getY(), (double) loc.getBlockZ(), (double) loc.getYaw(), (double) loc.getPitch()));
saveConfig();
loadConfig();
sender.sendMessage(prefix + "§aLa position a bien été ajoutée !");
return true;
} else if (args[0].equalsIgnoreCase("end")) {
if (args.length != 2) {
sender.sendMessage("§4Utilisation : §c/lg end <pseudo>");
return true;
}
Player selected = Bukkit.getPlayer(args[1]);
if (selected == null) {
sender.sendMessage("§4Erreur : §cLe joueur §4" + args[1] + "§c n'est pas connecté.");
return true;
}
LGGame game = LGPlayer.thePlayer(instance, selected).getGame();
if (game == null) {
sender.sendMessage("§4Erreur : §cLe joueur §4" + selected.getName() + "§c n'est pas dans une partie.");
return true;
}
game.cancelWait();
game.endGame(LGWinType.EQUAL);
game.broadcastMessage("§cLa partie a été arrêtée de force !");
return true;
} else if (args[0].equalsIgnoreCase("start")) {
if (args.length < 2) {
sender.sendMessage("§4Utilisation : §c/lg start <pseudo>");
return true;
}
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage("§4Erreur : §cLe joueur §4" + args[1] + "§c n'existe pas !");
return true;
}
LGPlayer lgp = LGPlayer.thePlayer(instance, player);
if (lgp.getGame() == null) {
sender.sendMessage("§4Erreur : §cLe joueur §4" + lgp.getName() + "§c n'est pas dans une partie.");
return true;
}
if (MainLg.getInstance().getConfig().getList("spawns").size() < lgp.getGame().getMaxPlayers()) {
sender.sendMessage("§4Erreur : §cIl n'y a pas assez de points de spawn !");
sender.sendMessage("§8§oPour les définir, merci de faire §7/lg addSpawn");
return true;
}
sender.sendMessage("§aVous avez bien démarré une nouvelle partie !");
lgp.getGame().updateStart();
return true;
} else if (args[0].equalsIgnoreCase("reloadconfig")) {
sender.sendMessage("§aVous avez bien reload la config !");
sender.sendMessage("§7§oSi vous avez changé les rôles, écriver §8§o/lg joinall§7§o !");
loadConfig();
return true;
} else if (args[0].equalsIgnoreCase("joinall")) {
for (Player p : Bukkit.getOnlinePlayers())
Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(p, "joinall"));
for (Player p : Bukkit.getOnlinePlayers())
Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(p, "joinall"));
return true;
} else if (args[0].equalsIgnoreCase("reloadPacks")) {
for (Player p : Bukkit.getOnlinePlayers())
Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(p, "reloadPacks"));
for (Player p : Bukkit.getOnlinePlayers())
Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(p, "reloadPacks"));
return true;
} else if (args[0].equalsIgnoreCase("nextNight")) {
sender.sendMessage("§aVous êtes passé à la prochaine nuit");
if (getCurrentGame() != null) {
getCurrentGame().broadcastMessage("§2§lLe passage à la prochaine nuit a été forcé !");
for (LGPlayer lgp : getCurrentGame().getInGame())
lgp.stopChoosing();
getCurrentGame().cancelWait();
getCurrentGame().nextNight();
}
return true;
} else if (args[0].equalsIgnoreCase("nextDay")) {
sender.sendMessage("§aVous êtes passé à la prochaine journée");
if (getCurrentGame() != null) {
getCurrentGame().broadcastMessage("§2§lLe passage à la prochaine journée a été forcé !");
getCurrentGame().cancelWait();
for (LGPlayer lgp : getCurrentGame().getInGame())
lgp.stopChoosing();
getCurrentGame().endNight();
}
return true;
} else if (args[0].equalsIgnoreCase("roles")) {
if (args.length == 1 || args[1].equalsIgnoreCase("list")) {
sender.sendMessage(prefix + "§6Voici la liste des rôles:");
int index = 0;
for (String role : getRoles().keySet())
sender.sendMessage(prefix + " §e- " + index++ + " - §6" + role + " §e> " + MainLg.getInstance().getConfig().getInt("role." + role));
sender.sendMessage("\n" + prefix + " §7Écrivez §8§o/lg roles set <role_id/role_name> <nombre>§7 pour définir le nombre de joueurs qui devrons avoir ce rôle.");
} else {
if (args[1].equalsIgnoreCase("set") && args.length == 4) {
String role = null;
if (args[2].length() <= 2)
try {
int i = Integer.parseInt(args[2]);
Object[] array = getRoles().keySet().toArray();
if (array.length <= i) {
sender.sendMessage(prefix + "§4Erreur: §cCe rôle n'existe pas.");
return true;
} else
role = (String) array[i];
} catch (Exception err) {
sender.sendMessage(prefix + "§4Erreur: §cCeci n'est pas un nombre");
}
else
role = args[2];
if (role != null) {
String real_role = null;
for (String real : getRoles().keySet())
if (real.equalsIgnoreCase(role)) {
real_role = real;
break;
}
if (real_role != null) {
try {
MainLg.getInstance().getConfig().set("role." + real_role, Integer.valueOf(args[3]));
sender.sendMessage(prefix + "§6Il y aura §e" + args[3] + " §6" + real_role);
saveConfig();
loadConfig();
sender.sendMessage("§7§oSi vous avez fini de changer les rôles, écriver §8§o/lg joinall§7§o !");
} catch (Exception err) {
sender.sendMessage(prefix + "§4Erreur: §c" + args[3] + " n'est pas un nombre");
}
return true;
}
}
sender.sendMessage(prefix + "§4Erreur: §cLe rôle que vous avez entré est incorrect");
} else {
sender.sendMessage(prefix + "§4Erreur: §cCommande incorrecte.");
sender.sendMessage(prefix + "§4Essayez §c/lg roles set <role_id/role_name> <nombre>§4 ou §c/lg roles list");
}
}
return true;
}
}
sender.sendMessage(prefix + "§4Erreur: §cCommande incorrecte.");
sender.sendMessage(prefix + "§4Essayez /lg §caddSpawn/end/start/nextNight/nextDay/reloadConfig/roles/reloadPacks/joinAll");
return true;
}
return false;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
if (!sender.hasPermission("loupgarou.admin"))
return new ArrayList<>(0);
if (args.length > 1) {
if (args[0].equalsIgnoreCase("roles"))
if (args.length == 2)
return getStartingList(args[1], "list", "set");
else if (args.length == 3 && args[1].equalsIgnoreCase("set"))
return getStartingList(args[2], getRoles().keySet().toArray(new String[getRoles().size()]));
else if (args.length == 4)
return Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
} else if (args.length == 1)
return getStartingList(args[0], "addSpawn", "end", "start", "nextNight", "nextDay", "reloadConfig", "roles", "joinAll", "reloadPacks");
return new ArrayList<>(0);
}
private List<String> getStartingList(String startsWith, String... list) {
startsWith = startsWith.toLowerCase();
ArrayList<String> returnlist = new ArrayList<>();
if (startsWith.length() == 0)
return Arrays.asList(list);
for (String s : list)
if (s.toLowerCase().startsWith(startsWith))
returnlist.add(s);
return returnlist;
}
public void loadConfig() {
int players = 0;
for (String role : roles.keySet())
players += getConfig().getInt("role." + role);
currentGame = new LGGame(this, players);
}
@Override
public void onDisable() {
ProtocolLibrary.getProtocolManager().removePacketListeners(this);
}
private void loadRoles() {
try {
roles.put("LoupGarou", RLoupGarou.class.getConstructor(LGGame.class));
roles.put("LoupGarouNoir", RLoupGarouNoir.class.getConstructor(LGGame.class));
roles.put("Garde", RGarde.class.getConstructor(LGGame.class));
roles.put("Sorciere", RSorciere.class.getConstructor(LGGame.class));
roles.put("Voyante", RVoyante.class.getConstructor(LGGame.class));
roles.put("Chasseur", RChasseur.class.getConstructor(LGGame.class));
roles.put("Villageois", RVillageois.class.getConstructor(LGGame.class));
roles.put("Medium", RMedium.class.getConstructor(LGGame.class));
roles.put("Dictateur", RDictateur.class.getConstructor(LGGame.class));
roles.put("Cupidon", RCupidon.class.getConstructor(LGGame.class));
roles.put("PetiteFille", RPetiteFille.class.getConstructor(LGGame.class));
roles.put("ChaperonRouge", RChaperonRouge.class.getConstructor(LGGame.class));
roles.put("LoupGarouBlanc", RLoupGarouBlanc.class.getConstructor(LGGame.class));
roles.put("Bouffon", RBouffon.class.getConstructor(LGGame.class));
roles.put("Ange", RAnge.class.getConstructor(LGGame.class));
roles.put("Survivant", RSurvivant.class.getConstructor(LGGame.class));
roles.put("Assassin", RAssassin.class.getConstructor(LGGame.class));
roles.put("GrandMechantLoup", RGrandMechantLoup.class.getConstructor(LGGame.class));
roles.put("Corbeau", RCorbeau.class.getConstructor(LGGame.class));
roles.put("Detective", RDetective.class.getConstructor(LGGame.class));
roles.put("ChienLoup", RChienLoup.class.getConstructor(LGGame.class));
roles.put("Pirate", RPirate.class.getConstructor(LGGame.class));
roles.put("Pyromane", RPyromane.class.getConstructor(LGGame.class));
roles.put("Pretre", RPretre.class.getConstructor(LGGame.class));
roles.put("Faucheur", RFaucheur.class.getConstructor(LGGame.class));
roles.put("EnfantSauvage", REnfantSauvage.class.getConstructor(LGGame.class));
roles.put("MontreurDOurs", RMontreurDOurs.class.getConstructor(LGGame.class));
roles.put("Vampire", RVampire.class.getConstructor(LGGame.class));
roles.put("ChasseurDeVampire", RChasseurDeVampire.class.getConstructor(LGGame.class));
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
}