PS
dúvida

Erro em script de Creature script

Por PsyMcKenzie, 29 de mar. de 2013 em Scripts

resolvido
script
39
2.9k
LuckOakeL
29 de março de 2013 às 15:31

Certo, vamos por partes:

 

 

snapback.pngPsyMcKenzie, em 29/March/2013 - 15:08, disse:

 

Como assim criada no script que tu me mandou?

Você pode criar uma função, exemplo:

 

 

function criadaPraRetornarAlgo()

return math.random(1, 50)

end

 

Acabei de criar uma função que retorna um número aleatório entre 1 e 50.

 

---------------------------

Onde você criou essa função?

 

 

function checkFood(cid, time)

O que seria isso?

 

 

criadaPraRetornarAlgo()

 

Cara, existem funções básicas principais no TFS que servem pra manipular tudo que o player faz.

 

onLogin, onAttack, onThink, onSay, onUseWeapon, onCastSpell, etc

 

E existem funções complementares, que servem pra dar utilidade às funções principais, exemplo, ao fazer login (onLogin), adicionar item ao player (doPlayerAddItem).

 

Só que nem tudo que você quer fazer existe, então você tem que criar. É ai que você declara uma função nova.

 

Simplesmente por escrever:

 

function blablabla()
end

 

Você já criou uma função chamada blablabla. O que fica dentro dos parêntesis se chama parâmetros. Isso ai explico depois, primeiro você precisa entender tudo que te expliquei até aqui.

 


To entendendo mano, mas tipo aqui não precisaria de um else?

 

if 3 == 3 then -- Verdadeiro

print("Hello") -- Script printa Hello

end -- Fim

 

 

Ficaria assim:

 

 

if 3 == 3 then -- Verdadeiro

print("Hello") -- Script printa Hello

return true

else

return false

end -- Fim

 

ou não? :x

 

Não, pois a condição 3 == 3 não serve pro script ter o valor true, mas sim pra ele printar "Hello" caso a condição seja verdadeira.

Editado Março 29 por LuckOake

PsyMcKenzieP
29 de março de 2013 às 15:41

Entendi, mas você pode criar direto no script? Como fez com:

 

 

function checkFood(cid, time)

 

(cid, time) seria os parametros?

LuckOakeL
29 de março de 2013 às 15:46

@EDIT

Entendi mano *----------*

 

Você entendeu agora o princípio de condição. Agora vejamos exemplos de condições com funções booleanas*:

 

if isCreature(cid) then

 

Sempre que houver uma função sem um comparador (<, >, ==, etc), significa == true. Ou seja:

 

if isCreature(cid) == true then

 

Se o player for uma criatura, ficaria assim:

 

if true == true then

 

Ai o script prossegue nesse trecho.

 

Retornar significa o valor que a função possui de acordo com as condições.

 

Ou seja, na condição if isCreature(cid) then, se o player for uma criatura, retornará true, ou seja, o valor da função é true, é verdadeiro.

 

Então, o return true é para saber que a função é verdadeira, mais ou menos isso né?

 

Isso. Se o player for uma criatura, a função isCreature retorna true.

 


@EDIT2

 

Entendi *-------------------------------*

Aew porra!

 

Então essa parte não tem return false pois não é booleana, certo?

 

function onLogin(cid)
local tempo = 10
if getPlayerFood(cid) == 0 then
doPlayerFeed(cid, 100)
end
checkFood(cid, tempo)
return true
end

 

Tipo, se o player tiver food = 0, o return true vai mostrar que é verdadeiro e o script vai executar a parte do doPlayerFeed.

 

Então, não precisa de return false, porque se isso não acontecer, nao pode acontecer outra coisa, certo?

 

Nesse caso, se o player tiver food == 0, não vai retornar nada, o que retorna é dentro da função getPlayerFood(cid), que retorna o número de food dele. Ai faz a comparação:

 

if 0 == 0 then

 

Mas ai o script prossegue e executa o doPlayerFeed porquê a condição é verdadeira.

 


Entendi, mas você pode criar direto no script? Como fez com:

 

function checkFood(cid, time)

 

(cid, time) seria os parametros?

 

Sim sim, isso ai mesmo.

Editado Março 29 por LuckOake

PsyMcKenzieP
29 de março de 2013 às 15:52

Nesse caso, se o player tiver food == 0, não vai retornar nada, o que retorna é dentro da função getPlayerFood(cid), que retorna o número de food dele. Ai faz a comparação:

 

if 0 == 0 then

 

Mas ai o script prossegue e executa o doPlayerFeed porquê a condição é verdadeira.Nesse caso, se o player tiver food == 0, não vai retornar nada, o que retorna é dentro da função getPlayerFood(cid), que retorna o número de food dele. Ai faz a comparação:

 

 

if 0 == 0 then

 

Mas ai o script prossegue e executa o doPlayerFeed porquê a condição é verdadeira.

 

Então, foi mais ou menos o que eu quis dizer UAHSUHASUA'

Tipo, então essa parte não é boleana né?

Porque o script executa a parte do doPlayerFeed porquê a condição é verdadeira.

Se não fosse verdadeira, não iria acontecer nada certo? por isso não precisa do return false.

É isso?

LuckOakeL
29 de março de 2013 às 15:56

Sim. Se fosse false, não iria acontecer nada que estivesse dentro daquela condição. Agora, observe o seguinte, mesmo a condição sendo verdadeira ou falsa, o checkFood(cid, tempo) vai executar, pois ele não está dentro de nenhuma condição.

 

