Ir para conteúdo
  • Cadastre-se

Derivado HELP Criaturescript incompleto ajudem completar


Posts Recomendados

2 horas atrás, dominus disse:

Esse error se deu por causa da função isCreature(monster) que está retornando um valor falso, ou seja, não é um monstro que está na variável "monster" da função. 

 

No caso dele estar sumindo quando morto, deva ser devido o programador ter feito a função "ondeath()" igual à "onpreparedeath ()" essa em questão trata sobre como se dá a morte da criatura.

 

Como você mesmo testou, ela funciona em outros servidores menos editados.

Infelizmente é um impedimento te ajudar nessa questão. 

Eu não saberia dizer se esse error acontece exatamente devido a isso.

A base para o que tu queres, já foi feito, agora é só ir adaptando da forma que pra ti sejas mais satisfatório. 

 

 

ok obrigado, rep + pra você  axo que vou desistir disso

2 horas atrás, dominus disse:

Esse error se deu por causa da função isCreature(monster) que está retornando um valor falso, ou seja, não é um monstro que está na variável "monster" da função. 

 

No caso dele estar sumindo quando morto, deva ser devido o programador ter feito a função "ondeath()" igual à "onpreparedeath ()" essa em questão trata sobre como se dá a morte da criatura.

 

Como você mesmo testou, ela funciona em outros servidores menos editados.

Infelizmente é um impedimento te ajudar nessa questão. 

Eu não saberia dizer se esse error acontece exatamente devido a isso.

A base para o que tu queres, já foi feito, agora é só ir adaptando da forma que pra ti sejas mais satisfatório. 

 

 

olha encontrei este script que afeta todos os pokemons sera q pode ser nele o erro?
wildpokemon.lua afeta todos os pokemons selvagens
 

Spoiler

function onAttack(cid, target)

    if isSummon(target) and getDistanceBetween(getThingPos(target), getThingPos(getCreatureMaster(target))) > 1 then
            doMonsterSetTarget(cid, getCreatureMaster(target))
    elseif isPlayer(target) and #getCreatureSummons(target) > 0 then
            for _, summon in pairs(getCreatureSummons(target)) do
                    if getDistanceBetween(getThingPos(target), getThingPos(summon)) <= 1 then
                            doMonsterSetTarget(cid, summon)
                            break
                    end
            end
    end
    
return true
end

function onThink(cid, interval)

doSendAnimatedText(getThingPos(cid), getPlayerStorageValue(cid, 1008).."/"..getPlayerStorageValue(cid, 1009).."", COLOR_GRASS)

end

function onDirection(cid)

    if isSleeping(cid) or isParalyze(cid) then
    return false
    end

    if getPlayerStorageValue(cid, 446) >= 1 then
    return false
    end

    if isSummon(cid) and isCreature(getCreatureTarget(cid)) and not isSleeping(cid) and not isParalyze(cid) then
    return true
    end

    if getCreatureSpeed(cid) == 0 then
    return false
    end

    if isPassive(cid) and getCreatureSpeed(cid) ~= 1 then
    return false
    end

return true
end

function onCast(cid, target)

    if isSleeping(cid) then
    return false
    end

    if getCreatureCondition(cid, CONDITION_INVISIBLE) and not isGhostPokemon(cid) then
    return false
    end

return true
end

tive que voltar aqui pra te dizer isso
nesse script ganha o premio quem mata o monstro
no caso do tibia o proprio jogador mata mas no pokemon quem mata não é o jogador mas sim seu sumoner
sera esse o problema?
não é um monstro nem um jogador mas sim um sumoner
voutei no tibia e testei matando com summoner e é isso mesmo não ganha nada
a questão aqui é que o sumoner é quem mata e n o player

Editado por wevertonvrb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Respostas 60
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

@xWhiteWolf me ajuda aqui mano http://www.tibiaking.com/forum/topic/67062-subir-escada-bug/#comment-385003

Esse error se deu por causa da função isCreature(monster) que está retornando um valor falso, ou seja, não é um monstro que está na variável "monster" da função.    No caso dele estar sumind

Fiz uma modificação no script:     Ps: muda "isplayeron ()" por: "getCreatureName ()"

15 horas atrás, wevertonvrb disse:

ok obrigado, rep + pra você  axo que vou desistir disso

olha encontrei este script que afeta todos os pokemons sera q pode ser nele o erro?
wildpokemon.lua afeta todos os pokemons selvagens
 

  Mostrar conteúdo oculto

