Quando o shop manda e o item não chega para o player aparece algum error? posta seu script pra mim ver como ta.
- Fórum
- OTServ
- Suporte
- Tópicos Sem Resposta
- [Encerrado] Script Shop Enviar Item
info
Grupo: Lorde
Registrado: 05/06/12
Posts: 2.2k
Reputação: +215
Gênero: Masculino

Quando o shop manda e o item não chega para o player aparece algum error? posta seu script pra mim ver como ta.
não! não aparece nada no executável...é como se o script simplesmente não existisse, mas tá tudo certo, a tag pelo menos eu botei certo
já usei esses 2 e não deu em nada:
function onThink()
local r = db.getResult('SELECT * FROM shop_history WHERE processed=0')
if r:getID() ~= -1 then
repeat
local cid = getPlayerByName(r:getDataString('player'))
if isPlayer(cid) then
local bp = getPlayerSlotItem(cid, CONST_SLOT_BACKPACK).uid
if bp ~= 0 then
local j = db.getResult('SELECT * FROM shop_offer WHERE id='..r:getDataInt('product'))
if j:getID() ~= -1 then
local id = tonumber(j:getDataInt('item'))
local tid = tonumber(r:getDataInt('id'))
local count = tonumber(j:getDataInt('count'))
local tipe = tonumber(j:getDataInt('type'))
local name = j:getDataString('name')
if tipe == 5 or tipe == 8 then
local w = getItemInfo(id).weight * count
if getPlayerFreeCap(cid) >= w then
if doAddContainerItemEx(bp, doCreateItemEx(id, count)) == 1 then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have received >> '..name..' << from our shop system')
db.executeQuery('UPDATE shop_history SET processed=1 WHERE id = ' .. tid)
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You don\'t have enough space in backpack to receive >> '..name..' <<')
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'Sorry, you don\'t have enough capacity to receive >> '..name..' << (You need: '..getItemInfo(id).weight * count..' Capacity)')
end
elseif tipe == 6 or tipe == 7 then
local bid, bcap =
tipe == 6 and 1987 or 1988,
tipe == 6 and 8 or 20
local w = getItemInfo(bid).weight + (getItemInfo(id).weight * count * bcap)
if getPlayerFreeCap(cid) >= w then
local c = doCreateItemEx(bid)
for i = 1, bcap do
doAddContainerItem(c, id, count)
end
if doPlayerAddItemEx(getPlayerSlotItem(cid, 3).uid, c) == RETURNVALUE_NOERROR then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have received >> '..name..' << from our shop system')
db.executeQuery('UPDATE shop_history SET processed=1 WHERE id='..tid)
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'Sorry, you don\'t have enough space to receive >> '..name..' <<')
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'Sorry, you don\'t have enough capacity to receive >> '..name..' << (You need: '..w..' Capacity)')
end
end
j:free()
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You don\'t have a container in your backpack slot.')
end
end
until not r:next()
r:free()
end
return true
end
function doPlayerAddDepotItems(cid, items, town)
if (not isPlayer(cid)) then
error("Player not found")
end
local town = town or getPlayerTown(cid)
local parcel = doCreateItemEx(ITEM_PARCEL)
for item, count in pairs(items) do
if (type(item) == "number") then
local attritemid = doAddContainerItem(parcel, item, count)
doItemSetAttribute(attritemid, "description", "This item belongs to ".. getPlayerName(cid) ..".")
doItemSetAttribute(attritemid, "aid", getPlayerGUID(cid)+10000)
elseif (type(item) == "string") then
doAddContainerItem(parcel, getItemIdByName(item), count)
else
error("Undefinied type of item name")
end
end
return doPlayerSendMailByName(getCreatureName(cid), parcel, town)
end
function onThink(interval, lastExecution, thinkInterval)
local result = db.getResult("SELECT * FROM shop_history WHERE `processed` = 0;")
if(result:getID() ~= -1) then
while(true) do
cid = getCreatureByName(tostring(result:getDataString("player")))
product = tonumber(result:getDataInt("product"))
itemr = db.getResult("SELECT * FROM shop_offer WHERE `id` = "..product..";")
if isPlayer(cid) then
local id = tonumber(itemr:getDataInt("item"))
local tid = tonumber(result:getDataInt("id"))
local count = tonumber(itemr:getDataInt("count"))
local tipe = tonumber(itemr:getDataInt("type"))
local productn = tostring(itemr:getDataString("name"))
if isInArray({5,8},tipe) then
if getPlayerFreeCap(cid) >= getItemWeightById(id, count) then
if isPlayer(cid) then
received = doPlayerAddDepotItems(cid, {[id]=count})
if received then
doPlayerSendTextMessage(cid,19, "You received "..productn.." in depot of your hometown.")
db.executeQuery("UPDATE `shop_history` SET `processed`='1' WHERE id = " .. tid .. ";")
doPlayerSave(cid)
else
doPlayerSendTextMessage(cid,19, "You need a free slot on container to receive "..productn..".")
end
else
doPlayerSendTextMessage(cid,19, "You need a free container to receive "..productn..".")
end
else
doPlayerSendTextMessage(cid,19, "You need "..getItemWeightById(id, count).." of free capacity to receive "..productn..".")
end
elseif isInArray({6,7},tipe) then
if tipe == 6 then
bcap = 8
bid = 1987
elseif tipe == 7 then
bcap = 20
bid = 1988
end
if isItemRune(id) then
count = 1
end
if getPlayerFreeCap(cid) >= (getItemWeightById(1987, 1) + getItemWeightById(id,count * bcap)) then
local bag = doCreateItemEx(bid, 1)
for i = 1,bcap do
doAddContainerItem(bag, id, count)
end
received = doPlayerAddDepotItems(cid, bag)
if received == RETURNVALUE_NOERROR then
doPlayerSendTextMessage(cid,19, "You received "..productn.." in depot of your hometown.")
db.executeQuery("UPDATE `shop_history` SET `processed`='1' WHERE id = " .. tid .. ";")
doPlayerSave(cid)
else
doPlayerSendTextMessage(cid,19, "You need a free slot on container to receive "..productn..".")
end
else
doPlayerSendTextMessage(cid,19, "You need "..getItemWeightById(id, count).." of free capacity to receive "..productn..".")
end
end
end
itemr:free()
if not(result:next()) then
break
end
end
result:free()
end
return true
end
info
Grupo: Lorde
Registrado: 05/06/12
Posts: 2.2k
Reputação: +215
Gênero: Masculino

Tente esse:
function onThink()
local r = db.getResult('SELECT * FROM shop_history WHERE processed=0')
if r:getID() ~= -1 then
repeat
local cid = getPlayerByName(r:getDataString('player'))
if isPlayer(cid) then
local bp = getPlayerSlotItem(cid, CONST_SLOT_BACKPACK).uid
if bp ~= 0 then
local j = db.getResult('SELECT * FROM shop_offer WHERE id='..r:getDataInt('product'))
if j:getID() ~= -1 then
local id = tonumber(j:getDataInt('item'))
local tid = tonumber(r:getDataInt('id'))
local count = tonumber(j:getDataInt('count'))
local tipe = tonumber(j:getDataInt('type'))
local name = j:getDataString('name')
if tipe == 5 or tipe == 8 then
local w = getItemInfo(id).weight * count
if getPlayerFreeCap(cid) >= w then
if doAddContainerItemEx(bp, doCreateItemEx(id, count)) == 1 then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, "You have received '..name..' from our shop system")
db.executeQuery('UPDATE shop_history SET processed=1 WHERE id = ' .. tid)
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You don\'t have enough space in backpack to receive .'.name..')')
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'Sorry, you don\'t have enough capacity to receive '..name..' (You need: '..getItemInfo(id).weight * count..' Capacity)')
end
elseif tipe == 6 or tipe == 7 then
local bid, bcap =
tipe == 6 and 1987 or 1988,
tipe == 6 and 8 or 20
local w = getItemInfo(bid).weight + (getItemInfo(id).weight * count * bcap)
if getPlayerFreeCap(cid) >= w then
local c = doCreateItemEx(bid)
for i = 1, bcap do
doAddContainerItem(cid, id, count)
end
if doPlayerAddItemEx(getPlayerSlotItem(cid, 3).uid, c) == RETURNVALUE_NOERROR then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have received '..name..' from our shop system')
db.executeQuery('UPDATE shop_history SET processed=1 WHERE id='..id)
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, "Sorry, you don\'t have enough space to receive" '..name..')
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'Sorry, you don\'t have enough capacity to receive '..name..' (You need: '..w..' Capacity')')
end
end
j:free()
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, "You don\'t have a container in your backpack slot.")
end
end
until not r:next()
r:free()
end
return true
end
Veja se funciona.
Se não funcionar me avisa.
Tente esse:
function onThink()
local r = db.getResult('SELECT * FROM shop_history WHERE processed=0')
if r:getID() ~= -1 then
repeat
local cid = getPlayerByName(r:getDataString('player'))
if isPlayer(cid) then
local bp = getPlayerSlotItem(cid, CONST_SLOT_BACKPACK).uid
if bp ~= 0 then
local j = db.getResult('SELECT * FROM shop_offer WHERE id='..r:getDataInt('product'))
if j:getID() ~= -1 then
local id = tonumber(j:getDataInt('item'))
local tid = tonumber(r:getDataInt('id'))
local count = tonumber(j:getDataInt('count'))
local tipe = tonumber(j:getDataInt('type'))
local name = j:getDataString('name')
if tipe == 5 or tipe == 8 then
local w = getItemInfo(id).weight * count
if getPlayerFreeCap(cid) >= w then
if doAddContainerItemEx(bp, doCreateItemEx(id, count)) == 1 then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, "You have received '..name..' from our shop system")
db.executeQuery('UPDATE shop_history SET processed=1 WHERE id = ' .. tid)
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You don\'t have enough space in backpack to receive .'.name..')')
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'Sorry, you don\'t have enough capacity to receive '..name..' (You need: '..getItemInfo(id).weight * count..' Capacity)')
end
elseif tipe == 6 or tipe == 7 then
local bid, bcap =
tipe == 6 and 1987 or 1988,
tipe == 6 and 8 or 20
local w = getItemInfo(bid).weight + (getItemInfo(id).weight * count * bcap)
if getPlayerFreeCap(cid) >= w then
local c = doCreateItemEx(bid)
for i = 1, bcap do
doAddContainerItem(cid, id, count)
end
if doPlayerAddItemEx(getPlayerSlotItem(cid, 3).uid, c) == RETURNVALUE_NOERROR then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'You have received '..name..' from our shop system')
db.executeQuery('UPDATE shop_history SET processed=1 WHERE id='..id)
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, "Sorry, you don\'t have enough space to receive" '..name..')
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, 'Sorry, you don\'t have enough capacity to receive '..name..' (You need: '..w..' Capacity')')
end
end
j:free()
end
else
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, "You don\'t have a container in your backpack slot.")
end
end
until not r:next()
r:free()
end
return true
end
Veja se funciona.
Se não funcionar me avisa.
não funcionou.
info
Grupo: Herói
Registrado: 28/11/10
Posts: 3.4k
Reputação: +585
Gênero: Masculino

+ Caso a dúvida não tenha sido resolvida você poderá criar outro tópico solicitando ajuda.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado.



info
Grupo: Campones
Registrado: 05/07/06
Posts: 53
Reputação: 0
fala gente!
então, eu uso um tfs 0.4 rev 3777 e eu uso um script para fazer o shop enviar itens automaticamente, mãs não funciona...
o shop system do site funciona certinho, ele adiciona no database o que o player comprou, que a compra ainda não foi processada, mas o item não é enviado ao player. acho que é algum erro no script, algo como se ele não conseguisse se conectar com a database para pegar os que não foram processador e mandar o item...alguém tem um script de enviar itens que funcione? obs: uso modern aac