Jump to content
Sign in to follow this  
Dean

Trade List System

Recommended Posts

Dean

Informações = {
Nome = Trade List System
Autor = Mock, Dean(reformulação do script)
Versão testada = TFS 0.3.5
}

 

Informações

 

A algum tempo atrás(1 ano +/-) o Mock havia postado um script assim, porém ele já é antigo e não sei se functiona nos servers novos.

O script permite que você compre ou venda itens, sem estar perto do player ou até mesmo offline!

 

Comandos

 

/sell item name,price = Adiciona o item à lista com o preço escolhido.

/buy trade id = Compra o item, trade id é o número da venda, que está na lista.

/offers = Mostar uma lista com todos os itens à venda.

/search item name = Semelhante ao /offers, porém mostra a lista apenas com o item escolhido.

/stop trade id = Para a venda, o item é devolvido automaticamente ao player.

 

Script

 

Crie um arquivo chamado trade.lua na pasta talkactions/scripts e adicione isso dentro:

 

function onSay(cid,words,param)
list = "Id    Player          Item                  Money"
        if param == "info" then
           return doPlayerPopupFYI(cid,"Comandos:\n/sell itemname,price\n/offers\n/search\n/buy tradeid\n/stop tradeid")
        end
        if words == "/sell" then
local t = db.getResult("SELECT `tradeid`,`player`,`itemid`,`money` FROM `trade` ORDER BY `tradeid` DESC LIMIT 100;")
local itemname,price = param:match('(.-),%s*(.+)')
local item = getItemIdByName(itemname)
            if t:getID() ~= -1 then
              v = t:getDataInt("tradeid")
            else
              v = 0
            end
            if doPlayerRemoveItem(cid,item,1) then
               return db.executeQuery("INSERT INTO `trade` (`tradeid`, `player`, `itemid`, `money`) VALUES ("..v.."+1,"..getPlayerGUID(cid)..","..item..","..price..");")
            end
       return doPlayerSendTextMessage(cid,22,"Você não tem essa quantidade do item")
     end      
       if words == "/buy" then
local j = db.getResult("SELECT `tradeid`,`player`,`itemid`,`money` FROM `trade` WHERE `tradeid` = "..param.." LIMIT 100;") 
         if doPlayerRemoveMoney(cid,j:getDataInt("money")) then
           doPlayerAddItem(cid,j:getDataInt("itemid"))
               if isOnline(getPlayerNameByGUID(j:getDataInt("player"))) then                                                                 
                 doPlayerAddMoney(getPlayerByName(getPlayerNameByGUID(j:getDataInt("player"))),j:getDataInt("money"))
               else
                 db.executeQuery("UPDATE `players` SET `moneytoreceive` = "..j:getDataInt("money").." WHERE `players`.`id` ="..j:getDataInt("player").." LIMIT 1 ;")
               end
          return db.executeQuery("DELETE FROM `trade` WHERE `trade`.`tradeid` = "..param.." LIMIT 1;")
     end
       return doPlayerSendTextMessage(cid,22,"Você não possui essa quantia")
end
       if words == "/offers" then
local t = db.getResult("SELECT `tradeid`,`player`,`itemid`,`money` FROM `trade` ORDER BY `tradeid` DESC LIMIT 100;")
          if t:getID() ~= -1 then
          repeat
            list = list.."\n"..t:getDataInt("tradeid").."      "..getPlayerNameByGUID(t:getDataString("player")).."             "..getItemNameById(t:getDataInt("itemid")).."              "..t:getDataInt("money").." gps"       
          until not t:next()
          end
            return doPlayerPopupFYI(cid,list)
        end
        if words == "/search" then
id = getItemIdByName(param, false)
           if (not id) then
              return doPlayerSendTextMessage(cid,22,"Esse item não existe.")
           end
local t = db.getResult("SELECT `tradeid`,`player`,`itemid`,`money` FROM `trade` WHERE `itemid` = "..id..";")        
           if t:getID() == -1  then
             return doPlayerSendTextMessage(cid,22,"O item procurado não está à venda")
           end
           repeat
             list = list.."\n"..t:getDataInt("tradeid").."      "..getPlayerNameByGUID(t:getDataString("player")).."             "..getItemNameById(t:getDataInt("itemid")).."              "..t:getDataInt("money").." gps"       
           until not t:next()
            return doPlayerPopupFYI(cid,list)
        end
      if words == "/stop" then
