RA

[OTClient / TFS 0.3.6] Pokébar corrigida — HP, clique, Revive e atributos preservados

Por raulcdj, 01 de out. de 2026 em Mods, funções e outros

1
238
raulcdjR
01 de outubro de 2026 às 17:56

Pokébar corrigida — tutorial de instalação

Barra para até seis Pokémon, com nome/apelido, boost, HP, troca por clique e Revive. A troca usa as Balls originais e preserva seus atributos. Desenvolvida nesta base TFS 0.3.6 / PokexGeneration com OTClient; outras bases precisam adaptar os pontos indicados.

Download: Baixar Pokébar corrigida no MediaFire

1. Antes de instalar

Faça backup do servidor, da source e do cliente. Extraia o ZIP e localize as pastas client e server. Se houver uma pasta externa Pokebar-Corrigida, entre nela primeiro. Todos os caminhos abaixo começam na pasta que contém client e server.

A instalação tem três partes: source do servidor, scripts do servidor e módulo do cliente. Instalar apenas modules/poke_bar mostra a interface, mas não integra a troca das Balls.

Você precisa da source e do ambiente de compilação da SUA base. O pacote não inclui executável, DAT/SPR, mapa nem banco. A função doMoveBar é uma alteração desta base, não uma função padrão de todo TFS 0.3.6.

Não instale a pasta referencia-local: contém a versão antiga para comparação. O arquivo server/integracao.lua é um exemplo para distribuir nos locais abaixo; não copie esse arquivo inteiro para data/lib.

2. Source do servidor — fazer primeiro

Os arquivos server/source/doMoveBar.cpp e luaDoMoveBar.cpp são TRECHOS para inserir na source existente. Não são substitutos completos de game.cpp ou luascript.cpp.

Em source/game.cpp, procure a implementação bool Game::doMoveBar. Substitua somente essa função pela implementação de server/source/doMoveBar.cpp. Se não existir, acrescente a função em game.cpp. Os includes e APIs devem corresponder ao seu fork, conforme server/source/INTEGRACAO.txt.

Em source/game.h, dentro da parte pública da classe Game, confirme esta declaração. Acrescente somente se não existir:

bool doMoveBar(uint32_t playerId, uint8_t opId);

Em source/luascript.cpp, procure LuaScriptInterface::luaDoMoveBar. Substitua somente essa função pelo trecho de server/source/luaDoMoveBar.cpp; se não existir, acrescente a implementação.

Em source/luascript.h, junto às declarações das funções Lua da classe LuaScriptInterface, confirme:

static int32_t luaDoMoveBar(lua_State* L);

Em LuaScriptInterface::initState, em source/luascript.cpp, junto aos outros lua_register, confirme uma única entrada:

lua_register(m_luaState, "doMoveBar", LuaScriptInterface::luaDoMoveBar);

Recompile o servidor com o projeto de compilação da sua base. Inicie depois com o executável recompilado. Não há um comando de compilação universal para todas as sources. Erros com ContainerIterator, Cylinder, MoveEvents ou atributos exigem adaptação ao fork; não se resolvem trocando por scripts do TFS 1.x. Preserve as alterações existentes, inclusive Pokémon na house.

3. Copiar os scripts do servidor

Copie estes arquivos do ZIP para os caminhos correspondentes do servidor:

- server/data/lib/pokebar_publica.lua → data/lib/pokebar_publica.lua

- server/data/lib/pokebar_select.lua → data/lib/pokebar_select.lua

- server/data/talkactions/scripts/pokebar_publica.lua → data/talkactions/scripts/pokebar_publica.lua

- server/data/creaturescripts/scripts/pokebarlife.lua → data/creaturescripts/scripts/pokebarlife.lua

Confirme que sua base carrega data/lib no ambiente de actions, talkactions e creaturescripts. Se possui uma lista manual de bibliotecas, inclua os arquivos nela. Não carregue a biblioteca novamente a cada clique ou evento.

