Ir para conteúdo
  • 0

(resolvido) remover x item e ganhar pokémon


kaleudd

Pergunta

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 por kaleudd
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Como este pedido é bastante semelhante com o anterior que você fez, usei o antigo código como base.

Spoiler
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 por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0
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 por kaleudd
Link para o comentário
Compartilhar em outros sites

  • 0

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.

 

Spoiler
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:

Spoiler
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 por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0
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.

 

  Mostrar conteúdo oculto
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:

  Mostrar conteúdo oculto
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:

 

Spoiler

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 por kaleudd
Link para o comentário
Compartilhar em outros sites

  • 0

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 por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0
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 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.

certinho,valeu pela ajuda.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...