Ir para conteúdo
  • 0

[Talk Action] - Auto Gold


BravHart

Pergunta

Galera, alguém consegue ou tem um script para que o cara diga: /autogold

 

Feito isso, todos os monstros que ele matar a partir da ativação do comando, será coletado os coins que os monstros deixarem como loot. No mais, também será juntado todos os coins assim que for coletado.

 

Desde já, obrigado!

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Talkaction:

 

 

function onSay(cid, words, param)

local stats = getPlayerStorageValue(cid, 45600) == -1 and "ativado." or "desativado."

doPlayerSendTextMessage(cid, 25, "O sistema de captura de gold foi " .. stats)
setPlayerStorageValue(cid, 45600, stats == "ativado." and 1 or -1)
end

 

Tag:

 

<talkaction words="/autogold" script="NomeDoArquivo.lua" />

 

Creaturescripts:

 

 

function onKill(cid, target, lastHit)

if getPlayerStorageValue(cid, 45600) == 1 then
addEvent(check, 1000, cid, getThingPos(target))
end

return true
end

function check(cid, pos)

local cont = getThingFromPos(pos).uid

if isCorpse(cont) then
if isContainer(cont) then
doPlayerAddCoin(cid, getItemsInContainerById(cont, 2148))
doPlayerAddCoin(cid, getItemsInContainerById(cont, 2152))
doPlayerAddCoin(cid, getItemsInContainerById(cont, 2160))
end
end

end

function doPlayerAddCoin(cid, tab)

for _, uids in pairs(tab) do
doPlayerAddItem(cid, getThing(uids).itemid, getThing(uids).type)
doRemoveItem(uids)
end

end

function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
	for slot=0, (getContainerSize(container)-1) do
		local item = getContainerItem(container, slot)
		if isContainer(item.uid) then
			local itemsbag = getItemsInContainerById(item.uid, itemid)
			for i=0, #itemsbag do
				table.insert(items, itemsbag[i])
			end
		else
			if itemid == item.itemid then
				table.insert(items, item.uid)
			end
		end
	end
end
return items
end

 

login.lua:

 

registerCreatureEvent(cid, "Autogold")

 

Tag:

 

<event type="kill" name="Autogold" event="script" value="NomeDoArquivo.lua"/>

Editado por Demonbholder
Link para o comentário
Compartilhar em outros sites

  • 0

Demonbholder mesmo vendo que voce ja tinha respondido, resolvi postar o meu, o seu script se funcionar eu acho que ele nao vai estacar os itens estacaveis e o seu script gasta mta memoria rodando em todo o container pra cada id de dinheiro.

 

data/creaturescripts/scripts/goldKill.lua:

function getContainerItems(containeruid)
local items = {}
local containers = {}
if type(getContainerSize(containeruid)) ~= "number" then
	return false
end
for slot = 0, getContainerSize(containeruid)-1 do
	local item = getContainerItem(containeruid, slot)
	if item.itemid == 0 then
		break
	end
	if isContainer(item.uid) then
		table.insert(containers, item.uid)
	end
	table.insert(items, item)
end
if #containers > 0 then
	for i,x in ipairs(getContainerItems(containers[1])) do
		table.insert(items, x)
	end
	table.remove(containers, 1)
end	
return items
end

function getItemsInContainerById(container, itemid) -- Function By Kydrai
	local items = {}
	if isContainer(container) and getContainerSize(container) > 0 then
			for slot=0, (getContainerSize(container)-1) do
					local item = getContainerItem(container, slot)
					if isContainer(item.uid) then
							local itemsbag = getItemsInContainerById(item.uid, itemid)
							for i=0, #itemsbag do
									table.insert(items, itemsbag[i])
							end
					else
							if itemid == item.itemid then
									table.insert(items, item.uid)
							end
					end
			end
	end
	return items
end

function doPlayerAddItemStacking(cid, itemid, quant)
local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
	for i,x in pairs(item) do
		if getThing(x).type < 100 then
			local it = getThing(x)
			doTransformItem(it.uid, itemid, it.type+quant)
			if it.type+quant > 100 then
				doPlayerAddItem(cid, itemid, it.type+quant-100)
			end
		else
		   piles = piles+1
		end
	end
else
	return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
	doPlayerAddItem(cid, itemid, quant)
end
end

function corpseRetireItems(corpsepos, killer, itemsarray)
local corpse = nil
for i = 1, 254 do
	corpsepos.stackpos = i
	corpse = getThingFromPos(corpsepos)
	if corpse.uid > 0 and isCorpse(corpse.uid) then
		break
	end