function onLogin(cid)
local tempo = 10
if getPlayerFood(cid) == 0 then
doPlayerFeed(cid, 100)
end
checkFood(cid, tempo)
return true
end

 

Lembrando, sempre que um return for executado, o script para nesse ponto. Toda função que estiver abaixo é ignorada.

Editado Março 29 por LuckOake

PsyMcKenzieP
29 de março de 2013 às 16:02

Sim. Se fosse false, não iria acontecer nada que estivesse dentro daquela condição. Agora, observe o seguinte, mesmo a condição sendo verdadeira ou falsa, o checkFood(cid, tempo) vai executar, pois ele não está dentro de nenhuma condição.

 

function onLogin(cid)
local tempo = 10
if getPlayerFood(cid) == 0 then
doPlayerFeed(cid, 100)
end
checkFood(cid, tempo)
return true
end

 

Lembrando, sempre que um return for executado, o script para nesse ponto. Toda função que estiver abaixo é ignorada.

 

-------------------------------------------------------------------------

Entendi.

O que precisaria pro checkFood(cid, tempo) estar dentro de uma condição?

 

-------------------------------------------------------------------------

Saquei mano, se eu quiser continuar uma função depois de algum return eu devo colocar end?

LuckOakeL
29 de março de 2013 às 16:11

Pra um script estar dentro de uma condição é só ele estar dentro de um if:

 

if 3 == 3 then
checkFood(cid, time)
end

 

 

-------------------------------------------------------------------------

Saquei mano, se eu quiser continuar uma função depois de algum return eu devo colocar end?

 

Como assim?

PsyMcKenzieP
29 de março de 2013 às 16:17

Entendi!

 

Aqui:

 

function onLogin(cid)
local tempo = 10
if getPlayerFood(cid) == 0 then
doPlayerFeed(cid, 100)
end
checkFood(cid, tempo)
return true
end

 

Por que o return esta antes do ultimo end, e nao antes do end que fecha o If?

 

---------------------------------------------------------------

 

Eu quis dizer assim:

 

Se eu tenho uma função com return true, pra eu iniciar outra no mesmo script eu devo colocar end depois do return né?

LuckOakeL
29 de março de 2013 às 16:21

Entendi!

 

Aqui:

 

function onLogin(cid)
local tempo = 10
if getPlayerFood(cid) == 0 then
doPlayerFeed(cid, 100)
end
checkFood(cid, tempo)
return true
end

 

Por que o return esta antes do ultimo end, e nao antes do end que fecha o If?

 

Rapaz, sempre que for fechar uma função principal, use return true. Por quê? Pra te falar a verdade eu não sei. O máximo que eu sei é que você deve evitar usar return false no final de uma função principal.

 

 

 

Eu quis dizer assim:

 

Se eu tenho uma função com return true, pra eu iniciar outra no mesmo script eu devo colocar end depois do return né?

 

Sempre que você usar um return, logo depois vem um end. Sempre assim.

PsyMcKenzieP
29 de março de 2013 às 16:24

Entendo, mas se eu fizesse isso, estaria errado?

 

function onLogin(cid)

local tempo = 10

if getPlayerFood(cid) == 0 then

doPlayerFeed(cid, 100)

return true

end

checkFood(cid, tempo)

end

 

---------------------------------------------------------------------------------------

 

Entendi. Depois do end, ai sim eu posso iniciar uma nova função né?

LuckOakeL
29 de março de 2013 às 16:26

Entendo, mas se eu fizesse isso, estaria errado?

 

function onLogin(cid)

local tempo = 10

if getPlayerFood(cid) == 0 then

doPlayerFeed(cid, 100)

return true

end

checkFood(cid, tempo)

end

 

---------------------------------------------------------------------------------------

 

Entendi. Depois do end, ai sim eu posso iniciar uma nova função né?

 

Como eu já disse, um return sempre para o script em certo ponto. Como o return tá dentro da condição, se ela for verdadeira, a checagem de food nunca vai acontecer, pois o script vai retornar true e parar naquele ponto e a função checkFood não será executada.

PsyMcKenzieP
29 de março de 2013 às 16:33

Entendi!

Mas esse return true ai, vai checar o script inteiro?

LuckOakeL
29 de março de 2013 às 16:37

Rapaz, não entendi direito essa outra pergunta, mas vou explicar o funcionamento de um script:

 

function teste(cid) -- 1: Script reconhece que é uma função
if 3 == 3 then -- 2: Script faz a comparação
print("Hi") -- 3: Script executa a função se a comparação for verdadeira
end -- 4: Termina
return true -- 5: Retorna true
end -- 6: Termina tudo

 

Traduzindo, o script executa à medida em que os comandos são dados. Se você colocar a linha xx antes da linha yy, o script vai ler e executar primeiro a linha xx.

PsyMcKenzieP
29 de março de 2013 às 16:43

Já entendi, a minha duvida era se o return true iria retornar a parte do if e a parte do check. Já vi que sim.

Obrigado pela imensa ajuda LuckOake, você é muito experiente cara.

Logo darei outro REP+.

Abraços!

 

Posso postar o sistema e colocar os créditos pra voce?

LuckOakeL
29 de março de 2013 às 16:46

Claro, mas os créditos são seus, você que fez o script, eu apenas te ajudei a arrumar ele :D

 

Fico feliz em saber que você conseguiu entender, quando eu vejo que a pessoa quer mesmo aprender eu faço o possível pra ela entender tudo :)