Jump to content
  • 0

[Pedido] Autoloot pegando os itens sem precisar click no corpo


bruninho38
 Share

Question

Olá pessoal,

Estou procurando a alguns dias e não consegui fazer da certo ate o momento, então acho que mais pessoas devem ter a mesma dificuldade.

Atualmente alguns servidores de poketibia tem um autoloot que é ativado assim que o monstro morre, você não precisa ir lá click no corpo e nem ficar configurando qual item vc quer.

Uso a base do PokemasterX, esse servidores já te um script que pega todos os loot's, porem precisa click no poke morto, se alguém conseguir fazer o scrip funcionar se click no corpo ou tiver outro script ajudaria muito.

Obrigado!

Script que uso hoje:
 

function getContainerBackpack(containeruid) 

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 
	end 

	for i = 1, #containers do
		if #containers > 1 then
			table.remove(containers, containers[i+1])
		end
		if #containers > 2 then
			table.remove(containers, containers[i+2])
		end
		if #containers > 3 then
			table.remove(containers, containers[i+3])
		end
		if #containers > 4 then
			table.remove(containers, containers[i+4])
		end
		if #containers > 5 then
			table.remove(containers, containers[i+5])
		end
	end
		
	for i = 1, #containers do 
		for _, x in ipairs(getContainerBackpack(containers[i])) do 
			table.insert(containers, x) 
		end 
	end 
	
	return containers 
end

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 isCorpse(item)
	return string.find(getItemNameById(item.itemid), "fainted") or string.find(getItemNameById(item.itemid), "defeated ")
end

function getCorpsesPosition(position)
	local toret = { } -- table to return items
	
	position.stackpos = 1
	
	while true do -- loop to catch the items and insert them in toret table
		local thing = getThingfromPos(position)
		if thing.itemid == 0 then -- thing doesn't exist, break the loop...
			break
		end
		
		if thing.uid > 0 and isContainer(thing.uid) and isCorpse(thing) then
			table.insert(toret,thing)
		end
		
		position.stackpos = position.stackpos + 1 -- get next item
	end
	
	return toret
end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo
	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 doLoot(cid, corpse)

	if not isCollectAll(cid) then
		return true
	end
	
	if not isContainer(corpse.uid) then
		return false
	end
	
	local itemsToLootAllWindow = {}
	
	for _, loot in pairs(getContainerItems(corpse.uid)) do
		local slot = getPlayerSlotItem(cid, 3).uid
		local container = getContainerBackpack(slot)
		local item1 = getPlayerStorageValue(cid, 251461):explode("|") or 0
		
		function configLoot()
			local itt = "".. tostring(getItemInfo(loot.itemid).clientId) .."|".. loot.type .."|"
			local ittt1, ittt2 = itt:explode("|")[1], itt:explode("|")[2]
			local itr = ittt1 .."-".. ittt2 .."-"
			table.insert(itemsToLootAllWindow, itr)				
			doRemoveItem(loot.uid)
			doSendPlayerExtendedOpcode(cid, 69, table.concat(itemsToLootAllWindow))	
		end

		--// Sistema de Daily Itens \\--
		
		if inDailyItens(cid) then	
			if tonumber(item1[1]) == loot.itemid then
				doPlayerSendTextMessage(cid, 20, "[Daily Itens]: Resta você coletar ["..(tonumber(item1[3]) - getPlayerItemCount(cid, item1[1])) - loot.type.."] "..getItemNameById(loot.itemid)..".")
			end
							
			if tonumber(item1[2]) == loot.itemid then
				doPlayerSendTextMessage(cid, 20, "[Daily Itens]: Resta você coletar ["..(tonumber(item1[4]) - getPlayerItemCount(cid, item1[2])) - loot.type.."] "..getItemNameById(loot.itemid)..".")
			end
							
			if tonumber(item1[5]) == loot.itemid then
				doPlayerSendTextMessage(cid, 20, "[Daily Itens]: Resta você coletar ["..(tonumber(item1[7]) - getPlayerItemCount(cid, item1[5])) - loot.type.."] "..getItemNameById(loot.itemid)..".")
			end		
			
			if tonumber(item1[6]) == loot.itemid then
				doPlayerSendTextMessage(cid, 20, "[Daily Itens]: Resta você coletar ["..(tonumber(item1[8]) - getPlayerItemCount(cid, item1[6])) - loot.type.."] "..getItemNameById(loot.itemid)..".")
			end
		end
			
		--// Sistema de Daily Itens \\--
		
			if #container < 1 then
				doPlayerAddItem(cid, loot.itemid, loot.type)
				configLoot()	
			end					
		
			for i = 1, #container do
				if #container >= 1 then
					if getContainerSlotsFree(container[i]) >= 1 then
						doAddContainerItem(container[i], loot.itemid, loot.type)	
						configLoot()	
						break
					end
				else
					doPlayerAddItem(cid, loot.itemid, loot.type)
					configLoot()				  	
				end
			end			
		end	
	end

function checkLoot(cid, corpse, SemMensagem)

	if not isContainer(corpse.uid) then
		return false
	end

	local quemMatou = getItemAttribute(corpse.uid, "corpseowner")
	
	if quemMatou then
		local player = getCreatureByName(quemMatou)
		if isPlayer(player) then
			local isInParyWithPlayer = false
			if isInParty(cid) and isInParty(player) then
				isInParyWithPlayer = isPartyEquals(player, cid)
			end
			
			if getCreatureName(cid) ~= getCreatureName(player) and not isInParyWithPlayer then
				if not SemMensagem then
					doPlayerSendCancel(cid, "Você não pode abrir um loot que não é seu.")
				end
				return false
			end
		end
	end
	return true
end

function onUse(cid, item, frompos, item2, topos)

	
	if isWatchingTv(cid) then 
		return true 
	end

	if not isContainer(item.uid) then
		return true
	end
	
	if not isCollectAll(cid) then
		return false
	end

	local maxItem = 800
	if isContainer(item.uid)then
		if (getPlayerTotalItem(cid) + #getAllItemsFromContainer(item)) > maxItem then
			doPlayerSendCancel(cid, "Você não pode carregar mais itens pois já lotou a quantidade de slot's disponíveis")
			return false
		end
	else
		if getPlayerTotalItem(cid) + 1 > maxItem then
			doPlayerSendCancel(cid, "Você não pode carregar mais itens pois já lotou a quantidade de slot's disponíveis")
			return false
		end
	end
	
	local openCorpse = 	#getContainerItems(item.uid) < 1

	if checkLoot(cid, item, false) then
		doLoot(cid, item)
	end
	
	for _, corpse in pairs(getCorpsesPosition(getThingPosition(item.uid))) do
		if checkLoot(cid, corpse, false) then
			doLoot(cid, corpse)	
		end
	end
	
	if openCorpse then
		return false
	end
	
	return true
end

 

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

 Share

×
×
  • Create New...