end
local items = getContainerItems(corpse.uid)
for i,x in pairs(items) do
	if isInArray(itemsarray, tonumber(x.itemid)) then
		if isItemStackable(x.itemid) then
			doPlayerAddItemStacking(killer, x.itemid, x.type)
		else
			doPlayerAddItem(killer, x.itemid)
		end
		doRemoveItem(x.uid, x.type)
	end
end
end

function onKill(cid, target, lastHit)
local loots = {2148, 2152, 2160}
if lastHit and getPlayerStorageValue(cid, 6616) == 1 then
	addEvent(corpseRetireItems, 100, getCreaturePosition(target), cid, loots)
end
return true
end

 

data/creaturescripts/creaturescripts.xml:

<event type="kill" name="GoldKill" event="script" value="goldKill.lua"/>

 

Adicione isso no login.lua:

registerCreatureEvent(cid, "GoldKill")

 

 

data/talkactions/scripts/autoGold.lua:

function onSay(cid, words, param)
setPlayerStorageValue(cid, 6616, getPlayerStorageValue(cid, 6616) == -1 and 1 or -1)
doPlayerSendTextMessage(cid, 25, "Auto Loot: " .. (getPlayerStorageValue(cid, 6616) == -1 and "OFF" or "ON"))
return true
end

 

data/talkactions/talkactions.xml:

<talkaction words="/autogold" event="script" value="autoGold.lua"/>

 

Obs: Meu script ainda esta com um bug, nao estaca em itens das bps dentro de bps ja concerto

 

Pronto, creio que nao tem mais bugs mas se voce achar fala.

 

Estaca os itens automaticamente, e funciona pra qlqr id flw

Editado por MatheusMkalo
Link para o comentário
Compartilhar em outros sites

  • 0

Quanto a memória, uma simples modificação na função do kydrai resolveria o problema:

 

function getItemsInContainerById(container, tab) -- Function By Kydrai
	local items = {}
	if isContainer(container) and getContainerSize(container) > 0 then
			for slot=0, (getContainerSize(container)-1) do
					local item = getContainerItem(container, slot)
					if isContainer(item.uid) then
							local itemsbag = getItemsInContainerById(item.uid, tab)
							for i=0, #itemsbag do
									table.insert(items, itemsbag[i])
							end
					else
							if table.find(tab, item.itemid) then
									table.insert(items, item.uid)
							end
					end
			end
	end
	return items
end

 

e assim, utilizar a função deste jeito:

 

getItemsInContainerById(cont, {2148, 2152, 2160})

 

até.

Editado por Demonbholder
Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado aos demais por me ajudarem.

No mais, neste momento estou de saída, sendo assim, amanhã de manhã vou testar ambos.

 

Abraços.

 

Demonbholder mesmo vendo que voce ja tinha respondido, resolvi postar o meu, o seu script se funcionar eu acho que ele nao vai estacar os itens estacaveis e o seu script gasta mta memoria rodando em todo o container pra cada id de dinheiro.

 

data/creaturescripts/scripts/goldKill.lua:

function getContainerItems(containeruid)
local items = {}
local containers = {}
if type(getContainerSize(containeruid)) ~= "number" then
	return false
end
for slot = 0, getContainerSize(containeruid)-1 do
	local item = getContainerItem(containeruid, slot)
	if item.itemid == 0 then
		break
	end
	if isContainer(item.uid) then
		table.insert(containers, item.uid)
	end
	table.insert(items, item)
end
if #containers > 0 then
	for i,x in ipairs(getContainerItems(containers[1])) do
		table.insert(items, x)
	end
	table.remove(containers, 1)
end	
return items
end

function getItemsInContainerById(container, itemid) -- Function By Kydrai
	local items = {}
	if isContainer(container) and getContainerSize(container) > 0 then
			for slot=0, (getContainerSize(container)-1) do
					local item = getContainerItem(container, slot)
					if isContainer(item.uid) then
							local itemsbag = getItemsInContainerById(item.uid, itemid)
							for i=0, #itemsbag do
									table.insert(items, itemsbag[i])
							end
					else
							if itemid == item.itemid then
									table.insert(items, item.uid)
							end
					end
			end
	end
	return items
end

function doPlayerAddItemStacking(cid, itemid, quant)
local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
	for i,x in pairs(item) do
		if getThing(x).type < 100 then
			local it = getThing(x)
			doTransformItem(it.uid, itemid, it.type+quant)
			if it.type+quant > 100 then
				doPlayerAddItem(cid, itemid, it.type+quant-100)
			end
		else
		   piles = piles+1
		end
	end