function onAttack(cid, target)

    if isSummon(target) and getDistanceBetween(getThingPos(target), getThingPos(getCreatureMaster(target))) > 1 then
            doMonsterSetTarget(cid, getCreatureMaster(target))
    elseif isPlayer(target) and #getCreatureSummons(target) > 0 then
            for _, summon in pairs(getCreatureSummons(target)) do
                    if getDistanceBetween(getThingPos(target), getThingPos(summon)) <= 1 then
                            doMonsterSetTarget(cid, summon)
                            break
                    end
            end
    end
    
return true
end

function onThink(cid, interval)

doSendAnimatedText(getThingPos(cid), getPlayerStorageValue(cid, 1008).."/"..getPlayerStorageValue(cid, 1009).."", COLOR_GRASS)

end

function onDirection(cid)

    if isSleeping(cid) or isParalyze(cid) then
    return false
    end

    if getPlayerStorageValue(cid, 446) >= 1 then
    return false
    end

    if isSummon(cid) and isCreature(getCreatureTarget(cid)) and not isSleeping(cid) and not isParalyze(cid) then
    return true
    end

    if getCreatureSpeed(cid) == 0 then
    return false
    end

    if isPassive(cid) and getCreatureSpeed(cid) ~= 1 then
    return false
    end

return true
end

function onCast(cid, target)

    if isSleeping(cid) then
    return false
    end

    if getCreatureCondition(cid, CONDITION_INVISIBLE) and not isGhostPokemon(cid) then
    return false
    end

return true
end

tive que voltar aqui pra te dizer isso
nesse script ganha o premio quem mata o monstro
no caso do tibia o proprio jogador mata mas no pokemon quem mata não é o jogador mas sim seu sumoner
sera esse o problema?
não é um monstro nem um jogador mas sim um sumoner
voutei no tibia e testei matando com summoner e é isso mesmo não ganha nada
a questão aqui é que o sumoner é quem mata e n o player

 

 

 

Já fiz o script pensando em summon, na qual o ataque é cogitado como se fosse o player.

 

Estive eu testando a fundo o sistema tentando encontrar um possível "bug", acabei encontrando uma falha que pode causar erro.

 

O que acontece? A variável "M" fica com os valores alocados dos players atacantes, mas ao matar a criatura, o certo seria remove essa informação para caso, venha a matar de novo, seus valores anteriores não estejam mais salvos.

 

No caso toda vez que alguém receber seu item, deveria ser retirado seus dados da variável:

Citar

if(getDamageInMonster(cid,player) > 50)then

-- adiciona o item ao player

table.remove (M, player)

-- assim ele retira os dados do player da tabela "M"

 

O script já foi feito pensando em summons:

 

Citar

if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player 

 

Link para o post
Compartilhar em outros sites
4 horas atrás, dominus disse:

Já fiz o script pensando em summon, na qual o ataque é cogitado como se fosse o player.

 

Estive eu testando a fundo o sistema tentando encontrar um possível "bug", acabei encontrando uma falha que pode causar erro.

 

O que acontece? A variável "M" fica com os valores alocados dos players atacantes, mas ao matar a criatura, o certo seria remove essa informação para caso, venha a matar de novo, seus valores anteriores não estejam mais salvos.

 

No caso toda vez que alguém receber seu item, deveria ser retirado seus dados da variável:

 

O script já foi feito pensando em summons:

 

 

sim, mas teste no seu servidor matando com um sumoner para você ver, se voce matar com sumoner no tibia não ganha o item eu ja fiz esse teste, sumonei um demon skeleton e matei o monstro em questão com ele e não ganhei nada

ou seja no tibia que testei (se matar com player tudo ok, mas se eu sumonar e matar com sumoner não funciona)

acho que pra dar certo tem que deixar o único atacante como sumoner pois monstro nem player ataca



outra coisa

de repente começou a gerar um erro que não estava gerando
ERROR
 

Spoiler

[13/02/2016 13:20:38] [Error - CreatureScript Interface]
[13/02/2016 13:20:38] data/creaturescripts/scripts/kill.lua:onDeath
[13/02/2016 13:20:38] Description:
[13/02/2016 13:20:38] data/creaturescripts/scripts/stats.lua:9: function getDamageInMonster(): variavel monster nao e monstro.
[13/02/2016 13:20:38] stack traceback:
[13/02/2016 13:20:38]     [C]: in function 'error'
[13/02/2016 13:20:38]     data/creaturescripts/scripts/stats.lua:9: in function 'getDamageInMonster'
[13/02/2016 13:20:38]     data/creaturescripts/scripts/kill.lua:8: in function <data/creaturescripts/scripts/kill.lua:5>

a unica mudança que fiz no script ou adicionar isso
table.remove (M, player)

e mesmo que eu retire essa parte o erro continua
vou ate postar o script aqui novamente
kill

Spoiler

--[[
   autor = Marcryzius
   data = sexta-feira, 05 de fevereiro de 2016
   ]]
function onDeath(cid, corpse, deathList)
for _,player in pairs(deathList) do
   if(isPlayer(player) and getCreatureName(player))then
      if(getDamageInMonster(cid,player) > 50)then
      doPlayerAddItem(player, 2160, 10)
      table.remove (M, player)
      end
   end
end
return true
end 


stats

Spoiler

 --[[
   autor = Marcryzius
   data = sexta-feira, 05 de fevereiro de 2016
   ]]
local M = {}
function getDamageInMonster(monster,cid)
local monster,cid,m_life,p_dano = tonumber(monster),tonumber(cid),0,0
if not(monster or cid)then return 0,error('function getDamageInMonster(): monster or cid, not number') end
if not(isCreature(monster))then return 0,error('function getDamageInMonster(): variavel monster nao e monstro.') end
   for k,v in pairs(M[monster]) do
      if(k == cid)then p_dano = v end
      m_life = m_life + v
   end
   return math.floor(p_dano/(m_life/100))
end

function onStatsChange(cid, attacker, tipo, combat, value)
local atac = attacker
if not(M[cid])then M[cid] = {} end
if not(tipo == 1)then return true end

   if(isPlayer(attacker))then
      if not(M[cid][attacker])then M[cid][attacker] = 0   end
      M[cid][attacker] = M[cid][attacker] + value
   elseif(isMonster(attacker))then -- caso seja um monstro o atacante
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando
      atac = get
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player
         if not(M[cid][get])then M[cid][get] = 0   end
         M[cid][get] = M[cid][get] + value
      end
   end
   return true
end

 

Editado por wevertonvrb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
1 hora atrás, wevertonvrb disse:

sim, mas teste no seu servidor matando com um sumoner para você ver, se voce matar com sumoner no tibia não ganha o item eu ja fiz esse teste, sumonei um demon skeleton e matei o monstro em questão com ele e não ganhei nada

ou seja no tibia que testei (se matar com player tudo ok, mas se eu sumonar e matar com sumoner não funciona)



outra coisa

de repente começou a gerar um erro que não estava gerando
ERROR
 

  Ocultar conteúdo

[13/02/2016 13:20:38] [Error - CreatureScript Interface]
[13/02/2016 13:20:38] data/creaturescripts/scripts/kill.lua:onDeath
[13/02/2016 13:20:38] Description:
[13/02/2016 13:20:38] data/creaturescripts/scripts/stats.lua:9: function getDamageInMonster(): variavel monster nao e monstro.
[13/02/2016 13:20:38] stack traceback:
[13/02/2016 13:20:38]     [C]: in function 'error'
[13/02/2016 13:20:38]     data/creaturescripts/scripts/stats.lua:9: in function 'getDamageInMonster'
[13/02/2016 13:20:38]     data/creaturescripts/scripts/kill.lua:8: in function <data/creaturescripts/scripts/kill.lua:5>

a unica mudança que fiz no script ou adicionar isso
table.remove (M, player)

e mesmo que eu retire essa parte o erro continua
vou ate postar o script aqui novamente
kill

  Ocultar conteúdo

--[[
   autor = Marcryzius
   data = sexta-feira, 05 de fevereiro de 2016
   ]]
function onDeath(cid, corpse, deathList)
for _,player in pairs(deathList) do
   if(isPlayer(player) and getCreatureName(player))then
      if(getDamageInMonster(cid,player) > 50)then
      doPlayerAddItem(player, 2160, 10)
      table.remove (M, player)
      end
   end
end
return true
end 


stats

  Ocultar conteúdo

 --[[
   autor = Marcryzius
   data = sexta-feira, 05 de fevereiro de 2016
   ]]
local M = {}
function getDamageInMonster(monster,cid)
local monster,cid,m_life,p_dano = tonumber(monster),tonumber(cid),0,0
if not(monster or cid)then return 0,error('function getDamageInMonster(): monster or cid, not number') end
if not(isCreature(monster))then return 0,error('function getDamageInMonster(): variavel monster nao e monstro.') end
   for k,v in pairs(M[monster]) do
      if(k == cid)then p_dano = v end
      m_life = m_life + v
   end
   return math.floor(p_dano/(m_life/100))
end

function onStatsChange(cid, attacker, tipo, combat, value)
local atac = attacker
if not(M[cid])then M[cid] = {} end
if not(tipo == 1)then return true end

   if(isPlayer(attacker))then
      if not(M[cid][attacker])then M[cid][attacker] = 0   end
      M[cid][attacker] = M[cid][attacker] + value
   elseif(isMonster(attacker))then -- caso seja um monstro o atacante
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando
      atac = get
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player
         if not(M[cid][get])then M[cid][get] = 0   end
         M[cid][get] = M[cid][get] + value
      end
   end
   return true
end

 

 

 

 

 

Esse erro não era para acontecer pois a função ondeath () está associada ao monstro, ou seja, apenas ele deveria executar esse script, se for ele que esteja - somente ele - executando esse script, então sua função iscreature () deva estar retornando um valor falso para que isso ocorra.

 

Vou testar usando apenas summons como você descreveu.

Link para o post
Compartilhar em outros sites
11 minutos atrás, dominus disse:

 

Esse erro não era para acontecer pois a função ondeath () está associada ao monstro, ou seja, apenas ele deveria executar esse script, se for ele que esteja - somente ele - executando esse script, então sua função iscreature () deva estar retornando um valor falso para que isso ocorra.

 

Vou testar usando apenas summons como você descreveu.

outra coisa que eu vi na sua explicação  ali que pode estar também causando o erro
você colocou para  quando monstro, prayer e sumoner atacar nessa parte
 

Spoiler

  elseif(isMonster(attacker))then -- caso seja um monstro o atacante
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando
      atac = get
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player
         if not(M[cid][get])then M[cid][get] = 0   end
         M[cid][get] = M[cid][get] + value
      end
   end

no pokémon nem monstro nem player atacam os únicos atacantes são os summons dos players

Editado por wevertonvrb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
2 horas atrás, wevertonvrb disse:

outra coisa que eu vi na sua explicação  ali que pode estar também causando o erro
você colocou para  quando monstro, prayer e sumoner atacar nessa parte
 

  Ocultar conteúdo

  elseif(isMonster(attacker))then -- caso seja um monstro o atacante
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando
      atac = get
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player
         if not(M[cid][get])then M[cid][get] = 0   end
         M[cid][get] = M[cid][get] + value
      end
   end

no pokémon nem monstro nem player atacam os únicos atacantes são os summons dos players

 

 

 

 

Sim, está certo dessa forma.

 

Veja bem; um Pokemon - creio eu - é um monstro, um monstro summonado por alguem, então ele averigua isso seguinte esses passos:

 

Primeiro: é um monstro?

Segundo: é um monstro summonado, se sim, quem o summonou?

Terceiro: quem o summonou é um player?

 

Se tudo isso for verdadeiro, então ele armazena essa informação na tabela no local do player dono do summon.

 

Eu ainda não testei, pois estou no trabalho, mas creio que esteja certo dessa forma.

 

Link para o post
Compartilhar em outros sites
1 minuto atrás, dominus disse:

 

Sim, está certo dessa forma.

 

Veja bem; um Pokemon - creio eu - é um monstro, um monstro summonado por alguem, então ele averigua isso seguinte esses passos:

 

Primeiro: é um monstro?

Segundo: é um monstro summonado, se sim, quem o summonou?

Terceiro: quem o summonou é um player?

 

Se tudo isso for verdadeiro, então ele armazena essa informação na tabela no local do player dono do summon.

 

Eu ainda não testei, pois estou no trabalho, mas creio que esteja certo dessa forma.

 

entendo, unica certeza que tenho é que não esta dando certo por ser um summon quem esta matando o boss, ate mesmo no servidor de tibia que tinha dado certo quando se mata com summon não funciona

Link para o post
Compartilhar em outros sites
2 horas atrás, wevertonvrb disse:

outra coisa que eu vi na sua explicação  ali que pode estar também causando o erro
você colocou para  quando monstro, prayer e sumoner atacar nessa parte
 

  Ocultar conteúdo

  elseif(isMonster(attacker))then -- caso seja um monstro o atacante
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando
      atac = get
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player
         if not(M[cid][get])then M[cid][get] = 0   end
         M[cid][get] = M[cid][get] + value
      end
   end

no pokémon nem monstro nem player atacam os únicos atacantes são os summons dos players

 

 

 

 

Eu entendi bem? Então quer dizer que os pokemons são meros monstros que brigão sem intervenção dos players?

Link para o post
Compartilhar em outros sites
1 minuto atrás, dominus disse:

 

Sim, está certo dessa forma.

 

Veja bem; um Pokemon - creio eu - é um monstro, um monstro summonado por alguem, então ele averigua isso seguinte esses passos:

 

Primeiro: é um monstro?

Segundo: é um monstro summonado, se sim, quem o summonou?

Terceiro: quem o summonou é um player?

 

Se tudo isso for verdadeiro, então ele armazena essa informação na tabela no local do player dono do summon.

 

Eu ainda não testei, pois estou no trabalho, mas creio que esteja certo dessa forma.

 

entendo, unica certeza que tenho é que não esta dando certo por ser um summon quem esta matando o boss, ate mesmo no servidor de tibia que tinha dado certo quando se mata com summon não funciona

Link para o post
Compartilhar em outros sites
2 horas atrás, wevertonvrb disse:

outra coisa que eu vi na sua explicação  ali que pode estar também causando o erro
você colocou para  quando monstro, prayer e sumoner atacar nessa parte
 

  Ocultar conteúdo

  elseif(isMonster(attacker))then -- caso seja um monstro o atacante
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando
      atac = get
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player
         if not(M[cid][get])then M[cid][get] = 0   end
         M[cid][get] = M[cid][get] + value
      end
   end

no pokémon nem monstro nem player atacam os únicos atacantes são os summons dos players

 

 

 

 

Eu entendi bem? Então quer dizer que os pokemons são meros monstros que brigão sem intervenção dos players?

2 horas atrás, wevertonvrb disse:

outra coisa que eu vi na sua explicação  ali que pode estar também causando o erro
você colocou para  quando monstro, prayer e sumoner atacar nessa parte
 

  Ocultar conteúdo

  elseif(isMonster(attacker))then -- caso seja um monstro o atacante
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando
      atac = get
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player
         if not(M[cid][get])then M[cid][get] = 0   end
         M[cid][get] = M[cid][get] + value
      end
   end

no pokémon nem monstro nem player atacam os únicos atacantes são os summons dos players

 

 

 

 

Eu entendi bem? Então quer dizer que os pokemons são meros monstros que brigão sem intervenção dos players?

Link para o post
Compartilhar em outros sites
1 hora atrás, dominus disse:

 

Eu entendi bem? Então quer dizer que os pokemons são meros monstros que brigão sem intervenção dos players?

 

Eu entendi bem? Então quer dizer que os pokemons são meros monstros que brigão sem intervenção dos players?

os selvagens sim, os capturados o player tem q usar magias mas quem solta as magias são os summons, mas de toda forma
a questão do erro esta nos summons quando tu chegar em casa voce pode testar

Editado por wevertonvrb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Fiz uma modificação no script:

Citar

