~~removido~~
- Fórum
- OTServ
- Suporte
- Resolvidos
- (resolvido) remover x item e ganhar pokémon
(resolvido) remover x item e ganhar pokémon
Por kaleudd, 07 de dez. de 2016 em Resolvidos
Editado Dezembro 8 por kaleudd
info
Grupo: Herói
Registrado: 25/10/11
Posts: 2.2k
Reputação: +862
Gênero: Masculino
Char no Tibia: Sociopata

UP é considerado flood. Por favor, use o botao correspondente a um "SINO", para que seu topico seja levantado ao topo do feed. ^^
Como este pedido é bastante semelhante com o anterior que você fez, usei o antigo código como base.
local trade_item = xxx --ID do item que será usado como moeda de troca.local pokemon = { --{name = "nome_do_pokémon", price = xxx, boost = xxx}, --etc}function doCorrectString(str) --Slicer local name = str:explode(" ") local final = {} for _, s in ipairs(name) do table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower()) end return table.concat(final, (name[2] and " " or ""))endfunction onSay(cid, words, param) local p, poke = param:lower(), {} if p:find("lista") then local str, n = "******** You can buy: ********", tonumber(p:explode(" ")[2]) if not n then doPlayerSendCancel(cid, "Type a number first.") return true elseif n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return true end for i = (15 * (n - 1)) + 1, 15 * n do local poke = pokemon[i] if not poke then break end str = str.."\n-"..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s)." end doPlayerPopupFYI(cid, str) else local poke for i = 1, #pokemon do if pokemon[i].name == doCorrectString(p) then poke = pokemon[i] break end end if not poke then doPlayerSendCancel(cid, "Invalid parameter. Type 'list' to see a list of pokemon you can buy, or type the name of the wished pokemon.") return true elseif getPlayerItemCount(cid, trade_item) < poke.price then doPlayerSendCancel(cid, "Sorry, you do not have enough points. ["..poke.price.." "..getItemNameById(trade_item).."]") return true end doPlayerSendTextMessage(cid, 27, "You successfully bought a "..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s).") doPlayerRemoveItem(cid, trade_item, poke.price) addPokeToPlayer(cid, poke.name, poke.boost, nil, "normal") end return trueend
Se o modelo de comando não lhe agradar (!comprar lista n e !comprar nome_do_pokémon), avise que editarei o código.
Editado Dezembro 10 por zipter98
15 horas atrás, Deadpool disse:UP é considerado flood. Por favor, use o botao correspondente a um "SINO", para que seu topico seja levantado ao topo do feed. ^^
a compra funcionou de boas,só que poderia modificar tipo,quando eu digitar !orb
apareçeria a lista dos pokémon em popup ou no default mesmo
e para comprar seria !orb nome_do_pokémon
por que se não,ficará assim
!orb orb 1
e fica ruim,gostaria só de !orb e ja aparecia os pokémon disponiveis para troca pelo x item
~~update~~
e tambem apos eu digitar um numero dipo !comprar lista n
sem nenhum numero ele causa um erro na distro,não sei se prejudica:
tipo deixar o ''n'' que caso seria o numero,em branco e der enter.
segue o erro :
[09/12/2016 12:42:47] [Error - TalkAction Interface]
[09/12/2016 12:42:47] data/talkactions/scripts/orb.lua:onSay
[09/12/2016 12:42:47] Description:
[09/12/2016 12:42:47] data/talkactions/scripts/orb.lua:25: attempt to compare number with nil
[09/12/2016 12:42:47] stack traceback:
[09/12/2016 12:42:47] data/talkactions/scripts/orb.lua:25: in function <data/talkactions/scripts/orb.lua:19>
Editado Dezembro 9 por kaleudd
Ah, esqueci que alguém poderia deixar de digitar o número da lista. Corrigido.
Fiz uma edição para que o popup permaneça, removendo-se o parâmetro lista:
!orb n mostrará a lista conforme seu número.
!orb pokémon para comprar o pokémon, como antes.
local trade_item = xxx --ID do item que será usado como moeda de troca.local pokemon = { --{name = "nome_do_pokémon", price = xxx, boost = xxx}, --etc}function doCorrectString(str) --Slicer local name = str:explode(" ") local final = {} for _, s in ipairs(name) do table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower()) end return table.concat(final, (name[2] and " " or ""))endfunction onSay(cid, words, param) local p = param:lower() if tonumber(p) then local str, n = "******** You can buy: ********", tonumber(p) if n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return true end for i = (15 * (n - 1)) + 1, 15 * n do local poke = pokemon[i] if not poke then break end str = str.."\n-"..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s)." end doPlayerPopupFYI(cid, str) else local poke for i = 1, #pokemon do if pokemon[i].name == doCorrectString(p) then poke = pokemon[i] break end end if not poke then doPlayerSendCancel(cid, "Invalid parameter. Type a number to see a list of pokemon you can buy, or type the name of the wished pokemon.") return true elseif getPlayerItemCount(cid, trade_item) < poke.price then doPlayerSendCancel(cid, "Sorry, you do not have enough points. ["..poke.price.." "..getItemNameById(trade_item).."]") return true end doPlayerSendTextMessage(cid, 27, "You successfully bought a "..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s).") doPlayerRemoveItem(cid, trade_item, poke.price) addPokeToPlayer(cid, poke.name, poke.boost, nil, "normal") end return trueend
Se preferir que apenas !orb mostre a lista, enquanto !orb pokémon compre-o:
local trade_item = xxx --ID do item que será usado como moeda de troca.local pokemon = { --{name = "nome_do_pokémon", price = xxx, boost = xxx}, --etc}function doCorrectString(str) --Slicer local name = str:explode(" ") local final = {} for _, s in ipairs(name) do table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower()) end return table.concat(final, (name[2] and " " or ""))endfunction onSay(cid, words, param) local p = param:lower() if p == "" then local str = "******** You can buy: ********" for i = 1, #pokemon do str = str.."\n-"..pokemon[i].name.." [+"..pokemon[i].boost.."] for "..pokemon[i].price.." "..getItemNameById(trade_item).."(s)." end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, str) else local poke for i = 1, #pokemon do if pokemon[i].name == doCorrectString(p) then poke = pokemon[i] break end end if not poke then doPlayerSendCancel(cid, "Invalid parameter. Type !orb to see the list of pokemon you can buy, or type the name of the wished pokemon.") return true elseif getPlayerItemCount(cid, trade_item) < poke.price then doPlayerSendCancel(cid, "Sorry, you do not have enough points. ["..poke.price.." "..getItemNameById(trade_item).."]") return true end doPlayerSendTextMessage(cid, 27, "You successfully bought a "..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s).") doPlayerRemoveItem(cid, trade_item, poke.price) addPokeToPlayer(cid, poke.name, poke.boost, nil, "normal") end return trueend
Editado Dezembro 10 por zipter98
7 horas atrás, zipter98 disse:Ah, esqueci que alguém poderia deixar de digitar o número da lista. Corrigido.
Fiz uma edição para que o popup permaneça, removendo-se o parâmetro lista:
!orb n mostrará a lista conforme seu número.
!orb pokémon para comprar o pokémon, como antes.
local trade_item = xxx --ID do item que será usado como moeda de troca.local pokemon = { --{name = "nome_do_pokémon", price = xxx, boost = xxx}, --etc}function doCorrectString(str) --Slicer local name = str:explode(" ") local final = {} for _, s in ipairs(name) do table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower()) end return table.concat(final, (name[2] and " " or ""))endfunction onSay(cid, words, param) local p = param:lower() if tonumber(p) then local str, n = "******** You can buy: ********", tonumber(p) if n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return true end for i = (15 * (n - 1)) + 1, 15 * n do local poke = pokemon[i] if not poke then break end str = str.."\n-"..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s)." end doPlayerPopupFYI(cid, str) else local poke for i = 1, #pokemon do if pokemon[i].name == doCorrectString(p) then poke = pokemon[i] break end end if not poke then doPlayerSendCancel(cid, "Invalid parameter. Type a number to see a list of pokemon you can buy, or type the name of the wished pokemon.") return true elseif getPlayerItemCount(cid, trade_item) < poke.price then doPlayerSendCancel(cid, "Sorry, you do not have enough points. ["..poke.price.." "..getItemNameById(trade_item).."]") return true end doPlayerSendTextMessage(cid, 27, "You successfully bought a "..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s).") doPlayerRemoveItem(cid, trade_item, poke.price) addPokeToPlayer(cid, poke.name, poke.boost, nil, "normal") end return trueend
Se preferir que apenas !orb mostre a lista, enquanto !orb pokémon compre-o:
local trade_item = xxx --ID do item que será usado como moeda de troca.local pokemon = { --{name = "nome_do_pokémon", price = xxx, boost = xxx}, --etc}function doCorrectString(str) --Slicer local name = str:explode(" ") local final = {} for _, s in ipairs(name) do table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower()) end return table.concat(final, (name[2] and " " or ""))endfunction onSay(cid, words, param) local p = param:lower() if p == "" then local str = "******** You can buy: ********" for i = 1, #pokemon do str = str.."\n-"..pokemon[i].name.." [+"..pokemon[i].boost.."] for "..pokemon[i].price.." "..getItemNameById(trade_item).."(s)." end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, str) else local poke for i = 1, #pokemon do if pokemon[i].name == doCorrectString(p) then poke = pokemon[i] break end end if not poke then doPlayerSendCancel(cid, "Invalid parameter. Type !orb to see the list of pokemon you can buy, or type the name of the wished pokemon.") return true elseif getPlayerItemCount(cid, trade_item) < poke.price then doPlayerSendCancel(cid, "Sorry, you do not have enough points. ["..poke.price.." "..getItemNameById(trade_item).."]") return true end doPlayerSendTextMessage(cid, 27, "You successfully bought a "..poke.name.." [+"..poke.boost.."] for "..poke.price.." "..getItemNameById(trade_item).."(s).") doPlayerRemoveItem(cid, trade_item, poke.price) addPokeToPlayer(cid, poke.name, poke.boost, nil, "normal") end return trueend
bem funcionou como esperavamos,sabe o script shop por points que vc usou como base,naquele script aconteçe o mesmo erro caso o player não digite um numero ao falar /shop lista
poderia corrigilo tmb?
Ah, esqueci que alguém poderia deixar de digitar o número da lista. Corrigido.
script do shop:
local pokemon = {
{name = "Groudon", price = 100, boost = 100},
{name = "Kyogre", price = 100, boost = 100},
{name = "Abra", price = 100, boost = 100},
{name = "Aerodactyl", price = 100, boost = 100},
{name = "Alakazam", price = 100, boost = 100},
{name = "Arbok", price = 100, boost = 100},
{name = "Arcanine", price = 100, boost = 100},
{name = "Articuno", price = 100, boost = 100},
{name = "Beedrill", price = 100, boost = 100},
{name = "Bellsprout", price = 100, boost = 100},
{name = "Blastoise", price = 100, boost = 100},
{name = "Bulbasaur", price = 100, boost = 100},
{name = "Cubone", price = 100, boost = 100},
{name = "Dugtrio", price = 100, boost = 100},
{name = "Fearow", price = 100, boost = 100},
-- lista 2
{name = "Charmander", price = 100, boost = 100},
{name = "Gloom", price = 100, boost = 100},
--etc
}
function doCorrectString(str) --Slicer
local name = str:explode(" ")
local final = {}
for _, s in ipairs(name) do
table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower())
end
return table.concat(final, (name[2] and " " or ""))
end
function onSay(cid, words, param)
local p, poke = param:lower(), {}
if p:find("lista") then
local str, n = "******** You can buy: ********", tonumber(p:explode(" ")[2])
if n > math.ceil(#pokemon / 15) then
doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".")
return true
end
for index = (15 * (n - 1)) + 1, 15 * n do
local poke = pokemon[index]
if not poke then break end
str = str.."\n-"..poke.name.." [+"..poke.boost.."] for "..poke.price.." premium point(s)."
end
doPlayerPopupFYI(cid, str)
else
local poke
for i = 1, #pokemon do
if pokemon.name == doCorrectString(p) then
poke = pokemon
break
end
end
if poke then
if getAccountPoints(cid) < poke.price then
doPlayerSendCancel(cid, "Sorry, you do not have enough points. ["..poke.price.." premium points]")
return true
end
doPlayerSendTextMessage(cid, 27, "You successfully bought a "..poke.name.." [+"..poke.boost.."] for "..poke.price.." premium point(s).")
doAccountRemovePoints(cid, poke.price)
addPokeToPlayer(cid, poke.name, poke.boost, nil, "normal")
else
doPlayerSendCancel(cid, "Invalid parameter. Type 'list' to see a list of pokemon you can buy, or type the name of the wished pokemon.")
end
end
return true
end
Editado Dezembro 11 por kaleudd
Troque:
if n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return trueend
por:
if not n then doPlayerSendCancel(cid, "Type a number first.") return trueelseif n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return trueend
PS: Recomendo que use a ferramenta code (logo acima) para postar códigos, pois parece que o XTibia está cortando alguns caracteres dos comentários.
Editado Dezembro 11 por zipter98
8 horas atrás, zipter98 disse:Troque:
if n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return trueendpor:
if not n then doPlayerSendCancel(cid, "Type a number first.") return trueelseif n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return trueend
PS: Recomendo que use a ferramenta code (logo acima) para postar códigos, pois parece que o XTibia está cortando alguns caracteres dos comentários.
certinho,valeu pela ajuda.
info
Grupo: Herói
Registrado: 25/10/11
Posts: 2.2k
Reputação: +862
Gênero: Masculino
Char no Tibia: Sociopata

Caro membro, seu tópico foi movido de Otserv > Suporte Otserv para Suporte Otserv > Otserv > Pedidos e Dúvidas Resolvidos.




info
Grupo: Conde
Registrado: 15/06/15
Posts: 729
Reputação: +200
boa noite a todos,gostaria de pedir um script por talkactions:
bem vo tentar explicar o que ele fará:
seria assim,o player teria que ter x item no inventario (na pokebag) e assim apos ter x item,ele digitaria !pokemons,e apareceria um lista de pokémon que ele poderia trocar no x item,e depois falaria !comprar blastoise,por exemplo,ou qualquer outro pokémon da lista,a lista dos pokémon poderia apareçer em uma popup ja seria otimo,se der para botar para o personagem que tiver 6 pokémon quando for comprar,o pokémon comprado iria para o depot,obrigado.
basicamente é trocar x item por pokémon e o x item seria removido.
base: pda com sources;
Editado Dezembro 7 por kaleudd