AT

[Encerrado] Creature not found

Por atakashi, 05 de nov. de 2017 em Tópicos Sem Resposta

10
2.1k
atakashiA
05 de novembro de 2017 às 11:40

Estou com um problema nesse script, ele funciona mas as vezes da esse erro dizendo que não encontrou a criatura do jogador.

 

[Error - CreatureScript Interface]
In a timer event called from:
data/creaturescripts/scripts/exp2.0.lua:onStatsChange
Description:
(luaGetCreatureMaster) Creature not found

 

o script é este.

if isSummon(cid) and isPlayer(getCreatureMaster(cid)) then
	addEvent(function()
		if isCreature(getCreatureMaster(cid)) then
			doPlayerSendCancel(getCreatureMaster(cid), "%PokeHealth@" .. getCreatureHealth(cid) .. "@" .. getCreatureMaxHealth(cid))
		
		end
	end, 100)
end



...

botei ("...") pq continua, está parte ai que da o erro.

Editado Novembro 5 por atakashi

CrypterC
06 de novembro de 2017 às 09:10
if isSummon(cid) or isPlayer(getCreatureMaster(cid)) then
	addEvent(function()
		if isCreature(getCreatureMaster(cid)) then
			doPlayerSendCancel(getCreatureMaster(cid), "%PokeHealth@" .. getCreatureHealth(cid) .. "@" .. getCreatureMaxHealth(cid))
		end
	end, 100)
end

 

atakashiA
07 de novembro de 2017 às 14:32

Acho que não adianta crypter, pelo fato de eu ter tirado o " 

isPlayer(getCreatureMaster(cid))" e continuado dando erro.

Editado Novembro 7 por atakashi

dalvorsnD
07 de novembro de 2017 às 20:08

Não tão repassando o cid pro addEvent ...

 

if isSummon(cid) or isPlayer(getCreatureMaster(cid)) then
	addEvent(function(cid)
		if isCreature(getCreatureMaster(cid)) then
			doPlayerSendCancel(getCreatureMaster(cid), "%PokeHealth@" .. getCreatureHealth(cid) .. "@" .. getCreatureMaxHealth(cid))
		end
	end, 100, cid)
end

 

atakashiA
07 de novembro de 2017 às 21:40

provavel seja isso mesmo, vou testa e volto com o resultado, desde ja obrigado :).


Edit: continuo mesmo erro :/

Editado Novembro 7 por atakashi

KydraiK
08 de novembro de 2017 às 00:42

O erro é pq a criatura (cid) não existe (morreu ou foi removida) quando executa a função dentro do addEvent.

Teria que passar o getCreatureMaster(cid) como parâmetro pro addEvent, ao invés de somente o cid.

Ainda sim, se o cid não existe no momento que executa o addEvent você não vai conseguir executar as funções getCreatureHealth e getCreatureMaxHealth dentro do addEvent, teria que ter outra forma de pegar o hp dele.

 

Seria algo como:

if isSummon(cid) and isPlayer(getCreatureMaster(cid)) then
    addEvent(function(cid, master)
        if isCreature(master) then
          if isCreature(cid) then
              doPlayerSendCancel(master, "%PokeHealth@" .. getCreatureHealth(cid) .. "@" .. getCreatureMaxHealth(cid))
          else
              -- outro comando para pegar o hp
          end
        end
    end, 100, cid, getCreatureMaster(cid))
end

Sobre o hp, se o max health não muda, você pode passar ele como parâmetro junto com o cid e o master. Já o health, por ser onStatsChange, dependendo dos scripts do servidor, da pra saber o hp após executar este script somando o valor do dano com o hp.

Caso contrário, imagino que você tenha algum comando pra pegar o hp da criatura que não existe (direto da pokeball, por exemplo).

atakashiA
08 de novembro de 2017 às 14:14

Pelo que percebi o HP da pokeball é dado assim, doItemSetAttribute(item.uid, "hp", )

 

    local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))

    if edit then
        doItemSetAttribute(pokeball.uid, "happy", happy)
        doItemSetAttribute(pokeball.uid, "hunger", hunger)
        doItemSetAttribute(pokeball.uid, "hp", pokelife)
    end

porem volta pro mesmo lugar.

Editado Novembro 8 por atakashi

PoccnnP
09 de novembro de 2017 às 21:24

não se pode adicionar o cid a eventos pois o mesmo muda a cada ação da criatura.

Envie ao evento o parametro com o id GUID do player, assim ele poderá pegar o cid do player mesmo ele tendo mudado.

KydraiK
09 de novembro de 2017 às 23:21
2 horas atrás, Poccnn disse:

não se pode adicionar o cid a eventos pois o mesmo muda a cada ação da criatura.

Envie ao evento o parametro com o id GUID do player, assim ele poderá pegar o cid do player mesmo ele tendo mudado.

 

O cid não altera a cada ação, ele é gerado quando a criatura é "colocada no mapa" (login, /m, /s, etc). E nesse caso dele o cid é um monstro, o erro é porque não localiza o monstro.

 

Não da pra saber exatamente tudo que ocorre no serv só com essas linhas, mas supondo que nada influencie no dano após esse script, você poderia trocar tudo isso por algo similar a isso:

if isSummon(cid) and isPlayer(getCreatureMaster(cid)) then
	local hp = getCreatureHealth(cid)
	if type == STATSCHANGE_HEALTHLOSS then
		hp = hp - value
	elseif type == STATSCHANGE_HEALTHGAIN then
		hp = hp + value
	end
	doPlayerSendCancel(getCreatureMaster(cid), "%PokeHealth@" .. hp .. "@" .. getCreatureMaxHealth(cid))
end

Isso é só um exemplo, vai depender do que tem no seu serv.

Editado Novembro 9 por Kydrai

5 meses depois...
StigalS
19 de abril de 2018 às 17:12
A questão neste tópico de suporte foi encerrada por falta de resposta. Este tópico está fechado e foi movido para Suporte - Tópicos Sem Resposta