/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 unique
  • statsTemplate: VARCHAR - Template des stats (format: "stat1:val1;stat2:val2")
  • name: VARCHAR - Nom de l'item
  • type: INT - Type d'item
  • level: INT - Niveau requis
  • pod: INT - Poids
  • prix: INT - Prix
  • panoplie: INT - ID de panoplie
  • conditions: VARCHAR - Conditions d'équipement
  • armesInfos: VARCHAR - Infos d'arme (PA;POmin;POmax;tauxCC;tauxEC;bonusCC;2mains)
  • sold: INT - Nombre vendu
  • avgPrice: INT - Prix moyen
  • points: INT - Points
  • newPrice: INT - Nouveau prix
  • boutique: INT - Flag boutique
  • tokenShop: INT - Flag token shop
  • tokens: 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'instance
  • template: ID du template d'item
  • qua: Quantité
  • pos: Position d'équipement
  • strStats: 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.

Powered by hosted.md