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

1.2

parents
Branches
Tags
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 register or to comment