# craft

### PutItem

**🎮Méthode**

```lua
craft:PutItem(GID, quantity)
```

Place un ingredient dans l'interface de craft/atelier. NECESSITE UN ABONNEMENT PREMIUM (verifie desktopAccess et craftOther ou isFullAccess). Appelle exchange.putItem() en interne pour placer l'objet depuis l'inventaire vers l'interface de craft. L'atelier doit etre ouvert au prealable.

**Paramètres:**

| Nom        | Type     | Description                                          |
| ---------- | -------- | ---------------------------------------------------- |
| `GID`      | `number` | GID de l'ingredient (identifiant general de l'objet) |
| `quantity` | `number` | Quantite a placer dans l'interface                   |

**Exemple:**

{% code title="example.lua" %}

```lua
-- Placer les ingredients pour une recette
-- Exemple: Crafter du pain (necessite de la farine)
craft:PutItem(289, 10)  -- 10x Farine

-- Exemple complet avec plusieurs ingredients
-- Recette fictive necessitant Fer + Bois + Ficelle
craft:PutItem(312, 2)   -- 2x Fer
craft:PutItem(460, 1)   -- 1x Bois
craft:PutItem(425, 1)   -- 1x Ficelle

-- Lancer le craft apres avoir place les ingredients
craft:Ready()

-- Avec verification d'inventaire avant de placer
local fer = inventory:itemCount(312)
local bois = inventory:itemCount(460)

if fer >= 2 and bois >= 1 then
    craft:PutItem(312, 2)
    craft:PutItem(460, 1)
    craft:Ready()
    global:printSuccess("Craft lance!")
else
    global:printError("Ingredients manquants!")
    global:printMessage("Fer: " .. fer .. "/2, Bois: " .. bois .. "/1")
end
```

{% endcode %}

{% hint style="warning" %}
NECESSITE un abonnement premium. Affiche "Vous n'avez pas d'abonnement pour l'artisanat." si non autorise. L'ingredient doit etre present dans l'inventaire.
{% endhint %}

***

### ChangeQuantityToCraft

**🎮Méthode**

```lua
craft:ChangeQuantityToCraft(Quantity)
```

Definit le nombre d'objets a fabriquer pour le prochain craft. NECESSITE UN ABONNEMENT PREMIUM. Envoie le packet 6597 (ExchangeObjectTransfertQuantityMessage) pour modifier la quantite. Attend 1 seconde puis suspend le script jusqu'a reception du packet 176 (confirmation).

**Paramètres:**

| Nom        | Type     | Description                                 |
| ---------- | -------- | ------------------------------------------- |
| `Quantity` | `number` | Quantite a fabriquer (generalement 1 a 999) |

**Exemple:**

{% code title="example.lua" %}

```lua
-- Definir la quantite avant le craft
craft:ChangeQuantityToCraft(10)

-- Workflow complet: crafter 50 pains
-- 1. Placer les ingredients (1 farine = 1 pain)
craft:PutItem(289, 50)  -- 50x Farine

-- 2. Definir la quantite
craft:ChangeQuantityToCraft(50)

-- 3. Lancer la fabrication
craft:Ready()

-- Craft en masse avec boucle
local quantiteParCraft = 100
local totalACrafter = 500
local craftsNecessaires = totalACrafter / quantiteParCraft

for i = 1, craftsNecessaires do
    craft:PutItem(gidIngredient, quantiteParCraft)
    craft:ChangeQuantityToCraft(quantiteParCraft)
    craft:Ready()
    global:printMessage("Craft " .. i .. "/" .. craftsNecessaires)
    global:delay(2000)  -- Attendre entre chaque craft
end
```

{% endcode %}

{% hint style="warning" %}
La quantite doit etre compatible avec les ingredients places. Si vous placez 10 farines et demandez 20 pains, le craft echouera.
{% endhint %}

***

### Ready

**🎮Méthode**

```lua
craft:Ready()
```

Lance la fabrication avec les ingredients places dans l'interface. NECESSITE UN ABONNEMENT PREMIUM. Attend 1 seconde, puis envoie un ExchangeReadyMessage avec ready=true et le characterId du personnage. Suspend le script jusqu'a reception du packet 176 (confirmation de fin de craft).

**Retourne:** `void`

**Exemple:**

{% code title="example.lua" %}

```lua
-- Sequence complete de craft automatise
function crafterRecette(ingredients, quantite)
    -- Verifier et placer tous les ingredients
    for _, ingredient in ipairs(ingredients) do
        local enStock = inventory:itemCount(ingredient.gid)
        local besoin = ingredient.qty * quantite

        if enStock < besoin then
            global:printError("Manque " .. d2data:getItemName(ingredient.gid) ..
                             ": " .. enStock .. "/" .. besoin)
            return false
        end

        craft:PutItem(ingredient.gid, besoin)
    end

    -- Definir la quantite
    craft:ChangeQuantityToCraft(quantite)

    -- Lancer la fabrication
    craft:Ready()

    global:printSuccess("Craft de " .. quantite .. " objets lance!")
    return true
end

-- Utilisation: crafter 10 pains (1 farine = 1 pain)
local recettePain = {
    {gid = 289, qty = 1}  -- 1 Farine par pain
}
crafterRecette(recettePain, 10)

-- Script de boulangerie automatique
function boulangerieAuto()
    local farine = inventory:itemCount(289)
    while farine >= 100 do
        craft:PutItem(289, 100)
        craft:ChangeQuantityToCraft(100)
        craft:Ready()
        global:delay(3000)  -- Attendre la fin du craft
        farine = inventory:itemCount(289)
        global:printMessage("Farine restante: " .. farine)
    end
    global:printSuccess("Boulangerie terminee!")
end
```

{% endcode %}

{% hint style="warning" %}
NECESSITE un abonnement premium. Assurez-vous que tous les ingredients sont places via PutItem() avant d'appeler Ready(). Le craft peut echouer si la recette est incorrecte ou les ingredients insuffisants.
{% endhint %}
