Ir para conteúdo

[Tutorial]Talkactions E Website


Baiakuda

Posts Recomendados

Bom esse tutorial é sobre um sistema de TRADE no qual o player pode colocar seu item no site e esperar alguem comprar.

 

VEJA A IMAGEM PARA TER UMA NOÇÃO.

14wmrl.png

 

Crie um arquivo em data/talkactions/script

 

--[[
       Offline player to player item trader (Auction System) by vDk
               Script version: 1.2a [ -- FIXED CLONE ITEMS BUG -- ]
]]--
local config = {
       levelRequiredToAdd = 20, [ -- LEVEL PRA VENDER O ITEM -- ]
       maxOffersPerPlayer = 5, [ -- MAX DE PLAYERS QUE PODEM USAR O TRADE -- ]
       SendOffersOnlyInPZ = true,
       blocked_items = {2165, 2152, 2148, 2160, 2166, 2167, 2168, 2169, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2343, 2433, 2640, 6132, 6300, 6301, 9932, 9933}
       }
function onSay(cid, words, param, channel)
       if(param == '') then
               doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.")
               return true
       end

       local t = string.explode(param, ",")
       if(t[1] == "add") then
               if((not t[2]) or (not t[3]) or (not t[4])) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.")
                       return true
               end

               if(not tonumber(t[3]) or (not tonumber(t[4]))) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't set valid price or items count.")
                       return true
               end

               if(string.len(t[3]) > 7 or (string.len(t[4]) > 3)) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This price or item count is too high.")
                       return true
               end

               local item = getItemIdByName(t[2], false)
               if(not item) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item wich such name does not exists.")
                       return true
               end

               if(getPlayerLevel(cid) < config.levelRequiredToAdd) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have required (" .. config.levelRequiredToAdd .. ") level.")
                       return true
               end

               if(isInArray(config.blocked_items, item)) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This item is blocked.")
                       return true
               end

               if(getPlayerItemCount(cid, item) < (tonumber(t[4]))) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you don't have this item(s).")
                       return true
               end

               local check = db.getResult("SELECT `id` FROM `auction_system` WHERE `player` = " .. getPlayerGUID(cid) .. ";")
               if(check:getID() == -1) then
               elseif(check:getRows(true) >= config.maxOffersPerPlayer) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry you can't add more offers (max. " .. config.maxOffersPerPlayer .. ")")
                       return true
               end

               if(config.SendOffersOnlyInPZ) then    
                       if(not getTilePzInfo(getPlayerPosition(cid))) then
                               doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you add offert to database.")
                               return true
                       end
               end

               if(tonumber(t[4]) < 1 or (tonumber(t[3]) < 1)) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have to type a number higher than 0.")
                       return true
               end

               local itemcount, costgp = math.floor(t[4]), math.floor(t[3])
               doPlayerRemoveItem(cid, item, itemcount)
               db.executeQuery("INSERT INTO `auction_system` (`player`, `item_name`, `item_id`, `count`, `cost`, `date`) VALUES (" .. getPlayerGUID(cid) .. ", \"" .. t[2] .. "\", " .. getItemIdByName(t[2]) .. ", " .. itemcount .. ", " .. costgp ..", " .. os.time() .. ")")
               doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You successfully add " .. itemcount .." " .. t[2] .." for " .. costgp .. " gps to offerts database.")
       end

       if(t[1] == "buy") then
               if(not tonumber(t[2])) then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")
                       return true
               end

               local buy = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";")

 

Agora adicione essa tag em data/talkactions/talkactions.xml

<talkaction words="!offer" event="script" value="auctionsystem.lua"/>

 

Agora vamos para a parte da DATABASE...

 

Adicione esse codigo na database no lugar onde tem escrito "SQL" (canto superior direito)

ALTER TABLE `players` ADD `auction_balance` INT( 11 ) NOT NULL DEFAULT '0';

 

Adicione esse codigo tambem na database no lugar onde tem escrito "SQL" (canto superior direito)

