DE
erro

setPlayerStorageValue

Por DeCarvalho, 04 de ago. de 2015 em Scripts

resolvido
script
17
3.8k
DeCarvalhoD
04 de agosto de 2015 às 19:33

Estou usando esse script para fazer um portal aparecer e setar uma storage após o monstro morrer... o portal abre, fica la pelos 'x' segungos mas a storage não esta sendo setada.. ja tentei pesquisar mas .. enfim.. alguém poderia corrigir e me explicar o motivo de não estar setando a storage?

(tfs 1.2)

local tpId = 1387
local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}

function removeTp(tp)
	local t = getTileItemById(tp.pos, tpId)
	if t then
		doRemoveItem(t.uid, 1)
		doSendMagicEffect(tp.pos, CONST_ME_POFF)
	end
end

function onDeath(cid)
	local tp = tps[getCreatureName(cid)]
	if tp then
		doCreateTeleport(tpId, tp.toPos, tp.pos)
		doCreatureSay(cid, "A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_ORANGE_1)
		doCreatureSay(cid, "You have killed the disorder and proved be trustworthy", TALKTYPE_ORANGE_1)
		setPlayerStorageValue(cid, 21321, 1)
		addEvent(removeTp, tp.time*1000, tp)
	end
	return TRUE
end

Grato

zipter98Z
04 de agosto de 2015 às 19:38

Você está setando a storage no monstro que está morrendo (cid).

local tpId = 1387
local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}
 
function removeTp(tp)
	local t = getTileItemById(tp.pos, tpId)
	if t then
		doRemoveItem(t.uid, 1)
		doSendMagicEffect(tp.pos, CONST_ME_POFF)
	end
end
 
function onDeath(cid, corpse, deathList)
	local tp = tps[getCreatureName(cid)]
	if tp then
		doCreateTeleport(tpId, tp.toPos, tp.pos)
		doCreatureSay(cid, "A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_ORANGE_1)
		doCreatureSay(cid, "You have killed the disorder and proved be trustworthy", TALKTYPE_ORANGE_1)
		setPlayerStorageValue(deathList[1], 21321, 1)
		addEvent(removeTp, tp.time*1000, tp)
	end
	return true
end
DeCarvalhoD
04 de agosto de 2015 às 20:09

 

Você está setando a storage no monstro que está morrendo (cid).

local tpId = 1387
local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}
 
function removeTp(tp)
	local t = getTileItemById(tp.pos, tpId)
	if t then
		doRemoveItem(t.uid, 1)
		doSendMagicEffect(tp.pos, CONST_ME_POFF)
	end
end
 
function onDeath(cid, corpse, deathList)
	local tp = tps[getCreatureName(cid)]
	if tp then
		doCreateTeleport(tpId, tp.toPos, tp.pos)
		doCreatureSay(cid, "A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_ORANGE_1)
		doCreatureSay(cid, "You have killed the disorder and proved be trustworthy", TALKTYPE_ORANGE_1)
		setPlayerStorageValue(deathList[1], 21321, 1)
		addEvent(removeTp, tp.time*1000, tp)
	end
	return true
end

Eu havia imaginado isso e até havia usado assim

 

function onDeath(cid, corpse, killer)
[...]
setPlayerStorageValue(killer[1], 21321, 1)
[...]

baseado em 2 scripts que tem aqui no forum, mas não funcionou.. para ter certeza testei esse seu e nada.. fui no phpmyadmin para ver se tinha alguma storage setada no player_storage e nada tbm..

 

essa storage libera uma tile, tentei passar pela tile e não posso passar por não ter a storage setada no char..

 

grato de qualquer maneira por ter vindo prestar ajuda, alguma outra opção?

Editado Agosto 4 por DeCarvalho

zipter98Z
04 de agosto de 2015 às 20:42

Uma opção é converter o código para outro callback, como, por exemplo, onKill.

local tpId = 1387
local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}
 
function removeTp(tp)
	local t = getTileItemById(tp.pos, tpId)
	if t then
		doRemoveItem(t.uid, 1)
		doSendMagicEffect(tp.pos, CONST_ME_POFF)
	end
end
 
