- Fórum
- OTServ
- Recursos
- Scripting
- Mods, funções e outros
- [PokéTibia / TFS 0.3.6] Pokémon solto na house — limite, falas e persistência
RA
[PokéTibia / TFS 0.3.6] Pokémon solto na house — limite, falas e persistência
Por raulcdj, há 13h em Mods, funções e outros
1
21
info
Grupo: Artesão
Registrado: 18/01/17
Posts: 142
Reputação: +3
Gênero: Masculino
Atualização 1.2: nomes dos Pokémon corrigidos. Agora mostra o apelido da Ball ou a espécie. Reinicie o servidor para carregar o XML novo. Neste cliente, a barra de vida pode aparecer junto; o Pokémon continua protegido contra dano.
[PokéTibia / TFS 0.3.6] Pokémon solto na house — limite, falas e persistência
Apresentação
Salve, pessoal! Estou liberando o sistema de Pokémon solto na house que adaptei para minha base TFS 0.3.6 / PokexGeneration, com auxílio do Codex. A ideia veio daquele pedido antigo de deixar o Pokémon andando na house usando a Ball no chão.
Como funciona: o dono coloca uma Ball saudável no chão da house e dá use. O Pokémon aparece como decoração, anda dentro da house e fala as frases da espécie. Outro use recolhe. O limite inicial é 2 por house.
Recursos: trava da Ball enquanto exposta, proteção contra dano, sem combate, limite da própria house, atributos originais preservados (level, boost, shiny, nick, addon e helds) e restauração depois de restart a partir do save de houses. Alakazam também pode falar “Ala alak alakazam!”; Tropius usa “Trooo!”, “PIUSS!” e “TROPIUS!”.
IMPORTANTE: precisa alterar a source e recompilar o SERVIDOR. Não é uma versão universal para qualquer TFS, nem um sistema somente Lua. Não foi testado em TFS 1.x/OTX. Os códigos e o passo a passo estão abaixo, para copiar e adaptar.
Minha conta está sem espaço de anexos no fórum; por isso estou disponibilizando todo o código no próprio tópico. Não é necessário baixar um executável de outra pessoa.
Tutorial e compatibilidade
Pokémon solto na house — edição pública 1.2
Sistema para bases PokéTibia derivadas de TFS 0.3.6 / PokexGeneration. Testado na base em que foi desenvolvido. Não é um script universal para qualquer versão do TFS.
Funcionalidades
Dependências e compatibilidade
É necessário ter a source e recompilar o SERVIDOR. O patch acrescenta
getHouseDisplayBalls(); essa função não existe no TFS padrão. Não basta copiar os Lua.A biblioteca usa os nomes desta família de bases:
getPokeballType(itemid), tabelapokeballs[tipo].on, atributopoke(nome exato no registro de monstros),hpnumérico positivo eaddoncomo lookType ativo. O callback de ação precisa identificar a posição real da Ball. A pasta de dados deve serdata/, comdata/monster/monsters.xml. O carregamento automático dedata/lib/deve estar ativo.Outras bases podem ter nomes, IDs, saves, UIDs e atributos diferentes. Adapte esses pontos antes de instalar. Guild halls foram excluídas porque seu proprietário é um ID de guild, não o GUID de jogador. Não foi testado em TFS 1.x ou OTX.
Instalação
1. Faça backup da base. Em uma cópia de testes, coloque os três arquivos da pasta
data/nas mesmas pastas do servidor.2. Se estiver copiando do tópico, salve o último bloco de código como
house_pokemon_source.patch. Aplique o patch à source, a partir da pasta que contémsource. Com Git disponível:git apply --check --ignore-space-change house_pokemon_source.patche depoisgit apply --ignore-space-change house_pokemon_source.patch. A opção trata diferenças de espaços e finais de linha comuns em bases Windows. Se não aplicar, adapte manualmente os trechos (+ são adições, - são remoções). Não substitua arquivos completos da sua source por arquivos de outra base.3. Recompile o servidor. As mudanças incluem registro da nova função Lua, exceção para o NPC dedicado em HouseTile, bloqueio de mover Balls, restrição de movimento/teleporte, proteção de dano e liberação de marcadores quando muda o dono.
4. No início de
onUsedo seu goback de actions, antes de alterar a Ball, adicione:if HousePokemon.use(cid, item, frompos) then return true endSe o parâmetro de posição chama
fromPosition, use esse nome no lugar defrompos. Não troque o seu goback completo. Se a biblioteca não carregar automaticamente, carreguedata/lib/house_pokemon.luauma vez no bootstrap Lua de actions e de globalevents.5. Dentro de
<globalevents>nodata/globalevents/globalevents.xml, acrescente:<globalevent name="HousePokemon" interval="0" event="script" value="house_pokemon.lua"/>Nesta revisão o intervalo 0 executa aproximadamente uma vez por segundo. Se sua revisão usa outra unidade/agendamento, configure o equivalente a um segundo e confirme no teste.
6. Inicie usando o executável recompilado. O dono coloca uma Ball saudável no chão da house e dá use para soltar. Outro use recolhe. O NPC é criado/removido no próximo ciclo (cerca de um segundo).
Não é preciso alterar catch, client, mapa, IDs de Ball ou esquema do banco. É preciso que o save de houses já preserve atributos personalizados dos itens. O pacote não contém mapa, banco, configurações particulares, executável, sprites ou source completa.
Configuração
Na primeira linha de configuração de
data/lib/house_pokemon.lua, alterelimit = 2para ajustar o máximo por house. A aparência usaaddonquando positivo; caso contrário, lê o look da espécie no XML.As falas são lidas do bloco
<voices>do XML, respeitando intervalo/chance com mínimo de 5 segundos. Elas ficam em cache; reinicie após alterar o XML. Espécies sem frases usam o próprio nome; shiny sem frases usa as da espécie normal. Há uma fala ao aparecer. Para retirar a frase adicional de Alakazam, remova a condiçãospecies:lower() == "alakazam"dentro devoices.Os atributos adicionados à Ball são apenas
house_display_ownerehouse_display_key. Não são persistidos CIDs de NPC nem UIDs de item. O NPC não recebe poderes de batalha de boost, level ou helds: esses valores permanecem guardados na Ball.Testes e limites conhecidos
Compilação na source alvo, Lua 5.1 e XML aprovados. Testados: dono, limite 2, recolhimento, atributos intactos, falha de spawn, repetição sem duplicar e troca de dono em testes Lua. Em uma cópia isolada do servidor foram verificados criação, bloqueio da Ball, dano negado, teleporte negado, save e restauração real após restart, além de caminhada dentro da house e recolhimento. As falas passaram por testes Lua 5.1; não foi feita conferência visual das falas no cliente.
Durante ensaios anteriores, duas inicializações falharam intermitentemente durante o carregamento de items, antes dos scripts. A causa não foi identificada; os testes finais de inicialização/restart passaram. Não há garantia de estabilidade prolongada ou compatibilidade com outras sources. Por isso o pacote público contém código e patch, sem binário pronto.
Persistência acompanha o save existente. Queda antes de salvar pode perder mudanças desde o último save. Se não houver espaço para criar o NPC, a Ball mantém o marcador e a tentativa é repetida; use a Ball para cancelar. Na desinstalação, recolha as decorações antes de remover o sistema.
Créditos
Compartilhado por DarkRed; desenvolvido para sua base com auxílio do Codex. Ideia inspirada no pedido de eriveltonpacheco: https://tibiaking.com/topic/93254-pokemon-solto-na-house/. O tópico original descreve a ideia, não fornece este código. As alterações C++ são destinadas ao TFS, que mantém os créditos e a licença do projeto original. Sprites e conteúdo de Pokémon não são distribuídos neste pacote.
# Correção dos nomes visíveis dos Pokémon na house
HousePokemon.xml agora usa hidename="0" e hidehealth="0". A biblioteca mantém o apelido nick da Ball ou, se vazio, a espécie poke. A identidade interna continua HousePokemon; a Ball continua com seus atributos intactos e os bloqueios de dano/combate/movimento continuam na source.
Causa confirmada no código: hidehealth="1" fazia ProtocolGame enviar HP percentual zero. No Client_Source, Creature::drawInformation retorna antes de desenhar qualquer informação quando HP < 1. Portanto ativar só hidename não bastava. Ao enviar HP normal, o cliente pode desenhar o nome e também uma barra de vida. Essa barra não torna o Pokémon atacável; a proteção permanece.
Reabra o servidor para carregar o XML corrigido. As decorações persistidas serão recriadas pelo sistema; se necessário, recolha e solte a Ball novamente. Se a opção geral de nomes do cliente estiver desligada, ative-a. Não precisa recompilar para esta correção.
Verificação: testes Lua 5.1 de apelido, espécie/Shiny, apelido vazio, restauração e atributos da Ball; XML e caminho servidor/cliente que antes suprimia os nomes conferidos. A exibição final ainda depende de conferir no cliente após reabrir o servidor.
A função doCreatureSetNick precisa existir na sua source. Ela altera somente o rótulo enviado, preservando a identidade interna HousePokemon. Se o seu fork não a possui, adapte esse recurso antes de instalar a chamada da biblioteca.
data/lib/house_pokemon.lua
data/globalevents/scripts/house_pokemon.lua
data/npc/HousePokemon.xml
Patch da source — aplicar e recompilar
Atualização dos nomes para quem já instalou o sistema
Este ZIP pequeno contém a biblioteca e o XML corrigidos, além das instruções. Exige o sistema completo e a função doCreatureSetNick existentes; não substitui o patch da source acima. O bloco cria somente o arquivo ZIP na pasta escolhida.
[IO.File]::WriteAllBytes((Join-Path (Get-Location) 'Pokemon-Solto-House-Nomes.zip'), [Convert]::FromBase64String('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'))SHA256 da atualização: 668ce86a49dbe624965ac588879cf5c67fdcffe85b3ebf469c6142a8465cf3e9
Editado Outubro 1 por raulcdj
Nomes dos Pokémon corrigidos; XML e pacote de atualização 1.2.