local t = db.getResult("SELECT `tradeid`,`player`,`itemid`,`money` FROM `trade` ORDER BY `tradeid` DESC LIMIT 100;")
         repeat
             if tonumber(t:getDataInt("tradeid")) == tonumber(param) and tonumber(t:getDataInt("player")) == tonumber(getPlayerGUID(cid)) then
                doPlayerAddItem(cid,t:getDataInt("itemid"))
                return db.executeQuery("DELETE FROM `trade` WHERE `trade`.`tradeid` = "..t:getDataInt("tradeid").." LIMIT 1;")
             end
         until not t:next()
       end
t:close()
return TRUE
end                                                                                                                                                   

Adicione as seguintes tags em talkaction.xml:

   <talkaction words="/sell" event="script" value="trade.lua"/>
   <talkaction words="/offers" event="script" value="trade.lua"/>
   <talkaction words="/buy" event="script" value="trade.lua"/>
   <talkaction words="/search" event="script" value="trade.lua"/>
   <talkaction words="/stop" event="script" value="trade.lua"/>

Crie um arquivo chamado trade.lua na pasta creaturescripts/scripts e adicione isso dentro:

function onLogin(cid)
local t = db.getResult("SELECT `moneytoreceive` FROM `players` WHERE `id` = "..getPlayerGUID(cid).." LIMIT 1;")
     if t:getDataInt("moneytoreceive") > 0 then 
        return doPlayerAddMoney(cid,tonumber(t:getDataInt("moneytoreceive"))),doPlayerSendTextMessage(cid,22,"Um item seu foi comprado da trade list.Receba seu dinheiro"),db.executeQuery("UPDATE `players` SET `moneytoreceive` = 0 WHERE `players`.`id` ="..getPlayerGUID(cid).." LIMIT 1 ;")
     end
t:close()
return TRUE
end

Adicione a seguinte tag em creaturescripts.xml:

<event type="login" name="Trade" script="trade.lua"/>

Agora abra o arquivo creaturescripts/scripts/login.lua e adicione entes do último return TRUE:

registerCreatureEvent(cid, "Trade")

 

Você precisará da OTAL ou simplesmente coloque isso em lib/functions.lua ou arquivo semelhante:

function isOnline(name)--by mock
local  players = getOnlinePlayers()
name = string.lower(name)
   for i, player in ipairs(players) do
   player = string.lower(player)
   if name == player then
  return TRUE 
   end 
   end
   return FALSE
end 

Para finalizar, execute a seguinte query no seu banco de dados mysql:

CREATE  TABLE  `trade` ( `tradeid` INT NOT  NULL ,
`player` INT NOT  NULL ,
`itemid` INT NOT  NULL ,
`money` INT NOT  NULL 
) ENGINE  =  MYISAM ;[font=Comic Sans MS][size=4][size=2][size=4][size=2][size=4][size=2] 

[/size][/size][/size][/size][/size][/size][/font]ALTER  TABLE  `players`  ADD  `moneytoreceive` INT NOT  NULL

Bom, é isso, espero que façam bom uso do script, se achar algum bug por favor avise.

 

Esse script é exclusivo da OTnet,

se encontrar em outro fórum por favor avise

Edited by Mickfern

Share this post


Link to post
Share on other sites
Mock

Editado por Flatronez: Movido!

Edited by Flatronez

Share this post


Link to post
Share on other sites
Dean

Agora que vi que moveram.

 

Arrumei la se tiver mais bugs me avisa.

 

Ninguém comenta não? -.-

Share this post


Link to post
Share on other sites
vincity

[bug] Todos os atributos do item sao resetados.

Share this post


Link to post
Share on other sites
Dean

@vincity

Não é bug, isso é porquê ele envia o item conforme está no itens.xml.

Mas vou ver se arrumo.

Share this post


Link to post
Share on other sites
Cabral

bom nem cheguei a baixar ou se quer testar. mais pensei na possibilidade de um bug.

 

o cara ira executar o comando de adcionar o item na lista

 

logo apos isso o comando ira executar o doremoveitem(cid,itemdele) e adcionar um valor na tabela trade conforme abaixo.

if doPlayerRemoveItem(cid,item,1) then

return db.executeQuery("INSERT INTO `trade` (`tradeid`, `player`, `itemid`, `money`) VALUES ("..v.."+1,"..getPlayerGUID(cid)..","..item..","..price..");")

end

 

PROBLEMA: se o char nao deslogar e o server "cair", a remocao do item nao sera salva e mesmo assim ele tera o valor na tabela `trade`.

 

conclusao. se o server cair e voltar. ele tera o item na bp que era pra ter sido removido e tambem tera como retirar o item com o comando /stop. assim tera infinitas possibilidades para clonar os items. ;]

 

 

EDIT: pensei em uma possibilidade aqui e seria por uma verificacao na funcao onlogout, ao usuario deslogar seria isso que iria deixar um usuario comprar ou deixar o item aparecer na lista. assim nao teria possibilidades de clonar ja que o item removido ja teria sido salvo :DD

 

OBS: se nao entendeu bulhufas nenhuma me envia uma mp que eu esplico melhor shausahusa, e obrigado pela ideia. estarei fasendo um parecido para meu servidor.

 

Abracos...

Edited by Cabral

Share this post


Link to post
Share on other sites
Dean

Desculpa demorar para responder, é porquê não tinha visto que postaram.

 

@Cabral

Obrigado por avisar, acho que vou colocar para kickar o player depois que adicionar o item na lista.

 

@123123

É só ir no seu phpmyadmin, clicar em SQL, vai ter um espaço escrito Fazer consulta SQL no Banco de Dados, você cola o código la e clica executar.

Share this post


Link to post
Share on other sites
123123

ah tá, mas esse script não funfa pra server sqlite?

Share this post


Link to post
Share on other sites
Dean

Não mecho com sqlite, mas acho que tem que mudar a query, o script acho que funciona.

Share this post


Link to post
Share on other sites
Bvkse

[03/09/2010 23:45:14] [Error - CreatureScript Interface]

[03/09/2010 23:45:14] data/creaturescripts/scripts/trade.lua:onLogin

[03/09/2010 23:45:14] Description:

[03/09/2010 23:45:14] data/creaturescripts/scripts/trade.lua:6: attempt to call method 'close' (a nil value)

[03/09/2010 23:45:14] stack traceback:

[03/09/2010 23:45:14] data/creaturescripts/scripts/trade.lua:6: in function <data/creaturescripts/scripts/trade.lua:1>

[03/09/2010 23:45:14] Bruno has logged out.

 

:X oq aconteceu ?

Share this post


Link to post
Share on other sites
jururuba

uma SS ajuda ;/

Share this post


Link to post
Share on other sites
dyegodb

Tentei usar em ot 8.6 mas quando o player loga ele jah desloga sozinho =P

Share this post


Link to post
Share on other sites
DragonDraker

Showw .!!

 

Script perfeito,sem bug's nenhum(aqui em casa não deu nada).

Share this post


Link to post
Share on other sites
Prosopopeia

Script bom mas n intendi essa ultima parte onde fica esse phpmy?

Share this post


Link to post
Share on other sites
Dargosh

Nossa Man Esse Scripte È mt Baaum!

Tipow você não precisa ficar esperando o player pra da trade e talz

é mt bom só deviam ser menor tipow por causa de lag e talz pra não pesar no servidor mais ta otimo vlws aew!

Share this post


Link to post
Share on other sites
ahbom

tresante !

 

vlws s s s

Edited by Mickfern

Share this post


Link to post
Share on other sites
xinaleo

Encontrei um bug.

Caso um player coloque o valor do item negativo, quem comprar o item ira RECEBER o dinheiro ao inves de retirar.

Share this post


Link to post
Share on other sites
Oneshot

Bom, você reviveu um tópico, porém fez uma observação muito pertinente. Estarei editando o código em breve, já que o criador do tópico se ausentou da OTServ Brasil há um tempo.

 

Todavia, tópico fechado para evitar futuros posts desnecessários.

Edited by Garou

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×