Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,6 @@ Plugin **Paper** pour serveur SMP qui ajoute un système de **perks** : des item
<sub><b>Menu Principal</b> &nbsp;&bull;&nbsp; <b>Interface de Craft</b></sub>
</div>

<br>

<div align="center">
<a href="#lore">
<img src="./docs/screenshoot/lore.png" width="40%" alt="Aperçu des Lores">
</a>
<a href="#description">
<img src="./docs/screenshoot/description.png" width="40%" alt="Description de l'Item">
</a>
<br>
<sub><b>Affichage du Lore</b> &nbsp;&bull;&nbsp; <b>Description de l'Item</b></sub>
</div>
## Sommaire

1. [Fonctionnalités](#fonctionnalités)
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/fr/antidino/smp/CorePlugin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.antidino.smp;

import fr.antidino.smp.core.listeners.*;
import fr.antidino.smp.core.manager.SlotExpander;
import fr.antidino.smp.core.manager.SlotManager;
import fr.antidino.smp.core.manager.codex.CodexListener;
Expand All @@ -8,10 +9,6 @@
import fr.antidino.smp.core.commands.PerksCommand;
import fr.antidino.smp.core.manager.database.DatabaseManager;
import fr.antidino.smp.core.manager.database.DatabaseProvider;
import fr.antidino.smp.core.listeners.CraftingListener;
import fr.antidino.smp.core.listeners.ItemBreakListener;
import fr.antidino.smp.core.listeners.PlayerJoinListener;
import fr.antidino.smp.core.listeners.SmithingListener;
import fr.antidino.smp.core.SmithingRegisterAllItem;
import fr.antidino.smp.core.manager.perk.config.ConfigPerkManager;
import fr.antidino.smp.core.manager.perk.AbstractPerk;
Expand Down Expand Up @@ -50,6 +47,7 @@ public void onEnable() {
getServer().getPluginManager().registerEvents(new SmithingListener(this), this);
getServer().getPluginManager().registerEvents(new ItemBreakListener(this), this);
getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this);
getServer().getPluginManager().registerEvents(new SavingPerkListeners(this), this);

pdcBuilder = new PDCBuilder(this);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ public static Map<String, List<Material>> getCategorizedMaterials() {

String name = mat.name();

// Catégorie Armures

if (name.endsWith("_HELMET") ||
name.endsWith("_CHESTPLATE") ||
name.endsWith("_LEGGINGS") ||
name.endsWith("_BOOTS")) {
armors.add(mat);
}
// Catégorie Outils & Armes

else if (name.endsWith("_SWORD") ||
name.endsWith("_AXE") ||
name.endsWith("_PICKAXE") ||
Expand All @@ -59,14 +59,14 @@ else if (name.endsWith("_SWORD") ||
}
}

// Remplissage de la Map des catégories

categories.put("Armures", armors);
categories.put("Outils & Armes", toolsAndWeapons);

return categories;
}

// Si tu as toujours besoin d'une liste plate globale (pour tes anciens checks par exemple)

public static List<Material> getAllMaterials() {
List<Material> allItems = new ArrayList<>();
getCategorizedMaterials().values().forEach(allItems::addAll);
Expand Down
30 changes: 22 additions & 8 deletions src/main/java/fr/antidino/smp/core/listeners/CraftingListener.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,33 @@
package fr.antidino.smp.core.listeners;

import fr.antidino.smp.CorePlugin;

import fr.antidino.smp.core.SmithingRegisterAllItem;
import fr.antidino.smp.core.manager.CooldownManager;
import fr.antidino.smp.core.manager.SlotManager;
import fr.antidino.smp.core.manager.perk.AbstractPerk;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.inventory.ItemStack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.UUID;

public class CraftingListener implements Listener {

private final CorePlugin corePlugin;
private static final Logger log = LoggerFactory.getLogger(CraftingListener.class);
private final CorePlugin plugin;
private final SlotManager slotManager;
private final CooldownManager cooldownManager;
private final MiniMessage mm = MiniMessage.miniMessage();
public CraftingListener(CorePlugin plugin) {
this.corePlugin = plugin;
this.plugin = plugin;
this.slotManager = new SlotManager(plugin);
this.cooldownManager = new CooldownManager();
}
Expand All @@ -35,18 +41,26 @@ public void onCraftingEvent(CraftItemEvent event) {

if (resultType == null || !resultType.hasItemMeta()) return;

String id = corePlugin.perkManager.getPerkId(resultType);
if (id != null && !event.isCancelled()) {

UUID playerId = player.getUniqueId();

String id = plugin.perkManager.getPerkId(resultType);
UUID playerId = player.getUniqueId();
if (id == null) return;
int number_of_perk = plugin.databaseProvider.NumberOfPerkCrafted(id);
AbstractPerk perk = plugin.perkManager.getPerk(id);
if (perk.getMaxPossibleCraft() <= number_of_perk && perk.getMaxPossibleCraft() != -1) {
event.setCancelled(true);
player.sendMessage(mm.deserialize("<red> You can't craft this item!"));
}

if (!event.isCancelled()) {
if (cooldownManager.hasCooldown(playerId)) {
event.setCancelled(true);
player.sendMessage(mm.deserialize("<red>Please wait before crafting this item again!"));
return;
}
cooldownManager.setCooldown(playerId,0.3);
corePlugin.databaseProvider.InsertPerkCraftSQL(id, playerId.toString());
Bukkit.getScheduler().runTaskAsynchronously(plugin,()->{
plugin.databaseProvider.InsertPerkCraftSQL(id,playerId.toString());
});
}


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package fr.antidino.smp.core.listeners;

import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent;
import fr.antidino.smp.CorePlugin;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.Chest;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.ItemDespawnEvent;
import org.bukkit.inventory.ItemStack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SavingPerkListeners implements Listener {
private static final Logger log = LoggerFactory.getLogger(SavingPerkListeners.class);
CorePlugin plugin;
private static final double SAFE_Y = 64.0;

public SavingPerkListeners(CorePlugin plugin) {
this.plugin = plugin;


}

@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (!(event.getEntity() instanceof Item item))return;
if (isAPerkItem(item.getItemStack())){
event.setCancelled(true);
item.setFireTicks(0);
}

}
@EventHandler
public void onEntityRemove(EntityRemoveFromWorldEvent event) {
if (!(event.getEntity() instanceof Item item)) return;
if (!isAPerkItem(item.getItemStack()))return;
Location loc = item.getLocation();
World world = loc.getWorld();
Location chestLoc = new Location(world, loc.getBlockX(), SAFE_Y, loc.getBlockZ());
Bukkit.getScheduler().runTask(plugin, () -> placeChestWithItem(chestLoc, item.getItemStack()));
}
@EventHandler
public void onItemDespawn(ItemDespawnEvent event) {
Item victim = event.getEntity();
World world = victim.getWorld();
ItemStack itemStack = victim.getItemStack();
if (victim.getLocation().getY() < world.getMinHeight()) {
event.setCancelled(true);
}
event.setCancelled(isAPerkItem(itemStack));
}

private boolean isAPerkItem(ItemStack itemStack) {
String perk_id = plugin.perkManager.getPerkId(itemStack);
return perk_id != null;
}
private static void placeChestWithItem(Location location, ItemStack itemStack) {
Block block = location.getBlock();
block.setType(Material.CHEST);

if (block.getState() instanceof Chest chest) {
chest.getInventory().addItem(itemStack);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void onPrepareSmithing(PrepareSmithingEvent event) {
if (mineralMeta == null) return;
PersistentDataContainer pdc = mineralMeta.getPersistentDataContainer();

// Item d'extension de slots : équipement + item en forge => +1 emplacement

if (pdc.has(PDCBuilder.SLOT_EXPANDER, PersistentDataType.STRING)) {
applyExpander(event, equip);
return;
Expand All @@ -40,6 +40,7 @@ public void onPrepareSmithing(PrepareSmithingEvent event) {
if (perk == null) return;
int level = Math.min(plugin.pdcBuilder.getPerkLevel(mineral), perk.getMaxLevel());
apply_perk(event,equip,perk_id,level);

}
private void apply_perk(PrepareSmithingEvent event,ItemStack equip ,String perk_id,int level){
ItemStack resultItem = equip.clone();
Expand Down
53 changes: 53 additions & 0 deletions src/main/java/fr/antidino/smp/core/listeners/VoidItemSaver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package fr.antidino.smp.core.listeners;

import fr.antidino.smp.CorePlugin;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;

public class VoidItemSaver extends BukkitRunnable {

private final CorePlugin plugin;
private static final double SAFE_Y = 64.0; // Y de téléportation

public VoidItemSaver(CorePlugin plugin) {
this.plugin = plugin;
}

@Override
public void run() {
for (World world : Bukkit.getWorlds()) {
int minY = world.getMinHeight(); // -64 pour les mondes 1.18+

for (Entity entity : world.getEntities()) {
if (entity.getType() != EntityType.ITEM) continue;

Item item = (Item) entity;
if (!isAPerkItem(item.getItemStack())) return;
if (item.getLocation().getY() < minY + 5) {

Location safeLoc = item.getLocation().clone();
safeLoc.setY(SAFE_Y);
item.teleport(safeLoc);


// item.remove();
}
}
}
}

public void start() {
// Toutes les 10 ticks (0.5 seconde)
this.runTaskTimer(plugin, 0L, 10L);
}
private boolean isAPerkItem(ItemStack itemStack) {
String perk_id = plugin.perkManager.getPerkId(itemStack);
return perk_id != null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ INSERT OR IGNORE INTO smp_players (uuid, username) VALUES (?, ?)
private static final String INSERT_PERK_CRAFT_SQL = """
INSERT INTO smp_player_perks (uuid, perk_id, created_at) VALUES (?, ?, ?);
""";

private static String GET_PERK_CRAFT_SQL = """
SELECT * FROM smp_player_perks WHERE perk_id=?
""";
public DatabaseProvider(CorePlugin plugin) {
this.plugin = plugin;
}
Expand All @@ -47,7 +51,6 @@ public void insertPlayerSQL(Player player) {
log.info(" Error as {}", String.valueOf(e));
}
}

public void InsertPerkCraftSQL(String perk_id,String uuid){
try (Connection conn = plugin.getConnexion();
PreparedStatement ps = conn.prepareStatement(INSERT_PERK_CRAFT_SQL)) {
Expand All @@ -59,4 +62,20 @@ public void InsertPerkCraftSQL(String perk_id,String uuid){
log.info(" Error as {}", String.valueOf(e));
}
}

public int NumberOfPerkCrafted(String perk_id){
try (Connection connection = plugin.getConnexion()){
PreparedStatement ps = connection.prepareStatement(GET_PERK_CRAFT_SQL);
ps.setString(1, perk_id);
ResultSet rs = ps.executeQuery();
int count = 0;
while (rs.next()) {
count++;
}
return count;
}catch (SQLException e){
log.info(" Error as {}", String.valueOf(e));
}
return 3;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,13 @@ public double getMultiplier(int level) {
double bonus = config.getDouble("level.bonus_per_level", 0.5);
return 1.0 + bonus * (Math.max(1, level) - 1);
}
/*
Get Number of craft in world
*/
public int getMaxPossibleCraft() {
return config.getInt("craft.number");

}
/**
* Valeur configurable par niveau dans la section "values" du yml.
* Liste : [niv1, niv2, niv3] (le dernier est réutilisé au-delà). Nombre seul : même valeur partout.
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/perks/armor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ item:
material : GOLD_INGOT
display_name : "<gray>Armor Boost<gray>"
craft :
number : -1
shape :
- "XXX"
- "XCC"
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/perks/attack_damage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ item:
material : "AMETHYST_SHARD"
display_name : "<aqua>Damage Boost"
craft :
number : -1
shape :
- "XCX"
- "CBC"
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/perks/attack_speed.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ item:
material : "AMETHYST_SHARD"
display_name : "<red>Attack Speed Boost"
craft :
number : -1
shape :
- "XCX"
- "CBC"
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/perks/double_jump.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ item:
material : "FEATHER"
display_name : "<white>Double Jump"
craft :
number : 30
shape :
- "XPX"
- "DED"
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/perks/glass_cannon.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ item:
material : "FIRE_CHARGE"
display_name : "<red>Glass Cannon"
craft :
number : -1
shape :
- "BGB"
- "DTD"
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/perks/health.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ item:
material : "SUGAR"
display_name : "<green>Sprinter"
craft :
number : -1
shape :
- "XXX"
- "CCC"
Expand Down
Loading
Loading