Adicione o script aqui para que eu possa entender o erro e tentar ajuda-lo.
Erro em script de Creature script
Por PsyMcKenzie, 29 de mar. de 2013 em Scripts
info
Grupo: Conde
Registrado: 14/02/13
Posts: 702
Reputação: +196
Gênero: Masculino

info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

É um script que estou fazendo pra postar.
É bem simples, pois sou bem iniciante!
function onThink(cid, interval) if getPlayerFood(cid) <= 30 then doCreatureAddHealth(cid, -20) doPlayerSendTextMessage(cid,19, "Você está com fome.") doSendMagicEffect(getCreaturePosition(cid), 30) return true else return false end end
Aqui pra quando o player logar, ele nascer com feed.
function onLogin(cid) if getPlayerFood(cid) == 0 then doPlayerFeed(cid, 100) return true end end
info
Grupo: Marquês
Registrado: 22/07/12
Posts: 1.1k
Reputação: +400
Gênero: Masculino
Char no Tibia: Luck Oake

Faz o seguinte, usa um addEvent numa função onLogin:
function checkFood(cid, time)
if getPlayerFood(cid) <= 30 then
doCreatureAddHealth(cid, -20)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você está com fome.")
doSendMagicEffect(getCreaturePosition(cid), 30)
end
return addEvent(checkFood, time*1000, cid, time)
end
function onLogin(cid)
local tempo = 10 -- A cada quantos segundos será verificado
checkFood(cid, tempo)
return true
end
Editado Março 29 por LuckOake
info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

Ah mano, ai se me fode ![]()
Da pra traduzir o script pra mim? To aprendendo ainda..
Tipo, coloca -- e escreve na frente o que significa cada parte
se possivel
info
Grupo: Marquês
Registrado: 22/07/12
Posts: 1.1k
Reputação: +400
Gênero: Masculino
Char no Tibia: Luck Oake

Se não entender algo, pode perguntar.
function checkFood(cid, time) -- Início da função
if not isCreature(cid) then -- Se não achar o player
return true -- Retorna true e para o script
elseif getPlayerFood(cid) <= 30 then -- Se a food do player for igual ou menor que 30
doCreatureAddHealth(cid, -20) -- Adicionar -20 hp nele
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você está com fome.") -- Mandar a mensagem
doSendMagicEffect(getCreaturePosition(cid), 30) -- Mandar efeito
end -- Fim
return addEvent(checkFood, time*1000, cid, time) -- Inicia a função novamente após 'time' segundos
end -- Fim da função
function onLogin(cid) -- Ao fazer login
local tempo = 10 -- A cada quantos segundos será verificado
checkFood(cid, tempo) -- Iniciar a verificação da food
return true
end -- Fim
Editado Março 29 por LuckOake
info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

Valew cara, se é zica, mas.. da pra explicar melhor essa parte?
return addEvent(checkFood, time*1000, cid, time) -- Inicia a função novamente após 'time' segundos end -- Fim da função
E a parte de quando logar eu posso fazer assim?
function onLogin(cid) local tempo = 10 checkFood(cid, tempo) if getPlayerFood(cid) == 0 then doPlayerFeed(cid, 100) return true end end
Editado Março 29 por PsyMcKenzie
info
Grupo: Marquês
Registrado: 22/07/12
Posts: 1.1k
Reputação: +400
Gênero: Masculino
Char no Tibia: Luck Oake

