Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

                                                                                   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:
 

Spoiler

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:
 

Spoiler

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

Spoiler

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.

  • 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

Ótima ideia, agradeceria se fizessem pra 1.x também, pois eu usaria.

Parabéns pela iniciativa, ta ai um sistema simples mas que trás um diferencial enorme.

 

E eu acho que funciona melhor em ots com bastante players, com pouco player o uso do npc pode se tornar obsoleto, a não ser que vc preencha o estoque do npc co alguns itens, usando o god.

 

Uma dúvida, esse estoque reseta a cada ServerSave?

Postado
  • Autor
44 minutos atrás, Cat disse:

Ótima ideia, agradeceria se fizessem pra 1.x também, pois eu usaria.

Parabéns pela iniciativa, ta ai um sistema simples mas que trás um diferencial enorme.

 

E eu acho que funciona melhor em ots com bastante players, com pouco player o uso do npc pode se tornar obsoleto, a não ser que vc preencha o estoque do npc co alguns itens, usando o god.

 

Uma dúvida, esse estoque reseta a cada ServerSave?

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.

1 hora atrás, LeoTK disse:

@Tottin adicione a versão utilizada para criar o código

image.png.7f0757b046d60fba33bea5109910ec2a.png
O tópico já foi criado na área de sistemas para tfs 0.x

Postado

@Tottin ahh perfeito acabei passando reto, enfim excelente script realmente seria bacana se tivesse um versão para 1.x ^^ 

Compre seus Scripts Agora totalmente seguro e de forma rápida, aceitamos também encomendas.

discord.gg/phJZeHa2k4

 

Projeto ATS (Naruto)

Informações Abaixo

Facebook

Youtube
Discord

 

Tutoriais / Conteúdos

Clique Aqui

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.6k

Informação Importante

Confirmação de Termo