Postado Janeiro 14, 2021 4 anos 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. [*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*] DISCORD: vodkart#6090
Postado Janeiro 14, 2021 4 anos 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. 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 Janeiro 14, 2021 4 anos por Tottin (veja o histórico de edições)
Postado Janeiro 14, 2021 4 anos 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. 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... [*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*] DISCORD: vodkart#6090
Postado Fevereiro 5, 2021 4 anos 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: 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: 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 e Tem como por pra só comprar/vender apenas 1 item por vez? Outro bug: MESMO SE O ITEM TA VALENDO 900 GOLD, HORA QUE CLICA EM VENDER O ITEM SAI POR 1K
Postado Fevereiro 5, 2021 4 anos Ó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 Fevereiro 5, 2021 4 anos por Mor3nao (veja o histórico de edições) MEUS POSTS: [Source] Sistema Anti-PVP ~~ PvP on/off por comando [CreatureScript] Sugestão de balanceamento ~~ Uma pequena sugestão de balanceamento das vocations ? [NPC] Daily Task ~~ Daily Task com 4 opções diarias Contador de Monstros ~~Sistema pra contar quantos monstros tem no sv, e uma melhoria pro sistema de Daily Tasks Calma, por enquanto é só, e em breve mais coisas ;} SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB
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.