-
Total de itens
1104 -
Registro em
-
Última visita
-
Dias Ganhos
20
Tudo que LuckOake postou
-
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. Sempre que você usar um return, logo depois vem um end. Sempre assim.
-
[Arquivado]Academia de Scripting - O começo!
tópico respondeu ao Roksas de LuckOake em Noticias - Arquivo
Cara, sem querer ofender, mas atualmente não tem ninguém na equipe de scripting que tem capacidade pra ensinar na academia. Ou melhor, tem o Demonbholder, mas ele quase não entra. O que você provavelmente vai fazer é ensinar a ser scripter de Open Tibia, o que não é o objetivo da academia. O objetivo mesmo é ensinar a ser Scripter de Lua, mas falando sério, não há ninguém na equipe de scripting atual que seja scripter de verdade, além do Demonbholder. Eu aconselharia a você aprender mais sobre a linguagem antes de tentar ensinar aos membros. -
function getInfoFromDatabase(table, column, condition, id) local a = db.getResult("SELECT `"..column.."` FROM `"..table.."` WHERE `"..condition.."` = "..id..";") if a:getID() == -1 then return false end local b = a:getDataString(""..column.."") return b, a:free() end Vê ai.
-
Pra um script estar dentro de uma condição é só ele estar dentro de um if: if 3 == 3 then checkFood(cid, time) end Como assim?
-
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.
-
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. 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. Sim sim, isso ai mesmo.
-
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. 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.
-
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. 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.
-
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. 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)
-
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). 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. 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.
-
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. 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.
-
Cara, tenta de novo: function getInfoFromDatabase(table, column, condition, id) local a = db.getResult("SELECT `"..column.."` FROM `"..table.."` WHERE `"..condition.."` = `"..id.."`;") if a:getID() == -1 then return false end local b = a:getDataString(""..column.."") return b, a:free() end
-
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
-
Cara, não sei se sou eu que tô fazendo alguma bobeira, até porque eu sou meio ruim pra mexer com querys, mas ainda tá me incomodando essa verificação. Olha só como tá, do jeito que você fez: SELECT `id` FROM `players` WHERE `id` = `3`; Selecionar o id de quem tiver id igual a 3? Estranho, não?
-
function getInfoFromDatabase(table, column, condition, id) local a = db.getResult("SELECT `"..column.."` FROM `"..table.."` WHERE `"..condition.."` = `"..id.."`;") local b = a:getDataString(""..column.."") return b, a:free() end Rapaz, você tá perguntando o seguinte pro sistema: Retornar o ID do player que tiver ID igual a 1. Não faz sentido isso, se o player tiver ID 1, vai retornar 1. Vê se você não tá usando a condição errada.
-
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
-
Try again: function getInfoFromDatabase(table, column, condition, id) local a = db.getResult("SELECT `"..column.."` FROM `"..table.."` WHERE `"..condition.."` = "..id..";") local b = a:getDataString(""..column.."") return b end Se não funcionar, me mostra como você tá usando a função.
-
talkaction Novo system de troca de nome!
tópico respondeu ao XkluivertX de LuckOake em Actions e Talkactions
Cara, esse ai é o sistema básico de troca de nome que já vem na maioria dos servidores pra download. Você simplesmente traduziu (parece que pelo Google Tradutor, pela falta de coerência nas frases) e ainda diz que 100% dos créditos são seus? Qualé, nem 1% de crédito você merece. Reportado pra tirarem esse tópico. Não faz sentido nenhum postar um sistema que você acha em todo lugar e que já vem em quase todos os servers. -
pedido Porque o meu for nao está lendo o restante?
pergunta respondeu ao Tony Araujo de LuckOake em Scripts
Não lia por causa do Return false. Se no primeiro não confirmasse, retornava false e parava o loop. Se confirmar, retorna true e também para o loop. -
dúvida [duvida] MYSQL como remover storages que contenham um dado em uma tabela
pergunta respondeu ao drakylucas de LuckOake em Scripts
Rapaz, nunca vi algo desse tipo, mas acho que dá pra fazer usando a tabela como uma string: local result = db.getResult("SELECT `value` FROM `player_storage` WHERE `key` = 15455") if result:getID() == -1 then return true end while true do local value = result:getDataString("value") if string.match(value, "{xx = (.-),") == "31" then local a = "{xx = "..string.match(value, "{xx = (.-),")..", yy = "..string.match(value, "yy = (.-)}").."}" db.executeQuery("DELETE FROM `player_storage` WHERE `value` = '"..a.."';") end if not result:next() then break end end Fiquei quase 1 hora tentando fazer isso, tomara que funcione .-. OBS: Faz um backup da database antes de executar o script. -
Gente, qualé, ao menos leiam o script todo antes de tentar ajudar alguém, desse jeito vocês não vão conseguir ajudar ninguém. @Topic Refiz o script aqui: local vip = false -- Precisa ser VIP? (true / false) local vip_storage = 37191 -- Storage da VIP local cobrar = false -- Cobrar em dinheiro? (true / false) local price = 10000 -- Preço em gold coins local item = true -- Cobrar algum item? (true / false) local id = 11192 -- ID do item local count = 10 -- Quantidade do item function onSay(cid, words, param) if not param then doPlayerSendCancel(cid, "Você precisa escrever algo.") return true elseif vip and getPlayerStorageValue(cid, vip_storage) - os.time() <= 0 then doPlayerSendCancel(cid, "Você não é vip.") return true elseif cobrar and not doPlayerRemoveMoney(cid, price) then doPlayerSendCancel(cid, "Você não possui gold coins suficientes.") return true elseif item and not doPlayerRemoveItem(cid, id, count) then doPlayerSendCancel(cid, "Você precisa ter "..count.."x "..getItemNameById(id).." para usar o broadcast.") return true end doBroadcastMessage(""..getCreatureName(cid).." ["..getPlayerLevel(cid).."]: "..param.."", MESSAGE_INFO_DESCR) return true end Configurando: local vip = false -- Precisa ser VIP? (true / false) local vip_storage = 37191 -- Storage da VIP local cobrar = false -- Cobrar em dinheiro? (true / false) local price = 10000 -- Preço em gold coins local item = true -- Cobrar algum item? (true / false) local id = 11192 -- ID do item local count = 10 -- Quantidade do item
-
Adiciona em alguma lib: function getInfoFromDatabase(table, column, condition, id) local a = db.getResult("SELECT `"..column.."` FROM `"..table.."` WHERE `"..condition.."`= "..id..";") local b = a:getDataString(""..column.."") return b end Usando a função: getInfoFromDatabase(players, resets, name, Batata) Ela faz isso: db.getResult("SELECT `resets` FROM `players` WHERE `name` = "Batata";") Ai é só usar assim: if getInfoFromDatabase(players, id, id, 1) == 1 then blablabla else doShutdown() end Acho que vai funcionar. Se não, vê se dá algum erro e posta aqui.
-
Vai em data/lib, cria um arquivo.lua lá e coloca isso: function getCooldown(cid, spellname) local storage = tostring(getPlayerStorageValue(cid, 40001)) local spellname = '"' .. spellname .. '"' return string.find(storage, spellname) and tonumber(string.match(storage, "%d+", string.find(storage, spellname) + #spellname)) - os.time() or 0 end function setCooldown(cid, spellname, seconds) local storage = getPlayerStorageValue(cid, 40001) == -1 and "" or tostring(getPlayerStorageValue(cid, 40001)) local spellname = '"' .. spellname .. '"' if string.find(storage, spellname) then local gsub = string.gsub(storage, string.match(storage, "%d+", string.find(storage, spellname) + #spellname), tostring(os.time() + seconds)) setPlayerStorageValue(cid, 40001, gsub) else setPlayerStorageValue(cid, 40001, storage .. spellname .. " " .. tostring(seconds + os.time()) .. " ") end end function isExhausted(cid, spellname) return getCooldown(cid, spellname) > 0 end
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.