Procure definições antigas de function doUpdatePokemonsBar. Deixe somente a definição de pokebar_publica.lua ativa. Se estiver em liferBar.lua, remova apenas essa função antiga e preserve os demais helpers de vida. Se existir sendAllPokemonsBarPoke, substitua somente seu corpo pelo encaminhamento abaixo:

function sendAllPokemonsBarPoke(cid)
return doUpdatePokemonsBar(cid)
end

4. Ligar a Pokébar ao seu goback

Esta etapa é obrigatória para o clique soltar/recolher usando as mesmas regras da Ball. Não mantenha duas implementações diferentes de summon.

O ZIP traz server/data/lib/pokebar_goback.lua com o goback da base de Raul. Use esse arquivo completo somente se a sua base tiver os mesmos helpers, IDs, regras e atributos. Em outra base, crie data/lib/pokebar_goback.lua com o SEU goback, seguindo esta transformação:

-- Em data/lib/pokebar_goback.lua:
PokeBarActions = PokeBarActions or {}

function PokeBarActions.useBall(cid, item, frompos, item2, topos)
-- Coloque aqui o corpo ORIGINAL do onUse do seu goback.
-- Preserve as verificações, o summon, o recall e os returns.
end

O comentário acima é apenas o local de inserção: não deixe a função vazia. Mova o corpo original, sem colocar outra function onUse dentro dela. Preserve os nomes dos parâmetros usados pelo seu script: se usa fromPosition/toPosition, mantenha esses nomes na assinatura e no corpo.

No arquivo da action que atualmente atende às suas Balls, deixe este wrapper com os parâmetros correspondentes:

function onUse(cid, item, frompos, item2, topos)
return PokeBarActions.useBall(cid, item, frompos, item2, topos)
end

Mantenha o registro existente das Balls em actions.xml apontando para essa action. Não acrescente outra action para as mesmas Balls. A biblioteca precisa estar carregada antes de usar a action ou a Pokébar. Se houver integração com Pokémon na house no seu goback, preserve-a.

5. Registrar a talkaction e o evento de HP

Dentro de <talkactions> em data/talkactions/talkactions.xml, deixe uma única entrada para !@pokebar@, apontando para o script novo. Se já aponta para pbar.lua, altere a entrada existente:

<talkaction words="!@pokebar@" event="script" value="pokebar_publica.lua"/>

Algumas revisões usam script="pokebar_publica.lua"; siga o formato das outras entradas que funcionam no seu XML. Não registre os dois formatos ao mesmo tempo.

Dentro de <creaturescripts> em data/creaturescripts/creaturescripts.xml, registre uma única entrada:

<event type="statschange" name="PokeBarLife" event="script" value="pokebarlife.lua"/>

No goback compartilhado, depois da criação bem-sucedida do Pokémon, registre o evento no CID do Pokémon. No exemplo, pk é esse CID: use o nome real da variável da sua base.

registerCreatureEvent(pk, "PokeBarLife")

Não registre esse evento somente no jogador: o dano do Pokémon é o que atualiza a barra.

6. Atualizar a lista e conferir o portrait

No onLogin existente, depois das inicializações do inventário, chame:

doUpdatePokemonsBar(cid)

Acrescente a mesma chamada após captura, recall, revive, boost e mudanças do inventário, nos pontos em que a operação terminou. Em callbacks atrasados, confirme isPlayer(cid) antes de chamar. Preserve os returns e as regras existentes; não substitua login.lua ou catch.lua inteiros. O cliente também pede refresh ao entrar e abrir a barra.

Se o movement do slot da Ball usa portrait.lua, compare com server/portrait-exemplo.lua. Durante onEquip com isCheck=true, retorne true sem transformar itens ou alterar o retrato. Execute alterações somente na etapa real de equipar e retorne true nos caminhos válidos. Preserve os IDs e os registros de movements da sua base.

7. Instalar o módulo do cliente

Copie a pasta client/modules/poke_bar inteira para modules/poke_bar do seu OTClient. Copie todos os .lua, .otui, .otmod e PNGs juntos. Remova da configuração de carregamento outra versão ativa do mesmo módulo.

Carregue poke_bar depois de corelib, client_topmenu e game_interface. Se sua interface usa load-later em interface.otmod, acrescente poke_bar à lista existente, mantendo os outros módulos. Não substitua interface.otmod inteiro.

A edição corrigida usa UIWidget padrão para as imagens das barras. imageview.lua acompanha o pacote como referência; não é necessário registrá-lo em corelib. O ícone do botão superior usa /images/topbuttons/healthinfo: adapte esse caminho se seu cliente não tiver a imagem.

O envio de dados usa onTextMessage / MessageModes.Failure com prefixo p#. Não registre portrait como callback do opcode 160. O Revive usa !@pokebar@ revive ordem, não o opcode 44. A Pokébar não altera o handler de opcode 44 do seu servidor.

Feche e abra novamente o cliente após instalar.

8. Ajustes da sua base

Em data/lib/pokebar_publica.lua, confira PokeBarActions.reviveItemId = 12343. Troque 12343 pelo ID do Revive da sua base. O botão consome um item e recupera 50% de HP, com intervalo de três segundos. Storages usados: 990 para gym, 52481 para duelo e 98552 para o intervalo do Revive. Ajuste conflitos.

A tabela fotos precisa mapear a espécie para um Item ID do servidor; getItemInfo(id).clientId fornece o ID exibido pelo cliente. Sem fotos, é usado clientId 2395 como fallback, que deve existir no seu DAT. O pacote não inclui ícones de Pokémon no DAT/SPR.

A seleção usa as regras de pokes, pokeballs, exhaustion e os atributos poke, hp, boost e ballorder desta família de bases. O goback precisa manter suas dependências originais. HP da Ball normalmente é fração: 1 = cheio e 0.5 = metade.

9. Teste antes de usar em produção

- Entre com até seis Balls e confira nomes, boost e ícones.

- Digite !@pokebar@ refresh e confira a atualização.

- Clique em outra Ball: deve recolher o atual, trocar as Balls originais e soltar o selecionado.

- Teste uma restrição real do seu goback: se o recall for negado, não deve trocar nem remover o summon à força.

- Cause dano e confira o HP da barra. Recolha e confira novamente.

- Use Revive em uma Ball desmaiada: deve gastar um item e deixar HP em 50%. Em Ball viva, não deve gastar.

- Confira helds, level, EXP, boost, addon, cooldowns e atributos adicionais após a troca; teste bolsa cheia, bolsas aninhadas e slot principal vazio.

- Saia e entre novamente. Confira os logs do servidor e do cliente.

10. Problemas comuns

Barra não aparece: confira carregamento do módulo, arquivos .otui/PNG e mensagens de erro do cliente.

Barra aparece vazia: confira a talkaction, o carregamento de pokebar_publica.lua e se suas Balls possuem o atributo poke.

Erro PokeBarActions.useBall: a biblioteca do goback não carregou ou a integração do passo 4 ficou incompleta.

Mensagem de executável corrigido: confirme a recompilação, o registro Lua de doMoveBar e que iniciou o novo executável.

HP não muda após dano: confira PokeBarLife no Pokémon criado, não apenas no jogador.

Ícone errado: confira fotos, getItemInfo e os clientIds do seu DAT.

Falha de troca sem recriação de Ball: verifique regras do slot, movements/portrait e bloqueios da base. Não use o fallback antigo de remover e recriar Balls.

Créditos e validação

Visual original creditado a Viktor (potsystems.blogspot.com); créditos OTClient/OTClientV8 e OpenTibia preservados. Raul compartilha a integração e as correções com auxílio do Codex.

Na base alvo foram realizados testes Lua 5.1, compilação e testes no motor isolado de troca, bolsa cheia/aninhada, slot vazio, ordem inválida, trava de house e preservação dos objetos/atributos. Não houve novo teste visual do cliente nem teste prolongado em produção. Este texto reorganiza a instalação; não torna o pacote universal para outros forks.

Editado Outubro 2 por raulcdj

Tutorial reorganizado: caminhos, source, goback, XML, cliente e testes.