Ir para conteúdo

[action]dízimo


Syphos

Posts Recomendados

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 por Syphos
Link para o comentário
Compartilhar em outros sites

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 por brainless
Link para o comentário
Compartilhar em outros sites

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

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

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 por Syphos
Link para o comentário
Compartilhar em outros sites

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:

 

 

 

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 :blush:

só lembrando que a gente desenvolve as idéias no próprio campo de respostas e, portanto, não foram testadas

Editado por brainless
Link para o comentário
Compartilhar em outros sites

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

 

é 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

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 por Syphos
Link para o comentário
Compartilhar em outros sites

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 por brainless
Link para o comentário
Compartilhar em outros sites

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 :surprised: ).

 

 

[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 por Syphos
Link para o comentário
Compartilhar em outros sites

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 dados

seleciona 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 por brainless
Link para o comentário
Compartilhar em outros sites

É =/

 

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

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 life
se ele upar 2 lvl como sorc - 195 de life

só que ele não logou ainda... então nessa função que eu criei, ele retornaria sempre 185 de life

tem duas saídas

1 - 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 AddExp

2 - modificar na source e criar as funções PlayerHealth e PlayerMaxHealth


HAUHAUHAUHAUHAUHAUHAUAHUAHUAHUAHAUHAUHAUHAUHAUHAUAHU
esquece TUDO que eu falei


abre o globals.lua e apaga a nossa getPlayerMaxHealth()

tudo q foi editado


agora 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 ahuhauahua



script 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 por brainless
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...