CREATE TABLE `auction_system` (
 `id` int(11) NOT NULL auto_increment,
 `player` int(11),
 `item_id` int(11),
 `item_name` varchar(255),
 `count` int(11),
 `cost` int(11),
 `date` int(11),
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

POR FIM ... crie um arquivo auctionsystem.php(na pasta do seu site)

<?PHP
$auctions = $SQL->query('SELECT `auction_system`.`player`, `auction_system`.`id`, `auction_system`.`item_name`, `auction_system`.`item_id`, `auction_system`.`count`, `auction_system`.`cost`, `auction_system`.`date`, `players`.`name` FROM `auction_system`, `players` WHERE `players`.`id` = `auction_system`.`player` ORDER BY `auction_system`.`id` DESC')->fetchAll();
$players = 0;

   $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b>Instruction<b></TD></TR><TR BGCOLOR='.$config['site']['darkborder'].'><TD><center><h2>Commands</h2><b>!offer add, itemName, itemPrice, itemCount</b><br /><small>example: !offer add, plate armor, 500, 1</small><br /><br /><B>!offer buy, AuctionID</b><br /><small>example: !offer buy, 1943</small><br /><br /><b>!offer remove, AuctionID</b><br /><small>example: !offer remove, 1943</small><br /><br /><b>!offer withdraw</b><br /><small>Use this command to get money for sold items.</small></center></TR></TD></TABLE><br />';
   if(empty($auctions))
   {
       $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b>Auctions</b></td></TR><TR BGCOLOR='.$config['site']['darkborder'].'><TD>Currently is no one active Auction.</TD></TR></TABLE>';
       $main_content .= '<br /><p align="right"><small>System created by <a href="http://otland.net/members/vDk/">vDk</a>.</small></p>';
   }
   else
   {
   foreach($auctions as $auction) {
       $players++;
           if(is_int($players / 2))
               $bgcolor = $config['site']['lightborder'];
           else
               $bgcolor = $config['site']['darkborder'];
       $cost = round($auction['cost']/1000, 2);
       $content .= '<TR BGCOLOR='.$bgcolor.'><TD><center>'.$auction['id'].'</center></TD><TD><center><img src="http://otland.net/images/items/'.$auction['item_id'].'.gif"/></center></TD><TD><center>'.$auction['item_name'].'</center></TD><TD><center><a href="?subtopic=characters&name='.urlencode($auction['name']).'">'.$auction['name'].'</a></center></TD><TD><center>'.$auction['count'].'</center></TD><TD><center>'.$cost.'k<br /><small>'.$auction['cost'].'gp</small></center></TD><TD><center>!offer buy, '.$auction['id'].'</center></TR>';
   }

   $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b><center>ID</center></b></TD><TD class="white"><b><center>#</center></b></TD><TD class="white"><b><center>Item Name</center></b></TD><TD class="white"><b><center>Player</center></b></TD><TD class="white"><b><center>Count</center></b></TD><TD class="white"><b><center>Cost</center></b></td><TD class="white"><b><center>Buy</center></b></td></TR>'.$content.'</TABLE>';
   $main_content .= '<br /><p align="right"><small>System created by <a href="http://otland.net/members/vDk/">vDk</a>.</small></p>';
}
   ?> 

 

Fim, Creditos ao vDk.

Editado por Baiakuda
Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...

[Error - LuaScriptInterface::loadFile] data/talkactions/scripts/auctionsystem.lua:7: ']' expected near '='

[Warning - Event::loadScript] Cannot load script (data/talkactions/scripts/auctionsystem.lua)

data/talkactions/scripts/auctionsystem.lua:7: ']' expected near '='

 

fiz tudo coreto mais da isso.

Link para o comentário
Compartilhar em outros sites

  • 10 months later...

no lugar desse arquivo .lua voce coloca esse

 

 

--[[

Offline player to player item trader (Auction System) by vDk

Script version: 1.2a [ -- FIXED CLONE ITEMS BUG -- ]

]]--

local config = {

levelRequiredToAdd = 20,

maxOffersPerPlayer = 5,

SendOffersOnlyInPZ = true,

blocked_items = {2165, 2152, 2148, 2160, 2166, 2167, 2168, 2169, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2343, 2433, 2640, 6132, 6300, 6301, 9932, 9933}

}

function onSay(cid, words, param, channel)

if(param == '') then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.")

return true

end

 

local t = string.explode(param, ",")

if(t[1] == "add") then

if((not t[2]) or (not t[3]) or (not t[4])) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.")

return true

end

 

if(not tonumber(t[3]) or (not tonumber(t[4]))) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't set valid price or items count.")

return true

end

 

if(string.len(t[3]) > 7 or (string.len(t[4]) > 3)) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This price or item count is too high.")

return true

end

 

local item = getItemIdByName(t[2], false)

if(not item) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item wich such name does not exists.")

return true

end

 

if(getPlayerLevel(cid) < config.levelRequiredToAdd) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have required (" .. config.levelRequiredToAdd .. ") level.")

return true

end

 

if(isInArray(config.blocked_items, item)) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This item is blocked.")

return true

end

 

if(getPlayerItemCount(cid, item) < (tonumber(t[4]))) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you don't have this item(s).")

return true

end

 

local check = db.getResult("SELECT `id` FROM `auction_system` WHERE `player` = " .. getPlayerGUID(cid) .. ";")

if(check:getID() == -1) then

elseif(check:getRows(true) >= config.maxOffersPerPlayer) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry you can't add more offers (max. " .. config.maxOffersPerPlayer .. ")")

return true

end

 

if(config.SendOffersOnlyInPZ) then

if(not getTilePzInfo(getPlayerPosition(cid))) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you add offert to database.")

return true

end

end

 

if(tonumber(t[4]) < 1 or (tonumber(t[3]) < 1)) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have to type a number higher than 0.")

return true

end

 

local itemcount, costgp = math.floor(t[4]), math.floor(t[3])

doPlayerRemoveItem(cid, item, itemcount)

db.executeQuery("INSERT INTO `auction_system` (`player`, `item_name`, `item_id`, `count`, `cost`, `date`) VALUES (" .. getPlayerGUID(cid) .. ", \"" .. t[2] .. "\", " .. getItemIdByName(t[2]) .. ", " .. itemcount .. ", " .. costgp ..", " .. os.time() .. ")")

doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You successfully add " .. itemcount .." " .. t[2] .." for " .. costgp .. " gps to offerts database.")

end

 

if(t[1] == "buy") then

if(not tonumber(t[2])) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")

return true

end

 

local buy = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";")