Valew cara, se é zica, mas.. da pra explicar melhor essa parte?
return addEvent(checkFood, time*1000, cid, time) -- Inicia a função novamente após 'time' segundos end -- Fim da função
Aqui:
return addEvent(checkFood, time*1000, cid, time) -- Inicia a função novamente após 'time' segundos
Significa que a função vai executar novamente após 'time' segundos, ou seja, se 'time' é igual a 5, o script vai se iniciar novamente após 5 segundos depois da verificação anterior. Isso ai é tipo recursividade, só que não serve pra achar resultados.
Posso fazer assim?
function onLogin(cid) local tempo = 10 checkFood(cid, tempo) if getPlayerFood(cid) == 0 then doPlayerFeed(cid, 100) return true end end
Poder pode, mas aconselho a colocar o return true antes do ultimo end. E do jeito que está ai, se o player tiver com food 0, é só relogar que a food volta pra 100.
E também é melhor colocar o if getPlayerFood(cid) == 0 then antes do checkFood(cid, tempo) pra alimentar antes de verificar, pois dessa maneira, se o player tiver com 0 food ele vai perder 20 de life quando logar. A ordem das funções altera os acontecimentos.
Editado Março 29 por LuckOake
info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

function checkFood(cid, time) -- Início da função
Nem sabia da existência disso, achava que era só OnThink, OnLogin e mais umas la..
Onde encontro mais desse tipo pra começar scripts?
if not isCreature(cid) then -- Se não achar o player
Essa parte é necessária mesmo?
return true -- Retorna true e para o script
Como assim retorna true? pode esclarecer? desculpe o incomodo mano..
info
Grupo: Marquês
Registrado: 22/07/12
Posts: 1.1k
Reputação: +400
Gênero: Masculino
Char no Tibia: Luck Oake

function checkFood(cid, time) -- Início da função
Nem sabia da existência disso, achava que era só OnThink, OnLogin e mais umas la..
Onde encontro mais desse tipo pra começar scripts?
Na verdade, essa função ai foi criada ali no script que te mandei, ela não é uma função padrão do TFS. O que começa o script mesmo é o onLogin(cid).
if not isCreature(cid) then -- Se não achar o player
Essa parte é necessária mesmo?
Sim, para o script verificar se o player está online. Se ele estiver offline e o script continuar executando, vai dar erro por tentar executar funções em um objeto não presente.
return true -- Retorna true e para o script
Como assim retorna true? pode esclarecer? desculpe o incomodo mano..
Sempre que tiver um return numa condição verdadeira, o script para nesse ponto e retorna algo. Exemplo:
function ba(a) if a == 3 then -- Se 'a' for igual a 3 return 8 -- Retorna 8 end return false -- Retorna false caso nenhuma condição for verdadeira end
Se você usar ba(3), vai retornar 8, pois a condição if a == 3 then foi cumprida e tinha um return ali.
Mas se você usar ba(5), vai retornar false, pois nenhuma condição que retorna algo foi cumprida.
Editado Março 29 por LuckOake
info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

Aqui:
return addEvent(checkFood, time*1000, cid, time) -- Inicia a função novamente após 'time' segundos
Significa que a função vai executar novamente após 'time' segundos, ou seja, se 'time' é igual a 5, o script vai se iniciar novamente após 5 segundos depois da verificação anterior. Isso ai é tipo recursividade, só que não serve pra achar resultados.
Estou começando a entender. Não sei o que é recursividade, mas tudo bem kk
Quer dizer entao que essa parte serve dessa forma:
O script acontece, e essa parte ai, serve pra ele acontecer novamente depois de 5 segundos? É isso?
Poder pode, mas aconselho a colocar o return true antes do ultimo end. E do jeito que está ai, se o player tiver com food 0, é só relogar que a food volta pra 100.
E também é melhor colocar o if getPlayerFood(cid) == 0 then antes do checkFood(cid, tempo) pra alimentar antes de verificar, pois dessa maneira, se o player tiver com 0 food ele vai perder 20 de life quando logar. A ordem das funções altera os acontecimentos.
Pode crer, errei nessa parte do if GetPlayerFood
Então deve ficar assim?
function onLogin(cid) local tempo = 10 if getPlayerFood(cid) == 0 then checkFood(cid, tempo) doPlayerFeed(cid, 100) end return true end
Editado Março 29 por PsyMcKenzie
info
Grupo: Marquês
Registrado: 22/07/12
Posts: 1.1k
Reputação: +400
Gênero: Masculino
Char no Tibia: Luck Oake

Aqui:
return addEvent(checkFood, time*1000, cid, time) -- Inicia a função novamente após 'time' segundos
Significa que a função vai executar novamente após 'time' segundos, ou seja, se 'time' é igual a 5, o script vai se iniciar novamente após 5 segundos depois da verificação anterior. Isso ai é tipo recursividade, só que não serve pra achar resultados.
Estou começando a entender. Não sei o que é recursividade, mas tudo bem kk
Quer dizer entao que essa parte serve dessa forma:
O script acontece, e essa parte ai, serve pra ele acontecer novamente depois de 5 segundos? É isso?
Isso ai mesmo.
Pode crer, errei nessa parte do if GetPlayerFood
Então deve ficar assim?
function onLogin(cid) local tempo = 10 if getPlayerFood(cid) == 0 then checkFood(cid, tempo) doPlayerFeed(cid, 100) end return true end
Não, assim:
function onLogin(cid) local tempo = 10 if getPlayerFood(cid) == 0 then doPlayerFeed(cid, 100) end checkFood(cid, tempo) return true end
OBS: Postei ali em cima te respondendo.
OBS²: Recursividade (Clique)
Editado Março 29 por LuckOake
info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

Como assim criada no script que tu me mandou?
---------------------------
Tipo eu entendo mais ou menos.
if a == 3 then -- Se 'a' for igual a 3
Se o a foi igual ao 3, ele vai retornar true certo?
Mas o que significa isso?
Retornar o que sabe? é isso que nao entendo :s
Isso ai mesmo.
Aeeeee *-----*
Valew cara!
Não, assim:
function onLogin(cid) local tempo = 10 if getPlayerFood(cid) == 0 then doPlayerFeed(cid, 100) end checkFood(cid, tempo) return true end
Ah pode crer..
Ae sim mano, agora to entendendo essas parada ![]()
Obrigado!
Eu peguei um monte de tutoriais, imprimi e fiz apostilas.
Imprimi o manual de lua 5.1
mas sem ajuda assim é foda ![]()
Valew mesmo cara!
info
Grupo: Marquês
Registrado: 22/07/12
Posts: 1.1k
Reputação: +400
Gênero: Masculino
Char no Tibia: Luck Oake

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.
Tipo eu entendo mais ou menos.
if a == 3 then -- Se 'a' for igual a 3
Se o a foi igual ao 3, ele vai retornar true certo?
Mas o que significa isso?
Retornar o que sabe? é isso que nao entendo :s
Vejamos assim:
a = 3 if a == 3 then return 8 end
Você viu que 'a' vale 3.
Ai a verificação ficaria:
if 3 == 3 then return 8 end
E 3 == 3 é verdadeiro, logo ficaria assim:
if true then return 8 end
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.
Voltando à dúvida:
if a == 3 then -- Se 'a' for igual a 3
Sabemos que true == true, então o script vai prosseguir nessa condição. Exemplo:
if 3 == 3 then -- Verdadeiro
print("Hello") -- Script printa Hello
end -- Fim
Agora, vejamos assim:
if 4 == 3 then -- Falso
print("Hello") -- Script não executa isso porquê a condição é falsa
end -- Fim da condição
*booleano: Que possui valor true ou false.
Editado Março 29 por LuckOake
info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

Certo, vamos por partes:
---------------------------
Onde você criou essa função?
function checkFood(cid, time)
O que seria isso?
criadaPraRetornarAlgo()
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
@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é?
@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?
Editado Março 29 por PsyMcKenzie



info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino
Bom galera, estou fazendo um script aqui e estou com uma duvida
Por exemplo, se o player não fizer tal coisa, ele vai perder life.
Já fiz isso, o problema é que o tempo esta sem exausted. Tipo, ele
vai perdendo vida sem parar e muito rápido, alguém sabe como coloco
um tempo determinado pra vida descer?
Outra coisa.
O script que estou fazendo, é um creaturescript.
Não sei por que, mas quando eu coloco ele no server, nenhum char loga '-'
Alguém sabe por que faz isso?
Editado Março 29 por PsyMcKenzie