--[[Marcryzius D'evil]]-- 

function onDeath(cid, corpse, deathList) 
   for _,player in pairs(deathList) do 
   local player = isCreature(player) and getCreatureMaster(player) or player 
      if(isPlayer(player) and isPlayerOn(player))then 
         if(getDamageInMonster(cid,player) > 50)then 
         -- adicione novos valores 
         end 
         if(M[player])then table.remove(M,player) end 
      else 
         print(getCreatureName(player) or 'nil') 
      end 
   end 
   return true 
end 
 

 

2 horas atrás, wevertonvrb disse:

os selvagens sim, os capturados o player tem q usar magias mas quem solta as magias são os summons, mas de toda forma
a questão do erro esta nos summons quando tu chegar em casa voce pode testar

 

 

 

 

Ps: muda "isplayeron ()" por: "getCreatureName ()"

Editado por dominus (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
5 horas atrás, dominus disse:

Fiz uma modificação no script:

 

 

Ps: muda "isplayeron ()" por: "getCreatureName ()"

 

 

 

deu este erro, poque sera q comessou a dar este erro apenas hoje?

Spoiler

[13/02/2016 23:23:18] [Error - CreatureScript Interface]
[13/02/2016 23:23:19] data/creaturescripts/scripts/kill.lua:onDeath
[13/02/2016 23:23:19] Description:
[13/02/2016 23:23:19] data/creaturescripts/scripts/stats.lua:9: function getDamageInMonster(): variavel monster nao e monstro.
[13/02/2016 23:23:19] stack traceback:
[13/02/2016 23:23:19]     [C]: in function 'error'
[13/02/2016 23:23:19]     data/creaturescripts/scripts/stats.lua:9: in function 'getDamageInMonster'
[13/02/2016 23:23:19]     data/creaturescripts/scripts/kill.lua:9: in function <data/creaturescripts/scripts/kill.lua:5>

 

Editado por wevertonvrb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
17 horas atrás, wevertonvrb disse:

deu este erro, poque sera q comessou a dar este erro apenas hoje?

  Ocultar conteúdo

[13/02/2016 23:23:18] [Error - CreatureScript Interface]
[13/02/2016 23:23:19] data/creaturescripts/scripts/kill.lua:onDeath
[13/02/2016 23:23:19] Description:
[13/02/2016 23:23:19] data/creaturescripts/scripts/stats.lua:9: function getDamageInMonster(): variavel monster nao e monstro.
[13/02/2016 23:23:19] stack traceback:
[13/02/2016 23:23:19]     [C]: in function 'error'
[13/02/2016 23:23:19]     data/creaturescripts/scripts/stats.lua:9: in function 'getDamageInMonster'
[13/02/2016 23:23:19]     data/creaturescripts/scripts/kill.lua:9: in function <data/creaturescripts/scripts/kill.lua:5>

 

 

 

 

Esse é o tipo de erro que não deveria existir, pois o script está sendo chamado pelo monstro, ou seja, é um monstro.

 

A única explicação plausível para isso é a função (iscreature) não reconhecer um pokemon como criatura ou, essa função deva estar sendo chamada de uma forma genérica, ou seja, independente de adicionar evento a um determinado "ser" ele está executando de uma forma geral.

Outra possibilidade, seja a função iscreature() que não esteja reconhecendo o número de identificação do "ser".

 

Link para o post
Compartilhar em outros sites
17 horas atrás, dominus disse:

Esse é o tipo de erro que não deveria existir, pois o script está sendo chamado pelo monstro, ou seja, é um monstro.

 

A única explicação plausível para isso é a função (iscreature) não reconhecer um pokemon como criatura ou, essa função deva estar sendo chamada de uma forma genérica, ou seja, independente de adicionar evento a um determinado "ser" ele está executando de uma forma geral.

Outra possibilidade, seja a função iscreature() que não esteja reconhecendo o número de identificação do "ser".

 

man sei q é pedir d+ mas seria possível você baixar o servidor que eu uso como base e adaptar a ele esse script pra mim?
eu estou disposto a te pagar por isso

Link para o post
Compartilhar em outros sites
1 hora atrás, wevertonvrb disse:

man sei q é pedir d+ mas seria possível você baixar o servidor que eu uso como base e adaptar a ele esse script pra mim?
eu estou disposto a te pagar por isso

 

Qual o servidor que você usa?

Link para o post
Compartilhar em outros sites

vou baixar, mas te peço um tempo para resolver seu problema, pois agora que inicia as aulas, vou ter menos tempo pra ficar no pc.

Link para o post
Compartilhar em outros sites
17 horas atrás, wevertonvrb disse:

tudo bem

 

Ot pokemon � bem estranho. 
Fiz algumas modifica��es para funcionar no ot pokemon, como � no-pvp, ent�o algumas linhas do script n�o s�o necessarias. 
Atualiza todos os scripts. 

 

 

Insere em; creaturescripts>kill.lua: 

--[[Marcryzius D'evil]]-- 
function onDeath(cid, corpse, deathList) 
   for _,player in pairs(deathList) do 
   local player = isMonster(player) and getCreatureMaster(player) or player 
      if(isPlayer(player))then 
         if(getDamageInMonster(cid,player) > 50)then 
            --doPlayerAddItem(player,itemid,quant) 
         end 
         if(M[player])then table.remove(M,player) end 
      end 
   end 
   return true 
end 

 

 

A maior diferen�a entre esse script do kill.lua para o que eu te mandei, � a falta da senten�a "if not( isCreature()) then" que estava gerando o erro. 
Bem como n�o d� - pelo menos eu n�o consegui atacar players (se bem que eu levei duas horas para entender como summonar um pokemon) - para atacar players, ent�o n�o faz necessario saber se � criatura. 

 

 

Insere em; creaturescripts>stats.lua: 
--[[ 
   autor = Marcryzius 
   data = sexta-feira, 05 de fevereiro de 2016 
   query para ser adicionada no monstro: 
   <script> 
      <event name = "stats"/> 
      <event name = "deathMonster"/> 
   </script> 
]] 

function onStatsChange(cid, attacker, tipo, combat, value) 
local atac = attacker 
if not(M[cid])then M[cid] = {} end 
if not(tipo == 1)then return true end 

   if(isPlayer(attacker))then 
      if not(M[cid][attacker])then M[cid][attacker] = 0   end 
      M[cid][attacker] = M[cid][attacker] + value 
   elseif(isMonster(attacker))then -- caso seja um monstro o atacante 
   local get = getCreatureMaster(attacker) -- averigua se n�o � um summon que est� atacando 
      atac = get 
      if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player 
         if not(M[cid][get])then M[cid][get] = 0   end 
         M[cid][get] = M[cid][get] + value 
      end 
   end 
   return true 
end 

 

 

Insere na lib>functions.lua: 

 

M = {} 
function getDamageInMonster(monster,cid) --[[Marcryzius D'evil]]-- 
local monster,cid,m_life,p_dano = tonumber(monster),tonumber(cid),0,0 
if not(monster or cid)then return 0,error('function getDamageInMonster(): monster or cid, not number') end 
   for k,v in pairs(M[monster]) do 
      if(k == cid)then p_dano = v end 
      m_life = m_life + v 
   end 
   return math.floor(p_dano/(m_life/100)) 
end 

 

 

o restante continua da mesma forma. 
Espero que funcione agora. N�o testei a fundo, pois, ainda n�o sei bem como jogar em ot pokemon - a backpack do boneco n�o abre mais, j� n�o sei o que fazer sem bp, n�o d� pra pegar outra bp, n�o d� pra mudar de outfit, n�o usa magias, cara isso n�o � tibia! 
 

Testei da seguinte forma:

Summonei um dragon e matei solo, gerou 100% do dano.

De novo o dragon, só que com dois players, gerou à porcentagem de cada um devido ao dano causado na criatura.

Depois testei com pokemon, solo e com dois players,  funcionou perfeitamente.

Editado por dominus (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Imperius
      O propósito é criar uma nova função em creaturescripts que será acionada toda vez que um novo report (CTRL + R) for aberto.
       
      Eu implementei para enviar uma notificação no grupo do Telegram, contendo os dados do report.
       
      Isso garantirá que os GMs tenham acesso aos reports dos jogadores mesmo quando não estiverem logados, e também evitará que algum report seja perdido caso o jogador saia do servidor.
      A parte do Telegram é apenas um exemplo. Você pode ajustar o script para executar outras ações desejadas.
       
      creatureevent.cpp:
      Dentro deste arquivo, localize a função:
       
      uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap)  
      abaixo dela, adicione:
       
      uint32_t CreatureEvent::executeOpenRuleViolation(Player* player, std::string message) { if (!m_interface->reserveEnv()) { std::clog << "[Error - CreatureEvent::executeOpenRuleViolation] Call stack overflow." << std::endl; return 0; } ScriptEnviroment* env = m_interface->getEnv(); env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushstring(L, message.c_str()); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; }  
      Após, procure por:
       
      std::string CreatureEvent::getScriptEventName() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "onLeaveChannel";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "onOpenRuleViolation";  
      Agora, procure por:
       
      std::string CreatureEvent::getScriptEventParams() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "cid, channel, users";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "cid, message";  
      Procure por:
       
      bool CreatureEvent::configureEvent(xmlNodePtr p)  
      abaixo de:
       
      else if(tmpStr == "leavechannel") m_type = CREATURE_EVENT_CHANNEL_LEAVE;  
      adicione:
       
      else if(tmpStr == "openruleviolation") m_type = CREATURE_EVENT_OPEN_RULE_VIOLATION;  
       
      creatureevent.h:
      Dentro deste arquivo, localize:
       
      enum CreatureEventType_t  
      adicione "CREATURE_EVENT_OPEN_RULE_VIOLATION" como o último item de enum CreatureEventType_t
       
      Exemplo:
       
      enum CreatureEventType_t { // ... CREATURE_EVENT_OPEN_RULE_VIOLATION };  
      Agora, procure por:
       
      uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap);  
      abaixo dela, adicione:
       
      uint32_t executeOpenRuleViolation(Player* player, std::string message);  
      game.cpp:
      Dentro deste arquivo, localize:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text)  
      e substitua por:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text) { //Do not allow reports on multiclones worlds since reports are name-based if(g_config.getNumber(ConfigManager::ALLOW_CLONES)) { player->sendTextMessage(MSG_INFO_DESCR, "Rule violation reports are disabled."); return false; } cancelRuleViolation(player); boost::shared_ptr<RuleViolation> rvr(new RuleViolation(player, text, time(NULL))); ruleViolations[player->getID()] = rvr; ChatChannel* channel = g_chat.getChannelById(CHANNEL_RVR); if(!channel) return false; for(UsersMap::const_iterator it = channel->getUsers().begin(); it != channel->getUsers().end(); ++it) it->second->sendToChannel(player, SPEAK_RVR_CHANNEL, text, CHANNEL_RVR, rvr->time); CreatureEventList joinEvents = player->getCreatureEvents(CREATURE_EVENT_OPEN_RULE_VIOLATION); for(CreatureEventList::iterator it = joinEvents.begin(); it != joinEvents.end(); ++it) (*it)->executeOpenRuleViolation(player, text); return true; }  
      Agora é só compilar a source.
       
      depois em "data > creaturescripts > creaturescripts.xml", adicione:
       
      <event type="login" name="loginNotifyRuleViolation" script="notifyRuleViolation.lua"/> <event type="openruleviolation" name="openNotifyRuleViolation" script="notifyRuleViolation.lua"/>  
      em "data > creaturescripts > scripts", crie um arquivo notifyRuleViolation.lua e adicione:
       
      function onOpenRuleViolation(cid, message) local config = { token = "", -- Token do seu BOT no Telegram chatId = "" -- ID do chat do Telegram que será enviado a notificação. } local message = "Player: "..getCreatureName(cid).."\n\nReport:\n"..message.."" message = string.gsub(message, "\n", "%%0A") local url = "https://api.telegram.org/bot"..config.token.."/sendMessage" local data = "chat_id="..config.chatId.."&text="..message.."" local curl = io.popen('curl -d "'..data..'" "'..url..'"'):read("*a") return true end function onLogin(cid) registerCreatureEvent(cid, "openNotifyRuleViolation") return true end  
       
      Demonstração:
      1. Jogador abre um novo report (CTRL + R)

      2. notifyRuleViolation.lua, definido em creaturescripts.xml, é acionado para enviar uma notificação ao grupo do Telegram.
       

       
    • Por Ghaz
      Fala pessoal tudo bem?
       
      Estou com dificuldades em um script e preciso da ajuda dos magos do LUA rs.
       
      Tenho um script que quando o player morre (onDeath), ele faz algumas coisas e depois ele chama uma função que deveria retornar uma table (array) para eu fazer o for com o ipairs certinho. Segue abaixo o código:
       
       
      Segue abaixo a função getPlayersInArea:
       
       
      Acontece que no código de cima (do primeiro spoiler) eu dou um print no retorno da função getPlayersInArea, porém ela não tá me retornando a table, tá me retornando só: 2
       
       
       
      Alguém consegue me ajudar em, como raios eu faço a função retornar a lista de players ao invés da quantidade? Acredito que ta retornando o count da table, e não os itens do array.
       
       
      Agradeço desde já, valeu tchurma!
    • Por LeoTK
      Salve galera neste tópico irei postar algumas prints do mapa do servidor para quem queira acompanhar e quem sabe até utilizar de inspiração para mapear o seu NTO.
       
      #Att 11/08/2022

       
       
       
       
      Konoha (Em Desenvolvimento)
       
       
       
       
    • Por FeeTads
      salve rapaziada, estou fazendo uma quest no meu OT que é necessário faze-la durante 10 dias consecutivos, porém caso o player perca um dia, a storage da quest reseta.
      Já tenho esses scripts prontos de 2 formas: global event que checa a storage de todos os player online no momento e caso ja tenha passado 24h ele tira a storage do player que está entre os 10 dias de quest.
      E também tenho um creatureScript de onLogin() que quando o player loga, ele entra num loop de verificação a cada 60s

      minha duvida: globalEvents vai checar todos os players online de uma só vez e fazer as alterações necessarias, isso pode lagar a distro, ou até mesmo crashar?
      o creatureScript vai entrar num loop até o player deslogar, isso numa média de 250 pessoa são diversas verificações em momentos diferentes, pode acabar lagando ou crashando?

      meu OT possui uma media de 300 pessoas online.

      Script globalEvents é esse:

      function onThink(interval, lastExecution)
          local players = {}
          local timer = os.time()
          for _, pid in pairs (getPlayersOnline()) do
              local storage = getPlayerStorageValue(pid, 1231234)
              if getPlayerStorageValue(pid,888251) > 0 and getPlayerStorageValue(pid,888251) <= 9 then
                  if storage - timer <= 1  then
                      table.insert(players, pid)
                  end
              end
          end
          
          if #players > 0 then
              for i = 1, #players do
                  doPlayerSendTextMessage(players[i],22,"seu dano voltou ao normal por vc nao ter feito a quest!")
                  setPlayerStorageValue(players[i],888251,0)
              end
          end
      return true
      end

      Script do Creature é esse:
      local storage = getPlayerStorageValue(cid,1231234)
              function checkStorage(cid) local timer = os.time()
                     if not isPlayer(cid) then return true end
                     if getPlayerStorageValue(cid,888251) > 0 and getPlayerStorageValue(cid, 888251) <= 9 then
                             if storage - timer <= 1 then
                                     setPlayerStorageValue(cid,888251,0)
                             end
                   end
                   addEvent(function()
                              checkStorage(cid)
                    end, 60000)
      end
      function onLogin(cid)
              checkStorage(cid)
      return true
      end
      function onLogout(cid)
             stopEvent(checkStorage[cid])
      return true
      end


      caso os códigos nao estejam legiveis me avisem como arrumar em .lua pf

      se quiserem usar os códigos podem usar a vontade kkkkkkk
    • Por thelifeofpbion
      Existem alguns scripts que depois de matar boss abri tp para os players entrarem em uma sala de recompensa, porém (não sei se já existe) vou postar 2 scripts:

      1º Script: Todos players que der algum dano no boss é teleportado
      2º Script: Depois que o Boss for derrotado todos players de uma sala são teleportados.
       
       

       
      É Basicamente isso, tava ajudando no suporte quando pediram isso e resolvi postar para ficar mais facil de achar (e depois pra eu achar também).

      Agradeço o vodkart por ter disponibilizado a parte do script onde seleciona todos players de uma area (retirei de algum post do forum),
      e Xagah que copiei descaradamente as imagens de tópico porque achei bonito  

      Ajudei de alguma Forma? REP+.


       



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo