Syphos 0 Postado Janeiro 16, 2009 Share Postado Janeiro 16, 2009 (editado) Bem, é o seguinte: Tenho um OT Server (Tibia 8.4/Servfull 2.3 Global/The Forgotten Server/SQL) No meu OT tem uma igreja. Na minha igreja tem um porquinho (daqueles rosa de por moeda) c/ UID E fiz uma action pra ele assim: function onUse(cid, item, frompos, item2, topos) --PIGGY BANK DIZIMO BY SYPHOS-- if item.uid == 6007 then semdinheiro = doPlayerRemoveMoney(cid,10000) if semdinheiro == 1 then doPlayerSendTextMessage(cid,22,"Obrigado! Deus te abençôe!") else end if semdinheiro == 0 then doPlayerSendTextMessage(cid,21,"Sem dinheiro!? Sinta a ira de Deus!") else end else end return 0 end Esse código funciona como eu queria. Mas achei que tava faltando alguma coisa mais legal. Então decidi dar HP pro player q pagar e tirar HP do player que não tiver dinheiro. E então o código ficou assim: function onUse(cid, item, frompos, item2, topos) --PIGGY BANK DIZIMO BY SYPHOS-- if item.uid == 6007 then semdinheiro = doPlayerRemoveMoney(cid,10000) hp = getPlayerHealth(cid) if semdinheiro == 1 then doPlayerSendTextMessage(cid,22,"Obrigado! Deus te abençôe!") doPlayerAddHealth(cid,hp*2) else end if semdinheiro == 0 then doPlayerSendTextMessage(cid,21,"Sem dinheiro!? Sinta a ira de Deus!") doPlayerAddHealth(cid,-hp) doPlayerAddHealth(cid,1) else end end return 0 end Esse não funciona nem rezando. O que será que falta? Alguém pode me ajudar? Agradeço muito a atenção :smile_positivo: Editado Janeiro 16, 2009 por Syphos Link para o comentário Compartilhar em outros sites More sharing options...
brainless 0 Postado Janeiro 19, 2009 Share Postado Janeiro 19, 2009 (editado) hauhauhauhau syphos e suas idéias mirabolantes.... espero q o ot fique legal com essas suas invenções malucas... o script não dá erro nenhum no console??? simplesmente não faz o q vc qr q faça?? duas coisas q eu notei... não chegam a ser erros... mas dariam um certo bug no seu ot: hp = getPlayerHealth(cid) [...] doPlayerAddHealth(cid,hp*2) suponhamos q meu char esteja life full com 1000 de life hp = 1000 doPlayerAddHealth(cid, 2000) eu iria levar uma bela buggada de 3000 de life... em ots melhor desenvolvidos, protegidos, isso não aconteceria... mas um bom script tem que barrar o máximo de falhas possível. Vamos ao reparo local vidaMaxima = getPlayerMaxHealth(cid) local vidaAgora = getPlayerHealth(cid) local diferenca = vidaMaxima - vidaAgora local recupera = vidaAgora * 2 if recupera > diferenca then recupera = diferenca end explicando caso1: 1000 de life, máximo 1000 de life vidaAgora = 1000 vidaMaxima = 1000 diferenca = 0 recupera = 2000 if 2000 > 0 then recupera = 0 end caso2: 600 de life, máximo 1000 de life vidaAgora = 600 vidaMaxima = 1000 diferenca = 400 recupera = 1200 if 1200 > 400 then recupera = 400 end caso3: 300 de life, máximo 1000 de life vidaAgora = 300 vidaMaxima = 1000 diferenca = 700 recupera = 600 if 600 > 700 (pula, recupera continua sendo 600) o erro no caso de não ter dinheiro, é um pouco mais grave.. uma vez que você mata o char, antes de deixá-lo com 1 de life... para isso... o 0+1 deve ser feito antes da function addHealth local punicao = vidaAgora - 1 doPlayerAddHealth(cid, punicao) complementando else só é necessário, quando há uma alternativa de escape.... em português pode ser traduzido como "se não" explicação se (1+1 = 2) então "vc é bom em matemática" senão "você foi reprovado! fim em negrito estão as traduções das expressões dentro de um if se não houver um "se não", ele pode ser descartado se (1+1 = 2) então enviar para área de bons em matemática fim acho que é isso.. espero ter ajudado em alguma coisa... caso não tenha solucionado o problema, fica alguma coisa pra aprendizado leve edição... dei uma 'enxugada' no seu código... pode ser até que dê certo.. quem sabe =D function onUse(cid, item, frompos, item2, topos) --PIGGY BANK DIZIMO BY SYPHOS-- local vidaMaxima = getPlayerMaxHealth(cid) local vidaAgora = getPlayerHealth(cid) local diferenca = vidaMaxima - vidaAgora local recupera = vidaAgora * 2 local punicao = vidaAgora - 1 if recupera > diferenca then recupera = diferenca end if item.uid == 6007 then semdinheiro = doPlayerRemoveMoney(cid,10000) if semdinheiro == 1 then doPlayerSendTextMessage(cid,22,"Obrigado! Deus te abençôe!") doPlayerAddHealth(cid,recupera) else doPlayerSendTextMessage(cid,21,"Sem dinheiro!? Sinta a ira de Deus!") doPlayerAddHealth(cid,-punicao) end end return 0 end Editado Janeiro 19, 2009 por brainless Link para o comentário Compartilhar em outros sites More sharing options...
WillChris 0 Postado Janeiro 19, 2009 Share Postado Janeiro 19, 2009 local punicao = vidaAgora - 1 Se eu tivesse com 3 de vida iria tirar 1 só...=';'= Eu continuaria vivo... Já tive problemas assim em meus scripts, não sei ao certo o que bugam eles...tinha que pegar aquele Yurots do Grafit que tinha script de kill, não estou achando ele aqui... Quem quiser resolver a nossa dúvida por favor se pronuncie ._. Link para o comentário Compartilhar em outros sites More sharing options...
brainless 0 Postado Janeiro 19, 2009 Share Postado Janeiro 19, 2009 local punicao = vidaAgora - 1 Se eu tivesse com 3 de vida iria tirar 1 só...=';'= Eu continuaria vivo... Já tive problemas assim em meus scripts, não sei ao certo o que bugam eles...tinha que pegar aquele Yurots do Grafit que tinha script de kill, não estou achando ele aqui... Quem quiser resolver a nossa dúvida por favor se pronuncie ._. eeeeiii!!! fugiu das aulas de matemática pra ficar jogando tibia??? vidaAgora = 3 punicao = 3 - 1 = 2 com esse script vai sobrar SEMPRE com 1 de life e eu fiz uma correçãozinha agora pq antes a punição tb tava adicionando life, agora ta certo =) Link para o comentário Compartilhar em outros sites More sharing options...
Syphos 0 Postado Janeiro 19, 2009 Autor Share Postado Janeiro 19, 2009 (editado) Vlw ein brainless! Sempre disposto a me ajudar =D Muito boa a explicação! Agora entendi pra q serve "else"! O significado em inglês eu até sabia, mas nunca consegui ligar ao script xD Olha, peguei o script q vc enxugou pra mim e deu esse erro no console: [19/01/2009 17:42:42] Lua Script Error: [Action Interface] [19/01/2009 17:42:42] data/actions/scripts/dizimo.lua:onUse [19/01/2009 17:42:42] data/actions/scripts/dizimo.lua:5: attempt to call global 'getPlayerMaxHealth' (a nil value) [19/01/2009 17:42:42] stack traceback: [19/01/2009 17:42:42] data/actions/scripts/dizimo.lua:5: in function <data/actions/scripts/dizimo.lua:1> Eu não lembro qual era o erro que dava antes, e nem adianta mais (vc achou uns "bugs" no script antigo). Mas eu acho que era alguma coisa com "nil value". Já aconteceu várias vezes dele dizer que não significa nada algum comando em outras tentativas minhas de script. Por que será? Tem alguma coisa a ver c/ o global.lua? Falta o código a ser interpretado como "getPlayerMaxHealth" nesse arquivo? É por isso que eu to comessando a gostar de programação: dá trabalho mas dá certo :smile_positivo: Flw! Editado Janeiro 19, 2009 por Syphos Link para o comentário Compartilhar em outros sites More sharing options...
brainless 0 Postado Janeiro 20, 2009 Share Postado Janeiro 20, 2009 (editado) Vlw ein brainless! Sempre disposto a me ajudar =DMuito boa a explicação! Agora entendi pra q serve "else"! O significado em inglês eu até sabia, mas nunca consegui ligar ao script xD Olha, peguei o script q vc enxugou pra mim e deu esse erro no console: Eu não lembro qual era o erro que dava antes, e nem adianta mais (vc achou uns "bugs" no script antigo). Mas eu acho que era alguma coisa com "nil value". Já aconteceu várias vezes dele dizer que não significa nada algum comando em outras tentativas minhas de script. Por que será? Tem alguma coisa a ver c/ o global.lua? Falta o código a ser interpretado como "getPlayerMaxHealth" nesse arquivo? É por isso que eu to comessando a gostar de programação: dá trabalho mas dá certo :smile_positivo: Flw! sua função getPlayerMaxHealth não existe =( vamos criá-la ^^ abra o global.lua e, lá embaixo, depois de tudo... adicione o código a seguir dofile("./config.lua") function getPlayerMaxHealth(cid) if sqlType == "mysql" then env = assert(luasql.mysql()) con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) else -- sqlite env = assert(luasql.sqlite3()) con = assert(env:connect(sqliteDatabase)) end local query = assert(con:execute("select `healthmax` from `players` where `id`="..cid)) local resp = query:fetch({},"a") con:close() env:close() query:close() return resp.healthmax end se meu código estiver certinho, o erro vai parar... se não vão aparecer 2 só lembrando que a gente desenvolve as idéias no próprio campo de respostas e, portanto, não foram testadas Editado Janeiro 20, 2009 por brainless Link para o comentário Compartilhar em outros sites More sharing options...
tibiaa4e 86 Postado Janeiro 20, 2009 Share Postado Janeiro 20, 2009 Assim Estamos no tfs não aries e ots porcos E pelo menos até a 7.92 a função de adicionar life n mata ele deixa sempre com 1 de life... DA um teste ai Link para o comentário Compartilhar em outros sites More sharing options...
brainless 0 Postado Janeiro 20, 2009 Share Postado Janeiro 20, 2009 AssimEstamos no tfs não aries e ots porcos E pelo menos até a 7.92 a função de adicionar life n mata ele deixa sempre com 1 de life... DA um teste ai é aí q tá... um bom script, programa, extensão planeja todas as falhas e arestas que possam vir a ocorrer... se um ot não necessita da proteção para o script não matar, e outro necessita, deixamos o script com a proteção, assim o script se torna mais flexível e abrange uma gama maior de distros. é um hábito que, quem tem deve manter e quem não tem deve adquirir. Link para o comentário Compartilhar em outros sites More sharing options...
Syphos 0 Postado Janeiro 20, 2009 Autor Share Postado Janeiro 20, 2009 (editado) Deu o seguinte erro: [20/01/2009 16:17:10] Lua Script Error: [Action Interface] [20/01/2009 16:17:10] data/actions/scripts/dizimo.lua:onUse [20/01/2009 16:17:10] data/global.lua:693: LuaSQL: there are open cursors [20/01/2009 16:17:10] stack traceback: [20/01/2009 16:17:10] [C]: in function 'close' [20/01/2009 16:17:10] data/global.lua:693: in function 'getPlayerMaxHealth' [20/01/2009 16:17:10] data/actions/scripts/dizimo.lua:5: in function <data/actions/scripts/dizimo.lua:1> Estranho que no OT, ao usar o porquinho, não veio a mensagem "Sorry, not possible." ou "You can not use this object." :neutral: Editado Janeiro 20, 2009 por Syphos Link para o comentário Compartilhar em outros sites More sharing options...
brainless 0 Postado Janeiro 20, 2009 Share Postado Janeiro 20, 2009 (editado) cara... se for isso eu me mato hauhauhauhauhauha apague a linha "query:close()" se não der certo, apague as duas acima também... (tudo q termina com close()) PS.: SOMENTE se funcionar apagando todos os close(), adicione um local antes de env e con ficando assim local env = assert bla bla bla local con = assert bla bla bla assim evita que, se algum outro script precisar acessar a base sql dê conflitos por uma variável ja aberta Editado Janeiro 20, 2009 por brainless Link para o comentário Compartilhar em outros sites More sharing options...
Syphos 0 Postado Janeiro 20, 2009 Autor Share Postado Janeiro 20, 2009 (editado) Xiiii... Nem funfô... Não sei se foi hagada minha (deve ter sido) mas eu apaguei o finalzinho (tudo que terminava c/ "close()") e coloquei no lugar o que vc passou, mas deu um monte de erro xD Se pode passar a parte que eu deveria acrescentar completa por favor? Aí eu vejo se eu fiz errado. A lista dos erros que deu foi imensa, mas vou passar só o começo (começou a dar erro em td ). [20/01/2009 20:16:43] Lua Script Error: [Action Interface] [20/01/2009 20:16:43] data/actions/scripts/other/fluids.lua [20/01/2009 20:16:43] luaCreateConditionObject(). Condition not found [20/01/2009 20:16:43] Lua Script Error: [Action Interface] [20/01/2009 20:16:43] data/actions/scripts/other/fluids.lua [20/01/2009 20:16:43] luaSetConditionParam(). Condition not found [20/01/2009 20:16:43] Lua Script Error: [Action Interface] [20/01/2009 20:16:43] data/actions/scripts/other/fluids.lua [20/01/2009 20:16:43] luaCreateConditionObject(). Condition not found [20/01/2009 20:16:43] Lua Script Error: [Action Interface] [20/01/2009 20:16:43] data/actions/scripts/other/fluids.lua E é melhor dar o fim que foi um pouquinho diferente: [20/01/2009 20:16:47] luaCreateConditionObject(). Condition not found [20/01/2009 20:16:47] Lua Script Error: [MoveEvents Interface] [20/01/2009 20:16:47] data/movements/scripts/drowning.lua [20/01/2009 20:16:47] luaSetConditionParam(). Condition not found [20/01/2009 20:16:47] Lua Script Error: [MoveEvents Interface] [20/01/2009 20:16:47] data/movements/scripts/drowning.lua [20/01/2009 20:16:47] luaSetConditionParam(). Condition not found [20/01/2009 20:16:47] Lua Script Error: [MoveEvents Interface] [20/01/2009 20:16:47] data/movements/scripts/drowning.lua [20/01/2009 20:16:47] luaSetConditionParam(). Condition not found [20/01/2009 20:16:47] Warning: [LuaScriptInterface::initState] Can not load data/global.lua. [20/01/2009 20:16:47] Warning: [LuaScriptInterface::initState] Can not load data/global.lua. [20/01/2009 20:16:47] Warning: [LuaScriptInterface::initState] Can not load data/global.lua. [20/01/2009 20:16:47] Reloaded all. Editado Janeiro 21, 2009 por Syphos Link para o comentário Compartilhar em outros sites More sharing options...
brainless 0 Postado Janeiro 21, 2009 Share Postado Janeiro 21, 2009 (editado) tipow... vc tentou apagar APENAS a linha query:close() ??? xeu explicar.. essa funciton getPlayerMaxHealth que a gnt criou... lê no banco de dados, a coluna HEALTHMAX de determinado player... e joga no RETURN.. da função, o valor encontrado... MAAAAAAAAAAAS... pra montar essa função.. eu fiz um mix de uma função que vi aqui no xtibia com a função que aprendi extermanente... pra resumir.. na function que vi no xtibia, não é necessário fechar a query:close() na função externa é.... por isso que pedi que vc apagasse apenas essa linha. explicação dos erros... várias functions como isPlayer, isSorcerer, isDruid, isPremmium, isPromoted fazem referência direta ou indiretamente à base de dados, seja por comandos declarados dentro destas funções, ou por comandos externos exemplo de isSorcerer: abre o banco de dadosseleciona a linha no banco que contém o ID do player (cid) procura a coluna VOCATION if vocation == 1 or vocation == 5 then return true else return false end quando vc não fecha as conexões com o banco de dados (apagando as env:close con:close), quando alguma outra função que precisar ler o banco for chamada, retornará um erro... que o banco já está em uso por outra função por isso que eu pedi o primeiro passo, que apagasse APENAS a query:close() para consertar... volte as linhas: con:close() env:close() e não desista antes de tentar mais um pouco =) a função getPlayerMaxHealth pode ser necessária no futuro, quem sabe Editado Janeiro 21, 2009 por brainless Link para o comentário Compartilhar em outros sites More sharing options...
guilhermes26 26 Postado Janeiro 21, 2009 Share Postado Janeiro 21, 2009 Cara, eu não sei qual o problemas, mas parabéns pela criatividade em fazer um scripts desses Link para o comentário Compartilhar em outros sites More sharing options...
Syphos 0 Postado Janeiro 21, 2009 Autor Share Postado Janeiro 21, 2009 É =/ O grande problema é que eu tentei tirando só a "query:close()" antes. Me desculpa se eu demoro pra dar um retorno das suas dicas aí. É que eu to no meio de processo de inscrição em escola (concursos e vestibulinhos do ano passado) e to meio sem tempo... De qualquer forma, vou tentar só tirando a "query:close()" novamente. Posto as novidades o mais rápido possível! Vlw! =D Link para o comentário Compartilhar em outros sites More sharing options...
brainless 0 Postado Janeiro 21, 2009 Share Postado Janeiro 21, 2009 (editado) desisti de ficar só no imaginativo e parti pro prático... comecei a testar exaustivamente aqui e cheguei à uma conclusão...sua(nossas) distros não possuem as funções getPlayerHealth e getPlayerMaxHealth, aí eu fui criar pra vocêtestei, testei, testei e consegui fazer com que ela retornasse um resultado PORÉM.... como o script que eu fiz faz acesso ao banco sql e o mesmo só é atualizado no Logout, o que acontece....suponhamos que o player tá lvl 8 - 185 de lifese ele upar 2 lvl como sorc - 195 de lifesó que ele não logou ainda... então nessa função que eu criei, ele retornaria sempre 185 de lifetem duas saídas1 - criar um event onKill que sempre q o player mata um monstro, verifica se subiu de lvl e atualiza o banco de dados.. é extenso mas eu faria de bom grado pra você... ponto negativo... você não poderia fazer, por ex quests de AddExp2 - modificar na source e criar as funções PlayerHealth e PlayerMaxHealth HAUHAUHAUHAUHAUHAUHAUAHUAHUAHUAHAUHAUHAUHAUHAUHAUAHUesquece TUDO que eu faleiabre o globals.lua e apaga a nossa getPlayerMaxHealth()tudo q foi editadoagora vai no script do porquinho e troca onde tá getPlayerHealth(cid) e getPlayerMaxHealth(cid) por:getCreatureHealth(cid) e getCreatureMaxHealth(cid)cara.. vc n imagina o qto eu ri qnd achei essas funções no lua_functions ahuhauahuascript final: function onUse(cid, item, frompos, item2, topos) --PIGGY BANK DIZIMO BY SYPHOS-- local vidaMaxima = getCreatureMaxHealth(cid) local vidaAgora = getCreatureHealth(cid) local diferenca = vidaMaxima - vidaAgora local recupera = vidaAgora * 2 local punicao = vidaAgora - 1 if recupera > diferenca then recupera = diferenca end if item.uid == 6007 then semdinheiro = doPlayerRemoveMoney(cid,10000) if semdinheiro == 1 then doPlayerSendTextMessage(cid,22,"Obrigado! Deus te abençôe!") doPlayerAddHealth(cid,recupera) else doPlayerSendTextMessage(cid,21,"Sem dinheiro!? Sinta a ira de Deus!") doPlayerAddHealth(cid,-punicao) end end return 0 end Editado Janeiro 21, 2009 por brainless Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados