Jump to content

Ajuda com setTimer


Recommended Posts

Olá boa tarde pessoal, eu peguei uma loja de veículos aqui na comunidade, e gostaria de por um limite de 10 dias o carro do jogador ser destruído do mapa em quanto ele fica offline, pois bem eu peguei a variavel do setTimer e implantei na função aonde o  player da quit no servidor porém quando o jogador da quit no servidor em vez de contar 10 segundos que eu coloquei para testa o veiculo é destruido na hora se poderem me ajudar fico muito grato: Segue o script abaixo vou por o código por inteiro para vocês não perderem o fio da meada então esta função está nas ultimas linhas. ( Eu quero deixar esse sistema de destruir por tempo por que eu retirei a opção do carro se destruir automaticamente, então quando o player deslogar o carro fica no mapa, e ai eu quero evitar os players ausentes de mais de 10 dias e os carros deles serem deletados do mapa, para não causar muito lag no servidor e nos próprios players)

function getFreeID()
	local result = dbPoll(dbQuery(db, "SELECT ID FROM VehicleList ORDER BY ID ASC"), -1)
	newID = false
	for i, id in pairs (result) do
		if id["ID"] ~= i then
			newID = i
			break
		end
	end
	if newID then return newID else return #result + 1 end
end

function getVehicleByID(id)
	v = false
	for i, veh in ipairs (getElementsByType("vehicle")) do
		if getElementData(veh, "ID") == id then
			v = veh
			break
		end
	end
	return v
end

function updateVehicleInfo(player)
	if isElement(player) then
		local result = dbPoll(dbQuery(db, "SELECT * FROM VehicleList WHERE Account = ?", getAccountName(getPlayerAccount(player))), -1)
		if type(result) == "table" then
			setElementData(player, "VehicleInfo", result)
		end
	end
end

addEventHandler("onResourceStart", resourceRoot,
function()
	db = dbConnect("sqlite", "database.db")
	dbExec(db, "CREATE TABLE IF NOT EXISTS VehicleList (ID, Account, Model, X, Y, Z, RotZ, Colors, Upgrades, Paintjob, Cost, HP)")
	for i, player in ipairs(getElementsByType("player")) do
		updateVehicleInfo(player)
	end
end)

addEvent("onOpenGui", true)
addEventHandler("onOpenGui", root,
function()
	updateVehicleInfo(source)
end)

function destroyVehicles(theVehicle)
	if isElement(theVehicle) then
		local Owner = getElementData(theVehicle, "Owner")
		if Owner then
			local x, y, z = getElementPosition(theVehicle)
			local _, _, rz = getElementRotation(theVehicle)
			local r1, g1, b1, r2, g2, b2 = getVehicleColor(theVehicle, true)
			local color = r1..","..g1..","..b1..","..r2..","..g2..","..b2
			upgrade = ""
			for _, upgradee in ipairs (getVehicleUpgrades(theVehicle)) do
				if upgrade == "" then
					upgrade = upgradee
				else
					upgrade = upgrade..","..upgradee
				end
			end
			local Paintjob = getVehiclePaintjob(theVehicle) or 3
			local id = getElementData(theVehicle, "ID")
			dbExec(db, "UPDATE VehicleList SET X = ?, Y = ?, Z = ?, RotZ = ?, HP = ?, Colors = ?, Upgrades = ?, Paintjob = ? WHERE Account = ? AND ID = ?", x, y, z, rz, getElementHealth(theVehicle), color, upgrade, Paintjob, getAccountName(getPlayerAccount(Owner)), id)
			updateVehicleInfo(Owner)
			local attached = getAttachedElements(theVehicle)
			if (attached) then
				for k,element in ipairs(attached) do
					if getElementType(element) == "blip" then
						destroyElement(element)
					end
				end
			end
		end
		destroyElement(theVehicle)
	end
end