else
	return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
	doPlayerAddItem(cid, itemid, quant)
end
end

function corpseRetireItems(corpsepos, killer, itemsarray)
local corpse = nil
for i = 1, 254 do
	corpsepos.stackpos = i
	corpse = getThingFromPos(corpsepos)
	if corpse.uid > 0 and isCorpse(corpse.uid) then
		break
	end
end
local items = getContainerItems(corpse.uid)
for i,x in pairs(items) do
	if isInArray(itemsarray, tonumber(x.itemid)) then
		if isItemStackable(x.itemid) then
			doPlayerAddItemStacking(killer, x.itemid, x.type)
		else
			doPlayerAddItem(killer, x.itemid)
		end
		doRemoveItem(x.uid, x.type)
	end
end
end

function onKill(cid, target, lastHit)
local loots = {2148, 2152, 2160}
if lastHit and getPlayerStorageValue(cid, 6616) == 1 then
	addEvent(corpseRetireItems, 100, getCreaturePosition(target), cid, loots)
end
return true
end

 

data/creaturescripts/creaturescripts.xml:

<event type="kill" name="GoldKill" event="script" value="goldKill.lua"/>

 

Adicione isso no login.lua:

registerCreatureEvent(cid, "GoldKill")

 

 

data/talkactions/scripts/autoGold.lua:

function onSay(cid, words, param)
setPlayerStorageValue(cid, 6616, getPlayerStorageValue(cid, 6616) == -1 and 1 or -1)
doPlayerSendTextMessage(cid, 25, "Auto Loot: " .. (getPlayerStorageValue(cid, 6616) == -1 and "OFF" or "ON"))
return true
end

 

data/talkactions/talkactions.xml:

<talkaction words="/autogold" event="script" value="autoGold.lua"/>

 

Obs: Meu script ainda esta com um bug, nao estaca em itens das bps dentro de bps ja concerto

 

Pronto, creio que nao tem mais bugs mas se voce achar fala.

 

Estaca os itens automaticamente, e funciona pra qlqr id flw

 

Cara infelizmente quem deslogar com o comando ativado e tentar entrar novamente faz o servidor cair!

Erro no console?

 

Segmentation fault <(aparece somente isso).

 

No mais, o script tava perfeito.

Se der pra ver oque é, agradeço.

 

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado aos demais por me ajudarem.

No mais, neste momento estou de saída, sendo assim, amanhã de manhã vou testar ambos.

 

Abraços.

 

Demonbholder mesmo vendo que voce ja tinha respondido, resolvi postar o meu, o seu script se funcionar eu acho que ele nao vai estacar os itens estacaveis e o seu script gasta mta memoria rodando em todo o container pra cada id de dinheiro.

 

data/creaturescripts/scripts/goldKill.lua:

function getContainerItems(containeruid)
local items = {}
local containers = {}
if type(getContainerSize(containeruid)) ~= "number" then
	return false
end
for slot = 0, getContainerSize(containeruid)-1 do
	local item = getContainerItem(containeruid, slot)
	if item.itemid == 0 then
		break
	end
	if isContainer(item.uid) then
		table.insert(containers, item.uid)
	end
	table.insert(items, item)
end
if #containers > 0 then
	for i,x in ipairs(getContainerItems(containers[1])) do
		table.insert(items, x)
	end
	table.remove(containers, 1)
end	
return items
end

function getItemsInContainerById(container, itemid) -- Function By Kydrai
	local items = {}
	if isContainer(container) and getContainerSize(container) > 0 then
			for slot=0, (getContainerSize(container)-1) do
					local item = getContainerItem(container, slot)
					if isContainer(item.uid) then
							local itemsbag = getItemsInContainerById(item.uid, itemid)
							for i=0, #itemsbag do
									table.insert(items, itemsbag[i])
							end
					else
							if itemid == item.itemid then
									table.insert(items, item.uid)
							end
					end
			end
	end
	return items
end

function doPlayerAddItemStacking(cid, itemid, quant)
local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
	for i,x in pairs(item) do
		if getThing(x).type < 100 then
			local it = getThing(x)
			doTransformItem(it.uid, itemid, it.type+quant)
			if it.type+quant > 100 then
				doPlayerAddItem(cid, itemid, it.type+quant-100)
			end
		else
		   piles = piles+1
		end
	end
else
	return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
	doPlayerAddItem(cid, itemid, quant)
