Ir para conteúdo

[OtClient] Auto-Loot


Gengo

Posts Recomendados

Em 23/05/2019 em 10:59, Gengo disse:

 

Não foi eu que fiz a parte do autoloot na parte do servidor, veja os créditos de quem fez e veja com eles o erro que você está tendo, agora se você está tendo problemas com o módulo eu posso te ajudar.

Obrigado eu consegui resolver :)

Link para o comentário
Compartilhar em outros sites

  • 4 weeks later...

eu estou tentando colocar esse autoloot no otx 2.9 mais ta dando este erro.. estou usando sem site para testar...
 

data/creaturescripts/scripts/login.lua:onLogin

Description: 
data/creaturescripts/scripts/login.lua:54: attempt to call global 'doSendPlayerExtendedOpcode' (a nil value)
stack traceback:
 data/creaturescripts/scripts/login.lua:54: in function <data/creaturescripts/scripts/login.lua:6>
sqlite3_prepare_v2(): SQLITE ERROR: near "LIMIT": syntax error (UPDATE "players" SET "broadcasting" = 0, "viewers" = 0 WHERE "id" = 2 LIMIT 1)
Pegas has logged out.

Link para o comentário
Compartilhar em outros sites

10 horas atrás, robinpah disse:

eu estou tentando colocar esse autoloot no otx 2.9 mais ta dando este erro.. estou usando sem site para testar...
 

data/creaturescripts/scripts/login.lua:onLogin

Description: 
data/creaturescripts/scripts/login.lua:54: attempt to call global 'doSendPlayerExtendedOpcode' (a nil value)
stack traceback:
 data/creaturescripts/scripts/login.lua:54: in function <data/creaturescripts/scripts/login.lua:6>
sqlite3_prepare_v2(): SQLITE ERROR: near "LIMIT": syntax error (UPDATE "players" SET "broadcasting" = 0, "viewers" = 0 WHERE "id" = 2 LIMIT 1)
Pegas has logged out.

O erro diz que seu servidor não tem a função doSendPlayerExtendedOpcode.

Link para o comentário
Compartilhar em outros sites

  • 4 weeks later...

pode me ajudar a colocar este scrip no otx 2.9 7.72 ?
da esse erro ao tentar adicionar o item:

a unica coisa que ta funcionando é coletar gold
 

[7/8/2019 22:57:23] [Error - TalkAction Interface] 
[7/8/2019 22:57:23] local cid = 268451960
[7/8/2019 22:57:23] local words = "!autoloot"
[7/8/2019 22:57:23] local param = "club"
[7/8/2019 22:57:23] local channel = 65534
[7/8/2019 22:57:23] domodlib('Loot_func')
[7/8/2019 22:57:23] local param, slots = param:lower(), isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free
[7/8/2019 22:57:23] if not param or param == "" then
[7/8/2019 22:57:23] 	ShowItemsTabble(cid) return true
[7/8/2019 22:57:23] elseif tonumber(param) then
[7/8/2019 22:57:23] 	doPlayerSendCancel(cid, "enter commands: !autoloot item name [+] !autoloot clean [+] !autoloot money [+] !autoloot on/off") return true
[7/8/2019 22:57:23] elseif isInArray({"clean","limpar", "clear"}, param) then
[7/8/2019 22:57:23] 	setPlayerStorageValue(cid, info.Storages[1], -1)
[7/8/2019 22:57:23] 	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Your list has been cleaned.") return true
[7/8/2019 22:57:23] elseif isInArray({"start","stop","on","off"}, param) then
[7/8/2019 22:57:23] 	setPlayerStorageValue(cid, info.Storages[3], getPlayerStorageValue(cid, info.Storages[3]) <= 0 and 1 or 0)
[7/8/2019 22:57:23] 	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] "..(getPlayerStorageValue(cid, info.Storages[3]) > 0 and "Stopped" or "Started")..".") return true
[7/8/2019 22:57:23] elseif isInArray({"money","gold","gps","dinheiro"}, param) then
[7/8/2019 22:57:23] 	setPlayerStorageValue(cid, info.Storages[2], getPlayerStorageValue(cid, info.Storages[2]) <= 0 and 1 or 0)
[7/8/2019 22:57:23] 	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Gold Colleting "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "Activated" or "disabled")..".") return true
[7/8/2019 22:57:23] elseif isInArray({"autoselling","autosell","autovender","vender"}, param) then
[7/8/2019 22:57:23] 	setPlayerStorageValue(cid, info.Storages[4], getPlayerStorageValue(cid, info.Storages[4]) <= 0 and 1 or 0)
[7/8/2019 22:57:23] 	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Automatic Itens Selling "..(getPlayerStorageValue(cid, info.Storages[4]) > 0 and "Activated" or "disabled")..".") return true
[7/8/2019 22:57:24] end
[7/8/2019 22:57:24] local item = ExistItemByName(tostring(param))
[7/8/2019 22:57:24] if not item then
[7/8/2019 22:57:24] 	doPlayerSendCancel(cid, "This item does not exist.") return true
[7/8/2019 22:57:24] end
[7/8/2019 22:57:24] local item = getItemIdByName(tostring(param))
[7/8/2019 22:57:24] if not item then
[7/8/2019 22:57:24] 	doPlayerSendCancel(cid, "This item does not exist.") return true
[7/8/2019 22:57:24] elseif isInArray({2148,2152,2160},item) then 
[7/8/2019 22:57:24] 	doPlayerSendCancel(cid, "Enter !autoloot money to add money in your list!") return true	
[7/8/2019 22:57:24] elseif isInArray(info.BlockItemsList, item) then
[7/8/2019 22:57:24] 	doPlayerSendCancel(cid, "You can not add this item in the list!") return true
[7/8/2019 22:57:24] elseif #getPlayerStorageTable(cid, info.Storages[1]) >= slots then
[7/8/2019 22:57:24] 	doPlayerSendCancel(cid, "max "..slots.." from auto loot") return true
[7/8/2019 22:57:24] end
[7/8/2019 22:57:24] local var = isInTable(cid, item)
[7/8/2019 22:57:24] if not var then
[7/8/2019 22:57:24] 	addItemTable(cid, item)
[7/8/2019 22:57:24] else
[7/8/2019 22:57:24] 	removeItemTable(cid, item)
[7/8/2019 22:57:24] end
[7/8/2019 22:57:24] doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,not var and "you added the item "..param.." in the list" or "you removed the item "..param.." from the list")
[7/8/2019 22:57:24] return true
[7/8/2019 22:57:24] Description: 
[7/8/2019 22:57:24] [string "info = {..."]:41: attempt to index a nil value

 

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

para adicionar a função doSendPlayerExtendedOpcode tem que adicionar na source é? poderia fazer um sistema igual do otp? tipo quando abre o loot e clica no item ele é movido para a bag!

Link para o comentário
Compartilhar em outros sites

Em 13/08/2019 em 00:50, Duhisback disse:

para adicionar a função doSendPlayerExtendedOpcode tem que adicionar na source é? poderia fazer um sistema igual do otp? tipo quando abre o loot e clica no item ele é movido para a bag!

Sim precisa ter nas source opcodes.
Ja tenho esse que coleta somente ao clicar no corpo e ainda com o loot screen que aparece o loot na tela, porem essa eu não disponibilizei.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Gengo disse:

Sim precisa ter nas source opcodes.
Ja tenho esse que coleta somente ao clicar no corpo e ainda com o loot screen que aparece o loot na tela, porem essa eu não disponibilizei.

essa função 

doSendPlayerExtendedOpcode

meu amigo sabe mexer na source mas você pode me arrumar os códigos para adicionar nela? dependendo acho que até eu consigo colocar.

Link para o comentário
Compartilhar em outros sites

  • 2 months later...
  • 2 weeks later...
Em 15/12/2018 em 10:57, Gengo disse:

Fala ai galera do xtibia estou aqui trazendo mais um module para o otClient.
Esses dias atras estavo jogando pokestorm e me deparei com o autoloot e decidi fazer um parecido com o deles e então pensei porque não trazer para a comunidade? Afinal não vejo muitos modulos de autoloot para otClient o unico que vi foi o autoloot da DxP, porem não é muito intuitivo comparado com modulo da pokestorm, bom sem mais enrolação vamos lá.

 

Feito o download do arquivo, coloque-o na pasta do seu otClient em /modules/ e pronto já é possível "utilizar-lo", porem com algumas exceções de algumas configurações básicas que temos que fazer para poder utilizar-lo com algumas eficiências.

 

Na pasta do seu otClient/data/ crie uma pasta chamada items e coloque o seus arquivos items.otb e items.xml.