function onKill(cid, target)
    local tp = tps[getCreatureName(target)]
    if isPlayer(cid) and isMonster(target) and tp then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(target, "A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_ORANGE_1)
        doCreatureSay(target, "You have killed the disorder and proved be trustworthy", TALKTYPE_ORANGE_1)
        setPlayerStorageValue(cid, 21321, 1)
        addEvent(removeTp, tp.time*1000, tp)
    end
    return true
end

É possível fazer por onStatsChange também.

Editado Agosto 4 por zipter98

DeCarvalhoD
04 de agosto de 2015 às 21:19

Bem eu alterei a tag em creaturescripts

	<event type="death" name="tp" script="questpassagenewbie.lua"/>

para

	<event type="kill" name="tp" script="questpassagenewbie.lua"/>

no xml do monstro tenho

	<script>
	<event name="tp"/>
	</script>

Usei com esse onKill que você fez mas ao matar o monstro o console retorna essa msg

[Warning - Monster::Monster] Unknown event name: tp

Eu ainda estou naquela de tentar entender o funcionamento das coisas.. por isso desculpe se estou a fazer alguma besteira :p

 

// não pude curtir pois estou sem likes no momento mas assim que tiver eu irei curtir.. e claro assim que o script, se dentro das suas possibilidades, estiver funcionando darei como respsta válida :) como sei que toda ajuda é gratuida e de bom grado.. não tenha pressa :) sei que todos têm coisas a fazer :)

 

de qualquer maneira grato pelo suporte

Editado Agosto 4 por DeCarvalho

zipter98Z
04 de agosto de 2015 às 21:27

Registre esse evento em login.lua, não no arquivo do monstro. Esqueci de avisar, foi mal.

Editado Agosto 4 por zipter98

DeCarvalhoD
04 de agosto de 2015 às 21:35

Desculpa a minha ignorância.. em creaturescripts/scripts/login.lua adicionei

    registerCreatureEvent(cid, "tp")

por encargo de dúvida testei também com

player:registerEvent("tp")

mas a msg de warning continua ...

 

Imagino que o correto seja o CreatureEvent mas enfim..

 

[edit] eu havia esquecido de remover do mostro, mas ao remover do monstro não acontece nada quando o mato.. o erro é quando o monstro é criado..

 

/m little corym charlatan e o console retorna a warning

Editado Agosto 4 por DeCarvalho

AlayenA
04 de agosto de 2015 às 22:56

Você está tentando pegar o teleport pelo nome do killer, não do target. Outro ponto é que você está tentando usar 0.4 em 1.0 e isso não costuma dar certo. Tá aqui como devia ser:

 

local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}
 
function onKill(killer, target)
    local tp = tps[target:getName()]
    if tp and killer:isPlayer() and target:isMonster() then
    	local item = Game.createItem(1387, 1, tp.pos)
	item:setDestination(tp.toPos)
	
	target:say("A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_MONSTER_SAY)
        target:say("You have killed the disorder and proved be trustworthy", TALKTYPE_MONSTER_SAY)
        
        killer:setStorageValue(21321, 1)

        local function removeTeleport()
            item:remove()
            Position(tp.pos):sendMagicEffect(MAGIC_EFFECT_POFF)
        end
        addEvent(item:remove, tp.time * 1000)
    end
    return true
end

Editado Agosto 4 por Alayen

zipter98Z
04 de agosto de 2015 às 23:10

Ah sim, esqueci de modificar o parâmetro. Bem lembrado.

Sobre o uso de metamétodos e afins do TFS 1.x+, não adaptei pois, como o autor mesmo disse, o problema era só na storage.

o portal abre, fica la pelos 'x' segungos mas a storage não esta sendo setada..

 

Editado Agosto 4 por zipter98

DeCarvalhoD
04 de agosto de 2015 às 23:14

Você está tentando pegar o teleport pelo nome do killer, não do target. Outro ponto é que você está tentando usar 0.4 em 1.0 e isso não costuma dar certo. Tá aqui como devia ser:

 

local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}
 
