ok what about trade ?
i have trade system !
Client:
GUIEditor = {
checkbox = {},
edit = {},
button = {},
window = {},
label = {},
gridlist = {}
}
moneyoffer = 0
notallowed = {
["Armour"] = true,
["Weed Seed"] = true,
["Heroine Seed"] = true,
["DMT Seed"] = true,
["LSD Seed"] = true,
}
addEventHandler("onClientRender", root, function ()
if isElement(GUIEditor.gridlist[1]) then
if getPlayerMoney()-moneyoffer < 0 then
triggerServerEvent("closeTrade", localPlayer)
hideGui()
return
end
guiGridListSetItemText(GUIEditor.gridlist[1], moneyrow, 2, getPlayerMoney()-moneyoffer, false, false)
end
end)
addEvent("startTrade", true)
addEventHandler("startTrade", root,
function(pits, pitq)
moneyoffer = 0
if isElement(GUIEditor.window[1]) then return exports.SAUGMessages:sendClientMessage("You already have a trade window opened!", 255, 0, 0) end
showCursor(true)
local screenW, screenH = guiGetScreenSize()
GUIEditor.window[1] = guiCreateWindow((screenW - 802) / 2, (screenH - 451) / 2, 802, 451, "SAUG:RPG Trading System (double-click to cancel trade)", false)
addEventHandler("onClientGUIDoubleClick", GUIEditor.window[1], function ()
if getElementType(source) ~= "gui-window" then return end
triggerServerEvent("closeTrade", localPlayer)
exports.SAUGMessages:sendClientMessage("You cancelled the trade!", 255, 0, 0)
hideGui()
end)
guiWindowSetSizable(GUIEditor.window[1], false)
guiSetAlpha(GUIEditor.window[1], 1.00)
GUIEditor.label[1] = guiCreateLabel(10, 23, 163, 18, "Your items:", false, GUIEditor.window[1])
guiSetFont(GUIEditor.label[1], "default-bold-small")
GUIEditor.label[2] = guiCreateLabel(326, 23, 163, 18, "Your offer:", false, GUIEditor.window[1])
guiSetFont(GUIEditor.label[2], "default-bold-small")
GUIEditor.label[3] = guiCreateLabel(629, 23, 163, 18, "Your partner offer:", false, GUIEditor.window[1])
guiSetFont(GUIEditor.label[3], "default-bold-small")
GUIEditor.gridlist[1] = guiCreateGridList(9, 43, 164, 354, false, GUIEditor.window[1])
guiGridListSetSortingEnabled(GUIEditor.gridlist[1], false)
guiGridListAddColumn(GUIEditor.gridlist[1], "Item", 0.5)
guiGridListAddColumn(GUIEditor.gridlist[1], "Count", 0.5)
for k, v in ipairs(pits) do
if not notallowed[v] then
r = guiGridListAddRow(GUIEditor.gridlist[1])
guiGridListSetItemText(GUIEditor.gridlist[1], r, 1, v, false, false)
guiGridListSetItemText(GUIEditor.gridlist[1], r, 2, pitq[k], false, false)
end
end
moneyrow = guiGridListAddRow(GUIEditor.gridlist[1])
guiGridListSetItemText(GUIEditor.gridlist[1], moneyrow, 1, "Money", false, false)
guiGridListSetItemText(GUIEditor.gridlist[1], moneyrow, 2, getPlayerMoney(), false, false)
GUIEditor.gridlist[2] = guiCreateGridList(325, 46, 164, 351, false, GUIEditor.window[1]) --Offer
guiGridListSetSortingEnabled(GUIEditor.gridlist[2], false)
guiGridListAddColumn(GUIEditor.gridlist[2], "Item", 0.5)
guiGridListAddColumn(GUIEditor.gridlist[2], "Count", 0.5)
GUIEditor.gridlist[3] = guiCreateGridList(629, 46, 163, 351, false, GUIEditor.window[1])
--Other offer
guiGridListSetSortingEnabled(GUIEditor.gridlist[3], false)
guiGridListAddColumn(GUIEditor.gridlist[3], "Item", 0.5)
guiGridListAddColumn(GUIEditor.gridlist[3], "Count", 0.5)
GUIEditor.button[1] = guiCreateButton(196, 171, 66, 21, ">", false, GUIEditor.window[1])
guiSetProperty(GUIEditor.button[1], "NormalTextColour", "FFAAAAAA")
addEventHandler("onClientGUIClick", GUIEditor.button[1], function ()
if getElementType(source) == "gui-button" and guiGridListGetSelectedItem(GUIEditor.gridlist[1]) > -1 and tonumber(guiGetText(GUIEditor.edit[1])) ~= nil and tonumber(guiGetText(GUIEditor.edit[1])) > 0 then
if tonumber(guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 2)) < tonumber(guiGetText(GUIEditor.edit[1])) then return exports.ac_message:sendClientMessage("You don't have that amount!", 255, 0, 0) end
guiGridListSetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 2, tonumber(guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 2))-tonumber(guiGetText(GUIEditor.edit[1])), false, false)
if guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 1) == "Money" then
moneyoffer = moneyoffer+tonumber(guiGetText(GUIEditor.edit[1]))
end
r = guiGridListAddRow(GUIEditor.gridlist[2])
guiGridListSetItemText(GUIEditor.gridlist[2], r, 1, guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 1), false, false)
guiGridListSetItemText(GUIEditor.gridlist[2], r, 2, tonumber(guiGetText(GUIEditor.edit[1])), false, false)
setTradeAccepted(false)
triggerServerEvent("updateAddOffer", localPlayer, guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 1), tonumber(guiGetText(GUIEditor.edit[1])))
end
end)
GUIEditor.button[2] = guiCreateButton(230, 202, 66, 21, "<", false, GUIEditor.window[1])
addEventHandler("onClientGUIClick", GUIEditor.button[2], function ()
if getElementType(source) == "gui-button" and guiGridListGetSelectedItem(GUIEditor.gridlist[2]) > -1 and tonumber(guiGetText(GUIEditor.edit[1])) ~= nil and tonumber(guiGetText(GUIEditor.edit[1])) > 0 then
if tonumber(guiGridListGetItemText(GUIEditor.gridlist[2], guiGridListGetSelectedItem(GUIEditor.gridlist[2]), 2)) < tonumber(guiGetText(GUIEditor.edit[1])) then return exports.ac_message:sendClientMessage("You don't have that amount added!", 255, 0, 0) end
setTradeAccepted(false)
triggerServerEvent("updateRemoveOffer", localPlayer, guiGridListGetItemText(GUIEditor.gridlist[2], guiGridListGetSelectedItem(GUIEditor.gridlist[2]), 1), tonumber(guiGetText(GUIEditor.edit[1])))
if guiGridListGetItemText(GUIEditor.gridlist[2], guiGridListGetSelectedItem(GUIEditor.gridlist[2]), 1) then
moneyoffer = moneyoffer-tonumber(guiGetText(GUIEditor.edit[1]))
end
if tonumber(guiGetText(GUIEditor.edit[1])) == tonumber(guiGridListGetItemText(GUIEditor.gridlist[2], guiGridListGetSelectedItem(GUIEditor.gridlist[2]), 2)) then
guiGridListRemoveRow(GUIEditor.gridlist[2], guiGridListGetSelectedItem(GUIEditor.gridlist[2]))
guiGridListSetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 2, tonumber(guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 2))+tonumber(guiGetText(GUIEditor.edit[1])), false, false)
else
guiGridListSetItemText(GUIEditor.gridlist[2], guiGridListGetSelectedItem(GUIEditor.gridlist[2]), 2, tonumber(guiGridListGetItemText(GUIEditor.gridlist[2], guiGridListGetSelectedItem(GUIEditor.gridlist[2]), 2))-tonumber(guiGetText(GUIEditor.edit[1])), false, false)
guiGridListSetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 2, tonumber(guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1]), 2))+tonumber(guiGetText(GUIEditor.edit[1])), false, false)
end
end
end)
guiSetProperty(GUIEditor.button[2], "NormalTextColour", "FFAAAAAA")
GUIEditor.edit[1] = guiCreateEdit(191, 233, 115, 31, "Amount", false, GUIEditor.window[1])
addEventHandler("onClientGUIChanged", GUIEditor.edit[1], function()
local myString = guiGetText(GUIEditor.edit[1])
guiSetText(GUIEditor.edit[1], myString:gsub ( "%p", "" ) )
end)
GUIEditor.checkbox[1] = guiCreateCheckBox(190, 408, 174, 18, "Accept trade", false, false, GUIEditor.window[1])
addEventHandler("onClientGUIClick", GUIEditor.checkbox[1], function ()
if getElementType(GUIEditor.checkbox[1]) == "gui-checkbox" then
triggerServerEvent("acceptTrade", localPlayer, guiCheckBoxGetSelected(GUIEditor.checkbox[1]))
end
end)
GUIEditor.button[3] = guiCreateButton(475, 403, 154, 38, "Make trade", false, GUIEditor.window[1])
addEventHandler("onClientGUIClick", GUIEditor.button[3], function ()
if getElementType(source) == "gui-button" and getElementData(localPlayer, "TradeACP") and getElementData(getElementData(localPlayer, "TradingW"), "TradeACP") then
if guiGridListGetRowCount(GUIEditor.gridlist[2]) > 0 or guiGridListGetRowCount(GUIEditor.gridlist[3]) > 0 then
mof = {{}, {}}
oof = {{}, {}}
for r=0, guiGridListGetRowCount(GUIEditor.gridlist[2]) do
table.insert(mof[1], guiGridListGetItemText(GUIEditor.gridlist[2], r, 1))
table.insert(mof[2], guiGridListGetItemText(GUIEditor.gridlist[2], r, 2))
end
for r=0, guiGridListGetRowCount(GUIEditor.gridlist[3]) do
table.insert(oof[1], guiGridListGetItemText(GUIEditor.gridlist[3], r, 1))
table.insert(oof[2], guiGridListGetItemText(GUIEditor.gridlist[3], r, 2))
end
triggerServerEvent("makeTrade", localPlayer, mof, oof)
hideGui()
else
hideGui()
end
end
end)
guiSetProperty(GUIEditor.button[3], "NormalTextColour", "FFAAAAAA")
end
)
addEvent("updateOffer", true)
addEventHandler("updateOffer", root, function (it, am)
setTradeAccepted(false)
r = false
for k=0, guiGridListGetRowCount(GUIEditor.gridlist[3]) do
if guiGridListGetItemText(GUIEditor.gridlist[3], k, 1) == it then
r = k
end
end
if r == false then
r = guiGridListAddRow(GUIEditor.gridlist[3])
guiGridListSetItemText(GUIEditor.gridlist[3], r, 1, it, false, false)
guiGridListSetItemText(GUIEditor.gridlist[3], r, 2, 0, false, false)
end
if am < 0 then
if tonumber(guiGridListGetItemText(GUIEditor.gridlist[3], r, 2))+am <= 0 then
guiGridListRemoveRow(GUIEditor.gridlist[3], r)
else
guiGridListSetItemText(GUIEditor.gridlist[3], r, 2, tonumber(guiGridListGetItemText(GUIEditor.gridlist[3], r, 2))+am, false, false)
end
else
guiGridListSetItemText(GUIEditor.gridlist[3], r, 2, tonumber(guiGridListGetItemText(GUIEditor.gridlist[3], r, 2))+am, false, false)
end
end)
function hideGui()
if isElement(GUIEditor.window[1]) then
destroyElement(GUIEditor.window[1])
showCursor(false)
end
end
addEvent("hideTrade", true)
addEventHandler("hideTrade", root, hideGui)
function setTradeAccepted(bol)
guiCheckBoxSetSelected(GUIEditor.checkbox[1], bol)
triggerServerEvent("acceptTrade", localPlayer, bol)
end
Server:
conn = dbConnect( "mysql", "dbname="..tostring(exports["NGSQL"]:getMySQLData()[3])..";host=46.105.63.90", tostring(exports["NGSQL"]:getMySQLData()[1]), tostring(exports["NGSQL"]:getMySQLData()[2]), "share=1" )
ptrt = {}
itens = {
[-1] = "Money",
[0] = "Gas Can",
[1] = "Full Rack",
[2] = "Buster",
[3] = "Double D-Luxe",
[4] = "Sallad Meal",
[5] = "Wrench",
[6] = "Medic Kit",
[7] = "Gas Mask",
[8] = "Tire Repair Kit",
[9] = "2x Nitrous",
[10] = "5x Nitrous",
[11] = "10x Nitrous",
[12] = "Heroine",
[13] = "Weed",
[14] = "LSD",
[15] = "DMT",
[16] = "Armour",
[17] = "Paint",
[18] = "Heroine Seed",
[19] = "Weed Seed",
[20] = "LSD Seed",
[21] = "DMT Seed",
[22] = "Mistery Box",
[23] = "Colt 45",
[24] = "Taser",
[25] = "Deagle",
[26] = "M4",
[27] = "AK-47",
[28] = "Uzi",
[29] = "Tec-9",
[30] = "MP5",
[31] = "Shotgun",
[32] = "Sawn-off",
[33] = "Spas-12",
[34] = "Rifle",
[35] = "Sniper",
[36] = "Minigun",
[37] = "RPG",
[38] = "Heat-Seeking RPG",
[39] = "Flamethrower",
[40] = "Grenade",
[41] = "Satchel",
[42] = "Molotov",
[43] = "Tear Gas",
[44] = "Parachute",
}
for k, v in ipairs(getElementsByType("player")) do
setElementData(v, "Trading", false)
setElementData(v, "TradingW", false)
setElementData(v, "TradeRQ", false)
setElementData(v, "TradeACP", false)
end
addCommandHandler("trade", function (source, _, who)
if not isGuestAccount(getPlayerAccount(source)) then
local who = findPlayer(who)
if who and not isGuestAccount(getPlayerAccount(who)) and who ~= source then
if not getElementData(source, "Trading") then
local x, y, z = getElementPosition(source)
local a, b, c = getElementPosition(who)
if getDistanceBetweenPoints3D(x, y, z, a, b, c) <= 5 then
if not getElementData(source, "TradeRQ") then
setElementData(source, "TradeRQ", who)
exports.SAUGMessages:sendClientMessage("You sended a trade request to "..getPlayerName(who).."!",source, 0, 255, 0)
ptrt[source] = setTimer(setElementData, 20000, 1, source, "TradeRQ", false)
else
exports.SAUGMessages:sendClientMessage("You already sent a trade request, wait a while to send another one!",source, 255, 0, 0)
return
end
if source == getElementData(who, "TradeRQ") and who == getElementData(source, "TradeRQ") then
pi = {}
piq = {}
qry = dbQuery(conn, "SELECT * FROM inventory WHERE playerid=?", getPlayerID(source))
pol = dbPoll(qry, -1)
for k, row in ipairs(pol) do
if(row["quant"] > 0) then
table.insert(pi, itens[row["itemid"]])
table.insert(piq, row["quant"])
end
end
triggerClientEvent(source, "startTrade", source, pi, piq)
pi = {}
piq = {}
qry = dbQuery(conn, "SELECT * FROM inventory WHERE playerid=?", getPlayerID(who))
pol = dbPoll(qry, -1)
for k, row in ipairs(pol) do
if(row["quant"] > 0) then
table.insert(pi, itens[row["itemid"]])
table.insert(piq, row["quant"])
end
end
triggerClientEvent(who, "startTrade", who, pi, piq)
setElementData(source, "Trading", true)
setElementData(who, "Trading", true)
setElementData(who, "TradingW", source)
setElementData(source, "TradingW", who)
exports.SAUGMessages:sendClientMessage("You started trading with "..getPlayerName(who).."!",source, 0, 255, 0)
exports.SAUGMessages:sendClientMessage("You started trading with "..getPlayerName(source).."!",who, 0, 255, 0)
end
else
exports.SAUGMessages:sendClientMessage("You must be near the player you want to trade with!",source, 255, 0, 0)
end
else
exports.SAUGMessages:sendClientMessage("You are already trading!",source, 255, 0, 0)
end
else
exports.SAUGMessages:sendClientMessage("Player not found!",source, 255, 0, 0)
end
end
end)
addEvent("updateAddOffer", true)
addEventHandler("updateAddOffer", root, function (it, am)
if getElementData(source, "Trading") and getElementData(source, "TradingW") and getElementData(getElementData(source, "TradingW"), "TradingW") == source and getKeyFromValueInTable(itens, it) then
triggerClientEvent(getElementData(source, "TradingW"), "updateOffer", getElementData(source, "TradingW"), it, tonumber(am))
end
end)
addEvent("updateRemoveOffer", true)
addEventHandler("updateRemoveOffer", root, function (it, am)
if getElementData(source, "Trading") and getElementData(source, "TradingW") and getElementData(getElementData(source, "TradingW"), "TradingW") == source and getKeyFromValueInTable(itens, it) then
triggerClientEvent(getElementData(source, "TradingW"), "updateOffer", getElementData(source, "TradingW"), it, 0-tonumber(am))
end
end)
addEvent("closeTrade", true)
addEventHandler("closeTrade", root, function ()
if getElementData(source, "Trading") and getElementData(source, "TradingW") and getElementData(getElementData(source, "TradingW"), "TradingW") == source then
triggerClientEvent(getElementData(source, "TradingW"), "hideTrade", getElementData(source, "TradingW"))
setElementData(source, "TradeACP", false)
setElementData(getElementData(source, "TradingW"), "TradeACP", false)
exports.SAUGMessages:sendClientMessage(getPlayerName(source).." cancelled the trade!",getElementData(source, "TradingW"), 255, 0, 0)
setElementData(getElementData(source, "TradingW"), "Trading", false)
setElementData(getElementData(source, "TradingW"), "TradingW", false)
setElementData(source, "Trading", false)
setElementData(source, "TradingW", false)
end
end)
addEvent("acceptTrade", true)
addEventHandler("acceptTrade", root, function (acp)
if getElementData(source, "Trading") and getElementData(source, "TradingW") and getElementData(getElementData(source, "TradingW"), "TradingW") == source then
setElementData(source, "TradeACP", acp)
end
end)
error = {}
addEvent("makeTrade", true)
addEventHandler("makeTrade", root, function (mof, oof)
if getElementData(source, "Trading") and getElementData(source, "TradingW") and getElementData(getElementData(source, "TradingW"), "TradingW") == source and not getElementData(getElementData(source, "TradingW"), "TradeMade") and not getElementData(source, "TradeMade") then
if getElementData(getElementData(source, "TradingW"), "TradeACP") then
error[source] = false
setElementData(source, "TradeMade", true)
setTimer(setElementData, 5000, 1, source, "TradeMade", false)
exports.SAUGucp:givePlayerAch(source,19)
for k, v in ipairs(mof[1]) do
if v == "Money" then
if getPlayerMoney(source) >= tonumber(mof[2][k]) then
takePlayerMoney(source, mof[2][k])
givePlayerMoney(getElementData(source, "TradingW"), mof[2][k])
else
error[source] = true
end
elseif not error[source] then
exports["SAUGInventory"]:takePlayerItem(source, getKeyFromValueInTable(itens, v), tonumber(mof[2][k]))
exports["SAUGInventory"]:addPlayerItem(getElementData(source, "TradingW"), getKeyFromValueInTable(itens, v), tonumber(mof[2][k]))
end
end
for k, v in ipairs(oof[1]) do
if v == "Money" then
if getPlayerMoney(getElementData(source, "TradingW")) >= tonumber(oof[2][k]) then
givePlayerMoney(source, oof[2][k])
takePlayerMoney(getElementData(source, "TradingW"), oof[2][k])
else
error[source] = true
end
elseif not error[source] then
exports["SAUGInventory"]:takePlayerItem(getElementData(source, "TradingW"), getKeyFromValueInTable(itens, v), tonumber(oof[2][k]))
exports["SAUGInventory"]:addPlayerItem(source, getKeyFromValueInTable(itens, v), tonumber(oof[2][k]))
end
end
triggerClientEvent(getElementData(source, "TradingW"), "hideTrade", getElementData(source, "TradingW"))
setElementData(getElementData(source, "TradingW"), "Trading", false)
setElementData(getElementData(source, "TradingW"), "TradingW", false)
setElementData(getElementData(source, "TradingW"), "TradeACP", false)
setElementData(source, "TradeACP", false)
setElementData(source, "Trading", false)
setElementData(source, "TradingW", false)
exports.SAUGMessages:sendClientMessage("Trade successfully made!",getElementData(source, "TradingW"),0,255,0)
exports.SAUGMessages:sendClientMessage("Trade successfully made!",source, 0, 255, 0)
else
triggerClientEvent(getElementData(source, "TradingW"), "hideTrade", getElementData(source, "TradingW"))
setElementData(getElementData(source, "TradingW"), "Trading", false)
setElementData(getElementData(source, "TradingW"), "TradingW", false)
setElementData(getElementData(source, "TradingW"), "TradeACP", false)
setElementData(source, "TradeACP", false)
setElementData(source, "Trading", false)
setElementData(source, "TradingW", false)
exports.SAUGMessages:sendClientMessage("Your partner did not accept the trade!",source, 255, 0, 0)
end
end
end)
addEventHandler("onPlayerQuit", root, function ()
if getElementData(source, "Trading") and getElementData(source, "TradingW") and isElement(getElementData(source, "TradingW")) then
triggerClientEvent(getElementData(source, "TradingW"), "hideTrade", getElementData(source, "TradingW"))
triggerClientEvent(source, "hideTrade", source)
end
end)
function getPlayerID(player)
pqr = dbQuery(conn, "SELECT * FROM accountdata WHERE Username=? LIMIT 1", getAccountName(getPlayerAccount(player)))
pqp = dbPoll(pqr, -1)
for k, plas in ipairs (pqp) do
return plas["id"]
end
return false
end
function getKeyFromValueInTable(a, b)
for k,v in pairs(a) do
if v == b then
return k
end
end
return false
end
function findPlayer(player)
if (player and type(player) == "string") then
local plr = getPlayerFromName(player)
if (plr ~= false) then return plr end
local pC = 0
local player = string.lower(player)
local spl = split(player, string.byte("["))
if spl then
player = table.concat(spl, ";")
end
for k, v in ipairs(getElementsByType("player")) do
local nam = string.lower(getPlayerName(v))
local spl = split(nam, string.byte("["))
if spl then
nam = table.concat(spl, ";")
end
if string.find(nam, player) then plr = v pC = pC + 1
end
end
if plr and pC == 1 then
return plr
end
return false
else return false
end
end