Postado Janeiro 14, 2021 4 anos 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: E agora, após o NPC ter comprado 10 Shields do mesmo: Enfim, agora que o sistema já foi previamente explicado, vamos a instalação: 1º 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.
Postado Janeiro 14, 2021 4 anos @Tottin adicione a versão utilizada para criar o código 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
Postado Janeiro 14, 2021 4 anos Ó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? Ot Design: https://discord.gg/VgtVRNmCD7
Postado Janeiro 14, 2021 4 anos 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 O tópico já foi criado na área de sistemas para tfs 0.x
Postado Janeiro 14, 2021 4 anos @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.