function onKill(killer, target)
    local tp = tps[target:getName()]
    if tp and killer:isPlayer() and target:isMonster() then
    	local item = Game.createItem(1387, 1, tp.pos)
	item:setDestination(tp.toPos)
	
	target:say("A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_MONSTER_SAY)
        target:say("You have killed the disorder and proved be trustworthy", TALKTYPE_MONSTER_SAY)
        
        killer:setStorageValue(21321, 1)

        local function removeTeleport()
            item:remove()
            Position(tp.pos):sendMagicEffect(MAGIC_EFFECT_POFF)
        end
        addEvent(item:remove, tp.time * 1000)
    end
    return true
end

 

Ola, testei aqui.. primeiro ele disse que na linha 20 perto do, deveria haver alguma função.. imaginei que estivesse faltando os parenteses e adicionei..

Estava assim

        addEvent(item:remove, tp.time * 1000)

coloquei assim

        addEvent(item:remove(), tp.time * 1000) 

enfim cai novamente no warning do tp

[Warning - Monster::Monster] Unknown event name: tp

Testei adicionando ao login.lua o registro, usando no xml da criatura mas ai nada acontece.. nem mesmo erro no console..

 

como no outro post, testei das duas maneiras no login.lua e nada..

 

No script inicial o teleport estava funcionando.. o que não esta funcionando é o storage.. testei o script só setando storage e também nada...

 

Como informado é tfs 1.2

Editado Agosto 4 por DeCarvalho

zipter98Z
04 de agosto de 2015 às 23:16

Sobre meu código, você disse que não estava acontecendo nada quando o monstro morria, certo?

Modifiquei o script. Agora vai funcionar direitinho.

DeCarvalhoD
04 de agosto de 2015 às 23:27

Sobre meu código, você disse que não estava acontecendo nada quando o monstro morria, certo?

Modifiquei o script. Agora vai funcionar direitinho.

 

Bem vou colocar todas as informações aqui pois pode ser algum erro meu, pois mesmo com esse novo continua sem acontecer coisa alguma, não aparece msg, não aparece tp, não da erro no console.. nada

 

bem estou usando seu script atualizado,

 

o xml do monstro não contem referência ao evento como você havia informado para retirar..

 

em creaturescripts.xml tenho isso

	<event type="kill" name="tp" script="questpassagenewbie.lua"/>

em login.lua testei das duas formas

	player:registerEvent("tp")
	registerCreatureEvent(cid, "tp")

estou usando o 1.2 daqui https://github.com/brunominervino/forgottenserver

zipter98Z
04 de agosto de 2015 às 23:35
Melhor resposta

Tente esse e informe se alguma coisa é imprimida no console (1/2):

local tpId = 1387
local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}
 
function removeTp(tp)
	local t = getTileItemById(tp.pos, tpId)
	if t then
		doRemoveItem(t.uid, 1)
		doSendMagicEffect(tp.pos, CONST_ME_POFF)
	end
end
 
function onKill(cid, target)
    print(1)
    local tp = tps[getCreatureName(target)]
    if isPlayer(cid) and isMonster(target) and tp then
        print(2)
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(target, "A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_ORANGE_1)
        doCreatureSay(target, "You have killed the disorder and proved be trustworthy", TALKTYPE_ORANGE_1)
        setPlayerStorageValue(cid, 21321, 1)
        addEvent(removeTp, tp.time*1000, tp)
    end
    return true
end
DeCarvalhoD
04 de agosto de 2015 às 23:41

 

Tente esse e informe se alguma coisa é imprimida no console (1/2):

local tpId = 1387
local tps = {
	["Little Corym Charlatan"] = {pos = {x=414, y=91, z=11}, toPos = {x=409, y=93, z=11}, time = 30},
}
 
function removeTp(tp)
	local t = getTileItemById(tp.pos, tpId)
	if t then
		doRemoveItem(t.uid, 1)
		doSendMagicEffect(tp.pos, CONST_ME_POFF)
	end
end
 
function onKill(cid, target)
    print(1)
    local tp = tps[getCreatureName(target)]
    if isPlayer(cid) and isMonster(target) and tp then
        print(2)
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(target, "A teleport appeared near and will disappear in  "..tp.time.." seconds.", TALKTYPE_ORANGE_1)
        doCreatureSay(target, "You have killed the disorder and proved be trustworthy", TALKTYPE_ORANGE_1)
        setPlayerStorageValue(cid, 21321, 1)
        addEvent(removeTp, tp.time*1000, tp)
    end
    return true
end

 

nadinha de nada.. é como se ele não estivesse carregando o script.. quando morre ele não mostra 1 e nem o 2 que deveria aparecer logo depois pela criação do tp e envio de storage

zipter98Z
04 de agosto de 2015 às 23:43

Há algum outro evento com nome "tp"?