end
end

function corpseRetireItems(corpsepos, killer, itemsarray)
local corpse = nil
for i = 1, 254 do
	corpsepos.stackpos = i
	corpse = getThingFromPos(corpsepos)
	if corpse.uid > 0 and isCorpse(corpse.uid) then
		break
	end
end
local items = getContainerItems(corpse.uid)
for i,x in pairs(items) do
	if isInArray(itemsarray, tonumber(x.itemid)) then
		if isItemStackable(x.itemid) then
			doPlayerAddItemStacking(killer, x.itemid, x.type)
		else
			doPlayerAddItem(killer, x.itemid)
		end
		doRemoveItem(x.uid, x.type)
	end
end
end

function onKill(cid, target, lastHit)
local loots = {2148, 2152, 2160}
if lastHit and getPlayerStorageValue(cid, 6616) == 1 then
	addEvent(corpseRetireItems, 100, getCreaturePosition(target), cid, loots)
end
return true
end

 

data/creaturescripts/creaturescripts.xml:

<event type="kill" name="GoldKill" event="script" value="goldKill.lua"/>

 

Adicione isso no login.lua:

registerCreatureEvent(cid, "GoldKill")

 

 

data/talkactions/scripts/autoGold.lua:

function onSay(cid, words, param)
setPlayerStorageValue(cid, 6616, getPlayerStorageValue(cid, 6616) == -1 and 1 or -1)
doPlayerSendTextMessage(cid, 25, "Auto Loot: " .. (getPlayerStorageValue(cid, 6616) == -1 and "OFF" or "ON"))
return true
end

 

data/talkactions/talkactions.xml:

<talkaction words="/autogold" event="script" value="autoGold.lua"/>

 

Obs: Meu script ainda esta com um bug, nao estaca em itens das bps dentro de bps ja concerto

 

Pronto, creio que nao tem mais bugs mas se voce achar fala.

 

Estaca os itens automaticamente, e funciona pra qlqr id flw

 

Cara infelizmente quem deslogar com o comando ativado e tentar entrar novamente faz o servidor cair!

Erro no console?

 

Segmentation fault <(aparece somente isso).

 

No mais, o script tava perfeito.

Se der pra ver oque é, agradeço.

 

Abraços.

 

Deve ser algum erro ai.. porque aqui no meu (8.60 TFS 0.4) funciono normal.

Link para o comentário
Compartilhar em outros sites

  • 0

Segmention fault Oo vou testar aqui ver se acontece e ja respondo

 

LucasQuevedo

 

Se o gold do cara que foi morto aparece no corpo dele junta sim, caso contrario nao.

 

Voce pode ir no script que adiciona o dinheiro no player e botar essas functions:

function getItemsInContainerById(container, itemid) -- Function By Kydrai
		    local items = {}
		    if isContainer(container) and getContainerSize(container) > 0 then
						    for slot=0, (getContainerSize(container)-1) do
										    local item = getContainerItem(container, slot)
										    if isContainer(item.uid) then
														    local itemsbag = getItemsInContainerById(item.uid, itemid)
														    for i=0, #itemsbag do
																		    table.insert(items, itemsbag[i])
														    end
										    else
														    if itemid == item.itemid then
																		    table.insert(items, item.uid)
														    end
										    end
						    end
		    end
		    return items
end
function doPlayerAddItemStacking(cid, itemid, quant)
    local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
    local piles = 0
    if #item > 0 then
		    for i,x in pairs(item) do
				    if getThing(x).type < 100 then
						    local it = getThing(x)
						    doTransformItem(it.uid, itemid, it.type+quant)
						    if it.type+quant > 100 then
								    doPlayerAddItem(cid, itemid, it.type+quant-100)
						    end
				    else
					   piles = piles+1
				    end
		    end
    else
		    return doPlayerAddItem(cid, itemid, quant)
    end
    if piles == #item then
		    doPlayerAddItem(cid, itemid, quant)
    end
end

 

E na hora de add o dinheiro usa o doPlayerAddItemStacking(cid, itemid, quant)

Link para o comentário
Compartilhar em outros sites

  • 0

@Demonbholder e @MatheusMkalo,

 

Nenhum dos dois scripts funcionam 100%, me ajudem por favor, por exemplo, estou usando o sistema do MatheusMkalo, porem ele não cata gold de por exemplo Souleater, por favor me ajudem, presciso muito.

 

Desde já Muito obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0
Em 27/11/2011 at 12:23, MatheusGlad disse:

 

Em 27/11/2011 at 12:23, MatheusGlad disse:

Demonbholder mesmo vendo que voce ja tinha respondido, resolvi postar o meu, o seu script se funcionar eu acho que ele nao vai estacar os itens estacaveis e o seu script gasta mta memoria rodando em todo o container pra cada id de dinheiro.

data/creaturescripts/scripts/goldKill.lua:



			function getContainerItems(containeruid)

			local items = {}

			local containers = {}

			if type(getContainerSize(containeruid)) ~= "number" then

			return false

			end

			for slot = 0, getContainerSize(containeruid)-1 do

			local item = getContainerItem(containeruid, slot)

			if item.itemid == 0 then

			break

			end

			if isContainer(item.uid) then

			table.insert(containers, item.uid)

			end

			table.insert(items, item)

			end

			if #containers > 0 then

			for i,x in ipairs(getContainerItems(containers[1])) do

			table.insert(items, x)

			end

			table.remove(containers, 1)

			end

			return items

			end


			function getItemsInContainerById(container, itemid) -- Function By Kydrai

			local items = {}

			if isContainer(container) and getContainerSize(container) > 0 then

			for slot=0, (getContainerSize(container)-1) do

			local item = getContainerItem(container, slot)

			if isContainer(item.uid) then

			local itemsbag = getItemsInContainerById(item.uid, itemid)

			for i=0, #itemsbag do

			table.insert(items, itemsbag[i])

			end

			else

			if itemid == item.itemid then

			table.insert(items, item.uid)

			end

			end

			end

			end

			return items

			end


			function doPlayerAddItemStacking(cid, itemid, quant)

			local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)

			local piles = 0

			if #item > 0 then

			for i,x in pairs(item) do

			if getThing(x).type < 100 then

			local it = getThing(x)

			doTransformItem(it.uid, itemid, it.type+quant)

			if it.type+quant > 100 then

			doPlayerAddItem(cid, itemid, it.type+quant-100)

			end

			else

			piles = piles+1

			end

			end

			else

			return doPlayerAddItem(cid, itemid, quant)

			end

			if piles == #item then

			doPlayerAddItem(cid, itemid, quant)

			end

			end


			function corpseRetireItems(corpsepos, killer, itemsarray)

			local corpse = nil

			for i = 1, 254 do

			corpsepos.stackpos = i

			corpse = getThingFromPos(corpsepos)

			if corpse.uid > 0 and isCorpse(corpse.uid) then

			break

			end

			end

			local items = getContainerItems(corpse.uid)

			for i,x in pairs(items) do

			if isInArray(itemsarray, tonumber(x.itemid)) then

			if isItemStackable(x.itemid) then

			doPlayerAddItemStacking(killer, x.itemid, x.type)

			else

			doPlayerAddItem(killer, x.itemid)

			end

			doRemoveItem(x.uid, x.type)

			end

			end

			end


			function onKill(cid, target, lastHit)

			local loots = {2148, 2152, 2160}

			if lastHit and getPlayerStorageValue(cid, 6616) == 1 then

			addEvent(corpseRetireItems, 100, getCreaturePosition(target), cid, loots)

			end

			return true

			end

			[/CODE]


			data/creaturescripts/creaturescripts.xml:

			[CODE]

			<event type="kill" name="GoldKill" event="script" value="goldKill.lua"/>

			[/CODE]


			Adicione isso no login.lua:

			[CODE]

			registerCreatureEvent(cid, "GoldKill")

			[/CODE]



			data/talkactions/scripts/autoGold.lua:

			[CODE]

			function onSay(cid, words, param)

			setPlayerStorageValue(cid, 6616, getPlayerStorageValue(cid, 6616) == -1 and 1 or -1)

			doPlayerSendTextMessage(cid, 25, "Auto Loot: " .. (getPlayerStorageValue(cid, 6616) == -1 and "OFF" or "ON"))

			return true

			end

			[/CODE]


			data/talkactions/talkactions.xml:

			[CODE]

			<talkaction words="/autogold" event="script" value="autoGold.lua"/>

			[/CODE]


			[s]Obs: Meu script ainda esta com um bug, nao estaca em itens das bps dentro de bps ja concerto[/s]


			Pronto, creio que nao tem mais bugs mas se voce achar fala.


			Estaca os itens automaticamente, e funciona pra qlqr id flw
		
	


@MatheusGlad funcionou perfeitamente.. teria como ao invés de mandar o dinheiro pra BP mandar pro bank ou depot?

Editado por fefuxd
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...