Vai até a pasta do seu otClient/modules/game_things abre o arquivo things.lua e procure a função load(), e coloque o seguinte:


g_things.loadOtb ('/items/items.otb')
g_things.loadXml('/items/items.xml')

Obs: Não se assustem quando entrarem no client para logar, no inicio vai dar uma travada, mas depois de esperar uns segundos ele normaliza, pois o único problema é que o carregamento dos arquivos dos items eles são demorados.

 

Também é preciso fazer umas configurações rápida na parte do servidor para poder funcionar.


Copie e cole esse script e coloque na pasta do servidor em  mods/ e de o nome de autoloot.xml

  Mostrar conteúdo oculto


<?xml version="1.0" encoding="ISO-8859-1"?>
<mod name="Loot System" version="1.0" author="Vodkart And Mkalo" contact="none.com" enabled="yes">
<config name="Loot_func"><![CDATA[

info = {
	AutomaticDeposit = true,
	BlockMonsters = {},
	BlockItemsList = {2123,2515},
	Max_Slots = {free = 3, premium = 5},
	Storages = {27000,28001,28002}
}
function setPlayerStorageTable(cid, storage, tab)
	local tabstr = "&"
	for i,x in pairs(tab) do
		tabstr = tabstr .. i .. "," .. x .. ";"
	end
	setPlayerStorageValue(cid, storage, tabstr:sub(1, #tabstr-1))
end
function getPlayerStorageTable(cid, storage)
	local tabstr = getPlayerStorageValue(cid, storage)
	local tab = {}
	if type(tabstr) ~= "string" then
		return {}
	end
	if tabstr:sub(1,1) ~= "&" then
		return {}
	end
	local tabstr = tabstr:sub(2, #tabstr)
	local a = string.explode(tabstr, ";")
	for i,x in pairs(a) do
		local b = string.explode(x, ",")
		tab[tonumber(b[1]) or b[1]] = tonumber(b[2]) or b[2]
	end
	return tab
end
function isInTable(cid, item)
	for _,i in pairs(getPlayerStorageTable(cid, info.Storages[1]))do
		if tonumber(i) == tonumber(item) then
			return true
		end
	end
	return false
end
function addItemTable(cid, item)
	local x = {}
	for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do
		table.insert(x,getPlayerStorageTable(cid, info.Storages[1])[i])
	end
	if x ~= 0 then
		table.insert(x,tonumber(item))
		setPlayerStorageTable(cid, info.Storages[1], x)
	else
		setPlayerStorageTable(cid, info.Storages[1], {item})
	end
end
function removeItemTable(cid, item)
	local x = {}
	for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do
		table.insert(x,getPlayerStorageTable(cid, info.Storages[1])[i])
	end
	for i,v in ipairs(x) do
		if tonumber(v) == tonumber(item) then
			table.remove(x,i)
		end
	end
	return setPlayerStorageTable(cid, info.Storages[1], x)
end
function ShowItemsTabble(cid)
	local n,str = 0,"[+] Auto Loot Commands [+]\n\n!autoloot item name --> To add ou Remove item from list.\n!autoloot money --> To collect gold automatically.\n!autoloot clear --> To clear the list.\n!autoloot on/off --> To enable or disable the collecting of items in the system.\n\n[+] Auto Loot Info [+]\n\nSystem: "..(getPlayerStorageValue(cid, info.Storages[3]) <= 0 and "Activated" or "Disabled")..".\nGold Collecting: "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "Activated" or "Disabled")..".\nBalance Total: ["..getPlayerBalance(cid).."] gp's.\nMaximum Slots: ["..#getPlayerStorageTable(cid, info.Storages[1]).."/"..(isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free).."]\n\n[+] Auto Loot Slots [+]\n\n"
	for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do
		n = n + 1
		str = str.."Slot "..n.." - "..getItemNameById(getPlayerStorageTable(cid, info.Storages[1])[i]).."\n"
	end
	return doPlayerPopupFYI(cid, str)
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 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, amount) -- revisado
	local item, _G = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid), 0
	if #item > 0 then
		for _ ,x in pairs(item) do
			local ret = getThing(x)
			if ret.type < 100 then
				doTransformItem(ret.uid, itemid, ret.type+amount) 
				if ret.type+amount > 100 then
					doPlayerAddItem(cid, itemid, ret.type+amount-100)
				end
				break
			else
				_G = _G+1
			end
		end
		if _G == #item then
			doPlayerAddItem(cid, itemid, amount)
		end
	else
		return doPlayerAddItem(cid, itemid, amount)
	end
end
function AutomaticDeposit(cid,item,n)
	local deposit = item == tonumber(2160) and (n*10000) or tonumber(item) == 2152 and (n*100) or (n*1)
	return doPlayerDepositMoney(cid, deposit)
end
function corpseRetireItems(cid, pos)
	local check = false
	for i = 0, 255 do
		pos.stackpos = i
		tile = getTileThingByPos(pos)
		if tile.uid > 0 and isCorpse(tile.uid) then
			check = true break
		end
	end
	if check == true then
		local items = getContainerItems(tile.uid)
		for i,x in pairs(items) do
			if isInArray(getPlayerStorageTable(cid, info.Storages[1]), tonumber(x.itemid)) or getPlayerStorageValue(cid, info.Storages[2]) > 0 and isInArray({2148,2152,2160},tonumber(x.itemid)) then
				if isItemStackable(x.itemid) then
					doPlayerAddItemStacking(cid, x.itemid, x.type)
					if info.AutomaticDeposit == true and isInArray({2148,2152,2160}, tonumber(x.itemid)) then
						AutomaticDeposit(cid,x.itemid,x.type)
					end
				else
					doPlayerAddItem(cid, x.itemid)
				end
				doRemoveItem(x.uid)
			end
		end
	end
end
]]></config>
<event type="login" name="LootLogin" event="script"><![CDATA[
function onLogin(cid)
	registerCreatureEvent(cid, "LootEventKIll")
	if isPremium(cid) and getPlayerStorageValue(cid, 27001) <= 0 then
		setPlayerStorageValue(cid, 27001, 1)
	elseif getPlayerStorageValue(cid, 27001) > 0 and not isPremium(cid) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[Auto Loot] You premium is Over, Start a new list!")
		setPlayerStorageValue(cid, 27001, -1)
		setPlayerStorageValue(cid, info.Storages[1], -1)
	end
	return true
end]]></event>
<event type="kill" name="LootEventKIll" event="script"><![CDATA[
domodlib('Loot_func')
function onKill(cid, target, lastHit) 
	if isPlayer(cid) and getPlayerStorageValue(cid, info.Storages[3]) <= 0 and isMonster(target) and not isInArray(info.BlockMonsters, getCreatureName(target):lower()) then
		addEvent(corpseRetireItems, 0, cid ,getThingPos(target))
	end
	return true
end]]></event>
<talkaction words="!autoloot;/autoloot" event="buffer"><![CDATA[
domodlib('Loot_func')
local slots = isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free
if not param:lower() or param:lower() == "" then
	return true
elseif param:lower() == "clean" then
	setPlayerStorageValue(cid, info.Storages[1], -1)
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Your list has been cleaned.") 
	return true
elseif isInArray({"on","off"}, param:lower()) then
	setPlayerStorageValue(cid, info.Storages[3], getPlayerStorageValue(cid, info.Storages[3]) <= 0 and 1 or 0)
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] "..(getPlayerStorageValue(cid, info.Storages[3]) > 0 and "Stopped" or "Started")..".")
	return true
end

local param = string.explode(param, ",")
if param[1]:lower() == "add" then
local item = getItemIdByName(param[2], false)
if not item then
	doPlayerSendCancel(cid, "This item does not exist.")
	return true
end
local var = isInTable(cid, item)

if isInArray(info.BlockItemsList, item) then
	doPlayerSendCancel(cid, "You can not add this item in the list!")
	return true
elseif not var and #getPlayerStorageTable(cid, info.Storages[1]) >= slots then
	doPlayerSendCancel(cid, "max "..slots.." from auto loot") return true
end
if not var then
	addItemTable(cid, item)
end
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[AutoLoot] You added the item ["..param[2].."] in the list")
elseif param[1]:lower() == "remove" then
	local item = getItemIdByName(param[2], false)
	if not item then
		doPlayerSendCancel(cid, "This item does not exist.")
		return true
	end
	removeItemTable(cid, item)
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[AutoLoot] You removed the item ["..param[2].."] from the list")
end

return true]]></talkaction>
</mod>

 


