Postado Fevereiro 12, 2016 9 anos Autor Em 12/02/2016 em 19:40, 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 Em 12/02/2016 em 19:40, 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 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 Editado Fevereiro 12, 2016 9 anos por wevertonvrb (veja o histórico de edições)
Postado Fevereiro 13, 2016 9 anos Em 12/02/2016 em 20:58, 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 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
Postado Fevereiro 13, 2016 9 anos Autor Em 13/02/2016 em 11:18, 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 atacaoutra coisa de repente começou a gerar um erro que não estava gerandoERROR Mostrar conteúdo oculto [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 issotable.remove (M, player) e mesmo que eu retire essa parte o erro continua vou ate postar o script aqui novamentekill Mostrar conteúdo oculto --[[ 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 Mostrar conteúdo oculto --[[ 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 Fevereiro 13, 2016 9 anos por wevertonvrb (veja o histórico de edições)
Postado Fevereiro 13, 2016 9 anos Em 13/02/2016 em 14:46, 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 gerandoERROR Mostrar conteúdo oculto Mostrar conteúdo oculto [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 issotable.remove (M, player) e mesmo que eu retire essa parte o erro continua vou ate postar o script aqui novamentekill Mostrar conteúdo oculto Mostrar conteúdo oculto --[[ 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 Mostrar conteúdo oculto Mostrar conteúdo oculto --[[ 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.
Postado Fevereiro 13, 2016 9 anos Autor Em 13/02/2016 em 15:38, 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 Mostrar conteúdo oculto 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 Fevereiro 13, 2016 9 anos por wevertonvrb (veja o histórico de edições)
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.