addEvent("onBuyNewVehicle", true)
addEventHandler("onBuyNewVehicle", root, 
function(Model, cost, r1, g1, b1, r2, g2, b2)
	abc = false
	local data = dbPoll(dbQuery(db, "SELECT * FROM VehicleList WHERE Account = ?", getAccountName(getPlayerAccount(source))), -1)
	for i, data in ipairs (data) do
		if data["Model"] == Model then
			abc = true
			break
		end
	end
	if #data >= 50 then outputChatBox("#FFFFFFDesculpe, mas você só pode ter apenas 50 veículos.", source, 38, 122, 216, true) return end
	if abc then outputChatBox("#FFFFFFVocê já comprou este veículo antes.", source, 38, 122, 216, true) return end
	if getPlayerMoney(source) >= tonumber(cost) then
		takePlayerMoney ( source, cost )
		local x, y, z = getElementPosition(source)
		local _, _, rz = getElementRotation(source)
		local color = r1..","..g1..","..b1..","..r2..","..g2..","..b2
		vehicle = createVehicle(Model, x-5, y+5, z, 0, 0, rz)
		setVehicleColor(vehicle, r1, g1, b1, r2, g2, b2)
		setElementData(vehicle, "Owner", source)
		local NewID = getFreeID()
		setElementData(vehicle, "ID", NewID)
		dbExec(db, "INSERT INTO VehicleList VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", NewID, getAccountName(getPlayerAccount(source)), Model, x-5, y+5, z, rz, color, "", 3, cost, 1000)
		outputChatBox("#FFFFFFVocê comprou um: #FF0000"..getVehicleNameFromModel(Model), source, 38, 122, 216, true)
		outputChatBox("#FFFFFFPreço: #00FF00R$"..cost, source, 38, 122, 216, true)
		updateVehicleInfo(source)
		vv[vehicle] = setTimer(function(source)
			if not isElement(source) then killTimer(vv[source]) vv[source] = nil end
			if isElement(source) and getElementHealth(source) <= 255 then
				setElementHealth(source, 255.5)
				setVehicleDamageProof(source, true)
				setVehicleEngineState(source, false)
			end
		end, 50, 0, vehicle)
		addEventHandler("onVehicleDamage", vehicle,
		function(loss)
			local account = getAccountName(getPlayerAccount(getElementData(source, "Owner")))
			setTimer(function(source) if isElement(source) then dbExec(db, "UPDATE VehicleList SET HP = ? WHERE Account = ? AND Model = ?", getElementHealth(source), account, getElementModel(source)) updateVehicleInfo(getElementData(source, "Owner")) end end, 100, 1, source)
		end)
		addEventHandler("onVehicleEnter", vehicle,
		function(player)
			if getElementHealth(source) <= 255.5 then 
				setVehicleEngineState(source, false)
			else
				if isVehicleDamageProof(source) then
					setVehicleDamageProof(source, true)
				end
			end
		end)
	else
		outputChatBox("#FFFFFFVocê não tem dinheiro suficiente.", source, 38, 122, 216, true)
	end
end)

vv = {}

addEvent("SpawnMyVehicle", true)
addEventHandler("SpawnMyVehicle", root, 
function(id)
	local data = dbPoll(dbQuery(db, "SELECT * FROM VehicleList WHERE Account = ? AND ID = ?", getAccountName(getPlayerAccount(source)), id), -1)
	if type(data) == "table" and #data ~= 0 then
		if getVehicleByID(id) then
			outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(data[1]["Model"]).." #FFFFFFfoi spawnado.", source, 38, 122, 216, true)
		else
			local color = split(data[1]["Colors"], ',')
			r1 = color[1] or 255
			g1 = color[2] or 255
			b1 = color[3] or 255
			r2 = color[4] or 255
			g2 = color[5] or 255
			b2 = color[6] or 255
			vehicle = createVehicle(data[1]["Model"], data[1]["X"], data[1]["Y"], data[1]["Z"], 0, 0, data[1]["RotZ"])
			setElementData(vehicle, "ID", id)
			local upd = split(tostring(data[1]["Upgrades"]), ',')
			for i, upgrade in ipairs(upd) do
				addVehicleUpgrade(vehicle, upgrade)
			end
			local Paintjob = data[1]["Paintjob"] or 3
			setVehiclePaintjob(vehicle, Paintjob) 
			setVehicleColor(vehicle, r1, g1, b1, r2, g2, b2)
			if data[1]["HP"] <= 255.5 then data[1]["HP"] = 255 end
			setElementHealth(vehicle, data[1]["HP"])
			setElementData(vehicle, "Owner", source)
			vv[vehicle] = setTimer(function(source)
				if not isElement(source) then killTimer(vv[source]) vv[source] = nil end
				if isElement(source) and getElementHealth(source) <= 255 then
					setElementHealth(source, 255.5)
					setVehicleDamageProof(source, true)
					setVehicleEngineState(source, false)
				end
			end, 50, 0, vehicle)
			addEventHandler("onVehicleDamage", vehicle,
			function(loss)
				local account = getAccountName(getPlayerAccount(getElementData(source, "Owner")))
				setTimer(function(source) if isElement(source) then dbExec(db, "UPDATE VehicleList SET HP = ? WHERE Account = ? AND Model = ?", getElementHealth(source), account, getElementModel(source)) updateVehicleInfo(getElementData(source, "Owner")) end end, 100, 1, source)
			end)
			addEventHandler("onVehicleEnter", vehicle,
			function(player)
				if getElementHealth(source) <= 255.5 then 
					setVehicleEngineState(source, false)
				else
					if isVehicleDamageProof(source) then
						setVehicleDamageProof(source, false)
					end
				end
			end)
			outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(data[1]["Model"]).." #FFFFFFfoi spawnado.", source, 38, 122, 216, true)
		end
	else
		outputChatBox("#FFFFFFPode haver problema com este veículo, por favor peça ajuda para um administrador.", source, 38, 122, 216, true)
	end