Ainda na pasta do seu servidor abre o arquivo /data/creaturescripts/scripts/login.lua e coloque o seguinte script dentro da função onLogin:


local loot = ''
for i = 1, #getPlayerStorageTable(cid, info.Storages[1]) do
  loot = loot..getItemInfo(getPlayerStorageTable(cid, info.Storages[1])[i]).clientId..'-'..getItemNameById(getPlayerStorageTable(cid, info.Storages[1])[i])..'@'
end
doSendPlayerExtendedOpcode(cid, 157, loot)


Feito todos os passos corretamente, configurado certo, deve ficar assim no game:

auto_loot.png.24d504b065011ea525edd52e66a9f355.png

 

Bom espero que tenham entendido e gostado, não sou muito de ficar escrevendo tutorial, até uma próxima. 

 

Download

 

Créditos

  Mostrar conteúdo oculto

Gengo(eu) - módule para o otClient.

Vodkart e Mkalo - autoloot na parte do servidor.

 

irmao fiz como vc ensinou, porem quando clico para abrir o char no cliente nao abre o char

saberia me dizer alguem como posso resolver isso

?

Link para o comentário
Compartilhar em outros sites

  • 2 months later...

@Gengo, tentei instalar seu mod porem veio algumas dúvidas e erros.

 

