Skip to content
Snippets Groups Projects
Commit 9f316f03 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

1.2

parents
No related branches found
No related tags found
No related merge requests found
Pipeline #1 failed
Showing
with 557 additions and 0 deletions
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration>
<autoDetectTypes>
<platformType>PAPER</platformType>
<platformType>ADVENTURE</platformType>
</autoDetectTypes>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_9">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="mariadb.jdbc.java.client" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: io.papermc.paper:paper-api:1.18.1-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:31.0.1-jre" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.errorprone:error_prone_annotations:2.7.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.gson:gson:2.8.8" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.16-R0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.30" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: it.unimi.dsi:fastutil:8.5.6" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.logging.log4j:log4j-api:2.17.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-api:1.8.0-beta4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-api:4.9.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-key:4.9.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-api:1.3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-string:1.3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-gson:4.9.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-legacy:4.9.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-plain:4.9.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.checkerframework:checker-qual:3.21.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm:9.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm-commons:9.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm-tree:9.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.ow2.asm:asm-analysis:9.2" level="project" />
<orderEntry type="library" name="Maven: org.mariadb.jdbc:mariadb-java-client:3.0.2-rc" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: me.clip:placeholderapi:2.11.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jetbrains:annotations:19.0.0" level="project" />
</component>
</module>
\ No newline at end of file
pom.xml 0 → 100644
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.slprojects</groupId>
<artifactId>SLCraftPlugin</artifactId>
<version>1.2</version>
<packaging>jar</packaging>
<name>SLCraftPlugin</name>
<description>Plugin principal de SL-Craft</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<url>https://sl-projects.com</url>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>papermc-repo</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>placeholderapi</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.18.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.0.2-rc</version>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
// Contient une partie du code de ce plugin: https://github.com/Twi5TeD/PlayTime
package com.slprojects.slcraftplugin;
import com.slprojects.slcraftplugin.commandes.wildCommand;
import org.bukkit.ChatColor;
import org.bukkit.Statistic;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.mariadb.jdbc.MariaDbPoolDataSource;
import java.io.FileReader;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import me.clip.placeholderapi.PlaceholderAPI;
import static java.lang.Integer.parseInt;
public final class Main extends JavaPlugin implements Listener {
// Variables
private List<UUID> wildCommandActiveUsers;
private List<UUID> playTimeUsersIndexes;
private List<LocalDateTime> playTimeUsersDate;
private static FileConfiguration config;
// Fonctions appelées à des évènements clés
@Override
public void onEnable() {
// On s'assure qu'on a placeholder api
if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) {
getLogger().info("PlaceholderAPI chargé");
// On initialise les listeners
getServer().getPluginManager().registerEvents(this, this);
} else {
getLogger().info(ChatColor.RED+"PlaceholderAPI n'est pas accessible!");
getServer().getPluginManager().disablePlugin(this);
}
// Plugin startup logic
saveDefaultConfig();
config = getConfig();
// On initialise la base de donnée
initDatabase();
wildCommandActiveUsers = new ArrayList<UUID>();
playTimeUsersIndexes = new ArrayList<UUID>();
playTimeUsersDate = new ArrayList<LocalDateTime>();
wildCommand wildCommand = new wildCommand(this);
getCommand("wild").setExecutor(wildCommand);
getLogger().info(ChatColor.GREEN+"SL-Craft | Plugin démarré");
}
@Override
public void onDisable() {
// Plugin shutdown logic
getLogger().info(ChatColor.RED+"SL-Craft | Plugin éteint");
getServer().getOnlinePlayers().forEach(this::savePlayer);
}
@EventHandler
@SuppressWarnings("unchecked")
public void onPlayerJoin(PlayerJoinEvent e) {
playTimeUsersIndexes.add(e.getPlayer().getUniqueId());
playTimeUsersDate.add(LocalDateTime.now());
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent e) {
savePlayer(e.getPlayer());
}
// Propre au compteur de temps de jeu
@SuppressWarnings("unchecked")
public void savePlayer(Player player) {
JSONObject target = new JSONObject();
target.put("uuid", player.getUniqueId().toString());
LocalDateTime timeNow = LocalDateTime.now();
Duration duration = Duration.between(timeNow, playTimeUsersDate.get(playTimeUsersIndexes.indexOf(player.getUniqueId())));
long playedTimeInSeconds = Math.abs(duration.toSeconds());
target.put("time", playedTimeInSeconds);
playTimeUsersDate.remove(playTimeUsersIndexes.indexOf(player.getUniqueId()));
playTimeUsersIndexes.remove(player.getUniqueId());
target.put("joins", Integer.valueOf(player.getStatistic(Statistic.LEAVE_GAME) + 1));
writePlayer(target);
}
@SuppressWarnings("unchecked")
private void writePlayer(JSONObject target) {
JSONParser jsonParser = new JSONParser();
// On ouvre la bdd
Connection con = bddOpenConn();
try {
// On va regarder si l'utilisateur existe
PreparedStatement rechercheUtilisateur = con.prepareStatement("SELECT COUNT(*) FROM site_userSetting WHERE uuid = ?");
rechercheUtilisateur.setString(1, target.get("uuid").toString());
ResultSet resultat = rechercheUtilisateur.executeQuery();
if(resultat.next()) {
int playerExist = resultat.getInt(1);
if(playerExist==0){
// On insère la dernière date de join
PreparedStatement insertionLastJoin = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'playedTime',?)");
insertionLastJoin.setString(1, target.get("uuid").toString());
insertionLastJoin.setString(2, target.get("time").toString());
resultat = insertionLastJoin.executeQuery();
// On insère le nombre de connexions
PreparedStatement insertionNbJoins = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joins',?)");
insertionNbJoins.setString(1, target.get("uuid").toString());
insertionNbJoins.setString(2, target.get("joins").toString());
resultat = insertionNbJoins.executeQuery();
}else{
PreparedStatement tempsJeuJoueur = con.prepareStatement("SELECT value FROM site_userSetting WHERE uuid = ? AND name = 'playedTime'");
tempsJeuJoueur.setString(1, target.get("uuid").toString());
resultat = tempsJeuJoueur.executeQuery();
if(resultat.next()) {
int totalPlayedTime = parseInt(resultat.getString(1)) + parseInt(target.get("time").toString());
PreparedStatement modifyPlayedTime = con.prepareStatement("UPDATE `site_userSetting` SET `value`=? WHERE `uuid`=? AND `name`='playedTime'");
modifyPlayedTime.setInt(1, totalPlayedTime);
modifyPlayedTime.setString(2, target.get("uuid").toString());
resultat = modifyPlayedTime.executeQuery();
PreparedStatement modifyNbJoins = con.prepareStatement("UPDATE `site_userSetting` SET `value`=? WHERE `uuid`=? AND `name`='joins'");
modifyNbJoins.setString(1, target.get("joins").toString());
modifyNbJoins.setString(2, target.get("uuid").toString());
resultat = modifyNbJoins.executeQuery();
}else{
getLogger().warning(ChatColor.RED+"Erreur, nous n'avons pas de resultats pour la requête: SELECT value FROM site_userSetting WHERE uuid = '"+target.get("uuid")+"' AND name = playedTime");
}
}
}else{
getLogger().warning(ChatColor.RED+"Erreur, nous n'avons pas de resultats pour la requête: SELECT COUNT(*) FROM site_userSetting WHERE uuid = '"+target.get("uuid").toString()+"' AND rownum = 1");
}
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// Propre à la commande wild: évite les spams de la commande
public boolean checkActiveUserForWildCommand(UUID playerUuid){
if(wildCommandActiveUsers.contains(playerUuid)){
return false;
}else{
wildCommandActiveUsers.add(playerUuid);
return true;
}
}
public void removeActiveUserForWildCommand(UUID playerUuid){
if(wildCommandActiveUsers.contains(playerUuid)){
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
wildCommandActiveUsers.remove(playerUuid);
}
}
public Connection bddOpenConn() { // si mot de passe avec des caractère spéciaux
Connection conn=null;
try {
Class.forName("org.mariadb.jdbc.MariaDbPoolDataSource");
} catch (ClassNotFoundException e){
getLogger().warning (ChatColor.RED+"Il manque le driver MariaDB!");
getServer().getPluginManager().disablePlugin(this);
}
try {
MariaDbPoolDataSource dataSource = new MariaDbPoolDataSource("jdbc:mariadb://"+config.getString("database.host")+"/"+config.getString("database.database")+"?user="+config.getString("database.user")+"&password="+config.getString("database.password")+"&maxPoolSize=10");
conn = dataSource.getConnection();
getLogger().info(ChatColor.GREEN+"Connexion à la base de données réussie!");
}// ou les saisir
catch (SQLException e) {
getLogger().warning(ChatColor.RED+"Erreur lors de la connexion à la base de données.");
getServer().getPluginManager().disablePlugin(this);
}
return conn;
}
private void initDatabase(){
try{
Connection con = bddOpenConn();
PreparedStatement ps=con.prepareStatement("CREATE TABLE IF NOT EXISTS `site_userSetting` (\n" +
" `uuid` varchar(36) NOT NULL DEFAULT '',\n" +
" `name` varchar(128) NOT NULL,\n" +
" `value` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,\n" +
" PRIMARY KEY (`uuid`,`name`) USING BTREE\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
ResultSet rs=ps.executeQuery();
con.close();
}catch(Exception e){
getLogger().warning(ChatColor.RED+"Erreur lors de l'exécution de initDatabase(): "+e);
}
}
}
package com.slprojects.slcraftplugin.commandes;
import com.slprojects.slcraftplugin.Main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.block.Biome;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import static java.lang.Math.abs;
public class wildCommand implements CommandExecutor {
// Variables
private Main plugin;
public wildCommand(Main plugin){
// On récupère la classe parente pour les paramètres
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
// On vérifie que la commande a bien été lancée par un joueur
if (sender instanceof Player) {
Player player = (Player) sender;
// On vérifie qu'il n'a pas déjà lancé la commande wild
if(!plugin.checkActiveUserForWildCommand(player.getUniqueId())){
plugin.getLogger().info("Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.RED+"refusé");
player.sendMessage("§cVous devez attendre 5s avant de relancer la commande.");
return true;
}
plugin.getLogger().info("Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.GREEN+"accepté");
// on récupère la liste des biomes exclus
List<String> excludedBiomes = new ArrayList<String>();
excludedBiomes = (List<String>) plugin.getConfig().getList("excluded-biomes");
player.sendMessage("§6Téléportation vers une coordonnée aléatoire.");
// On défini le radius de téléportation
Random r = new Random();
int low = plugin.getConfig().getInt("max-range")*(-1);
int high = plugin.getConfig().getInt("max-range");
// Tant qu'on a un biome non souhaite, on va regérer les coordonnées
boolean flag=true;
int x=0, z=0, y=0;
while(flag){
flag=false;
x = r.nextInt(high-low) + low;
z = r.nextInt(high-low) + low;
y = Bukkit.getWorld(plugin.getConfig().getString("world")).getHighestBlockYAt(x, z);
y++; // On incrémente la pos Y pour éviter que le joueur se retrouve dans le sol
for (String excludedBiome : excludedBiomes) {
try{
Biome.valueOf(excludedBiome.toUpperCase());
if (Bukkit.getWorld(plugin.getConfig().getString("world")).getBiome(x, y, z).equals(Biome.valueOf(excludedBiome.toUpperCase()))) {
flag = true;
}
}catch(Exception ignored){}
}
}
// On téléporte le joueur
Location loc = new Location(Bukkit.getWorld(plugin.getConfig().getString("world")), x, y, z, 0, 0);
player.teleport(loc);
int maxVal = Math.max(abs(x), abs(z));
if(maxVal <= 10000){
player.sendMessage("§7§oVous êtes sur un biome généré en 1.16");
}else if(maxVal <= 14500){
player.sendMessage("§7§oVous êtes sur un biome généré en 1.17");
}else{
player.sendMessage("§7§oVous êtes sur un biome généré en 1.18");
}
// Vu qu'il y a un sleep et que ça bloque le thread, on va exécuter la fonction dans un thread
Runnable runnableRemoveActiveUser = new Runnable() {
public void run() {
// On retire le joueur de la liste des utilisateurs en attente
plugin.removeActiveUserForWildCommand(player.getUniqueId());
}
};
new Thread(runnableRemoveActiveUser).start();
}
return true;
}
}
# /wild
excluded-biomes:
- cold_ocean
- deep_cold_ocean
- deep_frozen_ocean
- deep_lukewarm_ocean
- deep_ocean
- deep_warm_ocean
- frozen_ocean
- frozen_river
- lukewarm_ocean
- ocean
- river
- warm_ocean
world: survie
max-range: 20000 #14500 -> 1.17, 10000 -> 1.16
# Configuration de la base de donnée
database:
host: localhost # host of your database
port: 3306 # default port for MariaDB and MySQL
database: db # name of your database. A database server can contain multiple databases
user: username
password: password
\ No newline at end of file
name: SLCraftPlugin
version: '${project.version}'
main: com.slprojects.slcraftplugin.Main
depend: [PlaceholderAPI]
api-version: 1.18
authors: [ SofianeLasri ]
description: Plugin principal de SL-Craft
website: https://sl-projects.com
commands:
wild:
description: Te permet de te téléporter à une coordonnée aléatoire
aliases: [wild, tpr, tprandom]
usage: /wild
permission: slcraft.wild
\ No newline at end of file
File added
File added
File added
File added
# /wild
excluded-biomes:
- cold_ocean
- deep_cold_ocean
- deep_frozen_ocean
- deep_lukewarm_ocean
- deep_ocean
- deep_warm_ocean
- frozen_ocean
- frozen_river
- lukewarm_ocean
- ocean
- river
- warm_ocean
world: survie
max-range: 20000 #14500 -> 1.17, 10000 -> 1.16
# Configuration de la base de donnée
database:
host: localhost # host of your database
port: 3306 # default port for MariaDB and MySQL
database: db # name of your database. A database server can contain multiple databases
user: username
password: password
\ No newline at end of file
name: SLCraftPlugin
version: '1.2'
main: com.slprojects.slcraftplugin.Main
depend: [PlaceholderAPI]
api-version: 1.18
authors: [ SofianeLasri ]
description: Plugin principal de SL-Craft
website: https://sl-projects.com
commands:
wild:
description: Te permet de te téléporter à une coordonnée aléatoire
aliases: [wild, tpr, tprandom]
usage: /wild
permission: slcraft.wild
\ No newline at end of file
#Generated by Maven
#Sun Jan 23 19:39:41 CET 2022
groupId=com.slprojects
artifactId=SLCraftPlugin
version=1.2
com\slprojects\slcraftplugin\commandes\wildCommand.class
com\slprojects\slcraftplugin\Main.class
com\slprojects\slcraftplugin\commandes\wildCommand$1.class
Z:\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\Main.java
Z:\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\commandes\wildCommand.java
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment