Ir para conteúdo
Banner com Efeitos

Featured Replies

Postado

Muito criativo esse sistema e você desenvolveu muito bem, parabéns!!

 

Porém fazer por table storage, fica bem limitado o sistema, afinal, como você deve saber, existe uma certa quantia de caracteres/números que uma storage suporta.

 

° Um dos BUGS consiste em: O jogador vender 1000 itens de uma vez por um preço maior, e depois comprar o mesmo item e quantidade por um preço menor, refazer esses passos e fazer dinheiro fácil.

 

Sobre a limitação do storage, você pode criar tabelas usando database ou criar um arquivo txt ou lua para salvar os dados e acessar quando quiser.

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

  • Respostas 13
  • Visualizações 3.2k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Muito criativo esse sistema e você desenvolveu muito bem, parabéns!!   Porém fazer por table storage, fica bem limitado o sistema, afinal, como você deve saber, existe uma certa quantia de c

  • Sobre a limitação gerada por utilizar storage, sim de fato com o tempo pode ser tornar 1 problema. Porém sobre o bug de vender por X preço e recomprar mais barato, ele na verdade não existe, a não s

  • O estoque não reseta com o server save, a única forma de alterar o estoque seria comprando os items que o npc tem disponível para venda. O tópico já foi criado na área de sistemas para tfs 0.

Posted Images

Postado
  • Autor
1 hora atrás, Vodkart disse:

Muito criativo esse sistema e você desenvolveu muito bem, parabéns!!

 

Porém fazer por table storage, fica bem limitado o sistema, afinal, como você deve saber, existe uma certa quantia de caracteres/números que uma storage suporta.

 

° Um dos BUGS consiste em: O jogador vender 1000 itens de uma vez por um preço maior, e depois comprar o mesmo item e quantidade por um preço menor, refazer esses passos e fazer dinheiro fácil.

 

Sobre a limitação do storage, você pode criar tabelas usando database ou criar um arquivo txt ou lua para salvar os dados e acessar quando quiser.

Sobre a limitação gerada por utilizar storage, sim de fato com o tempo pode ser tornar 1 problema.
Porém sobre o bug de vender por X preço e recomprar mais barato, ele na verdade não existe, a não ser que o usuário cause esse bug.
Basicamente, na tabela dos items é definido o preço base de compra e o preço de venda, o preço de compra nunca será aumentado, indiferente da quantidade desse item no estoque, ele vai apenas reduzir o preço, se o player vender 1000 unidades de 1 única vez, ele iria vender as 1000 unidades pelo preço 10, e quando fosse comprar, iria pagar 20 por cada unidade.
image.png.cc731dcfa7bce048184c782acd1bfcf6.png
Então, a não ser que a pessoa defina o preço de compra superior ao preço de venda, esse bug eu acredito que não iria acontecer.
Mas em geral, obrigado pelo feedback.

Editado por Tottin (veja o histórico de edições)

Postado
39 minutos atrás, Tottin disse:

Sobre a limitação gerada por utilizar storage, sim de fato com o tempo pode ser tornar 1 problema.
Porém sobre o bug de vender por X preço e recomprar mais barato, ele na verdade não existe, a não ser que o usuário cause esse bug.
Basicamente, na tabela dos items é definido o preço base de compra e o preço de venda, o preço de compra nunca será aumentado, indiferente da quantidade desse item no estoque, ele vai apenas reduzir o preço, se o player vender 1000 unidades de 1 única vez, ele iria vender as 1000 unidades pelo preço 10, e quando fosse comprar, iria pagar 20 por cada unidade.
image.png.cc731dcfa7bce048184c782acd1bfcf6.png
Então, a não ser que a pessoa defina o preço de compra superior ao preço de venda, esse bug eu acredito que não iria acontecer.
Mas em geral, obrigado pelo feedback.

 

Ah verdade, achei que ele iria comprar mais caro, por exemplo (20 gp),  e se ele tivesse muito desses itens já em estoque, vender mais barato, pela lei da oferta e demanda... 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

  • 3 weeks later...
Postado
Em 13/01/2021 em 22:20, Tottin disse:

                                                                                   Explicação do Sistema

 

Recentemente foi levantada uma ideia de Sistema no Discord da Academia de Programação
O sistema consiste em dar maior liberdade pro mercado e tirar a parte monótona dos NPCS que basicamente sempre vendem/compram tudo ao mesmo preço, assim ficando muito longe da realidade de 1 verdadeiro vendedor.
A ideia é que o NPC venda produtos com base no que ele tenha em estoque, logo para ele vender 1 Blusa ele 1° irá precisar comprá-la de alguém.
Exemplificando:
O NPC só irá vender aquilo que comprar, se ele comprar 1 Blusa ele irá disponibilizar para vender 1 Blusa, se ele comprar 7 Blusas, ele irá disponibilizar pra vender 7 Blusas, ao acabar elas, o seu estoque fica vazio e ele deixa de vender até comprar mais.
O preço que o NPC paga pelo seus produtos é baseado na quantidade de seu estoque, e o valor que ele cobra ao vender os produtos é definido previamente em 1 configuração.
Exemplo: Quanto + item do mesmo produto o NPC tiver, + barato ele irá pagar nos mesmos, visto que ele já possui 1 estoque grande e na teoria esse produto não é um produto que possui 1 saída muito fácil. Ao mesmo tempo, quanto menor a quantidade de 1 mesmo produto em seu estoque, mais caro ele irá pagar, já que seu estoque sobre aquele produto é pequeno, o que indica que: Ou ele é muito raro, ou ele vende muito fácil, por isso o NPC irá demonstrar + interesse por ele.
O preço que o NPC cobra é definido previamente e pode ser alterado sempre que desejar.

Abaixo, o preço de 1 Pearl Shield que o NPC não possui em estoque:
image.png.89210d090d06b585803b04129f55a87f.png 

E agora, após o NPC ter comprado 10 Shields do mesmo:
image.png.3fd3d9e59837397d4d50a9bb471a2a2c.png

Enfim, agora que o sistema já foi previamente explicado, vamos a instalação:

Vá para data/lib/ e crie 1 arquivo chamado npc_system.lua, nele você irá adicionar o seguinte código:
 

  Mostrar conteúdo oculto


configurations = {
    Storage = 98170, -- storage utilizada pelo sistema para armazenar os items disponiveis para venda no npc
}


-- Tabela de items a serem comprados pelo Npc -- 
tb_Items = { 
--  [ITEMID] = {price = PRECO QUE O NPC VAI PAGAR AO PLAYER, newPrice = PRECO QUE O NPC VAI VENDER O ITEM}
    [15803] = {price = 10, newPrice = 20}, -- Sapphire Shield
    [15804] = {price = 10, newPrice = 20}, -- Pearl Shield
}


-------- Nao mexa daqui para baixo se não souber
function setStorageTable(storage, tab)
    local tabstr = "&"
    for i,x in pairs(tab) do
        tabstr = tabstr .. i .. "," .. x.itemid .. ","..x.count..";"
    end
    setGlobalStorageValue(storage, tabstr:sub(1, #tabstr-1))
end

function getStorageTable(storage) 
    local tabstr = getGlobalStorageValue(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, ",")
        table.insert(tab, {itemid = tonumber(b[2]) or b[2], count = tonumber(b[3]) or b[3]})
    end
    return tab
end

function isInNpcTable(item, tb)
    for _,i in pairs(tb)do
        if tonumber(i.id) == tonumber(item) then
            return true
        end
    end
    return false
end

function addNpcItemTable(item, count)
    local x = getStorageTable(configurations.storage)
    local exist = false
    for v, k in pairs(x) do
        if tonumber(k.itemid) == tonumber(item) then
            k.count = k.count + count
            exist = true
        end
    end
    if not exist then
        table.insert(x,{itemid = tonumber(item), count = count})
        setStorageTable(configurations.storage, x)
    end
    return setStorageTable(configurations.storage, x)
end

function removeNpcItemTable(item, count)
    local x = getStorageTable(configurations.storage)
    for i,v in ipairs(x) do
        if tonumber(v.itemid) == tonumber(item) then
            if v.count > count then
                v.count = v.count - count
            else
                table.remove(x,i)
            end
        end
    end
    return setStorageTable(configurations.storage, x)
end

function attNpcItemsList(cid)
local tb = {}
local npc_items = getStorageTable(configurations.storage)
    for var, ret in pairs(tb_Items) do
        for v, k in pairs(npc_items) do
            if not isInNpcTable(k.itemid, tb) and not isInNpcTable(var, tb) then
                if var == k.itemid then
                    if getItemInfo(k.itemid).stackable == true then
                        if k.count > 500 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.5, name = getItemNameById(var)})
                        elseif k.count > 400 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.6, name = getItemNameById(var)})
                        elseif k.count > 300 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.7, name = getItemNameById(var)})
                        elseif k.count > 200 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.8, name = getItemNameById(var)})
                        elseif k.count > 100 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.9, name = getItemNameById(var)})
                        else
                            table.insert(tb, {id = var, subType = 0, sell = ret.price, name = getItemNameById(var)})
                        end
                    else
                        if k.count > 50 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.5, name = getItemNameById(var)})
                        elseif k.count > 40 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.6, name = getItemNameById(var)})
                        elseif k.count > 30 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.7, name = getItemNameById(var)})
                        elseif k.count > 20 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.8, name = getItemNameById(var)})
                        elseif k.count > 10 then
                            table.insert(tb, {id = var, subType = 0, sell = ret.price*0.9, name = getItemNameById(var)})
                        else
                            table.insert(tb, {id = var, subType = 0, sell = ret.price, name = getItemNameById(var)})
                        end
                    end
                end
            end
        end
        if not isInNpcTable(var, tb) then
            table.insert(tb, {id = var, subType = 0, sell = ret.price, name = getItemNameById(var)})
        end
    end
    for var, ret in pairs(tb_Items) do
        for v, k in pairs(npc_items) do
            if var == k.itemid then
                table.insert(tb, {id = k.itemid, subType = 0, buy = ret.newPrice, count = k.count, name = getItemNameById(k.itemid)})
            end
        end
    end
return tb
end

 


2º Agora vá para  data/npcs, crie 1 arquivo chamado: negociante.xml, nele você irá adicionar o seguinte código:
 

  Mostrar conteúdo oculto


<?xml version="1.0"?>
<npc name="Negociante" script="negociante.lua" walkinterval="50000" floorchange="0">
    <health now="150" max="150"/>
    <look type="181" head="120" body="50" legs="97" feet="132"/>
<parameters>
<parameter key="message_greet" value="Ola |PLAYERNAME|. Eu compro equipamentos e items variados. Diga 'trade' para ver minhas ofertas."/>
</parameters>
</npc>

 

3º Agora vá para data/npcs/scripts, crie 1 arquivo chamado: negociante.lua, nele você irá adicionar o seguinte código:
 

  Mostrar conteúdo oculto


local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end
function creatureSayCallback(cid, type, msg)
    if(not npcHandler:isFocused(cid)) then
        return false
    end
    local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid
    local shopWindow = {}
    onSelling = function(cid, item, subType, amount, ignoreCap, inBackpacks)
        local store,exausted = 552612,3
        local priceTicks = tb_Items[item].price*amount
        if getPlayerStorageValue(cid, store) >= os.time() then
            doPlayerSendCancel(cid, "Espere " .. getPlayerStorageValue(cid, store) - os.time() .. " segundos para vender seus items.") return true
        end
        if doPlayerRemoveItem(cid, item, amount) then
            doPlayerAddMoney(cid, priceTicks)
            npcHandler:say("Voce vendeu " .. amount .. "x " .. getItemNameById(item) .. " por " .. priceTicks .. " yens.", cid)
            setPlayerStorageValue(cid, store, os.time()+exausted) 
            addNpcItemTable(item, amount)
            closeShopWindow(cid)
            local shop = attNpcItemsList(cid)
            openShopWindow(cid, shop, onBuying, onSelling)
        end
        
        return true
    end

    onBuying = function(cid, item, subType, amount, ignoreCap, inBackpacks)
        local store,exausted = 552612,3
        local priceTicks = nil
        priceTicks = tb_Items[item].newPrice*amount
        if getPlayerStorageValue(cid, store) >= os.time() then
            doPlayerSendCancel(cid, "Espere " .. getPlayerStorageValue(cid, store) - os.time() .. " segundos para vender seus items.") return true
        end
        local npc_items = getStorageTable(configurations.storage)
            for v, k in pairs(npc_items) do
                if k.itemid == item then
                    if k.count >= amount then
                        if doPlayerRemoveMoney(cid, priceTicks) then
                            doPlayerAddItem(cid, item, amount)
                            npcHandler:say("Voce comprou " .. amount .. "x " .. getItemNameById(item) .. " por " .. priceTicks .. " yens.", cid)
                            setPlayerStorageValue(cid, store, os.time()+exausted) 
                            removeNpcItemTable(item, amount)
                            closeShopWindow(cid)
                            local shop = attNpcItemsList(cid)
                            openShopWindow(cid, shop, onBuying, onSelling)
                        else
                            npcHandler:say("Voce nao possui dinheiro suficiente.", cid)
                        end
                    else
                        npcHandler:say("Lamento, mas atualmente eu so possuo: "..k.count.."x "..getItemNameById(k.itemid)..".", cid)
                    end
                end
            end
        
        return true
    end

    if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then
        shopWindow = attNpcItemsList(cid)
        openShopWindow(cid, shopWindow, onBuying, onSelling)
    end
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Instalação finalizada, as áreas configuráveis do sistema estão informadas na lib.
                        Créditos:
Academia de Programação: Por ter levantado a ideia do sistema.
@Endless: Por ter ajudado em uma questão de lógica.
E a mim por ter feito. (Eu acho).

               Informações adicionais:
-> O sistema foi testado e não apresentou problemas, porém se vierem a encontrar falhas, favor reportar para que eu possa manter o tópico atualizado/corrigido.
-> Eu faço correções no sistema caso esteja errado, mas não faço adaptações pro seu servidor. Caso queira variações do sistema, favor enviar seu pedido no discord da Academia de Programação, ou em meu privado: Admin#9865.


Existe 1 bug: Quando vamo dizer q o npc tem 10 itens no estoque, se tento comprar os 10 de uma vez só vem 1 item, e o estoque do npc zera e também o dinheiro some

image.thumb.png.a9ad8400fac4f0384a70fa387a8dea45.png e

Tem como por pra só comprar/vender apenas 1 item por vez?

Outro bug: image.png.0e4b95c44e782abc89fc7d3af9d0af66.pngimage.thumb.png.d1ed7018278df052b2e1c86f6fb93da5.png

MESMO SE O ITEM TA VALENDO 900 GOLD, HORA QUE CLICA EM VENDER O ITEM SAI POR 1K

Postado

Ótima ideia pra um script, pensei em coloca-lo como compra e venda de itens de addon seria ótimo pra balancear os addons, uma pena não ser pra 1.x

Editado por Mor3nao (veja o histórico de edições)

MEUS POSTS:

 

SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB <3

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo