Ir para conteúdo

Posts Recomendados

nome: Sistema de Ginásio / GYM para pokemon.

autor: brun123 (mastercraft)

versão testada: TFS 0.36 pl 1 (8.54)

 

 

  Mostrar conteúdo oculto

 

 

Detalhes: Como cada servidor de pokemon é bem diferente, acredito que muitos erros vão aparecer devido a diferença de IDs das pokebolas por exemplo, mas vou ajudar no que posso.

 

 

Primeiro passo: crie um arquivo com o nome gymlib.lua na pasta data/lib/, e coloque isso dentro do arquivo:

 

  Mostrar conteúdo oculto

 

 

Segundo passo: crie um arquivo chamado gym.lua na pasta data/creaturescripts/scripts/ e coloque isso dentro:

 

  Mostrar conteúdo oculto

 

 

Terceiro passo: abra o arquivo creaturescripts.xml (localizado em data/creaturescripts) e adicione essas 4 tags:

 

    <event type="cast" name="Gym1" event="script" value="gym.lua"/>
   <event type="attack" name="Gym2" event="script" value="gym.lua"/>
   <event type="direction" name="Gym3" event="script" value="gym.lua"/>
   <event type="death" name="Gym4" event="script" value="gym.lua"/>

Quarto passo: crie um arquivo chamado brock.xml em data/npc e crie um chamado brock.lua em data/npc/scripts e coloque isso dentro:

 

  Mostrar conteúdo oculto

 

Quinto passo: se você usar o pokemon dash, vá no arquivo playerattack.lua (data/creatureevents/scripts) e adicione esses códigos embaixo da linha "function onAttack(cid, target)":

 

if getPlayerStorageValue(target, 201) ~= -1 then
for a, b in pairs(ginasios) do
if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then
if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then
doPlayerSendCancel(cid, "You can't attack this pokemon.")
return false
end
end
end
end
end

Se você não usa o pokemon dash, crie um arquivo chamado playerattack.lua na pasta data/creatureevents/scripts e coloque isso dentro:

 

function onAttack(cid, target)
if getPlayerStorageValue(target, 201) ~= -1 then
for a, b in pairs(ginasios) do
if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then
if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then
doPlayerSendCancel(cid, "You can't attack this pokemon.")
return false
end
end
end
end
return true
end

e adicione essa tag no creaturescripts.xml (data/creaturescripts):

 

<event type="attack" name="PlayerAttack" event="script" value="playerattack.lua"/>

e ainda, abra o arquivo login.lua e embaixo dessa linha: "function onLogin(cid)" adicione esse código:

 

registerCreatureEvent(cid, "PlayerAttack")

 

Último passo: vá em data/creaturescripts/scripts e abra o arquivo goback.lua (aqui por exemplo, pode ser que haja uma particulariedade de servidor para servidor), e procure pela linha:

function onDeath(cid, deathList)

e abaixo dela, adicione esse código:

 

local owner = getCreatureMaster(cid)
for x, y in pairs(ginasios) do
if getPlayerStorageValue(owner, y.storage) == 1 then

   if getPlayerStorageValue(owner, 991) == 5 or not hasPokemon(owner) then
   setPlayerStorageValue(owner, 991, -1)
   else
   local number = tonumber(getPlayerStorageValue(owner, 991))
   setPlayerStorageValue(owner, 991, number + 1)
   end
end
end

Configuração dos NPCs:

Abrindo o arquivo brock.lua na pasta data/npc/scripts, procure por esta linha:

"doGymBattle("Brock", "Brock Geodude", cid, 1)"

o "Brock" precisa ser o nome do NPC e o "Brock Geodude" precisa ser o nome do primeiro pokemon a ser usado.

 

Agora nessa parte, no script do seu NPC, você também deve editar o nome do NPC no lugar de "brock".

Se quiser que o player possa lutar com o NPC mesmo depois de tê-lo vencido, é só remover a mesma parte:

 

if getPlayerStorageValue(cid, ginasios["Brock"].storage) >= 1 then
return true
end

 

Ao abrir o arquivo gymlib.lua, você encontra essas duas linhas (são as primeiras):

 

funcpokemon = {2220, 2222} -- ID das pokebolas (o pokemon tem que estar vivo nessas IDs)
bpslot = CONST_SLOT_BACKPACK --em outros servers, pode ser que seja CONST_SLOT_AMMO o lugar onde fica a backpack no inventory

