noobinhu 38 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 (editado) Bom, este sistema eu fiz faz alguns dias, fiquei com preguiça de postar, tem mais alguns ainda, logo eu posto. Primeiro, antes de usar o sistema, que é inteiro baseado em um NPC, você precisa importar essa table aqui na sua database do OTServer: Query SQL: -- phpMyAdmin SQL Dump-- version 2.11.7 -- http://www.phpmyadmin.net -- -- Servidor: localhost -- Tempo de Geração: Dez 06, 2008 as 04:39 PM -- Versão do Servidor: 5.0.51 -- Versão do PHP: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Banco de Dados: `tfs84` -- -- -------------------------------------------------------- -- -- Estrutura da tabela `merchantsystem` -- CREATE TABLE IF NOT EXISTS `merchantsystem` ( `id` int(10) NOT NULL auto_increment, `ownerid` int(10) NOT NULL, `itemid` int(10) NOT NULL, `price` int(10) NOT NULL, `selled` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=9 ; -- -- Extraindo dados da tabela `merchantsystem` -- Aqui o script LUA do NPC: dofile('./config.lua')local offerTime = 10 -- Seconds to offer items local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) 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 time = os.clock() time2 = os.clock() function onThink() npcHandler:onThink() if (time2 + 10) < os.clock() then selfSay('Come here to buy and sell your items.') time2 = os.clock() end if (time + offerTime) < os.clock() then time = os.clock() if sqlType == "mysql" then env = assert(luasql.mysql()) con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) else -- sqlite env = assert(luasql.sqlite3()) con = assert(env:connect(sqliteDatabase)) end local cur = assert(con:execute("SELECT * FROM merchantsystem WHERE selled LIKE 0 ORDER BY itemid ASC,price ASC")) results = 0 money = 0 row = cur:fetch({}, "a") totallines = cur:numrows() local itemrand = math.random(1,totallines) while results < totallines do local itemrand2 = math.random(1,totallines) if (itemrand == itemrand2) then offerid = row.id itemid = row.itemid itemname = getItemName(itemid) local cur2 = assert(con:execute("SELECT * FROM merchantsystem WHERE selled LIKE 0 AND itemid LIKE "..itemid.." ORDER BY price ASC LIMIT 1")) row2 = cur2:fetch({}, "a") itemprice2 = row2.price if (itemprice2 == row.price) then broadcastMessage('Merchant NPC: Sell '.. itemname ..' for '.. row.price ..' gold coins.',MESSAGE_EVENT_ADVANCE) break end end row = cur:fetch(row, "a") results = results+1 end end end function setMerchantItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, playerid, itemid, price) if sqlType == "mysql" then env = assert(luasql.mysql()) con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) else -- sqlite env = assert(luasql.sqlite3()) con = assert(env:connect(sqliteDatabase)) end textsArray = {} indextype = 0 assert(con:execute("INSERT INTO merchantsystem VALUES (id,"..playerid..","..itemid..","..price..",0)")) return TRUE end function getMerchantItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, itemid) if sqlType == "mysql" then env = assert(luasql.mysql()) con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) else -- sqlite env = assert(luasql.sqlite3()) con = assert(env:connect(sqliteDatabase)) end local cur = assert(con:execute("SELECT * FROM merchantsystem WHERE itemid LIKE "..itemid.." AND selled LIKE 0 ORDER BY price ASC LIMIT 1")) row = cur:fetch({}, "a") return row end function buyedMerchantItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, offerid) if sqlType == "mysql" then env = assert(luasql.mysql()) con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) else -- sqlite env = assert(luasql.sqlite3()) con = assert(env:connect(sqliteDatabase)) end textsArray = {} indextype = 0 local cur = assert(con:execute("UPDATE merchantsystem SET selled=1 WHERE id LIKE "..offerid.." AND selled LIKE 0")) return TRUE end function getNPCMoney(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, playerid) if sqlType == "mysql" then env = assert(luasql.mysql()) con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) else -- sqlite env = assert(luasql.sqlite3()) con = assert(env:connect(sqliteDatabase)) end textsArray = {} indextype = 0 local cur = assert(con:execute("SELECT * FROM merchantsystem WHERE ownerid LIKE "..playerid.." AND selled LIKE 1")) results = 0 money = 0 row = cur:fetch({}, "a") totallines = cur:numrows() while results < totallines do money = money + row.price row = cur:fetch(row, "a") results = results+1 end local cur = assert(con:execute("UPDATE merchantsystem SET selled=2 WHERE ownerid LIKE "..playerid.." AND selled LIKE 1")) return money end function getNPCItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, playerid) if sqlType == "mysql" then env = assert(luasql.mysql()) con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) else -- sqlite env = assert(luasql.sqlite3()) con = assert(env:connect(sqliteDatabase)) end textsArray = {} indextype = 0 local cur = assert(con:execute("SELECT * FROM merchantsystem WHERE ownerid LIKE "..playerid.." AND selled LIKE 0")) results = 0 items = {} row = cur:fetch({}, "a") totallines = cur:numrows() while results < totallines do items[results] = row.itemid row = cur:fetch(row, "a") results = results+1 end local cur = assert(con:execute("UPDATE merchantsystem SET selled=3 WHERE ownerid LIKE "..playerid.." AND selled LIKE 0")) return items end function trim(s) -- from PiL2 20.4 return (s:gsub("^%s*(.-)%s*$", "%1")) end function sellItem(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end msg = string.lower(message) storages = {} storages.itemid = 21547 storages.cost = 21548 if (parameters.getitem == TRUE) then b = string.find(msg, "item:") itemname = trim(string.sub(msg, 6)) npcHandler:say(itemname, cid) itemid = getItemIdByName(itemname) if itemid ~= LUA_ERROR then setPlayerStorageValue(cid,storages.itemid,itemid) npcHandler:say('So, for how much gold coins do you want to sell your '.. itemname ..'? (To say the item\'s cost use this format message: "money: Cost Goes Here")', cid) return TRUE else npcHandler:say('Sorry, I didn\'t understand the item\'s name!', cid) return FALSE end elseif (parameters.getmoney == TRUE) then b, e = string.find(msg, "%d+") if b == nil or e == nil then quantity = 1 else quantity = tonumber(string.sub(msg, b, e)) end if isNumber(quantity) ~= TRUE then quantity = 1 end setPlayerStorageValue(cid,storages.cost,quantity) itemid = getPlayerStorageValue(cid,storages.itemid) itemname = getItemName(itemid) npcHandler:say('Do you want to sell your '..itemname..' for '..quantity..' gold coins? (You will need to pay a fee of 1000 gold coins to me.)', cid) return TRUE elseif (parameters.decline == TRUE) then npcHandler:say('Ok then.', cid) npcHandler:resetNpc() return TRUE elseif (parameters.confirm == TRUE) then itemid = getPlayerStorageValue(cid,storages.itemid) itemname = getItemName(itemid) cost = getPlayerStorageValue(cid,storages.cost) playerid = getPlayerGUIDByName(getPlayerName(cid)) if(doPlayerTakeItem(cid, itemid, 1) == LUA_NO_ERROR) then if getPlayerMoney(cid) >= 1000 then if cost >= 0 then doPlayerRemoveMoney(cid, 1000) setMerchantItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, playerid, itemid, cost) npcHandler:say('Right, now you are selling your '.. itemname ..' for '.. cost ..' gold coins. You can \'get back\' it or wait for someone buy. When someone buy, I will get the money and you will need to get it here.', cid) else npcHandler:say('You cannot sell an item costing a negative value.', cid) end else npcHandler:say('You don\'t have 1000 gold coins to pay the fee.', cid) end else npcHandler:say('You don\'t have a '.. itemname ..' to sell.', cid) end npcHandler:resetNpc() return TRUE end end function buyItem(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end msg = string.lower(message) storages = {} storages.id = 21610 storages.owner = 21611 storages.itemid = 21612 storages.price = 21613 if (parameters.getitem == TRUE) then b = string.find(msg, "item:") itemname = trim(string.sub(msg, 6)) itemid = getItemIdByName(itemname) if itemid ~= LUA_ERROR then local itemget = getMerchantItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, itemid) if itemget ~= nil then npcHandler:say('The cheaper '.. itemname ..' that I have costs '.. itemget.price ..' gold coins. Do you want to buy?', cid) setPlayerStorageValue(cid,storages.id,itemget.id) setPlayerStorageValue(cid,storages.owner,itemget.ownerid) setPlayerStorageValue(cid,storages.itemid,itemget.itemid) setPlayerStorageValue(cid,storages.price,itemget.price) return TRUE else npcHandler:say('Sorry, I don\'t have a '.. itemname ..' to sell you now!', cid) return FALSE end return TRUE else npcHandler:say('Sorry, I didn\'t understand the item\'s name!', cid) return FALSE end elseif (parameters.decline == TRUE) then npcHandler:say('Ok then.', cid) npcHandler:resetNpc() return TRUE elseif (parameters.confirm == TRUE) then offerid = getPlayerStorageValue(cid,storages.id) itemprice = getPlayerStorageValue(cid,storages.price) ownerid = getPlayerStorageValue(cid,storages.owner) itemid = getPlayerStorageValue(cid,storages.itemid) itemname = getItemName(itemid) playerid = getPlayerGUIDByName(getPlayerName(cid)) if getPlayerMoney(cid) >= itemprice then doPlayerRemoveMoney(cid, itemprice) doPlayerAddItem(cid,itemid,1) buyedMerchantItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, offerid) npcHandler:say('Thank you for buying it!', cid) else npcHandler:say('You don\'t have enough money to buy it.', cid) end npcHandler:resetNpc() return TRUE end end function getMoneyBack(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end msg = string.lower(message) if (parameters.confirm == TRUE) then playerid = getPlayerGUIDByName(getPlayerName(cid)) moneyhave = getNPCMoney(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, playerid) if (moneyhave > 0) then doPlayerAddMoney(cid,moneyhave) npcHandler:say('Ok, take it man.', cid) else npcHandler:say('You don\'t have money to get back.', cid) end npcHandler:resetNpc() return TRUE end end function getItemBack(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end msg = string.lower(message) if (parameters.confirm == TRUE) then playerid = getPlayerGUIDByName(getPlayerName(cid)) itemshave = getNPCItem(sqlType, mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort, sqliteDatabase, playerid) if (itemshave[0] ~= nil) then for k,v in pairs(itemshave) do doPlayerAddItem(cid,v,1) end npcHandler:say('Ok, take it man.', cid) else npcHandler:say('You don\'t have items to get back.', cid) end npcHandler:resetNpc() return TRUE end end local getItemNode = KeywordNode:new({'item:'}, sellItem, {getitem = TRUE}) local getMoneyNode = KeywordNode:new({'money: '}, sellItem, {getmoney = TRUE}) local noSellNode = KeywordNode:new({'no'}, sellItem, {decline = TRUE}) local yesSellNode = KeywordNode:new({'yes'}, sellItem, {confirm = TRUE}) local sellnode = keywordHandler:addKeyword({'sell item'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'What is the name of the item which you want to sell? (To say the item\'s name use this format message: "item: Item Name Goes Here")'}) local getItem = sellnode:addChildKeywordNode(getItemNode) local getMoney = getItem:addChildKeywordNode(getMoneyNode) getMoney:addChildKeywordNode(yesSellNode) getMoney:addChildKeywordNode(noSellNode) local getItemNode = KeywordNode:new({'item:'}, buyItem, {getitem = TRUE}) local noBuyNode = KeywordNode:new({'no'}, buyItem, {decline = TRUE}) local yesBuyNode = KeywordNode:new({'yes'}, buyItem, {confirm = TRUE}) local buynode = keywordHandler:addKeyword({'buy item'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'What is the name of the item which you want to buy? (To say the item\'s name use this format message: "item: Item Name Goes Here")'}) local getItem = buynode:addChildKeywordNode(getItemNode) getItem:addChildKeywordNode(yesBuyNode) getItem:addChildKeywordNode(noBuyNode) keywordHandler:addKeyword({'get money'}, getMoneyBack, {confirm = TRUE}) keywordHandler:addKeyword({'getback item'}, getItemBack, {confirm = TRUE}) npcHandler:addModule(FocusModule:new()) Arquivo XML: <npc name="Merchant" script="data/npc/scripts/merchant.lua" access="5" lookdir="1"> <health now="1000" max="1000"/> <look type="133" head="0" body="86" legs="0" feet="38" addons="1"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. I am a items' re-seller. You can 'sell item', 'buy item', 'getback item' and 'get money'."/> </parameters> </npc> Edite em negrito para o arquivo LUA do NPC. Exemplo de Uso (Conversa): Vendendo Item: hisell item item: dragon shield money: 5000 yes bye Comprando Item: hibuy item item: dragon shield yes bye Retirando items e money: higetback item bye hi get money bye Screenshoots: Espero que usem, obrigado. Yunie. Editado Janeiro 11, 2009 por noobinhu Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/ Compartilhar em outros sites More sharing options...
tibiaa4e 86 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 Pelo que eu li ele seria tipo um cara que leiloa as coisas ? E para vender itens offline seria necessario um codigo em php correto ? Sei lá da uma explicada ai que não entendi bem a logica xD Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673011 Compartilhar em outros sites More sharing options...
noobinhu 38 Postado Janeiro 11, 2009 Autor Share Postado Janeiro 11, 2009 É tudo in-game. Você vende seu item para o NPC e ele procura por um comprador, quando alguém comprar este item do NPC, o player pode vir retirar seu dinheiro no NPC. Ou seja, ele pode colocar pra vender e deslogar/ir caçar à vontade. Depois retirar seu dinheiro, caso tenha sido vendido, ou até seu item se não quiser mais vender. Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673016 Compartilhar em outros sites More sharing options...
MarcolinoGOD 1 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 Nunca pensei em ver um Npc assim. Omagod!!! Deve ter sido extremamente trabalhoso desenvolver o mesmo!? Resumindo: Genial!!! Parabéns e Obrigado por compartilhar. Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673030 Compartilhar em outros sites More sharing options...
grafit 0 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 nossa cara mt irado mesmo ^^ e bem prático , pq o cara n precisa fikar falando no trade... o npc ja faz isso parabéns Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673048 Compartilhar em outros sites More sharing options...
Ththt 2 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 Tbm nunca pensei em ver um npc assim... Gostei mt do script e do topico Parabens, continue assim Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673049 Compartilhar em outros sites More sharing options...
alissonlinneker 2 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 Cara...eu fiz isso mais acho que é melhor... ele vende os itens pelo site.. é mesmo o puro php sem npcs.. ainda tenho de ageitar umas coisas nele... pretendo divulga-lo aqui algum dia... quanto a esse aí.. ta muito bom tb... gostei.. acho que ja vi isso no zartha... na primeira página deles tem falando =D muito bom Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673247 Compartilhar em outros sites More sharing options...
tibiaa4e 86 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 ah tah era mto tarde eu fiquei confuso Legal mesmo xD Eu também nunca pensei em fazer isso até pq odeio npc Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673259 Compartilhar em outros sites More sharing options...
daghios 0 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 beeem legaal ! Parabéns aeew velho ! Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673278 Compartilhar em outros sites More sharing options...
BillyBola 1 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 Po que foda esse script, imagina se tivesse isso no global, seria otimo. Parabéns por mais um script genial. Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673332 Compartilhar em outros sites More sharing options...
guilhermes26 26 Postado Janeiro 11, 2009 Share Postado Janeiro 11, 2009 É aquele npc usado no Zartha? Nossa, eu adorei, muito bom mesmo Uma vez tinha pensado em alguo assim, mas a preguiça foi maior... kk²³¹² Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673344 Compartilhar em outros sites More sharing options...
noobinhu 38 Postado Janeiro 11, 2009 Autor Share Postado Janeiro 11, 2009 É o do Zartha sim, eu disse pro Language que ia fazer para postar, e perguntei se queriam testar antecipadamente, então ele testou primeiro E agora postei. Obrigado pelos comments~ Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-673403 Compartilhar em outros sites More sharing options...
zerosky 6 Postado Janeiro 12, 2009 Share Postado Janeiro 12, 2009 O unico ruim de se /dofila config.lua la é q em ot sqlite ele da break as vezes nas funçoes de !save e tals = o commands !ranks Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-674296 Compartilhar em outros sites More sharing options...
Skyblade 2 Postado Janeiro 13, 2009 Share Postado Janeiro 13, 2009 nota 1000 cara mto boom mesmo!! Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-674564 Compartilhar em outros sites More sharing options...
tozinho123 0 Postado Janeiro 13, 2009 Share Postado Janeiro 13, 2009 (editado) puta qui pario nunca pensei que alguem fosse tao genio assim, e o melhor, compartilha tudo com o pessoal do x tibia, noobinhu vc é foda xD edit mas ou como funciona se tipo, 2 jogadores botarem uma golden legs a venda e um outro pedir pra compra, de qual jogador ele ira vender? Editado Janeiro 13, 2009 por Tozao Link para o comentário https://xtibia.com/forum/topic/104702-merchant-system-venda-seus-items-offline/#findComment-674670 Compartilhar em outros sites More sharing options...
Posts Recomendados