Ir para conteúdo
  • 0

Dúvida em creaturescript


Lordbaxx

Pergunta

Bom á muito venho tentando e já deixei o sistema PRONTO!

Sim está pronto, porém uma coisa que me intrigou e que no momento em que tentei não achei que daria errado.. Mas é.. Deu errado!

 

Um amigo me indicou uma função para que fossem contadas as pokebolas que o jogador tem no sloot, adicionei a função e logo em seguida testei a mesma com um básico print:

print(#getPlayerPokeballs(cid))

No goback, e mandou o número exato de pokebolas que o jogador tinha em sua pokebag/bolsa. Ai veio a parte estranha, fui utilizar exatamente a mesma função no creaturescript utilizado para selecionar o número de pokemons que o jogador quer duelar, usei da seguinte maneira:

local pokes1 = getLivePokeballs(cid, getPlayerSlotItem(cid, 3).uid, true)
local pokes2 = getLivePokeballs(sid, getPlayerSlotItem(sid, 3).uid, true)
function onJoinChannel(cid, channelId, users, isTv)
if getPlayerVocation(cid) ~= 88 then
return false
else
   if channelId == config.channelId1 then
if #pokes1 < (channelId-12) or #pokes2 < (channelId-12) then
     local tpw = getPlayerStorageValue(cid, STORAGEx) < 1 and "ally" or "opponent"
doPlayerSendTextMessage(cid, 20, "You or your "..tpw.." doesn't have that amount of pokemons in their bags! Duel are canceled!")
doPlayerSetVocation(cid, 1)
else
 setPlayerStorageValue(cid, STORAGEx, 0)
 setPlayerStorageValue(cid, STORAGEy, 1)
 setGlobalStorageValue(STORAGEx, 1)
 doSendAnimatedText(getThingPos(cid), "1 Pokemon", 28)
 doPlayerSetVocation(cid, 1)
 return false
 end
E não funcionou.. Eu tenho todas as funções acima e ainda assim não contou o número de pokemons do jogador. Ainda tentei assim:
REPARE QUE ESTÁ ESCRITA ASSIM "getPlayerPokeballs(cid)", porém também utilizei assim "#getPlayerPokeballs(cid)", ainda assim nada, veja o exemplo:
  if channelId == config.channelId1 then
     if getPlayerPokeballs(cid) >= 1 then 
     return doPlayerSendCancel("You don't have pokemon!")
end
 setPlayerStorageValue(cid, STORAGEx, 0)
 setPlayerStorageValue(cid, STORAGEy, 1)
 setGlobalStorageValue(STORAGEx, 1)
 doSendAnimatedText(getThingPos(cid), "1 Pokemon", 28)
 doPlayerSetVocation(cid, 1)
 return false
Espero ajuda pois creio que eu é quem estou fazendo errado "Creaturescripts não é legal :(" pra mim.
Abrc amigos!
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

tá, vamos lá:
Primeiro lugar seu código não tá completo, ele possui erros gravíssimos e isso explicaria por si só grande parte do motivo de não funcionar..

1- Pra todo if que você tem você precisa de um end pra fechar o bloco dele.
a melhor forma de perceber isso é identando seu código, baixe o notepad++ aí q ele vai te dizer onde um bloco abre e onde ele fecha e use sempre o tab pra identar e não perder controle sobre seu código

Agora vamos lá, arrumando o erro [1] seu código deverá ficar assim, note que é muito mais fácil entender o que cada coisa faz

 

local pokes1 = getLivePokeballs(cid, getPlayerSlotItem(cid, 3).uid, true)
local pokes2 = getLivePokeballs(sid, getPlayerSlotItem(sid, 3).uid, true)

function onJoinChannel(cid, channelId, users, isTv)
	if getPlayerVocation(cid) ~= 88 then return false end -- nem continua pra baixo caso seja ~= 88

	if channelId == config.channelId1 then
		if #pokes1 < (channelId-12) or #pokes2 < (channelId-12) then
			local tpw = getPlayerStorageValue(cid, STORAGEx) < 1 and "ally" or "opponent"
			doPlayerSendTextMessage(cid, 20, "You or your "..tpw.." doesn't have that amount of pokemons in their bags! Duel are canceled!")
			doPlayerSetVocation(cid, 1)
		else
			setPlayerStorageValue(cid, STORAGEx, 0)
			setPlayerStorageValue(cid, STORAGEy, 1)
			setGlobalStorageValue(STORAGEx, 1)
			doSendAnimatedText(getThingPos(cid), "1 Pokemon", 28)
			doPlayerSetVocation(cid, 1)
		end
	end		
return false
end

 



2- Você só pode utilizar coisas como parâmetro que existam, sério, muita gente ainda acredita que cid significa sempre o player e isso não é verdade. No geral cid só existe dentro do callback (função principal do script) pois ele é o primeiro parâmetro da função, acompanha cmg:

function onJoinChannel(cid, channelId, users, isTv)

esse é o callback e olha só ali o nosso cid. Eu só posso usar coisas que utilizam o cid debaixo dessa linha aí pois antes disso ele não é definido, logo isso daqui daria erro:

local pokes1 = getLivePokeballs(cid, getPlayerSlotItem(cid, 3).uid, true)
local pokes2 = getLivePokeballs(sid, getPlayerSlotItem(sid, 3).uid, true)

function onJoinChannel(cid, channelId, users, isTv)

Sem falar que sid não existe, você vai ter que pensar em outra forma de coletar os pokemons do oponente e eu dou um bom palpite que você poderia usar aquele users ali no callback pra checar os players que já estão no channel. Nunca mexi com esse callback mas é um bom palpite, coloca pra printar o type daquilo e vai fazer testes pra ver como funciona aquilo (ou se vc manjar de source, olha na source como a função tá definida)

Por fim, se vc só usa a variável uma vez, não tem porque definí-la. Corrigindo tudo ficamos com:

 

function onJoinChannel(cid, channelId, users, isTv)
	if getPlayerVocation(cid) ~= 88 then return false end

	if channelId == config.channelId1 then
		if #getLivePokeballs(cid, getPlayerSlotItem(cid, 3).uid, true) < (channelId-12) or #getLivePokeballs(sid, getPlayerSlotItem(sid, 3).uid, true) < (channelId-12) then
			local tpw = getPlayerStorageValue(cid, STORAGEx) < 1 and "ally" or "opponent"
			doPlayerSendTextMessage(cid, 20, "You or your "..tpw.." doesn't have that amount of pokemons in their bags! Duel are canceled!")
			doPlayerSetVocation(cid, 1)
		else
			setPlayerStorageValue(cid, STORAGEx, 0)
			setPlayerStorageValue(cid, STORAGEy, 1)
			setGlobalStorageValue(STORAGEx, 1)
			doSendAnimatedText(getThingPos(cid), "1 Pokemon", 28)
			doPlayerSetVocation(cid, 1)
		end	
	end
return false
end 

 



Mas ainda não é certo de isso funcionar, só corrigi a parte estrutural do código.. to partindo do pressuposto que a semântica você acertou.

Link para o comentário
Compartilhar em outros sites

  • 0

tá, vamos lá:

Primeiro lugar seu código não tá completo, ele possui erros gravíssimos e isso explicaria por si só grande parte do motivo de não funcionar..

 

1- Pra todo if que você tem você precisa de um end pra fechar o bloco dele.

a melhor forma de perceber isso é identando seu código, baixe o notepad++ aí q ele vai te dizer onde um bloco abre e onde ele fecha e use sempre o tab pra identar e não perder controle sobre seu código

 

Agora vamos lá, arrumando o erro [1] seu código deverá ficar assim, note que é muito mais fácil entender o que cada coisa faz

 

 

local pokes1 = getLivePokeballs(cid, getPlayerSlotItem(cid, 3).uid, true)
local pokes2 = getLivePokeballs(sid, getPlayerSlotItem(sid, 3).uid, true)

function onJoinChannel(cid, channelId, users, isTv)
	if getPlayerVocation(cid) ~= 88 then return false end -- nem continua pra baixo caso seja ~= 88

	if channelId == config.channelId1 then
		if #pokes1 < (channelId-12) or #pokes2 < (channelId-12) then
			local tpw = getPlayerStorageValue(cid, STORAGEx) < 1 and "ally" or "opponent"
			doPlayerSendTextMessage(cid, 20, "You or your "..tpw.." doesn't have that amount of pokemons in their bags! Duel are canceled!")
			doPlayerSetVocation(cid, 1)
		else
			setPlayerStorageValue(cid, STORAGEx, 0)
			setPlayerStorageValue(cid, STORAGEy, 1)
			setGlobalStorageValue(STORAGEx, 1)
			doSendAnimatedText(getThingPos(cid), "1 Pokemon", 28)
			doPlayerSetVocation(cid, 1)
		end
	end		
return false
end

 

 

 

2- Você só pode utilizar coisas como parâmetro que existam, sério, muita gente ainda acredita que cid significa sempre o player e isso não é verdade. No geral cid só existe dentro do callback (função principal do script) pois ele é o primeiro parâmetro da função, acompanha cmg:

function onJoinChannel(cid, channelId, users, isTv)

esse é o callback e olha só ali o nosso cid. Eu só posso usar coisas que utilizam o cid debaixo dessa linha aí pois antes disso ele não é definido, logo isso daqui daria erro:

 

local pokes1 = getLivePokeballs(cid, getPlayerSlotItem(cid, 3).uid, true)
local pokes2 = getLivePokeballs(sid, getPlayerSlotItem(sid, 3).uid, true)

function onJoinChannel(cid, channelId, users, isTv)

Sem falar que sid não existe, você vai ter que pensar em outra forma de coletar os pokemons do oponente e eu dou um bom palpite que você poderia usar aquele users ali no callback pra checar os players que já estão no channel. Nunca mexi com esse callback mas é um bom palpite, coloca pra printar o type daquilo e vai fazer testes pra ver como funciona aquilo (ou se vc manjar de source, olha na source como a função tá definida)

 

Por fim, se vc só usa a variável uma vez, não tem porque definí-la. Corrigindo tudo ficamos com:

 

 

 

function onJoinChannel(cid, channelId, users, isTv)
	if getPlayerVocation(cid) ~= 88 then return false end

	if channelId == config.channelId1 then
		if #getLivePokeballs(cid, getPlayerSlotItem(cid, 3).uid, true) < (channelId-12) or #getLivePokeballs(sid, getPlayerSlotItem(sid, 3).uid, true) < (channelId-12) then
			local tpw = getPlayerStorageValue(cid, STORAGEx) < 1 and "ally" or "opponent"
			doPlayerSendTextMessage(cid, 20, "You or your "..tpw.." doesn't have that amount of pokemons in their bags! Duel are canceled!")
			doPlayerSetVocation(cid, 1)
		else
			setPlayerStorageValue(cid, STORAGEx, 0)
			setPlayerStorageValue(cid, STORAGEy, 1)
			setGlobalStorageValue(STORAGEx, 1)
			doSendAnimatedText(getThingPos(cid), "1 Pokemon", 28)
			doPlayerSetVocation(cid, 1)
		end	
	end
return false
end 

 

 

 

Mas ainda não é certo de isso funcionar, só corrigi a parte estrutural do código.. to partindo do pressuposto que a semântica você acertou.

 

Bom caro amigo, infelizmente não funcionou. Agradeço a ajuda!

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...