/Items
Documentation - Items et Consommables
Vue d'ensemble
Le système d'items du jeu gère tous les objets équipables, consommables, et objets spéciaux. Chaque item possède une template de base et peut avoir des instances individuelles avec des statistiques uniques.
Architecture
Hiérarchie des Classes
ObjectTemplate (Template de base)
↓
GameObject (Instance d'item)
├── Statistiques
├── Effets
└── Propriétés
ObjectTemplate - Template d'Item
Définition
La classe ObjectTemplate définit les propriétés de base d'un item.
Localisation: src/main/java/object/ObjectTemplate.java
Propriétés Principales
private int id; // ID unique de l'item
private String strTemplate; // Template des statistiques
private String name; // Nom de l'item
private int type; // Type d'item (voir tableau ci-dessous)
private int level; // Niveau requis
private int pod; // Poids de l'item
private int price; // Prix de base
private int panoId; // ID de la panoplie (set d'items)
private String conditions; // Conditions d'équipement
private int PACost; // Coût en PA (pour les armes)
private int POmin, POmax; // Dégâts min/max (pour les armes)
private int tauxCC; // Taux de coup critique
private int tauxEC; // Taux d'esquive critique
private int bonusCC; // Bonus de coup critique
private boolean isTwoHanded; // Arme à deux mains
private long sold; // Nombre vendu
private int avgPrice; // Prix moyen du marché
private int points; // Points de vente
private int tokens; // Tokens (monnaie premium)
private int boutique; // Disponible en boutique
private int tokenShop; // Disponible pour tokens
Types d'Items
| ID | Type | Description |
|---|---|---|
| 1-11 | Équipement | Armures et accessoires |
| 16-23 | Équipement spécial | Équipements uniques |
| 81-82 | Équipement spécial | Équipements rares |
| 85 | Équipement spécial | Équipements légendaires |
| 113 | Équipement spécial | Équipements cosmétiques |
| 50+ | Consommables | Potions, parchemins, etc. |
Chargement depuis la Base de Données
Table: item_template
SELECT * FROM item_template WHERE id = ?
Colonnes:
id: INT - ID uniquestatsTemplate: VARCHAR - Template des stats (format: "stat1:val1;stat2:val2")name: VARCHAR - Nom de l'itemtype: INT - Type d'itemlevel: INT - Niveau requispod: INT - Poidsprix: INT - Prixpanoplie: INT - ID de panoplieconditions: VARCHAR - Conditions d'équipementarmesInfos: VARCHAR - Infos d'arme (PA;POmin;POmax;tauxCC;tauxEC;bonusCC;2mains)sold: INT - Nombre venduavgPrice: INT - Prix moyenpoints: INT - PointsnewPrice: INT - Nouveau prixboutique: INT - Flag boutiquetokenShop: INT - Flag token shoptokens: INT - Coût en tokens
GameObject - Instance d'Item
Définition
La classe GameObject représente une instance spécifique d'un item avec ses statistiques individuelles.
Localisation: src/main/java/object/GameObject.java
Propriétés
protected ObjectTemplate template; // Référence au template
protected int quantity; // Quantité (pour les consommables)
protected int position; // Position d'équipement
protected int guid; // ID unique global
protected int puit; // Niveau de puits (rareté)
private Stats Stats; // Statistiques de l'item
private ArrayList<SpellEffect> Effects; // Effets spéciaux
private Map<Integer, String> txtStats; // Stats textuelles
private Map<Integer, Integer> SoulStats; // Stats d'âme
Positions d'Équipement
public static final int ITEM_POS_NO_EQUIPED = -1; // Non équipé
public static final int ITEM_POS_HEAD = 1; // Tête
public static final int ITEM_POS_NECK = 2; // Cou
public static final int ITEM_POS_CHEST = 3; // Poitrine
public static final int ITEM_POS_BACK = 4; // Dos
public static final int ITEM_POS_WAIST = 5; // Ceinture
public static final int ITEM_POS_LEGS = 6; // Jambes
public static final int ITEM_POS_FEET = 7; // Pieds
public static final int ITEM_POS_RIGHT_HAND = 8; // Main droite
public static final int ITEM_POS_LEFT_HAND = 9; // Main gauche
public static final int ITEM_POS_RING_LEFT = 10; // Anneau gauche
public static final int ITEM_POS_RING_RIGHT = 11; // Anneau droit
Constructeurs
Constructeur avec Statistiques Textuelles
public GameObject(int Guid, int template, int qua, int pos, String strStats, int puit)
Paramètres:
Guid: ID unique global de l'instancetemplate: ID du template d'itemqua: Quantitépos: Position d'équipementstrStats: Chaîne de statistiques (format: "stat1:val1;stat2:val2")puit: Niveau de puits (rareté)
Constructeur avec Objets Stats
public GameObject(int Guid, int template, int qua, int pos, Stats stats,
ArrayList<SpellEffect> effects, Map<Integer, Integer> _SoulStat,
Map<Integer, String> _txtStats, int puit)
Consommables - Spécificités
Définition
Les consommables sont des items à usage unique qui peuvent être utilisés pour restaurer des ressources, appliquer des effets temporaires, ou accomplir des actions spéciales.
Caractéristiques
// Un consommable est un GameObject avec:
quantity > 1 // Peut être empilé
type >= 50 // Type de consommable
position == -1 // Non équipable
Effects != null // Peut avoir des effets
Types de Consommables Courants
| Type | Description | Effet |
|---|---|---|
| 50 | Potion de vie | Restaure PV |
| 51 | Potion de mana | Restaure PM |
| 52 | Potion de force | Augmente Force temporairement |
| 53 | Parchemin de téléportation | Téléporte le joueur |
| 54 | Potion d'invulnérabilité | Rend invulnérable |
| 55 | Potion de vitesse | Augmente PM temporairement |
Utilisation d'un Consommable
// Vérifier si le joueur possède le consommable
if (player.hasItemTemplate(itemId, 1)) {
// Appliquer les effets
for (SpellEffect effect : item.getEffects()) {
effect.apply(player);
}
// Réduire la quantité
item.setQuantity(item.getQuantity() - 1);
// Supprimer si quantité = 0
if (item.getQuantity() <= 0) {
player.removeItem(item);
}
}
Effets Spéciaux
Les consommables peuvent avoir des effets spéciaux définis dans la classe SpellEffect:
private int id; // ID de l'effet
private int duration; // Durée en tours
private int value; // Valeur de l'effet
private int type; // Type d'effet (dégâts, soin, buff, etc.)
private ArrayList<Integer> targets; // Cibles affectées
Gestion des Statistiques
Format des Statistiques
Les statistiques sont stockées sous forme de chaîne de caractères avec le format:
stat1:val1;stat2:val2;stat3:val3
Codes de Statistiques
STATS_ADD_FORC = 0x01 // Force
STATS_ADD_SAGE = 0x02 // Sagesse
STATS_ADD_INTE = 0x03 // Intelligence
STATS_ADD_CHAN = 0x04 // Chance
STATS_ADD_AGIL = 0x05 // Agilité
STATS_ADD_DOMA = 0x06 // Dommages
STATS_ADD_PERDOM = 0x07 // Perte de dommages
STATS_ADD_SOIN = 0x08 // Soins
STATS_ADD_RP_NEU = 0x09 // Résistance Neutre
STATS_ADD_RP_TER = 0x0A // Résistance Terre
STATS_ADD_RP_FEU = 0x0B // Résistance Feu
STATS_ADD_RP_EAU = 0x0C // Résistance Eau
STATS_ADD_RP_AIR = 0x0D // Résistance Air
Panoplies (Sets d'Items)
Concept
Une panoplie est un ensemble d'items qui, lorsqu'ils sont tous équipés, confèrent des bonus supplémentaires.
Structure
private int panoId; // ID de la panoplie
private String name; // Nom du set
private ArrayList<Integer> items; // Items du set
private Map<Integer, Integer> bonuses; // Bonus par nombre d'items équipés
Exemple
Panoplie ID: 1 (Armure de Guerrier)
├── Casque ID: 100
├── Armure ID: 101
├── Pantalon ID: 102
└── Bottes ID: 103
Bonus:
- 2 items: +10 Force
- 3 items: +10 Force, +5 Vitalité
- 4 items: +15 Force, +10 Vitalité, +5 Dommages
Conditions d'Équipement
Format
condition1:val1;condition2:val2
Types de Conditions
| Condition | Format | Exemple |
|---|---|---|
| Niveau | level:50 |
Niveau minimum 50 |
| Classe | class:1,2,3 |
Classes 1, 2 ou 3 |
| Sexe | gender:0 |
Masculin uniquement |
| Stat | stat:forc:100 |
Force minimum 100 |
| Quête | quest:50 |
Quête 50 complétée |
Chargement des Items
Processus de Chargement
// 1. Charger tous les templates
ObjectTemplateData templateData = new ObjectTemplateData(dataSource);
templateData.load();
// 2. Charger les items du joueur
ObjectData objectData = new ObjectData(dataSource);
ArrayList<GameObject> playerItems = objectData.loadPlayerItems(playerId);
// 3. Équiper les items
for (GameObject item : playerItems) {
if (item.getPosition() != -1) {
player.equipItem(item);
}
}
Requête SQL
-- Charger tous les items d'un joueur
SELECT * FROM objects WHERE owner_id = ? ORDER BY position DESC;
-- Charger un template d'item
SELECT * FROM item_template WHERE id = ?;
Exemple Complet - Création d'un Consommable
1. Créer le Template en Base de Données
INSERT INTO item_template (
id, statsTemplate, name, type, level, pod, prix,
panoplie, conditions, armesInfos, sold, avgPrice,
points, newPrice, boutique, tokenShop, tokens
) VALUES (
5001, -- ID unique
"soin:100", -- Template: restaure 100 PV
"Potion de Vie Majeure", -- Nom
50, -- Type: Consommable
1, -- Niveau requis
10, -- Poids
500, -- Prix
0, -- Pas de panoplie
"", -- Pas de conditions
"", -- Pas d'infos d'arme
0, 0, 0, 0, 0, 0, 0
);
2. Créer l'Instance
// Créer une instance du consommable
GameObject potion = new GameObject(
guid, // ID unique global
5001, // ID du template
5, // Quantité: 5 potions
-1, // Position: non équipé
"soin:100", // Statistiques
0 // Puits: normal
);
// Ajouter au joueur
player.addItem(potion);
3. Utiliser le Consommable
// Vérifier et utiliser
if (player.hasItemTemplate(5001, 1)) {
// Appliquer l'effet
player.addPV(100);
// Réduire la quantité
potion.setQuantity(potion.getQuantity() - 1);
// Supprimer si vide
if (potion.getQuantity() <= 0) {
player.removeItem(potion);
}
// Notifier le client
SocketManager.sendMessage(player, "Vous avez utilisé une Potion de Vie Majeure!");
}
Gestion des Erreurs
Validations Courantes
// Vérifier le niveau requis
if (player.getLevel() < item.getTemplate().getLevel()) {
throw new Exception("Niveau insuffisant");
}
// Vérifier les conditions
if (!ConditionParser.checkConditions(player, item.getTemplate().getConditions())) {
throw new Exception("Conditions non remplies");
}
// Vérifier le poids
if (player.getCurrentWeight() + item.getPod() > player.getMaxWeight()) {
throw new Exception("Inventaire plein");
}
Conclusion
Le système d'items est flexible et extensible, permettant la création de nombreux types d'objets avec des propriétés et des effets variés. Les consommables en particulier offrent une grande liberté pour créer des objets utilitaires et stratégiques.