---
name: cabal-dar-itens
description: "Como entregar itens a um personagem no servidor Cabal — Inventário de Evento, codificação do ItemKind e a ferramenta daritem.py"
metadata: 
  node_type: memory
  type: project
  originSessionId: 153bd067-f5ce-4a37-9378-d46c0afa3789
  modified: 2026-08-16T14:21:01.473Z
---

Para dar item a um jogador **não se mexe no inventário direto**: a tabela `cabal_Inventory_table`
do `Server01` guarda o inventário como blob binário e escrever nela corrompe personagem.

O caminho suportado é o **Inventário de Evento**: a procedure `cabal_sp_event_inventory_reward`
(banco `Server01`) insere em `cabal_event_inventory_table`. É o mesmo mecanismo que o servidor usa
para premiação de evento — o item aparece na aba "Inventário de Evento" e vai pra mochila quando o
jogador clica em receber. Entrega errada = uma linha pendente que dá pra apagar, sem estrago.

Parâmetros: `@UserNum, @ItemKindIdx, @ItemOption, @ItemDurationIdx, @ItemCount, @TitleType,
@ExpireDay, @RegisteDateTime`. **A entrega é por CONTA (UserNum), não por personagem** — qualquer
personagem da conta pega. `Count` é `tinyint`, então máximo 255 por linha.

**ItemKind** é a struct `ITEM_ID` (ver [[cabal-source-ep33]], `GameStructs.h:511`):

| bits | campo | |
|---|---|---|
| 0-11 | `itemID` | índice dentro do `.scp` |
| 12 | `boundOnAcc_Extended` | |
| 13-18 | `upgradeLvl` | o **+N** do item (`SHF_UPGRADECORE 13`) |
| 19 | `boundOnChar` | |
| 20 | `boundOnEquip` | |
| 24 | `specialItem` | inventário especial |
| 25-31 | `extendItemLimit` | qual `.scp` — 0=Item, 1=Item2… |

Então `Item2.scp` → índice + 33554432, e um item +15 → índice + `(15 << 13)`. `MASK_ITEMKINDINDEX`
= `0x6000FFF` isola item+tabela, que é a chave para procurar o nome — o mesmo item com upgrade
diferente tem ItemKind diferente. Confirmado contra `cabal_cashService_itemPrice_table`
(`33554612` = Item2.scp idx 372, "Lycanus Core").

**ItemOption** é a struct `ITEM_OPTION` (`GameStructs.h:549`): 3 bytes de slot normal
(`option:4` + `rareNum:4` cada) e um 4º byte com `slotOption:4` + `_slotCount:4`. Dentro de um
slot, `rareNum < 8` = slot comum de nível `rareNum % 4`; `rareNum >= 8` = craft de nível
`rareNum & 7`. **Slot vazio ainda não verificado** — o source não tem escritor de `_slotCount`,
só leitores, então montar slot na mão é chute. `--opcao` cru continua disponível.

## Ferramenta

`/root/daritem/daritem.py` na VM (Python 3.12), com `itens.txt` (8162 nomes de item já no formato
ItemKind, extraído de `Itemidx for admin panel.txt` do pacote CabalEditor) e `.sapass` em modo 600.
Subcomandos: `buscar`, `contas`, `dar`, `fila`, `cancelar`.

**Why:** os `.scp` do servidor só têm remark em EUC-KR — não dá pra achar item por nome em inglês
sem essa lista. E `cabal_character_table` **não tem** coluna `UserNum`, então não dá pra ligar
personagem→conta por ali; as contas vivem em `Account.dbo.cabal_auth_table`.

## Sobre editores de item

O pacote **CabalEditor** do RaGEZONE (`D:\Cabal\CabalEditor-[RaGEZONE]`) é Python legível, mas
**não edita `Item.scp`** — são 20 scripts para enchant, chaos/divine upgrade, runas, mérito,
forcewing, pet e collection. Serve pelas `dependencies/` (tem `cabal.dec` de 3,4 MB e a lista de
ItemIdx).

O `Item.scp` deste servidor **não precisa de `.dec`**: a linha 197 é um cabeçalho `[Item]` com os
52 nomes de coluna separados por TAB (4094 itens; `Item2.scp` linha 198, 3815 itens). Antes dele há
194 `@DEFINE`. Editores de terceiro que exigem `.dec` são risco puro aqui — nenhum `.dec` existe na
instalação e um schema errado desalinha as 52 colunas de uma vez.
