Ir para conteúdo
Entre para seguir isso  
Dean

Trade List System

Recommended Posts

Dean    1
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

Editado por Mickfern

Compartilhar este post


Link para o post
Mock    32
Mock

Editado por Flatronez: Movido!

Editado por Flatronez

Compartilhar este post


Link para o post
Dean    1
Dean

Agora que vi que moveram.

 

Arrumei la se tiver mais bugs me avisa.

 

Ninguém comenta não? -.-

Compartilhar este post


Link para o post
vincity    0
vincity

[bug] Todos os atributos do item sao resetados.

Compartilhar este post


Link para o post
Dean    1
Dean

@vincity

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

Mas vou ver se arrumo.

Compartilhar este post


Link para o post
Cabral    2
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...

Editado por Cabral

Compartilhar este post


Link para o post
Dean    1
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.

Compartilhar este post


Link para o post
123123    1
123123

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

Compartilhar este post


Link para o post
Dean    1
Dean

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

Compartilhar este post


Link para o post
Bvkse    0
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 ?

Compartilhar este post


Link para o post
jururuba    0
jururuba

uma SS ajuda ;/

Compartilhar este post


Link para o post
dyegodb    0
dyegodb

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

Compartilhar este post


Link para o post
DragonDraker    1
DragonDraker

Showw .!!

 

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

Compartilhar este post


Link para o post
Prosopopeia    0
Prosopopeia

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

Compartilhar este post


Link para o post
Dargosh    0
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!

Compartilhar este post


Link para o post
ahbom    0
ahbom

tresante !

 

vlws s s s

Editado por Mickfern

Compartilhar este post


Link para o post
xinaleo    0
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.

Compartilhar este post


Link para o post
Oneshot    24
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.

Editado por Garou

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×