if(buy:getID() ~= -1) then

if(getPlayerMoney(cid) < buy:getDataInt("cost")) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have enoguh GP.")

buy:free()

return true

end

 

if(getPlayerName(cid) == getPlayerNameByGUID(buy:getDataInt("player"))) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you can't buy your own items.")

buy:free()

return true

end

 

if(getPlayerFreeCap(cid) < getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")))then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You try to buy a " .. buy:getDataString("item_name") .. ". It weight " .. getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")) .. " cap oz. and you have only " .. getPlayerFreeCap(cid) .. " oz. free capacity. Put some items to depot and try again.")

buy:free()

return true

end

 

if(isItemStackable((buy:getDataString("item_id")))) then

doPlayerAddItem(cid, buy:getDataString("item_id"), buy:getDataInt("count"))

else

for i = 1, buy:getDataInt("count") do

doPlayerAddItem(cid, buy:getDataString("item_id"), 1)

end

end

 

doPlayerRemoveMoney(cid, buy:getDataInt("cost"))

db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";")

doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You bought " .. buy:getDataInt("count") .. " ".. buy:getDataString("item_name") .. " for " .. buy:getDataInt("cost") .. " gps!")

db.executeQuery("UPDATE `players` SET `auction_balance` = `auction_balance` + " .. buy:getDataInt("cost") .. " WHERE `id` = " .. buy:getDataInt("player") .. ";")

buy:free()

else

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")

end

end

 

if(t[1] == "remove") then

if((not tonumber(t[2]))) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")

return true

end

 

if(config.SendOffersOnlyInPZ) then

if(not getTilePzInfo(getPlayerPosition(cid))) then

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you remove offerts from database.")

return true

end

end

 

local delete = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";")

if(delete:getID() ~= -1) then

if(getPlayerGUID(cid) == delete:getDataInt("player")) then

db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";")

if(isItemStackable(delete:getDataString("item_id"))) then

doPlayerAddItem(cid, delete:getDataString("item_id"), delete:getDataInt("count"))

else

for i = 1, delete:getDataInt("count") do

doPlayerAddItem(cid, delete:getDataString("item_id"), 1)

end

end

 

doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your offert has been deleted from offerts database.")

else

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This is not your offert!")

end

delete:free()

else

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")

end

end

 

if(t[1] == "withdraw") then

local balance = db.getResult("SELECT `auction_balance` FROM `players` WHERE `id` = " .. getPlayerGUID(cid) .. ";")

if(balance:getDataInt("auction_balance") < 1) then

doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have money on your auction balance.")

balance:free()

return true

end

 

doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You got " .. balance:getDataInt("auction_balance") .. " gps from auction system!")

doPlayerAddMoney(cid, balance:getDataInt("auction_balance"))

db.executeQuery("UPDATE `players` SET `auction_balance` = '0' WHERE `id` = " .. getPlayerGUID(cid) .. ";")

balance:free()

end

return true

end

Editado por Jaraguah
Link para o comentário
Compartilhar em outros sites

  • 2 months later...
×
×
  • Criar Novo...