Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
9.7 kB
3
Indexable
Never
--[[
	Gesior Shop System v2.0
	
	Originally written by Gesior, modified by slawkens for MyAAC.
	This script should work with ANY distro.
	
	don't forget to paste this into globalevents.xml:
	
	<globalevent name="gesior-shop-system" interval="30000" script="gesior-shop-system.lua" />
	
	change 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 www.otland.net")
		end
	end
end

local globalshop = GlobalEvent("globalshop")

function globalshop.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 player = Player(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 `itemid1` in `z_shop_offers` then delete it from `z_ots_comunication`")
					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 `itemid2` in `z_shop_offers` then delete it from `z_ots_comunication`")
							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
				
				local inbox = player:getInbox()
				local parcel = Game.createItem(3504, 1)
				--local letter = Game.createItem(3506, 1)
					
				local text_letter = ("Hola bebesita")
		
				if(not item_doesnt_exist) 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 inboxAgregando = inbox:addItemEx(parcel, 1, INDEX_WHEREEVER, FLAG_NOLIMIT)
						local parcelAdding = inboxAgregando:addItem(parcelID)
						-- parcelAdding:addItem(objeto que vas a colocar)
					end

					if(received_item == RETURNVALUE_NOERROR) then
						doPlayerSendTextMessage(cid, messageType, "Congratulations you have received >> ".. add_item_name .." <<, go to inbox to pick up the package.")
						doQuery("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";")
						doQuery("UPDATE `z_shop_history` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE comunication_id = " .. id .. ";")
						doPlayerSave(cid)
						added = true
					end
				end
			elseif(add_item_type == 'addon') then
				doPlayerSendTextMessage(cid, messageType, "You received >> ".. add_item_name .." <<, now you can equip the outfit with addon included.")
				doSendMagicEffect(getCreaturePosition(cid), CONST_ME_GIFT_WRAPS)
				doPlayerAddOutfit(cid, param1, param3)
				doPlayerAddOutfit(cid, param2, param4)
				doQuery("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";")
				doQuery("UPDATE `z_shop_history` SET `trans_state`='realized', `trans_real`=" .. 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 `z_shop_offers` table where `offer_type` = mount and also in `z_ots_comunication` where `param5` = mount.")
				else
					doPlayerAddMount(cid, param1)
					doPlayerSendTextMessage(cid, messageType, "You received >> ".. add_item_name .." <<, now you can equip the mount.")
					doSendMagicEffect(getCreaturePosition(cid), CONST_ME_GIFT_WRAPS)
					doQuery("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";")
					doQuery("UPDATE `z_shop_history` SET `trans_state`='realized', `trans_real`=" .. 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

globalshop:interval(3000)
globalshop:register()