Luck Oake 16 #1 Posted June 12, 2014 (edited) Olá. Trouxe para vocês meu sistema de compra e venda de personagens ingame através de talkactions. Scripts: data/talkactions/talkactions.xml: <talkaction words="!character" script="char_market.lua"/> data/talkactions/scripts/char_market.lua: function onSay(cid, words, param) local t = string.explode(param, ",") if t[1] == "sell" then if not t[3] or not tonumber(t[3]) or t[4] or tonumber(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Incorrect Params. Specify the character name and the price.") return true elseif getPlayerAccountId(cid) ~= getAccountIdByName(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "This is not your character.") return true elseif isCharacterForSale(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "This character is already for sale.") return true elseif getPlayerGUIDByName(t[2]) == getPlayerGUID(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You cannot sell yourself.") return true elseif getPlayerByName(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "The character must be offline to be sold.") return true elseif getOfflinePlayerValue(t[2], "level") < level then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Your character can't be sold until it has level "..level..".") return true elseif tonumber(t[3]) < CHAR_MARKET_MIN_PRICE then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Sorry, but the minimum price for selling a character is "..min_price..".") return true elseif tonumber(t[3]) > CHAR_MARKET_MAX_PRICE then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Sorry, but the maximum price for selling a character is "..max_price..".") return true end setOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE, t[3]) setOfflinePlayerStorageValue(t[2], CHAR_MARKET_OWNER, getPlayerGUID(cid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Your character "'..t[2]..'" is now for sale for the price of "'..t[3]..'" gold coins.') elseif t[1] == "buy" then if not t[2] then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Incorrect Params. Specify the character name.") return true elseif not playerExists(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "This character doesn't exist.") return true elseif getPlayerAccountId(cid) == getAccountIdByName(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You can't buy your own character.") return true elseif not isCharacterForSale(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "This character is not for sale.") return true elseif not doPlayerRemoveMoney(cid, getOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Not enough money. This character's price is "..getOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE).." gold coins.") return true end if not getPlayerByGUID(getOfflinePlayerStorageValue(t[2], CHAR_MARKET_OWNER)) then doOfflinePlayerAddMoney(getPlayerNameByGUID(getOfflinePlayerStorageValue(t[2], CHAR_MARKET_OWNER)), getOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE)) setOfflinePlayerStorageValue(getPlayerNameByGUID(getOfflinePlayerStorageValue(t[2], CHAR_MARKET_OWNER)), 41792, getPlayerGUIDByName(t[2])) else doPlayerAddMoney(getPlayerByGUID(getOfflinePlayerStorageValue(t[2], CHAR_MARKET_OWNER)), getOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE)) doPlayerSendTextMessage(getPlayerByGUID(getOfflinePlayerStorageValue(t[2], CHAR_MARKET_OWNER)), MESSAGE_STATUS_CONSOLE_BLUE, 'Your character "'..t[2]..'" has been sold for the price of '..getOfflinePlayerStorageValue(t[2], price)..' gold coins.') end doTransferCharacter(t[2], getPlayerAccountId(cid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'You bought the character "'..t[2]..'" for the price of '..getOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE)..' gold coins.') setOfflinePlayerStorageValue(t[2], CHAR_MARKET_OWNER, -1) setOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE, -1) return true elseif t[1] == "remove" then if not t[2] then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Incorrect Params. Specify the character name.") return true elseif getPlayerAccountId(cid) ~= getAccountIdByName(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "This is not your character.") return true elseif not isCharacterForSale(t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "This character is not for sale.") return true end setOfflinePlayerStorageValue(t[2], CHAR_MARKET_PRICE, -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'You removed the character "'..t[2]..'" from the Characters Market.') return true elseif t[1] == "list" then local result = db.getResult("SELECT `name` FROM `players`") if result:getID() == -1 then return true end local msg = "Characters for Sale:\n\n" while true do local name = result:getDataString("name") if isCharacterForSale(name) then local sex = getOfflinePlayerValue(name, "sex") == 1 and "Male" or "Female" msg = ""..msg.." - ".. name .." (Level: "..getOfflinePlayerValue(name, "level").." / Vocation: "..getVocationInfo(getOfflinePlayerValue(name, "vocation")).name.." / Sex: "..sex.." / Owner: "..getPlayerNameByGUID(getOfflinePlayerStorageValue(name, CHAR_MARKET_OWNER))..") [Price: "..getOfflinePlayerStorageValue(name, CHAR_MARKET_PRICE).."] \n" end if not result:next() then break end end doPlayerPopupFYI(cid, msg) return true elseif not t[1] or t[1] ~= "buy" or t[1] ~= "sell" or t[1] ~= "remove" or t[1] ~= "list" then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Incorrect params. You can only 'buy' or 'sell' a character, 'remove' it from the Characters Market or see the 'list' of characters for sale.") return true end return true end data/lib/characters_market_lib.lua: CHAR_MARKET_PRICE = 27112 CHAR_MARKET_OWNER = 27113 CHAR_MARKET_LEVEL = 30 -- Level mínimo que o character deve ter para ser vendido CHAR_MARKET_MIN_PRICE = 100 -- Preço mínimo de um character CHAR_MARKET_MAX_PRICE = 1000000 -- Preço máximo de um character function doTransferCharacter(cid, accId) return db.executeQuery("UPDATE `players` SET `account_id` = "..accId.." WHERE `id` = "..getPlayerGUIDByName(cid).."") end function doOfflinePlayerAddMoney(guid, money) return db.executeQuery("UPDATE `players` SET `balance` = `balance` + '"..money.."' WHERE `id` = '"..getPlayerGUIDByName(guid).."';") end function setOfflinePlayerStorageValue(name, key, value) local result = db.getResult("SELECT * FROM `player_storage` WHERE `player_id` = ".. getPlayerGUIDByName(name) .." AND `key` = ".. key ..";") if result:getID() == -1 then return db.executeQuery("INSERT INTO `player_storage` (`player_id`, `key`, `value`) VALUES (".. getPlayerGUIDByName(name) ..", ".. key ..", ".. value ..");") else result:free() return db.executeQuery("UPDATE `player_storage` SET `value` = ".. value .." WHERE `player_id` = ".. getPlayerGUIDByName(name) .." AND `key` = ".. key ..";") end end function getOfflinePlayerStorageValue(name, key) local result, ret = db.getResult("SELECT `value` FROM `player_storage` WHERE `player_id` = '".. getPlayerGUIDByName(name) .."' AND `key` = ".. key ..";") if result:getID() == -1 then return nil end ret = result:getDataInt("value") result:free() return ret end function getOfflinePlayerValue(name, value) local result, ret = db.getResult("SELECT `"..value.."` FROM `players` WHERE `id` = "..getPlayerGUIDByName(name)..";") ret = result:getDataInt(value) result:free() return ret end function isCharacterForSale(name) if not getOfflinePlayerStorageValue(name, CHAR_MARKET_PRICE) or getOfflinePlayerStorageValue(name, CHAR_MARKET_PRICE) < 1 then return false else return true end end data/creaturescripts/creaturescripts.xml: <event type="login" name="MarketLogin" script="characters_market.lua"/> data/creaturescripts/characters_market.lua: function onLogin(cid) if getPlayerStorageValue(cid, CHAR_MARKET_PRICE) > 0 then return false elseif getPlayerStorageValue(cid, 41792) ~= -1 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You sold the character "..getPlayerNameByGUID(getPlayerStorageValue(cid, 41792))..". The money is in your bank account.") setPlayerStorageValue(cid, 41792, -1) end return true end Configure aqui: CHAR_MARKET_LEVEL = 30 -- Level mínimo que o character deve ter para ser vendido CHAR_MARKET_MIN_PRICE = 100 -- Preço mínimo de um character CHAR_MARKET_MAX_PRICE = 1000000 -- Preço máximo de um character Comandos: !character - Parâmetros: - buy nome -- Compra o personagem - sell nome -- Coloca o personagem à venda - remove nome -- Remove o personagem da lista de vendas - list -- Vê a lista de personagens disponíveis para compra Observações: - O script era um MOD, eu o alterei para sistema pouco antes de postar. Então, caso dê conflitos, seja qual for o motivo, reporte no tópico; - Algumas variáveis foram alteradas, então posso ter esquecido de mudar alguma no script; - Em algumas versões de TFS, o comando !character list dá erro. A razão é desconhecida. Caso tenha alguma solução, poste aqui no tópico para que o erro seja corrigido; - Eu sei que o script tem coisas que poderiam ser alteradas para deixá-lo mais "limpo", mas na época que escrevi o código eu ainda estava começando a fazer sistemas um pouco mais complexos. Até mais, bom uso. Edited June 15, 2014 by Luck Oake 2 1 santy332, diego2908 and dalvorsn reacted to this Share this post Link to post
dalvorsn 46 #2 Posted June 12, 2014 Isso ficaria bem bacana em otc :> Fazer uma gui e tals 1 Luck Oake reacted to this Share this post Link to post
Luck Oake 16 #3 Posted June 12, 2014 Boa ideia, ficaria bem maneiro. Mas precisava também adaptar pra TFS 1.0, mas infelizmente parei no tempo, não aprendi a mexer com ele hue Anyway, curti a ideia. Vou ver se ainda sei mexer com OTC, tanto tempo parado que nem sei se lembro de como criar janelas. Share this post Link to post
dalvorsn 46 #4 Posted June 12, 2014 Que nada, essa parte de db continua igual, tem as funções lua só que tudo bindado pelas sources: #db const luaL_Reg LuaScriptInterface::luaDatabaseTable[] = { {"query", LuaScriptInterface::luaDatabaseExecute}, {"storeQuery", LuaScriptInterface::luaDatabaseStoreQuery}, {"escapeString", LuaScriptInterface::luaDatabaseEscapeString}, {"escapeBlob", LuaScriptInterface::luaDatabaseEscapeBlob}, {"lastInsertId", LuaScriptInterface::luaDatabaseLastInsertId}, {"tableExists", LuaScriptInterface::luaDatabaseTableExists}, {nullptr, nullptr} }; #result const luaL_Reg LuaScriptInterface::luaResultTable[] = { {"getDataInt", LuaScriptInterface::luaResultGetDataInt}, {"getDataLong", LuaScriptInterface::luaResultGetDataLong}, {"getDataString", LuaScriptInterface::luaResultGetDataString}, {"getDataStream", LuaScriptInterface::luaResultGetDataStream}, {"next", LuaScriptInterface::luaResultNext}, {"free", LuaScriptInterface::luaResultFree}, {nullptr, nullptr} }; Share this post Link to post
Luck Oake 16 #5 Posted June 12, 2014 Hm... Bom saber disso. Depois vou ver como o TFS 1.0 funciona nesse quesito de scripts e vou adaptar o sistema. Share this post Link to post