1 - Quando você disse para criar o arquivo autoloot.xml na pasta mods dentro do servidor...meu servidor não tem essa pasta.

2 - Ele tambem não está pegando o loot acredito que seja por causa do item "1" acima.

3 - Não consigo logar e da esse erro   

Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/login.lua:onLogin
data/creaturescripts/scripts/login.lua:58: attempt to index global 'info' (a nil value)
stack traceback:
        [C]: in function '__index'
        data/creaturescripts/scripts/login.lua:58: in function <data/creaturescripts/scripts/login.lua:1>

O tfs que uso é 1.2.

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

3 horas atrás, lazarus disse:

@Gengo, tentei instalar seu mod porem veio algumas dúvidas e erros.

 

1 - Quando você disse para criar o arquivo autoloot.xml na pasta mods dentro do servidor...meu servidor não tem essa pasta.

2 - Ele tambem não está pegando o loot acredito que seja por causa do item "1" acima.

3 - Não consigo logar e da esse erro   


Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/login.lua:onLogin
data/creaturescripts/scripts/login.lua:58: attempt to index global 'info' (a nil value)
stack traceback:
        [C]: in function '__index'
        data/creaturescripts/scripts/login.lua:58: in function <data/creaturescripts/scripts/login.lua:1>

O tfs que uso é 1.2.


1 - Utilize um autoloot que você saiba que funciona no seu servidor e faça sua adaptação 

2 - Se ele nao está pegando o loot utilize um autoloot que funcione para seu servidor

3 - Vai dar esse erro porque você não conseguiu fazer a parte do autoloot corretamente.

 

Tem autoloot em outros foruns para tfs 1.x, você so vai precisar fazer uma pequena adaptação que não é dificil ja que o tutorial ja tem a base da logica do funcionamento.

 

Link para o comentário
Compartilhar em outros sites

  • 3 months later...

Gengo tenta me ajuda!

olha esse erro 

 

[16/05/2020 01:20:29] [Error - CreatureScript Interface] 
[16/05/2020 01:20:29] data/creaturescripts/scripts/login.lua:onLogin
[16/05/2020 01:20:29] Description: 
[16/05/2020 01:20:29] data/creaturescripts/scripts/login.lua:12: attempt to call global 'doSendPlayerExtendedOpcode' (a nil value)
[16/05/2020 01:20:29] stack traceback:

 

Tentei arrumar sozinho mais n consegui

Link para o comentário
Compartilhar em outros sites

7 horas atrás, vittorlob disse:

Gengo tenta me ajuda!

olha esse erro 

 

[16/05/2020 01:20:29] [Error - CreatureScript Interface] 
[16/05/2020 01:20:29] data/creaturescripts/scripts/login.lua:onLogin
[16/05/2020 01:20:29] Description: 
[16/05/2020 01:20:29] data/creaturescripts/scripts/login.lua:12: attempt to call global 'doSendPlayerExtendedOpcode' (a nil value)
[16/05/2020 01:20:29] stack traceback:

 

Tentei arrumar sozinho mais n consegui

Seu servidor não tem opcodes instalado.
Utilize esse tutorial para instalar no seu servidor:

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...