Onde está funcpokemon, você coloca o ID de todas as pokebolas do seu server, mas esse ID tem que ser o ID da pokebola com algum pokemon vivo dentro, e esses IDs devem ser separados por vírgula.

Onde está bpslot, você escreve onde fica a BACKPACK do seu server de pokemon. Se ficar no lugar normal de BPs, deixe como está, mas se sua BP fica no slot da munição (ammunition), você deve estar para CONST_SLOT_AMMO. Isso é tudo, agora vocês podem configurar os IDs e localização da BP facilmente, sem precisar conhecimentos mais avançados sobre scripting, e evitar erros no sistema.

 

Abrindo o arquivo gymlib.lua, localizado em data/lib/ você encontra essa tabela:

 

ginasios = {
["Brock"] = { storage = 900,
         msgdefeat = "You lost! You aren't strong enough yet, don't come back until you get stronger!",
         msgafk = "Go away if you don't have any pokemons!",
         msgwin = "Congratulations, you were strong enough to win this battle fairly! Take this Earth Badge as reward.",
         [1] = { msggo = "Lets fight then! I choose you, Geodude!",
           msgba = "That's enough, Geodude!",
           pokem = "Brock Geodude",
           nextp = "Brock Graveler"},
         [2] = { msggo = "It's your turn, Graveler!",
           msgba = "Come back, Graveler!",
           pokem = "Brock Graveler",
           nextp = "Brock Golem"},
         [3] = { msggo = "Crush'em, Golem!",
           msgba = "You did well, Golem!",
           pokem = "Brock Golem",
           nextp = "finish"}
       }
}

storage significa a única storage que deve variar de NPC para NPC, tenha certeza de que essa storage não está sendo usada, é você não deve usar a storage 901 aqui, pois a mesma já está em uso pelo próprio sistema.

msgdefeat significa o que o NPC irá dizer quando o player perder o duelo.

msgafk significa o que o NPC irá dizer caso o player comece o duelo, mas não faça nada depois.

msgwin significa o que o NPC irá dizer quando o player vencer o duelo.

msggo / msgba significam os textos que o NPC irá dizer ao sumonar o pokemon dele, ou quando o mesmo morrer, respectivamente.pokem / nextp significam o nome do pokemon que será utilizado, e o próximo pokemon a ser sumonado pelo NPC, respectivamente. Caso o nextp seja especificado como "finish", não haverá um próximo pokemon.

o número entre [] significa a ordem utilizada pelo líder para usar o tal pokemon, sendo 1 o primeiro pokemon, 2 o segundo e assim vai...

Uma tabela detalhada sobre a configuração:

 

  Mostrar conteúdo oculto

 

Importante: caso for testar o sistema como foi postado aqui, é necessário criar antes os monstros Brock Geodude, Brock Graveler e Brock Golem, assim como adicioná-los no monsters.xml.

Recomendações: é bom você impedir que o pokemon consiga retornar para a pokebola durante duelos (assim como foi feito no SvkE), para isso, basta adicionar esse código no arquivo goback.lua (data/actions) na parte inicial de retornar o pokemon:

 

for a, b in pairs(ginasios) do
if getPlayerStorageValue(cid, b.storage) == 1 then -- GYM
doPlayerSendCancel(cid, "You can't return your pokemon during gym battles.")
return true
end
end

Aconselho fazer o mesmo caso seu server tenha script de revive.

 

Deve-se também checar pelos storages usado em players, somente o 990 e o 991.

 

No servidor testado, é utilizado apenas pokeballs e ultraballs, com IDs 2220 e 2222 (outra particularidade).

 

Após ter instalado os arquivos, entre no jogo e use o comando /n Brock para testar o NPC.

 

Último aviso: o prêmio ainda não foi adicionado (que seria a badge), pois esse sim é bem variado de servidor pra servidor.

Já que nenhum servidor base já vem com os IDs das badges, cada um adicionou elas de modo diferente, por isso não pude fazer, mas existe uma parte sobre um prêmio no arquivo gym.lua (data/creaturescripts/scripts), procure por isso:

 

--local item = getPlayerItemById(killer, true, 2307)
--doTransformItem(item.uid, 2294)

Você pode modificar para adicionar dinheiro ou outra coisa, e pode também desenvolver um sistema de badges.

Eu não vou fazer badge aqui, mas se vocês tentarem, posso ajudar com problemas.

 

Quaisquer erros, tentarei responder o mais rápido possível.

Editado por brun123
Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/
Compartilhar em outros sites

Bom , eu estava testando no meu servidor que é o pokemon dash e quando derrotei o geodude do Brock , quando ele soltou o graveler no mesmo tempo graveler morreu e deu esse erro:

 

[27/05/2011 17:05:37] [Error - CreatureScript Interface]

[27/05/2011 17:05:37] data/creaturescripts/scripts/gym.lua:onDeath

[27/05/2011 17:05:37] Description:

[27/05/2011 17:05:37] (luaGetItemAttribute) Item not found

 

Se puder ajudar agradeço ^.^

 

Rep +

Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/#findComment-1038556
Compartilhar em outros sites

@Drdrake9

Use esse código no xml do seu Graveler:

 

 

  Mostrar conteúdo oculto

 

Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/#findComment-1038598
Compartilhar em outros sites

O erro ainda persiste , acho q ta bugado em alguma coisa , e quando graveler morre , ele nao fala + com o player assim tem q criar outro pra duelar :S

 

Agora ta dando otro erro olha :

 

 

[27/05/2011 20:26:39] [Error - CreatureScript Interface]

[27/05/2011 20:26:39] data/creaturescripts/scripts/playerattack.lua:onAttack

[27/05/2011 20:26:39] Description:

[27/05/2011 20:26:39] data/creaturescripts/scripts/playerattack.lua:3: attempt to index field '?' (a nil value)

[27/05/2011 20:26:39] stack traceback:

[27/05/2011 20:26:39] data/creaturescripts/scripts/playerattack.lua:3: in function <data/creaturescripts/scripts/playerattack.lua:1>

Editado por Drdrake9
Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/#findComment-1038624
Compartilhar em outros sites

Congratulações pelo sistema! Muito obrigado por compartilhar com o fórum, com certeza vai ajudar muito a comunidade. Vou dar uma olhadinha no script quando puder, mas me pareceu muito bom. Parabéns!

 

Abraços.

Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/#findComment-1038644
Compartilhar em outros sites

Arrumei a parte do player attack, atualize o seu de acordo com o tópico, sobre o onDeath e o problema de getItemAttribute, isso acontece porque o monstro não tinha corpse, era só arrumar no xml.

Eu testei inúmeras vezes aqui, o seu erro então deve ser na configuração, verifique essa parte no arquivo gymlib.lua

 

funcpokemon = {2220, 2222} -- ID das pokebolas (o pokemon tem que estar vivo nessas IDs)
bpslot = CONST_SLOT_BACKPACK --em outros servers, pode ser que seja CONST_SLOT_AMMO o lugar onde fica a backpack no inventory

 

Eu esqueci de explicar ela no tópico, já vou atualizar...

Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/#findComment-1038662
Compartilhar em outros sites

@brun123

 

Arrumei o corpo do golem q botei como segundo pokemon e coloquei o player attack que voce mandou atualizar , ainda assim o pokemon quando sai morre e tambem ageitei as balls , ate coloquei a nova do servidor mas nada :S

 

Edit : Consegui , era o geodude q tava sem corpo '.' nem percebi isso tinha trocado xml dele pelo aberto q era o geodude normal ^^^

 

Rep+ Dnv :p

Editado por Drdrake9
Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/#findComment-1038850
Compartilhar em outros sites

Fiz tudo certo como ele diz o tutorial mas da um erro,se eu tiver sem nenhum pokemon solto ele larga o brock geodude e puxa rapidamente depois nao pode batalha denovo,e outra se o meu pokemon estiver solto da para batalha contra o geodude mas quando eu mato o geodude ele solta o graveler e o graveler morre sozinho quando sai da poke ball, teria comoo arruma isso?

 

no Tfs da o seguinte erro:

[28/05/2011 23:25:09] [Error - CreatureScript Interface] 
[28/05/2011 23:25:09] data/creaturescripts/scripts/gym.lua:onDeath
[28/05/2011 23:25:09] Description: 
[28/05/2011 23:25:09] (luaGetItemAttribute) Item not found

 

eu uso pokemon dash, na versão fight!

 

Ajuda?

obrigado!

 

 

-EDIT-

O geodude tava sem corpose por isso dava dando erro!

 

Ganho meu rep+ :button_ok:

 

teria como da pra batalha com ele mais de uma vez?

quando um player batalha com ele e perde ele não batalha mais.

Editado por infernity
Link para o comentário
https://xtibia.com/forum/topic/157382-sistema-npc-gym-para-pokemon/#findComment-1038949
Compartilhar em outros sites

×
×
  • Criar Novo...