PI
dúvida

Comando Adicionar Quant. Item Ao Player

Por piratadoidao, 13 de dez. de 2012 em Scripts

item
tibia
player
baiak
8.60
additem
script
18
4.8k
piratadoidaoP
13 de dezembro de 2012 às 17:54

Bom galera to com um probleminha nesse Script,

que adiciona A quantidade de Item desejada ao Player

E no caso do Player estar OFFLINE, o item é mandado para o DP!

Porem estou com um erro..

 

Aqui esta o Script:

 

 

function isValidName(name)

return db.getResult("SELECT `id` FROM `players` WHERE `name` = " .. db.escapeString(name) .. ";"):getID() ~= -1

end

 

function onSay(cid, words, param, channel)

 

if param == "" then

doPlayerSendTextMessage(cid, 27, "Params missing! [name], [item], [qnt]")

return true

end

 

local t = string.explode(param, ",")

local depot = false

 

if type(t) ~= "table" then

doPlayerSendTextMessage(cid, 27, "Params missing! [name], [item], [qnt]")

return true

end

 

local player = getPlayerByName(tostring(t[1]))

if not isPlayer(player) then

player = tostring(t[1])

depot = true

if not isValidName(t[1]) then

doPlayerSendTextMessage(cid, 27, "Player with that name doesn't exist!")

return true

end

end

 

local id = tonumber(t[2])

local qnt = tonumber(t[3]) or 1

if not id then

id = getItemIdByName(t[2], false)

if not id then

doPlayerSendTextMessage(cid, 27, "Item wich such name does not exists.")

return true

end

end

 

local itemtoadd = getItemIdByName(t[2])

if isPlayer(player) and getItemWeightById(itemtoadd) > getPlayerFreeCap(player) then

depot = true

end

 

if isPlayer(player) then

if depot then

doPlayerSendMailByName(t[1], t[2], t[3])

else

doPlayerAddItem(getPlayerByName(t[1]), t[2], t[3])

end

doPlayerSendTextMessage(cid, 20, "Item delivered to the player: "..t[1]..".")

else

doPlayerSendMailByName(t[1], t[2], t[3])

doPlayerSendTextMessage(cid, 20, "Item delivered to the player: "..t[1]..".")

end

return true

end

 

 

 

E este é o ERRO que está dando...

 

Quando mando

/additem ...

Tudo certinho com os parametros...

Ele diz que enviou... mas no distro aparece:

 

" [error - Talkaction interface]

data/talkactions/scripts/additem.lua: onSay;

Description:

<luaDoPlayerSendMailByName> Item not Found. "

 

Se alguém puder ajudar... to precisando muito desse sisteminha! hehe

Obrigado.

OneshotO
13 de dezembro de 2012 às 21:20
function isValidName(name)
   return db.getResult("SELECT `id` FROM `players` WHERE `name` = ".. db.escapeString(name) ..";"):getID() ~= -1
end

function onSay(cid, words, param, channel)
   if param == "" then
       doPlayerSendCancel(cid, "Parameters missing. ".. words .." [name], [id], [amount].")
       return true
   end

   local t = string.explode(param, ",")
   local depot = false

   local pid = getPlayerByNameWilcard(t[1])
   if not pid then
       pid = t[1]
       depot = true
       if not isValidName(t[1]) then
           doPlayerSendCancel("A player with this name doesn't exists.")
           return true
       end
   end

   local itemid = getItemIdByName(t[2], false)
   if not itemid then
       doPlayerSendCancel(cid, "A item with this name doesn't exists.")
       return true
   end

   local amount = tonumber(t[3]) or 1
   if depot == true then
       local item = doCreateItemEx(itemid, amount)
       doPlayerSendMailByName(pid, item)
   else
       doPlayerAddItem(pid, itemid, amount)
   end
   doPlayerSendTextMessage(cid, 20, "Item delivered to the player: ".. t[1] ..".")
   return true
end

piratadoidaoP
13 de dezembro de 2012 às 21:37

/additem.. nao esta indo ainda

agora nem o comando entra...

ja da erro antes...

olha... ta aparecendo:

 

[error - talkaction interface]

description:

data/talkaction/additem.lua:15 : attempt to call global 'getPlayerByNameWilcard' <a nil value>

stack traceback:

data/talkaction/additem.lua:15 :in function <data/talkaction/additem.lua:6 >

 

Mas Obrigado! :D

SlicerS
13 de dezembro de 2012 às 21:41

mano como q tu ta usando o comando? --'

o certo eh /additem nome do player, itemid, qntdade

Editado Dezembro 13 por Slicer

piratadoidaoP
13 de dezembro de 2012 às 21:47

mano como q tu ta usando o comando? --'

o certo eh /additem nome do player, itemid, qntdade

 

Eu estou usando assim mesmo....

Aii da akilo la... ;s

Tentei no lugar do ITEM...

Primeiro coloquei com o ID do item...

Depois coloquei pelo NOME do item..

Deu na mesma .... :/

OneshotO
13 de dezembro de 2012 às 22:09
function isValidName(name)
   return db.getResult("SELECT `id` FROM `players` WHERE `name` = ".. db.escapeString(name) ..";"):getID() ~= -1
end

function onSay(cid, words, param, channel)
   if param == "" then
       doPlayerSendCancel(cid, "Parameters missing. ".. words .." [name], [item_name], [amount].")
       return true
   end

   local t = string.explode(param, ",")
   local depot = false

   local pid = getPlayerByName(t[1])
   if not pid then
       pid = t[1]
       depot = true
       if not isValidName(t[1]) then
           doPlayerSendCancel("A player with this name doesn't exists.")
           return true
       end
   end

   local itemid = getItemIdByName(t[2], false)
   if not itemid then
       doPlayerSendCancel(cid, "A item with this name doesn't exists.")
       return true
   end

   local amount = tonumber(t[3]) or 1
   if depot == true then
       local item = doCreateItemEx(itemid, amount)
       doPlayerSendMailByName(pid, item)
   else
       doPlayerAddItem(pid, itemid, amount)
   end
   doPlayerSendTextMessage(cid, 20, "Item delivered to the player: ".. t[1] ..".")
   return true
end

Editado Dezembro 13 por Oneshot

piratadoidaoP
14 de dezembro de 2012 às 10:29

Opa! Vlws ae :D

Só que ta com esse probleminha...

Quando coloca os Parametros do /additem sem a virgula ele da PLAYER NOT FOUND!

E se colocar pelo ID do item, ele não acha...

E se colocar pelo Nome do item tudo certinho..

Da erro no distro e fexa sozinho ;s

Ta tenso.. kk' Será que é pela versão? TFS 0.4

OneshotO
14 de dezembro de 2012 às 10:43

Seu servidor não é The Forgotten Server 0.4, uma vez que essa versão não possui a função doSendMailByName, e possui a função getPlayerByNameWildcard, que achei estranho o seu servidor não ter.

 

E quem disse que é para digitar os parâmetros sem vírgula?

Editado Dezembro 14 por Oneshot

piratadoidaoP
14 de dezembro de 2012 às 10:57

Seu servidor não é The Forgotten Server 0.4, uma vez que essa versão não possui a função doSendMailByName, e possui a função getPlayerByNameWildcard, que achei estranho o seu servidor não ter.

 

E quem disse que é para digitar os parâmetros sem vírgula?

 

É sim... The Forgotten Server 0.4.0.0

Sim, eu sei que precisa das Virgulas, apenas estava testando todos os Meios

Porem é como eu disse... Assim que digito no caso: /additem PLAYER,sword,1

O server fexa... ;s

:(

OneshotO
14 de dezembro de 2012 às 11:06

Vou testar o script aqui e ver qual o erro.

 

Abraços.

 

@Edit

 

Aqui funcionou perfeitamente :)

Editado Dezembro 14 por Oneshot

SlicerS
14 de dezembro de 2012 às 11:45

sword n eh um id e nem um nome de item valido u,U

tens q por ou o id do item ou o nome CERTINHU do item...

SmiXS
14 de dezembro de 2012 às 12:55

@Slicer

Existe sim um item com o nome "Sword"

@Topic

function isValidName(name)
return db.getResult("SELECT `id` FROM `players` WHERE `name` = " .. db.escapeString(name) .. ";"):getID() ~= -1
end

function onSay(cid, words, param, channel)

if param == "" then
doPlayerSendTextMessage(cid, 27, "Params missing! [name], [item], [qnt]")
return true
end

local t = string.explode(param, ",")
local depot = false

if type(t) ~= "table" then
doPlayerSendTextMessage(cid, 27, "Params missing! [name], [item], [qnt]")
return true
end

local player = getPlayerByName(tostring(t[1]))
if not isPlayer(player) then
player = tostring(t[1])
depot = true
if not isValidName(t[1]) then
doPlayerSendTextMessage(cid, 27, "Player with that name doesn't exist!")
return true
end
end

local id = tonumber(t[2])
local qnt = tonumber(t[3]) or 1
if not id then
id = getItemIdByName(t[2], false)
if not id then
doPlayerSendTextMessage(cid, 27, "Item wich such name does not exists.")
return true
end
end

local itemtoadd = getItemIdByName(t[2])
if isPlayer(player) and getItemWeightById(itemtoadd) > getPlayerFreeCap(player) then
depot = true
end

if isPlayer(player) then
if depot then
doPlayerSendMailByName(t[1], itemtoadd, t[3])
else
doPlayerAddItem(getPlayerByName(t[1]), itemtoadd, t[3])
end
doPlayerSendTextMessage(cid, 20, "Item delivered to the player: "..t[1]..".")
else
doPlayerSendMailByName(t[1], itemtoadd, t[3])
doPlayerSendTextMessage(cid, 20, "Item delivered to the player: "..t[1]..".")
end
return true
end

Editado Dezembro 14 por SmiX

SlicerS
14 de dezembro de 2012 às 13:18

existe? kk eh melhor eu fica quieto.. sei nd sobre tibia... ms assim eh estranhu a talk n funcionar.. eu tb testei e tava funcionando ;/

piratadoidaoP
14 de dezembro de 2012 às 13:34

Então... Aqui o Distro abre sem Erro algum!

Só acontece isso quando coloco mesmo..

Se vou pelo ID, ele da ITEM NOT FOUND!

Se coloco pelo NOME do ITEM, ele da erro e fexa... ;s

 

 

@Edit

 

Depois que eu abri denovo o server, entrei no char que eu estava testando, e tinha os 2 itens no DP!

Conclusão: Ele entrega, mas entrega um item completamente diferente do que eu mandei... e ainda da erro e cai o server...

Editado Dezembro 14 por piratadoidao

SlicerS
14 de dezembro de 2012 às 15:49

se ta usando o doo oneShot deve ser por causa disso..

local item = doCreateItemEx(itemid, amount) 

n sei muito sobre essa funçao.. mas se n me engano ela cria um item com itemid-1.. algu do genero ;x