-----------------------------------------------------------------------------------------------------------------------------------------
--[[
Gesior Shop System v2.0
Originally written by Gesior, modified by slawkens for MyAAC.
Converted to Revscriptsys by Majesty.
change interval 30000 to 30 if other values in this file are low
]]--
local messageType = MESSAGE_EVENT_ORANGE
local displayExecutionTime = true -- how time script took in console (true/false)
-- don't edit anything below this line
if(displayExecutionTime) then
function doSecondsFormat(i)
local str, found = string.gsub(i, "(%d)(%d%d%d)$", "%1.%2", 1), 0
repeat
str, found = string.gsub(str, "(%d)(%d%d%d),", "%1.%2,", 1)
until found == 0
return str
end
end
if(not messageType) then
messageType = MESSAGE_STATUS_CONSOLE_ORANGE
if(not messageType) then
messageType = MESSAGE_INFO_DESCR
end
end
if(not getPlayerByName) then
function getPlayerByName(name) local p = Player(name) return p ~= nil and p:getId() or false end
end
if(not isPlayer) then
function isPlayer(cid) return Player(cid) ~= nil end
end
if(not doPlayerSave) then
function doPlayerSave(cid)
if(Player and type(Player) == "table" and Player.save and type(Player.save) == "function") then
local player = Player(cid)
if(player) then
player:save()
end
end
return true
end
end
function getResults()
if(db.storeQuery ~= nil and result.free ~= nil) then -- TFS 1.0+
local resultId = db.storeQuery("SELECT * FROM z_ots_comunication;")
if(resultId == false) then
return false
end
local results = {}
repeat
local tmp = {}
tmp.name = result.getDataString(resultId, "name")
-- better performance when no player found
tmp.exist = false
tmp.cid = getPlayerByName(tmp.name)
if(tmp.cid and isPlayer(tmp.cid)) then
tmp.exist = true
tmp.id = result.getDataInt(resultId, "id")
tmp.action = result.getDataString(resultId, "action")
tmp.delete_it = result.getDataInt(resultId, "delete_it")
tmp.param1 = result.getDataInt(resultId, "param1")
tmp.param2 = result.getDataInt(resultId, "param2")
tmp.param3 = result.getDataInt(resultId, "param3")
tmp.param4 = result.getDataInt(resultId, "param4")
tmp.param5 = result.getDataString(resultId, "param5")
tmp.param6 = result.getDataString(resultId, "param6")
end
table.insert(results, tmp)
until not result.next(resultId)
result.free(resultId)
return results
else -- TFS 0.3
if(db.getResult ~= nil) then
local result_plr = db.getResult("SELECT * FROM z_ots_comunication;")
if(result_plr:getID() == -1) then
return false
end
local results = {}
repeat
local tmp = {}
tmp.name = tostring(result_plr:getDataString("name"))
-- better performance when no player found
tmp.exist = false
tmp.cid = getPlayerByName(tmp.name)
if(tmp.cid and isPlayer(tmp.cid)) then
tmp.exist = true
tmp.id = tonumber(result_plr:getDataInt("id"))
tmp.action = tostring(result_plr:getDataString("action"))
tmp.delete_it = tonumber(result_plr:getDataInt("delete_it"))
tmp.param1 = tonumber(result_plr:getDataInt("param1"))
tmp.param2 = tonumber(result_plr:getDataInt("param2"))
tmp.param3 = tonumber(result_plr:getDataInt("param3"))
tmp.param4 = tonumber(result_plr:getDataInt("param4"))
tmp.param5 = tostring(result_plr:getDataString("param5"))
tmp.param6 = tostring(result_plr:getDataString("param6"))
end
table.insert(results, tmp)
until not(result_plr:next())
result_plr:free()
return results
else
print('[ERROR - gesior-shop-system.lua] Your distribution is not supported')
end
end
return false
end
function doQuery(query)
if(db.asyncQuery ~= nil) then
db.asyncQuery(query)
elseif(db.query ~= nil) then
db.query(query)
elseif(db.executeQuery ~= nil) then
db.executeQuery(query)
else
return false
end
return true
end
if(not getItemWeightById) then
getItemWeightById = getItemWeight
end
if(not doCreateItemEx) then
function doCreateItemEx(itemid, count)
if(Game and type(Game) == "table" and Game.createItem and type(Game.createItem) == "function") then
local item = Game.createItem(itemid, count)
if item then
return item:getUniqueId()
end
return false
else
print("[ERROR - gesior-shop-system] Error code: 1. Please contact slawkens at [URL="http://www.otland.net"]www.otland.net[/URL]")
end
end
end
local gesiorShopSystem = GlobalEvent("GesiorShopSystem")
function gesiorShopSystem.onThink(interval)
if(interval > 1000) then
interval = interval / 1000
end
local started = os.mtime and os.mtime() or os.time()
local addedItems, waitingItems = 0, 0
local added = false
local results = getResults()
if(not results) then
return true
end
for i, v in ipairs(results) do
added = false
local id = v.id
local action = v.action
local delete = v.delete_it
if(v.exist) then
local cid = v.cid
local param1, param2, param3, param4 = v.param1, v.param2, v.param3, v.param4
local add_item_type = v.param5
local add_item_name = v.param6
local received_item, full_weight, items_weight, item_weigth = 0, 0, 0, 0
local item_doesnt_exist = false
if(add_item_type == 'container' or add_item_type == 'item') then
local item_weigth = getItemWeightById(param1, 1)
if(type(item_weigth) == 'boolean') then -- item doesn't exist
print("[ERROR - gesior-shop-system] Invalid item id: " .. param1 .. ". Change/Fix [ICODE]itemid1[/ICODE] in [ICODE]z_shop_offers[/ICODE] then delete it from [ICODE]z_ots_comunication[/ICODE]")
item_doesnt_exist = true
else
if(add_item_type == 'container') then
container_weight = getItemWeightById(param3, 1)
if(type(container_weight) == 'boolean') then -- container item doesn't exist
print("[ERROR - gesior-shop-system] Invalid container id: " .. param3 .. ". Change/Fix [ICODE]itemid2[/ICODE] in [ICODE]z_shop_offers[/ICODE] then delete it from [ICODE]z_ots_comunication[/ICODE]")
item_doesnt_exist = true
else
if(isItemRune(param1)) then
items_weight = param4 * item_weigth
else
items_weight = param4 * getItemWeightById(param1, param2)
end
full_weight = items_weight + container_weight
end
elseif(add_item_type == 'item') then
full_weight = getItemWeightById(param1, param2)
if(isItemRune(param1)) then
full_weight = getItemWeightById(param1, 1)
end
end
end
if(not item_doesnt_exist) then
local free_cap = getPlayerFreeCap(cid)
if(full_weight <= free_cap) then
if(add_item_type == 'container') then
local new_container = doCreateItemEx(param3, 1)
for x = 1, param4 do
doAddContainerItem(new_container, param1, param2)
end
received_item = doPlayerAddItemEx(cid, new_container)
else
local new_item = doCreateItemEx(param1, param2)
received_item = doPlayerAddItemEx(cid, new_item)
end
if(received_item == RETURNVALUE_NOERROR) then
doPlayerSendTextMessage(cid, messageType, "You received >> ".. add_item_name .." << from OTS shop.")
doQuery("DELETE FROM [ICODE]z_ots_comunication[/ICODE] WHERE [ICODE]id[/ICODE] = " .. id .. ";")
doQuery("UPDATE [ICODE]z_shop_history[/ICODE] SET [ICODE]trans_state[/ICODE]='realized', [ICODE]trans_real[/ICODE]=" .. os.time() .. " WHERE comunication_id = " .. id .. ";")
doPlayerSave(cid)
added = true
else
doPlayerSendTextMessage(cid, messageType, '>> '.. add_item_name ..' << from OTS shop is waiting for you. Please make place for this item in your backpack/hands and wait about '.. interval ..' seconds to get it.')
end
else
doPlayerSendTextMessage(cid, messageType, '>> '.. add_item_name ..' << from OTS shop is waiting for you. It weight is '.. full_weight ..' oz., you have only '.. free_cap ..' oz. free capacity. Put some items in depot and wait about '.. interval ..' seconds to get it.')
end
end
elseif(add_item_type == 'addon') then
doPlayerSendTextMessage(cid, messageType, "You received >> ".. add_item_name .." << from OTS shop.")
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_GIFT_WRAPS)
doPlayerAddOutfit(cid, param1, param3)
doPlayerAddOutfit(cid, param2, param4)
doQuery("DELETE FROM [ICODE]z_ots_comunication[/ICODE] WHERE [ICODE]id[/ICODE] = " .. id .. ";")
doQuery("UPDATE [ICODE]z_shop_history[/ICODE] SET [ICODE]trans_state[/ICODE]='realized', [ICODE]trans_real[/ICODE]=" .. os.time() .. " WHERE comunication_id = " .. id .. ";")
doPlayerSave(cid)
added = true
elseif(add_item_type == 'mount') then
if(not doPlayerAddMount) then
print("[ERROR - gesior-shop-system] Your server doesn't support mounts. Remove all items in database from your [ICODE]z_shop_offers[/ICODE] table where [ICODE]offer_type[/ICODE] = mount and also in [ICODE]z_ots_comunication[/ICODE] where [ICODE]param5[/ICODE] = mount.")
else
doPlayerAddMount(cid, param1)
doPlayerSendTextMessage(cid, messageType, "You received >> ".. add_item_name .." << from OTS shop.")
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_GIFT_WRAPS)
doQuery("DELETE FROM [ICODE]z_ots_comunication[/ICODE] WHERE [ICODE]id[/ICODE] = " .. id .. ";")
doQuery("UPDATE [ICODE]z_shop_history[/ICODE] SET [ICODE]trans_state[/ICODE]='realized', [ICODE]trans_real[/ICODE]=" .. os.time() .. " WHERE comunication_id = " .. id .. ";")
doPlayerSave(cid)
added = true
end
end
end
if(added) then
addedItems = addedItems + 1
else
waitingItems = waitingItems + 1
end
end
local message = ">> Shopsystem, added " .. addedItems .. " items. Still waiting with " .. waitingItems .. " items."
if(displayExecutionTime) then
local done, str = os.time() - started, ""
if(os.mtime) then
done = os.mtime() - started
if(done < 100) then
str = "0.0" .. done
elseif(done < 1000) then
str = "0." .. done
else
str = doSecondsFormat(done)
if(str:len() == 0) then str = "0.0" end
end
end
message = message .. " Done in: " .. str .. "s."
end
print(message)
return true
end
gesiorShopSystem:interval(30000)
gesiorShopSystem:register()