end)

addEvent("DestroyMyVehicle", true)
addEventHandler("DestroyMyVehicle", root, 
function(id)
	local vehicle = getVehicleByID(id)
	if isElement(vehicle) then
		local data = dbPoll(dbQuery(db, "SELECT * FROM VehicleList WHERE Account = ? AND ID = ?", getAccountName(getPlayerAccount(source)), id), -1)
		if type(data) == "table" and #data ~= 0 then
			destroyVehicle(vehicle)
			outputChatBox ("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(data[1]["Model"]).." #FFFFFFfoi destruído.", source, 38, 122, 216, true)
		else
			outputChatBox("#FFFFFFEscolha o veículo que você quer destruir.", source, 38, 122, 216, true)
		end
	else
		outputChatBox("#FFFFFFO seu veículo não foi spawnado.", source, 38, 122, 216, true)
	end
end)

addEvent("LightsMyVehicle", true)
addEventHandler("LightsMyVehicle", root, 
function(id)
	local vehicle = getVehicleByID(id)
	if isElement(vehicle) then
		local Vehicle = getPedOccupiedVehicle(source)
		if Vehicle == vehicle then
			if getVehicleOverrideLights(vehicle) ~= 2 then
				setVehicleOverrideLights(vehicle, 2)
				outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FFFFFFacendeu as luzes.", source, 38, 122, 216, true)
			elseif getVehicleOverrideLights(vehicle) ~= 1 then
				setVehicleOverrideLights(vehicle, 1)
				outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FF0000apagou as luzes.", source, 38, 122, 216, true)
			end
		else
			outputChatBox("#FFFFFFVocê não está no veículo!", source, 38, 122, 216, true)
		end
	else
		outputChatBox("#FFFFFFSeu Veículo não foi spawnado.", source, 38, 122, 216, true)
	end
end)

addEvent("LockMyVehicle", true)
addEventHandler("LockMyVehicle", root, 
function(id)
	local vehicle = getVehicleByID(id)
	if isElement(vehicle) then
		if not isVehicleLocked(vehicle) then
			setVehicleLocked(vehicle, true)
			setVehicleDoorsUndamageable(vehicle, true)
			setVehicleDoorState(vehicle, 0, 0)
			setVehicleDoorState(vehicle, 1, 0)
			setVehicleDoorState(vehicle, 2, 0)
			setVehicleDoorState(vehicle, 3, 0) 
			outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FFFFFFfoi trancado.", source, 38, 122, 216, true)
		elseif isVehicleLocked(vehicle) then
			setVehicleLocked(vehicle, false)
			setVehicleDoorsUndamageable(vehicle, false)
			outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FFFFFFfoi destrancado.", source, 38, 122, 216, true)
		end
	else
		outputChatBox("#FFFFFFSeu veículo não foi spawnado.", source, 38, 122, 216, true)
	end
end)

addEvent("BlipMyVehicle", true)
addEventHandler("BlipMyVehicle", root, 
function(id)
	local vehicle = getVehicleByID(id)
	if isElement(vehicle) then
		if not getElementData(vehicle, "ABlip") then
			setElementData(vehicle, "ABlip", true)
			createBlipAttachedTo(vehicle, 41, 2, 255, 0, 0, 255, 0, 65535, source)
			outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FFFFFFestá marcado no mapa, use F11 para encontrá-lo.", source, 38, 122, 216, true)
		else
			local attached = getAttachedElements(vehicle)
			if (attached) then
				for k,element in ipairs(attached) do
					if getElementType(element) == "blip" then
						destroyElement(element)
					end
				end
			end
			setElementData(vehicle, "ABlip", false)
			outputChatBox("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FFFFFFfoi desmarcado do mapa.", source, 38, 122, 216, true)
		end
	else
		outputChatBox("#FFFFFFSeu Veículo não foi spawnado.", source, 38, 122, 216, true)
	end
end)

addEvent("FixMyVehicle", true)
addEventHandler("FixMyVehicle", root, 
function(id)
	if getPlayerMoney(source) >= tonumber(0) then
		takePlayerMoney ( source, 0 )
		local vehicle = getVehicleByID(id)
		if isElement(vehicle) then
			fixVehicle(vehicle)
			setVehicleEngineState(vehicle, true)
			if isVehicleDamageProof(vehicle) then
				setVehicleDamageProof(vehicle, false)
			end
		end
		dbExec(db, "UPDATE VehicleList SET HP = ? WHERE Account = ? AND ID = ?", 1000, getAccountName(getPlayerAccount(source)), id)
		updateVehicleInfo(source)
		outputChatBox ("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FFFFFFteve o motor ligado e reparado.", source, 38, 122, 216, true)
	else
		outputChatBox("#FFFFFFVocê não tem dinheiro para reparar o seu veiculo.", source, 38, 122, 216, true)
	end
end)

addEvent("WarpMyVehicle", true)
addEventHandler("WarpMyVehicle", root, 
function(id)
    if not isPedInVehicle (source) then
	if getElementInterior(source) == 0 then
		if getPlayerMoney(source) >= tonumber(0) then
			local vehicle = getVehicleByID(id)
			if isElement(vehicle) then
				takePlayerMoney ( source, 5000 )
				local x, y, z = getElementPosition(source)
				setElementPosition(vehicle, x+3, y+2, z+1.5)
				outputChatBox ("#FFFFFFSeu veículo #FF0000"..getVehicleNameFromModel(getElementModel(vehicle)).." #FFFFFFfoi trazido para você.", source, 38, 122, 216, true)
			else
				outputChatBox("#FFFFFFSeu veículo não foi spawnado.", source, 38, 122, 216, true)
			end
		else
			outputChatBox("#FFFFFFVocê não tem dinheiro suficiente para trazer seu veículo.", source, 38, 122, 216, true)
		end
	else
		outputChatBox("#FFFFFFVocê não pode trazer o seu veículo enquanto você dentro de interiores.", source, 38, 122, 216, true)
	end
     else
                                  outputChatBox("#FFFFFFVocê não pode trazer o seu veículo, enquanto estiver dentro de um veículo.", source, 38, 122, 216, true)
    end
end)
	
addEvent("SellMyVehicle", true)
addEventHandler("SellMyVehicle", root, 
function(id)
	local vehicle = getVehicleByID(id)
	local data = dbPoll(dbQuery(db, "SELECT * FROM VehicleList WHERE Account = ? AND ID = ?", getAccountName(getPlayerAccount(source)), id), -1)
	if type(data) == "table" and #data ~= 0 then
		local Money = math.ceil((data[1]["Cost"]*.9)*math.floor(data[1]["HP"])/100/10)
		givePlayerMoney (source, Money)
		if isElement(vehicle) then destroyElement(vehicle) end
		dbExec(db, "DELETE FROM VehicleList WHERE Account = ? AND ID = ?", getAccountName(getPlayerAccount(source)), id)
		updateVehicleInfo(source)
		outputChatBox("#FFFFFFVocê vendeu seu veículo por #00FF00R$"..Money, source, 38, 122, 216, true)
	end
end)

function getDataOnLogin(_, account)
	updateVehicleInfo(source)
end
addEventHandler("onPlayerLogin", root, getDataOnLogin)

function SaveVehicleDataOnQuit()
	for i, veh in ipairs (getElementsByType("vehicle")) do
		if getElementData(veh, "Owner") == source then
			setTimer (destroyVehicle(veh), 10000)
		end
	end
end
addEventHandler("onPlayerQuit", root,SaveVehicleDataOnQuit)

 

Edited by #Gubiani
Link to comment

Use Timestamp pra pegar o tempo quando cada jogador sair do server, grava os valores numa tabela. E use setTimer executando a cada 1 hora, por exemplo, dá um loop na tabela, comparando com o tempo Timestamp, se for maior que 10 dias, destrói o veículo do jogador (salvo na tabela) e remove o valor da tabela.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...