TO
dúvida

Como checar um item?

Por topmaster, 29 de dez. de 2012 em Scripts

topmaster
duvida
creatureevent
creaturescript
ondead
xtibia
ajuda
18
2.3k
topmasterT
29 de dezembro de 2012 às 04:15

Procurei e não encontrei um método de checar se tal item dropou do monstro.

 

Ex: matei um dragon e caiu um dragon shield, quero um método de chegar isso para mostrar um efeito. usando onKillvlw.

Editado Dezembro 30 por TopMaster

iunixI
29 de dezembro de 2012 às 05:19

local id = 1111 -- ID do item
local effect = 12 -- ID do effect que vc quer que saia
function onDeath(cid, corpse)
for i = 1, getContainerSize(corpse.uid) do
	local t = getContainerItem(corpse.uid, i).itemid
	if (t) and  (t == id) then
		doSendMagicEffect(getThingPosition(corpse.uid), effect)
		break
	end
end
return true
end

 

 

fiz aqui de cabeça, da uma testada e me fala se está funcionando.

Editado Dezembro 29 por iuniX

topmasterT
29 de dezembro de 2012 às 05:34

Testando jaja eu edito esse post.

 

______________________________

Edit. não pegou não aparece o efeito pq sera?

Editado Dezembro 29 por TopMaster

iunixI
29 de dezembro de 2012 às 05:48

Eu arrumei um errinho bobo ali, da uma olhada agora.

topmasterT
29 de dezembro de 2012 às 05:56

nada ainda. =/

iunixI
29 de dezembro de 2012 às 05:59

Erro?

topmasterT
29 de dezembro de 2012 às 06:01

pior que não aparece nenhum erro no console.

 

ja registrei no login e nada tbm.

-----------------------------------------------

edit usei a que vc mando tbm e n vai

Editado Dezembro 29 por TopMaster

SlicerS
29 de dezembro de 2012 às 09:33

tem q registrar no .xml do bixo...

e tb.. container n começa no slot 0? ;x

 

eu uso esse aki no meu serv..

 

local function sendEff(pos)

local id = 1111 --coloca o id do item

local eff = 12 --coloca o efeito

for i = 1, 255 do

pos.stackpos = i

local item = getTileThingByPos(pos)

if item.uid ~= 0 then

if isContainer(item.uid) and getContainerSize(item.uid) > 0 then

for slot=0, (getContainerSize(item.uid)-1) do

local item2 = getContainerItem(item.uid, slot)

if item2.itemid == id then

doSendMagicEffect(getThingPos(item.uid), eff)

break

end

end

end

end

end

end

 

function onKill(cid, target)

 

if isMonster(target) and isPlayer(cid) then

local pos = getThingPos(target)

addEvent(sendEff, 150, pos)

end

 

return TRUE

end

 

esse soh precisa registrar no login... eu modifiquei ele entao n sei se ta tudo certo..

Editado Dezembro 29 por Slicer

iunixI
29 de dezembro de 2012 às 10:12
local id, effect = 9167, 15 -- ID do item e do effect
function onDeath(cid, corpse)
       for i = 1, getContainerCap(corpse.uid) do
               local t = getContainerItem(corpse.uid, i)
               if (t) and  (t == id) then
                       doSendMagicEffect(getThingPosition(corpse.uid), effect)
                       break
               end
       end
       return true
end

brun123B
29 de dezembro de 2012 às 12:20

não vai funcionar iuniX, pois o loot só é gerado depois do return true, se o corpse ainda existir (pode acontecer de ele ser removido ainda no script).

tem que usar addEvent, algo estilo:

 

function onDeath(cid, corpse)

   local function func(position, corpseid)
    local item = getTileItemById(position, corpseid).uid
    if item.uid < 0 then return end
    -- usa for pra ver o loot blabla
   end

   addEvent(func, 1, getThingPos(cid), corpse.itemid)

return true
end

topmasterT
29 de dezembro de 2012 às 15:24

tentei todas e não vai =/. tenso

brun123B
29 de dezembro de 2012 às 17:48

function onDeath(cid, corpse)

local function func(position, corpseid, items, effect)
	local corpse = getTileItemById(position, corpseid).uid
	if corpse < 0 then return end
	local item = 0
	for slot = 0, getContainerCap(corpse) do
		item = getContainerItem(corpse, slot)
		if item.uid <= 1 then return end
		if isInArray(items, item.itemid) then
		return doSendMagicEffect(getThingPos(corpse), effect)
		end
	end
end

local items = {2160, 2152}
local effect = 15

addEvent(func, 1, getThingPos(cid), corpse.itemid, items, effect)

return true
end

 

esse evento precisa ser registrado no XML do monstro, além da tag a ser adicionada no creaturescripts.xml.

se for para um monstro ou outro, o ideal é utilizar onDeath mesmo, mas se quiser fazer para todos os monstros, é melhor fazer por onKill

Editado Dezembro 29 por brun123

topmasterT
30 de dezembro de 2012 às 18:31

vou tenta passa pra onKill. vou dar rep pros cara q tento me ajudar ^^ vlw

dei rep pro brun123 amanha do pro iunix, e depois pro Slicer

-----------------------------------------------------------------------------------------

edit.

 

não to conseguindo reproduzir seu script de onDeath pra onKill, se alguém conseguir eu agradeço.

 

 

function onDeath(cid, corpse)

local function func(position, corpseid, items, effect)
	local corpse = getTileItemById(position, corpseid).uid
	if corpse < 0 then return end
	local item = 0
	for slot = 0, getContainerCap(corpse) do
		item = getContainerItem(corpse, slot)
		if item.uid <= 1 then return end
		if isInArray(items, item.itemid) then
		return doSendMagicEffect(getThingPos(corpse), effect)
		end
	end
end

local items = {2160, 2152}
local effect = 15

addEvent(func, 1, getThingPos(cid), corpse.itemid, items, effect)

return true
end

Editado Dezembro 30 por TopMaster

brun123B
30 de dezembro de 2012 às 23:35

function onKill(cid, target, lastHit)

   if not isMonster(target) then return true end
   local corpse = getMonsterInfo(getCreatureName(target)).lookCorpse

   local items = {2160, 2152}
   local effect = 15

   local function func(position, corpseid, items, effect)
    local corpse = getTileItemById(position, corpseid).uid
    if corpse <= 1 then return end
    for slot = 0, getContainerCap(corpse) do
	    local item = getContainerItem(corpse, slot)
	    if item.uid <= 1 then return end
	    if isInArray(items, item.itemid) then
	    return doSendMagicEffect(position, effect)
	    end
    end
   end

   addEvent(func, 5, getThingPos(target), corpse, items, effect)
return true
end

 

Precisa colocar a tag no creaturescripts.xml, o tipo é "kill", e precisa registrar esse creature script no login.lua

topmasterT
31 de dezembro de 2012 às 02:06

não esta dando erro algum, mais tbm não esta saindo o efeito =/ pq sera?