• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

Function that checks items special description

Kakaher

Member
Joined
Nov 2, 2009
Messages
129
Reaction score
7
Hello everybody...

I hope someone can help me out here...

I have an auction system on my server and also a refine system...
The problem is that if you place a refined item on the auction house, the item will loose its upgrades..
So, what Im trying to achieve is to block the players from placing an upgraded item to the auction house

Here is the script

Code:
--[[
                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

[COLOR="#FF0000"]				local a = getItemSpecialDescription(item.uid)
				local b = a:string.find("+")
				if b then
                                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can\'t sell an upgraded item.")
                                                return true
                                end[/COLOR]
 
                                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

And I get this error:

Code:
[Error - TalkAction Interface]
data/talkactions/scripts/auction.lua:onSay
Description:
data/talkactions/scripts/auction.lua:56: attempt to index local 'item' (a number value)
stack traceback:
data/talkactions/scripts/auction.lua:56: in function <data/talkactions/scripts/auction.lua:12>

The part in red is where I´m trying to check whether the item is upgraded or not...

Basically I need to check if the item has a plus signal to its description, if it does then it can't not be placed to the auction house...

Thanks A LOT already for the help!
Rep+
 
Thanks for trying to help man!

tried:
LUA:
				local a = getItemSpecialDescription(item)
				local b = a:find("+")
				if b then
                                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can\'t sell an upgraded item.")
                                                return true
                                end

and now I get this error:
Code:
[Error - TalkAction Interface]
data/talkactions/scripts/auction.lua:onSay
Description:
(luaGetthing) Thing not found

[Error - TalkAction Interface]
data/talkactions/scripts/auction.lua:onSay
Description:
data/lib/050-function.lua:269: attempt to index a boolean value
stack traceback:
data/lib/050-function.lua:269: in function 'getItemSpecialDescription'
data/talkactions/scripts/auction.lua:51: in function <data/talkactions/scripts/auction.lua:12>
 
The function getItemSpecialDescription uses a uid not an itemid.
So you should put this after the check that the player already have atleast one of the required item:
LUA:
local thing =getPlayerItemById(cid,true,item)
local a = getItemSpecialDescription(thing.uid)
if  a:find("+") ~= nil then
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can't sell an upgraded item.")
	return true
end
 
Back
Top